λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
3️⃣ Swift/Problem Solving

[Swift Algorithm] κ²Œμž„μ„ λ§Œλ“  동쀀이 BOJ #2847

by seolhee2750 2021. 8. 19.
문제 μ„€λͺ…

ν•™κ΅μ—μ„œ κ·Έλž˜ν”½μŠ€ μˆ˜μ—…μ„ 듀은 λ™μ€€μ΄λŠ” μˆ˜μ—…μ‹œκ°„μ— 듀은 λ‚΄μš©μ„ λ°”νƒ•μœΌλ‘œ 슀마트폰 κ²Œμž„μ„ λ§Œλ“€μ—ˆλ‹€. κ²Œμž„μ—λŠ” 총 N개의 레벨이 있고, 각 λ ˆλ²¨μ„ 클리어할 λ•Œ λ§ˆλ‹€ μ μˆ˜κ°€ 주어진닀. ν”Œλ ˆμ΄μ–΄μ˜ μ μˆ˜λŠ” λ ˆλ²¨μ„ ν΄λ¦¬μ–΄ν•˜λ©΄μ„œ 얻은 점수의 ν•©μœΌλ‘œ, 이 점수λ₯Ό λ°”νƒ•μœΌλ‘œ 온라인 μˆœμœ„λ₯Ό 맀긴닀. λ™μ€€μ΄λŠ” λ ˆλ²¨μ„ λ‚œμ΄λ„ 순으둜 λ°°μΉ˜ν–ˆλ‹€. ν•˜μ§€λ§Œ, μ‹€μˆ˜λ‘œ μ‰¬μš΄ 레벨이 μ–΄λ €μš΄ λ ˆλ²¨λ³΄λ‹€ 점수λ₯Ό 많이 λ°›λŠ” 경우λ₯Ό λ§Œλ“€μ—ˆλ‹€.

이 문제λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•΄ λ™μ€€μ΄λŠ” νŠΉμ • 레벨의 점수λ₯Ό κ°μ†Œμ‹œν‚€λ €κ³  ν•œλ‹€. μ΄λ ‡κ²Œν•΄μ„œ 각 λ ˆλ²¨μ„ 클리어할 λ•Œ μ£ΌλŠ” μ μˆ˜κ°€ μ¦κ°€ν•˜κ²Œ λ§Œλ“€λ €κ³  ν•œλ‹€.

각 λ ˆλ²¨μ„ 클리어할 λ•Œ μ–»λŠ” μ μˆ˜κ°€ μ£Όμ–΄μ‘Œμ„ λ•Œ, λͺ‡ 번 κ°μ†Œμ‹œν‚€λ©΄ λ˜λŠ”μ§€ κ΅¬ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜μ‹œμ˜€. μ μˆ˜λŠ” 항상 μ–‘μˆ˜μ΄μ–΄μ•Ό ν•˜κ³ , 1만큼 κ°μ†Œμ‹œν‚€λŠ” 것이 1λ²ˆμ΄λ‹€. 항상 닡이 μ‘΄μž¬ν•˜λŠ” 경우만 주어진닀. 정닡이 μ—¬λŸ¬ 가지인 κ²½μš°μ—λŠ” μ μˆ˜λ₯Ό λ‚΄λ¦¬λŠ” 것을 μ΅œμ†Œν•œμœΌλ‘œ ν•˜λŠ” 방법을 μ°Ύμ•„μ•Ό ν•œλ‹€.

 

μž…λ ₯

첫째 쀄에 레벨의 수 N이 주어진닀. (1 ≤ N ≤ 100) λ‹€μŒ N개 μ€„μ—λŠ” 각 λ ˆλ²¨μ„ ν΄λ¦¬μ–΄ν•˜λ©΄ μ–»λŠ” μ μˆ˜κ°€ 첫 번째 λ ˆλ²¨λΆ€ν„° λ§ˆμ§€λ§‰ λ ˆλ²¨κΉŒμ§€ μˆœμ„œλŒ€λ‘œ 주어진닀. μ μˆ˜λŠ” 20,000보닀 μž‘μ€ μ–‘μ˜ μ •μˆ˜μ΄λ‹€.

 

좜λ ₯

첫째 쀄에 점수λ₯Ό λͺ‡ 번 κ°μ†Œμ‹œν‚€λ©΄ λ˜λŠ”μ§€ 좜λ ₯ν•œλ‹€.

 

μž…μΆœλ ₯ 예제

μž…λ ₯1

3
5
5
5

좜λ ₯1

3

 

μž…λ ₯2

4
5
3
7
5

좜λ ₯2

6

 

λ‚΄ 문제 풀이
import Foundation

let N = Int(readLine()!)!
var level = [Int]()
var sum = 0

for _ in 0..<N {
    level.append(Int(readLine()!)!)
}

// λ°°μ—΄μ˜ λ’€λΆ€ν„° κ²€μ‚¬ν•˜λŠ”λ°, 맨 λ’€ μš”μ†Œλ§Œ λΉΌκ³ !
for i in (0..<level.count-1).reversed() {
    if level[i+1] <= level[i] { // λ’· μš”μ†Œκ°€ ν˜„μž¬ μš”μ†Œλ³΄λ‹€ μž‘κ±°λ‚˜ 같을 경우
        sum += (level[i]-level[i+1]+1) // λ’· μš”μ†Œμ™€ ν˜„μž¬ μš”μ†Œμ˜ 수 차이에 1을 λ”ν•œλ§ŒνΌ sum에 λˆ„μ 
        level[i] = level[i+1]-1 // ν˜„μž¬ μš”μ†Œ κ°±μ‹ 
    }
}

print(sum)

πŸ‘‰ λ°°μ—΄μ˜ λμ—μ„œλΆ€ν„° κ²€μ‚¬ν•˜μ—¬ λ’· μš”μ†Œκ°€ μ•ž μš”μ†Œλ³΄λ‹€ μž‘μ„ 경우 μΉ΄μš΄νŠΈν•˜κ³ , μ•ž μš”μ†ŒλŠ” λ’· μš”μ†Œλ³΄λ‹€ 1 μž‘μ€ 수둜 κ°±μ‹ !

(λμ—μ„œλΆ€ν„° κ²€μ‚¬ν•˜λŠ” μ΄μœ λŠ”, μ•žμ—μ„œλΆ€ν„° 검사할 경우 μ–΄λ–€ 숫자λ₯Ό μ–Όλ§ˆλ‚˜ μž‘μ€ 수둜 κ°±μ‹ ν•΄μ•Όν•˜λŠ”μ§€ μ•Œ 수 μ—†κΈ° λ•Œλ¬Έ.

예λ₯Ό λ“€μ–΄, 5 4 3 λ°°μ—΄μ˜ 경우 μ•žμ—μ„œλΆ€ν„° κ²€μ‚¬ν•˜λ©΄ 4κ°€ 5보닀 μž‘λ‹€κ³ ν•΄μ„œ  5λ₯Ό 3으둜 κ°±μ‹ ν•˜μ—¬λ„,

λ‹€μ‹œ λ’€μ—μ„œ 3이 4보닀 μž‘κΈ° λ•Œλ¬Έμ— 4λŠ” 2둜 κ°±μ‹ ν•˜κ²Œ 됨. 이 λ•Œ 3으둜 κ°±μ‹ λλ˜ 5λŠ” λ‹€μ‹œ 1둜 κ°±μ‹ ν•˜μ—¬μ•Ό μ•Œλ§žμ€ 레벨이 됨.)

  • μœ„μ˜ μ„€λͺ…λŒ€λ‘œ level 배열을 μˆœμ„œλŒ€λ‘œ κ²€μƒ‰ν•˜λ©° λ’€μ—μ„œλΆ€ν„° 점수λ₯Ό μ—…λ°μ΄νŠΈν•΄μ£Όμ—ˆλ‹€.

 

πŸ’‘ ν”Όλ“œλ°±
  • μ²˜μŒμ—” μ•žμ—μ„œλΆ€ν„° κ²€μ‚¬ν•˜λŠ” κ²ƒμœΌλ‘œ μ½”λ“œλ₯Ό μž‘μ„±ν–ˆλŠ”λ°, μƒκ°ν•΄λ³΄λ‹ˆ μ•žμ—μ„œλΆ€ν„° 점수λ₯Ό λ°”κΏ”μ£Όλ©΄ 계속 배열을 μ²˜μŒλΆ€ν„° νƒμƒ‰ν•΄μ•Όλ˜λŠ” 것,,!을 κΉ¨λ‹¬μ•„μ„œ, λ’€λΆ€ν„° κ²€μ‚¬ν•˜λ„λ‘ λ°”κΏ”μ€¬λ”λ‹ˆ λ°”λ‘œ μ•Œλ§žκ²Œ ν’€μ΄λ˜μ—ˆλ‹€.

 


 

문제

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

λŒ“κΈ€