https://www.acmicpc.net/problem/1380
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
'알고리즘 > 백준 문제 풀이' 카테고리의 다른 글
[Python] 1402번 아무래도이문제는A번난이도인것같다 (0) | 2022.09.29 |
---|---|
[Python] 1384번 메시지 (0) | 2022.09.29 |
[Python] 1340번 연도 진행바 (0) | 2022.09.29 |
[Python] 18155번 Issuing Plates (0) | 2022.09.29 |
[Python] 1308번 D-Day (0) | 2022.09.29 |