본문 바로가기
개발/알고리즘

[프로그래머스][LEVEL2] 카펫

by ISA(류) 2021. 9. 13.

# 문제 원문

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]

출처

 

# 문제 풀이

 

입력 받은 brown, yellow를 통해서 카펫의 가로, 세로 너비를 구하는 간단한 문제이다. 카펫의 전체 크기는 brown + yellow이다. 단순히 이걸 기준으로 반복문을 돌려서 탐색을 해보니 테스트케이스 4, 6, 7이 통과가 안되더라 당연한 말이지만 전체크기가 같더라도 brown, yellow 각 크기가 다르면 가로 세로 너비가 달라질 수 있어서 그렇다.

그래서 우선 yellow기준으로 a, b를 구하고 그 x, y에 둘레를 brown이 감싸고 있으니 a + 2, b + 2 를 곱한 값이 brown + yellow 즉 전체 크기가 되는지 확인 하는 방법으로 풀었다. 문제 자체가 가진 조건인 "중앙에는 노란색으로 칠해져 있고 테두리 1줄은 갈색으로 칠해져" 라는 조건에 의해서 brown이 무조건 둘레의 한줄씩만 차지하는 것을 주의 하면 쉽게 풀 수 있다.

 

# 솔루션 플로우

1. 1부터 입력 받은 yellow까지 반복하면서 yellow의 약수 a, b 를 구한다.(조건에 a가 b보다 크거나 같다는 조건을 참고)

2. yellow의 약수 a, b에 각각 2씩 더하고 곱해서 brown + yellow가 되는가를 확인한다.

3. 구해진 result를 반환한다.

1. 반복문을 활용한 풀이

function solution(brown, yellow) {
    for (let a = 1; a <= yellow; a++) {
        for (let b = 1; b <= a; b++) {
            if (a * b === yellow) {
                if ((a + 2) * (b + 2) === brown + yellow) {
                    return [a + 2, b + 2];
                }
            }
            if (a * b > yellow) {
                break;
            }
        }
    }
}
반응형