패킹과 언패킹

MineeHyun·2024년 9월 16일

개념 공부들

목록 보기
1/5
post-thumbnail

요즘은 솔브닥 클래스 도장깨기를 하고 있다.
큰 이유는 없고 그냥 올해가 가기 전에 클래스 5를 따고 싶음
작은 목표는 9월 안에 3++ 달기 (노력하면 4도 달 수 있을 듯...)

문제 풀고 남의 코드 염탐하고 돌아다니는 중에 엄청난 것을 찾아서 기록해 두고 싶었다.
그것은 바로 ...

BOJ 10816번: 숫자 카드

https://www.acmicpc.net/problem/10816
입력
첫번째 줄: 카드의 개수 N
다음 1줄: N장의 카드에 적혀있는 숫자 나열
셋째 줄: 몇 장 가지고 있는지 궁금한 숫자의 개수 M
다음 1줄: M개의 숫자

출력
첫 번째 줄: M개의 숫자에 대해서 각 숫자가 적힌 카드를 몇 개 가지고 있는지 공백으로 구분해 출력

import sys 

n = int(sys.stdin.readline())
nList = map(int, sys.stdin.readline().split())
nDict = {}

for key in nList:
  if (key in nDict):
    nDict[key] += 1
  else: 
    nDict[key] = 1

m = int(sys.stdin.readline())
mList = map(int, sys.stdin.readline().split())

resultList = []
for num in mList: 
  if (num in nDict):
    resultList.append(nDict[num])
  else:
    resultList.append(0)

print(*resultList)

풀이 자체는 간단하지만 출력에 언패킹을 사용했다.
print(*list)와 같은 형태로 코드를 작성하면 출력 결과가 ' '.join(list)한 것과 같이 나온다. (공백으로 구분되어 한 줄로 출력됨)
이걸 다른 사람의 풀이에서 보고 짱 신기해서 적용해 봤다.

패킹과 언패킹에 대해서는 아래 문서에서 간략한 설명을 보고 이해할 수 있다.
https://wikidocs.net/22801

패킹

패킹은 '여러 개의 객체'를 '하나의 객체'로 다룰 수 있도록 해준다.
함수에 매개변수를 보내고자 할 때 인자의 개수가 정해져 있으면 여러모로 까다로울 때가 있다.
그럴 때 아묻따 패킹을 해버리면 좀 더 쉽게 코드를 짤 수가 있다.

def fun(*args):
  print(args)

fun('a', 'b')
fun(1, 2, 3)
fun(100, 10.2, "HIHI")
fun(200000000000000)
fun("merongmerongme", "rong", "1", "2", 3, 4, 5, 56, 7, 8, 5, 4, 3, 52, 2)

이렇게 쓰면 args로 넘어오는 건 뭐든지 상관 없게 된다.

인자의 형식도, 개수도 상관 없이 내용물을 출력하는 모습
이렇게 넘어가는 args는 tuple이다.

def fun(*args):
  if (args):
    print(args)
  else:
    print("nothing")
fun()


심지어는 인자가 있든지 없든지 관계 없이 함수를 실행시킬 수도 있다.
이런 기능을 사용해서 꼭 필요한 인자와 optional한 인자를 구분할 수도 있다고 함 (ㄷㄷ)

언패킹

패킹과 반대로: 하나의 객체를 여러 개의 객체로 나누어 준다.
인자 앞에 *를 붙여서 객체를 언패킹할 수 있다.

print(*resultList)
print(*[elem1, elem2, ...])
print(elem1, elem2, ...)
print() 안에 여러 개 인자를 넣으면 띄어쓰기로 구분해서 출력해 준다.
그래서 ' '.join(list)했을 때와 같은 결과로 출력되는 것.

알고 있으면 요긴하게 쓸 수 있을 것 같아서 정리해 보았다
세상은 넓고 똑똑한 사람은 진짜 개많은 것 같다

0개의 댓글