블로그 이사🏡 했습니다. 👉🏻 둘러보기
본문 바로가기
  • What Get's You Here, Won't Get You There
CS/Problem-solving

백준 2503번 파이썬

by OMIN_ 2022. 4. 23.

문제 링크

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

 

2503번: 숫자 야구

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

www.acmicpc.net

 

시간 제한 / 메모리 제한

1 초 128 MB

 

문제

정보문화진흥원 정보 영재 동아리에서 동아리 활동을 하던 영수와 민혁이는 쉬는 시간을 틈타 숫자야구 게임을 하기로 했다.

  • 영수는 1에서 9까지의 서로 다른 숫자 세 개로 구성된 세 자리 수를 마음속으로 생각한다. (예: 324)
  • 민혁이는 1에서 9까지의 서로 다른 숫자 세 개로 구성된 세 자리 수를 영수에게 묻는다. (예: 123)
  • 민혁이가 말한 세 자리 수에 있는 숫자들 중 하나가 영수의 세 자리 수의 동일한 자리에 위치하면 스트라이크 한 번으로 센다. 숫자가 영수의 세 자리 수에 있긴 하나 다른 자리에 위치하면 볼 한 번으로 센다.

예) 영수가 324를 갖고 있으면 

  • 429는 1 스트라이크 1 볼이다.
  • 241은 0 스트라이크 2 볼이다.
  • 924는 2 스트라이크 0 볼이다.
  • 영수는 민혁이가 말한 수가 몇 스트라이크 몇 볼인지를 답해준다.
  • 민혁이가 영수의 세 자리 수를 정확하게 맞추어 3 스트라이크가 되면 게임이 끝난다. 아니라면 민혁이는 새로운 수를 생각해 다시 영수에게 묻는다.

현재 민혁이와 영수는 게임을 하고 있는 도중에 있다. 민혁이가 영수에게 어떤 수들을 물어보았는지, 그리고 각각의 물음에 영수가 어떤 대답을 했는지가 입력으로 주어진다. 이 입력을 바탕으로 여러분은 영수가 생각하고 있을 가능성이 있는 수가 총 몇 개인지를 알아맞혀야 한다.

아래와 같은 경우를 생각해보자.  

  • 민혁: 123
  • 영수: 1 스트라이크 1 볼.
  • 민혁: 356
  • 영수: 1 스트라이크 0 볼.
  • 민혁: 327
  • 영수: 2 스트라이크 0 볼.
  • 민혁: 489
  • 영수: 0 스트라이크 1 볼.

이때 가능한 답은 324와 328, 이렇게 두 가지이다.

영수는 동아리의 규율을 잘 따르는 착한 아이라 민혁이의 물음에 곧이곧대로 정직하게 답한다. 그러므로 영수의 답들에는 모순이 없다.

민혁이의 물음들과 각각의 물음에 대한 영수의 답이 입력으로 주어질 때 영수가 생각하고 있을 가능성이 있는 답의 총 개수를 출력하는 프로그램을 작성하시오.

 

입력

첫째 줄에는 민혁이가 영수에게 몇 번이나 질문을 했는지를 나타내는 1 이상 100 이하의 자연수 N이 주어진다. 이어지는 N개의 줄에는 각 줄마다 민혁이가 질문한 세 자리 수와 영수가 답한 스트라이크 개수를 나타내는 정수와 볼의 개수를 나타내는 정수, 이렇게 총 세 개의 정수가 빈칸을 사이에 두고 주어진다.

출력

첫 줄에 영수가 생각하고 있을 가능성이 있는 답의 총 개수를 출력한다.

예제 입력

4
123 1 1
356 1 0
327 2 0
489 0 1

예제 출력

2

풀이 코드

from itertools import permutations
num = list(permutations((1, 2, 3, 4, 5, 6, 7, 8, 9), 3))  # 서로 다른 수의 세 자리 숫자

t = int(input())
for _ in range(t):
    q, strk, ball = map(int, input().split())
    removed = 0  # 중간의 리스트 길이를 변경하기 때문에 필요한 변수
    q = list(str(q))

    for i in range(len(num)):
        sCnt, bCnt = 0, 0
        i -= removed
        for j in range(3):
            q[j] = int(q[j])
            if q[j] in num[i]:  # 질문한 숫자의 j번 인덱스의 숫자가 num의 i번째 튜플에 있는가
                if j == num[i].index(q[j]):  # 있고, 위치도 같으면 스트라이크 횟수 ++
                    sCnt += 1
                else:  # 위치는 다르지만 있다면 볼 횟수 ++
                    bCnt += 1
        if sCnt != strk or bCnt != ball:  # 질문을 통해 얻은 답변과, 순열을 통해 얻은 스트라이크, 볼 횟수가 다르면
            num.remove(num[i])  # 후보지에서 제외
            removed += 1  # 달라진 리스트 길이를 이해 removed --
print(len(num)) # 다 지우고 남은 선택지 갯수

 

질문과 답변을 통해 얻은 스트라이크 횟수와 볼 횟수가 어떻게 우리의 후보지 갯수와 연관이 될 수 있는지 떠오르지 않았었다.

여러 블로그를 참고했고, 코드를 완전히 이해했는지 확인하기 위해 주석을 달았다.

 

참고자료

https://jainn.tistory.com/36

 

[백준] 2503번:숫자 야구 (python 파이썬)

www.acmicpc.net/problem/2503 2503번: 숫자 야구 첫째 줄에는 민혁이가 영수에게 몇 번이나 질문을 했는지를 나타내는 1 이상 100 이하의 자연수 N이 주어진다. 이어지는 N개의 줄에는 각 줄마다 민혁이가

jainn.tistory.com

https://kongpowder.tistory.com/50

 

[백준/파이썬] 2503번: 숫자 야구 (Python)

문제 www.acmicpc.net/problem/2503 코드 # 2503번 숫자야구/ 완전탐색 import itertools data = ['1', '2', '3', '4', '5', '6', '7', '8', '9'] num = list(itertools.permutations(data, 3)) n = int(input())..

kongpowder.tistory.com

https://velog.io/@dudejrtjdrp/%EB%B0%B1%EC%A4%80-%EB%AC%B8%EC%A0%9C-%EC%A0%95%EB%A6%AC-2503%EB%B2%88-Python

 

백준 문제 정리 2503번 - Python

2503 숫자 야구 문제문제 링크 : https://www.acmicpc.net/problem/2503이번엔 파이썬 sys 라이브러리에 있는 permuatations 함수를 사용해보았다. 이 함수는 itreable한 원소로 순열과 조합을 구할 수 있도록 도와

velog.io

 

'CS > Problem-solving' 카테고리의 다른 글

백준 13410번 파이썬  (0) 2022.04.23
백준 2309번 파이썬  (0) 2022.04.23
백준 2231번 파이썬  (0) 2022.04.23
백준 1018번 파이썬  (0) 2022.04.22
백준 2798번 파이썬  (0) 2022.04.22

댓글