ใ ๊ฒ ์ง offer ใ
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;
};
์ด ๋ด์ฉ์ ํฅ๋ฏธ๊ฐ ์์ต๋๊น?
ํ์ฌ ๊ธฐ์ฌ๊ฐ ์ฌ๋ฌ๋ถ์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ์ง ๋ชปํ๋ ๊ฒฝ์ฐ AI ์์ง์ ๋จธ์ ๋ฌ๋ ๋ถ์(์ค๋งํธ ๋ชจ๋ธ์ด ๋ฐฉ๊ธ ๋ง๋ค์ด์ ธ ๋ถ์ ํํ ๊ฒฝ์ฐ๊ฐ ์์ ์ ์์)์ ํตํด ๊ฐ์ฅ ์ ์ฌํ ๊ธฐ์ฌ๋ฅผ ์ถ์ฒํฉ๋๋ค:
๋ค์ํ ์ธ์ด์ JSONJSON์ Javascript ํ๊ธฐ๋ฒ์ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ฅผ ๋ ์ด์์ํ๋ ๋ฐ์ดํฐ ํ์์ ๋๋ค. ๊ทธ๋ฌ๋ Javascript๊ฐ ์ฝ๋์์ ์ด๋ฌํ ๊ตฌ์กฐ๋ฅผ ๋ํ๋ผ ์ ์๋ ์ ์ผํ ์ธ์ด๋ ์๋๋๋ค. ์ ๋ ์ผ๋ฐ์ ์ผ๋ก '๊ฐ์ฒด'{}...
ํ ์คํธ๋ฅผ ์์ ๋กญ๊ฒ ๊ณต์ ํ๊ฑฐ๋ ๋ณต์ฌํ ์ ์์ต๋๋ค.ํ์ง๋ง ์ด ๋ฌธ์์ URL์ ์ฐธ์กฐ URL๋ก ๋จ๊ฒจ ๋์ญ์์ค.
CC BY-SA 2.5, CC BY-SA 3.0 ๋ฐ CC BY-SA 4.0์ ๋ฐ๋ผ ๋ผ์ด์ผ์ค๊ฐ ๋ถ์ฌ๋ฉ๋๋ค.
์ข์ ์นํ์ด์ง ์ฆ๊ฒจ์ฐพ๊ธฐ
๊ฐ๋ฐ์ ์ฐ์ ์ฌ์ดํธ ์์ง
๊ฐ๋ฐ์๊ฐ ์์์ผ ํ ํ์ ์ฌ์ดํธ 100์ ์ถ์ฒ ์ฐ๋ฆฌ๋ ๋น์ ์ ์ํด 100๊ฐ์ ์์ฃผ ์ฌ์ฉํ๋ ๊ฐ๋ฐ์ ํ์ต ์ฌ์ดํธ๋ฅผ ์ ๋ฆฌํ์ต๋๋ค