본문 바로가기

algorithm

(135)
백준 3190_뱀(C++) https://www.acmicpc.net/problem/3190 3190번: 뱀 문제 'Dummy' 라는 도스게임이 있다. 이 게임에는 뱀이 나와서 기어다니는데, 사과를 먹으면 뱀 길이가 늘어난다. 뱀이 이리저리 기어다니다가 벽 또는 자기자신의 몸과 부딪히면 게임이 끝난다. 게임은 NxN 정사각 보드위에서 진행되고, 몇몇 칸에는 사과가 놓여져 있다. 보드의 상하좌우 끝에 벽이 있다. 게임이 시작할때 뱀은 맨위 맨좌측에 위치하고 뱀의 길이는 1 이다. 뱀은 처음에 오른쪽을 향한다. 뱀은 매 초마다 이동을 하는데 다음과 같은 규칙을 따 www.acmicpc.net [문제 풀이] 시뮬레이션을 이용하여 문제를 풀었습니다. 이 문제는 먼저 뱀은 몸길이를 늘려 머리를 다음칸에 위치시킨다. 만약 이동한 칸에 사과가..
백준 2748_피보나치 수 2(C++) https://www.acmicpc.net/problem/2748 2748번: 피보나치 수 2 문제 피보나치 수는 0과 1로 시작한다. 0번째 피보나치 수는 0이고, 1번째 피보나치 수는 1이다. 그 다음 2번째 부터는 바로 앞 두 피보나치 수의 합이 된다. 이를 식으로 써보면 Fn = Fn-1 + Fn-2 (n>=2)가 된다. n=17일때 까지 피보나치 수를 써보면 다음과 같다. 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597 n이 주어졌을 때, n번째 피보나치 수를 www.acmicpc.net [문제 풀이] 단순 반복문을 이용하여 문제를 풀었습니다. N은 (N-1) + (N-2)이므로 반복문을 통해 반복을 해주면서 문제를 ..
백준 7568_덩치(C++) https://www.acmicpc.net/problem/7568 7568번: 덩치 우리는 사람의 덩치를 키와 몸무게, 이 두 개의 값으로 표현하여 그 등수를 매겨보려고 한다. 어떤 사람의 몸무게가 x kg이고 키가 y cm라면 이 사람의 덩치는 (x,y)로 표시된다. 두 사람 A 와 B의 덩치가 각각 (x,y), (p,q)라고 할 때 x>p 그리고 y>q 이라면 우리는 A의 덩치가 B의 덩치보다 "더 크다"고 말한다. 예를 들어 어떤 A, B 두 사람의 덩치가 각각 (56,177), (45,165) 라고 한다면 A의 덩치가 B보다 큰 www.acmicpc.net [문제 풀이] 문제의 해결법은 브루트 포스였던 것 같습니다. 단순 브루트 포스를 이용하여 풀었습니다. 반복문을 이용하여 자신보다 덩치가 큰(몸..
백준 11729_하노이 탑 이동 순서(C++) https://www.acmicpc.net/problem/11729 11729번: 하노이 탑 이동 순서 세 개의 장대가 있고 첫 번째 장대에는 반경이 서로 다른 n개의 원판이 쌓여 있다. 각 원판은 반경이 큰 순서대로 쌓여있다. 이제 수도승들이 다음 규칙에 따라 첫 번째 장대에서 세 번째 장대로 옮기려 한다. 한 번에 한 개의 원판만을 다른 탑으로 옮길 수 있다. 쌓아 놓은 원판은 항상 위의 것이 아래의 것보다 작아야 한다. 이 작업을 수행하는데 필요한 이동 순서를 출력하는 프로그램을 작성하라. 단, 이동 횟수는 최소가 되어야 한다. 아래 그림은 원판이 5 www.acmicpc.net [문제 풀이] 문제의 해결법은 재귀였던 것 같습니다. 하노이 타워를 푸는 일반적인 방법으로 문제를 풀었습니다. N개의 원..
백준 14888_연산자 끼워넣기(C++) https://www.acmicpc.net/problem/14888 14888번: 연산자 끼워넣기 첫째 줄에 수의 개수 N(2 ≤ N ≤ 11)가 주어진다. 둘째 줄에는 A1, A2, ..., AN이 주어진다. (1 ≤ Ai ≤ 100) 셋째 줄에는 합이 N-1인 4개의 정수가 주어지는데, 차례대로 덧셈(+)의 개수, 뺄셈(-)의 개수, 곱셈(×)의 개수, 나눗셈(÷)의 개수이다. www.acmicpc.net [문제 풀이] 문제의 해결법은 브루트포스였던 것 같습니다. 배열 A를 재귀로 도는 방식으로 브루트포스를 구현하였습니다. 이 코드의 핵심은 temp = value + A[idx]; oper[j]--; solution(temp, idx + 1); oper[j]++; 입니다. 이처럼 사칙연산 배열 ope..
백준 13458_시험감독(C++) https://www.acmicpc.net/problem/13458 13458번: 시험 감독 첫째 줄에 시험장의 개수 N(1 ≤ N ≤ 1,000,000)이 주어진다. 둘째 줄에는 각 시험장에 있는 응시자의 수 Ai (1 ≤ Ai ≤ 1,000,000)가 주어진다. 셋째 줄에는 B와 C가 주어진다. (1 ≤ B, C ≤ 1,000,000) www.acmicpc.net [문제 풀이] 문제의 해결법은 단순 수학이었던 것 같다. 수학식(+삼항연산자) ((A[i] - B) % C == 0) ? ((A[i] - B) / C + 1) : ((A[i] - B) / C + 2) 을 이용하여 풀었다. 다만 조금 고생했던 건 결과값이 int형 범위를 넘을 경우가 있으므로 그것을 고려해서 풀어야 된다. [코드] #inclu..
백준 14501_퇴사(C++) https://www.acmicpc.net/problem/14501 14501번: 퇴사 첫째 줄에 백준이가 얻을 수 있는 최대 이익을 출력한다. www.acmicpc.net [문제 풀이] 문제의 해결법은 DFS인 거 같다. DP로 풀려고 하였지만 풀고 보니 메모제이션을 이용하지 않았기 때문에 DFS인 걸로 보인다. 점화식 solution(pos + 1), solution(pos + arr[0][pos]) + arr[1][pos] 을 이용하여 풀었다. 매 단계마다 i번째 날에 일할 것인지 안 할 것인지를 봐주면서 DFS로 파고드는 방법이다. [코드] #include #include using namespace std; #define INF -987654321; int N; int arr[2][15]; in..