아요 개발 일기

[프로그래머스] Level 1. 이상한 문자 만들기 본문

Algorithms/문제 풀이

[프로그래머스] Level 1. 이상한 문자 만들기

소진이 2023. 1. 17. 10:24

안녕하세요!!

오늘은 이상한 문자 만들기 문제를 풀어보았습니다 :D


문제

 


 

풀이

 

일단 함수들부터 살펴보겠습니다!!

components(separatedBy: " ") 은  띄어쓰기를 기준으로 문자열을 자르는 함수입니다.

자세한 설명은 Split과 Components 글을 참고해주세요 :D

 

enumberated() 는 for-in문과 함께 사용하는 함수 입니다.

for (n,c) in "String".enumberated()

위와 같은 형식으로 사용되며, "String" 문자열의 문자를 열거하고 문자열에서의 위치와 함께 각 문자를 출력합니다.

자세한 내용은 Apple Developer 과 [Swift] enumberated() 글을 참고해주세요!

 

uppercased()는 소문자를 대문자로, lowercased()는 대문자를 소문자로 변환해주는 함수입니다.

자세한 내용은 String 관련 함수 글을 참고해주세요!

 

이제 풀이를 해보자면 components를 이용하여 띄어쓰기를 기준으로 String을 잘라줍니다.

for-in 문을 사용하여 변수 s를 array만큼 반복해주고, enumberated()를 사용하여 s 변수에 있는 문자열의 문자 위치 번호(index)에있는 문자(c)를  열거해줍니다.

내부에는 짝수 판별하기 위해 index(문자열 위치)를 2로 나눈 나머지가 0일때를 계산해줍니다. true면 대문자로 false면 소문자로 문자를 변환해줍니다.

그 후에는 components로 없어진 띄어쓰기를 추가해줍니다.

for-in 반복문이 끝나면 마지막에 띄어쓰기 하나가 더 추가되서 출력되는데, 그 부분을 remove 해주면 제대로 된 값이 나옵니다.

 

 

설명 읽느라 고생하셨어요..

Level 1인데 조금 복잡했던 것 같아요,..ㅎㅎ

이제 좋은 것 같은 풀이도 함께 볼까요?


좋은? 풀이

import Foundation
func solution(_ s:String) -> String {
    let a = s.components(separatedBy: " ").map { $0.enumerated().map { $0.offset % 2 == 0 ? $0.element.uppercased() : $0.element.lowercased() } }
    return a.map{ $0.map { $0 }.joined() }.joined(separator: " ")
}

이 풀이에서는 components는 저와 동일하게 사용했고, map 고차함수와 enumerated, offset, element, joined를 사용했네요?

map 고차함수가 참 많이 나오네요!

 

풀이해보자면.. 

components로 문자열을 자르고, map 함수를 사용하여 s 문자열에 아래 형식의 문자들을 a 변수에 추가해 줍니다.

{ $0.enumerated().map { $0.offset % 2 == 0 ? $0.element.uppercased() : $0.element.lowercased() } }

이 부분은 조금 복잡할 수 있으니 떼서 보겠습니다 :ㅇ

위에 있는 제 풀이에서 enumerated를 사용하면 index Number을 알 수 있다고 했죠? 

그때는 for-in문과 함께 사용하였지만, 이 풀이는 단축해서 사용했습니다.

아래 코드처럼 for-in문을 사용할 수 있지만, 

for (index, element) in s.enumerated() {
  print("Item \(index): \(element)")
}

 

이렇게 축약해서도 사용할 수 있다고 해요!

s.enumerated().forEach { print("index: \($0.offset), value: \($0.element)") }

단축 문법을 사용하여 $0.0은 $0.offset으로 $0.1은 $0.element로 표현할 수 있다고 합니다.

자세히 알고싶다면 이 사이트를 참고해주세요!

 

삼항 연산자 부분은 이제 익숙하시죠?

index가 2로 나누었을때 나머지가 0이면 대문자로 아니면 소문자로 변환해줍니다.

 

여기서  $0는 클로저의 단축 인자이름입니다.
매개 변수 순서대로 $0, $1, $2로 표현합니다.

 

자 먼길을 오셨네요..

대문자로 문자열을 바꾸었으면 뭘 해야할까요/???

바로바로! 띄어쓰기를 넣어주어야 하겠죠?????

마지막 return 값 부분을 풀이해봅시다!

return a.map{ $0.map { $0 }.joined() }.joined(separator: " ")

아까 만들어줬던 빈 a 변수 기억나시죠? 대문자와 소문자를 변경해준 문자열을 저장해줬었습니다.

위 코드 부분은 문자열에 띄어쓰기를 추가(joined)해주고 있어요! 반복문이 한번 끝날때마다 띄어쓰기를 추가해줍니다.

 

 

 

,,,Level 1인데 복잡하네요ㅜㅠㅜㅠㅜㅠㅜ 아직 잘하려면 갈 길이 먼 것 같습니다....


정확성 비교

제가 푼 풀이

 

좋다고 생각한 풀이

 

정확성은 비슷한 것 같네요!

다양한 문법으로 풀어봐야하는데 아직은 for-in, switch-case, while등등 익숙한 것만 자꾸 써서 걱정이네요,, 

그래도 꾸준히하면 많이 늘꺼라고 믿습니다! 화이티이잉