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()
}

 

어쩌다보니 슬라이딩 윈도우 문제를 연속으로 풀게 됐는데 한쪽은 기본, 한쪽은 변형같은 느낌이었다.

알고리즘의 구조와 형태가 좀 눈과 손에 잡히는 느낌이다.

물론 문제를 논리적이고 직관적으로 보는 건 아직 부족하다...

반응형