Coding Test 31

[C++] 백준 11049: 행렬 곱셈 순서 (동적계획법)

https://www.acmicpc.net/problem/11049소요 시간: 58분해결: O 풀이 설계하는데 시간이 조금 걸렸습니다.풀고 보니 직관적인 문제인데 ps 조금 쉬었더니 바로 둔해지네요...문제 분할일련의 행렬들의 곱이 주어졌을 때, 어디서부터 어떤 순서로 곱해야 가장 적게 계산할까요?... 잘 모르겠습니다. 반대로 그 행렬들을 모두 곱한 결과가 있을 때, 마지막에 어느 부분에서 곱셈이 발생했을까요?마지막 결과 또한 부분 행렬 A와 B를 곱한 결과일테니, 그 경계가 되는 행렬을 찾으면 문제를 분할할 수 있습니다. i번째 행렬이 그 경계라면 아래처럼 식을 정리할 수 있습니다.캐싱start~end까지 행렬을 곱했을 때 연산횟수 중 최솟값을 저장합니다.코드const int INF = numeric..

[C++] 백준 2143: 두 배열의 합

https://www.acmicpc.net/problem/2143 시간: 1시간 11분해결: X문제두 정수 배열 A, B의 연속 부분합을 더해서 T와 같은 경우의 수를 구해야 합니다.저는 문제를 두 개로 나눴습니다. 모든 부분합 구하기A의 모든 부분합 SA의 크기는 1+2+3+ ... +n이므로 아래와 같습니다.B의 모든 부분합 SB도 똑같습니다. 부분합 더하기SA와 SB의 원소를 직접 더 해봅니다.다만 모든 경우의 수를 전부 구하면 대충 O(n^2*m^2)에 가까워지니 방법이 필요합니다. 제가 시도한 방법은1. 모든 SA의 원소 a에 대해 합이 T가 되는 SB의 원소 b를 이분 탐색2. lower_bound()로 a+b=T인 가장 작은 인덱스의 원소를 구하고 하나씩 세기3. (채택) equal_ran..

[C++] 드래곤 커브 DRAGON

https://algospot.com/judge/problem/read/DRAGON algospot.com :: DRAGON드래곤 커브 문제 정보 문제 드래곤 커브(Dragon curve)는 간단한 수학 규칙으로 그릴 수 있는 그림으로, 위 그림같은 형태를 지닙니다. 드래곤 커브는 선분 하나에서 시작해서 간단한 규칙으로 이algospot.com해결: X 사실 드래곤 커브를 아는 것과 거의 상관이 없는 문제입니다.https://en.wikipedia.org/wiki/Dragon_curve Dragon curve - WikipediaFrom Wikipedia, the free encyclopedia Fractal constructible with L-systems "Dragon fractal" redirec..

[C++] K-th Longest Increasing Sequence KLIS

https://www.algospot.com/judge/problem/read/KLIS algospot.com :: KLISK-th Longest Increasing Sequence 문제 정보 문제 어떤 정수 수열에서 0개 이상의 숫자를 지우면 이 수열의 부분 수열 (subsequence) 를 얻을 수 있다. 예를 들어 10 7 4 9 의 부분 수열에는 7 4 9, 10 4, 10 9 등이 있www.algospot.com소요 시간: 2시간 26분해결: X 하나의 수열에 대해 여러 LIS가 있을 수 있습니다.그 중에서 사전순으로 k번째 LIS를 찾는 문제입니다.LIS의 길이를 구하는 방법에 대해서는 좋은 설명이 많이 있으니 생략하겠습니다. LIS의 길이가 있다면 부분 수열에서 구할 수 있는 LIS의 개수도..

[C++] 모스 부호 사전 MORSE

https://www.algospot.com/judge/problem/read/MORSE algospot.com :: MORSE모스 부호 사전 문제 정보 문제 모스 부호(Morse code)는 전화가 없던 시절 무선 전신에 주로 사용하던 코드로, 짧은 신호(단점, o)와 긴 신호(장점, -)를 섞어 글자를 표현하는 표현방식입니다. 예를www.algospot.com해결: X소요 시간: 3시간 + αn개의 장점(-)과 m개의 단점(o)으로 구성된 모스 부호 사전에서 k번째 모스 부호를 출력하는 문제입니다. 우선 n개의 장점과 m개의 단점으로 만들 수 있는 모든 경우를 만들어야 합니다.사용해야 할 n과 m, 그리고 현재까지 만들어진 모스 부호를 받아서 가능한 모든 경우를 출력하는 함수를 만들어주면 됩니다.오름..

[C++] 광학 문자 인식 OCR

https://algospot.com/judge/problem/read/OCR소요 시간: 2시간 + α해결: X인식한 문자열 R과 원문 Q가 있을 때, T[i][j](단어 i 다음에 단어 j가 올 확률)와 M[i][j](문자 i를 j로 잘못 인식할 확률)로 R에서 Q를 구해내는 문제입니다. 현재 위치에 어떤 단어가 올지 모르니 모든 단어에 대한 확률을 계산해야 합니다.이전에 선택한 단어의 인덱스가 prev일 때 이번 선택한 단어의 인덱스가 curr일 확률은 T[prev][curr]문장의 첫 단어는 T 대신 B[curr]을 사용하면 됩니다. 현재 단어를 인식한 문장의 pos번째 단어 R[pos]로 잘못 인식할 확률은 M[curr][R[pos]] 이 식을 교재에서는 아래처럼 표현했습니다. 저는 아래처럼 재귀..

[C++] 여행 짐 싸기 (동적계획법)

https://algospot.com/judge/problem/read/PACKING소요 시간: 1시간 25분 +해결: XKnapsack 자체는 해결했지만 경로복구에서 막혀서 교재를 참고했습니다.풀이Knapsack 알고리즘을 배운 적이 있어서 DP 풀이가 바로 떠올랐습니다.식은 아래와 같습니다.i는 물건의 번호, c는 가방의 최대 용량, v는 물건의 부피, d는 물건의 절박도 입니다. 경로 복원에 익숙하지 않아서 물건 i에 대한 (서로 다른 c에 대한) 여러 부분 문제 중어떤게 유효한 건지 확인하는 방법을 계속 생각했어요. 결국 이 부분에서 책을 참고했습니다.분제를 분할하면서는 당연히 같은 물건에 대해 여러 부분 문제를 계산할 수 밖에 없으니,계산을 미리 해놓고 계산 결과를 따라가며 경로를 찾아야 했습..

[C++] 폴리노미오 (동적 계획법)

algospot.com :: POLY폴리오미노 문제 정보 문제 정사각형들의 변들을 서로 완전하게 붙여 만든 도형들을 폴리오미노(Polyomino)라고 부릅니다. n개의 정사각형으로 구성된 폴리오미노들을 만들려고하는데, 이 중 세로algospot.com 소요 시간: 1시간 2분해결: O풀이세로로 단조 폴리노미오라는 조건을 처음 봤을 때는 까다로운 제한 조건인 줄 알았지만알고보니 같은 행에 놓인 블럭들이 서로 떨어진 경우를 고려하지 않아도 된다는 뜻이었습니다.덕분에 문제에 'K개 블럭으로 구성된 폴리노미오 중 현재 행에 M개의 블럭을 놓는 경우의 수를 세는 문제'로 접근을 할 수 있지요.우리는 폴리노미오의 각 행에 몇 개의 블럭을 놓을지와 각 행을 조립하는 방법만 생각하면 됩니다. 단 두 개의 행끼리 조합하..

[C++] 두니발 박사의 탈옥 (동적 계획법)

https://algospot.com/judge/problem/read/NUMB3RS소요 시간: 1시간 16분해결 여부: 여풀이박사가 지금 마을 u에 있고, 마을 u가 n개의 마을과 연결되어 있다면, 그 중에 하나에 방문할 확률은 1/n입니다.그런데 박사가 지금 u에 있을지 없을지는 확률적입니다.그래서 실제 확률은 (d일 째에 마을 u에 방문해있을 확률) / n으로 생각하면 되겠네요. 반대로 마을 v에 연결된 마을에서 v를 방문할 확률은 각 마을에서 v를 방문할 확률의 합이겠죠.예를 들어 v가 마을{1, 3, 4}와 연결 되어있다면 v가 방문당할(?) 확률은'1에서 v를 방문할 확률 + 3에서 v를 방문할 확률 + 4에서 v를 방문할 확률'입니다. 각 방문할 확률을 곱한다면 어떤 경우일까요.그건 각 마을..

[C++] 비대칭 타일링 (동적계획법)

algospot.com :: ASYMTILING비대칭 타일링 문제 정보 문제 그림과 같이 2 * n 크기의 직사각형을 2 * 1 크기의 타일로 채우려고 합니다. 타일들은 서로 겹쳐서는 안 되고, 90도로 회전해서 쓸 수 있습니다. 단 이 타일링 방법은algospot.com풀이문제에서는 'n 길이의 직사각형을 채우는 방법의 수'에서 '대칭인 경우의 수'를 빼서 그 수를 구합니다. '대칭인 경우의 수'는 어떻게 구할까요?직사각형을 중앙에서 반으로 나누었을 때, 한 쪽 반에서 가능한 모든 배치는 반대쪽 반에서 대칭 형태로 나타날 수 있습니다.즉, '반 쪽 길이의 직사각형을 채우는 방법의 수'가 곧 '대칭인 경우의 수'라고 생각할 수 있겠네요. 그렇다면 n 길이와 그 절반 길이의 직사각형을 타일링하는 수를 각각..