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

[2.์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ] ์ค‘๋ณต์—†์• ๊ธฐ, ๋’ค์—์„œ k๋ฒˆ์งธ ์›์†Œ๊ตฌํ•˜๊ธฐ, ์ค‘๊ฐ„๋…ธ๋“œ์‚ญ์ œ, ๋ถ„ํ• , ๋ฆฌ์ŠคํŠธ์˜ํ•ฉ, ํšŒ๋ฌธ(์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ), ๊ต์ง‘ํ•ฉ, ๋ฃจํ”„๋ฐœ๊ฒฌ

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

 [ Q1. ์ค‘๋ณต์—†์• ๊ธฐ ] 

์ •๋ ฌ๋˜์–ด์žˆ์ง€ ์•Š์€ ์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ๊ฐ€ ์ฃผ์–ด์กŒ์„๋•Œ ์ด ๋ฆฌ์ŠคํŠธ์—์„œ ์ค‘๋ณต๋˜๋Š” ์›์†Œ๋ฅผ ์ œ๊ฑฐํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋ผ.

(์ž„์‹œ๋ฒ„ํผ๊ฐ€ ์—†๋‹ค๋ฉด ์–ด๋–ป๊ฒŒ ํ’€๊นŒ?)

 

- ๋‚ด ํ’€์ด -

1. ํ•ด์‹œ๋งต ํ™œ์šฉ(์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ ์ €์žฅ์šฉ๋„)

2. ์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ๋ฅผ ์ˆœํšŒํ•˜๋ฉฐ n์ด ํ‚ค๋กœ ์กด์žฌํ•˜๋Š”์ง€ ์ฒดํฌ

=> ์กด์žฌํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ ๋งต์— <n, n.next>๋ฅผ ์‚ฝ์ž…

=> ์กด์žฌํ•˜๋Š” ๊ฒฝ์šฐ n.prev.next=n.next๋กœ ๋ณ€๊ฒฝ (์ด๊ฒŒ ๋…ธ๋“œ ์‚ญ์ œ)

* ์•ผ ๋‚ด ๋ฌธ์ œ๋Š” ๋…ธ๋“œํด๋ž˜์Šค ๊ตฌํ˜„ํ•˜๋Š”๊ฑฐ๊ฐ€ ๋ฌธ์ œ์•ผ..

class LinkedNode{
	int data;
	LinkedNode prev, next;
	
	public LinkedNode() {
		// TODO Auto-generated constructor stub
	}
	public LinkedNode(int d) {
		data=d;
	}
	
}
void removeDups(LinkedNode head) {
	LinkedNode n=head;
	HashMap<Integer, LinkedNode> map=new HashMap<Integer, LinkedNode>();
	while (n.next!=null) {
		int key=n.data;
		if(map.containsKey(key)) {
			n.prev.next=n.next;
		} else {
			map.put(key, n.next);
		}
		n=n.next;
	}

 

- ๋ชจ๋ฒ”๋‹ต์•ˆ - 

์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ์˜ ์ค‘๋ณต๋˜๋Š” ์›์†Œ๋ฅผ ์ œ๊ฑฐํ•˜๊ธฐ์œ„ํ•ด์„œ ์›์†Œ๋ฅผ ์ถ”์ ํ•ด์•ผํ•จ : ํ•ด์‹œํ…Œ์ด๋ธ” ์‚ฌ์šฉ

ํ•ด๋ฒ•1) ๋‹จ์ˆœํžˆ ์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ๋ฅผ ์ˆœํšŒํ•˜๋ฉฐ ๊ฐ ์›์†Œ๋ฅผ ํ•ด์‹œํ…Œ์ด๋ธ”์— ์ €์žฅ > ์ค‘๋ณต์›์†Œ ๋ฐœ๊ฒฌ์‹œ ๊ทธ ์›์†Œ ์ œ๊ฑฐํ•˜๊ณ  ์ง„ํ–‰

(์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ ์žˆ๊ธฐ๋•Œ๋ฌธ์— ํ•œ๋ฒˆ์— ์ˆœํšŒ๋กœ ์ „๋ถ€ ์ฒ˜๋ฆฌ ๊ฐ€๋Šฅ - O(N)์˜ ์‹œ๊ฐ„ ์†Œ์š”)

*๋‚ด๊ฐ€ ๊ตฌํ˜„ํ•œ ๊ฒƒ๊ณผ ๋™์ผํ•œ๋ฐ ํ•ด๋ฒ•์—์„œ๋Š” set๊ตฌ์กฐ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ ์žˆ๊ณ , Nodeํด๋ž˜์Šค ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ•์—์„œ ์ฐจ์ด๊ฐ€ ์žˆ์Œ

class LinkedListNode{
	public LinkedListNode next, prev, last;
	public int data;

	public LinkedListNode() {
		// TODO Auto-generated constructor stub
	}
	public LinkedListNode(int d) {
		data=d;
	}
	public LinkedListNode(int d, LinkedListNode n, LinkedListNode p) {
		data=d;
		setNext(n);
		setPrevious(p);
	}
	
	public void setNext(LinkedListNode n) {
		next=n;
		if(this==last) {
			last=n;
		}
		// ๋‹ค์Œ ๋…ธ๋“œ๊ฐ€ null์ด ์•„๋‹ˆ๊ณ , ๋‹ค์Œ๋…ธ๋“œ์˜ prev(this์—ฌ์•ผํ•จ)๊ฐ€ this๊ฐ€ ์•„๋‹Œ๊ฒฝ์šฐ
		if(n!=null&&n.prev!=this) {
			// ๋‹ค์Œ๋…ธ๋“œ์˜ prev๋ฅผ ํ˜„์žฌ๋…ธ๋“œ๋กœ ๋ณ€๊ฒฝ
			n.setPrevious(this);
		}
	}
	public void setPrevious(LinkedListNode p) {
		prev=p;
		if(p!=null&&p.next!=this) {
			p.setNext(this);
		}
	}
}
void deleteDups(LinkedListNode n) {
	HashSet set=new HashSet();
	LinkedListNode previous=null;
	while(n!=null) {
		if(set.contains(n.data)) {
			previous.next=n.next;
		} else {
			set.add(n.data);
			previous=n;
		}
		n=n.next;
	}
}

 

"์—ฐ๊ด€: ์ž„์‹œ๋ฒ„ํผ๊ฐ€ ์—†๋‹ค๋ฉด ์–ด๋–ป๊ฒŒ ํ’€๊นŒ?"

ํ•ด๋ฒ•2) ๋ฒ„ํผ๊ฐ€์—†๋‹ค๋ฉด 2๊ฐœ์˜ ํฌ์ธํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐ

=> currentํฌ์ธํ„ฐ : ์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ๋ฅผ ์ˆœํšŒ

=> runnerํฌ์ธํ„ฐ : ๋’ค์— ์ค‘๋ณต์›์†Œ๊ฐ€ ์žˆ๋Š”์ง€๋ฅผ ํ™•์ธ

(์ด ๊ฒฝ์šฐ ๊ณต๊ฐ„์€ O(1)์„ ์‚ฌ์šฉํ•˜์ง€๋งŒ ์ˆ˜ํ–‰์‹œ๊ฐ„์€ O(N^2) ์†Œ์š”)

void delDups(LinkedListNode head) {
	LinkedListNode current=head; // ์ˆœํšŒํ•  ํฌ์ธํ„ฐ
	while (current!=null) {
		// ๊ฐ’์ด ๊ฐ™์€ ๋…ธ๋“œ๋ฅผ ๋ชจ๋‘ ์ œ๊ฑฐ : runnerํฌ์ธํ„ฐ ์ด์šฉ
		LinkedListNode runner=current;
		while(runner.next!=null) {
			if(runner.next.data==current.data) {
				runner.next=runner.next.next;
			} else {
				runner=runner.next;
			}
		}
		current=current.next;
	}
}

 

 

 [ Q2. ๋’ค์—์„œ k๋ฒˆ์งธ ์›์†Œ๊ตฌํ•˜๊ธฐ ] 

๋‹จ๋ฐฉํ–ฅ ์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ๊ฐ€ ์ฃผ์–ด์ง„ ๊ฒฝ์šฐ, ๋’ค์—์„œ k๋ฒˆ์งธ ์›์†Œ๋ฅผ ์ฐพ๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๊ตฌํ•˜๋ผ.

 

- ๋‚ด ํ’€์ด -

์ด ์‚ฌ์ด์ฆˆ๋ฅผ ์•ˆ๋‹ค๋ฉด Length-k๋ฒˆ์งธ ์›์†Œ๊นŒ์ง€๋งŒ ์ฐจ๋ก€๋กœ ์ˆœํšŒํ•˜๋ฉด ๋œ๋‹ค.

์ฆ‰, 2๋ฒˆ ์ˆœํšŒํ•˜๊ฒŒ๋จ ๋น„ํšจ์œจ์ ..

class Node {
	int data;
	Node next;
	public Node() {
		// TODO Auto-generated constructor stub
	}
	public Node(int d) {
		data=d;
	}
}
Node findKfromLast(Node n, int k) {
	// ๊ธธ์ด-k๋งŒํผ ์ˆœํšŒํ•˜๋ฉด ๊ฐ’์„ ์ฐพ์„ ์ˆ˜ ์žˆ์Œ
	for(int i=0; i<sizeNode(n)-k+1; i++) {
		n=n.next;
	}
	return n;
}

// ๊ธธ์ด๋ฅผ ์•Œ๊ธฐ์œ„ํ•ด์„œ ์ˆœํšŒํ•ด์•ผํ•จ
int sizeNode(Node n) {
	Node node=n;
	int size=1;
	while(node.next!=null) {
		size++;
	}
	return size;
}

 

- ๋ชจ๋ฒ”๋‹ต์•ˆ - 

์ด ๋ฌธ์ œ๋ฅผ ๋น„์žฌ๊ท€์™€ ์žฌ๊ท€๋ฐฉ์‹ 2๊ฐ€์ง€๋กœ ํ’€์ด

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

 

ํ•ด๋ฒ•1) ์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ์˜ ๊ธธ์ด๋ฅผ ์•„๋Š” ๊ฒฝ์šฐ

๋งจ ๋งˆ์ง€๋ง‰ ์›์†Œ์—์„œ k๋ฒˆ์งธ ์›์†Œ = length-k๋ฒˆ์งธ ์›์†Œ 

๋‹จ์ˆœํ•˜๊ฒŒ ์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ๋ฅผ ์ˆœํšŒํ•ด์„œ ํ‘ธ๋Š” ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์— ๋ถ„๋ช… ์ด๋ ‡๊ฒŒ ํ‘ธ๋Š”๊ฒƒ์„ ๊ถŒ์žฅํ•˜์ง€ ์•Š๋Š”๋‹ค!

 

ํ•ด๋ฒ•2) ์žฌ๊ท€์  ๋ฐฉ๋ฒ• : ์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ๋ฅผ ์žฌ๊ท€์ ์œผ๋กœ ์ˆœํšŒ

๋งˆ์ง€๋ง‰ ์›์†Œ๋ฅผ ๋งŒ๋‚˜๋ฉด 0์œผ๋กœ ์„ค์ •๋œ ์นด์šดํ„ฐ ๊ฐ’์„ ๋ฐ˜ํ™˜ >> ์žฌ๊ท€์ ์œผ๋กœ ํ˜ธ์ถœ๋œ ๋ถ€๋ชจ๋ฉ”์†Œ๋“œ๋Š” ์นด์šดํ„ฐ์— 1์„ ๋”ํ•จ

>> ์นด์šดํ„ฐ๊ฐ€ k๊ฐ€ ๋˜๋Š” ์ˆœ๊ฐ„ = ๋’ค์—์„œ k๋ฒˆ์งธ ์›์†Œ์— ๋„๋‹ฌํ•œ ๊ฒƒ

(์Šคํƒ์„ ํ†ตํ•ด ์ •์ˆ˜๊ฐ’์„ ์ „๋‹ฌํ•˜๋Š” ๋ฐฉ๋ฒ•๋„ ์žˆ์ง€๋งŒ ๋…ธ๋“œ์™€ ์นด์šดํ„ฐ๊ฐ’์„ ๋™์‹œ์— ๋ฐ˜ํ™˜ํ•  ์ˆ˜ ์—†์–ด...ใ… _ใ… )

๊ทธ๋ ‡๋‹ค๋ฉด?

[๋ฐฉ๋ฒ•1] ์›์†Œ๋ฅผ ๋ฐ˜ํ™˜ํ•˜์ง€ ์•Š๋Š”๋‹ค.

๋ฌธ์ œ๋ฅผ ์ˆ˜์ •ํ•˜์—ฌ k๋ฒˆ์งธ ์›์†Œ๊ฐ’์„ ์ถœ๋ ฅ๋งŒ ํ•˜๋Š”๊ฒƒ์œผ๋กœ ๋Œ€์ฒด > ์นด์šดํ„ฐ๊ฐ’๋งŒ ๋ฐ˜ํ™˜

	int printKthToLast(LinkedListNode head, int k) {
		if(head == null) {
			return 0;
		}
		int index=printKthToLast(head.next, k)+1;
		if(index==k) {
			System.out.println(k+"th to last node is "+head.data);
		}
		return index;
	}

[๋ฐฉ๋ฒ•2] Wrapper ํด๋ž˜์Šค ์‚ฌ์šฉ

์œ„ ๋ฐฉ๋ฒ•1์ฒ˜๋Ÿผ ์นด์šดํ„ฐ์™€ ์ฒจ์ž๋ฅผ ๋™์‹œ์— ๋ฐ˜ํ™˜ํ•  ์ˆ˜ ์—†๋Š”๊ฒƒ์ด ๋ฌธ์ œ์ธ ๊ฒฝ์šฐ

์นด์šดํ„ฐ๊ฐ’์„ ํด๋ž˜์Šค๋กœ ๊ฐ์‹ธ๋ฉด(ํ˜น์€ ์›์†Œ๊ฐ€ ๋”ฑ ํ•˜๋‚˜์ธ ๋ฐฐ์—ด์‚ฌ์šฉ) ์ฐธ์กฐ์—์˜ํ•œ ๊ฐ’ ์ „๋‹ฌ ์ž„์‹œ์ ์œผ๋กœ ๊ฐ€๋Šฅ

	class Index {
		public int value=0;
	}
	
	LinkedListNode kthToLast(LinkedListNode head, int k) {
		Index idx=new Index();
		return kthToLast(head, k, idx);
	}
	LinkedListNode kthToLast(LinkedListNode head, int k, Index idx) {
		if(head==null) {
			return null;
		}
		LinkedListNode node=kthToLast(head.next, k, idx);
		idx.value=idx.value+1;
		if(idx.value==k) {
			return head;
		}
		return node;
	}

ํ•ด๋ฒ• 3) ์ˆœํ™˜์  ๋ฐฉ๋ฒ•

๋‘๊ฐœ์˜ ํฌ์ธํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋‘ ๊ฐ„๊ฒฉ์„ k๋กœ ๋‘” ํ›„ ๋™์‹œ์— ์ด๋™ > ๋งˆ์ง€๋ง‰์— ๋‹ค๋‹ค๋ฅธ ๊ฒฝ์šฐ ์•ž์„  ํฌ์ธํ„ฐ์˜ ์œ„์น˜๊ฐ€ k

	LinkedListNode nthToLast(LinkedListNode head, int k) {
		LinkedListNode p1=head;
		LinkedListNode p2=head;
		
		// p1์„ k๋…ธ๋“œ๋งŒํผ ์ด๋™
		for(int i=0;i<k;i++) {
			if(p1==null) return null;
			p1=p1.next;
		}
		
		//p1๊ณผp2๋ฅผ ํ•จ๊ป˜ ์›€์ง์ž„ > ์ด๋•Œ p1์ด ๋งˆ์ง€๋ง‰์— ๋„๋‹ฌํ–ˆ์„๋•Œ์˜ p2๊ฐ’
		while(p1!=null) {
			p1=p1.next;
			p2=p2.next;
		}
		return p2;
	}

 

 

 

 [ Q3. ์ค‘๊ฐ„ ๋…ธ๋“œ ์‚ญ์ œ ] 

๋‹จ๋ฐฉํ–ฅ ์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ๊ฐ€ ์ฃผ์–ด์ง„ ๊ฒฝ์šฐ ์ค‘๊ฐ„(์ •ํ™•ํžˆ ๊ฐ€์šด๋ฐ์ผ ํ•„์š”๋Š” ์—†๊ณ  ์ฒ˜์Œ๊ณผ ๋๋…ธ๋“œ๋งŒ ์•„๋‹ˆ๋ฉด ๋œ๋‹ค)์— ์žˆ๋Š” ๋…ธ๋“œ ํ•˜๋‚˜๋ฅผ ์‚ญ์ œํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๊ตฌํ˜„๋ผํ•˜. ๋‹จ ์‚ญ์ œํ•  ์ˆ˜ ์žˆ๋Š” ๋…ธ๋“œ์—๋งŒ ์ ‘๊ทผ๊ฐ€๋Šฅํ•˜๋‹ค.

๋”๋ณด๊ธฐ

์˜ˆ์ œ

์ž…๋ ฅ : ์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ a>b>c>d>e์—์„œ ๋…ธ๋“œ c

๊ฒฐ๊ณผ : ์•„๋ฌด๊ฒƒ๋„ ๋ฐ˜ํ™˜ํ•  ํ•„์š”๋Š” ์—†์ง€๋งŒ, ๊ฒฐ๊ณผ๋กœ ์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ๋Š” a>b>d>e๊ฐ€ ๋˜์–ด์žˆ์–ด์•ผ ํ•œ๋‹ค.

 

- ๋‚ด ํ’€์ด -

์ œ๊ฑฐ๋…ธ๋“œ๋ฅผ n์ด๋ผ๊ณ  ๊ฐ€์ •ํ• ๋•Œ n.prev.next=n.next๋กœ ๋ณ€๊ฒฝํ•ด์ฃผ๋ฉด OK

void deleteNode(LinkedListNode target) {
	if (target.prev!=null && target.next!=null) {
		target.prev.next=target.next;
	}
}

 

- ๋ชจ๋ฒ”๋‹ต์•ˆ -

์ด ๋ฌธ์ œ๋Š” ์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ์˜ ํ—ค๋“œ์— ์ ‘๊ทผํ•  ์ˆ˜ ์—†๊ณ  ์‚ญ์ œ๋…ธ๋“œ๋งŒ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ด ํ•ต์‹ฌ

์‚ญ์ œ๋ฅผ์›ํ•˜๋Š” ๋…ธ๋“œ์˜ ๋‹ค์Œ๋…ธ๋“œ ๋ฐ์ดํ„ฐ๋ฅผ ์—ฐ์žฌ๋…ธ๋“œ์— ๋ณต์‚ฌ ํ›„ ๋‹ค์Œ ๋…ธ๋“œ ์‚ญ์ œํ•˜๋Š” ๋ฐฉ๋ฒ• ์‚ฌ์šฉ

boolean deleteNode(LinkedListNode n) {
	if(n==null || n.next==null) {
		return false;
	}
	LinkedListNode next=n.next;
	n.data=next.data;
	n.next=next.next;
	return true;
}

 

 

 [ Q4. ๋ถ„ํ•  ] 

๊ฐ’ x๊ฐ€ ์ฃผ์–ด์กŒ์„๋•Œ x๋ณด๋‹ค ์ž‘์€ ๋…ธ๋“œ๋“ค์„ x๋ณด๋‹ค ํฌ๊ฑฐ๋‚˜ ๊ฐ™์€ ๋…ธ๋“œ๋“ค๋ณด๋‹ค ์•ž์—์˜ค๋„๋กํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋ผ. ๋งŒ์•ฝ x๊ฐ€ ๋ฆฌ์ŠคํŠธ์— ์žˆ๋‹ค๋ฉด x๋Š” ๊ทธ๋ณด๋‹ค ์ž‘์€ ์›์†Œ๋“ค๋ณด๋‹ค ๋’ค์— ๋‚˜์˜ค๊ธฐ๋งŒ ํ•˜๋ฉด๋œ๋‹ค. ์ฆ‰ ์›์†Œ x๋Š” '์˜ค๋ฅธ์ชฝ๊ทธ๋ฃน' ์–ด๋”˜๊ฐ€์—๋งŒ ์กด์žฌํ•˜๋ฉด ๋œ๋‹ค. ์™ผ์ชฝ๊ณผ ์˜ค๋ฅธ์ชฝ ๊ทธ๋ฃน์‚ฌ์ด์— ์žˆ์„ ํ•„์š”๋Š” ์—†๋‹ค.

๋”๋ณด๊ธฐ

์˜ˆ์ œ

์ž…๋ ฅ : 3>5>8>5>10>2>1 [๋ถ„ํ• ๊ฐ’ : 5]

์ถœ๋ ฅ: 3>1>2>10>5>5>8

- ๋‚ด ํ’€์ด -

๋ถ„ํ• ๊ฐ’x์™€ ๋…ธ๋“œ data๋ฅผ ๋น„๊ต > ํฌ๊ฑฐ๋‚˜ ๊ฐ™์œผ๋ฉด ๊ทธ ์ž๋ฆฌ์— ๋‘ , ์ž‘์œผ๋ฉด ๋งจ ์•ž์œผ๋กœ ์œ„์น˜์‹œํ‚ค๊ธฐ

๊ทธ๋Ÿฌ๋‚˜.. ์œ„์น˜ ๋ณ€๊ฒฝ์‹œ head์™€ node์˜ ๊ธฐ์ค€์ ์ด ํ—ท๊ฐˆ๋ ค์„œ ํ’€์ง€๋ชปํ–ˆ๋‹ค...^^

=> ํ•ด๋ฒ•2๋ฅผ ๋ณด๊ณ  next๋…ธ๋“œ๋ฅผ ๋จผ์ € ๋ถ„๋ฆฌํ•ด ์ €์žฅํ•ด๋‘๋ฉด ๊ฐ€๋Šฅํ•  ์ค„ ์•Œ์•˜๋Š”๋ฐ, ๋‚˜๋Š” ํฐ ๋…ธ๋“œ๋ฅผ ๋งŒ๋‚ฌ์„๋•Œ ์›€์ง์ด์ง€ ์•Š๊ณ  ์ œ์ž๋ฆฌ๋ฅผ ์ง€ํ‚ค๋Š” ๊ฒƒ์œผ๋กœ ๊ตฌ์ƒํ–ˆ๋”๋‹ˆ ์ด๋Ÿฌ๋ฉด ๋…ธ๋“œ๊ฐ€ ๋Š์–ด์ง > ๊ทธ๋ž˜์„œ ํ•ด๋ฒ•2์—์„œ ํฐ์ˆ˜๋Š” ๋’ค์— ๋ถ™์ด๊ธฐ๋ฅผ ํ•œ ๊ฒƒ!

 

 

- ๋ชจ๋ฒ”๋‹ต์•ˆ -

๋ฐฐ์—ด์—์„œ ์›์†Œ์ด๋™ ๋น„์šฉ์€ ๋น„์‹ธ๋‹ค > ํ•˜์ง€๋งŒ ์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ๋กœ๋Š” ์กฐ๊ธˆ ๋” ์‰ฝ๊ฒŒ ๊ตฌํ˜„ ๊ฐ€๋Šฅ

ํ•ด๋ฒ•1) ์›์†Œ์˜ ๊ฐ’์„ ์ด๋™(shift)ํ•˜๊ณ  ๋ฐ”๊พธ๋Š”(swap)๋Œ€์‹  ์„œ๋กœ ๋‹ค๋ฅธ ์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ ๋‘๊ฐœ๋ฅผ ๋งŒ๋“ค๋ฉด๋จ

=> ์ด ๋ฐฉ๋ฒ•์€ ๋ถ„ํ•  ์ž‘์—…์„ ํ•  ๋•Œ ์›์†Œ์ด๋™์ด ์—†๊ณ , ์›์†Œ์˜ ์›๋ž˜์ˆœ์„œ๋ฅผ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์•ˆ์ •์ 

1. ํ•˜๋‚˜์—๋Š” x๋ณด๋‹ค ์ž‘์€ ์›์†Œ๋“ค์„ ๋ณด๊ด€ํ•˜๊ณ , ๋‹ค๋ฅธ ํ•˜๋‚˜์—๋Š” x๋ณด๋‹ค ํฐ ์›์†Œ๋“ค์„ ๋ณด๊ด€

2. ์ž…๋ ฅ์œผ๋กœ ์ฃผ์–ด์ง„ ์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ๋ฅผ ์ˆœํšŒํ•˜๋ฉฐ, brfore๋ฆฌ์ŠคํŠธ ์•„๋‹ˆ๋ฉด after๋ฆฌ์ŠคํŠธ์— ์›์†Œ ์‚ฝ์ž…

3. ์ˆœํšŒ๋ฅผ ๋งˆ์น˜๋ฉด ๋‘ ๋ฆฌ์ŠคํŠธ๋ฅผ ํ•ฉ์นœ๋‹ค

// ์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ์˜ ํ—ค๋“œ์™€ ๋ถ„ํ• ํ•  ์ธ์ž๊ฐ’์„ ๋„˜๊ฒจ์คŒ
LinkedListNode partition(LinkedListNode node, int x) {
	// ์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ๋ฅผ ์ธ์Šคํ„ด์Šค๋กœ ๋งŒ๋“œ๋Š”๊ฒŒ ์•„๋‹ˆ๋ผ ๋ณ€์ˆ˜๋กœ ํ™œ์šฉ 
	// => ์ฒ˜์Œ๊ณผ ๋ ์ง€์ ์„ ์•Œ์•„์•ผ next๋กœ ์—ฐ๊ฒฐ๊ฐ€๋Šฅ
	LinkedListNode beforeStart=null;
	LinkedListNode beforeEnd=null;
	LinkedListNode afterStart=null;
	LinkedListNode afterEnd=null;
	
	//๋ฆฌ์ŠคํŠธ ๋ถ„ํ• 
	while(node!=null) {
		LinkedListNode next=node.next;
		node.next=null;
		
		if(node.data<x) {
			//before๋ฆฌ์ŠคํŠธ์˜ ๋์— ์›์†Œ๋ฅผ ์‚ฝ์ž…
			if(beforeStart==null) {
				beforeStart=node;
				beforeEnd=beforeStart;
			} else {
				beforeEnd.next=node;
				beforeEnd=node;
			}
		} else {
			// after๋ฆฌ์ŠคํŠธ์˜ ๋์— ์›์†Œ๋ฅผ ์‚ฝ์ž…
			if(afterStart==null) {
				afterStart=node;
				afterEnd=afterStart;
			} else {
				afterEnd.next=node;
				afterEnd=node;
			}
		}
		node=next;
	}
	if(beforeStart==null) {
		return afterStart;
	}
	
	// before์™€ after์„ ๋ณ‘ํ•ฉํ•œ๋‹ค
	beforeEnd.next=afterStart;
	return beforeStart;
}

์œ„์ฒ˜๋Ÿผ ๋‘๊ฐœ์˜ ์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ๋ฅผ ๋„ค๊ฐœ์˜ ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ด ํ‘œํ˜„ํ•˜๋ฉด ๋ฆฌ์ŠคํŠธ์˜ ์›์†Œ๋ฅผ '์•ˆ์ •์ '์œผ๋กœ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ๋‹ค.

ํ•˜์ง€๋งŒ ์•ˆ์ •์ ์ผ ํ•„์š”๊ฐ€ ์—†๋‹ค๋ฉด ๋ฆฌ์ŠคํŠธ์˜ ์‹œ์ž‘๊ณผ ๋๋งŒ์„ ๊ฐ€์ง€๊ณ ๋„ ์›์†Œ๋ฅผ ์žฌ๋ฐฐ์น˜ ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

ํ•ด๋ฒ•2) ์ด๋ฏธ ์กด์žฌํ•˜๋Š” ๋…ธ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ƒˆ๋กœ์šด ๋ฆฌ์ŠคํŠธ ๋งŒ๋“ค๊ธฐ

ํ”ผ๋ฒ— ์›์†Œ๋ณด๋‹ค ํฐ ์›์†Œ๋Š” ๋ฆฌ์ŠคํŠธ์˜ ๋์— ๋ถ™์ด๊ณ  ์ž‘์€ ์›์†Œ๋Š” ๋ฆฌ์ŠคํŠธ ์•ž์— ๋ถ™์ธ๋‹ค.

์ด๋•Œ ์ค‘์š”ํ•œ๊ฒƒ์€ ์›์†Œ๋ฅผ ์‚ฝ์ž…ํ•  ๋•Œ๋งˆ๋‹ค head์™€ tail์„ ๊ฐฑ์‹ ํ•ด์•ผํ•œ๋‹ค๋Š” ๊ฒƒ!

LinkedListNode partitionHT(LinkedListNode node, int x) {
	LinkedListNode head=node;
	LinkedListNode tail=node;
	
	while(node!=null){
		LinkedListNode next=node.next;
		if(node.data<x) {
			// head์— ๋…ธ๋“œ๋ฅผ ์‚ฝ์ž…
			node.next=head;
			head=node;
		} else {
			// tail์— ์‚ฝ์ž…
			tail.next=node;
			tail=node;
		}
		node=next;
	}
	// head๊ฐ€ ๋ฐ”๋€Œ์—ˆ๊ธฐ๋•Œ๋ฌธ์— ์ƒˆ๋กœ์šด head๋ฅผ ๋ฐ˜ํ™˜ํ•ด์•ผํ•จ
	return head;
}

 

 

 

 [ Q5. ๋ฆฌ์ŠคํŠธ์˜ ํ•ฉ ] 

์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ๋กœ ์ˆซ์ž๋ฅผ ํ‘œํ˜„ํ•  ๋•Œ ๊ฐ ๋…ธ๋“œ๊ฐ€ ์ž๋ฆฟ์ˆ˜ ํ•˜๋‚˜๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ๋ฐฉ์‹์œผ๋กœ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ฐ ์ˆซ์ž๋Š” ์—ญ์ˆœ์œผ๋กœ ๋ฐฐ์—ด๋˜์–ด์žˆ๋Š”๋ฐ, ์ฒซ๋ฒˆ์งธ ์ž๋ฆฟ์ˆ˜๊ฐ€ ๋ฆฌ์ŠคํŠธ์˜ ๋งจ ์•ž์— ์œ„์น˜ํ•˜๋„๋ก ๋ฐฐ์—ด๋œ๋‹ค๋Š” ๋œป์ด๋‹ค. ์ด์™€๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ํ‘œํ˜„๋œ ์ˆซ์ž ๋‘๊ฐœ๊ฐ€ ์žˆ์„๋•Œ, ์ด ๋‘ ์ˆ˜๋ฅผ ๋”ํ•˜์—ฌ ๊ทธ ํ•ฉ์„ ์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ๋กœ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ์ž‘์„ฑํ•˜๋ผ.

๋”๋ณด๊ธฐ

์˜ˆ์ œ

์ž…๋ ฅ: (7>1>6)+(5>9>2) ์ฆ‰, 617+295

์ถœ๋ ฅ: 2>1>9 ์ฆ‰, 912

 

- ๋‚ด ํ’€์ด -

๋ฌธ์ œ์ ์ด ์žˆ์ง€ ์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ๊ฐ€ ์—ฐ๊ฒฐ์ด ์•ˆ๋˜์ž–์•„..์š”..!!

LinkedListNode listSum(LinkedListNode a, LinkedListNode b) {
	int sumInt=makeInt(a)+makeInt(b);
	LinkedListNode sumList=null;
	while(sumInt>0) {
		sumList.data=sumInt%10;
		sumInt/=10;
		sumList=sumList.next;
	}
	return sumList;
}

int makeInt(LinkedListNode node) {
	int sum=0;
	int index=0;
	while(node!=null) {
		sum+=node.data*Math.pow(10, index);
		index++;
		node=node.next;
	}
	return sum;
}

 

- ๋ชจ๋ฒ”๋‹ต์•ˆ - 

์ด ๋ฌธ์ œ๋ฅผ ํ’€ ๋•Œ, ์šฐ๋ฆฌ๊ฐ€ ๋ง์…ˆ์„ ์–ด๋–ป๊ฒŒ ํ•˜๋Š”์ง€ ์ƒ๊ฐํ•ด๋ณด๋ฉด ๋„์›€์ด ๋œ๋‹ค.

์šฐ์„  ์œ„ ๋ฌธ์ œ์—์„œ 617+295๋ฅผ ๊ณ„์‚ฐํ•˜๋ฉด

1. ์ผ์˜์ž๋ฆฌ ๊ณ„์‚ฐ : 7+5 = 12 ์ด๋•Œ, 2๋Š” ๋งˆ์ง€๋ง‰ ์ˆซ์ž๊ฐ€๋˜๊ณ  1์€ ๋‹ค์Œ์ž๋ฆฌ๋กœ ๋„˜์–ด๊ฐ„๋‹ค.

2. ์‹ญ์˜์ž๋ฆฌ ๊ณ„์‚ฐ : 1+9+1 = 11 ์ด๋•Œ, ๋‘๋ฒˆ์งธ ์ˆซ์ž๋Š” 1์ด ๋˜๊ณ  1์€ ๋˜ ๋‹ค์Œ์ž๋ฆฌ๋กœ ๋„˜์–ด๊ฐ„๋‹ค.

3. ๋ฐฑ์˜์ž๋ฆฌ ๊ณ„์‚ฐ : 6+2+1 = 9 ์ด๋•Œ ๋งˆ์ง€๋ง‰ ์ˆซ์ž๋Š” 9๊ฐ€๋œ๋‹ค.

์œ„ ๋ฐฉ๋ฒ•์„ ์žฌ๊ท€์ ์œผ๋กœ ํ‰๋‚ด๋‚ผ ์ˆ˜ ์žˆ๋‹ค. ์ฆ‰, ๋…ธ๋“œ๋ฅผ ํ•˜๋‚˜์”ฉ ์Œ์œผ๋กœ ๋”ํ•˜๊ณ , ๋‹ค์Œ์ž๋ฆฌ๋กœ ๋„˜๊ฒจ์•ผ ํ•  ์ˆ˜๋Š” ๋‹ค์Œ ๋…ธ๋“œ๋กœ ์ „๋‹ฌ

LinkedListNode addLists(LinkedListNode l1, LinkedListNode l2, int carry) {
	if(l1==null && l2==null && carry==0) return null;
	
	LinkedListNode result=new LinkedListNode();
	int value=carry;
	if(l1!=null) {
		value+=l1.data;
	}
	if(l2!=null) {
		value+=l2.data;
	}
	result.data=value%10; // ๋‘๋ฒˆ์งธ ์ˆซ์ž
	
	// ์žฌ๊ท€
	if(l1!=null||l2!=null) {
		LinkedListNode more=addLists(l1==null? null:l1.next, l2==null?null:l2.next, value>=10? 1:0);
		result.setNext(more);
	}
	return result;
}

 

 [ Q5. ๋ฆฌ์ŠคํŠธ์˜ ํ•ฉ - ์—ฐ๊ด€๋ฌธ์ œ ] 

๊ฐ ์ž๋ฆฌ์ˆ˜๊ฐ€ ์ •์ƒ์ ์œผ๋กœ ๋ฐฐ์—ด๋œ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜์—ฌ ๊ฐ™์€ ๋ฌธ์ œ๋ฅผ ํ’€์–ด๋ณด์ž

๋”๋ณด๊ธฐ

์˜ˆ์ œ

์ž…๋ ฅ : (6>1>7) + (2>9>5) ์ฆ‰, 617+295

์ถœ๋ ฅ : 9>1>2 ์ฆ‰,912

- ๋ชจ๋ฒ”๋‹ต์•ˆ -

์—ฐ๊ด€๋ฌธ์ œ๋Š” ๊ฐœ๋…์ ์œผ๋กœ ๋™์ผ(์žฌ๊ท€์‚ฌ์šฉ ๋ฐ ์ž๋ฆฌ์ˆ˜ ๋„˜๊ธด๋‹ค๋Š” ์ )ํ•˜์ง€๋งŒ, ๊ตฌํ˜„์‹œ ์ฃผ์˜์‚ฌํ•ญ์ด ์žˆ๋‹ค.

1. ๋ฆฌ์ŠคํŠธ์˜ ๊ธธ์ด๊ฐ€ ๋‹ค๋ฅธ ๊ฒฝ์šฐ ์‰ฝ๊ฒŒ ์ฒ˜๋ฆฌ ๋ถˆ๊ฐ€ : ๋”ฐ๋ผ์„œ ์งง์€ ๋ฆฌ์ŠคํŠธ์— ํ•ด๋“œ์— 0์„ ์ฑ„์›Œ๋„ฃ๋Š”๋‹ค

2. ์›๋ž˜๋Š” ๊ณ„์‚ฐ ํ›„ ๊ผฌ๋ฆฌ์ชฝ์— ๋ถ™์—ฌ๋‚˜๊ฐ”์ง€๋งŒ ์—ฌ๊ธฐ์„œ๋Š” ๋จธ๋ฆฌ์ชฝ์— ๋ถ™์—ฌ๋‚˜๊ฐ€์•ผํ•œ๋‹ค. ๋˜ํ•œ ์žฌ๊ท€ํ˜ธ์ถœ ๋ฐ ๋„˜๊น€์ˆ˜๋ฅผ ๊ฐ™์ด

์ „๋‹ฌํ•ด์•ผํ•˜๊ธฐ๋•Œ๋ฌธ์— wrapperํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค์–ด ํ•ด๊ฒฐํ•œ๋‹ค

class PartialSum {
	public LinkedListNode sum=null;
	public int carry=0;
}
LinkedListNode addListsReverse(LinkedListNode l1, LinkedListNode l2) {
	int len1=length(l1);
	int len2=length(l2);
	
	// ์งง์€ ๋ฆฌ์ŠคํŠธ์— 0์„ ๋ถ™์ž„
	if(len1<len2) {
		l1=padList(l1, len2-len1);
	} else {
		l2=padList(l2,len1-len2);
	}
	
	//๋‘ ๋ฆฌ์ŠคํŠธ๋ฅผ ๋”ํ•œ๋‹ค
	PartialSum sum=addListsHelper(l1,l2);
	
	//๋„˜๊น€์ˆ˜(carry)๊ฐ€ ์กด์žฌํ•œ๋‹ค๋ฉด ๋ฆฌ์ŠคํŠธ ์•ž์ชฝ์— ์‚ฝ์ž…, ์กด์žฌํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด ์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ๋งŒ ๋ฐ˜ํ™˜
	if(sum.carry==0) {
		return sum.sum;
	} else {
		LinkedListNode result=insertBefore(sum.sum, sum.carry);
		return result;
	}
}
int length(LinkedListNode l) {
	if(l==null) {
		return 0;
	} else {
		return 1+length(l.next);
	}
}
PartialSum addListsHelper (LinkedListNode l1, LinkedListNode l2) {
	if(l1==null && l2==null) {
		PartialSum sum=new PartialSum();
		return sum;
	}
	// ์ž‘์€ ์ž๋ฆฌ์ˆ˜๋ฅผ ์žฌ๊ท€์ ์œผ๋กœ ๋”ํ•จ
	PartialSum sum=addListsHelper(l1.next, l2.next);
	// ํ˜„์žฌ๊ฐ’์— ๋„˜๊น€์ˆ˜๋ฅผ ๋”ํ•จ
	int val=sum.carry+l1.data+l2.data;
	// ํ˜„์žฌ ์ž๋ฆฟ์ˆ˜๋ฅผ ํ•ฉํ•œ ๊ฒฐ๊ณผ๋ฅผ ์‚ฝ์ž…
	LinkedListNode full_result=insertBefore(sum.sum, val%10);
	// ์ง€๊ธˆ๊นŒ์ง€์˜ ํ•ฉ๊ณผ ๋„˜๊น€์ˆ˜๋ฅผ ๋ฐ˜ํ™˜
	sum.sum=full_result;
	sum.carry=val/10;
	return sum;
}
// ๋ฆฌ์ŠคํŠธ์•ž์— 0 ์ถ”๊ฐ€
LinkedListNode padList(LinkedListNode l, int padding) {
	LinkedListNode head=l;
	for(int i=0;i<padding;i++) {
		head=insertBefore(head,0);
	}
	return head;
}
// ์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ ์•ž์— ๋…ธ๋“œ๋ฅผ ์‚ฝ์ž…ํ•˜๊ธฐ ์œ„ํ•ด ๋„์›€์ฃผ๋Š” ํ•จ์ˆ˜
LinkedListNode insertBefore(LinkedListNode list, int data) {
	LinkedListNode node=new LinkedListNode();
	if(list != null) {
		node.next=list;
	}
	return node;
}

์œ„์ฒ˜๋Ÿผ ๊ฐ ๋ฉ”์†Œ๋“œ๋ฅผ ๋…๋ฆฝ์ ์œผ๋กœ ๋ถ„๋ฆฌํ•˜์—ฌ ์ž‘์„ฑํ•˜๋ฉด ์ฝ”๋“œ๋„ ๊ฐ„๋‹นํ•ด์ง€๊ณ  ๊ฐ€๋…์„ฑ๋„ ๋†’์•„์ง„๋‹ค.

 

 

 

 [ Q6. ํšŒ๋ฌธ ] 

์ฃผ์–ด์ง„ ์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ๊ฐ€ ํšŒ๋ฌธ์ธ์ง€ ๊ฒ€์‚ฌํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ์ž‘์„ฑํ•˜๋ผ.

 

 

- ๋‚ด ํ’€์ด -

์ฒ˜์Œ์—๋Š” ๊ธธ์ด๋ฅผ ์•Œ์•„๋‚ด์„œ ์ค‘๊ฐ„๊นŒ์ง€๋งŒ stack์— ๋„ฃ๊ณ  ๋นผ๋ฉด์„œ ๋น„๊ตํ•˜๋ ค๊ณ  ํ–ˆ๋Š”๋ฐ

ํ™€์ˆ˜์ธ ๊ฒฝ์šฐ ๊ฐ€์šด๋ฐ ์ˆ˜๋ฅผ ์ฒ˜๋ฆฌํ•˜์ง€์•Š๋Š” ๋ฐฉ๋ฒ•์„ ๊ณ ์•ˆํ•ด๋‚ด์ง€ ๋ชปํ–ˆ๋‹ค.

๊ทธ๋ž˜์„œ ๋ฆฌ์ŠคํŠธ๋ฅผ ๋’ค์ง‘์–ด์„œ ์ €์žฅํ•˜๊ณ  ๋‘ ๋ฆฌ์ŠคํŠธ๊ฐ€ ๊ฐ™์€์ง€ ๋น„๊ตํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ–ˆ๋‹ค.

๊ทธ๋Ÿฐ๋ฐ ์ด๊ฒƒ๋„ ๋ฆฌ์ŠคํŠธ๋ฅผ ๋ฐ˜๋Œ€๋กœ ์ €์žฅ์„ ๋ชปํ•ด์„œ ์‹คํŒจ..

=> 1. ํ™€์ˆ˜์ธ๊ฒฝ์šฐ : ๊ธธ์ด๋ฅผ ์•Œ์•„๋‚ด๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ํ•ด๋ฒ•2์ฒ˜๋Ÿผ ๋‘๊ฐœ์˜ ํฌ์ธํ„ฐ ๊ฑฐ๋ฆฌ๋ฅผ 2๋ฐฐ๋กœ ์ˆœํšŒ๋ฅผ ํ™œ์šฉ

=> 2. ๋ฆฌ์ŠคํŠธ ๋’ค์ง‘๊ธฐ ๊ฒฝ์šฐ : ํ•ด๋ฒ•1์ฒ˜๋Ÿผ ๋ฉ”์†Œ๋“œ๋ฅผ ๋ถ„๋ฆฌํ•˜๋ฉฐ ์ƒˆ๋กญ๊ฒŒ ๋…ธ๋“œ๋ฅผ ์ƒˆ๋กญ๊ฒŒ ์ƒ์„ฑํ•˜๋ฉฐ ๋ณต์ œ

 

 

- ๋ชจ๋ฒ”๋‹ต์•ˆ -

ํ•ด๋ฒ•1) ๋’ค์ง‘์–ด์„œ ๋น„๊ตํ•œ๋‹ค

์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ๋ฅผ ๋’ค์ง‘์–ด์„œ ์›๋ž˜๋ฆฌ์ŠคํŠธ์™€ ๋น„๊ต

์ด๋•Œ ๋น„๊ต๋Š” ์ ˆ๋ฐ˜๋งŒ ํ•˜๋ฉด OK

boolean bePalindrome(LinkedListNode head) {
	LinkedListNode reverse=reverseAndClone(head);
	return isEqual(head, reverse);
}
LinkedListNode reverseAndClone(LinkedListNode node) {
	LinkedListNode head=null;
	while(node!=null) {
		LinkedListNode n=new LinkedListNode(node.data); //๋ณต์‚ฌ
		n.next=head;
		head=n;
		node=node.next;
	}
	return head;
}
boolean isEqual(LinkedListNode node1, LinkedListNode node2) {
	while(node1!=null && node2!=null) {
		if(node1.data!=node1.data) return false;
		node1=node1.next;
		node2=node2.next;
	}
	return node1==null && node2==null;
}

์œ„์ฒ˜๋Ÿผ ๋Š˜, ๋ชจ๋“ˆํ™”ํ•˜๋Š” ๊ฒƒ์„ ๊ถŒ์žฅ

์›์†Œ ๋‘๊ฐœ๊ฐ€ ๋“ค์–ด์žˆ๋Š” ๋ฐฐ์—ด์„ ๋ฐ˜ํ™˜ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์ด๋Ÿฐ ๋ฐฉ์‹์€ ์œ ์ง€๋ณด์ˆ˜๊ฐ€ ์ž˜ ๋˜์ง€์•Š๋Š”๋‹ค๋Š”๊ฒƒ.

 

ํ•ด๋ฒ•2) ์ˆœํ™˜์  ์ ‘๊ทผ๋ฒ•

์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ์˜ ์•ž ์ ˆ๋ฐ˜์ด ๋‚˜๋จธ์ง€ ์ ˆ๋ฐ˜๊ณผ ๊ฐ™์€์ง€๋ฅผ ๊ฒ€์‚ฌ > ์Šคํƒ์„ ์ด์šฉ

์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ์˜ ๊ธธ์ด๋ฅผ ์•„๋Š” ๊ฒฝ์šฐ for๋ฌธ์„ ์‚ฌ์šฉ

์ฆ‰, ์ฐจ๋ก€๋กœ ์ˆœํšŒํ•˜๋ฉฐ ๋ฐ˜์„ ์Šคํƒ์— ๋„ฃ๊ณ  ๋‚˜๋จธ์ง€๋ฅผ ์ˆœํšŒํ•˜๋ฉฐ ๋น„๊ต

์ด๋•Œ ๋‘๊ฐœ์˜ ํฌ์ธํ„ฐ๋ฅผ ์‚ฌ์šฉ

โ˜…ํ•ต์‹ฌ : ์›์†Œ๊ฐœ์ˆ˜๋ฅผ ์•Œ์ง€ ์•Š์•„๋„ ํฌ์ธํ„ฐ๋ฅผ 2๋ฐฐ์”ฉ ์›€์ง์ด๋ฉด ๋์— ๋„๋‹ฌโ˜…

1. ์ด๋•Œ ํ™€์ˆ˜๊ฐœ์ธ๊ฒฝ์šฐ์—๋Š” ๋งˆ์ง€๋ง‰ ํฌ์ธํ„ฐ๊ฐ€ null์ด ์•„๋‹Œ์ƒํ™ฉ

2. ์ง์ˆ˜๊ฐœ์ธ๊ฒฝ์šฐ์—๋Š” ๋งˆ์ง€๋ง‰ ํฌ์ธํ„ฐ๊ฐ€ null์ด ์ƒํ™ฉ์œผ๋กœ ์ข…๋ฃŒ

์Šคํƒ์— ์›์†Œ๋ฅผ ๋‹ค ๋„ฃ์€ ๊ฒฝ์šฐ ํ™€์ˆ˜์ผ๋•Œ ์•ž์„ ํฌ์ธํ„ฐ๋ฅผ ํ•˜๋‚˜ ๋„˜๊ธฐ๊ณ 

์ง์ˆ˜์ผ๋•Œ๋Š” ๊ทธ๋ƒฅ ๊ทธ๋Œ€๋กœ ๊บผ๋‚ด๋ฉด์„œ ๋น„๊ตํ•˜๋ฉด OK!

boolean palindrome(LinkedListNode head) {
	LinkedListNode fast=head;
	LinkedListNode slow=head;
	
	Stack<Integer> stack=new Stack<Integer>();
	
	// ์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ์˜ ์•ž ์ ˆ๋ฐ˜์„ ์Šคํƒ์— ์Œ“๋Š”๋‹ค. 
	// => ์•ž์„  ํฌ์ธํ„ฐ(2๋ฐฐ๋น ๋ฅธ) ์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ์˜ ๋์— ๋„๋‹ฌํ•˜๋ฉด, ๋Š๋ฆฐํฌ์ธํ„ฐ๋Š” ์ค‘๊ฐ„์— ๋„๋‹ฌํ–ˆ๋‹ค๋Š” ์‚ฌ์‹ค์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.
	// => ๊ตณ์ด ๊ธธ์ด๋ฅผ ๋จผ์ € ๊ณ„์‚ฐํ•  ํ•„์š”์—†์ด ๋‘๋ฒˆ์”ฉ ์•ž์„œ๋‚˜๊ฐ€๋ฉด OK!
	while(fast!=null && fast.next!=null) {
		stack.push(slow.data);
		slow=slow.next;
		fast=fast.next.next;
	}
	
	// ์›์†Œ์˜ ๊ฐœ์ˆ˜๊ฐ€ ํ™€์ˆ˜์ธ ๊ฒฝ์šฐ ๊ฐ€์šด๋ฐ ์›์†Œ๋Š” skip
	if(fast!=null) {
		slow=slow.next;
	}
	if(slow!=null) {
		int top=stack.pop().intValue();
		// ๊ฐ’์ด ๋‹ค๋ฅด๋ฉด ํšŒ๋ฌธ ๋ถˆ๊ฐ€
		if (top!=slow.data) {
			return false;
		}
		slow=slow.next;
	}
	return true;
}

 

ํ•ด๋ฒ•3) ์žฌ๊ท€์  ์ ‘๊ทผ๋ฒ• : SKIP

 

 

 

 [ Q7. ๊ต์ง‘ํ•ฉ ] 

๋‹จ๋ฐฉํ–ฅ ์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ ๋‘๊ฐœ๊ฐ€ ์ฃผ์–ด์ง„ ๊ฒฝ์šฐ, ์ด ๋‘ ๋ฆฌ์ŠคํŠธ์˜ ๊ต์ง‘ํ•ฉ ๋…ธ๋“œ๋ฅผ ์ฐพ์€ ๋’ค ๋ฐ˜ํ™˜ํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋ผ. ์—ฌ๊ธฐ์„œ ๊ต์ง‘ํ•ฉ์ด๋ž€ ๋…ธ๋“œ์˜ ๊ฐ’์ด ์•„๋‹ˆ๋ผ ๋…ธ๋“œ์˜ ์ฃผ์†Œ๊ฐ€ ์™„์ „ํžˆ ๊ฐ™์€ ๊ฒฝ์šฐ๋ฅผ ๋งํ•œ๋‹ค. ์ฆ‰, ์ฒซ๋ฒˆ์งธ ๋ฆฌ์ŠคํŠธ์— ์žˆ๋Š” k๋ฒˆ์งธ ๋…ธ๋“œ์™€ ๋‘๋ฒˆ์งธ ๋ฆฌ์ŠคํŠธ์— ์žˆ๋Š” j๋ฒˆ์งธ ๋…ธ๋“œ๊ฐ€ ์ฃผ์†Œ๊นŒ์ง€ ์™„์ „ํžˆ ๊ฐ™๋‹ค๋ฉด ์ด ๋…ธ๋“œ๋Š” ๊ต์ง‘ํ•ฉ์˜ ์›์†Œ๊ฐ€ ๋œ๋‹ค.

 

 

- ๋‚ด ํ’€์ด - 

์šฐ์„  ๋ฌธ์ œ๋ฅผ ์ดํ•ดํ•˜์ง€ ๋ชปํ–ˆ์Œ. 

1. ๋ฆฌ์ŠคํŠธ์˜ ๊ต์ง‘ํ•ฉ(์ฃผ์†Œ๊นŒ์ง€ ๊ฐ™์€)์ด ์žˆ๋‹ค๋Š” ๋ง์€ ๋‘ ๋ฆฌ์ŠคํŠธ์˜ ๋งˆ์ง€๋ง‰ ๋…ธ๋“œ๋Š” ํ•ญ์ƒ ๊ฐ™์•„์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ

 => ์Œ.. ์•„๋งˆ ์ค‘๊ฐ„ ๋ถ€๋ถ„๋งŒ ๊ฐ™์„ ์ˆ˜ ๋„ ์žˆ์ž–์•„ ๋ผ๊ณ  ์ƒ๊ฐ์„ ํ•ด์„œ ์•„๋‹๊นŒ? ๊ทผ๋ฐ ๊ทธ๋ ‡๊ฒŒ ์ƒ๊ฐํ•˜๋ฉด ๋งˆ์ง€๋ง‰ ๋…ธ๋“œ๋Š” ๊ฐ€๋ฅดํ‹ฐ๋Š” ๋…ธ๋“œ๊ฐ€ ๋‹ค๋ฅด๋ฏ€๋กœ ์ฃผ์†Œ๊ฐ’์ด ๋‹ค๋ฅผ๊บผ๊ณ  ๊ทธ๋ ‡๊ฒŒ ์ „,์ „,์ „ ๋…ธ๋“œ๋“ค์„ ์ƒ๊ฐํ•˜๋ฉด ๊ฒฐ๊ตญ ๋‹ค ๋‹ค๋ฅธ๋…ธ๋“œ๋ผ๋Š” ์†Œ๋ฆฌ! ๊ทธ๋ž˜์„œ ๋งˆ์ง€๋ง‰ ๋…ธ๋“œ๊ฐ€ ๊ฐ™์•„์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ ์•„๋‹๊นŒ?

2. ์ฃผ์†Œ๊ฐ’์„ ์–ด๋–ป๊ฒŒ ๋น„๊ตํ•˜๋‚˜? nodeํด๋ž˜์Šค ์ž์ฒด๋ฅผ ๋น„๊ตํ•˜๋Š”๊ฒƒ์ธ๊ฐ€?

class lenAndTail {
	public int len;
	public LinkedListNode tail;
	public lenAndTail(int len, LinkedListNode tail) {
		this.len=len;
		this.tail=tail;
	}
}
LinkedListNode hasIntersection(LinkedListNode l1, LinkedListNode l2) {
	if (aroundNode(l1).tail!=aroundNode(l2).tail) return null;
	
	int len1=aroundNode(l1).len;
	int len2=aroundNode(l2).len;
	if(len1<len2) {
		LinkedListNode temp=l1;
		l1=l2;
		l2=temp;
	}
	int diffLen=len1-len2;
	LinkedListNode intersectionNode=null;
	
	for(int i=0; i<len2; i++) {
		for(int j=0;j<diffLen;j++) {
			l1=l1.next;
		}
		if(l1==l2) {
			intersectionNode=l1;
			intersectionNode=intersectionNode.next;
		}
		l1=l1.next;
		l2=l2.next;
	}
	return intersectionNode;
}

// ๊ธธ์ด์™€ ๋งˆ์ง€๋ง‰ ๋…ธ๋“œ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋ฉ”์†Œ๋“œ
lenAndTail aroundNode(LinkedListNode node) {
	lenAndTail lt=new lenAndTail(0, node);
	while(node!=null) {
		lt.len++;
		lt.tail=node;
		node=node.next;
	}
	return lt;
}

 

 

- ๋ชจ๋ฒ”๋‹ต์•ˆ -

๋ฆฌ์ŠคํŠธ์˜ ๊ต์ง‘ํ•ฉ ํŒ๋ณ„ ๋ฐฉ๋ฒ•์€ ๋‘๊ฐ€์ง€

โ‘  ํ•ด์‹œํ…Œ์ด๋ธ”์„ ์‚ฌ์šฉ ์ด๋•Œ ์ค‘์š”ํ•œ๊ฒƒ์€ ๊ฐ’์ด ์•„๋‹Œ ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ๋ฅผ ์ €์žฅํ•ด์•ผํ•œ๋‹ค๋Š” ๊ฒƒ!

ํ•˜์ง€๋งŒ ์ด๋ฐฉ๋ฒ•์€ ๋ณ„๋„์˜ ๊ณต๊ฐ„์„ ํ•„์š”๋กœ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์•„๋ž˜ ๋ฐฉ๋ฒ• ์‚ฌ์šฉ

โ‘ก ์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ์˜ ๊ต์ง‘ํ•ฉ์ด ์กด์žฌํ•œ๋‹ค๋Š” ๋ง์€ ๋‘ ๋ฆฌ์ŠคํŠธ์˜ ๋งˆ์ง€๋ง‰์€ ํ•ญ์ƒ ๊ฐ™์•„์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ

๋”ฐ๋ผ์„œ ๋๊นŒ์ง€ ์ˆœํšŒํ•œ ๋’ค ๋งˆ์ง€๋ง‰ ๋…ธ๋“œ๊ฐ€ ๊ฐ™์€์ง€ ๋น„๊ตํ•˜๋ฉด OK!

 

*๊ฒน์น˜๋Š” ๋…ธ๋“œ๋ฅผ ์ฐพ๊ธฐ์œ„ํ•ด ๋งˆ์ง€๋ง‰์—์„œ๋ถ€ํ„ฐ ๋ฐ˜๋Œ€๋กœ ์ˆœํšŒํ•˜๋ฉด์„œ '๋ถ„๊ธฐ'ํ•˜๋Š” ์ง€์  ์ฐพ๊ธฐ > ํ•˜์ง€๋งŒ ๋‹จ๋ฐ˜ํ–ฅ์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ์—์„œ

๋ฐ˜๋Œ€๋กœ ์ˆœํšŒํ•˜๋Š” ๊ฒƒ ๋ถˆ๊ฐ€๋Šฅ. ๋งŒ์•ฝ ์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ ๊ธธ์ด๊ฐ€ ๊ฐ™๋‹ค๋ฉด ์ˆœ์ฐจ์ ์œผ๋กœ ์ˆœํšŒํ•˜๋ฉฐ ๊ฒน์น˜๋Š” ๋ถ€๋ถ„์„ ์ฐพ์œผ๋ฉด ๋จ

 

* ์œ„๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๊ตฌํ˜„์ ˆ์ฐจ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

1. ๊ฐ ์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ๋ฅผ ์ˆœํšŒํ•˜๋ฉฐ ๊ธธ์ด์™€ ๋งˆ์ง€๋ง‰ ๋…ธ๋“œ๋ฅผ ๊ตฌํ•จ

2. ๋งˆ์ง€๋ง‰ ๋…ธ๋“œ๊ฐ€ ๋‹ค๋ฅด๋‹ค๋ฉด ๊ต์ง‘ํ•ฉ ์—†์Œ

3. ๊ฐ ๋ฆฌ์ŠคํŠธ์˜ ์‹œ์ž‘์— ํฌ์ธํ„ฐ๋ฅผ ๋†“์Œ

4. ๋‘ ๋ฆฌ์ŠคํŠธ์˜ ๊ธธ์ด ์ฐจ ๋งŒํผ ๊ธด ๋ฆฌ์ŠคํŠธ๋ฅผ ํฌ์ธํ„ฐ๋ฅผ ์›€์ง์—ฌ ์œ„์น˜์‹œํ‚จ๋‹ค.

5. ๋‘ ํฌ์ธํ„ฐ๊ฐ€ ๊ฐ™์•„์งˆ๋•Œ๊นŒ์ง€ ๋‘ ๋ฆฌ์ŠคํŠธ๋ฅผ ํ•จ๊ป˜ ์ˆœํšŒ.

public static LinkedListNode findIntersection(LinkedListNode list1, LinkedListNode list2) {
	if(list1==null||list2==null) return null;
	
	//1. ๋งˆ์ง€๋ง‰ ๋…ธ๋“œ์™€ ๊ธธ์ด๋ฅผ ๊ตฌํ•จ
	Result result1= getTailAndSize(list1);
	Result result2= getTailAndSize(list2);
	
	
	//2. ๋งˆ์ง€๋ง‰ ๋…ธ๋“œ๊ฐ€ ๋‹ค๋ฅด๋ฉด ๊ต์ง‘ํ•ฉ์ด ์—†๋‹ค๋Š” ๊ฒƒ
	if(result1.tail!=result2.tail) return null;
	
	//3. ๊ฐ ์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ ์‹œ์ž‘์— ํฌ์ธํ„ฐ ์„ธํŒ…
	LinkedListNode shorter=result1.size<result2.size? list1:list2;
	LinkedListNode longer=result1.size>result2.size? list1:list2;
	System.out.println(list1);
	System.out.println(list2);
	
	//4. ๊ธธ์ด๊ฐ€ ๊ธด ์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ์˜ ํฌ์ธํ„ฐ๋ฅผ ์ฐจ์ด๋งŒํผ ์•ž์œผ๋กœ ์›€์ง์ž„
	longer=getKthNode(longer,Math.abs(result1.size-result2.size));
	
	//5. ๋‘ ํฌ์ธํ„ฐ๊ฐ€ ๋งŒ๋‚ ๋•Œ๊นŒ์ง€ ํ•จ๊ป˜ ์•ž์œผ๋กœ ์›€์ง์ž„
	while(shorter!=longer) {
		shorter=shorter.next;
		longer=longer.next;
	}
	//6. ๋‘˜ ์ค‘ ํ•˜๋‚˜ ๋ฐ˜ํ™˜
	return longer;
}

public static class Result {
	public LinkedListNode tail;
	public int size;
	public Result(LinkedListNode tail, int size) {
		this.tail=tail;
		this.size=size;
	}
}

public static Result getTailAndSize(LinkedListNode list) {
	if(list==null) return null;
	int size=1;
	LinkedListNode current=list;
	while(current.next!=null) {
		size++;
		current=current.next;
	}
	return new Result(current, size);
}

public static LinkedListNode getKthNode(LinkedListNode head,int k) {
	LinkedListNode current=head;
	while(k>0 && current!=null) {
		current=current.next;
		k--;
	}
	return current;
}

 

 

 

 

 [ Q8. ๋ฃจํ”„๋ฐœ๊ฒฌ ] 

์ˆœํ™˜ ์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ(circular linked list)๊ฐ€ ์ฃผ์–ด์กŒ์„๋•Œ, ์ˆœํ™˜๋˜๋Š” ๋ถ€๋ถ„์˜ ์ฒซ๋ฒˆ์งธ ๋…ธ๋“œ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ž‘์„ฑํ•˜๋ผ. ์ˆœํ™˜ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ๋ž‘ ๋…ธ๋“œ์˜ nextํฌ์ธํ„ฐ๊ฐ€ ์•ž์„  ๋…ธ๋“œ๋“ค ๊ฐ€์šด๋ฐ ์–ด๋Š ํ•˜๋‚˜๋ฅผ ๊ฐ€๋ฅดํ‚ค๋„๋ก ์„ค์ •๋˜์–ด์žˆ๋Š”, ์—„๋ฐ€ํžˆ ๋งํ•ด์„œ ๋ณ€์งˆ๋œ ๋ฐฉ์‹์˜ ์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ๋ฅผ ์˜๋ฏธํ•œ๋‹ค.

๋”๋ณด๊ธฐ

์˜ˆ์ œ

์ž…๋ ฅ : a>b>c>d>e>c (์•ž์—๋‚˜์˜จ c์™€ ๋™์ผ)

์ถœ๋ ฅ : c

 

- ๋‚ด ํ’€์ด -

1. HashMap<node,boolean>์‚ฌ์šฉ

2. ์ˆœํšŒํ•˜๋ฉฐ ๋„ฃ๊ณ  ๊ณตํ†ตํ‚ค๋ฅผ ๋ฐœ๊ฒฌํ•œ ๊ฒฝ์šฐ ํ‚ค ๋…ธ๋“œ ๋ฐ˜ํ™˜

... ๋ฃจํ”„์ฐพ๊ธฐ ๊ณต๋ถ€ํ•˜๊ณ  ๋‹ค์‹œ ํ’€์–ด๋ณผ๊ฒƒ์ž„.

	LinkedListNode findLoopPoint(LinkedListNode node) {
		HashMap<LinkedListNode, Boolean> map=new HashMap<LinkedListNode, Boolean>();
		LinkedListNode loopPoint=node;
		while (loopPoint!=null) {
			if(map.containsKey(loopPoint)) return loopPoint;
			map.put(loopPoint,true);
		}
		return null;
	}

 

 

- ๋ชจ๋ฒ”๋‹ต์•ˆ -

์ด ๋ฌธ์ œ๋Š” ์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ์— ๋ฃจํ”„๊ฐ€ ์กด์žฌํ•˜๋Š”์ง€ ์ฐพ๋Š” ๊ณ ์ „์ ์ธ ๋ฌธ์ œ๋ฅผ ๋ณ€ํ˜•ํ•œ ๊ฒƒ

=> 'ํŒจํ„ด๋งค์นญ(Pattern Matching)'์„ ํ™œ์šฉ

1. ์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ์— ๋ฃจํ”„๊ฐ€ ์žˆ๋Š”์ง€ ๊ฒ€์‚ฌ

๋Œ€ํ‘œ์ ์ธ ๊ฒ€์‚ฌ๋ฐฉ๋ฒ•์€ FastRunner/SlowRunner์ ‘๊ทผ๋ฒ•

FastRunner๋Š” ํ•œ๋ฒˆ์— ๋‘๊ฑธ์Œ์”ฉ ๋‚ด๋”›๊ณ , SlowRunner๋Š” ํ•œ๊ฑธ์€์”ฉ ๋‚ด๋”›๋Š”๋‹ค. ์„œ๋กœ ๋‹ค๋ฅธ ์†๋„๋กœ ๋Œ๊ธฐ ๋•Œ๋ฌธ์— ๊ฒฐ๊ตญ ๋งŒ๋‚˜๊ฒŒ ๋œ๋‹ค๋Š” ๊ฒƒ์ด ํ•ต์‹ฌ 

๋ฃจํ”„๋ฌธ์ œ ํ’€์–ด๋ณด๊ณ  ๋‹ค์‹œ ํ’€์–ด๋ณด๊ธฐ. - 318p

๋Œ“๊ธ€