프로그래머스 완전 탐색

1. 모의고사

풀이 전략)

각각의 수포자들이 찍는 방식이 패턴이 정해져 있으므로 이 패턴을 하나의 배열로 만든 뒤 일정 수만큼 반복하면 된다.

풀이에 필요한 수학적 원리)

일정한 패턴을 가진 배열(List)의 길이 = n일 때, List[a] = List[a%n] // n만큼 반복되므로 나눴을 때 나머지들은 모두 같은 수를 갖는다.

def solution(answers):
    # 수포자들의 답안 패턴이 존재함 : 배열로 구성
    # 각각의 배열을 순회하면서 답안 배열과 같으면 점수 배열 +1
    # 점수 배열 중 가장 높은 점수를 받은 인덱스만 출력(+1)
    supo = [[1,2,3,4,5,],[2,1,2,3,2,4,2,5],[3,3,1,1,2,2,4,4,5,5]]
    right = [0,0,0]
    answer = []
    
    for i in range(len(supo)):
        for j in range(len(answers)):
            n = len(supo[i])
            if answers[j] == supo[i][j%n]:
                right[i] += 1
                
    for idx, score in enumerate(right):
        if score == max(right):
            answer.append(idx+1)
    
    
    return answer

2. 소수 찾기

풀이 전략)

문자열의 각 요소를 순열로 구성하고, 소수를 판별하는 함수를 사용한다.

풀이에 필요한 수학적 원리)

각각의 조합을 만들되 순서에 따라 다른 값을 가지므로 순열 함수를 사용해야 한다.

from itertools import permutations

def is_prime_number(x):
    if x<2 :
        return False
    for i in range(2,x):
        if x % i == 0:
            return False
    return True

def solution(numbers):
    # 문자열을 하나씩 쪼개서 새로운 배열에 저장
    # 각각의 숫자로 조합하여 문자열 만들기(순열)
    # 숫자에 조건을 부여하여 조합(소수 조건)
    # 될 때마다 숫자 변수에 +1하여 숫자 변수 출력 
    answer = 0
    
    num = []
    for i in range(1,len(numbers)+1):
        num.append(list(set(map(''.join, permutations(list(numbers),i)))))
    per = list(set(map(int, set(sum(num, [])))))
    
    for p in per:
        if is_prime_number(p) == True :
            answer += 1
    
    return answer

3. 카펫

풀이 전략)

타일의 총 개수를 약수로 분리한 뒤, 가로 길이가 세로 길이보다 길거나 같다는 조건과

테두리 한 줄은 갈색이라는 조건을 사용하여 알맞은 약수를 추출한다.

풀이에 필요한 수학적 원리)

  • 갈색과 노란색의 타일 개수 합이 격자의 곲과 같다.
  • 노란색 개수 = (가로 길이-2)*(세로 길이-2)
def getMyDivisor(n,brown,yellow):
    
    list = []
    row = 0
    col = 0
    
    for i in range(2, n+1):
        if n % i == 0 and (n // i) >= i:
            row = n // i
            col = i
        if yellow == (row-2)*(col-2):
            list.append(row)
            list.append(col)
            break
            
    return list

def solution(brown, yellow):
    total = brown + yellow
    
    return getMyDivisor(total,brown,yellow)