딕셔너리(Dictionary)란

딕셔너리는 Key와 Value를 쌍으로 갖는 자료형.

리스트나 튜플처럼 순차적으로 해당 요소값을 구하지 않고 Key를 통해 Value를 얻음.

딕셔너리 작동 방법

딕셔너리를 파이썬에서 정의하는 방법

dic = {'name':pey','phone':'0119993323','birth':'1118','list1':[1,2,3]}

라는 방식으로 정의할 수 있으며, 위의 딕셔너리는 아래의 표 형태로 나타낼 수 있다.

딕셔너리의 Value에는 단순 string이나 int형 변수들 뿐 아니라 list형을 포함한 어떠한 자료형이든 추가가 가능하다

하지만, Key에는 immutable한 자료형들만 선언 가능하다.

따라서 tuple이나 dictionary는 key로 설정이 가능하나, list는 선언이 불가하다.

Key Value
name pey
phone 0119993323
birth 1118
list1 [1,2,3]

딕셔너리의 Key와 Value 사용방법

위의 dic 딕셔너리를 사용해 예시를 들겠다.

만약, name의 value값을 얻고 싶다면

dic['name']
>>>pey

으로 선언하면 value값인 pey를 return 받을 수 있다.

pey['hello']='english'

로 선언하면, pey는 마지막에 hello를 key값으로, english를 value값으로 가진 dictionary가 된다.

Key Value
name pey
phone 0119993323 
birth 1118
list1 [1,2,3]
hello english

 

del pey['name']

로 선언하면, pey는 name을 key값으로 가진 항목을 전부 지워버린 dictionary가 된다.

Key Value
phone 0119993323
birth 1118
list1 [1,2,3]
hello english

딕셔너리 함수들

dic = {'name':pey','phone':'0119993323','birth':'1118'}

 

dic.keys()

dictionary의 key값만을 모아서 dick_keys라는 객체를 리턴하는 함수

리스트를 return하는 것이 아님. 리스트로 변환을 위해선 list()함수 사용 필요

dic.keys()
>>>dict_keys(['name','phone','birth'])

dic.values()

dictionary의 value값만을 모아서 dick_values라는 객체를 리턴하는 함수

리스트를 return하는 것이 아님.

dic.values()
>>>dict_values(['pey','0119993323','1118'])

dic.items()

key와 value의 쌍을 튜플로 묶은 값을 dict_items객체를 리턴하는 함수

리스트를 return하는 것이 아님.

dic.items()
>>>dict_items([('name','pey'),('phone','0119993323'),('birth','1118')])

dic.get(x,"default value")

x라는 key에 대응하는 value를 리턴하는 함수

만약 x라는 key가 dictionary에 없다면 default value를 리턴한다.

default value를 비워두면 None을 리턴한다.

dic.get('name')
>>>'pey'
dic.get('phone')
>>>'0119993323'
dic.get('nokey')
=>오류 발생
dic.get('nokey','bar')
>>>'bar'

 

 '그리디(greedy) 알고리즘'은 '현재 상황에서 가장 좋은 것을 고르는' 알고리즘이다.

문제에서 '가장 큰 순서대로', '가장 작은 순서대로'라는 말이 나오면 그리디 알고리즘을 고민해 볼 필요가 있다.

가장 대표적인 문제로는 '거스름돈' 문제를 들 수 있다.

'거스름돈' 문제는 간략하게

      무한히 많은 개수의 500원, 100원, 50원, 10원짜리 동전이 존재할 때 최소한의 동전 개수로 거스름돈을 주는 문제이다.

이를 그리디 알고리즘으로 접근하면 다음 코드처럼 작성할 수 있다.

n = int(input("총 금액은 얼마인가요"))
count = 0
coint_types=[500,100,50,10]
for coin in coin_types:
    count += n // coin    #현재 동전은 몇 개를 줄 수 있는지 카운트에 저장
    n%=coin                  #원래 금액에서 동전을 준 만큼은 빼고 금액을 저장
print(count)

 위 코드는 가장 큰 화폐 단위인 500원부터 가장 작은 화폐 단위인 10원까지 순차적으로 접근하는 방식으로 앞서 말했던 것처럼 '가장 큰 순서대로' 문제를 접근한 방식이다. 

다만, 문제를 조금 변형하여 500원, 100원, 50원, 10원이 아니라 500원, 400원, 100원인 경우를 생각해 보자.

이 경우는 800원을 거스름돈으로 주어야 할 때 그리디 알고리즘으로는 500+100+100+100으로 4개의 결괏값이 나오지만

사실 400원을 2개 주는 것이 최적값이라고 할 수 있다. 기존 문제를 그리디 알고리즘으로 풀 수 있었던 것은 

'큰 단위의 화폐가 항상 작은 단위의 배수 형태' 이므로 가능했다.

어떤 코딩 테스트 문제를 만났을 때, 바로 문제 유형을 파악하기 어렵다면 그리디 알고리즘을 의심하고, 만약 해답을 찾을 수 없다면 다이나믹 프로그래밍이나 그래프 알고리즘 등으로 문제를 해결할 수 있는지 고민해 볼 필요가 있다.

+ Recent posts