๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
3๏ธโƒฃ Swift/Problem Solving

[Swift Algorithm] ํƒ๋ฐฐ BOJ #8980

by seolhee2750 2021. 8. 22.
๋ฌธ์ œ ์„ค๋ช…

์•„๋ž˜ ๊ทธ๋ฆผ๊ณผ ๊ฐ™์ด ์ง์„  ๋„๋กœ์ƒ์— ์™ผ์ชฝ๋ถ€ํ„ฐ ์˜ค๋ฅธ์ชฝ์œผ๋กœ 1๋ฒˆ๋ถ€ํ„ฐ ์ฐจ๋ก€๋Œ€๋กœ ๋ฒˆํ˜ธ๊ฐ€ ๋ถ™์—ฌ์ง„ ๋งˆ์„๋“ค์ด ์žˆ๋‹ค. ๋งˆ์„์— ์žˆ๋Š” ๋ฌผ๊ฑด์„ ๋ฐฐ์†กํ•˜๊ธฐ ์œ„ํ•œ ํŠธ๋Ÿญ ํ•œ ๋Œ€๊ฐ€ ์žˆ๊ณ , ํŠธ๋Ÿญ์ด ์žˆ๋Š” ๋ณธ๋ถ€๋Š” 1๋ฒˆ ๋งˆ์„ ์™ผ์ชฝ์— ์žˆ๋‹ค. ์ด ํŠธ๋Ÿญ์€ ๋ณธ๋ถ€์—์„œ ์ถœ๋ฐœํ•˜์—ฌ 1๋ฒˆ ๋งˆ์„๋ถ€ํ„ฐ ๋งˆ์ง€๋ง‰ ๋งˆ์„๊นŒ์ง€ ์˜ค๋ฅธ์ชฝ์œผ๋กœ ๊ฐ€๋ฉด์„œ ๋งˆ์„์— ์žˆ๋Š” ๋ฌผ๊ฑด์„ ๋ฐฐ์†กํ•œ๋‹ค.

๊ฐ ๋งˆ์„์€ ๋ฐฐ์†กํ•  ๋ฌผ๊ฑด๋“ค์„ ๋ฐ•์Šค์— ๋„ฃ์–ด ๋ณด๋‚ด๋ฉฐ, ๋ณธ๋ถ€์—์„œ๋Š” ๋ฐ•์Šค๋ฅผ ๋ณด๋‚ด๋Š” ๋งˆ์„๋ฒˆํ˜ธ, ๋ฐ•์Šค๋ฅผ ๋ฐ›๋Š” ๋งˆ์„๋ฒˆํ˜ธ์™€ ๋ณด๋‚ผ ๋ฐ•์Šค์˜ ๊ฐœ์ˆ˜๋ฅผ ์•Œ๊ณ  ์žˆ๋‹ค. ๋ฐ•์Šค๋“ค์€ ๋ชจ๋‘ ํฌ๊ธฐ๊ฐ€ ๊ฐ™๋‹ค. ํŠธ๋Ÿญ์— ์ตœ๋Œ€๋กœ ์‹ค์„ ์ˆ˜ ์žˆ๋Š” ๋ฐ•์Šค์˜ ๊ฐœ์ˆ˜, ์ฆ‰ ํŠธ๋Ÿญ์˜ ์šฉ๋Ÿ‰์ด ์žˆ๋‹ค. ์ด ํŠธ๋Ÿญ ํ•œ๋Œ€๋ฅผ ์ด์šฉํ•˜์—ฌ ๋‹ค์Œ์˜ ์กฐ๊ฑด์„ ๋ชจ๋‘ ๋งŒ์กฑํ•˜๋ฉด์„œ ์ตœ๋Œ€ํ•œ ๋งŽ์€ ๋ฐ•์Šค๋“ค์„ ๋ฐฐ์†กํ•˜๋ ค๊ณ  ํ•œ๋‹ค.

  • ์กฐ๊ฑด 1: ๋ฐ•์Šค๋ฅผ ํŠธ๋Ÿญ์— ์‹ค์œผ๋ฉด, ์ด ๋ฐ•์Šค๋Š” ๋ฐ›๋Š” ๋งˆ์„์—์„œ๋งŒ ๋‚ด๋ฆฐ๋‹ค.
  • ์กฐ๊ฑด 2: ํŠธ๋Ÿญ์€ ์ง€๋‚˜์˜จ ๋งˆ์„๋กœ ๋˜๋Œ์•„๊ฐ€์ง€ ์•Š๋Š”๋‹ค.
  • ์กฐ๊ฑด 3: ๋ฐ•์Šค๋“ค ์ค‘ ์ผ๋ถ€๋งŒ ๋ฐฐ์†กํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

๋งˆ์„์˜ ๊ฐœ์ˆ˜, ํŠธ๋Ÿญ์˜ ์šฉ๋Ÿ‰, ๋ฐ•์Šค ์ •๋ณด(๋ณด๋‚ด๋Š” ๋งˆ์„๋ฒˆํ˜ธ, ๋ฐ›๋Š” ๋งˆ์„๋ฒˆํ˜ธ, ๋ฐ•์Šค ๊ฐœ์ˆ˜)๊ฐ€ ์ฃผ์–ด์งˆ ๋•Œ, ํŠธ๋Ÿญ ํ•œ ๋Œ€๋กœ ๋ฐฐ์†กํ•  ์ˆ˜ ์žˆ๋Š” ์ตœ๋Œ€ ๋ฐ•์Šค ์ˆ˜๋ฅผ ๊ตฌํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค. ๋‹จ, ๋ฐ›๋Š” ๋งˆ์„๋ฒˆํ˜ธ๋Š” ๋ณด๋‚ด๋Š” ๋งˆ์„๋ฒˆํ˜ธ๋ณด๋‹ค ํ•ญ์ƒ ํฌ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, ํŠธ๋Ÿญ ์šฉ๋Ÿ‰์ด 40์ด๊ณ  ๋ณด๋‚ด๋Š” ๋ฐ•์Šค๋“ค์ด ๋‹ค์Œ ํ‘œ์™€ ๊ฐ™๋‹ค๊ณ  ํ•˜์ž.

๋ณด๋‚ด๋Š” ๋งˆ์„ ๋ฐ›๋Š” ๋งˆ์„ ๋ฐ•์Šค ๊ฐœ์ˆ˜
1 2 10
1 3 20
1 4 30
2 3 10
2 4 20
3 4 20

์ด๋“ค ๋ฐ•์Šค์— ๋Œ€ํ•˜์—ฌ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ฐฐ์†กํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๊ณ ๋ คํ•ด ๋ณด์ž.

(1) 1๋ฒˆ ๋งˆ์„์— ๋„์ฐฉํ•˜๋ฉด

  • ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ฐ•์Šค๋“ค์„ ํŠธ๋Ÿญ์— ์‹ฃ๋Š”๋‹ค. (1๋ฒˆ ๋งˆ์„์—์„œ 4๋ฒˆ ๋งˆ์„๋กœ ๋ณด๋‚ด๋Š” ๋ฐ•์Šค๋Š” 30๊ฐœ ์ค‘ 10๊ฐœ๋ฅผ ์‹ฃ๋Š”๋‹ค.)
๋ณด๋‚ด๋Š” ๋งˆ์„ ๋ฐ›๋Š” ๋งˆ์„ ๋ฐ•์Šค ๊ฐœ์ˆ˜
1 2 10
1 3 20
1 4 10

(2) 2๋ฒˆ ๋งˆ์„์— ๋„์ฐฉํ•˜๋ฉด

  • ํŠธ๋Ÿญ์— ์‹ค๋ ค์ง„ ๋ฐ•์Šค๋“ค ์ค‘ ๋ฐ›๋Š” ๋งˆ์„๋ฒˆํ˜ธ๊ฐ€ 2์ธ ๋ฐ•์Šค 10๊ฐœ๋ฅผ ๋‚ด๋ ค ๋ฐฐ์†กํ•œ๋‹ค. (์ด๋•Œ ํŠธ๋Ÿญ์— ๋‚จ์•„์žˆ๋Š” ๋ฐ•์Šค๋Š” 30๊ฐœ๊ฐ€ ๋œ๋‹ค.)
  • ๊ทธ๋ฆฌ๊ณ  ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ฐ•์Šค๋“ค์„ ์‹ฃ๋Š”๋‹ค. (์ด๋•Œ ํŠธ๋Ÿญ์— ์‹ค๋ ค ์žˆ๋Š” ๋ฐ•์Šค๋Š” 40๊ฐœ๊ฐ€ ๋œ๋‹ค.)

๋ณด๋‚ด๋Š” ๋งˆ์„๋ฐ›๋Š” ๋งˆ์„๋ฐ•์Šค ๊ฐœ์ˆ˜

๋ณด๋‚ด๋Š” ๋งˆ์„ ๋ฐ›๋Š” ๋งˆ์„ ๋ฐ•์Šค ๊ฐœ์ˆ˜
2 3 10

(3) 3๋ฒˆ ๋งˆ์„์— ๋„์ฐฉํ•˜๋ฉด 

  • ํŠธ๋Ÿญ์— ์‹ค๋ ค์ง„ ๋ฐ•์Šค๋“ค ์ค‘ ๋ฐ›๋Š” ๋งˆ์„๋ฒˆํ˜ธ๊ฐ€ 3์ธ ๋ฐ•์Šค 30๊ฐœ๋ฅผ ๋‚ด๋ ค ๋ฐฐ์†กํ•œ๋‹ค. (์ด๋•Œ ํŠธ๋Ÿญ์— ๋‚จ์•„์žˆ๋Š” ๋ฐ•์Šค๋Š” 10๊ฐœ๊ฐ€ ๋œ๋‹ค.)
  • ๊ทธ๋ฆฌ๊ณ  ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ฐ•์Šค๋“ค์„ ์‹ฃ๋Š”๋‹ค. (์ด๋•Œ ํŠธ๋Ÿญ์— ์‹ค๋ ค ์žˆ๋Š” ๋ฐ•์Šค๋Š” 30๊ฐœ๊ฐ€ ๋œ๋‹ค.)
๋ณด๋‚ด๋Š” ๋งˆ์„ ๋ฐ›๋Š” ๋งˆ์„ ๋ฐ•์Šค ๊ฐœ์ˆ˜
3 4 20

(4) 4๋ฒˆ ๋งˆ์„์— ๋„์ฐฉํ•˜๋ฉด 

  • ๋ฐ›๋Š” ๋งˆ์„๋ฒˆํ˜ธ๊ฐ€ 4์ธ ๋ฐ•์Šค 30๊ฐœ๋ฅผ ๋‚ด๋ ค ๋ฐฐ์†กํ•œ๋‹ค

์œ„์™€ ๊ฐ™์ด ๋ฐฐ์†กํ•˜๋ฉด ๋ฐฐ์†กํ•œ ์ „์ฒด ๋ฐ•์Šค๋Š” 70๊ฐœ์ด๋‹ค. ์ด๋Š” ๋ฐฐ์†กํ•  ์ˆ˜ ์žˆ๋Š” ์ตœ๋Œ€ ๋ฐ•์Šค ๊ฐœ์ˆ˜์ด๋‹ค.

 

์ž…๋ ฅ

์ž…๋ ฅ์˜ ์ฒซ ์ค„์€ ๋งˆ์„ ์ˆ˜ N๊ณผ ํŠธ๋Ÿญ์˜ ์šฉ๋Ÿ‰ C๊ฐ€ ๋นˆ์นธ์„ ์‚ฌ์ด์— ๋‘๊ณ  ์ฃผ์–ด์ง„๋‹ค. N์€ 2์ด์ƒ 2,000์ดํ•˜ ์ •์ˆ˜์ด๊ณ , C๋Š” 1์ด์ƒ 10,000์ดํ•˜ ์ •์ˆ˜์ด๋‹ค. ๋‹ค์Œ ์ค„์—, ๋ณด๋‚ด๋Š” ๋ฐ•์Šค ์ •๋ณด์˜ ๊ฐœ์ˆ˜ M์ด ์ฃผ์–ด์ง„๋‹ค. M์€ 1์ด์ƒ 10,000์ดํ•˜ ์ •์ˆ˜์ด๋‹ค. ๋‹ค์Œ M๊ฐœ์˜ ๊ฐ ์ค„์— ๋ฐ•์Šค๋ฅผ ๋ณด๋‚ด๋Š” ๋งˆ์„๋ฒˆํ˜ธ, ๋ฐ•์Šค๋ฅผ ๋ฐ›๋Š” ๋งˆ์„๋ฒˆํ˜ธ, ๋ณด๋‚ด๋Š” ๋ฐ•์Šค ๊ฐœ์ˆ˜(1์ด์ƒ 10,000์ดํ•˜ ์ •์ˆ˜)๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ์–‘์˜ ์ •์ˆ˜๊ฐ€ ๋นˆ์นธ์„ ์‚ฌ์ด์— ๋‘๊ณ  ์ฃผ์–ด์ง„๋‹ค. ๋ฐ•์Šค๋ฅผ ๋ฐ›๋Š” ๋งˆ์„๋ฒˆํ˜ธ๋Š” ๋ณด๋‚ด๋Š” ๋งˆ์„๋ฒˆํ˜ธ๋ณด๋‹ค ํฌ๋‹ค. 

 

์ถœ๋ ฅ

ํŠธ๋Ÿญ ํ•œ ๋Œ€๋กœ ๋ฐฐ์†กํ•  ์ˆ˜ ์žˆ๋Š” ์ตœ๋Œ€ ๋ฐ•์Šค ์ˆ˜๋ฅผ ํ•œ ์ค„์— ์ถœ๋ ฅํ•œ๋‹ค.

 

์ž…์ถœ๋ ฅ ์˜ˆ์ œ

์ž…๋ ฅ

6 60
5
1 2 30
2 5 70
5 6 60
3 4 40
1 6 40

์ถœ๋ ฅ

150

 

๋‚ด ๋ฌธ์ œ ํ’€์ด
import Foundation

let info = readLine()!.split(separator: " ").map({Int(String($0))!}) // [๋งˆ์„ ๊ฐœ์ˆ˜, ํŠธ๋Ÿญ ์šฉ๋Ÿ‰]
let count = Int(readLine()!)!
var nums = [[Int]]() // [์ถœ๋ฐœ ๋งˆ์„, ๋„์ฐฉ ๋งˆ์„, ํƒ๋ฐฐ ๊ฐœ์ˆ˜]
var town = Array(repeating: 0, count: info[0]) // ๋งˆ์„ ๋ณ„ ์ ์žฌ์ค‘์ธ ํƒ๋ฐฐ ๊ฐœ์ˆ˜
var answer = 0

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

nums.sort {
    if $0[1] != $1[1] { return $0[1] < $1[1] }
    else { return $0[0] < $1[0] }
}

for i in 0..<count {
    let max = (town[nums[i][0]-1..<nums[i][1]-1]).max()!
    if max < info[1] {
        let add = nums[i][2] + max > info[1] ? info[1] - max : nums[i][2]
        answer += add // ๋”ํ•ด์ง€๋Š” ํƒ๋ฐฐ ๊ฐœ์ˆ˜๋ฅผ answer์— ์ถ”๊ฐ€
        for j in nums[i][0]-1...nums[i][1]-2 {
            town[j] += add // ํ˜„์žฌ ํƒ๋ฐฐ๊ฐ€ ์ง€๋‚˜๊ฐ€๋Š” ๋งˆ์„๋“ค์— add๋งŒํผ์˜ ํƒ๋ฐฐ ๊ฐœ์ˆ˜๋ฅผ ์ถ”๊ฐ€
        }
    }
}

print(answer)

๐Ÿ‘‰ ๋„์ฐฉํ•˜๋Š” ๋งˆ์„ ๋ฒˆํ˜ธ๊ฐ€ ์ž‘์€ ํƒ๋ฐฐ๋ถ€ํ„ฐ ์ •๋ ฌํ•ด์„œ ๋งˆ์„๋ณ„๋กœ ํŠธ๋Ÿญ์ด ์ง€๋‚  ๋•Œ ์ ์žฌ๋œ ์–‘์„ ์ฒดํฌํ•ด์ฃผ์—ˆ๋‹ค.

๋นจ๋ฆฌ ๋„์ฐฉํ•˜๋Š” ๋งˆ์„์„ ๊ธฐ์ค€์œผ๋กœ ์ •๋ ฌํ•˜๋Š” ๊ฒƒ์ด ์ด ๋ฌธ์ œ์˜ ํ•ต์‹ฌ!

  • ๋จผ์ € ๋„์ฐฉํ•˜๋Š” ์‹œ๊ฐ„์„ ๊ธฐ์ค€์œผ๋กœ nums ๋ฐฐ์—ด์„ ์ •๋ ฌํ–ˆ๊ณ ,
    ๋„์ฐฉ ์‹œ๊ฐ„์ด ๊ฐ™์„ ๊ฒฝ์šฐ ์ถœ๋ฐœ ์‹œ๊ฐ„ ๊ธฐ์ค€์œผ๋กœ ์ •๋ ฌํ–ˆ๋‹ค.
  • for๋ฌธ์€ ์œ„์˜ ์ž…์ถœ๋ ฅ ์˜ˆ์ œ๋กœ ์„ค๋ช…ํ•œ ๊ทธ๋ฆผ์œผ๋กœ ์ฒจ๋ถ€ํ•œ๋‹ค.
๐Ÿ’ก ํ”ผ๋“œ๋ฐฑ
  • ์–ด๋–ป๊ฒŒ ํ’€์–ด์•ผํ• ์ง€ ๊ณ ๋ฏผํ•˜๋Š”๋ฐ ์‹œ๊ฐ„์ด ์ข€ ๊ฑธ๋ฆฐ ๋ฌธ์ œ์˜€์ง€๋งŒ,
    town ๋ฐฐ์—ด์„ ๋งŒ๋“ค์–ด์ฃผ๊ณ  ๋„์ฐฉํ•˜๋Š” ์‹œ๊ฐ„์„ ๊ธฐ์ค€์œผ๋กœ ํƒ๋ฐฐ๋ฅผ ์ ์žฌํ•ด์ฃผ์–ด์•ผ ํ•˜๋Š” ๊ฒƒ์„
    ํŒŒ์•…ํ•˜๋‹ˆ๊นŒ ๊ธˆ๋ฐฉ ํ’€ ์ˆ˜ ์žˆ์—ˆ๋‹ค.

 


 

๋ฌธ์ œ

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

๋Œ“๊ธ€