https://school.programmers.co.kr/learn/courses/30/lessons/72412
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
import java.util.*; class Solution { public int[] solution(String[] info, String[] query) { ArrayList<Integer> ans = new ArrayList<>(); String[] language = {"cpp", "java", "python", "-"}; String[] position = {"backend", "frontend", "-"}; String[] career = {"junior", "senior", "-"}; String[] food = {"chicken", "pizza", "-"}; HashMap<String, ArrayList<Integer>> hashMap = new HashMap<>(); for (int i = 0; i < language.length; i++) { for (int j = 0; j < position.length; j++) { for (int k = 0; k < career.length; k++) { for (int l = 0; l < food.length; l++) { hashMap.put(language[i]+position[j]+career[k]+food[l], new ArrayList<>()); } } } } for (int i = 0; i < info.length; i++) { String[] volInfo = info[i].split(" "); String[] volLanguage = {volInfo[0], "-"}; String[] volPosition = {volInfo[1], "-"}; String[] volCareer = {volInfo[2], "-"}; String[] volFood = {volInfo[3], "-"}; for (int j = 0; j < volLanguage.length; j++) { for (int k = 0; k < volPosition.length; k++) { for (int l = 0; l < volCareer.length; l++) { for (int m = 0; m < volFood.length; m++) { hashMap.get(volLanguage[j]+volPosition[k]+volCareer[l]+volFood[m]).add(Integer.parseInt(volInfo[4])); } } } } } for (List<Integer> score : hashMap.values()) { Collections.sort(score); } for (int i = 0; i < query.length; i++) { query[i] = query[i].replaceAll(" and ", ""); String[] queryInfo = query[i].split(" "); int queryScore = Integer.parseInt(queryInfo[1]); String q = queryInfo[0]; ArrayList<Integer> scores = hashMap.get(q); int cnt = binarySearch(scores, queryScore); ans.add(scores.size() - cnt); } int[] answer = new int[ans.size()]; for (int i = 0; i < ans.size(); i++) { answer[i] = ans.get(i); } return answer; } public int binarySearch(ArrayList<Integer> scores, int queryScore) { int left = 0; int right = scores.size() - 1; int value = scores.size(); while (left <= right) { int mid = (left + right) / 2; if (queryScore <= scores.get(mid)) { value = mid; right = mid - 1; } else { left = mid + 1; } } return value; } }
가능한 모든 경우를 hashMap에 저장
주어진 info배열을 적절히 split으로 분해하여 hashMap에 저장된 경우에 score를 값으로 추가
score값을 정렬해 준 뒤 쿼리에 따라 hashMap에 저장된 score를 이진탐색 실행하여 조건에 맞는
score의 개수(전체 개수 - 조건에 맞는 score의 첫 인덱스)를 구하여 answer에 추가해 주었다
최대한 실행시간을 줄이는 것이 중요했던 문제
HashMap의 Key, Value 중에 Value를 List로 하여 정렬할 수 있다는 점을 배웠다.
'Programmers' 카테고리의 다른 글
[프로그래머스][JAVA]Lv. 2 - 행렬 테두리 회전하기 (0) | 2023.10.22 |
---|---|
[프로그래머스][JAVA]Lv. 2 - 괄호 회전하기 (1) | 2023.10.15 |
[프로그래머스][JAVA]Lv. 2 - 이진 변환 반복하기 (1) | 2023.09.25 |
[프로그래머스][JAVA]Lv. 2 - 쿼드압축 후 개수 세기 (0) | 2023.09.25 |
[프로그래머스][JAVA]Lv. 2 - 튜플 (0) | 2023.09.25 |