설명
새 학기가 시작되었습니다. 철수는 새 짝꿍을 만나 너무 신이 났습니다.
철수네 반에는 N명의 학생들이 있습니다.
선생님은 반 학생들에게 반 번호를 정해 주기 위해 운동장에 반 학생들을 키가 가장 작은 학생부터 일렬로 키순으로 세웠습니다.
제일 앞에 가장 작은 학생부터 반 번호를 1번부터 N번까지 부여합니다. 철수는 짝꿍보다 키가 큽니다.
그런데 철수가 앞 번호를 받고 싶어 짝꿍과 자리를 바꿨습니다.
선생님은 이 사실을 모르고 학생들에게 서있는 순서대로 번호를 부여했습니다.
철수와 짝꿍이 자리를 바꾼 반 학생들의 일렬로 서있는 키 정보가 주어질 때 철수가 받은 번호와 철수 짝꿍이 받은 번호를
차례로 출력하는 프로그램을 작성하세요.
입력
첫 번째 줄에 자연수 N(5<=N<=100)이 주어진다.
두 번째 줄에 제일 앞에부터 일렬로 서있는 학생들의 키가 주어진다.
키(높이) 값 H는 (120<=H<=180)의 자연수 입니다.
출력
첫 번째 줄에 철수의 반 번호와 짝꿍의 반 번호를 차례로 출력합니다.
예시 입력 1
9
120 125 152 130 135 135 143 127 160
예시 출력 1
3 8
힌트
출력해설 : 키 정보 152가 철수이고, 127이 철수 짝꿍입니다.
문제 해결
진짜 말 그대로 장난꾸러기 문제다..ㅋㅋㅋㅋㅋㅋㅋ 잘못 정렬되어 있는 곳을 찾으면 되는 문제이다!
그래서 입력받을 키랑 제대로 정렬된 키를 담을 배열, 총 2개를 만들어주었다.
키를 입력받아주고, 입력받은 키를 sortedHeights 배열에도 똑같이 넣어준다.
Scanner in = new Scanner(System.in);
int N = in.nextInt();
int[] heights = new int[N];
int[] sortedHeights = new int[N];
for(int i = 0; i < N; i++) {
heights[i] = in.nextInt();
sortedHeights[i] = heights[i];
}
그리고 비교를 위해 sortedHeights를 정렬해준다!!
Arrays.sort(sortedHeights);
철수와 짝꿍의 위치를 저장하는 변수로 철수는 Cheolsu, 짝꿍은 Partner 로 두고 초기값은 -1로 설정한다.
int Cheolsu = -1;
int Partner = -1;
이제 N번을 돌며 정렬되지 않은 배열 (입력받은 장난 섞인 배열)과 정렬한 배열을 비교해 바뀐 인덱스를 찾으면 된다.
달라지는 지점에 만약 철수의 위치를 모르면 그 위치에 철수의 위치를 저장한다. (무조건 철수가 앞!!!)
만약 철수의 위치를 이미 안다면, 그 이후 발견되는 바뀐 인덱스는 짝꿍의 위치이므로 짝꿍의 위치를 저장해준다.
이 때 인덱스는 0부터 시작되기 때문에 +1을 해서 저장해준다.
for (int i = 0; i < N; i++) {
if (heights[i] != sortedHeights[i]) { //입력된 키랑 실제 정렬 키랑 비교
if (Cheolsu == -1) {
Cheolsu = i + 1;
} else { //철수 위치를 이미 알면, 이제 발견되는 위치는 파트너 위치
Partner = i + 1;
break;
}
}
}
그리고 위치를 출력해주면 끝!!!
(올릴 때는 둘의 위치를 바꿔줬는데, 지금 생각하니까 왜 바꿨는지 모르겠당 그냥 둘의 위치만 출력해주면 되는 문제!)
최종 코드
import java.util.Arrays;
import java.util.Scanner;
public class P06_장난꾸러기 {
public static void main(String[] args) {
//실제 : 짝꿍 -> 철수
//장난 : 철수 -> 짝꿍
Scanner in = new Scanner(System.in);
int N = in.nextInt();
int[] heights = new int[N];
int[] sortedHeights = new int[N];
for(int i = 0; i < N; i++) {
heights[i] = in.nextInt();
sortedHeights[i] = heights[i];
}
Arrays.sort(sortedHeights);
int Cheolsu = -1;
int Partner = -1;
for (int i = 0; i < N; i++) {
if (heights[i] != sortedHeights[i]) { //입력된 키랑 실제 정렬 키랑 비교
if (Cheolsu == -1) {
Cheolsu = i + 1;
} else { //철수 위치를 이미 알면, 이제 발견되는 위치는 파트너 위치
Partner = i + 1;
break;
}
}
}
System.out.println(Cheolsu + " " + Partner);
}
}
'알고리즘 문제풀이 입문: 코딩테스트 대비 > 섹션 6. Sorting, Searching(정렬, 이분검색과 결정)' 카테고리의 다른 글
이분검색 (0) | 2024.04.20 |
---|---|
좌표 정렬 (compareTo) (0) | 2024.04.20 |
중복 확인 (0) | 2024.04.19 |
Least Recently Used (0) | 2024.04.19 |
삽입 정렬 (0) | 2024.04.18 |