본문 바로가기
Algorithm/백준 알고리즘

[백준알고리즘 / JAVA] 1427번 소트인사이드

by newtownboy 2023. 7. 1.


문제 정보

  • 문제 링크: https://www.acmicpc.net/problem/1427
  • 문제 번호: 1427번
  • 문제 이름: 스택
  • 문제 난이도: 실버 5
 

1427번: 소트인사이드

첫째 줄에 정렬하려고 하는 수 N이 주어진다. N은 1,000,000,000보다 작거나 같은 자연수이다.

www.acmicpc.net


코드

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

public class 백준_1427_소트인사이드 {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        String[] sArray = br.readLine().split("");
        int[] nArray = new int[sArray.length];
        for(int i = 0; i < sArray.length; i++) {
            nArray[i] = Integer.parseInt(sArray[i]);
        }

        for(int i = 0; i < nArray.length - 1; i++) {
            int befPos = i;
            int chgPos = i;
            int maxValue = nArray[i];
            for(int j = i + 1; j < nArray.length; j++) {
                if(maxValue < nArray[j]) {
                    maxValue = nArray[j];
                    chgPos = j;
                }
            }

            if(befPos != chgPos) {
                int temp = nArray[befPos];
                nArray[befPos] = nArray[chgPos];
                nArray[chgPos] = temp;
            }
        }

        for(int index : nArray) {
            System.out.print(index);
        }
    }
}

풀이

Step1: 입력 처리 및 초기화

BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

String[] sArray = br.readLine().split("");
int[] nArray = new int[sArray.length];
for(int i = 0; i < sArray.length; i++) {
    nArray[i] = Integer.parseInt(sArray[i]);
}
  • `BufferedReader`를 사용하여 입력을 받습니다.
  • 문자열을 입력받은 후, 각 문자를 하나씩 나누어 `sArray`배열에 저장합니다.
  • `nArray`배열을 선언하여 문자열을 정수로 변환하여 저장합니다.

Step2: 선택 정렬을 통한 내림차순 정렬

for(int i = 0; i < nArray.length - 1; i++) {
    int befPos = i;
    int chgPos = i;
    int maxValue = nArray[i];
    for(int j = i + 1; j < nArray.length; j++) {
        if(maxValue < nArray[j]) {
            maxValue = nArray[j];
            chgPos = j;
        }
    }

    if(befPos != chgPos) {
        int temp = nArray[befPos];
        nArray[befPos] = nArray[chgPos];
        nArray[chgPos] = temp;
    }
}
  • 선택 정렬 알고리즘을 사용하여 배열을 내림차순으로 정렬합니다.
  • `i`를 0부터 시작하여 `nArray`배열의 길이 -1까지 반복합니다. 이는 정렬의 범위를 나타냅니다.
  • `befPos`변수를 사용하여 현재 비교하는 요소의 위치를 저장합니다.
  • `chgPos`변수를 사용하여 최대값을 가진 요소의 위치를 저장합니다.
  • `maxValue`는 최댓 값을 저장하기 위한 변수로 초기 값으로 현재 요소의 값 `nArray[i]`로 설정합니다.
  • 두 번째 반복문에서 `j`를 `i+1`부터 시작하여 `nArray`배열의 길이만큼 반복문 합니다. 이는 정렬 범위 내에서 최대 값을 찾기 위한 탐색을 의미합니다.
  • `maxValue`와 `nArray[j]`를 비교하여 `maxValue`보다 큰 값을 발견하면 `maxValue`와 `chgPos`를 갱신합니다.
  • 한 번의 탐색이 끝나면 `befPos`와 `chgPos`를 비교하여 위치가 다르면 두 위치에 해당하는 배열의 요소를 교환합니다.

Step3: 정렬된 결과 출력

for (int index : nArray) {
    System.out.print(index);
}
  • 정렬된 결과를 출력합니다. `nArray`배열의 요소를 순서대로 출력합니다.