문제 링크
[level 1] 정수 내림차순으로 배치하기 - 12933
Note
long 타입 n의 길이(자릿수)를 구하기 위해서 String N = n + "" 꼼수를 또 썼다. 반성하자
역순으로 정렬할 때 익숙한 for 문만 써왔는데, 이제 정말 새로운 것에 익숙해져야겠다. 계속 나오기 때문에.
익숙한 방식들로는 금방 해결할 수 있는 문제였다.
아는 것들로 어떻게든 하는 것을 넘어서 효율적인 코드를 고민해보고 싶다.
Key
제출한 코드
처음 작성한 코드.
import java.util.*;
class Solution {
public long solution(long n) {
//n을 10으로 자릿수 만큼 나눠서 배열에 담는다.
//배열을 정렬한다.
//배열을 역순으로 정렬한다.
//Long타입으로 리턴한다.
long answer = 0;
String N = n + ""; //n의 길이를 사용하기 위해 string 타입으로 변환
long[] arrayN = new long[N.length()]; //N을 담을 배열
String s = ""; //string으로 이어붙이기 위한 임시 변수
for(int i = 0 ; i < N.length() ; i++){
arrayN[i] = n % (long)10;
n /= 10;
}
Arrays.sort(arrayN);
for(int i = N.length()-1 ; i >= 0 ; i--){
s += arrayN[i];
}
answer = Long.parseLong(s);
return answer;
}
}
역순을 만드는 과정에서 배열을 사용하여 사용성이 안 좋을 것이라 예상했다.
그리고 역시 11.49ms로 다소 오래 걸리고 메모리도 87.4MB를 사용 했다.
컬랙션 리버스오더는 존재를 알고는 있지만 사용하기에는 낯설다고 할까...
그리고 타입 변환도 빠르게 이해하기에는 지금 방식(long 타입에 "" 더해서 String 만들어버리기...)이 익숙해서 사용했다.
하지만 효율 좋은 코드가 어떻게 생겼는지는 알고,
공부해가면서 내 것으로 만들어야하기 때문에
chatGPT에게 내 코드의 효율성 개선 부분을 제안해달라고 했다.
아래는 효율성을 개선한 지피티가 짜준 코드이다.
import java.util.*;
class Solution {
public long solution(long n) {
// n의 길이(자릿수) 계산
int length = (n == 0) ? 1 : (int)Math.log10(n) + 1;
Long[] arrayN = new Long[length];
for (int i = 0; i < length; i++) {
arrayN[i] = n % 10;
n /= 10;
}
// 내림차순으로 정렬
Arrays.sort(arrayN, Collections.reverseOrder());
// StringBuilder를 사용하여 문자열 생성
StringBuilder sb = new StringBuilder();
for (long digit : arrayN) {
sb.append(digit);
}
return Long.parseLong(sb.toString());
}
}
쉬운 코드고 내가 모르는 것이 있지 않다. 하지만 활용해야할 때 사용하기에 익숙하지 않아서 피하게 되는 것들이다.
하나하나 뜯어서 내 것으로 만들어야겠다.
1. long n의 길이 구하기
=>
2. Collections.reverseOrder()
=>
3. StringBuilder
=>
결론적으로 시간과 메모리가
메모리: 72.7 MB, 시간: 0.48 ms로 줄었다
'코딩테스트 > Java' 카테고리의 다른 글
프로그래머스/자바 lv.0 대소문자 바꿔서 출력하기 - toCharArray(), isLowerCase(), toUpperCase() (0) | 2024.06.24 |
---|---|
프로그래머스/자바 lv.2 숫자의 표현 (0) | 2024.04.03 |
프로그래머스/자바 lv.1 자릿수 더하기 (0) | 2024.04.02 |
문제 링크
[level 1] 정수 내림차순으로 배치하기 - 12933
Note
long 타입 n의 길이(자릿수)를 구하기 위해서 String N = n + "" 꼼수를 또 썼다. 반성하자
역순으로 정렬할 때 익숙한 for 문만 써왔는데, 이제 정말 새로운 것에 익숙해져야겠다. 계속 나오기 때문에.
익숙한 방식들로는 금방 해결할 수 있는 문제였다.
아는 것들로 어떻게든 하는 것을 넘어서 효율적인 코드를 고민해보고 싶다.
Key
제출한 코드
처음 작성한 코드.
import java.util.*;
class Solution {
public long solution(long n) {
//n을 10으로 자릿수 만큼 나눠서 배열에 담는다.
//배열을 정렬한다.
//배열을 역순으로 정렬한다.
//Long타입으로 리턴한다.
long answer = 0;
String N = n + ""; //n의 길이를 사용하기 위해 string 타입으로 변환
long[] arrayN = new long[N.length()]; //N을 담을 배열
String s = ""; //string으로 이어붙이기 위한 임시 변수
for(int i = 0 ; i < N.length() ; i++){
arrayN[i] = n % (long)10;
n /= 10;
}
Arrays.sort(arrayN);
for(int i = N.length()-1 ; i >= 0 ; i--){
s += arrayN[i];
}
answer = Long.parseLong(s);
return answer;
}
}
역순을 만드는 과정에서 배열을 사용하여 사용성이 안 좋을 것이라 예상했다.
그리고 역시 11.49ms로 다소 오래 걸리고 메모리도 87.4MB를 사용 했다.
컬랙션 리버스오더는 존재를 알고는 있지만 사용하기에는 낯설다고 할까...
그리고 타입 변환도 빠르게 이해하기에는 지금 방식(long 타입에 "" 더해서 String 만들어버리기...)이 익숙해서 사용했다.
하지만 효율 좋은 코드가 어떻게 생겼는지는 알고,
공부해가면서 내 것으로 만들어야하기 때문에
chatGPT에게 내 코드의 효율성 개선 부분을 제안해달라고 했다.
아래는 효율성을 개선한 지피티가 짜준 코드이다.
import java.util.*;
class Solution {
public long solution(long n) {
// n의 길이(자릿수) 계산
int length = (n == 0) ? 1 : (int)Math.log10(n) + 1;
Long[] arrayN = new Long[length];
for (int i = 0; i < length; i++) {
arrayN[i] = n % 10;
n /= 10;
}
// 내림차순으로 정렬
Arrays.sort(arrayN, Collections.reverseOrder());
// StringBuilder를 사용하여 문자열 생성
StringBuilder sb = new StringBuilder();
for (long digit : arrayN) {
sb.append(digit);
}
return Long.parseLong(sb.toString());
}
}
쉬운 코드고 내가 모르는 것이 있지 않다. 하지만 활용해야할 때 사용하기에 익숙하지 않아서 피하게 되는 것들이다.
하나하나 뜯어서 내 것으로 만들어야겠다.
1. long n의 길이 구하기
=>
2. Collections.reverseOrder()
=>
3. StringBuilder
=>
결론적으로 시간과 메모리가
메모리: 72.7 MB, 시간: 0.48 ms로 줄었다
'코딩테스트 > Java' 카테고리의 다른 글
프로그래머스/자바 lv.0 대소문자 바꿔서 출력하기 - toCharArray(), isLowerCase(), toUpperCase() (0) | 2024.06.24 |
---|---|
프로그래머스/자바 lv.2 숫자의 표현 (0) | 2024.04.03 |
프로그래머스/자바 lv.1 자릿수 더하기 (0) | 2024.04.02 |