본문 바로가기
알고리즘 문제 풀이/백준

백준 1343 폴리오미노 Kotlin (그리디)

by 옹구스투스 2022. 1. 24.
반응형

문제 출처 : https://www.acmicpc.net/problem/1343

 

1343번: 폴리오미노

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

www.acmicpc.net

문제

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

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

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

입력

첫째 줄에 보드판이 주어진다. 보드판의 크기는 최대 50이다.

출력

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

알고리즘 분류

풀이

.사이의 X의 길이가 홀수이면 바로 -1을 출력하고 아닌 경우, AAAA를 먼저 채우고, 다음 BB를 채우는 그리디하게 푸는 문제이다.

풀이는 누구나 쉽게 떠올릴 수 있기에 딱히 설명할 것은 없고, 구현만 잘 하면 된다.

코드 1은 내가 짠 코드고, 코드 2는 나의 코틀린 스승님의 코드이다.

스승님의 코드를 보니 내가 뭘 했나 싶다.

내 코드는 정말 코틀린스럽지 못하다.

지금은 현업에서 열일하고 계신 나의 코틀린 스승님 

보고 싶습니다

 

 

코드1

val br = System.`in`.bufferedReader()
fun main() = with(System.out.bufferedWriter()){
    val input = StringBuffer(br.readLine())

    var len=0
    var i=0
    while(i <= input.length){
        if(i<input.length && input[i]=='X'){
            len++
        }
        else{
            if(len%2!=0){
                write("-1")
                close()
                return
            }
            else{
                var cur =i-len
                repeat(len/4){
                    for(j in 0 until 4){
                        input.setCharAt(cur++,'A')
                    }
                }
                len %= 4

                repeat(len/2){
                    for(j in 0 until 2){
                        input.setCharAt(cur++,'B')
                    }
                }
                len=0
            }
        }
        i++
    }
    write("$input")
    close()
}

코드2

fun main() = with(System.out.bufferedWriter()){
    val input = br.readLine()!!.replace("XXXX", "AAAA").replace("XX", "BB")
    write("${if ('X' in input) -1 else input}")
    close()
}
반응형

댓글