반응형

2503

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

 

2503번: 숫자 야구

첫째 줄에는 민혁이가 영수에게 몇 번이나 질문을 했는지를 나타내는 1 이상 100 이하의 자연수 N이 주어진다. 이어지는 N개의 줄에는 각 줄마다 민혁이가 질문한 세 자리 수와 영수가 답한 스트

www.acmicpc.net

[정답]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
import sys
ans = [True]*1000
= int(sys.stdin.readline())
cnt = 0
for n in range(N):
    num, s, b = map(int, sys.stdin.readline().split())
    num = str(num)
    for i in range(123988):
        i = str(i)
        if i[0== i[1or i[0== i[2or i[1== i[2]:
            ans[int(i)] = False
        if i[0== '0' or i[1== '0' or i[2== '0':
            ans[int(i)] = False
        s_cnt = 0
        b_cnt = 0
        for j in range(3):
            for k in range(3):
                if i[j] == num[k]:
                    if j == k:
                        s_cnt += 1
                    else:
                        b_cnt += 1
        if ans[int(i)] and s_cnt == s and b_cnt == b:
            ans[int(i)] = True
        else:
            ans[int(i)] = False
for i in range(123988):
    if ans[i]:
        cnt += 1
print(cnt)
cs

.

.

.

[풀이]

숫자 야구에선 1~9의 수를 중복하지 않고 세자리로 사용한다.

따라서 123~987에서 수의 중복, 0이 없도록 처리한다.

itertoolspermutations을 사용하여 조합된 리스트를 바로 만들 수 있지만,

기본에 충실하기 위해 직접 리스트를 짰다.

 

그 후 brute force로 for문을 이용하여 num과

숫자가 같고 인덱스도 같으면 strike 카운트,

숫자만 같으면 ball 카운트를 더해주어

입력한 s, b와 비교해준다.

 

값이 True인 애들의 수를 계산하여 출력한다.

 

p.s.

좀 지능적으로 계산하는 방법이 없을까 고민했지만

결국 일일이 계산하는 브루트포스로 해결했다.

좀 아쉽다.

반응형

+ Recent posts