문제
N개의 정수가 주어진다. 이때, 최솟값과 최댓값을 구하는 프로그램을 작성하시오.
입력
첫째 줄에 정수의 개수 N (1 ≤ N ≤ 1,000,000)이 주어진다. 둘째 줄에는 N개의 정수를 공백으로 구분해서 주어진다. 모든 정수는 -1,000,000보다 크거나 같고, 1,000,000보다 작거나 같은 정수이다.
출력
첫째 줄에 주어진 정수 N개의 최솟값과 최댓값을 공백으로 구분해 출력한다.
예제 입력 1 복사
5
20 10 35 30 7
예제 출력 1 복사
7 35
풀이
let n: Int = Int(readLine()!)!
let numbers: [Int] = readLine()!.split(separator: " ").map { Int(String(($0))! }
print(numbers.min()!, numbers.max()!)
오답
let count = Int(readLine()!)!
let numbers = readLine()!.components(separatedBy: " ").map { Int($0)! }
print(numbers.min()!, numbers.max()!)
- components 메소드를 사용하면 시간초과나서 split 메소드를 사용했더니 정답 처리가 되었다.
왜 그런지 봤더니,
components의 타입은 Array<String>, split의 타입은 Array<Substring> 이다.
Substring 이란?
애플 공식문서가 말하길 Substring 타입은 String 타입과 거의 동일한 메서드를 가지고 있기 때문에 String처럼 사용할 수 있는 타입이라고 한다.
위의 말에 따르면 String이나 Substring이 결국 같다.
결국 Substring 타입을 따로 만든 이유는 성능 최적화 때문이다.
Substring 타입은 String을 변환했을 때 생긴다. 그래서 저장 공간을 아끼기 위해서 변환하기 전의 String 타입의 주소를 참조해서 값을 가지고 있다.
이미지를 보면 조금 더 이해하기 쉽다
String protocol은 String 과 Substring 은 모두 StringProtocol 을 준수하고 있다. 이말은 즉, 문자열을 조작하는 메서드를 생성할 때 StringProtocol 타입을 파라미터로 받는다고 한다면, String 과 Substring 을 모두 받을 수 있다는 걸 의미한다.
다시 돌아가서,
component는 map한 데이터를 String으로 반환하고
split의 map한 데이터는 subString으로 반환한다.
해서 component 대신에 split을 사용하는 것을 권장하고,
마지막으로,
String.SubSequence -> Int 보다 String.SubSequence -> String -> Int 의 수행속도가 더 빠르다고 한다.
그래서
map { Int($0)! } 보다
map { Int(String($0))! } 을 사용했다.
그런데 실제 백준사이트에서는 시간에 있어서는 반대의 결과가 나왔는데...
다른 문제를 풀면서 조금 더 테스트 해봐야 겠다.
참고
애플공식문서
랭귀지가이드 공식문서
Ryan-Son.devlog
'Algorithm' 카테고리의 다른 글
[알고리즘] 백준 10810번 : 공 넣기 (1) | 2023.10.22 |
---|---|
[알고리즘] 백준 2562 번 : 최댓값과 Index (0) | 2023.10.22 |
[알고리즘] 기초: 백준: 10871번 (0) | 2023.10.06 |
[알고리즘] 기초 : 백준 10807번 갯수 세기 (0) | 2023.10.06 |
[알고리즘] 기초 : 백준 : 10951번 : EOF (0) | 2023.10.05 |