문제 풀이/프로그래머스 알고리즘

정수 내림차순으로 배치하기 // 반복문 안에서 collection 의 크기가 변경될 때 생기는 문제

열심히 해 2024. 9. 27. 16:30

https://school.programmers.co.kr/learn/courses/30/lessons/12933

 

나의 접근 방식 : 

 

class Solution {
    public static ArrayList<Integer> solution(long n) {
        long answer = 0;
        String strNumber = Long.toString(n);
        // strNumber 를 하나씩 때어놓고 크기를 비교하며 재배치해야함

        // strNumber 를 하나씩 때어서 intArrayList 에 넣음
        ArrayList<Integer> intArrayList = new ArrayList<>();
        for (int i = 0; i < strNumber.length(); i++) {
            intArrayList.add((strNumber.charAt(i) - '0'));
        }
        Integer[] intList = new Integer[intArrayList.size()];
        // intArrayList 에 들어있는 숫자들 크기 비교해서 내림차순 배치
        for (int i = 0; i < intArrayList.size(); i++) {
            for (int j=1; j<intArrayList.size(); j++) {
                if (intArrayList.get(i) < intArrayList.get(j)) {
                    intArrayList.add(i, intArrayList.get(j));
                    intArrayList.remove(j+1);
                }
            }
        }

        return intArrayList;
    }
}

 

여기서 n 이 1234 일 때 

 

[4, 3, 3, 1] 을 반환합니다. [4, 3, 2, 1] 이 아니라 !!!

 

ConcurrentModificationException 발생

 

이는 반복문이 진행되면서 Collection 이 변경되면 문제가 될 수 있기 때문입니다.  Collection 의 사이즈 변경이 유발하는 오류입니다. next, set, add, remove 등도 문제를 발생시킬 수 있습니다.

 

참고 : 

 

https://taeying.tistory.com/entry/JAVA-ConcurrentModificationException

 

 

이후 작성 답안 : 

더보기
public class Main {
    public static void main(String[] args) {
        String a = "123";
        String b = "321";
        System.out.println(a+b);
    }
}

class Solution {
    public long solution(long n) {
        long answer = 0;
        // 입력값을 String 형으로 저장.
        String strNumber = Long.toString(n);
        // String 의 인덱스 순서대로 ArrayList 에 추가.
        ArrayList<Integer> integerArrayList = new ArrayList<>();
        for (int i=0; i<strNumber.length(); i++) {
            integerArrayList.add(strNumber.charAt(i) - '0');
        }
        // Collections.reverse() : 역순 정렬.
        // Collections.sort() : 순서대로 정렬.
        // 하지만 여기서의 순서는 index의 순서 !!! 크기 별로 나누는 것이 아님 !!
        Collections.reverse(integerArrayList);

        // String 타입은 불변 객체이기 때문에, StringBuilder 타입으로 가변 객체를 생성하고
        // 이를 통해 문자열을 쉽게 추가, 삭제, 수정할 수 있다.
        StringBuilder sb = new StringBuilder();
        for (int i : integerArrayList) {
            sb.append(i);  // 추가
        }
        
        // StringBuilder 타입을 String 타입으로
        String stringByStringBuilder = sb.toString();
        // String 타입을 롱타입으로
        answer = Long.parseLong(stringByStringBuilder);
        return answer;
    }
}

 

 

아오 ㅋㅋㅋㅋㅋㅋㅋㅋㅋ

 

 

더보기
class Solution {
    public static long solution(long n) {
        long answer = 0;
        // 입력값을 String 형으로 저장.
        String strNumber = Long.toString(n);

        Integer[] ints = new Integer[strNumber.length()];
        for (int i=0; i<ints.length; i++) {
            ints[i] = strNumber.charAt(i) - '0';
        }

        // Arrays.sort(ints);   : 오름차순 정렬   기본 타입 배열 int[] 사용 가능
        // 역순 정렬 시 참조 타입 배열 Integer[] 를 사용해여 Comparator 를 적용해야 한다.
        Arrays.sort(ints, Collections.reverseOrder());

        StringBuilder sb2 = new StringBuilder();
        for (int i: ints) {
            sb2.append(i);
        }
        String stringByStringBuilder2 = sb2.toString();
        answer = Long.parseLong(stringByStringBuilder2);
        return answer;
    }
}