Sad Puppy 3 [프로그래머스 lv2]카펫 :: 개발자 아지트

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

문제설명

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

 

Leo는 집으로 돌아와서 아까 본 카펫의 노란색과 갈색으로 색칠된 격자의 개수는 기억했지만, 전체 카펫의 크기는 기억하지 못했습니다.

 

Leo가 본 카펫에서 갈색 격자의 수 brown, 노란색 격자의 수 yellow가 매개변수로 주어질 때 카펫의 가로, 세로 크기를 순서대로 배열에 담아 return 하도록 solution 함수를 작성해주세요.

 

제한사항

갈색 격자의 수 brown 8 이상 5,000 이하인 자연수입니다.

노란색 격자의 수 yellow 1 이상 2,000,000 이하인 자연수입니다.

카펫의 가로 길이는 세로 길이와 같거나, 세로 길이보다 깁니다.

입출력 예

brown   yellow   return

10        2         [4, 3]

8         1         [3, 3]

24        24        [8, 6]

 

문제 해결 방법

1. 가로>=세로 라는 조건에 유의한다. 

2. 노란 박스는 1층일 수도 있고, 2층일 수도 있고, ... N층일 수도 있다. 

3.  2번에 의해 노란박스가 1층이면 노란박스의 가로길이는 yellow값이 된다. 

4. 노란박스의 층수가 정해지면 그에 따라 brown을 가늠해볼 수 있게된다. 
    brown은 노란박스 층수+2가 세로가 되고,  노란박스+2가 가로가 된다. 이게 노란박스를 품은 brown이다. 

    즉, brown+yellow의 값인 total 격자 수가 된다. 

5. 4번을 충족하는 노란박스의 층수를 찾으면 문제가 풀린다. 

코드 구현

def solution(brown, yellow):
    answer = []
    total = int(brown) + int(yellow)
    
    x = 1
    
    while 1:
        if yellow%x==0:
            y = yellow//x
        
        if (x+2)*(y+2) == total and y+2 >= x+2:
            answer.append(y+2) # 가로
            answer.append(x+2) # 세로
            break
        else:
            x+=1
        
    return answer

 

시간/공간 복잡도

O(N)

최적화 및 개선

처음에 답이 안나왔는데, 다음 값의 정확도를 개선하였음

yellow를 x로 나누면 y값이 나온다. 이때 yellow가 x로 나누어떨어져서 나머지가 없는 x의 값에 의한 y를 찾게끔하였음. 

어려웠던 점

없음. 항상 괜히 쫄지마 !

+ Recent posts