[Swift] 백준 10818번 최소,최대
문제 출처: 백준 10818번 최소,최대
문제
풀이
첫 번째 입력으로 정수의 개수 N(최대 1,000,000)
두 번째 입력으로 N개의 개수만큼 정수(-1,000,000 ~ 1,000,000)를 공백으로 구분해서 주어지는 데 문제 자체는 간단하지만 제한 시간이 1초라서 시간 초과에 걸리시는 분들이 있을 겁니다.
저 같은 경우 최소, 최댓값을 가지는 변수를 만들어 두고 for 문을 이용해서 풀었습니다.
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
/// 첫 번째 정수 N, Int 형으로 변환
let n = Int(readLine()!)!
/// N개의 수를 공백 포함해서 담아둘 변수
let line = readLine()!
/// 최소
var min = 1000000
/// 최대
var max = -1000000
/// min, max와 비교할 line의 데이터를 담아둘 변수
var str = ""
/// line에 공백을 추가해주지 않으면 짜인 로직 상 마지막 정수 계산 불가
for index in line + " " {
if index != " " {
str += String(index)
}
if index == " " {
if Int(str)! >= max {
max = Int(str)!
}
if Int(str)! <= min {
min = Int(str)!
}
str = ""
}
}
print(min, max)
- 두 번째 정수를 String으로 받아서 for 반복문을 돌립니다.
- 공백 기준으로 정수가 나누어지기 때문에 공백을 만나기 전까지 str 변수에 담아둡니다.
- 공백일 경우 최소, 최댓값과 비교하여 값을 갱신해 줍니다.
이렇게 풀 경우 메모리: 79452 KB, 시간: 668 ms 결과가 나오게 됩니다.
다른 방법
이 문제를 풀고 나서 다른 사람들의 풀이를 보았는데 고차함수를 활용하여 많이들 푸시더라고요. (난 왜 생각을…)
어떤식이냐면
1
2
3
4
let n = Int(readLine()!)!
let line = readLine()!.split(separator: " ").map { Int($0) }
print(line.min()!, line.max()!)
제가 풀었던 풀이와 비교했을 때 코드가 엄청 간결해졌는데요.
핵심은 두 번째 입력받은 값을 고차함수를 이용해 Int 형 배열로 변환하는 부분입니다.
- readLine()으로 String 형태로 입력받습니다.
- .split(separator: “ “)을 이용해 공백(“ “)을 기준으로 잘라서 [Substring]으로 변환합니다.
- .map { Int($0) }을 이용해 [Substring]에서 [Int] 으로 변환 합니다.
이렇게 코드를 짤 경우 평균적으로 메모리: 133696 KB ~ 144104 KB, 시간: 400 ms ~ 456 ms 정도로 메모리는 많아지고 시간은 줄어드는 결과가 나옵니다.
각 풀이 방법마다 장단점이 있는 문제였던 거 같습니다.
아 그리고 문자열을 자를 때 split 말고 components도 있는데 components의 경우 Foundation 프레임워크 import, 성능의 차이 등 차이점이 있기 때문에 고려하지 않았습니다.
댓글남기기