๐Ÿ˜Ž ๊ณต๋ถ€ํ•˜๋Š” ์ง•์ง•์•ŒํŒŒ์นด๋Š” ์ฒ˜์Œ์ด์ง€?

[Coding Interview University] ๋งํฌ๋“œ ๋ฆฌ์ŠคํŠธ : ์ด๋ก  ๋ฐ ๊ตฌํ˜„ ๋ณธ๋ฌธ

๐Ÿ‘ฉ‍๐Ÿ’ป ์ปดํ“จํ„ฐ ๊ตฌ์กฐ/Computer Science

[Coding Interview University] ๋งํฌ๋“œ ๋ฆฌ์ŠคํŠธ : ์ด๋ก  ๋ฐ ๊ตฌํ˜„

์ง•์ง•์•ŒํŒŒ์นด 2023. 6. 29. 21:13
728x90
๋ฐ˜์‘ํ˜•

<๋ณธ ๋ธ”๋กœ๊ทธ๋Š” ์ฝ”๋”ฉ์ธํ„ฐ๋ทฐ๋Œ€ํ•™ ๋‹˜์˜ Git๊ณผ ์„œ์ ์„ ์ฐธ๊ณ ํ•ด์„œ ๊ณต๋ถ€ํ•˜๋ฉฐ ์ž‘์„ฑํ•˜์˜€์Šต๋‹ˆ๋‹ค :-)>

 

๐Ÿซง ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ

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

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

(k๋ฒˆ์งธ ์›์†Œ๋ฅผ ์ฐพ๊ณ ์‹ถ๋‹ค๋ฉด ์ฒ˜์Œ๋ถ€ํ„ฐ k๋ฒˆ ๋ฃจํ”„ ๋Œ์•„์•ผํ•จ)

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

 

๋‹จ๋ฐฉํ–ฅ (์ขŒ) ์–‘๋ฐฉํ–ฅ (์šฐ)

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

 

๐Ÿ’– (๋‹จ๋ฐฉํ–ฅ) ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ ๋งŒ๋“ค๊ธฐ

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;
	}
}

 

๐Ÿ’– (๋‹จ๋ฐฉํ–ฅ) ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ ์‚ญ์ œํ•˜๊ธฐ

  1. ๋…ธ๋“œ n ์ด ์ฃผ์–ด์ง€๋ฉด, ์ด์ „ ๋…ธ๋“œ prev ๋ฅผ ์ฐพ์•„ prev.next ์™€ n.next ๊ฐ€ ๊ฐ™๋„๋ก ์„ค์ •ํ•œ๋‹ค
  • ์–‘๋ฐฉํ–ฅ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ์ผ ๊ฒฝ์šฐ, n.next๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” ๋…ธ๋“œ๋ฅผ ๊ฐฑ์‹ ํ•˜์—ฌ n.next.prev ๊ฐ€ n.prev ๊ฐ€ ๊ฐ™๋„๋ก ์„ค์ •
๐Ÿ’ฅ ์ฃผ์˜
- ๋„ ํฌ์ธํŠธ ๊ฒ€์‚ฌ๋ฅผ ๋ฐ˜๋“œ์‹œ ํ•œ๋‹ค
- head์™€ tail ํฌ์ธํ„ฐ๋ฅผ ๊ฐฑ์‹ ํ•œ๋‹ค
Node deleteNode(Node head, int d) {
	Node n = head;
	if (n.data == d) {
		return head.next;    // head ์›€์ง์ด๊ธฐ
	}

	while (n.next != null) {
		if (n.next.data == d) {
			n.next = n.next.next;
			return head;     // head ์›€์ง์ด์ง€ ์•Š์Œ
		}
	}
	return head;
}
	

 

๐Ÿ’– Runner (๋ถ€๊ฐ€ ํฌ์ธํ„ฐ)

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

: ํ•œ ํฌ์ธํ„ฐ๊ฐ€ ๋‹ค๋ฅธ ํฌ์ธํ„ฐ๋ณด๋‹ค ์•ž์„œ๋„๋ก ํ•œ๋‹ค

  • ์•ž์„  ํฌ์ธํ„ฐ๋Š” ๋’ค ํฌ์ธํ„ฐ๋ณด๋‹ค ํ•ญ์ƒ ์ง€์ •๋œ ๊ฐœ์ˆ˜๋งŒํผ์€ ์•ž์„ค ์ˆ˜ ์žˆ๋‹ค
  • ๋’ค ํฌ์ธํ„ฐ๋ฅผ ์—ฌ๋Ÿฌ ๋…ธ๋“œ๋ฅผ ํ•œ๋ฒˆ์— ๋›ฐ์–ด๋„˜๋„๋ก ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋‹ค

 

๐Ÿ’– ์žฌ๊ท€ ๋ฌธ์ œ

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

 

๐Ÿซง ๋งํฌ๋“œ ๋ฆฌ์ŠคํŠธ ๊ตฌํ˜„ํ•˜๊ธฐ

โžก๏ธ size() - ๋ฆฌ์ŠคํŠธ ์•ˆ์˜ ๋ฐ์ดํ„ฐ ๊ฐœ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

LinkedList<Integer> list = new LinkedList<Integer>(Arrays.asList(1,2,3));
System.out.println(list.size()); //list ํฌ๊ธฐ : 3

โžก๏ธ empty() - ๋ฆฌ์ŠคํŠธ๊ฐ€ ๋น„์–ด์žˆ๋‹ค๋ฉด true๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

// ๋ฆฌ์ŠคํŠธ๊ฐ€ ๋น„์—ˆ๋Š”๊ฐ€
template <typename E>
bool SLinkedList<E>::empty() const{
    return head == NULL;
}

โžก๏ธ value_at(index) - index๋ฒˆ์งธ ์œ„์น˜์˜ value์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค. (๊ฐ€์žฅ ์•ž์€ 0๋ถ€ํ„ฐ ์‹œ์ž‘ํ•œ๋‹ค.)

# declaring array
a = [18, 22, 33, nil, 5, 6]

puts "values_at() method form : #{a.values_at(2, 4)}\\n\\n"
// values_at() method form : [33, 5]

โžก๏ธ push_front(value) - ๊ฐ€์žฅ ์•ž์— value๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค.

int main(void) {
	list<int> L = { 3, 7 };
	L.push_front(1); // { 1, 3, 7 }
	return 0;
}

โžก๏ธ pop_front() - ๊ฐ€์žฅ ์•ž์— ์žˆ๋Š” ๊ฒƒ์„ ์ œ๊ฑฐํ•˜๊ณ , ๊ทธ value๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

int main(void) {
	list<int> L = { 1, 5, 3, 7, 10 }   
	L.pop_front(); // { 5, 3, 7, 10 }
	return 0;
}

โžก๏ธ push_back(value) - ๊ฐ€์žฅ ๋์— value์„ ์ถ”๊ฐ€ํ•œ๋‹ค.

int main(void) {
	list<int> L = { 3, 7 };
	L.push_back(10); // { 3, 7, 10 }
	return 0;
}

โžก๏ธ pop_back() - ๊ฐ€์žฅ ๋์— ์žˆ๋Š” ๊ฒƒ์„ ์ œ๊ฑฐํ•˜๊ณ , ๊ทธ value๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

int main(void) {
	list<int> L = { 1, 5, 3, 7, 10 }   
	L.pop_back(); // { 5, 3, 7, 10}
	return 0;
}

โžก๏ธ front() - ๊ฐ€์žฅ ์•ž์— ์žˆ๋Š” ๊ฒƒ์˜ value๋ฅผ ๊ฐ€์ ธ์˜จ๋‹ค.

class CircleList{
public:
    CircleList(); // ์ƒ์„ฑ์ž
    ~CircleList(); // ์†Œ๋ฉธ์ž

    const string& front() const; // ์ปค์„œ ๋‹ค์Œ์˜ ์›์†Œ
};

โžก๏ธ back() - ๊ฐ€์žฅ ๋์— ์žˆ๋Š” ๊ฒƒ์˜ value๋ฅผ ๊ฐ€์ ธ์˜จ๋‹ค.

class CircleList{
public:
    CircleList(); // ์ƒ์„ฑ์ž
    ~CircleList(); // ์†Œ๋ฉธ์ž

    const string& back() const; // ์ปค์„œ์˜ ์›์†Œ

};

โžก๏ธ insert(index, value) - index๋ฒˆ์งธ ์œ„์น˜์— value๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค. ์ฆ‰, index๋ฒˆ์งธ์— ์ƒˆ๋กœ ์ถ”๊ฐ€๋œ ๊ฒƒ์ด ๊ธฐ์กด์˜ index๋ฒˆ์งธ์— ์žˆ๋˜ ๊ฒƒ์„ ๊ฐ€๋ฆฌํ‚จ๋‹ค.

list<int>::iterator iterInsertPos = list1.begin();
list1.insert(iterInsertsPos, 100);    // ์ฒซ ๋ฒˆ์งธ ์œ„์น˜์— 100 ๋„ฃ๊ธฐ

โžก๏ธ erase(index) - index๋ฒˆ์งธ์— ์žˆ๋Š” ๋…ธ๋“œ๋ฅผ ์‚ญ์ œํ•œ๋‹ค.

list1.erase(list1.begin());    // list1 ์ฒซ ๋ฒˆ ์งธ ์š”์†Œ ์‚ญ์ œ

โžก๏ธ value_n_from_end(n) - ๋’ค์—์„œ๋ถ€ํ„ฐ n๋ฒˆ์งธ์— ์žˆ๋Š” ๋…ธ๋“œ์˜ value๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

โžก๏ธ reverse() - ๋ฆฌ์ŠคํŠธ๋ฅผ ๋’ค์ง‘๋Š”๋‹ค.

public class UnitTest {
    public static void main(String[] args) {
        SinglyLinkedList list = new SinglyLinkedList();
        list.addLast(1);
        list.addLast(2);
        list.addLast(3);
        list.addLast(4);

        System.out.println(list);
        list.reverse();

        System.out.println(list);
    }
}

// 1 -> 2 -> 3 -> 4
// 4 -> 3 -> 2 -> 1

โžก๏ธ remove_value(value) - value์™€ ๊ฐ™์€ ๊ฐ’์„ ๊ฐ€์ง€๋Š” ์ฒซ ๋ฒˆ์งธ ๋…ธ๋“œ๋ฅผ ์ œ๊ฑฐํ•œ๋‹ค.

728x90
๋ฐ˜์‘ํ˜•
Comments