본문 바로가기

algorithm/BOJ

(63)
백준 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을 출력하라는 조건이 있습니다. 이 조건은 사이클이 생기는 것을 찾으 라는 조건입니다. 또한, 사이클을 찾는다고..
백준 1039_교환(C++) www.acmicpc.net/problem/1039 1039번: 교환 첫째 줄에 정수 N과 K가 주어진다. N은 1,000,000보다 작거나 같은 자연수이고, K는 10보다 작거나 같은 자연수이다. www.acmicpc.net [문제 풀이] 브루트 포스를 통해 문제를 해결했습니다. K 번의 자리 교환을 했을 때 가장 큰 숫자를 찾는 문제였습니다. 먼저 예외 처리를 위해 주어진 숫자 N의 문자열 길이가 1이거나 2이면서 두 번째 자릿가 0인 경우 -1을 반환하게 해주었습니다. 다음은 Queue에 주어진 N을 저장 후 모든 자리를 교환하면서 이미 본 숫자는 set에 저장해 걸러주었습니다. set에 들어있지 않은 숫자의 경우 set에 저장해주었습니다. set에 들어 있지 않은 숫자 중 K 번의 연산을 진행한 ..
백준 1339_단어 수학(C++) www.acmicpc.net/problem/1339 1339번: 단어 수학 첫째 줄에 단어의 개수 N(1 ≤ N ≤ 10)이 주어진다. 둘째 줄부터 N개의 줄에 단어가 한 줄에 하나씩 주어진다. 단어는 알파벳 대문자로만 이루어져있다. 모든 단어에 포함되어 있는 알파벳은 최대 www.acmicpc.net [문제 풀이] 수학을 통해 문제를 해결했습니다. 이 문제는 단순 수학을 통해 문제를 해결하였습니다. 입력으로 들어온 문자열 중 가장 높은 자리를 많이 가진 알파벳을 골라 차례대로 높은 숫자를 부여하면 되는 문제였습니다. 예를 들어, 아래와 같이 입력이 들어왔을 때 2 GCF ACDEB A = 10000, B = 1, C = 1010, D = 100, E = 10, F = 1, G = 100으로 계산하여 내..
백준 1062_가르침(C++) www.acmicpc.net/problem/1062 1062번: 가르침 첫째 줄에 단어의 개수 N과 K가 주어진다. N은 50보다 작거나 같은 자연수이고, K는 26보다 작거나 같은 자연수 또는 0이다. 둘째 줄부터 N개의 줄에 남극 언어의 단어가 주어진다. 단어는 영어 소문 www.acmicpc.net [문제 풀이] 조합을 통해 문제를 해결했습니다. 이 문제는 조합을 통해 어떠한 알파벳들을 K개 만큼 가르쳤을 때 최대의 문장을 익힐 수 있을까에 대한 문제였습니다. 남극의 문장은 "anta"로 시작하여 "tica"로 끝나기 때문에 "a n t i c"을 기본적으로 가르치지 못하면 문장을 읽을 수 없습니다. 따라서 K가 5미만이면 값을 0을 출력해주도록 하였습니다. K가 5이상인 경우는 다섯 개의 문자를 ..