본문 바로가기

전체 글73

알고리즘 | BFS 활용하여 미로 찾기 문제 풀기 백준 2178번 미로탐색 https://www.acmicpc.net/problem/2178 2178번: 미로 탐색 첫째 줄에 두 정수 N, M(2 ≤ N, M ≤ 100)이 주어진다. 다음 N개의 줄에는 M개의 정수로 미로가 주어진다. 각각의 수들은 붙어서 입력으로 주어진다. www.acmicpc.net n = 4 m = 6 graph = [ [1, 0, 1, 1, 1, 1], [1, 0, 1, 0, 1, 0], [1, 0, 1, 0, 1, 1], [1, 1, 1, 0, 1, 1] ] 0과 1로 이루어진 n * m 크기의 미로 그래프가 있다. 미로에서 1은 이동할 수 있는 칸을 나타내고, 0은 이동할 수 없는 칸을 나타낸다. 이러한 미로가 주어졌을 때, (1, 1)에서 출발하여 (N, M)의 위치로 이동.. 2024. 4. 1.
알고리즘 | BFS 활용하여 특정 도시 거리 계산 문제 풀기 https://www.acmicpc.net/problem/18352 18352번: 특정 거리의 도시 찾기 첫째 줄에 도시의 개수 N, 도로의 개수 M, 거리 정보 K, 출발 도시의 번호 X가 주어진다. (2 ≤ N ≤ 300,000, 1 ≤ M ≤ 1,000,000, 1 ≤ K ≤ 300,000, 1 ≤ X ≤ N) 둘째 줄부터 M개의 줄에 걸쳐서 두 개 www.acmicpc.net 어떤 나라에는 1번부터 N번까지의 도시와 M개의 단방향 도로가 존재한다. 모든 도로의 거리는 1이다. 이 때 특정한 도시 X로부터 출발하여 도달할 수 있는 모든 도시 중에서, 최단 거리가 정확히 K인 모든 도시들의 번호를 출력하는 프로그램을 작성하시오. 또한 출발 도시 X에서 출발 도시 X로 가는 최단 거리는 항상 0이라고 .. 2024. 4. 1.
알고리즘 | queue(FIFO) 속도이슈를 해결할 수 있는 deque from collections import deque 디큐는 속도가 빠른 리스트로 생각해도 좋다. 코딩 테스트에서 파이썬으로 Queue, BFS, FIFO 방식의 알고리즘 접근이 필요할 때 리스트를 디큐로 바꾸어주면 속도 이슈 해결이 가능하다. a_list = [1, 2, 3, 4, 5] # [1, 2, 3, 4, 5] a_dq = deque(a_list) # deque([1, 2, 3, 4, 5]) 이렇게 간단하게 디큐 함수로 바꾸어주기만 하면 된다. a_dq.pop() a_dq.popright() # 5 a_dq.popleft() # 1 a_dq # deque([2, 3, 4]) a_dq.append(1004) # deque([2, 3, 4, 1004]) 디큐 맨 마지막 값을 뺄 때 : .pop() .. 2024. 4. 1.
알고리즘 | 정렬 (선택정렬/삽입정렬/버블정렬) 1. 선택정렬 # 0번째 아이템이 가장 작다고 가정하고 시작한다. # 만약 0번째 아이템보다 더 작은 아이템이 있다면 그중 가장 작은 놈과 0번째 아이템을 swap 한다. arr = [20, 12, 10, 15, 2] for i_step in range(len(arr)): # 현재 이터레이션에서 가장 작은 값의 인덱스가 무엇인지 min_step에 기록한다. # 앞으로 계속 갱신해 나간다. min_step = i_step for i in range(i_step+1, len(arr)): if arr[i] >> [2, 10, 12.. 2024. 4. 1.
알고리즘 | 탐색 기본 - Stack, Queue 스택과 큐 모두 일을 처리하는 순서, 값을 처리하는 순서에 대한 개념. 새롭게 추가되는 값 / 지금 당장 처리해야하는 값을 생각하며 일을 한다. Stack Last In First Out : LIFO 예 / 엘레베이터 : 늦게 온 사람이 제일 먼저 내린다. (문이 하나!) 새로운 것 : 뒤로 쌓는다 -> 리스트 : .append() 처리할 것 : 뒤에서부터 꺼내 쓴다 -> 리스트 : .pop() task = ['eat', 'poop', 'sleep'] task.append('cry') >>> ['eat', 'poop', 'sleep', 'cry'] task.pop() >>> ['eat', 'poop', 'sleep'] 리스트.pop() 은 파괴적 함수로 리스트의 마지막 값을 제거한다. Queue Firs.. 2024. 4. 1.
알고리즘 | 탐색 기본, 인접행렬과 인접리스트 인접행렬 자기 자신 : 0 연결 된 엣지 : 1 (또는 1*weight) 연결 안 된 엣지 : Inf (무한대 값으로 0과 구분) # infinite 값을 선언하기 INF = float('inf') # 행렬 그래프로 나타내기 - 가중치 weight 고려해서 표현 graph = [ [0, 7, 5], [7, 0, INF], [5, INF, 0] ] 도시끼리 연결되었는지 어떻게 확인할까? graph[0][1] >>> 7 (0번과 1번 도시가 연결됨) graph[2][1] >>> inf (2번과 1번 도시가 연결 안 됨) 인접리스트 모든 노드에 연결된 노드에 대한 정보를 차례차례 연결하여 저장 # 연결된 도시만 리스트로 표현 graph = [ [(1, 7), (2, 5)], # --> 0번 도시의 연결 리스트.. 2024. 4. 1.
알고리즘 | 탐색 기본, DFS / BFS 엣지를 따라 모든 노드를 방문하는 것을 그래프 탐색이라고 한다. 대표적으로 DFS(깊이 우선 탐색), BFS(너비 우선 탐색)이 있다. Depth First Search (깊이 우선 탐색) 깊이 우선 탐색은 기본적으로 Stack이다. (Last In First Out) 오른쪽 왼쪽 상관은 없음 예제 graph_list = [ [], # 0번 도시(없음) [2, 3, 8], # 1번 도시 [1, 7], # 2번 도시 [1, 4, 5], # 3번 도시 [3, 5], # 4번 도시 [3, 4], # 5번 도시 [7], # 6번 도시 [2, 6, 8], # 7번 도시 [1, 7] # 8번 도시 ] 1번 도시 방문 To do : [2, 3, 8] 2번 도시 방문 To do : [1, 7] -> 1번은 됐고 7번 .. 2024. 4. 1.
python | 재귀함수 (팩토리얼 예제) 자기 자신을 리턴하는 재귀함수! 현업에서 쓸 일은 거의 없지만, 코딩 테스트에서 자주 등장한다. 파이썬의 재귀함수에는 한계치(limit)가 있으므로 주의해서 사용한다. 기본 형태 def recursive_func(): print('재귀함수 만세!!!!!!💛') return recursive_func() recursive_func() >>> RecursionError : maximum recursion depth exceeded 어쩌구 발생 ^_^... 따라하지 마시오... 기본 예제 - 팩토리얼 함수 만들기 (1) while 반복문 이용하기 def factorial_while(n): i = 1 answer = 1 while i 2024. 4. 1.
python | 소수 판별 함수 작성하기 (prime number) 소수 여부를 판별할 수 있는 함수를 작성해 보자. 참고로 숫자 1은 소수가 아니다! def prime_num_classify(n): if n == 1: return False elif n in [2, 3, 5, 7]: return True elif n % 2 == 0 or n % 3 == 0: return False else: for i in range(3, n // 2): if n % i == 0: return False return True 위 코드는 정상 작동하지만 숫자가 커질수록 비효율성이 커진다. chatGPT는 위 코드를 100점 만점에 50점으로 평가하였으며 이를 개선할 수 있는 90점짜리 최적화 코드를 제공하였다. else 이후 부분을 주목해서 보자. def prime_num_classif.. 2024. 4. 1.
python | 약수(factor) 리스트업 함수 작성하기 + 메모화 (memorization) ver 01 (메모화 x) def factor_extractor(n): if n == 1: return [1] if n == 2: return [1, 2] if n == 3: return [1, 3] factor_list = [1] for num in range(2, n): if n % num == 0: factor_list.append(num) factor_list.append(n) return factor_list 문제점 : 반복되는 계산 개선 방법 : 메모화(Memorization) ver 02 (메모화 o) def factor_extractor(n, memo = {1 : [1], 2 : [1, 2], 3 : [1, 3]}): if n in memo: return memo[n] factor_list.. 2024. 4. 1.
python | 중첩리스트 평탄화 함수 작성하기 flatten function (+ 여러번 중첩되는 경우 : 재귀함수!!) 가끔 코딩 테스트에서 이거.. 리스트를 평탄화해주면 쉽게 풀 수 있겠는데? 라는 생각이 들 때가 있습니다. 프로그래머스 0단계에서는 이 평탄화 함수를 작성하는 것 자체가 문제로 출제되기도 했었던거 같기도 하구요. 어쨌든 알고 있으면(또는 외워 두면) 정말 너무나!!!! 큰 도움이 되는!!!!! 평탄화 함수 작성하는 방법!!! 정리해 봅시다. * 설명 없이 함수만 빠르게 확인하고 싶으시다면 글 맨 아래로 가세요! * 먼저, 중첩 리스트란 무엇일까요? normal_list = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] weird_list = [1, 2, [3], 4, 5, [6], 7, [8, 9, 10]] crazy_list = [1, 2, [[3], 4, 5], [[6], 7, [8, [9.. 2024. 4. 1.
ASAC 빅데이터 & AI 5기 | 1, 2주차 회고 ASAC 빅데이터 분석가 과정 5기 1, 2주 차가 지나고 어느새 4월 1일을 앞두고 있습니다. 3월 26일이 지나면 본 교육과정에 완전 등록이 되어 KDT교육과정을 1회 수료한 것이 되기 때문에, 과정이 맘에 들지 않는다면 그전까지 반드시 드롭을 해야 했는데요. 저는 드롭하지 않고  아삭 5기 동기들과 함께 빅데이터 분석가 교육과정을 끝까지 듣기로 결정했습니다.  이유는 다음과 같습니다.준비된 강의와 세미나가 생각보다 도움이 됩니다. 1, 2주차에 마련된 현직자 및 전 기수 선배들의 특강, 커리어무브 대표의 자기 소개서와 포트폴리오 작성법 강의는 앞으로 6개월간 어떤 전략으로 나를 스토리텔링할 것인지에 대해 생각해 볼 수 있는 좋은 기회가 되었습니다. 파이썬 강의는 파이썬 주요 문법을 리뷰하고 코딩 테.. 2024. 3. 31.