[PROG] 131128 숫자 짝꿍, (Collections.frequency())

호호빵·2022년 10월 12일
0

Algorithm

목록 보기
33/46

문제

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

나의 풀이

첫번째 풀이 - 시간초과

1. 각 문자열을 배열로 바꾸고 리스트로 바꿔서 저장
2. for문을 돌려 같은 문자열 가지면 해당 문자열을 새로운 리스트에 저장하고
   해당 index를 각각 다른 문자로 바꿔주어 중복처리가 되지 않게 함
3. 새로운 리스트를 내림차순으로 정렬
4. 리스트를 합쳐 조건에 맞게 문자열로 반환
class Zoo {
    public String solution(String X, String Y) {
        String answer = "";
        ArrayList<String> li = new ArrayList<>();

        String[] strX = X.split("");
        String[] strY = Y.split("");
        ArrayList<String> arrX = new ArrayList<>(Arrays.asList(strX));
        ArrayList<String> arrY = new ArrayList<>(Arrays.asList(strY));

        for (int i = 0; i < arrX.size(); i++) {
            for (int j = 0; j < arrY.size(); j++) {
                if (arrX.get(i).equals(arrY.get(j))) {
                    li.add(arrX.get(i));
                    arrX.set(i, "x");
                    arrY.set(j, "y");
                    break;
                }
            }
        }

        Collections.sort(li, Collections.reverseOrder());

        if (li.size() > 0) {
            if (li.get(0).equals("0")) {
                answer = "0";
            } else {
                answer = String.join("", li);

            }
        } else {
            answer = "-1";
        }


        return answer;
    }
}
  • 정답이 나오긴 했지만 문자열의 자릿수가 3,000,000 자리까지 가능해서
    최악의 경우 3,000,000번 돌려야 하기때문에 시간초과가 났다.
  • 길이로 for문을 돌리기보다는 0-9까지의 리스트를 만들고 각 수 문자열의 개수를 map형태로 저장

향상된 풀이

class Zoo {
    public String solution(String X, String Y) {
        String answer = "";
        ArrayList<String> li = new ArrayList<>();

        String[] strX = X.split("");
        String[] strY = Y.split("");

        HashMap<Integer, Integer> mapX = new HashMap<>();
        HashMap<Integer, Integer> mapY = new HashMap<>();

        for (int i = 0; i < 10; i++) { 		// 0-9까지의 개수를 map 형태로 저장
            mapX.put(i, Collections.frequency(Arrays.asList(strX), String.valueOf(i)));
            mapY.put(i, Collections.frequency(Arrays.asList(strY), String.valueOf(i)));
        }

        for (int i = 0; i < 10; i++) {
            if (mapX.get(i) >= 1 && mapY.get(i) >= 1) {
                if (mapX.get(i) >= mapY.get(i)) {
                    for (int j = 0; j < mapY.get(i); j++) {
                        li.add(String.valueOf(i));
                    }
                } else {
                    for (int j = 0; j < mapX.get(i); j++) {
                        li.add(String.valueOf(i));
                    }
                }
            }
        }

        Collections.sort(li, Collections.reverseOrder());
		// 내림차순 정렬
        
        if (li.size() > 0) {
            if (li.get(0).equals("0")) {
                answer = "0";
            } else {
                answer = String.join("", li);

            }
        } else {
            answer = "-1";
        }
        
        return answer;
    }

Collections.frequency(Arrays.asList(), "찾는값")

  • 배열 안에서 특정 값이 몇개 들었는지를 확인하려는 경우
    배열 자체에서는 이런 기능을 지원하지 않기 때문에
    배열을 Arrays.asList를 사용해서 List 타입으로 변환한 뒤 사용
profile
하루에 한 개념씩

0개의 댓글