<문제>
https://www.acmicpc.net/problem/2002
2002번: 추월
입력은 총 2N+1개의 줄로 이루어져 있다. 첫 줄에는 차의 대수 N(1 ≤ N ≤ 1,000)이 주어진다. 둘째 줄부터 N개의 줄에는 대근이가 적은 차량 번호 목록이 주어지고, N+2째 줄부터 N개의 줄에는 영식이
www.acmicpc.net
< 풀이 1: Hashmap 사용 ❌>
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
//추월
public class P2002 {
static String input[];
static String output[];
static int n;
static int count=0;
static void find(String num,String arr[]) {
int index=0;
boolean passed=true;
for(int i=0;i<output.length;i++) {
if(output[i].equals(num)) {
index=i;
break;
}
}
if(index==0) {
count++;
}
else {
for(int i=0;i<arr.length;i++) {
for(int j=0;j<index;j++) {
if(arr[i].equals(output[j])) {
passed=false;
break;
}
else
passed=true;
}
if(passed) {
count++;
break;
}
}
}
}
public static void main(String[] args) throws NumberFormatException, IOException {
// TODO Auto-generated method stub
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
n=Integer.parseInt(br.readLine()); //차 대수 입력받음
input=new String[n]; //들어가는 순서
output=new String[n]; //나오는 순서
for(int i=0;i<n;i++) {
input[i]=br.readLine();
}
for(int i=0;i<n;i++) {
output[i]=br.readLine();
}
for(int i=1;i<input.length;i++) {
String arr[]=new String[i];
for(int j=0;j<=i-1;j++) {
arr[j]=input[j];
}
find(input[i],arr); //find 함수에 현재 값과 현재 값보다 앞에 있는 값들을 저장한 배열(arr)을 매개변수로 전달
}
System.out.println(count);
}
}
✏️ 풀이 방법
String input = { a,b,c,d } , String output= { d, a, c, b } 일 때
input 배열에서 c 값의 경우 앞에 있는 값이 { a, b } 이다.
그렇다면 output 배열에서 c 보다 앞에 a, b 가 있는지 확인하여
값이 하나라도 없는 경우에는 count를 증가하는 식으로 코드를 구성했다.
하지만, 문제를 풀면서도 이렇게까지 복잡하게 안해도 될 것 같은데? 하는
생각이 들어 다른 풀이들을 찾아봤다.
< 풀이 2: Hashmap 사용>
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.HashMap;
import java.util.Map;
class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine());
Map<String, Integer> map = new HashMap<>();
int count = 0;
for (int i = 0; i < N; i++) {
map.put(br.readLine(), i); // (a,0),(b,1),(c,2) 의 형식으로 저장됨
}
int[] arr = new int[N];
for (int i = 0; i < N; i++) {
String input = br.readLine();
arr[i] = map.get(input); // 입력 받은 값으로 value를 찾아 arr 배열에 저장
}
for(int i = 0; i< N-1; i++){
for(int j = i+1; j< N; j++){
if(arr[i] > arr[j]){ // 현재 값이 뒤에 있는 배열 값보다 크면
count++;
break;
}
}
}
System.out.println(count);
}
}
현재 값이 뒤에 있는 배열 값보다 크다 => 추월했다 라는 뜻
추월한 차의 개수를 증가시켜주고, 클 때마다 증가시키는 것이 아니므로 바로 break 를 해준다.
이렇게 해시맵을 이용해서 풀면 훨씬 간단하고, 시간도 많이 줄어든다 !
✍🏻 느낀점
해시맵을 진작에 알았더라면 훨씬 깔끔하고 쉽게 풀었을텐데..!
이제라도 해시맵에 대해 배웠으니,
앞으로 비슷한 문제가 나올 때 잘 활용해야겠다.
참고 블로그
'코딩테스트 > Baekjoon' 카테고리의 다른 글
[JAVA] 백준 26215번: 눈 치우기 (0) | 2024.05.12 |
---|---|
[JAVA] 백준 17952번: 과제는 끝나지 않아! (0) | 2024.04.09 |
[JAVA] 백준 1713번: 후보 추천하기 (0) | 2024.03.22 |
[JAVA] 백준 2798번: 블랙잭 (0) | 2024.03.19 |
[JAVA] 백준 18429번: 근손실 (1) | 2024.03.11 |