알고리즘/Swift

Swift) 백준 #1008 A/B

여미미 2023. 6. 19. 11:25

 

💡두 정수 A와 B를 입력받은 다음, A/B를 출력하는 프로그램을 작성하시오.

 

 

+,-,x 에서 최대한 강제언랩핑을 사용하지 않고 

하는 방법으로 하다가 

 

요번에는 코드를 간결하게 만들어볼 목적으로 강제 언랩을 사용하다 문제를 발견

map 함수로 인자값을 강제 언래핑을 할때 readLine()이 옵셔널타입을 언래핑 해줘야 한다고 생각했으나

 

💥 시도했다가 오답 터지는 코드 ( error )

error: cannot force unwrap value of non-optional type 'String.SubSequence' (aka 'Substring')
let line = readLine()

//line? 옵셔널을 언래핑하는 구분에서 map 강제 언래핑의 문제 💥💥
let lineArr = line?.split(separator:" ").map({ ($0)! }) 
let a = Int(lineArr[0]),b = Int(lineArr[1])
       let result = a / b
       print(result)
  1. line? (옵셔널체이닝) 으로 split.map 함수의 실행은 옵셔널타입인 상태만 실행
  2. line? 이 nil인 경우 split.map을 실행하지 않고  nil을 반환
  3. map클로저는 반환타입 subString 타입인지 Optional<Array<Substring>> 타입인 옵셔널 배열인지 헷가림 ㅡㅡ....
  4. 컴파일 에러는 subString 은 문자열이기 때문에 강제 언래핑을 수행할 수 없다는 내용

 

 

오홍 그래? subString으로 반환된다고? 그럼 언래핑을 하지 않을께

 .. 터짐 💥💥..^^

 

💥 시도했다가 오답 터지는 코드 ( error )

let lineArr1 = line?.split(separator:" ").map({($0)})

 

error: value of optional type '[String.SubSequence]?' (aka 'Optional<Array<Substring>>') must be unwrapped to refer to member 'subscript' of wrapped base type '[String.SubSequence]' (aka 'Array<Substring>')

잔깐만 이쌔꺄.. aka 'Optional<Array<Substring>>' 이라고 방금 옵셔널 타입 아니라매... 

 

 

🚩 정답 1

let line = readLine()

if let lineArr1 = line?.split(separator:" ").map({($0)}) {
    if let a = Double(lineArr1[0]), let b = Double(lineArr1[1]) {
        print(a/b)
    }
}
  1. 강제 언랩핑을 실행하지 않을경우 옵셔널 언래핑을 실행해서 split.map이 nil 아닌 값만 변환을 시도하고
  2. 저장된 lineArr1의 인자들을 클로저 안에서 사용하려고 할때 다시 언랩 해주는 이유는 연산을 사용할때 숫자가 아닌 문자열일 가능성이 있으므로 안전하게 언래핑한다 
  3. 나누기가 소수점으로 값이 나올 수 있으므로 Double형을 쓴다 

 

🚩정답 2

if let lineArr3 = line?.split(separator:" ").map({($0)}), lineArr3.count >= 2 {
    if let a = Double(lineArr3[0]), let b = Double(lineArr3[1]){
        print(a/b)
    }
}
  • 2가지의 값이 들어가 있는데 lineArr3.count >= 2로 안정성을 추가할 수 도 있고 

 

 

하지만 사칙연산을 하면서 이구문을 자주 사용했기 때문에 무조건 숫자만 잘 입력되었다는 가정 (강제 언래핑 사용하기 🤓)으로 

 코드의 양을 줄여서 공부해보자 

 

🚩정답 3

let arr = readLine()!.split(separator: " ").map{ Double($0)! }
print(arr[0] / arr[1])
  1. readLine은 옵셔널은 반환하므로 바로 언랩을 해서 nil이 아닌 값만 split.map변환을 실행하고
  2. 만약 nil이 들어오면 강제 언랩핑을 실행했기 때문에 언래핑오류가 발생할수 있다 (이 부분은 뺀다는 가정)
  3.  map의 인자값이 잠재적 nil 포함을 경우 를 위해 언래핑한다고 한다

아니 이미 readLine()!을 통해 nil을 확인했다고 nil이 아닌 인자를 변환하는데 일지 아닐지 왜 모르는건데 후후.. ;; 

이유가 있겠지 다만 내가 

와닿지 않는다는건 언제 쓰고 언제 안써야할지 내가 아직 헷갈린다는 소리 .. ^^