[백준] 1015 수열 정렬 JavaScript

·2024년 4월 6일

문제

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를 출력한다.

예제 입력

8
4 1 6 1 3 6 1 4

예제 출력

4 0 6 1 3 7 2 5

내가 했던 풀이 방법

  1. current 변수를 0으로 초기화해준다. 배열의 원소 중 제일 작은 수가 0이기 때문이다.
  2. counting 변수를 0으로 초기화해준다. n번째로 작은 수를 의미하고, 먼저 등장하는 수일 때 더 작은 수를 부여받는다.
  3. counting이 n과 같아질 때 반복문을 탈출시킨다. 0부터 n-1까지가 P의 원소이기 때문이다.
  4. A[i]가 current와 같은 모든 경우P[i]에 counting을 넣어주고 1을 증가시켜준다. (0부터 진행하여 먼저 등장한 수일 때 더 작은 수를 부여받을 수 있게 해주었다.)
  5. 배열을 전부 확인한 뒤, current를 1 증가시켜주어 4번을 다시 실행해준다.
  6. P 배열의 모든 원소를 출력해준다.

코드

const fs = require('fs');
const [n, input] = fs.readFileSync('/dev/stdin').toString().trim().split('\n');
const A = input.trim().split(' ');

let current = 0;
let counting = 0;
let answer = Array.from({ length: n });

while (true) {
  for (let i = 0; i < n; i++) {
    if (current === parseInt(A[i])) {
      answer[i] = counting++;
    }
  }
  if (counting >= n) break;
  current++;
}

console.log(answer.toString().replaceAll(',', ' '));

회고

잘 구현했다고 생각했는데 자꾸 1%도 안 가서 틀렸습니다.라고 떠서 뭐가 문제일까 한참 고민했는데 출력 형식 문제였다.. 백준으로 JS를 풀 때마다 입출력에서 참 시간을 많이 허비하는 것 같다. 익숙치 않아서 그런거겠지만 백준에서 프로그래머스처럼 보완해주면 좋을 것 같다...ㅎ

profile
Frontend🍓

0개의 댓글