티스토리 뷰
반응형
#. Problem
* The copyright in this matter is in BOJ
#. Resolution Process
1. Read and understand problem
2. Redefine the problem + abstract
3. Create solution plan (select Algorithm, Data structure)
4. Prove the plan (check performance time and usage memory)
5. Carry out the plan
6. Look back on the plan and find a way to improve it
#. Solve
외계인 친구와 친해지고 싶어서 이 문제를 풀게 되었다.
기타를 연주하기 위해 음을 누르고 떼는 동작은 마치 Stack 자료구조와 유사한 것을 느낄 수 있다.
프렛을 누르는 동작은 Stack의 push()
프렛을 떼는 동작은 Stack의 pop() !
#. Code
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 | import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.Stack; import java.util.StringTokenizer; public class BOJ2842 { static int N, P; public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); StringTokenizer st = new StringTokenizer(br.readLine()); N = Integer.parseInt(st.nextToken()); // 음의 수 P = Integer.parseInt(st.nextToken()); // 프렛의 수 // 기타 줄 세팅 Stack<Integer>[] line = new Stack[7]; for (int i = 1; i <= 6; i++) { line[i] = new Stack<>(); } // 어떤 음을 쳐볼까? int cnt = 0; for (int i = 0; i < N; i++) { st = new StringTokenizer(br.readLine()); int a = Integer.parseInt(st.nextToken()); int b = Integer.parseInt(st.nextToken()); // 프렛 누르기 if(line[a].isEmpty() || line[a].peek() < b) { // 이미 음을 누르고 있다면 if(!line[a].isEmpty() && line[a].peek() == b) continue; line[a].push(b); cnt++; continue; } // 프렛 떼기 while(!line[a].isEmpty() && line[a].peek() > b) { line[a].pop(); cnt++; } // 이미 음을 누르고 있다면 if(!line[a].isEmpty() && line[a].peek() == b) continue; // 새로 음을 눌러야 하면 line[a].push(b); cnt++; } System.out.println(cnt); } } | cs |
#. Code_v2
최적화를 위해 Stack을 구현해보았다.
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 | import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.Stack; import java.util.StringTokenizer; public class BOJ2842_v2 { static int N, P; public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); StringTokenizer st = new StringTokenizer(br.readLine()); N = Integer.parseInt(st.nextToken()); // 음의 수 P = Integer.parseInt(st.nextToken()); // 프렛의 수 // 기타 줄 세팅 int[][] line = new int[7][P]; int[] tops = new int[7]; for (int i = 1; i <= 6; i++) { tops[i] = -1; } // 어떤 음을 쳐볼까? int cnt = 0; for (int i = 0; i < N; i++) { st = new StringTokenizer(br.readLine()); int a = Integer.parseInt(st.nextToken()); int b = Integer.parseInt(st.nextToken()); // 프렛 누르기 if(tops[a] == -1 || line[a][tops[a]] < b) { // 이미 음을 누르고 있다면 if(tops[a] >= 0 && line[a][tops[a]] == b) continue; line[a][++tops[a]] = b; cnt++; continue; } // 프렛 떼기 while(tops[a] >= 0 && line[a][tops[a]] > b) { tops[a]--; cnt++; } // 이미 음을 누르고 있다면 if(tops[a] >= 0 && line[a][tops[a]] == b) continue; // 새로 음을 눌러야 하면 line[a][++tops[a]] = b; cnt++; } System.out.println(cnt); } } | cs |
반응형
'PS > Problem_Solving' 카테고리의 다른 글
[BOJ] 14465. 소가 길을 건너간 이유 5(누적합).java (0) | 2020.11.15 |
---|---|
[BOJ] 15886. 내 선물을 받아줘 2(DFS).java (0) | 2020.11.15 |
[BOJ] 14464.소가 길을 건너간 이유 4(PQ).java (0) | 2020.11.14 |
[BOJ] 11967.불켜기(완탐).java (0) | 2020.11.12 |
[BOJ] 20005.보스몬스터 전리품(BFS).java (0) | 2020.11.11 |
댓글