(알고리즘) 장난꾸러기 현수


새 학기가 시작되었습니다. 현수는 새 짝꿍을 만나 너무 신이 났습니다.
현수네 반에는 N명의 학생들이 있습니다.
선생님은 반 학생들에게 반 번호를 정해 주기 위해 운동장에 반 학생들을 키가 가장 작은 학 생부터 일렬로 키순으로 세웠습니다. 제일 앞에 가장 작은 학생부터 반 번호를 1번부터 N번까 지 부여합니다. 현수는 짝꿍보다 키가 큽니다. 그런데 현수가 앞 번호를 받고 싶어 짝꿍과 자 리를 바꿨습니다. 선생님은 이 사실을 모르고 학생들에게 서있는 순서대로 번호를 부여했습니 다.
현수와 짝꿍이 자리를 바꾼 반 학생들의 일렬로 서있는 키 정보가 주어질 때 현수가 받은 번 호와 현수 짝꿍이 받은 번호를 차례로 출력하는 프로그램을 작성하세요.

입력설명

첫 번째 줄에 자연수 N(5<=N<=100)이 주어진다.
두 번째 줄에 제일 앞에부터 일렬로 서있는 학생들의 키가 주어진다. 키(높이) 값 H는 (120<=H<=180)의 자연수 입니다.

출력설명

첫 번째 줄에 현수의 반 번호와 짝꿍의 반 번호를 차례로 출력합니다.

입력예제 1

  • 120 125 152 130 135 135 143 127 160

출력예제

  • 3, 8
  • 출력해설 : 키 정보 152가 현수이고, 127이 현수 짝꿍입니다.

문제풀이

배열의 깊은 복사로 풀이할 수 있는 문제
주어진 배열 중에 원본 배열은 비교할때 사용해야 하기 때문에, sorted = arr.slice()로 깊은 복사한다. 이 배열을 sort 함수로 오름차순 정렬을 원본배열을 직접 비교한다.

const arr = [120, 125, 152, 130, 135, 135, 143, 127, 160];

function solutions(arr) {
  let answer = [];
  let sorted = arr.slice().sort((a, b) => a - b);
  for (let i = 0; i < arr.length; i++) {
    if(arr[i] !== temp[i]) {
      answer.push(i+1);
    }
  }
  return answer;
}

console.log(solutions(arr));


다른 문제 풀이

버블정렬을 응용해 뒤에서부터 배열을 탐색한다.
if 값에 해당하는 인덱스 값을 변수 idx에 저장해놓고, swap값을 증가시킨다.
idx값과 idx-swap값을 answer에 push한다

function solution(arr){
	let answer=[];
	let swap=idx=0;

	for (let i=arr.length-1; i>=0; i--) {
    	if (arr[i-1] > arr[i]) {
      		idx=i;
      		[arr[i-1], arr[i]] = [arr[i], arr[i-1]];
      		swap++;
	    }
 	 }
	answer.push(idx);
  	answer.push(idx+swap);
  	return answer;
}

let arr=[120, 125, 152, 130, 135, 135, 143, 127, 160];
console.log(solution(arr));
function solution(arr) {
    let sortArr = [...arr];
    let ans = [];
    sortArr.sort((a, b) => a - b);
 
    arr.forEach((val, idx) => {
        if (val !== sortArr[idx]) {
            ans.push(idx+1)
        }
    });
 
    return ans.join(" ");
}

난 이방법이 제일 마음에 든다.

좋은 웹페이지 즐겨찾기