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

[Swift Algorithm] ๋ฉ€ํ‹ฐํƒญ ์Šค์ผ€์ค„๋ง BOJ #1700

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

๊ธฐ์ˆ™์‚ฌ์—์„œ ์‚ด๊ณ  ์žˆ๋Š” ์ค€๊ทœ๋Š” ํ•œ ๊ฐœ์˜ ๋ฉ€ํ‹ฐํƒญ์„ ์ด์šฉํ•˜๊ณ  ์žˆ๋‹ค. ์ค€๊ทœ๋Š” ํ‚ค๋ณด๋“œ, ํ—ค์–ด๋“œ๋ผ์ด๊ธฐ, ํ•ธ๋“œํฐ ์ถฉ์ „๊ธฐ, ๋””์ง€ํ„ธ ์นด๋ฉ”๋ผ ์ถฉ์ „๊ธฐ ๋“ฑ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์ „๊ธฐ์šฉํ’ˆ์„ ์‚ฌ์šฉํ•˜๋ฉด์„œ ์–ด์ฉ” ์ˆ˜ ์—†์ด ๊ฐ์ข… ์ „๊ธฐ์šฉํ’ˆ์˜ ํ”Œ๋Ÿฌ๊ทธ๋ฅผ ๋บ๋‹ค ๊ฝ‚์•˜๋‹ค ํ•˜๋Š” ๋ถˆํŽธํ•จ์„ ๊ฒช๊ณ  ์žˆ๋‹ค. ๊ทธ๋ž˜์„œ ์ค€๊ทœ๋Š” ์ž์‹ ์˜ ์ƒํ™œ ํŒจํ„ด์„ ๋ถ„์„ํ•˜์—ฌ, ์ž๊ธฐ๊ฐ€ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋Š” ์ „๊ธฐ์šฉํ’ˆ์˜ ์‚ฌ์šฉ์ˆœ์„œ๋ฅผ ์•Œ์•„๋‚ด์—ˆ๊ณ , ์ด๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ”Œ๋Ÿฌ๊ทธ๋ฅผ ๋นผ๋Š” ํšŸ์ˆ˜๋ฅผ ์ตœ์†Œํ™”ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๊ณ ์•ˆํ•˜์—ฌ ๋ณด๋‹ค ์พŒ์ ํ•œ ์ƒํ™œํ™˜๊ฒฝ์„ ๋งŒ๋“ค๋ ค๊ณ  ํ•œ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด 3 ๊ตฌ(๊ตฌ๋ฉ์ด ์„ธ ๊ฐœ ๋‹ฌ๋ฆฐ) ๋ฉ€ํ‹ฐํƒญ์„ ์“ธ ๋•Œ, ์ „๊ธฐ์šฉํ’ˆ์˜ ์‚ฌ์šฉ ์ˆœ์„œ๊ฐ€ ์•„๋ž˜์™€ ๊ฐ™์ด ์ฃผ์–ด์ง„๋‹ค๋ฉด, 

  1. ํ‚ค๋ณด๋“œ
  2. ํ—ค์–ด๋“œ๋ผ์ด๊ธฐ
  3. ํ•ธ๋“œํฐ ์ถฉ์ „๊ธฐ
  4. ๋””์ง€ํ„ธ ์นด๋ฉ”๋ผ ์ถฉ์ „๊ธฐ
  5. ํ‚ค๋ณด๋“œ
  6. ํ—ค์–ด๋“œ๋ผ์ด๊ธฐ

ํ‚ค๋ณด๋“œ, ํ—ค์–ด๋“œ๋ผ์ด๊ธฐ, ํ•ธ๋“œํฐ ์ถฉ์ „๊ธฐ์˜ ํ”Œ๋Ÿฌ๊ทธ๋ฅผ ์ˆœ์„œ๋Œ€๋กœ ๋ฉ€ํ‹ฐํƒญ์— ๊ฝ‚์€ ๋‹ค์Œ ๋””์ง€ํ„ธ ์นด๋ฉ”๋ผ ์ถฉ์ „๊ธฐ ํ”Œ๋Ÿฌ๊ทธ๋ฅผ ๊ฝ‚๊ธฐ ์ „์— ํ•ธ๋“œํฐ์ถฉ์ „๊ธฐ ํ”Œ๋Ÿฌ๊ทธ๋ฅผ ๋นผ๋Š” ๊ฒƒ์ด ์ตœ์ ์ผ ๊ฒƒ์ด๋ฏ€๋กœ ํ”Œ๋Ÿฌ๊ทธ๋Š” ํ•œ ๋ฒˆ๋งŒ ๋นผ๋ฉด ๋œ๋‹ค. 

 

์ž…๋ ฅ

์ฒซ ์ค„์—๋Š” ๋ฉ€ํ‹ฐํƒญ ๊ตฌ๋ฉ์˜ ๊ฐœ์ˆ˜ N (1 ≤ N ≤ 100)๊ณผ ์ „๊ธฐ ์šฉํ’ˆ์˜ ์ด ์‚ฌ์šฉํšŸ์ˆ˜ K (1 ≤ K ≤ 100)๊ฐ€ ์ •์ˆ˜๋กœ ์ฃผ์–ด์ง„๋‹ค. ๋‘ ๋ฒˆ์งธ ์ค„์—๋Š” ์ „๊ธฐ์šฉํ’ˆ์˜ ์ด๋ฆ„์ด K ์ดํ•˜์˜ ์ž์—ฐ์ˆ˜๋กœ ์‚ฌ์šฉ ์ˆœ์„œ๋Œ€๋กœ ์ฃผ์–ด์ง„๋‹ค. ๊ฐ ์ค„์˜ ๋ชจ๋“  ์ •์ˆ˜ ์‚ฌ์ด๋Š” ๊ณต๋ฐฑ๋ฌธ์ž๋กœ ๊ตฌ๋ถ„๋˜์–ด ์žˆ๋‹ค.

 

์ถœ๋ ฅ

ํ•˜๋‚˜์”ฉ ํ”Œ๋Ÿฌ๊ทธ๋ฅผ ๋นผ๋Š” ์ตœ์†Œ์˜ ํšŸ์ˆ˜๋ฅผ ์ถœ๋ ฅํ•˜์‹œ์˜ค. 

 

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

์ž…๋ ฅ

2 7
2 3 2 3 1 2 7

์ถœ๋ ฅ

2

 

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

let info = readLine()!.split(separator: " ").map({Int(String($0))!})
var use = readLine()!.split(separator: " ").map({Int(String($0))!}) // ์‚ฌ์šฉ ์ˆœ์„œ ๋Œ€๊ธฐ์—ด
var multitap = Array(repeating: 0, count: info[0]) // ๊ตฌ ๊ฐœ์ˆ˜๋งŒํผ 0์œผ๋กœ ์ฑ„์šด ๋ฉ€ํ‹ฐํƒญ ๋ฐฐ์—ด
var answer = 0

use.reverse()

while use.count > 0 {
    // ๋ฉ€ํ‹ฐํƒญ์— ๋นˆ ๊ณต๊ฐ„์ด ์žˆ์„ ๊ฒฝ์šฐ
    if multitap.contains(0) {
        if multitap.contains(use.last!) { use.removeLast() }
        else { multitap[multitap.firstIndex(of: 0)!] = use.removeLast() }
    }
    // ๋ฉ€ํ‹ฐํƒญ์— ๋นˆ ๊ณต๊ฐ„ ์—†์„ ๊ฒฝ์šฐ
    else {
        if multitap.contains(use.last!) { use.removeLast() }
        else {
            var min = use.count
            var check = 0
            for j in multitap {
                if !use.contains(j) { check = j; break }
                else if use.lastIndex(of: j)! < min { min = use.lastIndex(of: j)! }
            }
            if min == use.count { multitap[0] = use.removeLast() }
            else if check != 0 { multitap[multitap.firstIndex(of: check)!] = use.removeLast() }
            else { multitap[multitap.firstIndex(of: use[min])!] = use.removeLast() }
            answer += 1
        }
    }
}

print(answer)

๐Ÿ‘‰ ์ด ๋ฌธ์ œ๋Š” ํฌ๊ฒŒ 3๊ฐ€์ง€ ๊ณ ๋ คํ•  ์ ์ด ์žˆ๋‹ค.

1) ๋ฉ€ํ‹ฐํƒญ์— ๋นˆ ๊ณต๊ฐ„์ด ์žˆ์„ ๊ฒฝ์šฐ

2) ๋ฉ€ํ‹ฐํƒญ์— ๋นˆ ๊ณต๊ฐ„์ด ์—†์„ ๊ฒฝ์šฐ

3) ์ˆœ์„œ๊ฐ€ ๋‹ค๊ฐ€์˜จ ๋ฌผ๊ฑด์ด ํ˜„์žฌ ๋ฉ€ํ‹ฐํƒญ์— ๊ฝ‚ํ˜€์žˆ๋Š”์ง€

+ ์˜ˆ์™ธ๊ฐ€ ์•„์ฃผ ๋งŽ์€ ๋ฌธ์ œ๋ผ ์ œ์ถœ ์ „์— ๊ผญ ๋‹ค๋ฅธ ์˜ˆ์ œ๋ฅผ ๋งŽ์ด ๋งŒ๋“ค์–ด์„œ ํ…Œ์ŠคํŠธํ•ด๋ณด์‹œ๊ธธ ๋ฐ”๋ž๋‹ˆ๋‹น,,

  • ์šฐ์„  ์—ฐ์‚ฐ์„ ์ง„ํ–‰ํ•˜๊ธฐ ์ „, ์ž…๋ ฅ๋ฐ›์€ ์ˆœ์„œ ๋ฐฐ์—ด use๋ฅผ ๋ฐ˜๋Œ€๋กœ ๋’ค์ง‘์–ด์ฃผ์—ˆ๋‹ค.
    ์—ฐ์‚ฐ์„ ์ง„ํ–‰ํ•˜๋ฉด์„œ ์ˆœ์„œ๊ฐ€ ์ง€๋‚œ ๋ฌผ๊ฑด์€ use์—์„œ ์‚ญ์ œํ•ด์ค„ ๊ฒƒ์ธ๋ฐ, ๋ฐฐ์—ด์˜ ์•ž์—์„œ๋ถ€ํ„ฐ ์‚ญ์ œํ•ด๋‚˜๊ฐ„๋‹ค๋ฉด
    ๊ณ„์† ๋ฐฐ์—ด์„ ํ•œ ์นธ์”ฉ ๋‹น๊ฒจ์•ผํ•˜๋Š” ๋น„ํšจ์œจ์„ฑ์„ ๊ฐ€์ง€๊ฒŒ ๋˜๋ฏ€๋กœ reverseํ•˜์—ฌ ๋’ค์—์„œ๋ถ€ํ„ฐ ์ˆœ์„œ๋ฅผ ์‹œ์ž‘ํ•˜๊ฒŒํ–ˆ๋‹ค.
  • use ๋ฐฐ์—ด์ด ๋ชจ๋‘ ์‚ญ์ œ๋  ๋•Œ๊นŒ์ง€ while๋ฌธ์„ ๋ฐ˜๋ณตํ•˜๊ฒŒ ํ–ˆ๋Š”๋ฐ, ๋ฉ€ํ‹ฐํƒญ์— ๋นˆ ๊ณต๊ฐ„์ด ์žˆ์„ ๊ฒฝ์šฐ์™€ ์—†์„ ๊ฒฝ์šฐ๋กœ ๋‚˜๋ˆด๋‹ค.
  • ๋จผ์ € ๋ฉ€ํ‹ฐํƒญ์— ๋นˆ ๊ณต๊ฐ„์ด ์žˆ์„ ๊ฒฝ์šฐ๋Š” multitap ๋ฐฐ์—ด์ด 0์„ ํฌํ•จํ•˜๋Š”์ง€๋กœ ์ฒดํฌํ•ด์ฃผ์—ˆ๊ณ ,
    ์ˆœ์„œ๊ฐ€ ๋‹ค๊ฐ€์˜จ ๋ฌผ๊ฑด์ด ํ˜„์žฌ ๋ฉ€ํ‹ฐํƒญ ์•ˆ์— ์กด์žฌํ•˜๋Š”์ง€ ํ™•์ธํ–ˆ๋‹ค.
    ์กด์žฌํ•  ๊ฒฝ์šฐ์—๋Š” ๋‹ค์‹œ ์ฝ”๋“œ๋ฅผ ๋บ„ ์ด์œ ๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์— ๊ทธ๋ƒฅ use๋ฐฐ์—ด์—์„œ ์‚ญ์ œ๋งŒ ํ•ด์ฃผ์—ˆ๊ณ ,
    ์กด์žฌํ•˜์ง€ ์•Š์„ ๊ฒฝ์šฐ์—๋Š” ๋ฉ€ํ‹ฐํƒญ์˜ ๋นˆ ์ž๋ฆฌ์ค‘ ์ฒซ ๋ฒˆ์งธ ์ž๋ฆฌ์— ํ•ด๋‹น ๋ฌผ๊ฑด์„ ๋„ฃ์–ด์ฃผ์—ˆ๋‹ค.
    (์ˆœ์„œ๋ฅผ ๋’ค์ง‘์–ด ์ฃผ์—ˆ์œผ๋ฏ€๋กœ ์ฝ”๋“œ ์•ˆ์—์„œ ์ˆœ์„œ๊ฐ€ ๋‹ค๊ฐ€์˜จ ๋ฌผ๊ฑด์€ ๊ณ„์† use.last!๋กœ ํ‘œํ˜„ํ•  ์˜ˆ์ •์ด๋‹ค.)
  • ๋ฉ€ํ‹ฐํƒญ์— ๋นˆ ๊ณต๊ฐ„์ด ์—†์„ ๊ฒฝ์šฐ์—๋Š” ๋นˆ ๊ณต๊ฐ„์ด ์žˆ์„ ๊ฒฝ์šฐ๋ณด๋‹ค ์กฐ๊ธˆ ๋” ๊ณ ๋ คํ•  ์‚ฌํ•ญ์ด ์žˆ๋Š”๋ฐ,
    1) ๋ฉ€ํ‹ฐํƒญ์— ์ˆœ์„œ๊ฐ€ ๋‹ค๊ฐ€์˜จ ๋ฌผ๊ฑด์ด ์ด๋ฏธ ๊ฝ‚ํ˜€์žˆ๋Š”๊ฐ€?
    2) ์ˆœ์„œ๊ฐ€ ๋‹ค๊ฐ€์˜จ ๋ฌผ๊ฑด์ด ๋ฉ€ํ‹ฐํƒญ์— ๊ฝ‚ํ˜€์žˆ์ง€ ์•Š๋Š”๊ฐ€?
    2-1) ๋ฉ€ํ‹ฐํƒญ์— ๊ฝ‚ํ˜€์žˆ๋Š” ๋ฌผ๊ฑด ์ „๋ถ€๊ฐ€ use์— ์กด์žฌํ•˜์ง€ ์•Š๋Š”๊ฐ€?
    2-2) ๋ฉ€ํ‹ฐํƒญ์— ๊ฝ‚ํ˜€์žˆ๋Š” ๋ฌผ๊ฑด๋“ค ์ค‘ use์— ์กด์žฌํ•˜์ง€ ์•Š๋Š” ๋ฌผ๊ฑด์ด ์žˆ๋Š”๊ฐ€?
    2-3) ๋ฉ€ํ‹ฐํƒญ์— ๊ฝ‚ํ˜€์žˆ๋Š” ๋ฌผ๊ฑด๋“ค ์ „๋ถ€๊ฐ€ use์— ์กด์žฌํ•˜๋Š”๊ฐ€?
  • 1) ๋ฉ€ํ‹ฐํƒญ์— ์ˆœ์„œ๊ฐ€ ๋‹ค๊ฐ€์˜จ ๋ฌผ๊ฑด์ด ์ด๋ฏธ ๊ฝ‚ํ˜€์žˆ๋‹ค๋ฉด ๊ทธ๋ƒฅ use ๋ฐฐ์—ด์—์„œ ํ•ด๋‹น ๋ฌผ๊ฑด ์‚ญ์ œ๋งŒ ์ง„ํ–‰ํ–ˆ๋‹ค.
  • 2) ์ˆœ์„œ๊ฐ€ ๋‹ค๊ฐ€์˜จ ๋ฌผ๊ฑด์ด ๋ฉ€ํ‹ฐํƒญ์— ๊ฝ‚ํ˜€์žˆ์ง€ ์•Š๋‹ค๋ฉด for๋ฌธ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฉ€ํ‹ฐํƒญ ๋ฐฐ์—ด์„ ๊ฒ€์‚ฌํ–ˆ๋‹ค.
    ๋ฉ€ํ‹ฐํƒญ ๋ฐฐ์—ด์— ๊ฝ‚ํžŒ ๋ฌผ๊ฑด๋“ค์˜ use์—์„œ์˜ ์œ„์น˜๋ฅผ ํ™•์ธ, ๊ทธ ์ค‘ ์ˆœ์„œ๊ฐ€ ๊ฐ€์žฅ ๋Šฆ๋Š” ๋ฌผ๊ฑด์˜ ์œ„์น˜๋ฅผ min์— ์ €์žฅํ–ˆ๋‹ค.
    ๋ฐ˜๋ณตํ•˜๋ฉฐ min์„ ๊ฐฑ์‹ ํ•˜๋˜ ์ค‘, ๋ฉ€ํ‹ฐํƒญ์— ๊ฝ‚ํ˜€์žˆ๋Š” ๋ฌผ๊ฑด๋“ค ์ค‘ use ๋ฐฐ์—ด์— ์กด์žฌํ•˜์ง€ ์•Š๋Š” ๋ฌผ๊ฑด์„ ๋ฐœ๊ฒฌํ–ˆ๋‹ค๋ฉด
    multitap ๋ฐฐ์—ด์—์„œ ์–ด๋–ค ๋ฌผ๊ฑด์„ ๋บ„์ง€ ๊ณ ๋ฏผํ•  ํ•„์š”๋„ ์—†์ด ํ•ด๋‹น ๋ฌผ๊ฑด์„ ๋ฉ€ํ‹ฐํƒญ์—์„œ ๋นผ๋ฉด ๋˜๊ธฐ ๋•Œ๋ฌธ์—
    ๋ฐ”๋กœ for๋ฌธ์„ breakํ•ด์ฃผ์—ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  for๋ฌธ ์•„๋ž˜์— ์œ„์—์„œ ๋งํ•œ 2-1), 2-2), 2-3)๋ฒˆ ์˜ˆ์™ธ๋ฅผ ๊ณ ๋ คํ–ˆ๋‹ค.
  • 2-1) min์ด ์ฒ˜์Œ ๊ทธ๋Œ€๋กœ๋ผ๋ฉด ๋ฉ€ํ‹ฐํƒญ์— ๊ฝ‚ํžŒ ๋ฌผ๊ฑด๋“ค ๋ชจ๋‘๊ฐ€ use ๋ฐฐ์—ด์— ์กด์žฌํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ์˜๋ฏธ์ด๋ฏ€๋กœ
    ์•„๋ฌด ๋ฌผ๊ฑด์ด๋‚˜ ๋นผ๋„ ์ƒ๊ด€์—†๋‹ค. ๋”ฐ๋ผ์„œ ๊ทธ๋ƒฅ multitap์˜ ์ฒซ ๋ฒˆ์งธ ์ž๋ฆฌ์— ์ˆœ์„œ๊ฐ€ ๋‹ค๊ฐ€์˜จ ๋ฌผ๊ฑด์„ ๋„ฃ์–ด์ฃผ์—ˆ๋‹ค.
  • 2-2) check๊ฐ€ 0์ด ์•„๋‹ˆ๋ผ๋Š” ๊ฒƒ์€ ์–ด๋– ํ•œ ๋ฌผ๊ฑด์ด use์— ์กด์žฌํ•˜์ง€ ์•Š์Œ์„ ํ™•์ธํ–ˆ๋‹ค๋Š” ๋œป์ด๋ฏ€๋กœ
    multitap์—์„œ check์— ์ €์žฅ๋œ ๋ฌผ๊ฑด์„ ์ฐพ์•„ ๊ทธ ์œ„์น˜์— ์žˆ๋Š” ๋ฌผ๊ฑด์„ ๋นผ์ฃผ๊ณ  ์ˆœ์„œ๊ฐ€ ์˜จ ๋ฌผ๊ฑด์„ ๊ฝ‚์•„์ฃผ์—ˆ๋‹ค.
  • 2-3) 2-1๋ฒˆ๊ณผ 2-3๋ฒˆ์˜ ์กฐ๊ฑด์— ๊ฑธ๋ฆฌ์ง€ ์•Š์•˜๋‹ค๋ฉด, ๋ฉ€ํ‹ฐํƒญ์˜ ๋ชจ๋“  ๋ฌผ๊ฑด์ด use ๋ฐฐ์—ด์— ์กด์žฌํ•œ๋‹ค๋Š” ๋œป์ด๋ฏ€๋กœ
    ๊ฐ€์žฅ ์ˆœ์„œ๊ฐ€ ๋Šฆ๋Š” ๋ฌผ๊ฑด(min)์˜ multitap์—์„œ์˜ ์œ„์น˜๋ฅผ ์ฐพ์•„ ๋นผ๊ณ  ์ˆœ์„œ๊ฐ€ ๋‹ค๊ฐ€์˜จ ๋ฌผ๊ฑด์„ ๋„ฃ์–ด์ฃผ์—ˆ๋‹ค.

 

๐Ÿ’ก ํ”ผ๋“œ๋ฐฑ
  • ์ฒ˜์Œ์—” use ๋ฐฐ์—ด์—, ๋ฉ€ํ‹ฐํƒญ์˜ ๋ฌผ๊ฑด๋“ค์˜ ์œ„์น˜๋ฅผ ์ „๋ถ€ ์ฐพ์•„์ฃผ๊ณ  ๊ฒ€์‚ฌํ•˜๋Š”๊ฒƒ์ด ๋„ˆ๋ฌด ๋น„ํšจ์œจ์ ์ผ๊นŒ๋ด
    ์–ด๋–ป๊ฒŒ๋“  ํšจ์œจ์ ์œผ๋กœ ํ’€์–ด๋ณด๊ธฐ ์œ„ํ•ด ์• ์ผ๋Š”๋ฐ,, ๊ทธ๋ ‡๊ฒŒ ํ‘ธ๋‹ˆ๊นŒ ์˜ˆ์™ธ๊ฐ€ ๋๋„ ์—†์ด ๋‚˜์™€์„œใ…œใ…œ
    ๊ทธ๋ƒฅ ๊ณ„์† ๊ฒ€์‚ฌํ•ด์ฃผ๋Š” ๋ฐฉ๋ฒ•์„ ํƒํ–ˆ๋‹ค.
  • ๋ฌธ์ œ ํ‘ธ๋Š”๋ฐ ๊ต‰์žฅํžˆ ์˜ค๋ž˜๊ฑธ๋ ธ๋Š”๋ฐ, ๊ทธ๋ฆฌ๋”” ๋ฌธ์ œ๋Š” ํšจ์œจ๋ณด๋‹ค๋„
    ๋ชจ๋“  ์˜ˆ์™ธ๋ฅผ ํฌํ•จํ•  ์ˆ˜ ์žˆ๋Š” ์ •ํ™•ํ•œ ์ฝ”๋“œ๋ฅผ ์งœ๋Š” ๋ฐฉ์•ˆ์„ ์ƒ๊ฐํ•ด ๋‚ด๋Š” ๊ฒƒ์ด ๋” ์ค‘์š”ํ•œ ๊ฒƒ ๊ฐ™๋‹ค.

 


 

๋ฌธ์ œ

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

๋Œ“๊ธ€