티스토리 뷰

카테고리 없음

[백준 14891] 톱니바퀴

토픽셀프 2019. 7. 15. 00:06

[백준 14891] 톱니바퀴

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

문제가 너무 길어 링크로 대체하겠다.

연속으로 시뮬레이션 문제를 풀었다.

삼성 역량 평가 문제들은 알고리즘 지식 보다 문제해결능력에 더 초점이 맞춰져 있는 것 같다.

시뮬레이션 문제답게 이 문제 역시 문제에서 요구한대로만 잘 풀면된다.

시계, 반시계방향 회전 로직, 양 옆의 톱니바퀴 회전 로직만 구현해내면 끝이다.

필자는 재귀와 방문배열의 활용으로 풀었다.

public class Main { static int a[][] = new int[5][9]; static boolean visited[] = new boolean[5]; public static void main(String[] args) throws Exception { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); StringTokenizer st; for(int i=1; i<=4; i++) { String s = br.readLine(); for(int j=1; j<=8; j++) a[i][j] = s.charAt(j-1) - '0'; } int k = Integer.parseInt(br.readLine()); while(k-->0) { st = new StringTokenizer(br.readLine()); int idx = Integer.parseInt(st.nextToken()); int d = Integer.parseInt(st.nextToken()); visited[idx] = true; rotate(idx, d); Arrays.fill(visited, false); } int score = 0; for(int i=1; i<=4; i++) if(a[i][1] == 1) score += Math.pow(2, i-1); System.out.println(score); } public static void rotate(int idx, int d) { if(idx - 1 > 0 && !visited[idx-1]) if(a[idx-1][3] != a[idx][7]) { visited[idx-1] = true; rotate(idx-1, -d); } if(idx + 1 < 5 && !visited[idx+1]) if(a[idx][3] != a[idx+1][7]) { visited[idx+1] = true; rotate(idx+1, -d); } int prev = a[idx][1]; int curr = 0; if(d == 1) { for(int i=2; i<=8; i++) { curr = a[idx][i]; a[idx][i] = prev; prev = curr; } } else { for(int i=8; i>=2; i--) { curr = a[idx][i]; a[idx][i] = prev; prev = curr; } } a[idx][1] = curr; } }

from http://baelanche.tistory.com/202 by ccl(A)

댓글