[์ฝ”๋”ฉํ…Œ์ŠคํŠธ ์ค€๋น„] ์นด์นด์˜ค 2020 Recruitment ๋ฌธ์ œ :: ๋ฌธ์ž์—ด ์••์ถ•

2020 KAKAO BLIND RECRUITMENT

๋ฌธ์ž์—ด ์••์ถ•

๋ฌธ์ œ

๋ฌธ์ œ ์„ค๋ช…

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


 

์ฝ”๋“œ

#include <string>
#include <vector>

using namespace std;

int solution(string s) {
    int answer = 1e9;

    for(int i=1; i<=s.length()/2+1; i++){
        string str="";
        int repeat_num=1;
        string repeat_string = s.substr(0,i);
        int index = i;
        while(index<s.length()){
            string tmp_string = "";
            for(int j=0; j<i; j++){
                if(index<s.length())
                    tmp_string +=s[index++];
                else
                    break;
            }
            if(tmp_string==repeat_string){
                repeat_num++;
                continue;
            }else{
                if(repeat_num>1)
                    str += (to_string(repeat_num)+repeat_string);
                else{
                    for(int k=0; k<repeat_num; k++)
                        str+= repeat_string;
                }
                repeat_string = tmp_string;
                repeat_num=1;
            }
        }
        if(repeat_num>1)
            str += (to_string(repeat_num)+repeat_string);
        else{
            for(int k=0; k<repeat_num; k++)
                str+= repeat_string;
        }
        if(str.length()<answer)
            answer = str.length();
    }
    return answer;
}

์ฃผ์˜

for๋ฌธ์˜ ๋ฒ”์œ„๋ฅผ

i<=s.length()/2+1

๊นŒ์ง€๋กœ ์žก์•„์ฃผ์–ด์•ผ ํ•œ๋‹ค. ์•„๋‹ˆ๋ฉด ํ…Œ์ŠคํŠธ์ผ€์ด์Šค 5๋ฒˆ์ด ์‹คํŒจํ•œ๋‹ค.

 

๊ฒฐ๊ณผ

 

ํ’€์ด

์ž…๋ ฅ n์ด 10^3๋ฐ–์— ์•ˆ๋˜๋Š” ๊ฒƒ์„ ๋ณด๊ณ , n^2์œผ๋กœ ํ•˜๋ฉด ์™„์ „ํƒ์ƒ‰์ด ๊ฐ€๋Šฅํ•˜๊ฒ ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์—ฌ ์™„์ „ํƒ์ƒ‰์œผ๋กœ ํ’€์—ˆ๋‹ค.

for(int i=1; i<s.length()/2+1; i++){
    ...
}

์šฐ์„ , ์ฃผ์–ด์ง„ ๋ฌธ์ž์—ด์˜ ๊ธธ์ด 1/2๊นŒ์ง€ ๋ฒ”์œ„๋ฅผ ๋Š˜๋ ค๊ฐ€๋ฉด์„œ ํ•ด๋‹น ๋ฒ”์œ„์— ๋Œ€ํ•œ ๋ฌธ์ž์—ด์˜ ์••์ถ•์„ ์กฐ์‚ฌํ–ˆ๋‹ค.

int repeat_num=1;
string repeat_string = s.substr(0,i);

.
.
.

if(repeat_num>1)
    str += (to_string(repeat_num)+repeat_string);
else{
    for(int k=0; k<repeat_num; k++)
        str+= repeat_string;
    }

์•ž์—์„œ๋ถ€ํ„ฐ ์ฃผ์–ด์ง„ ๋ฒ”์œ„(i)๋งŒํผ์”ฉ ๋Š์–ด์„œ ๋ช‡ ๋ฒˆ ๋ฐ˜๋ณต๋˜๋Š”์ง€(repeat_num) ์กฐ์‚ฌํ•œ ํ›„, ๋ฐ˜๋ณต๋˜๋Š” ์ˆซ์ž์™€ ๋ฐ˜๋ณต๋˜๋Š” ๋ฌธ์ž์—ด์„ ํ•ฉ์ณ์„œ ๊ฒฐ๊ณผ ๋ฌธ์ž์—ด(str)์— ํ‘œ์‹œํ•˜์˜€๋‹ค.

์ด๋Ÿฌํ•œ ๊ณผ์ •์„ ๋ชจ๋“  ๋ฒ”์œ„(i)์— ๋Œ€ํ•ด์„œ ๋ฐ˜๋ณตํ•˜์—ฌ ๊ฐ€์žฅ ์ž‘์€ ๊ฒฐ๊ณผ ๋ฌธ์ž์—ด(str)์˜ ๊ธธ์ด๋ฅผ ๊ตฌํ•˜๋ฉด ์ •๋‹ต์ด ๋œ๋‹ค.

 

๋‹ค๋ฅธ ์‚ฌ๋žŒ์˜ ํ’€์ด

substringํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋ชจ๋‘ vector์— ๋„ฃ์–ด ์ˆœ์„œ๋Œ€๋กœ vector์— ๋‹ด๊ธด ์š”์†Œ๋“ค์„ ์‚ดํŽด๋ณด๋ฉด์„œ ์ •๋‹ต์„ ์ฐพ์„ ์ˆ˜๋„ ์žˆ๋‹ค. ์ด๋ ‡๊ฒŒ ๊ตฌํ˜„ํ•  ๊ฒฝ์šฐ,

  1. ๋ฒ”์œ„๋ฅผ ๊ฒฐ์ •ํ•˜๋Š” for๋ฌธ (n)
  2. ๋ฒ”์œ„๋Œ€๋กœ ๋ฌธ์ž์—ด์„ ๋‚˜๋ˆ„๋Š” for๋ฌธ (n)
  3. ๋‚˜๋ˆ„์–ด์ง„ ๋ฌธ์ž์—ด์„ ๋‹ด์€ vector๋ฅผ ์กฐ์‚ฌํ•˜๋Š” for๋ฌธ (O(n))

์ด๋ ‡๊ฒŒ 3๋ฒˆ์˜ for๋ฌธ์ด ์ƒ๊ธด๋‹ค. ๋”ฐ๋ผ์„œ ์‹œ๊ฐ„๋ณต์žก๋„๊ฐ€ n(n+O(n)) ์ด๋‹ค.

๋‚ด๊ฐ€ ํ•œ ๋ฐฉ๋ฒ•๋ณด๋‹ค ์‹œ๊ฐ„์ด ํ‰๊ท ์ ์œผ๋กœ ๋” ๋น ๋ฅด๊ฒŒ ๋‚˜์™”๋‹ค.

๋ฐ˜์‘ํ˜•