실력 향상 일지/프로그래머스

[Java] 정수 내림차순으로 배치하기

juniordev 2022. 10. 13. 18:50

(현재까지는) 5일 넘게걸린 유일한 문제

문제 설명 및 입출력 예시

함수 solution은 정수 n을 매개변수로 입력받습니다. n의 각 자릿수를 큰것부터 작은 순으로 정렬한 새로운 정수를 리턴해주세요. 예를들어 n이 118372면 873211을 리턴하면 됩니다.

제한조건 - n은 1이상 8000000000 이하인 자연수

 

입출력 예시 - 

n return
118372 873211

 

 


코드 & 풀이과정

먼저 n을 한글자 한글자 배열에 넣어줄 필요성을 느꼈다.

왜냐하면 정수인 상태로는 정렬을 할 수 없다고 생각했기 때문이다.

그리고 포문을 돌려 글자 하나가 자기보다 큰게 자기보다 앞에(큰 자릿수에) 있을 시 서로 자리를 바꿔주는 코드를 작성했다.

그 후 또다시 포문을 이용해 answer에 num[0] 부터 num[num.length]까지의 값을 String answer에 넣어주고 return시켰다.

class Solution {
    public long solution(long n) {
        String[] num = String.valueOf(n).split(""); // n값을 string으로 변환하는데 한글자 한글자를 잘라서 배열에 넣어준다
        String answer = "";

        for (int i = 0; i < num.length - 1; i++) { // 전체적으로 num.length번 돌림
            for (int j = 0; j < num.length - 1; j++) { // 실제 배열을 확인하고 서로 바꿔주는 for문
                if (num[j].charAt(0) > num[j + 1].charAt(0)) {
                    char tmp = num[j].charAt(0);
                    num[j] = num[j + 1];
                    num[j + 1] = String.valueOf(tmp);
                }
            }
        }

        for (int i = num.length - 1; i >= 0; i--) { // intellij에서 역for문 작성시 ritar를 쓰면 편하다.
            answer += num[i]; // string answer에 배열[0]부터 차례대로 쌓음

        }

        return Long.parseLong(answer); // long으로 변환 후 return
    }
}

 

회고

사실 내가 짠 코드는 전반적으로 마음에 들지는 않는다.

이 코드의 for (int i = 0; .... 이 부분이 메모리 낭비가 심하다고 생각하기 때문이다.

그리고 고정관념인지 생각이 부족해서인지는 몰라도 처음에 answer에는 long이 선언되어있다.

그걸 바꿔볼 생각도 안하고 어떻게든 long으로 풀어보려고 하니 한 문제를 3일이나 잡고있었다.

사실 검색을 하면 풀이가 쉬웠겠고 심지어 검색을 했었다(!) 그리고 더더욱 쉽게 풀수있는 코드를 발견하긴 했지만...

(미완성 코드)

public class Solution {
    public static long solution(long n) {
		String[] num = String.valueOf(n).split("");
        
        Arrays.sort(num, Comparator.reverseOrder());
        //for (String i : num) ;
        long answer = Long.parseLong(Arrays.toString());
        return answer;
    }
}

이 코드는 왜인지는 몰라도 Arrays.toString()부분에서 오류가 난다... 그러나 이 코드는 아예 검색을 한거기때문에 딱히 고치지않고 그냥 버리기로 했다 (마지막 양심ㅋㅋㅋㅋ)

 

그리고 같이 스터디를 하는 형이 보기 안쓰러웠는지 arrayList를 이용한 풀이를 보여줬다.

public class Solution {
    public long solution(long n) {
        String v = String.valueOf(n);
        List<Integer> intList = new ArrayList<>();
        for (int i = 0; i < v.length(); i++) {
            intList.add(Integer.parseInt(String.valueOf(v.charAt(i))));
        }
        Collections.sort(intList, Comparator.reverseOrder());
        String answer = "";
        for (Integer integer : intList) {
            answer += integer;
//          System.out.println(integer);
        }
        return Long.parseLong(answer);
    }
}

이 코드 내에 Collections라는 처음보는 함수를 발견했는데 저건 그냥 자바쓰는사람들이 자주쓰는 Arrays 이런거를 다 섞어놓은 함수라고 한다.

 

이 코드를 보고 든 생각은 메소드 이전에 arrayList같은 기본적인(?) 함수들조차 머릿속에 없으니 응용이 불가능하구나였다.

java강의를 듣는게 시급해보이는 실력이다 허허

 


💻프로그래머스 문제 링크 : https://school.programmers.co.kr/learn/courses/30/lessons/12933