본문 바로가기

분류 전체보기13

[BOJ] 3176번: 도로 네트워크 (C++) Problem 3176번: 도로 네트워크 첫째 줄에 N이 주어진다. (2 ≤ N ≤ 100,000) 다음 N-1개 줄에는 도로를 나타내는 세 정수 A, B, C가 주어진다. A와 B사이에 길이가 C인 도로가 있다는 뜻이다. 도로의 길이는 1,000,000보다 작거나 같은 양 www.acmicpc.net 부끄럽지만 문제를 이해하는데 시간이 조금 걸렸다. 필자처럼 문제를 이해하는데 헤매는 사람이 있을 수도 있으니 문제에 대해 정리해보겠다. 예제 입력 1을 시각화하면 다음과 같다. 이때 도시 1과 도시 2를 연결하는 경로는 2-3-1로 길이가 100인 도로와 길이가 50인 도로로 이루어져 있다. 따라서 도시 1과 도시 2를 연결하는 경로에서 가장 짧은 도로의 길이는 50, 가장 긴 도로의 길이는 100이다. .. 2021. 12. 18.
[BOJ] 5052번: 전화번호 목록 (C++) Problem Solution 접두사를 통해 해결할 수 있는 문제이므로 트라이를 이용한다. 트라이를 통해 일관성 없는 전화번호 목록을 어떻게 찾을 수 있을까? 트라이에서 두 문자열이 같은 접두사를 공유하고 있으면 같은 노드를 공유하고 있다. 예를 들어 두 문자열 913, 9134가 트라이에 입력되었을 때, 두 문자열은 9, 91, 913 노드를 공유하고 있다. 이때 공유하는 노드 중에 문자열의 끝을 나타내는 노드가 있으면 일관성이 없는 전화번호 목록이라고 볼 수 있다. 이 예제에서는 913 노드가 문자열의 끝을 나타내는 노드이므로 913, 9134는 일관성이 없는 전화번호 목록이다. 1. 모든 전화번호를 트라이에 넣는다. 2. 각각의 전화번호를 트라이에서 탐색하면서 일관성 여부를 확인한다. 3. 마지막 .. 2021. 12. 16.
[BOJ] 1701번: Cubeditor(C++) Problem Solution 1. 문자열의 길이를 N, 지금까지 나온 부분문자열 중 가장 긴 문자열의 길이를 M이라고 하자. 2. 문자열의 인덱스 i에서 시작하는 길이가 (M+1)인 문자열을 패턴, 인덱스 (i+1)부터 (N-1)인 문자열을 텍스트로 설정하여 KMP search를 진행한다. 3. 텍스트에서 매칭되는 문자열을 찾으면 패턴을 인덱스 i에서 시작하는 길이가 (M+2)인 문자열로 두고 진행한다. 4. 찾지 못한다면 인덱스를 1 증가시켜 패턴이 매칭되는지 확인한다 문자열 : abcab 인덱스 = 0, M = 0 텍스트 = bcab 패턴 = a 매칭 결과 : O 인덱스 = 0, M = 1 텍스트 = bcab 패턴 = ab 매칭 결과 : O 인덱스 = 0, M = 2 텍스트 = bcab 패턴 = a.. 2021. 12. 14.
[BOJ] 9935번: 문자열 폭발(C++) Problem Solution ❌ erase함수의 시간 복잡도는 O(N)이므로 erase함수를 사용하면 문제를 시간 내에 해결할 수 없다 1. 루프 문을 통해 문자열을 탐색하며 스택에 문자를 push 한다. 2. 만약 탐색한 문자가 폭발 문자열의 마지막 문자와 같으면 폭발 문자열의 길이만큼 스택에서 pop을 하여 폭발 문자열과 같은지 비교한다. 3. 스택에서 꺼낸 문자열과 폭발 문자열이 다르다면 꺼낸 문자들을 다시 스택에 넣는다. 4. 루프를 마치고 스택에 남아있는 문자열이 정답!! #include #include #include #include using namespace std; int main() { ios_base :: sync_with_stdio(false); cin.tie(NULL); cout.. 2021. 12. 12.