Skip to main content

Algorithm

BOJ 30449 Reafy ์ˆ˜์—ด

·273 words·2 mins
๐Ÿ“ ๋ฌธ์ œ ์ •๋ณด # ๋งํฌ: https://www.acmicpc.net/problem/30449 ๐Ÿง ๊ด€์ฐฐ ๋ฐ ์ ‘๊ทผ # $R(n)$์˜ ๊ธธ์ด๋Š” ๋ช‡์ผ๊นŒ? $R(1) = 2$์ด๊ณ , $R(k) = R(k-1) + k$์™€ ์„œ๋กœ์†Œ์ธ ์ž์—ฐ์ˆ˜์˜ ๊ฐœ์ˆ˜ ์ธ ๊ฒƒ ๊ฐ™๋‹ค. ์˜ค์ผ๋Ÿฌ ํ”ผํ•จ์ˆ˜์˜ ๋ถ€๋ถ„ํ•ฉ ๊ฐœ์ˆ˜๋ž‘ ๊ฐ™๋‹ค. ์•”ํŠผ ๋‚˜์ด๋ธŒํ•˜๊ฒŒ ๋Œ๋ ค๋ณด๋‹ˆ, 7600459๊ฐœ๊ฐ€ ๋‚˜์˜จ๋‹ค. ์ด๊ฑธ 0.5์ดˆ์•ˆ์— ์ด๊ฑธ ์ •๋ ฌํ•˜๊ณ  ์ฐพ์„?์ˆ˜?์žˆ์„๊นŒ? ใ…‹ใ…‹ ์ˆ˜์—ด์ด ์ขŒ์šฐ๋กœ ๋Œ€์นญ์ธ๊ฑธ ๊ณ ๋ คํ•˜๋ฉด 380๋งŒ๊ฐœ์ •๋„๋งŒ ์ •๋ ฌํ•ด๋„ ๋ ๊ฑฐ๊ฐ™๊ธด ํ•œ๋ฐ… ๊ทธ๋ž˜๋„ ๋นก์„ธ๋ณด์ธ๋‹ค. 0.5์ดˆ๋ผ์„œ ํ .. ๋‹ต์— ๋Œ€ํ•œ ์ด๋ถ„ํƒ์ƒ‰์ด ๋ ๊นŒ? ์‚ฌ์‹ค ๊น”๋”ํ•˜๊ฒŒ ์ด๋ถ„ํƒ์ƒ‰ ํ•˜๊ธฐ ์œ„ํ•ด์„ , ์ •์ˆ˜์กฐ๊ฑด์œผ๋กœ ๋ฐ”๊พธ๋ ค๋ฉด 1~5000์˜ LCM์„ ๊ตฌํ•ด์•ผ ํ•œ๋‹ค.. ์ง„์งœ ๊ฐœ์—๋ฐ” $10^{-4}$์— ๋Œ€ํ•œ ์ •๋ฐ€๋„๊นŒ์ง€๋งŒ ํ•˜๋ฉด ๋˜์ง€ ์•Š์„๊นŒ? ํ•ด๋ดค์ž ๊ฐ€์žฅ ์ž‘์€ ์ˆ˜๋Š” $\frac{1}{5000}$์ด๋‹ˆ๊นŒ… ๋ผ๊ธฐ์—” ๋‘ ๋ถ„์ˆ˜์˜ ์ฐจ๋Š” ๊ฒฐ๊ตญ ๋” ๋นก์„ธ์ง€๋„ค. ํ•ด๋ดค์ž $\frac{1}{5000*4999}$์ธ๊ฑฐ๊ฐ™๊ธด ํ•œ๋ฐ… ์•„๋‹ˆ ์ž ๊น๋งŒ, ์ƒ๊ฐํ•ด๋ณด๋‹ˆ๊นŒ 1~5000์— ๋Œ€ํ•ด์„œ ๋”ฐ๋กœ ์ •๋ ฌํ•˜๋ฉด ์‹œ๊ฐ„๋ณต์žก๋„๊ฐ€ ๊ฝค๋‚˜ ์ค„์–ด๋“œ๋Š”๊ฒƒ๊ฐ™๋‹ค. ์ด๋ ‡๊ฒŒ ํ•ด์„œ ๋‹ต์— ๋Œ€ํ•œ ์ด๋ถ„ํƒ์ƒ‰์„ ํ•ด๋ณผ๊นŒ..? ๋‹ค ์‹คํŒจํ•˜๊ณ , nth_element์™€ short์™€ pragma Ofast์™€ Clang๊นŒ์ง€ ์„ž์€ ์ตœ์ ํ™”๋กœ ํ’€์—‡๋‹ค… ํ•˜ ์ด๊ฒŒ ๋ญํ•˜๋Š” ๋ฌธ์ œ๋ƒ ใ„ฑ- ํ—‰, ์•ž์— ์ตœ๋Œ€๊ณต์•ฝ์ˆ˜๋ฅผ ๊ตฌํ•˜๋Š” ๋ถ€๋ถ„์„ ๋ฐ˜๋ณต๋ฌธ์œผ๋กœ ์ „์ฒ˜๋ฆฌํ•˜๋ฉด ํ›จ์”ฌ ๋น ๋ฅด๊ฒŒ ๋ˆ๋‹ค. ๊ฑฐ๊ธฐ๊ฐ€ ๋ณ‘๋ชฉ์ด์—ˆ๋‹ค๋‹ˆ ๐Ÿ’ป ํ’€์ด # ์ฝ”๋“œ (C++): void solve(){ int N, K; cin >> N >> K; vector<pair<short,short>> v; v.reserve(N * N / 2); v.push_back({0, 1}); v.push_back({1, 1}); rep(i, 1, N+1) rep(j, i+1, N+1){ if(__gcd(i, j) != 1) continue; v.push_back({(short)i, (short)j}); } int sz = (int)v.size(); if(K*2 > sz){ K = sz - K + 1; nth_element(v.begin(), v.begin() + K - 1, v.end(), [](auto& a, auto& b){ return a.first * b.second > a.second * b.first; }); } else { nth_element(v.begin(), v.begin() + K - 1, v.end(), [](auto& a, auto& b){ return a.first * b.second < a.second * b.first; }); } cout << v[K-1].first << " " << v[K-1].second << '\n'; } ๐Ÿ”’ ๊ตฌํ˜„ ์ฝ”๋“œ ์ž ๊ธˆ

BOJ 4817 ๊ด„ํ˜ธ

·351 words·2 mins
๐Ÿ“ ๋ฌธ์ œ ์ •๋ณด # ๋งํฌ: https://www.acmicpc.net/problem/4817 ๐Ÿง ๊ด€์ฐฐ ๋ฐ ์ ‘๊ทผ # ์ตœ๋Œ€ํ•œ ๊ด„ํ˜ธ๋ฅผ ์ œ๊ฑฐํ•ด์•ผ ํ•œ๋‹ค. ๊ด„ํ˜ธ ์•ˆ์— ๋ง์…ˆ์ด ์—†๋‹ค๋ฉด, ํ•ด๋‹น ๊ด„ํ˜ธ๋Š” ์ œ๊ฑฐํ•ด๋„ ๋œ๋‹ค. ์–ด๋–จ ๋•Œ ๊ด„ํ˜ธ๋ฅผ ์‚ด๋ ค์•ผ ํ•˜๋Š”๊ฐ€? $((x+y)z)$์™€ ๊ฐ™์ด, ์–ด๋–ค ๊ด„ํ˜ธ๋กœ ์ด๋ฃจ์–ด์ง„ ๋ง์…ˆ์ด ํฌํ•จ๋œ ์‹๊ณผ ์–ด๋–ค ์‹์ด ๊ณฑํ•ด์ง€๋Š” ๊ฒฝ์šฐ ๋‚จ๊ฒจ์•ผ ํ•œ๋‹ค. ๋ผ๊ณค ํ–ˆ์ง€๋งŒ… ๊ตฌํ˜„์ด ๋งŒ๋งŒ์น˜ ์•Š๋‹ค. ์ด๋ฅผ ์œ„ํ•ด ์ถ”์ƒ ๊ตฌ๋ฌธ ํŠธ๋ฆฌ ๋ผ๋Š”๊ฒƒ์„ ๋ณดํ†ต ์‚ฌ์šฉํ•œ๋‹ค๊ณ  ํ•œ๋‹ค. ๋…ธ๋“œ๋‹จ์œ„๋กœ ์—ฐ์‚ฐ์„ ๋‚˜ํƒ€๋‚ด์ž. ์ด๋•Œ ํŒŒ์‹ฑ ๊ณผ์ •์—์„œ, ์—ฐ์‚ฐ ์šฐ์„ ์ˆœ์œ„๊ฐ€ ๋‚ฎ์€๊ฑธ ๋จผ์ € ํ•ด์•ผํ•œ๋‹ค. (์ƒ์œ„ ๋…ธ๋“œ๊ฐ€ ๋จผ์ € ๊ณ„์‚ฐ๋˜๋ฏ€๋กœ) ๋”ฐ๋ผ์„œ ๋ง์…ˆ -> ๊ณฑ์…ˆ -> ๊ด„ํ˜ธ์˜ ์ˆœ์„œ๋กœ ์ง„ํ–‰ํ•˜์ž. ์‰ฝ์ง€ ์•Š์€๋ฐ.. ์ด๋Ÿฐ ์ƒ๊ฐ๋ณด๋‹ค ํŒŒ์„œ๋ฅผ ๋งŒ๋“œ๋Š” ๊ณผ์ •์ด ์žฌ๋ฐŒ๋‹ค. ์ „์‚ฐ์–ธ์–ดํ•™ ๋ฌธ์ œ๋ฅผ ์ข€๋” ํ’€์–ด๋ณด๋„๋ก ํ•˜์ž. ๐Ÿ’ป ํ’€์ด # ์ฝ”๋“œ (C++): struct Node{ char type; char var; Node *left, *right; Node(char c){ // var type = 'v'; var = c; left = right = nullptr; } Node(char op, Node *l, Node *r){ // op type = 'o'; var = op; left = l; right = r; } }; struct AST{ Node *root; AST(Node *r) : root(r) {} string emit(Node *n, char parOp){ if(n->type == 'v') return string(1, n->var); if(n->var == '+'){ string L = emit(n->left, '+'); string R = emit(n->right, '+'); if(parOp == '*') return "(" + L + "+" + R + ")"; return L + "+" + R; } return emit(n->left, '*') + emit(n->right, '*'); } string toString(){ return emit(root, 0); } }; struct Parser{ const string &S; int pos; Parser(const string &s): S(s), pos(0){} Node *parseVal(){ if(S[pos] == '('){ pos++; Node *node = parsePlus(); pos++; return node; } return new Node(S[pos++]); } Node *parseMul(){ Node *node = parseVal(); while(pos < (int)S.size() && (islower(S[pos]) || S[pos] == '(')){ Node *right = parseVal(); node = new Node('*', node, right); } return node; } Node *parsePlus(){ Node *node = parseMul(); while(pos < (int)S.size() && S[pos] == '+'){ pos++; Node *right = parseMul(); node = new Node('+', node, right); } return node; } AST parse(){ return AST(parsePlus()); } }; void solve(){ string S; while(cin >> S){ Parser parser(S); AST ast = parser.parse(); cout << ast.toString() << "\n"; } } ๐Ÿ”’ ๊ตฌํ˜„ ์ฝ”๋“œ ์ž ๊ธˆ

BOJ 17435 ํ•ฉ์„ฑํ•จ์ˆ˜์™€ ์ฟผ๋ฆฌ

·146 words·1 min
๐Ÿ“ ๋ฌธ์ œ ์ •๋ณด # ๋งํฌ: https://www.acmicpc.net/problem/17435 ๐Ÿง ๊ด€์ฐฐ ๋ฐ ์ ‘๊ทผ # ํ•จ์ˆ˜ $f$๊ฐ€ ์ฃผ์–ด์งˆ ๋•Œ, ์ตœ๋Œ€ $500\,000$๋ฒˆ ํ•ฉ์„ฑํ•œ ๊ฐ’์„ ๊ตฌํ•ด์•ผ ํ•œ๋‹ค. ๋‚˜์ด๋ธŒํ•˜๊ฒŒ ๊ณ„์‚ฐํ•˜๋ฉด $O(QN)$์œผ๋กœ ์‹œ๊ฐ„์ดˆ๊ณผ๋‹ค. ์ „์ฒด๋ฅผ ์ „์ฒ˜๋ฆฌํ•ด๋‘๊ธฐ์—”, ๊ณต๊ฐ„๋ณต์žก๋„๊ฐ€ $O(mN)$์œผ๋กœ ๋„ˆ๋ฌด ์ปค์ง„๋‹ค. ๋”ฐ๋ผ์„œ ์ ๋‹นํžˆ ์ „์ฒ˜๋ฆฌ๋ฅผ ํ•ด๋‘์ž. ์ด๋Š” LCA์—์„œ ํ–ˆ๋˜๊ฒƒ๊ณผ ๊ฐ™์ด, ํฌ์†Œ ๋ฐฐ์—ด๋กœ ๊ฐ€๋Šฅํ•  ๊ฒƒ ๊ฐ™๋‹ค. ๊ฐ ์ •์˜์—ญ์— ๋Œ€ํ•ด $1$๋ฒˆ, $2$๋ฒˆ, $4$๋ฒˆ, $\cdots 2^k$๋ฒˆ ํ•ฉ์„ฑํ•œ ๊ฒฐ๊ณผ๋ฅผ ์ €์žฅํ•ด์„œ ์ฟผ๋ฆฌ๋ฅผ ์ฒ˜๋ฆฌํ•˜์ž. ๐Ÿ’ป ํ’€์ด # ์ฝ”๋“œ (C++): void solve(){ int N; cin >> N; vector<vector<int>> f(20, vector<int>(N+1)); rep(i, 1, N+1) cin >> f[0][i]; rep(k, 1, 20) rep(i, 1, N+1) f[k][i] = f[k-1][f[k-1][i]]; int Q; cin >> Q; while(Q--){ int n, x; cin >> n >> x; rep(k, 0, 20) if(n & (1 << k)) x = f[k][x]; cout << x << "\n"; } } ๐Ÿ”’ ๊ตฌํ˜„ ์ฝ”๋“œ ์ž ๊ธˆ

BOJ 7562 ๋‚˜์ดํŠธ์˜ ์ด๋™

·175 words·1 min
๐Ÿ“ ๋ฌธ์ œ ์ •๋ณด # ๋งํฌ: https://www.acmicpc.net/problem/7562 ๐Ÿง ๊ด€์ฐฐ ๋ฐ ์ ‘๊ทผ # ๊ฐ€์ค‘์น˜๊ฐ€ ์—†์œผ๋‹ˆ, ๊ฐ„๋‹จํ•œ BFS๋กœ ํ’€๋ฆด ๊ฒƒ ๊ฐ™๋‹ค. ์‹œ๊ฐ„๋ณต์žก๋„๋Š” $O(V + E) \approx O(N^2)$์ด๋‹ค. ๐Ÿ’ป ํ’€์ด # ์ฝ”๋“œ (C++): void solve(){ int dx[8] = {-2, -2, -1, -1, 1, 1, 2, 2}; int dy[8] = {-1, 1, -2, 2, -2, 2, -1, 1}; int N; cin >> N; vector<vector<int>> board(N, vector<int>(N, -1)); int sx, sy, ex, ey; cin >> sx >> sy >> ex >> ey; queue<pii> q; q.push({sx, sy}); board[sx][sy] = 0; while(!q.empty()){ auto [cx, cy] = q.front(); q.pop(); if(cx == ex && cy == ey){ cout << board[cx][cy] << "\n"; return; } rep(d, 0, 8){ int nx = cx + dx[d]; int ny = cy + dy[d]; if(nx < 0 || nx >= N || ny < 0 || ny >= N) continue; if(board[nx][ny] == -1){ board[nx][ny] = board[cx][cy] + 1; q.push({nx, ny}); } } } ๐Ÿ”’ ๊ตฌํ˜„ ์ฝ”๋“œ ์ž ๊ธˆ

BOJ 5925 Cow Beauty Pageant

·435 words·3 mins
๐Ÿ“ ๋ฌธ์ œ ์ •๋ณด # ๋งํฌ: https://www.acmicpc.net/problem/5925 ๐Ÿง ๊ด€์ฐฐ ๋ฐ ์ ‘๊ทผ # X๋กœ ๊ทธ๋ ค์ง€๋Š” ์˜์—ญ์ด 3๊ฐœ๊ฐ€ ์žˆ๊ณ , ์ตœ์†Œํ•œ์˜ ๋น„์šฉ์œผ๋กœ ์ด๋“ค์„ ์—ฐ๊ฒฐํ•ด์•ผํ•œ๋‹ค. ๋ฉ€ํ‹ฐ ์†Œ์Šค BFS์™€ ๊ฐ™์€ ๋ง›์œผ๋กœ ๊ฐ€๋Šฅํ•  ๊ฒƒ ๊ฐ™๋‹ค. 3๊ฐœ๋‹ˆ๊นŒ ์ „์ˆ˜์กฐ์‚ฌ ํ•ด๋„ ๋˜๊ฒ ์ง€. ์•„, ๊ทผ๋ฐ ์ข€ ์‚ฌ๊ณ ์ธ ๊ฒฝ์šฐ๊ฐ€ ์žˆ๊ตฌ๋‚˜. ..... ..X.. .X.X. ..... ์œ„์™€ ๊ฐ™์€ ๊ฒฝ์šฐ์—, ํ•˜๋‚˜๋งŒ์œผ๋กœ๋„ ์น ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ ๊ฐ™๋‹ค. ์œ„์™€ ๊ฐ™์€ ๊ฒฝ์šฐ์—, ์„ธ ๊ทธ๋ฃน์ด ํ•œ ์ •์ ์—์„œ ๋ฌด์กฐ๊ฑด ๋ชจ์ด๊ฒŒ ๋œ๋‹ค. ๋”ฐ๋ผ์„œ ๋นˆ ์ •์ ์„ ์žก๊ณ , ๊ฑฐ๊ธฐ์„œ ์„ธ ๊ทธ๋ฃน๊นŒ์ง€์˜ ์ตœ๋‹จ๊ฒฝ๋กœ๋ฅผ ์ด์šฉํ•˜์ž. ๐Ÿ’ป ํ’€์ด # ์ฝ”๋“œ (C++): void solve(){ int N, M; cin >> N >> M; vector<string> S(N); rep(i, 0, N) cin >> S[i]; vector<vector<int>> board(N, vector<int>(M)); int color = 0; rep(i, 0, N) rep(j, 0, M) { if(S[i][j] == 'X' && board[i][j] == 0){ queue<pii> Q; Q.push({i, j}); board[i][j] = ++color; while(!Q.empty()){ auto [cx, cy] = Q.front(); Q.pop(); rep(d, 0, 4){ int nx = cx + dx[d]; int ny = cy + dy[d]; if(nx < 0 || nx >= N || ny < 0 || ny >= M) continue; if(S[nx][ny] == 'X' && board[nx][ny] == 0){ board[nx][ny] = color; Q.push({nx, ny}); } } } } } vector<ll> dists; auto getDist = [&](int c1, int c2) -> ll { vector<vector<int>> dist(N, vector<int>(M, -1)); queue<pii> Q; rep(i, 0, N) rep(j, 0, M){ if(board[i][j] == c1){ dist[i][j] = 0; Q.push({i, j}); } } while(!Q.empty()){ auto [cx, cy] = Q.front(); Q.pop(); rep(d, 0, 4){ int nx = cx + dx[d]; int ny = cy + dy[d]; if(nx < 0 || nx >= N || ny < 0 || ny >= M) continue; if(board[nx][ny] == c2){ return dist[cx][cy]; } if(board[nx][ny] == 0 && dist[nx][ny] == -1){ dist[nx][ny] = dist[cx][cy] + 1; Q.push({nx, ny}); } } } return (ll)1e18; }; rep(i, 1, 4) rep(j, i+1, 4) dists.push_back(getDist(i, j)); sort(all(dists)); ll ans = dists[0] + dists[1]; auto getDist2 = [&](int cx, int cy, int c) -> ll { vector<vector<int>> dist(N, vector<int>(M, -1)); queue<pii> Q; dist[cx][cy] = 0; Q.push({cx, cy}); while(!Q.empty()){ auto [x, y] = Q.front(); Q.pop(); rep(d, 0, 4){ int nx = x + dx[d]; int ny = y + dy[d]; if(nx < 0 || nx >= N || ny < 0 || ny >= M) continue; if(board[nx][ny] == c){ return dist[x][y]; } if(board[nx][ny] == 0 && dist[nx][ny] == -1){ dist[nx][ny] = dist[x][y] + 1; Q.push({nx, ny}); } } } return (ll)1e18; }; rep(i, 0, N) rep(j, 0, M) if(board[i][j] == 0){ ans = min(ans, getDist2(i, j, 1) + getDist2(i, j, 2) + getDist2(i, j, 3) + 1); } cout << ans << "\n"; } ๐Ÿ”’ ๊ตฌํ˜„ ์ฝ”๋“œ ์ž ๊ธˆ

BOJ 33527 ์‹ ์ดŒ ๊ธธ์ฐพ๊ธฐ ์„œ๋น„์Šค

·277 words·2 mins
๐Ÿ“ ๋ฌธ์ œ ์ •๋ณด # ๋งํฌ: https://www.acmicpc.net/problem/33527 ๐Ÿง ๊ด€์ฐฐ ๋ฐ ์ ‘๊ทผ # ๋ญ”๊ฐ€ ์ „๋ฐ˜์ ์œผ๋กœ ์„ธํŒ…์ด BOJ 5214 ํ™˜์Šน์ด ์ƒ๊ฐ๋‚˜๋Š” ๊ฒƒ ๊ฐ™๊ธฐ๋„? ๋‚˜์ด๋ธŒํ•˜๊ฒŒ ๋ˆ๋‹ค๋ฉด, ๊ฐ ๋…ธ์„ ์— ์žˆ์„ ์ˆ˜ ์žˆ๋Š” ์ตœ๋Œ€ ์ •๋ฅ˜์žฅ ์ˆ˜๊ฐ€ 10๋งŒ๊ฐœ๋‹ˆ๊นŒ, ์ด๊ฑธ ๋‹ค ๋Œ๊ธฐ ์‹œ์ž‘ํ•˜๋ฉด ์ƒ๋‹นํžˆ ๋ง‰๋ง‰ํ•ด์ง„๋‹ค. ๊ทธ๋ฆผ์„ ๊ทธ๋ ค์„œ ์–ด๋–ค ์ƒํ™ฉ์ธ์ง€ ๋” ์ž˜ ํŒ๋‹จํ•ด๋ณด์ž. ![[Drawing 2026-02-17 14.06.51.excalidraw.png]] ์ผ๋‹จ ์˜ˆ์ œ 1๋ฒˆ์€ ์ด๋Ÿฐ๋ฐ, ํ . ํ™•์‹คํžˆ ์ •๋ฅ˜์žฅ๋ณด๋‹จ ๋…ธ์„  ๋‹จ์œ„๋กœ ์–ด๋–ป๊ฒŒ ์ž˜ ๋ณด๊ณ ์‹ถ๊ธด ํ•˜๋‹ค. ๋…ธ์„ ์€ ์ด $5 \times X = 500$๊ฐœ์ด๋‹ค. ์ด๋•Œ, ๋…ธ์„ ์˜ ํ™˜์Šน ๊ฐ ์ •๋ฅ˜์žฅ $N$๊ฐœ๋งˆ๋‹ค $\binom{5}{2}$ ๊ฐœ์ด๋ฏ€๋กœ ์ตœ๋Œ€ $100\,000 \times = 1\,000\,000$๊ฐœ์ธ ๊ฒƒ ๊ฐ™๋‹ค. ์ค‘๋ณต๋„ ์ œ๊ฑฐํ• ์ˆ˜๋„ ์žˆ๊ณ . ์•„? ์ด๊ฒŒ ๋…ธ์„ ์ด ์ถฉ๋ถ„ํžˆ ์ ์œผ๋‹ˆ, ํ”Œ๋กœ์ด๋“œ ์›Œ์…œ์ด ๊ฐ€๋Šฅํ•ด๋ณด์ธ๋‹ค. ์ฟผ๋ฆฌ๋Š” ์ •์ ์— ๋Œ€ํ•ด ๋“ค์–ด์˜ค๋‹ˆ, $U_i, V_i$๊ฐ€ ๊ฐ๊ฐ 5๊ฐœ ๋…ธ์„ ์— ์†ํ•˜๋Š” ๊ฒฝ์šฐ 25๊ฐ€์ง€์— ๋Œ€ํ•ด ๋…ธ์„ ์œผ๋กœ ๊ณ„์‚ฐํ•˜๋ฉด ๋  ๊ฒƒ ๊ฐ™๋‹ค. ๐Ÿ’ป ํ’€์ด # ์ฝ”๋“œ (C++): void solve(){ int N, X; cin >> N >> X; vector<array<int, 5>> bus(N); rep(i, 0, N) rep(j, 0, 5) cin >> bus[i][j]; auto toIdx = [&](pii p){ return p.first*X + (p.second - 1); }; vector<vector<int>> dist(5*X, vector<int>(5*X, 1e9)); rep(i, 0, 5*X) dist[i][i] = 0; rep(i, 0, N) rep(j, 0, 5) rep(k, j+1, 5){ int u = toIdx({j, bus[i][j]}), v = toIdx({k, bus[i][k]}); dist[u][v] = dist[v][u] = 1; } rep(k, 0, 5*X) rep(i, 0, 5*X) rep(j, 0, 5*X) dist[i][j] = min(dist[i][j], dist[i][k] + dist[k][j]); int Q; cin >> Q; while(Q--){ int u, v; cin >> u >> v; int ans = 1e9; rep(i, 0, 5) rep(j, 0, 5){ int idx_u = toIdx({i, bus[u-1][i]}), idx_v = toIdx({j, bus[v-1][j]}); ans = min(ans, dist[idx_u][idx_v]); } cout << (ans == 1e9 ? -1 : ans+1) << "\n"; } } ๐Ÿ”’ ๊ตฌํ˜„ ์ฝ”๋“œ ์ž ๊ธˆ

BOJ 32655 ์ถœ๊ตฌ๊ฐ€ ๋ฐ”๋€Œ๋Š” ๋ฏธ๊ถ

·166 words·1 min
๐Ÿ“ ๋ฌธ์ œ ์ •๋ณด # ๋งํฌ: https://www.acmicpc.net/problem/32655 ๐Ÿง ๊ด€์ฐฐ ๋ฐ ์ ‘๊ทผ # ์‹œ์ž‘ ์ •์ ์—์„œ ๊ฐ ์ถœ๊ตฌ๋กœ ๊ฐˆ ์ˆ˜ ์žˆ๋Š” ์ตœ๋‹จ ๊ฒฝ๋กœ๋ฅผ ๊ตฌํ•œ ํ›„, ์—ด๋ฆฌ๋Š” ํƒ€์ด๋ฐ์— ๋งž์ถฐ ๋‚˜๊ฐˆ ์ˆ˜ ์žˆ๋Š” ์ตœ์†Œ ์‹œ๊ฐ„์„ ๊ตฌํ•˜์ž. $KX$์ดˆ ๋‹จ์œ„๋กœ ์ถœ๊ตฌ๊ฐ€ ๋„๋Š”๊ฒŒ ๋กœํ…Œ์ด์…˜ ๋Œ๊ณ , ์ด๋ถ„ํƒ์ƒ‰์œผ๋กœ ๊ทธ ํƒ€์ด๋ฐ์„ ์ฐพ์€ ํ›„ ๊ทธ ๋ธ”๋Ÿญ์—์„œ ๋‚˜๊ฐˆ ์ˆ˜ ์žˆ๋Š”์ง€, ๊ทธ ๋‹ค์Œ๋ธ”๋Ÿญ์—์„œ ๋‚˜๊ฐˆ ์ˆ˜ ์žˆ๋Š”์ง€ ์ฒดํฌํ•˜๋ฉด ๋  ๊ฒƒ ๊ฐ™๋‹ค. ๐Ÿ’ป ํ’€์ด # ์ฝ”๋“œ (C++): void solve(){ ll N, M, K; cin >> N >> M >> K; vector<vector<pll>> links(N+1); rep(i, 0, M){ ll u, v, w; cin >> u >> v >> w; links[u].push_back({v, w}); links[v].push_back({u, w}); } vector<ll> dist(N+1, LLONG_MAX); priority_queue<pll, vector<pll>, greater<pll>> pq; dist[1] = 0; pq.push({0, 1}); while(!pq.empty()){ auto [cd, cur] = pq.top(); pq.pop(); if(dist[cur] < cd) continue; for(auto [nxt, w]: links[cur]){ ll nd = cd + w; if(nd < dist[nxt]){ dist[nxt] = nd; pq.push({nd, nxt}); } } } ๐Ÿ”’ ๊ตฌํ˜„ ์ฝ”๋“œ ์ž ๊ธˆ

BOJ 23807 ๋‘ ๋‹จ๊ณ„ ์ตœ๋‹จ ๊ฒฝ๋กœ 3

·267 words·2 mins
๐Ÿ“ ๋ฌธ์ œ ์ •๋ณด # ๋งํฌ: https://www.acmicpc.net/problem/23807 ๐Ÿง ๊ด€์ฐฐ ๋ฐ ์ ‘๊ทผ # ๋ฌดํ–ฅ๊ทธ๋ž˜ํ”„๊ณ , ์ •ํ•ด์ง„ ์ •์ ์ค‘ ์„ธ๊ฐœ ์ด์ƒ์˜ ์ •์ ์„ ์ง€๋‚˜์•ผ ํ•œ๋‹ค.. ์ด๊ฑธ ๊ฒฝ๋กœ๋กœ ๋‚˜ํƒ€๋‚ด๋ฉด $X \rightarrow P_i \rightarrow P_j \rightarrow P_k \rightarrow Z$์ด ๋  ๊ฒƒ์ด๋‹ค. ์ด๋•Œ, $X$์—์„œ ์‹œ์ž‘ํ•œ ๊ฒฝ๋กœ์™€ $Z$์—์„œ ์‹œ์ž‘ํ•œ ์ตœ๋‹จ ๊ฒฝ๋กœ๋Š” ๋‹ค์ต์ŠคํŠธ๋ผ๋กœ ์‰ฝ๊ฒŒ ๊ณ„์‚ฐํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด์ œ ๊ฐ€์šด๋ฐ $P_j$์—์„œ ์‹œ์ž‘ํ•œ ์ตœ๋‹จ ๊ฒฝ๋กœ๋ฅผ ๊ตฌํ•ด์„œ, ๊ฐ $P_i, P_k$์— ๋Œ€ํ•ด ๊ตฌํ•˜๋ฉด ๋˜๊ฒ ๋‹ค. $O(V+E)$์˜ ๋‹ค์ต์ŠคํŠธ๋ผ๋ฅผ $P \leq 100$๋ฒˆ ๋Œ๋ ค์•ผ ํ•œ๋‹ค. ์กฐ๊ธˆ ๋ฌด๊ฑฐ์šด 4์ฒœ๋งŒ์ •๋„์ผ๊ฑฐ๊ฐ™์€๋ฐ, 6์ดˆ์ œํ•œ์ด๋‹ˆ ์ž˜ ๋Œ๊ฒƒ๊ฐ™๋‹ค. ๐Ÿ’ป ํ’€์ด # ์ฝ”๋“œ (C++): void solve(){ ll N, M; cin >> N >> M; vector<vector<pll>> links(N+1); rep(i, 0, M){ ll u, v, w; cin >> u >> v >> w; links[u].push_back({v, w}); links[v].push_back({u, w}); } int X, Z; cin >> X >> Z; vector<ll> dist_fromX(N+1, 1e18), dist_fromZ(N+1, 1e18); auto dijkstra = [&](ll start, vector<ll> &dist){ priority_queue<pll, vector<pll>, greater<pll>> pq; dist[start] = 0; pq.push({0, start}); while(!pq.empty()){ auto [cd, cur] = pq.top(); pq.pop(); if(cd > dist[cur]) continue; for(auto [nxt, w] : links[cur]){ ll nd = cd + w; if(nd < dist[nxt]){ dist[nxt] = nd; pq.push({nd, nxt}); } } } }; dijkstra(X, dist_fromX); dijkstra(Z, dist_fromZ); int P; cin >> P; vector<int> cand(P); rep(i, 0, P) cin >> cand[i]; ll ans = 1e18; for(int c2: cand){ vector<ll> dist_fromC(N+1, 1e18); dijkstra(c2, dist_fromC); for(int c1: cand) for(int c3: cand){ if(c1 == c2 || c2 == c3 || c1 == c3) continue; ans = min(ans, dist_fromX[c1] + dist_fromC[c1] + dist_fromC[c3] + dist_fromZ[c3]); } } if(ans >= 1e18) ans = -1; cout << ans; } ๐Ÿ”’ ๊ตฌํ˜„ ์ฝ”๋“œ ์ž ๊ธˆ

BOJ 21940 ๊ฐ€์šด๋ฐ์—์„œ ๋งŒ๋‚˜๊ธฐ

·206 words·1 min
๐Ÿ“ ๋ฌธ์ œ ์ •๋ณด # ๋งํฌ: https://www.acmicpc.net/problem/21940 ๐Ÿง ๊ด€์ฐฐ ๋ฐ ์ ‘๊ทผ # ์ผ๋‹จ ๊ฐ€์ค‘์น˜๊ฐ€ ์žˆ๋Š” ๋ฐฉํ–ฅ ๊ทธ๋ž˜ํ”„์ธ๋ฐ.. ์–ด๋–ค ๋„์‹œ $X$์— ๋Œ€ํ•ด ์ค€ํ˜•์ด์™€ ์นœ๊ตฌ๋“ค์ด ์‚ด๊ณ ์žˆ๋Š” ๋ชจ๋“  ๋„์‹œ์— ๋Œ€ํ•ด ์™•๋ณต ์‹œ๊ฐ„์„ ๊ตฌํ•  ์ˆ˜ ์žˆ์„๊นŒ? $N$์ด ์ถฉ๋ถ„ํžˆ ์ž‘์œผ๋ฏ€๋กœ, ํ”Œ๋กœ์ด๋“œ ์›Œ์…œ์„ ์‚ฌ์šฉํ•ด์„œ ๋ชจ๋“  ๋„์‹œ๊ฐ„์˜ ์ด๋™์‹œ๊ฐ„์„ ๊ตฌํ•  ์ˆ˜ ์žˆ๊ฒ ๋‹ค. ์ดํ›„์—๋Š” ๋ชจ๋“  ๋„์‹œ $X$์— ๋Œ€ํ•ด $K$๋ฒˆ์˜ ๊ณ„์‚ฐ์œผ๋กœ ์™•๋ณต์‹œ๊ฐ„๋“ค์˜ ์ตœ๋Œ“๊ฐ’์„ ๊ตฌํ•  ์ˆ˜ ์žˆ๋‹ค. ์‹œ๊ฐ„๋ณต์žก๋„ $O(N^3 + NK)$๋กœ ํ’€๋ฆด ๊ฒƒ ๊ฐ™๋‹ค! ๐Ÿ’ป ํ’€์ด # ์ฝ”๋“œ (C++): void solve(){ cin >> N >> M; rep(i, 0, N) rep(j, 0, N) cost[i][j] = 1e15; rep(i, 0, N) cost[i][i] = 0; rep(i, 0, M){ int u, v, w; cin >> u >> v >> w; u--; v--; cost[u][v] = w; } rep(k, 0, N) rep(i, 0, N) rep(j, 0, N) cost[i][j] = min(cost[i][j], cost[i][k] + cost[k][j]); cin >> K; vector<int> v(K), ans; rep(i, 0, K) cin >> v[i]; ll mn = 1e15; rep(X, 0, N){ ll tmp = 0; for(auto c: v) tmp = max(tmp, cost[X][c-1] + cost[c-1][X]); if(tmp < mn){ mn = tmp; ans.clear(); } if(tmp == mn) ans.push_back(X+1); } for(auto c: ans) cout << c << ' '; } ๐Ÿ”’ ๊ตฌํ˜„ ์ฝ”๋“œ ์ž ๊ธˆ

BOJ 1865 ์›œํ™€

·486 words·3 mins
๐Ÿ“ ๋ฌธ์ œ ์ •๋ณด # ๋งํฌ: https://www.acmicpc.net/problem/1865 ๐Ÿง ๊ด€์ฐฐ ๋ฐ ์ ‘๊ทผ # ๋ฌดํ–ฅ์ธ ๋„๋กœ์™€ ์œ ํ–ฅ์ธ ์›œํ™€์ด ์žˆ๊ณ , ์Œ์ˆ˜ ์‚ฌ์ดํด์ด ์žˆ๋Š”์ง€๋ฅผ ์ฒดํฌํ•˜๋Š” ๋ฌธ์ œ์ด๋‹ค. $N \leq 500$์œผ๋กœ ํฌ์ง€ ์•Š์œผ๋ฏ€๋กœ, ํ”Œ๋กœ์ด๋“œ ์›Œ์…œ๋„ ์ถฉ๋ถ„ํžˆ ๋ˆ๋‹ค. ์ด๊ฑด $O(N^3)$ ํ•˜์ง€๋งŒ ๋ฒจ๋งŒํฌ๋“œ๋กœ $O(VE)$๋กœ ๋” ๋น ๋ฅด๊ฒŒ๋„ ํ’€ ์ˆ˜ ์žˆ๋‹ค. ๋ฒจ๋งŒํฌ๋“œ๊ฐ€ ๋œ๋‹ค๋Š”๊ฑด SPFA๋กœ๋„ ๋” ๋น ๋ฅด๊ฒŒ ํ’€ ์ˆ˜ ์žˆ๋‹ค! ๋‹ค ํ•ด๋ณธ ๊ฒฐ๊ณผ, ํ”Œ๋กœ์ด๋“œ์›Œ์…œ์ด 496ms, ๋ฒจ๋งŒํฌ๋“œ๊ฐ€ 24ms, SPFA๊ฐ€ 12ms๊ฐ€ ๋‚˜์™”๋‹ค. ๐Ÿ’ป ํ’€์ด # ์ฝ”๋“œ (C++): void solve(){ int N, M, W; cin >> N >> M >> W; vector<vector<ll>> cost(N, vector<ll>(N, 1e15)); rep(i, 0, N) cost[i][i] = 0; rep(i, 0, M){ ll u, v, w; cin >> u >> v >> w; u--; v--; cost[u][v] = min(cost[u][v], w); cost[v][u] = min(cost[v][u], w); } rep(i, 0, W){ ll u, v, w; cin >> u >> v >> w; u--; v--; cost[u][v] = min(cost[u][v], -w); } rep(k, 0, N) rep(i, 0, N) rep(j, 0, N) cost[i][j] = min(cost[i][j], cost[i][k] + cost[k][j]); rep(i, 0, N) if(cost[i][i] < 0){ cout << "YES\n"; return; } cout << "NO\n"; } ๐Ÿ”’ ๊ตฌํ˜„ ์ฝ”๋“œ ์ž ๊ธˆ