반응형

백준 6

[백준] 1786번, 찾기 - Python

문제 이해문제 자체는 정말 단순하다. 긴 문자열이 쭉 주어지고, pattern이라는 짧은 문자열이 주어졌을 때 긴 문자열 안에서 pattern이 몇 번 반복되는지 찾는 문제이다. 하지만 단순한 문제에 그렇지 않은 설명 길이를 보면 어려운 문제임을 직감할 수 있다. 이 문제가 어려운 이유는 시간 복잡도 때문 일 것이다. 단순히 접근한다면 패턴 길이만큼을 패턴과 같은지 체크하면서 한 칸씩 전진하면 될 것이다. 물론 해결이 가능하지만 문제 설명에 쓰여 있는 것과 같이 시간 복잡도를 만족시킬 수 없다.더 효율적인 코드가 필요하고, 이를 위한 대표적인 문자열 알고리즘으로는 Boyer-Moore, Rabin-Karp, KMP 등이 있다. 그 중에서 이번에는 KMP 알고리즘으로 문제를 해결해보자.  실제 코드def ..

백준/문자열 2024.04.28

[백준] 7569번, 토마토3D - Python

7576번에 있는 2차원 "토마토" 문제를 풀고 나서여서 그런지 쉽게 해결할 수 있었다.차원이 하나 추가되기 때문에 H 방향의 인덱싱만 신경써주면, BFS 알고리즘으로 해결이 가능했다. 문제 이해가로, 세로가 주어진 격자가 H의 높이로 쌓여 있다. 토마토의 위치가 주어지고 "익은" 토마토와 "익지 않은" 토마토로 구분된다. 물론 비어있는 칸도 있을 수 있다는 점을 주의해야한다. 하루가 지나면 "익은" 토마토와 인접한 토마토들이 익는다. 여기서 "인접"은 위, 아래, 앞, 뒤, 오른쪽, 왼쪽 방향의 칸을 의미한다.  이미 익어있는 상태면 0, 모두 익는 것이 불가능하면 -1을 출력한다.  해설bfs 탐색을 해야한다는 점은 인접한 칸을 고려해야할 때부터 알 수 있다. n, m, h가 모두 100 이하이기 때..

[백준] 1197번, 최소 스패닝 트리 - Python

문제 이해제목에서부터 알 수 있듯이 이 문제는 최소 스패닝 트리 (Minimum Spanning Tree)를 찾는 문제이다.  먼저 트리이기 때문에 순환이 없는 그래프의 한 종류이다. 그 중 '최소'라는 것은 간선들의 가중치 합이 최소가 되어야 한다는 의미이다. 몇 가지 예상을 해보자면 우리에게 주어지는 그래프는 연결 그래프 일 것이다. 상식적으로 비연결 그래프에서 MST를 찾으라는 것 자체가 말이 안되기 때문이다.  하지만 그 안에는 순환하는 부분이 존재할 수 있을 것이다(모든 그래프가 트리가 아니기 때문). MST 유형을 몰랐을 때는 BFS, DFS 등의 방향으로 생각하며 도대체 어떻게 풀어야하나 많은 고민을 했던 것 같다. 문제 자체가 MST 기본을 연습하는 문제이기에 알고리즘만 ..

백준/MST 2024.02.06

[알고리즘] 유니온 파인드 - Python

유니온 파인드 알고리즘은 대표적인 그래프 알고리즘이다. 두 노드가 같은 집합에 있는지 확인할 때 유용하게 이용된다. 유니온 파인드의 대표적인 연산에는 두 노드를 합치는 Union 연산, 루트 노드를 찾는 Find 연산이 있다. 추상적으로 생각했을 때는 트리 구조로 생각할 수 있다. 유니온 파인드는 그림으로 이해하는 것이 편리했다. 다른 블로그의 이해하기 쉬운 그림이 보여서 가져왔다.이 예시로 좀 더 구체적으로 살펴보자.   유니온 파인드 알고리즘을 위해서는 먼저 원하는 노드 수 만큼의 리스트를 만들고, 각 노드에 대해 초깃값으로 각각의 노드 번호를 부여한다. 위의 그림을 해석하자면 각각의 노드가 각자 다른 집합에 속하고 있는 상태로 해석할 수 있다.   1. Union 연산   만약 위의 그림과 같이 1..

[백준] 1758번, 알바생 강호 - Python

거스름돈 문제와 앞선 ATM문제를 풀다보니 이 문제를 읽었을 때는 그리디 문제라는 것이 눈에 보였다.  문제 이해강호가 손님을 입장시킬 때 팁을 받는다. 손님들이 생각하고 있는 팁의 금액이 주어진다. 하지만 이 팁을 다 받을 수 있는 것이 아니다. 최종적으로 받는 팁 = 원래 생각하던 팁 - (손님의 입장 등수 - 1) 즉 원래 생각하던 팁은 주어져 있기 때문에 우리가 바꿀 수 있는 것은 "손님의 등수" 라는 것을 쉽게 알 수 있다. 문제의 출력으로 원하는 것은 강호가 받을 수 있는 팁의 최댓값이다. 손님의 등수를 기준으로 매 순간 최선의 선택을 해야한다는 것을 알 수 있다.  해설내가 가장 먼저 떠올렸던 방법은 ATM에서 이용했던 방법이다. 처음부터 공식이 ..

백준/그리디 2024.02.06

[백준] 11399번, ATM - Python

들어가기 앞서학기 중에 전공과목을 병행하느라 포스팅을 거의 하지 못했다. 방학을 맞아 그동안 풀었던 문제들을 복습해보고 새롭게 푸는 문제들을 포스팅 할 계획이다. 저번학기 자료구조를 수강하며 더 많은 알고리즘을 접할 수 있던 것이 좋은 경험이 되었다.  ATM문제는 그리디 알고리즘에서 기초가 되는 문제이다.  그리디 알고리즘이란 이름에서도 알 수 있듯이 탐욕스러운 알고리즘이다. 즉, 지금 당장 우리가 하는 최선의 선택이 전체로 봤을 때도 최선의 선택인 경우 그리디 알고리즘을 이용할 수 있다. 여기서 내가 어렵게 느꼈던 점은 지금 당장의 선택이 이후 결과에 영향을 미치는 상황일 때 최선의 선택이 보장 될 수 있느냐였다. 이것이 그리디 문제가 어려운 이유이고, 앞으로 다양한 문제를 풀어보며 ..

백준/그리디 2024.02.05
728x90