[코딩테스트] 백준 10811 자바

Henson·2025년 5월 18일

코딩테스트

목록 보기
10/50
post-thumbnail

백준 10811

백준 10811 문제

import java.io.*;
import java.util.*;

public class Boj10811 {

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());

        int n = Integer.parseInt(st.nextToken());
        int m = Integer.parseInt(st.nextToken());
        int[] arr = new int[n];

        for (int i = 0; i < n; i++) {
            arr[i] = i + 1;
        }

        for (int k = 0; k < m; k++) {
            st = new StringTokenizer(br.readLine());
            int i = Integer.parseInt(st.nextToken()) - 1; // i의 값은 실제 인덱스보다 1 크기 때문에 -1를 해준다.
            int j = Integer.parseInt(st.nextToken()) - 1; // j의 값은 실제 인덱스보다 1 크기 때문에 -1를 해준다.

            while (i < j) { // 투포인터 알고리즘으로 i는 1씩 증가 j는 1씩 감소시킬 것이기 때문에 i가 j보다 작을 떄까지 반복한다.
                int temp = arr[i]; // 배열의 i값을 temp 변수에 담아둔다.
                arr[i] = arr[j]; // 배열의 i값과 배열의 j값을 바꾼다.
                arr[j] = temp; // 배열의 i값에 temp 값을 넣어준다.
                i++; // i의 값을 1 증가시킨다.
                j--; // j의 값을 1 감소시킨다.
            }
        }
        for (int i = 0; i < arr.length; i++) {
            System.out.print(arr[i] + " "); // 배열의 값을 출력한다.
        }
    }
}

풀이

  1. 이 문제는 투포인터 알고리즘을 이용하여 주어진 범위의 양 끝의 인덱스를 서로 바꿔주고, 범위를 좁혀가면서 바꿔주면 된다.
  2. 입력받은 범위값인 ij는 실제 인덱스보다 1씩 크기 때문에 -1를 해준다.
  3. 역순으로 배치를 할 떄에 범위 ij보다 커질 수 없기 때문에 i < j를 조건으로 반복한다.
  4. temp 변수에 배열 i의 값을 담아둔다.
  5. 배열 i에 배열 j의 값을 담는다.
  6. 배열 jtemp의 값을 담는다.
  7. i값은 증가, j값은 감소시킨다.
  8. 반복문을 끝나면 배열의 값을 출력한다.
profile
세계 최고의 개발자가 되고 말겠어.

0개의 댓글