문제
점심시간이 되면 반 학생 모두가 한 줄로 줄을 서서 급식을 탄다. 그런데 매일 같이 앞자리에 앉은 학생들이 앞에 줄을 서 먼저 점심을 먹고, 뒷자리에 앉은 학생들은 뒤에 줄을 서 늦게 점심을 먹게 된다. 어떻게 하면 이러한 상황을 바꾸어 볼 수 있을까 고민하던 중 선생님이 한 가지 방법을 내 놓았다. 그 방법은 다음과 같다.
학생들이 한 줄로 줄을 선 후, 첫 번째 학생부터 차례로 번호를 뽑는다. 첫 번째로 줄을 선 학생은 무조건 0번 번호를 받아 제일 앞에 줄을 선다. 두 번째로 줄을 선 학생은 0번 또는 1번 둘 중 하나의 번호를 뽑는다. 0번을 뽑으면 그 자리에 그대로 있고, 1번을 뽑으면 바로 앞의 학생 앞으로 가서 줄을 선다. 세 번째로 줄을 선 학생은 0, 1 또는 2 중 하나의 번호를 뽑는다. 그리고 뽑은 번호만큼 앞자리로 가서 줄을 선다. 마지막에 줄을 선 학생까지 이와 같은 방식으로 뽑은 번호만큼 앞으로 가서 줄을 서게 된다. 각자 뽑은 번호는 자신이 처음에 선 순서보다는 작은 수이다.
예를 들어 5명의 학생이 줄을 서고, 첫 번째로 줄을 선 학생부터 다섯 번째로 줄을 선 학생까지 차례로 0, 1, 1, 3, 2번의 번호를 뽑았다고 하자, 첫 번째 학생부터 다섯 번째 학생까지 1부터 5로 표시하면 학생들이 줄을 선 순서는 다음과 같이 된다.
- 첫 번째 학생이 번호를 뽑은 후 : 1
- 두 번째 학생이 번호를 뽑은 후 : 2 1
- 세 번째 학생이 번호를 뽑은 후 : 2 3 1
- 네 번째 학생이 번호를 뽑은 후 : 4 2 3 1
- 다섯 번째 학생이 번호를 뽑은 후 : 4 2 5 3 1
따라서 최종적으로 학생들이 줄을 선 순서는 4, 2, 5, 3, 1이 된다.
줄을 선 학생들이 차례로 뽑은 번호가 주어질 때 학생들이 최종적으로 줄을 선 순서를 출력하는 프로그램을 작성하시오.
입력
첫째 줄에는 학생의 수가 주어지고 둘째 줄에는 줄을 선 차례대로 학생들이 뽑은 번호가 주어진다. 학생의 수가 100 이하이고, 학생들이 뽑는 번호는 0 또는 자연수이며 학생들이 뽑은 번호 사이에는 빈 칸이 하나씩 있다.
출력
학생들이 처음에 줄을 선 순서대로 1번부터 번호를 매길 때, 첫째 줄에 학생들이 최종적으로 줄을 선 순서를 그 번호로 출력한다. 학생 번호 사이에는 한 칸의 공백을 출력한다.
풀이
문제 태그가 '자료구조' 여서 큐 내지는 스택을 고민해봤으나 브론즈 정도의 난이도여서 그런지 단순히 구현으로 해결할 수 있었다.
빈 배열을 추가로 선언해주고 해당 빈 배열에 학생들이 뽑은 번호에 따라 들어갈 위치에 맞게 list.insert() 메소드를 활용하여 집어넣었고
이를 뒤집어서 출력해주면 정답이 된다.
처음 풀이 때는 그냥 ans 리스트를 reverse()로 뒤집어 출력하였으나 예제 출력 형식에 맞지 않는다는 것을 깨닫고 str() 메소드를 통해 형변환을 거친 뒤 join 메소드를 통해 공백으로 구분하여 출력하였다.
소스 코드
ans = []
n = int(input())
tmp = list(map(int, input().split()))
for i in range(n):
ans.insert(tmp[i], str(i+1))
ans.reverse()
print(' '.join(ans))
'Study (etc) > Problem Solving' 카테고리의 다른 글
[BOJ / C++] 2631번 : 줄세우기 (1) | 2023.10.11 |
---|---|
[BOJ / C++] 2141번 : 우체국 (0) | 2023.10.11 |
[BOJ / C++] 16724번 : 피리 부는 사나이 (1) | 2023.10.11 |
[BOJ / C++] 2146번 : 다리 만들기 (1) | 2023.10.03 |
[BOJ / C++] 1005번 : ACM Craft (0) | 2023.09.26 |