본문 바로가기
  • 시 쓰는 개발자

알고리즘/코테 개념, TIP, 메모13

파이썬 내장함수 enumerate enumerate"순서가 있는" 자료형에 대해서, 인덱스와 값을 포함해서 리턴해준다.즉, 인덱스 & 값을 둘 다 사용하고 싶을 때 쓸 수 있다.values = [40, 30, 20, 10, 50]indexed_values = [(value, index) for index, value in enumerate(values)]print(indexed_values)print(indexed_values[1])print(indexed_values[1][1])# 출력[(40, 0), (30, 1), (20, 2), (10, 3), (50, 4)](30, 1)1그러나 인덱스 값을 바꿀 순 없다.... indexed_values[1][1] = 10 이런거 불가능 2024. 8. 3.
필독!!) DP (Dynamic Programming) DP처음 보면 dynamic programming이 무슨 뜻인지 감이 잘 안오는데, 쉽게 말하면 중복되는 과정은 재사용하겠다는 것이다. 큰 문제를 해결하는데 작은 문제들이 사용된다면, 이를 어디다가 저장해놓고 큰 문제를 해결하는데에 이용한다.이 맥락에서 알 수 있듯이, 작은 문제의 결과를 저장해야 하므로 메모리를 추가적으로 사용한다.그러나 생각해보자. 100이라는 문제를 푸는데 단계별로 1, 2, 3, ... , 98, 99가 필요하다고 한다면, 99까지의 결과를 어디다가 저장해두고, 99 → 100 이렇게 한단계만 푸는 게 효과적이지 않겠는가?? 그래서 메모리는 추가적으로 들지만 앞단계를 다 스킵할 수가 있으므로 시간을 많이 단축할 수 있다.Memoization위에서 설명했던, 메모리를 추가로 사용해서.. 2024. 7. 29.
이진탐색 요약 이진탐색이진탐색의 제일 큰 특징은 "정렬된 데이터"에서 탐색하는 것이다(오름차순). 이유는 이진탐색이 search하는 방식에서 드러난다.ex) 1 2 3 4 5에서 4를 찾는다고 할 때, 제일 먼저 리스트의 가운데를 탐색한다. 목표인 4를 가운데값 3과 비교해서 크면 오른쪽, 작으면 왼쪽으로 탐색을 이어간다. 이처럼 값의 크기에 따라 "왼쪽", "오른쪽"과 같이 방향을 가져야하므로 반드시 정렬이 된 상태로 탐색이 진행되어야한다.가운데값을 보고 계속 탐색 범위를 반씩 줄여가므로 시간 복잡도는 O(log N)이 된다.구현재귀, 반복문 2가지 방법으로 구현이 가능하다. 공통점은 무조건 정렬하고 시작해야한다는 것 !!반복문으로 구현data = [4,2,3,7,1,9,6]data.sort()def binary_s.. 2024. 7. 29.
필독!!) 백트래킹 요약 백트래킹(backtracking)이란?해를 찾는 도중 해가 아니어서 막히면, 되돌아가서 다시 해를 찾아가는 기법이다. 모든 경우의 수를 대상으로 진행하지만, 실제로는 제한된 조건으로 경우의 수를 한정짓기 때문에, 이론적인 경우의 수보다는 더 적은 실행을 보인다. 탐색하다가 가능성이 없다면(조건에 맞지 않는다면) 바로 돌아가기 때문에 실제로 시간이 N^M만큼 걸리지는 않는다.구현모든 경우의 수 중에서 맞는 경우를 찾는 방법이므로, 구현은 DFS/BFS 둘 다 가능하다. 그러나 되돌아간다는 점에서 DFS와 유사해 구현도 편하다고 한다.DFS와 차이점그럼 백트래킹과 DFS의 차이점은 무엇일까 ??한줄 요약 : 백트래킹은 모든 경우를 탐색하지 않는데, DFS는 모든 경우를 탐색한다. 1. 백트래킹제한 조건을 보.. 2024. 7. 22.
문제풀이 TIP (Test Case) 문제풀이 전, 확인해야하는 것1. input이 어떻게 들어오는지 확인2. 문제의 요구사항이 뭔지 확인3. 어떤 알고리즘을 사용할지 확인4. 제한시간 체크하기5. 슈도코드로 코드 어떻게 작성할지 흐름 써보기 테스트케이스 확인 팁기본적으로 주어지는 테스트 케이스에 속으면 안됨. 다음과 같은 경우를 고려할 것. 1. 비어있거나, 하나만 있는 case2. 첫번째 혹은 맨 마지막 case3. 크기가 굉장히 큰 case4. 양수만 있는, 음수만 있는 case5. overflow가 나는 case6. 중복 값이 들어가는 case 2024. 7. 22.
필독!!) DFS / BFS 정리 + 인접행렬, 인접리스트 이 포스팅을 함께 보자.https://100won-developer.tistory.com/entry/DFS-BFS-%EC%B0%A8%EC%9D%B4 DFS / BFS 차이두가지 모두 그래프를 탐색하는 방법이다. DFS 가장 깊은 곳까지 탐색을 마치고 돌아와서 탐색하는 방법. 예를들면 미로찾기를 할 때 한 방향으로 쭉 가고, 막다른 길이 나오면 다시 가장 가까운100won-developer.tistory.com BFS, DFS 알고리즘 분석보다는 언제 어떻게 쓰이고, 어떤 개념들이 쓰이는지 적어보았다. DFSDFS는 그래프깊이 우선 탐색법이다. Root 노드에서 시작하여, 최대한 깊이 탐색한 후 다음 branch로 넘어가는 방법을 말한다.def DFS(v): visited1[v] = True # 현재.. 2024. 7. 15.
시간복잡도 요약 시간복잡도란 ?한마디로 알고리즘의 성능이다. 정확히 몇초라는 시간을 의미하는 것이 아니고, 이정도의 입력값과 이런 코드라면 이정도의 시간이 걸릴 것이라는 일종의 예측지표이다. 시간복잡도는 최상, 평균, 최악 3가지 지표가 있지만 보통 코드를 짤 땐 항상 최악의 경우를 상정하고 짜는 것이 일반적이므로 최악의 경우인 Big O notation을 사용한다.왜 시간복잡도를 사용하는가 ?한마디로, 환경에 따라 실행 시간은 다를 수 있기 때문이다. 컴퓨터 HW, 와이파이, 틀어놓은 탭 수 ... 등등 어떤 알고리즘이 실행될 때 사람마다 환경이 모두 다르다. 따라서 이 알고리즘이 나에게는 효과적인데 팀원에게는 안좋을 수 있다. 따라서 더 일반적인 설명을 위해서 시간복잡도를 사용할 수 있고, 이는 환경에 상관없이 알고.. 2024. 7. 15.
deque 문제를 풀다가 deque라는 것을 봤는데 스택과 큐의 기능을 한번에 한다고 하니 매우 유용할 것 같다 ! 한번 알아보자 .. deque데크 디큐 덱 뎈.... 그냥 덱 이라고 부르겠다. 덱은 출입구가 양쪽에 있어서 스택과 큐의 기능을 동시에 가진다. 덱은 다음과 같이 선언하거나, 변환한다. 코드를 보면 알 수 있듯, 기존에 선언된 리스트를 덱으로 변환하는 것도 가능하다. from collections import dequetruck = [7, 4, 5, 6]truck = deque(truck) # 덱으로 변환onthebridge = deque([0] * bridge_length) # 덱으로 초기화장점덱은 리스트보다 속도가 빠르다. pop(0)을 할 때 리스트는 O(N)인데, 덱은 앞뒤 모두 접근하기에 O.. 2024. 7. 10.
Stack, Queue 요약 Stack 스택스택은 Last In First Out 구조를 가진 자료구조이다.파이썬에선 별도로 구현할 필요 없이 리스트를 사용하면 된다.push : appendpop : pop()stack = [] # 스택 선언stack.append(1) # pushstack.pop() # popQueue 큐큐는 스택과는 달리 First In First Out 구조를 가진다.파이썬에선 Queue를 2가지 방법으로 사용한다.1. list를 활용할 수 있다. 스택과 마찬가지로 추가는 append로, 다만 삭제는 del이나 pop()을 사용할 수 있다. 2. Queue 라이브러리를 사용할 수 있다. 이땐 추가와 삭제가 조금 다르다.Queue 라이브러리 추가 : put()Queue 라이브러리 삭제 : get() → 이때 삭제.. 2024. 7. 8.