본문 바로가기
코딩 테스트 문제 및 풀이

[JS] 코딩 테스트 문제 : 장난꾸러기 현수

by spare8433 2024. 1. 10.

문제 : 장난꾸러기 현수



문제 설명

 

현수네 반에는 N명의 학생들이 있습니다.
선생님은 반 학생들에게 반 번호를 정해 주기 위해 운동장에 반 학생들을 키가 가장 작은 학생부터 일렬로 키순으로 세웠습니다. 제일 앞에 가장 작은 학생부터 반 번호를 1번부터 N번까지 부여합니다.

 

현수는 짝꿍보다 키가 큽니다. 그런데 현수가 앞 번호를 받고 싶어 짝꿍과 자리를 바꿨습니다. 선생님은 이 사실을 모르고 학생들에게 서있는 순서대로 번호를 부여했습니다.

 

현수와 짝꿍이 자리를 바꾼 반 학생들의 일렬로 서있는 키 정보가 주어질 때 현수가 받은 번호와 현수 짝꿍이 받은 번호를 차례로 출력하는 프로그램을 작성하세요.



내코드

 

function solution(arr) {
  let answer = [];
  let  sortedArr  = [...arr].sort((a, b) =>  a  -  b);

  console.log("입력된 초기 배열: ", ...arr);
  console.log("정렬된 배열: ", ...sortedArr);

  // 두 배열을 i 번째 값들을 비교하여 다른 경우만 정답 배열에 추가
  arr.forEach((num, i) => {
    if (sortedArr[i] !== num) answer.push(i + 1);
  });
  return answer;
}



풀이

 

  1. 입력된 학생 수 배열을 복사해 sortedArr 에 저장 후 오름차순 정렬
  2. 정렬된 배열과 기존 입력된 학생 수 배열을 비교하여 달라진 부분의 주소 값에 + 1 하여 정답 배열에 추가



※ 오답 노트

초기에 고안한 한번의 for 문안에서 특정 학생 위치에서 다음 학생과 키를 비교했을 때 오히려 큰 경우를 찾아 현수의 위치를 특정한 이후 마찬가지로 현수의 키를 이용해 현수의 키보다 같거나 작은 학생 중 가장 뒤에 있는 짝궁의 위치를 특정해 정답배열에 추가하는 방식

 

let firstIdx = -1;
let secondIdx = -1;
for (let i = 0; i < arr.length - 1; i++) {
  if (firstIdx < 0 && arr[i] > arr[i + 1]) {
    firstIdx = i;
    answer.push(firstIdx + 1);
  }

  if (firstIdx > 0 && arr[i] < arr[firstIdx]) {
    secondIdx = i;
  }
}
answer.push(secondIdx + 1);



풀이

 

  1. 입력된 학생 수 배열을 순회 하면서 현재 i 번째 학생과 i+1 번째 학생의 키를 비교해 i 번째 학생이 더 큰 경우 즉 현수의 위치를 특정해 위치 값을 저장하고 정답배열에도 저장
  2. 현수의 위치를 특정해 위치 값을 저장한 이후부터 현수의 위치 값을 활용해 현수의 키보다 같거나 작은 학생의 인덱스를 secondIdx 에 저장해가며 최종적으로 현수의 기존자리 이자 현재 짝궁이 위치한 인덱스를 가지게 됩니다.
  3. 위 작업이 끝난후 secondIdx 즉 짝궁의 인덱스도 정답배열에 추가합니다.



오류

  1. 문제에서 주어진 2번째 입력예제처럼 짝궁과 바꾼 현수의 자리에서 바로 다음 학생의 키가 현수와 동일한 경우 위 방식처럼 키차이를 확인해서 현수의 위치를 확인할 수 없다.
  2. 마찬가지로 현수의 위치를 특정할 수 없기 때문에 현수 위치를 기준으로 짝궁의 위치를 특정했던 방식도 오류가 생긴다.



해결



맨처음 적어둔 것 처럼 현수가 장난친 현재 학생순서를 오름차순으로 정렬하여 학생순서를 비교해서 다른 두 학생의 위치를 특정하여 정답배열에 추가하는 방식으로 변경




참고

https://www.inflearn.com/course/%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-%EB%AC%B8%EC%A0%9C%ED%92%80%EC%9D%B4/dashboard