오늘 푼 문제
https://school.programmers.co.kr/learn/courses/30/lessons/12937
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
내 코드
Python
def solution(num):
answer = ''
if num % 2 == 0:
answer = 'Even'
else:
answer = 'Odd'
return answer
Swift
func solution(_ num:Int) -> String {
if num % 2 == 0 {
return "Even"
} else {
return "Odd"
}
}
오늘은 상당히 쉬운 문제였기에, 한 문제 더 풀어보았다.
https://school.programmers.co.kr/learn/courses/30/lessons/12915
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
이 문제의 경우, 파이썬으로는 코드를 보면 한 번에 이해가 가지만, 스위프트로는 어려웠다.
먼저, 해당 문제의 솔루션은 다음과 같다.
Swift의 정렬 메서드 sorted(by:) 를 사용하였다. 이 메서드는 정렬할 때 사용할 비교 로직을 클로저로 전달하는 함수이다.
func solution(_ strings:[String], _ n:Int) -> [String] {
return strings.sorted {
let key1 = ($0[$0.index($0.startIndex, offsetBy: n)], $0)
let key2 = ($1[$1.index($1.startIndex, offsetBy: n)], $1)
return key1 < key2
}
}
그리고 이제 솔루션에 사용된 스위프트 문법부터 살펴보자.
우선 해당 문제를 풀기 위해서는 기본적으로 함수와 배열은 물론, 문자에 접근하기 위해 인덱스를 사용해야 한다. 그러나 Swift 에서는 문자열 인덱스에 직접 접근하지 않기에, startIndex를 기준으로 n만큼 오프셋을 적용하여 n번째 문자에 접근해야 한다.
예를 들면 이런 식이다.
let index = str.index(str.startIndex, offsetBy: n)
let char = str[index]
또한 클로저의 개념도 기본적으로 알고 있어야 한다. 해당 코드에서도 보시다시피 클로저를 사용하였다.
$0, $1 같은 표현은 클로저 내부에서 매개변수를 짧고 간결하게 참조하는 방법이다!
이제 코드를 보면 이해가 갈 것이다.
- $0 과 $1은 현재 비교 중인 배열의 요소를 의미.
- $0.index($0.startIndex, offsetBy: n)은 $0 문자열에서 n번째 문자의 인덱스를 찾는 것.
- 각 문자열의 n번째 문자와 전체 문자열을 '튜플'로 저장.
- 그리고 n번째 문자를 기준으로 비교 수행 후, 그 결과가 같을 경우 전체 문자열을 비교.
느낀점
항상 파이썬 코드로 문제를 풀다가 갑자기 스위프트로 풀려니까, 쉬운 문제여도 조금 색다르게 느껴졌다.
또한 코드를 보다 간결하게 만들기 위해 익명 클로저 매개변수($)를 사용해볼 수 있었던 경험이었다. 이러한 패턴을 사용하는 Swift는 다양한 고차함수 내부에서 더 직관적이고 읽기 쉬운 코드도 만들 수 있다는 것을 알게 되었다.
이렇게 다양한 언어로 문제를 풀어보는 시도도 좋은 것 같다. 지금은 스위프트를 배우고 있고 iOS에 관심이 많은 만큼 최대한 스위프트로 문제를 풀어볼 것이다!