URL : https://school.programmers.co.kr/learn/courses/30/lessons/87390?language=javascript
문제
문제 설명
정수 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 함수를 완성해주세요.
제한사항
1 ≤ n ≤ 107
0 ≤ left ≤ right < n2
right - left < 105
입출력 예
n | left | right | result |
3 | 2 | 5 | [3,2,2,3] |
4 | 7 | 14 | [4,3,3,3,4,4,4,4] |
입출력 예 설명
입출력 예 #1
다음 애니메이션은 주어진 과정대로 1차원 배열을 만드는 과정을 나타낸 것입니다.

입출력 예 #2
다음 애니메이션은 주어진 과정대로 1차원 배열을 만드는 과정을 나타낸 것입니다.

◆ JS
계획
1. 2차배열을 만들고 -> 1차배열로 바꾼 뒤 -> left ~ right 값을 가진 배열 출력
✅2. left ~ right 값만 만들어서 출력
1. left, right값을 n 으로 나눠서 행 열의 위치 찾기.
2.행보다 열의 값이 작거나 같으면 값은 행+1
3.행보다 열의 값이 크면 값은 열+1
4. left, right사이의 값을 배열로 만들어 출력
답
const solution = (n, left, right) => {
let answer = [];
for (let k = left; k <= right; k++) {
const [iK, jK] = [Math.floor(k / n) + 1, (k % n) + 1];
if (iK >= jK) {
answer.push(iK);
} else {
answer.push(jK);
}
}
return answer;
};
코드 간략화하기
const solution = (n, left, right) => {
const answer = [];
for (let k = left; k <= right; k++) {
answer.push(Math.max(Math.floor(k / n), k % n) + 1);
}
return answer;
};
다른사람 답
function solution(n, left, right) {
const result = [];
// left부터 right까지 각 인덱스에 대해 값 계산
for (let k = left; k <= right; k++) {
const row = Math.floor(k / n); // 행 인덱스
const col = k % n; // 열 인덱스
const value = Math.max(row, col) + 1; // 해당 위치의 값
result.push(value);
}
return result;
}
function solution(n, left, right) {
var answer = [];
for (let i = left; i <= right; i++) {
answer.push(Math.max(i % n, parseInt(i / n)) + 1)
}
return answer;
}
const solution = (x,y,z) => Array.from({length:z-y+1},(_,index)=>(index+y)%x<parseInt((index+y)/x)+1?parseInt((index+y)/x)+1:(index+y)%x+1)
const solution = (x, y, z) => Array.from({length: z - y + 1}, (_, i) => Math.max(Math.floor((y + i) / x), (y + i) % x) + 1);
1. Array.from
- Array.from({length: z - y + 1}, 매핑 함수):
- z - y + 1은 right - left + 1, 즉 반환할 배열의 길이.
- 이 메서드는 길이가 z - y + 1인 배열을 생성하며, 각 요소는 두 번째 인수(매핑 함수)의 결과로 채워짐.
- 첫 번째 인수 {length: z - y + 1}는 배열-like 객체로, Array.from이 이를 기반으로 배열 생성.
2. 매핑 함수
- (_, index) => ...:
- _: 첫 번째 매개변수는 사용되지 않으므로 _로 표시 (관례).
- index: 배열 인덱스 (0부터 z - y까지).
- index + y: 실제 1차원 배열의 인덱스 k를 의미 (k = left + index, 즉 y + index).
참고
arr .from : https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/from
'코딩 테스트 > 알고리즘' 카테고리의 다른 글
알고리즘 88번 : 행렬의 곱셈 - js (0) | 2025.04.17 |
---|---|
86번 - H-Index js (0) | 2025.03.23 |
알고리즘 85번 - 연속 부분 수열 합의 개수 (0) | 2025.03.04 |
알고리즘 84-괄호 회전하기 (0) | 2025.02.28 |
알고리즘 83 -귤 고르기 (0) | 2025.02.25 |