카펫
문제 설명
Leo는 카펫을 사러 갔다가 아래 그림과 같이 중앙에는 빨간색으로 칠해져 있고 테두리 1줄은 갈색으로 칠해져 있는 격자 모양 카펫을 봤습니다.
Leo는 집으로 돌아와서 아까 본 카펫의 빨간색과 갈색으로 색칠된 격자의 개수는 기억했지만, 전체 카펫의 크기는 기억하지 못했습니다.
Leo가 본 카펫에서 갈색 격자의 수 brown, 빨간색 격자의 수 red가 매개변수로 주어질 때 카펫의 가로, 세로 크기를 순서대로 배열에 담아 return 하도록 solution 함수를 작성해주세요.제한사항
- 갈색 격자의 수 brown은 8 이상 5,000 이하인 자연수입니다.
- 빨간색 격자의 수 red는 1 이상 2,000,000 이하인 자연수입니다.
- 카펫의 가로 길이는 세로 길이와 같거나, 세로 길이보다 깁니다.
입출력 예
brown red return 10 2 [4, 3] 8 1 [3, 3] 24 24 [8, 6]
function solution(brown, red){
var sum = brown + red
var answer = []
for(var i=1; i<=red; i++){
if(answer.some(e => e[0] == i+2)) continue
if(Number.isInteger(red/i){
answer.push([red/i + 2, i+2].sort((a,b) => b-a))
}
}
answer = answer.filter(e => {
if(e.reduce((a,b) => a*b) == sum){
return e
}
})
return answer.shift()
}
- red를 인수분해 한다.
1-1. 만약red = 2
라면 -->[1, 2], [2, 1]
1-2. 만약red = 24
라면 -->[1, 24], [2, 12], [3, 8], [4, 6], [6, 4], [8, 3], [12, 2], [24, 1]
- 가로가 세로보다 같거나 크다고 했으니 x >= y 인 것들만 골라낸다.
2-1. 만약red = 2
라면 -->[2, 1]
2-2. 만약red = 24
라면 -->[6, 4], [8, 3], [12, 2], [24, 1]
2-3. 만약red = 9
라면 -->[3, 3], [9, 1]
2-4. 나는 처음부터 내림차순으로 sort하며 값을 넣었고, 같은 값이 다음으로 넘어오면 코드를 무시하도록 continue를 해주었다.- 전체 좌표는 red 좌표의 각 x, y를 +2 해준 값과 동일하다.
3-1. red가 가운데에 위치하기 때문이다. 전체 좌표보다 양 끝에서 1씩 떨어져 있으니 x는 2만큼, y도 2만큼 작은 값이 된다.
3-2. 만약red = 24
라면 -->[8, 6], [10, 5], [14, 4], [26, 3]
- 각 x, y를 +2 해준 후 이를 곱한 값이 brown+red를 합한 값과 일치하는 것을 골라낸다.
- 고른 값은
[[8, 6]]
이런 식으로 되어있기 때문에shift()
로 빼서return
한다.
물론 더 쉬운 방법도 있겠지만, 나는 이렇게 생각해냈다. 효율성이 좋은 코드인지는 잘 모르겠다 ㅎㅎㅎ 하지만 완전탐색 문제니까.. 그정도는 감안..? ㅎ
첫 코테를 봤는데, 어떤 부분이 부족하고, 어디를 더 중점해서 공부해야 할 지 감이 잡힌 것 같다. 결과는 겸허히 받아들이고, 이젠 작은 프로젝트도 하면서 다양하게 공부해야겠다.