๊ตฌ๋ฆ„ํ†ค ์ฑŒ๋ฆฐ์ง€ 2์ฃผ ์ฐจ ํ•™์Šต ์ผ๊ธฐ - 1
ย - Last update: 2023-08-21

๊ตฌ๋ฆ„ํ†ค ์ฑŒ๋ฆฐ์ง€๋ž€?

๊ตฌ๋ฆ„ ์ด๋ผ๋Š” ๊ณณ์—์„œ ๋ฌธ์ œ ํ’€์ด ์ฑŒ๋ฆฐ์ง€(๊ตฌ๋ฆ„ํ†ค ์ฑŒ๋ฆฐ์ง€)๋ฅผ ํ•œ๋‹ค๊ณ  ํ•ด์„œ ์ฐธ์—ฌ ์ค‘์ด๋‹ค. ์ด๋ฒคํŠธ ๊ธฐ๊ฐ„ ๋™์•ˆ ๋ฌธ์ œ๊ฐ€ ๊พธ์ค€์ด ์˜ฌ๋ผ์˜ค๋ฉฐ, ์ฃผ์— 2ํšŒ์”ฉ (ํ˜น์€ ๊ทธ ์ด์ƒ) ์ฑŒ๋ฆฐ์ง€ ๋ฌธ์ œ๋“ค์— ๋Œ€ํ•ด ํ’€์ด๊ฐ€ ๊ฐ€๋Šฅํ•œ ๋ฌธ์ œ๋“ค์„ ํ’€์ดํ•ด๋ณด๊ณ , ํ›„๊ธฐ๋ฅผ ๋‚จ๊ฒจ๋ณด๋ ค๊ณ  ํ•œ๋‹ค.

๋ฌธ์ œ ํ’€์ด

ํ’€์ด ์ ‘๊ทผ

์ด ๋ฌธ์ œ์˜ ๊ฒฝ์šฐ 1์ฃผ์ฐจ๋ณด๋‹ค ๋‚œ์ด๋„๊ฐ€ ์žˆ๋Š” ๋ฌธ์ œ์ด์ง€๋งŒ, ์—ฌ์ „ํžˆ ํŠน๋ณ„ํ•œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‚ฌ์šฉํ•œ๋‹ค๊ธฐ๋ณด๋‹ค๋Š” PS์˜ ๊ธฐ์ดˆ๊ฐ€ ๋˜๋Š” ์™„์ „ํƒ์ƒ‰์„ ํ•ด์„œ ํ’€์ดํ•˜๋Š” ๋ฌธ์ œ์ด๋‹ค. ๋ฌธ์ž์—ด์„ 3๋ถ€๋ถ„์œผ๋กœ ํ•˜๋‚˜ ์ด์ƒ์˜ ๋ฌธ์ž์—ด์„ ํฌํ•จํ•ด์„œ ๋‚˜๋ˆ„๋Š” ๊ฒƒ์˜ ์™„์ „ํƒ์ƒ‰์€ ์ผ์ข…์˜ well-known ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋‹ค. ๋น ์ง์—†์ด ๋ชจ๋“  ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ์ˆœํšŒํ•˜๋ ค๋ฉด, ์‚ฌ์ด๋ฅผ ์นธ๋ง‰์ด ์น˜๋Š” ๋А๋‚Œ์œผ๋กœ ๋ณ€์ˆ˜ i, j๋ฅผ ๋„์ž…ํ•˜๋ฉด ๋˜๋Š”๋ฐ, i๋Š” [1,Nโˆ’1)[1, N - 1) ๋ฒ”์œ„๋กœ, j๋Š” [i+1,N)[i + 1, N) ๋ฒ”์œ„๋กœ ์ˆœํšŒํ•ด์ฃผ๋ฉด ๋œ๋‹ค.

2์ค‘ ๋ฃจํ”„๋ฅผ ๋„๋Š” ํ’€์ด๋กœ ๋ณด์—ฌ์„œ ์‹œ๊ฐ„๋ณต์žก๋„๊ฐ€ O(N2)O(N^2)์œผ๋กœ ๋ณด์ด์ง€๋งŒ, ์‚ฌ์‹ค substr์˜ ์‹œ๊ฐ„๋ณต์žก๋„๊ฐ€ O(N)O(N)์ด๊ธฐ ๋•Œ๋ฌธ์—, ์•„๋ž˜ ์ƒ˜ํ”Œ ์ฝ”๋“œ์˜ ์ „์ฒด ์‹œ๊ฐ„๋ณต์žก๋„๋Š” O(N3)O(N^3)์ด ๋œ๋‹ค. ์–ด๋ผ? ๋„ˆ๋ฌด ํฐ ๊ฑฐ ์•„๋‹Œ๊ฐ€? ์‹ถ์ง€๋งŒ ์ด ๋น„ํšจ์œจ์ ์ธ ์‹œ๊ฐ„๋ณต์žก๋„์—๋„ ๋ฌธ์ œ ์กฐ๊ฑด์—์„œ Nโ‰ค100N \leq 100 ์ด๊ธฐ ๋•Œ๋ฌธ์— ์ถฉ๋ถ„ํžˆ ํ†ต๊ณผํ•˜๋Š” ์ฝ”๋“œ์ด๋‹ค.

์ตœ์ข…์ ์ธ ๋‹ต์„ ๊ตฌํ•˜๊ธฐ ์œ„ํ•ด set ๋‚ด์—์„œ ์ž๊ธฐ ์ž์‹ ์ด ๋ช‡ ๋ฒˆ์งธ์— ์œ„์น˜ํ•˜๋Š”์ง€ ์ฐพ๊ธฐ ์œ„ํ•ด์„œ๋Š” distance ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋˜๊ณ , ๋งŒ์•ฝ NN ์กฐ๊ฑด์ด ๋นก์„ธ๋‹ค๋ฉด, PBDS Set์„ ํ™œ์šฉํ•ด์„œ ์‹œ๊ฐ„๋ณต์žก๋„๋ฅผ ๋” ๋–จ๊ตด ์ˆ˜๋„ ์žˆ๊ฒ ๋‹ค.

์ƒ˜ํ”Œ ์ •๋‹ต ์ฝ”๋“œ

#include <bits/stdc++.h>
using namespace std;
int main() {
int N; scanf("%d", &N);
char buf[110]; scanf("%s", buf);
string full = buf;
set<string> mlist;
for(int i = 1; i < N - 1; ++i) {
for(int j = i + 1; j < N; ++j) {
string a = full.substr(0, i);
string b = full.substr(i, j - i);
string c = full.substr(j);
mlist.insert(a);
mlist.insert(b);
mlist.insert(c);
}
}
int maxidx = 0;
for(int i = 1; i < N - 1; ++i) {
for(int j = i + 1; j < N; ++j) {
string a = full.substr(0, i);
string b = full.substr(i, j - i);
string c = full.substr(j);
int aidx = distance(mlist.begin(), mlist.find(a)) + 1;
int bidx = distance(mlist.begin(), mlist.find(b)) + 1;
int cidx = distance(mlist.begin(), mlist.find(c)) + 1;
if (aidx + bidx + cidx > maxidx) maxidx = aidx + bidx + cidx;
}
}
printf("%d\n", maxidx);
return 0;
}
๐Ÿท๏ธ ์ฃผ์ œ ๋ชฉ๋ก: