파이썬 코딩테스트 강좌, 거짓말쟁이가 되긴 싫어

문제 설명

우리 동네에는 N명의 사람들이 있습니다. 각 사람은 각각의 닉네임을 가지고 있으며, 일부는 서로에게 거짓말을 합니다. 거짓말은 단순히 상대방에게 ‘자신의 닉네임’을 남기고 약속을 어기는 행위입니다. 여러분은 이러한 상황에서 실제로 거짓말을 한 사람의 닉네임을 찾고자 합니다.

N명의 사람에 대해 다음과 같은 정보를 제공합니다:

  • 자신의 닉네임
  • 서로가 서로에게 한 거짓말의 수

입력 형식

첫째 줄에 N (1 ≤ N ≤ 100,000) 이 주어집니다. 둘째 줄부터 N개의 줄에 각 사람의 닉네임과 그 사람이 한 거짓말의 수가 주어집니다.

출력 형식

거짓말을 한 사람의 닉네임을 한 줄에 하나씩 출력합니다. 만약 거짓말을 한 사람이 없다면 “거짓말쟁이가 없습니다.”라는 메시지를 출력합니다.

예제

    입력:
    3
    영희 1
    철수 0
    민수 2

    출력:
    영희
    민수
    

문제 풀이

이 문제를 풀기 위해서는 주어진 입력을 바탕으로 각 개인의 닉네임과 그들이 한 거짓말의 수를 파악해야 합니다. 주어진 데이터 구조를 사용하여 문제를 해결하는 과정은 다음과 같습니다:

1단계: 데이터 구조 설계

각 사람의 정보를 처리하기 위해, 우리는 리스트를 사용하여 사람들의 닉네임과 그들이 한 거짓말의 수를 저장할 것입니다. 이 때, 각 사람의 정보를 저장할 수 있는 튜플이나 딕셔너리를 사용해야 합니다.

2단계: 입력 데이터 수집

사용자로부터 입력을 받을 때, 먼저 사람 수 N을 입력받고 다음 N개의 라인에서는 각 사람의 정보를 읽어옵니다. 이때, 각 정보를 분리하여 저장합니다.

3단계: 거짓말쟁이 추출

거짓말을 한 사람들을 추출하기 위해, 거짓말의 수가 0보다 큰 모든 사람의 닉네임을 저장해야 합니다. 이를 위해 조건문을 사용하여 각 인물의 거짓말 수를 체크합니다.

4단계: 결과 출력

최종적으로 추출한 닉네임 리스트를 출력합니다. 만약 리스트가 비어있다면, “거짓말쟁이가 없습니다.”라는 메시지를 출력합니다.

코드 구현

그럼 이제 위의 논리를 바탕으로 코드를 구현해보겠습니다:

def find_liars(n, people):
    liars = []
    
    for name, lies in people:
        if lies > 0:
            liars.append(name)
    
    if liars:
        return liars
    else:
        return ["거짓말쟁이가 없습니다."]

if __name__ == "__main__":
    n = int(input("사람 수를 입력하세요: "))
    people = []

    for _ in range(n):
        entry = input("이름과 거짓말 수를 입력하세요: ").split()
        name = entry[0]
        lies = int(entry[1])
        people.append((name, lies))

    result = find_liars(n, people)
    for liar in result:
        print(liar)

코드 설명

위의 코드는 전체 프로세스를 간단하게 반환합니다. 각 단계에서 사람들이 입력한 정보를 저장하고, 이를 기반으로 거짓말을 한 이들의 닉네임을 판별합니다.

함수 설명

  • find_liars(n, people): 주어진 사람 수와 사람들의 정보를 받아 거짓말을 한 사람들의 닉네임 리스트를 반환합니다.
  • if __name__ == "__main__":: 메인 프로그램 실행 부분으로, 사용자로부터 입력받은 내용을 처리합니다.

결론

이번 문제를 통해, 간단한 데이터 구조와 리스트 이해를 바탕으로 코딩 테스트에서 자주 등장하는 유형의 문제를 해결하였습니다. 이번 문제 풀이 과정을 통해 코딩 테스트를 준비하는데 큰 도움이 되길 바랍니다.