본문 바로가기

분류 전체보기

(84)
백준 1992 쿼드트리 www.acmicpc.net/problem/1992 1992번: 쿼드트리 첫째 줄에는 영상의 크기를 나타내는 숫자 N 이 주어진다. N 은 언제나 2의 제곱수로 주어지며, 1≤N ≤64의 범위를 가진다. 두 번째 줄부터는 길이 N 의 문자열이 N 개 들어온다. 각 문자열은 0 또는 www.acmicpc.net 분할 정복의 기초라고 볼 수 있는 문제다. 분할 정복이란 어떤 일정한 규칙 또는 반복된 연산이 적용되는 정점 또는 상황 들을 여러 개로 나누어(분할) 빠르게 처리하고 다시 합쳐주는 (정복) 풀이 방식이라고 할 수 있다. 여기서 중요한 부분은 바로 '합치기가 가능한가?'이다. 이전 포스팅(행렬 곱셈 순서)에서도 보았듯이, 나누고 합치기를 할 때 적용되는 어떠한 규칙 등이 있어야 한다. 이 문제에서는 ..
백준 1740 거듭제곱 www.acmicpc.net/problem/1740 1740번: 거듭제곱 3의 제곱수를 생각하자. 3의 0제곱, 3의 1제곱, 3의 2제곱, ... 은 순서대로 1, 3, 9, 27, ... 이 된다. 이를 바탕으로, 한 개 이상의 서로 다른 3의 제곱수의 합으로 표현되는 수를 생각할 수 있다. 예를 �� www.acmicpc.net 이 문제는 solved.ac기준 브론즈 1로 매겨져 있지만, 얼핏 보면 상당히 어려울 수도 있다. 아니 솔직히 아직도 이게 왜 브론즈 1인지 조금 의문이다. 필자도 처음에는 이걸 어떻게 풀지?라는 어려움이 있었다. 알고 보면 간단하고 코드도 짧다. 하지만 모르면 어렵다. 위의 그림에서 보듯이 문제에서 N이 주어졌을 때, 그 N을 이진수로 표현하면 1001001 등으로 표현된..
백준 1089 엘리베이터 www.acmicpc.net/problem/1089 1089번: 엘리베이터 가능한 것은 8, 9, 88, 89 www.acmicpc.net 처음에는 상당한 구현량이 있다고 생각했으나 조금 더 고민해보니 그냥 '구현할 부분이 아주 없진 않다'정도로 수월해졌던 문제이다. 위와 같이, 숫자를 만들기 위한 전구의 위치에 번호를 매겨, 하나의 숫자를 번호 집합으로 표현할 수 있게 된다. 위의 그림은 3을 예시로 들었다. 아래는 3을 번호 집합으로 표현한 것이고, 그 아래 주황색처럼 표시가 되었다면, 그 숫자는 사실 3일 수 있다는 뜻이다. 문제에서 켜져야 하는 전구가 꺼질 수는 있지만, 꺼져야 하는 전구가 켜지진 않는다고 하였다. 이에 대해 점으로 표시된 부분을 일일이 켜보면서 숫자 대조를 해볼 수도 있겠지만, ..
백준 11049 행렬 곱셈 순서 www.acmicpc.net/problem/11049 11049번: 행렬 곱셈 순서 첫째 줄에 입력으로 주어진 행렬을 곱하는데 필요한 곱셈 연산의 최솟값을 출력한다. 정답은 231-1 보다 작거나 같은 자연수이다. 또한, 최악의 순서로 연산해도 연산 횟수가 231-1보다 작거나 같� www.acmicpc.net 이 문제는 개인적으로 좋은 문제라고 생각한다. 또한 나에게 분할정복과 다이나믹 프로그래밍에 대한 많은 깨달음을 준 문제이기도 하다. 상당한 난이도가 있다고도 생각된다. 일단 곱셈이 이루어질 2개의 행렬 A, B가 있을 때, A의 행의 수와 B의 열의 수와 A의 열의 수(=B의 행의 수)의 곱이 두 행렬의 곱에서 발생하는 곱셈 횟수가 된다. 행렬 ABCDEF가 주어질 경우, 앞에서부터 순서대로 곱해..
백준 9095 - 1, 2, 3 더하기 www.acmicpc.net/problem/9095 9095번: 1, 2, 3 더하기 각 테스트 케이스마다, n을 1, 2, 3의 합으로 나타내는 방법의 수를 출력한다. www.acmicpc.net 이전 포스팅과 마찬가지로 이번에도 다이나믹 프로그래밍 문제이다. 아주 기본적인 형태이다. DP(Dynamic Programming)문제를 풀 때, 가장 중요한 것 중 하나가 바로 점화식을 구하는 것이다. 점화식이란 말 그대로 어떠한 연속된 연산의 불을 붙여주는 기초 공식이라고 볼 수 있다. 즉, 이전 포스팅(백준 회의실 배정 문제)에서 살짝 언급한 바와 같이, 연속된 연산이 하나의 공식(점화식)하에서 계속 이루어지기 위해서는 모든 정점(상황)에서 항상 같은 규칙이 적용될 수 있어야 한다. 이 문제에서는 어떠한..
백준 1003 피보나치 함수 www.acmicpc.net/problem/1003 1003번: 피보나치 함수 각 테스트 케이스마다 0이 출력되는 횟수와 1이 출력되는 횟수를 공백으로 구분해서 출력한다. www.acmicpc.net 이 문제는 피보나치 수열을 응용하여 만든 재미있는 문제이다. 피보나치 수열은 기본적으로 f(n)=f(n-1)+f(n-2)의 형태를 갖는다. 따라서 재귀함수의 형태로 공식을 구현할 수 있지만, 중간 과정에서 찾은 값들을 기록하지 않는다면 너무 많은 연산이 필요하게 된다. 이 문제에서는 f(0)에 다다랐을 경우, '0'을 출력하고 f(1)에 닿으면 '1'을 출력하도록 되어있다. 단순하게 생각하면 재귀로 계속 파고 들어 f(0)이나 f(1)에 닿아야 할 것 같지만, 그렇게 하면 당연히 너무 많은 시간이 필요하게 ..
백준 2292 벌집 www.acmicpc.net/problem/2292 2292번: 벌집 위의 그림과 같이 육각형으로 이루어진 벌집이 있다. 그림에서 보는 바와 같이 중앙의 방 1부터 시작해서 이웃하는 방에 돌아가면서 1씩 증가하는 번호를 주소로 매길 수 있다. 숫자 N이 주어졌�� www.acmicpc.net 이 문제는 관찰과 약간의 산수(?)를 통해 해결할 수 있다. 벌집은 육각형으로 이루어져 있고, 계속 중심의 육각형을 감싸는 방식으로 확장하므로, 바깥쪽 둘레는 항상 안쪽보다 6씩 더 길어진다. 그 점에 착안하여 공식을 세우면 된다 #include #define endl '\n' using namespace std; int cnt,n,m=1; int main() { ios::sync_with_stdio(false);c..
백준 11000 강의실 배정 (C++, 파이썬) www.acmicpc.net/problem/11000 11000번: 강의실 배정 첫 번째 줄에 N이 주어진다. (1 ≤ N ≤ 200,000) 이후 N개의 줄에 Si, Ti가 주어진다. (1 ≤ Si < Ti ≤ 109) www.acmicpc.net 백준 1931 회의실배정 문제와 함께 풀어보아야 할 기본적인 그리디 알고리즘 문제라고 생각한다. 이 문제는 계속 강의실을 새로 개설할 수 있고 몇 개의 강의실이 필요한지를 구한다는 점에서 다르다. 바로 풀이내용부터 설명하면, 우선순위 큐를 2개 사용하여, 하나에는 강의시간표를 담고 (시작시간 오름차순), 다른 하나에는 보유하고 있는 강의실 목록 (종료시간 오름차순)을 담으면 된다. 이처럼 정렬을 통해 기본적인 문제 설정 몇 가지를 해결하고, 가장 일찍 시작하..