문제
https://www.acmicpc.net/problem/1427
1427번: 소트인사이드
첫째 줄에 정렬하려고 하는 수 N이 주어진다. N은 1,000,000,000보다 작거나 같은 자연수이다.
www.acmicpc.net
1. 배열의 인덱스를 값으로 활용하는 방식을 잘 사용하지 못해 해당 부분에 주의를 기울여 보고자 한다.
2. 내가 작성한 코드는 정답이지만 최대값일 때 인덱스를 idx에 따로 저장을 해서 문제 해결을 했다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main1427 {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String N = br.readLine();
int[] arr = new int[N.length()];
for (int i=0; i<N.length(); i++) {
arr[i] = N.charAt(i)-'0';
}
for (int i=0; i<arr.length; i++) {
int max = 0;
int idx = -1;
for (int j=i; j<arr.length; j++) {
if (arr[j] > max) {
max = arr[j];
idx = j;
}
}
if (idx == -1) {
continue;
}
arr[idx] = arr[i];
arr[i] = max;
}
for (int i=0; i<arr.length; i++) {
System.out.print(arr[i]);
}
}
}
3. 책에서 나온 정답 코드이다. 최대값 max에 인덱스 자체를 넣는다. 그 후 swap을 통해 문제해결을 한다.
import java.util.Scanner;
public class P1427_내림차순정렬 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String str = sc.next();
int[] A = new int[str.length()];
for (int i = 0; i < str.length(); i++) {
A[i] = Integer.parseInt(str.substring(i, i + 1));
}
for (int i = 0; i < str.length(); i++) {
int Max = i;
for (int j = i + 1; j < str.length(); j++) {
if (A[j] > A[Max]) //내림차순이므로 최대 값을 찾음
Max = j;
}
if (A[i] < A[Max]) {
int temp = A[i];
A[i] = A[Max];
A[Max] = temp;
}
}
for (int i = 0; i < str.length(); i++) {
System.out.print(A[i]);
}
}
}
정리 : 어렵지 않은 문제지만 종종 문제 풀이에서 결정적인 키가 되는 배열의 인덱스를 값으로 활용하기.. 이전 문제들에서도 이런 활용이 종종 나왔는데 아직도 익숙하지 않은듯하다. 이번 문제를 계기로 앞으론 해당 방법을 활용하는것을 잊지말자.
'백준' 카테고리의 다른 글
백준 11004번 자바 ☆ (0) | 2023.01.17 |
---|---|
백준 11399번 자바 (0) | 2023.01.10 |
백준 1377번 자바 (0) | 2023.01.07 |
백준 2164번 자바 (0) | 2023.01.06 |
백준 17298번 자바 ☆ (0) | 2023.01.04 |