티스토리 뷰
톱니바퀴문제에서 톱니 개수를 늘리고 정답 구하는 부분만 바꿔주면 되는 문제
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
링크
TAG
- 브루트포스
- 문자열
- 백준
- dfs
- Validation
- 삼성역테기출
- CustomHook
- 정규식
- 그래프
- swea
- 구현
- 시뮬레이션
- java
- dp
- 우선순위큐
- 프로그래머스
- 알고리즘
- matches
- web
- vue.js
- BFS
- 벨만포드
- form
- 다익스트라
- REACT
- regex
- BigInteger
- 해시
- 이분탐색
- 백트래킹
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
글 보관함