https://www.acmicpc.net/problem/2003
난이도 : 실버 4
태그 : 브루트포스, 두 포인터
설명
특정 구간이 주어지는 m과 같은 케이스를 구하는 문제입니다.
두 포인터를 사용해 풀 수 있을 것 같네요.
소스코드
import java.util.*
fun main() = with(System.`in`.bufferedReader()) {
val (n, m) = readLine().split(" ").map { it.toInt() }
val st = StringTokenizer(readLine())
val arr = Array(n) { st.nextToken().toInt() }
var left = 0
var right = 1
var sum = arr[0]
var cnt = 0
while (true) {
if (sum == m) {
cnt++
sum -= arr[left++]
} else if (sum < m) {
if (right == n) break
sum += arr[right++]
} else {
sum -= arr[left++]
}
}
println(cnt)
}
코드분석
- left, right 포인터를 선언 및 0, 1로 초기화, sum은 arr[0]으로 초기화
- 무한루프를 돌며 sum이 m과 같아지면 카운트를 1 증가시키고, 합에서 왼쪽 포인터를 뺌
- sum이 m보다 작다면 오른쪽 포인터를 더하고, 포인터를 1 증가시킴.
- right 배열이 맨 끝에 도달하여 배열 범위를 벗어나면 반복문 탈출
- sum이 m보다 크면 왼쪽 포인터를 삭제하고, 왼쪽 포인터를 1 증가시킴
'코딩테스트 > Kotlin' 카테고리의 다른 글
[백준 2110번] [Kotlin] 공유기 설치 (1) | 2023.02.17 |
---|---|
[백준 11382번] [Kotlin] 꼬마 정민 (0) | 2023.02.16 |
[백준 1550번] [Kotlin] 16진수 (0) | 2023.02.14 |
[백준 2953번] [Kotlin] 나는 요리사다 (0) | 2023.02.13 |
[백준 27324번] [Kotlin] ゾロ目 (Same Numbers) (0) | 2023.02.12 |