[Swift] 백준, 수 묶기

문제 링크

백준 알고리즘 - 수 묶기

잡담

안녕하세요! 오랜만에 알고리즘 문제좀 풀었습니다. ㅎㅎ 1월 너무 바쁘네요 ㅋㅋㅋ 🤪

최대한 여유 있을 때, 하루에 하나정도 풀려고 노력하고 있습니다. 문제를 못풀더라도 다른 풀이법을 보면서 이렇게도 푸는구나 정도를 익힐려고 꾸준하게 풀어볼려고 합니다.

오늘도 하나 풀었으니, 만족합니다.

풀이

  1. 양수, 음수, 0을 따로 저장한다. (0은 있는지 없는지 체크하는 방식)
  2. 양수는 내림차순, 음수는 오름차순으로 정렬한다.
  3. 양수와 음수 각각 2개씩 곱해서 더 한다.
  4. 1의 경우 곱하지 않고 무조건 더한다.
  5. 0이 존재하고, 음수의 개수가 홀수일 경우 음수에서 가장 큰 값을 0과 곱한다. (즉, 더해주지 않겠다는 말이에요..)

일단 이 순서대로 코드를 짜봤어요! 물론 이 방식은 제가 생각해낸 방법은 아니구요.. ㅋㅋㅋㅋㅋ 1시간정도 스스로 생각해봤는데, 모르겠어서 결국 검색해봤습니다.

아무튼, 저렇게 풀었는데 계속 틀렸다고 나오는거에요.. 그 이유는 같은 숫자가 반복해서 나올 수 있다는 점이었어요..

음.. 저는 수열이라서 반복되는 숫자는 없을거라고 생각을 했었는데 따지고 보면 수열이라는게 검색해보니 “일정한 규칙에 따라 한 줄로 배열된 수의 열” 라고 구글이 친절하게 알려주네요.

즉, 중복된 숫자도 올 수 있다는 점입니다. 그래서 1은 양수 배열에 넣지 않고 바로 결과값에 더해줬어요.

0의 경우도 0이 여러개가 올 수 있으니까 무조건 true로 설정해줬습니다. (처음엔 toggle 메서드를 사용했습니다.)

코드


//
//  main.swift
//  수묶기
//
//  Created by 남기범 on 2021/01/05.
//  Copyright © 2021 남기범. All rights reserved.
//

import Foundation

let count = Int(readLine()!)!
var plus = [Int]()
var minus = [Int]()
var zeroCheck = false
var result = 0

for _ in 0..<count {
    let element = Int(readLine()!)!
    
    if element > 1 {
        plus.append(element)
    } else if element < 0 {
        minus.append(element)
    } else if element == 1 {
        result += 1
    } else {
        zeroCheck = true
    }
}

plus.sort(by: >)
minus.sort(by: <)
var i = 0

while i < plus.count - 1 {
    if plus[i+1] == 1 {
        result += plus[i] + plus[i+1]
        break
    }
    result += plus[i] * plus[i+1]
    i += 2
}

if plus.count % 2 == 1 {
    result += plus[plus.count - 1]
}

i = 0

while i < minus.count - 1 {
    result += minus[i] * minus[i+1]
    i += 2
}

if minus.count % 2 == 1 {
    if !zeroCheck {
        result += minus[minus.count - 1]
    }
}

print(result)