[백준/Python] 1138번 - 한 줄로 서기

Sujin Lee·2022년 7월 6일
0

코딩테스트

목록 보기
81/172
post-thumbnail
post-custom-banner

문제

1138번 - 한 줄로 서기

해결 과정

시행착오

  • 0이 몇개 있는지, 해당 사람보다 큰 키는 몇 명인지를 하나씩 확인하려했는데, 작은 키부터 자리를(height) 채우니까 해당 사람보다 큰 키는 왼쪽의 0의 갯수와 같으므로 그것만 확인하면 된다.
  • count(0)으로 해결하려했지만 역부족

풀이

import sys

n = int(sys.stdin.readline())
# 자신보다 왼쪽에 있는 키 큰 사람의 수
people = list(map(int,sys.stdin.readline().split()))
# 키 순서대로 사람들을 나열
height = [0] * n

for i in range(n):
  # 자신의 왼쪽에 있는 키 큰 사람의 수
  cnt = 0
  for j in range(n):
    # 자신의 왼쪽에 있는 키 큰 사람의 수와 맞고, 그 자리에 아무도 없다면
    if cnt == people[i] and height[j] == 0:
      height[j] = i + 1
      break
    # 자리에 아무도 없다면 자신의 왼쪽에 키 큰 사람의 수를 카운트
    elif height[j] == 0:
      cnt += 1
    
print(*height)

Python 문법

* (아스테리스크)

파이썬에서 *는 언팩(Unpack)이다. 시퀀스 언패킹 연산자(Sequence Unpacking Operator)로 말 그대로 시퀀스를 풀어 헤치는 연산자를 뜻하며, 주로 튜플이나 리스트를 언패킹하는데 사용한다.

1. 튜플 풀기

import collections
nums = [1, 1, 1, 2, 2, 3]
k = 2
print(collections.Counter(nums).most_common(k))             # [(1, 3), (2, 2)]
print(list(zip(collections.Counter(nums).most_common(k))))  # [((1, 3),), ((2, 2),)]
print(list(zip(*collections.Counter(nums).most_common(k)))) # [(1, 2), (3, 2)]

# Counter.moste_common(k): 데이터가 가장 많은 순으로 k개 리턴
  • * 로 언패킹을 하여 튜플의 값을 풀을 수 있다.

2. 리스트 원소 출력

fruits = ['lemon', 'pear', 'watermelon', 'tomato']
print(*fruits)    # lemon pear watermelon tomato
  • 리스트의 원소들을 출력하는데 for 반복문을 사용하는 대신 *로 언패킹하여 출력할 수 있다

3. 함수의 파라미터로 사용(packing)

  • *는 언패킹뿐만 아니라 함수의 파라미터가 되었을 때는 반대로 패킹(Packing)도 가능하다.
def f(*params):
     print(params)

f('a', 'b', 'c')   # ('a', 'b', 'c')
  • 하나의 파라미너를 받는 함수에 3개의 인자를 전달했지만, params 변수 하나로 패킹되어 처리된다.
  • 이는 파이썬 3+에서 print() 함수의 기본 동작 원리이기도 하다.

4. 변수 할당

a, *b = [1, 2, 3, 4]
print(a)  # 1
print(b)  # [2, 3, 4]

*a, b = [1, 2, 3, 4]
print(a)  # [1, 2, 3]
print(b)  # 4
  • 변수의 할당 또한 * 로 묶어서 처리할 수 있다. 일반적인 변수는 값을 하나만 취하지만 * 로 처리하게 되면 나머지 모든 값을 취하게 된다.

5. 키/값 페어 언패킹

  • 파이썬에서 * 1개는 튜플 또는 리스트 등의 시퀀스 언패킹이고, ** 2개는 키/값 페어를 언패킹 하는데 사용된다.
date_info = {'year' : '2020', 'month' : '01', 'day' : '7'}
new_info = {**date_info, 'day': "14"}
print(new_info)        # {'year': '2020', 'month': '01', 'day': '14'}
  • date_info의 모든 요소를 언패킹 하였고, day: '14' 로 업데이트도 하였다.

https://velog.io/@t1won/Python-%EC%95%84%EC%8A%A4%ED%85%8C%EB%A6%AC%EC%8A%A4%ED%81%AC

profile
공부한 내용을 기록하는 공간입니다. 📝
post-custom-banner

0개의 댓글