요즘은 솔브닥 클래스 도장깨기를 하고 있다.
큰 이유는 없고 그냥 올해가 가기 전에 클래스 5를 따고 싶음
작은 목표는 9월 안에 3++ 달기 (노력하면 4도 달 수 있을 듯...)
문제 풀고 남의 코드 염탐하고 돌아다니는 중에 엄청난 것을 찾아서 기록해 두고 싶었다.
그것은 바로 ...
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)했을 때와 같은 결과로 출력되는 것.
알고 있으면 요긴하게 쓸 수 있을 것 같아서 정리해 보았다
세상은 넓고 똑똑한 사람은 진짜 개많은 것 같다