본문 바로가기
알고리즘/프로그래머스 PS

[프로그래머스][Level 2][Python] 카펫

by 빛밤하늘 2021. 7. 22.
반응형

밑의 링크는 프로그래머스에서의 문제 링크입니다.

 

코딩테스트 연습 - 카펫

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

programmers.co.kr

 

 

 

 

 

 

 

 

생각한 풀이 과정

  1. 매개변수 yellow값에서 가능한 직사각형, 정사각형 모양이 어떤 것이 있는지 생각해봅니다.
  2. 예를 들어, yellow가 2라면 1X2, 2X1 사각형 모양이 가능, yellow가 4라면 1X4, 2X2, 4X1 사각형 모양이 가능하며, yellow가 6이라면 1X6, 2X3, 3X2, 6X1 사각형 모양이 가능합니다.
  3. 무조건 카펫의 세로 길이가 가로 길이보다 작거나 같으므로(제한사항) 카펫에서 노란색 부분의 높이를 1부터 yellow값까지 반복해봅니다. 
  4. 노란색 부분의 가로 길이는 yellow에서 노란색 부분의 세로 길이를 나눈 값입니다.
  5. 그러므로 yellow를 노란색 부분의 세로 길이로 나누어 딱 맞아떨어진다면, 2번 과정에서 생각한 사각형 모양도 가능하며 노란색 부분의 가로 길이값도 나올 수 있습니다.
  6. 노란색 부분의 세로 길이와 가로 길이가 나왔을 때, 노란색 부분을 둘러싼 갈색 격자의 수를 계산해봅니다.
  7. 계산해서 나온 갈색 격자의 수가 매개변수로 주어진 brown 값과 같다면, 현재 노란색 부분의 세로 길이와 가로 길이가 Leo가 본 카펫과 일치합니다.
  8. 계산해서 나온 갈색 격자의 수가 매개변수로 주어진 brown 값과 같지 않다면, 노란색 부분의 다음 세로 길이로 시작해서 반복해봅니다.
  9. 노란색 부분의 세로 길이, 가로 길이를 구했다면, 카펫의 모양은 갈색 격자들이 노란색 부분을 둘러싼 모양이므로 카펫의 세로 길이, 가로 길이는 노란색 부분의 세로 길이, 가로 길이에 각각 2를 더한 값입니다.

 

 

 

주의해야 할 

'카펫의 가로 길이는 세로 길이와 같거나, 세로 길이보다 깁니다.'라는 제한사항이 있습니다.

즉, 입출력 예처럼 return 값이 [4, 3], [3, 3], [8, 6]은 가능하지만

[3, 4], [6, 8], [10, 20]은 불가능합니다.

 

그래서 반복문을 돌릴 때, 노란색 부분의 세로 길이를 1부터 시작한 것입니다.

 

 

 

 

 

 

 

 

제출한 파이썬 코드

# Leo가 본 카펫에서 갈색 격자의 수 brown, 노란색 격자의 수 yellow가 매개변수로 주어집니다.
def solution(brown, yellow):
    # 카펫의 가로, 세로 길이를 순서대로 저장할 리스트를 선언합니다.
    carpet = [None, None]

    # 노란색 부분의 세로 길이를 1부터 yellow까지 반복해봅니다.
    for yellow_height in range(1, yellow + 1):
        # yellow 값이 현재 노란색 부분의 세로 길이로 딱 나누어 떨어지지 않는다면
        if yellow % yellow_height != 0:
            # 노란색 부분이 직사각형, 정사각형 모양이 되지 않으므로
            # 다음 세로 길이로 넘어갑니다.
            continue

        # 노란색 부분의 가로 길이를 저장하는 변수를 선언합니다.
        yellow_width = yellow // yellow_height
        # 현재 노란색 부분 가로 길이, 세로 길이의 사각형을 둘러싼 갈색 격자의 수를 저장하는 변수를 선언합니다.
        cur_case_brown = (yellow_height + 2) * 2 + 2 * yellow_width

        # Leo가 본 카펫에서 갈색 격자의 수와 위에서 계산한 갈색 격자의 수가 같다면
        if brown == cur_case_brown:
            # 현재 노란색 부분의 모양이 Leo가 본 카펫과 일치하므로
            # 노란색 부분의 가로 길이와 세로 길이에 각각 2를 더하고 carpet에 넣어줍니다.
            carpet[0] = yellow_width + 2
            carpet[1] = yellow_height + 2
            # 정답을 찾았으므로 반복문을 탈출합니다.
            break

    # Leo가 본 카펫의 가로 길이, 세로 길이 리스트 변수를 반환합니다.
    return carpet

 

 

 

제출 결과

결과

 

 

 

※ 궁금한 부분, 이상한 점 및 오타는 댓글에 부탁드립니다.

※ 더 효율적이고 빠른 정답을 환영합니다.

반응형

댓글