Kotlin/Algorithm Problems
<백준> 24.06.03에 푼 문제들
re트
2024. 6. 3. 12:14
728x90
1. 회전 초밥 (Silver 1)
[백준]
https://www.acmicpc.net/problem/2531
[깃허브]
ForCodeKata/baekjoon 문제집/2531 회전 초밥 at main · heesoo-park/ForCodeKata
알고리즘 문제 코드 저장소. Contribute to heesoo-park/ForCodeKata development by creating an account on GitHub.
github.com
작성한 코드는 다음과 같다.
import java.io.*
import java.util.*
fun main(args: Array<String>) {
val br = BufferedReader(InputStreamReader(System.`in`))
val bw = BufferedWriter(OutputStreamWriter(System.out))
val (n, d, k, c) = br.readLine().split(' ').map { it.toInt() }
val sushiBelt = List<Int>(n) { br.readLine().toInt() }
val sushiTypes = IntArray(d + 1)
var max = 0
var cnt = 0
for (i in 0 until k) {
if (sushiTypes[sushiBelt[i % n]] == 0) cnt++
sushiTypes[sushiBelt[i % n]]++
}
max = if (sushiTypes[c] == 0) maxOf(max, cnt + 1) else maxOf(max, cnt)
for (i in 1 until n) {
if (sushiTypes[sushiBelt[(i + k - 1) % n]] == 0) cnt++
sushiTypes[sushiBelt[(i + k - 1) % n]]++
sushiTypes[sushiBelt[(i - 1) % n]]--
if (sushiTypes[sushiBelt[(i - 1) % n]] == 0) cnt--
max = if (sushiTypes[c] == 0) maxOf(max, cnt + 1) else maxOf(max, cnt)
}
bw.write("$max")
bw.flush()
bw.close()
}
2. 문자열 교환 (Silver 1)
[백준]
https://www.acmicpc.net/problem/1522
[깃허브]
ForCodeKata/baekjoon 문제집/1522 문자열 교환 at main · heesoo-park/ForCodeKata
알고리즘 문제 코드 저장소. Contribute to heesoo-park/ForCodeKata development by creating an account on GitHub.
github.com
작성한 코드는 다음과 같다.
import java.io.*
import java.util.*
fun main(args: Array<String>) {
val br = BufferedReader(InputStreamReader(System.`in`))
val bw = BufferedWriter(OutputStreamWriter(System.out))
val s = br.readLine()
val aLen = s.count { it == 'a' }
var min = 1000
for (i in 0 until s.length) {
var cnt = 0
for (j in i until i + aLen) {
if (s[j % s.length] == 'b') cnt++
}
min = minOf(min, cnt)
}
bw.write("$min")
bw.flush()
bw.close()
}
어쩌다보니 슬라이딩 윈도우 문제를 연속으로 풀게 됐는데 한쪽은 기본, 한쪽은 변형같은 느낌이었다.
알고리즘의 구조와 형태가 좀 눈과 손에 잡히는 느낌이다.
물론 문제를 논리적이고 직관적으로 보는 건 아직 부족하다...
반응형