Week 01 ~ 04 : 알고리즘 문제 풀이

파이썬 백준 2503 숫자 야구

정글러 2021. 11. 11. 14:15
table = []
for i in range(1, 10) :
    for j in range(1, 10) :
        for k in range(1, 10) :  
            if i != j and j != k and k != i :
                table.append([i, j, k])
def sb(q, t) :
    s = 0
    b = 0
    for i in range(3) :
        if t[i] == q[i] :
            s = s + 1
    for w in q :
        if w in t :
            b = b + 1
    b = b - s
    return [s, b]

n = int(input())
for i in range(n) :
    h = list(input().split())
    Q = [int(h[0][0]), int(h[0][1]), int(h[0][2])]
    HIT = [int(h[1]), int(h[2])]
    for i in range(len(table)) :
        if sb(Q, table[i]) != HIT :
            table[i] = 0
    while 0 in table :
        table.remove(0)
print(len(table))

질문을 받을때마다 전체 경우에서 조건과 다른 경우를 쳐내는 방식이니, 먼저 전체 경우의수 테이블을 만든다.

 

질문으로 주어진 q와 비교 타겟인 t가 주어졌을 때, q와 t 간의 strike, ball 갯수를 리턴하는 함수를 정의한다.

t와 q의 같은 자리에 같은 값이 있다면 strike이니 +1을 하고,

순서까진 모르지만 아무튼 q의 숫자 하나가 t 안에 있다면 ball을 +1한다.

그렇다면 ball에는 strike인 경우도 카운트가 됐을테니, 그만큼을 빼준 b-s가 진짜 ball의 수치가 된다.

 

질문으로 던진 세자리 숫자와 이에 대답한 strike, ball 갯수를 인풋으로 받으면

경우의수 테이블에서 모든 원소에 대해 s, b를 구해본다.

그게 인풋받은 strike, ball과 다르다면 table에서 쳐낸다.

 

for t in table로 for문을 돌리고 t를 table에서 remove하면 왠지 제대로 동작하질 않았다.

for문의 대상인 table이 for문 안에서 변화해서 그런 걸지도 모르겠다.

que로 while을 돌릴땐 자기 자신을 날려도 잘 됐던것같은데 암튼 요상하다.

시간이 너무 부족해서 원인을 찾아 고칠 수는 없었고

table의 길이만큼 for i in range를 돌려서 일단 값만 0으로 바꾸고,

for문이 끝났을때 0이 돼버린 탈락자들을 다 remove하는 방식을 취했다.

 

이를 입력받은 질문 횟수만큼 반복하면, 그때의 table의 길이가 남아있는 가능성의 가짓수이므로 출력한다.