[백준_Python] 1759번 로또 암호 만들기 [골드 5]

황준성·2025년 2월 17일
0

BOJ_Python

목록 보기
57/70

문제

문제 이해

조합을 배우고 이 문제를 푸는데 왜 이문제가 골드 난이도인지는 이해가 되지 않았다. 근데 또 예시 입력 출력이 같은데 자꾸 코드가 틀려서 다시 한번 문제를 보니까, 최소 한개의 모음 최소 두개의 자음인 것만 출력하는 것이었다. 이런 문제를 잘 안풀어서 그런지, 아니면 조건이 꽤 있어서 그런지 중요한 것을 놓쳤다.

틀린 코드 (자음 모음을 신경x)

# 백준 1759번 암호 만들기

def combination(index, level):
    global lst, need_value_num, total_value_num
    if level == need_value_num:
        print("".join(choose))
        return
    
    for i in range(index, total_value_num):
        choose.append(lst[i])
        combination(i+1, level+1)
        choose.pop()


# 순서대로 조합에 필요한 수, 원소의 총 개수
need_value_num, total_value_num = map(int, input().split())
lst = list(input().split())

if need_value_num or total_value_num == 0:
    exit()

# 리스트로 받은 것을 사전순으로 정렬해야 한다. 신기하게 문자열도 sort()함수가 가능
lst.sort()

choose = []
combination(0, 0) # index, level

수정 코드

# 백준 1759번 암호 만들기

vowel_lst = ['a', 'e', 'i', 'o' ,'u']

def is_possible():
    global need_value_num, choose

    vowel = 0
    
    for c in choose: # choose에서 문자 하나씩 빼면서
        if (c in vowel_lst):
            vowel += 1
    consonant = need_value_num - vowel

    return (consonant >= 2 and vowel >= 1)


def combination(index, level):
    global lst, need_value_num, total_value_num
    if level == need_value_num:
        if is_possible(): # 모음 1개 이상, 자음 두개 이상인지 확인하는 함수
            print("".join(choose))
        return
    
    for i in range(index, total_value_num):
        choose.append(lst[i])
        combination(i+1, level+1)
        choose.pop()


# 순서대로 조합에 필요한 수, 원소의 총 개수
need_value_num, total_value_num = map(int, input().split())
lst = list(input().split())

if need_value_num == 0 or total_value_num == 0:
    exit()

# 리스트로 받은 것을 사전순으로 정렬해야 한다. 신기하게 문자열도 sort()함수가 가능
lst.sort()

choose = []
combination(0, 0) # index, level

지금도 진행형이지만, 이전에는 갑상선 + 소화 이슈로 힘들어서 공부와 알바를 모두 포기했었다. 지금은 점점 좋아지고 있고, 학교갈 준비를 해야하기 때문에 다시 시작했다. 이번 문제는 조합 문제에서 조금의 생각이 필요한 문제이다. 그렇게 어렵진 않은데, 오랜만에 풀어서 그런지 문법적인 부분에서 많이 틀렸다.

profile
Make progress

0개의 댓글