[Baekjoon] 1138번: 한 줄로 서기(그리디 Silver2) - Python

꼬마요리사레미·2023년 8월 2일

Algorithm

목록 보기
34/41

1. 문제

한 줄로 서기

2. 코드

N = int(input())
memory = list(map(int, input().split()))
answer = [0] * N

for i in range(N):
    count = 0 
    for j in range(N):
        if answer[j] == 0: 
            if count == memory[i]:
                answer[j] = i + 1
                break
            count += 1

print(*answer)

3. 로직

입력 받기

N = int(input())           # N 입력 받기
memory = list(map(int, input().split()))  # 메모리 정보 입력 받기 (공백으로 분리하여 정수 리스트로 변환)
answer = [0] * N           # 결과 리스트 초기화
  1. 사람 수를 나타내는 N 값에 따라서 1부터 N까지의 번호가 주어질 것이다.
  2. 사람마다 자신의 앞에 몇 명의 사람이 더 큰지를 기록하는 memory 리스트가 주어진다.
  3. 각 사람이 최종적으로 위치할 번호를 저장하는 answer 리스트가 주어진다.

줄 세우기 및 출력 하기

for i in range(N):         # 메모리 정보를 반복하여 result 리스트에 값 채우기 위한 반복문
    count = 0              # 현재까지 채워진 값의 개수를 나타내는 변수 초기화
    for j in range(N):     # result 리스트를 탐색하는 반복문
        if answer[j] == 0: # 현재 j번째 위치가 아직 값이 채워지지 않은 경우
            if count == memory[i]:  # 채워지지 않은 위치의 개수가 memory[i]와 같을 때
                answer[j] = i + 1  # 해당 위치에 i+1 값 삽입
                break              # 현재 메모리 값이 삽입된 후에는 반복문 탈출
            count += 1     # 빈 위치를 찾기 위해 현재 채워진 값의 개수 증가
            
print(*answer)

memory 리스트의 정보를 바탕으로 각 사람의 번호를 answer 리스트에 채워넣는다.

  1. memory 리스트를 순회하며 각 사람의 정보를 가져온다.
  2. count 변수는 현재까지 answer 리스트에서 값이 채워진 위치의 수를 나타낸다.
  3. answer 리스트를 순회하며, 값이 채워지지 않은 위치를 찾는다.
  • 비워진 위치를 찾았을 때, count 변수의 값과 memory 요소의 값이 같은지 비교한다.
    • 같을 경우, 해당 위치에 현재 순서 값을 삽입하여 해당 사람의 번호를 결정한다. break 문을 통해서 바로 다음 사람의 정보로 넘어간다.
    • 같지 않을 경우, count 값을 증가시키고 answer 리스트의 탐색을 이어서 한다.
  1. 반복문이 모두 완료되면, answer 리스트는 각 사람의 순서에 맞게 채워지게 된다.

0개의 댓글