๋˜๊ฒŒ ์˜ค๋žœ๋งŒ์— ํฌ์ŠคํŒ…์„ ์ ๋Š”๊ฒƒ ๊ฐ™๋‹ค. ํšŒ์‚ฌ๋“ค์–ด๊ฐ€๊ธฐ ์ „์—๋Š” ํšŒ์‚ฌ ์ƒํ™œ ํ•˜๋ฉด์„œ๋„ ์ด๊ฑธ ์ž˜ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ์„์ค„ ์•Œ์•˜๋Š”๋ฐ ์—ฌ๋Ÿฌ๋ชจ๋กœ ์–ด๋ ค์šด ์ผ์ด์—ˆ๋‹ค๋Š”๊ฑธ ์•Œ๊ฒŒ๋˜์—ˆ๋‹ค..๐Ÿ˜ญ

ํ•˜์—ฌ๊ฐ„ ์š”์ฆ˜ C๋ฅผ ๋‹ค์‹œ ์—ฐ์Šตํ•˜๊ณ  ์žˆ๊ธฐ๋•Œ๋ฌธ์— Leetcode์— ์‰ฌ์šด ๋ฌธ์ œ๋“ค์„ C๋กœ ํ’€์–ด๋ณด๊ณ  ์žˆ๋‹ค.

์ด๋ฒˆ์— ํ‘ผ ๋ฌธ์ œ๋Š” 14. Longest Common Prefix๋ผ๋Š” ๋ฌธ์ œ์˜€๋‹ค.

์ž…๋ ฅ์œผ๋กœ strsSize๊ฐœ์˜ ๋ฌธ์ž์—ด์ด ๋“ค์–ด์˜ฌ๋•Œ ํ•ด๋‹น ๋ฌธ์ž์—ด๋“ค์˜ ๊ฐ€์žฅ ๊ธด prefix๋ฅผ ์ฐพ๋Š” ๋ฌธ์ œ์˜€๋‹ค.

์ฒซ ๋ฒˆ์งธ ๊ตฌํ˜„ : Two pointer?Permalink

๋‚˜๋Š” ๊ธฐ์กด์˜ Longest Common Prefix์™€ ๋ฌธ์ž์—ด์„ ์ˆœ์„œ๋Œ€๋กœ ๋น„๊ตํ•˜๋ฉฐ ๊ณตํ†ต๋œ prefix๋ฅผ ๊ฐฑ์‹ ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ํƒํ–ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด input์œผ๋กœ strs=[โ€œflowerโ€,โ€flowโ€,โ€flightโ€] ์„ธ ๊ฐœ์˜ ๋ฌธ์ž์—ด์ด ๋“ค์–ด์™”์„๋•Œ๋ฅผ ๊ฐ€์ •ํ•ด๋ณด์ž.

๋จผ์ € common์ด๋ผ๋Š” Longest common prefix๊ฐ’์„ ์ €์žฅํ•  ๋ฌธ์ž์—ด์„ ํ•˜๋‚˜ ๋งŒ๋“ค๊ณ , ํ•ด๋‹น ๋ฌธ์ž์—ด์€ input์˜ ์ฒซ๋ฒˆ์จฐ ๋ฌธ์ž์—ด๋กœ ์ดˆ๊ธฐํ™” ํ•œ๋‹ค.

๋”ฐ๋ผ์„œ ์ดˆ๊ธฐ ์ƒํƒœ์˜ common์€ โ€œflowerโ€, ์ฆ‰ str[0]์˜ ์ฃผ์†Œ๊ฐ’์„ ๊ฐ€๋ฆฌํ‚ค๊ณ  ์žˆ์„๊ฑฐ๋‹ค.

์ดํ›„ ์ด common์„ ๋‹ค์Œ ๋ฌธ์ž์—ด์ธ flow์™€ ํ•œ๊ธ€์ž์”ฉ ๋น„๊ตํ•œ๋‹ค.

์ด ๊ฒฝ์šฐ โ€œflowโ€ 4๊ธ€์ž๊ฐ€ ๊ฐ™์œผ๋ฏ€๋กœ common์„ โ€œflowโ€๋กœ ๊ฐฑ์‹ ํ•œ๋‹ค.

๋‹ค์Œ์œผ๋กœ ๋‹ค์Œ ๋ฌธ์ž์—ด์ธ โ€œflightโ€์™€ common์„ ๋น„๊ตํ•œ๋‹ค.

์ด๊ฒฝ์šฐ โ€œflโ€๊นŒ์ง€ ๊ฐ™์œผ๋ฏ€๋กœ ๊ฒฐ๊ณผ๋Š” โ€œflโ€์ด ๋œ๋‹ค.

๊ตฌ์ƒํ–ˆ์„๋•Œ๋Š” ์ •๋ง ๊ฐ„๋‹จํ•ด๋ณด์ด๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด์—ˆ๋Š”๋ฐ C๋กœ ๊ตฌํ˜„ํ•˜๋ ค๊ณ  ํ•˜๋‹ˆ๊นŒ ๋„ˆ๋ฌด ํž˜๋“ค์—ˆ๋‹ค..

char* longestCommonPrefix(char** strs, int strsSize) {
    char* common = strs[0];

    int common_last = strlen(common);

    for(int i = 1; i<strsSize; i++)
    {
        char* compare = strs[i];

        int common_current =0;
        int compare_current =0;

        while(common_current<common_last && compare_current <common_last)
        {
            if(common[common_current]==compare[compare_current])
            {
                common_current++;
                compare_current++;
            }else{
                if(common_last>common_current)
                    common_last = common_current;
                break;
            }

        }  
    }
    char* res = (char *)malloc(sizeof(char) * (common_last+1));
    strncpy(res,common,common_last);
    res[common_last]='\0';
    return res;
}

๊ฒฐ๊ณผ๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

c๊ฐ€ ๋น ๋ฅด๊ธด ๋น ๋ฅด๋‹ค.

์‹œ๊ฐ„ ๋ณต์žก๋„๋Š” O(n*m)์ด์—ˆ๋Š”๋ฐ ๊ฐœ์„ ํ•  ๋ฐฉ๋ฒ•์ด ์žˆ์„๊ฒƒ ๊ฐ™๊ธฐ๋„ ํ•˜๊ณ .

Memory๊ฐ€ ์˜์™ธ๋กœ ๋” ์ค„์ผ ์ˆ˜ ์žˆ์—ˆ๋‚˜๋ณด๋‹ค.

๋‘ ๋ฒˆ์จฐ ์‹œ๋„ : ๊ฐœ์„ Permalink

๋‹ต์ง€๋ฅผ ๋ณด๋‹ˆ๊นŒ ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ๋Œ€์ถฉ ์ผ๋ฐ˜์ ์ธ ๋ฐฉ๋ฒ•์ด์—ˆ๋˜๊ฒƒ ๊ฐ™๋‹ค.

ํ—‰, ๊ทผ๋ฐ ๋‹ต์•ˆ ์ฝ”๋“œ๋ฅผ ๋ณด๋‹ˆ๊นŒ ๋‚ด๊ฐ€ ๋†“์นœ ๋ถ€๋ถ„๋„ ์žˆ๊ณ , ๋ฏธ์ฒ˜ ์ด๋ ‡๊ฒŒ ๊นŒ์ง€ ์ƒ๊ฐํ•˜์ง€ ๋ชปํ–ˆ๋˜ ๋ถ€๋ถ„์ด ์žˆ๋‹ค.

  1. strstrํ•จ์ˆ˜์‚ฌ์šฉ
  2. ์ž…๋ ฅ ๋ฌธ์ž์—ด ๋ฐฐ์—ด์„ ํ™œ์šฉํ•ด ๋ฆฌํ„ด๊ฐ’ ๋ฐ˜ํ™˜
  3. (minor) ์ž…๋ ฅ ๊ฒ€์ฆ

strstr(st1,st2)Permalink

#include <string.h>
char *strstr(const char *string1, const char *string2);
  • string1์—์„œ string2์˜ ์ฒซ๋ฒˆ์งธ ์ผ์น˜ํ•˜๋Š” ๋ฌธ์ž์—ด์„ ์ฐพ๋Š”๋‹ค.
  • ์ผ์น˜ํ•˜๋Š” ๋ฌธ์ž์—ด์ด ์žˆ๋‹ค๋ฉด ํ•ด๋‹น ์œ„์น˜์˜ ํฌ์ธํ„ฐ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
  • ๊ทธ๋ ‡์ง€ ์•Š๋‹ค๋ฉด NULL์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

+) ๊ฐ‘์ž๊ธฐ ๊ถ๊ธˆํ•ด์ ธ์„œ string2์ž๋ฆฌ์— โ€œโ€œ์„ ๋„ฃ์–ด์„œ ์‹œ๋„ํ•ด๋ณด์•˜๋‹ค.

int main() {
    char* a = "hello";
    char* b = "";
    printf("%c",*strstr(a,b)+1); //output : h
}

ํ .. ์˜์™ธ๋กœ a์˜ ์ฒซ๋ฒˆ์งธ ์ฃผ์†Œ๊ฐ’์ด ๋ฐ˜ํ™˜๋˜์—ˆ๋‹ค.

๊ถ๊ธˆํ•ด์„œ ์™œ๊ทธ๋Ÿฐ๊ฐ€ ํ•˜๊ณ  ๋ดค๋Š”๋ฐ ๋‚ด๋ถ€์ ์œผ๋กœ b๊ฐ€ ๊ณต๋ฐฑ ๋ฌธ์ž๋ฉด ๋ฐ”๋กœ string1์„ ๋ฐ˜ํ™˜ํ•˜๊ฒŒ ๋˜์–ด์žˆ๋‹ค. (stackoverflow)

ํ•˜์—ฌ๊ฐ„ ์ด๊ฑธ๋กœ ๋‹ค์‹œ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ด๋ณด๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

char* longestCommonPrefix(char** strs, int strsSize) {
    if(strsSize==0){
        return 0;
    }
    char* common = strs[0];
    for(int i =0; i<strsSize; i++){
        while(*common){
            if(strstr(strs[i],common)!=strs[i]){
                common[strlen(common)-1]='\0';
            }else{
                break;
            }
        }
        
    }
    return common;
}

์ดด..ใ…‹ใ…‹ใ…‹ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ๋” ๋Š˜์–ด๋ฒ„๋ ธ๋‹ค..

์›๋ž˜ ๋‚ด ์ฝ”๋“œ๋ž‘ ์ ์ ˆํžˆ ์„ž์–ด์„œ ์›๋ž˜ ๋‚ด ์ฝ”๋“œ๋ฒ ์ด์Šค๋กœ ๊ฐœ์„ ์„ ํ•˜๋Š”๊ฒŒ ์„ฑ๋Šฅ ์ธก๋ฉด์—์„œ ๋” ๋‚˜์„๊ฒƒ ๊ฐ™์•„์„œ ์„ธ๋ฒˆ์งธ ์‹œ๋„๋ฅผ ํ–ˆ๋‹ค.

์„ธ๋ฒˆ์งธ ์‹œ๋„ : ์ฒ˜์Œ ์ฝ”๋“œ ์ตœ์ ํ™”Permalink

char* longestCommonPrefix(char** strs, int strsSize) {
    char* common = strs[0];

    int common_last = strlen(common);

    for(int i = 1; i<strsSize; i++)
    {
        char* compare = strs[i];

        int common_current =0;
        int compare_current =0;

        while(common_current<common_last && compare_current <common_last)
        {
            if(common[common_current]==compare[compare_current])
            {
                common_current++;
                compare_current++;
            }else{
                if(common_last>common_current)
                    common_last = common_current;
                break;
            }

        }  
    }
    common[common_last] = '\0';
    return common;
}

๋งˆ์ง€๋ง‰์— res๋ฅผ ๋™์ ํ• ๋‹นํ•˜๋Š” ๋ถ€๋ถ„๋งŒ ๋ณ€๊ฒฝํ–ˆ๋‹ค.

๊ทผ๋ฐ ๊ฒฐ๊ณผ๊ฐ€ ๋‘๋ฒˆ์งธ ์‹œ๋„์™€ ๋น„์Šทํ•˜๊ฒŒ ๋‚˜์™”๋‹ค. ์•„๋งˆ ๋™์ ํ• ๋‹น์€ ํฌ๊ฒŒ ์˜ํ–ฅ์„ ๋ฏธ์น˜๋Š” ๋ถ€๋ถ„์ด ์•„๋‹ˆ์—ˆ๋‚˜๋ณด๋‹ค.

๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰์„ ์–˜๋„ค๊ฐ€ ์–ด๋–ป๊ฒŒ ๊ณ„์‚ฐ์„ ํ•˜๋Š”์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ๋Š”๋ฐ ๋‚˜์ค‘์— ์‹œ๊ฐ„๋‚˜๋ฉด ํ•œ๋ฒˆ ์ฐพ์•„๋ด๋„ ์ข‹์„๊ฒƒ ๊ฐ™๊ธดํ•˜๋‹ค.

๊ฒฐ๋ก Permalink

๊ฒฐ๋ก ์€ ๋‘๋ฒˆ์งธ๊ฐ€ ๊ฐ€์žฅ ๋‚˜์€ ์ฝ”๋“œ๊ฐ™๋‹ค. ์ฒซ๋ฒˆ์งธ๋ณด๋‹ค ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰์ด ๋Š˜๊ธดํ–ˆ์ง€๋งŒ ๊ฐ€๋…์„ฑ๊ณผ ์ฝ”๋“œ ์ˆ˜๊ฐ€ ํ›จ์”ฌ ์ค„์—ˆ๋‹ค.

์˜ค๋Š˜ ๋ฐฐ์šด๊ฑด ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

  • leetcode์—์„œ ๊ฒฐ๊ณผ๋ฐ˜ํ™˜์‹œ input๋ฐฐ์—ด์„ ํ™œ์šฉํ• ์ˆ˜๋„ ์žˆ๋‹ค (๊ทผ๋ฐ ์™ ์ง€๋ชจ๋ฅด๊ฒŒ ์ด๋ฒˆ์—” ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰์ด ๋Š˜์—ˆ๋‹ค.๐Ÿค”๐Ÿค”๐Ÿค”)
  • strstr๋กœ ๋ฌธ์ž์—ด์— ํฌํ•จ๋œ ๋ฌธ์ž์—ด์„ ํƒ์ƒ‰ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ๋ฌธ์ž์—ด ๋๋ถ€๋ถ„์„ dropํ•˜๊ณ  ์‹ถ์„๋•Œ๋Š” strncpy๋ง๊ณ ๋„ ๊ทธ๋ƒฅ ๋๋‚ด๊ณ  ์‹ถ์€ ๋ถ€๋ถ„์— โ€˜\0โ€™์„ ๋„ฃ๋Š”๊ฒƒ๋„ ๋ฐฉ๋ฒ•์ด๋‹ค.(๋‚˜์ค‘์— ๋‘ ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด์„œ๋Š” ๋น„๊ต๋ฅผ ์ข€ ํ•ด๋ด์•ผ๊ฒ ๋‹ค.)

๋Œ“๊ธ€๋‚จ๊ธฐ๊ธฐ