PS(Problem Solving)/BOJ

[백준/BOJ] 1343번: 폴리오미노

JunsuKim 2021. 12. 19.
728x90

https://www.acmicpc.net/problem/1343

 

1343번: 폴리오미노

첫째 줄에 사전순으로 가장 앞서는 답을 출력한다. 만약 덮을 수 없으면 -1을 출력한다.

www.acmicpc.net

문제

민식이는 다음과 같은 폴리오미노 2개를 무한개만큼 가지고 있다. AAAA와 BB

이제 '.'와 'X'로 이루어진 보드판이 주어졌을 때, 민식이는 겹침없이 'X'를 모두 폴리오미노로 덮으려고 한다. 이때, '.'는 폴리오미노로 덮으면 안 된다.

폴리오미노로 모두 덮은 보드판을 출력하는 프로그램을 작성하시오.

해설

AAAA와 BB인 폴리오미노 2개가 무한히 있다 한다.

나는 입력한 문자열의 길이만큼 반복문을 만들어 각 위치에 있는 문자가 X인지 .인지를 먼저 구분하였다.

X일 때 cnt를 한개씩 늘려 4개가 된다면 AAAA를 cnt가 2개이고 이후 X가 아니며 i+1의 값이 길이를 넘지 않는다면 BB를 넣고 cnt를 0으로 만든다.

이제 .일 때를 보자.

.일 때 cnt가 0이 아니라면 홀수라는 것을 알 수 있다. 따라서 폴리오미노로 덮을 수 없기 때문에 check를 false로 만들고, 반복문을 끝내주었다.

이제 반복문이 끝나고 cnt가 남아있는 경우에 대해 생각해보자. (마지막이 X로 끝나는 경우)

cnt가 6으로 나눠떨어질 경우 AAAABB를 넣고, 4개라면 AAAA 2개라면 BB를 넣으면 된다.

소스 코드

fun main() {
    val sb = StringBuilder()
    val board = readLine()
    var cnt = 0
    var check = true
    for(i in board!!.indices) {
        if(board[i] == 'X') {
            cnt++
            if(cnt == 4) {
                sb.append("AAAA")
                cnt = 0
            }
            else if(cnt == 2 && i+1 < board.length && board[i+1] != 'X') {
                sb.append("BB")
                cnt = 0
            }
        }
        else if(board[i] == '.') {
            if(cnt != 0) {
                check = false
                cnt = 0
            }
            sb.append(".")
        }
    }
    when {
        cnt % 6 == 0 -> {
            for(i in 0 until cnt / 6) sb.append("AAAABB")
        }
        cnt == 4 -> sb.append("AAAA")
        cnt == 2 -> sb.append("BB")
        else -> check = false
    }
    if(check) println(sb.toString())
    else println(-1)
}
728x90

'PS(Problem Solving) > BOJ' 카테고리의 다른 글

[백준/BOJ] 1380번: 귀걸이  (0) 2021.12.27
[백준/BOJ] 1251번: 단어 나누기  (0) 2021.12.22
[백준/BOJ] 1021번: 회전하는 큐  (0) 2021.12.15
[백준/BOJ] 10866번: 덱  (0) 2021.12.14
[백준/BOJ] 1966번: 프린터 큐  (0) 2021.12.13

댓글