문제
N과 L이 주어질 때, 합이 N이면서, 길이가 적어도 L인 가장 짧은 연속된 음이 아닌 정수 리스트를 구하는 프로그램을 작성하시오.
입력
첫째 줄에 N과 L이 주어진다. N은 1,000,000,000보다 작거나 같은 자연수이고, L은 2보다 크거나 같고, 100보다 작거나 같은 자연수이다.
출력
만약 리스트의 길이가 100보다 작거나 같으면, 연속된 수를 첫째 줄에 공백으로 구분하여 출력한다. 만약 길이가 100보다 크거나 그러한 수열이 없을 때는 -1을 출력한다.
내가 푼 풀이
- 문제의 난이도 치곤 낮은 정답률을 자랑한다..
- swift에서 int형식으로 나눗셈을 하면 나머지는 모두 버려버린다.
접근방법: 수학
1. 수열은 연속되어있다.
2. 연속된 수열은 다음과 나타낼 수 있다.
(1, 2, 3, 4, 5) --> (a, a+1, a+2, a+3, a+4) (a=1)
3. 위의방법으로 하였을때 연속된 수열의 합은 5a + 10이된다.
4. 리스트의 길이가 2부터 100까지 위 방법으로 a를 구할 수 있다면 연속된 수열이 존재한다.
코드로 구현하면 다음과 같다
import Foundation
//입력받기
let input = readLine()!.split(separator: " ").map{Int(String($0))!}
var answer = 0
var sum = 0
var result = [Int]()
// 수열의 길이 2부터 100까지 검색
while answer < 100 {
answer += 1
// 수열의 합을 구한다.
var plus = 0
for i in 1..<answer {
plus += i
}
var dev = input[0] - plus
// plus의 값이 N보다 커진다면, 수열로 나타낼 수 없다(수열의 길이가 너무 길다)
if dev < 0 {
break
}
// 수열의합을 구했을때, a가 N보다 작은 수라면 연속된 수열이 존재한다고 판단.
var a = Double(dev) / Double(answer)
if dev % answer == 0 && answer >= input[1] {
result.append(Int(a))
break
}
}
if result.isEmpty {
print(-1)
} else {
for i in 1..<answer {
result.append(result[0]+i)
}
print(result.map{String($0)}.joined(separator: " "))
}
'코딩테스트 > 백준' 카테고리의 다른 글
BOJ-1027 고층 건물 Swift (0) | 2024.04.23 |
---|---|
BOJ-3190 뱀 Swift (0) | 2024.04.22 |
BOJ-1004 어린 왕자 Swift (1) | 2024.04.20 |
BOJ-2447 별 찍기-10 Swift (0) | 2024.04.15 |
BOJ-2580 스도쿠 Swift (0) | 2024.04.15 |