ใ€Š ๊ฒ€ ์ง€ offer ใ€‹

1. ๋ฌธ์ž์—ด ์˜ ๋ฐฐ์—ด
1. 1. ์ œ๋ชฉ
์ œ๋ชฉ ์„ค๋ช…
๋ฌธ์ž์—ด ์„ ์ž…๋ ฅ ํ•˜๊ณ  ์ด ๋ฌธ์ž์—ด ์˜ ๋ชจ๋“  ๋ฐฐ์—ด ์„ ์‚ฌ์ „ ์ˆœ์„œ์— ๋”ฐ๋ผ ์ถœ๋ ฅ ํ•˜ ์‹ญ์‹œ์˜ค.์˜ˆ ๋ฅผ ๋“ค ์–ด ๋ฌธ์ž์—ด abc ๋ฅผ ์ž…๋ ฅ ํ•˜๋ฉด ๋ฌธ์ž a, b, c ๊ฐ€ ๋ฐฐ์—ด ํ•  ์ˆ˜ ์žˆ ๋Š” ๋ชจ๋“  ๋ฌธ์ž์—ด abc, acb, bac, bca, cab ์™€ cba ๋ฅผ ์ถœ๋ ฅ ํ•ฉ ๋‹ˆ ๋‹ค.
์ž…๋ ฅ ์„ค๋ช…
๊ธธ์ด ๊ฐ€ 9 ์„ ๋„˜ ์ง€ ์•Š ๋Š” ๋ฌธ์ž์—ด ์„ ์ž…๋ ฅ ํ•˜ ์‹ญ์‹œ์˜ค. ๋Œ€์†Œ ๋ฌธ์ž ๋งŒ ํฌํ•จ ํ•ฉ ๋‹ˆ ๋‹ค.
1, 2. ํ•ด๋ฒ• 1
์‚ฌ๊ณ : ํ˜„์žฌ ๋ฌธ์ž์—ด Sn ์— ๋”ฐ๋ผ 1 ๋ณด๋‹ค ํฐ ๋ฌธ์ž์—ด Sn + 1 ์„ ๊ณ„์‚ฐ ํ•œ ๋‹ค์Œ ์— Sn + 1 ์„ ํ˜„์žฌ ์ƒํƒœ ๋กœ ํ”„๋กœ ๊ทธ๋ž˜ ๋ฐ ํ•˜์—ฌ ์žฌ ๊ท€์  ์œผ๋กœ ์‹คํ–‰ ํ•ฉ ๋‹ˆ ๋‹ค.
class Solution {
public:
    void sort_str(string &str) {
        for(int i=1 ; i0 && str[j] &rv){
        string s=rv[rv.size()-1];
        int i;
        for(i=s.size()-1 ; i>0 && s[i]<=s[i-1] ;--i)
            ;
        if(i==0) return;
        int j;
        for(j=s.size()-1 ; s[j]<=s[i-1]; --j)
            ;
        swap( s[i-1], s[j] );
        int n=s.size()-1;
        while(n>i)
            swap(s[i++],s[n--]);//         ๏ผ   ๏ผ  ๏ผ๏ผ๏ผ
        rv.push_back(s);
        f(rv);
    }
    
    vector Permutation(string str) {
        vector rv;
        if(str.empty()) return rv;
        sort_str(str);
        rv.push_back(str);
        f(rv);
        return rv;
    }

1.3. ํ•ด๋ฒ• 2 (๊ฒ€ ์ง€ offer ์ฐธ์กฐ)
์ฃผ์˜ ํ•˜ ์„ธ ์š”. ์ œ ๊ฐ€ ๋ณธ ๊ฒƒ ์€ ๊ธฐ๋… ํŒ ์ธ ์„ ๋ณด ์•˜ ๋Š”๋ฐ ์ด ๋ฒ„ ์ „ ์ž‘๊ฐ€ ๊ฐ€ ์ œ์‹œ ํ•œ ์ฝ”๋“œ ๊ฐ€ ํ‹€ ๋ ธ ์Šต ๋‹ˆ ๋‹ค.์ง€์นจ ์ด ์•„๋‹ˆ ๋ผ ๊ฐ’ ์„ ์ „๋‹ฌ ํ•ด ์•ผ ํ•œ๋‹ค.
class Solution {
public:
    vector Permutation(string str) {
        vector rv;
        dfs(rv, str, 0);
        return rv;
    }
    void dfs(vector &rv, string s, size_t start){
        if(start==s.size()) return;
        size_t starth=start;
        while(starth

2. ๋ฐฐ์—ด ์— ๋‚˜ํƒ€ ๋‚œ ํšŸ์ˆ˜ ๊ฐ€ ์ ˆ๋ฐ˜ ์„ ๋„˜ ๋Š” ์ˆซ์ž
2.1. ์ œ๋ชฉ
์ œ๋ชฉ ์„ค๋ช…
๋ฐฐ์—ด ์— ๋‚˜ํƒ€ ๋‚œ ์ˆซ์ž ๊ฐ€ ๋ฐฐ์—ด ๊ธธ์ด ์˜ ์ ˆ๋ฐ˜ ์„ ๋„˜ ์œผ ๋‹ˆ ์ด ์ˆซ์ž ๋ฅผ ์ฐพ ์•„ ๋ณด ์„ธ ์š”.์˜ˆ ๋ฅผ ๋“ค ์–ด ๊ธธ์ด ๊ฐ€ 9 ์ธ ๋ฐฐ์—ด {1, 2, 3, 2, 2, 5, 4, 2} ์„ ์ž…๋ ฅ ํ•˜ ์‹ญ์‹œ์˜ค.์ˆซ์ž 2 ๋Š” ๋ฐฐ์—ด ์—์„œ 5 ๋ฒˆ ๋‚˜ํƒ€ ๋‚˜ ๋ฐฐ์—ด ๊ธธ์ด ์˜ ์ ˆ๋ฐ˜ ์„ ๋„˜ ๊ธฐ ๋•Œ๋ฌธ์— ์ถœ๋ ฅ 2.์กด์žฌ ํ•˜์ง€ ์•Š ์œผ ๋ฉด 0 ์„ ์ถœ๋ ฅ ํ•ฉ ๋‹ˆ ๋‹ค.
2.2. ํ•ด๋ฒ• 1 (๊ฒ€ ์ง€ offer ์ฐธ์กฐ)
ํšŸ์ˆ˜ ๊ฐ€ ์ ˆ๋ฐ˜ ์ด์ƒ ๋‚˜ ์˜จ ์ด์ƒ ์ค‘์œ„ ์ˆ˜ ๋Š” ์› ํ•˜ ๋Š” ๊ฒฐ๊ณผ ์ผ ๊ฒƒ ์ด๋‹ค.๋น„๊ต ํ•˜ ๋Š” ๋ฐฉ์‹ ์„ ํ†ต ํ•ด ํ•œ ๋ฐฐ์—ด ์—์„œ k ๋ฒˆ ์งธ ๋กœ ํฐ ์ˆ˜ ๋ฅผ ๊ตฌํ•˜ ๊ณ  ์ด๋ก  ์  ์œผ๋กœ ๊ฐ€์žฅ ์ข‹ ์€ ์‹œ๊ฐ„ ๋ณต์žก ๋„ ๋Š” O (n) ์ด๋‹ค. ์˜ˆ ๋ฅผ ๋“ค ์–ด 5 ๋ถ„ ๋ฒ• ์ด์ง€ ๋งŒ ์ฝ”๋“œ ๋Š” ๋น„๊ต์  ๋ฒˆ๊ฑฐ๋กญ๋‹ค.์—ฌ๊ธฐ ์„œ ์‚ฌ์šฉ ํ•˜ ๋Š” ๋ฐฉ๋ฒ• ์€ ์ตœ ์•…์˜ ์‹œ๊ฐ„ ๋ณต์žก ๋„ ๋Š” O (n * n) ์ด์ง€ ๋งŒ ํ‰๊ท  ๋ณต์žก ๋„ ์—ญ์‹œ O (n) ์ด๋‹ค.๋น  ๋ฅธ ๋ฐฐ์—ด ์˜ ์‚ฌ์ƒ ์„ ์‚ฌ์šฉ ํ•˜ ๋Š” ๊ฒƒ ๊ณผ ๋น  ๋ฅธ ๋ฐฐ์—ด ์˜ ์ฐจ์ด ์  ์€ ์›๋ž˜ ์˜ ๋ฐฐ์—ด ์„ ๋‘ ๊ฐœ์˜ ๋ฐฐ์—ด ๋กœ ๋‚˜ ๋ˆˆ ํ›„์— ์ด ๋‘ ๊ฐœ์˜ ๋ฐฐ์—ด ์„ ๋ชจ๋‘ ์žฌ ๊ท€์  ์œผ๋กœ ํ˜ธ์ถœ ํ•˜ ๋Š” ๊ฒƒ ์ด๋‹ค. ์—ฌ ๊ธฐ ๋Š” ๊ทธ ์ค‘์˜ ๊ด€์‹ฌ ์ด ์žˆ ๋Š” ๋ฐฐ์—ด ๋งŒ ์žฌ ๊ท€์  ์œผ๋กœ ํ˜ธ์ถœ ํ•˜๋ฉด ๋œ๋‹ค. ๊ทธ๋ž˜์„œ ํ‰๊ท  ์‹œ๊ฐ„ ๋ณต์žก ๋„ ๋Š” ๋น  ๋ฅธ ๋ฐฐ์—ด ์˜ O (nlogn) ๋กœ ์ธํ•ด O (n) ๊ฐ€ ๋˜ ์—ˆ ๋‹ค.
class Solution {
public:
    int MoreThanHalfNum_Solution(vector numbers) {
        if(numbers.empty()) return 0;
        int mid;
        if(numbers.size() < 3)
            mid=numbers[0];
        else{
            m=numbers.size()/2;
            mid=find_middle(numbers,0,numbers.size());
        }
        if(check(numbers,mid))
            return mid;
        return 0;
    }
private:
    int find_middle(vector &numbers, size_t l, size_t r){
        if(r-l ==1) return numbers[l];
        if(r-l ==2){
            if(numbers[l]>numbers[l+1]) swap(numbers[l],numbers[l+1]);
            return numbers[m];
        }
        partial(numbers,l,r);
        size_t i=l;
        size_t j=r-2;
        int pivod=numbers[r-1];
        while(true){
            while(numbers[++i]pivod){}
            if(ii) return find_middle(numbers,i+1,r);
        return numbers[m];
    }
    
    void partial(vector &numbers,size_t l, size_t r){
        size_t middle=(l+r)/2;
        if(numbers[l]>numbers[middle]) swap(numbers[l], numbers[middle]);
        if(numbers[l]>numbers[r-1]) swap(numbers[l],numbers[r-1]);
        if(numbers[middle] &numbers,int rv){
        int count=0;
        for(size_t i=0 ; inumbers.size()/2) return true;
        return false;
    }
    
    int m=0;
};

2.3. ํ•ด๋ฒ• 2 (๊ฒ€ ์ง€ offer ์ฐธ์กฐ)
๋น„๋ก ์šฐ๋ฆฌ ๊ฐ€ ๋ชจ๋“  ๋‹ค๋ฅธ ์ˆ˜ ๋ฅผ ์ด ์ถœํ˜„ ๋นˆ๋„ ๊ฐ€ ๊ฐ€์žฅ ๋†’ ์€ ์ˆ˜ ๋ฅผ ์ƒ์‡„ ํ•˜ ๋” ๋ผ ๋„ ๊ฒฐ๊ตญ ์ด ์ˆ˜ ๋ฅผ ์ƒ์‡„ ํ•  ์ˆ˜ ์—† ๊ธฐ ๋•Œ๋ฌธ์— ๋‹ค์Œ ๊ณผ ๊ฐ™์€ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ด ์žˆ๋‹ค.
class Solution {
public:
    int MoreThanHalfNum_Solution(vector numbers) {
        if(numbers.empty()) return 0;
        int rv;
        int count=0;
        for(int i=0; i < numbers.size() ; ++i){
            if(count==0){
                rv=numbers[i];
                ++count;
            }else if(rv==numbers[i])
                ++count;
            else
                --count;
        }
        if(count==0) return 0;
        if(check(numbers,rv)) return rv;
        return 0;
    }
private:
    bool check(vector &numbers,int rv){
        int count=0;
        for(int i=0; i < numbers.size(); ++i)
            if(rv==numbers[i]) ++count;
        return count>numbers.size()/2;
    }
};

3. ์ฐฝ๊ณ  ์˜ ์••์ถ•, ํŒ ์—… ์‹œํ€€์Šค
3.1. ์ œ๋ชฉ
์ œ๋ชฉ ์„ค๋ช…
๋‘ ๊ฐœ์˜ ์ •์ˆ˜ ์„œ์—ด ์„ ์ž…๋ ฅ ํ•˜ ์‹ญ์‹œ์˜ค. ์ฒซ ๋ฒˆ ์งธ ์„œ์—ด ์€ ์ฐฝ๊ณ  ์˜ ์••์ถ• ์ˆœ ์„œ ๋ฅผ ํ‘œ์‹œ ํ•ฉ ๋‹ˆ ๋‹ค. ๋‘ ๋ฒˆ ์งธ ์„œ์—ด ์ด ์ฐฝ๊ณ  ์˜ ํŒ ์—… ์ˆœ์„œ ์ธ์ง€ ํŒ๋‹จ ํ•˜ ์‹ญ์‹œ์˜ค.์ฐฝ๊ณ  ์— ์Œ“ ์ธ ๋ชจ๋“  ์ˆซ์ž ๊ฐ€ ๊ฐ™ ์ง€ ์•Š๋‹ค ๊ณ  ๊ฐ€์ • ํ•˜ ์„ธ ์š”.์˜ˆ ๋ฅผ ๋“ค ์–ด ์„œ์—ด 1, 2, 3, 4, 5 ๋Š” ํŠน์ •ํ•œ ์Šค ํƒ ์˜ ์•• ์ž… ์ˆœ์„œ ์ด ๊ณ  ์„œ์—ด 4, 5, 3, 2, 1 ์€ ์ด ์Šค ํƒ ์„œ์—ด ์— ๋Œ€์‘ ํ•˜ ๋Š” ํŒ ์—… ์„œ์—ด ์ด์ง€ ๋งŒ 4, 3, 5, 1, 2 ๋Š” ์ด ์Šค ํƒ ์„œ์—ด ์˜ ํŒ ์—… ์„œ์—ด ์ผ ์ˆ˜ ์—†๋‹ค.(์ฃผ์˜: ์ด ๋‘ ์„œ์—ด ์˜ ๊ธธ ์ด ๋Š” ๊ฐ™๋‹ค)
3.2 ํ•ด๋ฒ•
๋ณด์กฐ ์Šค ํƒ ์„ ๋งŒ ๋“ญ ๋‹ˆ ๋‹ค. ์˜ˆ ๋ฅผ ๋“ค ์–ด 12345 ์ˆœ์„œ ๋กœ ์Šค ํƒ ์— ๋“ค ์–ด๊ฐ€ ๋ฉด ์Šค ํƒ ์˜ ์ˆœ์„œ ๊ฐ€ 45321 ์ž… ๋‹ˆ ๋‹ค. ์Šค ํƒ ์ด ๋น„์–ด ์žˆ ์œผ ๋ฉด 1 ์„ ๋ณด์กฐ ์Šค ํƒ ์— ๋“ค ์–ด๊ฐ„ ๋‹ค์Œ ์— ์Šค ํƒ ์˜ ์š” ์†Œ ๋ฅผ ๊ณ„์† ๊ฒ€์‚ฌ ํ•œ ๋‹ค์Œ ์— ๋‘ ๋ฒˆ ์งธ ์„œ์—ด ์˜ ์ฒซ ๋ฒˆ ์งธ ์š”์†Œ ์™€ ๋‹ค๋ฅด๋‹ค ๋Š” ๊ฒƒ ์„ ์•Œ ๊ฒŒ ๋˜ ์—ˆ ์Šต ๋‹ˆ ๋‹ค. ๊ทธ๋ž˜์„œ 2 ๋ฅผ ์Šค ํƒ ์— ๋“ค ์–ด๊ฐ€ ์„œ ์Šค ํƒ ์˜ ์š”์†Œ ๊ฐ€ 4 ์™€ ๊ฐ™ ๋Š” ์ง€ ๋‹ค์‹œ ํ™•์ธ ํ•ฉ ๋‹ˆ ๋‹ค. 4 ๋ฅผ ๋ˆŒ ๋ € ์„ ๋•Œ ์Šค ํƒ ์˜ ๊ผญ๋Œ€๊ธฐ ์š” ์†Œ ๋Š” 4 ์™€ ๊ฐ™ ์œผ ๋ฉด ์Šค ํƒ ์—์„œ ๋‚˜ ์˜ต ๋‹ˆ ๋‹ค.๋˜ํ•œ ์Šค ํƒ ํ›„ ์ƒˆ๋กœ์šด ์Šค ํƒ ๊ผญ๋Œ€๊ธฐ ์š”์†Œ ๊ฐ€ ๋‘ ๋ฒˆ ์งธ ์„œ์—ด ์˜ ๋‹ค์Œ ์š”์†Œ, ์ฆ‰ 5 ์™€ ๊ฐ™ ๋Š” ์ง€ ๋น„๊ต ํ•˜๋ฉด 3 ๊ณผ 5 ๊ฐ€ ๋‹ค ๋ฅด ๋ฉด ์ฒซ ๋ฒˆ ์งธ ์„œ์—ด ์˜ 5 ๋ฅผ ์Šค ํƒ ์— ๋„ฃ ์Šต ๋‹ˆ ๋‹ค.์ƒ์ˆ  ํ•œ ๊ณผ์ • ์€ ์‚ฌ์‹ค์ƒ ์ฐฝ๊ณ  ์—์„œ ๋‚˜ ์™€ ์ฐฝ๊ณ  ์— ๋“ค ์–ด ๊ฐ€ ๋Š” ๊ณผ์ • ์„ ์žฌํ˜„ ํ•˜ ๋Š” ๊ฒƒ ์ด๋‹ค.๋‘ ๋ฒˆ ์งธ ์„œ์—ด ์˜ ์ฆ ๊ฐ€ ๋ฅผ ๊ด€์ฐฐ ํ•˜๋ฉด ๋‘ ๋ฒˆ ์งธ ์„œ์—ด ์˜ ์„ฑ์žฅ ์ด ๊ฐ€์žฅ ๋Š ๋ฆฐ ๊ฒƒ ์ด ๋ถ„๋ช… ํ•˜ ๋‹ค.๋งŒ์•ฝ ์— ๋‘ ๋ฒˆ ์งธ ์„œ์—ด ์ด ์Šค ํƒ ์„œ์—ด ์ด ์•„๋‹ˆ๋ผ๋ฉด ์œ ์ผํ•œ ์ƒํ™ฉ ์€ ์ฒซ ๋ฒˆ ์งธ ์„œ์—ด ์ด ๋ชจ๋‘ ์Šค ํƒ ์— ๋“ค ์–ด ๊ฐ” ์ง€๋งŒ ์Šค ํƒ ๊ผญ๋Œ€๊ธฐ ์š” ์†Œ ๋Š” ๋‘ ๋ฒˆ ์งธ ์„œ์—ด ์—์„œ ์ฒ˜๋ฆฌ ํ•ด ์•ผ ํ•  ์š”์†Œ ์™€ ๋‹ค๋ฅด๋‹ค ๋Š” ๊ฒƒ ์ด๋‹ค.
class Solution {
public:
    bool IsPopOrder(vector pushV,vector popV) {
        vector stack1;
        auto ab=pushV.begin();
        auto bb=popV.begin();
        while(bb != popV.end()){
            if( ab == pushV.end() && stack1[stack1.size()-1] != *bb ) return false;
            if(stack1.empty() || stack1[stack1.size()-1] != *bb )
                stack1.push_back(*ab++);
            else{
                stack1.pop_back();
                ++bb;
            }
        }
        return true;
    }
};

4. ์ตœ์†Œ k ๊ฐœ์ˆ˜
4.1 ์ œ๋ชฉ
์ œ๋ชฉ ์„ค๋ช…
n ๊ฐœ์˜ ์ • ์ˆ˜ ๋ฅผ ์ž…๋ ฅ ํ•˜์—ฌ ๊ทธ ์ค‘์—์„œ ๊ฐ€์žฅ ์ž‘์€ K ๊ฐœ ์ˆ˜ ๋ฅผ ์ฐพ ์•„ ๋ผ.์˜ˆ ๋ฅผ ๋“ค ์–ด 4, 5, 1, 6, 2, 7, 3, 8 ์ด๋ผ๋Š” 8 ๊ฐœ์˜ ์ˆซ์ž ๋ฅผ ์ž…๋ ฅ ํ•˜๋ฉด ๊ฐ€์žฅ ์ž‘์€ 4 ๊ฐœ์˜ ์ˆซ์ž ๋Š” 1, 2, 3, 4 ์ด๋‹ค.
4.2. ํ•ด๋ฒ• 1
stl ์˜ ์šฐ์„  ๋Œ€๊ธฐ ์—ด ๋กœ ์Œ“ ๋Š” ์‹œ๊ฐ„ ๋ณต์žก ๋„ ๋Š” O (n) ์ด ๊ณ  ํ•œ ๋ฒˆ ์ฐพ ๋Š” ์‹œ๊ฐ„ ๋ณต์žก ๋„ ๋Š” O (logn) ์ด ๋ฉฐ k ๋ฒˆ ์€ O (klogn) ์ด๊ธฐ ๋•Œ๋ฌธ์— ์ „์ฒด์ ์ธ ์‹œ๊ฐ„ ๋ณต์žก ๋„ ๋Š” O (n + klogn) ์ด ๊ณ  ๊ณต๊ฐ„ ๋ณต์žก ๋„ ์ž… ๋‹ˆ ๋‹ค.O (n) ์ž… ๋‹ˆ ๋‹ค.
class Solution {
public:
    vector GetLeastNumbers_Solution(vector input, int k) {
        vector return_value;
        if(input.empty() || k <=0 || k>input.size())
            return return_value;
        priority_queue,greater > d(input.begin(),input.end());
        while(k--){
            return_value.push_back(d.top());
            d.pop();
        }
        return return_value;
    }
};

4.3. ํ•ด๋ฒ• 2
๋นจ๋ฆฌ ๋ฐฐ์—ด ํ•˜ ๋Š” ์‚ฌ์ƒ ์€ ์•ž์˜ k ๊ฐœ ์ˆ˜ ๋ฅผ ์ •๋ ฌ ํ•˜ ๋Š” ๊ฒƒ ์ด ๊ณ  ์‹œ๊ฐ„ ๋ณต์žก ๋„ ๋Š” k ์— ๋‹ฌ ๋ ค ์žˆ ์„ ๊ฒƒ ์ด๋‹ค. ์ตœ ์•… ์€ O (n * n) ์ด ๊ณ  ํ‰๊ท  ์ด๋‹ค.์ถ”์ธก ์€ O (n + klogk)
class Solution {
public:
    vector GetLeastNumbers_Solution(vector input, int k) {
        vector rv;
        if( input.empty() || k>input.size() ) return rv;
        partial_sort( input , 0 , input.size() , k );
        for(int i = 0 ; i < k ; ++i) 
            rv.push_back( input[i] );
        return rv;
    }
private:
    void partial_sort(vector &input, int l, int r, int k){
        if(r-l < 2) return;
        if(r-l == 2 ){
            if( input[l] > input[l+1] )
                swap( input[l] , input[l+1] );
            return;
        }
        mid( input, l , r );
        int i=l;
        int j=r-2;
        int pivod = input[r-1];
        while( i < j ) {
            while( input[++i] < pivod ) {}
            while( input[--j] > pivod ) {}
            if( i < j )
                swap( input[i] , input[j] );
            else
                break;
        }
        swap( input[i] , input[r-1] );
        partial_sort( input , l , i , k );
        if( k > i+1 ) partial_sort( input , i+1 , r , k);
    }
    
    void mid(vector &input , int l , int r) {
        int middle = ( l + r )/2;
        if( input[l] > input[r-1] ) swap( input[l] , input[r-1] );
        if( input[l] > input[middle] ) swap( input[l] , input[middle] );
        if( input[r-1] > input[middle] ) swap( input[r-1] , input[middle] );
        swap( input[r-2] , input[middle] );
    }
};

5. ์ตœ๋Œ€ ํ•˜์œ„ ๋ฐฐ์—ด ์˜ ํ•ฉ
class Solution {
public:
    int FindGreatestSumOfSubArray(vector array) {
        int accum=0;
        int max=(1<<31);
        for( int i=0 ; i < array.size() ; ++i ){
            accum+=array[i];
            if(accum > max ) max=accum;
            if(accum < 0 ) accum=0;
        }
        return max;
    }
};

6. ์ •์ˆ˜ ์ค‘ 1 ์ด ๋‚˜ ์˜ค ๋Š” ํšŸ์ˆ˜
๋จผ์ € ๊ทœ์น™ ์ฐพ๊ธฐ: ๊ตฌ๊ฐ„ [0, 9] ์—์„œ ๋‚˜ํƒ€ ๋‚œ ํšŸ์ˆ˜ ๋Š” f (1) = 1 ์ด๋‹ค.๊ตฌ๊ฐ„ [0, 99] ์—์„œ ๋‚˜ํƒ€ ๋‚œ ํšŸ์ˆ˜ ๋Š” f (2) = 10f (1) + 10 ์ด๋‹ค. ์—ฌ๊ธฐ ์„œ 10f (1) ๋Š” ๊ฐœ ์œ„ ๋Š” 1 ์˜ ํšŸ์ˆ˜ ๋ฅผ ๋‚˜ํƒ€ ๋‚ด ๊ณ  10 ์€ 1 ์˜ ํšŸ์ˆ˜ ๋ฅผ ๋‚˜ํƒ€ ๋‚ธ๋‹ค. ์˜ˆ ๋ฅผ ๋“ค ์–ด 10, 11,... 19 ์ด 10 ๊ฐœ์˜ ์ˆ˜ ๋Š” ๋ชจ๋‘ 1 ์ด๋‹ค. ์œ ์ถ” ํ•˜๋ฉด f (1) = 1 ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.f(n)=10f(n-1)+10^(n-1), n>1; ๊ทธ๋ž˜์„œ f (n) ์˜ ํ†ตํ•ญ: f (n) = n10 ^ (n - 1) ๋Š” g (n) ์œผ๋กœ 0 ์—์„œ n ์ค‘ 1 ์ด ๋‚˜ํƒ€ ๋‚˜ ๋Š” ํšŸ์ˆ˜ ๋ฅผ ๋‚˜ํƒ€ ๋‚ธ๋‹ค. ์˜ˆ ๋ฅผ ๋“ค ์–ด g (612372) ๋Š” g (612372) = 6f (5) + 100000 + g (12372), ์˜ˆ ๋ฅผ ๋“ค ์–ด g (112372) = 1f (5) + 12372 + g (12372) ์ด ๋†’ ์€ ์œ„์น˜ ์—์„œ ๋‚ฎ์€ ์œ„์น˜ ๋กœ ๊ณ„์‚ฐ ํ•˜๋ฉด ์ด๊ฒƒ ์€ ์žฌ ๊ท€์  ์ธ ํ•ด๋ฒ• ์ด๋‹ค.๋ฌผ๋ก  ๋‚ฎ์€ ์ž๋ฆฌ ์—์„œ ๋†’ ์€ ์ž๋ฆฌ ๋กœ ๊ณ„์‚ฐ ํ•  ์ˆ˜๋„ ์žˆ ๊ณ  ์ด ๋Ÿด ๋•Œ ๋Š” ์žฌ ๊ท€์  ์ด์ง€ ์•Š ์•„ ๋„ ๋œ๋‹ค.์ฝ”๋“œ ๋„ ๋” ์‰ฌ ์›Œ ์š”.
class Solution {
public:
    int NumberOf1Between1AndN_Solution(int n)
    {
        if(n<=0) return 0;
        int count=0;
        int nn=n;
        if(nn%10) ++count;
        nn/=10;
        int pow=1;
        int idx=1;
        int temp;
        while(nn){
            temp=nn%10;
            count+=temp*idx*pow;
            if(temp>1) count+=pow*10;
            if(temp==1) count+=n%(pow*10)+1;
            ++idx;
            pow*=10;
            nn/=10;
        }
        return count;
    }
};

7. ๋ฐฐ์—ด ์„ ๊ฐ€์žฅ ์ž‘์€ ์ˆ˜๋กœ ๋ฐฐ์—ด ํ•œ๋‹ค.
7.1. ์ œ๋ชฉ
์ œ๋ชฉ ์„ค๋ช…
์ •์ˆ˜ ๋ฐฐ์—ด ์„ ์ž…๋ ฅ ํ•˜๊ณ  ๋ฐฐ์—ด ์˜ ๋ชจ๋“  ์ˆซ์ž ๋ฅผ ์—ฐ๊ฒฐ ํ•˜์—ฌ ํ•˜๋‚˜์˜ ์ˆซ์ž ๋กœ ๋ฐฐ์—ด ํ•˜ ๋ฉฐ ์—ฐ๊ฒฐ ํ•  ์ˆ˜ ์žˆ ๋Š” ๋ชจ๋“  ์ˆซ์ž ์ค‘ ๊ฐ€์žฅ ์ž‘์€ ์ˆซ์ž ๋ฅผ ์ธ์‡„ ํ•ฉ ๋‹ˆ ๋‹ค.์˜ˆ ๋ฅผ ๋“ค ์–ด ๋ฐฐ์—ด {3, 32, 321} ์„ ์ž…๋ ฅ ํ•˜๋ฉด ์ด ์„ธ ์ˆซ์ž ๊ฐ€ ๋ฐฐ์—ด ํ•  ์ˆ˜ ์žˆ ๋Š” ์ตœ์†Œ ์ˆซ์ž ๋Š” 321323 ์ด๋‹ค.
7.2. ํ•ด๋ฒ• (๊ฒ€ ์ง€ offer ์ฐธ์กฐ)
์—ฐ์‚ฐ a ๋ฅผ ์ •์˜ ํ•ฉ ๋‹ˆ ๋‹ค. ์ƒ๊ธฐ ์ˆœ์„œ ์—์„œ ๋ฐฐ์—ด ์„ ์ž‘์€ ๊ฒƒ ์—์„œ ํฐ ๊ฒƒ ์œผ๋กœ ์ •๋ ฌ ํ•œ ๋‹ค์Œ ์— ๋ฐฐ์—ด ์˜ ์š” ์†Œ ๋ฅผ ์ˆœ์„œ๋Œ€๋กœ ์ธ์‡„ ํ•ฉ ๋‹ˆ ๋‹ค. ์ธ์‡„ ๊ฒฐ ๊ณผ ๋Š” ์ตœ์ข… ๋‹ต ์ž… ๋‹ˆ ๋‹ค.
class Solution {
public:

    string PrintMinNumber(vector numbers) {
        sort(numbers.begin(), numbers.end(), Solution());
        string s;
        s.reserve(numbers.size()*4);
        for(int i=0 ; i < numbers.size() ; ++i)
            s+=to_string(numbers[i]);
        return s;
    }
    
    bool operator ()(const int &a, const int &b){
        return less_(a,b);
    }
private:
    bool less_(const int &a, const int &b){
        long l=((long)a*pow(bit_(b)))+b;
        long r=((long)b*pow(bit_(a)))+a;
        return l

8. ์‹ค์ˆ˜
8.1. ์ œ๋ชฉ
์ œ๋ชฉ ์„ค๋ช…
์ธ์ž 2, 3, 5 ๋งŒ ํฌ ํ•จ ๋œ ์ˆ˜ ๋ฅผ ์ถ• ์ˆ˜ (Ugly Number) ๋ผ ๊ณ  ํ•œ๋‹ค.์˜ˆ ๋ฅผ ๋“ค ์–ด 6, 8 ์€ ๋ชจ๋‘ ์ถ” ์ˆ˜ ์ด์ง€ ๋งŒ 14 ๋Š” ์ธ์ž 7 ์„ ํฌํ•จ ํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.์Šต๊ด€ ์  ์œผ๋กœ ์šฐ ๋ฆฌ ๋Š” 1 ์„ ์ฒซ ๋ฒˆ ์งธ ๋ชป ์ƒ ๊ธด ์ˆซ์ž ๋กœ ์—ฌ ๊ธด ๋‹ค.์–ด ๋ฆด ๋•Œ ๋ถ€ํ„ฐ ํฐ ์ˆœ์„œ ๋กœ N ๋ฒˆ ์งธ ์ถ• ์ˆ˜ ๋ฅผ ๊ตฌํ•˜ ์„ธ ์š”.
8.2. ํ•ด๋ฒ• 1 (O (nlogn) ์˜ ๋ณต์žก ๋„)
์ž‘์€ ๊ฒƒ ๋ถ€ํ„ฐ ํฐ ๊ฒƒ ๊นŒ์ง€ ๋ฐฐ์—ด ํ•œ ์–ด๋ฆฟ๊ด‘๋Œ€ ๋ฒกํ„ฐ ๋ฅผ ์œ ์ง€ ํ•ฉ ๋‹ˆ ๋‹ค. ์šฐ๋ฆฌ ๊ฐ€ ๋‹ค์Œ ์— ๋” ํฐ ์–ด๋ฆฟ๊ด‘๋Œ€ ์ˆ˜ ๋ฅผ ๊ณ„์‚ฐ ํ•˜๋ ค ๊ณ  ํ•  ๋•Œ ์ด ๋ฒกํ„ฐ ์˜ ํŠน์ •ํ•œ ์š” ์†Œ ๋ฅผ 2, 3 ๋˜๋Š” 5 ๋กœ ๊ณฑ ํ•˜๋ฉด ์ด ๊ณผ์ •์˜ ๋ณต์žก ๋„ ๋Š” log (n) ์ด๊ธฐ ๋•Œ๋ฌธ์— ์ „์ฒด์ ์ธ ๋ณต์žก ๋„ ๋Š” nlog (n) ์ž… ๋‹ˆ ๋‹ค. ์ฃผ์˜ ํ•˜ ์„ธ ์š”. ์ด๋ถ„๋ฒ• ์€ ๋ฐ˜๋“œ์‹œ ๊ฒฝ๊ณ„ ์กฐ๊ฑด ์„ ์ž˜ ์ฒ˜๋ฆฌ ํ•ด ์•ผ ํ•ฉ ๋‹ˆ ๋‹ค. ์˜ˆ ๋ฅผ ๋“ค ์–ด ์—ฌ๊ธฐ,r - l = = 2 ์ผ ๋•Œ ๊ณ„์† ์žฌ ๊ท€ ํ•˜๋ฉด ์ˆœํ™˜ ์ด ๋œ๋‹ค.
class Solution {
public:
    int GetUglyNumber_Solution(int index) {
        if(index<1) return 0;
        ugly.push_back(1);
        while(--index > 0)
            ugly.push_back(find_next());
        return ugly[ugly.size()-1];
    }
private:
    vector ugly;
    int find_next(){
        int m2=find_next_factor(2, 0, ugly.size());
        int m3=find_next_factor(3, 0, ugly.size());
        int m5=find_next_factor(5, 0, ugly.size());
        if(m2>m3) swap(m2, m3);
        if(m2>m5) swap(m2, m5);
        return m2;
    }
    int find_next_factor(int factor, size_t l, size_t r){
        if(r-l==1) return factor*ugly[l];
        if(r-l==2) return factor*ugly[l]>ugly[ugly.size()-1]?factor*ugly[l]:factor*ugly[l+1];
        int middle=(l+r)/2;
        if(factor*ugly[middle] > ugly[ugly.size()-1])
            return find_next_factor(factor, l, middle+1);
        return find_next_factor(factor, middle+1, r);
    }
};

8.3. ํ•ด๋ฒ• 2: ํ•ด๋ฒ• 1 ์— ๋Œ€ํ•œ ์ตœ์ ํ™” (O (n) ์˜ ๋ณต์žก ๋„)
class Solution {
public:
    int GetUglyNumber_Solution(int index) {
        if(index < 1 ) return 0;
        ugly.push_back(1);
        while(--index)
            next_();
        return ugly[ugly.size()-1];
    }
private:
    void next_(){
        int temp2=ugly[next2idx]*2;
        int temp3=ugly[next3idx]*3;
        int temp5=ugly[next5idx]*5;
        int min_temp=temp2;
        if(min_temp>temp3) min_temp=temp3;
        if(min_temp>temp5) min_temp=temp5;
        if(min_temp == temp2) ++next2idx;
        if(min_temp == temp3) ++next3idx;
        if(min_temp == temp5) ++next5idx;
        ugly.push_back(min_temp);
    }
    vector ugly;
    size_t next2idx=0;
    size_t next3idx=0;
    size_t next5idx=0;
};

9. ์ฒซ ๋ฒˆ ์งธ ํ•œ ๋ฒˆ ๋งŒ ๋‚˜ํƒ€ ๋‚˜ ๋Š” ๋ฌธ์ž
9.1. ์ œ๋ชฉ
์ œ๋ชฉ ์„ค๋ช…
ํ•œ ๋ฌธ์ž์—ด (1 < = ๋ฌธ์ž์—ด ๊ธธ์ด < = 10000, ๋ชจ๋‘ ์•ŒํŒŒ๋ฒณ ์œผ๋กœ ๊ตฌ์„ฑ) ์—์„œ ์ฒซ ๋ฒˆ ์งธ ๋กœ ํ•œ ๋ฒˆ ๋งŒ ๋‚˜ํƒ€ ๋‚˜ ๋Š” ๋ฌธ ์ž ๋ฅผ ์ฐพ ์•„ ๊ทธ ์œ„ ์น˜ ๋ฅผ ๋˜ ๋Œ๋ ค ์ค ๋‹ˆ ๋‹ค.
9.2. ํ•ด๋ฒ•
hash ์˜ ์‚ฌ์ƒ ์„ ์‚ฌ์šฉ ํ•ฉ ๋‹ˆ ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์š”์†Œ ์˜ ์ข…๋ฅ˜ ๊ฐ€ ๋„ˆ๋ฌด ์  ๊ธฐ ๋•Œ๋ฌธ์— ์ด hashtable ์€ ์ถฉ๋ถ„ ํ•ฉ ๋‹ˆ ๋‹ค. ์ถฉ๋Œ ์„ ์–ด๋–ป๊ฒŒ ํ•ด๊ฒฐ ํ•˜ ๋Š” ์ง€ ์ „ํ˜€ ๊ณ ๋ ค ํ•˜์ง€ ์•Š ์•„ ๋„ ๋ฉ ๋‹ˆ ๋‹ค. ๋งŒ์•ฝ ์— ๋ฌธ์ž ๊ฐ€ ๊ตต ์€ ์„  ์ด ์—† ์œผ ๋ฉด hashtable ์—์„œ ์˜ ๊ฐ’ ์€ - 2 ์ด ๊ณ  ์—ฌ๋Ÿฌ ๋ฒˆ ๋‚˜ํƒ€ ๋‚˜ ๋ฉด - 1 ์ด ๋ฉฐ ํ•œ ๋ฒˆ ๋งŒ ๋‚˜ํƒ€ ๋‚˜ ๋ฉด ๋‚˜ํƒ€ ๋‚˜ ๋Š” ์œ„์น˜ ์ž… ๋‹ˆ ๋‹ค.๋งˆ์ง€๋ง‰ ์œผ๋กœ hashtable ์„ ์˜ฎ ๊ฒจ ๋‹ค ๋‹ˆ ๋ฉฐ ๊ฐ€์žฅ ์•ž ์— ์žˆ ๋Š” ์œ„ ์น˜ ๋ฅผ ์–ป ์Šต ๋‹ˆ ๋‹ค.
class Solution {
public:
    int FirstNotRepeatingChar(string str) {
        size_t table_size='z'-'A'+1;
        size_t begin_='A';
        int hash_table['z'-'A'+1];
        for(int i=0 ; i < table_size ; ++i)
            hash_table[i]=-2;
        for(int i=0 ; i < str.size() ; ++i){
            int idx=str[i]-begin_;
            if( hash_table[idx] == -2)
                hash_table[idx]=i;
            else if(hash_table[idx] >= 0)
                hash_table[idx]=-1;
        }
        
        size_t min=10000;
        for(int i=0 ; i < table_size ; ++i)
            if(hash_table[i] >= 0 && hash_table[i] < min ) min=hash_table[i];
        if( min == 10000 ) return -1;
        return min;
    }
};

10. ๋ฐฐ์—ด ์˜ ์—ญ์ˆœ ๋Œ€
10.1. ์ œ๋ชฉ
์ œ๋ชฉ ์„ค๋ช…
๋ฐฐ์—ด ์— ์žˆ ๋Š” ๋‘ ๊ฐœ์˜ ์ˆซ์ž ๊ฐ€ ์•ž์˜ ์ˆซ์ž ๊ฐ€ ๋’ค์˜ ์ˆซ์ž ๋ณด๋‹ค ํฌ ๋ฉด ์ด ๋‘ ๊ฐœ์˜ ์ˆซ์ž ๋Š” ํ•˜๋‚˜์˜ ์—ญ์ˆœ ๋Œ€ ๋ฅผ ๊ตฌ์„ฑํ•œ๋‹ค.๋ฐฐ์—ด ์„ ์ž…๋ ฅ ํ•˜์—ฌ ์ด ๋ฐฐ์—ด ์˜ ์—ญ์ˆœ ์Œ ์˜ ์ด P ๋ฅผ ๊ตฌํ•˜ ์‹ญ์‹œ์˜ค.๊ทธ๋ฆฌ๊ณ  P ๋ฅผ 1000000007 ๋ชจ๋“œ ๋กœ ์ถœ๋ ฅ ํ•ฉ ๋‹ˆ ๋‹ค.์ถœ๋ ฅ P% 1000000007
์ž…๋ ฅ ์„ค๋ช…:
์ œ๋ชฉ ์€ ์ž…๋ ฅ ํ•œ ๋ฐฐ์—ด ์— ๊ฐ™์€ ์ˆซ์ž ๋ฐ์ดํ„ฐ ๋ฒ”์œ„ ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.% 50 ์˜ ๋ฐ์ดํ„ฐ ์— ๋Œ€ํ•ด size < = 10 ^ 4% 75 ์˜ ๋ฐ์ดํ„ฐ ์— ๋Œ€ํ•ด size < = 10 ^ 5% 100 ์˜ ๋ฐ์ดํ„ฐ ์— ๋Œ€ํ•ด size < = 2 * 10 ^ 5
10.2. ํ•ด๋ฒ•
๋ฐ์ดํ„ฐ ์–‘ ์ด 105 ์ˆ˜๋Ÿ‰ ๊ธ‰ ์— ์ด ๋ฅด ๋ € ๊ธฐ ๋•Œ๋ฌธ์— O (n * n) ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์„ ์‚ฌ์šฉ ํ•  ์ˆ˜ ์—† ์Œ ์ด ๋ถ„๋ช… ํ•˜ ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š ์œผ ๋ฉด ์—ฐ์‚ฐ ํšŸ์ˆ˜ ๊ฐ€ O (1010) ์— ์ด ๋ฅด ๋ € ๊ณ  ๋ช‡ ์‹ญ ์ดˆ ๋ฅผ ์†Œ๋ชจ ํ•  ๊ฒƒ ์œผ๋กœ ์˜ˆ์ƒ ๋œ๋‹ค.๋ณ‘ํ•ฉ ์ˆœ ์„œ ๋ฅผ ๊ณ ๋ ค ํ•˜๊ณ  ํ•ฉ๋ณ‘ ๊ณผ์ • ์—์„œ ์—ญ์ˆœ ๋Œ€ ์ˆ˜๋Ÿ‰ ๋„ ๊ณ„์‚ฐํ•œ๋‹ค.๋งค๋ฒˆ ์—ญ ์„œ ์ˆ˜ ๋ฅผ ์—…๋ฐ์ดํŠธ ํ•  ๋•Œ๋งˆ๋‹ค 1000000007 ์— ๋Œ€ํ•ด ์•ผ ํ•ฉ ๋‹ˆ ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š ์œผ ๋ฉด ๋„˜ ์น˜ ๋Š” ์˜ค๋ฅ˜ ๊ฐ€ ์˜๋ฌธ ์„ ๋ชจ ๋ฅผ ์ˆ˜ ์žˆ ์Šต ๋‹ˆ ๋‹ค.(์—ญ์ˆœ ๋Œ€ ๋ฐ์ดํ„ฐ ํ˜•์‹ ์€ int ๋ชจ๋ธ ์ด๊ธฐ ๋•Œ๋ฌธ์— ํ‘œ์‹œ ํ•  ์ˆ˜ ์žˆ ๋Š” ์ตœ๋Œ€ ์ˆ˜ ๋Š” ๋Œ€๋žต 2 ๋ฐฐ์˜ 1000000007 ๋ณด๋‹ค ์กฐ๊ธˆ ๋งŽ ๊ณ  2 * 10 ^ 5 ์˜ ์ตœ๊ณ  ์—ญ์ˆœ ๋Œ€ ์ˆ˜ ๋Š” int ๊ฐ€ ํ‘œ์‹œ ํ•  ์ˆ˜ ์žˆ ๋Š” ์ตœ๋Œ€ ์ •์ˆ˜ ์˜ 10 ๋ฐฐ ์ด๋‹ค.)
class Solution {
public:
    int InversePairs(vector data) {
        temp=data;
        return merge_sort(data, temp, 0, data.size());
    }
    int merge_sort(vector &data, vector &temp , size_t l , size_t r){
        if(r-l<=1) return 0;
        int middle=(l+r)/2;
        return (
                ( merge_sort(data, temp , l , middle) 
                + merge_sort(data, temp , middle , r) )%1000000007 
                + merge(data, temp , l , r))%1000000007;
    }
    int merge(vector &data, vector &temp , size_t l , size_t r){
        int middle=(l+r)/2;
        int i=l;
        int j=middle;
        int k=l;
        int rv=0;
        while( i < middle && j  temp;
};

์ข‹์€ ์›นํŽ˜์ด์ง€ ์ฆ๊ฒจ์ฐพ๊ธฐ