[백준/node.js] 10810 공 넣기, 10813 공 바꾸기, 10811 바구니 뒤집기

ssamu·2023년 10월 8일
0
post-thumbnail

업로드중..

문제:

  • 도현이는 바구니를 총 N개 가지고 있고, 각각의 바구니에는 1번부터 N번까지 번호가 매겨져 있다. 또, 1번부터 N번까지 번호가 적혀있는 공을 매우 많이 가지고 있다. 가장 처음 바구니에는 공이 들어있지 않으며, 바구니에는 공을 1개만 넣을 수 있다. [1,2,3,4,5...N개의 바구니] 하지만 처음 바구니는 공이 들어있지 않으니 [0,0,0,0...N]

예제 입력:

5 4
1 2 3
3 4 4
1 4 1
2 2 2

해설: 총 바구니는 N(5)개이며 M(4)번 반복한다.
첫번째줄 해석: 1번부터 2번 바구니에 3번공을 집어넣어라
두번째줄 해석: 3번부터 4번 바구니에 4번공을 집어넣어라
세번째줄 해석: 1번부터 4번 바구니에 1번공을 집어넣어라
네번째줄 해석: 2번부터 2번 바구니에 2번공을 집어넣어라

따라서, 출력은:
javascript 00000 -> 33000 -> 33440 -> 11110 -> 12110


코드:


const [[n, m], ...input] = require("fs").readFileSync(0).toString().split("\n").map(x => x.split(" ").map(Number)); // 1. 구조 분해 할당
let arr = Array(n).fill(0); // 2. n의 수만큼 배열에 0을 fill: [0, 0, 0, 0, 0]
for (let [a, b, c] of input) { // 3. [a,b,c][d,e,f]...등등 input 내 자료형 선택
	for (let i = a - 1; i < b; i++) {
		arr[i] = c; // 4. i부터 b까지 arr[i]에 c를 할당
	}
}
console.log( arr.join(" ") );

1, 구조분해 할당:

n = [5], m = [4], ...input = [1,2,3,3,4,4,1,4,1,2,2,2]

2, fill 메서드:

let arr = Array(n).fill(0) // n(5)의 길이의 배열을 생성 후 0으로 채우기 = [0,0,0,0,0]

3, 구조분해 할당 + for ..of:

for(let[a, b, c] of input){} // input의 수를 [a, b, c] 반복형태로 생성: [1,2,3] [3,4,4] [1,4,1] [2,2,2]

4, for문으로 반복 후 출력 값 얻기

arr[idx] = c; // i부터 b까지 arr[i]에 c를 할당 (예시: 두번째줄[3,4,4]= arr[2]부터 arr[3]까지 4를 할당. 즉 3번4번에 4를 할당!


10813 문제:

  • 도현이는 바구니를 총 N개 가지고 있고, 각각의 바구니에는 1번부터 N번까지 번호가 매겨져 있다. 바구니에는 공이 1개씩 들어있고, 처음에는 바구니에 적혀있는 번호와 같은 번호가 적힌 공이 들어있다. [1,2,3,4,5...N개의 바구니]
  • 도현이는 앞으로 M번 공을 바꾸려고 한다. 도현이는 공을 바꿀 바구니 2개를 선택하고, 두 바구니에 들어있는 공을 서로 교환한다.
  • 공을 어떻게 바꿀지가 주어졌을 때, M번 공을 바꾼 이후에 각 바구니에 어떤 공이 들어있는지 구하는 프로그램을 작성하시오.

예제 입력:

5 4
1 2
3 4
1 4
2 2

해설: 총 바구니는 N(5)개이며 M(4)번 반복한다.
첫번째줄 해석: 1번과 2번 바구니의 공을 바꿔라
두번째줄 해석: 3번과 4번 바구니의 공을 바꿔라
세번째줄 해석: 1번과 4번 바구니의 공을 바꿔라
네번째줄 해석: 2번과 2번 바구니의 공을 바꿔라

따라서, 출력은:
javascript 12345 -> 21345 -> 21435 -> 31425 -> 31425


코드:


const [[n, m], ...input] = require("fs").readFileSync(0).toString().split("\n").map(x => x.split(" ").map(Number)); // 구조 분해 할당
let arr =  Array(n + 1).fill().map((v, i) => i); // [0,1,2,3,4,5]
for (let [i, j] of input) {
	let num = arr[i];
	arr[i] = arr[j];
	arr[j] = num;
}
console.log(arr.slice(1).join(" ")); // 맨 앞 제거: .slice(1)


10811 문제:

  • 도현이는 바구니를 총 N개 가지고 있고, 각각의 바구니에는 1번부터 N번까지 번호가 순서대로 적혀져 있다. 바구니는 일렬로 놓여져 있고, 가장 왼쪽 바구니를 1번째 바구니, 그 다음 바구니를 2번째 바구니, ..., 가장 오른쪽 바구니를 N번째 바구니라고 부른다.
  • 도현이는 앞으로 M번 바구니의 순서를 역순으로 만들려고 한다. 도현이는 한 번 순서를 역순으로 바꿀 때, 순서를 역순으로 만들 범위를 정하고, 그 범위에 들어있는 바구니의 순서를 역순으로 만든다.
  • 첫째 줄에 N (1 ≤ N ≤ 100)과 M (1 ≤ M ≤ 100)이 주어진다.
  • 둘째 줄부터 M개의 줄에는 바구니의 순서를 역순으로 만드는 방법이 주어진다.

예제 입력:

5 4
1 2
3 4
1 4
2 2

해설: 총 바구니는 N(5)개이며 M(4)번 반복한다.
첫번째줄 해석: 1번부터 2번 바구니에 공을 역순으로 집어넣어라
두번째줄 해석: 3번부터 4번 바구니에 공을 역순으로 집어넣어라
세번째줄 해석: 1번부터 4번 바구니에 공을 역순으로 집어넣어라
네번째줄 해석: 2번부터 2번 바구니에 공을 역순으로 집어넣어라

따라서, 출력은:
javascript 12345 -> 21345 -> 21435 -> 34125 -> 34125


코드:


let input = require("fs").readFileSync(0).toString().split("\n");
let [N, M] = input[0].split(" ").map(Number); // 첫째줄 주어진 값 input[0]
let basket = Array(N).fill(1).map((a, b) => a + b);

for (let i = 1; i <= M; i++) { // 둘째줄부터의 계산에 필요한 값 input[i]
  let [a, b] = input[i].split(" ").map(Number);
  let arr = [];

  for (let j = a - 1; j < b; j++) {
    arr.push(basket[j]);
  }

  arr.reverse();
  basket.splice(a - 1, b - a + 1, ...arr);
}

console.log(basket.join(" "));

0개의 댓글