프로그래머스 문제 링크 : https://school.programmers.co.kr/learn/courses/30/lessons/12930
💡 내가 제출한 풀이
import Foundation
func solution(_ s:String) -> String {
let arr = s.components(separatedBy: " ")
var value = ""
for i in arr {
for (j, v) in i.enumerated() {
value += (Int(j) % 2 == 0 ? v.uppercased() : v.lowercased())
}
value += " "
}
value.removeLast()
return value
}
💡 풀이 과정
받아온 문자별을 공백 기준 단어별로 짝수라면 대문자, 홀수라면 소문자로 바꿔준다.
- 문자열을 단어별로 배열에 담는다
- 각 문자마다 짝수번인지 홀수번인지 확인한다
- 짝수라면 대문자, 홀수라면 소문자로 변환해서 문자열 변수에 담는다
- 1개 단어 체크가 끝났을때마다 공백을 넣는다
- 맨 마지막 글자 뒤 공백은 필요 없으므로 삭제한다
문자열을 쪼개서 배열로 만드는 메서드
components
func components(separatedBy separator: String) -> [String]
- 파라미터
- separatedBy : 쪼개는 기준이 되는 문자 -> String 타입
- 반환형
- String 타입 배열
- import Foundation 해서 사용
split
func split(
separator: character,
maxSplits: Int = Int.max,
omittingEmptySubsequences: Bool = true
) -> [SubString]
- 파라미터
- separator : 쪼개는 기준이 되는 문자 -> Character 타입
- maxSplits : 최대로 쪼개는 횟수 -> Int 타입
- omittingEmptySubsequences : 공백도 따로 쪼개는지 여부 결정 -> Bool 타입
- 반환형
- SubString 타입 배열
- Swift Standard Library 에 포함
split 사용했더니 오류가 나다...
정확히는, 테스트 케이스는 통과하지만 코드 실행에서 통과하지 못했다.
질문하기에 여러가지 반례가 써있었는데, 아무래도 공백이 1개일 경우만 있는 게 아니라서 그런 것 같았다.
"try hello world " -> "TrY HeLlO WoRlD "
이렇기 때문에 실제 실행 케이스에서 오류가 우수수 쏟아졌다고 생각이 든다.
split을 사용하면 공백은 전부 제외를 시켜버린다.
위와 같이 중간에 공백이 많아도 전부 없애버리고 문자가 있는 부분만 짜집어서 배열을 도출한다.
components는 비어있는 문자도 분리해준다.
짝수 홀수 체크해서 문자 변환하기
components를 사용해서 문자를 배열로 만들었다.
이 배열을 반복문을 돌리며, 배열 요소의 인덱스가 짝수면 대문자 홀수면 소문자로 변환한다.
그리고 결과값을 담을 변수 value에 차례대로 담고, 배열 요소 하나 체크가 끝날 때마다 공백을 넣는다.
enumerated() 배열/문자열의 인덱스 가져오기
https://developer.apple.com/documentation/swift/array/enumerated()
(n, x) 를 반환한다.
n -> 0부터 시작하는 정수. == 인덱스를 의미
x -> 시퀀스의 요소
func enumerated() -> EnumeratedSequence<Self>
for (n, x) in "Swift".enumerated() {
print("\(n): '\(x)'")
}
// Prints "0: 'S'"
// Prints "1: 'w'"
// Prints "2: 'i'"
// Prints "3: 'f'"
// Prints "4: 't'"
1차적으로 components한 배열을 반복문으로 돌리고
2차적으로 그 배열의 요소 안, 문자열을 반복문으로 돌려주었다.
for i in arr {
for (j, v) in i.enumerated() {
value += (Int(j) % 2 == 0 ? v.uppercased() : v.lowercased())
}
value += " "
}
enumerated()를 사용해서 (인덱스, 요소) 형대로 반환할 수 있게 만들었다.
인덱스가 짝수인지 체크하여 요소를 대문자, 소문자로 변환해서 문자열 변수에 더하기 연산자로 담아주었다.
요소 i의 체크가 끝날때마다 공백도 넣어주었다.
⭐ 더 효율적으로 문자열 추가하는 법
문자열에 더하기 연산자로 추가하는 게 아니라 append로도 넣을 수 있다.
append는 문자열 원본을 수정한다.
내가 푼 방식같이 값을 담을 문자열 변수를 따로 두고 연산할 경우에는 메소드를 사용하는 게 더 직관적이다.
import Foundation
func solution(_ s:String) -> String {
let arr = s.components(separatedBy: " ")
var value = ""
for i in arr {
for (j, v) in i.enumerated() {
value.append(Int(j) % 2 == 0 ? v.uppercased() : v.lowercased())
}
value.append(" ")
}
value.removeLast()
return value
}
이렇게 하면 반복문이 끝났을 때, 문자열 맨 뒤에 공백이 남는다.
이 공백을 삭제해주어야 정답을 맞출 수 있다.
// 반복문이 막 끝났을 때
print(value) -> "TrY HeLlO WoLrD "
// 맨 뒤에 있는 공백 문자 삭제
value.removeLast()
// 공백문자 삭제한 결과값
print(value) -> "TrY HeLlO WoLrD"
'알고리즘 > Programmers' 카테고리의 다른 글
[Swift_Programmes] 크기가 작은 부분 문자열 (0) | 2023.12.26 |
---|---|
[Swift_Programmes] 삼총사 (0) | 2023.12.11 |
[Swift_Programmes] 3진법 뒤집기 (0) | 2023.12.04 |
[Swift_Programmes] 최대공약수와 최소공배수 ⭐ / 유클리드 호제법, 재귀함수 반복문 (0) | 2023.12.01 |
[Swift_Programmes] 직사각형 별찍기 (0) | 2023.11.30 |