본문 바로가기

알고리즘/백준 문제 풀이

[Python] 1380번 귀걸이

728x90

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

 

1380번: 귀걸이

입력은 번호를 가진 시나리오들로 구성됩니다. 시나리오 번호는 1부터 순서대로 증가하고, 각 시나리오는 아래의 내용을 포함합니다. 한 줄에 귀걸이를 압수당한 여학생의 수, n (1 ≤ n ≤ 100)이

www.acmicpc.net


 

22/09/16

 

 

마찬가지로 실버 5를 밀던 도중 만난 문제로, 개인적으로 문제의 입력이 이해가 되지 않았던 문제였다.


 

문제 접근 방식:

 

 

테스트 케이스 하나당 여학생 수가 주어지고, 여학생들이 주어진다.(여학생들의 리스트가 주어진 순서대로 여학생들을 번호로 간주한다.) 이후 여학생들이 목걸이를 빼앗겼다가 다시 되찾는 것을 숫자와 A 또는 B로 구분하여 준다.

 

숫자가 처음 나오는 것이면 빼앗기는 것을, 나왔던 숫자가 다시 나타나는것이면 되찾는 것을 의미한다.

 

개인적으로 여기서 이해가 잘 안됬는데, 문제 풀 때 뒤에 붙는 A와 B라는 문자는 전혀 필요가 없는 입력이었다.

 

A가 빼앗음, B가 돌려줌을 의미하는 것도 아니고 무작위로 붙는 문자인데, 그것들을 전혀 이용하지 않고도 문제를 풀 수 있었기 때문이다.

 

어쨌든 내가 이용한 방식은, 여학생들에게는 1번부터 n번까지의 번호가 매겨지고, 목걸이를 받지 못하는 여학생은 단 한 명밖에 없다는 사실을 이용했다.

 

원래대로라면 1부터 n까지의 숫자가 모두 2번씩 나와야 다시 되돌려 받음을 의미한다.

 

근데 한 명만 못 받았으므로, 1부터 n까지의 숫자가 2번씩 나오는데, 단 한 숫자만 1번이 나온다는 것을 의미한다.

 

이를 이용하여 지금까지 나왔던 숫자를 sum 하여 n(n+1)에서 그 sum 한 숫자를 빼는 방식으로 귀걸이를 돌려받지 못한 번호를 출력하도록 했다.

 

귀걸이의 번호는 곧 여학생의 인덱스+1과 같으므로, 이를 이용하여 여학생의 이름도 출력하도록 구현했다.

 


아래는 내가 위의 접근 방식과 같이 작성한 파이썬 코드이다. 더보기를 누르면 확인할 수 있다.

더보기
# 1380번 귀걸이
# 구현
'''
접근 방법:
빈 숫자 하나는 sum(1~n) * 2에서 sum(지금까지 나왔던 숫자)를 빼면 나옴
'''
scenario_num = 1
while True:
    n = int(input())
    if n == 0:
        break
    students = [0] + [input() for _ in range(n)]
    total_index = 0
    for _ in range(2*n-1):
        num, k = input().split()
        total_index += int(num)
    student_index = n*(n+1) - total_index
    print(scenario_num, students[student_index])
    scenario_num += 1