티스토리 뷰

반응형

 

 

 

🤗 안녕하세요! ^0^//  
오늘은 간단한 문자열 처리 문제 해설을 다뤄보려고 합니다. 바로 공백왕 빈-칸! 바로 시작하겠습니다 ^-^//

 

 

3518번: 공백왕 빈-칸

문제 보기도 좋은 떡이 먹기도 좋다고.. 예쁘게 정리되어 있는 글이 난잡하게 써져있는 글보다 읽기 좋을 것이다. 이번 문제는 글을 단어별로 끊어서, 예쁘게 출력하는 것이다. 여기서 예쁜 글이

www.acmicpc.net

 

 


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 Algorithm Club

#Algorithm #알고리즘 #Swift #이직 #입문자

open.kakao.com

 

 

 

 

 

반응형
댓글
반응형
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
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 31
글 보관함