● 10818
import Foundation
let count = Int(readLine()!)!
let arrays = readLine()!.split(separator:" ").map { Int( String($0) )! }
let max = arrays.max()!
let min = arrays.min()!
print("\(min) \(max)")
readLine()!.split(separator: " ")의 결과 타입은 [String] 이 아니라 [String.SubSequence]임.
SubSequence는 Collection 타입에서 어떤 것의 부분을 나타내는 타입임
Int타입으로 변환할 때, String.SubSequence -> Int 보다 String.SubSequence -> String -> Int의 수행속도가 더 빠르다고 함
● 2562
import Foundation
var nArray = Array<Int>()
for i in 0..<9 {
let num = Int(readLine()!)!
nArray.append(num)
}
let maxValue = nArray.max()!
let maxIndex = nArray.firstIndex(of:maxValue)! + 1
print("\(maxValue)\n\(maxIndex)")
배열에서 인덱스 알아내기 : array.firstIndex(of:찾고자 하는 변수) 또는 array.firstIndex { $0 == 찾고자하는 변수 }
참고로 결과는 옵셔널껍데기이기 때문에 뒤에 느낌표 붙여야 Int형으로 나옴!!
● 2577
import Foundation
var result = 1
for i in 0..<3 {
result = result * Int(readLine()!)!
}
var arr = Array(String(result))
for i in 0...9 {
let filterArr = arr.filter { Int(String($0))! == i }
print(filterArr.count)
}
String을 배열로 만드는법: Array(문자열)
● 3052
import Foundation
var arr = [Int]()
for i in 1...10 {
let num = Int(readLine()!)! % 42
if arr.contains(num) == false {
arr.append(num%42)
}
}
print(arr.count)
이것보다 더 좋은 다른 사람의 코드를 찾았다.
나는 아무 생각없이 Array를 썼는데 그냥 arr타입을 Set으로 하면 비었는지 검사할 필요가 없는것(set은 중복허용하지 않으니까..)
var result = Set<Int>()
for _ in 0..<10 {
result.insert(Int(readLine()!)! % 42)
}
print(result.count)
----> 이렇게 간단한 방법이 있다..ㅎㅎ
● 1546
import Foundation
let testCase = Int(readLine()!)!
let testArr = readLine()!.split(separator: " ").map { Int(String($0))! }
var resultArr = [Double]()
for i in testArr {
let newScore: Double = Double(i) / Double(testArr.max()!)
resultArr.append(newScore*100.0)
}
print(resultArr.reduce(0.0,+)/Double(testCase))
배열에서 합을 구하고 싶으면 reduce활용 : arr.reduce(0,+) 또는 arr.reduce(0){ $0 + $1 }
● 8958
import Foundation
let counts = Int(readLine()!)!
var arrs = [String]()
for i in 0..<counts {
var results = readLine()!.split(separator: "X").reduce(0) { $0 + ($1.count) * ($1.count+1) / 2 }
print(results)
}
풀다가 아무래도 비효율적으로 푸는 것 같아서..찾아봤더니 고차함수에다 등차수열까지 깔쌈하게 썼더라..현타 오는군
세상에는 똑똑한 사람이 참 많다....
고차함수를 잘 사용해야할듯....
●4344
import Foundation
let cases = Int(readLine()!)!
for _ in 0..<cases {
let input = readLine()!.split(separator:" ").map { Int(String($0))! }
let student = input[0]
let score = input[1...student]
let ave = score.reduce(0) { $0 + $1 } / student
let good = score.filter { $0 > ave }.count
let biyul = Double(good) / Double(student) * 100
print("\(round(biyul * 1000) / 1000)%")
}
고차함수를 넣어서 풀었지만..뭔가 코드가 깔끔하지 않다.
중요한건 반올림인데 예를 들어
소수점 4번째 자리에서 반올림할 경우 1,000을 곱하여 반올림 후 다시 1,000을 나눠주면 된다.(=반올림해서 3번째 자리까지 출력)
소수점 6번째 자리에서 반올림할 경우 100,000을 곱하여 반올림 후 다시 100,000을 나눠주면 된다.(=반올림해서 5번째자리까지 출력)
참고로
let digit: Double = pow(10, 3) // 10의 3제곱
이렇게 하면 더 편할듯요
'코테 > Swift' 카테고리의 다른 글
[Swift] 백준 알고리즘 - 요세푸스문제(1158) (0) | 2024.06.06 |
---|---|
[Swift] 백준 알고리즘 - 키로거(5397) (1) | 2024.06.06 |
[Swift] 백준 알고리즘 - 에디터(1406) (0) | 2024.06.06 |
[Swift] 백준 알고리즘 - 방 번호(1457) (2) | 2024.06.06 |
[Swift] 백준 알고리즘 - 숫자의 개수(2577) (2) | 2024.06.06 |