문제 출처 : https://www.acmicpc.net/problem/4821
언어 : Kotlin
문제 설명 :
워드, 한글, 메모장과 같은 워드 프로세서에서 인쇄를 할 때, 페이지 범위를 직접 입력하여 지정할 수 있다. 예를 들면, 다음과 같이 입력할 수 있다.
10-15,25-28,8-4,13-20,9,8-8
사용자는 위처럼 인쇄하고자 하는 범위를 콤마로 구분하여 입력할 수 있다.
각 인쇄 범위는 양의 정수 하나 또는 하이픈(-)로 구분된 두 양의 정수이다. 수 두 개로 이루어진 범위에서 앞의 수를 low, 뒤의 수를 high라고 한다. 만약, low > high인 경우에는 이 범위는 인쇄하지 않는다. 또, 인쇄 범위가 문서의 범위를 넘어가는 경우에는 출력할 수 있는 페이지만 출력한다. 페이지 번호는 1부터 시작한다.
인쇄 범위는 겹칠 수 있다. 겹치는 페이지는 여러 번 인쇄하는 것이 아니고, 한 번만 인쇄해야 한다. (위의 예제에서 13, 14, 15는 두 범위에 포함된다)
인쇄 범위가 주어졌을 때, 출력해야 하는 페이지의 수를 구하는 프로그램을 작성하시오.
입력 :
입력은 여러 개의 테스트 케이스로 이루어져 있다. 각 테스트 케이스의 첫째 줄에는 문서의 총 페이지 수가 주어진다. 둘째 줄에는 인쇄 범위가 문제 설명에 나온 형식과 같이 주어진다. 입력의 마지막에는 0이 하나 주어진다. 문서는 많아야 1000페이지이고, 인쇄 범위의 길이는 1000글자를 넘지 않는다.
출력 :
각 테스트 케이스에 대해서, 출력해야 하는 페이지의 수를 출력한다.
제한 사항 :
- 시간 제한 : 1초
- 메모리 제한 : 256MB
입출력 예 :
입력 | 출력 |
30 10-15,25-28,8-4,13-20,9,8-8 19 10-15,25-28,8-4,13-20,9,8-8 0 |
17 12 |
풀이 :
import java.io.BufferedReader
import java.io.BufferedWriter
import java.io.InputStreamReader
import java.io.OutputStreamWriter
fun main() = with(BufferedReader(InputStreamReader(System.`in`))) {
val bw = BufferedWriter(OutputStreamWriter(System.out))
var input: String?
while (true) {
input = readLine()
if (input == "0") break
val arr = IntArray(1001)
readLine().split(",").forEach {
val nums = it.split("-").map { it.toInt() }
if (nums.size > 1) {
if (nums[0] <= nums[1]) {
(nums[0] .. nums[1]).forEach { num ->
if (num <= input.toInt()) arr[num]++
}
}
} else {
if (nums[0] <= input.toInt()) arr[nums[0]]++
}
}
bw.write("${arr.count { it > 0 }}\n")
}
bw.flush()
bw.close()
}
'백준 > 문제' 카테고리의 다른 글
21966번: (중략) (0) | 2024.08.05 |
---|---|
15874번: Caesar Cipher (0) | 2024.08.02 |
10931번: SHA-384 (0) | 2024.08.02 |
13506번: 카멜레온 부분 문자열 (0) | 2024.08.01 |
13297번: Quick Estimates (0) | 2024.08.01 |
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!