๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿ”ฅ PS(Problem Solving) ๐Ÿ”ฅ/programmers

[programmers] 2020 kakao, ๋ฌธ์ž์—ด ์••์ถ•

by dar0m! 2020. 5. 12.
 

ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค

์ฝ”๋“œ ์ค‘์‹ฌ์˜ ๊ฐœ๋ฐœ์ž ์ฑ„์šฉ. ์Šคํƒ ๊ธฐ๋ฐ˜์˜ ํฌ์ง€์…˜ ๋งค์นญ. ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค์˜ ๊ฐœ๋ฐœ์ž ๋งž์ถคํ˜• ํ”„๋กœํ•„์„ ๋“ฑ๋กํ•˜๊ณ , ๋‚˜์™€ ๊ธฐ์ˆ  ๊ถํ•ฉ์ด ์ž˜ ๋งž๋Š” ๊ธฐ์—…๋“ค์„ ๋งค์นญ ๋ฐ›์œผ์„ธ์š”.

programmers.co.kr

 

๋ฌธ์ œ

๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ ์ „๋ฌธ๊ฐ€๊ฐ€ ๋˜๊ณ  ์‹ถ์€ ์–ดํ”ผ์น˜๋Š” ๋ฌธ์ž์—ด์„ ์••์ถ•ํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ๊ณต๋ถ€๋ฅผ ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ตœ๊ทผ์— ๋Œ€๋Ÿ‰์˜ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•œ ๊ฐ„๋‹จํ•œ ๋น„์†์‹ค ์••์ถ• ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ๊ณต๋ถ€๋ฅผ ํ•˜๊ณ  ์žˆ๋Š”๋ฐ, ๋ฌธ์ž์—ด์—์„œ ๊ฐ™์€ ๊ฐ’์ด ์—ฐ์†ํ•ด์„œ ๋‚˜ํƒ€๋‚˜๋Š” ๊ฒƒ์„ ๊ทธ ๋ฌธ์ž์˜ ๊ฐœ์ˆ˜์™€ ๋ฐ˜๋ณต๋˜๋Š” ๊ฐ’์œผ๋กœ ํ‘œํ˜„ํ•˜์—ฌ ๋” ์งง์€ ๋ฌธ์ž์—ด๋กœ ์ค„์—ฌ์„œ ํ‘œํ˜„ํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๊ณต๋ถ€ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
๊ฐ„๋‹จํ•œ ์˜ˆ๋กœ 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๋Š” ์•ŒํŒŒ๋ฒณ ์†Œ๋ฌธ์ž๋กœ๋งŒ ์ด๋ฃจ์–ด์ ธ ์žˆ์Šต๋‹ˆ๋‹ค.

 

ํ•ด๊ฒฐ

key point, n๊ฐœ ๋‹จ์œ„๋กœ ์ž๋ฅด๋Š” substring์„ ์ด์šฉํ•œ๋‹ค. 
  1. ๋ฌธ์ž์—ด์„ ์••์ถ•ํ•  n๊ฐœ ๋‹จ์œ„๋Š” 1๋ถ€ํ„ฐ '๋ฌธ์ž์—ด ๊ธธ์ด / 2'๊นŒ์ง€ ๊ฐ€๋Šฅํ•˜๋‹ค. → len
  2. ๋ฌธ์ž์—ด์„ ์••์ถ•ํ•œ ํ›„ ๊ฐ€์žฅ ์งง์€ ๊ฒƒ์˜ ๊ธธ์ด๋ฅผ ์ €์žฅํ•  ๋ณ€์ˆ˜๋ฅผ ans๋ผ๊ณ  ํ•˜๊ณ  ans๋Š” ์ž…๋ ฅ๋ฐ›์€ ๋ฌธ์ž์—ด์˜ ๊ธธ์ด๋กœ ์ดˆ๊ธฐํ™” ์‹œํ‚จ๋‹ค.

    ์™œ๋ƒํ•˜๋ฉด ์ตœ๋Œ€๋Š” 1000์ด์ง€๋งŒ, 1000์œผ๋กœ ์ดˆ๊ธฐ๊ฐ’์œผ๋กœ ์„ค์ •ํ•ด๋‘๋ฉด 'a'๋ผ๋Š” ์ž…๋ ฅ์œผ๋กœ ๋“ค์–ด์™”์„ ๋•Œ 1์ด ์ถœ๋ ฅ๋˜๋Š” ๊ฒƒ์ด์•„๋‹ˆ๋ผ 1000์ด ์ถœ๋ ฅ๋œ๋‹ค. 

    ๋”ฐ๋ผ์„œ, ์ž…๋ ฅ์— ๋”ฐ๋ผ ์ถฉ๋ถ„ํžˆ ๋‹ต์ด ๋  ์ˆ˜ ์žˆ๋Š” '๋ฌธ์ž์—ด์˜ ๊ธธ์ด๋กœ' ์ดˆ๊ธฐํ™”ํ•ด๋‘”๋‹ค. → input.size()
  3. string.substr(์‹œ์ž‘์œ„์น˜, ๋ฌธ์ž์—ด ๊ธธ์ด) ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•˜์—ฌ ์›ํ•˜๋Š” ์‹œ์ž‘์œ„์น˜๋ถ€ํ„ฐ ์›ํ•˜๋Š” ๊ธธ์ด๋งŒํผ์˜ ๋ถ€๋ถ„๋ฌธ์ž์—ด์„ ์ถ”์ถœํ•˜์—ฌ ๋น„๊ตํ•˜๊ธฐ ์‹œ์ž‘ํ•œ๋‹ค. → sub
  4. ์•„๋ž˜ ์ฝ”๋“œ์—์„œ๋Š” ๋‹จ์œ„๋ฅผ i๊ฐœ ๋งŒํผ ๋ณด๊ธฐ ๋•Œ๋ฌธ์— ๋ฌธ์ž์—ด ๊ธธ์ด์— i๊ฐ€ ์˜ค๊ฒŒ ๋œ๋‹ค.
  5. ์—ฐ์†์œผ๋กœ sub์™€ ๊ฐ™์€ ๋ฌธ์ž์—ด์„ ๋งŒ๋‚˜๊ฒŒ ๋œ๋‹ค๋ฉด cnt๋ฅผ ์ฆ๊ฐ€์‹œํ‚จ๋‹ค.
  6. sub์™€ ๋‹ค๋ฅธ ๋ฌธ์ž์—ด์„ ๋งŒ๋‚˜๊ฒŒ ๋œ๋‹ค๋ฉด  cnt์™€ sub๋ฅผ s๋’ค์— ๋ถ™์ธ๋‹ค.

    ๋ฌธ์ž์—ด s๋Š”, ์ž…๋ ฅ์œผ๋กœ ์ฃผ์–ด์ง„ ๋ฌธ์ž์—ด์„ i๊ฐœ ๋‹จ์œ„๋กœ ์ž˜๋ž์„ ๋•Œ ๋งŒ๋“ค์–ด์ง€๋Š” ๋ฌธ์ž์—ด์ด๋‹ค.
    ์ด ๋•Œ cnt๋ฅผ s += cnt ๋กœํ•˜๋ฉด cnt๊ฐ€ 1, 10, 100, 1000 ์ด๋“  ๋ชจ๋‘ 1๊ฐœ๋กœ ์ธ์‹ํ•˜์—ฌ ๋ฌธ์ž์—ด๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๊ณผ์ •์ด ํ•„์š”ํ•˜๋‹ค. → num = to_string(cnt)
  7. ๊ทธ๋ฆฌ๊ณ  ์ตœ๋Œ€์ธ s๋ฅผ ans์— ์ €์žฅ์‹œ์ผœ๋‘๊ณ  
  8. ์œ„์˜ ๋ฐฉ์‹์„ 1๋ถ€ํ„ฐ len๊นŒ์ง€ ๋ฐ˜๋ณตํ–ˆ๋‹ค๋ฉด, ๋ฐ˜๋ณต๋ฌธ์„ ๋‚˜์™€ ans๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.

 

์ฝ”๋“œ

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#include <iostream>
#include <algorithm>
#include <string>
using namespace std;
 
int solution(string input) {
    
    int len = input.length() / 2;
    int ans = input.size();
    for (int i = 1; i <= len; i++) {
        string s = "", num = "";
        int j = i, cnt = 1;
        string sub = input.substr(0, i);
        while (j < input.length()) {
            if (input.substr(j, i) == sub) {
                cnt++;
            }
            else {
                if (cnt > 1) {
                    num = to_string(cnt);
                    s += num;
                }
                s += sub;
                sub = input.substr(j, i);
                cnt = 1;
            }
            j += i;
        }
        if (cnt > 1) {
            num = to_string(cnt);
            s += num;
        }
        s += sub;
        int size = s.length();
        ans = min(ans, size);
    }
    
    return ans;
}
cs

๋Œ“๊ธ€