백준 10811번을 풀어보았다.
처음에는 못 풀었는데 찾아보니 reverse 메소드라는 것을 알게되어 reverse 메소드를 이용해 풀어보았다.
let [[N, M], ...input] = require('fs').readFileSync('/dev/stdin').toString().split('\n').map((i) => i.split(' ').map(Number))
let basket = []
for (let i = 0; i < N; i++) {
basket.push(i+1)
}
for (let i = 0; i < M; i++) {
const start = Number(input[i][0])
const end = Number(input[i][1])
let arr = []
for (let j = start - 1; j < end; j++) {
arr.push(basket[j])
}
arr.reverse()
basket.splice(start - 1, end - start + 1, ...arr)
}
console.log(basket.join(" "))
reverse 메소드는 배열의 순서를 반전시켜주는 메소드이다.
i번째 바구니부터 j번째 바구니까지의 순서를 반전시킨다고 할 때 i를 start로, j를 end로 정의하였고
start번째 바구니부터 end번째 바구니를 arr 배열에 저장한 후* arr 배열을 반전시켰다.
이후 basket 배열의 start-1번째부터 end-start+1개의 원소를 splice한 후 해당 위치에 arr 배열을 삽입하였다.
* 바구니 관점에서는 start, end번째이지만 basket의 인덱스 관점에서는 start-1, end-1번째이다.
정답을 출력하긴 하였으나 위 코드를 다음과 같이 수정할 수도 있다.
fill 메소드
앞서 여러차례 fill 메소드를 다뤘었다.
참고) 백준 5597번
fill 메소드를 다루면서 항상 아쉬웠던 점이 '동일한 값만 대입할 수 있나? 규칙이 있는 서로 다른 값들은 대입 못 하나?' 였는데
fill 메소드와 map 메소드를 함께 사용하면 이를 해결할 수 있다.
먼저 원래 코드는 for문을 사용해 basket 배열에 1부터 5까지의 값을 추가하였지만
let basket = []
for (let i = 0; i < N; i++) {
basket.push(i+1)
}
아래와 같이 fill 메소드와 map 메소드를 함께 사용하면 basket 배열에 손쉽게 1부터 5까지의 값을 추가할 수 있다.
let basket = Array(N).fill(1).map((value, index) => value + index)
let basket = Array(N).fill().map((value, index) => index + 1)
구조 분해 할당
원래 코드는 start와 end를 다음과 같이 각각 구하였지만
const start = Number(input[i][0])
const end = Number(input[i][1])
아래와 같이 구조 분해 할당을 사용하면 start와 end를 한 번에 구할 수 있다.
const [start, end] = input[i].split(" ").map(Number)
💫 이 문제를 통해 배운 것
• reverse 메소드는 배열의 순서를 반전시켜주는 메소드이다.
• fill 메소드와 map 메소드를 함께 사용하면 배열에 규칙이 있는 서로 다른 값들을 대입할 수 있다.
'Algorithm > Baekjoon' 카테고리의 다른 글
백준 2743번, 9086번 (0) | 2024.10.31 |
---|---|
백준 1546번 (0) | 2024.10.31 |
백준 5597번 (0) | 2024.10.29 |
백준 10810번, 10813번 (0) | 2024.10.10 |
백준 10818번 (0) | 2024.10.10 |