문제
내가 작성한 정답
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