Baekjoon

Baekjoon 1764번 듣보잡

ppwag 2020. 8. 2. 14:11

문제

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

걸린 시간

00 : 34 : 52

풀이

Python3

import sys
input = sys.stdin.readline

if __name__ == "__main__":
    # 듣도 못한 사람의 수, 보도 못한 사람의 수
    N, M = map(int, input().split())

    no_hear = [[] for _ in range(0, 26+1)]

    no_hear_no_see = []

    dic = {chr(i):(i-0x61) for i in range(0x61, 0x7b)}

    for i in range(0, N):
        tmp = input().strip()
        no_hear[dic.get(tmp[0], -1)].append(tmp)

    for i in range(0, 26+1):
        if len(no_hear[i]) != 0:
            no_hear[i].sort()

    for i in range(0, M):
        tmp = input().strip()
        sl = dic.get(tmp[0], -1) # start letter
        left = 0
        right = len(no_hear[sl])-1
        while left <= right:
            mid = (left + right) // 2
            if tmp > no_hear[sl][mid]:
                left = mid + 1
            elif tmp < no_hear[sl][mid]:
                right = mid - 1
            else:
                no_hear_no_see.append(tmp)
                break

    # 듣도 보도 못한 사람의 수와 사전순으로 명단 출력
    no_hear_no_see.sort()
    print(len(no_hear_no_see))
    for i in no_hear_no_see:
        print(i)

듣도 못한 사람의 명단을 사전식으로 리스트에 저장하고 보도 못한 사람을 입력받은 후 리스트를 이분 탐색으로 검색해 중복되는 값들만 결과로 저장해 출력하였다.

다른 풀이

Python3

import sys
input = sys.stdin.readline

if __name__ == "__main__":
    N, M = map(int, input().split())

    no_hear = [input().strip() for _ in range(0, N)]
    no_see = [input().strip() for _ in range(0, M)]

    no_hear_no_see = list(set(no_hear) & set(no_see))

    no_hear_no_see.sort()

    print(len(no_hear_no_see))
    for i in no_hear_no_see:
        print(i)

키 값으로만 구성된 set 클래스 간의 교집합 연산을 이용한 풀이이다. 효율은 큰 차이가 없지만 코드가 정말 간단 명료하다.

또 다른 풀이

Python3

import sys
input = sys.stdin.readline

if __name__ == "__main__":
    N, M = map(int, input().split())

    no_hear = {input().strip():0 for _ in range(0, N)}

    for i in range(0, M):
        tmp = input().strip()
        if no_hear.get(tmp, -1) != -1:
            no_hear[tmp] += 1

    no_hear_no_see = []

    for key, value in no_hear.items():
        if value != 0:
            no_hear_no_see.append(i)

    no_hear_no_see.sort()

    print(len(no_hear_no_see))
    for i in no_hear_no_see:
        print(i)

키와 값으로 이루어진 딕셔너리 자료형을 사용하는 방법으로 키는 사람의 이름, 값은 중복 출현한 횟수로 사용한다. 세 코드 중에서 제일 효율이 좋다.

'Baekjoon' 카테고리의 다른 글

Baekjoon 11279번 최대 힙  (0) 2020.08.04
Baekjoon 2630번 색종이 만들기  (0) 2020.08.02
Baekjoon 1068번 트리  (0) 2020.08.01
Baekjoon 1620번 나는야 포켓몬 마스터 이다솜  (0) 2020.07.27
Baekjoon 15829번 Hashing  (0) 2020.07.26

댓글