본문 바로가기

코딩테스트/Python

[프로그래머스] 카펫

내 코드

def solution(brown, yellow):
    answer = []
    
    s = brown+yellow
    
    l = []
    
    for i in range(3,s+1):
        if s%i==0:
            if s//i < i: 
                break
            l.append([s//i,i])
            
    for i in l:
        if (i[0]-2)*(i[1]-2) == yellow:
            return i
    
    return answer

ㅠ 이건 코딩 능력보다 창의력 능력같다 ㅠ.ㅠ 풀긴 풀었는데 뭔가 뺑뺑 돌아가는 느낌?? 아이디어만 있으면 코딩은 어렵지 않음,,

 

갈색과 노란색의 합을 구해 s라고 한다. 즉, 전체 타일의 수가 s이다. 

s를 만들 수 있는 가로, 세로를 구해줄것이다. a*b=s가 될때의 a,b를 구하면된다!

for 문을 3부터 끝까지 돌려서 s가 i로 나누어 떨어지는 수를 구한다. 가로의 길이가 더 길어야하니 s//i가 i보다 작아지면 break를 한다. 이렇게 찾은 리스트를 l에 넣는다.

갈색이 카펫의 테두리에만 있다고 했으므로 전체 타일의 가로,세로 길이에 -2씩 한것이 노란색의 가로, 세로 길이이다. 즉, l에서 -2를 하고 곱한 크기가 처음에 주어진 yellow다.

 

음 근데 다른사람들꺼 보니까 저렇게 for문 두개 안하고 if 문 두개해서 풀어도됐었당 ㅋㅎ

 

 

다른사람 코드

def solution(brown, red):
    for i in range(1, int(red**(1/2))+1):
        if red % i == 0:
            if 2*(i + red//i) == brown-4:
                return [red//i+2, i+2]

엥 ㅠ 완전 짧다.. 문제가 중간에 바껴서 노란색이 빨간색으로 적혀있다. 

i는 red의 가로길이이다. 2*( i(가로길이) + red//i(세로길이) ) = red의 둘레 = 갈색 - 4

red의 가로세로에 +2씩해서 return 해준다.