[Swift]BOJ-1946

BOJ-1946, 신입 사원

문제 📑

https://www.acmicpc.net/problem/1946

 

1946번: 신입 사원

첫째 줄에는 테스트 케이스의 개수 T(1 ≤ T ≤ 20)가 주어진다. 각 테스트 케이스의 첫째 줄에 지원자의 숫자 N(1 ≤ N ≤ 100,000)이 주어진다. 둘째 줄부터 N개 줄에는 각각의 지원자의 서류심사 성

www.acmicpc.net

 

문제 정리 ▾

BOJ-1946

  • 테스트 케이스의 개수를 입력받는다.
  • 지원자의 수를 입력받는다.
  • 지원자는 서류심사 성적과 면접 성적의 순위를 각각 공백 기준으로 입력받는다.
  • 다른 지원자들의 서류심사 성적과 면접 성적을 비교하여 다른 지원자들에 비해 두 성적 모두 낮을 경우 떨어진다.
  • 해당 회사에 선발할 수 있는 신입사원의 최대 인원수를 출력한다.

 

접근 🚶🏻

나의 생각 ▾

  • 신입 사원들의 성적들을 2차원 배열로 입력을 받아 서류심사 성적을 정렬하고, 면접 성적을 각각 비교하여 카운팅 하여 결과를 출력시키려고 했다.

 

내 코드(시간 초과 코드) ▾

import Foundation

func solution() {
    for _ in 0..<Int(readLine()!)! {
        let cnt = Int(readLine()!)!
        var people: [[Int]] = []
        var standard: Int = 0
        var result: Int = 1

        for _ in 0..<cnt {
            people.append(readLine()!.split(separator: " ").map({Int(String($0))!}))
        }

        let people_srt = people.sorted(by: { $0[0] < $1[0] })
        standard = people_srt[0][1]
        for score in people_srt {
            if standard > score[1] {
                standard = score[1]
                result += 1
            }
        }
        print(result)
    }
}
solution()
  • 분명 돌리면 올바른 출력값이 나오지만, 시간 초과라는 채점 결과가 나온다..
  • Swift는 2014년에 시작이 되었는데, 역사가 너무 짧아서 그런지 가끔 이런 현상이 발생한다고 한다. (C++은 1985년이라고 한다..)

 

내 코드(시간초과 이슈 해결) ▾

import Foundation

final class FileIO {
    private var buffer:[UInt8]
    private var index: Int
    
    init(fileHandle: FileHandle = FileHandle.standardInput) {
        buffer = Array(fileHandle.readDataToEndOfFile())+[UInt8(0)]
        index = 0
    }
    
    @inline(__always) private func read() -> UInt8 {
        defer { index += 1 }
        
        return buffer.withUnsafeBufferPointer { $0[index] }
    }
    
    @inline(__always) func readInt() -> Int {
        var sum = 0
        var now = read()
        var isPositive = true
        
        while now == 10
                || now == 32 { now = read() }
        if now == 45{ isPositive.toggle(); now = read() }
        while now >= 48, now <= 57 {
            sum = sum * 10 + Int(now-48)
            now = read()
        }
        
        return sum * (isPositive ? 1:-1)
    }
    
    @inline(__always) func readString() -> String {
        var str = ""
        var now = read()
        
        while now == 10
                || now == 32 { now = read() }
        
        while now != 10
                && now != 32 && now != 0 {
            str += String(bytes: [now], encoding: .ascii)!
            now = read()
        }
        
        return str
    }
}

func solution() {
    
    let file = FileIO()
    
    for _ in 0..<file.readInt() {
        let cnt = file.readInt()
        var scores: [(Int, Int)] = []
        var standard: Int = 0
        var result: Int = 1

        for _ in 0..<cnt {
            scores.append((file.readInt(), file.readInt()))
        }
        scores.sort { $0.0 < $1.0 }
        
        standard = scores[0].1
        
        for i in 0..<scores.count {
            if standard > scores[i].1 {
                standard = scores[i].1
                result += 1
            }
        }
        print(result)
    }
}

solution()
  • 이렇게 하니 아래와 같이 통과할 수 있었다.. 😒

 

Addtional 📂

  • 가끔 Swift로 알고리즘 공부를 하다 보면 시간 초과가 떴었는데 위와 같은 방법으로 해결을 할 수 있을 것 같다.
  • 저 코드를 만들어주신 라이노님 감사합니다 😂

'Algorithm.zip' 카테고리의 다른 글

[Swift]BOJ-1744  (0) 2022.04.07
[Swift]BOJ-16953  (0) 2022.04.06
[Swift]BOJ-1026  (0) 2022.04.04
[Swift]BOJ-11726  (0) 2022.02.07
[Swift]BOJ-17298  (0) 2022.02.05