티스토리 뷰

반응형

■ 문제

원본 사이트: https://www.hackerrank.com/challenges/new-year-chaos/problem?h_l=interview&playlist_slugs%5B%5D=interview-preparation-kit&playlist_slugs%5B%5D=arrays 

 

New Year Chaos | HackerRank

Determine how many bribes took place to get a queue into its current state.

www.hackerrank.com

 

난이도: Medium

최대 스코어: 40

 

● 문제 요약

  • 새해 첫 날 사람들은 롤러코스터를 타기 위해 줄을 서 있는 상태
  • 사람들은 모두 1부터 n까지의 queue에서 자신의 초기 위치를 나타내는 스티커를 붙이고 있음
  • 바로 앞 사람에게 뇌물을 주고 자리를 바꿀 순 있지만 자신의 초기 위치 스티커는 변하지 않음
  • 한 사람당 최대 두 명에게 뇌물을 줄 수 있음
  • 주어진 q(queue) 순서가 되기 위한 최소 뇌물 수를 return
  • 두 명 이상 뇌물을 받은 사람이 있는 경우 'Too chaotic'을 return

 

예시:

q = [1, 2, 3, 5, 4, 6, 7, 8]
  • 5와 4만 서로 자리를 바꾸면 됨

==> return 1

 

q = [4, 1, 2, 3]
  • 4가 맨 뒤로 가야하는데, 그러려면 1, 2, 3 세 명에게 뇌물을 주어야 함

==> return 'Too chaotic'

 

 

■ 문제 풀이

배열 a를 거꾸로 순회하며 초기 위치와 얼마나 차이나는지 비교한다.

만약, 현재 위치가 초기 위치보다 3 이상 차이나면 뇌물을 세 번 이상 준 것이기 때문에 'Too chaotic'을 return한다.
그리고 현재 위치와 초기 위치가 다를 때에는 자리를 바꿔 원래 위치를 찾아가도록 하고 카운트를 추가해준다.

 

● 완성 코드 - 40 Points (Max)

'use strict';

process.stdin.resume();
process.stdin.setEncoding('utf-8');

let inputString = '';
let currentLine = 0;

process.stdin.on('data', inputStdin => {
    inputString += inputStdin;
});

process.stdin.on('end', _ => {
    inputString = inputString.replace(/\s*$/, '')
        .split('\n')
        .map(str => str.replace(/\s*$/, ''));

    main();
});

function readLine() {
    return inputString[currentLine++];
}

// Complete the minimumBribes function below.
function minimumBribes(q) {
    let cnt = 0;
    for(let i=q.length; i>0; i--){
        if(q[i-1] > i+2){
            console.log('Too chaotic');
            return;
        }
        if(q[i-1] != i){
            if(q[i-2] == i){
                [q[i-2], q[i-1]] = [q[i-1], q[i-2]];
                cnt++;
            }
            else if(q[i-3] == i){
                [q[i-3], q[i-2], q[i-1]] = [q[i-2], q[i-1], q[i-3]];
                cnt += 2;
            }
        }
    }
    console.log(cnt);
    return;
}

function main() {
    const t = parseInt(readLine(), 10);

    for (let tItr = 0; tItr < t; tItr++) {
        const n = parseInt(readLine(), 10);

        const q = readLine().split(' ').map(qTemp => parseInt(qTemp, 10));

        minimumBribes(q);
    }
}
반응형
댓글
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
글 보관함