·465 words·3 mins
๐ ๋ฌธ์ ์ ๋ณด # ๋งํฌ: https://www.acmicpc.net/problem/10108 ๋ฒ์ญ ๋ฌธ์ # ๋น์ ์ ๊ฐ์์ ์ข์ํ๋ ์ ์์ฉ ์ฌ์ฐ๋ฅผ ํค์ฐ๊ณ ์์ต๋๋ค. ์๋ก ๋ค๋ฅธ ์์น(๋ฐ์นด๋ฅดํธ ํ๋ฉด ์์ ์ ์ผ๋ก ํํ๋จ)์ N๋ช
์ ์ด์์ด ์์ผ๋ฉฐ, ๊ฐ ์ด์์ ๋น์ ์ ์ ์ ์ฌ์ฐ์๊ฒ ๊ฐ์์ ๋๋ ์ค๋๋ค. ๊ฐ ์ด์์ ๋ฌด์ ํ์ผ๋ก ๊ฐ์์ ์ค ์ ์์ต๋๋ค. ์์ (์ฌ์ฐ๊ฐ ์์ํ๋ ์์น)์ ์ด N๊ฐ์ ์์น ์ค ํ๋๊ฐ ์๋๋๋ค.
·193 words·1 min
๐ ๋ฌธ์ ์ ๋ณด # ๋งํฌ: https://www.acmicpc.net/problem/31740 ๐ง ๊ด์ฐฐ ๋ฐ ์ ๊ทผ # ๋ฌธ์ ์์ ์ฃผ์ด์ง ๊ทธ๋ํ๋ ํธ๋ฆฌ๋ก ๋ณด์ธ๋ค. ํธ๋ฆฌ์์๋ ๋ชจ๋ ๊ฐ์ ์ด ๋จ์ ์ ์ด๋ฏ๋ก ํ๋๋ง ์๋ผ๋ ๋ ์ปดํฌ๋ํธ๋ก ๋๋๋๊ฒ์ด ์๋ช
ํ๋ค. ๊ฐ์ ์ ํ๋ ์๋ฅด๊ณ ๋๋ฉด ์๋ธํธ๋ฆฌ ํ๋์ ๋๋จธ์ง ๋ถ๋ถ์ผ๋ก ๋๋๋ค. ์๋ธํธ๋ฆฌ์ ๊ฐ์ค์น๋ ํธ๋ฆฌDP๋ฅผ ํ์ฉํด ๋ฏธ๋ฆฌ ๊ณ์ฐํด๋ ์ ์๊ณ , ๋๋จธ์ง ๋ถ๋ถ์ ์ ์ฒด ๊ฐ์ค์น ํฉ์์ ํด๋น ์๋ธํธ๋ฆฌ์ ๊ฐ์ค์น ํฉ๋งํผ์ ๋นผ๋ฉด ๋๋ค. $O(N)$์ ๊ณ์ฐ ๊ฐ๋ฅํด๋ณด์ธ๋ค. ๐ป ํ์ด # ์ฝ๋ (C++): int dfs(int c, int p){ par[c] = p; DP[c] = W[c]; for(auto nxt : links[c]){ if(nxt == p) continue; DP[c] += dfs(nxt, c); } return DP[c]; } void solve(){ cin >> N; rep(i, 0, N-1){ int u, v; cin >> u >> v; links[u].push_back(v); links[v].push_back(u); } rep(i, 1, N+1) cin >> W[i]; int SUM = dfs(1, -1); int ans = 2e9; pii ans2 = {-1, -1}; rep(i, 2, N+1) if(ans > abs(DP[i] - (SUM - DP[i]))){ ans = abs(DP[i] - (SUM - DP[i])); ans2 = {i, par[i]}; } cout << ans << '\n'; cout << ans2.first << ' ' << ans2.second << '\n'; } ๐ ๊ตฌํ ์ฝ๋ ์ ๊ธ
·141 words·1 min
๐ ๋ฌธ์ ์ ๋ณด # ๋งํฌ: https://www.acmicpc.net/problem/2437 ๐ง ๊ด์ฐฐ ๋ฐ ์ ๊ทผ # $1, 2, 4, 8, 16, \cdots$์ ์ถ๋ก ๋ชจ๋ ์์ ์ ์๋ฅผ ์ธก์ ํ ์ ์์์ด ์๋ช
ํ๋ค. ์ด ์ด์ ๋ฅผ ์ดํด๋ณด๋ฉด, $X$๋ผ๋ ๋ฌด๊ฒ์ ์ถ๊ฐ ์์๋, $X-1$๊น์ง์ ๋ชจ๋ ์ ์๋ฅผ ํํํ ์ ์๋ค๋ฉด ํํํ ์ ์๋ ์ต๋์น + 1์ด ๋ต์ด ๋๋ค. ์ถ๋ฅผ ์์๊ฒ๋ถํฐ ์ ๋ ฌํด์, ๋น ์ง๋ ์ ์์ด ๋ฌด์จ ์์ ์ ์๊น์ง ์ต๋ํ ์ด ์ ์๋์ง ํ์ธํ์. ๐ป ํ์ด # ์ฝ๋ (C++): void solve(){ int N; cin >> N; vector<ll> v(N); rep(i, 0, N) cin >> v[i]; sort(all(v)); ll sum = 0; rep(i, 0, N){ if(v[i] > sum + 1){ cout << sum + 1 << "\n"; return; } sum += v[i]; } cout << sum + 1 << "\n"; } ๐ ๊ตฌํ ์ฝ๋ ์ ๊ธ
·246 words·2 mins
๐ ๋ฌธ์ ์ ๋ณด # ๋งํฌ: https://www.acmicpc.net/problem/2138 ๐ง ๊ด์ฐฐ ๋ฐ ์ ๊ทผ # ์ฒซ๋ฒ์งธ / ๋ง์ง๋ง ์ ๊ตฌ๋ฅผ ์ ์ธํ๊ณ ๋, ๊ทธ๋ฆฌ๋ํ๊ฒ ๋๋ ๊ท์น์ด ๊ฐ๋ฅํ๋ค. ์ฒซ๋ฒ์งธ ์ ๊ตฌ๋ฅผ ๊ฑด๋๋ฆฐ ๊ฒฝ์ฐ / ์๊ฑด๋๋ฆฐ ๊ฒฝ์ฐ ๋๊ฐ์ง์ ๋ํด, ๊ทธ๋ฆฌ๋ํ๊ฒ ๋๊ณ ์ ์ฒด๋ฅผ ๋ ์ ์๋์ง ํ์ธํ์. ๐ป ํ์ด # ์ฝ๋ (C++): void solve(){ int N; cin >> N; string S, T; cin >> S >> T; string ret = ""; rep(i, 0, N) ret += (S[i] == T[i] ? "0" : "1"); int ans = 1e9; // don't flip first string tmp = ret; int cnt = 0; rep(i, 1, N){ if(tmp[i-1] == '1'){ cnt++; tmp[i-1] = (tmp[i-1] == '1' ? '0' : '1'); tmp[i] = (tmp[i] == '1' ? '0' : '1'); if(i+1 < N) tmp[i+1] = (tmp[i+1] == '1' ? '0' : '1'); } } if(tmp[N-1] == '0') ans = min(ans, cnt); // flip first tmp = ret; cnt = 1; tmp[0] = (tmp[0] == '1' ? '0' : '1'); tmp[1] = (tmp[1] == '1' ? '0' : '1'); rep(i, 1, N){ if(tmp[i-1] == '1'){ cnt++; tmp[i-1] = (tmp[i-1] == '1' ? '0' : '1'); tmp[i] = (tmp[i] == '1' ? '0' : '1'); if(i+1 < N) tmp[i+1] = (tmp[i+1] == '1' ? '0' : '1'); } } if(tmp[N-1] == '0') ans = min(ans, cnt); if(ans == 1e9) ans = -1; cout << ans << "\n"; } ๐ ๊ตฌํ ์ฝ๋ ์ ๊ธ
·244 words·2 mins
๐ ๋ฌธ์ ์ ๋ณด # ๋งํฌ: https://www.acmicpc.net/problem/14939 ๐ง ๊ด์ฐฐ ๋ฐ ์ ๊ทผ # ๋งจ ์์ค์ ์ด์ฐ์ ์ฐ ์ผ์ฒ๋ฆฌ๋ฅผ ๋๋๋ค๊ณ ๊ฐ์ ํ์. ๋๋ฒ์งธ ์ค๋ถํฐ, ๊ทธ ์์ค์ ๋จ์ ์ ๊ตฌ๋ฅผ ๋๋ ๋ฐฉ๋ฒ์ ํด๋น ์นธ ์๋์ ์ค์์น๋ฅผ ์ปจํธ๋กค ํ๋ ๋ฐฉ๋ฒ์ด ์ ์ผํ๋ค. ์ด๋ฅผ ์ฌ์ฉํ๋ฉด ๋งจ ์์ค์ ์ฒ๋ฆฌํ ์ ์๋ ๋ฐฉ๋ฒ $= 2^{10} = 1024$๊ฐ์ง์ ๋ํด ํด๋ณผ ์ ์๊ณ , ์๋ฎฌ๋ ์ด์
์ $100 \times 100 = 10000$๋ฒ์ผ๋ก ์ถฉ๋ถํ ์๊ฐ ๋ด๋ก ๋ค์ด์จ๋ค. ๋งจ ์๋ซ์ค์ ์ผ์ง ์ ๊ตฌ๊ฐ ๋จ์์์ผ๋ฉด ์๋จ์ ์ ์ํ๋ค. ๐ป ํ์ด # ์ฝ๋ (C++): void solve(){ vector<string> board(10); rep(i, 0, 10) cin >> board[i]; int answer = 1e9; rep(bit, 0, 1<<10){ vector<string> cboard = board; int cnt = 0; auto press = [&](int r, int c){ cnt++; cboard[r][c] = (cboard[r][c] == 'O' ? 'X' : 'O'); if(r > 0) cboard[r-1][c] = (cboard[r-1][c] == 'O' ? 'X' : 'O'); if(r < 9) cboard[r+1][c] = (cboard[r+1][c] == 'O' ? 'X' : 'O'); if(c > 0) cboard[r][c-1] = (cboard[r][c-1] == 'O' ? 'X' : 'O'); if(c < 9) cboard[r][c+1] = (cboard[r][c+1] == 'O' ? 'X' : 'O'); }; rep(c, 0, 10) if(bit & (1 << c)) press(0, c); rep(r, 1, 10) rep(c, 0, 10) if(cboard[r-1][c] == 'O') press(r, c); bool ok = true; rep(c, 0, 10) if(cboard[9][c] == 'O') ok = false; if(ok) answer = min(answer, cnt); } if(answer == 1e9) cout << -1 << '\n'; else cout << answer << '\n'; } ๐ ๊ตฌํ ์ฝ๋ ์ ๊ธ
·140 words·1 min
๐ ๋ฌธ์ ์ ๋ณด # ๋งํฌ: https://www.acmicpc.net/problem/14464 ๐ง ๊ด์ฐฐ ๋ฐ ์ ๊ทผ # ์์ ๋ํด์๋ ๋๋๋ ์๊ฐ์ด ๊ฐ์ฅ ๋น ๋ฅธ ์๋ฅผ, ๋ญ์ ๋ํด์๋ ๊ฐ์ฅ $T$๊ฐ ๋นจ๋ฆฌ ์ค๋ ๋ญ์ ์ฐ๋ ๊ทธ๋ฆฌ๋๊ฐ ์ฑ๋ฆฝํ๋ค. ์ด๋ฅผ ๊ตฌํํ๋ ๋ฐฉ๋ฒ์ ์ฌ๋ฌ๊ฐ์ง๊ฐ ์๊ฒ ์ง๋ง, ์ฌ๊ธฐ์๋ multiset๊ณผ ์ด๋ถํ์์ ์ด์ฉํ๊ฒ ๋ค. ๐ป ํ์ด # ์ฝ๋ (C++): void solve(){ int C, N; cin >> C >> N; multiset<int> chicken; rep(i, 0, C){ int x; cin >> x; chicken.insert(x); } vector<pii> cow(N); rep(i, 0, N) cin >> cow[i].first >> cow[i].second; sort(all(cow), [](pii a, pii b){ return a.second < b.second; }); int ans = 0; for(auto [s, e]: cow){ auto it = chicken.lower_bound(s); if(it != chicken.end() && *it <= e){ ans++; chicken.erase(it); } } cout << ans << '\n'; } ๐ ๊ตฌํ ์ฝ๋ ์ ๊ธ
·124 words·1 min
๐ ๋ฌธ์ ์ ๋ณด # ๋งํฌ: https://www.acmicpc.net/problem/1149 ๐ง ๊ด์ฐฐ ๋ฐ ์ ๊ทผ # ํ์ฌ ์ง $i$๋ฒ์ ์์ ์ ํํ๊ธฐ ์ํด ์์์ผ ํ๋ ์ ๋ณด๋ $i-1$๋ฒ์งธ ์ง์ ์์ด๋ค. ๋ฐ๋ผ์ $\text{DP}[i][j]$๋ฅผ $i$๋ฒ์งธ ์น ํ์ ๋, ์ง์ ์์ด $j$์ธ ๊ฒฝ์ฐ (๋นจ, ์ด, ํ)๋ก ์ ์ํ๋ฉด ์ ํ์์ ๋ค์๊ณผ ๊ฐ๋ค. $\text{DP}[i][j] = min_{c \neq j}{\text{DP}[i-1][c] +\text{cost}[i][j]}$ ๐ป ํ์ด # ์ฝ๋ (C++): void solve(){ cin >> N; rep(i, 0, N) rep(j, 0, 3) cin >> cost[i][j]; rep(i, 1, N+1) rep(j, 0, 3) DP[i][j] = 1e18; rep(i, 0, N) rep(cur, 0, 3) rep(nxt, 0, 3) if(cur != nxt) DP[i+1][nxt] = min(DP[i+1][nxt], DP[i][cur] + cost[i][nxt]); cout << min({DP[N][0], DP[N][1], DP[N][2]}); } ๐ ๊ตฌํ ์ฝ๋ ์ ๊ธ
·164 words·1 min
๐ ๋ฌธ์ ์ ๋ณด # ๋งํฌ: https://www.acmicpc.net/problem/11066 ๐ง ๊ด์ฐฐ ๋ฐ ์ ๊ทผ # ํ์ผ $C_i, C_{i+1}, \cdots, C_{j}$๋ฅผ ํฉ์น๊ณ ์ถ๋ค๊ณ ํ์. ์ด๋, ํด๋น ๊ฐ์ $\text{DP}[i][j] = min_{i \leq k < j}(\text{DP}[i][k] + \text{DP}[k+1][j])$์ด ์ฑ๋ฆฝํ๋ค. ์ด๋ $O(N^3)$์ด๋ฏ๋ก ์ถฉ๋ถํ ๋๋ค. ์ด๋ฐ ๋ฌธ์ ๋ top-down ์ฌ๊ท DP๋ก ๊ตฌํํ๋ฉด ์กฐ๊ธ ๋ ํธํ๊ฒ ์งค ์ ์๋ค. TMI) ํฌ๋์ค ์ต์ ํ๋ฅผ ์ด์ฉํด ๋ ๋น ๋ฅด๊ฒ๋ ํ ์ ์๋ค! ๐ป ํ์ด # ์ฝ๋ (C++): ll calc(int L, int R){ if(L == R) return 0; ll &ret = DP[L][R]; if(ret != -1) return ret; ret = LLONG_MAX; rep(k, L, R) ret = min(ret, calc(L, k) + calc(k+1, R) + (pfsum[R] - pfsum[L-1])); return ret; } void solve(){ cin >> N; rep(i, 1, N+1) cin >> C[i]; rep(i, 1, N+1) pfsum[i] = pfsum[i-1] + C[i]; rep(i, 1, N+1) rep(j, 1, N+1) DP[i][j] = -1; cout << calc(1, N) << '\n'; } ๐ ๊ตฌํ ์ฝ๋ ์ ๊ธ
·109 words·1 min
๐ ๋ฌธ์ ์ ๋ณด # ๋งํฌ: https://www.acmicpc.net/problem/11000 ๐ง ๊ด์ฐฐ ๋ฐ ์ ๊ทผ # ๊ฐ ๊ฐ์๋ฅผ ์ ๋ถ์ด๋ผ๊ณ ์๊ฐํ๋ฉด, ์ ๋ถ์ด ๊ฐ์ฅ ๋ง์ด ๊ฒน์ณ์ง ํ์ด๋ฐ์ด ๊ฐ์ฅ ๋ง์ ๊ฐ์์ค์ ํ์๋ก ํ๋ ํ์ด๋ฐ์ผ ๊ฒ์ด๋ค. ์ค์ํ์ ์ฌ์ฉํด์ ์ด๋ฅผ ๊ณ์ฐํ์. ๐ป ํ์ด # ์ฝ๋ (C++): void solve(){ int N; cin >> N; vector<pair<int, bool>> events; // {time, isStart} rep(i, 0, N){ events.push_back({s, true}); events.push_back({e, false}); } sort(all(events)); int ans = 0, cnt = 0; for(auto [time, isStart]: events){ if(isStart) cnt++; else cnt--; ans = max(ans, cnt); } cout << ans; } ๐ ๊ตฌํ ์ฝ๋ ์ ๊ธ
·292 words·2 mins
๐ ๋ฌธ์ ์ ๋ณด # ๋งํฌ: https://www.acmicpc.net/problem/31498 ๐ง ๊ด์ฐฐ ๋ฐ ์ ๊ทผ # ์ง - ํ ์นด - ๋๋์ด ํํ๋ก ์๋ ๊ฒ ๊ฐ๋ค. ๋งค ์ํ๋ง๋ค ํ ์นด๋ $B, B-K, B-2*K \cdots$ ๋งํผ ์์ง์ด๊ณ , ๋๋์ด๋ $D$๋งํผ ๊ณ์ ์์ง์ธ๋ค. ํ ์นด๊ฐ ์กํ๋ค๋ฉด, ๊ทธ ์๊ฐ ํ ์นด๊ฐ ์์ง์ธ ๊ธธ์ด๋ $D$๋ณด๋ค ์์ ๊ฒ์ด๋ค. ๋ฐ๋ผ์ ํ ์นด๊ฐ ์ด๋ ์๊ฐ ์กํ๋ค๋ฉด, ํ ์นด์ ๋๋์ด๊ฐ ๊ณ์ ์์ง์ธ๋ค๊ณ ๊ฐ์ ํ๋ฉด ๋๋์ด๋ ํ ์นด๋ณด๋ค ํจ์ฌ ์ผ์ชฝ์ ์๊ฒ ๋๋ค. ๋ฐ๋ผ์ ์๊ฐ์ ํ ์นด์ ๋๋์ด์ ์์น์ ๋จ์กฐ์ฑ์ด ์กด์ฌํ๋ค. ์ด๋ถ ํ์์ ์ด์ฉํ ์ ์๊ฒ ๋ค. ํ ์นด๊ฐ ์ง์ ๋์ฐฉํ์ง๋ ๋ชปํ๋ ์ํฉ, $K$๊ฐ 0์ธ์ํฉ ๋ฑ ์ฌ๋ฌ๊ฐ์ง ์์ธ ์ํฉ์ ์กฐ์ฌํ์. ๐ป ํ์ด # ์ฝ๋ (python): A, B = map(int, input().split()) C, D = map(int, input().split()) K = int(input()) # ํ ์นด๊ฐ ์ง์ ๋์ฐฉํ ์๋ ์๋๊ฐ? # B + (B-K) + (B-2K) + ... >= A if K > 0: # K = 0์ด๋ฉด ๋ฌด์กฐ๊ฑด ๋์ฐฉํ ์ ์์ cnt = B // K # B - cnt * K >= 0 ์ธ ์ต๋ cnt tot = B * (cnt + 1) - K * (cnt * (cnt + 1)) // 2 # B + (B-K) + ... + (B - cnt * K) if tot < A: print(-1) exit(0) # ํ ์นด๊ฐ ์ง์ ๋์ฐฉํ๋ ํ์ด๋ฐ์ด ๋๋์ด๋ณด๋ค ์ด๋ฅธ๊ฐ? def toka_move(time): if K > 0: time = min(time, B // K + 1) return B * time - K * (time * (time - 1)) // 2 ok, ng = 10**12, 0 # ํ ์นด๊ฐ ์ง์ ๋์ฐฉํ๋ ๊ฐ์ฅ ๋น ๋ฅธ ํ์ด๋ฐ while ok - ng > 1: mid = (ok + ng) // 2 if toka_move(mid) >= A: ok = mid else: ng = mid if D*ok < A + C: # ์์ง ๋๋์ด๊ฐ ๋์ฐฉํ์ง ์์๋ค๋ฉด print(ok) else: print(-1) ๐ ๊ตฌํ ์ฝ๋ ์ ๊ธ