코드굽는 타자기
SWEA[4013] - 특이한 자석 본문
링크
SWEA[4013]
문제설명
- 시뮬레이션
문제풀이
- 시뮬레이션
- 도는 톱니 기준->자성체크->어디로도는지 정하고->돌림
문제코드
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.LinkedList;
import java.util.Queue;
import java.util.Stack;
import java.util.StringTokenizer;
public class Solution {
public static void rotate1(LinkedList<Integer> t) {
int temp = t.peekLast();
t.removeLast();
t.addFirst(temp);
}
public static void rotate2(LinkedList<Integer> t) {
int temp = t.peekFirst();
t.removeFirst();
t.addLast(temp);
}
public static void rotate(LinkedList<Integer> t, int dir) {
if(dir==1) {
rotate1(t);
}
else if(dir==-1){
rotate2(t);
}
}
public static void main(String[] args) throws NumberFormatException, IOException {
//System.setIn(new FileInputStream("res/swea/4013.txt"));
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
int T=Integer.parseInt(br.readLine());
for (int test_case = 1; test_case <= T; test_case++) {
int ans=0;
int K = Integer.parseInt(br.readLine());
LinkedList<Integer>[] top = new LinkedList[4];
for (int i = 0; i < 4; i++) {
top[i] = new LinkedList<>();
}
for (int i = 0; i < 4; i++) {
st = new StringTokenizer(br.readLine());
for (int j = 0; j < 8; j++) {
top[i].add(Integer.parseInt(st.nextToken()));
}
}
int[] rotation = new int[4];
for (int oper = 0; oper < K; oper++) {
st = new StringTokenizer(br.readLine());
int num = Integer.parseInt(st.nextToken())-1;
int dir = Integer.parseInt(st.nextToken());
int ndir = dir;
rotation = new int[4];
// 일단 타겟 체크
rotation[num]=dir;
// 도는지 체크
// 우로 체크
for (int i = 0; i < 3; i++) {
if(num+i+1>3)break;
// 하나의 자석이 1 칸 회전될 때, 붙어 있는 자석은 서로 붙어 있는 날의 자성이 다를 경우에만 반대 방향으로 1 칸 회전된다.
if(rotation[num+i]!=0 && top[num+i].get(2)!=top[num+i+1].get(6)) {
ndir*=-1;
rotation[num+i+1]=ndir;
}
else {
rotation[num+i+1]=0;
break;
}
}
ndir = dir;
// 좌로 체크
for (int i = 0; i < 3; i++) {
if(num-i-1<0)break;
// 하나의 자석이 1 칸 회전될 때, 붙어 있는 자석은 서로 붙어 있는 날의 자성이 다를 경우에만 반대 방향으로 1 칸 회전된다.
if(rotation[num-i]!=0 && top[num-i].get(6)!=top[num-i-1].get(2)) {
ndir*=-1;
rotation[num-i-1]=ndir;
}
else {
rotation[num-i-1]=0;
break;
}
}
// rotation기준으로 돌리기
for (int i = 0; i < 4; i++) {
rotate(top[i],rotation[i]);
}
}//oper end
// 0:N극 1:S극
int temp=1;
for (int i = 0; i < 4; i++) {
if(top[i].get(0)==1) {
ans+=temp;
}
temp*=2;
}
System.out.println("#"+test_case+" "+ans);
/*
* 초기화
*/
}//end test_case
}//end main
}//end class
아쉬운점
- Index 실수
- 자석은 1번부터 시작함 index오류
- 오른쪽 탐색은 [num+i]
- 왼쪽탐색은 [num-i] 했어야하는데 +로함
- 문제 제대로 안읽음
- 돌고나서 도는건줄알았음
- 돌때 같이돔
잘한점
- rotate 메서드 생성
- rotate 효율적으로 하기 위해 LinkedList 사용
'알고리즘 > Simulation' 카테고리의 다른 글
SWEA[2477] - 차량 정비소 (0) | 2020.02.22 |
---|---|
SWEA[5658] - 보물상자 비밀번호 (0) | 2020.02.20 |
SWEA[5650] - 핀볼 게임 (0) | 2020.02.19 |
SWEA[5656] - 벽돌 깨기 (1) | 2020.02.19 |
SWEA[1240] - 단순 2진 암호코드[D3] (0) | 2020.02.17 |
Comments