알고리즘/algospot 90

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

algospot PICNIC

문제 링크입니다: https://algospot.com/judge/problem/read/PICNIC책에 나와있는대로 재귀를 이용하여 문제를 해결했습니다. /*각 학생들의 쌍에 대해 이들이 서로 친구인지 여부가 주어질 때,학생들을 짝지을 수 있는 방법의 수를 계산하는 프로그램을 작성한다.*/#include #include using namespace std; int total; //학생 수bool areFriends[10][10]; //서로 친구인가 확인을 위한 이차원 배열 //taken[i]=i번째 학생이 짝을 찾았는지 여부int countPairings(bool taken[10]){ //남은 학생들 중 가장 번호가 빠른 학생 찾는다 int firstStudent = -1; for (int i = 0;..

algospot BOGGLE

문제 링크입니다: https://algospot.com/judge/problem/read/BOGGLE프로그램 자체는 잘 돌아가는데 아무래도 메모리 초과로 런타임 에러가 계속 뜨는 것 같습니다.여태까지 프로그램을 작성하면서 메모리를 신경쓴 적이 없어서 그런지 어떻게 수정해야할지 고민이네요...혹시 코드를 간략화 시킬 요소가 있다면 댓글로 알려주시면 감사하겠습니다!(2018 1-21 00:48 해결완료) 우선 문자열을 동적할당하면 메모리가 많이 차지하는 것 같아 동적할당을 하지 않기로 했습니다.이후에 기록을 초기화하는 부분을 memset으로 대체하였고 큐 또한 사용하지 않고 printf로 출력했습니다.cout과 cin이 예상외로 상당히 많은 메모리를 차지했습니다.따라서 printf와 scanf 그리고 put..

c++ 연속된 부분 구간 중 그 합이 최대인 구간 찾기

책에 나와 있는 알고리즘이 흥미로워 main 함수까지 작성해봤습니다. /*연속된 부분 구간 중 그 합이 최대인 구간 찾기*/#include #include #include #include #include #include using namespace std; const int MIN = numeric_limits::min();//A[]의 연속된 부분 구간의 최대 합을 구한다 시간복잡도 O(N^3)int inefficientMaxSum(const vector &A){ int N = A.size(), ret = MIN; for (int i = 0; i < N; i++) for (int j = i; j < N; j++) { //구간 A[i...j]의 합을 구한다 int sum = 0; for (int k = i..

algospot FESTIVAL

문제 링크입니다. https://algospot.com/judge/problem/read/FESTIVAL /*커다란 공연장을 빌려서 록 페스티벌을 개최하려고 합니다.이 페스티벌은 여러 날 동안 진행되며, 하루에 한 팀의 밴드가 공연장에서 콘서트를 하게 됩니다.공연장은 하루 빌리는 데 드는 비용이 매일매일 다릅니다.때문에 공연 일정을 잘 정해서 공연장 대여 비용을 줄이려고 합니다.앞으로 N일 간의 공연장 대여 비용을 알고 있다고 합시다. 이 중 L일 이상을 연속해서 대여하되, 공연장을 하루 빌리는데 드는 평균 비용을 최소화하려면 어떻게 공연장을 빌려야할까*/#include using namespace std; int main(void){ int test, rent, team; //테스트 케이스 수, 대여할..