SW개발/코딩테스트

[프로그래머스]카펫 - 완전탐색

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

 

코딩테스트 연습 - 카펫

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

programmers.co.kr

 

def solution(brown, yellow):
    panel = brown + yellow
    answer = []
    for width in range(3, panel+1):
        if ((width-2) * ((panel // width) -2) == yellow):
            # height 값
            answer.append(panel // width)
            # width 값
            answer.append(width)
            break
            
    return answer

# brown + yellow = width * height
# (width-2) * (height-2) = yellow
# 공식을 그대로 코드로 구현, 저장할 때 큰 값 먼저 저장

 

문제 해결 Point

해당 문제는 주어진 brown, yellow를 보고 width, height를 구하는 공식을 도출해내는 것이 중요하다.

  1. 총 블럭의 개수 = brown + yellow = width * height 가 된다. -> 총 블럭 // width = height 
  2. yellow = (width-2) * (height-2) 가 된다. -> 테두리 1줄이 갈색으로 둘러져 있기 때문에 가능
  3. 가장 최소의 width는 yellow가 1인 경우이므로 3이 된다.

그럼 위의 코드를 순서대로 풀어 설명해보겠다.

  1. width가 되는 최솟값인 3부터 총 블럭의 개수까지 순회를 하며 widht, height 값을 구한다.
    1. 이 때 위에 적은 공식에 부합하는 값일 경우에 더 큰값(height)을 먼저 저장하고 나머지 width도 저장한다.
    2. 조건을 일치하면 반복문을 종료한다.

 

728x90