Hello Ocean! ๐ŸŒผ

[C++/ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค] ๋ณด์„ ์‡ผํ•‘ (2020 ์นด์นด์˜ค ์ธํ„ด์‹ญ) ๋ณธ๋ฌธ

Algorithm

[C++/ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค] ๋ณด์„ ์‡ผํ•‘ (2020 ์นด์นด์˜ค ์ธํ„ด์‹ญ)

bba_dda 2021. 12. 30. 16:05
๋ฐ˜์‘ํ˜•

๋ฌธ์ œ

https://programmers.co.kr/learn/courses/30/lessons/67258

 

์ฝ”๋”ฉํ…Œ์ŠคํŠธ ์—ฐ์Šต - ๋ณด์„ ์‡ผํ•‘

["DIA", "RUBY", "RUBY", "DIA", "DIA", "EMERALD", "SAPPHIRE", "DIA"] [3, 7]

programmers.co.kr

๋ฌธ์ œ ์š”์•ฝ:

๋ณด์„๋“ค์ด ์ผ๋ ฌ๋กœ ์ง„์—ด๋˜์–ด ์žˆ์„ ๋•Œ,

์ง„์—ด๋œ ๋ชจ๋“  ์ข…๋ฅ˜์˜ ๋ณด์„์„ ์ ์–ด๋„ 1๊ฐœ ์ด์ƒ ํฌํ•จํ•˜๋Š” ๊ฐ€์žฅ ์งง์€ ๊ตฌ๊ฐ„์„ ์ฐพ์•„์„œ,

๊ตฌ๊ฐ„์˜ [์‹œ์ž‘ ์ง„์—ด๋Œ€ ๋ฒˆํ˜ธ, ๋ ์ง„์—ด๋Œ€ ๋ฒˆํ˜ธ]๋ฅผ returnํ•ด๋ผ.

 

๊ฐ€์žฅ ์งง์€ ๊ตฌ๊ฐ„์ด ์—ฌ๋Ÿฌ ๊ฐœ๋ผ๋ฉด, ์‹œ์ž‘ ์ง„์—ด๋Œ€๋ฒˆํ˜ธ๊ฐ€ ๊ฐ€์žฅ ์ž‘์€ ๊ตฌ๊ฐ„์„ returnํ•ด๋ผ.

 

์ง„์—ด๋Œ€๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” gems ๋ฐฐ์—ด์˜ ํฌ๊ธฐ๋Š” ์ตœ๋Œ€ 100000์ด๋‹ค.

ํ’€์ด

[code๋กœ ๋งŒ๋“ค๊ธฐ, ๋ณด์„ ์ข…๋ฅ˜ ์„ธ๊ธฐ]

๋ณด์„์˜ ์ข…๋ฅ˜๊ฐ€ ๋ช‡ ๊ฐœ์ธ์ง€ input์—์„œ ์•Œ๋ ค์ฃผ์ง€ ์•Š๋Š”๋‹ค. ๋”ฐ๋ผ์„œ gems๋ฐฐ์—ด์„ ์ˆœํšŒํ•˜๋ฉด์„œ ๋ณด์„์˜ ์ข…๋ฅ˜๋ฅผ countํ•ด์•ผํ•œ๋‹ค.

๋˜ํ•œ, stringํ˜•ํƒœ๋กœ ์—ฐ์‚ฐํ•˜๋Š” ๊ฒƒ์ด ๋ถˆํŽธํ•  ๊ฒƒ์œผ๋กœ ์ƒ๊ฐ๋˜์–ด string์„ code๋กœ ๋ฐ”๊ฟ”์ฃผ์—ˆ๋‹ค. 

 

[์Šฌ๋ผ์ด๋”ฉ ์œˆ๋„์šฐ]

gems๋ฐฐ์—ด์˜ ๊ธธ์ด๊ฐ€ N์ด๋ผ๊ณ  ํ•  ๋•Œ,

๊ฐ๊ฐ์˜ ์‹œ์ž‘์œ„์น˜(i)๋งˆ๋‹ค ๋ชจ๋“  ์ข…๋ฅ˜์˜ ๋ณด์„์„ 1๊ฐœ์ด์ƒ ํฌํ•จํ•˜๋Š” ๊ฐ€์žฅ ์งง์€ ๊ตฌ๊ฐ„์„ ์ฐพ๊ฒŒ๋˜๋ฉด, O(N^2)์˜ ๋ณต์žก๋„๊ฐ€ ๋œ๋‹ค.

gems๋ฐฐ์—ด์˜ ์ตœ๋Œ€ ํฌ๊ธฐ๊ฐ€ 10^5์ด๋ฏ€๋กœ, O(N^2)์˜ ๋ณต์žก๋„์ผ ๋•Œ ์ตœ๋Œ€ 10^10๋ฒˆ ๋Œ๊ธฐ ๋•Œ๋ฌธ์— ํšจ์œจ์„ฑ ํ…Œ์ŠคํŠธ๋ฅผ ํ†ต๊ณผํ•˜์ง€ ๋ชปํ•  ๊ฐ€๋Šฅ์„ฑ์ด ํฌ๋‹ค. 

๊ทธ๋ž˜์„œ ์Šฌ๋ผ์ด๋”ฉ ์œˆ๋„์šฐ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜์˜€๋‹ค. 

 

์•„๋ž˜์˜ ์˜ˆ์‹œ์—์„œ, ๋ณด์„์˜ ์ข…๋ฅ˜๋Š” 0,1,2์˜ ์ด ์„ธ๊ฐ€์ง€ ์ด๋‹ค.

0๋ฒˆ ์ง„์—ด์žฅ์—์„œ ์‹œ์ž‘ํ•˜๋ฉด, 2๋ฒˆ ์ง„์—ด์žฅ๊นŒ์ง€ ๊ตฌ๋งคํ•˜๋ฉด ๋ชจ๋“  ์ข…๋ฅ˜์˜ ๋ณด์„์„ ํฌํ•จํ•œ๋‹ค.

1๋ฒˆ ์ง„์—ด์žฅ์—์„œ ์‹œ์ž‘ํ•˜๋Š” ๊ตฌ๊ฐ„์„ ๊ตฌํ•  ๋•Œ, ์ฒ˜์Œ๋ถ€ํ„ฐ ๋‹ค์‹œ ์„ธ๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ์ด์ „์— ์„ธ์–ด๋†“์€ ๊ฒƒ์„ ํ™œ์šฉํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

0๋ฒˆ ์ง„์—ด์žฅ์„ ๋ฒ„๋ฆฌ๊ณ , ๋’ท๋ถ€๋ถ„์˜ ์ง„์—ด์žฅ์„ ๋ชจ๋“  ์ข…๋ฅ˜์˜ ๋ณด์„์„ ํฌํ•จํ•  ๋•Œ ๊นŒ์ง€ ์„ธ์–ด๋‚˜๊ฐ„๋‹ค. 

 

๊ทธ๋ฆผ์„ ๋ณด๋Š” ๊ฒƒ์ด ์ดํ•ด๊ฐ€ ์‰ฌ์šธ ๊ฒƒ ๊ฐ™๋‹ค!

์Šฌ๋ผ์ด๋”ฉ ์œˆ๋„์šฐ ์˜ˆ์‹œ

 

์ฝ”๋“œ

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

using namespace std;

vector<int> solution(vector<string> gems) {
    vector<int> answer = {1, (int)gems.size()};
    vector<int> gem_codes; // intํ˜•ํƒœ์˜ gems ๋ฐฐ์—ด
    map<string, int> codes;
    
    int code = 0;
    for (string gem: gems) {
        if (codes.count(gem)) 
            gem_codes.push_back(codes[gem]);
        else {
            codes[gem] = code;
            gem_codes.push_back(code++);
        }
    }
    vector<int> have(code);
    int end = 0;
    for (int i=0;i<gem_codes.size();i++) {
        bool flag = true;
        while(find(have.begin(), have.end(), 0) != have.end()) {
            // ๋ชจ๋“  ์ข…๋ฅ˜์˜ ๋ณด์„์„ ํฌํ•จํ•˜๊ธฐ์ „์—, ์ง„์—ด์žฅ์ด ๋๋‚˜๋ฒ„๋ฆฐ ๊ฒฝ์šฐ๋ฅผ ๊ตฌ๋ถ„ํ•˜๊ธฐ ์œ„ํ•จ
            if (end >= gem_codes.size()) {
                flag = false;
                break;
            }
            have[gem_codes[end++]]++;
        }
        if (flag && end - (i + 1) < answer[1] - answer[0]) {
            answer[0] = i+1; answer[1] = end;
        }
        have[gem_codes[i]]--;
    }
    return answer;
}

๊ฒฐ๊ณผ

์ •ํ™•์„ฑ ํ…Œ์ŠคํŠธ
ํšจ์œจ์„ฑ ํ…Œ์ŠคํŠธ

๋ฐ˜์‘ํ˜•