티스토리 뷰

알고리즘

[백준] 15662. 톱니바퀴2 (Java)

melthleeth 2020. 12. 20. 16:22

톱니바퀴문제에서 톱니 개수를 늘리고 정답 구하는 부분만 바꿔주면 되는 문제

 

15662번: 톱니바퀴 (2)

총 8개의 톱니를 가지고 있는 톱니바퀴 T개가 아래 그림과 같이 일렬로 놓여져 있다. 또, 톱니는 N극 또는 S극 중 하나를 나타내고 있다. 톱니바퀴에는 번호가 매겨져 있는데, 가장 왼쪽 톱니바퀴

www.acmicpc.net

 

풀이

예전에 썼던 톱니바퀴에서 톱니 개수를 늘리고 정답 구하는 부분만 바꿔주면 되므로 포스트 링크와 코드만 첨부한다.

 

 

 

[백준] 14891. 톱니바퀴 (Java)

시뮬레이션에 간단한 BFS가 추가된 문제 14891번: 톱니바퀴 총 8개의 톱니를 가지고 있는 톱니바퀴 4개가 아래 그림과 같이 일렬로 놓여져 있다. 또, 톱니는 N극 또는 S극 중 하나를 나타내고 있다.

melthleeth.tistory.com

 

코드

import java.util.*;
import java.io.*;

public class Main {
	static final int LEFT = 0, RIGHT = 1;
	static int T, K;
	static int[][] cog;
	static int[][] idx;
	static int[][] order;
	
	public static void main(String[] args) throws IOException {
		input();
		solve();
		System.out.println(getAnswer());
	}
	
	public static void input() throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st;
		
		T = Integer.parseInt(br.readLine());
		cog = new int[T + 1][10];
		idx = new int[T + 1][2];
		for (int i = 1; i <= T; i++) {
			String[] temp = br.readLine().split("");
			
			for (int j = 0; j < 8; j++)
				cog[i][j] = Integer.parseInt(temp[j]);
			
			
			idx[i][LEFT] = 6;
			idx[i][RIGHT] = 2;
		}
		
		K = Integer.parseInt(br.readLine());
		order = new int[K][2];
		for (int k = 0; k < K; k++) {
			st = new StringTokenizer(br.readLine());
			order[k][0] = Integer.parseInt(st.nextToken());
			order[k][1] = Integer.parseInt(st.nextToken());
		}
	}
	
	public static void solve() {
		for (int k = 0; k < K; k++) {
			Queue<Cog> q = new LinkedList<>();
			Queue<Cog> temp = new LinkedList<>();
			boolean[] visited = new boolean[T + 1];
			
			q.offer(new Cog(order[k][0], order[k][1]));
			temp.offer(new Cog(order[k][0], order[k][1]));
			while(!q.isEmpty()) {
				int num = q.peek().num;
				int d = q.peek().d;
				q.poll();
				
				if (num < 1 || num > T || visited[num]) continue;
				visited[num] = true;
				
				if (num != 1 && cog[num][idx[num][LEFT]] != cog[num - 1][idx[num - 1][RIGHT]]) {
					q.offer(new Cog(num - 1, -d));
					if (!visited[num - 1]) temp.offer(new Cog(num - 1, -d));
				}
				
				if (num != T && cog[num][idx[num][RIGHT]] != cog[num + 1][idx[num + 1][LEFT]]) {
					q.offer(new Cog(num + 1, -d));
					if (!visited[num + 1]) temp.offer(new Cog(num + 1, -d));
				}
			}
			
			while(!temp.isEmpty()) {
				int num = temp.peek().num;
				int d = temp.peek().d;
				temp.poll();
				
				idx[num][LEFT] = (idx[num][LEFT] - d + 8) % 8;
				idx[num][RIGHT] = (idx[num][RIGHT] - d + 8) % 8;
			}
		}
		
	}
	
	public static int getAnswer() {
		int sum = 0;
		for (int i = 1; i <= T; i++) {
			int noon = (idx[i][RIGHT] + 6) % 8;
			if (cog[i][noon] == 1) sum ++;
		}
		
		return sum;
	}
	
	static class Cog {
		int num;
		int d;
		
		public Cog(int num, int d) {
			this.num = num;
			this.d = d;
		}

	}
}

 

실행 결과

'알고리즘' 카테고리의 다른 글

[백준] 2290. LCDTest (Java)  (1) 2020.12.23
[백준] 2933. 미네랄  (0) 2020.12.20
[백준] 14891. 톱니바퀴 (Java)  (0) 2020.12.20
[백준] 3190. 뱀 (Java)  (0) 2020.12.16
[백준] 15683. 감시 (Java)  (0) 2020.12.15
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/11   »
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
글 보관함