Algorithm/Java
[프로그래머스/JAVA] 귤 고르기
dbfl9911
2024. 11. 24. 17:08
반응형
https://school.programmers.co.kr/learn/courses/30/lessons/138476
프로그래머스
SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
[ 오답 노트 ]
❌ 기존 오답 코드
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;
}
}
반응형