Hello Ocean! ๐ŸŒผ

[ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค] ๋ฌธ์ž์—ด ์••์ถ• ๋ณธ๋ฌธ

Algorithm

[ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค] ๋ฌธ์ž์—ด ์••์ถ•

bba_dda 2020. 10. 5. 18:39
๋ฐ˜์‘ํ˜•

๋ฌธ์ œ ์„ค๋ช…

๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ ์ „๋ฌธ๊ฐ€๊ฐ€ ๋˜๊ณ  ์‹ถ์€ ์–ดํ”ผ์น˜๋Š” ๋ฌธ์ž์—ด์„ ์••์ถ•ํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ๊ณต๋ถ€๋ฅผ ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ตœ๊ทผ์— ๋Œ€๋Ÿ‰์˜ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•œ ๊ฐ„๋‹จํ•œ ๋น„์†์‹ค ์••์ถ• ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ๊ณต๋ถ€๋ฅผ ํ•˜๊ณ  ์žˆ๋Š”๋ฐ, ๋ฌธ์ž์—ด์—์„œ ๊ฐ™์€ ๊ฐ’์ด ์—ฐ์†ํ•ด์„œ ๋‚˜ํƒ€๋‚˜๋Š” ๊ฒƒ์„ ๊ทธ ๋ฌธ์ž์˜ ๊ฐœ์ˆ˜์™€ ๋ฐ˜๋ณต๋˜๋Š” ๊ฐ’์œผ๋กœ ํ‘œํ˜„ํ•˜์—ฌ ๋” ์งง์€ ๋ฌธ์ž์—ด๋กœ ์ค„์—ฌ์„œ ํ‘œํ˜„ํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๊ณต๋ถ€ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
๊ฐ„๋‹จํ•œ ์˜ˆ๋กœ aabbaccc์˜ ๊ฒฝ์šฐ 2a2ba3c(๋ฌธ์ž๊ฐ€ ๋ฐ˜๋ณต๋˜์ง€ ์•Š์•„ ํ•œ๋ฒˆ๋งŒ ๋‚˜ํƒ€๋‚œ ๊ฒฝ์šฐ 1์€ ์ƒ๋žตํ•จ)์™€ ๊ฐ™์ด ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ, ์ด๋Ÿฌํ•œ ๋ฐฉ์‹์€ ๋ฐ˜๋ณต๋˜๋Š” ๋ฌธ์ž๊ฐ€ ์ ์€ ๊ฒฝ์šฐ ์••์ถ•๋ฅ ์ด ๋‚ฎ๋‹ค๋Š” ๋‹จ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด, abcabcdede์™€ ๊ฐ™์€ ๋ฌธ์ž์—ด์€ ์ „ํ˜€ ์••์ถ•๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์–ดํ”ผ์น˜๋Š” ์ด๋Ÿฌํ•œ ๋‹จ์ ์„ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ๋ฌธ์ž์—ด์„ 1๊ฐœ ์ด์ƒ์˜ ๋‹จ์œ„๋กœ ์ž˜๋ผ์„œ ์••์ถ•ํ•˜์—ฌ ๋” ์งง์€ ๋ฌธ์ž์—ด๋กœ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ๋ฐฉ๋ฒ•์„ ์ฐพ์•„๋ณด๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, ababcdcdababcdcd์˜ ๊ฒฝ์šฐ ๋ฌธ์ž๋ฅผ 1๊ฐœ ๋‹จ์œ„๋กœ ์ž๋ฅด๋ฉด ์ „ํ˜€ ์••์ถ•๋˜์ง€ ์•Š์ง€๋งŒ, 2๊ฐœ ๋‹จ์œ„๋กœ ์ž˜๋ผ์„œ ์••์ถ•ํ•œ๋‹ค๋ฉด 2ab2cd2ab2cd๋กœ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์œผ๋กœ 8๊ฐœ ๋‹จ์œ„๋กœ ์ž˜๋ผ์„œ ์••์ถ•ํ•œ๋‹ค๋ฉด 2ababcdcd๋กœ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ด๋•Œ๊ฐ€ ๊ฐ€์žฅ ์งง๊ฒŒ ์••์ถ•ํ•˜์—ฌ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.

๋‹ค๋ฅธ ์˜ˆ๋กœ, abcabcdede์™€ ๊ฐ™์€ ๊ฒฝ์šฐ, ๋ฌธ์ž๋ฅผ 2๊ฐœ ๋‹จ์œ„๋กœ ์ž˜๋ผ์„œ ์••์ถ•ํ•˜๋ฉด abcabc2de๊ฐ€ ๋˜์ง€๋งŒ, 3๊ฐœ ๋‹จ์œ„๋กœ ์ž๋ฅธ๋‹ค๋ฉด 2abcdede๊ฐ€ ๋˜์–ด 3๊ฐœ ๋‹จ์œ„๊ฐ€ ๊ฐ€์žฅ ์งง์€ ์••์ถ• ๋ฐฉ๋ฒ•์ด ๋ฉ๋‹ˆ๋‹ค. ์ด๋•Œ 3๊ฐœ ๋‹จ์œ„๋กœ ์ž๋ฅด๊ณ  ๋งˆ์ง€๋ง‰์— ๋‚จ๋Š” ๋ฌธ์ž์—ด์€ ๊ทธ๋Œ€๋กœ ๋ถ™์—ฌ์ฃผ๋ฉด ๋ฉ๋‹ˆ๋‹ค.

์••์ถ•ํ•  ๋ฌธ์ž์—ด s๊ฐ€ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์ฃผ์–ด์งˆ ๋•Œ, ์œ„์— ์„ค๋ช…ํ•œ ๋ฐฉ๋ฒ•์œผ๋กœ 1๊ฐœ ์ด์ƒ ๋‹จ์œ„๋กœ ๋ฌธ์ž์—ด์„ ์ž˜๋ผ ์••์ถ•ํ•˜์—ฌ ํ‘œํ˜„ํ•œ ๋ฌธ์ž์—ด ์ค‘ ๊ฐ€์žฅ ์งง์€ ๊ฒƒ์˜ ๊ธธ์ด๋ฅผ return ํ•˜๋„๋ก solution ํ•จ์ˆ˜๋ฅผ ์™„์„ฑํ•ด์ฃผ์„ธ์š”.

์ œํ•œ์‚ฌํ•ญ

s์˜ ๊ธธ์ด๋Š” 1 ์ด์ƒ 1,000 ์ดํ•˜์ž…๋‹ˆ๋‹ค.
s๋Š” ์•ŒํŒŒ๋ฒณ ์†Œ๋ฌธ์ž๋กœ๋งŒ ์ด๋ฃจ์–ด์ ธ ์žˆ์Šต๋‹ˆ๋‹ค.

์ž…์ถœ๋ ฅ ์˜ˆ

s result
"aabbaccc"  7
"ababcdcdababcdcd"  9
"abcabcdede"  8
"abcabcabcabcdededededede"  14
"xababcdcdababcdcd"  17

์ž…์ถœ๋ ฅ ์˜ˆ์— ๋Œ€ํ•œ ์„ค๋ช…

์ž…์ถœ๋ ฅ ์˜ˆ #1

๋ฌธ์ž์—ด์„ 1๊ฐœ ๋‹จ์œ„๋กœ ์ž˜๋ผ ์••์ถ•ํ–ˆ์„ ๋•Œ ๊ฐ€์žฅ ์งง์Šต๋‹ˆ๋‹ค.

 

์ž…์ถœ๋ ฅ ์˜ˆ #2

๋ฌธ์ž์—ด์„ 8๊ฐœ ๋‹จ์œ„๋กœ ์ž˜๋ผ ์••์ถ•ํ–ˆ์„ ๋•Œ ๊ฐ€์žฅ ์งง์Šต๋‹ˆ๋‹ค.

 

์ž…์ถœ๋ ฅ ์˜ˆ #3

๋ฌธ์ž์—ด์„ 3๊ฐœ ๋‹จ์œ„๋กœ ์ž˜๋ผ ์••์ถ•ํ–ˆ์„ ๋•Œ ๊ฐ€์žฅ ์งง์Šต๋‹ˆ๋‹ค.

 

์ž…์ถœ๋ ฅ ์˜ˆ #4

๋ฌธ์ž์—ด์„ 2๊ฐœ ๋‹จ์œ„๋กœ ์ž๋ฅด๋ฉด abcabcabcabc6de ๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.
๋ฌธ์ž์—ด์„ 3๊ฐœ ๋‹จ์œ„๋กœ ์ž๋ฅด๋ฉด 4abcdededededede ๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.
๋ฌธ์ž์—ด์„ 4๊ฐœ ๋‹จ์œ„๋กœ ์ž๋ฅด๋ฉด abcabcabcabc3dede ๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.
๋ฌธ์ž์—ด์„ 6๊ฐœ ๋‹จ์œ„๋กœ ์ž๋ฅผ ๊ฒฝ์šฐ 2abcabc2dedede๊ฐ€ ๋˜๋ฉฐ, ์ด๋•Œ์˜ ๊ธธ์ด๊ฐ€ 14๋กœ ๊ฐ€์žฅ ์งง์Šต๋‹ˆ๋‹ค.

 

์ž…์ถœ๋ ฅ ์˜ˆ #5

๋ฌธ์ž์—ด์€ ์ œ์ผ ์•ž๋ถ€ํ„ฐ ์ •ํ•ด์ง„ ๊ธธ์ด๋งŒํผ ์ž˜๋ผ์•ผ ํ•ฉ๋‹ˆ๋‹ค.
๋”ฐ๋ผ์„œ ์ฃผ์–ด์ง„ ๋ฌธ์ž์—ด์„ x / ababcdcd / ababcdcd ๋กœ ์ž๋ฅด๋Š” ๊ฒƒ์€ ๋ถˆ๊ฐ€๋Šฅ ํ•ฉ๋‹ˆ๋‹ค.
์ด ๊ฒฝ์šฐ ์–ด๋–ป๊ฒŒ ๋ฌธ์ž์—ด์„ ์ž˜๋ผ๋„ ์••์ถ•๋˜์ง€ ์•Š์œผ๋ฏ€๋กœ ๊ฐ€์žฅ ์งง์€ ๊ธธ์ด๋Š” 17์ด ๋ฉ๋‹ˆ๋‹ค.

ํ’€์ด

์ฒ˜์Œ์— ์–ด๋–ป๊ฒŒ ํ’€์–ด์•ผ ํ• ์ง€ ์ „ํ˜€ ๊ฐ์ด ์˜ค์ง€ ์•Š์•„ ์งˆ๋ฌธํ•˜๊ธฐ๋ฅผ ์ฐธ๊ณ ํ–ˆ๋‹ค. ์‚ฌ๋žŒ๋“ค์ด ๊ฒฐ๊ตญ ์™„์ „ํƒ์ƒ‰(?)๊ณผ ๊ฐ™์€ ๋ชจ๋“  ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ๊ฒ€์‚ฌํ•ด๋ณด๋Š” ๋ฐฉํ–ฅ์œผ๋กœ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•œ ๊ฒƒ ๊ฐ™๊ธธ๋ž˜ ๋งˆ์Œ ๋†“๊ณ  ๋ฐ˜๋ณต๋ฌธ์„ ๋Œ๋ ค๋ณด๊ธฐ๋กœ ํ–ˆ๋‹ค.

์ฃผ๋ชฉํ•  ๋ถ€๋ถ„

1. n์„ 1๋ถ€ํ„ฐ ์ฃผ์–ด์ง„ ๋ฌธ์ž์—ด์˜ ๊ธธ์ด/2๊นŒ์ง€๋งŒ ๋ฐ˜๋ณตํ–ˆ๋‹ค.

๋ฌธ์ž์—ด/2 ๋ณด๋‹ค n์ด ํฌ๋ฉด, ํ•œ ๋ฒˆ ์ž๋ฅด๊ณ  ๋’ค์— ๋‚จ์€ ๋ถ€๋ถ„์„ ๊ทธ๋Œ€๋กœ ๋ถ™์ด๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ€์žฅ ์งง์€ ์••์ถ•๋ฐฉ๋ฒ•์ผ๋ฆฌ ์—†๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

2. answer์˜ ์ดˆ๊ธฐ๊ฐ’์„ 987654321๋กœ ํ–ˆ๋‹ค.

987654321์ด ์•„๋‹ˆ๋ผ int์˜ max๊ฐ’์„ ์ด์šฉํ•ด๋„ ๋  ๊ฒƒ ๊ฐ™๋‹ค
๊ฐ€๋Šฅํ•œ answer์˜ ์ตœ๋Œ€๊ฐ’์€ ๋ฌธ์ž์—ด์˜ ๊ธธ์ด!!์ด๋‹ค ๋”ฐ๋ผ์„œ ์ด๋ ‡๊ฒŒ ํฐ ๊ฐ’์œผ๋กœ ์•ˆํ•˜๊ณ  ๊ทธ๋ƒฅ ์ž…๋ ฅ๋ฐ›์€ ๋ฌธ์ž์—ด ๊ธธ์ด๋กœ ์ดˆ๊ธฐํ™”ํ•ด๋„ ์ถฉ๋ถ„ํ•˜๋‹ค 

3. ๋ฌธ์ž์—ด์„ ํ•œ ๋ฒˆ ํ›‘์„ ๋•Œ, ์ธ๋ฑ์Šค๋ฅผ n๊ฐœ์”ฉ ์ฆ๊ฐ€ํ•˜๋„๋ก ํ–ˆ๋‹ค

์ด๋กœ ์ธํ•ด ๋’ค์— ๋‚จ์€ ๋ฌธ์ž์—ด์˜ ๊ธธ์ด๊ฐ€ n์ดํ•˜์ผ ๊ฒฝ์šฐ ๋ฐ˜๋ณต๋ฌธ์— ๊ฑธ๋ฆฌ์ง€ ์•Š์•„ ๋”ฐ๋กœ ์ฒ˜๋ฆฌํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜์˜€๋‹ค

4. count์˜ ์ž๋ฆฌ์ˆ˜๋ฅผ ์•Œ๊ธฐ ์œ„ํ•ด to_string(count)๋ฅผ ์ด์šฉํ•˜์˜€๋‹ค.

๊ณ„์† 10์œผ๋กœ ๋‚˜๋ˆ ์„œ ์ž๋ฆฟ์ˆ˜๋ฅผ ์•Œ๋ ค์ฃผ๋Š” ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ค๋ป” ํ–ˆ์ง€๋งŒ ๋‹คํ–‰ํžˆ ๋” ์ข‹์€ ๋ฐฉ๋ฒ•์ด ์ƒ๊ฐ๋‚ฌ๋‹ค.

์ œ์ถœ ๊ฒฐ๊ณผ

์œ„์™€ ๊ฐ™์€ ๋ถ€๋ถ„๋“ค์„ ๊ณ ๋ คํ•ด์„œ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ด ๋ณด์•˜๋Š”๋ฐ, 28๊ฐœ์˜ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค ์ค‘์— '5๋ฒˆ'์ผ€์ด์Šค์—์„œ๋งŒ ์˜ค๋‹ต์ด ๋‚˜์™”๋‹ค.
์งˆ๋ฌธํ•˜๊ธฐ๋ฅผ ์‚ดํŽด๋ณธ ๊ฒฐ๊ณผ 5๋ฒˆ ์ผ€์ด์Šค์˜ input์€ 'a'์™€ ๊ฐ™์€ ๊ธธ์ด 1์งœ๋ฆฌ์˜ ๋ฌธ์ž์—ด์ด์—ˆ๋‹ค.
๋”ฐ๋ผ์„œ solutionํ•จ์ˆ˜ ๋‚ด์— ๋ฐ˜๋ณต๋ฌธ์„ ๋Œ๊ธฐ ์ „์— ๋ฌธ์ž์—ด์˜ ๊ธธ์ด๊ฐ€ 1์ด๋ฉด 1์„ returnํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜์˜€๋‹ค.

if (s.size() == 1) //s๊ฐ€ ํ•œ ๊ธ€์ž์ผ ๋•Œ 
        return 1;

์ตœ์ข… ์ฝ”๋“œ

#include <string>
#include <vector>
#include <iostream>
#include <algorithm>
using namespace std;

int solution(string s) {
    int answer = 987654321;
    if (s.size() == 1) //s๊ฐ€ ํ•œ ๊ธ€์ž์ผ ๋•Œ 
        return 1;
    for (int n = 1;n <= s.size() / 2;n++) { //n : ์ž๋ฅด๋Š” ๊ฐœ์ˆ˜
        int ans = 0;
        string temp = "";
        int count = 1;
        for (int i = 0;i < s.size();i += n) {
            if (i == 0) {
                for (int j = 0;j < n;j++)
                    temp += s[j];
                continue;
            }
            if (temp == s.substr(i, n)) { //์ด์ „ n๊ฐœ์™€ ์ง€๊ธˆ n๊ฐœ๊ฐ€ ๊ฐ™์„ ๋•Œ 
                count++; 
                if (i + n >= s.size()) //๋‚จ์•„์žˆ๋Š” ๋ฌธ์ž์—ด์˜ ๊ธธ์ด๊ฐ€ n๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ ๊ฐ™์„ ๋•Œ 
                //๋‚จ๊ฒจ์ง„ ๋ถ€๋ถ„์„ ์„ธ์–ด์ฃผ๊ธฐ ์œ„ํ•จ
                    ans = ans + to_string(count).size() + temp.size(); //count>1์ด๊ธฐ ๋•Œ๋ฌธ์— count๋„ ๊ณ ๋ ค
            }
            else { //์ด์ „ n๊ฐœ์™€ ์ง€๊ธˆ n๊ฐœ๊ฐ€ ๋‹ค๋ฅผ ๋•Œ
                if (count == 1) 
                    ans = ans + temp.size(); 
                else 
                    ans = ans + to_string(count).size() + temp.size(); 
                count = 1; //count ๊ฐฑ์‹ 
                temp = s.substr(i, n); //temp ๊ฐฑ์‹ 
                if (i + n >= s.size()) { //๋‚จ์•„์žˆ๋Š” ๋ฌธ์ž์—ด์˜ ๊ธธ์ด๊ฐ€ n๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ ๊ฐ™์„ ๋•Œ 
                //๋‚จ๊ฒจ์ง„ ๋ถ€๋ถ„์„ ์„ธ์–ด์ฃผ๊ธฐ ์œ„ํ•จ
                    ans = ans + temp.size(); //count==1์ด๊ธฐ ๋•Œ๋ฌธ์— count ๊ณ ๋ ค x
                }
            }
        }
        answer = min(answer, ans);
    }
    return answer;
}
๋ฐ˜์‘ํ˜•