Notice
Recent Posts
Recent Comments
Link
algoqna
[BOJ 21314] 민겸 수 본문
21314번: 민겸 수
민겸 수 하나가 주어진다. 민겸 수는 대문자 M과 K로만 이루어진 문자열이며, 길이는 3,000을 넘지 않는다.
www.acmicpc.net
- Greedy 문제
- 최댓값을 보장하게 배치하는 방법과 최솟값을 보장하게 배치하는 방법 고민
- 최댓값
K를 만난 경우 무조건 5를 붙이고 시작하고, M을 만난 경우는 K를 만나기 전까지는 누적해둔다.
MMM의 경우 100이 아닌 111이 나오도록 해야한다.
- 최솟값
K를 만난 경우 직전에 M으로 표현된 것들이 있었다면 모두 M을 1을 붙인 형태로 변형하고, 마지막에 K를 붙인다
MMM의 경우 최댓값과 달리 111이 아닌 100이 나오도록 해야한다.
[주석 설명 참고]
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.ArrayDeque;
import java.util.Queue;
public class Main {
/*
* 1) 최댓값 : K를 만날 때까지 쭉 이어붙인다.
* - 하나의 K도 못만나는 경우 정답은 String의 길이를 가진 1, 즉 111111 등이 된다.
* - 하나의 K라도 만나는 경우 직전 + k까지바로 변환, 다음 단계도 동일하게 시작
*
* 2) 최솟값 : K를 만날 때까지 쭉 이어붙인다.
* - 하나의 K라도 못만나는 경우 정답은 String의 길이를 가진 M^N, 즉 100000 등이 된다.
* - 하나의 k라도 만나는 경우 직전까지 변환 후 k도 바로 변환 후 다음 단계도 동일하게 시작
*/
static StringBuilder sb = new StringBuilder();
public static void main(String[] args) throws NumberFormatException, IOException {
// TODO Auto-generated method stub
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter wr = new BufferedWriter(new OutputStreamWriter(System.out));
String input = br.readLine();
int len = input.length();
FindMax(input, len);
FindMin(input, len);
wr.write(sb.toString());
wr.close();
br.close();
}
private static void FindMax(String str, int len) {
int cnt = 0;
for (int i=0; i<len; i++) {
if (str.charAt(i) == 'K') { //5가 등장했다면
sb.append(5); // 최댓값이기 때문에 5 붙이고 시작
for (int j=0; j < cnt; j++) {
sb.append(0); // 0 붙이기
}
cnt = 0;
}
else {
cnt++;
}
}
if (cnt != 0) { // 아직 추가되지 않은 수가 있다면 다 1인데
for (int i=0; i<cnt; i++) {
sb.append(1); // 최댓값이기 때문에 1씩 붙이는 걸로 시작한다.
}
}
sb.append("\n");
return;
}
private static void FindMin(String str, int len) {
int cnt = 0;
for (int i=0; i<len; i++) {
if (str.charAt(i) == 'K') { // K를 만나는 순간이 온다면
if (cnt > 0) { // 여태까지 1이 있었다면
cnt--;
sb.append(1); // 1 한개 추가하고
for (int j=0; j<cnt; j++) // 최솟값이기 때문에 남아있는 cnt만큼 0 붙이기
sb.append(0);
cnt=0;
}
sb.append(5); // 마지막에 5 붙이기
}
else {
cnt++;
}
}
if (cnt != 0) { // 남아있는 수가 있다면
cnt--;
sb.append(1); // 1 한개 추가하고
for (int j=0; j<cnt; j++) // 최솟값이기 때문에 남아있는 cnt만큼 0 붙이기
sb.append(0);
}
return;
}
}
'프로그래밍 > 기타 문제풀이' 카테고리의 다른 글
[BOJ 11663] 선분 위의 점 (0) | 2023.05.15 |
---|---|
[BOJ 21608] 상어 초등학교 (0) | 2023.05.12 |
[BOJ 1938] 통나무 옮기기 (0) | 2023.05.09 |
[BOJ 1912] 연속합 (0) | 2023.05.08 |
[BOJ 1922] 네트워크 연결 (0) | 2023.05.07 |