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의 길이가 남아있는 가능성의 가짓수이므로 출력한다.
'Week 01 ~ 04 : 알고리즘 문제 풀이' 카테고리의 다른 글
파이썬 백준 2805 나무 자르기 (0) | 2021.11.11 |
---|---|
파이썬 백준 1920 수 찾기 (0) | 2021.11.11 |
파이썬 백준 6603 로또 (0) | 2021.11.11 |
파이썬 백준 1924 2007년 (0) | 2021.11.11 |
파이썬 백준 9205 맥주 마시면서 걸어가기 (0) | 2021.11.10 |