프로그래밍 대회에서 배우는 알고리즘 문제해결전략 96

algospot TRIANGLEPATH

문제 링크입니다: https://algospot.com/judge/problem/read/TRIANGLEPATH동적계획법을 이용해서 문제를 풀었습니다. /*삼각형으로 배치된 자연수들이 있다.(정사각을 왼쪽 위에서 오른쪽 아래 대각선 기준으로 잘랐을 때 아래 부분)맨 위의 숫자에서 시작해서, 한번에 한 칸씩 아래로 내려가맨 아래 줄까지 닿는 경로를 만들려고 한다.경로는 아래줄로 내려갈 때마다 바로 아래 숫자 혹은 오른쪽 아래 숫자로 내려갈 수 있다.이 때 모든 경로 중 숫자의 합을 최대화하는 경로는?또한 경로에 포함된 숫자들의 최대 합은 얼마인가*/#include #include //memset#include using namespace std; //MAX_NUMBER:한 칸에 들어갈 숫자의 최대치//co..

algospot WILDCARD

문제 링크입니다: https://algospot.com/judge/problem/read/WILDCARD책에 나와있는대로 메모이제이션, 혹은 동적 계획법을 이용하여 문제를 풀었습니다.언어에 약해서 그런지 문제를 완벽히 이해하는데 시간이 오래 걸렸던 것 같습니다. /*와일드 카드는 다양한 운영체제에서 파일 이름의 일부만으로 파일 이름을 지정하는 방법이다.와일드카드 패턴을 앞에서 한 글자씩 파일명과 비교해서 모든 글자가 일치했을 때해당 와일드카드 패턴이 파일명과 대응된다고 말한다.단, 와일드카드 패턴에 포함된 ?는 어떤 글자와도 대응된다고 가정하며,*는 0글자 이상의 어떤 문자열에도 대응된다고 가정한다 와일드카드 패턴과 함께 파일명의 집합이 주어질 때,그 중 패턴에 대응되는 파일명들을 찾아내는 프로그램을 작..

algospot JUMPGAME

문제 링크입니다: https://algospot.com/judge/problem/read/JUMPGAME알고리즘 자체는 쉬운데 문제의 제약 내에 코드를 작성하는 것이 정말 어렵다는 것을 깨달았습니다. /*게임판의 왼쪽 위 칸에서 시작해서 게임판의 맨 오른쪽 아래 칸에 도착할 수 있는지를 판별하는 프로그램칸에 적혀 있는 숫자만큼 오른쪽 혹은 밑으로 내려갈 수 있습니다.*/#include #include using namespace std; int board[100][100];int cache[100][100]; int jump(int y, int x, int max_size){ //기저 사례:게임판 밖을 벗어난 경우 if (y == max_size - 1 && x == max_size - 1) //출구 r..

메모이제이션을 적용한 이항계산 vs 재귀호출을 적용한 이항계산

dynamic programming(동적 계획법)의 장점을 알아보기 위해 재귀호출을 적용한 이항계산과 메모이제이션을 적용한 이항계산의 속도 차이를 확인했습니다. /*재귀호출을 이용한 이항 계수의 계산 vs 메모이제이션을 이용한 이항 계수의 계산*/#include #include using namespace std; const int MAX = 30; //-1로 초기화int cache[MAX][MAX]; void initialize(void){ for (int i = 0; i < MAX; i++) for (int j = 0; j < MAX; j++) cache[i][j] = -1;} //재귀int bino(int n, int r){ //기저 사례:n=r(모든 원소를 다 고르는 경우) 혹은 r=0(고를 원소..

c++ 행렬의 거듭제곱을 구하는 분할 정복 알고리즘

행렬의 거듭제곱을 구하는 분할 정복 알고리즘을 작성해보았습니다./*행렬의 거듭제곱을 구하는 분할 정복 알고리즘*/#include #include using namespace std; //정방행렬을 표현하는 SquareMatrix 클래스가 있다고 가정class SquareMatrix{private: int **arr; int m_size;public: SquareMatrix(int n = 2) :m_size(n) { arr = new int*[m_size]; for (int i = 0; i < m_size; i++) arr[i] = new int[m_size]; //동적할당 } ~SquareMatrix() { for (int i = 0; i < m_size; i++) //해제 delete[] arr[i];..

algospot FANMEETING

문제 링크입니다: https://algospot.com/judge/problem/read/FANMEETING멤버와 팬의 수는 모두 1이상 200,000 이하의 정수인데 20,000으로 보고 예외처리를 해서 계속 런타임오류가 떴었습니다.역시 문제를 끝까지 잘 읽는 것이 중요합니다...카라츠바의 빠른 곱셈을 이용해서 풀 수 있다는 것을 몰랐다면 아마 영영 못 풀었을 것 같습니다 ㅠㅠ /*팬미팅의 한 순서로, 멤버들과 참가한 팬들이 포옹을 하는 행사를 갖기로 했다.팬미팅에 참가한 M명의 팬들은 줄을 서서 맨 오른쪽 멤버에서부터 시작해 한 명씩 왼쪽으로 움직이며멤버들과 한명씩 포옹을 한다. 모든 팬들은 동시에 한명씩 움직인다.남성과 남성은 포옹 대신 악수를 하고 그 외의 경우에는 포옹을 한다.포옹하는 횟수를 계..

algospot FENCE

문제 링크입니다: https://algospot.com/judge/problem/read/FENCEvector를 매개변수로 전달할 때 그냥 전달하는 것보다 참조로 전달하는 것이 훨씬 빠르다는 것을 깨닫게 해준 문제였습니다. /*너비가 같은 N개의 나무 판자를 붙여 세운 울타리가 있습니다.울타리를 구성하는 각 판자의 높이가 주어질 때,잘라낼 수 있는 직사각형의 최대 크기를 계산하는 프로그램을 작성하시오.단, 비스듬히 잘라낼 수는 없습니다.*/#include #include #include using namespace std; int solve(vector &fence, int left, int right){ //기저 사례:판자가 하나밖에 없는 경우 if (left == right) return fence[..

algospot QUADTREE

문제 링크입니다: https://algospot.com/judge/problem/read/QUADTREE책에 나와있는대로 분할을 이용하여 풀었습니다. /*쿼트리는 주어진 공간을 항상 4개로 분할해 재귀적으로 표현한다.쿼드트리는 2^N * 2^N 크기의 흑백 그림을 다음과 같은 과정을 거쳐 문자열로 압축한다.1. 이 그림의 모든 픽셀이 검은 색일 경우 이 그림의 쿼드 트리 압축 결과는 그림의 크기에 관계없이 b2. 이 그림의 모든 픽셀이 흰 색일 경우 이 그림의 쿼드 트리 압축 결과는 그림의 크기에 관계없이 w3. 모든 픽셀이 같은 색이 아니라면 쿼드 트리는 이 그림을 가로 세로로 각각 2등분해 4개의 조각으로 쪼갠 뒤 각각을 쿼드 트리 압축한다. 이 때 전체 그림의 압축 결과는 x(왼쪽 위 부분의 압축 ..

c++ 카라츠바의 빠른 곱셈

책에 소개된 카라츠바의 빠른 곱셈을 구현해봤습니다.사실 카라츠바의 빠른 곱셈은 50자리 숫자 * 50자리 숫자 같이 매우 큰 숫자끼리의 곱셈을 진행할 때 유리합니다.하지만 int형 변수로 표현할 수 있는 숫자의 한계가 있기 때문에 8자리 숫자 * 8자리 숫자의 결과를 놓고 결과를 확인했습니다.long long 변수를 사용한다면 보다 높은 자리 숫자의 곱셈 결과를 확인할 수 있을 것입니다.(addTo와 subFrom 수정 2018년 1월 24일 01:31) /*카라츠바의 빠른 정수 곱셈 알고리즘*/#include #include #include #include #include using namespace std; //num[]의 자릿수 올림을 처리한다void normalize(vector &num){ nu..

algospot CLOCKSYNC

문제 링크입니다: https://algospot.com/judge/problem/read/CLOCKSYNC책에 나와있는대로 재귀를 이용하여 문제를 해결했습니다.속도가 상당히 느리기 때문에 보완을 해야할 것 같습니다. /*4*4개의 격자 형태로 배치된 16개의 시계가 있습니다.이 시계들은 모두 12시, 3시, 6시, 혹은 9시를 가리키고 있는데이 시계들이 모두 12시를 가리키도록 바꾸는 프로그램을 작성하시오 스위치를 누를 때마다 해당 스위치와 연결된 시계들의 시간은 3시간씩 앞으로 움직입니다.스위치 연결된 시계들은 링크 참고*/#include #include #include using namespace std; #define INF 9999#define SWITCH 10#define CLOCK 16 //l..