반응형
문제 출처 : https://www.acmicpc.net/problem/1343
문제
민식이는 다음과 같은 폴리오미노 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()
}
반응형
'알고리즘 문제 풀이 > 백준' 카테고리의 다른 글
백준 2635 수 이어가기 Kotlin (완전탐색) (0) | 2022.01.26 |
---|---|
백준 2531 회전 초밥 Kotlin (투 포인터) (0) | 2022.01.25 |
백준 20116 상자의 균형 Kotlin (누적 합) (0) | 2022.01.23 |
백준 11663 선분 위의 점 Kotlin (이분 탐색) (0) | 2022.01.22 |
백준 2225 합분해 Kotlin (dp) (0) | 2022.01.20 |
댓글