https://programmers.co.kr/learn/courses/30/lessons/42842
1. 문제에 대한 이해
- 우리가 풀어야 할 문제는 무엇인가?
- 카펫의 가로, 세로 크기를 순서대로 배열에 담아 return - 주어진 자료는 무엇인가?
- 본 카펫에서 갈색 격자의 수 brown
- 노란색 격자의 수 yellow - 조건은 무엇인가?
- 중앙에는 노란색으로 칠해져 있고 테두리 1줄은 갈색으로 칠해져 있는 격자 모양 카펫
- 갈색 격자의 수 brown은 8 이상 5,000 이하인 자연수입니다.
- 노란색 격자의 수 yellow는 1 이상 2,000,000 이하인 자연수입니다.
- 카펫의 가로 길이는 세로 길이와 같거나, 세로 길이보다 깁니다.
2. 계획
- 이 문제를 푸는데 있어서 유용하게 쓸 수 있는 지식은 무엇인가?
- Math.sqrt()
- Math.ceil()
- 카펫이 정사각형인 경우
- brown과 yellow를 더해서 제곱근을 나타냈을때 정수이면 이 정수를 그대로 가로, 세로 길이로 리턴
- 카펫이 직사각형인 경우 -> (yellow가 어떻게 배치되어 있을지 모르니까 yellow의 가로 세로 길이를 구한다)
- for문 -> row는 카펫 전체 가로 길이니까 -2를 해주고 yellow 까지 순회를 한다.
- 이때, i가 yellow의 가로 길이니까 yellow의 세로 길이는 yellow / i 해준다.
- 이제 카펫의 가로 * 세로 길이가 brown이랑 yellow 개수와 같으면 리턴해준다.
3. 실행
- 풀이 계획을 실행하고, 각 단계가 올바른지 점검하라.
const solution = (brown, yellow) => {
let row = Math.sqrt(brown + yellow);
//정사각형인경우
if(Number.isInteger(row) === true){
return [row, row];
} else {
// 직사각형인경우
for (let i = Math.ceil(row) - 2; i <= yellow; i++){
column = yellow / i;
if ((i + 2) * (column + 2) === brown + yellow) {
return [(i + 2) , (column + 2)]
}
}
}
};
test('carpet', () => {
expect(solution(8, 1)).toEqual([3, 3]);
expect(solution(10,2)).toEqual([4,3]);
});
처음에 어떻게 구현해야할지 생각이 안나서 그림을 그려가면서 생각을 해보았다.
먼제 yellow를 놓고 brown을 둘러쌀때 yellow의 변에만 brown을 놓으면
대각선으로 사각형이 추가로 더 필요하다는 것이 보였고
뭔가 이것을 활용해서 풀 수 있을 것 같아서 계획을 작성했고 코드로 구현을 해봤다.
근데 정사각형인 경우에는 brown+yellow한 값의 제곱근이 가로, 세로 길이라는 것을 알았고
정사각형인 경우 바로 쉽게 리턴되기 때문에 먼저 예외처리를 해주었다.
그리고 직사각형인 경우는 그림으로 그려보면서 생각했던,
yellow가 어떻게 배치되는지에 따라서 가로 세로 길이가 바뀌는 점을 생각하면서 해결할 수 있었다.
처음에는 어떻게 풀어야할지 감 조차 오지 않았는데 그림으로 그리면서 생각해보니까 어떻게 풀어야할지에 대한 힌트를 얻을 수 있었다. 그림 문제랑 거리 구하는 문제는 어떻게 풀어야할지 전혀 몰랐었는데 한번 해결해보니까 되게 후련한 기분이었다.
앞으로 더 다양한 문제들을 풀어봐야겠다.
'코테연습' 카테고리의 다른 글
72. 가운데 글자 가져오기 Javascript (0) | 2022.06.30 |
---|---|
71. 오픈채팅방 Javascript (0) | 2022.06.28 |
69. 가장 큰 수 Javascript (0) | 2022.06.24 |
68. 같은 숫자는 싫어 Javascript (0) | 2022.06.23 |
67. 나머지가 1이 되는 수 찾기 (0) | 2022.06.22 |
댓글