[Kotlin]PS_4

Hood·2024년 8월 5일

매일PS

목록 보기
4/11
post-thumbnail

✍   Kotlin을 사용한 백준 알고리즘 문제풀이

매일 백준의 알고리즘 문제를 풀며 3문제씩 풀며
한 언어를 마스터 할 것을 목표로 이 글을 작성할 예정입니다.


🔎 10810번

https://www.acmicpc.net/problem/10810

문제를 이해하는데 시간이 걸렸지만
간단히 하면 배열을 하나 만들고 i부터 j의 값에 k를 집어넣는 것으로 이해했다.
처음에 바구니의 배열을 정해줄 N을 받고 입력을 받을 범위 M을 받아주었다.
for문 을 통해 M의 범위 만큼 입력을 받기에 until을 사용해 주었는데
..until 의 차이는 만약 N과 M이 있다면
.. 은 N ~ M까지 모든 숫자의 범위를 순환할 것이고
until 은 N ~ M-1 만큼의 범위를 순환한다.

그 뒤로 바구니의 범위를 정해줄 i와 j를 받고 그 안에 들어갈 숫자를 k로 받아주었다.
모두 for문을 통해 배열 안 범위를 i부터 j의 바구니의 숫자를 모두 k로 바꾸어 주어야 하기에
인덱스 insert 안에는 i부터 j까지의 범위가 들어와 arrayN[insert - 1]의 값을 모두 k로 바꾸어주었다.
-1을 하는 이유는 인덱스는 [0]부터 시작하기 때문
그러면 쉽게 풀 수 있다.

import java.util.Scanner

fun main() {
    val sc = Scanner(System.`in`)
    val N = sc.nextInt()
    val M = sc.nextInt()
    val arrayN = IntArray(N)
    val result = StringBuilder()

    for(m: Int in 0 until M) {
        val i = sc.nextInt()
        val j = sc.nextInt()
        val k = sc.nextInt()

        for (insert: Int in i..j) {
            arrayN[insert - 1] = k
        }
    }

    for (i in arrayN) {
        result.append("$i ")
    }

    println(result)
    sc.close()
}

🔎 10813번

https://www.acmicpc.net/problem/10813

위 문제와 유사한데 다른 점이라면
바구니에는 내가 N만큼 배열이 있고 그 안에는 1부터 N만큼의 숫자가 채워져있다.
그래서 그 바구니 안에 i와 j의 순서를 변경하는 문제였다.
그러면 1부터 N까지의 배열을 만들어 주어야 한다.
그렇기 위해서 IntArray(N) { it + 1 } 이 필요했다.
처음에는 for문으로 만들까도 생각했지만 간단하게 생성하는 방법을 찾았다.

그리고 i와 j의 순서를 바꾸는데 처음부터 arrayN[i] = arrayN[j]를 사용하게 되면
i안의 값은 j가 되어 j는 바꿀 수 없게 될 것이다.
그렇기에 i의 값을 따로 보관을 해주기 위해서 k를 만들어 주었고,
모두 바꿔준 배열을 출력을 위해 result에 다시 담아주었다.

import java.util.Scanner

fun main() {
    val sc = Scanner(System.`in`)
    val N = sc.nextInt()
    val M = sc.nextInt()
    val arrayN = IntArray(N) {it + 1}
    val result = StringBuilder()

    for (y : Int in 0 until M){
        val i = sc.nextInt()
        val j = sc.nextInt()
        val k = arrayN[i - 1]
        arrayN[i - 1] = arrayN[j - 1]
        arrayN[j - 1] = k
    }

    for (a in arrayN){
        result.append("$a ")
    }
    println(result)
    sc.close()
}

🔎 5597번

https://www.acmicpc.net/problem/5597

이 문제는 처음부터 for문이 28번 돌 것이라고 문제에서 제시해주었기에
1 .. 28 만큼 도는 for문을 만들어 주었고
그 위에 1부터 30까지의 배열을 만들어주는데 이것은 변경가능하도록 뒤에 .toMutableList() 를 붙였다.
그 이유는 배열안에 같은 값이 있으면 .remove() 를 통해 삭제하기 위함이다.
그 뒤에 2개의 배열을 출력하면 된다.

import java.util.Scanner

fun main() {
    val sc = Scanner(System.`in`)
    val arrayX = IntArray(30) { it + 1 }.toMutableList()

    for (x in 1 .. 28) {
        val num = sc.nextInt()
        if (num in arrayX) {
            arrayX.remove(num)
        }
    }
    println("${arrayX[0]}\n${arrayX[1]}")
}

📌결론

내가 몰랐던 내부함수들을 잘 알아둘 필요가 있다 생각했고
for문과 배열의 활용방법을 알 수 있었던 좋은 방법이다.
또한 문제의 의도를 빠르게 파악할 줄 알야아 할 것 같다.

profile
달을 향해 쏴라, 빗나가도 별이 될 테니 👊

0개의 댓글