ΰ­¨β”ˆβ”ˆβ”ˆ Studyβ”ˆβ”ˆβ”ˆΰ­§/β†˜ Algorithm 9

[python] μˆœμ—΄κ³Ό μ‘°ν•©

μˆœμ—΄(permutation) - μˆœμ„œλ₯Ό κ³ λ €ν•œ 선택 - nPr둜 ν‘œμ‹œ import imertools arr = ['A', 'B', 'C'] perm = itertools.permutations(arr, 2) # 2개 선택 print(list(perm)) # [('A', 'B'), ('A', 'C'), ('B', 'A'), ('B', 'C'), ('C', 'A'), ('C', 'B')] μ‘°ν•©(combination) - μˆœμ„œλ₯Ό κ³ λ €ν•˜μ§€ μ•Šμ€ 선택 - nCr둜 ν‘œμ‹œ import itertools arr = ['A', 'B', 'C'] combi = itertools.combinations(arr, 2) print(list(combi)) # [('A', 'B'), ('A', 'C'), ('B', 'C')]

[python] bisect

bisect - bisect : νŒŒμ΄μ¬μ—μ„œ 이진탐색을 μ‰½κ²Œ κ΅¬ν˜„ν•˜κΈ° μœ„ν•΄ μ œκ³΅ν•˜λŠ” λΌμ΄λΈŒλŸ¬λ¦¬μ΄λ‹€. - μ •λ ¬λœ λ°°μ—΄μ—μ„œ νŠΉμ •ν•œ μ›μ†Œλ₯Ό μ°Ύμ•„μ•Όν•  λ•Œ 자주 μ‚¬μš©λœλ‹€. - bisect_left(), bisect_right() ν•¨μˆ˜κ°€ κ°€μž₯ μ€‘μš”ν•˜κ²Œ μ‚¬μš©λœλ‹€. bisect_left, bisect_right - bisect_left(list, n) : μ •λ ¬λœ μˆœμ„œλ₯Ό μœ μ§€ν•˜λ©° 리슀트 list에 데이터 n을 μ‚½μž…ν•  κ°€μž₯ μ™Όμͺ½ 인덱슀λ₯Ό μ°ΎλŠ”λ‹€. - bisect_right(list, n) : μ •λ ¬λœ μˆœμ„œλ₯Ό μœ μ§€ν•˜λ©° 리슀트 list에 데이터 n을 μ‚½μž…ν•  κ°€μž₯ 였λ₯Έμͺ½ 인덱슀λ₯Ό μ°ΎλŠ”λ‹€. - bisect_left(list, n, lo = 0, hi = len(list)) : lo와 hiλŠ” κ³ λ €ν•  리슀트의 뢀뢄집합을 μ§€μ •ν•˜λŠ” 데 사..

[μ•Œκ³ λ¦¬μ¦˜] BFS(Breadth First Search)

BFSλž€? - 큐λ₯Ό 톡해 κ΅¬ν˜„μ΄ κ°€λŠ₯ν•˜λ‹€. - λ…Έλ“œλ₯Ό λ°©λ¬Έν•˜λ©΄μ„œ μΈμ ‘ν•œ λ…Έλ“œ 쀑 λ°©λ¬Έν•˜μ§€ μ•Šμ•˜λ˜ λ…Έλ“œμ˜ μ •λ³΄λ§Œ 큐에 λ„£κ³ , 큐어 λ“€μ–΄μžˆλ˜ λ…Έλ“œλΆ€ν„° λ°©λ¬Έν•œλ‹€. - νŒŒμ΄μ¬μ—μ„œ 큐λ₯Ό κ΅¬ν˜„ν•  λ•Œ, listλ₯Ό μ‚¬μš©ν•˜λŠ” κ²½μš°κ°€ λŒ€λΆ€λΆ„μΈλ°. list.pop(0)은 μ‹œκ°„λ³΅μž‘λ„κ°€ O(N)이기 λ•Œλ¬Έμ— μ΄λ ‡κ²Œ κ΅¬ν˜„ν•  경우 μ‹œκ°„μ μœΌλ‘œ λΉ„νš¨μœ¨μ μ΄λ‹€. λ”°λΌμ„œ collections 라이브러리의 dequeλ₯Ό μ‚¬μš©ν•˜λ©΄ μ‹œκ°„μ„ μ ˆμ•½ν•  수 μžˆλ‹€. - λ˜ν•œ μΈμ ‘ν•œ λ…Έλ“œ 쀑 λ°©λ¬Έν•˜μ§€ μ•Šμ•˜λ˜ λ…Έλ“œλ₯Ό 큐에 넣을 λ•ŒλŠ” set 데이터 νƒ€μž…μ„ μ΄μš©ν•˜λ©΄ μ‰½κ²Œ κ΅¬ν˜„ν•  수 μžˆλ‹€. 타이틀 μž…λ ₯λΆ€λΆ„2 BFS κ΅¬ν˜„ - λ™μž‘ κ³Όμ • 1) root λ…Έλ“œλΆ€ν„° μ‹œμž‘ν•˜κΈ° μœ„ν•΄ deque에 rootλ₯Ό λ„£λŠ”λ‹€. 2) 큐가 빌 λ–„κΉŒμ§€ loopλ₯Ό λŒλ¦°λ‹€. 3) 큐의 λ§¨μ•ž λ…Έλ“œλ₯Ό..

[μ•Œκ³ λ¦¬μ¦˜] DFS(Depth First Search, 깊이 μš°μ„  탐색)

DFSλž€? - κ·Έλž˜ν”„ 탐색 μ•Œκ³ λ¦¬μ¦˜ - 갈 수 μžˆλŠ” λκΉŒμ§€ 탐색해 리프 λ…Έλ“œλ₯Ό λ°©λ¬Έν•˜κ³ , 이전 κ°ˆλ¦ΌκΈΈμ—μ„œ μ„ νƒν•˜μ§€ μ•Šμ•˜λ˜ λ…Έλ“œλ₯Ό λ°©λ¬Έν•˜λŠ” 탐색 방법 - μŠ€νƒμœΌλ‘œ κ΅¬ν˜„μ΄ κ°€λŠ₯ν•˜λ‹€. μŠ€νƒ λŒ€μ‹  μž¬κ·€ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•΄μ„œ κ΅¬ν˜„ν•˜λŠ” κ²½μš°λ„ λ§Žλ‹€. μž¬κ·€ν•¨μˆ˜ μ‚¬μš© μ‹œ μ’…λ£Œ 쑰건을 λ°˜λ“œμ‹œ λͺ…μ‹œν•΄μ•Ό ν•œλ‹€. DFS κ΅¬ν˜„ - λ™μž‘ κ³Όμ • 1) 탐색 μ‹œμž‘ λ…Έλ“œλ₯Ό μŠ€νƒμ— μ‚½μž… ν›„ 방문처리 ν•œλ‹€. 2) μŠ€νƒμ˜ μ΅œμƒλ‹¨ λ…Έλ“œμ— λ°©λ¬Έν•˜μ§€ μ•Šμ€ 인접 λ…Έλ“œκ°€ ν•˜λ‚˜λΌλ„ μ‘΄μž¬ν•˜λ©΄ κ·Έ λ…Έλ“œλ₯Ό μŠ€νƒμ— λ„£κ³  방문처리 ν•œλ‹€. λ°©λ¬Έν•˜μ§€ μ•Šμ€ 인접 λ…Έλ“œκ°€ μ—†μœΌλ©΄ μŠ€νƒμ—μ„œ μ΅œμƒλ‹¨ λ…Έλ“œλ₯Ό κΊΌλ‚Έλ‹€. 3) 2번의 과정을 더이상 μˆ˜ν–‰ν•  수 없을 λ•ŒκΉŒμ§€ λ°˜λ³΅ν•œλ‹€. def dfs(graph, start): vist = list() stack = list() stack.a..

[Python] μ •λ ¬ μ•Œκ³ λ¦¬μ¦˜

버블정렬 - μ΄μ›ƒν•œ 두 값을 비ꡐ해 μ •λ ¬ν•˜λŠ” 방법이닀. - λͺ¨λ“  μ›μ†Œλ₯Ό ν•˜λ‚˜ν•˜λ‚˜ λΉ„κ΅ν•˜μ—¬ swapν•˜λŠ” μž‘μ—…μ„ λ°˜λ³΅ν•œλ‹€. - κ΅¬ν˜„μ΄ λ‹¨μˆœν•˜λ‹€. - μ΅œλŒ€ O(n^2)의 μ‹œκ°„λ³΅μž‘λ„λ₯Ό κ°€μ§„λ‹€. # 버블정렬 a = random.sample(range(1, 10), 5) print("=== bubble ===") print(a) # μ •λ ¬ μ „ n = len(a) for i in range(n - 1): for j in range(n - 1 - i): if a[j] > a[j + 1]: a[j], a[j + 1] = a[j + 1], a[j] print(a) μ‚½μž…μ •λ ¬ - ν˜„μž¬ μœ„μΉ˜μ—μ„œ, 이미 μ •λ ¬λœ 이전 λ°°μ—΄λ“€μ˜ 데이터λ₯Ό μ°¨λ‘€λŒ€λ‘œ λΉ„κ΅ν•˜μ—¬ μžμ‹ μ˜ μœ„μΉ˜λ₯Ό μ°Ύμ•„ κ·Έ μœ„μΉ˜μ— μ‚½μž…ν•œλ‹€. - μ΅œμ•…μ˜ 경우 O(n^2), μ΅œμ„ μ˜ ..

[Python] tuple

νŠœν”Œ μ„ μ–Έ - ν•œ 번 μ •ν•΄μ§„ μˆœμ„œλ₯Ό λ°”κΏ€ 수 μ—†λ‹€. - μ„ μ–Έ tuple1 = {1, 2, 3, 4} tuple2 = 1, 2, 3, 4 mylist = [1, 2, 3, 4] tuple3 = tuple(mylist) - νŠœν”Œμ€ κ°’μ˜ λ³€κ²½κ³Ό μ‚­μ œκ°€ λΆˆκ°€λŠ₯ν•˜λ‹€. packing, unpacking - packing : ν•˜λ‚˜μ˜ λ³€μˆ˜μ— μ—¬λŸ¬ 개의 값을 λ„£λŠ” 것 - unpacking : νŒ¨ν‚Ήλœ λ³€μˆ˜μ—μ„œ μ—¬λŸ¬ 개의 값을 κΊΌλ‚΄μ˜€λŠ” 것 c = (3, 4) d, e = c # c의 값을 μ–ΈνŒ¨ν‚Ήν•˜μ—¬ d, e에 값을 λ„£μŒ f = d, e # d, e값을 f에 νŒ¨ν‚Ή - νŠœν”Œμ˜ 두 λ³€μˆ˜ 값을 λ°”κΏ€ λ•Œ μž„μ‹œ λ³€μˆ˜κ°€ ν•„μš”μ—†λ‹€. - ν•¨μˆ˜μ˜ 리턴 κ°’μœΌλ‘œ μ—¬λŸ¬ 값을 전달할 수 μžˆλ‹€. νŠœν”Œμ„ μ΄μš©ν•œ ν•¨μˆ˜μ˜ 리턴값 - νŠœν”Œ 리슀트 list ..

[Python] λ”•μ…”λ„ˆλ¦¬

λ”•μ…”λ„ˆλ¦¬ - μ—¬λŸ¬ 값을 μ €μž₯ν•΄ 두고 ν•„μš”ν•œ 값을 κΊΌλ‚΄ μ“°λŠ” κΈ°λŠ₯ - μ΄λ¦„ν‘œλ₯Ό μ΄μš©ν•΄ 값을 κΊΌλ‚΄ μ‚¬μš© μ΄λ¦„ν‘œμ—λŠ” λ¬Έμžμ—΄κ³Ό μˆ«μžν˜•, νŠœν”Œμ„ μ‚¬μš©, κ°’μœΌλ‘œλŠ” μ–΄λ–€ μžλ£Œν˜•μ΄λ“  κ°€λŠ₯ - λ¦¬μŠ€νŠΈμ™€ λΉ„μŠ·ν•œ 방식 user = { '철수' : 'cheol', '영희' : 'young', '영수' : 'soo' } print(user['철수']) λ”•μ…”λ„ˆλ¦¬ μˆ˜μ • - μΆ”κ°€, μˆ˜μ • dict['three'] = 3 - μ‚­μ œ del(dict['one']) dict.remove('two') - λ”•μ…”λ„ˆλ¦¬λ₯Ό ν•©μΉ˜κΈ° dict1 = {1 : 100, 2 : 200} dict2 = {1 : 1000, 3 : 300} dict1.update(dict2) # {1 : 1000, 2 : 200, 3 : 300} λ”•μ…”λ„ˆλ¦¬μ™€ 반볡문 - κ²½μš°μ— 따라 ..

[Python] 리슀트, enumerate

리슀트 κ΄€λ ¨ λ©”μ†Œλ“œ - list1 = [1, 2, 3]일 λ•Œ appendλ₯Ό μ΄μš©ν•΄ 뒀에 리슀트 μš”μ†Œλ₯Ό μΆ”κ°€ν•  수 μžˆλ‹€. list1.append(4) 뒀에 μƒˆλ‘œμš΄ 리슀트λ₯Ό λ”ν•˜λŠ” 방법은 λ‹€μŒκ³Ό κ°™λ‹€. list2 = list1 + [4] - in 연산을 μ΄μš©ν•΄ λ¦¬μŠ€νŠΈμ— 값이 λ“€μ–΄μžˆλŠ”μ§€ 확인할 수 μžˆλ‹€. n = 12 # λ¦¬μŠ€νŠΈμ— μžˆλŠ”μ§€ 확인할 κ°’ if n in list1: print('{}κ°€ λ¦¬μŠ€νŠΈμ— 쑴재.'.format(n)) - λ¦¬μŠ€νŠΈμ—μ„œ ν•„μš”μ—†λŠ” 값을 μ§€μš°λŠ” 방법 del list[10] # 10번째 κ°’ μ§€μš°κΈ° list1.remove(4) # 4λΌλŠ” 값이 μžˆλŠ” 경우 μ‚­μ œ, μ—¬λŸ¬ 개일 경우 κ°€μž₯ μ•ž ν•˜λ‚˜λ§Œ μ§€μ›Œμ§ enumerate - λ¦¬μŠ€νŠΈκ°€ μžˆλŠ” 경우 μˆœμ„œμ™€ 리슀트 값을 μ „λ‹¬ν•˜λŠ” κΈ°λŠ₯ names = ['κ°€..

[Algorithm] START

μ•Œκ³ λ¦¬μ¦˜μ„ λ‹€μ‹œ μ‹œμž‘ν•˜λ©° ,, μš”μ¦˜ λ§Žμ€ κΈ°μ—…μ—μ„œ μ½”λ”© ν…ŒμŠ€νŠΈλŠ” ν•„μˆ˜κ°€ 된 것 κ°™λ‹€. 이전에 C++둜 μ•Œκ³ λ¦¬μ¦˜μ„ ν–ˆμ—ˆλŠ”λ° 카카였, 넀이버와 같은 기업을 Javaλ₯Ό 많이 μ‚¬μš©ν•œλ‹€. 그에 따라 μ•Œκ³ λ¦¬μ¦˜μ„ Java둜 ν• κΉŒ ν•˜λ‹€κ°€,, μ•Œκ³ λ¦¬μ¦˜μ„ Java둜 ν•˜κΈ°μ—” μ’€ μ–΄λ €μš΄ 감이 μžˆμ„ 것 κ°™λ‹€. κ·Έλž˜μ„œ Python으둜 μ•Œκ³ λ¦¬μ¦˜μ„ ν•˜κΈ°λ‘œ κ²°μ •ν–ˆλ‹€. Python 곡뢀 μ‹œμž‘ λŒ€ν•™κ΅ λ•Œ λΉ„μ „κ³΅μžλ₯Ό λŒ€μƒμœΌλ‘œ νŒŒμ΄μ¬μ„ κ°€λ₯΄μΉœ 적이 μžˆμ—ˆλŠ”λ°, λ„ˆλ¬΄ μ˜€λž˜λΌμ„œ λ‹€ κΉŒλ¨Ήμ€ 것 κ°™λ‹€. λ§Žμ€ 무료 κ°•μ˜κ°€ μžˆμ–΄ 그쀑 ν•˜λ‚˜λ₯Ό 선택해 μš°μ„  기초λ₯Ό κ³΅λΆ€ν•˜κΈ°λ‘œ ν–ˆλ‹€. 2~3일 λ™μ•ˆ 파이썬 곡뢀λ₯Ό ν•˜κ³ , μ•Œκ³ λ¦¬μ¦˜ 문제λ₯Ό ν’€ μ˜ˆμ •μ΄λ‹€. 파이썬 기초λ₯Ό 곡뢀할 μ‚¬μ΄νŠΈ https://programmers.co.kr/learn/courses/2 파이썬 ..