문제 링크
Note
풀어본 level 0 문제 중에 제에에에일 어려웠던 문제... (점수도 3점인가 5점인가 주는거 보면 어려운 것 맞는 것 같다.)
HashMap 안에서 최대 Value의 Key를 쉽게 가져올 수 있을까 해서 검색 해봤는데, compare를 쓰기엔 내 지식이 부담스러워서
언제나 애용하는 for 문을 사용하기로 했다.
주어진 배열의 인자가 모든 같은 경우를 고려하지 않아서 예외 케이스를 찾는데에 시간이 걸렸다.
처음에 int maxValue = Collections.max(map.values()); 를 key를 반환한다고 착각하고 썼는데, 테스트 케이스가 모두 정답으로 넘어갔다. 테스트 케이스는 교묘하게 최빈 key값의 빈도가 key와 같다는 것이 함정... 내가 틀릴 것을 예상하고 있었던 것처럼
Key
- Collections.max(map.values())
- map의 value 중 최대 값의 value를 반환함
- map.entrySet()
- map의 key와 value를 쌍으로 for문에 넣고 순회하기 위해서 사용함.
- Map.Entry<Integer, Integer> entry
- Map에 저장된 하나의 key, value 쌍을 나타냄. 역시 for문에 넣고 순회한 entrySet()을 하나씩 담기 위해서 사용함.
제출한 코드
import java.util.*;
class Solution {
public int solution(int[] array) {
int answer = 0;
// array의 인자를 key로, 등장 횟수를 value로 담기
HashMap<Integer, Integer> map = new HashMap<>();
for(int num : array){
map.put(num, map.getOrDefault(num,0)+1);
}
// 가장 많은 등장 횟수(value)
int maxValue = Collections.max(map.values());
// 최대 등장 횟수와 value가 같은 key 찾고
// 최대 등장 횟수가 중복인지 확인, 중복이면 check 값 증가
int maxKey = 0;
int check = 0;
for(Map.Entry<Integer, Integer> entry : map.entrySet()){
if(entry.getValue() == maxValue) {
maxKey = entry.getKey();
check ++;
}
}
// System.out.println("check : " + check + "/ maxKey : " + maxKey + "/ map.size() " + map.size());
// check = 1인 경우, 중복 없는 최대값
if(check == 1){
answer = maxKey;
} else {
// array의 모든 인자가 같은 경우(check != 1이라 위의 조건에서 빠져나옴) 처리
if(map.size() == 1){
answer = maxKey;
}
// 최빈값이 여러개인 경우
else {
answer = -1;
}
}
return answer;
}
}
'코딩테스트 > Java' 카테고리의 다른 글
프로그래머스/자바 lv.1 푸드 파이트 대회 - 문자열 뒤집기 (0) | 2024.06.28 |
---|---|
프로그래머스/자바 lv.0 대소문자 바꿔서 출력하기 - toCharArray(), isLowerCase(), toUpperCase() (0) | 2024.06.24 |
프로그래머스/자바 lv.1 정수 내림차순으로 배치하기 (4) | 2024.04.04 |
문제 링크
Note
풀어본 level 0 문제 중에 제에에에일 어려웠던 문제... (점수도 3점인가 5점인가 주는거 보면 어려운 것 맞는 것 같다.)
HashMap 안에서 최대 Value의 Key를 쉽게 가져올 수 있을까 해서 검색 해봤는데, compare를 쓰기엔 내 지식이 부담스러워서
언제나 애용하는 for 문을 사용하기로 했다.
주어진 배열의 인자가 모든 같은 경우를 고려하지 않아서 예외 케이스를 찾는데에 시간이 걸렸다.
처음에 int maxValue = Collections.max(map.values()); 를 key를 반환한다고 착각하고 썼는데, 테스트 케이스가 모두 정답으로 넘어갔다. 테스트 케이스는 교묘하게 최빈 key값의 빈도가 key와 같다는 것이 함정... 내가 틀릴 것을 예상하고 있었던 것처럼
Key
- Collections.max(map.values())
- map의 value 중 최대 값의 value를 반환함
- map.entrySet()
- map의 key와 value를 쌍으로 for문에 넣고 순회하기 위해서 사용함.
- Map.Entry<Integer, Integer> entry
- Map에 저장된 하나의 key, value 쌍을 나타냄. 역시 for문에 넣고 순회한 entrySet()을 하나씩 담기 위해서 사용함.
제출한 코드
import java.util.*;
class Solution {
public int solution(int[] array) {
int answer = 0;
// array의 인자를 key로, 등장 횟수를 value로 담기
HashMap<Integer, Integer> map = new HashMap<>();
for(int num : array){
map.put(num, map.getOrDefault(num,0)+1);
}
// 가장 많은 등장 횟수(value)
int maxValue = Collections.max(map.values());
// 최대 등장 횟수와 value가 같은 key 찾고
// 최대 등장 횟수가 중복인지 확인, 중복이면 check 값 증가
int maxKey = 0;
int check = 0;
for(Map.Entry<Integer, Integer> entry : map.entrySet()){
if(entry.getValue() == maxValue) {
maxKey = entry.getKey();
check ++;
}
}
// System.out.println("check : " + check + "/ maxKey : " + maxKey + "/ map.size() " + map.size());
// check = 1인 경우, 중복 없는 최대값
if(check == 1){
answer = maxKey;
} else {
// array의 모든 인자가 같은 경우(check != 1이라 위의 조건에서 빠져나옴) 처리
if(map.size() == 1){
answer = maxKey;
}
// 최빈값이 여러개인 경우
else {
answer = -1;
}
}
return answer;
}
}
'코딩테스트 > Java' 카테고리의 다른 글
프로그래머스/자바 lv.1 푸드 파이트 대회 - 문자열 뒤집기 (0) | 2024.06.28 |
---|---|
프로그래머스/자바 lv.0 대소문자 바꿔서 출력하기 - toCharArray(), isLowerCase(), toUpperCase() (0) | 2024.06.24 |
프로그래머스/자바 lv.1 정수 내림차순으로 배치하기 (4) | 2024.04.04 |