https://www.acmicpc.net/problem/14891
14891번: 톱니바퀴
첫째 줄에 1번 톱니바퀴의 상태, 둘째 줄에 2번 톱니바퀴의 상태, 셋째 줄에 3번 톱니바퀴의 상태, 넷째 줄에 4번 톱니바퀴의 상태가 주어진다. 상태는 8개의 정수로 이루어져 있고, 12시방향부터
www.acmicpc.net
문제풀이
1. 4개의 톱니바퀴에 대해 옆의 톱니바퀴가 회전하면 자신도 회전하는 여부를 체크하는 함수를 생성
2. 톱니바퀴 회전하는 함수 생성
3. k번 톱니바퀴를 선택하고 회전방향에 따라 회전하는 함수 생성
3-1. 지정한 톱니바퀴가 회전할 때 주변 톱니바퀴가 회전하는지 1번의 함수를 통해 확인한 후 회전시킴
3-2. 회전을 마친 톱니바퀴는 표시를 해서 무한반복을 방지한다.
4. 점수를 세는 함수 생성
소스코드
/*
톱니바퀴 4개의 정보 주어짐
k번 회전 (톱니바퀴 선택, 어떤 방향으로 회전할지 선택)
맞닿은 톱니바퀴의 극이 같으면 회전X 다르면 회전O
회전을 마친 다음에 점수를 출력
처음 상태에 다 같이 체크한다음 옆에 톱니바퀴가 회전하면 같이 회전한다.
*/
import java.util.*;
import java.lang.*;
import java.io.*;
public class 톱니바퀴14891 {
static HashMap<Integer, String> gears; // 톱니바퀴 정보
static int k; // 회전 횟수
static int[][] rotateFlag;
static int[] visited;
static int answer;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
gears = new HashMap<>();
answer = 0;
for(int i = 1; i <= 4; i++)
{
String gear = br.readLine();
gear.trim();
gears.put(i, gear);
}
k = Integer.parseInt(br.readLine());
for(int i = 0; i < k; i++)
{
StringTokenizer st = new StringTokenizer(br.readLine());
int index = Integer.parseInt(st.nextToken());
int dir = Integer.parseInt(st.nextToken());
rotateFlag = new int[5][5];
visited = new int[5];
rotateCheck();
rotate(index, dir);
}
count();
System.out.println(answer);
}
// 점수계산 함수
public static void count()
{
String gear1 = gears.get(1);
String gear2 = gears.get(2);
String gear3 = gears.get(3);
String gear4 = gears.get(4);
if(gear1.charAt(0) == '1') answer += 1;
if(gear2.charAt(0) == '1') answer += 2;
if(gear3.charAt(0) == '1') answer += 4;
if(gear4.charAt(0) == '1') answer += 8;
}
public static void rotate(int index, int dir)
{
if(visited[index] == 1)
return;
visited[index] = 1;
rotatePlay(index, dir);
int nextdir = 0;
if(dir == 1)
{
nextdir = -1;
}
else if(dir == -1)
{
nextdir = 1;
}
for(int i = 1; i <= 4; i++)
{
if(rotateFlag[index][i] == 1)
{
rotate(i, nextdir);
}
}
}
// 회전
public static void rotatePlay(int index, int dir)
{
// 반시게 방향
if(dir == -1)
{
String gear = gears.get(index);
gear = gear + gear.charAt(0);
gear = gear.substring(1, gear.length());
gears.put(index, gear);
}
// 시계 방향
else if(dir == 1)
{
String gear = gears.get(index);
gear = gear.charAt(gear.length()-1) + gear;
gear = gear.substring(0, gear.length()-1);
gears.put(index, gear);
}
}
// 회전 여부 확인 함수
public static void rotateCheck()
{
String gear1 = gears.get(1);
String gear2 = gears.get(2);
String gear3 = gears.get(3);
String gear4 = gears.get(4);
if(gear1.charAt(2) != gear2.charAt(6))
{
rotateFlag[1][2] = 1;
rotateFlag[2][1] = 1;
}
if(gear2.charAt(2) != gear3.charAt(6))
{
rotateFlag[2][3] = 1;
rotateFlag[3][2] = 1;
}
if(gear3.charAt(2) != gear4.charAt(6))
{
rotateFlag[3][4] = 1;
rotateFlag[4][3] = 1;
}
}
}