[백준] 좋은 구간 (1059)
문제 설명
입력 및 출력
» 입력
첫째 줄에 집합 S의 크기 L이 주어진다. 둘째 줄에는 집합에 포함된 정수가 주어진다. 셋째 줄에는 n이 주어진다.
» 출력
첫째 줄에 n을 포함하는 좋은 구간의 개수를 출력한다.
제한 사항
1 ≤ L ≤ 50 집합 S에는 중복되는 정수가 없다. 집합 S에 포함된 모든 정수는 1보다 크거나 같고, 1,000보다 작거나 같다. 1 ≤ n ≤ (집합 S에서 가장 큰 정수)
예제 입출력(테스트케이스)
입력 | 출력 |
---|---|
4 1 7 14 10 2 |
4 |
5 4 8 13 24 30 10 |
5 |
5 10 20 30 40 50 30 |
0 |
8 3 7 12 18 25 100 33 1000 59 |
1065 |
문제 풀이 (KOTLIN)
val mSet = mutableSetOf<Pair<Int, Int>>()
var L = 0
var S = listOf<Int>()
var n = 0
fun main(args: Array<String>) = with(System.`in`.bufferedReader()) {
L = readLine().toInt()
S = readLine()
.split(" ")
.map { it.toInt() }
.sorted()
n = readLine().toInt()
when (n) {
in S -> {
println(0)
}
in S[0]..S[L - 1] -> {
for (i in 0 until S.size - 1) {
findAB(S[i], S[i + 1])
}
// println(mSet.toString())
println(mSet.size)
}
else -> {
if (n < S[0]) {
findAB(n, S[0] - 1)
} else if (S[L - 1] < n) {
findAB(S[L - 1] + 1, n)
}
// println(mSet.toString())
println(mSet.size)
}
}
}
fun findAB(begin: Int, end: Int) {
when {
begin != n && end != n -> {
if (n in begin + 1 until end) {
// println("$begin ~ $end : ${n in begin..end}")
for (j in begin + 1..n) for (k in j + 1 until end) {
if (n in j..k)
mSet.add(Pair(j, k))
}
}
}
begin == n -> {
if (n in 1..end) {
// println("1 ~ $end : ${n in 1..end}")
for (j in 1..end) for (k in j + 1..end) {
if (n in j..k)
mSet.add(Pair(j, k))
}
}
}
else -> {
if (n in begin + 1..n) {
// println("${begin + 1} ~ $end : ${n in begin + 1..end}")
for (j in begin + 1..n) for (k in j + 1..end) {
if (n in j..k)
mSet.add(Pair(j, k))
}
}
}
}
}
문제 풀이 (KOTLIN)
import java.util.StringTokenizer
fun main(args: Array<String>) = with(System.`in`.bufferedReader()) {
val L = readLine().toInt()
val st = StringTokenizer(readLine())
val N = readLine().toInt()
var max = 0
var min = 1001
var ans = 0
for (i in 0 until L) {
val tmp = st.nextToken().toInt()
if (tmp in (max + 1)..N) max = tmp
if (tmp in (N + 1) until min) min = tmp
}
if (min != 1001 && N != max) ans = (N - max) * (min - N) - 1
println(ans)
}
문제 풀이 (SWIFT)
let L = Int(readLine()!)!
let S = readLine()!
.split(separator: " ")
.map { Int($0)! }
.sorted()
let n = Int(readLine()!)!
let min = S.last{ $0 < n }
let max = S.first{ $0 > n }
if S.contains(n) {
print(0)
} else if min == nil {
print(n * (max! - n) - 1)
} else {
print((n - (min ?? n)) * ((max ?? n) - n) - 1)
}