ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 백준 13904 과제
    Algorithm/BOJ 2021. 1. 27. 13:56
    728x90

    출처: https://www.acmicpc.net/problem/13904

    분류: 그리디


    접근방식

    그리디하게 점수가 높은 과제부터 배정해주는 방식으로 해결했습니다.

    점수가 높은 과제를 마감일에 처리해주되 해당 날이 이미 배정되어 있다면 비어 있는 날을 찾아 그 전날에 배정해주는 방식으로 해결했습니다.

    만약

    1 30
    2 40
    2 50

    주어졌다면, 점수가 가장 높은 2 50을 먼저 배정해주고
    그 다음 높은 2 40을 배정해주려 하는데, 2일차는 이미 차서 그 전날인 1일차에 배정해주는 방식입니다.

    이미 점수가 높은 순서대로 배정시키기 때문에 다 차있어서 배정할 수 없다면 그게 최선일거라고 판단했습니다.

     

    해결방법

    protocol Readable {
        func readSingleValue() -> String
        func readArray(with separator: Character) -> [String]
    }
    
    extension Readable {
        func readSingleValue() -> String {
            return readLine()!
        }
        
        func readSingleValue() -> Int {
            return Int(readLine()!)!
        }
        
        func readArray(with separator: Character) -> [String] {
            return readLine()!.split(separator: " ").map { String($0) }
        }
        
        func readArray(with separator: Character) -> [Int] {
            return readLine()!.split(separator: " ").map { Int(String($0))! }
        }
    }
    
    class BOJ13904: Readable {
        
        func input() {
            n = readSingleValue()
            for _ in 0..<n {
                let data: [Int] = readArray(with: " ")
                works.append((data[0], data[1]))
            }
        }
        
        // MARK: Properties
        
        var n: Int!
        var works = [(dueDate: Int, score: Int)]()
        
        // MARK: Solution
        
        func solution() {
            input()
            works.sort(by: { $0.score > $1.score })
            var timeTable = [Bool](repeating: false, count: 1001)
            var score = 0
            
            for work in works {
                var dueDate = work.dueDate
                while timeTable[dueDate], dueDate > 0 {
                    dueDate -= 1
                }
                
                if dueDate != 0 {
                    timeTable[dueDate] = true
                    score += work.score
                }
            }
            print(score)
        }
    }
    
    BOJ13904().solution()

     

     

    배운점

     

    'Algorithm > BOJ' 카테고리의 다른 글

    백준 15649 N과 M(1)  (0) 2021.01.28
    백준 2252 줄 세우기  (0) 2021.01.27
    백준 1300 K번째 수  (0) 2021.01.26
    백준 1339 단어 수학  (0) 2021.01.22
    백준 1806 부분합  (0) 2021.01.22

    댓글

Designed by Tistory.