Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- array
- geometry
- Class
- Data Structure
- java
- Method
- 구현
- Binary Tree
- bit manipulation
- Matrix
- sorting
- greedy
- Stack
- SQL
- Math
- dynamic programming
- string
- database
- Binary Search
- 자바
- two pointers
- 파이썬
- Tree
- Number Theory
- 코딩테스트
- hash table
- simulation
- Counting
- implement
- 코테
Archives
- Today
- Total
코린이의 소소한 공부노트
[백준 온라인 저지] 1431. 시리얼 번호 본문
1. 입력
- 첫째 줄에 기타의 개수 N이 주어진다. N은 50보다 작거나 같다.
- 둘째 줄부터 N개의 줄에 시리얼 번호가 하나씩 주어진다. 시리얼 번호의 길이는 최대 50이고, 알파벳 대문자 또는 숫자로만 이루어져 있다. 시리얼 번호는 중복되지 않는다.
2. 출력
- 첫째 줄부터 차례대로 N개의 줄에 한줄에 하나씩 다음 조건에 따라 시리얼 번호를 정렬한 결과를 출력한다.
// 시리얼번호 A가 시리얼번호 B의 앞에 오는 경우는 다음과 같다.
- A와 B의 길이가 다르면, 짧은 것이 먼저 온다.
- 만약 서로 길이가 같다면, A의 모든 자리수의 합과 B의 모든 자리수의 합을 비교해서 작은 합을 가지는 것이 먼저온다. (숫자인 것만 더한다)
- 만약 1,2번 둘 조건으로도 비교할 수 없으면, 사전순으로 비교한다. 숫자가 알파벳보다 사전순으로 작다.
3. 예제
4. 코드
import java.util.*;
import java.io.*;
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[] word = new String[n];
for(int i=0 ; i<n ; i++)
word[i] = br.readLine();
String temp;
for(int i=0 ; i<word.length-1 ; i++) {
int j = i; // 정렬하고자 하는 요소의 위치. i-1번째 까지는 정렬이 된 상태
while(j>=0 && compare(word[j],word[j+1])) { // i번째 요소의 적절한 위치를 찾아간다.
temp = word[j];
word[j] = word[j+1];
word[j+1] = temp; j--; // 적절한 위치를 찾을 때까지 인덱스를 감소시킨다.
}
}
for(int i=0 ; i<n ; i++)
bw.write(word[i]+"\n");
bw.flush(); bw.close();
}
static boolean compare(String s1, String s2) { // true: 더 뒤로 가야하는 단어
if(s1.length()==s2.length()) {
int sum1 = 0, sum2 = 0;
for(int i=0 ; i<s1.length(); i++) {
char c1 = s1.charAt(i), c2 = s2.charAt(i);
if(Character.isDigit(c1)) sum1 += c1-'0'; // 여기를 그냥 c1, c2로 했더니
if(Character.isDigit(c2)) sum2 += c2-'0'; // 계속 틀렸다고 나옴
}
if(sum1==sum2)
return s1.compareTo(s2)>0;
else
return sum1>sum2;
}
else
return s1.length()>s2.length();
}
}
2) 사람들의 도움을 받아 람다식으로 바꿔본 코드
import java.util.*;
import java.io.*;
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[] word = new String[n];
for(int i=0 ; i<n ; i++)
word[i] = br.readLine();
Arrays.sort(word, (s1,s2) ->
s1.length()==s2.length() ?
(sum(s1)!=sum(s2) ? sum(s1)-sum(s2) : s1.compareTo(s2))
: s1.length()-s2.length()); // 양수: 더 뒤로 가야 하는 단어
for(int i=0 ; i<n ; i++)
bw.write(word[i]+"\n");
bw.flush(); bw.close();
}
static int sum(String s) {
int ans = 0;
for(int i=0 ; i<s.length(); i++)
if(Character.isDigit(s.charAt(i)))
ans += s.charAt(i)-'0';
return ans;
}
}
'코딩테스트 풀이 > JAVA' 카테고리의 다른 글
[LeetCode/Easy] 661. Image Smoother (0) | 2023.05.29 |
---|---|
[프로그래머스/Lv.0] x 사이의 개수 (0) | 2023.05.25 |
[백준 온라인 저지] 1181. 단어 정렬 (0) | 2023.05.24 |
[LeetCode/Easy] 530. Minimum Absolute Difference in BST (0) | 2023.05.23 |
[LeetCode/Easy] 506. Relative Ranks (0) | 2023.05.23 |