[백준/14890] 경사로 (C++)
2020. 10. 5. 17:36
Programming/백준 문제풀이
문제 해설 나에게 엄청난 좌절을 안겨준 문제이다. 처음 문제를 훑어보았을 때는 1시간이면 풀 수 있을 것이라고 착각했지만, 내 구현 능력이 아직 많이 부족하다는 것을 여실히 보여주었다. 장장 이틀에 걸친 삽질을 통해 풀 수 있었던 문제이다. 앞으로도 열심히 공부해야겠다는 자극을 받았다. 어쨌든, 이 문제는 이해를 바탕으로 구현하는 시뮬레이션 문제이다. 다만, 조건이 조금 까다롭기 때문에 적절한 분기 처리를 해주어야 테스트 케이스를 모두 통과할 수 있다. 나의 경우도 이 조건, 저 조건을 따지다가 시간을 모두 날려먹은 케이스이다. 어쨌든, 내가 풀었던 문제 풀이에 대해서 설명해보겠다. 다음과 같이 3, 2, 2, 1, 1, 1, 1, 2, 2, 3 의 높이를 가진 길과 길이 2의 경사로를 생각해보자. 왼쪽..
[백준/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) 분자를 ..
[백준/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개의 숫자들의 차이는 ..
[백준 / 12015] 가장 긴 증가하는 부분 수열 2 (LIS) (이분 탐색)
2020. 8. 28. 22:53
카테고리 없음
1. 문제 2. 접근 방법 https://kbw1101.tistory.com/27 [백준/10816] 숫자 카드 2 (이분 탐색) 1. 문제 2. 접근 방법 이분 탐색 알고리즘으로 접근하되, 찾고자 하는 숫자가 시작하는 지점, 끝나는 지점을 찾아야 한다. 즉, 변형된 이분 탐색 알고리즘이라고 생각하면 된다. 찾고자 하는 숫자 kbw1101.tistory.com 위의 문제와 비슷하게, 이분 탐색을 응용한 알고리즘인 Lower Bound를 이용하여 푸는 문제이다. 여기에서 Lower Bound 의 의미는 다음과 같다. "찾고자 하는 수 이상의 값이 처음으로 등장하는 위치" 그렇다면 문제를 푸는 소개하겠다. 우선 LIS을 담을 배열을 만들고, 가장 첫 번째 원소의 값은 입력 배열의 첫 번째 원소와 동일하게 설..
[백준/2110] 공유기 설치 (이분 탐색)
2020. 8. 25. 21:31
Programming/백준 문제풀이
1. 문제 2. 접근 방법 이분 탐색의 종류인 Parametric Search 를 이용한 문제이다. 이 문제는 다음과 같은 과정으로 접근해야 한다. (1) 공유기 사이의 최소 거리가 될 수 있는 값은, 1 이다. (2) 공유기 사이의 최대 거리가 될 수 있는 값은, (마지막 공유기의 위치 - 첫 번째 공유기의 위치) 이다. (3) 중간값은 (1)과 (2)에서 구한 값의 중간값이다. (4) 중간값이 가능한 값인지 검사한다. (5) 만약, 중간값이 가능한 값이라면 → 범위를 큰 쪽으로 줄인다. (6) 만약, 중간값이 불가능한 값이라면 → 범위를 작은 쪽으로 줄인다. 여기에서 중간값이 가능한 값인지는 다음과 같이 구할 수 있다. 전체 공유기를 대상으로, 자신의 공유기의 위치에서 이전에 놓았던 공유기의 위치를 ..
[백준/10816] 숫자 카드 2 (이분 탐색)
2020. 8. 20. 23:22
Programming/백준 문제풀이
1. 문제 2. 접근 방법 이분 탐색 알고리즘으로 접근하되, 찾고자 하는 숫자가 시작하는 지점, 끝나는 지점을 찾아야 한다. 즉, 변형된 이분 탐색 알고리즘이라고 생각하면 된다. 찾고자 하는 숫자 이상의 값이 처음으로 시작하는 지점은 Lower Bound 라 하고, 찾고자 하는 숫자 초과의 값이 처음으로 시작하는 지점은 Upper Bound 라고 한다. 우리의 목표는 Lower Bound와 Upper Bound를 구하고, 두 지점의 차이만큼을 구해 가지고 있는 카드의 숫자를 구하는 것이다. 입력이 6, 3, 2, 10, 10, 10, -10, -10, 7, 3 이라고 했을 때, 우선 이분 탐색을 위해 정렬시킨다. 그럼 -10, -10, 2, 3, 3, 6, 7, 10, 10, 10 과 같이 정렬된다. 여..