[Kotlin] Pair, Triple

Hood·2025년 1월 11일

Kotlin

목록 보기
13/18
post-thumbnail

✍  코틀린과 친해지자

ps문제를 하나씩 풀다보니 공부가 필요한 문법에 대해서 정리한 글입니다.


들어가기 전

알고리즘 문제를 풀다보면 두 개, 세 개의 변수를 묶어 객체를 반환해야 할 경우가 있습니다.
그 때 사용할 수 있는게 PairTriple이며
오늘은 변수를 묶어 사용하는 방법에 대해 알아보려고 합니다.

Pair

먼저 Pair는 두 개의 값을 일반적인 쌍으로 나타내는 것을 의미합니다.

예를 들어 두 개의 변수 안에 Pair로 값을 묶고 각각 a, b 변수 안에 집어 넣어주면
다음과 같이 1과 문자열 x의 값을 변수에 넣을 수 있습니다.

val (a, b) = Pair(1, "x")
println(a) // 1
println(b) // x 

BOJ 11399

위 예를 좀 더 응용해보면
https://www.acmicpc.net/problem/11399
BOJ의 11399번 문제를 예로 들 수 있는데
해당 문제는 그리디 알고리즘을 활용하는 문제지만
있는 그대로 사람과 그 사람이 처리하는 소요시간을 쌍으로 묶어서
그것을 정렬하고 더하는 데 사용할 수 있습니다.

import java.io.StreamTokenizer

fun main() = with(StreamTokenizer(System.`in`.bufferedReader())){
    fun nextInt() : Int { nextToken(); return nval.toInt() }
	//1. 입력받기
    val n = nextInt()
    val atm = Array<Pair<Int, Int>>(n+1) { Pair(0, 0) }

	//2. 헷갈리지 않게 인덱스를 1부터 담기 시작
    for(i in 1..n){
        atm[i] = Pair(i, nextInt())
    }
    //3. 배열 정렬
    atm.sortBy { it.second }

	//4. 조건에 맞게 풀기
    var ans = 0
    var result = 0
    for(x in 1..n){
        ans += atm[x-1].second
        result += ans + atm[x].second
    }
    print(result)
}
  1. 먼저 사람의 입력을 받아주고
  2. 사람과 사람에게 소요되는 시간을 Pair로 배열 안에 담아주었습니다.
    그 뒤 헷갈리지 않도록 1부터 인덱스를 시작해 주었습니다.
  3. 다음 그 배열을 .second의 정렬을 통해 두 번째 원소를 기준으로 정렬해주었습니다.
    (첫 번째 원소는 .first로 두 번째 원소는 .second로 접근 가능하며 정렬할 때는
    .sortBy { it.정렬할 기준 } 을 사용한다.)
  4. 그 뒤 문제 조건에 맞게 풀어 주었습니다.

이 처럼 두 값을 이어 정렬을 하는 경우에 Pair를 사용할 수 있으며
배열 안에서 선언을 하며 사용할수도 있습니다.


Triple

Triple 은 뜻에서도 보이듯 3개의 변수를 한 번에 묶는 방법입니다.
이는 Pair와 같이 1,2 번째 원소는 first, second로 접근할 수 있으며
3번째 원소에 대해서는 Third로 접근합니다.

val (a, b, c) = Triple(2, "x", listOf(null))
println(a) // 2
println(b) // x
println(c) // [null] 

3 개의 변수 타입에는 어떤 타입이든 들어올 수 있으며
.copy를 이용해서 똑같은 배열의 타입을 가져와서 사용할 수도 있습니다.

fun main(){
    val a = Triple(2, "x", listOf(null))
    println(a.first) // 2
    println(a.second) // x
    println(a.third) // [null]

    val b = a.copy(1, "a", listOf(null))
    println(b.first) // 1
    println(b.second) // a
    println(b.third) // [null]
}

📌결론

데이터 여러 개를 묶어서 사용하기 위해서는
Pair, Triple, map을 사용하자

참조 문서

공식문서 Pair
공식문서 Triple

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

0개의 댓글