본문 바로가기
알고리즘

[Swift] 백준 16113번 시그널

by 고고 2022. 7. 10.

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

 

16113번: 시그널

zxcvber는 외계인을 연구하는 과학자다. 그는 지난 10년간 우주에서 오는 시그널를 연구했지만, 아무런 성과가 없었다. 그러던 어느 날, 갑자기 우주에서 이상한 시그널이 오기 시작했다. zxcvber는

www.acmicpc.net

 

 

0~9까지의 배열 모습을 numbers 딕셔너리에 저장해놓고 변수 j를 통해 시그널을 돌면서 숫자를 찾습니다.

j부터 j + 3까지는 1을 제외한 0~9까지의 숫자가 있을 수 있습니다. 시그널의 맨 마지막에 1이 있을 수 있으니 j + 3 <= n / 5로 조건을 달았습니다.

import Foundation

let n = Int(readLine()!)!
let s = readLine()!.map { $0 }
var signals = [[Character]]()
let numbers = [0: ["###", "#.#", "#.#", "#.#", "###"], 1: ["#", "#", "#", "#", "#"], 2: ["###", "..#", "###", "#..", "###"], 3: ["###", "..#", "###", "..#", "###"], 4: ["#.#", "#.#", "###", "..#", "..#"], 5: ["###", "#..", "###", "..#", "###"], 6: ["###", "#..", "###", "#.#", "###"], 7: ["###", "..#", "..#", "..#", "..#"], 8: ["###", "#.#", "###", "#.#", "###"], 9: ["###", "#.#", "###", "..#", "###"]]

var j = 0
while j < s.count {
    signals.append(s[j..<j + n / 5].map { $0 })
    j += n / 5
}

func getArray(start: Int, end: Int) -> [String] {
    var result = Array(repeating: "", count: 5)
    
    for i in 0..<5 {
        result[i] = String(signals[i][start..<end])
    }
    
    return result
}

var result = ""

j = 0
out: while j < n / 5 {
    if signals[0][j] == "." { // 공백 건너뛰기
        j += 1
        continue
    }
    
    if j + 3 <= n / 5 {
        let array = getArray(start: j, end: j + 3)
        
        for i in 0...9 {
            if array == numbers[i] {
                result.append(String(i))
                j += 4
                continue out
            }
        }
    }
    
    let array = getArray(start: j, end: j + 1)
    
    if array == numbers[1] {
        result.append("1")
        j += 2
    }
}

print(result)

댓글