ps문제를 하나씩 풀다보니 공부가 필요한 문법에 대해서 정리한 글입니다.
알고리즘 문제를 풀다보면 두 개, 세 개의 변수를 묶어 객체를 반환해야 할 경우가 있습니다.
그 때 사용할 수 있는게Pair와Triple이며
오늘은 변수를 묶어 사용하는 방법에 대해 알아보려고 합니다.
먼저
Pair는 두 개의 값을 일반적인 쌍으로 나타내는 것을 의미합니다.예를 들어 두 개의 변수 안에 Pair로 값을 묶고 각각 a, b 변수 안에 집어 넣어주면
다음과 같이 1과 문자열 x의 값을 변수에 넣을 수 있습니다.
val (a, b) = Pair(1, "x")
println(a) // 1
println(b) // x
위 예를 좀 더 응용해보면
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)
}
- 먼저 사람의 입력을 받아주고
- 사람과 사람에게 소요되는 시간을 Pair로 배열 안에 담아주었습니다.
그 뒤 헷갈리지 않도록 1부터 인덱스를 시작해 주었습니다.- 다음 그 배열을
.second의 정렬을 통해 두 번째 원소를 기준으로 정렬해주었습니다.
(첫 번째 원소는.first로 두 번째 원소는.second로 접근 가능하며 정렬할 때는
.sortBy { it.정렬할 기준 }을 사용한다.)- 그 뒤 문제 조건에 맞게 풀어 주었습니다.
이 처럼 두 값을 이어 정렬을 하는 경우에 Pair를 사용할 수 있으며
배열 안에서 선언을 하며 사용할수도 있습니다.
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을 사용하자