문제 풀이/백준
[백준] 2841번. 외게인의 기타 연주 (JAVA)
27200
2024. 2. 6. 19:55
https://www.acmicpc.net/problem/2841
문제
풀이
import java.io.*;
import java.util.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
st = new StringTokenizer(br.readLine());
int n = Integer.parseInt(st.nextToken());
int p = Integer.parseInt(st.nextToken());
Map<Integer, Stack<Integer>> keyStackMap = new HashMap<>();
for (int i = 1; i <= 6; i++) {
keyStackMap.put(i, new Stack<>());
}
int cnt = 0;
for(int i = 0; i < n; i++){
st = new StringTokenizer(br.readLine());
int key = Integer.parseInt(st.nextToken());
int value = Integer.parseInt(st.nextToken());
if(!keyStackMap.get(key).empty()){
while(!keyStackMap.get(key).empty() && keyStackMap.get(key).peek() != value){
if(keyStackMap.get(key).peek() < value){
keyStackMap.get(key).push(value);
}else{
keyStackMap.get(key).pop();
}
cnt++;
}
}else{
keyStackMap.get(key).push(value);
cnt++;
}
if(keyStackMap.get(key).empty()){
cnt++;
}
}
System.out.println(cnt);
}
}
자바에 스택 배열이 있는지 몰라 고생했다.
Stack<Integer>[] stack = new Stack[7];
이러한 문법이 있는지 알았다면 아마 해쉬맵 기반으로 코드를 작성하지는 않았을 것 같다. 해쉬맵과 스택 배열을 사용하는 것 중에 편리한 것이 스택 배열이고, 그 외에 코드 작성 부분은 동일하다고 생각하지만 효율성을 따지려면 스택배열을 사하는 것이 옳다고 생각한다.
쓰던 문법에 얽매이지 않고 다양한 문법을 익혀야 할 것 같다.
문제 풀이에서 주요했던 부분은 마지막 입력에 대해 스택에 있다면 이 전 것을 팝 하면 끝나지만, 스택에 없었다면 이를 누르기 위해 한번 더 cnt++를 해줘야 한다는 부분을 주의해야 할 것 같다.