-
[프로그래머스/JAVA] 귤 고르기Algorithm/Java 2024. 11. 24. 17:08
https://school.programmers.co.kr/learn/courses/30/lessons/138476
[ 오답 노트 ]
❌ 기존 오답 코드import java.util.*; class Solution { public int solution(int k, int[] tangerine) { // 1 : 1개, 2 : 2개, 3 : 2개, 4 : 1개, 5 : 2개 // k = 6일때 종류의 값을 합한 수가 6이 되어야함 (종류의 개수가 큰 수 부터 하나씩 값 더하기) // (2 : 2개) + (3 : 2개) + (5 : 2개) = 6 // 남은 키의 개수인 3이 정답! // 1 : 1개, 2 : 2개, 3 : 2개, 4 : 1개, 5 : 2개 // k = 4 // (2 : 2개) + (3 : 2개) = 4 // 남은 키의 개수인 2가 정답! // 1 : 4개, 2 : 3개, 3 : 1개 // k = 2 // (1 : 1개) + (2 : 1개) = 2 // 남은 키의 개수인 1이 정답! HashMap<Integer, Ingetger> hm = new HashMap<>(); for(int i = 0; i < tangerine.length; i++) { // 처음 나오는 수이면 키에 추가, 기존에 있던 수이면 기존 키에 +1 // (이부분 함수 수정 필요....! ㅜ 문법 모름..) hm.put(tangerine[i], hm.contains(tangerine[i])); } // 값의 개수가 제일 많은 순으로 더하기 // (2 : 2개) + (3 : 2개) + (5 : 2개) = 6 ArrayList<Integer> list = new ArrayList<>(); for(int i = 0; i < hm.length; i++) { // (이부분 함수 수정 필요....! ㅜ 문법 모름..) list.add(hm.getKey(i), hm.getValue(i)); } int sum = 0; for(int j = 0; j < list.size(); j++) { // 값의 개수가 큰 수 부터 정렬 후 각 값의 개수 하나씩 더하기 // (2 : 2개) + (3 : 2개) + (5 : 2개) = 6 Arrays.sort(hm.get(list.get(i))); sum += hm.get(list.get(i)); // 키 종류의 개수 더하기(2, 3, 5 -> 총 3개가 정답!) if(sum == k) { answer = } } return answer; } }
📌 기존 코드의 문제점
1. HashMap에 값 추가 및 갱신 방식 오류
처음 나오는 수이면 키에 추가, 기존에 있던 수이면 기존 키에 +1 하는 방식이 문법 수정이 필요하다.
2. HashMap 관련 문법 오류
해시맵에는 getKey(i)나 getValue(i) 같은 인덱스 접근 방식이 없으므로 컴파일 에러 발생한다. 해시맵의 크기 또한 hm.length() 가 아님 hm.size()로 가져와야 맞다.
3. 필요한 크기 종류 계산 로직 오류
Arrays.sort()는 배열 정렬 방식에 알맞고, 해시맵의 값 정렬에는 부적합하다. hm.get(list.get(i)) 부분 또한 문법 오류가 있다.
[ 정답 코드 & 올바른 풀이 ]
📌 최종 수정 후 코드와 기존 코드 비교 요약
항목 기존 코드 문제점 수정 후 개선점 HashMap 값 추가 및 갱신 contains로 boolean 값을 넣어 값 추가 및 갱신 불가. getOrDefault로 초기값 처리 후 값 증가. HashMap 값 정렬 잘못된 getKey(i) 및 getValue(i) 방식 사용. HashMap.values()로 값 추출 후 리스트에 저장, Collections.sort()로 정렬. 종류 수 계산 로직 Arrays.sort()와 잘못된 데이터 접근 방식. 리스트의 값을 순차적으로 더하면서 조건 만족 시 종료.
📌 정답 코드
import java.util.*; class Solution { public int solution(int k, int[] tangerine) { // 1 : 1개, 2 : 2개, 3 : 2개, 4 : 1개, 5 : 2개 // k = 6일때 종류의 값을 합한 수가 6이 되어야함 (종류의 개수가 큰 수 부터 하나씩 값 더하기) // (2 : 2개) + (3 : 2개) + (5 : 2개) = 6 // 남은 키의 개수인 3이 정답! // 1 : 1개, 2 : 2개, 3 : 2개, 4 : 1개, 5 : 2개 // k = 4 // (2 : 2개) + (3 : 2개) = 4 // 남은 키의 개수인 2가 정답! // 1 : 4개, 2 : 3개, 3 : 1개 // k = 2 // (1 : 1개) + (2 : 1개) = 2 // 남은 키의 개수인 1이 정답! HashMap<Integer, Integer> hm = new HashMap<>(); for(int i = 0; i < tangerine.length; i++) { // 처음 나오는 크기면 1로 초기화, 기존에 있던 크기면 값 증가 hm.put(tangerine[i], hm.getOrDefault(tangerine[i], 0) + 1); } // 값의 개수를 기준으로 정렬하기 위해 리스트에 추가 ArrayList<Integer> list = new ArrayList<>(hm.values()); // list = [1, 2, 2, 2, 1] // 내림차순 정렬 (개수가 많은 것부터 정렬) // (**배열은 Arrays.sort()로 정렬하고 ArrayList는 Collections.sort로 정렬하기**) Collections.sort(list, Collections.reverseOrder()); // list = [2, 2, 2, 1, 1] // 각 값의 개수 하나씩 더해서 k보다 크거나 같으면 결과 도출 int sum = 0; int answer = 0; for(int j = 0; j < list.size(); j++) { sum += list.get(j); answer++; // 종류 수 증가 if(sum >= k) { break; } } return answer; } }
반응형'Algorithm > Java' 카테고리의 다른 글
[프로그래머스/JAVA] 연속 부분 수열 합의 개수 (0) 2024.12.01 [프로그래머스/JAVA] 예상 대진표 (0) 2024.11.30 [프로그래머스/JAVA] 카드 뭉치 (0) 2024.11.24 [프로그래머스/JAVA] 시저암호 (0) 2024.11.17 [백준/JAVA] 18311번 : 큰 수 구성하기 (0) 2024.11.10