문제 : https://www.acmicpc.net/problem/1431

 

1431번: 시리얼 번호

첫째 줄에 기타의 개수 N이 주어진다. N은 1,000보다 작거나 같다. 둘째 줄부터 N개의 줄에 시리얼 번호가 하나씩 주어진다. 시리얼 번호의 길이는 최대 50이고, 알파벳 대문자 또는 숫자로만 이루

www.acmicpc.net

문제 요약 : 주어진 문자열 정렬 후 출력

입력 출력
1 ≤ N(문자 개수) ≤ 1000
1 ≤ l(문자 길이) ≤ 50

문자 출력 우선순위
1. 길이가 짧은 것
2. 자리수의 합이 작은것(숫자만 계산)
3. 사전 순

JAVA

소스코드 : https://github.com/cbkpar/BOJ/blob/main/boj_10205.java

채점 번호 아이디 문제 번호 결과 메모리 시간 언어 코드 길이
30905045 cbkpar 1431 맞았습니다!! 14300KB 128ms Java 11 1231B
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;

public class Main {
	
	public static void main(String args[]) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringBuilder sb = new StringBuilder();
		int t,i;
		t = Integer.parseInt(br.readLine());
		ArrayList<chr> arr = new ArrayList<chr>();
		for(i=0;i<t;i++) {
			String str = br.readLine();
			arr.add(new chr(str,num(str)));
		}
		Collections.sort(arr, new Comparator<chr>() {
			@Override
			public int compare(chr o1, chr o2) {
				if(o1.str.length()!=o2.str.length()) {
					return o1.str.length()-o2.str.length();
				}else if(o1.n!=o2.n){
					return o1.n-o2.n;
				}else{
					return o1.str.compareTo(o2.str);
				}
			}
		});
		for(chr s:arr) sb.append(s.str+"\n");
		System.out.println(sb);
	}
	
	static int num(String str) {
		int n = 0;
		for(int i=0;i<str.length();i++) if(str.charAt(i)>='0'&&str.charAt(i)<='9') n+=str.charAt(i)-'0';
		return n;
	}
	
	public static class chr {
		String str;
		int n;
		
		public chr(String str, int n) {
			this.str = str;
			this.n = n;
		}
	}
}

chr이라는 클래스를 만들어 문자와 문자에 포함되는 숫자의 합을 저장해준다.

이때 문자의 숫자 합은 단어를 한 글자 씩 확인하며 계산한다.

그 이후에 Collections.sort()를 이용해 정렬해준다.

+ Recent posts