알고리즘 1624

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..

algospot BOARDCOVER

문제 링크입니다: https://algospot.com/judge/problem/read/BOARDCOVER책에 나와있는대로 재귀를 이용하여 문제를 해결했습니다. /*H*W 크기의 게임판이 있습니다.게임판은 검은 칸과 흰 칸으로 구성된 격자 모양을 하고 있는데이 중 모든 흰칸을 세 칸짜리 L자 모양의 블록으로 덮고 싶습니다.이 때 블록들은 자유롭게 회전해서 놓을 수 있지만, 서로 겹치거나,검은 칸을 덮거나 게임판 밖으로 나가서는 안됩니다.게임판이 주어질 때 이를 덮는 방법의 수를 계산하는 프로그램을 작성하세요*/#include using namespace std; //주어진 칸을 덮을 수 있는 네가지 방법//블록을 구성하는 세 칸의 상대적 위치 (dy, dx)의 목록const int coverType[4..