[알고리즘문제풀기] 전국 대회 선발 고사

silver's avatar
Oct 13, 2025
[알고리즘문제풀기] 전국 대회 선발 고사

문제

내가 작성한 정답

import java.util.*; class Solution { public int solution(int[] rank, boolean[] attendance) { int answer =0; Map<Integer,Integer> map = new HashMap<>(); List<Integer> list = new ArrayList<>(); for(int i=0; i<rank.length; i++){ if(attendance[i]){ map.put(rank[i],i); list.add(rank[i]); } } Collections.sort(list); return map.get(list.get(0))*10000+map.get(list.get(1))*100+map.get(list.get(2)); } }

다른 사람들의 정답

import java.util.Comparator; import java.util.stream.IntStream; class Solution { public int solution(int[] rank, boolean[] attendance) { return IntStream.range(0, rank.length) // 0부터 rank 길이까지 인덱스 스트림 생성 .filter(i -> attendance[i]) // attendance가 true인 인덱스만 필터링 .boxed() // int 스트림을 Integer 객체 스트림으로 변환 .sorted(Comparator.comparing(i -> rank[i])) // rank 값을 기준으로 인덱스 정렬 (오름차순) .limit(3L) // 상위 3개만 선택 .reduce((current, next) -> current * 100 + next) // 3개 인덱스를 하나의 숫자로 합침 (ex: 1, 4, 5 → 1*100+4=104 → 104*100+5=10405) .get(); // Optional에서 값 추출 } } import java.util.PriorityQueue; import java.util.PriorityQueue; class Solution { public int solution(int[] rank, boolean[] attendance) { // 랭크 배열은 참가자의 등수 정보를 담고 있고, attendance 배열은 참석 여부 표시 // 등수를 기준으로 인덱스를 정렬하는 우선순위 큐를 생성 PriorityQueue<Integer> que = new PriorityQueue<>((a, b) -> rank[a] - rank[b]); //PriorityQueue :일반 큐와는 달리 들어간 순서와 상관없이 우선순위가 높은 데이터가 먼저 나오는 큐 // 참석한 사람만 우선순위 큐에 삽입 for (int i = 0; i < attendance.length; i++) { if (attendance[i]) que.add(i); } // 우선순위 큐에서 등수가 가장 높은 3명을 뽑아 자릿수에 맞게 합침 // 첫 번째 뽑힌 사람은 만 자리, 두 번째는 백 자리, 세 번째는 1자리 자릿수에 곱함 return que.poll() * 10000 + que.poll() * 100 + que.poll(); } } import java.util.ArrayList; import java.util.TreeMap; class Solution { public int solution(int[] rank, boolean[] attendance) { TreeMap<Integer, Integer> tree = new TreeMap<>(); for (int i = 0; i < rank.length; i++) { if (attendance[i] == true) tree.put(rank[i], i); } ArrayList<Integer> list = new ArrayList<>(); for (Integer key : tree.keySet()) { if (list.size() == 3) break; list.add(tree.get(key)); } return list.get(0) * 10000 + list.get(1) * 100 + list.get(2); } } import java.util.ArrayList; import java.util.TreeMap; class Solution { public int solution(int[] rank, boolean[] attendance) { TreeMap<Integer, Integer> tree = new TreeMap<>(); for (int i = 0; i < rank.length; i++) { if (attendance[i] == true) tree.put(rank[i], i); } ArrayList<Integer> list = new ArrayList<>(); for (Integer key : tree.keySet()) { if (list.size() == 3) break; list.add(tree.get(key)); } return list.get(0) * 10000 + list.get(1) * 100 + list.get(2); } }
구분
HashMap
TreeMap
PriorityQueue
데이터 구조
해시 테이블(Hash Table) 기반
레드-블랙 트리(Red-Black Tree) 기반
힙(Heap) 자료구조 기반
정렬 여부
없음 (순서 보장 안 함)
키 기준으로 자동 오름차순 정렬 유지
우선순위에 따라 요소 자동 정렬
검색/삽입/삭제 성능
평균 O(1)
O(log n)
삽입/삭제 O(log n), 조회 O(1)
키 중복
불허 (유일한 키만 허용)
불허
중복 허용
키/값 null 허용
키 하나와 값 여러 개 null 허용
키 null 허용 안 됨, 값은 허용 가능
null 허용 안 됨
순서 유지 여부
입력 순서 유지하지 않음
키의 오름차순 순서로 유지
우선순위가 높은 요소가 먼저 제거
사용 목적
빠른 조회와 삽입이 필요할 때
키에 따른 정렬된 데이터 관리 필요 시
우선순위 기반 작업 처리, 최소/최대값 관리
구현 인터페이스
Map
NavigableMap (SortedMap 확장)
Queue
  • HashMap은 빠른 접근과 삽입이 필요한 경우 적합하며, 데이터 순서를 보장 x
  • TreeMap은 키 기반 정렬이 필요하고 범위 검색 등이 잦을 때 유리! 성능은 HashMap보다 느림
  • PriorityQueue는 정렬된 순서로 데이터를 처리해야 할 때 (예: 최소값/최대값 접근) 사용하는 별도의 큐 자료구조
Share article

silver