본문 바로가기

분류 전체보기

(191)
(C++ STL) lower_bound, upper_bound lower_bound( begin(), end(), value); upper_bound( begin(), end(), value); lower_bound 란? begin()에서 end()의 범위 중에서 value값 이상이 나타나는 가장 작은 이터레이터를 반환하는 것입니다. value가 존재 하지 않는다면 value보다 큰 값중 가장 작은 값이 나타나는 이터레이터를 반환합니다. algorithm 헤더 안에 존재합니다. [코드] #include #include #include using namespace std; vector v; int main() { v.push_back(10); v.push_back(20); v.push_back(20); v.push_back(30); v.push_back(40); in..
백준 2143_두 배열의 합(C++) www.acmicpc.net/problem/2143 2143번: 두 배열의 합 첫째 줄에 T(-1,000,000,000 ≤ T ≤ 1,000,000,000)가 주어진다. 다음 줄에는 n(1 ≤ n ≤ 1,000)이 주어지고, 그 다음 줄에 n개의 정수로 A[1], …, A[n]이 주어진다. 다음 줄에는 m(1≤m≤1,000)이 주어지고, 그 다 www.acmicpc.net [문제 풀이] 메모제이션을 이용하여 문제를 풀었습니다. 이 문제는 입력된 A, B 배열의 연속 된 부분 배열의 합 중에 두 부분 배열의 합이 T와 같은 부분 배열의 개수를 구하는 문제였습니다. 문제의 로직은 A, B의 모든 합을 저장하여 정렬한 후 합의 경계를 찾아 경우의 수를 찾는 방식으로 구현하였습니다. 코드 설명 A 배열에 값을 ..
백준 1806_부분합(C++) www.acmicpc.net/problem/1806 1806번: 부분합 첫째 줄에 N (10 ≤ N < 100,000)과 S (0 < S ≤ 100,000,000)가 주어진다. 둘째 줄에는 수열이 주어진다. 수열의 각 원소는 공백으로 구분되어져 있으며, 10,000이하의 자연수이다. www.acmicpc.net [문제 풀이] 투 포인터를 이용하여 문제를 풀었습니다. 이 문제는 입력으로 들어온 수열의 부분집합의 합이 S 이상이 되는 것 중, 가장 짧은 수열을 찾는 문제입니다. 전형적인 투 포인터 문제입니다. 코드 설명 투 포인터를 위해 pre_idx와 post_idx를 0으로 초기화 합니다. sum의 값을 배열 첫 번째 값으로 초기화 합니다. 초기화 해준 sum의 값이 S와 같으면 값 1을 출력 합니다. ..
백준 2096_내려가기(C++) www.acmicpc.net/problem/2096 2096번: 내려가기 첫째 줄에 N(1 ≤ N ≤ 100,000)이 주어진다. 다음 N개의 줄에는 숫자가 세 개씩 주어진다. 숫자는 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 중의 하나가 된다. www.acmicpc.net [문제 풀이] dp를 이용하여 문제를 풀었습니다. 이 문제는 N X 3의 맵을 내려가며 최대 합과 최소 합을 구하는 문제였습니다. 최댓값, 최솟값을 구하기 위해 N X 3 dp배열을 선언할 경우 메모리 초과가 나게 됩니다. 따라서 max_dp[3], min_dp[3] 배열을 두어 한 줄씩 내려오며 각각 최댓값, 최솟값들을 저장해주면서 내려오는 식으로 문제를 해결했습니다. [코드] #include #include using n..
백준 1072_게임(C++) www.acmicpc.net/problem/1072 1072번: 게임 각 줄에 X와 Y가 주어진다. X는 1,000,000,000보다 작거나 같은 자연수이고, Y는 0보다 크거나 같고, X보다 작거나 같은 자연수이다. www.acmicpc.net [문제 풀이] 이분 탐색을 이용하여 문제를 풀었습니다. 이 문제는 승률 Z를 변화시킬 수 있는 최소 게임판 수를 구하는 문제였습니다. X의 최대값이 10억이기 때문에 브루트 포스로 문제를 해결하려 할 경우 시간초과가 납니다. 따라서 이분 탐색을 이용하여 문제를 해결했습니다. 이용한 로직 left = 0, right = X 로 초기화합니다. 이분 탐색 중에 나온 mid의 값이 승률을 변화시켰다면 값을 비교해줍니다. 이분 탐색 중에 나온 mid의 값이 승률을 변화시..
백준 2805_나무 자르기(C++) www.acmicpc.net/problem/2805 2805번: 나무 자르기 첫째 줄에 나무의 수 N과 상근이가 집으로 가져가려고 하는 나무의 길이 M이 주어진다. (1 ≤ N ≤ 1,000,000, 1 ≤ M ≤ 2,000,000,000) 둘째 줄에는 나무의 높이가 주어진다. 나무의 높이의 합은 항상 M을 www.acmicpc.net [문제 풀이] 이분 탐색을 이용하여 문제를 풀었습니다. 이 문제는 M 미터의 나무를 구하기 위해 절단기가 가질 수 있는 최고 높이 H를 구하는 문제였습니다. 알고리즘 문제에서 00 자르기라는 문제는 이분탐색을 이용하는 문제가 많습니다. 이 문제 또한 이분 탐색을 이용하는 문제였습니다. 아이디어 최고 높이 H는 0 ~ (나무 최대 높이) 사이에 존재한다. H를 구하기 위해서..
백준 2003_수들의 합 2(C++) www.acmicpc.net/problem/2003 2003번: 수들의 합 2 첫째 줄에 N(1≤N≤10,000), M(1≤M≤300,000,000)이 주어진다. 다음 줄에는 A[1], A[2], …, A[N]이 공백으로 분리되어 주어진다. 각각의 A[x]는 30,000을 넘지 않는 자연수이다. www.acmicpc.net [문제 풀이] 투 포인터를 이용하여 문제를 풀었습니다. 이 문제는 A[i] ~A[j]의 합이 M인 경우의 수를 찾는 문제입니다. 시간제한이 넉넉하여서 투 포인터를 이용하여 찾았습니다. 두 개의 포인터 중 뒤쪽 포인터는 굳이 지정하지 않고 i로 계속 변화를 주었습니다. 앞 쪽 포인터를 고정한 후 i를 늘려가며 합이 M과 같아지면 더해주는 식으로 구현하였습니다. [코드] #include ..
백준 1103_게임(C++) www.acmicpc.net/problem/1103 1103번: 게임 줄에 보드의 세로 크기 N과 가로 크기 M이 주어진다. 이 값은 모두 50보다 작거나 같은 자연수이다. 둘째 줄부터 N개의 줄에 보드의 상태가 주어진다. 쓰여 있는 숫자는 1부터 9까지의 자연수 또는 www.acmicpc.net [문제 풀이] DFS와 DP를 통해 문제를 해결했습니다. 1103번 게임의 문제는 동전이 움직일 수 있는 최대 횟수를 찾는 문제입니다. 언뜻 보면 DFS를 통해 브루트 포스를 이용 하면 될 것처럼 보이지만 그렇게 구현할 경우 메모리 초과가 나게 됩니다. 문제를 자세히 보게 되면 무한번 움직일 경우 -1을 출력하라는 조건이 있습니다. 이 조건은 사이클이 생기는 것을 찾으 라는 조건입니다. 또한, 사이클을 찾는다고..