Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- parseInt()
- Java
- 자바
- char to str
- java lambda
- jquery 이벤트 처리
- 후위표기
- 자바입출력
- jquery 속성선택자
- jquery 필터선택자
- 재귀
- 자바스크립트 이벤트중지
- 상속
- 순열 재귀
- java Collections.sort()
- java 내부 클래스
- 알고리즘
- 재귀함수
- 자바 순열 코드
- 자바 재귀 조합
- jquery dom 계층 선택자
- inner class
- 조합 재귀
- 자바스크립트 이벤트처리
- str to char array
- 알고리즘 그래프
- 순열코드
- 서로소
- 자바 조합 재귀
- Interface
Archives
- Today
- Total
유블로그
[Java] swea 4013 특이한 자석 본문
[Java] swea 4013 특이한 자석
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
import java.util.StringTokenizer;
public class 모의SW_4013_특이한자석 {
static int K;
static int[][] magnet = new int[5][8];
static int[][] rotation;
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int T = Integer.parseInt(br.readLine());
for (int testcase = 1; testcase <= T; testcase++) {
K = Integer.parseInt(br.readLine());
rotation = new int[K][2];
for (int i = 1; i <= 4; i++) {
StringTokenizer st = new StringTokenizer(br.readLine());
for (int j = 0; j < 8; j++) {
magnet[i][j] = Integer.parseInt(st.nextToken());
}
}
for (int i = 0; i < K; i++) {
StringTokenizer st = new StringTokenizer(br.readLine());
for (int j = 0; j < 2; j++) {
rotation[i][j] = Integer.parseInt(st.nextToken());
}
}
System.out.println("#" + testcase + " " + solve());
} // tc
} // main
private static int solve() {
for (int i = 0; i < K; i++) {
List<int[]> rotateMag = new ArrayList<>();
int me = rotation[i][0]; // 현재회전되는자석번호
int dir = rotation[i][1]; // 1이면 시계, -1이면 반시계
rotateMag.add(new int[] {me, dir});
int idx = me;
int newDir = dir;
while(true) {
if(idx-1 < 1) break;
if(magnet[idx][6] != magnet[idx-1][2]) {
newDir *= -1;
rotateMag.add(new int[] {idx-1, newDir});
}
else break;
idx--;
}
idx = me;
newDir = dir;
while(true) {
if(idx+1 == 5) break;
if(magnet[idx][2] != magnet[idx+1][6]) {
newDir *= -1;
rotateMag.add(new int[] {idx+1, newDir});
}
else break;
idx++;
}
// 회전정보 모았고 이제 실제로 회전
for(int[] arr : rotateMag) {
int num = arr[0];
if(arr[1] == 1) { // 회전방향이 시계면 오른쪽으로 회전
int tmp = magnet[num][7];
for (int k = 7; k >= 1; k--) {
magnet[num][k] = magnet[num][k-1];
}
magnet[num][0] = tmp;
}
else {
int tmp = magnet[num][0];
for (int k = 0; k < 7; k++) {
magnet[num][k] = magnet[num][k+1];
}
magnet[num][7] = tmp;
}
}
} // K
int sum = 0;
int score = 1;
for (int i = 1; i <= 4; i++) {
if(magnet[i][0] == 1) {
sum += score;
}
score *= 2;
}
return sum;
} // solve
}
자신의 6번 날은 나의 왼쪽 자물쇠 2번 날과 닿아있고 자신의 2번 날은 나의 오른쪽 자물쇠 6번 날과 닿아있는
규칙을 생각했다.
2번 자물쇠가 회전해야하는 차례라면,
왼쪽부터
2번자물쇠 6번날과 1번자물쇠 2번을 체크하여 자성이 다르면 회전정보에 추가한다.
그 다음 오른쪽,
2번자물쇠 2번날과 3번자물쇠 6번을 체크하여 자성이 다르면 회정정보에 추가한다.
3번이 회전해야한다면 추가로 4번까지 확인하고,
3번이 회전하지 않는다면 4번까지 확인할 필요가 없다.
이런식으로 한 번 회전할 때 회전해야하는 자물쇠들을 기억해놓고
체크가 끝나면 한번에 배열을 오른쪽 혹은 왼쪽으로 rotate 하면 된다.
'알고리즘' 카테고리의 다른 글
[Java] swea 2112 보호필름 (0) | 2021.04.19 |
---|---|
[Java] swea 4014 활주로 건설 (0) | 2021.04.17 |
[Java] swea 4012 요리사 (0) | 2021.04.17 |
[Java] swea 4008 숫자만들기 (0) | 2021.04.17 |
[Java] BOJ 20058 마법사 상어와 파이어 스톰 (0) | 2021.04.16 |