오름차순으로 정렬하기
sort()의 시간복잡도는 O(n log n)이다
import Foundation
let n = Int(readLine()!)!
var arr = [Int]()
for _ in 0..<n {
arr.append(Int(readLine()!)!)
}
for i in arr.sorted() { //O(n log n)
print(i)
}
// 고차함수 사용하기
//number.sorted().forEach {
// print($0)
//}
10989
계수정렬로 풀어봤는데 시간초과
import Foundation
let n = Int(readLine()!)!
var arr = [Int]()
for _ in 0..<n {
arr.append(Int(readLine()!)!)
}
let maxValue = arr.max() ?? 0
var countArr = [Int](repeating: 0, count: maxValue+1)
for element in arr {
countArr[element] += 1
}
for i in 0..<countArr.count {
for _ in 0..<countArr[i] {
print(i)
}
}
2108 통계학
dictionary를 사용해 $0.key $0.value 로 정렬하는 부분을 눈여겨 보자
import Foundation
let n = Int(readLine()!)!
var arr = [Int]()
for _ in 0..<n {
arr.append(Int(readLine()!)!)
}
var sum = 0
var dict = [Int:Int]()
var mode = 0 //빈도수
for element in arr {
sum += element
dict[element] = (dict[element] != nil ? dict[element]! : 0) + 1
mode = mode < dict[element]! ? dict[element]! : mode
}
print(sum/arr.count) //산술평균 average
let sortedArr = arr.sorted()
print(sortedArr[n/2]) //중앙값 median
let filtered = dict.filter{ $0.value == mode }
let countMode = filtered.sorted{ $0.key < $1.key }
print(countMode[countMode.count > 1 ? 1: 0].key) //빈도수 mode
print(sortedArr[n-1]-sortedArr[0]) //범위 range
1427 소트인사이드
내림차순으로 정리하기
1523 -> 5321
import Foundation
let numberString = readLine()!
var arr = [Character]()
for char in numberString {
arr.append(char)
}
for element in arr.sorted(by:>) {
print(element, terminator: "")
}
11650 좌표 정렬하기
x좌표가 증가하는 순으로, x좌표가 같으면 y좌표가 증가하는 순서로
let n = Int(readLine()!)!
var arr = [(Int, Int)]()
for _ in 0..<n {
let xy = readLine()!.split(separator: " ").map{ Int(String($0))! }
arr.append((xy[0], xy[1]))
}
arr.sort { (first, second) -> Bool in
if first.0 == second.0 { //x좌표가 같으면 y좌표가 증가하는 순서로
return first.1 < second.1
}
return first.0 < second.0 //x좌표가 증가하는 순으로
}
for i in 0..<n {
print("\(arr[i].0) \(arr[i].1)")
}
11651 좌표 정렬하기2
Anonymous closure argument not contained in a closure
sorted(by: {}) 중괄호가 필요한데...???
y좌표가 증가하는 순으로, y좌표가 같으면 x좌표가 증가하는 순서로
let N = Int(readLine()!)!
var points = [(Int, Int)]()
for _ in 0..<N {
let input = readLine()!.split(separator: " ").map { Int(String($0))! }
points.append((input[0], input[1]))
}
points.sort(by: {
if $0.1 == $1.1 {
return $0.0 < $1.0
}
return $0.1 < $1.1
})
var result = ""
for item in points {
result += "\(item.0) \(item.1)\n"
}
print(result)
1181 단어정렬
1. 길이가 짧은 것부터
2. 길이가 같으면 사전 순으로
arr = Array(Set(arr)) //💥중복제거
Set를 써야하는 것은 알았는데
이렇게 써야하는 거구나!
import Foundation
let n = Int(readLine()!)!
var arr = [String]()
for _ in 0..<n {
arr.append(readLine()!)
}
arr = Array(Set(arr)) //💥중복제거
arr.sort { (first, second) -> Bool in
if first.count == second.count {
return first < second
}
return first.count < second.count
}
for word in arr {
print(word)
}
10814 나이순 정렬
나이 순, 나이가 같으면 가입한 순으로
값이 같은 원소의 전후관계가 바뀌지 않는 정렬 알고리즘: 안정 정렬(stable sort)
그냥 나이 기준으로만 정렬을 해줬더니 풀렸당!
import Foundation
let n = Int(readLine()!)!
var arr = [(Int, String)]()
for _ in 0..<n {
let ageName = readLine()!.split(separator: " ").map{ String($0) }
arr.append((Int(ageName[0])!, ageName[1]))
}
arr.sort(by: {$0.0 < $1.0})
for (age, name) in arr {
print("\(age) \(name)")
}
18870 좌표압축
문제를 읽어도 무슨 말인지 몰랐었는데...
중복없이 모든 숫자를 순서대로 나열하고
0부터 시작해서 좌표를 새로부여하면 되는 문제이다.
[-10: 0, -9: 1, 2: 2, 4: 3]
import Foundation
var valueSet = Set<Int>()
var valueDictionary = [Int:Int]()
let _ = Int(readLine()!)!
let input = readLine()!.split(separator: " ").map { Int(String($0))! }
for n in input {
valueSet.insert(n) //Set는 insert 사용
}
let sortedValue = valueSet.sorted()
var count = 0
for value in sortedValue {
valueDictionary.updateValue(count, forKey: value)
count += 1
}
//보면 set로 중복없이 값들을 정렬하고 0부터 시작해서 증가하면서 대소를 나타내고 있다
//value는 압축된 좌표가 된다
//print(valueDictionary)
//[-10: 0, -9: 1, 2: 2, 4: 3]
for value in input {
print(valueDictionary[value]!, terminator: " ")
}
10825 국영수
import Foundation
let n = Int(readLine()!)!
var scoreArr = [(String, Int, Int, Int)]() //이름, 국, 영, 수
for _ in 0..<n {
let score = readLine()!.split(separator: " ").map { String($0) }
scoreArr.append( (score[0], Int(score[1])!, Int(score[2])!, Int(score[3])!) )
}
scoreArr.sort(by: {
if $0.1 == $1.1 && $0.2 == $1.2 && $0.3 == $1.3{ //모든 점수가 같으면
return $0.0 < $1.0 //이름이 사전 순으로 증가하는 순서로
}
if $0.1 == $1.1 && $0.2 == $1.2 { //국어 점수가 같고 영어 점수가 같으면
return $0.3 > $1.3 //수학 점수가 감소하는 순서로
}
if $0.1 == $1.1 { //국어 점수가 같으면
return $0.2 < $1.2 //영어 점수가 증가하는 순서로
}
return $0.1 > $1.1 //국어 점수가 감소하는 순서로
})
scoreArr.forEach {
print($0.0)
}
다른 사람의 풀이...
이게 if문이지...🥲
list.sort{
if $0.1 == $1.1 {
if $0.2 == $1.2 {
if $0.3 == $1.3 {
return $0.0 < $1.0
}
return $0.3 > $1.3
}
return $0.2 < $1.2
}
return $0.1 > $1.1
}
18310 안테나
중간값median을 구하는 문제
참고로 4/2 = 2, 5/2 = 2
let _ = Int(readLine()!)!
var arr = readLine()!.split(separator: " ").map { Int(String($0))! }
arr.sort()
print(arr[arr.count/2 - 1])