코딩테스트 합격자 되기
2주차 스터디
기본과정 - 리스트/딕셔너리
유투브 강의와 같이 보세요
리스트 영상 딕셔너리 영상
책 구경하기
책 구매하기 미리보기(무료,180페이지)
저자와 소통하기
기본적인 자료구조/알고리즘 코드
꼭 알아야 할 개념이 포함된 코드
(성능측정/자주실수하는 코드 등)
책에 있는 문제의 정답코드
리스트
리스트
- “[]”를 사용해서 선언함
- 데이터의 순서가 있는 변경 가능한 컬렉션
- 내부는 동적배열로 구현됨
리스트 특성
리스트의 특성(1 / 3)
1
2
3
lst
140500114981104
140500114981136
140500114981168
메모리 주소
선언시 “[]”를 사용함
+32
+32
메모리가 연속적으로 잡히므로
임의접근(인덱스 사용이 가능, lst[0], lst[1], lst[2])
리스트의 특성(2 / 3)
1
2
3
lst
140500114981104
140500114981136
140500114981168
메모리 주소
+32
+32
+32
4
140500114981200
- 동적배열로 관리되기 때문에 크기 고민 X
- 기존 원소는 다시 생성되지 않고 유지
리스트 생성(3 / 3)
1
2
5
3
lst
140500114981104
140500114981136
140500114981168
메모리 주소
+32
+32
- mutable(변경 가능)하므로, 기존 객체 유지
된 상태에서 값이 수정됨
리스트 생성
리스트 생성(1 / 4)
1
2
3
my_list
4
5
리스트 생성(2 / 4)
0
1
4
squared_list
0
1
2
3
4
9
16
x
리스트 생성(3 / 4)
0
repeated_list
0
0
0
0
리스트 생성(4 / 4)
1
lst
2
3
‘c’
lst_str
‘a’
‘p’
리스트 원소 접근
리스트의 구조를 다시 보면!
리스트 인덱싱
- 리스트는 순서가 명확하므로 임의접근 가능(인덱스로 접근)
- : 을 활용해서 원소 하나가 특정 범위의 원소를 가져올 수 있음
- [A:]의 경우 인덱스 A에 해당되는 원소 부터 의 뒤가 비어있을 경우 맨 끝까지 원소를 가져옴
- [:A]의 경우, 처음부터 인덱스 A-1에 해당되는 원소까지 가져옴
- 음수인 경우에도 동일하게 적용됨, [:]를 활용하면 전체를 나타낼수도 있음
리스트의 슬라이싱
리스트 메소드
- 리스트의 끝에 item을 추가
- 반환값은 없음
- 시간복잡도 O(1)
append(item)
1
2
3
lst
4
5
원소 추가
- 리스트의 맨 끝의 item을 삭제
- 반환값은 삭제한 원소
- 시간복잡도 O(1)
pop()
1
2
3
lst
4
맨 뒤의 원소를
삭제 하고 반환
- 리스트의 맨 앞의 item을 삭제
- 반환값은 삭제한 원소
- 시간복잡도 O(N), N은 리스트의 길이
pop(0)
1
2
3
lst
맨 앞의 원소 삭제
모든 원소가
이동해야함
- 리스트에서 “맨 처음 나오는” item에 해당되는 값을 삭제
- 반환값은 없음
- 시간복잡도 O(N), N은 리스트의 길이
remove(item)
1
3
11
lst
7
11
맨 처음 나오는 item 삭제
맨 처음 값만 삭제 되므로 item과 같은 값이지만 삭제 되지 않음
- 리스트의 뒤에 s의 모든 요소를 추가
- 반환값은 없음
- 시간복잡도 O(s), s의 원소 길이
extend(s)
1
2
3
lst
7
8
lst의 뒤에 [7,8] 추가
- 리스트에 item 값이 있는지 확인
- item이 있으면 True, 없으면 False
- 시간복잡도 O(N), N은 리스트의 길이
item in 리스트
1
2
3
lst
리스트 사용시 주의할 점
- 리스트의 맨 앞의 원소를 삭제할 경우에는 뒤의 모든 원소가 copy-move 됩니다. O(N)
- 대안 : deque를 사용 O(1)
맨 앞에 원소 삭제(삽입도 마찬가지)
1
2
3
lst
copy move
1
2
3
lst copy-move X
deque의 자세한 내용은 아래 참조
https://github.com/dremdeveloper/codingtest_python/blob/main/Algorithm_with_DataStructure/deque.py
- 매번 원소를 탐색할 때 마다 순차 탐색이 진행됩니다. O(N)
- 대안 : set을 사용 합니다. O(1)
빈번 하게 원소를 탐색
1
2
3
lst
한번 찾을때 마다 3회
탐색하고, 이를 99번
반복
297번 연산
set은 해시기반으므로 한번 찾을때 마다 1회 반복합
니다. 99회 연산!! 따라서 시간 복잡도 O(1)
set은 2주차 에서 다루지 않습니다. 아래 참조
https://github.com/dremdeveloper/codingtest_python/blob/main/Algorit
hm_with_DataStructure/set.py
딕셔너리
딕셔너리
- 해시 기반으로 이루어진 자료구조
- { 키1:값1, 키2:값2} 와 같이 키-값 쌍으로 되어 있음
딕셔너리의 특성
해시의 개념 - 해시가 없다면?
- 이름을 통해 전화번호를 검색하는 경우를 상상 해보자.
- 이름을 검색할 때마다 이름 테이블에서 해당 이름을 찾아야함, O(N)이 걸림
- “{}”을 사용해서 선언 함, 단 set과 다른점은 내부 원소가 키:값형태 임.
해시의 개념 - 해시를 활용한다면?
- 해시함수를 활용해서 “이름” 자체를 인덱스로 만들자.
- 이름 자체가 인덱스이므로 충돌이 없다면 , O(1)이 걸림
딕셔너리 생성
딕셔너리의 생성
dict
2323
25211
“value1”
“value2”
“key1” 2323
“key2” 25211
해싱 함수
딕셔너리 접근
- 딕셔너리에서 key에 해당되는 값을 반환 함, 해당 되는 값이 없을 경우 None을 반환
- get()의 시간복잡도는 O(1)
딕셔너리의 접근 - get(key)
dic
“a”
“b”
1
2
“c” 3
- 딕셔너리에서 key에 해당되는 값을 반환 함, 해당 되는 값이 없을 경우 KeyError 발생함!!!
- []의 시간복잡도는 O(1)
딕셔너리의 접근 - [key]
dic
“a”
“b”
1
2
“c” 3
- key error가 발생하지 않도록 if-else 문으로 체크해서 접근해야함
딕셔너리의 접근 - [key], 이린석으로 사용해야 함
dic
“a”
“b”
1
2
“c” 3
딕셔너리 값 변경
- 딕셔너리에서 key에 해당되는 값을 변경할 수 있음, 해당 되는 값이 없을 경우 KeyError 발생함!!!
- 시간 복잡도 O(1)
딕셔너리의 값 변경 - [key]활용, 예외사항 고려
dic
“a”
“b”
1
2
“c”
3
5
딕셔너리 메서드
- 호출한 dictionary에 dict에 있는 모든 key-value쌍을 추가
- dict에 있는 key-value쌍의 갯수가 K라면 시간복잡도는 O(K)
딕셔너리 메서드 - update(dict)
dic
“a”
“b”
1
2
“c” 3
“d” 4
“e” 5
아래 두개를 추가
“d”:4
“e”:5
- 딕셔너리의 모든 key 확인 가능
- 시간복잡도 O(1)
- 반복문은 dic 크기만큼 연산하므로 N번 연산
딕셔너리 메서드 - keys(), 모든 key 확인
dic
“a”
“b”
1
2
“c” 3
딕셔너리의 모든 키 정보 확인 가능
- 딕셔너리의 모든 key,value 확인 가능
- 시간복잡도 O(1)
- 반복문은 dic 크기만큼 연산하므로 N번 연산
딕셔너리 메서드 - items(), 모든 key,value 확인
dic
“a”
“b”
1
2
“c” 3
딕셔너리의 모든 키,값 정보 확인 가능
- 딕셔너리의 특정 key에 해당 되는 버킷 삭제
- 반환값 없음
- 시간복잡도 O(1)
딕셔너리 메서드 - delete, 해당 key 버킷 삭제
dic
“a”
“b”
1
2
“c” 3
삭제
dic
“b” 2
“c” 3
삭제된 후 모습
- 딕셔너리의 특정 key에 해당 되는 버킷 삭제
- 삭제된 key에 해당되는 값 반환
- 시간복잡도 O(1)
딕셔너리 메서드 - pop(key), 해당 key 버킷 삭제
dic
“a”
“b”
1
2
“c” 3
삭제
dic
“b” 2
“c” 3
삭제된 후 모습
딕셔너리 사용시 주의할 점
- mutable한 객체를 key로 하면 Key error가 발생
mutable(변경가능한 객체)는 key가 될수 없음
Mutable Object Immutable Object
list int,float,bool…
set string
dictionary tuple
딕셔너리의 key가 될 수 없음
- 딕셔너리에서 key에 해당되는 값을 변경할 수 있음, 해당 되는 값이 없을 경우 KeyError 발생함!!!
아래와 같이 if,else를 사용하거나 값이 없는 key에 기본값을 주고 싶으면 defaultdict이 대안
- 시간 복잡도 O(1)
[]을 사용할 경우 key가 없으면 KeyError가 발생
dic
“a”
“b”
1
2
“c”
3
5
- 딕셔너리를 사용하려고 할때 중복되는 key가 있는지 검토해야 함.
- 중복 key가 있다면 list,deque 같이 중복여부에 영향을 받지 않는 자료구조를 사용하는게 대안
딕셔너리는 중복 key를 허용하지 않음
dic
“a”
“b”
1
4
2
“c” 5

코딩테스트 합격자 되기 2주차 스터디 - 리스트_딕셔너리

  • 1.
    코딩테스트 합격자 되기 2주차스터디 기본과정 - 리스트/딕셔너리
  • 2.
    유투브 강의와 같이보세요 리스트 영상 딕셔너리 영상
  • 3.
    책 구경하기 책 구매하기미리보기(무료,180페이지)
  • 4.
    저자와 소통하기 기본적인 자료구조/알고리즘코드 꼭 알아야 할 개념이 포함된 코드 (성능측정/자주실수하는 코드 등) 책에 있는 문제의 정답코드
  • 5.
  • 6.
    리스트 - “[]”를 사용해서선언함 - 데이터의 순서가 있는 변경 가능한 컬렉션 - 내부는 동적배열로 구현됨
  • 7.
  • 8.
    리스트의 특성(1 /3) 1 2 3 lst 140500114981104 140500114981136 140500114981168 메모리 주소 선언시 “[]”를 사용함 +32 +32 메모리가 연속적으로 잡히므로 임의접근(인덱스 사용이 가능, lst[0], lst[1], lst[2])
  • 9.
    리스트의 특성(2 /3) 1 2 3 lst 140500114981104 140500114981136 140500114981168 메모리 주소 +32 +32 +32 4 140500114981200 - 동적배열로 관리되기 때문에 크기 고민 X - 기존 원소는 다시 생성되지 않고 유지
  • 10.
    리스트 생성(3 /3) 1 2 5 3 lst 140500114981104 140500114981136 140500114981168 메모리 주소 +32 +32 - mutable(변경 가능)하므로, 기존 객체 유지 된 상태에서 값이 수정됨
  • 11.
  • 12.
    리스트 생성(1 /4) 1 2 3 my_list 4 5
  • 13.
    리스트 생성(2 /4) 0 1 4 squared_list 0 1 2 3 4 9 16 x
  • 14.
    리스트 생성(3 /4) 0 repeated_list 0 0 0 0
  • 15.
    리스트 생성(4 /4) 1 lst 2 3 ‘c’ lst_str ‘a’ ‘p’
  • 16.
  • 17.
  • 18.
    리스트 인덱싱 - 리스트는순서가 명확하므로 임의접근 가능(인덱스로 접근)
  • 19.
    - : 을활용해서 원소 하나가 특정 범위의 원소를 가져올 수 있음 - [A:]의 경우 인덱스 A에 해당되는 원소 부터 의 뒤가 비어있을 경우 맨 끝까지 원소를 가져옴 - [:A]의 경우, 처음부터 인덱스 A-1에 해당되는 원소까지 가져옴 - 음수인 경우에도 동일하게 적용됨, [:]를 활용하면 전체를 나타낼수도 있음 리스트의 슬라이싱
  • 20.
  • 21.
    - 리스트의 끝에item을 추가 - 반환값은 없음 - 시간복잡도 O(1) append(item) 1 2 3 lst 4 5 원소 추가
  • 22.
    - 리스트의 맨끝의 item을 삭제 - 반환값은 삭제한 원소 - 시간복잡도 O(1) pop() 1 2 3 lst 4 맨 뒤의 원소를 삭제 하고 반환
  • 23.
    - 리스트의 맨앞의 item을 삭제 - 반환값은 삭제한 원소 - 시간복잡도 O(N), N은 리스트의 길이 pop(0) 1 2 3 lst 맨 앞의 원소 삭제 모든 원소가 이동해야함
  • 24.
    - 리스트에서 “맨처음 나오는” item에 해당되는 값을 삭제 - 반환값은 없음 - 시간복잡도 O(N), N은 리스트의 길이 remove(item) 1 3 11 lst 7 11 맨 처음 나오는 item 삭제 맨 처음 값만 삭제 되므로 item과 같은 값이지만 삭제 되지 않음
  • 25.
    - 리스트의 뒤에s의 모든 요소를 추가 - 반환값은 없음 - 시간복잡도 O(s), s의 원소 길이 extend(s) 1 2 3 lst 7 8 lst의 뒤에 [7,8] 추가
  • 26.
    - 리스트에 item값이 있는지 확인 - item이 있으면 True, 없으면 False - 시간복잡도 O(N), N은 리스트의 길이 item in 리스트 1 2 3 lst
  • 27.
  • 28.
    - 리스트의 맨앞의 원소를 삭제할 경우에는 뒤의 모든 원소가 copy-move 됩니다. O(N) - 대안 : deque를 사용 O(1) 맨 앞에 원소 삭제(삽입도 마찬가지) 1 2 3 lst copy move 1 2 3 lst copy-move X deque의 자세한 내용은 아래 참조 https://github.com/dremdeveloper/codingtest_python/blob/main/Algorithm_with_DataStructure/deque.py
  • 29.
    - 매번 원소를탐색할 때 마다 순차 탐색이 진행됩니다. O(N) - 대안 : set을 사용 합니다. O(1) 빈번 하게 원소를 탐색 1 2 3 lst 한번 찾을때 마다 3회 탐색하고, 이를 99번 반복 297번 연산 set은 해시기반으므로 한번 찾을때 마다 1회 반복합 니다. 99회 연산!! 따라서 시간 복잡도 O(1) set은 2주차 에서 다루지 않습니다. 아래 참조 https://github.com/dremdeveloper/codingtest_python/blob/main/Algorit hm_with_DataStructure/set.py
  • 30.
  • 31.
    딕셔너리 - 해시 기반으로이루어진 자료구조 - { 키1:값1, 키2:값2} 와 같이 키-값 쌍으로 되어 있음
  • 32.
  • 33.
    해시의 개념 -해시가 없다면? - 이름을 통해 전화번호를 검색하는 경우를 상상 해보자. - 이름을 검색할 때마다 이름 테이블에서 해당 이름을 찾아야함, O(N)이 걸림 - “{}”을 사용해서 선언 함, 단 set과 다른점은 내부 원소가 키:값형태 임.
  • 34.
    해시의 개념 -해시를 활용한다면? - 해시함수를 활용해서 “이름” 자체를 인덱스로 만들자. - 이름 자체가 인덱스이므로 충돌이 없다면 , O(1)이 걸림
  • 35.
  • 36.
  • 37.
  • 38.
    - 딕셔너리에서 key에해당되는 값을 반환 함, 해당 되는 값이 없을 경우 None을 반환 - get()의 시간복잡도는 O(1) 딕셔너리의 접근 - get(key) dic “a” “b” 1 2 “c” 3
  • 39.
    - 딕셔너리에서 key에해당되는 값을 반환 함, 해당 되는 값이 없을 경우 KeyError 발생함!!! - []의 시간복잡도는 O(1) 딕셔너리의 접근 - [key] dic “a” “b” 1 2 “c” 3
  • 40.
    - key error가발생하지 않도록 if-else 문으로 체크해서 접근해야함 딕셔너리의 접근 - [key], 이린석으로 사용해야 함 dic “a” “b” 1 2 “c” 3
  • 41.
  • 42.
    - 딕셔너리에서 key에해당되는 값을 변경할 수 있음, 해당 되는 값이 없을 경우 KeyError 발생함!!! - 시간 복잡도 O(1) 딕셔너리의 값 변경 - [key]활용, 예외사항 고려 dic “a” “b” 1 2 “c” 3 5
  • 43.
  • 44.
    - 호출한 dictionary에dict에 있는 모든 key-value쌍을 추가 - dict에 있는 key-value쌍의 갯수가 K라면 시간복잡도는 O(K) 딕셔너리 메서드 - update(dict) dic “a” “b” 1 2 “c” 3 “d” 4 “e” 5 아래 두개를 추가 “d”:4 “e”:5
  • 45.
    - 딕셔너리의 모든key 확인 가능 - 시간복잡도 O(1) - 반복문은 dic 크기만큼 연산하므로 N번 연산 딕셔너리 메서드 - keys(), 모든 key 확인 dic “a” “b” 1 2 “c” 3 딕셔너리의 모든 키 정보 확인 가능
  • 46.
    - 딕셔너리의 모든key,value 확인 가능 - 시간복잡도 O(1) - 반복문은 dic 크기만큼 연산하므로 N번 연산 딕셔너리 메서드 - items(), 모든 key,value 확인 dic “a” “b” 1 2 “c” 3 딕셔너리의 모든 키,값 정보 확인 가능
  • 47.
    - 딕셔너리의 특정key에 해당 되는 버킷 삭제 - 반환값 없음 - 시간복잡도 O(1) 딕셔너리 메서드 - delete, 해당 key 버킷 삭제 dic “a” “b” 1 2 “c” 3 삭제 dic “b” 2 “c” 3 삭제된 후 모습
  • 48.
    - 딕셔너리의 특정key에 해당 되는 버킷 삭제 - 삭제된 key에 해당되는 값 반환 - 시간복잡도 O(1) 딕셔너리 메서드 - pop(key), 해당 key 버킷 삭제 dic “a” “b” 1 2 “c” 3 삭제 dic “b” 2 “c” 3 삭제된 후 모습
  • 49.
  • 50.
    - mutable한 객체를key로 하면 Key error가 발생 mutable(변경가능한 객체)는 key가 될수 없음 Mutable Object Immutable Object list int,float,bool… set string dictionary tuple 딕셔너리의 key가 될 수 없음
  • 51.
    - 딕셔너리에서 key에해당되는 값을 변경할 수 있음, 해당 되는 값이 없을 경우 KeyError 발생함!!! 아래와 같이 if,else를 사용하거나 값이 없는 key에 기본값을 주고 싶으면 defaultdict이 대안 - 시간 복잡도 O(1) []을 사용할 경우 key가 없으면 KeyError가 발생 dic “a” “b” 1 2 “c” 3 5
  • 52.
    - 딕셔너리를 사용하려고할때 중복되는 key가 있는지 검토해야 함. - 중복 key가 있다면 list,deque 같이 중복여부에 영향을 받지 않는 자료구조를 사용하는게 대안 딕셔너리는 중복 key를 허용하지 않음 dic “a” “b” 1 4 2 “c” 5