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

[백준 16113] 시그널 (Swift)

by SiO2whocode 2025. 3. 13.

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

 

문자열 구현 문제

입력이 아래와 같이 문자열의 길이와 #과 . 로만 이루어진 문자열이 들어온다. 

40
###..#..#.#..#..###..#..#.#..#..###..#..

 

이 문자열로 5줄을 만들었을 때, #은 검은칸, .은 흰색칸으로 그리면

숫자가 나온다.

숫자는 세로로 5칸을 차지하고, 1의 경우 한칸의 열을 차지하는 것을 제외하면 3칸의 열을 차지한다.

이런 규칙을 갖고 있는 시그널을 숫자로 해독하는 문제

 

접근방법

딕셔너리에 이차원배열: 숫자 String 을 0~9까지 저장했다. 그리고 공백 "" 에 해당하는 5행이 모두 비어있는 배열로 이루어진 이차원 배열도 "" 이렇게 저장해줌 (빈칸이 여러개 있을 때를 대비한..)

 

그리고 문자열을 전체길이/5 한 만큼 끊어보면서 저 칸 모양대로 2차원 배열을 만들어줬다.

이제 숫자를 하나씩 해독해야하는데, 그러려면 열을 1개 혹은 3개 모아야 한다. 그래서 숫자 하나에 해당하는 이차원 배열을 now라고 하자.

이제 문자열 전체가 들어있는 2차원 배열을 한 열씩 확인해주는데, 한 열을 배열 하나에 모으고, 빈 열이 아니면 그 배열을 now에 추가해준다. (이것도 한 열씩 넣어야 해서 반복문이 필요함..)

근데 빈 열이 나오면 이때 까지 모은 열이 담겨있는 now의 숫자를 딕셔너리에서 찾아서 result에 추가한다. (String이어야 간편)

 

여기서 주의할 점은 이렇게 하면 빈열이 나와야 숫자를 result에 반영할 수 있기 때문에, 반복문이 종료된 후에

now가 비어있지 않으면 now에 담긴 수를 딕셔너리에서 찾아서 result에 넣어주는 것을 한번더 진행해야한다.

 

소스코드

import Foundation

func solution() {
    
    var result:String = ""
    
    // preset
    let dict:[[[Int]]:String] = [
        [[],[],[],[],[]]:"",
        [[1,1,1],
        [1,0,1],
        [1,0,1],
        [1,0,1],
         [1,1,1]]:"0",
        [[1],
        [1],
        [1],
        [1],
         [1]]:"1",
        [[1,1,1],
        [0,0,1],
        [1,1,1],
        [1,0,0],
         [1,1,1]]:"2",
        [[1,1,1],
        [0,0,1],
        [1,1,1],
        [0,0,1],
         [1,1,1]]:"3",
        [[1,0,1],
        [1,0,1],
        [1,1,1],
        [0,0,1],
         [0,0,1]]:"4",
       [[1,1,1],
        [1,0,0],
        [1,1,1],
        [0,0,1],
        [1,1,1]]:"5",
        [[1,1,1],
         [1,0,0],
         [1,1,1],
         [1,0,1],
         [1,1,1]]:"6",
        [[1,1,1],
         [0,0,1],
         [0,0,1],
         [0,0,1],
         [0,0,1]]:"7",
        [[1,1,1],
         [1,0,1],
         [1,1,1],
         [1,0,1],
         [1,1,1]]:"8",
        [[1,1,1],
         [1,0,1],
         [1,1,1],
         [0,0,1],
         [1,1,1]]:"9",
    ]
    
    // input
    let len:Int = Int(readLine()!)!
    let signal:[Character] = Array(readLine()!)
    let clen:Int = len/5
    var sig:[[Int]] = [[Int]](repeating: [], count: 5)
    for (i,s) in signal.enumerated() {
        sig[i/clen].append( s == "#" ? 1 : 0 )
    }
        
    var now:[[Int]] = [[Int]](repeating: [], count: 5)
    var col:[Int] = []
    
    for c in 0..<sig[0].count {
        for r in 0..<5 {
            col.append(sig[r][c])
        }
        
        if col.filter({ $0 == 1 }).isEmpty {
            // 빈 열
            result += dict[now]!
            col = []
            now = [[Int]](repeating: [], count: 5)
        } else {
            for j in 0..<5 {
                now[j].append(col[j])
            }
            col = []
        }
        
    }
    
    if !now.isEmpty {
        result += dict[now]!
    }
    
    print(result)
    
}

solution()

 

 
728x90