Better Code, Better Life

숫자 야구 - 프로그래머스 - 파이썬 풀이 본문

Coding Test/Programmers

숫자 야구 - 프로그래머스 - 파이썬 풀이

심재훈 2019. 8. 22. 17:32

문제 풀이

먼저 던질 수 있는 모든 경우의 수를 만듭니다.

​   get_candidates

그 다음 각각의 경우에 대해 주어진 결과(baseball)가 맞아떨어지는지 확인합니다.

하나라도 틀리면 그 후보는 넘어갑니다.

​   check_candidate

baseball에 대해 모두 통과시 가능한 답안이므로 answer_count값을 늘립니다.

클린 코드 작성법

  1. 코드 각각이 하나의 기능만 수행하도록 분리합니다.

    1. 123 ~ 987 까지 후보군을 만드는 함수
    2. 각 후보에 대해 baseball의 guess를 통과하는지 확인하는 함수
    3. 1개의 guess, 1개의 후보에 대해 서로 일치하는지 확인하는 함수
    4. permutations에서 나오는 출력형태가 튜플인데 이를 문자로 전환해주는 함수
  2. 묶여진 자료형을 다룰 때, 각각에 변수명을 붙여서 다루면 이해하기 쉬워집니다.

    1. guess_num, guess_strike, guess_ball = guess
  3. if is_passed 처럼 boolean 값을 내놓는 변수명을 is_something 으로 붙이면 좋습니다.

해답 코드

from itertools import permutations

LENGTH = 3

def solution(baseball):
    candidates = get_candidates(LENGTH)
    answer_count = 0
    for candidate in candidates:
        is_passed = check_candidate(baseball, candidate)
        if is_passed:
            answer_count += 1
    return answer_count

def get_candidates(length):
    numbers = list(range(1, 10))
    candidates = list(permutations(numbers, length))
    return candidates

def check_candidate(baseball, candidate):
    is_passed = True
    for guess in baseball:
        correct = check(guess, candidate)
        if not correct:
            is_passed = False
            break
    return is_passed

def check(guess, candidate):
    guess_num, guess_strike, guess_ball = guess
    guess_num_str = str(guess_num)
    candidate_str = tuple_to_str(candidate)
    strike = 0
    ball = 0
    for str1, str2 in zip(guess_num_str, candidate_str):
        if str1 == str2:
            strike += 1
        elif str1 in candidate_str:
            ball += 1

    is_correct = True
    if strike != guess_strike or ball != guess_ball:
        is_correct = False
    return is_correct

def tuple_to_str(tuple_):
    result = ""
    for number in tuple_:
        result += str(number)
    return result

도움이 됐다면 공감버튼을 눌러주세요! 질문이 있다면 댓글 달아주세요!

 

문제 링크

 

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

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

programmers.co.kr

Comments