스터디/알고리즘 스터디

[백준 알고리즘] 1431 시리얼 번호 (21.05.09)

sleesm 2021. 5. 9. 20:28

이전 이야기 ....

 

 

2021.05.09 - [분류 전체보기] - [백준 알고리즘] 1181 단어 정렬 (21.05.09)

 

[백준 알고리즘] 1181 단어 정렬 (21.05.09)

이전 이야기 .... 2021.05.09 - [알고리즘 스터디] - [백준 알고리즘] 11650 좌표 정렬하기 (21.05.09) [백준 알고리즘] 11650 좌표 정렬하기 (21.05.09) 오늘은 바로바로 정렬 입니다요!!!! 그래서 오늘의 문제는

sleecode.tistory.com

 

 

 


 

 

마지막 정렬 문제는 !!!!!!!!!!

 

 

백준 1431 시리얼 번호

 

 

입력

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

 

출력

첫째 줄부터 차례대로 N개의 줄에 한줄에 하나씩 시리얼 번호를 정렬한 결과를 출력한다.

 

 

문제 사이트 : www.acmicpc.net/problem/1431

 

1431번: 시리얼 번호

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

www.acmicpc.net

 

 


 

여기서 핵심 포인트!!!

 

 

- 숫자를 어떻게 뽑아내는지

 

- 정렬을 어떻게 할 것인가

 


 

 

 

 

 

직접 작성해본 소스코드 및 간단한 설명

 

import java.util.Arrays;
import java.util.Comparator;
import java.util.Scanner;

public class Main {

	static int N;
	
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner sc = new Scanner(System.in);
		N = sc.nextInt();
		String[] word = new String[N];
		for(int i = 0; i< N; i++) {
			word[i] = sc.next();
		}
		
		Arrays.sort(word, new Comparator<String>() {		
			@Override
			public int compare(String s1, String s2) {
				if(s1.length() == s2.length()) {
					int sum1 = 0; int sum2 = 0;
					for(int i = 0; i < s1.length(); i++) {
						if(s1.charAt(i) >= '0' && s1.charAt(i) <= '9')
							sum1 += s1.charAt(i) - '0';
						if(s2.charAt(i) >= '0' && s2.charAt(i) <= '9')
							sum2 += s2.charAt(i) - '0';
					}
					
					if(sum1 == sum2) {
						return s1.compareTo(s2);
					}
					
					return sum1 - sum2;
				}else {
					return s1.length() - s2.length();
				}
			}
		});
		
		for (int i = 0; i < N; i++) {
			System.out.println(word[i]);
		}
	}
}

 

 

 

간단하게 코드를 설명하자면

 

 

사실 이전 코드와 별 다를 게 없다!!!!

 

  • 길이가 같은 경우, 숫자만 받아와서 sum 비교하기

 


 

이때 사용되는 개념들은 

 

저번 주에 설명한 .charAt()을 참고하면 될 것 같다!

 

 

2021.05.02 - [알고리즘 스터디] - [백준 알고리즘] 2178 미로 탐색 (21.05.02)

 

[백준 알고리즘] 2178 미로 탐색 (21.05.02)

이전 이야기 .... 2021.05.02 - [알고리즘 스터디] - [백준 알고리즘] 11724 연결 요소의 개수 (21.05.02) [백준 알고리즘] 11724 연결 요소의 개수 (21.05.02) 이전 이야기 .... 2021.05.02 - [알고리즘 스터디]..

sleecode.tistory.com

 


 

 

 

  • sum 같은 경우에 사전식 비교 해주기

 

  • 나머지 경우, 길이 비교해주기

 

 

 

 

 

 


 

 

백준 알고리즘

 

채점 결과!!!

 

 

 

다행히 맞았습니다!!

 

 

백준 알고리즘 1431번 채점 결과

 

 

 

 

 

 

 


스터디하면서 나온 더 좋은 것들?

  • 위 문제는 영어로만 되어 있는 경우 숫자 합을 0으로 해줘야 한다
  • num을 먼저 만들고 나서 숫자 0과 9로 비교할 수 있다
  • sum 함수를 따로 빼내면 좋다 (-> Clean Code)
  • python의 경우 filter(str.isdigit, x) 를 사용하면 숫자만 받아와서 sum을 할 수 있다

 

 

 

 

 

 

 

그럼 오늘 스터디도 끝!!!!!!!!!!!!!!!!!!