Post

๐ŸฆŠ 2. Data Structures

01. ํ•ด์‹œํ…Œ์ด๋ธ”

ํ•ด์‹œํ…Œ์ด๋ธ”(hash table)์€ ํšจ์œจ์ ์ธ ํƒ์ƒ‰์„ ์œ„ํ•œ ์ž๋ฃŒ๊ตฌ์กฐ๋กœ์„œ ํ‚ค(key)๋ฅผ ๊ฐ’(value)์— ๋Œ€์‘์‹œํ‚จ๋‹ค.

๊ฐ„๋‹จํ•œ ํ•ด์‹œํ…Œ์ด๋ธ”์€ ์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ(linked list)์™€ ํ•ด์‹œ ์ฝ”๋“œ ํ•จ์ˆ˜(hash code function)๋งŒ ์žˆ์œผ๋ฉด ๋œ๋‹ค.

ํ‚ค์™€ ๊ฐ’์„ ํ•ด์‹œํ…Œ์ด๋ธ”์— ๋„ฃ์„ ๋•Œ๋Š” ๋‹ค์Œ ๊ณผ์ •์„ ๊ฑฐ์นœ๋‹ค.

  1. ํ‚ค์˜ ํ•ด์‹œ ์ฝ”๋“œ๋ฅผ ๊ณ„์‚ฐํ•œ๋‹ค. (ํ‚ค์˜ ๊ฐœ์ˆ˜๋Š” ๋ฌดํ•œํ•˜์ง€๋งŒ int ์˜ ๊ฐœ์ˆ˜๋Š” ์œ ํ•œํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์„œ๋กœ ๋‹ค๋ฅธ ๋‘ ํ‚ค๊ฐ€ ๊ฐ™์€ ํ•ด์‹œ ์ฝ”๋“œ๋ฅผ ๊ฐ€๋ฆฌํ‚ฌ ์ˆ˜๋„ ์žˆ๋‹ค :: ์ถฉ๋Œ)
  2. hash(key) % array_length ์™€ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ํ•ด์‹œ ์ฝ”๋“œ๋ฅผ ์ด์šฉํ•ด ๋ฐฐ์—ด์˜ ์ธ๋ฑ์Šค๋ฅผ ๊ตฌํ•œ๋‹ค.
  3. ๋ฐฐ์—ด์˜ ๊ฐ ์ธ๋ฑ์Šค์—๋Š” ํ‚ค์™€ ๊ฐ’์œผ๋กœ ์ด๋ฃจ์–ด์ง„ ์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ๊ฐ€ ์กด์žฌํ•œ๋‹ค. ํ‚ค์™€ ๊ฐ’์„ ํ•ด๋‹น ์ธ๋ฑ์Šค์— ์ €์žฅํ•œ๋‹ค. ์ถฉ๋Œ์— ๋Œ€๋น„ํ•˜์—ฌ ๋ฐ˜๋“œ์‹œ ์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ๋ฅผ ์ด์šฉํ•ด์•ผ ํ•œ๋‹ค.

์ˆ˜ํ–‰ ์‹œ๊ฐ„

  • ์ตœ์•…์˜ ๊ฒฝ์šฐ : ์ถฉ๋Œ์ด ์ž์ฃผ ๋ฐœ์ƒํ•œ๋‹ค๋ฉด O(N)
  • ์ตœ์„ ์˜ ๊ฒฝ์šฐ : ์ถฉ๋Œ์„ ์ตœ์†Œํ™” ํ•œ๋‹ค๋ฉด O(1)
  • ๊ท ํ˜• ์ด์ง„ ํƒ์ƒ‰ ํŠธ๋ฆฌ์ผ ๊ฒฝ์šฐ : O(logN)

ArrayList ์™€ ๊ฐ€๋ณ€ ํฌ๊ธฐ ๋ฐฐ์—ด

ํŠน์ • ์–ธ์–ด์—์„œ๋Š” ๋ฐฐ์—ด์˜ ํฌ๊ธฐ๋ฅผ ์ž๋™์œผ๋กœ ์กฐ์ ˆํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ์ž๋ฐ” ๊ฐ™์€ ์–ธ์–ด์—์„œ๋Š” ๋ฐฐ์—ด์˜ ๊ธธ์ด๊ฐ€ ๊ณ ์ •๋˜์–ด ์žˆ๋‹ค. ์ด๋Ÿฐ ๊ฒฝ์šฐ์—๋Š” ๋ฐฐ์—ด์„ ๋งŒ๋“ค ๋•Œ ๋ฐฐ์—ด์˜ ํฌ๊ธฐ๋ฅผ ํ•จ๊ป˜ ์ง€์ •ํ•ด์•ผ ํ•œ๋‹ค.

๋™์  ๊ฐ€๋ณ€ ํฌ๊ธฐ ๊ธฐ๋Šฅ์ด ๋‚ด์žฌ๋˜์–ด ์žˆ๋Š” ๋ฐฐ์—ด๊ณผ ๋น„์Šทํ•œ ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ์›ํ•  ๋•Œ ๋ณดํ†ต ArrayList ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

ArrayList๋Š” ํ•„์š”์— ๋”ฐ๋ผ ํฌ๊ธฐ๋ฅผ ๋ณ€ํ™”์‹œํ‚ค๋ฉด์„œ๋„ O(1) ์˜ ์ ‘๊ทผ ์‹œ๊ฐ„์„ ์œ ์ง€ํ•œ๋‹ค.

๋ฐฐ์—ด์ด ๊ฐ€๋“ ์ฐจ๋Š” ์ˆœ๊ฐ„, ๋ฐฐ์—ด์˜ ํฌ๊ธฐ๋ฅผ ๋‘ ๋ฐฐ ๋Š˜๋ฆฌ๋Š”๋ฐ, ์ด ๋•Œ ์‹œ๊ฐ„์€ O(N) ์ด๋‹ค.

ํ•˜์ง€๋งŒ ์ž์ฃผ ๋ฐœ์ƒํ•˜๋Š” ์ผ์ด ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ƒํ™˜ ์ž…๋ ฅ ์‹œ๊ฐ„์œผ๋กœ ๊ณ„์‚ฐํ•˜๋ฉด ์—ฌ์ „ํžˆ O(1) ์„ ์œ ์ง€ํ•œ๋‹ค.

์ƒํ™˜ ์ž…๋ ฅ ์‹œ๊ฐ„์€ ์™œ O(1)์ด ๋˜๋Š”๊ฐ€.

๋ฐฐ์—ด์˜ ํฌ๊ธฐ๋ฅผ K๋กœ ๋Š˜๋ฆฌ๋ฉด ๊ทธ ์ „ ๋ฐฐ์—ด์˜ ํฌ๊ธฐ๋Š” K์˜ ์ ˆ๋ฐ˜์ด์—ˆ์„ ๊ฒƒ์ด๋ฏ€๋กœ K/2 ๋งŒํผ์˜ ์›์†Œ๋ฅผ ๋ณต์‚ฌํ•ด์•ผ ํ•œ๋‹ค.

ํฌ๊ธฐ๊ฐ€ N์ธ ๋ฐฐ์—ด์—์„œ N๊ฐœ์˜ ์›์†Œ๋ฅผ ์‚ฝ์ž…ํ•˜๊ธฐ ์œ„ํ•ด ๋ณต์‚ฌํ•ด์•ผ ํ•˜๋Š” ์›์†Œ์˜ ์ด ๊ฐœ์ˆ˜๋Š”

N/2 + N/4 + N/8 + ... + 2 + 1 ๋กœ N๋ณด๋‹ค ์ž‘๋‹ค.

๋”ฐ๋ผ์„œ N๊ฐœ์˜ ์›์†Œ๋ฅผ ์‚ฝ์ž…ํ•  ๋•Œ ์†Œ์š”๋˜๋Š” ์ž‘์—…์€ O(N) ์ด ๋œ๋‹ค.

ํ‰๊ท ์ ์œผ๋กœ ๊ฐ ์‚ฝ์ž…์€ O(1) ์ด ์†Œ์š”๋œ๋‹ค๊ณ  ํ•  ์ˆ˜ ์žˆ๋‹ค.

StringBuilder

๋ฌธ์ž์—ด์˜ ๋ฆฌ์ŠคํŠธ๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ ์ด ๋ฌธ์ž์—ด๋“ค์„ ํ•˜๋‚˜๋กœ ์ด์–ด ๋ถ™์ด๋ ค๊ณ  ํ•œ๋‹ค. ์ด ๋•Œ์˜ ์ˆ˜ํ–‰์‹œ๊ฐ„์€?

1
2
3
4
5
6
7
String joinWords(String[] words) {
	String sentence = "";
	for (String w : words) {
		sentence = sentence + w;
	}
	return sentence;
}

๋ฌธ์ž์—ด์„ ์ด์–ด๋ถ™์ผ ๋•Œ ๋งˆ๋‹ค 2๊ฐœ์˜ ๋ฌธ์ž์—ด์„ ์ฝ์–ด ๋“ค์ธ ๋’ค ๋ฌธ์ž๋ฅผ ํ•˜๋‚˜ํ•˜๋‚˜ ์ƒˆ๋กœ์šด ๋ฌธ์ž์—ด์— ๋ณต์‚ฌํ•ด์•ผ ํ•œ๋‹ค.

์ฒ˜์Œ์—๋Š” x๊ฐœ, 2๋ฒˆ์งธ๋Š” 2x๊ฐœ, 3๋ฒˆ์งธ๋Š” 3x๊ฐœ โ€ฆ n๋ฒˆ์งธ๋Š” nx๊ฐœ ๋ณต์‚ฌํ•ด์•ผ ํ•œ๋‹ค.

๋”ฐ๋ผ์„œ ์ด ์ˆ˜ํ–‰์‹œ๊ฐ„์€ O(x + 2x + ... + nx) = O(xn^2) ๊ฐ€ ๋œ๋‹ค.

StringBuilder ๋Š” ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค. StringBuilder ๋Š” ๋‹จ์ˆœํ•˜๊ฒŒ ๊ฐ€๋ณ€ ํฌ๊ธฐ ๋ฐฐ์—ด์„ ์ด์šฉํ•ด์„œ ํ•„์š”ํ•œ ๊ฒฝ์šฐ์—๋งŒ ๋ฌธ์ž์—ด์„ ๋ณต์‚ฌํ•˜๊ฒŒ๋” ํ•  ์ˆ˜ ์žˆ๋‹ค.

1
2
3
4
5
6
7
String joinWords(String[] words) {
	StringBuilder sentence = new StringBuilder();
	for (String w : words) {
		sentence.append(w);
	}
	return sentence.toString();
}

02. ์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ

์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ๋Š” ์ฐจ๋ก€๋กœ ์—ฐ๊ฒฐ๋œ ๋…ธ๋“œ๋ฅผ ํ‘œํ˜„ํ•ด์ฃผ๋Š” ์ž๋ฃŒ๊ตฌ์กฐ์ด๋‹ค.

๋‹จ๋ฐฉํ–ฅ ์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ์—์„œ ๊ฐ ๋…ธ๋“œ๋Š” ๋‹ค์Œ ๋…ธ๋“œ๋ฅผ ๊ฐ€๋ฆฌํ‚จ๋‹ค.

์–‘๋ฐฉํ–ฅ ์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ์—์„œ ๊ฐ ๋…ธ๋“œ๋Š” ๋‹ค์Œ ๋…ธ๋“œ์™€ ์ด์ „ ๋…ธ๋“œ๋ฅผ ํ•จ๊ป˜ ๊ฐ€๋ฆฌํ‚จ๋‹ค.

๋ฐฐ์—ด๊ณผ๋Š” ๋‹ฌ๋ฆฌ ์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ์—์„œ๋Š” ํŠน์ • ์ธ๋ฑ์Šค๋ฅผ ์ƒ์ˆ˜ ์‹œ๊ฐ„์— ์ ‘๊ทผํ•  ์ˆ˜ ์—†๋‹ค.

๋ฆฌ์ŠคํŠธ์—์„œ K๋ฒˆ์งธ ์›์†Œ๋ฅผ ์ฐพ๊ณ  ์‹ถ๋‹ค๋ฉด K๋ฒˆ ๋ฃจํ”„๋ฅผ ๋Œ์•„์•ผํ•œ๋‹ค.

๋‹ค๋งŒ ์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ์˜ ์žฅ์ ์€ ๋ฆฌ์ŠคํŠธ์˜ ์‹œ์ž‘ ์ง€์ ์—์„œ ์•„์ดํ…œ์„ ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜ ์‚ญ์ œํ•˜๋Š” ์—ฐ์‚ฐ์„ ์ƒ์ˆ˜ ์‹œ๊ฐ„์— ํ•  ์ˆ˜ ์žˆ๋‹ค.

์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ ๋งŒ๋“ค๊ธฐ

๊ฐ€์žฅ ๊ธฐ๋ณธ์ ์ธ ์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ๋ฅผ ๊ตฌํ˜„ํ•œ ์ฝ”๋“œ์ด๋‹ค

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class Node {
	Node next = null;
	int data;
	public Node(int d) {
		data = d;
	}

	void appendToTail(int d) {
		Node end = new Node(d);
		Node n = this;
		while (n.next != null) {
			n = n.next;
		}
		n.next = end;
	}
}

์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ์— ์ ‘๊ทผํ•  ๋•Œ head ๋…ธ๋“œ์˜ ์ฃผ์†Œ๋ฅผ ์ฐธ์กฐํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ–ˆ๋‹ค.

์ด๋Ÿฐ ์‹์œผ๋กœ ๊ตฌํ˜„ํ•  ๋•Œ ์กฐ์‹ฌํ•ด์•ผ ํ•˜๋Š” ๋ถ€๋ถ„์ด ์žˆ๋‹ค.

์—ฌ๋Ÿฌ ๊ฐ์ฒด๋“ค์ด ๋™์‹œ์— ์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ๋ฅผ ์ฐธ์กฐํ•˜๋Š” ๋„์ค‘์— head ๊ฐ€ ๋ฐ”๋€Œ๋ฉด?

head ๊ฐ€ ๋ฐ”๋€Œ์—ˆ์Œ์—๋„ ์–ด๋–ค ๊ฐ์ฒด๋Š” ์ด์ „ head ๋ฅผ ๊ณ„์† ๊ฐ€๋ฆฌํ‚ฌ์ˆ˜๋„ ์žˆ๋‹ค.

ํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด Node ํด๋ž˜์Šค๋ฅผ ํฌํ•จํ•˜๋Š” LinkedList ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“œ๋Š”๊ฒŒ ์ข‹๋‹ค.

ํด๋ž˜์Šค ์•ˆ์— head Node ๋ณ€์ˆ˜๋ฅผ ๋‹จ ํ•˜๋‚˜๋งŒ ์ •์˜ํ•ด ๋†“์Œ์œผ๋กœ์จ ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค.

Runner ๊ธฐ๋ฒ•

Runner (๋ถ€๊ฐ€ ํฌ์ธํ„ฐ)๋Š” ์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ ๋ฌธ์ œ์—์„œ ๋งŽ์ด ํ™œ์šฉ๋˜๋Š” ๊ธฐ๋ฒ•์ด๋‹ค.

์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ๋ฅผ ์ˆœํšŒํ•  ๋•Œ ๋‘ ๊ฐœ์˜ ํฌ์ธํ„ฐ๋ฅผ ๋™์‹œ์— ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

์ด ๋•Œ, ํ•œ ํฌ์ธํ„ฐ๋Š” ๋‹ค๋ฅธ ํฌ์ธํ„ฐ๋ณด๋‹ค ์•ž์„œ๋„๋ก ํ•œ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด

1
A1 -> A2 -> ... -> An -> B1 -> B2 -> ... -> Bn

์ด ๋ฆฌ์ŠคํŠธ๋ฅผ ๋‹ค์Œ์ฒ˜๋Ÿผ ์ •๋ ฌํ•˜๊ณ ์ž ํ•œ๋‹ค.

1
A1 -> B1 -> A2 -> B2 -> ... -> An -> Bn

์•ž์„  ํฌ์ธํ„ฐ P1 ์„ ๋‘๊ณ  ๋”ฐ๋ผ์˜ค๋Š” ํฌ์ธํ„ฐ P2๊ฐ€ ํ•œ ๋ฒˆ ์›€์ง์ผ ๋•Œ๋งˆ๋‹ค ํฌ์ธํ„ฐ P1์ด ๋‘ ๋ฒˆ ์›€์ง์ด๋„๋ก ์„ค์ •ํ•˜์ž.

๊ทธ๋Ÿฌ๋ฉด P1 ์ด ์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ ๋์— ๋„๋‹ฌํ•˜๋ฉด P2๋Š” ๊ฐ€์šด๋ฐ ์ง€์ ์— ์žˆ๊ฒŒ ๋œ๋‹ค.

์ด ์ƒํƒœ์—์„œ P1์„ ๋‹ค์‹œ ๋งจ ์•ž์œผ๋กœ ์˜ฎ๊ธฐ๊ณ  P2๋กœ ํ•˜์—ฌ๊ธˆ ์›์†Œ๋ฅผ ์žฌ๋ฐฐ์—ดํ•˜๋„๋ก ํ•  ์ˆ˜ ์žˆ๋‹ค.

์ฆ‰, ๋ฃจํ”„๊ฐ€ ์‹คํ–‰๋  ๋•Œ๋งˆ๋‹ค P2๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” ์›์†Œ๋ฅผ P1 ๋’ค๋กœ ์˜ฎ๊ธฐ๋Š” ๊ฒƒ์ด๋‹ค.

์žฌ๊ท€ ๋ฌธ์ œ

์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ ๊ด€๋ จ ๋ฌธ์ œ ๊ฐ€์šด๋ฐ ์ƒ๋‹น์ˆ˜๋Š” ์žฌ๊ท€ ํ˜ธ์ถœ์— ์˜์กดํ•œ๋‹ค.

์žฌ๊ท€ ํ˜ธ์ถœ ๊นŠ์ด๊ฐ€ n์ด ๋  ๊ฒฝ์šฐ ํ•ด๋‹น ์žฌ๊ท€ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ์ ์–ด๋„ O(n) ๋งŒํผ์˜ ๊ณต๊ฐ„์„ ์‚ฌ์šฉํ•œ๋‹ค๋Š” ์‚ฌ์‹ค์„ ๊ธฐ์–ตํ•˜๋ผ.

03. ์Šคํƒ๊ณผ ํ

์Šคํƒ ์ž๋ฃŒ๊ตฌ์กฐ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์Œ“์•„ ์˜ฌ๋ฆฐ๋‹ค๋Š” ์˜๋ฏธ์ด๋‹ค.

๋•Œ๋กœ๋Š” ๋ฐฐ์—ด๋ณด๋‹ค ์Šคํƒ์— ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๋Š” ๊ฒƒ์ด ๋” ์ ํ•ฉํ•œ ๋ฐฉ๋ฒ•์ผ ์ˆ˜ ์žˆ๋‹ค.

์Šคํƒ์€ LIFO(Last-In-First-Out)์— ๋”ฐ๋ผ ์ž๋ฃŒ๋ฅผ ๋ฐฐ์—ดํ•œ๋‹ค.

๊ฐ€์žฅ ์ตœ๊ทผ์— ์Šคํƒ์— ์ถ”๊ฐ€ํ•œ ํ•ญ๋ชฉ์ด ๊ฐ€์žฅ ๋จผ์ € ์ œ๊ฑฐ๋œ๋‹ค.

์Šคํƒ์˜ ์—ฐ์‚ฐ์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

  • pop(): ๊ฐ€์žฅ ์œ„์˜ ํ•ญ๋ชฉ์„ ์ œ๊ฑฐํ•œ๋‹ค.
  • push(item) : ์•„์ดํ…œ ํ•˜๋‚˜๋ฅผ ์Šคํƒ ๊ฐ€์žฅ ์œ— ๋ถ€๋ถ„์— ์ถ”๊ฐ€ํ•œ๋‹ค.
  • peek() : ๊ฐ€์žฅ ์œ„์˜ ํ•ญ๋ชฉ์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
  • isEmpty() : ๋น„์–ด์žˆ์œผ๋ฉด true๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

๋ฐฐ์—ด๊ณผ ๋‹ฌ๋ฆฌ ์Šคํƒ์€ ์ƒ์ˆ˜ ์‹œ๊ฐ„์— i๋ฒˆ์งธ ํ•ญ๋ชฉ์— ์ ‘๊ทผํ•  ์ˆ˜ ์—†๋‹ค.

ํ•˜์ง€๋งŒ ๋ฐ์ดํ„ฐ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜ ์‚ญ์ œํ•˜๋Š” ์—ฐ์‚ฐ์€ ์ƒ์ˆ˜ ์‹œ๊ฐ„์— ๊ฐ€๋Šฅํ•˜๋‹ค.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
public class MyStack {
	private static class StackNode {
		private T data;
		private StackNode Next;
		private StackNode(T data) {
			this.data = data;
		}
	}
	private StackNode top;

	public T pop() {
		if (top == null) throw new EmptyStackException();
		T item = top.data;
		top = top.next;
		return item;
	}

	public void push(T item) {
		StackNode t = new StackNode(item);
		t.next = top;
		top = t;
	}

	public T peek() {
		if (top == null) throw new EmptyStackException();
		return top.data;
	}

	public boolean isEmpty() {
		return top == null;
	}
}

์Šคํƒ์€ ์žฌ๊ท€ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‚ฌ์šฉํ•  ๋•Œ ์œ ์šฉํ•˜๋‹ค.

์žฌ๊ท€์ ์œผ๋กœ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ ์ž„์‹œ ๋ฐ์ดํ„ฐ๋ฅผ ์Šคํƒ์— ๋„ฃ์–ด์ฃผ๊ณ , ์žฌ๊ท€ ํ•จ์ˆ˜๋ฅผ ๋น ์ ธ ๋‚˜์™€ ํ‡ด๊ฐ ๊ฒ€์ƒ‰(backtrack)์„ ํ•  ๋•Œ ์Šคํƒ์— ๋„ฃ์–ด ๋‘์—ˆ๋˜ ์ž„์‹œ ๋ฐ์ดํ„ฐ๋ฅผ ๋นผ์ค€๋‹ค.

์Šคํƒ์€ ์ด๋Ÿฐ ์ผ๋ จ์˜ ํ–‰์œ„๋ฅผ ์ง๊ด€์ ์œผ๋กœ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•ด์ค€๋‹ค.

์Šคํƒ์€ ๋˜ํ•œ ์žฌ๊ท€ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๋ฐ˜๋ณต์  ํ˜•ํƒœ(iterative)๋ฅผ ํ†ตํ•ด ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค€๋‹ค.

ํ ๊ตฌํ˜„ํ•˜๊ธฐ

ํ๋Š” FIFO(First-In-First-Out) ์ˆœ์„œ๋ฅผ ๋”ฐ๋ฅธ๋‹ค.

ํ์˜ ์—ฐ์‚ฐ์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

  • add(item) : ์•„์ดํ…œ ํ•˜๋‚˜๋ฅผ ๋ฆฌ์ŠคํŠธ์˜ ๋ ๋ถ€๋ถ„์— ์ถ”๊ฐ€ํ•œ๋‹ค.
  • remove() : ๋ฆฌ์ŠคํŠธ์˜ ์ฒซ ๋ฒˆ์งธ ํ•ญ๋ชฉ์„ ์ œ๊ฑฐํ•œ๋‹ค.
  • peek() : ๊ฐ€์žฅ ์œ„์˜ ํ•ญ๋ชฉ์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
  • isEmpty() : ๋น„์–ด์žˆ์œผ๋ฉด true๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ์˜ ๋ฐ˜๋Œ€ ๋ฐฉํ–ฅ์—์„œ ํ•ญ๋ชฉ์„ ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜ ์ œ๊ฑฐํ•˜๋„๋ก ๊ตฌํ˜„ํ•œ๋‹ค๋ฉด ๊ทผ๋ณธ์ ์œผ๋กœ ํ์™€ ๊ฐ™๋‹ค.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
public class MyQueue {
	private static class QueueNode {
		private T data;
		private QueueNode Next;
		private QueueNode (T data) {
			this.data = data;
		}
	}
	private QueueNode first;
	private QueueNode last;

	public void add(T item) {
		QueueNode t = new QueueNode(item);
		if (lst != null) {
			last.next = t;
		}
		last = t;
		if (first == null) {
			first = last;
		}
	}

	public T remove() {
		if (first == null) throw new NoSuchElementException();
		T data = first.data;
		first = first.next;
		if (first == null) {
			last = null;
		}
		return data;
	}

	public T peek() {
		if (first == null) throw new NoSuchElementException();
		return first.data;
	}

	public boolean isEmpty() {
		return first == null;
	}
}

ํ์—์„œ ์ฒ˜์Œ๊ณผ ๋งˆ์ง€๋ง‰ ๋…ธ๋“œ๋ฅผ ๊ฐฑ์‹ ํ•  ๋•Œ ์‹ค์ˆ˜๊ฐ€ ๋‚˜์˜ค๊ธฐ ์‰ฝ๋‹ค.

ํ๋Š” ๋„ˆ๋น„ ์šฐ์„  ํƒ์ƒ‰๊ณผ ์บ์‹œ๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒฝ์šฐ์— ์ข…์ข… ์‚ฌ์šฉ๋œ๋‹ค.

This post is licensed under CC BY 4.0 by the author.