정렬

인생노잼시기·2021년 7월 9일
0

😨코딩테스트

목록 보기
12/18

2750

오름차순으로 정렬하기
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

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

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

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

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

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

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

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

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: " ")
}

10989 재도전하기!


10825

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

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])
profile
인생노잼

0개의 댓글