문제

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

풀이

  1. arr[i] = i+1 형태의 배열을 만든다.
  2. 이 배열을 입력배열 q와 똑같이 만들 수 있는지 판별하고 swap cnt를 기록한다.
  3. idx=0부터 증가하면서 조건을 만족하며 swap해 가면 반드시 본래위치에 idx+2 이하에 들어가야 하는 값이 있어야 한다.
  4. 조건 만족하면 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));
    }
}

+ Recent posts