본문 바로가기
Algorithms/코테 문풀

[백준 2503번] 숫자 야구, 반례

by hi-rachel 2023. 9. 14.

문제

 

2503번: 숫자 야구

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

www.acmicpc.net

 

풀이

아이디어

  • 입력받은 세 자리수를 각 자릿수로 나눠줘 숫자가 같고 위치도 같다면 strike, 숫자가 같고 위치는 다르다면 ball로 개수를 세준다.
  • 입력받은 strike, ball 수와 n번 일치한다면 경우의 수를 세준다. 

 

- 틀린 코드

import sys
input = sys.stdin.readline

N = int(input().rstrip())

answer = 0
hint = [list(map(int, input().split())) for _ in range(N)]

for a in range(1, 10):
    for b in range(1, 10):
        for c in range(1, 10):
            if a == b or b == c or c == a:
                continue
            cnt = 0
            for arr in hint:
                num, strike, ball = arr
                num = list(str(num))
                
                a = str(a)
                b = str(b)
                c = str(c)

                ball_cnt = 0
                strike_cnt = 0

                if a == num[0]:
                    strike_cnt += 1
                elif a in num:
                    ball_cnt += 1

                if b == num[1]:
                    strike_cnt += 1
                elif b in num:
                    ball_cnt += 1

                if c == num[2]:
                    strike_cnt += 1
                elif c in num:
                    ball_cnt += 1

                if ball == ball_cnt and strike == strike_cnt:
                    cnt += 1
            if cnt == N:
                answer += 1

print(answer)

 

반례

2
123 0 3
123 0 3

정답 => 2
위 코드 => 4

 

정답 코드 strike, ball 수가 입력값과 같아질 때 a, b, c 값
2 3 1
2 3 1
3 1 2
3 1 2

틀린 코드 strike, ball 수가 입력값과 같아질 때 a, b, c 값
2 3 1
2 3 1
2 3 2
2 3 2
3 1 2
3 1 2
3 3 1
3 3 1

위 틀린 코드에서는 a, b, c를 숫자가 아니라 문자로 변환해 list 값 안에서 문자가 일치할 때를 세주니 a, b, c 중 같은 값이 들어가 틀렸다.

 

- 정답

import sys
input = sys.stdin.readline

N = int(input().rstrip())

answer = 0
hint = [list(map(int, input().split())) for _ in range(N)]

for a in range(1, 10):
    for b in range(1, 10):
        for c in range(1, 10):
            if a == b or b == c or c == a:
                continue
            cnt = 0
            
            for arr in hint:
                num, strike, ball = arr
                num_test = list(str(num))

                num1 = num // 100
                num2 = num % 100 // 10
                num3 = num % 10

                ball_cnt = 0
                strike_cnt = 0

                if a == num1:
                    strike_cnt += 1
                elif a == num2 or a == num3:
                    ball_cnt += 1

                if b == num2:
                    strike_cnt += 1
                elif b == num1 or b == num3:
                    ball_cnt += 1

                if c == num3:
                    strike_cnt += 1
                elif c == num1 or c == num2:
                    ball_cnt += 1

                if ball == ball_cnt and strike == strike_cnt:
                    cnt += 1
            if cnt == N:
                answer += 1

print(answer)

각 자릿수를 정확히 나눠 비교해준다.

 

 

🙂 공부하면 정리하는 글입니다. 잘못된 점이 있다면 피드백 남겨주시면 감사합니다.