프로그래머스 프린터(priorities) 정답 코드
뿌리튼튼 CS/Algorithm2019. 4. 16. 09:24
난이도 ★★★☆☆
힌트
문제에서 설명하는 그대로, 사람이 생각하는 그대로를 코딩으로 옮겼습니다. (Stack 을 쓰지 않음) 다만 자료구조를 TreeMap, LinkedList 로 써서 성능을 많이 향상시켰습니다. |
이하는 코드입니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 | import java.util.ArrayList; import java.util.LinkedList; import java.util.List; import java.util.TreeMap; public class Solution { public int solution(int[] priorities, int location) { TreeMap<Integer, Integer> countMap = new TreeMap<>(); // 뒤에 나보다 큰 녀석이 있는지 확인용 LinkedList<Doc> remains = new LinkedList<>(); for (int i = 0; i < priorities.length; i++) { int priority = priorities[i]; Integer count = countMap.get(priority); if (count == null) { countMap.put(priority, 1); } else { countMap.put(priority, count + 1); } Doc doc = new Doc(); doc.id = i; doc.priority = priority; remains.add(doc); } List<Doc> results = new ArrayList<>(); // 최종 결과 while (!remains.isEmpty()) { Doc doc = remains.getFirst(); Integer higherPriority = countMap.higherKey(doc.priority); // TreeMap을 쓴 이유임 if (higherPriority == null) { // 나보다 큰 녀석이 뒤에 없음 results.add(doc); remains.removeFirst(); int count = countMap.get(doc.priority); if (count > 1) { countMap.put(doc.priority, count - 1); } else { countMap.remove(doc.priority); } } else { // 맨앞의 녀석을 맨뒤로 보냄. LinkedList를 쓴 이유임 remains.removeFirst(); remains.addLast(doc); } } int answer = 0; for (int i = 0; i < results.size(); i++) { Doc doc = results.get(i); if (doc.id == location) { answer = i + 1; break; } } return answer; } private class Doc { int id; int priority; } } | cs |
'뿌리튼튼 CS > Algorithm' 카테고리의 다른 글
프로그래머스 단어 변환(words) 정답 코드 (0) | 2019.04.16 |
---|---|
프로그래머스 타겟 넘버 정답 코드 (0) | 2019.04.16 |
프로그래머스 쇠막대기(arrangement) 정답 코드 (0) | 2019.04.15 |
프로그래머스 H-Index(citations) 정답 코드 (0) | 2019.04.15 |
프로그래머스 가장 큰 수(numbers) 정답 코드 (0) | 2019.04.15 |