[ProblemSolving] 프로그래머스KIT - 완전탐색, 소수찾기, 카펫(bruteforce)

문제 설명은 생략하겠습니다. 링크를 클릭하세요.

모의고사

나의 풀이


1, 2, 3번 수포자의 방식을 리스트로 생성한다.

answer의 길이만큼 반복문을 돌려서 answer의 원소와 수포자의 답안이 같다면, 카운트를 증가시킨다.

코드


나의 코드

def solution(answers):
    answer = []
    
    n1 = [1, 2, 3, 4, 5]
    n2 = [2, 1, 2, 3, 2, 4, 2, 5]
    n3 = [3, 3, 1, 1, 2, 2, 4, 4, 5, 5]
    c1= c2= c3 =0
    for i in range(len(answers)):

        if answers[i] ==n1[i%5]:
            c1+=1
        if answers[i] ==n2[i%8]:
            c2+=1
        if answers[i] ==n3[i%10]:
            c3+=1
            
    maxd = max(c1, c2, c3)

    if maxd == c1: answer.append(1)
    if maxd == c2: answer.append(2)
    if maxd == c3: answer.append(3)
    return answer

소수 찾기

나의 풀이


  1. check 함수는 소수를 판정 -> 제곱근까지 판별하면 소수인지 아닌지 알 수 있다.
  2. permutaions 이용해 경우의수 -> set으로 중복 제거한다.

print(list(permutations(numbers,i))) 을 하게 되면

[('1',), ('7',)]
[('1', '7'), ('7', '1')]

출력되고, join을 이용하여 map으로 묶고 리스트로 묶으면

result = list(map(''.join , permutations(list(numbers), k)))
        #print(result)

#['1', '7']
#['17', '71']

공백없는 문자열을 만들 수 있다.

map 함수는 map(변환 함수, 순회 가능한 데이터) : map은 이터레이터 데이터를 변홚함수에 적용해서 반환
join 함수는 문자열 합칠 때 사용하는 함수로, String 사이에 특정 문자열을 삽입해 나눠져 있던 String문자열을 새로운 문자열로 합쳐준다.

코드


나의 코드

from itertools import permutations
def check(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 = []
    for k in range(1, len(numbers)+1):
        result = list(map(''.join , permutations(list(numbers), k)))
        print(result)
        
        for i in list(set(result)):
            if check(int(i)):
                answer.append(int(i))
    answer = len(set(answer))
    return answer

카펫

나의 풀이


이 문제의 포인트는 노란색 약수를 구하고, 노란색 부분으로 갈색의 가로, 세로 길이를 식으로 표현할 수 있다.

갈색의 가로 = 노란색의 가로 +2
갈색의 세로 = 노란색의 세로 +2

갈색의 가로 * 세로 = 전체 카펫 격자 개수일 때, 갈색의 가로, 세로를 구할 수 있으며, 이때, 1부터 돌아 조건을 만족하는 작은 값이 될 것이기 때문에 i+2가 세로, yellow//i+2가 가로가 된다.

코드


나의 코드

import math
def solution(brown, yellow):
    yel = int(math.sqrt(yellow)//1)
    for i in range(1, yel+1): 
        if yellow % i ==0:
            if(i+2)*(yellow//i+2) == brown+yellow:
                return[(yellow//i+2), i+2]

좋은 웹페이지 즐겨찾기