반응형

백준 1764번 문제입니다. (solved.ac)기준 실버 4 문제입니다.

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

 

1764번: 듣보잡

첫째 줄에 듣도 못한 사람의 수 N, 보도 못한 사람의 수 M이 주어진다. 이어서 둘째 줄부터 N개의 줄에 걸쳐 듣도 못한 사람의 이름과, N+2째 줄부터 보도 못한 사람의 이름이 순서대로 주어진다.

www.acmicpc.net

문제

문제 접근

처음에는 neverHeard(듣도 못한 사람), neverSeen(보도 못한 사람), neverHeardAndSeen(듣도 보도 못한 사람)을 모두 mutableList로 선언하고 문제를 풀었더니 시간 초과 오류가 발생하였습니다. 듣도 못한 사람, 보도 못한 사람을 HashMap<String, Boolean>으로 사용하여 문제를 해결할 수 있었습니다. 사람이 존재한다면 키 값인 String에는 사람 이름이, Boolean에는 true가 들어갑니다. 

 repeat을 사용하여 사람의 수만큼 이름을 입력받고 각각 듣도 못한 사람, 보도 못한 사람에 ("이름", true)를 쌍으로 추가해주었습니다.

입력을 다 받은 후 보도 못한 사람의 수가 더 많다면 forEach문을 사용하여 보도 못한 사람의 원소들을 하나하나 듣도 못한 사람의 해시맵에 있는지 확인을 한 후 존재한다면 듣도 보도 못한 사람(mutableList)에 넣어주었습니다. 나머지 부분은 else문으로 반대로 처리해주었습니다. 

 마지막으로 문제의 조건에 맞게 sort()를 사용하여 사전순으로 정리를 진행하였고 forEach 문을 사용하여 듣도 보도 못한 사람들을 출력하였습니다.

정답 코드

import java.io.*

fun main() {

    // 빠른 입출력
    val br = BufferedReader(InputStreamReader(System.`in`))
    val bw = BufferedWriter(OutputStreamWriter(System.out))

    // 듣도 못한 사람
    val neverHeard = HashMap<String, Boolean>()
    // 보도 못한 사람
    val neverSeen = HashMap<String, Boolean>()
    // 듣보잡 = 듣도 보도 못한 사람
    val neverHeardAndNeverSeen = mutableListOf<String>()

    // 듣도 못한 사람, 보도 못한 사람의 수를 공백으로 입력받음.
    val cnt = br.readLine()!!.split(" ")

    // 듣도 못한 사람 + 보도 못한 사람의 수만큼 반복하여 입력 받음
    repeat(cnt[0].toInt() + cnt[1].toInt()) { index ->

        val person = br.readLine()!!

        // 듣도 못한 사람
        if (index < cnt[0].toInt()) {
            neverHeard.put(person, true)
        }
        // 보도 못한 사람
        else neverSeen.put(person, true)

    }

    // 보도 못한 사람이 더 많다면
    if (neverHeard.size < neverSeen.size) {

        // 보도 못한 사람의 원소(it)들을 확인하여
        // 듣도 못한 사람에 속해있는지 확인하고 속해있다면
        // 듣도 보도 못한 사람에 추가
        neverSeen.forEach {
            if(neverHeard.get("${it.key}") == true) neverHeardAndNeverSeen.add("${it.key}")
        }
    } else {
        // 듣도 못한 사람이 더 많거나 같다면
        // 듣도 못한 사람의 원소(it)들을 확인하여
        // 보도 못한 사람에 속해있는지 확인하고 속해있다면
        // 듣도 보도 못한 사람에 추가
        neverHeard.forEach {
            if(neverSeen.get("${it.key}") == true) neverHeardAndNeverSeen.add("${it.key}")
        }
    }

    // 듣도 보도 못한 사람의 수를 출력
    bw.write("${neverHeardAndNeverSeen.size}\n")
    // 듣도 보도 못한 사람을 사전순으로 정렬 후 출력
    neverHeardAndNeverSeen.sort()
    neverHeardAndNeverSeen.forEach {
        bw.write("$it\n")
    }
    bw.flush()
    bw.close()
}
반응형
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기