자료구조란 : 논리적인 관계를 통해 데이터를 모아놓은 구조
데이터의 특성에 따라 알맞는 자료구조를 선택할 수 있어야 한다.
리스트 : 타 언어의 배열(array)에 해당하는 가장 기본적인 자료구조
튜플 : 값을 변경할 수 없는 리스트
메소드 등이 적게 들어있기 때문에 메모리를 적게 사용한다는 장점이 있다.
단순히 데이터를 전달하는 역할을 할 때 튜플을 사용하는 것이 메모리 측면에서 유리하다.
리스트와 for loop
리스트를 직접 for loop에 넣어 인덱스 순서로 반복을 할 수 있고, enumerate
함수를 통해 인덱스와 값을 한 번에 가져와 사용할 수 있다.
리스트를 활용한 기초적인 알고리즘 : 리스트의 최대값, 최소값 구하기, 리스트 뒤집기
항상
reverse
메소드를 사용했는데 배열의 크기가 n일 때n//2
번의 교환으로 배열을 뒤집을 수 있다는 점을 새로 배웠다.
검색 알고리즘 : 원하는 값을 가진 원소를 찾아내는 알고리즘
선형 검색 : 리스트 구조에서 활용할 수 있는 가장 기본적인 검색, 0번 인덱스부터 배열의 끝까지 원하는 값을 찾을 때 까지 순차적으로 탐색한다.
보초법 : 선형 검색을 보완하는 방법으로, 조건 검사 비용을 줄인다.
기존 방법 : 검색값이 맞는지 확인하는 조건 + 배열의 끝인지 확인하는 조건 (최대 2n번)
보초법 : 검색값을 배열에 끝에 삽입하고, 검색값이 맞을 때만 배열의 끝인지 확인 (최대 n+1번)
이진검색 : 데이터가 오름차순이나 내림차순으로 정렬되어있어야 적용이 가능하다.
방법 (오름차순 기준)
left 포인터와 right 포인터를 이용하고, mid 포인터는(left + right) // 2
가 된다.
- mid 포인터의 값과 검색할 값을 비교한다.
- (a) mid 값보다 검색 값이 크다면 우리가 찾는 값은 mid보다 오른쪽에 있다는 뜻이 된다. -> left 를 mid+1로 옮긴다.
(b) mid 값보다 검색 값이 작다면 우리가 찾는 값은 mid보다 왼쪽에 있다는 뜻이 된다. -> right 를 mid-1로 옮긴다.- 검색 값을 찾을 때까지 1~2를 반복한다.
- 더이상 검색 가능한 범위가 없다면 left가 right보다 오른쪽에 위치하게 된다. 이때 검색 실패를 출력하고 반복을 빠져나온다.
remove
를 알게 되었다.list.remove(value)
로 리스트에서 value를 찾아 그 첫 인덱스를 반환한다. 찾는 값이 없다면 ValueError
가 발생한다.for loop에는 range, 리스트, 문자열 등을 담을 수 있다.
정확히 말하자면 for loop에는 iterable
를 담을 수 있다.
iterable는 '반복할 수 있는'이라는 뜻으로, 말그대로 반복이 가능한 객체를 의미한다.
iterable객체를 for loop에 넣으면 안에 있는 모든 요소를 하나씩 꺼내어(가능하면 순차적으로) 반복을 진행할 수 있다.
iterable에는 iter, dict, set, str, bytes, tuple, range 등이 해당한다.
만약 어떤 객체가 iterable인지 확인하고 싶다면 다음의 코드를 사용하면 된다.
# iterable 확인 방법
import collections.abc
object = [1, 3, 5, 7]
isinstance(var_list, collections.Iterable)
# True면 iterable, False면 Iterable이 아님
문제 : https://school.programmers.co.kr/learn/courses/30/lessons/12938
def solution(n, s):
answer = []
for i in range(n, 0, -1):
num = s // i
if num == 0:
return [-1]
answer.append(num)
s -= num
return answer
기존에 풀어보지 못했던 문제 유형이었다.
어떻게 해야 곱셈값이 최고가 되는 집합이 나올지 고민하다보니 집합의 최소값을 최대화 하면 된다는 것을 발견할 수 있었다.
예를 들어 n=4
, s=17
이라면 {5, 4, 4, 4}
가 최고의 집합이 되는데,
17//4 = 4
-> 13//3 = 4
-> 9//2 = 4
-> 5//1 = 5
이런식으로 집합을 구할 수 있다.
만약 s//n = 0
이라면 집합의 최소값이 0이되야한다는 뜻이므로 불가능을 출력하면 된다.