본문 바로가기
공부-코딩테스트/코테풀이 - 자바, 파이썬

카펫 (코딩테스트, 프로그래머스, 파이썬)

by 령과 2022. 2. 21.

문제

https://programmers.co.kr/learn/courses/30/lessons/42842

 

코딩테스트 연습 - 카펫

Leo는 카펫을 사러 갔다가 아래 그림과 같이 중앙에는 노란색으로 칠해져 있고 테두리 1줄은 갈색으로 칠해져 있는 격자 모양 카펫을 봤습니다. Leo는 집으로 돌아와서 아까 본 카펫의 노란색과

programmers.co.kr

나의 코드

def solution(brown, yellow):
    div_arr1,div_arr2 = divisor(brown + yellow)
    for a1,a2 in zip(div_arr1,div_arr2):
        if (a1-2) * (a2-2) == yellow:
            return [a2,a1]

def divisor(num):
    arr1 = []
    arr2 = []
    for i in range(1,int(num**(0.5))+1):
        if num % i == 0:
            arr1.append(i)
            arr2.append(num//i)
    return arr1,arr2

풀이

갈색과 노란색 격자의 합으로 카펫이 만들어진다. 합산된 수로 만들 수 있는 직사각형을 구하기 위해서

약수들을 구해서 경우의 수를 arr1, arr2에 저장한다.

약수들의 집합은 arr1 + arr2 이지만 짝지어서 카펫의 경우를 나타내기로 하였다.

노란색은 카펫의 길이-2로 이루어 지기 때문에 arr1와 arr2에서 한 개씩 순서대로 뽑은 뒤 -2 한 값들을 곱한다.

곱하였을 때 그 값이 yellow와 같으면 return하면 된다.

a1-2 와 a2-2를 처음에 음수가 될 경우를 제거해야되나 생각했지만 두개가 동시에 음수가 되는 경우는 없고,

음수가 하나라도 있는 경우도 2이하인 경우 문제가 발생하기 때문에 yellow가 될 수 없다고 생각했다.

좀 더 수학적으로 해결하는 방법도 생각해봤고 다른 사람 풀이도 수학으로 푼 경우도 있지만 그냥 내가 생각한 것을

구현하는데 집중하였다.

댓글