πŸ’― | λ°±μ€€/πŸ™‚ | Silver

[Kotlin, S4] λ°±μ€€ 2358번 평행선

immgga 2024. 9. 26. 21:15
λ°˜μ‘ν˜•

좜처: unsplash.com

 

평행선(2358번)

Silver 4

#자료 ꡬ쑰 #μ •λ ¬ #ν•΄μ‹œλ₯Ό μ‚¬μš©ν•œ μ§‘ν•©κ³Ό λ§΅

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

 

문제 λ‚΄μš©

 

 

문제 μ ‘κ·Ό

2개 μ΄μƒμ˜ 점을 μ§€λ‚˜λŠ” μ„ λΆ„μ—μ„œ xμΆ• λ˜λŠ” y좕에 ν‰ν–‰ν•œ μ„ λΆ„μ˜ 개수λ₯Ό μ„ΈλŠ” 문제.

μ„ λΆ„μ˜ ꡬ성이 2개 μ΄μƒμ˜ 점을 μ§€λ‚  μˆ˜λ„ 있고, ν•œ μ’Œν‘œμ— 점이 μ—¬λŸ¬ κ°œκ°€ μžˆμ„ μˆ˜λ„ μžˆλ‹€.

// μ„ λΆ„μ˜ ꡬ성에 2개 μ΄μƒμ˜ 점이 μ“°μ΄λŠ” 경우
4
1 0
2 0
3 0
4 0

μ •λ‹΅: 1

// ν•œ μ’Œν‘œμ— μ—¬λŸ¬ 점이 μžˆλŠ” 경우
2
1 1
1 1

μ •λ‹΅: 2

첫 번째 caseκ°€ μ΄ν•΄ν•˜κΈ° μ–΄λ €μ› λ‹€.

문제λ₯Ό 처음 μ½μ—ˆμ„ λ•ŒλŠ” 2개 μ΄μƒμ˜ 점을 μ§€λ‚˜λŠ” μ„ λΆ„μ΄λΌλŠ” 것을 λͺ» 보고 2개의 점을 μ§€λ‚˜λŠ” 선뢄이라고 μƒκ°ν•΄μ„œ μ™œ 1κ°œκ°€ λ‚˜μ˜€λŠ”μ§€ ν—·κ°ˆλ Έλ‹€.

case 1의 κ²½μš°μ—λŠ” 점 4개λ₯Ό μ—°κ²°ν•œ yμΆ•κ³Ό ν‰ν–‰ν•œ μ„ λΆ„ 1개만 μ‘΄μž¬ν•˜κ²Œ λœλ‹€.

case 2의 κ²½μš°μ—λŠ” μ’Œν‘œκ°€ 1κ°œμ΄μ§€λ§Œ 2개의 점이 있기 λ•Œλ¬Έμ— λ¬΄ν•œλŒ€μ˜ κ²½μš°κ°€ μƒκΈ°κ²Œ λœλ‹€.

λ¬΄ν•œλŒ€μ˜ κ²½μš°λ“€ μ€‘μ—μ„œ x, yμΆ•κ³Ό ν‰ν–‰ν•˜λŠ” κ²½μš°κ°€ 1κ°€μ§€μ”© μ‘΄μž¬ν•˜κΈ° λ•Œλ¬Έμ— 정닡이 2이닀.

 

case듀을 보고 x λ˜λŠ” y 값이 같은 애듀을 묢으면 λ˜μ§€ μ•Šμ„κΉŒ ν•˜κ³  생각이 λ“€μ—ˆλ‹€.

묢은 μ’Œν‘œλ“€μ˜ κ°œμˆ˜κ°€ 2κ°œλ³΄λ‹€ 많으면 선뢄을 ꡬ성할 수 있기 λ•Œλ¬Έμ— 2개 이상인 κ²½μš°μ—λ§Œ 카운트λ₯Ό λŠ˜λ €μ£ΌλŠ” λ°©μ‹μœΌλ‘œ μ΄μš©ν–ˆλ‹€.

 

 

문제 ν•΄κ²° μ½”λ“œ

더보기
import java.io.BufferedReader
import java.io.InputStreamReader

fun main() = with(BufferedReader(InputStreamReader(System.`in`))) {
    val points = readLine().toInt()
    val xMap = mutableMapOf<Int, Int>()
    val yMap = mutableMapOf<Int, Int>()

    for (i in 0 until points) {
        val (coordinateX, coordinateY) = readLine().split(" ").map { it.toInt() }

        if (!xMap.containsKey(coordinateX)) xMap[coordinateX] = 1
        else xMap[coordinateX] = xMap[coordinateX]!! + 1

        if (!yMap.containsKey(coordinateY)) yMap[coordinateY] = 1
        else yMap[coordinateY] = yMap[coordinateY]!! + 1
    }

    var answer = 0
    for (x in xMap) {
        if (x.value >= 2) answer++
    }

    for (y in yMap) {
        if (y.value >= 2) answer++
    }
    println(answer)
}

 

문제 풀이

μž…λ ₯된 같은 x λ˜λŠ” yμ’Œν‘œκ°€ λͺ‡ κ°œμΈμ§€ 확인할 map을 생성해 μ£Όμ—ˆλ‹€.

μž…λ ₯κ°’μ—μ„œ x, yμ’Œν‘œκ°’μ΄ 같은 μ’Œν‘œκ°€ 2개 이상 있으면 ν‰ν–‰μ„ μ˜ 개수(answer)λ₯Ό 늘렀 μ€€λ‹€.

 

문제 μ ‘κ·Όμ˜ case듀은 λ‹€μŒκ³Ό 같이 map이 κ΅¬μ„±λ˜κ²Œ λœλ‹€.

case 1
case 2

case 1의 κ²½μš°λŠ” 각 x의 κ°œμˆ˜κ°€ 2κ°œκ°€ λ„˜μ§€ μ•ŠκΈ° λ•Œλ¬Έμ— 선을 μ—°κ²°ν•  수 μ—†λ‹€.

case 2의 κ²½μš°λŠ” x, y의 κ°œμˆ˜κ°€ 2개이기 λ•Œλ¬Έμ— 평행선을 ꡬ성할 수 μžˆλ‹€.

 

 

문제 ν•΄κ²° κ³Όμ •

문제λ₯Ό 처음 봀을 λ•ŒλŠ” 별생각 없이 κ΅¬ν˜„ν–ˆλŠ”λ°, λ°˜λ‘€λ₯Ό 찾아보렀고 κ²Œμ‹œνŒμ— λ“€μ–΄κ°€λ‹ˆκΉŒ 과거에 이 λ¬Έμ œμ— 뢈만이 μƒλ‹Ήν–ˆλ˜ 것 κ°™λ‹€.

κ²Œμ‹œνŒμ—μ„œ 점 μ—¬λŸ¬ 개λ₯Ό 이을 수 μžˆλŠ” 것과 ν•œ μ’Œν‘œμ— 점이 μ—¬λŸ¬ 개 올 수 μžˆλ‹€λŠ” 것을 μ•Œκ²Œ 되고 μ½”λ“œλ₯Ό μ²˜μŒλΆ€ν„° λ‹€μ‹œ 짜게 λ˜μ—ˆλ‹€.

κ²Œμ‹œνŒμ„ 보고 문제λ₯Ό λ‹€μ‹œ μžμ„Ένžˆ 읽고 λ‚˜μ„œ ν•΄κ²°ν•  수 μžˆμ—ˆλ‹€.

아이디어λ₯Ό λ– μ˜¬λ¦¬μ§€ λͺ»ν•˜λ©΄ silver 4 μ΄μƒμ˜ λ‚œμ΄λ„λ₯Ό κ°€μ§ˆ 수 μžˆλŠ” 문제 κ°™λ‹€.

728x90
λ°˜μ‘ν˜•