티스토리 뷰

반응형

코딩테스트에 딕셔너리(해시)를 사용할 때 필요한 사용법과 꿀팁에 관해 정리해 보고자 한다. 자주 사용되는 방법에 대해 우선 정리하고 유형을 알아보자. 파이썬의 딕셔너리를 해시라고도 부르니 참고하도록 하자.

 

 

 

 

 

딕셔너리 생성

a = dict()
b = {}
print(type(a), type(b))

```결과값
<class 'dict'> <class 'dict'>
```

 

딕셔너리 추가

a = dict()
a['aa'] = 'abc'
a[2] = [1, 2, 3]
a['test'] = {'b': 'bbb'}
print(a)
```결과값
{'aa': 'abc', 2: [1, 2, 3], 'test': {'b': 'bbb'}}
```

 

딕셔너리 수정

a = {'aa': 'abc', 2: [1, 2, 3], 'test': {'b': 'bbb'}}
a['aa'] = 'new text'
print(a)
```결과값
{'aa': 'new text', 2: [1, 2, 3], 'test': {'b': 'bbb'}}
```

 

딕셔너리 삭제

a = {'aa': 'abc', 2: [1, 2, 3], 'test': {'b': 'bbb'}}
del a['aa']
print(a)
```결과값
{2: [1, 2, 3], 'test': {'b': 'bbb'}}
```


a.clear()
print(a)
```결과값
{}
```

 

딕셔너리 조회

a = {'aa': 'abc', 2: [1, 2, 3], 'test': {'b': 'bbb'}}
print(a['aa'])
```결과값
abc
```

print(a.get('aa'))
```결과값
abc
```

print(a.get('aa'))
```결과값
abc
```

print(a.get('zzzzzzzzzz', 'new!'))
```결과값
new!
```

print(list(a.keys()))
print(list(a.values()))
print(list(a.items()))
```결과값
['aa', 2, 'test']
['abc', [1, 2, 3], {'b': 'bbb'}]
[('aa', 'abc'), (2, [1, 2, 3]), ('test', {'b': 'bbb'})]
```


print('aa' in a)
print('bb' in a)
```결과값
True
False
```
  • a.get('zzzzzzzzzz', 'new!') : 딕셔너리 a에서 'zzzzzzzzzz'인 키값을 조회한다. 그리고 값이 없다면, 'new!'를 출력한다. 이때 딕셔너리 a값에는 추가되지 않는다.

 

딕셔너리 정렬

a = {'a' : 2, 'c': 123, 'b': 22, 'f': 11}
print(sorted(a.items(), key=lambda x : x[0]))
```결과값
[('a', 2), ('b', 22), ('c', 123), ('f', 11)]
```

print(sorted(a.items(), key=lambda x : x[1]))
```결과값
[('a', 2), ('f', 11), ('b', 22), ('c', 123)]
```

print(dict(sorted(a.items(), key=lambda x : x[0])))
```결과값
{'a': 2, 'b': 22, 'c': 123, 'f': 11}
```

print([i[0] for i in sorted(a.items(), key=lambda x : x[1])])
```결과값
['a', 'f', 'b', 'c']
```


# 추가로 아래와 같은 리스트도 비슷하게 정렬이 가능하다.
b = [('classic', 500), ('pop', 600), ('classic', 150), ('classic', 800), ('pop', 2500)]
print(sorted(b, key=lambda x:x[1]))
```결과값
[('classic', 150),
 ('classic', 500),
 ('pop', 600),
 ('classic', 800),
 ('pop', 2500)]
```

 

딕셔너리 차이(수정예정)

- collections.Counter 로 빼기

 

리스트 차이(수정예정)

- set변경후 빼기

    _reserve = [r for r in reserve if r not in lost]
    _lost = [l for l in lost if l not in reserve]

 

 

 

유형 1. 리스트 내부 문자열 비교하기.

핵심. A 리스트에 있는 문자열에서 B리스트에 있는 문자열을 제외하고 리스트에 담아서 return하기

주의사항. A리스트가 B리스트보다 하나가 많다.

 

 

풀이0. 불가능한 사항

for문으로 각각을 뽑아서 비교하면 효율성 측면에서 timeerror가 발생하기 때문에 최적화된 방법을 사용해야한다.

 

 

 

풀이1. collections.Counter

import collections

def sol(A, B):
    answer = collections.Counter(A) - collentions.Counter(B)
    return list(answer.keys())[0]
  • collections.Counter의 결과값은 딕셔너리 형태로 도출된다.
  • collections.Counter는 빼기가 가능하다.

 

풀이2. hash

def sol(A, B):
    answer = ''
    temp = 0
    dic = {}
    for a in A:
        dic[hash(a)] = a
        temp += int(hash(a))
    for b in B:
        temp -= hash(b)
    answer = dic[temp]
    
    return answer
  • hash는 기본적인 pathon의 내장함수이다.
  • return 값을 integer하지 않으면 에러가 발생한다.
  • hash값으로 바 바꾼 총 합에서 B의 총 합을 빼주면 하나만 남기 때문에 딕셔너리에서 찾기가 가능하다.

 

 

풀이3. 정렬 비교풀이

def sol(A, B):
    A.sort()
    B.sort()
    for i in range(len(B)):
        if A[i] != B[i]:
            return A[i]
    return participant[len(A)-1]
def sol(A, B):
    A.sort()
    B.sort()
    for a, b in zip(A, B):
        if a != b:
            return a
    return participant[-1]

zip은 A, B의 요소를 하나씩 뺄 수 있다.

반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
글 보관함