알고리즘

[백준 Python] 16722 결! 합! - 구현

재롱2 2024. 3. 1. 00:33

 

https://www.acmicpc.net/problem/16722

 

16722번: 결! 합!

위 입력에서 '합'을 이루는 모든 그림 조합은 (1,5,6), (2,3,5), (2,4,6), (2,7,9), (6,8,9) 5가지가 있다.

www.acmicpc.net

 오늘도 어김없이 구현 문제를 풀어봅니다. 글 작성 시점으로 다음날이 소마 2차 코딩테스트기 때문에 구현 문제에 소홀히 하면 안 됩니다. 이번 문제는 결 또는 합을 외치는 게임으로 저는 더 지니어스에서 장동민이 결 합 게임을 하는 것을 본 적이 있기 때문에 문제는 친숙했습니다. 

 문제 설명은 구현 문제 특성상 매우 자세하게 설명되어 있어서 천천히 읽는 다면 이해하는데에 어려움은 없겠습니다. 

 

- 도형의 모양으로는 {동그라미, 세모, 네모}, 도형의 색으로는 {노란색, 빨간색, 파란색}, 배경색으로는 {회색, 흰색, 검은색}이 존재한다.

- ‘합’이란 그림의 세 가지 속성이 모두 같거나 모두 다른 세 장의 그림 조합을 의미한다. 

 

우선 처음에 읽으면서 코드를 작성할 때는 플레이어가 말한 번호만 합인지 판별하는 식으로 구현했지만 후에 플레이어가 결을 외칠 경우 어차피 모든 조합을 확인하여 합이 더 이상 존재하지 않는지 알아야 합니다. 따라서 처음부터 0~8번 인덱스 중 3가지를 고른 조합을 미리 구해서 각각 합인지 아닌지 합이라면 배열에 따로 모아둡니다. 

 

 합 판별은 각각의 속성이 모두 같거나 모두 다르다면 for문에서 continue 하고 그렇지 않으면 break 해주었습니다.

미리 합 배열을 구해서 플레이어가 외친 합 조합이 배열에 존재하면 remove 하는 식으로 구현했습니다.

 마지막에 결을 이미 외쳐서 +3점을 획득한 적이 있다면 후에 외치는 결에은 -1점을 주어야 합니다. 처리하지 않으면 90%쯤 오답.

import sys
from itertools import permutations,combinations

g = []
for i in range(9):
    x,y,z = map(str,sys.stdin.readline().split())
    g.append((x,y,z))
com = [i for i in range(9)]
s = list(combinations(com,3))
G = [] # 합 배열
for x,y,z in s:
    t = True
    for i in range(3):
        if g[x][i] ==g[y][i] and g[x][i] == g[z][i]:
                continue
        if g[x][i] != g[y][i] and g[x][i] != g[z][i] and g[y][i] != g[z][i]:
                continue
        t = False
    if t: G.append((x+1,y+1,z+1))
n= int(sys.stdin.readline())
res = 0
get = False #결을 외친적 있는지 체크
for i in range(n):
    l = sys.stdin.readline().rstrip()
    t = False
    if len(l)==1:
        if len(G) == 0 and not get:
            res += 3
            get = True
        else:
            res-= 1
    else:
        o = list(map(str,l.split()))
        f = [int(o[i]) for i in range(1,4)]
        for x in G:
            if f[0] in x and f[1] in x and f[2] in x:
                G.remove(x)
                t = True
                break
        if t: res += 1
        else: res -= 1

print(res)