[ 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
๋๊ธ