오늘은 풀이한 알고리즘을 다시 살펴보면서 정리해보자
현재 개인과제로 나온 계산기 만들기도 하는중인데 이건 내일 작성해보는걸로!
문제 설명부터 들어간다
먼저 문제를 접하고 든 생각은 전화번호를 배열로 변환하여
인덱스를 사용해 처음부터 -4번째 까지 요소를 *로 변경하는걸 생각했다
그래서 작성한 코드는 다음과 같다
func solution(_ phone_number:String) -> String {
var arr = Array(phone_number)
for i in 0..<arr.count-4 {
arr[i] = "*"
}
return String(arr)
}
이렇게 해서 제출하니 정답이라고 나왔다
다른 분들 풀이는 어떻게 했나 궁금해서 살펴보니
suffix
를 이용해서 풀이를 하셨다
func solution(_ phone_number:String) -> String {
return String(repeating:"*", count:phone_number.count-4)+phone_number.suffix(4)
}
한 줄에 길게 작성되긴 하지만 간결해보인다.
앞 부분을 전부 *로 바꾸고 뒤의 전화번호 4자리와 +
연산해서 합치는 방식.
참고로 suffix
는 뒤에서 지정한 위치까지의 글자(접미어)를 확인하는 메서드
간략한 예시 코드를 보자
let str = "Vulfpeck"
print(str.suffix(1)) // k
print(str.suffix(2)) // ck
다음 문제
이것도 위의 문제처럼 반복문을 이용해서 무난하게 풀이했다
바로 코드부터 간다.
func solution(_ numbers:[Int]) -> Int {
var sum = 0
for i in 0...9 {
if !numbers.contains(i) {
sum += i
}
}
return sum
}
다른 사람들 풀이도 봤는데 메소드를 이용하니 훨씬 간단하게 작성이 되더라
func solution(_ numbers: [Int]) -> Int {
return (0...9).filter { !numbers.contains($0) }.reduce(0, +)}
0~9까지의 숫자중 .filter
를 통해 없는 숫자를 걸러내고 .reduce
를 통해서 합을 구하는 방식
아직은 메소드가 익숙하지 않아서 그런지 이런식으로 풀이를 하는것이 잘 생각나지 않는다.
아 그리고 굉장히 신박했던 풀이
func solution(_ numbers:[Int]) -> Int {
return 45-numbers.reduce(0, +)
}
0~9까지의 합인 45에서 numbers배열의 합을 빼서 없는 수의 합을 구하는 방식
진짜 보면서 발상의 전한이라고 생각한 신박한 풀이였다
거의 처음으로 삼항 연산자를 실제로 풀이에 적용해보고 min()
메소드를 사용해본 풀이. 테스트1 항목이 계속 시간초과가 떠서 실패했다
func solution(_ arr:[Int]) -> [Int] {
var arr2: [Int] = arr.filter { $0 != arr.min()! }
return arr2.isEmpty ? [-1] : arr2
}
혼자 나름 야무지게 풀었다고 좋아했었기에 아쉬웠지만 원인을 찾아보기로 했다.
근데 계속 테스트1이 시간 초과로 실패하는것이다. 심지어 위의 첫 방법보다 다른 테스트 항목들의 시간소요도 길어지고
그래서 그냥 전통적인 방법을 사용했더니 통과했다.
func solution(_ arr: [Int]) -> [Int] {
var minVal = Int.max
for num in arr {
if num < minVal {
minVal = num
}
}
var arr2: [Int] = arr.filter { $0 != minVal }
return arr2.isEmpty ? [-1] : arr2
}
반복문으로 최소값을 찾는 방식의 코드
근데 이방식으로 해도 테스트1은 유난히 시간이 오래걸리더라
다른 테스트들에 비해서도 엄청 오래걸리는것을 보면 일부러 실행시간도 신경쓰라고 만들어 놓은 테스트가 아닐까.. 싶다
참고로 다른 테스트들의 실행시간은 현저히 낮아진 것이다.
마지막 문제다
이번 문제는 배열이 아니라 문자열을 다루게 되면서 애를 먹었다
다른 언어에 비해 swift의 문자열이 더 까다로운것 같다.
아래는 풀이한 코드다
func solution(_ s: String) -> String {
let count = s.count
let middleIndex = s.index(s.startIndex, offsetBy: count / 2)
if count % 2 == 0 { // 단어의 길이가 짝수인 경우
let startIndex = s.index(middleIndex, offsetBy: -1)
let endIndex = s.index(after: middleIndex)
return String(s[startIndex..<endIndex])
} else { // 단어의 길이가 홀수인 경우
return String(s[middleIndex])
}
}
최근에 배열을 주로 다루다 보니 문자열과 관련한 메서드가 너무 생소했다
조만간 관련해서 공부를 해봐야할것같다
까다롭긴해도 문자열 다루는것은 중요할것같으니..
오늘은 여기까지 풀이했다
알고리즘 문제를 많이 푸시네요.. 전 하루에 하나도 힘드네요 ㅠ