백준 1427번 소트인사이드 자바 Java / 백준 단계별로 풀어보기 9단계 / 9. 정렬
백준 9단계 6번 문제 - 1427 소트인사이드
https://www.acmicpc.net/problem/1427
1427번: 소트인사이드
첫째 줄에 정렬하려고 하는 수 N이 주어진다. N은 1,000,000,000보다 작거나 같은 자연수이다.
www.acmicpc.net
9. 정렬 (6) 백준 1427번 문제 소트인사이드
문제
과정 생각해보기
우선 자리수를 구하기 위해 n을 문자열로 받는다
이후 n의 길이만큼을 크기로 하는 배열을 하나 만드는데,
n을 숫자로 변환하면 int의 범위를 넘어서므로 long 타입을 줘야 한다 - 문자열 n과 구분하여 다른 변수 이름으로 선언
각 자리수의 수는 10의 i제곱을 대상으로 나누거나 나머지를 구하며 만들어낼 수 있다
이후엔 카운팅 정렬을 내림차순으로 정렬해 순서대로 출력하면 될 것 같다
오답
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
|
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
StringBuilder sb = new StringBuilder();
String n = st.nextToken();
long arr[] = new long[n.length()];
long num = Long.parseLong(n);
for(int i = 0; i < n.length(); i++) {
arr[i] = num % (int)Math.pow(10, i+1);
if(arr[i] > 10) {
arr[i] = arr[i] / (int)Math.pow(10, i);
}
}
// System.out.println(Arrays.toString(arr)); //배열 중간 확인용
int count[] = new int[10];
//내림차순 정렬 -카운팅 정렬
for(int i = 0; i < n.length(); i++) {
count[(int)arr[i]]++;
}
// System.out.println(Arrays.toString(count)); //배열 중간 확인용
for(int i = 9; i >= 0; i--) {
while(count[i] > 0) {
sb.append(i);
count[i]--;
}
}
System.out.println(sb);
}
}
|
cs |
나름 잘 구했다고 생각했는데, 마지막 예제 입력인 500613009를 입력하니 다른 값이 나온다
배열을 출력해보면 처음 각 자리수의 숫자를 구할 때부터 잘못 계산되었음을 알 수 있다
정답 인정 코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
|
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
StringBuilder sb = new StringBuilder();
String n = st.nextToken();
long arr[] = new long[n.length()];
for(int i = 0; i < n.length(); i++) {
arr[i] = n.charAt(i) - '0';
}
// System.out.println(Arrays.toString(arr)); //배열 중간 확인용
int count[] = new int[10]; //한 자리수당 범위 0~9
//내림차순 정렬 -카운팅 정렬
for(int i = 0; i < n.length(); i++) {
count[(int)arr[i]]++;
}
// System.out.println(Arrays.toString(count)); //배열 중간 확인용
for(int i = 9; i >= 0; i--) {
while(count[i] > 0) {
sb.append(i);
count[i]--;
}
}
System.out.println(sb);
}
}
|
cs |
그래서 처음부터 문자열을 배열로 만들어서 풀었다
문자열을 배열로 바꾸는 방법과 문자를 숫자로 바꾸는 방법을 이용하여 계산도 이루어질 수 있도록 했다
답을 구했으니 이제 여기서 줄일 수 있는 부분들을 줄여 깔끔한 코드를 만들어보면
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main {
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String n = br.readLine();
int count[] = new int[10]; //한 자리수당 범위 0~9
//내림차순 정렬 -카운팅 정렬
for(int i = 0; i < n.length(); i++) {
count[n.charAt(i) - '0']++;
}
for(int i = 9; i >= 0; i--) {
while(count[i] > 0) {
System.out.print(i);
count[i]--;
}
}
}
}
|
cs |
이와 같다
엄청나게 줄어들었음을 알 수 있다
백준에서 시간 차이는 124ms → 120ms로 줄어들었다
직후 백지 복습
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main {
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String n = br.readLine();
int count[] = new int[10];
for(int i = 0; i < n.length(); i++) {
count[n.charAt(i)-'0']++;
}
for(int i = 9; i >= 0; i--) {
★while★(count[i] > 0) {
System.out.print(i);
count[i]--;
}
}
}
}
|
cs |
★표시는 잘못 적은 부분
쉬운 문제를 빙빙 돌아간 경향이 매우 다분하지만.. 깔끔하게 줄였으니 나름 괜찮다고 본다답이 나왔다면 그 코드의 가독성을 손보는 습관을 길러야겠다