https://school.programmers.co.kr/learn/courses/30/lessons/87390
문제 설명
정수 n, left, right가 주어집니다. 다음 과정을 거쳐서 1차원 배열을 만들고자 합니다.
- n행 n열 크기의 비어있는 2차원 배열을 만듭니다.
- i = 1, 2, 3, ..., n에 대해서, 다음 과정을 반복합니다.
- 1행 1열부터 i행 i열까지의 영역 내의 모든 빈 칸을 숫자 i로 채웁니다.
- 1행, 2행, ..., n행을 잘라내어 모두 이어붙인 새로운 1차원 배열을 만듭니다.
- 새로운 1차원 배열을 arr이라 할 때, arr[left], arr[left+1], ..., arr[right]만 남기고 나머지는 지웁니다.
정수 n, left, right가 매개변수로 주어집니다. 주어진 과정대로 만들어진 1차원 배열을 return 하도록 solution 함수를 완성해주세요.
푼 코드
function solution(n, left, right) {
var temp = [];
for (let i = left + 1; i <= right + 1; i++) {
const x = i % n || n;
const y = Math.ceil(i / n);
temp.push(Math.max(x, y));
}
return temp;
}
console.log(solution(3, 2, 5));
처음에는 예제의 그림을 보고 그대로 구현해서 제출했다.
블록의 숫자는 그 숫자의 행과 열 중 높은 값으로 구성된다. 1열 3행에 있는 블록이면 그 숫자는 3이고 5행 4열에 있는 블록의 숫자는 5가 된다. 구현한 후 필요한 블록만 slice해서 제출했더니 런타임 오류가 떴다.
그래서 배열을 전부 만든 다음 자르지 말고 사용하는 개별 블록만 구성하자 하고 특징을 파악하기 시작했다.
각 블록의 숫자와 n의 관계를 파악해보니 해당 숫자와 n을 나눈 나머지가 x축(행), 몫은 y축(열)이었다.
이를 활용하여 코드를 구현했지만 일부 숫자가 제대로 표현되지 않았다. 나머지가 0이 되는 경우가 있었기 때문인데 나머지가 0인 경우는 n과 동일하다고 보정해주면 답이 정상적으로 출력된다.
예제 그림에서는 블록이 1부터 시작하여 비슷한 환경에서 문제를 풀기 위해 left와 right에 1을 더해 반복문을 구성했다.
'알고리즘' 카테고리의 다른 글
[프로그래머스] 기능개발 (0) | 2023.07.14 |
---|---|
[프로그래머스] 오픈채팅방 (0) | 2023.07.12 |
[프로그래머스] 귤 고르기 (0) | 2023.05.01 |
[프로그래머스] 피보나치 수 (0) | 2023.03.26 |
[Leetcode] Best Time to Buy and Sell Stock II (0) | 2023.03.18 |
댓글