#1059 좋은 구간
문제 정리
풀이
import Foundation
let l = Int(readLine()!)!
let s = Set(readLine()!.split(separator: " ").map { Int($0)! })
let n = Int(readLine()!)!
var min = 1
var max = 1000
// 0. n이 집합 S에 속하는 경우
if s.contains(n) {
min = n
max = n
}
else {
// 0. n-1 방향으로 진행하면서 집합 S와 일치하는 값이 있으면 직후의 값을 min에 저장
for i in stride(from: n, through: 1, by: -1) {
if s.contains(i) {
min = i+1
break
}
}
// 0. n+1 방향으로 진행하면서 집합 S와 일치하는 값이 있으면 직전의 값을 max에 저장
for i in stride(from: n, through: 1000, by: 1) {
if s.contains(i) {
max = i-1
break
}
}
}
// 1. 범위 생성
let arr = Array(min...max)
var output = 0
// 2. A < B인 경우의 수
for i in 0..<arr.endIndex {
for j in i+1..<arr.endIndex {
let a = arr[i]
let b = arr[j]
// 3. Range(A...B)에 n 이 포함되는 경우 count 증가
if Range(a...b).contains(n) { output += 1 }
}
}
print(output)
예제 입력 2 에 대한 예시
- 집합 S에서 n 으로부터 제일 가까운 원소를 찾아 범위를 만든다. -> 8, 13 -> 범위 : 9 ~ 12
- A < B 인 경우의 수를 찾아낸다. -> (9,10), (9,11), (9,12), (10,11), (10,12), (11,12)
- 각 경우에 대해 n이 포함되는 경우 count를 증가시킨다. -> (9~10).contains(n) = true
풀고나서 알게된 것
문제를 제대로 읽지않고 무작정 풀려는 습관이 있어 문제를 이해하는데 시간이 좀 걸렸다ㅜ
앞으론 문제를 이해한 다음 풀이에 돌입해보장
'알고리즘' 카테고리의 다른 글
[백준 BOJ] BOJ-8393 합 (0) | 2022.09.18 |
---|---|
[백준 BOJ] BOJ-7568 덩치 (0) | 2022.09.18 |
[백준 BOJ] BOJ-1920 수 찾기 (0) | 2022.09.18 |
[백준 BOJ] BOJ-1010 다리 놓기 (0) | 2022.09.18 |
[백준 BOJ] BOJ-1008 A/B (0) | 2022.09.18 |