백준 온라인 저지 28217번 두 정삼각형

김선모·2024년 1월 25일

Baekjoon Online Judge

목록 보기
17/31
post-thumbnail

문제


첫 번째 줄에는 11개의 수를, 두 번째 줄에는 22개의 수를, \dots, NN번째 줄에는 NN개의 수를 아래 그림과 같이 배치한 정삼각형 AA, BB가 주어진다. 각 위치에 있는 수는 00 또는 11이다.

당신은 정삼각형을 시계방향 또는 반시계 방향으로 120120^◦ 회전시키거나 좌우로 대칭시킬 수 있다.

예를 들어, 위 그림의 정삼각형 AA를 회전시켜서 얻을 수 있는 정삼각형들은 다음과 같다.

AA를 대칭시켜서 얻을 수 있는 정삼각형은 다음과 같다.

두 정삼각형의 차이는 두 정삼각형을 겹쳤을 때 값이 다른 위치의 개수이다.
예를 들어, 정삼각형 AABB를 겹쳐보면, 두 번째 줄에서 가장 왼쪽, 세 번째 줄에서 가장 왼쪽과 오른쪽에 있는 수들이 다르므로, AABB의 차이는 33이 된다.

반면에, AA를 반시계 방향으로 120120^◦ 회전시킨 삼각형(두 번째 그림에서 오른쪽 삼각형)과 BB를 겹쳐보면 세 번째 줄에서 왼쪽에서 두 번째에 있는 수들만 다르므로, 이때 정삼각형의 차이는 11이 된다.

정삼각형 AABB가 주어진다. 당신은 AA를 원하는 만큼 회전시키고 대칭시킬 수 있다. 물론 AA를 회전시키거나 대칭시키지 않아도 된다. 또한, 회전시키거나 대칭시킬 수 있는 횟수에는 제한이 없다.

위와 같이 AA를 회전시키거나 대칭시켜 BB와 차이가 최소로 나게 하자. 이때 차이가 얼마인지 구하시오.

입력


첫 번째 줄에 AA, BB의 크기 NN이 주어진다.

두 번째 줄부터 N+1N + 1번째 줄까지, AA의 각 위치에 있는 수들이 주어진다.

i+1i + 1 (1iN1 ≤ i ≤ N)번째 줄에는 AAii번째 줄에 있는 ii개의 정수가 왼쪽부터 공백을 사이에 두고 순서대로 주어진다.

N+2N + 2번째 줄부터 2N+12N + 1번째 줄까지, BB의 각 위치에 있는 수들이 주어진다.

i+N+1i + N + 1 (1iN1 ≤ i ≤ N)번째 줄에는 BBii번째 줄에 있는
ii개의 정수가 왼쪽부터 공백을 사이에 두고 순서대로 주어진다.

출력


첫 번째 줄에 AA를 원하는 만큼 회전, 대칭시켜서 얻을 수 있는 BB와의 차이의 최솟값을 출력한다.

제한


  1. 주어지는 모든 수는 정수이다.
  2. 1N101 ≤ N ≤ 10
    3. AA, BB의 각 위치에 있는 수는 00또는 11이다.

서브태스크

예제 입력 1 
3
0
1 0
1 0 0
0
0 0
0 0 1
예제 출력 1 
1

AA를 반시계 방향으로 120120^◦ 돌리면 BB와 한 곳만 값이 다르게 된다. 이외에도 다양한 방법으로 차이를 11로 만들 수 있다.

예제 입력 2 
4
0
1 1
1 0 0
1 0 0 0
0
0 0
0 0 1
1 1 1 0
예제 출력 2 
0
예제 입력 3 
4
0
1 0
0 0 1
1 1 0 0
0
0 1
0 0 0
0 1 1 1
예제 출력 3 
2

풀이

정삼각형 A를 입력받으면 시계 방향으로 120도 회전, 반 시계 방향으로 120도 회전, 회전한 두 정삼각형과 입력받은 정삼각형을 세개 모두 반전시켜 각각 5개의 변수에 저장하고 정삼각형 B와 XOR 연산으로 6개의 정삼각형들을 비교한 값을 count 변수에 저장하여 가장 작은 값을 출력하였다. 삼각형 A를 5개의 변수에 저장하고 xor을 돌리기에 밑에 코드가 좀 지저분하긴 하지만 답은 올바르게 나온다. 솔직히 내 코드 내가 봐도 변수가 너무 많고 복잡해서 주석을 좀 썼다.

정삼각형 A를 시계 방향으로, 반시계 방향으로 120도 회전시키는건 위와 같이 작동된다. 이중 반복을 사용하여 구현하였다.

Code

A = []
A_1 = [] # 120도 시계 방향
A_1_2 = []
A_2 = [] # 120도 반 시계 방향
A_2_2 = []
A_3 = [] # 대칭
B = []
count = []
N = int(input())

for i in range(N) :
    A.append(list(map(int,input().split())))
for i in range(N) :
    B.append(list(map(int,input().split())))

for i in range(1,len(A)+1): # 시계방향 대칭
    t = []
    for j in range(0,len(A)) :
        try :
            t.insert(0, A[j][-i])
        except : pass
    A_1.insert(0,t)

for i in range(len(A)): # 반시계방향 대칭
    t = []
    for j in range(0,len(A)) :
        try :
            t.append(A[j][i])
        except : pass
    A_2.insert(0,t)

for i in range(len(A)) : # 시계 방향으로 120 회전 후 대칭
    A_1_2.append(A_1[i][::-1])

for i in range(len(A)) : # 반 시계 방향으로 120 회전 후 대칭
    A_2_2.append(A_2[i][::-1])

for i in range(len(A)) : # 그냥 대칭
    A_3.append(A[i][::-1])

A = sum(A, [])
A_1 = sum(A_1, []) # 시계 120 회전
A_1_2 = sum(A_1_2, []) # 시계 120 회전 후 대칭
A_2 = sum(A_2, []) # 반시계 120 회전
A_2_2 = sum(A_2_2, []) # 반시계 120 회전 후 대칭
A_3 = sum(A_3, []) # 그냥 대칭
B = sum(B, [])

c = 0
for i in range(len(A)) :
    c += B[i] ^ A[i]
count.append(c)

c = 0
for i in range(len(A_1)) :
    c += B[i] ^ A_1[i]
count.append(c)

c = 0
for i in range(len(A_3)) :
    c += B[i] ^ A_1_2[i]
count.append(c)

c = 0
for i in range(len(A_2)) :
    c += B[i] ^ A_2[i]
count.append(c)

c = 0
for i in range(len(A_3)) :
    c += B[i] ^ A_2_2[i]
count.append(c)

c = 0
for i in range(len(A_3)) :
    c += B[i] ^ A_3[i]
count.append(c)

print(min(count))

0개의 댓글