ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • section6.6
    알고리즘 2025. 8. 21. 21:55
    새 학기가 시작되었습니다. 철수는 새 짝꿍을 만나 너무 신이 났습니다.
    철수네 반에는 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
    6
    120 130 150 150 130 150
    
    125 < 152 > 130
    150 > 130 < 150
    
    출력예제 2
    3 5

     

     

     

    ANSWER

    package practice.section6;
    
    import java.util.Scanner;
    
    public class Question6 {
        public static void main(String[] args) {
            Scanner sc = new Scanner(System.in);
            int n = sc.nextInt();
            int[] arr = new int[n];
            for (int i = 0; i < n; i++) {
                arr[i] = sc.nextInt();
            }
    
            for (int x : solution(n, arr)) {
                System.out.print(x + " ");
            }
        }
    
        public static int[] solution(int n, int[] arr) {
            int[] answer = new int[2];
            int tmpIdx = 0;
    
            for (int i = 0; i < n-1; i++) {
                if ((arr[i] < arr[i+1] && arr[i+1] > arr[i+2])
                || (arr[i] > arr[i+1]) && arr[i+1] < arr[i+2]) {
                    tmpIdx = i+1;
                    break;
                }
            }
    
            int realIdx = 0;
    
            // arr[tmpIdx]의 원래 위치 찾기 > 삽입정렬
            for (int i = 0; i < n-1; i++) {
                if (arr[i] <= arr[tmpIdx] && arr[tmpIdx] < arr[i+2] && arr[tmpIdx] != arr[i+1]) {
                    realIdx = i+1;
                    break;
                }
            }
    
            realIdx++;
            tmpIdx++;
    
            if (tmpIdx > realIdx) {
                answer[0] = realIdx;
                answer[1] = tmpIdx;
            } else {
                answer[0] = tmpIdx;
                answer[1] = realIdx;
            }
    
            return answer;
        }
    }
    • 정답은 맞았는데 런타임 오류
    • 위치 틀린 숫자를 찾고 삽입정렬로 풀면 될 것 같은데 ... if에 조건이 너무 많았나 싶다
    • 아니면 오름차순으로 정렬해서 두 개의 배열 비교해서 인덱스 찾아내는 방법이 있을 것 같긴 한데 지금 섹션이랑 안 맞는 풀이인 것 같아서 시도 안 했다

     

     

     

    SOLUTION

    public class Answer6 {
        public static void main(String[] args) {
            Scanner sc = new Scanner(System.in);
            int n = sc.nextInt();
            int[] arr = new int[n];
            for (int i = 0; i < n; i++) {
                arr[i] = sc.nextInt();
            }
    
            for (int x : solution(n, arr)) {
                System.out.print(x + " ");
            }
        }
    
        public static ArrayList<Integer> solution(int n, int[] arr) {
            ArrayList<Integer> answer = new ArrayList<>();
            int[] tmp = arr.clone();
            Arrays.sort(tmp);
            for (int i = 0; i < n; i++) {
                if (arr[i] != tmp[i]) {
                    answer.add(i+1);
                }
            }
            return answer;
        }
    }
    • 근데? 내가 원래 생각하던 풀이가 맞았음 ... ㅎ
    728x90

    '알고리즘' 카테고리의 다른 글

    section6.8  (0) 2025.08.26
    section6.7  (1) 2025.08.26
    section6.5  (0) 2025.08.21
    section6.4  (0) 2025.08.20
    section6.3  (0) 2025.08.20
Designed by Tistory.