문제 풀이/백준

[백준] 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++를 해줘야 한다는 부분을 주의해야 할 것 같다.