[프로그래머스] 카펫 (Python)

lemonlily·2024년 1월 11일

문제

문제 링크

문제 설명

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) 첫 번째 접근 과정

  • brown + yellow 가 카펫의 너비 (w) * 카펫의 높이 (h) 와 같다.
    - 예를 들어, 10 + 2 = 4 *3 이라는 점을 발견했다.
  • 그런데 그러면 어떻게 brown이 yellow를 감싸는 걸 생각할 수 있지? 라는 난관에 봉착했다.
  • 또한 x+y = w*h 가 되는 숫자의 조합을 어떻게 찾아야 할지도 막막했다.
    - 하나의 케이스 brwon=24, yellow=24, return=[8,6]에 대해서 생각해보았을 때,
    - 전체 카펫의 넓이를 소수의 곱으로 나누고 (48 = 2^4 * 3) 그것을 적당히 나누어서 yellow의 크기가 될 수 있게 (24 = 2^3 * 3 ) 이 되는 걸 찾아내면 되는 것인가? 하는 생각이 들었다.
  • 그런데 그렇게 생각하니까 어떻게 해야 할지 모르겠고 너무 복잡했다. 따라서 감싸고 있는 brown의 길이로부터 힌트를 얻고자 했다.

2) 두 번째 접근 과정

  • 문제를 다시 잘 읽어보니까 brown은 가장 바깥 쪽 한 겹만 겹쳐있다. 따라서, 무언가를 감싸고 있을 때 타일의 개수가 어떻게 될지를 생각해보며 아래와 같은 그림을 생각할 수 있었다.
  • 그렇게 되었을 때 얻을 수 있는 식은 (brown-4) // 2 = yellow_width + yellow height 가 된다는 것이 었다. 조금 더 확실하게 알 수 있는 것을 기준으로 생각하는 게 답을 찾는 데에 도움이 되는 것 같다.
  • 그 후에는 노란색의 테두리 길이를 알 수 있으면 width와 heigh가 될 수 있는 경우의 수를 조합해서, yellow_width * yellow_height == yellow 가 되는 것을 찾으면 된다.

정답 코드

def solution(brown, yellow):
    
    yellow_half_length = (brown - 4) // 2 
    
    for i in range(1, (yellow_half_length //2)+1):
        yellow_w, yellow_h = yellow_half_length-i, i
        if yellow_w * yellow_h == yellow:
            break
    
    answer = [yellow_w+2, yellow_h+2]
    return answer

느낀점

  • 초기 접근을 잘 잡으면 금방 문제가 풀리는 문제였다. 그러나 초기 접근을 잘 찾는 게 생각보다 어렵다. 그걸 잘 할 수 있도록 해야겠다!
profile
NLP 엔지니어,,,,? 가 될 수,,,? 나도,,,,?

0개의 댓글