목록알고리즘/문제 풀이 (64)
Joonas' Note
링크: https://www.acmicpc.net/problem/16235문제시뮬레이션여름과 겨울은 양분을 더하는 것밖에 영향을 안 미치기 때문에 같이 처리할 수 있다.링크드리스트로 정렬된 상태 유지 + 나무 개수를 압축하여 표현나무의 개수를 압축해도 수명이 끝난 나무를 확인하는 것 때문에 시간복잡도는 거의 변화가 없어서 고민이 많았는 데, 항상 크기가 1인 나무들이 생기므로 링크드리스트의 앞과 뒤만 잘 관리하면 된다는 것을 Nada님의 코드를 보고 깨달았다.코드
링크: https://www.acmicpc.net/problem/11058출력 결과에 영향을 미치는 연산이 A를 그냥 누르는 거랑(+1), Ctrl-V (+복사했던 크기) 인데 클립보드에 복사해놓은 크기때문에 재귀로 짜는데 애를 먹었다. 복사한 크기만큼 늘어나기 때문에, Ctrl-V 를 하기 위해서는 이전에 Ctrl-A, Ctrl-C 가 꼭 필요하다. 문제에 적힌 연산을 순서대로 A, S, C, V 라고 한다면 \(N=6\)인 경우는 아래와 같이 가능하다. AAAAAAAAASCVAASCVVASCVVV 이 정도가 의미있는 타이핑인거같다. 타이핑을 \(n\)번한 것을 \(f(n)\)이라 하자. 그럼 위 4줄은 각각 \(f(5)+1\), \(f(3)∗2\), \(f(2)∗3\), \(f(1)∗4\) 이다. $..
링크: https://www.acmicpc.net/problem/1509문제\(dp[i]\) = \(i\)번째 위치에서 가능한 팰린드롬 분할의 최소 개수\(isPaline[i][j]\) = \(i~j\) 가 팰린드롬인지 여부 예제에도 끼워져있지만 AABDBADD 와 같은 경우의 처리때문에 여러 경우를 탐색해야한다. 이것을 분할하는 경우는 아래와 같다.A - A - B - D - B - A - D - D A - A - B - D - B - A - DD A - A - BDB - A - D - D A - A - BDB - A - DD A - ABDBA - D - D A - ABDBA - DD AA - B - D - B - A - D - D AA - B - D - B - A - DD AA - BDB - A - ..
링크: https://www.acmicpc.net/problem/3079코드
[이전 블로그]에서 글 옮김 링크: https://www.acmicpc.net/problem/1766풀이처음에는 문제의 접근 방향을 후위순회처럼 생각했다. 어떤 x번째를 하기 위해서 그 이전것을 무조건 해결해야하는 방식. 틀리고 나서 문제를 다시 이해했는데, 깨달은 테스트 케이스부터 말하자면 아래와 같다.5 3 4 1 2 3 5 3 내가 생각한 이 입력의 정답은 아래와 같다.2 4 1 5 3 1번보다 4번을 먼저 풀어야하고, 3번보다 2, 5번을 먼저 풀어야한다. 1번을 풀기 위해서 4번을 풀어야하는데, 같은 우선순위에서 4번보다는 2번이 쉽다. (둘 다 1개의 문제 앞에 있음)2번을 풀고 4번을 풀면, 1번이 풀리고 남은 5번을 풀면 3번이 풀린다. 처음에 생각한 대로라면 4 1 2 5 3 이 나와야하..
링크: https://www.acmicpc.net/problem/13701문제BOJ 15719 - 중복된 숫자를 비트로 해결하는 풀이와 같다. 엄밀히 말하면 이 문제가 더 먼저 만들어졌다.정확히 같은 풀이이므로 링크로 대체한다.다른 점이 있다면, 표현할 수의 범위가 \(2^{25}\)가 최대이므로 32비트 정수 배열의 크기가 \(2^{25}~/~32=1~048~576\)이면 된다.코드
링크: https://www.acmicpc.net/problem/15719문제자료형의 비트를 이용하여 배열을 압축하여 사용하는 방법과, 수학으로 푸는 2가지 풀이를 소개하려 한다.풀이 1 (비트)표현할 정수의 범위는 [0, 10000000]이다. 그리고 필요한 정보는 각 숫자들이 사용되었는가/아닌가 이다.사용되지 않았다면 0, 사용되었다면 1로 표현한다면 숫자 하나의 사용 여부를 하나의 비트로 관리할 수 있다. 즉, 32비트 정수 하나에 32개의 수의 상태를 담을 수 있다.그럼 배열의 크기는 \(\lceil 10~000~000 / 32 \rceil = 312~500\)만큼 필요하다. 코드는 훨씬 간단하다.코드 풀이 2 (수학)1부터 \(n-1\)까지의 수가 골고루 등장한다. 등장한 모든 수의 합을 \(S..
링크: https://www.acmicpc.net/problem/15683문제모든 조합을 살피고 시뮬레이션을 할 수 있어야 하는 문제. CCTV가 보고 있는 방향을 하나씩 선택하면서, 모든 방향이 결정됐을 때 시뮬레이션 후 사각 지대의 개수를 구한다. 모든 조합을 살피다가 사각 지대의 개수가 최소가 되는 조합에서 정답을 출력하면 된다. CCTV의 방향을 처리하는 시뮬레이션이 벽에서 막힌다거나 지도 밖으로 넘어가는 것 외에도 은근히 신경쓰이는 게 많다. 오목이나 틱택토류의 코드를 작성한 경험이 있다면 수월할 듯 상세한 부분을 제외하면 개략적인 구조는 이렇다. 여러 방향을 한번에 담아 처리하기 위해 비트로 각 방향을 표현했다. 비트가 겹치는 것을 확인하는 건 비트 AND연산으로 쉽게 구현할 수 있다. 예를 ..