728x90
반응형
2024.06.28기준 - 실버4
백준, BEAKJOON, BOJ, JAVA, 자바
풀이
이 문제는 주어진 문자열을 가지고 조건에 맞춰 조합해 출력하는 문제입니다.
제가 생각하는 문제의 핵심은 뒤에서 1, 2번째 A의 위치를 파악하는 것이라고 생각합니다.
1. A의 인덱스를 저장하는 리스트를 생성했습니다.
// A의 인덱스를 저장하는 리스트
List<Integer> aindexs = new LinkedList<>();
for (int i = 0 ; i < n - 1; i++) {
if (arr[i] == 'A') {
aindexs.add(i);
}
}
2. 만약 A의 개수가 2개 보다 작다면 바로 NO출력하고 종료합니다.
// A는 무조건 2개 이상이 필요하지만 2개 미만으로 있을때
if (aindexs.size() < 2) {
sb.append("NO");
}
3. 2개 이상이라면 AA와 뒤에 들어가 한 자리를 제외하고는 앞에서 조합을 해야되기 때문에 전체 길이에 -3을 해주었습니다.
// 뒤에서 2, 3번째는 A라면 맨 뒷자리 하나를 제외하면 무조건 앞쪽에 있는 문자열을 제거하거나 사용해야 되기 때문에
int subm = m - 3;
4. 앞에 추가시킬 길이만큼 있다면 추가를 해주고 없다면 NO를 출력하고 종료합니다.
if (aindexs.get(aindexs.size() - 2) < subm) { // 앞 쪽에 문자열이 부족할 경우
sb.append("NO");
} else {
for (int i = aindexs.get(aindexs.size() - 2) - subm; i < aindexs.get(aindexs.size() - 2); i++) {
sb.append(arr[i]);
}
...
}
5. 뒤에서 1, 2번째 A의 사이는 무조건 제거가 되기 때문에 바로 AA를 입력해주었습니다.
// 뒤에서 1, 2번째 A와 A사이는 전부 제거한다.
sb.append("AA");
6. 그 후 마지막 첫번째 단어인 조건에 맞는 단어가 있다면 추가하도록 했습니다.
// 조건에 맞는 단어가 들어오면 추가한다.
for (int i = aindexs.get(aindexs.size() - 1) + 1; i < arr.length; i++) {
if (arr[i] != 'A' && arr[i] != 'E' && arr[i] != 'I' && arr[i] != 'O' && arr[i] != 'U') {
sb.append(arr[i]);
break;
}
}
7. 마지막 단어 중 조건에 맞는 단어가 없다면 NO를 출력하고 종료해주었습니다.
// 마지막에 추가가 되지 않는다면 다시 NO를 입력
if (sb.length() != m) {
sb = new StringBuilder();
sb.append("NO");
}
코드
package Main;
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));
StringBuilder sb = new StringBuilder();
StringTokenizer st = new StringTokenizer(br.readLine());
int n = Integer.parseInt(st.nextToken()); // 문자열 길이
int m = Integer.parseInt(st.nextToken()); // 운영진이 원하는 길이
char[] arr = br.readLine().toCharArray(); // 문자열
// A의 인덱스를 저장하는 리스트
List<Integer> aindexs = new LinkedList<>();
for (int i = 0 ; i < n - 1; i++) {
if (arr[i] == 'A') {
aindexs.add(i);
}
}
// A는 무조건 2개 이상이 필요하지만 2개 미만으로 있을때
if (aindexs.size() < 2) {
sb.append("NO");
} else {
// 뒤에서 2, 3번째는 A라면 맨 뒷자리 하나를 제외하면 무조건 앞쪽에 있는 문자열을 제거하거나 사용해야 되기 때문에
int subm = m - 3;
if (aindexs.get(aindexs.size() - 2) < subm) { // 앞 쪽에 문자열이 부족할 경우
sb.append("NO");
} else {
for (int i = aindexs.get(aindexs.size() - 2) - subm; i < aindexs.get(aindexs.size() - 2); i++) {
sb.append(arr[i]);
}
// 뒤에서 1, 2번째 A와 A사이는 전부 제거한다.
sb.append("AA");
// 조건에 맞는 단어가 들어오면 추가한다.
for (int i = aindexs.get(aindexs.size() - 1) + 1; i < arr.length; i++) {
if (arr[i] != 'A' && arr[i] != 'E' && arr[i] != 'I' && arr[i] != 'O' && arr[i] != 'U') {
sb.append(arr[i]);
break;
}
}
// 마지막에 추가가 되지 않는다면 다시 NO를 입력
if (sb.length() != m) {
sb = new StringBuilder();
sb.append("NO");
}
}
}
bw.write(sb.toString().equals("NO") ? sb.toString() : "YES\n" + sb.toString());
bw.flush();
bw.close();
br.close();
}
}
728x90
반응형
'코딩테스트 일기 (BAEKJOON)' 카테고리의 다른 글
BAEKJOON / 백준 - JAVA 15966번 군계일학 (0) | 2024.06.30 |
---|---|
BAEKJOON / 백준 - JAVA 29197번 아침 태권도 (0) | 2024.06.29 |
BAEKJOON / 백준 - JAVA 29198번 이번에는 C번이 문자열 (0) | 2024.06.27 |
BAEKJOON / 백준 - JAVA 31845번 카드 교환 (0) | 2024.06.26 |
BAEKJOON / 백준 - JAVA 31747번 점호 (0) | 2024.06.25 |