문제
www.hackerrank.com/challenges/new-year-chaos/problem?h_l=interview&playlist_slugs%5B%5D%5B%5D=interview-preparation-kit&playlist_slugs%5B%5D%5B%5D=arrays&isFullScreen=true
풀이
- arr[i] = i+1 형태의 배열을 만든다.
- 이 배열을 입력배열 q와 똑같이 만들 수 있는지 판별하고 swap cnt를 기록한다.
- idx=0부터 증가하면서 조건을 만족하며 swap해 가면 반드시 본래위치에 idx+2 이하에 들어가야 하는 값이 있어야 한다.
- 조건 만족하면 cnt기록, 조건만족하지 않으면 종료시킨다.
코드
'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 answer = 0;
let arr = Array(100001);
let arrCnt = Array(100001);
for(let i=0;i<arr.length;++i) {
arr[i] = i+1;
}
for(let i=0;i<q.length-1;++i) {
let originValue = q[i];
if(arr[i] !== originValue) {
if(arr[i+1] !== originValue) {
if(arr[i+2] !== originValue) {
return 'Too chaotic';
}
let temp = arr[i+2];
arr[i+2] = arr[i+1];
arr[i+1] = temp;
answer++;
}
let temp = arr[i+1];
arr[i+1] = arr[i];
arr[i] = temp;
answer++;
}
}
return answer;
}
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));
console.log(minimumBribes(q));
}
}