본문 바로가기
Algorithm/Baekjoon

백준 10811번

by minhi 2024. 10. 31.

백준 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 메소드를 다뤘었다.

 

참고) 백준 10810번, 10813번

참고) 백준 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