[Swift] 백준, 수 묶기
문제 링크
잡담
안녕하세요! 오랜만에 알고리즘 문제좀 풀었습니다. ㅎㅎ 1월 너무 바쁘네요 ㅋㅋㅋ 🤪
최대한 여유 있을 때, 하루에 하나정도 풀려고 노력하고 있습니다. 문제를 못풀더라도 다른 풀이법을 보면서 이렇게도 푸는구나 정도를 익힐려고 꾸준하게 풀어볼려고 합니다.
오늘도 하나 풀었으니, 만족합니다.
풀이
- 양수, 음수, 0을 따로 저장한다. (0은 있는지 없는지 체크하는 방식)
- 양수는 내림차순, 음수는 오름차순으로 정렬한다.
- 양수와 음수 각각 2개씩 곱해서 더 한다.
- 1의 경우 곱하지 않고 무조건 더한다.
- 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)