본문 바로가기

728x90

취업을 준비하며 정리하는 컴퓨터 지식

(55)
[ProblemSolving] 백준 9095, 2156, 1912 파이썬 문제풀이 다이나믹 프로그래밍은 큰 문제를 작은 문제로 나눠서 생각해야 하는 만큼 각 항목들의 연관성과 규칙을 생각하며 문제를 해결해야 합니다. 다이나믹 프로그래밍 문제를 풀면서 정리해두면 좋을 것 같은 9095, 2156, 1912번 총 3문제의 규칙과 코드를 정리해보겠습니다. 각각의 문제 설명은 연결된 하이퍼링크를 통해 확인하시면 됩니다. 백준 9095번: 1,2,3, 더하기 (다이나믹 프로그래밍) 9095번: 1, 2, 3 더하기 각 테스트 케이스마다, n을 1, 2, 3의 합으로 나타내는 방법의 수를 출력한다. www.acmicpc.net 다이나믹 프로그래밍은 주어진 숫자 n을 1,2,3으로 표현하는 방법을 찾는 것이 아니라 각 항복들이 어떠한 연결성을 보고 있는지를 찾아야 한다. 따라서 dp[3]까지를 손..
[Algorithm] 다익스트라 알고리즘 (2) 다익스트라 알고리즘의 구현에 대해서 다뤄보겠다. 앞서 다익스트라 알고리즘 (1)에서 설명했듯이 다익스트라 알고리즘 구현은 2가지 방법으로 가능하다. 간단한 구현, 높은 시간 복잡도를 가지고 있는 방법 우선순위 큐를 사용한 빠른 시간복잡도를 가지고 있는 방법 우선 간단한 구현, 높은 시간복잡도를 가지고 있는 방법의 코드이다. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 import sys input = sys.stdin.readline INF = int(1e9) n, m = map(int, input().split()) start = int(i..
[Algorithm] 다익스트라 알고리즘 (1) 다익스트라 알고리즘은 특정한 노드에서 다른 모든 노드의 최단거리를 구하는 알고리즘이다. 간선의 방향은 상관없지만 간선의 가중치가 음수이면 해당 알고리즘은 사용할 수 없다. 이러한 점 때문에 내비게이션, GPS 등에 많이 이용되는 알고리즘이다. 다익스트라 알고리즘은 2가지 방법으로 구현이 가능한데 1번째 방법은 O(V^2)의 시간복잡도를 가지고, 나머지 하나는 우선순위 큐를 이용하여 O(ElogV)의 시간 복잡도를 가지게 된다. 다익스트라 알고리즘의 순서는 다음과 같다. 출발 노드를 지정한다. 최단 거리 테이블의 값을 무한으로 설정한다. 방문하지 않은 노드 중에 최단 거리 테이블에서 가장 작은 값을 가진 노드를 선택한다. 해당 노드에서 다른 노드의 거리를 계산하여 최단 거리 테이블의 값을 갱신한다. 위의 ..
[Algorithm] 다이나믹 프로그래밍이 뭐야? 다이나믹 프로그래밍은 중복되는 연산을 줄이기 위해 메모리 공간을 더 사용하여 연산 속도를 높이는 프로그래밍 기법으로 탑다운과 바텀업 방식이 있다. 한번 연산한 값을 기억해 두었다가 재활용하는 것과 같다. 우선 다이나믹 프로그래밍에는 조건이 따른다. 문제가 여러개의 작은 문제로 나눠질 수 있어야 한다. 문제의 정답을 작은 문제의 정답에서부터 구할 수 있다. 다음은 탑다운 방식과 바텀업 방식 설명이다. 탑다운 방식: 큰 문제를 해결하기 위해 작은 문제를 호출하여 해결 바텀업 방식: 작은 문제부터 답을 도출하여 문제를 해결 피보나치수열을 예시로 다이나믹 프로그래밍을 설명하겠다. 다음은 재귀 함수를 이용하여 구현한 피보나치 수열이다. 1 2 3 4 5 6 # 재귀함수를 이용한 피보나치 수열 def fibo(x)..
[Algorithm] 탐욕법은 뭐야? 탐욕이란 지나치게 탐하는 욕심이라는 뜻이다. 여기서 알 수 있듯이 탐욕법은 주어진 상황에서 최선의 방법을 고르는 알고리즘을 말한다. 탐욕법은 앞서 소개했던 정렬 알고리즘, 탐색 알고리즘 등과는 다르게 사전에 외우고 있지 않아도 풀 수 있는 가능성이 많은 코딩 테스트 문제 유형이지만 그만큼 사전 지식보다는 수험생의 창의력, 논리력, 판단력, 관찰력 등 여러 가지 능력을 요구하는 문제 유형이다. "백준 2847번 게임을 만든 동준이" 라는 문제를 예로 탐욕법을 설명하겠다. 문제 확인 해당 문제에서는 더하기는 불가능하고 빼기는 가능하다. 따라서 "가장 뒤에 있는 수는 변하지 않는다."라는 생각을 할 수 있다. 그러므로 문제 해결을 위해서는 주어진 배열의 앞에서부터 값을 바꾸는 것이 아니라 뒤에 있는 숫자를 기..
[Algorithm] 이진 탐색은 뭐야? 이진 탐색(Binary Search)란 탐색 범위를 1/2로 줄여가면서 정보를 탐색하는 알고리즘 방법이다. 범위를 1/2씩 줄이면서 탐색을 진행하기 때문에 탐색 속도가 빠르다는 장점이 있지만 정렬되지 않은 배열에서는 사용할 수 없다는 장점이 있다. 이진 탐색은 "오름차순 배열에서 가운데 값이 목푯값보다 작다면 가운데 기준 왼쪽 배열은 무조건 목푯값보다 작다. "라는 결론처럼 비교를 통해서 논리적 결론을 도출하는 방식이다. 다음은 이진 탐색에 사용되는 배열을 시각화한 자료이다. 위의 배열에서 목표값을 8이라고 가정하고 이진 탐색을 진행하겠다. 진한 회색은 탐색을 마친 값, 파란색은 중간값, 노란색은 목푯값, 초록색은 탐색 완료 값이라고 하겠다. 가운데 값(5)이 목표값(8)보다 작기 때문에 가운데 값 왼쪽..
[Algorithm] 순차 탐색은 뭐야? 순차 탐색(Sequential Search)이란 배열에서 특정한 값을 찾기 위하서 배열의 첫 번째 항부터 마지막 항까지 하나씩 차례대로 확인해보는 방법을 말한다. 검색할 배열의 길이가 길면 비효율적이라는 단점이 있지만 검색 방법 중에서 간단하게 구현 가능하고, 정렬되지 않은 배열에도 사용할 수 있다는 장점을 가지고 있다. 다음은 순차 탐색에 사용될 배열을 시각화한 자료이다. 위의 배열에서 목표값을 5라고 가정한 후에 순차 탐색을 진행한다면 다음의 과정을 걸친다. 7과 목표값 5 비교 같지 않기 때문에 다음으로 넘어간다. 6과 목표값 5 비교 같지 않기 때문에 다음으로 넘어간다. 8과 목표값 5 비교 같지 않기 때문에 다음으로 넘어간다. 5와 목표값 5 비교 같기 때문에 해당 위치 값 출력 후 탐색 종료...
[Algorithm] 병합 정렬은 뭐야? 병합 정렬은 최악의 경우에도 O(NlogN)의 시간 복잡도를 보장하는 알고리즘으로 퀵 정렬보다 같거나 빠른 속도를 보여준다. 병합 정렬은 배열의 길이가 0 또는 1이 될 때까지 절반으로 나눈다. 나누어진 부분들을 병합하면서 각각의 배열에서 값을 하나씩 확인하면서 정렬을 한다. 해당 과정을 반복해서 정렬이 완료한다. 다음은 병합 정렬의 과정을 그림으로 나타낸 것이다. 1부터 8까지의 숫자를 무작위로 배치시킨 배열이다. 더 이상 나눠지지 않을 때까지 배열을 반으로 나눈다. 나눠진 배열을 정렬을 하면서 합친다. 위의 과정이 병합 정렬의 과정이다. 생각은 간단하다. 하지만 그렇기 때문에 코드는 간단하지 않다. 다음은 병합 정렬을 코드로 구현한 것이다. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 ..

728x90