티스토리 뷰
🤗 안녕하세요! ^0^//
오늘은 간단한 문자열 처리 문제 해설을 다뤄보려고 합니다. 바로 공백왕 빈-칸! 바로 시작하겠습니다 ^-^//
3518번: 공백왕 빈-칸
공백왕 빈-칸 문제는 solved.ac 평가 기준, 실버5로 평가하고 있는데요, 평가자가 적은지라 신뢰도는 높지 않을 수 있습니다.
해당 문제는 다수의 입력을 받을 수 있습니다. 입력하는 줄의 제한이 없기 때문에 입력이 끝날때까지 모든 줄이 적용될 수 있도록 입력처리를 해야 했습니다.
입출력 방식
입력된 문자들이 놓이면 각 행의 문자열의 각 N번째 문자열을 동일한 시작점 열에서 위치해서 예쁘게(?) 출력을 해주어야 합니다.
만약 각 행들 중 N번째 문자열이 존재하지 않는다면 그 이후에 불필요한 공백이 들어가면 안됩니다.
해당 문제는 먼저, 각 문자열의 문자들을 공백 단위로 쪼개서 2차원 배열로 모아둡니다.
이 후, 각 열의 문자열 길이의 최댓값을 구합니다. 위의 예제를 예시로 하자면, 각 열의 최대 길이값은 6, 8, 2, 6, 4 가 되겠습니다.
이렇게 구해둔 각 열의 최대 문자열 길이 값을 참고해서 모아놓은 문자열 배열을 다시한번 순회하며 필요한 공백을 추가합니다. 공백을 활용해 적절한 길이에 각 열의 문자열을 예쁘게 배치 하면 됩니다.
Swift 문제풀이
var G = [[String]]()
var Ans = [[String]](repeating: [String](), count: 1001)
var LV = [[Int]](repeating: [Int](repeating: 0, count: 1001), count: 1001)
var MV = [Int](repeating: 0, count: 101)
먼저 입력을 받기 전, 준비과정입니다. 배열을 선언합니다.
- G는 문자열 입력을 받을 2차원 문자열 배열입니다.
- Ans는 최종적으로 정답을 받기위한 2차원 문자열 배열입니다.
- LV는 각 i행 j열의 문자열 길이를 담아놓을 배열로, 각 열의 길이 최댓값을 구하는데 사용합니다.
- MV는 LV 배열값을 참고해서 각 i 열의 길이 최댓값을 담는데 사용할 1차원 배열입니다.
while let S = readLine() {
G.append(S.split(separator: " ").map { String($0) })
}
해당 문제의 입력을 받는 부분입니다. 입력값이 들어올때까지 문자열을 한줄 한줄 String 배열로서 받아와 2차원배열, G에 추가합니다.
for i in G.indices {
for j in G[i].indices {
LV[i][j] = Array(G[i][j]).count
MV[j] = LV[i][j] > MV[j] ? LV[i][j] : MV[j]
}
}
i행 j열의 각 문자열 길이 값을 저장하는 과정입니다. 이때 동시에 각 열의 최댓값도 비교하며 담고 있습니다. j열의 최댓값을 계속해서 갱신해 하며 예쁜(?) 문자열을 만들 준비를 합니다.
for i in G.indices {
for j in G[i].indices {
Ans[i].append(G[i][j])
if j == G[i].count - 1 { break }
let diff = MV[j] - LV[i][j]
Ans[i].append(" ")
if diff <= 0 { continue }
// 해당 열의 최대 문자열 길이값과 현재 순회 문자열의 길이 차이를 연산해 그만한 공백을 저장합니다.
let nowStr = [String](repeating: " ", count: MV[j] - LV[i][j]).joined()
Ans[i].append(nowStr)
}
}
for i in G.indices {
print(Ans[i].joined())
}
이제 마지막으로 지금까지 만들어놓은 각 문자열 길이값을 담은 LV배열, 각 열의 최대 문자열 길이값을 담은 MV값을 활용해서 필요한 공백을 연산하여 추가하고, 문자열을 정돈합니다.
현재 순회하는 열의 최대 길이값 - 각각의 문자열 길이 값 연산을 통해 해당 열이 얼마나 공백을 추가해야하는지를 계산합니다.
이후, 해당 문자열 뒤에 추가해야하는 공백값을 만들어서 Ans 배열에 누적합니다. 현재 순회하는 문자열이 최대 길이값보다 짧을 수록 더 많은 공백값이 추가되어야 하기 때문입니다.
그렇게 문자열과 공백을 쌓아놓은 2차월 문자열 배열, Ans의 각 행의 값을 문자열로 합쳐서 출력을 합니다.
joined() : 문자열을 합해서 하나의 문자열로 만들어줍니다. separator: 등으로 합치는 문자열 사이에 문자열을 넣울 수도 있습니다.
더 좋은 방법이나 의견이 있을 수 있습니다. 의견 환영합니다~ 즐거운 하루되세요 ^-^//
Swift Algorithm Club 커뮤니티 방 링크 ▼
'알고리즘 정보 > Swift 알고리즘' 카테고리의 다른 글
Swift 알고리즘, 공백 유무 별 readLine 입력값 처리방법 (1) | 2020.06.04 |
---|---|
백준 용액 2467, 이진탐색 활용 swift 문제풀이 (0) | 2020.05.31 |
프로그래머스 가장 먼 노드, 그래프 BFS swift 문제풀이 (0) | 2020.05.24 |
백준 1963 소수경로, BFS swift 알고리즘 문제 풀이 (0) | 2020.05.23 |
Swift Set, 값 중복없는 집합컬렉션 개요 알아보기 (0) | 2019.08.24 |
- Total
- Today
- Yesterday
- swift언어
- publisher
- Collection
- 김프매매
- swift string
- swift 기초
- 프로그래머스swift
- CoreML
- swift
- 백준알고리즘
- 알고리즘문제
- SwiftUI
- swift 문자열
- 개발자문서
- swift reduce
- 컬렉션
- 알고리즘
- swift알고리즘
- 자연어처리
- 프로그래머스
- 부스트코스
- swift문제
- createML
- ios
- 프로토콜
- uikit
- 백준swift
- Protocol
- 스위프트
- Swift 알고리즘
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |