[ Q1. ์ค๋ณต์ด ์๋๊ฐ ]
๋ฌธ์์ด์ด ์ฃผ์ด์ง ๊ฒฝ์ฐ, ์ด ๋ฌธ์์ด์ ๊ฐ์ ๋ฌธ์๊ฐ ์ค๋ณต๋์ด ๋ฑ์ฅํ๋์ง ํ์ธํ๋ ์๊ณ ๋ฆฌ์ฆ์ ์์ฑํ๋ผ. ์ถ๊ฐ์ ์ผ๋ก ์๋ฃ๊ตฌ์กฐ๋ฅผ ์ฌ์ฉํ์ง์๊ณ ํ ์ ์๋ ์๊ณ ๋ฆฌ์ฆ ์ญ์ ์์ฑํ๋ผ.
- ๋ด ํ์ด -
1. ๋ฌธ์์ด์ char๋ฐฐ์ด์ ๋ฃ๊ธฐ
2. ๊ฐ๋ฐฐ์ด์ ์์๋ฅผ ๋ฐ๋ณต์ฒ๋ฆฌ > hashmap์ ์๋ค๋ฉด ์ค๋ณต์์ ์ข ๋ฃ, ์๋ค๋ฉด hashmap์ ์์๋ก ์ถ๊ฐ
boolean charDup(String s) {
char[] char_set=s.toCharArray();
HashMap map=new HashMap();
for(char c:char_set) {
if(map.containsKey(c)) {
return true;
} else {
map.put(c, 0);
}
}
return false;
}
*map์ ์ด๋ ๊ฒ ์ฌ์ฉํด๋ ๊ด์ฐฎ์๊ฐ? ์ฌ์ค ๋ฌธ์์ด ํ๋ํ๋ ๋น๊ตํ๋ ค๊ณ ํ๋ค๊ฐ ์๋ฃ๊ตฌ์กฐ๋ฅผ ์ฌ์ฉํด ๋ณธ๊ฑด๋ฐ.. => ์๋ผ์,, ์๊ณ ๋ฆฌ์ฆ์ ์๊ฐ๊ณผ ๊ณต๊ฐ๋ณต์ก๋๋ฅผ ๊ณ ๋ คํด์ผ์ผ ํ๋ค๋ ๊ฒ! ๋ด ๋ฐฉ๋ฒ์ ํด๋ฒ 3๊ณผ ์ ์ฌ
์๋ ๋ชจ๋ฒ๋ต์์ ํตํด ์๊ฒ๋ ๊ฒ์
1. ๋ฌธ์์ด์ ์์คํค์ธ๊ฐ ์ ๋์ฝ๋์ธ๊ฐ์ ๋ฐ๋ผ ์ฒ๋ฆฌ ๋ฐฉ๋ฒ์ด ๋ฌ๋ผ์ง๋ค๋ ๊ฒ(์ ์ฅ์ฉ๋)
2. ๋ฌธ์์ด์ ์ฒดํฌํ ๋๋ ๋ฐฐ์ด, ๋๋ ๋งต, ๋นํธ๋ฐฑํฐ ๋ฑ์ ํ์ฉํ ์ ์๋ค๋ ๊ฒ
- ๋ชจ๋ฒ๋ต์ -
์ฃผ์ด์ง ๋ฌธ์์ด์ด ์์คํค์ฝ๋์ธ๊ฐ? ์ ๋์ฝ๋์ธ๊ฐ? ์ฃผ์
(์ฌ๊ธฐ์ ์์คํค์ฝ๋๋ก ๊ฐ์ ํ๊ณ ๋ฌธ์ ํ์ด)
ํด๋ฒ1) ๋ฌธ์๋ ํ๋ฒ๋ฐ์ ์ฌ์ฉํ ์ ์์ผ๋ฏ๋ก 128๊ฐ์ ๋ฐฐ์ด์ booleanํ์ ์ ์ฅํ์ฌ ํ์ฉ
: ์ด ๊ฒฝ์ฐ ์๊ฐ ๋ณต์ก๋๋ O(n), ๊ณต๊ฐ๋ณต์ก๋๋ O(1)
boolean isUniquChars(String str) {
// ๋ฌธ์์ด์ ๊ธธ์ด๊ฐ ํํ๊ฐ๋ฅํ ๋ฌธ์ ๊ฐ์๋ณด๋ค ๋ง๋ค๋ฉด ๋น์ฐํ ์ค๋ณต๋ ์์๊ฐ ์กด์ฌํ๋ค๋ ๊ฒ
if(str.length()>128) return false;
// ์์คํค์ฝ๋์ ๊ฐ์(128)์ ํด๋นํ๋ ๋ฐฐ์ด์ ์ ์ธ
boolean[] char_set=new boolean[128];
for(int i=0;i<str.length();i++) {
int val=str.charAt(i);
// ํด๋น ๋ฌธ์์ด์ด ์ด๋ฏธ ์ฒดํฌ๋์๋ค๋ฉด ์ค๋ณต๊ฐ ์กด์ฌํ๋ค๋ ๋ป
if(char_set[val]) return false;
// ์ฒ์์ผ๋ก ๋ฑ์ฅํ ๋ฌธ์๋ผ๋ฉด ๋ฐฐ์ด์ ๊ฐ์ true๋ก ์ฒดํฌ
char_set[val]=true;
}
return true;
}
ํด๋ฒ2) ๋นํธ๋ฐฑํฐ์ฌ์ฉ
: ํ์ํ ๊ณต๊ฐ์ 1/8๋ก ๊ฐ์
: ์ด ๋ฌธ์ ๋ ๋ฌธ์๊ฐ a~z๊น์ง๋ง ๋์จ๋ค๊ณ ๊ฐ์
boolean isUniqeArphabet(String str) {
// ๊ธฐ์ค ๋นํธ๋ฐฑํฐ
int checker=0;
for(int i=0; i<str.length();i++) {
// a~z๊น์ง์ ํํ์ 0~ํ๊ณ ์ถ๊ธฐ ๋๋ฌธ์ -'a'ํจ
int val=str.charAt(i)-'a';
// ์ค๋ณต์์๊ฐ ์๋ค๋ฉด
if((checker&(1<<val)) >0) {
return false;
} else {
checker |= 1<<val;
}
}
return true;
}
" ์๋ฃ๊ตฌ์กฐ๋ฅผ ์ถ๊ฐ์ ์ผ๋ก ์ฌ์ฉํ ์ ์๋ค๋ฉด? "
ํด๋ฒ 3) ๊ฐ๋ฌธ์๋ฅผ ๋ชจ๋ ๋ค๋ฅธ ๋ฌธ์์ ๋น๊ตํ๋ค
: ์ฆ, ๋ด๊ฐ ํผ ๋ฐฉ๋ฒ์ ์ฌ์ค map์ด ์๋๋ผ ๋ฌธ์ํ๋ํ๋ ๋น๊ต ์ง์ ํ๋ ๊ฒ์ผ๋ก ํด์ผํ์ด..!
: ์ด๋ ์๊ฐ๋ณต์ก๋๋ O(n^2)์ด๋ฉฐ ๊ณต๊ฐ๋ณต์ก๋๋ O(1)
ํด๋ฒ4) ์ ๋ ฅ๋ฌธ์์ด ์์ ์ด ๊ฐ๋ฅํ๋ค๋ฉด O(NlogN)์๊ฐ์ ๋ฌธ์์ด์ ์ ๋ ฌํ ๋ค ๋ฌธ์์ด์ ์ฒ์๋ถํฐ ํ์ผ๋ฉฐ ๋์ผํ์ง ๊ฒ์ฌ
: ๋จ, ์ ๋ ฌ์์๋ ๊ณต๊ฐ๋ณต์ก๋๊ฐ ๋ณ๋๋ก ์ฆ๊ฐํ๋ค๋ ์
[ Q2. ์์ดํ์ธ ]
๋ฌธ์์ด ๋๊ฐ๊ฐ ์ฃผ์ด์ง ๊ฒฝ์ฐ, ์ด ๋์ด ์๋ก ์์ด๊ด๊ณ์ ์๋์ง ํ์ธํ๋ ๋ฉ์๋๋ฅผ ์์ฑํ๋ผ.
- ๋ด ํ์ด -
1. ๋ฌธ์์ด์ ๊ธธ์ด๊ฐ ๊ฐ์๋งํจ
2. ๋ฌธ์์ด์ ๋ฌธ์์๋ฅผ ์นด์ดํธํ์ฌ ๋ฐฐ์ด ๊ฐ์ ์ฆ๊ฐ > ๋ค๋ฅธ ๋ฌธ์์ด์ ๋ฌธ์์๋ฅผ ์นด์ดํธํ์ฌ ๋ฐฐ์ด๊ฐ์ ์ฐจ๊ฐ
3. ๋ง์ง๋ง ๋ชจ๋ ์์๊ฐ 0์ด ์ด์ผ๋ง ์์ด์ด๋ผ ํ๋จ
boolean isPurmutation(String str1, String str2) {
if(str1.length()!=str2.length()) return false;
int[] char_set=new int[128];
for (int i=0; i<str1.length();i++) {
int val=str1.charAt(i);
char_set[val]++;
}
for (int i=0; i<str2.length();i++) {
int val=str2.charAt(i);
char_set[val]--;
if (char_set[val]<0) return false;
}
// ๋์ ์ด๋ป๊ฒ ๋น๊ตํ ๊ฒ์ธ๊ฐ?
for (int i=0; i<str1.length();i++) {
if(char_set[i]!=0) return false;
}
return true;
}
"๊ทธ๋ฐ๋ฐ? ๋ชจ๋ ๋ฌธ์๋ฅผ ๋ค ์ํํ๊ณ ๋ง์ง๋ง์ ๋ฐฐ์ด์ ๋ชจ๋ ์์๊ฐ 0์ธ๊ฒ์ ํ์ธํ๋๊ฒ์ ์ข ๋นํจ์จ์ ์ธ ๊ฒ ๊ฐ์!"
=> ํด๋ต2๊ฐ ๋ด ๋ฐฉ๋ฒ๊ณผ ๋น์ทํ๊ฒ ํ์ด๋์๋๋ฐ, ์ด๋ฏธ ๊ธธ์ด๊ฐ ๊ฐ์๊ฒ์ ๋งจ ์ฒ์์ ํ์ธํ๊ธฐ๋๋ฌธ์, ๋ค๋ฅธ ๋ฌธ์๊ฐ ์๋ ๊ฒฝ์ฐ ๋๋ฒ์งธ ๋ฌธ์์ด์ ์ฐจ๊ฐ ์์ ์ ๋ฐ๋์ ์์๊ฐ์ด ๋ฐ์ํ๋ค๋๊ฒ. ์ฆ, ๊ตณ์ด ๋น๊ตํ์ง ์์๋ ๋๋ฒ์งธ for๋ฌธ ์ ์กฐ๊ฑด๋ฌธ if (char_set[val]<0) return false; ์์ ์ด๋ฏธ ํ๋จ๋๋ค๋ ์๋ฆฌ! ๋ฐ๋ผ์ ๋ง์ง๋ง์ ์์๊ฒ์ฌ๋ฅผ ํ์ง์์๋ ๋๋ค๋ ๊ฒ!
- ๋ชจ๋ฒ๋ต์ -
* ๋ ๋ฌธ์ ์ ์ธ๋ถ์ฌํญ์ ํ์ธํด์ผํ๋ค. ์๋ฅผ๋ค๋ฉด ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ณํ๋์ง? ๊ณต๋ฐฑ์ฒ๋ฆฌ๋ ์ด๋ป๊ฒ ํ ๊ฒ์ธ์ง? ๋ฑ *
ํด๋ฒ1) ์ ๋ ฌ : ์์ด ๊ด๊ณ๋ผ๋ฉด ์ ๋ ฌ๋ ๋ฌธ์์ด์ ๋์ผํด์ผ ํ๊ธฐ ๋๋ฌธ
// ํ์ด 1 : ์ ๋ ฌํ์ฌ ๊ฐ์์ง ๋น๊ต >> ๋ฌธ์๋ฐฐ์ด์ ๋ฃ๊ณ ์ ๋ ฌํ๋ฉด ๋น ๋ฅด์ง๋กฑ
public String sort(String s) {
char[] content=s.toCharArray();
Arrays.sort(content);
return new String(content);
}
public boolean permutation(String s, String t) {
if(s.length()!=t.length()) return false;
return sort(s).equals(t);
}
ํด๋ฒ2) ๋ฌธ์์ด์ ํฌํจ๋ ๋ฌธ์์ ์ถํ ํ์๊ฐ ๊ฐ์์ง ๊ฒ์ฌ
// ํ์ด 2 : ๋ฌธ์ ์ถํ ํ์ ๋น๊ต
// => ๋ด๊ฐ ํ์ดํ ๋ฐฉ๋ฒ๊ณผ ๋์ผํ์ง๋ง ๋ด๊ฐ ๊ฐ๊ณผํ๊ฒ!
// ๊ธธ์ด๊ฐ ๋๊ฐ๋ค๋ฉด 0๋ณด๋ค ์์๊ฒ์ด ์๋ค๊ฐ ์๋ฏธํ๋ ๊ฒ = ๋๊ฐ๋ค
// ๊ทธ๋ฌ๋ฏ๋ก ๋ด๊ฐ ํ๊ฒ์ฒ๋ผ ๋ง์ง๋ง ๋น๊ต๋ ๋ถํ์ํ๋ค๋๊ฒ!
boolean purmutation_2(String str1, String str2) {
if(str1.length()!=str2.length()) {
return false;
}
int[] letter=new int[128];
char[] str1_array=str1.toCharArray();
for (char c:str1_array) {
letter[c]++;
}
for (int i=0; i<str2.length();i++) {
int c=str2.charAt(i);
letter[c]--;
if (letter[c]<0) {
return false;
}
}
return true;
}
[ Q3. URLํ ]
๋ฌธ์์ด์ ๋ค์ด์๋ ๋ชจ๋ ๊ณต๋ฐฑ์ '%20'์ผ๋ก ๋ฐ๊พธ์ด์ฃผ๋ ๋ฉ์๋ ์์ฑํ๋ผ. ์ต์ข ์ ์ผ๋ก ๋ชจ๋ ๋ฌธ์๋ฅผ ๋ค ๋ด์ ์ ์์ ๋งํผ ์ถฉ๋ถํ ๊ณต๊ฐ์ด ์ด๋ฏธ ํ๋ณด๋์ด ์์ผ๋ฉฐ ๋ฌธ์์ด์ ์ต์ข ๊ธธ์ด๊ฐ ํจ๊ป ์ฃผ์ด์ง๋ค๊ณ ๊ฐ์ ํด๋ ๋๋ค. (๋ฐ๋ก ๊ตฌํํ๋ค๋ฉด ๋ฐฐ์ด์์์ ์์ ํ ์ ์๋๋ก ๋ฌธ์๋ฐฐ์ด ์ด์ฉํ๊ธธ ๋ฐ๋๋ค.)
์์
์ ๋ ฅ: "Mr John Smith", 13
์ถ๋ ฅ: "Mr%20John%20Smith"
- ๋ด ํ์ด -
๋ฐฐ์ด์ ํ์ฉํด์ ํ๋ ค๊ณ ํ๋ค๊ฐ.. ๊ทธ๋ฅ stringBuilder๋ String.replace()๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ฉด ์ฌ์ฐ๋๊น..
//1)sb์ด์ฉ ๋๋ string.replace(" ","%20"); ํ์ฉ
char[] c_set=str.toCharArray();
StringBuilder sb=new StringBuilder();
for(char c:c_set) {
if(c==' ') {
sb.append("%20");
} else {
sb.append(c);
}
}
return sb.toString();
๋ด๊ฐ๊ฐ๊ณผํ ๋ถ๋ถ : ๋ฌธ์ ์ ์ ๋ณด๋ฅผ ์ดํดํ์ง๋ชปํ๊ณ ํ์ฉํ์ง๋ชปํจ
1. ์ต์ข ์ ์ผ๋ก ๋ชจ๋ ๋ฌธ์๋ฅผ ๋ค ๋ด์ ์ ์์ ๋งํผ ์ถฉ๋ถํ ๊ณต๊ฐ์ด ์ด๋ฏธ ํ๋ณด & ๋ฐฐ์ด์์์ ์์ ํ ์ ์๋๋ก
๋ฌธ์๋ฐฐ์ด ์ด์ฉ => ์ฆ ์ด ๋ฐฐ์ด ์์์ ์์ ํด์ผํ๋ค๋๊ฒ : ๊ทธ๋ ๊ธฐ๋๋ฌธ์ ๋ฌธ์ ๊ธธ์ด๊ฐ ์ฃผ์ด์ง๊ฒ์
2. ์๋ฐ์ String์ immutable! ๋ฐ๋ผ์ ๋ฌธ์๋ฐฐ์ด char Array๋ฅผ ์ฌ์ฉํด์ผํ๋ค๋ ๊ฒ!
- ๋ชจ๋ฒ๋ต์ -
* ๋ฌธ์์ด ์กฐ์ ๋ฌธ์ ํ์ด์ ๋ณดํต ๋ฌธ์์ด์ ๋ค์์๋ถํฐ ๊ฑฐ๊พธ๋ก ํธ์งํด ๋๊ฐ *
์๋ํ๋ฉด ๋ง์ง๋ง๋ถ๋ถ์ ์ฌ์ ๊ณต๊ฐ์ ๋ง๋ค์ด ์ ์ฉํ๊ฒ ์ฌ์ฉํ ์ ์๊ธฐ ๋๋ฌธ
= ์ฆ, ๋ฎ์ด์ธ ๊ฑฑ์ ์์ด ๋ฌธ์๋ฅผ ๋ฐ๊ฟ๋๊ฐ ์ ์๋ค๋ ๊ฒ
์ด๊ฒ ๋ฌด์จ ๋ง์ธ๊ฐ! ๋ฌธ์์ด ํฌ๊ธฐ์ ๋์ผํ ํฌ๊ธฐ์ ๋ฐฐ์ด์ด ์๋๋ผ, ์ถฉ๋ถํ ํฌ๊ธฐ์ ๋ฐฐ์ด์ด ์ฃผ์ด์ง๊ฑฐ๊ณ
์๋ก์ด ๊ณณ์ ์์ ํ ๋ฌธ์์ด์ ๋ง๋ค๋ผ๋๊ฒ์ด ์๋๋ผ, ๋๊ฐ์ ๋ฐฐ์ด์ ๋ฎ์ด์ฐ๋ผ๋๊ฒ!
์ด ๊ณผ์ ์์ ๋ฎ์ด์ธ ์ผ๋ ค๊ฐ ๋ฐ์ํ์ง์๊ฒ ํ๋ ค๋ฉด ์ด ์์ ๊ธธ์ด(๋์ด๋๊ธฐ๋๋ฌธ)๋ฅผ ๊ณ์ฐํด์ ๋ค์์๋ถํฐ
ํธ์งํด์ผ ์์ ํ์ง์์ ๊ธ์๋ค์ด ๋ฎ์ด์ฐ๊ธฐ ๋ ์ผ๋ ค๊ฐ ์๋ค๋ ๊ฒ!
ํด๋ฒ1) ๋ฌธ์์ด์ ๋๋ฒ ํ๋๋ค
์ฒ์์๋ ๋ฌธ์์ด์ ๊ณต๋ฐฑ์ ํ์ธํ๊ณ , ๋๋ฒ์งธ๋ ์ญ๋ฐฉํฅ์ผ๋ก ์งํํ๋ฉฐ ๋ฌธ์์ด์ ํธ์งํ๋ค.
๊ณต๋ฐฑ์ ๋ง๋๋ฉด ๋ค์์์น์ '%20'์ ๋ณต์ฌ, ๊ณต๋ฐฑ์ด ์๋๋ฉด ์๋ ๋ฌธ์๋ฅผ ๋ณต์ฌ
// ๋ชจ๋ฒ๋ต์ : ๋ฌธ์์ด์ ๊ฑฐ๊พธ๋ก ํธ์ง
// => ๋ฌธ์ ์์ฒด์์ ๋ฌธ์์ด์ ๋ฐฐ์ด๋ก ์ฃผ์ด์ง๋ฉฐ, ๋ฐฐ์ด์ ๋ฑ๋ง๋ ํฌ๊ธฐ๊ฐ ์๋ ์ด๋ฏธ ํฐ ๋ฐฐ์ด
// => ์.. ์ด๋์ ๋ฐฐ์ด์ ์๋ก ์์ฑ ์ํ๊ณ ๊ทธ ๋ฐฐ์ด ์์ฒด๋ฅผ ํธ์ง! ๋ฎ์ด์ธ ๊ฑฑ์ ์ด๋ฐ์๋ฏธ๊ฐ ์ดํด๋จ!
void replaceSpaces(char[] str, int trueLength) {
int spaceCount=0, index, i=0;
for(i=0; i<trueLength; i++) {
//๊ณต๋ฐฑ์ธ๊ธฐ
if(str[i]==' ') {
spaceCount++;
}
}
index=trueLength+2*spaceCount;
if(trueLength<str.length) str[trueLength]='\0'; //๋ฌธ์์ด์ ์ต์ข
๊ธธ์ด๊ฐ ๋ฐฐ์ด์ ๊ธธ์ด(์ด๋ฏธ์ถฉ๋ถํํผ)๋ณด๋ค ์๋ค? ๋ฐฐ์ด์ ๋์ ํ๊ธฐํด์ค
//๋ค์์๋ถํฐ ํธ์ง(๋ณต์ฌor์นํ)
for(i=trueLength-1;i>=0;i--) {
// index๋ ๊ธธ๊ธฐ๋ฅผ ํํํ๋๊น ์ฌ๊ธฐ์ ํ๊ฐ๋ฆฌ์ง์๊ฒ ์์น ๊ณ์ฐ ์กฐ์ฌ
if(str[i]==' ') {
str[index-1]='0';
str[index-2]='2';
str[index-3]='%';
index-=3;
} else {
str[index-1]=str[i];
index--;
}
}
}
[ Q4. ํ๋ฌธ์์ด ]
์ฃผ์ด์ง ๋ฌธ์์ด์ด ํ๋ฌธ์ ์์ด์ธ์ง ์๋์ง ํ์ธํ๋ ํจ์ ์์ฑํ๋ผ. ํ๋ฌธ์ด๋ ์์ผ๋ก ์ฝ์ผ๋ ๋ค๋ก ์ฝ์ผ๋ ๊ฐ์ ๋จ์ด ํน์ ๊ตฌ์ ์ ์๋ฏธํ๋ฉฐ ์์ด์ ์ฌ๋ฐฐ์น๋ฅผ ๋ปํ๋ค. ํ๋ฌธ์ด ๊ผญ ์ฌ์ ์ ๋ฑ์ฅํ๋ ๋จ์ด๋ก ์ ํ๋ ํ์ ์๋ค.
์์
์ ๋ ฅ: Tact Coa
์ถ๋ ฅ: true (์์ด:"tca oact", "atco cta"๋ฑ)
- ๋ด ํ์ด -
1. ๋ฌธ์์ด ๊ธธ์ด๊ฐ ์ง์์ธ์ง ํ์์ธ์ง ํ์ธ
2. ์ง์์ธ๊ฒฝ์ฐ ๊ฐ ๋ชจ๋ ๋ฌธ์์๋ ์ง์, ํ์์ธ๊ฒฝ์ฐ ๋ฑ ํ๋์ ๋ฌธ์ ์๋ง ํ์
3. ๋นํธ๋ฐฑํฐ๋ก ๊ฐ ๋ฌธ์์ ์ถํ์ ์ฒดํฌ
=> ์ง์์ผ๋๋ 0์ด์ฌ์ผ true, ํ์์ผ๋๋ ๋นํธ๋ฐฑํฐ์ค 1๋นํธ๊ฐ 1๊ฐ์ฌ์ผ true
=> ์ด ๋ถ๋ถ์์ ๋ฉ์ถค
boolean isPalindrome_m(String str) {
// ๋นํธ๋ฐฑํฐ์ ํ์ฉ
int checkVector=0;
// ๋ฌธ์๊ฐ์ ์ฒดํฌ : ํ์1 ์ง์ 0
for(int i=0;i<str.length();i++) {
int val=str.charAt(i)-'a';
checkVector=checkVector^(1<<val);
}
// ๋ฌธ์๊ธธ์ด์ ๋ฐ๋ฅธ ๋ฐํ
if(str.length()%2==0&&checkVector==0) return true;
// 1๋นํธ๊ฐ ํ๋์ธ์ง ํ์ธ
checkVector&=(checkVector-1);
if(str.length()%2==1&&checkVector==0) return true;
return false;
}
"๋๋ 'ํ์์ผ๋๋ ๋นํธ๋ฐฑํฐ์ค 1๋นํธ๊ฐ 1๊ฐ์ฌ์ผ true' ์ด ๋ถ๋ถ์ ๊ตฌํํ์ง ๋ชปํ์ด.."
์๋ ๋ฌธ์ ํ์ด๋ฅผ ๋ณด๋ค๊ฐ 3๋ฒ ํด๋ฒ์์ ํํธ๋ฅผ ์ป์์!
1๊ฐ๋ง 1๋นํธ์ธ ๊ฒ์ ํ์ธํ ๋! โ ๋นํธ&(๋นํธ-1)==0 ๊ธฐ์ตํ๊ธฐ!!!! โ
- ๋ชจ๋ฒ๋ต์ -
ํ๋ฌธ์์ด์ด ๋๊ธฐ ์ํด์๋ ๋ฌธ์์ด๊ธธ์ด๊ฐ ์ง์์ผ๋ ๋ชจ๋ ๋ฌธ์์ ๊ฐ ๊ฐ์๋ ๋ฐ๋์ ์ง์
๋ฌธ์์ด์ ๊ธธ์ด๊ฐ ํ์๋ผ๋ฉด ๋ฌธ์ ํ๋๋ ํ์๊ฐ ์กด์ฌํด์ผ๋ง ํจ
ํด๋ฒ1) ํด์ํ ์ด๋ธ ์ฌ์ฉ : ๊ฐ ๋ฌธ์๊ฐ ๋ช ๋ฒ ๋ฑ์ฅํ๋์ง ์นด์ดํธ ํ ํ์๋ฌธ์๊ฐ ํ๊ฐ ์ด์์ธ์ง ํ์ธ
(๊ทธ๋ฐ๋ฐ ์ฌ๊ธฐ์ ๋งํ๋ ํด์ํ ์ด๋ธ์ ๊ทธ๋ฅ int[]์ด๊ณ ์ธ๋ฑ์ค๊ฐ ์๋ฏธ์๊ธฐ ๋๋ฌธ์ ๊ทธ๋ ๊ฒ ๋งํ๊ฑด๊ฐ...?)
// ํด๋ฒ1. ํด์ํ
์ด๋ธ ์ฌ์ฉ : ๊ฐ ๋ฌธ์๊ฐ ๋ช๋ฒ ๋ฑ์ฅํ๋์ง ์นด์ดํธ > ํด์ํ
์ด๋ธ ํ์ผ๋ฉฐ ํ์๋ฌธ์๊ฐ 1๊ฐ์ด์์ธ์ง ํ์ธ
boolean isPermutationOfPalindrome(String pharse) {
int[] table=buildCharFrequencyTable(pharse); // ๊ฐ๋ฌธ์ ์ถํํ์ ์ ์ฅ ํ
์ด๋ธ
return checkMaxOneodd(table);
}
// ํ์๋ฌธ์๊ฐ ํ๊ฐ ์ด์์ธ์ง ํ์ธ :
boolean checkMaxOneodd(int[] table) {
boolean foundOdd=false;
for(int count:table) {
if(count%2==1) {
if(foundOdd) {
return false; // ํ์๊ฐ 1๊ฐ ์ด์์ธ ๊ฒฝ์ฐ ๋ฐ๋ก ์ข
๋ฃํ๋ฉฐ false๋ฐํ
}
foundOdd=true; // ํ์ ๋ฐ๊ฒฌ์
}
}
return true; // ํ์๊ฐ ํ๋๋ ๋ฐ๊ฒฌ ์๋๋ ๊ฒฝ์ฐ true๋ฐํ
}
// ๊ฐ ๋ฌธ์์ ์ซ์๋ฅผ ๋์ : a-0, b-1, c-2,...
// => ๋์๋ฌธ์ ๊ตฌ๋ถ ์๊ณ ๋ฌธ์ ์๋๊ฒฝ์ฐ -1๋ฐํ
int getCharNum(Character c) {
int a=Character.getNumericValue('a');
int z=Character.getNumericValue('z');
int val=Character.getNumericValue(c);
if(a<=val && val>=z) {
return val-a;
}
return -1;
}
// ๊ฐ ๋ฌธ์๊ฐ ๋ช๋ฒ ๋ฑ์ฅํ๋์ง ์นด์ดํธ
int[] buildCharFrequencyTable(String pharse) {
int[] table=new int[Character.getNumericValue('z')-Character.getNumericValue('a')+1]; // ์ธ๋ฑ์ค๋๊น 0๊น์ง ํฌํจ์์ผ์ผํ๋ฏ๋ก
for(char c:pharse.toCharArray()) {
int x=getCharNum(c);
if(x!=-1) {
table[x]++;
}
}
return table;
}
ํด๋ฒ2)
๋ชจ๋ ๋ฌธ์์ด์ ์ต์ํ ํ๋ฒ์ ํ์ด์ผ ํ๊ธฐ ๋๋ฌธ์ big-O์๊ฐ์ ๋์ด์ ์ต์ ํ๋ ๋ถ๊ฐ. ํ์ง๋ง ๊ฐ์ ์ ๊ฐ๋ฅ
> ๋ง์ง๋ง์ ๋ฌธ์์ ํ์ ๊ฐ์๋ฅผ ํ์ธํ๋ ๊ฒ์ด ์๋๋ผ, ํ์ด๋๊ฐ๊ณผ ๋์์ ํ์ ๊ฐ์ ํ์ธ ๊ฐ๋ฅ
* ์ด ๋ฐฉ๋ฒ์ ์๊ฐํ๋ค๊ฐ ์ด ๊ฐ์๊ฐ ์ง์์ธ ๋ฌธ์๋ ์ฒ์์๋ countOdd๊ฐ 1 ๋์ด๋๋๊น ๋ฒ๋ ธ๋๋ฐ,
์ฝ๋๋ฅผ ๋ณด๋ฉด ์ด ๊ฐ์๊ฐ ์ง์์ธ ๋ฌธ์๋ ์ฒ์์๋ countOdd๊ฐ 1๋์ด๋๋ ๋๋ฒ์งธ ๋ฐ๊ฒฌ์์๋ -1์ด๋๊น ๊ฒฐ๊ตญ 0์ด๋๋ค๋๊ฒ
์ฆ, ์ง์๊ฐ ๋ฌธ์๋ ๊ฒฐ๊ณผ์ ์ผ๋ก 0์ ์ฃผ๊ณ ํ์๊ฐ ๋ฌธ์๋ ๊ฒฐ๊ณผ์ ์ผ๋ก 1์ ์ฃผ๊ฒ๋๋ ๊ฒ
๋ฐ๋ผ์ ํ์์ ์๊ฐ 1๊ฐ๋ผ๋ฉด 1, 2๊ฐ๋ผ๋ฉด 2, 3๊ฐ๋ผ๋ฉด 3... ์ด๋ ๊ฒ!
// ํด๋ฒ2. ๋์์ ํ์ธํ๊ธฐ
boolean isPalindrome(String pharse) {
int countOdd=0;
int[] table=new int[Character.getNumericValue('z')-Character.getNumericValue('a')+1];
for(char c:pharse.toCharArray()) {
int x=getCharNum(c);
if(x!=-1) {
table[x]++;
if (table[x]%2==1) {
countOdd++; // ์ด๊ฒ ํ์๋ง ์นด์ดํ
๋๋ค๋ ์๋ฏธ๊ฐ ์๋๋ผ
} else {
countOdd--; // ๊ฐ์ ์ํ๋ฒณ์ด ๋์ค๋ ๊ฒฝ์ฐ๋ table์ซ์๊ฐ ์ง์๋ผ์ ๋ค์ ๋นผ์ค
}
}
}
return countOdd <=1;
}
ํด๋ฒ3) ๋นํธ๋ฐฑํฐ์ ์ฌ์ฉ
๋ฑ์ฅํ์๋ฅผ ๊ตณ์ด ์ธ์ง์์๋ ์ง์์ธ์ง ํ์์ธ์ง๋ง ์๋ฉด๋๋๊ฑฐ์ผ ๋ง์น ์ค์์น์ฒ๋ผ
๋นํธ๊ฐ์ ๋ฐ๊ฟ์ค๊ป๋ฐ, ๋ง์ง๋ง์ ํ๊ฐ์ดํ์ ๋นํธ๊ฐ 1๋ก ์ธํ ๋์ด์๋์ง ํ์ธ๋ง ํ๋ฉด OK!
(๋จ์ง 1๋ก ์ธํ ๋ ๋นํธ๊ฐ ์๋์ง ํ์ธํ๊ณ ์ถ๋ค๋ฉด 0๊ณผ ๊ฐ์์ง ๋น๊ตํ๋ฉด ๋์ง๋ง~~!)
โ 1๋ก ์ธํ ๋ ๋นํธ๊ฐ ๋จ ํ๊ฐ ์๋์ง ํ์ธํ๊ณ ์ถ์ ๊ฒฝ์ฐ!!โ
๋นํธ๊ฐ์์ -1 ํ ๋ค, AND์ฐ์ฐ ์ํํ์ ๊ฒฝ์ฐ 0์ธ ๊ฒฝ์ฐ!!!
* 1๋นํธ๊ฐ 1๊ฐ๋ก ์ธํ ๋ ๊ฒฝ์ฐ๋ง ํด๋น! 2๊ฐ์ด์์ธ ๊ฒฝ์ฐ์๋ ๊ฒน์น๋ ๋นํธ๊ฐ ๋ฐ์ํ์ฌ &"์ฐ์ฐ๊ฒฐ๊ณผ>0"์!
1) 000100000์์ 1์ ๋บ ๊ฒฝ์ฐ 000011111 => ๊ฒน์น๋ ๋นํธ๊ฐ ์๋ค๋ ๊ฒ!
2) ๊ฒน์น๋ ๋นํธ๊ฐ ์๊ธฐ๋๋ฌธ์ '&'์ฐ์ฐ์ ํ๋ฉด 0์ด ๋์จ๋ค๋ ๊ฒ!
// ํด๋ฒ3. ๋นํธ๋ฐฑํฐ ์ด์ฉ
boolean isPermutationPalindrome(String pharse) {
int bitVector=createBiteVector(pharse);
return bitVector == 0 || checkExactlyOnBitSet(bitVector);
}
// ๋ฌธ์์ด์ ํด๋นํ๋ ๋นํธ๋ฐฑํฐ ์์ฑ : ๊ฐ์ด i๋ผ๋ฉด i๋ฒ์งธ ๋นํธ๊ฐ์ ๋ณ๊ฒฝ
int createBiteVector(String pharse) {
int bitVector=0;
for(char c:pharse.toCharArray()) {
int x=getCharNum(c);
bitVector=toggle(bitVector,x);
}
return bitVector;
}
// ์ ์์ i๋ฒ์งธ ๋นํธ๊ฐ์ ๋ณ๊ฒฝ (์ค์์น์ญํ )
int toggle(int bitVector, int index) {
if(index<0) return bitVector;
int mask= 1<<index;
if((bitVector&mask)==0) {
bitVector|=mask;
} else {
bitVector&= ~mask;
}
return bitVector;
}
// ์ ํํ ๋นํธ ํ๊ฐ๋ง 1๋ก ์ธํ
๋์๋์ง ํ์ธ์ํด ์ฃผ์ด์ง ์ ์๊ฐ์์ 1์ ๋บ๋ค AND์ฐ์ฐ
boolean checkExactlyOnBitSet(int bitVector) {
return (bitVector&(bitVector-1))==0;
}
[ Q5. ํ๋๋นผ๊ธฐ ]
๋ฌธ์์ด์ ํธ์งํ๋ ๋ฐฉ๋ฒ์๋ ์ธ๊ฐ์ง ์ข ๋ฅ๊ฐ ์๋ค. ๋ฌธ์์ฝ์ , ๋ฌธ์์ญ์ , ๋ฌธ์๊ต์ฒด.
๋ฌธ์์ด ๋๊ฐ๊ฐ ์ฃผ์ด์ง ๊ฒฝ์ฐ ๋ฌธ์์ด์ ๊ฐ๊ฒ ๋ง๋ค๊ธฐ ์ํ ํธ์งํ์๊ฐ 1ํ ์ด๋ด์ธ์ง ํ์ธํ๋ ํจ์ ์์ฑ.
์์
pale,ple -> true
pales,pale -> true
pale,bale -> true
pale,bake -> false
- ๋ด๋ต์ -
1. ๋ฌธ์์ ๊ธธ์ด๊ฐ ๊ฐ๊ฑฐ๋ 1๊ฐ ์ฐจ์ด์ธ ๊ฒฝ์ฐ์๋ง ํธ์ง ํ์ 1์ด ๊ฐ๋ฅ
=> ๋ฌธ์์ด์ด ์๋ฒฝ ๋์ผํ๋ฉด true, ๊ธธ์ด์ฐจ์ด๊ฐ 2์ด์์ธ ๊ฒฝ์ฐ false
3. ๊ธธ์ด๊ฐ ๊ฐ๋ค๋ฉด ํ ๋ฌธ์๋ง ๋ฌ๋ผ์ผ ๊ต์ฑ๊ฐ๋ฅ
4. ๊ธธ์ด๊ฐ ๋ค๋ฅด๋ค๋ฉด ํ๋ฌธ์๋ง ๋นผ๊ณ ๊ฐ์์ผ ์ถ๊ฐ ๋๋ ์ญ์ ๊ฐ ๊ฐ๋ฅ
boolean editableString(String str1, String str2) {
if (str1.equals(str2)) return true;
if (Math.abs(str1.length()-str2.length())>1) return false;
char[] char1=str1.toCharArray();
char[] char2=str2.toCharArray();
int countDiff=0;
// ๊ธธ์ด๊ฐ ๊ฐ๋ค๋ฉด ๊ต์ฑ๋ฐฉ๋ฒ ํ์ธ
if(char1.length==char2.length) {
for (int i=0;i<char1.length;i++) {
if(char1[i]!=char2[i]) countDiff++;
if(countDiff>1) return false;
}
} else { //๊ธธ์ด๊ฐ ๋ค๋ฅด๋ค๋ฉด ๋นผ๊ธฐ๋ ๋ํ๊ธฐ๋ฐฉ๋ฒ ํ์ธ
int j=0;
for (int i=0;i<char1.length;i++) {
if (char1[i]==char2[j]) {
j++;
continue;
} else {
countDiff++;
if (countDiff>1) return false;
if (str2.length()>str1.length()) {
i--;
j++;
}
}
}
}
return true;
}
"ํ์ง๋ง ์์ด๋ ๊ฒ ๋ณต์กํ๊ฒ ๊ฐ์ง?"
=> ๋ชจ๋ฒ๋ต์์ ๋ณด๊ณ ๋๋๊ฒ์ ์ฐ์ฐ์ ๋ฉ์๋๋ก ํ์ฉํ๋ฉด ๋๋ค๋ ๊ฒ!! : ํด๋ฒ1 ์ฒ๋ผ
=> ๋๋ ํด๋ฒ2 ์ฒ๋ผ ๊ณตํต ์ฐ์ฐ์ ๋ฌถ์ด์ ํ๊ธฐํ๋๊ฒ ์ฐธ๊ณ
- ๋ชจ๋ฒ๋ต์ -
๊ฐ ์ฐ์ฐ์ด ๋ฌด์์ ์๋ฏธํ๋๊ฐ๋ฅผ ํ์
1. ๊ต์ฑ : ๋ ๋ฌธ์์ด์์ ๋จ ํ๋์ ๋ฌธ์๋ง ๋ฌ๋ผ์ผ ํจ
2. ์ฝ์ : ํ ๊ณต๊ฐ๋ง ๋น๊ณต๊ฐ์ผ๋ก ๋ ๊ฒฝ์ฐ ๋๋จธ์ง ๋ถ๋ถ์ด ๋์ผ
3. ์ญ์ : ์ฝ์ ์ ๋ฐ๋
ํด๋ฒ1) ๋ฐ๋ผ์ ์ฝ์ ๊ณผ ์ญ์ ๋ ํ๋๋ก ํฉ์น๊ณ , ๊ต์ฑ๋ ๋ณ๋๋ก ํ์ธ
=> ์ด๋ ๋ฌธ์์ด์ ๊ธธ์ด๋ฅผ ์๊ณ ์์ด์ผ ์ฐ์ฐ์ ๊ฒฐ์ ๊ฐ๋ฅ
boolean oneEditAway(String first, String second) {
if(first.length() == second.length()) {
return oneEditReplace(first,second);
} else if (first.length()+1==second.length()) {
return oneEditInsert(first,second);
} else if (first.length()-1==second.length()) {
return oneEditInsert(second, first);
}
return false;
}
boolean oneEditReplace(String s1, String s2) {
boolean foundDifference=false;
for(int i=0;i<s1.length();i++) {
if(s1.charAt(i)!=s2.charAt(i)) {
if (foundDifference) {
return false;
}
foundDifference=true;
}
}
return true;
}
// s1์ ๋ฌธ์ํ๋๋ฅผ ์ฝ์
ํด์ s2๋ฅผ ๋ง๋ค ์ ์๋๊ฐ ํ์ธ
boolean oneEditInsert(String s1, String s2) {
int index1=0;
int index2=0;
while(index2<s2.length() && index1<s1.length()) {
if(s1.charAt(index1)!=s2.charAt(index2)) {
if(index1!=index2) {
return false;
}
index2++;
} else {
index1++;
index2++;
}
}
return true;
}
ํด๋ฒ2) ์ ํด๋ฒ1์ oneEditReplace์ oneEditInsert๊ฐ ๋น์ทํ๊ธฐ ๋๋ฌธ์ ํ๋๋ก ํฉ์น ์ ์๋ค๋ ๊ฒ
๊ต์ฑ(oneEditReplace)์์๋ ํ๋๊ทธ๊ฐ๋ง ๋ฐ๊พธ์ด์ฃผ๊ณ , ์ฝ์ /์ญ์ (oneEditInsert)์์๋ ์งง์ ๋ฌธ์์ด์ ํฌ์ธํฐ๋ง
์ฆ๊ฐ์ํค๋ ๊ฒ์ผ๋ก ํ๋์ ๋ฉ์๋๋ก ํฉ์นจ
// ํด๋ฒ2) ์ ๋ ๋ฉ์๋๋ฅผ ํ๋๋ก ํฉ์นจ
boolean oneEditWay(String first, String second) {
// ๊ธธ์ด์ฒดํฌ
if(Math.abs(first.length()-second.length())>1) return false;
// ๊ธธ์ด๊ฐ ์งง์ ๋ฌธ์์ด๊ณผ ๊ธด ๋ฌธ์์ด ์ฐพ๊ธฐ
String s1=first.length()<second.length()? first:second; // ์งง์ ๋ฌธ์์ด
String s2=first.length()<second.length()? second:first; // ๊ธด ๋ฌธ์์ด
int index1=0;
int index2=0;
boolean foundDifference=false;
while(index2<s2.length() && index1<s1.length()) {
if(s1.charAt(index1) != s2.charAt(index2)) {
// ๋ฐ๋์ ์ฒซ๋ฒ์งธ๋ก ๋ค๋ฅธ ๋ฌธ์์ฌ์ผํ๋ค
if(foundDifference) return false;
foundDifference=true;
// ๊ต์ฑ์ ๊ฒฝ์ฐ ์งง์ ๋ฌธ์์ด์ ํฌ์ธํฐ๋ฅผ ์ฆ๊ฐ
if(s1.length()==s2.length()) {
index1++;
}
} else {
index1++; // ๋ ๋ฌธ์๊ฐ ๊ฐ์ ๊ฒฝ์ฐ
}
index2++; // ์ธ์ ๋ ๊ธด ๋ฌธ์์ด์ ํฌ์ธํฐ๋ ์ฆ๊ฐ
}
return true;
}
[ Q6. ๋ฌธ์์ด ์์ถ ]
๋ฐ๋ณต๋๋ ๋ฌธ์์ ๊ฐ์๋ฅผ ์ธ๋ ๋ฐฉ์์ ๊ธฐ๋ณธ์ ์ธ ๋ฌธ์์ด ์์ถ ๋ฉ์๋๋ฅผ ์์ฑํ๋ผ. ์๋ฅผ๋ค์ด ๋ฌธ์์ด aabccccaaa๋ฅผ ์์ถํ๋ฉด a2b1c5a3์ด ๋๋ค. ๋ง์ฝ ์์ถ๋ ๋ฌธ์์ด์ ๊ธธ์ด๊ฐ ๊ธฐ์กด ๋ฌธ์์ด ๊ธธ์ด๋ณด๋ค ๊ธธ๋ค๋ฉด ๊ธฐ์กด ๋ฌธ์์ด์ ๋ฐํํด์ผํ๋ค. ๋ฌธ์์ด์ ๋์๋ฌธ์ ์ํ๋ฒณ(a~z)์ผ๋ก๋ง ์ด๋ฃจ์ด์ ธ์๋ค.
- ๋ด ํ์ด -
๋๊ฐ์ ํฌ์ธํฐ๋ฅผ ์ด์ฉํ์ฌ ๋น๊ตํ๋ฉฐ ๊ฐ์ ๋ฌธ์๋ฅผ ์ธ๋ ๋ณ์๋ฅผ ์ฌ์ฉ, sb๋ฅผ ์ด์ฉํ์ฌ ๋ฐํ๊ฐ์์ฑ
String compressedString(String str) {
// ๋๊ฐ์ ํฌ์ธํฐ ์ด์ฉ
int p1=0;
int p2=1;
int count=1;
// ์ถ๋ ฅ๋ฌธ์์ด์์ฑ
StringBuilder sb=new StringBuilder();
while(p2<str.length()) {
if(str.charAt(p1)==str.charAt(p2)) {
count++;
} else {
sb.append(str.charAt(p1));
sb.append(count);
count=1;
p1=p2;
}
p2+=1;
}
sb.append(str.charAt(p1));
sb.append(count);
if(sb.length()>str.length()) return str;
return sb.toString();
}
"๋ญ๊ฐ ์ธ๋ฐ์์ด ๋ฐ๋ณต๋๋ ์ฝ๋๋ฅผ ์ ์๊ฑฐ๊ฐ์๋ฐ.."
1. ์ผ๋จ return๋ถ๋ถ์์ if๋ฌธ์ ์ฌ์ฉํ๊ธฐ๋ณด๋ค [ ? : ]๋ฌธ์ ํ์ฉํ๋ ๊ฒ์ด ์ข์ ๊ฒ ๊ฐ๋ค!
2. ๊ตณ์ด ํฌ์ธํฐ๋ฅผ ์ด์ฉํ์ง ์์๊ณ for๋ฌธ์ ํ์ฉํ์ฌ ๊ฐ๋จํ๊ฒ ํํ์ด ๊ฐ๋ฅํ๋ค? > ํด๋ฒ1์ฐธ๊ณ .
- ๋ชจ๋ฒ๋ต์ -
ํด๋ฒ1) ๋ฌธ์์ด์ ์ํ > ์๋ก์ด ๋ฌธ์์ด์ ๋ณต์ฌํ๊ณ ๋ฐ๋ณต๋๋ ํ์์ธ๊ธฐ
> ๋งค๋ฒ ํ์ฌ๋ฌธ์์ ๋ค์๋ฌธ์๊ฐ ๊ฐ์์ง ์ฒดํฌ ํ ๋ค๋ฅธ๊ฒฝ์ฐ ์์ถํํ๋ก ๋ฌธ์์ด์ ์ถ๊ฐ
๋ฌธ์์ด ๊ธธ์ดp, ์ฐ์๋๋ ๋ฌธ์์ด์ ๊ฐ์k๋ผ๊ณ ํ ๋, ์ฝ๋ ์ํ์๊ฐ์ O(p+k^2)
์ฆ Stringํด๋์ค๋ฅผ ์ด์ฉํ๋ฉด ๋ฌธ์์ด์ ํฉ์น๋๋ฐ O(n^2)์ ์๊ฐ์ด ์์ : ๋นํจ์จ์ !
๋ฐ๋ผ์ ๊ฐ์ ๋ฐฉ๋ฒ์ด์ด๋ StringBuilderํด๋์ค๋ฅผ ์ฌ์ฉํ๋ฉด ๊ฐ์ ๊ฐ๋ฅ
String compressBad(String str) {
String compressedString="";
int countConsecutive=0;
for(int i=0;i<str.length();i++) {
countConsecutive++;
// ๋ค์๋ฌธ์์ ํ์ฌ๋ฌธ์๊ฐ ๊ฐ์ง์๋ค๋ฉด ํ์ฌ๋ฌธ์๋ฅผ ๊ฒฐ๊ณผ๋ฌธ์์ด์ ์ถ๊ฐ
if(i+1>=str.length() || str.charAt(i)!=str.charAt(i+1)) {
compressedString+=""+str.charAt(i)+countConsecutive;
countConsecutive=0;
}
}
return compressedString.length()<str.length()? compressedString:str;
}
String compress(String str) {
StringBuilder compressedString=new StringBuilder();
int countConsecutive=0;
for(int i=0;i<str.length();i++) {
countConsecutive++;
// ๋ค์๋ฌธ์์ ํ์ฌ๋ฌธ์๊ฐ ๊ฐ์ง์๋ค๋ฉด ํ์ฌ๋ฌธ์๋ฅผ ๊ฒฐ๊ณผ๋ฌธ์์ด์ ์ถ๊ฐ
if(i+1>=str.length() || str.charAt(i)!=str.charAt(i+1)) {
compressedString.append(str.charAt(i));
compressedString.append(countConsecutive);
countConsecutive=0;
}
}
return compressedString.length()<str.length()? compressedString.toString():str;
}
ํด๋ฒ2) ์ ํ์ด์ฒ๋ผ ์์ถ๋ฌธ์์ด์ ๋จผ์ ๋ง๋ค๊ณ ๋์ค์ ๊ธธ์ด๋ฅผ ๋น๊ตํ๋ ๋ฐฉ๋ฒ์ด ์๋
๋จผ์ ๋ฌธ์์ด์ ๊ธธ์ด๋ฅผ ํ์ธํด ๋ณผ ์ ์๋ค๋ฉด, ์ฐ์์ ์ผ๋ก ๋ฐ๋ณต๋๋ ๋ฌธ์๊ฐ ๋ง์ง์์ ๊ฒฝ์ฐ ์๋ ๊ฐ์ ๊ฐ๋ฅ
(์ฆ ์์ถ๋ฌธ์์ด์ ๊ตณ์ด ๋ง๋ค ํ์๊ฐ ์๋ค๋ ์ด์ผ๊ธฐ)
1. ๋จ์ : ๊ทธ๋ฌ๋ ค๋ฉด ๋ฌธ์์ด์ 2๋ฒ ์ํํด์ผํ๊ณ ๋น์ทํ ์ฝ๋๋ฅผ 2๋ฒ ์์ฑํด์ผํจ
2. ์ฅ์ : StringBuilderํฌ๊ธฐ๋ฅผ ๋ฏธ๋ฆฌ์ค์ ๊ฐ๋ฅ
// ํด๋ฒ3) ๋ฌธ์๊ธธ์ด ๋ฏธ๋ฆฌ๋น๊ตํ์ฌ ์์ถ๋ฌธ์์ด ๋ง๋ค์ง๋ง์ง ๊ฒฐ์
// => ๋จ์ ์ ๋๋ฒ์ํํ๊ณ ๋น์ทํ ์ฝ๋๋ฅผ ๋๋ฒ์์ฑํด์ผํ๋ค๋๊ฒ
String isCompressed(String str) {
// ์์ถ๋ ๋ฌธ์์ด์ ๊ธธ์ด๊ฐ ์
๋ ฅ ๋ฌธ์์ด๋ณด๋ค ๊ธธ๋ค๋ฉด ์
๋ ฅ๋ฌธ์์ด ๋ฐํ
int finalLength=countCompression(str);
if(finalLength>=str.length()) return str;
StringBuilder compressed=new StringBuilder(finalLength); // ์ฒ์ํฌ๊ธฐ๋งํผ์ sb์์ฑ
int countConsecutive=0;
for(int i=0;i<str.length();i++) {
countConsecutive++;
// ๋ง์ง๋ง ๋ฌธ์๊ฑฐ๋, ๋ค์ ๋ฌธ์์ ํ์ฌ๋ฌธ์๊ฐ ๊ฐ์ง์๋ค๋ฉด ํ์ฌ๋ฌธ์๋ฅผ ๊ฒฐ๊ณผ ๋ฌธ์์ด์ ์ถ๊ฐ
if(i+1>=str.length()||str.charAt(i)!=str.charAt(i+1)) {
compressed.append(str.charAt(i));
compressed.append(countConsecutive);
countConsecutive++;
}
}
return compressed.toString();
}
// countCompression : ์์ถ๋ฌธ์์ด์ ์์ฑํ์ง์๊ณ ๊ธธ์ด๋ง ์ธ๋ ๋ฉ์๋
int countCompression(String str) {
int compressedLength=0;
int countConsecutive=0;
for(int i=0;i<str.length();i++) {
countConsecutive++;
// ๋ง์ง๋ง ๋ฌธ์๊ฑฐ๋, ๋ค์ ๋ฌธ์์ ํ์ฌ๋ฌธ์๊ฐ ๊ฐ์ง์๋ค๋ฉด ๊ธธ์ด๋ฅผ ์ฆ๊ฐ์ํจ๋ค
if(i+1>=str.length()||str.charAt(i)!=str.charAt(i+1)) {
compressedLength+=1+String.valueOf(countConsecutive).length(); // String.valueOf(*) : String์ผ๋ก ๋ณํ.
countConsecutive++;
}
}
return compressedLength;
}
[ Q7. ํ๋ ฌํ์ ]
์ด๋ฏธ์ง๋ฅผ ํํํ๋ NxNํ๋ ฌ์ด ์๋ค. ์ด๋ฏธ์ง์ ๊ฐ ํฝ์ ์ 4๋ฐ์ดํธ๋ก ํํ๋๋ค. ์ด๋ ์ด๋ฏธ์ง๋ฅผ 90๋ ํ์ ์ํค๋ ๋ฉ์๋๋ฅผ ์์ฑํ๋ผ. ํ๋ ฌ์ ์ถ๊ฐ๋ก ์ฌ์ฉํ๋ ์๊ณ ์ ํ ์ ์๊ฒ ๋๊ฐ?
- ๋ด ํ์ด -
์์ ํ์ง๋ฅผ ๋ชปํ์ด, ์๋ํ๋ฉด ํ๋ ฌ์ ์ด๋ป๊ฒ ์ ์ฅํด์ ํ์ฉํ๋์ง ๊ฐ๋ ์์๊ฑฐ๋ ,,!
์ฐ์ ํ๋ ฌ์ int[][]์ 2์ฐจ์ ๋ฐฐ์ด๋ก ํํํ๋ฉฐ > ์ธ๋ฑ์ค๋ฅผ ํ์ฉํ์ฌ ๋ฌธ์ ๋ฅผ ํธ๋ ๊ฒ!
์ด๋ ํต์ฌ์!
์ธ๋ฑ์ค์ ์์๊ณผ ๋์ ์ด๋์ธ๊ฐ? ์ธ๋ฑ์ค๋ฅผ ์ด๋ป๊ฒ ๋๋๊ฒ์ธ๊ฐ? ๋ฐ๋ณต๋ฌธ์์ offset๊ฐ์ ๋ณ์๋ฅผ ์ ํ์ฉํด์ผํ๋ค?
- ๋ชจ๋ฒ๋ต์ -
1. ์์ชฝ ๋ชจ์๋ฆฌ ๋ฐฐ์ด ๋ณต์ฌ
2. ์ผ์ชฝ ๋ชจ์๋ฆฌ๋ฅผ ๋งจ์๋ก, ์๋์ชฝ ๋ชจ์๋ฆฌ๋ฅผ ์ผ์ชฝ์ผ๋ก, ์ค๋ฅธ์ชฝ ๋ชจ์๋ฆฌ๋ฅผ ๋งจ์๋๋ก ์ด๋
ํ์ง๋ง, ์ด๋ O(N)๋งํผ์ ๋ฉ๋ชจ๋ฆฌ๊ฐ ์ถ๊ฐ๋ก ์๋ชจ๋๋ค > ๋ฐ๋ผ์ ์ธ๋ฑ์ค๋ก ๊ต์ฒด์์ ์ ์งํ
3. ์์๊ฐ์ ๊ต์ฑ์์ ์ ๋ ์ด์ด ๋ฐ๊นฅ์ชฝ์์๋ถํฐ ์์ชฝ์ผ๋ก ์งํํด๊ฐ๋ฉฐ ์ํ(์ญ์ผ๋ก๋ ๋ฌด๊ด)
์๋ ์๊ณ ๋ฆฌ์ฆ์ ๋ณต์ก๋๋ O(N^2)์ธ๋ฐ ๋ชจ๋ ์์๋ฅผ ๋ค ๊ฑด๋๋ ค๋ด์ผํ๊ธฐ ๋๋ฌธ์ ์ต์ ์ ๋ฐฉ๋ฒ์!
boolean rotate(int[][] matrix) {
// ํ๋ ฌ์ N์ด 0์ด๊ฑฐ๋, ํ์๊ฐ์์ ์ด์๊ฐ์๊ฐ ๋ค๋ฅธ๊ฒฝ์ฐ ์ข
๋ฃ
if(matrix.length==0 || matrix.length!=matrix[0].length) return false;
int n=matrix.length;
// ์ฌ๊ธฐ์ ๋ปํ๋ ๋ ์ด์ด๋ ํ๋ ฌ์ ๋ฐ๊นฅ ๋ง ํ์ค์ ๋งํจ ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ n/2๋ฒ ํ๋๊ฒ
// => ํ์์ธ ๊ฒฝ์ฐ ๋ง์ง๋ง ๋ ์ด์ด๋ ํ๋์ด๊ธฐ ๋๋ฌธํค ํ์ ์ด ์๋ฏธ์์
// => ๋ ์ด์ด ๊ฐ์๋งํผ ๋ฐ๋ณต
for(int layer=0; layer<n/2; layer++) {
int first=layer; // ํ์ ๋ปํจ
int last=n-1-layer; // ๋ค์ง๊ธฐ ํ ์ด์ ๋ : ํ๋๋ ๊ผญ์ง์ ์ผ๋ก ์ ์ธ,ํ๋งํผ ์ ์ธ
//์ฌ๊ธฐ๊ฐ ๋ ์ด์ด๋ด์ฉ ๊ต์ฒด ๋ถ๋ถ
for(int i=first;i<last;i++) { // ํ์๋ฐ๋ณต
int offset=i-first; // ์ด์ ์ง์
int top=matrix[first][i]; // ์๋ถ๋ถ์ ์ ์ฅ
matrix[first][i]=matrix[last-offset][first]; // ์ผ > ์
matrix[last-offset][first]=matrix[last][last-offset]; // ์ > ์ผ
matrix[last][last-offset]=matrix[i][last]; // ์ค > ์
matrix[i][last]=top; // ์ > ์ค
}
}
return true;
}
[ Q8. 0 ํ๋ ฌ ]
MxNํ๋ ฌ์ ํ ์์๊ฐ 0์ผ ๊ฒฝ์ฐ, ํด๋น ์์๊ฐ ์ํ ํ๊ณผ ์ด์ ๋ชจ๋ ์์๋ฅผ 0์ผ๋ก ์ค์ ํ๋ ์๊ณ ๋ฆฌ์ฆ์ ์์ฑํ๋ผ.
- ๋ด ํ์ด -
1. ํ๋ ฌ์ ํ์ผ๋ฉด์ 0์ ์ฐพ๊ธฐ > ์ธ๋ฑ์ค ์ ์ฅ
2. ํด๋น ํ๊ณผ ์ด์ 0์ผ๋ก ๋ณ๊ฒฝ
void changeMatrix(int[][] matrix) {
int m=matrix.length;
int n=matrix[0].length;
int zeroPointI=0;
int zeroPointJ=0;
for (int i=0;i<m;i++) {
for(int j=0;j<n;j++) {
if (matrix[i][j]==0) {
zeroPointI=i;
zeroPointJ=j;
}
}
}
for(int column=0;column<n;column++) {
matrix[zeroPointI][column]=0;
}
for(int row=0;row<n;row++) {
matrix[row][zeroPointJ]=0;
}
}
"์ด๋ ๊ฒ ํ๋ฉด ๋ณต์ก๋๊ฐ O(MN)์ธ ๊ฒ ๊ฐ์๋ฐ.."
=> ๋ง์, ์ ํํ ์์น๋ฅผ ๊ธฐ๋กํ๋ฉด ๊ทธ๋งํผ์ ๊ณต๊ฐ์ด ํ์ํ๋ค๊ณ ํด, ์ด์งํผ ๋ฐ๊ฟ๊บผ์์? 0์ ์ฐพ๊ธฐ๋งํ๋ฉด? ์ ํํ ์์น๋ ํ์์๋ค๋ ๊ฑฐ์ง!
๊ทธ๋ฌ๋๊น ์๋ ํด๋ฒ์ฒ๋ผ
๋ฐฉ๋ฒ 1. ๋ถ์ธ๋ฐฐ์ด๋ก ์ฒดํฌ ๋๋ ๋นํธ๋ฐฑํฐ๋ก ์ฒดํฌ
๋ฐฉ๋ฒ 2. ์ฒซํ๊ณผ ์ฒซ์ด์ ํ์ฉํ์ฌ ์ฒดํฌํ๋ ๋ฐฉ๋ฒ์ ์ฌ์ฉ
* ์ ๊ทธ๋ฆฌ๊ณ ! ๋ ๋ฉ์๋๋ฅผ ๋ถ๋ฆฌํ๋ ์ฐ์ต์ ์ข ํด์ผํ ๊ฒ ๊ฐ์..!
- ๋ชจ๋ฒ๋ต์ -
ํด๋ฒ1) ๋ถ์ธ๋ฐฐ์ด/๋นํธ๋ฒกํฐ : ๋ด ํ์ด์ฒ๋ผ ์ ํํ ์์น๋ฅผ ๊ธฐ๋กํ๊ฒ๋๋ฉด O(MN)๋งํผ์ ๊ณต๊ฐ์ด ํ์
=> ํ์ง๋ง ์ด์งํผ ์ด ํ์ด๋๊ฐ์, ์ด ์ด ์ด๋๊ฐ์ ์๋ค๋ฉด ๋ค 0์ ๋ฐ๊ฟ๊บผ๋ ์ ํํ ์์น๊ฐ ํ์ํ์ง์์!
void setZero(int[][] matrix) {
// ๋ถ์ธ๋ฐฐ์ด๋ก ์ฒดํฌํ๋ค > ๋นํธ๋ฐฑํฐ๋ก ์ฒดํฌํ๋ฉด ๊ณต๊ฐ ํจ์จ์ฑ์ ์ค์ผ์์๊ธดํ์ง๋ง ๋ณต์ก๋๋ ์ฌ์ ํ O(N)
boolean[] row = new boolean[matrix.length];
boolean[] column = new boolean[matrix[0].length];
// ๊ฐ์ด 0์ธ ํ๊ณผ ์ด์ ์ธ๋ฑ์ค๋ฅผ ์ ์ฅ
for(int i=0; i<matrix.length;i++) {
for(int j=0; j<matrix[0].length;j++) {
if(matrix[i][j]==0) {
row[i]=true;
column[j]=true;
}
}
}
// ํ์ ์์๋ฅผ ์ ๋ถ 0์ผ๋ก ๋ณ๊ฒฝ
for(int i=0;i<row.length;i++) {
if(row[i]) nullifyRow(matrix,i);
}
// ์ด์ ์์๋ฅผ ์ ๋ถ 0์ผ๋ก ๋ณ๊ฒฝ
for(int j=0;j<column.length;j++) {
if(column[j]) nullifycolumn(matrix,j);
}
}
void nullifyRow(int[][] matrix,int row) {
for(int j=0;j<matrix[0].length;j++) {
matrix[row][j]=0;
}
}
void nullifycolumn(int[][] matrix,int column) {
for(int i=0;i<matrix.length;i++) {
matrix[i][column]=0;
}
}
ํ์ง๋ง ์ฌ์ ํ ๊ณต๊ฐ๋ณต์ก๋๋ O(N).
ํด๋ฒ2) ์ฒซ๋ฒ์งธํ์ row๋ฐฐ์ด๋ก, ์ฒซ๋ฒ์งธ ์ด์ column๋ฐฐ์ด๋ก ์ฌ์ฉํ๋ฉด ๊ณต๊ฐํจ์จ์ฑ์ O(1)๋ก ๋ฎ์ถ ์ ์๋ค.
1) ์ฒซ๋ฒ์งธ ํ๊ณผ ์ฒซ๋ฒ์งธ ์ด์์ 0์ด ์๋์ง ๊ฒ์ฌํ ๋ค์,
=> ์๋ค๋ฉด rowHashZero์ columnHashZero๋ณ์๋ฅผ ์ฐธ์ผ๋ก ์ค์
=> ๋์ค์ ์ฒซ๋ฒ์งธ ํ๊ณผ ์ฒซ๋ฒ์งธ ์ด์ 0์ผ๋ก ๋ง๋๋ ์์ ์ ์ํํ ๊ฒ
2) ๋ฐฐ์ด์ ๋๋จธ์ง ๋ถ๋ถ์ ์ํํ๋ฉฐ ๊ฐ์ด 0์ธ matrix[i][j]๋ฅผ ๋ง๋ ๋๋ง๋ค matrix[i][0]์ matrix[0][j]๋ฅผ 0์ผ๋ก ์ค์
3) ํ๋ ฌ์ ๋๋จธ์ง ๋ถ๋ถ์ ์ํํ๋ฉฐ matrix[i][0]์ด 0์ธ ๋ชจ๋ ํ i๋ฅผ 0์ผ๋ก ๋ง๋ ๋ค.
4) ํ๋ ฌ์ ๋๋จธ์ง ๋ถ๋ถ์ ์ํํ๋ฉฐ matrix[0][j]์ด 0์ธ ๋ชจ๋ ์ด j๋ฅผ 0์ผ๋ก ๋ง๋ ๋ค.
5) ๋งจ ์ฒ์ ์ค์ ํ ๊ฐ์ ๋ฐ๋ผ ํ์ํ ๊ฒฝ์ฐ ์ฒซ๋ฒ์งธํ๊ณผ ์ฒซ๋ฒ์งธ ์ด์ 0์ผ๋ก ๋ง๋ ๋ค.
void setZeros(int[][] matrix) {
boolean rowHashZero=false;
boolean colHashZero=false;
// ์ฒซ๋ฒ์งธ ํ์ 0์ด ์๋์ง ํ์ธ
for(int j=0;j<matrix[0].length;j++) {
if(matrix[0][j]==0) {
rowHashZero=true;
break;
}
}
// ์ฒซ๋ฒ์งธ ์ด์ 0์ด ์๋์ง ํ์ธ
for(int i=0;i<matrix.length;i++) {
if(matrix[i][0]==0) {
colHashZero=true;
break;
}
}
// ๋๋จธ์ง ๋ฐฐ์ด์ 0์ด ์๋์ง ํ์ธ
for(int i=1;i<matrix.length;i++) {
for(int j=1;j<matrix[0].length;j++) {
if(matrix[i][j]==0) {
matrix[i][0]=0;
matrix[0][j]=0;
}
}
}
// ์ฒซ๋ฒ์งธ ์ด์ ์ด์ฉํด์ ํ์ 0์ผ๋ก ๋ฐ๊ฟ
for(int i=1;i<matrix.length;i++) {
if(matrix[i][0]==0) {
nullifyRow(matrix, i);
}
}
// ์ฒซ๋ฒ์งธ ํ์ ์ด์ฉํด์ ์ด์ 0์ผ๋ก ๋ฐ๊ฟ
for(int j=1;j<matrix[0].length;j++) {
if(matrix[0][j]==0) {
nullifycolumn(matrix, j);
}
}
// ์ฒซ๋ฒ์งธ ํ์ 0์ผ๋ก ๋ฐ๊พผ๋ค
if(rowHashZero) nullifyRow(matrix, 0);
// ์ฒซ๋ฒ์งธ ์ด์ 0์ผ๋ก ๋ฐ๊พผ๋ค
if(colHashZero) nullifycolumn(matrix, 0);
}
[ Q9. ๋ฌธ์์ดํ์ ]
ํ ๋จ์ด๊ฐ ๋ค๋ฅธ ๋ฌธ์์ด์ ํฌํจ๋์ด ์๋์ง ํ๋ณํ๋ isSubstring์ด๋ผ๋ ๋ฉ์๋๊ฐ ์๋ค๊ณ ํ์. s1๊ณผ s2์ ๋ ๋ฌธ์์ด์ด ์ฃผ์ด์ก๊ณ , s2๊ฐ s1์ ํ์ ์ํจ ๊ฒฐ๊ณผ์ธ์ง ํ๋ณํ๊ณ ์ํ๋ค(๊ฐ๋ น 'waterbottle'์ 'erbottlewat'๋ฅผ ํ์ ์์ผ์ ์ป์ ์ ์๋ ๋ฌธ์์ด์ด๋ค). isSubstring๋ฉ์๋๋ฅผ ํ๋ฒ๋ง ํธ์ถํด์ ํ๋ณํ ์ ์๋ ์ฝ๋๋ฅผ ์์ฑํ๋ผ.
- ๋ด๋ต์ -
1. ๋ฉ์ธ ๋ฌธ์์ด์ ์ฒซ ๊ธ์๋ฅผ ์๋ธ ๋ฌธ์์ด์์ ์ฐพ์ ๋ฆฌ์คํธ์ ์ ์ฅ
2. ๋ฆฌ์คํธ์ ์ ์ฅ๋ ์ฒดํฌ์์ ๋ง๋ค ์งค๋ผ์ ์ํ๋ง๋ค๊ธฐ > ๊ฐ์์ง์ฒดํฌ
*์ ๊ทผ๋ฐ ๋ ๋นํจ์จ์ ์ด๋ผ ์๊ฐ ๋ฌ..* ๊ทธ์ด์ ๋ฌธ์ ๋ฅผ ์๋ชป์ดํดํจ ๋ฉ์๋๊ฐ ใ ใ ๋ค๊ณ ํ์.. ์ด๊ฑฐ... ์ด ใ ์คใ !!!
boolean isRotation(String mainString, String subString) {
// 1. main์ ์ฒซ๊ธ์ง๋ฅผ sub์์ ์ฐพ๊ธฐ
char firstLetter=mainString.charAt(0);
ArrayList<Integer> checkPoint=new ArrayList<Integer>();
for(int i=0;i<subString.length();i++) {
if(subString.charAt(i)==firstLetter) {
checkPoint.add(i);
}
}
// 2. ์งค๋ผ์ ์ํ๊ณผ ๊ฐ์์ง ๋น๊ต
for(int i:checkPoint) {
StringBuilder sb=new StringBuilder();
sb.append(subString.substring(i));
sb.append(subString.substring(0,i));
if(mainString.equals(sb.toString())) return true;
}
return false;
}
"์.. ๊ทผ๋ฐ ๋ ๋นํจ์จ์ ์ธ๊ฑฐ๊ฐ์.. ์๋ฒฝํ๊ฒ.."
์ ๊ทธ๋ฐ ์๊ฐ์ด ๋ค์๋์ง ํด๋ฒ์ ๋ณด๊ณ ์์์ง. ๋ฌธ์ ๋ฅผ ์ ์ดํดํ์ง๋ชปํ๊ณ ์กฐ๊ฑด์ ํ์ฉํ์ง ์์๊ธฐ ๋๋ฌธ์ด์ผ!!
ํ ๋จ์ด๊ฐ ๋ค๋ฅธ ๋ฌธ์์ด์ ํฌํจ๋์ด ์๋์ง ํ๋ณํ๋ isSubstring์ด๋ผ๋ ๋ฉ์๋๊ฐ ์๋ค๊ณ ํ์.
์ด ๋ฌธ์ฅ์ ๋ณด๋ฉด ์ ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ผ๋ ๊ฑฐ์์....^^!!
- ๋ชจ๋ฒ๋ต์ -
1. ํ์ ์ง์ ์ฐพ๊ธฐ : ํ์ ์ด๋ s1์ x์y๋ก ๋ถ๋ฆฌํ ํ ์ฌ๋ฐฐ์น ํ๊ฒ
2. ์ฌ๊ธฐ์ ํต์ฌ์ ํ์ ๋ yx๊ฐ ์๋๋ผ! ์ธ์ ๋ s2(yx)๋ s1(xyxy)์ ๋ถ๋ถ๋ฌธ์์ด์ด ๋๋ค๋ ๊ฒ!
// => ํ์ ๊ธ์๋ฅผ yx๋ผ ํ๋ฉด ์๋ฌธ์2๋ฒ(xyxy)์ ๋ํด ์ธ์ ๋ ๋ถ๋ถ๋ฌธ์์ด์ด๋ผ๋ ์ !
boolean isRotationStr(String s1, String s2) {
int len=s1.length();
//s1๊ณผ s2์ ๊ธธ์ด๊ฐ ๊ฐ๊ณ ๋น ๋ฌธ์๊ฐ ์๋์ง ํ์ธ
if(len==s2.length() && len>0) {
String s1s1=s1+s1;
return isSubstring(s1s1, s2);
}
return false;
}
1. ๋ฌธ์ ์ ์๋ฏธ๋ฅผ ํ์ ํ๋ ์ฐ์ต
๋ฌธ์ ๋ฅผ ์ ํ๊ธฐ ์ํด์ ์ด๋ค ์๊ณ ๋ฆฌ์ฆ์ ๊ตฌํํด์ผ ํ๋๊ฐ๋ฅผ ์ ๋ฆฌํ๋๊ฒ์ด ์ต์ฐ์ .
์ฆ, ์ด ๋ฌธ์ ์์ ์ด ๋จ์ด์ ์๋ฏธ๋ ๋ฌด์์ธ๊ฐ๋ฅผ ์ ํํ ํ์ ํด์ผ๋ง ํจ. ์๋ฅผ ๋ค๋ฉด ์๋์ ๊ฐ์ด ๋ง์ด๋ค.
- ํ๋ฌธ์์ด : ํ๋ฌธ์์ด์ ์ด๋ค๋ป์ด์ง? ์ ์๋ค๋ก ์ฝ์ด๋ ๋๊ฐ์ ๋จ์ด+์์ด ์ฒ๋ผ ๋ฐ๊ฟ์๋ ์์ด ์์! ๊ทธ๋ฌ๋ฉด ์ด ํ๋ฌธ์์ด์ ๋ง๋ค๊ธฐ ์ํด์ ์ด๋ป๊ฒํด์ผํ์ง? ๋ฐ์ผ๋ก ์ ์์๋ ๋๊ฐ์์ผ์ง! ์ ๊ทธ๋ ๋ค๋ฉด, ๋ฌธ์์ด์ ๊ธธ์ด๊ฐ ์ค์ํ๊ตฌ๋, ๋ฌธ์์ด์ด ์ง์์ผ๋๋ ๊ฐ ๋ฌธ์๊ฐ ๋ชจ๋ ์ง์๊ฐ์ฌ์ผํด! ๋ง์ฝ ์ด๊ธธ์ด๊ฐ ํ์๋ผ๋ฉด ํ์๋ฌธ์๋ ๋ฑ ํ๋๋ง ์์ด์ผํด!
- ์ฐ์ฐ: ๋ฌธ์๋นผ๊ธฐ๋ ์ด๋ค ์กฐ๊ฑด์ผ๋ ์คํ๊ฐ๋ฅํ์ง? ์ ๋ฌธ์์ด์ ๊ธธ์ด๊ฐ ๋ฑ 1๊ฐ๋ง ์ฐจ์ด๋์ผํ๊ณ ๊ทธ ์ฐจ์ด๋๋ ๋ถ๋ถ์ ๊ณต๋ฐฑ์ผ๋ก ์ฑ์ฐ๋ฉด ๊ทธ๊ฑฐ๋๊ณ ๋ค ๊ฐ์์ผํ๋๊ตฌ๋!! ์? ๊ทธ๋ผ ๋ฌธ์๋ํ๊ธฐ๋ ๋ฐ๋๋ก ์๊ฐํ๋ฉด ๋๊ฐ๋ค?
2. ์ฃผ์ด์ง ์กฐ๊ฑด์ ํ์ฉํ๋๊ฐ ์ฒดํฌ. ์ด ์กฐ๊ฑด์ด ์ฃผ์ด์ง ์ด์ ๊ฐ ๋ฌด์์ธ๊ฐ๋ฅผ ํ์ .
๋ฌธ์ ์ ์ธ๋ฐ์๋ ๋ฌธ์ฅ ๋ฐ์๋ ์กด์ฌํ์ง์๋๋ค. ๋ง์ง๋ง ๋ฌธ์ ๊ฐ ๊ทธ ๋ํ์ ์ธ ์.
์ด๋ฏธ ๋ฌธ์ ์ '์ด๋ ํ ๋ฉ์๋๊ฐ ์๋ค๊ณ ๊ฐ์ ํ์~'๋ผ๋ฉด ๊ทธ ๋ถ๋ถ์ ๊ตฌํํ์ง ์์๋ ๋๋ ๊ทธ ๊ธฐ๋ฅ์ ์ฌ์ฉํ ์ ์๋๋ก ์๊ณ ๋ฆฌ์ฆ์ ๊ตฌํํด๋ผ ๋ผ๋ ๋ป์ด์ผ. ์ด๋ฐ๊ฑธ ๋์น๋ฉด ๋ต์ ์ฐ์ผ๋ก ๊ฐ๊ฒ ์ง..
3. ์ด๊ฑด ์ฐจ๊ทผ์ฐจ๊ทผ ์ฐ์ตํด๊ฐ์.
- Big-O : ์๊ณ ๋ฆฌ์ฆ์ด ํจ์จ์ ์ผ๋ก ์ง์ฌ์ก๋์ง๋ฅผ ๊ฐ์ผ๋ก, ๋๋ ์ฝ๋ ์ค๋ก ๋ณด๋๊ฒ ์๋๋ผ ์ ํํ ๊ณ์ฐํ๋ ๋ ธ๋ ฅ์...!
- ๋ฉ์๋ ๋ถ๋ฆฌ : ํ๋์ ๋ฉ์๋์ ์ฒ๋ฆฌํ๊ธฐ๋ณด๋ค ๋ถ๋ฆฌํ๋๋ก ๋ ธ๋ ฅํด๋ณด์!
๋๊ธ