본문 바로가기
JS/백준

[백준JS] 10811. 바구니 뒤집기

by 박기린 2023. 3. 12.

안녕하세요. 박기린 입니다.

백준 10811번 바구니 뒤집기 문제를 풀어봅시다.

 

 

문제 링크

https://www.acmicpc.net/problem/10811

 

 

 


문제 해석

 

N개의 바구니가 있습니다. 원활한 설명을 위해, N이 6이라고 가정을 합니다.

각 바구니에는 순서에 맞는 숫자가 담겨 있습니다.

 

 

 

입력으로는 [i, j]가 들어옵니다.

i부터 j까지의 바구니에, 안에 들어 있던 숫자를 역순으로 다시 담습니다.

 

 

 

[ i = 1, j = 3 ] 이라고 가정을 합니다.

첫 번째부터 세 번째까지의 바구니에, 안에 들어 있던 숫자를 역순으로 담아줍니다.

 

[i, j]가 총 M번이 주어지는데, 모두 실행을 한 뒤에 결과값을 출력하는 게 10811 - 바구니 뒤집기 문제 입니다.

 


정답 코드

const fs = require("fs");

const [MnN, ...exes] = fs
  .readFileSync("/dev/stdin")
  .toString()
  .trim()
  .split("\n");
const [n, m] = MnN.split(" ").map((e) => +e);
const baskets = new Array(n).fill(0).map((v, i) => i + 1);
let result = "";

const execute = (str) => {
  const [i, j] = str.split(" ").map((e) => +e);
  const tempBaskets = [...baskets];

  for (let x = 0; x <= j - i; x++) {
    baskets[j - x - 1] = tempBaskets[i + x - 1];
  }
};

exes.forEach(execute);
baskets.forEach((e) => (result += `${e} `));
console.log(result);

 

 

 

 


정답 코드 풀이

const fs = require("fs");

const [MnN, ...exes] = fs
  .readFileSync("/dev/stdin")
  .toString()
  .trim()
  .split("\n");
const [n, m] = MnN.split(" ").map((e) => +e);
1. fs모듈을 이용해서 input을 받아옵니다.
2. split('\n')을 이용해서 input을 줄 간격으로 나눈 후 Array에 담습니다. 이 Array를 비구조화 해서, 첫 번째 줄은 MnN, 나머지는 exes 상수에 저장을 합니다.
3. MnN은 split(' ')을 이용해서 띄어쓰기 간격으로 나눈 후, Array 비구조화를 이용해서 n과 m으로 분리하여 저장합니다.

 

 

 

const baskets = new Array(n).fill(0).map((v, i) => i + 1);

new 연산자와 Array 생성자 함수, fill(0) 내장함수를 이용해서 n개의 element가 존재하는 Array를 만들고,

map() 함수를 이용해서 각 element는 순서에 맞는 숫자가 담겨 있도록 합니다.

그리고 baskets라는 상수에 Array를 저장합니다.

 

 

const execute = (str) => {
  const [i, j] = str.split(" ").map((e) => +e);
  const tempBaskets = [...baskets];

  for (let x = 0; x <= j - i; x++) {
    baskets[j - x - 1] = tempBaskets[i + x - 1];
  }
};

execute라는 함수를 만듭니다.

이 함수는 [i, j]가 담긴 String을 인수로 받을 함수입니다.

 

1. [i, j]가 담긴 String을 split(' ')을 이용해서 Array로 변환하고, Array 비구조화로 i, j라는 각각의 상수로 분해합니다.
2. tempBaskets(temporary baskets - 임시 바구니들) Array를 만듭니다. 이 안에는 baskets의 깊은 복사를 한 값을 넣어줍니다.

3. x는 0부터 (j - i) 까지 반복하는 for 반복문을 만듭니다.
4. baskets의 (j - x)번째에 tempBaskets의 (i + x)번째 숫자가 담기도록 합니다. -> 역순으로 숫자가 담깁니다.
5. Array는 zero-based라서 0부터 시작하기 때문에, baskets와 temBaskets의 elements를 탐색할 때 '-1' 을 붙여줍니다.

 

 

exes.forEach(execute);

[i, j] String들이 담긴 Array인 exes에 forEach() 내장함수를 사용합니다. 그리고 forEach()의 인수로 execute 함수의 포인터를 연결합니다. 그러면 baskets Array에는 원하는 결과값이 담깁니다. 입맛대로 baskets Array의 elments를 출력해주면 됩니다.

반응형