https://www.acmicpc.net/problem/1015
문제
P[0], P[1], ...., P[N-1]은 0부터 N-1까지(포함)의 수를 한 번씩 포함하고 있는 수열이다. 수열 P를 길이가 N인 배열 A에 적용하면 길이가 N인 배열 B가 된다. 적용하는 방법은 B[P[i]] = A[i]이다.
배열 A가 주어졌을 때, 수열 P를 적용한 결과가 비내림차순이 되는 수열을 찾는 프로그램을 작성하시오. 비내림차순이란, 각각의 원소가 바로 앞에 있는 원소보다 크거나 같을 경우를 말한다. 만약 그러한 수열이 여러개라면 사전순으로 앞서는 것을 출력한다.
입력
첫째 줄에 배열 A의 크기 N이 주어진다. 둘째 줄에는 배열 A의 원소가 0번부터 차례대로 주어진다. N은 50보다 작거나 같은 자연수이고, 배열의 원소는 1,000보다 작거나 같은 자연수이다.
출력
첫째 줄에 비내림차순으로 만드는 수열 P를 출력한다.
예제 입력 1 복사
3
2 3 1
예제 출력 1 복사
1 2 0
문제풀이(1)
주어진 수들을 비내림차순 즉 오름차순으로 만드는 수열을 만들면 되는 문제이다.
A배열을 오름차순으로 정렬한 것과 정렬하지 않은 기본의 A배열을 가지고 비교하면된다.
const filePath = process.platform === "linux" ? "/dev/stdin" : "./input.txt";
const input = require("fs").readFileSync(filePath).toString().trim().split("\n");
const N = Number(input[0]);
const A = input[1].split(" ").map(Number);
const sortedA = input[1]
.split(" ")
.map(Number)
.sort((a, b) => a - b);
const P = Array(N).fill(-1);
A.forEach((num, idx) => {
P[idx] = sortedA.findIndex((sortedNum, sortedNumIdx) => {
if (sortedNum === num && !P.includes(sortedNumIdx)) return true;
});
});
console.log(P.join(' '));
문제풀이(2) - 리팩토링
1. 가속성 향상을 위한 변수명 변경
2. Array.prototype.map 과 Array.prototype.indexOf 를 사용하여 코드를 간결하게 작성
const filePath = process.platform === "linux" ? "/dev/stdin" : "./input.txt";
const input = require("fs").readFileSync(filePath).toString().trim().split("\n");
const originalArray = input[1].split(" ").map(Number);
const sortedArray = [...originalArray].sort((a, b) => a - b);
const positionInSortedArray = originalArray.map((num) => {
const position = sortedArray.indexOf(num);
sortedArray[position] = null; // 이 위치의 값을 null로 변경하여 더 이상 선택되지 않게 한다.
return position;
});
console.log(positionInSortedArray.join(' '));
'Algorithm' 카테고리의 다른 글
[Baekjoon]2578번 빙고 - Javascript (1) | 2023.12.27 |
---|---|
[Baekjoon]2847번 게임을 만든 동준이 - Javascript (0) | 2023.12.26 |
[Baekjoon]6956번 돌 게임 2 - Javascript (0) | 2023.12.25 |
[Baekjoon] 1940번 주몽 - Javascript (0) | 2023.12.25 |
[Baekjoon]3986번 좋은단어 - Javascript (1) | 2023.12.22 |