본문 바로가기
Computer Science/Programming-알고리즘

[Baekjoon] 외계인의 기타연주

by M-life 2016. 2. 22.
반응형

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


설명 : 6개의 기타 줄이 있고, P개의 프렛수가 주어진다. 

N개의 경우에 대해 줄의 번호와 프렛 번호가 주어질 때 최소 손가락의 움직임을 출력하는 문제이다.


풀이 :

1번줄의 3번을 누르고 있다가 5번을 누르면 5번음이 연주가 된다. 단, 이때 2번음을 연주하고자 한다면, 누른 5번음과 3번음을 때야한다.

한마디로 더 낮은 음을 연주하기 위해서는 그보다 높은 음을 떼야한다. -> LIFO구조의 스택을 이용


코드 :

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
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
 
package feb17.alien;
 
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
import java.util.Stack;
 
public class Main {
 
    public static void main(String[] args) {
        // TODO Auto-generated method stub
 
        Scanner sc = new Scanner(System.in);
        int N, P;
        int cnt = 0;
        
        N = sc.nextInt();
        P = sc.nextInt();
 
        List<Stack<Integer>> list = new ArrayList<Stack<Integer>>();
        
        for(int i = 0; i < 6; i++)
            list.add(new Stack<Integer>());
        
        for(int i = 0; i < N; i++){
            
            int num = sc.nextInt() - 1;
            int fret = sc.nextInt();
                
            Stack<Integer> s = list.get(num);
            
            if(s.isEmpty()){
                list.get(num).push(fret);
                cnt++;
                continue;
            }
            
            int s_fret = s.peek();
            
            if(s_fret < fret){
                list.get(num).push(fret);
                cnt++;
            }
            else if(s_fret > fret){
                
                boolean flag = false;
                while(!list.get(num).isEmpty()){
                    
                    int f = list.get(num).peek();
                    
                    if(f < fret){
                        list.get(num).push(fret);
                        cnt++;
                        break;
                    }
                    else if(f > fret){
                        list.get(num).pop();
                        cnt++;
                        if(list.get(num).isEmpty())
                            flag = true;
                    }
                    else {
                        break;
                    }
                }
                if(flag){
                    list.get(num).push(fret);
                    cnt++;
                }
                    
            }
            
        }
        
        System.out.println(cnt);
    }
 
}
 
cs

  



반응형

'Computer Science > Programming-알고리즘' 카테고리의 다른 글

[Baekjoon] 하노이 탑 이동 순서  (0) 2016.02.22
[Baekjoon] 타일채우기  (0) 2016.02.22
[Baekjoon] 앱  (0) 2016.02.22
[Baekjoon] 네트워크 연결  (0) 2016.02.09

댓글