fromzero
쪼렙 성장기
fromzero
전체 방문자
오늘
어제
  • Home
    • TIL
      • Python
      • HTML&CSS
      • Django
      • React
      • React Native
      • Git & Jira
      • Tech News
    • Algorithm
      • SW Expert Amademy
      • Baekjoon Online Judge
    • SSAFY
    • Daily log

인기 글

최근 댓글

최근 글

글쓰기 | 설정
hELLO · Designed By 정상우.
fromzero

쪼렙 성장기

백준 2605. 줄 세우기 (파이썬)
Algorithm/Baekjoon Online Judge

백준 2605. 줄 세우기 (파이썬)

2022. 2. 27. 02:52

 

 

문제
점심시간이 되면 반 학생 모두가 한 줄로 줄을 서서 급식을 탄다. 그런데 매일 같이 앞자리에 앉은 학생들이 앞에 줄을 서 먼저 점심을 먹고, 뒷자리에 앉은 학생들은 뒤에 줄을 서 늦게 점심을 먹게 된다. 어떻게 하면 이러한 상황을 바꾸어 볼 수 있을까 고민하던 중 선생님이 한 가지 방법을 내 놓았다. 그 방법은 다음과 같다.
학생들이 한 줄로 줄을 선 후, 첫 번째 학생부터 차례로 번호를 뽑는다. 첫 번째로 줄을 선 학생은 무조건 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번부터 번호를 매길 때, 첫째 줄에 학생들이 최종적으로 줄을 선 순서를 그 번호로 출력한다. 학생 번호 사이에는 한 칸의 공백을 출력한다.

 

 

 아이디어 

슬라이싱을 사용해서 문제를 풀어야겠다.
 > 내가 들어갈 자리를 차지한 사람들부터 원래 내 번호(0일 때 들어갈 자리) 앞까지 사람들을 한 칸씩 뒤로 밀자
 > 그리고 내가 들어갈 자리로 들어가기

 

 

 코드 

N = int(input())
numbers = list(map(int, input().split()))
line = [0] * N

for student in range(N):
    number = numbers[student]
    if number == 0:
        line[student] = student + 1 # student와 실제 학생의 번호는 1 차이
    else:
        # 0번이 나오면 들어갈 자리에서 number만큼 앞으로 간 것부터 바로 앞자리까지 학생들을
        # 한 칸씩 뒤로 미루고
        line[student-number+1:student+1] = line[student-number:student]
        # 0번 기준으로 number만큼 앞자리에 들어가기
        line[student-number] = student + 1
print(*line)
저작자표시 (새창열림)

'Algorithm > Baekjoon Online Judge' 카테고리의 다른 글

백준 10163. 색종이 (파이썬/ 47, 52점 해결법)  (0) 2022.02.27
백준 14696. 딱지놀이 (파이썬)  (0) 2022.02.27
백준 2563. 색종이 (파이썬)  (0) 2022.02.27
백준 2491. 수열 (파이썬)  (0) 2022.02.27
백준 1244. 스위치 켜고 끄기 (파이썬)  (0) 2022.02.26
    'Algorithm/Baekjoon Online Judge' 카테고리의 다른 글
    • 백준 10163. 색종이 (파이썬/ 47, 52점 해결법)
    • 백준 14696. 딱지놀이 (파이썬)
    • 백준 2563. 색종이 (파이썬)
    • 백준 2491. 수열 (파이썬)
    fromzero
    fromzero

    티스토리툴바