전체 글 429

음료수 얼려 먹기

1. 문제 설명 0이 붙어 있는거 끼리 모여 하나의 덩어리를 이룬다. 여기서는 총 3개의 덩어리가 만들어진다. 2. 문제 조건 4(N), 5(M) 즉, 4 * 5 형태의 얼음판이 있다. 3. 문제 해결 아이디어 3*3이라고 가정할 때 서로 인접한 노드, 그래프 형식으로 만들 수 있다. 왼쪽상단을 시작점으로 잡으면 1을 만날때 동안 DFS or BFS로 접근한다. DFS를 활용하여 특정한 지점의 주변 상, 하, 좌, 우를 살펴본 뒤에 주변 지점 중에서 값이 '0'이면서 아직 방문하지 않은 지점이 있다면 해당 지점을 방문 방문한 지점에서 다시 상, 하, 좌, 우를 살펴보면서 방문을 진행하는 과정을 반복하면, 연결된 모든 지점을 방문가능 모든 노드에 대하여 1~2번의 과정을 반복하여 결국 방문하지 않은 지점의..

BFS (Breadth-First Search)

BFS는 너비 우선 탐색이라고도 부르며, 그래프에서 가까운 노드부터 우선적으로 탐색하는 알고리즘이다. BFS는 큐 자료구조를 이용한다. 탐색 시작 노드를 큐에 삽입하고 방문 처리를 한다. 큐에서 노드를 꺼낸 뒤에 해당 노드의 인접 노드 중에서 방문하지 않은 노드를 모두 큐에 삽입하고 방문처리한다. 더 이상 2번의 과정을 수행할 수 없을 때까지 반복한다. 1. BFS 동작예시 시작지점은 1이며 인접한게 여러개이면 번호가 낮은 노드를 가도록 해보자. 큐에서 1을 꺼내서 인접한 노드 '2', '3', '8'을 큐에 삽입하고 방문처리를 해준다. 그다음 인접한 '2'로 가서 큐에서 2를 꺼내고 2와 인접한 '7'를 방문처리한다. 마찬가지로 큐에서 3을꺼내고 인접한 4와 5노드를 방문처리를 한다. 그 다음 큐에서 ..

DFS (Depth-First Search)

DFS는 깊이 우선 탐색이라고도 부르며 그래프에서 깊은 부분을 우선적으로 탐색하는 알고리즘 DFS는 스택 자료구조(혹은 재귀 함수)를 이용한다. 탐색 시작 노드를 스택에 삽입하고 방문 처리한다. 스택의 최상단 노드에 방문하지 않은 인접한 노드가 하나라도 있으면 그 노드를 스택에 넣고 방문 처리한다. 방문하지 않은 인접 노드가 없으면 스택에서 최상단 노드를 꺼낸다. 더 이상 2번의 과정을 수행할 수 없을 때까지 반복한다. 1. DFS 동작 예시 1번기준으로 인접한 노드로 방문을 해야하는데 (2,3,8)이 있다. 이경우 번호가 낮은 (2)를 먼저 방문할 것이다. 우선 시작노드가 1이므로 1을 방문처리하고 스택에 1을 삽입한다. 여러 개가 인접해있지만 가장 낮은 수부터 방문하기로 했으므로 2에 방문한다. 이에..

재귀 함수 (Recursive Function)

자기 자신을 다시 호출하는 함수 def recursive(): print("재귀함수") recursive() recursive() 단 파이썬의 경우 메모리 제한이 있어서 아무제약조건 없이 재귀함수를 무한으로 돌릴수는 없다. 재귀 함수의 종료 조건을 반드시 명시해야 한다. 종료 조건을 명시하지 않으면 무한히 호출할 수 있다. def recursive(i): if i == 100: return print("재귀함수") recursive(i+1) recursive(1) return 처럼 종료 조건 명시를 해야한다. 1. 팩토리얼 1.1 반복문으로 팩토리얼 구현 def factorial(n): result = 1 for i in range(1, n+1): ..

DFS/BFS 이론 (큐&스택)

그래프 탐색 알고리즘 (DFS/BFS) 탐색이란 많은 양의 데이터 중에서 원하는 데이터를 찾는 과정 대표적인 그래프 탐색 알고리즘은 DFS/BFS 코딩 테스트에서 자주 등장하는 유형 먼저 2가지 큐랑 스택의 기본 구조를 알고 있어야한다. stack = [] #삽입(5) - 삽입(2) - 삽입(3) - 삽입(7) - 삭제() - 삽입(1) - 삽입(4) - 삭제() stack.append(5) stack.append(2) stack.append(3) stack.append(7) stack.pop() stack.append(1) stack.append(4) stack.pop() print(stack[::-1]) print(stack) #실행 결과 [1, 3, 2, 5] [5, 2, 3, 1] 파이썬에서는 표..

특정 문자열을 포함한 시각구하기

1. 문제 설명 2. 문제 조건 3. 문제 해결 아이디어 모든 시각의 경우를 하나씩 세야한다. 하루는 86,400초이므로 모든 경우의 수는 86,400가지이다. 1씩 시각을 증가시키면서 3이 하나라도 포함되어 있었는지를 확인한다. 4. 표준 답안 H = int(input()) count = 0 for hour in range(H+1): for minute in range(60): for seconds in range(60): if '3' in str(hour) + str(minute) + str(seconds): count += 1 print(count) 시, 분, 초를 문자열로 만들어서 붙이게 되면 연산이 안되고 하나의 문자열이 된다. 거기서 3이 포함되어있는지 확인하는 방식으로 접근했다.

상하좌우 여행가

1. 문제 설명 2. 문제 조건 3. 문제 해결 아이디어 요구사항대로 충실히 구현 시물레이션 유형으로 구현이 중요한 문제 4. 풀이 N = int(input()) position = list(map(str,input().split())) #현재 서 있는 위치 x, y = 1, 1 #동, 북, 서, 남 dx = [0, -1, 0 ,1] dy = [1, 0, -1, 0] for i in position: if((i == 'L') & (y-1 > 0)):#왼쪽으로 이동 x += dx[2] y += dy[2] if((i == 'R') & (y+1 0)):#위로 이동 x += dx[1] y += dy[1] if((i == 'D') & (x+1 n or ny > n: continue x, y = nx, ny pri..

구현 이론

구현(Implementation)이란 머릿속에 있는 알고리즘을 소스코드로 바꾸는 과정. 구현 유형의 예시는? 알고리즘은 간단한데 코드가 지나칠 만큼 길어지는 문제 실수 연산을 다루고, 특정 소수점자리까지 출력해야 하는 문제 (Iterator) 문자열을 특정한 기준에 따라서 끊어 처리해야 하는 문제 적절한 라이브러리를 찾아서 사용해야 하는 문제 1. 일반적으로 알고리즘 문제에서의 2차원 공간은 행렬(Matrix)의 의미로 사용된다. 행렬이란 2차원 배열에 표현하는 것 (파이썬은 리스트) 2. 시물레이션 및 완전 탐색 문제에서는 2차원 공간에서의 방향 벡터가 자주 활용된다. 특정위치에서 시작해서 좌/우/상/하로 움직여 문제를 해결하는 것이 많다. dx[0], dy[0]은 x좌표는 그대로 y좌표만 1증가시키므..