Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
Tags
- Custom Class
- RxSwift
- BidirectionalCollection
- delays deallocation
- input
- reversed
- Asnyc
- Combine
- Responder chain
- binder
- moya
- MaxHeap
- DISPATCH
- swift
- async
- 입력
- 사내배포
- readLine
- Python
- ReactorKit
- 공백
- weak self
- 전자출입
- vtable
- UIResponder
- URLSession
- hitTest
- ios
- AVCaptureSession
- UserDefaults
Archives
- Today
- Total
틈틈히 적어보는 개발 일기
[Swift] Swift로 입력 받기 (EOF, 무한 입력 받기 해결 성공일기!) 본문
백준 알고리즘을 풀던 중, 알고리즘은 아무리 생각해도 맞는데 왜 자꾸 런타임 에러가 날까... 싶어서 한시간 동안 삽질하다가
해결법을 얻어 화가난 나머지 글로 남겨봅니다.
이 글을 읽으시는 여러분은 이런 일을 겪지 마시길 :(
while let line = readLine() {
let testCase = line.components(separatedBy: " ")
}
백준 문제를 풀다가 보면 간혹 입력을 무한정 받고(프로그램의 종료 지점을 명시하지 않은 문제!!!!), EOF를 기점으로 테스트 케이스가 종료되는 문제들이 있다. 다른 언어를 사용하면서는 한번도 이런 일을 겪지 않았는데 Swift로 알고리즘을 풀다가 이런 일이 발생했다.
그래서 해결은?
// 여기서는 String 값을 공백을 기준으로 잘라 testCase라는 배열에 저장이 된다.
// while true와 동일하게 입력이 들어온다면 무한 루프를 계속 돌며 입력을 받게되고,
// EOF를 받게 되면 프로그램이 정상 종료된다!!!!
while let line = readLine() {
let testCase = line.components(separatedBy: " ")
}
기존에 무한루프로 입력을 받았을 땐, while true {} 이런 식으로 받아 내부에 readLine()을 작성 해 주었는데, 이렇게 되면 EOF를 인식하지 못 하고 런타임 에러가 발생하더라... 이렇게 while에 조건문을 걸어주게 되면 EOF를 받았을 때 readLine() 에서 nil이 아니면 true 상태, nil 이라면 false 상태가 되어 while문이 종료된다.
입력 받는 방법을 좀 정리 해볼까?
(문자열, 정수형, 공백 등등의 조건 별로 입력 받기)
알고리즘 풀면서 입력을 안 받는 경우는 없을테니까 편의를 위해 readLine 에서 옵셔널 강제 해제를 하는 편이다
// MARK: -- String
// 문자열 한 줄을 받으려면?
let testCase = readLine()!
// components는 뒤에 인자로 넣는 문자 (여기서는 공백) 을 기준으로 문자열을 잘라 배열 형식으로 저장해준다.
let testCase = readLine()!.components(separatedBy: " ")
// MARK: -- Int
// Int 형을 받으려면? -> 단순하게 형 변환!
let testCase = Int(readLine!())
// Int 값이 공백을 기준으로 하나씩 들어온다면? -> map을 이용한 형 변환, 저장은 배열 형태로!
let testCase = readLine()!.components(separatedBy: " ").map({ Int($0) })
Tip! (삼항 연산자)
// 삼항 연산자를 이용하면 코드도 간결해지고 가독성도 훨씬 올라가는 것 같더라.
// 당연히 다른 조건을 안에 넣어도 작동은 할 텐데 가독성은 별로겠지..?
var flag: Bool = true
print(flag ? "Yes" : "No")
'🍯 알고리즘' 카테고리의 다른 글
[Python] 집합(Set)자료형 (0) | 2021.02.27 |
---|---|
[Python] 입력받는 문자를 내맘대로! (0) | 2021.02.02 |
[Python]파이썬 입력 받기, input(), readline() (0) | 2021.02.02 |
Comments