개발일기

백준 1380번 파이썬 풀이 : 귀걸이 본문

알고리즘 문제풀이/백준

백준 1380번 파이썬 풀이 : 귀걸이

한민기 2021. 10. 28. 16:31
반응형

문제 링크 : https://www.acmicpc.net/problem/1380

 

1380번: 귀걸이

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

www.acmicpc.net

문제

파스칼 고등학교에 다니는 많은 여학생들은 규정에 없는 귀걸이를 착용한 채 도망다닙니다. Sneddon 교감선생님은 흔들거리는 긴 빨간 귀걸이들을 볼때마다 압수합니다.

교감선생님은 귀걸이를 압수당한 여학생들을 숫자를 매겨 리스트를 작성하고 있습니다. 그리고 압수한 귀걸이 뒤쪽에 여학생 번호와 마음대로 선택한 'A' 또는 'B'를 함께 적어두었습니다.

모든 정규 일과와 방과후 수업의 감금이 끝나면, 여학생들은 교감선생님을 찾아와 귀걸이를 돌려받습니다. 불행하게도 어느 날, 교감선생님은 귀걸이가 든 봉투를 잃어버렸고, 하나를 끝내 찾지 못했습니다.

귀걸이를 받지 못해 화난 소녀의 이름을 교감선생님께 알려주세요.

입력

입력은 번호를 가진 시나리오들로 구성됩니다. 시나리오 번호는 1부터 순서대로 증가하고, 각 시나리오는 아래의 내용을 포함합니다.

  • 한 줄에 귀걸이를 압수당한 여학생의 수, n (1 ≤ n ≤ 100)이 주어집니다.
  • 다음 n줄에 걸쳐 여학생들의 이름(최대 60자)이 주어집니다.
  • 다음 2n − 1줄에 여학생 번호와 'A' 또는 'B'가 공백을 사이에 두고 주어집니다. 번호는 교감선생님의 여학생 이름 리스트와 순서가 일치합니다. 즉, 1은 첫 번째로 압수당한 여학생입니다. 여학생 번호는 최대 2번 등장하며, 두 번째로 등장할 때는 첫 번째 경우와 다른 'A' 또는 'B'가 뒤에 적힙니다.
    번호가 처음 등장하는 것은 압수되었음을, 두 번째로 등장하는 것은 돌려받았음을 의미합니다.

'0'을 마지막 줄로 하여 입력이 종료됩니다. '0'은 처리하지 않습니다.

출력

시나리오 번호와 귀걸이를 돌려받지 못한 여학생의 이름을 공백으로 구분하여 한 줄씩 출력하십시오.

 

 

# 문제 풀이

1
2
3
4
5
answer = []
while True:
    n = int(input())
    if n == 0:
        break
cs

 

answer 배열은 모든 테스트 케이스의 결과를 넣기 위해 반복문 밖에 선언을 해준다.

반복문 안에서는 테스트 케이스의 수를 입력 받고 0이 입력되면 반복문을 종료한다.

 

1
2
3
    student = []
    for _ in range(n):
        student.append(input())
cs

 

테스트 케이스에 해당하는 학생들 수만큼 student 배열에 append 한다.

 

1
2
3
4
5
6
7
8
9
stack = []
    for i in range(2 * n - 1):
        a, b = input().split()
        if a in stack:
            stack.remove(a)
        else:
            stack.append(a)
 
    answer.append(student[int(stack[0]) - 1])
cs

 

귀걸이를 못받은 학생은 1명이기 때문에 무조건 입력받는 값은 2 * n - 1이 된다.

따라서 반복문을 돌리면서 숫자가 stack 배열에 존재 한다면 해당 학생은 이미 빼앗긴 상황에서 돌려받을 상황이기 때문에 stack 에서 지워주고 만일 없다면 처음 뺏기는 것이기 때문에 stack 에 추가해준다.

 

마지막으로 stack 에 남아있는 번호에 해당하는 학생이 귀걸이를 받지 못하게 되는 것이다.

 

1
2
for idx, i in enumerate(answer):
    print(idx+1, i)
cs

 

마지막으로 enumerate를 사용하여 index와 i 를 함께 출력해주면 출력 결과와 동일한 형태로 출력할 수 있다.

 

# 전체 코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
answer = []
while True:
    n = int(input())
    if n == 0:
        break
 
    student = []
    for _ in range(n):
        student.append(input())
 
    stack = []
    for i in range(2 * n - 1):
        a, b = input().split()
        if a in stack:
            stack.remove(a)
        else:
            stack.append(a)
 
    answer.append(student[int(stack[0]) - 1])
 
for idx, i in enumerate(answer):
    print(idx+1, i)
cs

 

반응형
Comments