티스토리 뷰
생각
백준의 다음 문제와 같은 문제이다. [백준] 14891번 톱니바퀴
처음 생각
이미 풀어봤던 유형이여서 그 생각 그대로 풀이를 하였다.
▶풀어봤던 문제들은 접근이 빠르므로 해당 테스트를 본다면 기출은 꼭 풀어보고 들어가면 좋다고 다시 생각해보았다.
▶답을 보고 풀어보더라도 자신의 것으로 만들 수 있도록 보고나서 이해한 다음 다시 풀어보는것이 좋다.
다음 생각
처음에 방문 배열을 만들어 주지 않아서 예제를 제출했을 때, 메모리 초과 오류가 나왔다.
방안
1) 방문 배열을 만들어줘서 이미 돈 자석은 다시 돌지 않도록 해주었다.
2) solve의 매개값으로 번호를 넣어줄 때, 입력의 번호는 1번부터 주어지므로 -1을 해주고 나서 넘겨주었다.
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 81 82 83 84 85 86 87 88 89 90 91 92 93 94 | import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.LinkedList; import java.util.Queue; import java.util.StringTokenizer; class Solution { static int k; static int[][] arr; static StringTokenizer st; public static void main(String[] args) throws IOException{ BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); StringBuilder sb = new StringBuilder(); int tc = Integer.parseInt(br.readLine()); for(int i=1;i<=tc;i++) { arr = new int[4][8]; k = Integer.parseInt(br.readLine()); for(int j=0;j<4;j++) { st = new StringTokenizer(br.readLine()); for(int k=0;k<8;k++) arr[j][k] = Integer.parseInt(st.nextToken()); } for(int j=0;j<k;j++) { // 1시계 -1 반시계 st = new StringTokenizer(br.readLine()); int num = Integer.parseInt(st.nextToken()); int rotate = Integer.parseInt(st.nextToken()); solve(num-1,rotate); } int[] score = {1,2,4,8}; // 점수 계산 int result = 0; for(int j=0;j<4;j++) if(arr[j][0]==1) result+=score[j]; sb.append("#"+i+" "+result+"\n"); } System.out.print(sb); } private static void solve(int num,int rotate) { Queue<Pair> queue = new LinkedList<>(); queue.add(new Pair(num,rotate)); boolean[] visited = new boolean[4]; visited[num] = true; while(!queue.isEmpty()) { Pair t = queue.poll(); // 3시 -> 2 , 9시 -> 6 // 왼쪽 체크 if(t.num-1>=0) { // 왼쪽이니 현 6번과 다음 2번을 비교 if(arr[t.num][6]!=arr[t.num-1][2]&&!visited[t.num-1]) { queue.add(new Pair(t.num-1,t.rotate*-1)); visited[t.num-1] = true; } } // 오른쪽 체크 if(t.num+1<4) { // 오른쪽이니 현 2번과 다음 6번을 비교 if(arr[t.num][2]!=arr[t.num+1][6]&&!visited[t.num+1]) { queue.add(new Pair(t.num+1,t.rotate*-1)); visited[t.num+1] = true; } } rotate(t.num,t.rotate); } } private static void rotate(int num,int rotate) { int t = 0; switch(rotate) { case 1: // 시계 t = arr[num][7]; for(int i=7;i>0;i--) arr[num][i] = arr[num][i-1]; arr[num][0] = t; break; case -1: // 반 시계 t = arr[num][0]; for(int i=0;i<7;i++) arr[num][i] = arr[num][i+1]; arr[num][7] = t; break; } } static class Pair{ private int num,rotate; public Pair(int num,int rotate) { this.num = num; this.rotate = rotate; } } } | cs |
'알고리즘 > SW Expert' 카테고리의 다른 글
[SW Expert] 5658. [모의 SW 역량테스트] 보물상자 비밀번호 (0) | 2018.09.27 |
---|---|
[SW Expert] 5653. [모의 SW 역량테스트] 줄기세포배양 (8) | 2018.09.20 |
[SW Expert] 4014. [모의 SW 역량테스트] 활주로 건설 (0) | 2018.09.16 |
[SW Expert] 5432. 쇠막대기 자르기 (0) | 2018.09.06 |
[SW Expert] 5521. 상원이의 생일파티 (0) | 2018.09.06 |
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday