문제 링크 : https://www.acmicpc.net/problem/1431
1431번: 시리얼 번호
첫째 줄에 기타의 개수 N이 주어진다. N은 50보다 작거나 같다. 둘째 줄부터 N개의 줄에 시리얼 번호가 하나씩 주어진다. 시리얼 번호의 길이는 최대 50이고, 알파벳 대문자 또는 숫자로만 이루어
www.acmicpc.net
문제
다솜이는 기타를 많이 가지고 있다. 그리고 각각의 기타는 모두 다른 시리얼 번호를 가지고 있다. 다솜이는 기타를 빨리 찾아서 빨리 사람들에게 연주해주기 위해서 기타를 시리얼 번호 순서대로 정렬하고자 한다.
모든 시리얼 번호는 알파벳 대문자 (A-Z)와 숫자 (0-9)로 이루어져 있다.
시리얼번호 A가 시리얼번호 B의 앞에 오는 경우는 다음과 같다.
- A와 B의 길이가 다르면, 짧은 것이 먼저 온다.
- 만약 서로 길이가 같다면, A의 모든 자리수의 합과 B의 모든 자리수의 합을 비교해서 작은 합을 가지는 것이 먼저온다. (숫자인 것만 더한다)
- 만약 1,2번 둘 조건으로도 비교할 수 없으면, 사전순으로 비교한다. 숫자가 알파벳보다 사전순으로 작다.
시리얼이 주어졌을 때, 정렬해서 출력하는 프로그램을 작성하시오.
입력
첫째 줄에 기타의 개수 N이 주어진다. N은 50보다 작거나 같다. 둘째 줄부터 N개의 줄에 시리얼 번호가 하나씩 주어진다. 시리얼 번호의 길이는 최대 50이고, 알파벳 대문자 또는 숫자로만 이루어져 있다. 시리얼 번호는 중복되지 않는다.
출력
첫째 줄부터 차례대로 N개의 줄에 한줄에 하나씩 시리얼 번호를 정렬한 결과를 출력한다.


# 문제 풀이
sort를 override하여 문제 조건에 맞게 정렬을 진행하면 된다.
문제의 정렬 조건은 총 3가지 이다. 2개의 문자열 o1, o2를 비교 한다고 가정했을 때
1. o1의 문자열 길이와 o2의 문자열의 길이를 비교 짧은 문자열을 먼저 출력한다.
2. 두 문자열의 길이가 같을 때 각 문자열에 포함되어 있는 수들의 합이 작은 순서대로 출력한다.
3. 합도 같다면 사전순으로 출력한다.
## 시리얼 키 갯수를 입력 받은 후 입력 받은 수만큼의 배열을 만들고 입력받는다.
int n = sc.nextInt();
String[] arr = new String[n];
for(int i = 0; i < n; i++){
arr[i] = sc.next();
}
## sort 를 override 한다.
Arrays.sort(arr, new Comparator<String>(){
@Override
public int compare(String o1, String o2){
if(o1.length() < o2.length()){
return -1;
}
else if(o1.length() == o2.length()){
if(add(o1) == add(o2)){
return o1.compareTo(o2);
}
else{
return Integer.compare(add(o1), add(o2));
}
}
else{
return 1;
}
}
});
일단 길이를 통해 3가지 경우를 작성한다.
길이가 같을 때는 문자열에 포함되어있는 모든 상수를 더한 값을 리턴하는 add함수를 실행 하여 비교한다.
## add 함수
static int add(String s){
int sum = 0;
for(int i = 0; i < s.length(); i++){
if(s.charAt(i) >= '0' && s.charAt(i) <= '9'){
sum += s.charAt(i) - '0';
}
}
return sum;
}
# 코드 전체
import java.util.*;
public class Main_1431 {
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
String[] arr = new String[n];
for(int i = 0; i < n; i++){
arr[i] = sc.next();
}
Arrays.sort(arr, new Comparator<String>(){
@Override
public int compare(String o1, String o2){
if(o1.length() < o2.length()){
return -1;
}
else if(o1.length() == o2.length()){
if(add(o1) == add(o2)){
return o1.compareTo(o2);
}
else{
return Integer.compare(add(o1), add(o2));
}
}
else{
return 1;
}
}
});
for(String i : arr){
System.out.println(i);
}
}
static int add(String s){
int sum = 0;
for(int i = 0; i < s.length(); i++){
if(s.charAt(i) >= '0' && s.charAt(i) <= '9'){
sum += s.charAt(i) - '0';
}
}
return sum;
}
}'[OLD] 기존 글 저장' 카테고리의 다른 글
| 백준 1026번 JAVA 풀이 - 보물 (2) | 2022.07.12 |
|---|---|
| 백준 2303번 JAVA 풀이 - 숫자 게임 (0) | 2022.07.11 |
| 백준 1302번 JAVA 풀이 - 베스트셀러 (0) | 2022.07.06 |
| [프로그래머스] 위클리 챌린지 Level 1 - 최소직사각형 (0) | 2022.07.05 |
| 백준 2149번 JAVA 풀이 - 암호 해독 (0) | 2022.07.04 |