https://www.acmicpc.net/problem/2503
정보문화진흥원 정보 영재 동아리에서 동아리 활동을 하던 영수와 민혁이는 쉬는 시간을 틈타 숫자야구 게임을 하기로 했다.
예) 영수가 324를 갖고 있으면
현재 민혁이와 영수는 게임을 하고 있는 도중에 있다. 민혁이가 영수에게 어떤 수들을 물어보았는지, 그리고 각각의 물음에 영수가 어떤 대답을 했는지가 입력으로 주어진다. 이 입력을 바탕으로 여러분은 영수가 생각하고 있을 가능성이 있는 수가 총 몇 개인지를 알아맞혀야 한다.
아래와 같은 경우를 생각해보자.
이때 가능한 답은 324와 328, 이렇게 두 가지이다.
영수는 동아리의 규율을 잘 따르는 착한 아이라 민혁이의 물음에 곧이곧대로 정직하게 답한다. 그러므로 영수의 답들에는 모순이 없다.
민혁이의 물음들과 각각의 물음에 대한 영수의 답이 입력으로 주어질 때 영수가 생각하고 있을 가능성이 있는 답의 총개수를 출력하는 프로그램을 작성하시오.
민혁이가 질문한 세 자리 수와 영수가 답한 스트라이크와 볼의 개수를 입력으로 주어진다.(질문횟수는 1 이상 100 이하이다)
영수가 생각하고 있을 가능성이 있는 답의 총개수를 출력한다.
풀이를 구현하는 방법에 대해 지나치게(?) 고민한 한 문제였다.
조합으로도 해결할 수 있고 문자형이나 나머지를 활용해 자릿수를 비교해 입력으로 받는 숫자에 해당하는 s, b에 맞지 않는
조건들을 제거해 나가는 식으로 문제를 해결할 수 있다. 후자의 방법을 사용하였고 추가로 모든 자릿수의 숫자가 다르다는 점과 자릿수에는 0이 들어올 수 없다는 케이스를 제외하는 코드를 마지막 줄에 넣어 문제를 해결하였다.
한 달 전쯤에 이 문제를 처음 접했던 기억이 있다. 당시엔 풀지 못하였지만 지금은 어렵지만 풀 수 있어 실력이 쌓인 것 같아 보람차기도하다.
문제를 보고 논리적으로 맞는 풀이 방향인지 에지 케이스를 따져가며 구현을 설계하는 게 아직은 어설프다고 느꼈다.
이 정도 구현 문제는 어렵지 않게 풀 수 있게끔 열심히 공부해야겠다.!
n = int(input())
cnt = 0
arr = []
check = [0] * 1000
for i in range(n):
num, s, b = map(int, input().split())
num3 = num % 10
num2 = (num // 10) % 10
num1 = (num // 100) % 10
for j in range(1000):
s1, b1 = 0, 0
j3 = j % 10
j2 = (j // 10) % 10
j1 = (j // 100) % 10
if num1 == j1: # 첫쨰자리
s1 += 1
elif j1 == num3 or j1 == num2:
b1 += 1
if num2 == j2: # 둘쨰자리
s1 += 1
elif j2 == num1 or j2 == num3:
b1 += 1
if num3 == j3: # 셋째자리
s1 += 1
elif j3 == num1 or j3 == num2:
b1 += 1
if s1 != s or b1 != b:
check[j] = 1
for i in range(1000):
i3 = i % 10
i2 = (i // 10) % 10
i1 = (i // 100) % 10
if i1 * i2 * i3 == 0 or i1 == i2 or i1 == i3 or i2 == i3:
check[i] = 1
print(check.count(0))
[백준_14719] 빗물_python (0) | 2022.03.28 |
---|---|
[백준_1991] 트리순회_python (0) | 2022.03.24 |
[백준_14500] 테트리미노_python (0) | 2022.03.22 |
[백준_15663]N과M(9) (0) | 2022.03.21 |
[백준_1748] 수 이어 쓰기1 python (0) | 2022.03.20 |
댓글 영역