인프런 커뮤니티 질문&답변

녜힁님의 프로필 이미지
녜힁

작성한 질문수

2주만에 통과하는 알고리즘 코딩테스트 (2024년)

안녕하세요 완전탐색 2503번 풀이 질문 드립니다

해결된 질문

작성

·

557

1

3일 째 스스로 숙제라고 말씀하신 부분에 대해서 코드 작성하면서 제출해보는데 계속 오답이 나와서 질문 드립니다. 구글에 풀이 검색하면 Permutation이나 DFS로만 풀이가 나와서 어떻게 코드를 작성해야 할까요?

답변 1

0

코딩 센세님의 프로필 이미지
코딩 센세
지식공유자

안녕하세요!

 

3일 째 스스로 숙제가 어느 부분을 말씀하시는 것 인지 모르겠습니다..

 

제 강의에서 다루는 숫자야구의 2가지 풀이법을 올려두겠습니다 :)

 

참고해서 정답 비교해보시고, 그래도 어려우시면 제출하신 코드를 여기에 올려주세요!

 

  1. 완전탐색(브루트포스)

n = int(input())

numbers = [list(map(str,input().split())) for _ in range(n)]
# string을 미리 넣어준 이유는, 나중에 쪼개기 위해서

answer = 0

# (1) 세 자리 숫자 만들기
for a in range(1,10): # 100의 자리수
    for b in range(1,10): # 10의 자리수
        for c in range(1,10): # 1의 자리수
            counter = 0
            
            # (2) 다른 세 자리수
            if( a == b or b == c or c == a):
                continue
            
            # continue, 그 숫자를 넘김
            # break, 반복문을 넘김

            # (3) 배열에 넣은 조건을 넣어주기
            for array in numbers:
                check = list(array[0]) # ['1','2','3']
                strike = int(array[1])
                ball = int(array[2])

                strike_count = 0
                ball_count = 0

                #스트라이크 계산기
                if (a == int(check[0])):
                    strike_count += 1
                if (b == int(check[1])):
                    strike_count += 1
                if (c == int(check[2])):
                    strike_count += 1
                

                #볼 계산기
                if (a == int(check[1]) or a == int(check[2])):
                    ball_count += 1
                if (b == int(check[0]) or b == int(check[2])):
                    ball_count += 1
                if (c == int(check[0]) or c == int(check[1])):
                    ball_count += 1
                
                
                #(4) 매칭 여부 확인하기
                if (strike != strike_count):
                    break
                if (ball != ball_count):
                    break
                
                counter += 1

            if counter == n:
                answer += 1
                
print(answer)
  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 = _number // 100
    _B = (_number - (_A * 100)) // 10 
    _C = _number % 10


    A = number // 100
    B = (number - (A * 100)) // 10 
    C = number % 10

    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(idx, number):
    global answer

    if idx == n:
        answer += 1
        # print(number)
        recur(0, number+1)
        return
    
    if number == 1000:
        return
    
    if checker(idx,number):
        recur(idx+1, number)
    else:
        recur(0, number+1)

n = int(input())
hint = [list(map(int,input().split())) for _ in range(n)]
answer = 0
recur(0, 100)
print(answer)
녜힁님의 프로필 이미지
녜힁

작성한 질문수

질문하기