코딩가딩가

[JAVA]BOJ 10431, 줄세우기

Noooodle 2024. 5. 22. 01:23

이 문제는 두 가지 방법으로 풀 수 있다. 배열을 직접 이동시키거나 단순히 횟수만 세거나..

 

배열을 직접 만들어서 이동시키는 것은 insertion sort이다. 응용도 아닌 그저 삽입정렬 그 잡채.. 

insertion sort에 관해서 포스팅을 했으므로 링크를 첨부한다. 

https://noooodlefts.tistory.com/25

 

[Algorithm]Sort, 정렬(1)

정렬은 말 그대로 순서대로 정리하는 것을 의미한다. 뒤죽박죽인 숫자를 오름차순, 내림차순으로 정렬할 수 있다. 뭐 그런 것들.. 데이터들을 정리할때 필요하다. 정렬 알고리즘은 여러가지가

noooodlefts.tistory.com

 

 

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class BOJ10431 {
    // insertion sort
    public static int insertion_sort(int[] arr, int size){
        int i, j, k, tmp, cnt = 0;
        // i는 이번 순서를 뜻함, arr[i]는 이번에 정렬할 값
        // k는 arr[i]의 알맞은 자리

        for(i=2;i<size;i++){
            for(j=1;j<i;j++){ // 정렬되지 않은 값(arr[i]) 넣을 자리 찾기
                if(arr[j] > arr[i]) // 정렬된 배열 안에서 arr[i]의 알맞은 자리를 찾은 경우
                    break;
            }
            if(j == i) // 예외처리, arr[i]의 현재 자리가 알맞은 자리인 경우 == arr[i]가 arr[i-1]보다 큰 수
                continue; // 정렬되어있으므로 다음 값 확인

            // arr[i]를 정렬된 배열 사이에 삽입
            tmp = arr[i]; // arr[i] tmp에 저장

            for(k=i;k>j;k--){ // arr[i-1]부터 한 칸씩 뒤로 미루기
                arr[k] = arr[k - 1];
                cnt++;
            }
            
            arr[k] = tmp; // arr[i]를 알맞은 자리에 넣기
        }
        return cnt;
    }
    public static void main(String[] args) throws IOException {
        BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
        int T, i, j;
        String str;
        StringTokenizer st;
        int [] arr = new int[21];

        T = Integer.parseInt(bf.readLine()); // 횟수 입력받기

        for(i=0;i<T;i++){
            str = bf.readLine(); // 한 줄 읽기
            st = new StringTokenizer(str);
            for(j=0;j<21;j++){
                arr[j] = Integer.parseInt(st.nextToken());
            }
            System.out.println(arr[0]+" "+insertion_sort(arr,21));
        }

//        for(i=0;i<21;i++)
//            System.out.print(arr[i] + " ");
//        System.out.println();

    }
}

 

단순히 횟수를 세는 경우는 해당 숫자 보다 큰 수가 앞에 얼마나 있는지 계산하면 된다.

이런식으로.. 코드는 짜지 않았다.

'코딩가딩가' 카테고리의 다른 글

[JAVA]BOJ 3273, 두 수의 합  (0) 2024.07.10
[JAVA]BOJ 10989, 수 정렬하기 3  (0) 2024.05.22
[JAVA]BOJ 1236, 성 지키기  (0) 2024.05.16
[JAVA]배열  (1) 2024.03.23
[JAVA]BOJ 10158  (1) 2024.01.16