[Swift]BOJ-1744

BOJ-1744, 수 묶기

문제 📑

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

 

1744번: 수 묶기

길이가 N인 수열이 주어졌을 때, 그 수열의 합을 구하려고 한다. 하지만, 그냥 그 수열의 합을 모두 더해서 구하는 것이 아니라, 수열의 두 수를 묶으려고 한다. 어떤 수를 묶으려고 할 때, 위치에

www.acmicpc.net

 

문제 정리 ▾

BOJ-1744

  • 수들의 개수를 입력받는다.
  • 수들은 각각 개행으로 입력받는다.
    • 각각의 수들을 둘씩 묶거나, 아니면 묶지 않아야 한다.
  • 위 연산을 통해 입력받은 수들로 최댓값을 출력시킨다.

 

접근 🚶🏻

나의 생각 ▾

  • 이 문제는 케이스를 나누는 것이 중요하다고 생각했다.
  • 케이스는 아래와 같이 나눌 수 있다.
    • 양수일 때 (N > 1)
    • 1일 때
    • 음수일 때 (0 포함)

 

내 코드 ▾

import Foundation

func solution() {
    var plus = [Int]()
    var minus = [Int]()
    var result: Int = 0
    
    for _ in 0..<Int(readLine()!)! {
        let input = Int(readLine()!)!
        if input > 1 { plus.append(input) }
        else if input == 1 { result += 1}
        else { minus.append(input) }
    }
    
    plus.sort(by: > )
    minus.sort(by: < )
    
    if plus.count % 2 == 1 { result += plus.removeLast() }
    if minus.count % 2 == 1 { result += minus.removeLast() }
    
    while plus.count > 0 || minus.count > 0 {
        if plus.count > 0 { result += plus.removeLast() * plus.removeLast() }
        if minus.count > 0 { result += minus.removeLast() * minus.removeLast() }
    }
    print(result)
}

solution()
  • 여기서 포인트는 양수는 큰 순으로, 음수는 작은 순으로 정렬하는 것이다.
  • 음수는 무조건 절댓값이 큰 값끼리 곱해야 최댓값을 도출할 수 있다.
  • 1은 무조건 더해줘야 더 커지기 때문에 받는 즉시 1을 누적시켜주었다.

 

Addtional 📂

  • 결론적으로 곱해야 하는 두 수를 묶어주는 게 중요했는데 어떻게 묶어줘야 할지 머리가 잘 안 굴러갔다..
  • 아직도 많이 부족하다고 느끼게 해 준 고마운 문제였다 😅

'Algorithm.zip' 카테고리의 다른 글

[Swift]BOJ-3190  (0) 2022.07.12
[Swift]BOJ-3085  (0) 2022.07.12
[Swift]BOJ-16953  (0) 2022.04.06
[Swift]BOJ-1946  (0) 2022.04.06
[Swift]BOJ-1026  (0) 2022.04.04