배열이란?
>>list01 = []
>>list02 = [1,2,3]
>>list03 = ['A','B','C', ] #마지막에 쉼표 써도됨
---------------------
>>list04 = list() #[] 빈 리스트
>>list05 = list('ABC') #['A','B','C']
>>list06 = list([1,2,3]) #list로부터 값 받음
>>list07 = list((1,2,3)) #tuple로부터 값 받음
>>list08 = list({1,2,3}) #집합으로부터 값 받음
>>list09 = [None]*5 #[None,None,None,None,None]
---------------------
* 특이사항
>>list05 = list('ABC') #['A','B','C']
>>list051 = list(['ABC']) #['ABC']
>>list052 = list('ABC',1) #Type error
--> list + tuple
>>tuple01 = () #빈 튜플
>>tuple02 = 1, #(1,)
>>tuple03 = (1,) #(1,)
---------------------
*주의) 다음은 튜플이 아닌 int형 변수
>>v01 = 1
>>v02 = (1)
---------------------
>>tuple04 = 1, 2, 3
>>tuple05 = 1, 2, 3,
>>tuple06 = (1,2,3)
>>tuple07 = (1,2,3, ) # 여백은 상관없음
-> 04~07까지 #(1,2,3)으로 동일
>>tuple08 = 'A','B','C', #('A','B','C')
---------------------
>>tuple09 = tuple() #() 빈 튜플
>>tuple10 = tuple('ABC') #('A','B','C')#각 문자로부터 원소를 생성
>>tuple11 = tuple([1,2,3]) #list로부터 원소를 생성
>>tuple12 = tuple({1,2,3}) #집합으로부터 원소를 생성
---------------------
>>tuple13 = tuple(range(7))
>>tuple14 = tuple(range(3,13,2)) #(3,5,7,9,11)
-> range를 써도 만드는게 가능!
>>x = [1,2,3]
>>a,b,c = x
>a,b,c #(1,2,3)
>>x = [1,2,3,4,5,6,7]
>>x[2] # 3
>>x[-1] # 7
>>x[0:6] #[1,2,3,4,5,6]
>>x[0:7:2] #[1,3,5,7]
>>x[-4:-2] #[4,5]
>>x[3:1] #[] *오류는 나지 않음
-정말 간단하게 변경가능/변경 불가능이라고 생각하면 된다.
그 이유는 한번 이해하면 절대 까먹지 않을 것이다.
x = [5]
y = [5]
print(id(x),id(y)) #4345347584 4345666560
x = (5)
y = (5)
print(id(x),id(y))#4295993776 4295993776
위 두 식의 차이가 보이는가?
리스트는 id값이 다른 반면, 튜플은 값이 같으면 id값이 같다.
즉 tuple은 자료를 저장하는 것이 아닌, 자료가 있는 위치를 지정해주는 것이다.
그렇기때문에, tuple의 값을 변경하게 되면, 지정해준 위치의 값이 변하게 되는것이고,
그럼 다른 자료들에도 영향을 미치기 때문에 변경 불가능이다.
반대로 list는?
정보를 list에 저장하는 것임으로 변경해도 상관없다.
reverse/reversed 차이
>>x = [1,2,3,4,5]
>>x,reverse()
>print(X) #[5,4,3,2,1]
>>x = [1,2,3,4,5]
>>y = list(reversed(x))
print(y) #[5,4,3,2,1]
이후 진수전환/소수판별은 스킵
한마디로 요약하면 자신이 자신을 반복한다는 것이다.
def function(n)
if n == 0 :
return 1
else :
return n*function(n-1)
##대충 이런느낌이다.
자신이 자신을 실행한다 라고 보면 된다.
예제를 풀어보며 좀 더 자세하게 설명해보자.
백준 1914번 하노이탑이다.
하노이탑은 개념만 놓고 보면 참 간단한 문제이다.
근데 이렇게만 적고 보면 식으로 바꾸기 참 힘들다.
그래서 10개를 쌓던 100개를 쌓던 반복되는 부분을 찾아야 한다.
그 방법은 다음과 같다.
이 과정은 n이 2,10,100 .... 어떤 숫자가 들어와도 동일하게 적용된다.
이것을 코드로 적어보자.
def move(no:int,x:int,y:int) -> None:
if no>1:
move(no-1,x,6-x-y)
print(x,y)
if no>1:
move(no-1,6-x-y,y)
if no>1:
move(no-1,x,6-x-y)
print(x,y)
if no>1:
move(no-1,6-x-y,y)
세세한 과정을 이해하는것이 아닌, 왜 재귀적인 방법으로 풀어지는지에 초점을 맞춰
이해하면 될 것 같다.
알고리즘의 속도는 결과까지 걸리는 절차의 수로 표시한다.