본문 바로가기

알고리즘 문제

프로그래머스 숫자 야구

111, 011, 101, 133, 999와 같이 중복되는 숫자나 0은 나올 수 없다.

123, 456, 987 이런 숫자만 올 수 있다.

 

make_nums 함수는 3자리 수이면서 각 자리수가 서로 중복되지 않는 수들을 만든다.

가능성이 있는 수들의 list인 nums를 돌면서 주어진 질문과 비교한다.

각 자리수에 있는 값이 일치하면 strike를 증가시키고 그 자리를 False로 만든다. 혹은 False 처리를 안하고 나중에 ball 비교를 할 때 index가 다르면 ball을 증가해주면 된다.

 

만약 질문에 있는 strike, ball의 값이 하나라도 다르면 flag는 False가 되고 나머지 질문들을 검사할 필요가 없이 주어진 n은 탈락이므로 break로 for문을 벗어나고 다음 n을 검사한다. 만약 주어진 질문들에 대해서 계속 strike와 ball이 일치하면 가능한 수이므로 answer list에 추가해준다.

 

모든 n을 검사한 후 answer에 있는 수를 세서 반환한다.

def make_nums():
    nums = []
    for i in range(1, 10):
        for j in range(1, 10):
            for k in range(1, 10):
                if i != j and j != k and i != k:
                    nums.append(i*100 + j*10 + k)
    return nums


def solution(baseball):
    answer = []
    nums = make_nums()
    for n in nums:
        flag = True
        for bb in baseball:
            n_str = str(n)
            n_list = list(n_str)
            strike = 0
            ball = 0
            b_list = list(str(bb[0]))
            for i in range(3):
                if n_list[i] == b_list[i]:
                    strike += 1
                    n_list[i] = False
                    b_list[i] = False
            for i, v in enumerate(n_list):
                if v:
                    for j, b in enumerate(b_list):
                        if b and v == b:
                            #if i != j: 볼인지 확인하는 부분은 위에 False로 대체 함  
                            ball += 1
                            break
            if strike != bb[1] or ball != bb[2]:
                flag = False
                break
        if flag:
            answer.append(n_str)
    return len(answer)

출처 https://programmers.co.kr/learn/courses/30/lessons/42841

 

코딩테스트 연습 - 숫자 야구 | 프로그래머스

[[123, 1, 1], [356, 1, 0], [327, 2, 0], [489, 0, 1]] 2

programmers.co.kr

 

'알고리즘 문제' 카테고리의 다른 글

프로그래머스 예산  (0) 2019.08.31
프로그래머스 카펫  (0) 2019.08.30
프로그래머스 소수 찾기  (0) 2019.08.29
프로그래머스 모의고사  (0) 2019.08.29
프로그래머스 베스트 앨범  (0) 2019.08.28