๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
Algoritm/Coding Interview

[1. ๋ฐฐ์—ด/๋ฌธ์ž์—ด] ์ค‘๋ณตํ™•์ธ, ์ˆœ์—ดํ™•์ธ, URLify(๋Œ€์ฒด), ํšŒ๋ฌธ์ˆœ์—ด, ํ•˜๋‚˜๋นผ๊ธฐ, ๋ฌธ์ž์—ด์••์ถ•, ํ–‰๋ ฌํšŒ์ „, 0ํ–‰๋ ฌ, ๋ฌธ์ž์—ดํšŒ์ „

by ๐Ÿ’œautumn 2020. 8. 25.

 [ 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 : ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ํšจ์œจ์ ์œผ๋กœ ์งœ์—ฌ์กŒ๋Š”์ง€๋ฅผ ๊ฐ์œผ๋กœ, ๋˜๋Š” ์ฝ”๋“œ ์ค„๋กœ ๋ณด๋Š”๊ฒŒ ์•„๋‹ˆ๋ผ ์ •ํ™•ํžˆ ๊ณ„์‚ฐํ•˜๋Š” ๋…ธ๋ ฅ์„...!
  • ๋ฉ”์†Œ๋“œ ๋ถ„๋ฆฌ : ํ•˜๋‚˜์˜ ๋ฉ”์†Œ๋“œ์— ์ฒ˜๋ฆฌํ•˜๊ธฐ๋ณด๋‹ค ๋ถ„๋ฆฌํ•˜๋„๋ก ๋…ธ๋ ฅํ•ด๋ณด์ž!

๋Œ“๊ธ€