안녕하세요. 박기린 입니다.
백준 10812번 바구니 순서 바꾸기 문제를 풀어봅시다.
문제 링크
https://www.acmicpc.net/problem/10812
문제 해석
N개의 바구니가 있습니다. 원활한 설명을 위해, N이 7이라고 가정을 합니다.
각 바구니에는 순서에 맞는 숫자가 담겨 있습니다.
입력으로는 [i, j, k]가 들어옵니다.
i부터 j까지의 바구니에, k번째 숫자부터 다시 담습니다.
i < k < j 인 조건으로 값이 주어집니다.
[ i = 2, j = 5, k = 7 ] 이라고 가정을 합니다.
두 번째부터 일곱 번째까지의 바구니에, k 번째 바구니에 들어있던 숫자부터 차례대로 담습니다.
j 번째 바구니의 숫자까지 담았다면, i 번째 바구니의 숫자부터 차례대로 담아줍니다.
[i, j, k]가 총 M번이 주어지는데, 모두 실행을 한 뒤에 결과값을 출력하는 게 10812 - 바구니 순서 바꾸기 문제 입니다.
정답 코드
const fs = require("fs");
const [NnM, ...exes] = fs
.readFileSync("/dev/stdin")
.toString()
.trim()
.split("\n");
const [n, m] = NnM.split(" ").map((e) => +e);
let baskets = new Array(n).fill(0).map((v, i) => i + 1);
const execute = (str) => {
const [i, j, k] = str.split(" ").map((e) => +e - 1);
const tempBaskets = [...baskets];
baskets = tempBaskets
.slice(0, i)
.concat(tempBaskets.slice(k, j + 1).concat(tempBaskets.slice(i, k)))
.concat(tempBaskets.slice(j + 1, tempBaskets.length));
};
exes.forEach(execute);
console.log(baskets.join(' '));
정답 코드 풀이
const fs = require("fs");
const [NnM, ...exes] = fs
.readFileSync("/dev/stdin")
.toString()
.trim()
.split("\n");
const [n, m] = NnM.split(" ").map((e) => +e);
1. fs모듈을 이용해서 input을 받아옵니다.
2. split('\n')을 이용해서 input을 줄 간격으로 나눈 후 Array에 담습니다. 이 Array를 비구조화 해서, 첫 번째 줄은 MnN, 나머지는 exes 상수에 저장을 합니다.
3. MnN은 split(' ')을 이용해서 띄어쓰기 간격으로 나눈 후, Array 비구조화를 이용해서 n과 m으로 분리하여 저장합니다.
let 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, k] = str.split(" ").map((e) => +e - 1);
const tempBaskets = [...baskets];
baskets = tempBaskets
.slice(0, i)
.concat(tempBaskets.slice(k, j + 1).concat(tempBaskets.slice(i, k)))
.concat(tempBaskets.slice(j + 1, tempBaskets.length));
};
execute라는 함수를 만듭니다.
이 함수는 [i, j, k]가 담긴 String을 인수로 받을 함수입니다.
1. [i, j, k]가 담긴 String을 split(' ')을 이용해서 Array로 변환하고, Array 비구조화로 i, j, k라는 각각의 상수로 분해합니다.
2. tempBaskets(temporary baskets - 임시 바구니들) Array를 만듭니다. 이 안에는 baskets의 깊은 복사를 한 값을 넣어줍니다.
3. tempBaskets를 [ 0 부터 i ] + [ k 부터 j ] + [ i 부터 k ] + [ j 부터 끝 ] 요소로 분해(slice)한 후, 다시 합쳐줍니다(concat).
4. 그렇게 재구조한 Array를 baskets에 다시 정의합니다.
exes.forEach(execute);
console.log(baskets.join(' '));
forEach()와 execute 함수를 이용해서 모든 [i, j, k]를 실행하고, 적절한 방식으로 출력하면 됩니다.
'JS > 백준' 카테고리의 다른 글
[백준JS] 2563. 색종이 (0) | 2023.03.31 |
---|---|
[백준JS] 1316. 그룹 단어 체커 (0) | 2023.03.24 |
[백준JS] 10809. 알파벳 찾기 (0) | 2023.03.17 |
[백준JS] 1152. 단어의 개수 (반례 설명 포함) (0) | 2023.03.15 |
[백준JS] 11654. 자바스크립트 아스키 코드 출력하기 (ASCII) (0) | 2023.03.14 |