문제 : 장난꾸러기 현수
문제 설명
현수네 반에는 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;
}
풀이
- 입력된 학생 수 배열을 복사해 sortedArr 에 저장 후 오름차순 정렬
- 정렬된 배열과 기존 입력된 학생 수 배열을 비교하여 달라진 부분의 주소 값에 + 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);
풀이
- 입력된 학생 수 배열을 순회 하면서 현재 i 번째 학생과 i+1 번째 학생의 키를 비교해 i 번째 학생이 더 큰 경우 즉 현수의 위치를 특정해 위치 값을 저장하고 정답배열에도 저장
- 현수의 위치를 특정해 위치 값을 저장한 이후부터 현수의 위치 값을 활용해 현수의 키보다 같거나 작은 학생의 인덱스를 secondIdx 에 저장해가며 최종적으로 현수의 기존자리 이자 현재 짝궁이 위치한 인덱스를 가지게 됩니다.
- 위 작업이 끝난후 secondIdx 즉 짝궁의 인덱스도 정답배열에 추가합니다.
오류
- 문제에서 주어진 2번째 입력예제처럼 짝궁과 바꾼 현수의 자리에서 바로 다음 학생의 키가 현수와 동일한 경우 위 방식처럼 키차이를 확인해서 현수의 위치를 확인할 수 없다.
- 마찬가지로 현수의 위치를 특정할 수 없기 때문에 현수 위치를 기준으로 짝궁의 위치를 특정했던 방식도 오류가 생긴다.
해결
맨처음 적어둔 것 처럼 현수가 장난친 현재 학생순서를 오름차순으로 정렬하여 학생순서를 비교해서 다른 두 학생의 위치를 특정하여 정답배열에 추가하는 방식으로 변경
참고
'코딩 테스트 문제 및 풀이' 카테고리의 다른 글
[JS] 코딩 테스트 문제 : 이분검색 [이진 탐색] (0) | 2024.01.16 |
---|---|
[JS] 코딩 테스트 문제 : 결혼식 (0) | 2024.01.14 |
[JS] 코딩 테스트 문제 : Least Recently Used(카카오 캐시 문제 변형) [삽입정렬] (0) | 2024.01.09 |
[JS] 코딩 테스트 문제 : 삽입 정렬 (0) | 2024.01.09 |
[JS] 코딩 테스트 문제 : Special Sort(구글 인터뷰) [버블정렬] (0) | 2024.01.09 |