백준 2503. 숫자 야구

2024. 10. 20. 17:41·백준

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

 

1. 재귀풀이

import sys
sys.setrecursionlimit(9999999) # 재귀 한도 늘리기

def checker(idx, number):
    _number = hint[idx][0]
    _strike = hint[idx][1]
    _ball = hint[idx][2]

    # 스트라이크 수와 볼의 개수 셀 것
    strike = 0
    ball = 0

    # 힌트의 세자리수 각각 떼어내기(문자열로 변경)
    _A, _B, _C = str(_number)

    # 검사할 세자리수
    A, B, C = str(number)

    # 1부터 9까지의 수여야만 함!
    if A == '0' or B == '0' or C == '0':
        return False

    # 서로 다른 세자리 수여야만 함!
    if A == B or A == C or B == C:
        return False

    if A == _A:
        strike += 1
    if B == _B:
        strike += 1
    if C == _C:
        strike += 1

    if A == _B or A == _C:
        ball += 1
    if B == _A or B == _C:
        ball += 1
    if C == _A or C == _B:
        ball += 1

    # 스트라이크 수와 볼의 개수가 같으면 힌트 충족
    if strike == _strike and ball == _ball:
        return True

    return False


def recur(hint_idx, number):
    global ans

    # 네자릿수가 된다면(모든 세자리 수를 탐색했다면)
    if number == 1000:
        return

    # 힌트를 모두 통과한 경우 (정답 후보)
    if hint_idx == n:
        ans += 1
        recur(0, number + 1 )
        return

    # 힌트에 통과했다면
    if checker(hint_idx, number):
        recur(hint_idx+1, number)
    # 힌트에 통과하지 못했다면 -> 다른 수로 탐색 시작
    else:
        recur(0, number+1)


n = int(input()) # 질문 갯수
hint = [list(map(int, input().split())) for _ in range(n)]
ans = 0

recur(0, 100)
print(ans)

 

2. 반복문 풀이

import sys
input = sys.stdin.readline

n = int(input())
num = [i for i in range(100, 1000)] # 100~999
cnt = 0

for i in range(n):
    hint, hint_strike, hint_ball = map(int, input().split())
    for j in range(len(num)): # 모든 자연수 순회할 것
        strike, ball = 0, 0
        tmp = str(num[j]) # 검사하는 수

        if (tmp == '0'): # !이미 최상단 반복문에서 돌았을 때! 0으로 치환된 수면 넘기기
            continue

        if ((tmp[0] == tmp[1] or tmp[0] == tmp[2] or tmp[1] == tmp[2]) or ('0' in tmp)): # 중복되는 수가 있거나 0이 있으면
            num[j] = 0 # 조건을 만족하지 않으므로 0으로 치환 -> 나중에 갯수세서 뺄 것

        else:
            hint = str(hint) # 문자열로 변환

            for k in range(3):
                for l in range(3):
                    if (tmp[k] == hint[l] and k == l): # 숫자도 같고 위치도 같으면
                        strike += 1
                    elif (tmp[k] == hint[l] and k != l): # 숫자는 같은데 위치가 다르면
                        ball += 1

            if (strike != hint_strike or ball != hint_ball): # 스트라이크와 볼의 갯수가 다르면
                num[j] = 0 # 조건을 만족하지 않으므로 0으로 치환

print(900 - num.count(0)) # 조건을 만족하지 않아 0으로 치환한 갯수를 빼줌

 

-> 반복문 풀이가 1.5배정도 더 느림.

        if (tmp == '0'): # !이미 최상단 반복문에서 돌았을 때! 0으로 치환된 수면 넘기기
            continue

이부분을 빼면 런타임(인덱스)에러가 나서 왜그런지 머리빠지게 고민해봤더니...

for j 반복문은 순차적으로 돌기 때문에 0으로 치환된 num이 있을 수가 있나? 라고 착각했지만

그 상단의 for i 반복문에서 0으로 치환된 num이 있을 수 있다...

num은 전역변수라 반복문을 돌면서 초기화되지 않기 때문에...!!

저작자표시 (새창열림)

'백준' 카테고리의 다른 글

백준 12865. 평범한 배낭  (0) 2024.10.23
백준 2961. 도영이가 만든 맛있는 음식  (0) 2024.10.20
백준 15649. N과 M (1)  (0) 2024.10.20
백준 2304. 창고 다각형  (0) 2024.10.15
백준 21921. 블로그  (0) 2024.04.17
'백준' 카테고리의 다른 글
  • 백준 12865. 평범한 배낭
  • 백준 2961. 도영이가 만든 맛있는 음식
  • 백준 15649. N과 M (1)
  • 백준 2304. 창고 다각형
버그잡는고양이발
버그잡는고양이발
주니어 개발자입니다!
  • 버그잡는고양이발
    지극히평범한개발블로그
    버그잡는고양이발
  • 전체
    오늘
    어제
    • 분류 전체보기 (383)
      • React (16)
      • Next.js (5)
      • Javascript (5)
      • Typescript (4)
      • Node.js (2)
      • Cs (16)
      • 트러블 슈팅&리팩토링 (6)
      • Html (1)
      • Css (3)
      • Django (0)
      • vue (0)
      • Java (2)
      • Python (0)
      • 독서 (1)
      • 기타 (3)
      • 백준 (192)
      • swea (31)
      • 프로그래머스 (30)
      • 이코테 (4)
      • 99클럽 코테 스터디 (30)
      • ssafy (31)
      • IT기사 (1)
  • 블로그 메뉴

    • 홈
    • 태그
  • 인기 글

  • 태그

    Til
    코딩테스트준비
    항해99
    99클럽
    개발자취업
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
버그잡는고양이발
백준 2503. 숫자 야구
상단으로

티스토리툴바