#2503: 숫자 야구
민혁 영수가 질문한 횟수를 나타내는 1부터 100까지의 자연수 N이 첫 줄에 주어진다. 다음 N개의 줄에서 각 줄에는 민혁이 질문한 세 자리 숫자와 영수가 대답한 문자열이 포함되어 있습니다.
www.acmicpc.net
정보문화진흥원 정보인재동아리에서 활동하던 영수와 민혁은 쉬는 시간에 야구 경기를 하기로 했다.
- 영숫자는 1부터 9까지 세 개의 서로 다른 숫자로 구성된 정신적인 세 자리 숫자입니다. (예: 324)
- 민혁은 영수에게 1부터 9까지 세 개의 서로 다른 숫자로 구성된 세 자리 숫자를 요구한다. (예: 123)
- 민혁이 말한 세 자리 숫자 중 하나라도 0의 세 자리 숫자에서 같은 자리에 있으면 1타로 인정한다. 숫자가 영숫자 3자리에 있지만 자리가 다른 경우 공 1개로 계산합니다.
예) 번호가 324인 경우
- 429는 1스트라이크 1볼이다.
- 241은 0샷 2볼입니다.
- 924는 2스트라이크 0볼이다.
- 영수는 민혁의 번호와 스트라이크 수, 볼 수를 답한다.
- 민혁이 3자리 숫자를 맞히면 3스트라이크가 되면 게임이 끝난다. 그렇지 않으면 민혁은 새로 번호를 만들어 영수에게 다시 묻는다.
민혁과 영수는 현재 게임을 하고 있다. 민혁이 영수에게 어떤 숫자를 물어보고 각 질문에 대해 영수가 어떤 답변을 했는지가 입력으로 주어진다. 이 입력을 기반으로 영수가 생각하는 가능한 숫자의 총 수를 추측해야 합니다.
다음과 같은 경우를 고려하십시오.
- 민혁: 123
- 받은 것: 1스트라이크 1볼.
- 민혁: 356
- 받은 것: 1스트라이크 0볼.
- 민혁: 327
- 받은 것: 2개의 슛과 0개의 공.
- 민혁: 489
- 수신: 0 안타 1 공.
324와 328의 두 가지 답이 있습니다.
영수는 동아리 규정을 잘 지키는 착한 아이라 민혁의 질문에 솔직하게 답한다. 따라서 영어 숫자의 답에는 모순이 없습니다.
민혁의 질문과 각 질문에 대한 영수의 답변을 입력으로 하여 영수가 생각하는 가능한 답의 총 개수를 출력하는 프로그램을 작성하시오.
기입
민혁 영수가 질문한 횟수를 나타내는 1부터 100까지의 자연수 N이 첫 줄에 주어진다. 이어지는 N행 각각에는 민혁의 질문에서 나온 세 자리 숫자, 샷 수를 나타내는 정수, 영수가 대답한 공의 수를 나타내는 정수, 그리고 사이에 공백을 둔 총 세 개의 정수가 주어진다.
누르다
첫 번째 줄에는 영수가 생각하고 있는 가능한 답의 총 수를 출력하시오.
샘플 입력 1 복사
4
123 1 1
356 1 0
327 2 0
489 0 1
예제 출력 1 복사
2
위의 문제에서 핵심은 기본적으로 숫자 1에서 9까지의 세 가지 순열 목록을 만드는 것입니다.
먼저 이 목록을 만든 후 아래 알고리즘을 따릅니다.
※ 알고리즘
1. num, Strike, Ball 변수를 입력합니다.
2. num 변수의 문자열로 포함하여 목록을 만듭니다.
3. 항상 인덱스 0에서 시작해야 하므로 숫자를 계속 뺍니다.
4. 답안지 색인과 입력한 숫자를 비교하여 같으면 점수에 +1을 더한다.
5. 답안지 색인과 출품번호를 비교할 때 같지는 않으나 들어있으면 볼카운트 +1
6. 스트로크와 볼이 숫자와 일치하지 않으면 응답 배열에서 해당 인덱스가 삭제되고 길이가 출력됩니다.
from itertools import permutations
N = int(input())
number = ('1','2','3','4','5','6','7','8','9')
answer = list(permutations(number, 3))
for i in range(N):
num, strike, ball = map(int, input().split())
lists = list(str(num))
count = 0
for j in range(len(answer)):
j = j - count #항상 0 index부터 비교시작
strike_count = 0
ball_count = 0
for k in range(3):
if answer(j)(k) == lists(k): #answer sheet와 입력 숫자를 index 비교해서 같으면 strike
strike_count += 1
elif lists(k) in answer(j): #입력숫자가 answer sheet와 같지는 않은데 안에 있으면 ball
ball_count += 1
if strike_count != strike or ball_count != ball:
answer.remove(answer(j))
count += 1 #strike와 ball이 수에 맞지 않으면 해당 index를 answer 배열에서 제거
print(len(answer))
비교는 항상 인덱스 0부터 한다는 사실을 놓치면 하루종일 비교하고 알고리즘에 맞는 순서대로 구현해도 정확한 값이 나오지 않는다. 핵심은 인덱스 0부터 비교하고 처음에 기본 순열을 만드는 것입니다.
결국 Kote는 숨겨진 함정을 찾기 위해 고군분투하는 것 같습니다…