# 문제 원문
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;
}
}
}
}
'개발 > 알고리즘' 카테고리의 다른 글
[프로그래머스][LEVEL2] 다리를 지나는 트럭 (0) | 2021.09.18 |
---|---|
[프로그래머스][LEVEL2] 위장 (0) | 2021.09.14 |
[프로그래머스][LEVEL2] 거리두기 확인하기 (0) | 2021.09.10 |
[프로그래머스][LEVEL2] [1차] 뉴스 클러스터링 (0) | 2021.09.09 |
[프로그래머스][LEVEL2] 소수 찾기 (0) | 2021.09.08 |