아요 개발 일기
[프로그래머스] Level 1. 이상한 문자 만들기 본문
안녕하세요!!
오늘은 이상한 문자 만들기 문제를 풀어보았습니다 :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등등 익숙한 것만 자꾸 써서 걱정이네요,,
그래도 꾸준히하면 많이 늘꺼라고 믿습니다! 화이티이잉
'Algorithms > 문제 풀이' 카테고리의 다른 글
[프로그래머스] Level 1. 시저 암호 (0) | 2023.01.17 |
---|---|
[프로그래머스] Level 1. 약수의 합 (0) | 2023.01.17 |
[프로그래머스] Level 1. 정수 제곱근 판별 (0) | 2023.01.17 |
[프로그래머스] Levle.1 콜라츠 추측 (0) | 2023.01.17 |
[프로그래머스] Level 1. 히샤드 수 (1) | 2023.01.17 |