[백준/14890] 경사로 (C++)
2020. 10. 5. 17:36
Programming/백준 문제풀이
문제 해설 나에게 엄청난 좌절을 안겨준 문제이다. 처음 문제를 훑어보았을 때는 1시간이면 풀 수 있을 것이라고 착각했지만, 내 구현 능력이 아직 많이 부족하다는 것을 여실히 보여주었다. 장장 이틀에 걸친 삽질을 통해 풀 수 있었던 문제이다. 앞으로도 열심히 공부해야겠다는 자극을 받았다. 어쨌든, 이 문제는 이해를 바탕으로 구현하는 시뮬레이션 문제이다. 다만, 조건이 조금 까다롭기 때문에 적절한 분기 처리를 해주어야 테스트 케이스를 모두 통과할 수 있다. 나의 경우도 이 조건, 저 조건을 따지다가 시간을 모두 날려먹은 케이스이다. 어쨌든, 내가 풀었던 문제 풀이에 대해서 설명해보겠다. 다음과 같이 3, 2, 2, 1, 1, 1, 1, 2, 2, 3 의 높이를 가진 길과 길이 2의 경사로를 생각해보자. 왼쪽..
[알고리즘] 트라이 (Trie) 자료구조 개념 및 구현 (C++)
2020. 10. 4. 01:24
Programming/알고리즘
트라이 (Trie) 자료구조란? 문자열 검색에 최적화된 트리 형태의 자료구조이다. 상위 문자가 하위 문자들의 부모 노드가 되는 트리 구조를 가지고 있다. 'tree', 'trie', 'trim' 이렇게 3개의 문자열을 포함하는 트라이의 예시를 보자. 그림에서 보는 것과 같이, 't' 밑에 'r' 이 하위 노드로 들어가 있고, 'r' 밑에 'i' 와 'e' 가 하위 노드로 들어가 있는 것을 볼 수 있다. 이와 같은 구조를 가지고 있기 때문에, 길이 m의 특정 문자열이 존재하는지 판단하는 것이 O(m) 시간으로 가능하다. 트라이에 필요한 기능 트리 구조에 익숙한 분들이라면 위의 그림만으로도 구현의 방법이 그려졌을 것이다. 트라이의 구현에서는 다음과 같은 기능이 필요하다. (1) 해당 단어가 존재하는지 판단하..
[백준/2004] 조합 0의 개수
2020. 9. 1. 23:14
Programming/백준 문제풀이
1. 문제 2. 접근 방법 중고등학교때 열심히 배웠던 이항계수와 관련된 문제이다. 다음과 같이 n=5, c=2 의 경우를 가정해보자. 계산된 값은 10 이다. 그러므로 문제에서 요구하는 '뒤에서부터 처음으로 0이 아닌 값이 나올 때까지의 0의 개수' 는 1 이다. 이런 식으로, 문제가 요구하는 값을 찾아야 하는데 문제는 범위가 1 ~ 20억이라 자칫하면 시간 초과 오류가 발생할 수 있다. 일반적인 순차 접근은 어림도 없으니, 이제 효율적인 알고리즘을 알아보자. 문제에서 요구하는, 뒤에 0이 발생하는 경우는, 2와 5가 만나야만 가능하다. 2와 5를 곱하면 10이다. 어떤 수에 10이 곱해지면 뒤에 0이 하나 생기는 것이다. 그러므로, 우리는 다음의 알고리즘을 적용하면 답을 구할 수 있다. (1) 분자를 ..
[알고리즘] 최대공약수 빠르게 찾기 - 유클리드 호제법
2020. 9. 1. 09:58
Programming/알고리즘
유클리드 호제법 (Euclidean Algorithm) 이란? 두 개의 자연수의 최대공약수(GCD) 를 빠르게 찾는 알고리즘이다. 유클리드 호제법이 유명한 또 다른 이유는, 이 방법이 인류 최초의 알고리즘이라고 소개되고 있기 때문이다. 최대공약수를 찾는 알고리즘은 여러가지가 있겠지만, 시간복잡도 면에서 가장 훌륭한 알고리즘이기 때문에 PS 과정에서 필요하다면 적극 활용하는 것을 추천한다. 계산 과정 유클리드 호제법은 매우 단순하다. 자연수 A, B가 있다고 가정하고, 다음과 같은 과정을 반복하기만 하면 된다. (1) A를 B로 모듈러 연산한다. (A % B) (2) 만약 나머지가 0이라면, B가 최대 공약수이다. (3) 만약 나머지가 0이 아니라면, A를 B로 바꾸고, B를 나머지로 바꾼다. 만약 A =..
[알고리즘] 효율적으로 약수를 찾는 알고리즘
2020. 8. 31. 23:20
Programming/알고리즘
코딩테스트 문제 중, 가끔 수학적인 기초를 묻는 문제에 약수, 배수 등의 문제가 출제된다. 이러한 유형의 문제를 접해본 경험이 없는 사람들은 최악의 시간복잡도를 갖는, 모든 경우를 찾는 순차적인 알고리즘으로 문제를 풀게 된다. 그러므로 PS를 준비하는 사람이라면 '모든 약수를 찾는 효율적인 알고리즘' 정도는 익혀두는 것이 좋다. 가장 단순하게 약수를 찾는 알고리즘 가장 단순한, 누구나 쉽게 생각할 수 있는 방법을 고안해보자. 만약 10의 약수를 찾는다고 했을 때, 1~10까지의 수 중에서, 10을 0으로 나누어 떨어지게 하는 수를 찾는 알고리즘을 생각할 수 있을 것이다. 10 % 1 = 0 10 % 2 = 0 10 % 3 = 1 10 % 4 = 2 10 % 5 = 0 10 % 6 = 4 10 % 7 = ..
[백준/2981] 검문 (약수 / 최대공약수)
2020. 8. 31. 21:42
Programming/백준 문제풀이
1. 문제 2. 접근 방법 '어떤 수가 가지고 있는 약수를 빠르게 찾는 알고리즘' 을 모르면 해결이 쉽지 않은 문제이다. 나도 이 알고리즘을 몰랐기 때문에, 처음에는 시간 초과를 겪어 당황스러울 수밖에 없었다. 이 문제를 접근하는 방법은 다음과 같다. (1) N개의 숫자를 대상으로, N - 1 만큼 숫자 간의 차이들을 구한다. (2) 이 N - 1개의 '차이'들 중, 가장 작은 값을 찾는다. (3) 위에서 구한 가장 작은 값을 대상으로, 1을 제외한 모든 약수를 구한다. (4) 위에서 구한 모든 약수 중, 전체 숫자를 나눠봤을 때 0으로 나누어 떨어지는 약수들만 출력한다. 예시를 들어보자. 다음과 같이 9, 23, 58 의 3개의 숫자가 있다고 가정해보겠다. 그렇다면 위와 같이, 3개의 숫자들의 차이는 ..