문제
https://www.acmicpc.net/problem/2503
문제 요약
영수가 생각한 1부터 9까지 서로 다른 숫자 세 개로 구성된 세 자리 수를 N번 물어본다.
물어본 수와 스트라이크와 볼 개수를 입력한다.
영수가 생각하고 있을 가능성이 있는 답의 총 개수를 출력한다.
코드
from itertools import permutations
N = int(input())
data = ['1', '2', '3', '4', '5', '6', '7', '8', '9']
arr = list(permutations(data, 3))
# arr은 1 ~ 9까지 숫자로 만들 수 있는 모든 세 자리 수들의 배열 (9P3)
for _ in range(N):
n, s, b = map(int, input().split())
n = list(str(n))
cnt = 0 # 제거된 숫자 조합의 개수
# arr[0]부터 검사 시작
for i in range(len(arr)): # 현재 가능한 경우의 수만큼 반복
strike = ball = 0
# 스트라이크, 볼 개수
i -= cnt
# i는 제거되지 않은 숫자만큼 건너뛰고 탐색
# 예를 들어 현재 루프까지 4개가 조건에 부합하여 제거되지 않았다면, i는 arr의 5번째 수부터 탐색
# 제거되었다면 i가 1 증가한 만큼 cnt도 증가하였기 때문에 제자리
# arr[i]와 입력 받은 질문 n을 비교하여 strike와 ball 개수 탐색
for j in range(3):
if arr[i][j] == n[j]: # 위치와 값이 같다면
strike += 1 # 스트라이크
elif n[j] in arr[i]: # 안에 존재한다면
ball += 1 # ball
if strike != s or ball != b: # 입력 받은 스트라이크, 볼 개수와 다르다면
arr.remove(arr[i]) # 배열에서 제거 (소거)
cnt += 1 # 제거된 개수 증가
#print(arr)
print(len(arr))
코드 설명
1. 1부터 9까지로 만들 수 있는 모든 세 자리수들을 배열 arr에 저장한다.
2. 입력된 수 n과 배열에 존재하는 모든 수를 하나씩 비교해보며 조건에 맞지 않은 값들을 제거한다.
3. N번의 입력이 종료되면, 배열에 남은 개수를 출력한다.
'Algorithm Problems > 완전 탐색' 카테고리의 다른 글
[백준/Python] 1018번: 체스판 다시 칠하기 (2) | 2023.09.26 |
---|---|
[백준/Python] 15970번: 화살표 그리기 (0) | 2023.09.25 |
[백준/Python] 10971번: 외판원 순회 2 (3) | 2023.09.01 |
[백준/Python] 14620번: 꽃길 (2) | 2023.08.31 |
[백준/python] 15684번: 사다리 조작 (2) | 2023.08.09 |