[백준 - 2841] 실버2- 외계인의 기타 연주
알고리즘/백준

[백준 - 2841] 실버2- 외계인의 기타 연주

www.acmicpc.net/problem/2841

 

2841번: 외계인의 기타 연주

첫째 줄에 멜로디에 포함되어 있는 음의 수 N과 한 줄에 있는 프렛의 수 P가 주어진다. (N ≤ 500,000, 2 ≤ P ≤ 300,000) 다음 N개 줄에는 멜로디의 한 음을 나타내는 두 정수가 주어진다. 첫 번째 정수

www.acmicpc.net

1. 유형

스택

 

2. 풀이

위의 조건 처럼 입력을 받을때 기존의 스택의 peek()보다

 

더큰 플랫을 입력 받을 경우 추가를 해준다.

 

하지만 더 작은 플랫을 입력 받을 시, 스택에서 입력값보다 더 큰 플랫이 나올 때까지

 

pop을 해야한다.

 

위와 같은 경우가 나오면 3, 2를 빼고 마지막에 1은 이미 존재 하기 때문에 push를 하면 안된다

 

그렇기 때문에 while문을 빠져나온 후, 마지막 if문의 조건을 주었다.

 

3. 코드

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Stack;
import java.util.StringTokenizer;

public class Main {

	public static void main(String[] args) throws IOException {
		// TODO Auto-generated method stub
		BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = new StringTokenizer(in.readLine(), " ");
		// 더 높은 음이 나올 경우 손을 땐다.
		int N = Integer.valueOf(st.nextToken());
		int P = Integer.valueOf(st.nextToken());
		Stack<Integer> stack[] = new Stack[7];
		for (int i = 0; i < 7; i++) {
			stack[i] = new Stack<>();
		}
		int num = 0;
		for (int i = 0; i < N; i++) {
			st = new StringTokenizer(in.readLine(), " ");
			int n = Integer.valueOf(st.nextToken());
			int p = Integer.valueOf(st.nextToken());
			if (stack[n].isEmpty() || stack[n].peek() < p) {
				stack[n].push(p);
				num++;
			} else if (stack[n].peek() > p) {
				while (!stack[n].isEmpty() && stack[n].peek() > p) {
					stack[n].pop();
					num++;
				}
				if (stack[n].isEmpty() || (!stack[n].isEmpty() && stack[n].peek() != p)) {
					stack[n].push(p);
					num++;
				}
			}
		}
		System.out.println(num);
	}
}

 

4. 느낀점

 

발상은 빠르게 떠올렸지만, 예외처리를 하는것 놓쳤다.

 

더 깊게 생각하는 버릇을 들여야겠다.