백준 1652 코틀린 풀이
1. 문제 설명
input으로 ‘.’과 ‘X’로 이루어진 문자열이 주어집니다. 가로 혹은 세로로 연속된 ‘.’의 개수가 2 이상인 경우들의 개수를 구하는 문제입니다. 가로와 세로 방향으로 ‘.’으로 연속된 공간의 개수를 세는 문제입니다.
2. 초기 구상 및 의도
각 줄은 ‘X’를 기준으로 양 옆에 ‘.’이 존재합니다. 결국 ‘X’를 구분자로 사용하여, split 메서드로 ‘X’를 기준으로 나뉜 리스트를 구할 수 있습니다. 이 리스트의 요소들 중 length가 2이상인 것들의 개수를 반환하면 되는 문제라고 생각했습니다.
문제는 세로 방향은 해결하기 어렵다는 점입니다. 세로만을 위한 방법을 마련하기 보다는, 위의 방법을 사용하고 싶었습니다. 이를 위해, 배열을 y = x 대칭 시킨 2차원 배열(전치 행렬)을 만들고자 했습니다.
3. 코드
import java.io.*
fun main(args: Array<String>) = with(BufferedReader(InputStreamReader(System.`in`))) {
val num = readLine().toInt()
val originMap = Array(num) { "" }
// 전치 행렬을 담을 변수
val transposedMap = Array(num) { CharArray(num) }
for(i in 0 until num){
originMap[i] = readLine()
// 전치 행렬 초기화
for(j in 0 until num)
transposedMap[j][i] = originMap[i][j]
}
// 수평 혹은 수직 방향으로 길이가 2 이상인 요소의 개수 저장하는 변수
var hor = 0
var ver = 0
for(str in originMap){
// str.split('X')는 'X'로 구분된 "."(1개 이상)이 담긴 리스트를 반환
for(com in str.split("X")){
// com의 길이가 2 이상이면 누울 수 있음!
if(com.length >= 2)
hor++
}
}
for(str in transposedMap){
// Char 배열이기 때문에 우선 String으로 바꾼 뒤, split!
for(com in str.joinToString("").split("X")){
// com의 길이가 2 이상이면 누울 수 있음!
if(com.length >= 2)
ver++
}
}
print("$hor $ver")
}
4. 개선점
-
전치 행렬을 Char 2차원 배열이 아닌 String 배열로 나타내면 반복되는 과정을 함수로 만들 수 있다.
-
공간의 길이를 구할 때, joinToString을 제외하면, hor과 ver를 구하는 방식이 똑같다. 이를 함수로 만들면 가독성이 좋아진다.
5. 코드
import java.io.*
fun main(args: Array<String>) = with(BufferedReader(InputStreamReader(System.`in`))) {
val num = readLine().toInt()
// 원본 행렬과 전치 행렬 모두 String 배열로 구현
val originMap = Array(num) { "" }
val transposedMap = Array(num) { "" }
for(i in 0 until num){
originMap[i] = readLine()
// 전치 행렬 초기화
for(j in 0 until num){
transposedMap[j] += originMap[i][j].toString()
}
}
print("${countSpace(originMap)} ${countSpace(transposedMap)}")
}
// 'X'를 기준으로 나눈 뒤, 길이가 2 이상인 String의 개수 반환
fun countSpace(map: Array<String>): Int {
var count = 0
for( str in map){
for(comp in str.split('X')){
if(comp.length >= 2)
count++
}
}
return count
}
댓글남기기