문제 링크 

https://www.acmicpc.net/problem/2841

 

2841번: 외계인의 기타 연주

문제 상근이의 상상의 친구 외계인은 손가락을 수십억개 가지고 있다. 어느 날 외계인은 기타가 치고 싶었고, 인터넷에서 간단한 멜로디를 검색했다. 이제 이 기타를 치려고 한다. 보통 기타는 1번 줄부터 6번 줄까지 총 6개의 줄이 있고, 각 줄은 P개의 프렛으로 나누어져 있다. 프렛의 번호도 1번부터 P번까지 나누어져 있다. 멜로디는 음의 연속이고, 각 음은 줄에서 해당하는 프렛을 누르고 줄을 튕기면 연주할 수 있다. 예를 들면, 4번 줄의 8번 프렛을 누

www.acmicpc.net

 

 

 

 

 

알고리즘

 

1. 배열 스택 생성하여서 그줄에 맞게 플랫을 push

   1)줄에 맞는 스택의 top이 프랫보다 클 경우 작거나 같아질때까지 pop 하면서 cnt++

   2)스택의 top이  입력한 프랫과 같다면 continue

   3)스택의 top이 입력한 프랫보다 작다면 push 하고 cnt++;

2. 스택의 top 이 프랫과 같다 continue

3. 스택의 top이 프랫보다 낮다 프랫을 push 후 cnt++;

 

문제 이해를 잘 못해서 꽤 오래걸렸네요 예제가 좀더 있었음 좋았을듯,

 

 

코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
#include<iostream>
#include<stack>
 
using namespace std;
 
int main() {
 
    int cnt = 0;
    int N;
    int flat;
    cin >> N >> flat;
 
    //스택 배열
    stack<int> s[100];
 
    for (int i = 0; i < N; i++) {
        int a, b;
        //줄번호 프렛
        cin >> a >> b;
        if (b > flat)continue;
 
        //그 줄을 눌러야 하므로 손가락 움직임 ++
        if (s[a].empty()) {
            s[a].push(b);
            cnt++;
        }
        //줄을 누르고있는 손가락이 있다면 ,
        //눌러야 하는줄이 소리가 나고있다면
        else if (s[a].top() == b)continue;
 
 
        //눌러야 하는 줄이 누르면 바로 소리가날경우
        else if (s[a].top() < b) {
            s[a].push(b);
            cnt++;
        }
 
 
        //현재 플렛 소리가 날 때 까지 손가락을 떼야 하므로 움직임 ++
        else if (s[a].top() > b) {
            while (s[a].top() > b) {
                s[a].pop();
                cnt++;
                if (s[a].empty())break;
            }
            //비었으면 
            if (s[a].empty()) {
                cnt++;
                s[a].push(b);
            }
            if (s[a].top() != b) {
                cnt++;
                s[a].push(b);
            }
 
 
        }
 
    }
    cout << cnt;
}
cs
 

 

'c++ > 백준' 카테고리의 다른 글

백준 1904번: 01타일  (0) 2020.03.25
백준 14500번 : 테트로미노  (0) 2020.03.25
백준 5397 키로거  (0) 2019.11.21
백준 2493번 : 탑  (0) 2019.11.20
백준 10799번 쇠막대기  (0) 2019.11.20
ariz1623