https://www.acmicpc.net/problem/2002
2002번: 추월
입력은 총 2N+1개의 줄로 이루어져 있다. 첫 줄에는 차의 대수 N(1 ≤ N ≤ 1,000)이 주어진다. 둘째 줄부터 N개의 줄에는 대근이가 적은 차량 번호 목록이 주어지고, N+2째 줄부터 N개의 줄에는 영식이
www.acmicpc.net
코드설명
HashMap(해시맵) + 구현(Implementation) 문제입니다.
HashMap에는 ("차이름", 순서) 로 적용합니다.
문제의 예시로들어보면, 아래와 같습니다.
ZG431SN - 0번째차량
ZG5080K - 1번째차량
ST123D - 2번째 차량
ZG206A - 3번째 차량
터널 안에서 먼저 나간, 즉 추월한 차량은 어떻게 판단할 수 있을까요?
만약 나가는 차량의 들어온 순서보다, 아직 터널 안에 있는 차량 중 1개라도 들어온 순서가 더 크다면 추월한 것으로 판단할 수 있습니다.
즉, Z6206A - 3 차량이 나갈때 터널에는 여전히 ZG431SN - 0 번째 차량이 남아있으므로, Z6206A 는 추월한것으로 판단할 수 있습니다.
그리고 해당 차량이 나갔다면, 해당 차량을 HASHMAP에서 삭제시켜주어 갱신시킵니다.
만약 HASHMAP을 사용하지 않았다면, 따로 차량의 위치를 iNDEX로 관리해야해서 불필요하거나, O(N^2)의 시간복잡도가 걸리는 순회하여 확인하는 방법을 사용해야했습니다.
HASHMAP을 활용하여 조회복잡도를 줄입니다.
코드
package algorhythm; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.HashMap; import java.util.Map.Entry; import java.util.StringTokenizer; public class Main { public static int N, M, T; public static HashMap<String, Integer> tunnelInCarHashMap = new HashMap<>(); public static int answer = 0; public static void main(String[] args) throws IOException{ BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); StringTokenizer st = new StringTokenizer(br.readLine()); N = Integer.parseInt(st.nextToken()); //먼저 들어가는 차량입니다. int cnt = 0; // ZG431SN - 0번째차량 // ZG5080K - 1번째차량 // ST123D - 2번째 차량 // ZG206A - 3번째 차량 for(int i=0;i<N;i++) { st = new StringTokenizer(br.readLine()); String car = st.nextToken(); tunnelInCarHashMap.put(car, cnt++); } for(int i=0;i<N;i++) { st = new StringTokenizer(br.readLine()); String outCar = st.nextToken(); //만약 어느 한 숫자라도 현재 나가는 car보다 번호가 작은것이 존재한다면, 해당 차량은 추월한 것 입니다. //나와 같은것이 나와도 신경쓰지않아도됩니다. for(Entry<String,Integer> entrySet : tunnelInCarHashMap.entrySet()) { //나보다 더 작은숫자가 아직 터널에 존재하는경우. if(tunnelInCarHashMap.get(outCar) > entrySet.getValue()) { answer += 1; break; } } tunnelInCarHashMap.remove(outCar); } System.out.println(answer); } }
코드 2입니다.
package Main; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.HashMap; import java.util.StringTokenizer; public class Main { public static int C, N, M; public static int answer = 0; public static int[] arr; public static HashMap<String, Integer> hashmap = new HashMap<>(); public static Node[] input, output; public static void main(String[] args) throws IOException{ BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); StringTokenizer st = new StringTokenizer(br.readLine()); N = Integer.parseInt(st.nextToken()); input = new Node[N]; output = new Node[N]; for(int i=0;i<N; i++) { st = new StringTokenizer(br.readLine()); String str = st.nextToken(); hashmap.put(str, i); input[i] = new Node(str, i); } for(int i=0; i<N; i++) { st = new StringTokenizer(br.readLine()); String str = st.nextToken(); output[i] = new Node(str, hashmap.get(str)); } for(int i=0; i<N; i++) { int idx = hashmap.get(output[i].str); for(int j=i+1; j<N; j++) { if( idx > output[j].idx) { answer += 1; break; } } hashmap.remove(output[i].str); } System.out.println(answer); } } class Node{ String str; int idx; public Node(String str, int idx) { this.str = str; this.idx = idx; } }
'알고리즘 > 해시를 사용한 집합과 맵' 카테고리의 다른 글
[백준] 9536 여우는 어떻게 울지? - 해시셋(HashSet) JAVA (0) | 2024.07.25 |
---|---|
[백준] 3273 두 수의 합 - HashSet(해시셋) + 정렬(Sort) + 투포인터(Two Pointer) JAVA (0) | 2024.07.23 |
[백준] 16165 걸그룹 마스터 준석이 - HashMap(해시맵) + HashSet(해시셋) + TreeSet(트리셋) JAVA (0) | 2024.04.02 |
[백준] 4358 생태학 - HashMap(해시맵) + TreeMap(트리맵) + 소수점(printf, .4f, format) JAVA (0) | 2024.04.01 |
[백준] 13414 수강신청 - LinkedHashSet(해시셋) JAVA (0) | 2024.04.01 |