개발새발 - IT 기술블로그
article thumbnail

백준 알고리즘  - 코틀린 풀이

 

 

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

 

10816번: 숫자 카드 2

첫째 줄에 상근이가 가지고 있는 숫자 카드의 개수 N(1 ≤ N ≤ 500,000)이 주어진다. 둘째 줄에는 숫자 카드에 적혀있는 정수가 주어진다. 숫자 카드에 적혀있는 수는 -10,000,000보다 크거나 같고, 10,0

www.acmicpc.net


 

 

문제

 

 

 


 

 

정답

import java.io.BufferedReader
import java.io.BufferedWriter
import java.io.InputStreamReader
import java.io.OutputStreamWriter

fun main() = with(BufferedReader(InputStreamReader(System.`in`))) {
    val bw = BufferedWriter(OutputStreamWriter(System.out))

    val n = readLine().toInt()

    val inputN = readLine().split(" ").map {it.toInt()}

    val m = readLine().toInt()

    val inputM = readLine().split(" ").map {it.toInt()}

    val hashMap = HashMap<Int,Int>()

    repeat(n) {
        hashMap[inputN[it]] = hashMap.getOrDefault(inputN[it],0) + 1
    }

    repeat(m) {
        bw.write("${hashMap[inputM[it]] ?: 0} ")
    }

    bw.flush()
    bw.close()
}

 

풀이

이번 문제는 두 배열의 숫자를 입력받아 새로 입력 받은 배열의 숫자가 기존 배열에 몇 개 포함되어 있는지를 구하는 문제입니다.

 

기본적인 mutableList나 array 형태의 입출력을 구현하면 시간 초과가 뜰 가능성이 높습니다.

 

따라서 저는 Key와 Value가 Integer 타입인 HashMap으로 생성하여 Key가 반복되는 횟수만큼 Value를 증가시키는 형태로 구현했습니다.

 

 

첫번째 입력인 n 만큼 반복하여 만약 배열의 숫자가 여러개라면 1씩 누적시키는 코드입니다.

getOrDefault로 처음 hashMap에 들어갈 때, 0으로 들어가도록 해줬습니다.

repeat(n) {
    hashMap[inputN[it]] = hashMap.getOrDefault(inputN[it],0) + 1
}

 

출력을 위해 두번째 배열인 m만큼 반복시키고, hashMap에서 출력할 숫자를 key값으로 받아 write 해줬습니다.

한번도 hashMap에 들어간 적이 없다면 Null 을 반환하기 때문에 Null일 때 0을 출력하게 하였습니다.

repeat(m) {
    bw.write("${hashMap[inputM[it]] ?: 0} ")
}

 

감사합니다.