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

[Swift Algorithm] ์ˆ˜ ๋ฌถ๊ธฐ BOJ #1744

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

๊ธธ์ด๊ฐ€ N์ธ ์ˆ˜์—ด์ด ์ฃผ์–ด์กŒ์„ ๋•Œ, ๊ทธ ์ˆ˜์—ด์˜ ํ•ฉ์„ ๊ตฌํ•˜๋ ค๊ณ  ํ•œ๋‹ค. ํ•˜์ง€๋งŒ, ๊ทธ๋ƒฅ ๊ทธ ์ˆ˜์—ด์˜ ํ•ฉ์„ ๋ชจ๋‘ ๋”ํ•ด์„œ ๊ตฌํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ, ์ˆ˜์—ด์˜ ๋‘ ์ˆ˜๋ฅผ ๋ฌถ์œผ๋ ค๊ณ  ํ•œ๋‹ค. ์–ด๋–ค ์ˆ˜๋ฅผ ๋ฌถ์œผ๋ ค๊ณ  ํ•  ๋•Œ, ์œ„์น˜์— ์ƒ๊ด€์—†์ด ๋ฌถ์„ ์ˆ˜ ์žˆ๋‹ค. ํ•˜์ง€๋งŒ, ๊ฐ™์€ ์œ„์น˜์— ์žˆ๋Š” ์ˆ˜(์ž๊ธฐ ์ž์‹ )๋ฅผ ๋ฌถ๋Š” ๊ฒƒ์€ ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์–ด๋–ค ์ˆ˜๋ฅผ ๋ฌถ๊ฒŒ ๋˜๋ฉด, ์ˆ˜์—ด์˜ ํ•ฉ์„ ๊ตฌํ•  ๋•Œ ๋ฌถ์€ ์ˆ˜๋Š” ์„œ๋กœ ๊ณฑํ•œ ํ›„์— ๋”ํ•œ๋‹ค.

์˜ˆ๋ฅผ ๋“ค๋ฉด, ์–ด๋–ค ์ˆ˜์—ด์ด {0, 1, 2, 4, 3, 5}์ผ ๋•Œ, ๊ทธ๋ƒฅ ์ด ์ˆ˜์—ด์˜ ํ•ฉ์„ ๊ตฌํ•˜๋ฉด 0+1+2+4+3+5 = 15์ด๋‹ค. ํ•˜์ง€๋งŒ, 2์™€ 3์„ ๋ฌถ๊ณ , 4์™€ 5๋ฅผ ๋ฌถ๊ฒŒ ๋˜๋ฉด, 0+1+(2*3)+(4*5) = 27์ด ๋˜์–ด ์ตœ๋Œ€๊ฐ€ ๋œ๋‹ค.

์ˆ˜์—ด์˜ ๋ชจ๋“  ์ˆ˜๋Š” ๋‹จ ํ•œ๋ฒˆ๋งŒ ๋ฌถ๊ฑฐ๋‚˜, ์•„๋‹ˆ๋ฉด ๋ฌถ์ง€ ์•Š์•„์•ผํ•œ๋‹ค.

์ˆ˜์—ด์ด ์ฃผ์–ด์กŒ์„ ๋•Œ, ์ˆ˜์—ด์˜ ๊ฐ ์ˆ˜๋ฅผ ์ ์ ˆํžˆ ๋ฌถ์—ˆ์„ ๋•Œ, ๊ทธ ํ•ฉ์ด ์ตœ๋Œ€๊ฐ€ ๋˜๊ฒŒ ํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค.

 

์ž…๋ ฅ

์ฒซ์งธ ์ค„์— ์ˆ˜์—ด์˜ ํฌ๊ธฐ N์ด ์ฃผ์–ด์ง„๋‹ค. N์€ 10,000๋ณด๋‹ค ์ž‘์€ ์ž์—ฐ์ˆ˜์ด๋‹ค. ๋‘˜์งธ ์ค„๋ถ€ํ„ฐ N๊ฐœ์˜ ์ค„์—, ์ˆ˜์—ด์˜ ๊ฐ ์ˆ˜๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. ์ˆ˜์—ด์˜ ์ˆ˜๋Š” -10,000๋ณด๋‹ค ํฌ๊ฑฐ๋‚˜ ๊ฐ™๊ณ , 10,000๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ ๊ฐ™์€ ์ •์ˆ˜์ด๋‹ค.

 

์ถœ๋ ฅ

์ˆ˜๋ฅผ ํ•ฉ์ด ์ตœ๋Œ€๊ฐ€ ๋‚˜์˜ค๊ฒŒ ๋ฌถ์—ˆ์„ ๋•Œ ํ•ฉ์„ ์ถœ๋ ฅํ•œ๋‹ค. ์ •๋‹ต์€ ํ•ญ์ƒ 231๋ณด๋‹ค ์ž‘๋‹ค.

 

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

์ž…๋ ฅ

4
-1
2
1
3

์ถœ๋ ฅ

6

 

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

let N = Int(readLine()!)!
var minus = [Int]()
var plus = [Int]()
var answer = 0

for _ in 0..<N {
    let input = Int(readLine()!)!
    if input <= 0 { minus.append(input) } // ์Œ์ˆ˜
    else if input == 1 { answer += 1 } // 1์ผ ๊ฒฝ์šฐ ๋ฐ”๋กœ answer์— ๋ˆ„์ 
    else { plus.append(input) } // ์–‘์ˆ˜
}

plus.sort(by: >)
minus.sort(by: <)

if minus.count % 2 == 1 { answer += minus.removeLast() }
if plus.count % 2 == 1 { answer += plus.removeLast() }

while minus.count > 0 || plus.count > 0 {
    if minus.count > 0 { answer += minus.removeLast() * minus.removeLast() }
    if plus.count > 0 { answer += plus.removeLast() * plus.removeLast() }
}

print(answer)

๐Ÿ‘‰ ๊ณฑํ–ˆ์„ ๋•Œ ์ด๋“์ด ๋˜๋Š” ์ˆ˜๋ฅผ ์ฐพ๊ณ , ๋”ํ–ˆ์„ ๋•Œ ์ด๋“์ด ๋˜๋Š” ์ˆ˜๊ฐ€ ๋ฌด์—‡์ธ์ง€ ์ •ํ™•ํžˆ ํŒŒ์•…ํ•˜๋Š” ๊ฒƒ์ด ํ•ต์‹ฌ!

์ด ๋ฌธ์ œ๋Š” ์Œ์ˆ˜๋ถ€ํ„ฐ ์–‘์ˆ˜๊นŒ์ง€ ๋ชจ๋‘ ๋‹ค๋ฃจ๊ธฐ ๋•Œ๋ฌธ์— ์Œ์ˆ˜์ผ ๊ฒฝ์šฐ, 0, 1์ผ ๊ฒฝ์šฐ, ๊ทธ๋ฆฌ๊ณ  ์–‘์ˆ˜์ผ ๊ฒฝ์šฐ๋ฅผ ๊ฐ๊ฐ ๊ณ ๋ คํ•ด์•ผํ•œ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ๋˜ ํ•˜๋‚˜ ๊ณ ๋ คํ•  ์ ์€, ์–‘์ˆ˜๋“  ์Œ์ˆ˜๋“  ์ตœ๋Œ€ํ•œ ์ ˆ๋Œ“๊ฐ’์ด ํฐ ์ˆ˜๋ผ๋ฆฌ ๊ณฑํ•ด์ฃผ๋Š” ๊ฒƒ์ด ๋“์ด ๋œ๋‹ค๋Š” ๊ฒƒ.

๊ทธ๋Ÿฌ๋ฉด ์ด์ œ ์œ„์˜ ์ „์ œ๋ฅผ ํ† ๋Œ€๋กœ ์šฐ๋ฆฌ๊ฐ€ ์ฒ˜๋ฆฌํ•  ์‚ฌํ•ญ๋“ค์„ ์ •๋ฆฌํ•ด๋ณด์ž.

1) 0์ดํ•˜์˜ ์ˆ˜(0๊ณผ ์Œ์ˆ˜)๋Š” ์ ˆ๋Œ“๊ฐ’์ด ํฐ ์ˆ˜๋ถ€ํ„ฐ ์ฐจ๋ก€๋กœ ๊ณฑํ•ด์ฃผ๋Š” ๊ฒƒ์ด ๋“์ด๋‹ค.

2) 1์€ ๋ช‡ ๊ฐœ๊ฐ€ ๋๋“  ๋”ํ•ด์ฃผ๋Š” ๊ฒƒ์ด ๋“์ด๋‹ค.

3) 2์ด์ƒ์˜ ์–‘์ˆ˜๋Š” ํฐ ์ˆ˜๋ถ€ํ„ฐ ์ฐจ๋ก€๋กœ ๊ณฑํ•ด์ฃผ๋Š” ๊ฒƒ์ด ๋“์ด๋‹ค.

  • ์œ„์˜ ์‚ฌํ•ญ๋“ค์„ ์ „์ œ๋กœ ๋ฌธ์ œ๋ฅผ ํ’€์ดํ•˜๊ธฐ ์œ„ํ•ด, ์ˆ˜๋ฅผ ์ž…๋ ฅ๋ฐ›์„ ๋•Œ (0 ์ดํ•˜ / 1 / 2 ์ด์ƒ) ์œผ๋กœ ๋‚˜๋ˆ„์–ด ๋ฐ›์•˜๋‹ค.
    1์˜ ๊ฒฝ์šฐ์—๋Š” ์–ด์ฐจํ”ผ ๋”ํ•˜๊ธฐ๋งŒ ํ•  ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์—, ๋ฐ”๋กœ answer์— 1์”ฉ ๋”ํ•ด์ฃผ์—ˆ๋‹ค.
    ๊ทธ๋ฆฌ๊ณ  0 ์ดํ•˜์˜ ์ˆ˜๋Š” minus ๋ฐฐ์—ด, 2 ์ด์ƒ์˜ ์ˆ˜๋Š” plus ๋ฐฐ์—ด์— ๊ฐ๊ฐ ๋‹ด์•„์ฃผ์—ˆ๋‹ค.
  • plus ๋ฐ minus ๋ฐฐ์—ด์— ๋‹ด๊ธด ์ˆ˜๋“ค์€ ์ ˆ๋Œ“๊ฐ’์ด ํฐ ์ˆ˜๋ผ๋ฆฌ ๊ณฑํ•ด์ค„ ์˜ˆ์ •์ด๊ธฐ์— ์•Œ๋งž๊ฒŒ ์ •๋ ฌํ•ด์ฃผ์—ˆ๋‹ค.
    ํ•˜์ง€๋งŒ ์•„๋ฌด๋ฆฌ plus, minus ๋ฐฐ์—ด์— ๋‹ด๊ธด ์ˆ˜๋“ค์ด ๊ณฑํ–ˆ์„ ๋•Œ ๋“์ด ๋˜๋Š” ์ˆ˜์ผ์ง€๋ผ๋„,
    ๊ฐ ๋ฐฐ์—ด์— ๋‹ด๊ธด ์ˆ˜์˜ ๊ฐœ์ˆ˜๊ฐ€ ํ™€์ˆ˜์ผ ๊ฒฝ์šฐ์—๋Š” ๊ณฑํ•ด์งˆ ์ˆ˜ ์—†๋Š” ์ˆ˜๊ฐ€ ์กด์žฌํ•˜๊ธฐ ๋•Œ๋ฌธ์—
    ๊ทธ ๋•Œ๋Š” ์ œ์ผ ์ž‘์€ ์ˆ˜๋ฅผ ๊ทธ๋ƒฅ ๋”ํ•ด์ฃผ๊ธฐ ์œ„ํ•ด์„œ ์ ˆ๋Œ“๊ฐ’ ๊ธฐ์ค€ ์ž‘์€ ์ˆ˜๊ฐ€ ๋’ค๋กœ ๊ฐ€๋„๋ก ์ •๋ ฌํ•œ๋‹ค.
  • ๋‚˜๋จธ์ง€ ์—ฐ์‚ฐ์œผ๋กœ plus, minus ๋ฐฐ์—ด์˜ ์š”์†Œ ๊ฐœ์ˆ˜๋ฅผ ํ™•์ธํ•˜์—ฌ ํ™€์ˆ˜์ผ ๊ฒฝ์šฐ์—๋Š”
    answer์— ๊ฐ ๋ฐฐ์—ด์˜ ๋งˆ์ง€๋ง‰ ์š”์†Œ๋ฅผ ์‚ญ์ œํ•จ๊ณผ ๋™์‹œ์— ๊ฐ’์„ ๋ˆ„์ ํ•ด์ฃผ์—ˆ๋‹ค.
  • minus์™€ plus ๋ฐฐ์—ด ๋ชจ๋‘ ๋’ค์—์„œ๋ถ€ํ„ฐ ๋‘ ๊ฐœ์”ฉ ๊ณฑํ•ด answer์— ๋ˆ„์ ํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์—ฐ์‚ฐํ–ˆ๋‹ค.

 

๐Ÿ’ก ํ”ผ๋“œ๋ฐฑ
  • ํ’€์ด ์ „, ๋จผ์ € ์–ด๋–ค ์ˆ˜๋Š” ๊ณฑํ•ด์•ผ ํ•˜๊ณ  ์–ด๋–ค ์ˆ˜๋Š” ๋”ํ•ด์•ผํ• ์ง€ ๋ฏธ๋ฆฌ ๊ณ ๋ คํ•œ ํ›„์— ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋‹ˆ ์‰ฝ๊ฒŒ ํ’€ ์ˆ˜ ์žˆ์—ˆ๋‹ค.

 


 

๋ฌธ์ œ

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

๋Œ“๊ธ€