728x90
문제
https://www.acmicpc.net/problem/1091
풀이
문제를 처음 읽었을 때는 뭔소린지 모르겠었는데 몇번 더 읽다보니까 이해를 했음
문제에서 주어진 순서대로 카드를 섞고 섞을 때마다 정답과 비교해서 정답과 같은 순서로 카드가 섞였다면 그때의 count를 출력하면 됨
내 생각에 포인트는 언제 -1을 출력해야 되냐 인 듯???
계속해서 섞다가 한번도 섞지 않았을 때(초기 상태)와 같은 순서로 카드가 나왔을 경우를 생각해보면, 섞을 수 있는 경우의 수를 다 해봐서 한바퀴를 다 돌렸는데도 정답이 나오지 않았다는 거니까 그때 -1을 출력하고 while(true){ }에서 break하면 됨!!
코드
// 1091번 카드 섞기
// https://www.acmicpc.net/problem/1091
package BAEKJOON;
import java.io.*;
import java.util.StringTokenizer;
public class Num1091_카드섞기 {
public static void main(String[] args) throws NumberFormatException, IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
int N = Integer.parseInt(br.readLine());
int[] P = new int[N];
int[] S = new int[N];
int[] card = new int[N];
int[] temp = new int[N];
int[] firstCard = new int[N];
int count = 0;
// card 초기상태
for (int i = 0; i < N; i++) {
card[i] = i % 3;
firstCard[i] = i % 3;
}
st = new StringTokenizer(br.readLine());
for (int i = 0; i < N; i++) {
P[i] = Integer.parseInt(st.nextToken());
}
st = new StringTokenizer(br.readLine());
for (int i = 0; i < N; i++) {
S[i] = Integer.parseInt(st.nextToken());
}
while (true) {
boolean check = true;
for (int i = 0; i < N; i++) { // card가 P와 같은지 확인
// 다르면 false
if (card[i] != P[i]) {
check = false;
break;
}
}
// card와 P가 다를 경우
if (!check) {
for (int i = 0; i < N; i++) {
temp[i] = card[S[i]];
}
// 섞은 다음 배열 복사
card = temp.clone();
count++;
} else { // card가 P와 같다면 cnt 출력.
System.out.println(count);
break;
}
// 계속 섞다가 처음 카드 배열이랑 같으면(= 한바퀴돈거)
// 정답이 나올 수 없다는 뜻이기 때문에 -1 출력
int num = 0;
for (int i = 0; i < N; i++) {
if (card[i] == firstCard[i]) {
num++;
}
}
if (num == N) {
System.out.println(-1);
break;
}
}
}
}
728x90