1 분 소요

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. 개선점

  1. 전치 행렬을 Char 2차원 배열이 아닌 String 배열로 나타내면 반복되는 과정을 함수로 만들 수 있다.

  2. 공간의 길이를 구할 때, 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
}

댓글남기기