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()
'알고리즘 문제풀이' 카테고리의 다른 글
[백준 2533] 사회망 서비스 (SNS) (Swift) (0) | 2025.03.20 |
---|---|
[백준 11058] 크리보드 (Swift) (0) | 2025.03.19 |
[백준 1005] ACM craft (Swift) (0) | 2025.03.12 |
[백준 1495] 기타리스트 (Swift) (0) | 2025.03.11 |
[백준 1743] 음식물 피하기 (Swift) (0) | 2025.03.10 |