https://www.acmicpc.net/problem/1431
1431번: 시리얼 번호
첫째 줄에 기타의 개수 N이 주어진다. N은 50보다 작거나 같다. 둘째 줄부터 N개의 줄에 시리얼 번호가 하나씩 주어진다. 시리얼 번호의 길이는 최대 50이고, 알파벳 대문자 또는 숫자로만 이루어
www.acmicpc.net
sort의 comparator에서 조건문을 if(!=)로 하면 더 깔끔해질 수도 있다. 자릿수 합을 구하는 부분을 함수로 바꾸면 더욱 깔끔할 듯하다.
import java.io.*;
import java.util.*;
public class Main
{
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
int n = Integer.valueOf(br.readLine());
String[] input = new String[n];
for(int i=0;i<n;i++){
input[i]=br.readLine();
}
Arrays.sort(input,(s1,s2)->{
if(s1.length()==s2.length()){
int sum1 = 0;
int sum2 = 0;
for(int i=0;i<s1.length();i++){
int temp1 = (int)s1.charAt(i)-48;
int temp2 = (int)s2.charAt(i)-48;
if(temp1<10){
sum1+=temp1;
}
if(temp2<10){
sum2+=temp2;
}
}
if(sum1==sum2) return s1.compareTo(s2);
return sum1-sum2;
}
return s1.length()-s2.length();
});
for(int i=0;i<n;i++){
bw.write(input[i]+"\n");
}
bw.flush();
}
}
import java.util.Arrays;
import java.util.Scanner;
class Serial {
public Serial(String serial) {
this.serial = serial;
for (int i = 0; i < serial.length(); i++)
if ('0' <= serial.charAt(i) && serial.charAt(i) <= '9')
sum += serial.charAt(i) - '0';
}
String serial;
int sum;
}
class Main
{
public static void main (String[] args) {
Scanner sc = new Scanner(System.in);
int N = sc.nextInt();
Serial[] serials = new Serial[N];
for (int i = 0; i < N; i++)
serials[i] = new Serial(sc.next());
Arrays.sort(serials, (o1, o2) -> {
if (o1.serial.length() != o2.serial.length())
return o1.serial.length() - o2.serial.length();
if (o1.sum != o2.sum)
return o1.sum - o2.sum;
return o1.serial.compareTo(o2.serial);
});
for (Serial s : serials)
System.out.println(s.serial);
}
}
'Problem Solving > 정렬' 카테고리의 다른 글
BOJ18310 안테나(R) (1) | 2024.02.07 |
---|---|
BOJ1931 회의실 배정(R) 대표문제 (1) | 2024.02.06 |
BOJ2910 빈도 정렬 (0) | 2024.02.06 |
BOJ18870 좌표압축 (0) | 2024.02.06 |
BOJ1302 베스트셀러 (0) | 2024.02.06 |
https://www.acmicpc.net/problem/1431
1431번: 시리얼 번호
첫째 줄에 기타의 개수 N이 주어진다. N은 50보다 작거나 같다. 둘째 줄부터 N개의 줄에 시리얼 번호가 하나씩 주어진다. 시리얼 번호의 길이는 최대 50이고, 알파벳 대문자 또는 숫자로만 이루어
www.acmicpc.net
sort의 comparator에서 조건문을 if(!=)로 하면 더 깔끔해질 수도 있다. 자릿수 합을 구하는 부분을 함수로 바꾸면 더욱 깔끔할 듯하다.
import java.io.*;
import java.util.*;
public class Main
{
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
int n = Integer.valueOf(br.readLine());
String[] input = new String[n];
for(int i=0;i<n;i++){
input[i]=br.readLine();
}
Arrays.sort(input,(s1,s2)->{
if(s1.length()==s2.length()){
int sum1 = 0;
int sum2 = 0;
for(int i=0;i<s1.length();i++){
int temp1 = (int)s1.charAt(i)-48;
int temp2 = (int)s2.charAt(i)-48;
if(temp1<10){
sum1+=temp1;
}
if(temp2<10){
sum2+=temp2;
}
}
if(sum1==sum2) return s1.compareTo(s2);
return sum1-sum2;
}
return s1.length()-s2.length();
});
for(int i=0;i<n;i++){
bw.write(input[i]+"\n");
}
bw.flush();
}
}
import java.util.Arrays;
import java.util.Scanner;
class Serial {
public Serial(String serial) {
this.serial = serial;
for (int i = 0; i < serial.length(); i++)
if ('0' <= serial.charAt(i) && serial.charAt(i) <= '9')
sum += serial.charAt(i) - '0';
}
String serial;
int sum;
}
class Main
{
public static void main (String[] args) {
Scanner sc = new Scanner(System.in);
int N = sc.nextInt();
Serial[] serials = new Serial[N];
for (int i = 0; i < N; i++)
serials[i] = new Serial(sc.next());
Arrays.sort(serials, (o1, o2) -> {
if (o1.serial.length() != o2.serial.length())
return o1.serial.length() - o2.serial.length();
if (o1.sum != o2.sum)
return o1.sum - o2.sum;
return o1.serial.compareTo(o2.serial);
});
for (Serial s : serials)
System.out.println(s.serial);
}
}
'Problem Solving > 정렬' 카테고리의 다른 글
BOJ18310 안테나(R) (1) | 2024.02.07 |
---|---|
BOJ1931 회의실 배정(R) 대표문제 (1) | 2024.02.06 |
BOJ2910 빈도 정렬 (0) | 2024.02.06 |
BOJ18870 좌표압축 (0) | 2024.02.06 |
BOJ1302 베스트셀러 (0) | 2024.02.06 |