[백준] 좋은 구간 (1059)

문제 설명

백준 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)
}


태그:

카테고리:

업데이트: