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