[BOJ-S2] 1138: 한줄로 서기 풀이

아이엠강욱·2023년 5월 27일
0

코딩테스트

목록 보기
15/23

해당 문제를 확인하시고 싶으면 아래 링크를 통해 확인해주세요!
https://www.acmicpc.net/problem/1138


문제

N명의 사람들은 매일 아침 한 줄로 선다. 이 사람들은 자리를 마음대로 서지 못하고 오민식의 지시대로 선다.
어느 날 사람들은 오민식이 사람들이 줄 서는 위치를 기록해 놓는다는 것을 알았다. 그리고 아침에 자기가 기록해 놓은 것과 사람들이 줄을 선 위치가 맞는지 확인한다.
사람들은 자기보다 큰 사람이 왼쪽에 몇 명 있었는지만을 기억한다. N명의 사람이 있고, 사람들의 키는 1부터 N까지 모두 다르다.
각 사람들이 기억하는 정보가 주어질 때, 줄을 어떻게 서야 하는지 출력하는 프로그램을 작성하시오.

입력

첫째 줄에 사람의 수 N이 주어진다. N은 10보다 작거나 같은 자연수이다. 둘째 줄에는 키가 1인 사람부터 차례대로 자기보다 키가 큰 사람이 왼쪽에 몇 명이 있었는지 주어진다. i번째 수는 0보다 크거나 같고, N-i보다 작거나 같다.

출력

첫째 줄에 줄을 선 순서대로 키를 출력한다.

회고

진짜 내가 국어능력이 딸리는건가 문제를 읽고 이해를 못했다. 예를 들어 2 1 1 0이면 나보다 키가 큰 사람이 2명, 1명, 1명, 없다 이런식이라는건데 나보다 키가 큰 사람이 1명인 사람이 2명이라는건 키가 똑같다는거 아닌가? 했다가 도저히 이해가 안돼서 다른 사람의 해설을 보자마자.. 이해가 되었다..

책좀 읽어야지 큰일났네 증말...

풀이

똑같이 2 1 1 0으로 예를 들어보면

  • 왼쪽에 2명이 있어야 하니까 2칸을 비우고 자리 채운다. _ _ 1 _
    - 1은 1번째 사람이기 때문에 1이라고 쓴거임
  • 왼쪽에 1명이 있어야 하니까 1칸을 비우고 자리를 채운다. _ 2 1 _
  • 마찬가지로 왼쪽에 1명이 있어야 하니까 1칸을 비우고 자리를 채운다.
    - 근데 맨앞에는 못앉으니까 맨마지막에 비어있는 자리에 앉힌다.
    • _ 2 1 3
  • 마지막으로 자기보다 큰사람은 없기때문에 맨 앞의 자리에 앉힌다.
    - 4 2 1 3

이 풀이를 알고나니까 그렇게 어렵지는 않았다. 실버2인 이유는 나처럼 문제이해에 어려움이 있을수도 있어서일까..?

"""
백준 1138 (S2): 한 줄로 서기
https://www.acmicpc.net/problem/1138
"""

n = int(input())   # 사람의 수
data = list(map(int, input().split()))   # 자기보다 큰 사람이 왼쪽에 몇명있는지
check = [0] * n

for i in range(n):
  count = 0   # 왼쪽에 몇명있는지 카운팅
  for j in range(n):
    if check[j] == 0 and count == data[i]:   # 자리가 비워져있고 해당 사람수를 채웠으면
      check[j] = i + 1   # 자리 설정
      break
    elif check[j] == 0:   # 자리가 있는 경우에는 카운팅
      count += 1


print(" ".join(map(str, check)))

그 자리가 비어있는 경우, 즉 0일 경우에만 count를 올려준다.
그리고 자리가 비워져있고 필요한 사람수랑 같아지면 반복문을 탈출해준다!

부스트캠프 코딩테스트... 얼마 남지않았다..... 너무 구현문제만 푸는거 같아서 무섭긴한디 구현문제가 거의 주로 이루어져 있다고 하니까.. 화이팅!

profile
블로그 이전했습니다!! https://dev-iamkanguk.tistory.com/ <<- 여기로 오세용!!

0개의 댓글