새소식

반응형
코딩 테스트

[백준] 2503 숫자 야구

  • -
728x90
반응형

문제

  • 숫자야구
    • A : 1~9 사이의 3개 숫자를 생각한다. (예 - 324)
    • B : 1~9 사이의 3개 숫자를 묻는다.  (예 - 123)
    • A : 동일한 숫자가 동일한 자리에 있으면 스트라이크 숫자는 있지만 다른 자리에 위치하면 볼 한 번으로 카운트
          (예 - 2 스트라이크, 0 볼)
  • B가 질문한 숫자들과 A의 답변이 주어질 때, A가 처음 생각한 3자리 숫자가 될 수 있는 경우의 수 구하기
  • 1 <= (질문 개수) <= 100

 

풀이

  • 3자리 숫자를 맞추는 것이 아니라 경우의 수를 모두 구해야하는 문제!
  • 3자리 숫자는 111 ~ 999 까지 총 889개 숫자이므로 경우의 수를 줄여가는 것이 좋겠다.
  • 전체 숫자 조합 중 만들 수 없는 숫자 (strike, ball 개수가 다른 경우)를 제거하기

 

from itertools import permutations

N = int(input())
numbers = set(permutations([i for i in range(1, 10)], 3))   # 전체 숫자 조합
for _ in range(N):
    num, strike, ball = map(int, input().split())
    num = list(map(int, str(num)))

    new_numbers = set()
    for x in numbers:           # 각 경우의 수에 대해
        s_cnt = b_cnt = 0
        for i in range(3):      # 정답 자릿수에 대해서
            if num[i] in x:
                if num[i] == x[i] :
                    s_cnt += 1
                else :
                    b_cnt += 1

        if strike == s_cnt and ball == b_cnt : # 만들 수 있는 숫자
            new_numbers.add(x)
    
    numbers = new_numbers
    if len(numbers) == 0:
        break

print(len(numbers))

 

References

  • 백준 2503
  • 2023.05.11 오늘의 문제
반응형

'코딩 테스트' 카테고리의 다른 글

[프로그래머스] 네트워크  (0) 2023.05.12
[프로그래머스] 타겟 넘버  (0) 2023.05.12
[프로그래머스] 미로 탈출 명령어  (0) 2023.05.10
[백준] 20002 사과나무  (0) 2023.05.05
[백준] 3273 두 수의 합  (0) 2023.05.05
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.