PS/백준 문제 풀이
백준 1474번 - 밑 줄(java, 그리디, 구현)
홀든콜필드
2024. 6. 27. 19:49
728x90
https://www.acmicpc.net/problem/1474
무슨말인지 잘 모르겠는 문제인데 해석만하면 그렇게 어려운 문제는 아니다. 그러나 문자열을 다루는데 익숙하지 않다면 조금 어려울 수도 있다.
사전순으로 앞에 온다는 의미를 잘 해석해야하는데 나도 이것을 잘 못해서 이게 왜 실버1이지 싶었다. 사전순이란
AABBB
AAABB
-> AAABB 가 먼저온다. 즉, 밑줄 보다 우선순위가 높은 대문자 앞에는 밑줄이 되도록 오지 않는 것이 좋다.
AAA_BBaa
AA_ABBaa
-> AAA_BBaa 가 먼저온다.
AAA_BBaa
AAABBa_a
-> AAABBa_a 가 먼저온다
이제 느낌이 올것이다. 문자열을 탐색하며 먼저 소문자 앞에 밑줄들을 추가하고 만약 더 이상 소문자가 없다면 뒤쪽에 있는 대문자 앞에 밑줄을 추가하면 된다.
그래서 이 문제는 그리디 알고리즘이 된다.
import java.io.*;
import java.util.*;
class Main {
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String[] NM = br.readLine().split(" ");
int N = Integer.parseInt(NM[0]);
int M = Integer.parseInt(NM[1]);
ArrayList<String> arrayList = new ArrayList<>();
int allSize = 0;
for(int i = 0; i < N; i++){
String str = br.readLine();
arrayList.add(str);
allSize += str.length();
}
int cnt = (M - allSize) / (N - 1);
int tm = (M - allSize) % (N - 1);
String line = "";
for(int i = 0; i < cnt; i++){
line += "_";
}
for(int i = 0; i < arrayList.size() - 1; i++){
arrayList.set(i, arrayList.get(i) + line);
}
boolean flag = false;
if((M - allSize) % (N - 1) != 0){
for(int i = 1; i < arrayList.size(); i++){
if(arrayList.get(i).charAt(0) <= 'z' && arrayList.get(i).charAt(0) >= 'a'){
arrayList.set(i - 1, arrayList.get(i - 1) + "_");
tm--;
}
if(tm == 0) {
flag = true;
break;
}
}
if(!flag){
for(int i = arrayList.size() - 1; i > 1; i--){
if(arrayList.get(i).charAt(0) <= 'Z' && arrayList.get(i).charAt(0) >= 'A'){
arrayList.set(i - 1, arrayList.get(i - 1) + "_");
tm--;
}
if(tm == 0) {
break;
}
}
}
}
for(int i = 0; i < arrayList.size(); i++){
System.out.print(arrayList.get(i));
}
}
}