[c++] ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค 42577 :: "์ „ํ™”๋ฒˆํ˜ธ ๋ชฉ๋ก" ํ’€์ด ๋ฐ ์ฝ”๋“œ

๋ฌธ์ œ

์ „ํ™”๋ฒˆํ˜ธ ๋ชฉ๋ก ๋ฌธ์ œ ๋ฐ”๋กœ ๊ฐ€๊ธฐ

 

์ฝ”๋”ฉํ…Œ์ŠคํŠธ ์—ฐ์Šต - ์ „ํ™”๋ฒˆํ˜ธ ๋ชฉ๋ก

์ „ํ™”๋ฒˆํ˜ธ๋ถ€์— ์ ํžŒ ์ „ํ™”๋ฒˆํ˜ธ ์ค‘, ํ•œ ๋ฒˆํ˜ธ๊ฐ€ ๋‹ค๋ฅธ ๋ฒˆํ˜ธ์˜ ์ ‘๋‘์–ด์ธ ๊ฒฝ์šฐ๊ฐ€ ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๋ ค ํ•ฉ๋‹ˆ๋‹ค. ์ „ํ™”๋ฒˆํ˜ธ๊ฐ€ ๋‹ค์Œ๊ณผ ๊ฐ™์„ ๊ฒฝ์šฐ, ๊ตฌ์กฐ๋Œ€ ์ „ํ™”๋ฒˆํ˜ธ๋Š” ์˜์„์ด์˜ ์ „ํ™”๋ฒˆํ˜ธ์˜ ์ ‘๋‘์‚ฌ์ž…๋‹ˆ๋‹ค. ๊ตฌ์กฐ

programmers.co.kr

 

ํ’€์ด

๋ณด์ž๋งˆ์ž ํŠธ๋ผ์ด(Trie)๊ฐ€ ์ƒ๊ฐ๋‚ฌ๋‹ค. ๋ฌธ์ž์—ด ๊ธธ์ด๋„ 20 ์ดํ•˜์ด๋‹ˆ ์ตœ๋Œ€ ๋†’์ด๊ฐ€ 20์ธ ํŠธ๋ฆฌ๋ฅผ ๋งŒ๋“ค๋ฉด ๋  ๊ฒƒ ๊ฐ™๋‹ค. ํ•˜์ง€๋งŒ ์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ ๊ตฌํ˜„์ด ๋„ˆ๋ฌด ๊ท€์ฐฎ๊ธฐ๋„ ํ•˜๊ณ , ์ž…๋ ฅ์˜ ๋ฒ”์œ„๊ฐ€ 10^6์ด๋ผ O(nlgn) ์ดํ•˜๋กœ ํ•œ ๋ฒˆ์— ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š” ์‰ฌ์šด ๋ฐฉ๋ฒ•์ด ์žˆ์ง€ ์•Š์„๊นŒ ์ƒ๊ฐํ–ˆ๋‹ค. ์ •๋ ฌ๋˜์–ด ์žˆ๋Š” phone_book์„ ํ•œ ๋ฒˆ์— ํ›‘์œผ๋ฉด ๋“ฑ์žฅํ–ˆ๋˜ ๋ฌธ์ž์—ด์„ ํฌํ•จํ•˜๊ณ  ์žˆ๋Š” ์ง€๋ฅผ ํ™•์ธํ•˜๋ฉด ๋˜๋Š”๋ฐ, ์ผ๋ฐ˜์ ์œผ๋กœ ๋“ฑ์žฅํ–ˆ๋˜ ๋ชจ๋“  ๋ฌธ์ž์—ด์„ ๋‹ค์‹œ ์ˆœํšŒํ•˜๋Š” ๋ฐฉ์‹์€ "์ •๋ ฌ๋น„์šฉ (O(nlgn)) + ์ˆœํšŒ๋น„์šฉ (O(n^2))" ์ด๋ผ ์‹œ๊ฐ„๋ณต์žก๋„๊ฐ€ ์ƒ๋‹นํ•˜๋‹ค. ๋”ฐ๋ผ์„œ, ํ•œ ๋ฒˆ์— ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๊ณต๊ฐ„ ๋ณต์žก๋„๋ฅผ ์ฆ๊ฐ€์‹œํ‚ค๊ณ  ์‹œ๊ฐ„ ๋ณต์žก๋„๋ฅผ ๊ฐ์†Œ ์‹œํ‚ฌ ๋ฐฉํ–ฅ์„ ์ฐพ์•„์•ผ ํ•˜๋Š”๋ฐ ์ด ๋•Œ ์ƒ๊ฐํ•œ ๊ฒƒ์ด map ์ž๋ฃŒ ๊ตฌ์กฐ์ด๋‹ค.

 

{ key : ์ „ํ™”๋ฒˆํ˜ธ, value : ์•„๋ฌด ๊ฐ’ } ์œผ๋กœ ๋˜์–ด์žˆ๋Š” map์„ ์ƒ์„ฑ ํ•œ ํ›„์—, ๊ฐ ์ „ํ™”๋ฒˆํ˜ธ๋ฅผ ์•ž์—์„œ๋ถ€ํ„ฐ ํ•œ ๊ธ€์ž์”ฉ ๋Š˜๋ ค๊ฐ€๋ฉฐ map์— ํ•ด๋‹น ๋ฌธ์ž์—ด์ด ์žˆ๋Š” ์ง€ ๋ณด๋ฉด ๋œ๋‹ค. ์ „ํ™”๋ฒˆํ˜ธ๋Š” 20 ์ดํ•˜์ด๋ฏ€๋กœ "์ •๋ ฌ๋น„์šฉ (O(nlgn)) + ์ˆœํšŒ ๋น„์šฉ (O(n*20))" ์ธ ์ด O(nlgn)์˜ ์‹œ๊ฐ„๋ณต์žก๋„๋กœ ํ•ด๊ฒฐ ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

 

์ฝ”๋“œ

#include <string>
#include <vector>
#include <map>
#include <algorithm>

using namespace std;

bool solution(vector<string> phone_book) {
    map<string, bool> phoneMap;
    
    sort(phone_book.begin(), phone_book.end()); // ์ „ํ™”๋ฒˆํ˜ธ ์ •๋ ฌ
    
    for(int i=0; i<phone_book.size(); i++){
        string phoneNumber = phone_book[i];
        for(int j=1; j<=phoneNumber.size(); j++){
            string str = phoneNumber.substr(0, j); // ํ•œ ๊ธ€์ž์”ฉ ๋Š˜๋ ค๊ฐ€๋ฉฐ
            if(phoneMap[str]) { // ์ด๋ฏธ ๋‚˜์˜จ ์  ์žˆ๋Š” ๋ฒˆํ˜ธ์ธ์ง€ ํ™•์ธ
                return false;
            }
        }
        phoneMap[phoneNumber] = true; // map์— ์ „ํ™”๋ฒˆํ˜ธ ๋“ฑ๋ก
    }
    
    return true;
}

 

 

๊ฒฐ๊ณผ

๋ฐ˜์‘ํ˜•