Coding Test/Programmers

[Python] 프로그래머스 알고리즘 고득점 Kit ✅ 완전탐색 (~ing)

hyeeein 2025. 2. 25. 13:00

[Level 1] 최소 직사각형

def solution(sizes):
    answer = 0
    
    w_list = []
    h_list = []
    
    for size in sizes:
        # 큰 값들은 다 왼쪽으로 넘기기
        if size[0] < size[1]:
            tmp = size[0]
            size[0] = size[1]
            size[1] = tmp
        
        w_list.append(size[0])
        h_list.append(size[1])
    
    answer = max(w_list) * max(h_list)
    
    return answer

 

[Level 1] 모의고사

def solution(answers):
    answer = []
     
    # 수포자 답안 패턴
    person_1 = [1, 2, 3, 4, 5]
    person_2 = [2, 1, 2, 3, 2, 4, 2, 5]
    person_3 = [3, 3, 1, 1, 2, 2, 4, 4, 5, 5]
    
    # 맞은 개수 count
    one_count = 0 ; two_count = 0 ; three_count = 0
    
    # 정답 개수
    answers_len = len(answers)
    
    num_1 = person_1 * ((answers_len // len(person_1)) + (answers_len % len(person_1)))
    num_2 = person_2 * ((answers_len // len(person_2)) + (answers_len % len(person_2)))
    num_3 = person_3 * ((answers_len // len(person_3)) + (answers_len % len(person_3)))
    
    # 정답 비교
    for i in range(answers_len):
        if num_1[i] == answers[i]: one_count += 1
        if num_2[i] == answers[i]: two_count += 1
        if num_3[i] == answers[i]: three_count += 1
    
    # 가장 많이 맞힌 사람 찾기
    max_count = max(one_count, two_count, three_count)
    if one_count == max_count: answer.append(1)
    if two_count == max_count: answer.append(2)
    if three_count == max_count: answer.append(3)
    
    return answer

 

[Level 2] 소수 찾기

  • itertools는 파이썬에서 반복되는 데이터를 처리하는 기능을 하는 라이브러리
  • permutations는 순열 / combinations는 조합에 관한 클래스 → 이번 문제 풀이에서는 이를 활용하고자 함
  • (추가 메모) 소수 판별 시, 제곱근까지만 확인하기 - 안하면 시간 초과됨 ...
from itertools import permutations # 순열

def is_prime(n):
    '''소수 판별 함수'''
    if n < 2:
        return False
    for i in range(2, int(n**0.5) + 1): # 제곱근까지만 확인 (이거 안하면 시간 초과됨)
        if n % i == 0:
            return False
    return True

def solution(numbers):
    answer = 0
    
    # 순열을 활용해 모든 조합 찾기
    numbers_list = [int(i) for i in numbers]  # 각 하나의 숫자로 변환
    numbers_list_new = []
    
    for i in range(1, len(numbers_list)+1):
            new = list(permutations(numbers_list, i))
            
            for j in range(len(new)):
                numbers_list_new.append(new[j])
    
    # 가능한 조합의 수로 변환(join, map 활용)
    final_numbers = []  # [17, 1, 7, 71]
    
    for i in numbers_list_new:
        final_numbers.append(int(''.join(map(str, list(i)))))  # 정수로 변환 + 0도 추가로 제거 
        
    final_numbers = list(set(final_numbers)) # 중복 제거
    
    # 소수인지 확인 후 count
    for num in final_numbers:
        if is_prime(num): answer += 1

    return answer

 

[Level 2] 카펫

  • 중앙은 노란색, 테두리 1줄은 갈색이라는 점에 Focus !!
  • 이를 위해서 노란색으로 만들 수 있는 직사각형을 모두 만들고, 갈색 테두리로 다 감싸지는 지 확인해야 한다.
def solution(brown, yellow):
    answer = []
    total_carpets = brown + yellow
    
    # 약수 구하기 (1과 자기 자신 제외)
    number_list_yellow = [i for i in range(1, yellow + 1) if yellow % i == 0]
    
    # 조합을 찾아보자 (완전 탐색!)
    results_yellow = []
    for i in number_list_yellow:
        for j in number_list_yellow:
            if i * j == yellow and i >= j: # i >= j는 가로 길이가 세로보다 긴 것
                results_yellow.append([i, j])
    # print(results_yellow)
    
    # 찾은 조합 중에서 중앙은 노란색, 테두리 1줄은 갈색인 것
    for i, j in results_yellow:
        if (i+2) * (j+2) == total_carpets:
            answer.append(i+2)
            answer.append(j+2)
    
    return answer

 

[Level 2] 피로도

  • 이번에도 순열(permutations)을 사용해봄. 완전 탐색에서 모든 경우의 수를 구해야 해서 거의 필수적인 것 같다.
from itertools import permutations

def solution(k, dungeons):
    answer = -1

    # 던전 탐험 모든 경우의 수 구하기 (순열 사용)
    for perm in permutations(dungeons):
        cnt, kk = 0, k # 하나의 경우의 수 실행마다 초기화
        for i, j in perm:
            if kk >= i:
                kk-= j
                cnt += 1
        answer = max(answer, cnt)
    
    return answer

 

[Level 2] 전력망을 둘로 나누기

ing

 

[Level 2] 모음사전

ing