나의 답)
import Foundation
func solution(_ a:Int, _ b:Int) -> Int {
guard let ab = Int("\(a)\(b)"),
let ba = Int("\(b)\(a)") else {
return 0
}
return max(ab, ba)
}
난 예전에 코테 잘 풀고 싶어서 코테할 때 자주 쓰이는 함수들 << 예전에 이 분의 글을 보고 코테할 때 요긴하게 쓰이나보다 하며 메모한 게 기억이 났다.
해당 블로그에서 본 max
랑 min
이 생각 났는데 이번 문제에서는
큰 값을 가져와야하니까.. max
가 쓰이면 되겠거니 생각했다.
근데 막상 쓰려니 어떻게 쓰더라 까먹어서 공식문서 보고 실습을 진행해봤다.
맨날 까먹어 맨날!!!!!!!!!! 언제 안 까먹어!!!!
공식문서에서도 이렇게 정수 범위를 알 수 있는 타입의 프로퍼티가 있다고 친절히 알려준다
근데 예시가 좀 ,,,,
검색해서 다른 예시들을 보며 참고하고 실습을 바로 진행 했다.
쓰임새는 알겠다. 제일 큰걸 반환해준다는 것...
가보자!!
아 음..
ㅋㅋㅋㅋㅋㅋ 음... . . . .
저게 처음에 아무 생각 없이 " 응 그냥 더하고 큰거 고르면 그만이야~ " 하면서 한 건데,
오류 생기고 나서 다시 보니 a = 1
, b = 2
라고 했을 때.. 그냥 둘다 3
이잖아......
성격 급한거 줄여야한다. 정말로.
문제를 다시 확인해보자.. 두 정수를 붙여 쓴 값 이라고 되어있다.
그러니까!
12
랑 3
이면 이걸 123
으로 해줘야하니, 문자열로 "123"
이렇게 만들어줘야 한다는 걸 알았다.
난 왜 그냥 더했는가.
다시 한 번 반성하고 재도전 해보자.
음 .... a
랑 b
를 문자열로 붙여서 ......
그걸 Int
로 반환도 하고 max
에도 잘 들어갔는데 뭐가 문제지...
분명 맞는 것 같은데, 답답한 마음에 오류 메세지 번역에 다 돌렸다.
다 보면 공통적으로 하는 말이
" 너 nil 값 들어오면 어쩔건데??? 어쩔건데??!! "
라는 말이었다.
그니까.. Int?
로 반환된다는 말이니 옵셔너루바인딩을 해줘라 라는건데,
왜 Int?
를 반환하지.. ? 하는 순간 아 !!! 무릎을 탁 쳤다.
이거 야구 게임을 만들 때도 분명 공부했던 것이다.
.
.
예시)
let validNumber = Int("123") // validNumber는 Int? 타입, 값은 123
let invalidNumber = Int("abc") // invalidNumber는 Int? 타입, 값은 nil
Int()
이니셜라이저는 문자열을 숫자로 변환할 때 실패할 수 있는 가능성 때문에,
실패할 때를 고려해서 옵셔널 타입(Int?)
을 반환한다고 한다.
.
.
다시 내 코드를 보면Int("\(a)\(b)")
와 Int("\(b)\(a)")
는
a
와 b
를 문자열로 결합하고,
그 문자열이 정수로 변환 가능한지 여부에 따라 Int?
타입이 되는 것이고!
만약 어쩌다 정말 변환이 불가능한 경우,
nil
이 반환되기 때문에,
결국 max
함수에서 비교할 수 없게 되는 것이었다...
문자열이 반드시 유효한 숫자로 변환될 거라는 보장이 없기 때문에,
Int 이니셜라이저
는 옵셔널 타입
을 반환한다.
이건 안전한 코드 작성을 위한 Swift의 특성이기도 하다!
자 그럼 저걸 옵셔널 바인딩만 해주면 된다는 것 같다.
바인딩은 guard
로 하는게 익숙해서 그거로 도전..!
그 결과,
채점까지 잘 통과했다.
다른 사람 풀이도 궁금해서 봤는데
보고나서 아~ 이렇게 가능하구나~ 했다.
그냥 강제 언래핑을 해주면 되는구나..
!
를 사용해 옵셔널을 강제 추출하여 Int
로 직접 사용할 수 있게 ,,,
항상 정수 형식의 문자열로 항상 변환해주니까
Int
변환에 실패하지 않아 강제 추출을 써도 안전한 경우라고 볼 순 있겠지만,,
난 그냥 안전한 옵셔널 바인딩을 사용하는 것이 좋은 걸....
.
.
.
.
아 그리고 오늘 옵셔널 바인딩이랑 언래핑 차이 헷갈려서
기억하려고 만든 표 !!!
개념 | 설명 | 예시 |
---|---|---|
옵셔널 바인딩 | 옵셔널 값을 안전하게 해제하여 새로운 변수에 할당 | if let 또는 guard let 사용 |
강제 언래핑 | 옵셔널 값을 강제로 해제, 값이 없으면 런타임 오류 발생 | ! 을 사용하여 강제 해제 |
안전한 언래핑 | 옵셔널을 바인딩하여 안전하게 해제 | if let 또는 guard let 사용 |
옵셔널 바인딩은 안전하게 옵셔널을 바인딩하여 실제 값에 접근하는 방법.
언래핑은 옵셔널에서 실제 값을 꺼내는 작업을 의미. 강제로 할 수 있지만, 안전하게 하려면 옵셔널 바인딩을 사용하는 것이 좋음.
문제에서 요구하는 두 숫자를 합친 값을 비교하는 과정을
좀 더 창의적으로 생각해야 했던 것 같다.
두 숫자를 붙여서 새로운 숫자를 만들고, 그 두 값을 비교하는 문제였는데,
그 과정에서 문자열로 결합하고 다시 Int
로 변환하는 부분이 중요했다.
그게 잘 안 되면 옵셔널이 nil
일 수 있기 때문에, 이걸 어떻게 처리할지 고민도 했다.
그래도 바로 옵셔널 바인딩을 이용해서 변환값이 유효한지 체크하고,
그 값으로 비교를 해서 결국 통과할 수 있었다.
오늘 이걸 풀면서 문자열을 숫자로 변환할 때 실패할 수 있기 때문에,
실패할 가능성을 고려해서 옵셔널 타입(Int?)
을 반환한다는 것도 다시 공부할 수 있어서 좋았다.
역시..
맨날 까먹어도, 계속 써봐야 생각이 나고 기억이 난다.
코딩테스트는 계속 함수 사용법을 까먹는 나에게
"너 슬슬 이거 까먹을 때 됐지? 또 알려줄게"
라고 하면서 문제를 주는 것 같아서 은근 고맙다.
구래서 왜 캐릭터 타입은 Int()를 쓸 수 없나요 얼ㄹ른 알려주세요 현기증나여