728x90
문제 링크
https://www.acmicpc.net/problem/1343
문제 설명
민식이는 다음과 같은 폴리오미노 2개를 무한개만큼 가지고 있다. AAAA와 BB
이제 '.'와 'X'로 이루어진 보드판이 주어졌을 때, 민식이는 겹침없이 'X'를 모두 폴리오미노로 덮으려고 한다. 이때, '.'는 폴리오미노로 덮으면 안 된다.
폴리오미노로 모두 덮은 보드판을 출력하는 프로그램을 작성하시오.
입력
첫째 줄에 보드판이 주어진다. 보드판의 크기는 최대 50이다.
출력
첫째 줄에 사전순으로 가장 앞서는 답을 출력한다. 만약 덮을 수 없으면 -1을 출력한다.
구조화
sb : StringBuilder
그냥 String length 반복문을 돌면서 처리
‘.’를 만나면 ‘.’를 sb에 담아줌 아니라면 ‘.’만날때까지의 X의 길이 구함
만약 홀수라면(l%2 ≠ 0), flag = false, -1 출력하고, 반복문 탈출
아니면 그 길이가 4로 나눴을 때 0이 아니면 나눈 몫만큼 “AAAA”를 sb에 담아줌, l은 4로 나눈 나머지 값으로
2(”BB”)도 똑같이 처리
flag가 true면 변환 가능한 경우이므로 sb를 출력
오답 노트
처음에는 split 사용해서 ‘.’으로 분리했는데
예외가 너무 많아 처리하기 힘들어짐
소스 코드
import java.io.*;
import java.util.*;
public class Main {
public static void main(String[] args) throws IOException {
boolean flag = true;
StringBuilder sb = new StringBuilder();
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String str = br.readLine();
int len = str.length();
for (int i = 0; i < len; i++) {
if (str.charAt(i) == '.') {
sb.append('.');
continue;
}
int l = 0;
while (str.charAt(i) != '.') {
l++;
i++;
if (i>=len) break;
}
i--;
if (l % 2 != 0) {
flag = false;
System.out.println(-1);
break;
}
if (l / 4 != 0) {
for (int j = 0; j < l / 4; j++) {
sb.append("AAAA");
}
l %= 4;
}
if (l / 2 != 0) {
for (int j = 0; j < l / 2; j++) {
sb.append("BB");
}
}
}
// 변환 가능하다면
if (flag) {
System.out.println(sb);
}
}
}
깃허브 링크
'Algorithm > 백준' 카테고리의 다른 글
[백준] 1655 가운데를 말해요 🔈 (Java) (0) | 2024.05.19 |
---|---|
[백준] 3987 보이저 1호 🚀 (Java) (0) | 2024.05.09 |
[백준] 4811 알약 💊 (Java) (0) | 2024.05.07 |
[백준] 17090 미로 탈출하기 🚪 (Java) (0) | 2024.05.02 |
[백준] 1021 회전하는 큐 😵💫 (Java) (0) | 2024.04.29 |