[Swift/프로그래머스] 더 크게 합치기

sonny·2024년 11월 10일
5

TIL

목록 보기
37/48

나의 답)

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)
}

풀기까지 과정

난 예전에 코테 잘 풀고 싶어서 코테할 때 자주 쓰이는 함수들 << 예전에 이 분의 글을 보고 코테할 때 요긴하게 쓰이나보다 하며 메모한 게 기억이 났다.

해당 블로그에서 본 maxmin 이 생각 났는데 이번 문제에서는

큰 값을 가져와야하니까.. max가 쓰이면 되겠거니 생각했다.

근데 막상 쓰려니 어떻게 쓰더라 까먹어서 공식문서 보고 실습을 진행해봤다.

맨날 까먹어 맨날!!!!!!!!!! 언제 안 까먹어!!!!

공식문서) 정수 범위

공식문서에서도 이렇게 정수 범위를 알 수 있는 타입의 프로퍼티가 있다고 친절히 알려준다

근데 예시가 좀 ,,,,

검색해서 다른 예시들을 보며 참고하고 실습을 바로 진행 했다.

쓰임새는 알겠다. 제일 큰걸 반환해준다는 것...

가보자!!

아 음..
ㅋㅋㅋㅋㅋㅋ 음... . . . .

저게 처음에 아무 생각 없이 " 응 그냥 더하고 큰거 고르면 그만이야~ " 하면서 한 건데,

오류 생기고 나서 다시 보니 a = 1 , b = 2 라고 했을 때.. 그냥 둘다 3 이잖아......

성격 급한거 줄여야한다. 정말로.

문제를 다시 확인해보자.. 두 정수를 붙여 쓴 값 이라고 되어있다.

그러니까!

123 이면 이걸 123으로 해줘야하니, 문자열로 "123" 이렇게 만들어줘야 한다는 걸 알았다.

난 왜 그냥 더했는가.

다시 한 번 반성하고 재도전 해보자.

또 트러블 발생! 또러블 발생!

음 .... ab를 문자열로 붙여서 ......

그걸 Int 로 반환도 하고 max에도 잘 들어갔는데 뭐가 문제지...

분명 맞는 것 같은데, 답답한 마음에 오류 메세지 번역에 다 돌렸다.

다 보면 공통적으로 하는 말이

" 너 nil 값 들어오면 어쩔건데??? 어쩔건데??!! "

라는 말이었다.

그니까.. Int? 로 반환된다는 말이니 옵셔너루바인딩을 해줘라 라는건데,

Int? 를 반환하지.. ? 하는 순간 아 !!! 무릎을 탁 쳤다.

이거 야구 게임을 만들 때도 분명 공부했던 것이다.


왜 Int("(a)(b)") 가 Int? 를 반환하는가?

.
.

예시)

let validNumber = Int("123")  // validNumber는 Int? 타입, 값은 123
let invalidNumber = Int("abc")  // invalidNumber는 Int? 타입, 값은 nil

Int() 이니셜라이저는 문자열을 숫자로 변환할 때 실패할 수 있는 가능성 때문에,

실패할 때를 고려해서 옵셔널 타입(Int?)을 반환한다고 한다.
.
.

다시 내 코드를 보면Int("\(a)\(b)")Int("\(b)\(a)")

ab 를 문자열로 결합하고,

그 문자열이 정수로 변환 가능한지 여부에 따라 Int? 타입이 되는 것이고!

만약 어쩌다 정말 변환이 불가능한 경우,

nil이 반환되기 때문에,

결국 max 함수에서 비교할 수 없게 되는 것이었다...

Int?를 반환하는 이유 - 결론

문자열이 반드시 유효한 숫자로 변환될 거라는 보장이 없기 때문에,

Int 이니셜라이저옵셔널 타입 을 반환한다.

이건 안전한 코드 작성을 위한 Swift의 특성이기도 하다!


해결

자 그럼 저걸 옵셔널 바인딩만 해주면 된다는 것 같다.

바인딩은 guard 로 하는게 익숙해서 그거로 도전..!

그 결과,

채점까지 잘 통과했다.

다른 사람 풀이도 궁금해서 봤는데

보고나서 아~ 이렇게 가능하구나~ 했다.

그냥 강제 언래핑을 해주면 되는구나..

! 를 사용해 옵셔널을 강제 추출하여 Int로 직접 사용할 수 있게 ,,,

항상 정수 형식의 문자열로 항상 변환해주니까

Int 변환에 실패하지 않아 강제 추출을 써도 안전한 경우라고 볼 순 있겠지만,,

난 그냥 안전한 옵셔널 바인딩을 사용하는 것이 좋은 걸....
.
.
.
.

아 그리고 오늘 옵셔널 바인딩이랑 언래핑 차이 헷갈려서

기억하려고 만든 표 !!!

개념설명예시
옵셔널 바인딩옵셔널 값을 안전하게 해제하여 새로운 변수에 할당if let 또는 guard let 사용
강제 언래핑옵셔널 값을 강제로 해제, 값이 없으면 런타임 오류 발생!을 사용하여 강제 해제
안전한 언래핑옵셔널을 바인딩하여 안전하게 해제if let 또는 guard let 사용
  • 옵셔널 바인딩은 안전하게 옵셔널을 바인딩하여 실제 값에 접근하는 방법.

  • 언래핑은 옵셔널에서 실제 값을 꺼내는 작업을 의미. 강제로 할 수 있지만, 안전하게 하려면 옵셔널 바인딩을 사용하는 것이 좋음.


음 ...

문제에서 요구하는 두 숫자를 합친 값을 비교하는 과정을

좀 더 창의적으로 생각해야 했던 것 같다.

두 숫자를 붙여서 새로운 숫자를 만들고, 그 두 값을 비교하는 문제였는데,

그 과정에서 문자열로 결합하고 다시 Int로 변환하는 부분이 중요했다.

그게 잘 안 되면 옵셔널이 nil일 수 있기 때문에, 이걸 어떻게 처리할지 고민도 했다.

그래도 바로 옵셔널 바인딩을 이용해서 변환값이 유효한지 체크하고,

그 값으로 비교를 해서 결국 통과할 수 있었다.

오늘 이걸 풀면서 문자열을 숫자로 변환할 때 실패할 수 있기 때문에,

실패할 가능성을 고려해서 옵셔널 타입(Int?) 을 반환한다는 것도 다시 공부할 수 있어서 좋았다.

역시..

맨날 까먹어도, 계속 써봐야 생각이 나고 기억이 난다.

코딩테스트는 계속 함수 사용법을 까먹는 나에게

"너 슬슬 이거 까먹을 때 됐지? 또 알려줄게"

라고 하면서 문제를 주는 것 같아서 은근 고맙다.

profile
iOS 좋아. swift 좋아.

3개의 댓글

comment-user-thumbnail
2024년 11월 10일

구래서 왜 캐릭터 타입은 Int()를 쓸 수 없나요 얼ㄹ른 알려주세요 현기증나여

1개의 답글