알고리즘/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)
- line? (옵셔널체이닝) 으로 split.map 함수의 실행은 옵셔널타입인 상태만 실행
- line? 이 nil인 경우 split.map을 실행하지 않고 nil을 반환
- map클로저는 반환타입 subString 타입인지 Optional<Array<Substring>> 타입인 옵셔널 배열인지 헷가림 ㅡㅡ....
- 컴파일 에러는 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)
}
}
- 강제 언랩핑을 실행하지 않을경우 옵셔널 언래핑을 실행해서 split.map이 nil 아닌 값만 변환을 시도하고
- 저장된 lineArr1의 인자들을 클로저 안에서 사용하려고 할때 다시 언랩 해주는 이유는 연산을 사용할때 숫자가 아닌 문자열일 가능성이 있으므로 안전하게 언래핑한다
- 나누기가 소수점으로 값이 나올 수 있으므로 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])
- readLine은 옵셔널은 반환하므로 바로 언랩을 해서 nil이 아닌 값만 split.map변환을 실행하고
- 만약 nil이 들어오면 강제 언랩핑을 실행했기 때문에 언래핑오류가 발생할수 있다 (이 부분은 뺀다는 가정)
- map의 인자값이 잠재적 nil 포함을 경우 를 위해 언래핑한다고 한다
아니 이미 readLine()!을 통해 nil을 확인했다고 nil이 아닌 인자를 변환하는데 일지 아닐지 왜 모르는건데 후후.. ;;
이유가 있겠지 다만 내가
와닿지 않는다는건 언제 쓰고 언제 안써야할지 내가 아직 헷갈린다는 소리 .. ^^