https://school.programmers.co.kr/learn/courses/30/lessons/72412
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
문제 접근 방법
1. 문제에서 주어진 Info 정보를 기반으로 해쉬맵을 생성한다.
2. 각 해쉬맵의 value를 오름차순으로 정렬한다.
3. query 조건에 맞는 지원자를 가져온다.
4. 이분 탐색을 통해서 lower bound를 찾는다.
import java.util.*;
class Solution {
static Map<String, ArrayList<Integer>> map = new HashMap<>();
public int[] solution(String[] info, String[] query) {
for(String s : info) {
String [] str = s.split(" ");
String [] languages = {str[0], "-"};
String [] jobs = {str[1], "-"};
String [] exps = {str[2], "-"};
String [] foods = {str[3], "-"};
int score = Integer.parseInt(str[4]);
// 4 * 3 * 3 * 3 = 108
for (String language : languages)
for(String job : jobs)
for(String exp : exps)
for(String food : foods) {
String [] keys = {language, job, exp, food};
String key = String.join(" ", keys);
ArrayList<Integer> arr = map.getOrDefault(key, new ArrayList<>());
arr.add(score);
map.put(key, arr);
}
}
// 오름차순
for(ArrayList<Integer> arr : map.values()) {
Collections.sort(arr);
}
map.forEach((key,value) -> System.out.println(key + " : " + value));
// 쿼리 조건에 맞는 지원자를 가져온다.
int [] answer = new int[query.length];
int idx = 0;
for(String q : query) {
String [] str = q.split(" and ");
int target = Integer.parseInt(str[3].split(" ")[1]);
str[3] = str[3].split(" ")[0]; // 숫자를 제외한 값들만 key로 가지기 위해
String key = String.join(" ", str);
if (map.containsKey(key)) {
ArrayList<Integer> list = map.get(key);
int start = 0;
int end = list.size();
while (start < end) {
int mid = (start + end) / 2;
if (list.get(mid) >= target) {
end = mid;
}
else start = mid + 1;
}
answer[idx] = list.size() - start;
}
idx++;
}
return answer;
}
}
문제 풀이 회고
카카오 문제는 레벨 + 1씩 해야할 것 같다...
힌트를 봤음에도 이해가 되지 않는 것이 두가지 였다.
1. 해쉬맵에 왜 모든 경우의 수를 key에 저장하는가?
2. 왜 점수를 ArrayList 형태로 저장하는가?
1번 같은 경우는 "-"에 대한 케이스를 고려하지 못해서 헷갈렸다.
"- and - and - and - 150"와 같은 조건이 쿼리에 있을 때, 저 "-"에는 아무 값이나 들어와도 상관없고 단지 점수만 150점을 넘으면 된다는 소리다. 그렇기 때문에 모든 경우의 수에 대해서 해쉬맵에 key 형태로 저장을 해줘야 한다.
2번은
- - - - 이런식으로 입력값이 주어진다면 모든 지원자들을 의미하는 것이기 때문에 모든 숫자 정보를 포함해야 한다.
[50, 80, 150, 150, 210, 260]
그러므로, 단순히 Integer로 저장하는 것이 아닌 ArrayList로 저장해줘야 한다!
https://www.youtube.com/watch?v=vFwVvJQnC4M
'Algorithm > 프로그래머스 코딩테스트 문제풀이전략' 카테고리의 다른 글
[프로그래머스] Lv.0 A로 B 만들기 (0) | 2024.05.05 |
---|---|
[프로그래머스] Lv.0 중복된 문자 제거 (0) | 2024.05.05 |
[프로그래머스] Lv.2 메뉴 리뉴얼 (0) | 2024.05.03 |
[프로그래머스] Lv.2 가장 큰 수 (0) | 2024.05.02 |
[프로그래머스] Lv.2 문자열 내 마음대로 정렬하기 (0) | 2024.05.02 |