본문 바로가기

나는 오늘,

(371)
좋은 단어 *뒤에 나와 같은 단어가 나오면 그 다음다음 단어를 본다. (j++) -> 스택에 넣을 필요 없음 *뒤에 다른 단어가 나오면 스택에 넣는다. (만약, ABBA 이렇게 있다면 AA는 BB를 둘러싼 형태이기 때문에 스택에는 ABB까지 봤을 때 스택에는 A만 들어가있는 상태일 것이다. 위 조건으로 BB가 사라지고 나면 마지막 단어인 A가 나왔을 때 스택에 있는 A와 일치하기 때문에 좋은 단어이다.) *단어의 끝까지 봤을 때 스택이 비어있다면 좋은 단어, 아니라면 res-- #include #include #include using namespace std; int main() { ios_base::sync_with_stdio(0); cin.tie(0); int n; cin >> n; int res = n; f..
동전2 *dp 배열을 2차원으로 정의하는데, dp[i][j] = i번째 동전을 이용해서 j원을 만드는데 사용하는 최소 동전 사용 횟수 *동전들을 오름차순으로 정렬한다. *제일 가치가 작은 동전이 k보다 크면 불가능한 경우이다. (-1) *2차원 반복문에서 1원부터 k원까지 확인하는데, 각 조합을 구하는 경우가 3가지로 나뉘어진다. 1. i원이 j번째 동전으로 나뉘어 떨어질때 -> i/coin[j] 가 최소가 될 수 있다. 2. j번째 동전을 사용했을 때 -> dp[j][i-coin[j]]+1 3. j번째 동전을 사용하지 않았을 때 -> dp[j-1][i] 테스트케이스 3 13 1 5 12 ans = 2 2 100 7 8 ans = 13 3 24 1 7 10 ans = 3 3 15 1 5 12 ans = 3 3 ..
최종순위 *위상정렬 *isPrev[][] 작년 등수가 더 높은 팀이 앞에 온 경우 (-1) / 뒤에 온 경우 (1) -> compareTo 의 반환값과 동일 *등수에 변화가 있으면 작년 등수가 더 높은 팀의 위상 배열을 ++ / 낮은 팀은 위상 배열을 -- 하여 등수에 변화를 준다. #include #include #include using namespace std; int main() { ios_base::sync_with_stdio(0); cin.tie(0); int t; cin >> t; while (t--) { int n, m; cin >> n; int prev[501] = { 0 }; for (int i = 1; i > prev[i]; } int isPrev[501][501] = { {0} }; int ..
욕심쟁이 판다 *현재 좌표는 항상 1일 (dp[][]을 1로 초기화한다) *현재 좌표에서 최대한 많이 갈 수 있는 날을 dp[][] 에 저장한다. #include #include #include #include using namespace std; int n; int map[501][501]; int dx[4] = { -1,1,0,0 }, dy[4] = { 0,0,-1,1 }; typedef pair pp; typedef pair ipp; int dp[501][501]; bool visited[501][501]; int dfs(int x, int y) { if (dp[x][y] != 1) return dp[x][y]; int &ret = dp[x][y]; for (int i = 0; i < 4; i++) { int n..
에너지모으기 *완전탐색 #include #include #include using namespace std; int n, ans = 0; bool picked[11]; int w[11]; void dfs(int size, int res) { if (size == n-2) { ans = ans > res ? ans : res; return; } for (int i = 1; i 0) left--; while (picked[right] && right < n - 1) right++; picked[i] = true; dfs(size + 1, res + w[left] * w[right]); picked[i] = false; } } } int main() { ios_base::sync_with_stdio(0); cin.tie(..
두 동전 *두 동전이 모두 보드 바깥으로 나가는 경우 -> continue; *모두 보드안으로 이동하는 경우 -둘 다 벽인 경우 continue; -하나만 벽인 경우 -> 그 동전은 이동하지 않고 머무른다. #include #include #include #include #define INF 987654321 using namespace std; typedef struct Pos { int x, y; }; typedef struct Coin { //int cnt; Pos one; Pos two; }; int n, m; char map[21][21]; Pos coin1, coin2; int ans = INF; bool visited[21][21][21][21]; int dx[4] = { -1,0,0,1 }, dy[..
개똥벌레 #include #include #include #define MAXN 200001 #define MAXH 500001 using namespace std; int suk[MAXH], jong[MAXH], res[MAXH]; int main() { ios_base::sync_with_stdio(0); cin.tie(0); //각 구간별로 장애물 개수를 센다. int n, h; cin >> n >> h; int cnts = 0, cntj = 0; for (int i = 0; i > tmp; if (i % 2 == 0) { //석순 suk[cnts++] = tmp; } else ..
달리기 *세그 트리 사용 #include #include #include #define MAXX 500001 using namespace std; typedef long long ll; typedef pair li; typedef pair ii; int n; int tree[MAXX]; li num[MAXX]; void update(int idx, int diff) { while(idx 0) { res += tree[idx]; idx -= (idx & -idx); } return res; } int main() { ios_base::sync_with_stdio(0); cin.tie(0); cin >> n; for (int i = 1; i > tmp; num[i].first = tmp; num[i].second ..