์ผ | ์ | ํ | ์ | ๋ชฉ | ๊ธ | ํ |
---|---|---|---|---|---|---|
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 |
- ์ด๋ฒคํธ ํจ์ ์คํ ์์
- ํฐ์คํ ๋ฆฌ์ฑ๋ฆฐ์ง
- User Stack
- ๋คํธ์ํฌ
- 4๊ธฐ
- ํฌ๋ํํค์ ๊ธ
- pintos
- ํฌ๋ํํค์ ๊ธ4๊ธฐ
- ํฌ๋ํํค ์ ๊ธ 4๊ธฐ
- ๋ค์ต์คํธ๋ผ
- ํฌ๋ํํค ์ ๊ธ
- ์ถ์ํด๋์ค์์ธํฐํ์ด์ค
- c#
- ์๊ณ ๋ฆฌ์ฆ์์ -๋๋น์ฐ์ ํ์2
- ์ฐ๊ฒฐ๋ฆฌ์คํธ
- ์ ์-์ ํฌ
- ์๊ณ ๋ฆฌ์ฆ
- ํ์ด์ฌ
- ์ค๋ธ์
- KRAFTON JUNGLE
- ์ ๋ํฐ
- kraftonjungle
- ํํ ์ค
- Unity
- anonymous page
- TiL
- ๋ฐฑ์ค
- BFS
- C
- project3
- Today
- Total
๋ง๊ฐ๋ก๊ทธ
ํฌ๋ํํค ์ ๊ธ WEEK5 Day 35 ๋ณธ๋ฌธ
๐2024.2.11
์ค๋ ๊ณผ์ ์ฐ๊ฒฐ๋ฆฌ์คํธ ๋ค ํ์๋ค!! ์ฌ์ค ์ค์ค๋ก ํผ์ ํ์๋ค๊ณ ๋ ํ ์ ์๊ณ ์ฑ GPT์ ๋์๊ณผ ๋๋ฃ๋ถ๋ค์ ๋์์ผ๋ก ํ์๋๋ฐ ๊ทธ๋๋ ํ๋ํ๋ ์ดํดํ๊ณ ๋๊ธด ๋ถ๋ถ์ ๋ฟ๋ฏํ๋ค.
๋ด์ผ์ ์คํ ํ ํ๊ณ CSAPP ์ฑ ์ข ์ฝ์ด๋ด์ผ๊ฒ ๋ค.
๊ณผ์ - ์ฐ๊ฒฐ๋ฆฌ์คํธ
alternateMergeLL
- ๋ ๋ฒ์งธ ๋ฆฌ์คํธ์ ๋ ธ๋๋ฅผ ์ฒซ ๋ฒ์งธ ๋ฆฌ์คํธ์ ๋ฒ๊ฐ์๊ฐ๋ ์์น์ ์ฝ์ ํ๋ค.
- ๋ ๋ฒ์งธ ๋ฆฌ์คํธ์ ๋ ธ๋๋ ์ฒซ ๋ฒ์งธ ๋ฆฌ์คํธ์ ๋ฒ๊ฐ์๊ฐ๋ ์์น๊ฐ ์๋ ๊ฒฝ์ฐ์๋ง ์ฝ์ ๋์ด์ผ ํ๋ค.
๋ด๊ฐ ์ง ์ฝ๋
void alternateMergeLinkedList(LinkedList *ll1, LinkedList *ll2)
{
ListNode *L1 = ll1->head;
ListNode *L2 = ll2->head;
while(L1 != NULL && L2 != NULL)
{
ll2->head = L2->next; //ll2์ head๋ฅผ L2์ ๋ค์ ๋
ธ๋๋ก ์
๋ฐ์ดํธ
L2->next = L1->next; //L2์ ๋ค์ ๋
ธ๋๋ฅผ L1์ ๋ค์ ๋
ธ๋๋ก ์ค์
L1->next = L2; //L1์ ๋ค์ ๋
ธ๋๋ฅผ L2๋ก ์ค์
L1 = L1->next->next; //L1์ ๋
ธ๋๋ฅผ L1์ ๋ค์ ๋ค์ ๋
ธ๋๋ก ์ค์
L2 = ll2->head; //L2์ ๋
ธ๋๋ฅผ ll2์ ํค๋๋ก ์ค์
++(ll1->size);
--(ll2->size);
}
}
chat gpt์ ๋์์ ๋ฐ์ ํ์๋๋ฐ ์ฌ์ค ์ข ์ดํด๊ฐ ์๊ฐ์ ํ์ด๋ฅผ ๋ดค๋๋ ํ์ด์ ๊ตฌํ์ด ๋ ์ดํด๊ฐ ๊ฐ๊ณ ๊ฐ๋จํ ๊ฑฐ ๊ฐ๋ค.
ํ์ด
void alternateMergeLinkedList(LinkedList *ll1, LinkedList *ll2)
{
ListNode *temp;
int fixsize1 = ll1->size;
int fixsize2 = ll2->size;
int inspos = 1;
if(fixsize1 >= fixsize2)
{
while(ll2->size > 0)
{
temp = findNode(ll2, 0);
insertNode(ll1, inspos, temp->item);
removeNode(ll2,0);
inspos +=2;
}
}
else{
while(fixsize1 > 0)
{
temp = findNode(ll2,0);
insertNode(ll1, inspos, temp->item);
removeNode(ll2,0);
inspos +=2;
fixsize1 -= 1;
}
}
}
ll1์ size๊ฐ ll2์ size๋ณด๋ค ํฌ๊ฑฐ๋ ๊ฐ์ผ๋ฉด findNode()๋ฅผ ์ฌ์ฉํด์ ll2์ ๊ฐ์ temp์ ๋ฃ๊ณ ll1์ 1,3,5... ๋ฑ ์ฌ์ด์ฌ์ด์ insert ํ๊ณ ll2์ ๋ ธ๋๋ฅผ ์ญ์ ํด ์ฃผ๊ณ ,
ll1์ size๊ฐ ll2์ size๋ณด๋ค ์์ผ๋ฉด ๋์ผํ๊ฒ ์ฌ์ด์ฌ์ด์ ๋ฃ์ด์ฃผ๋ฉด์ fixsize๋ฅผ 1์ฉ ์ค์ฌ์ฃผ๋ฉด์ fixsize์ ๊ธธ์ด๋งํผ๋ง ์ฝ์ ํด ์ฃผ๋๋ก ํ๋ค.
์ด ๊ตฌํ ๋ฐฉ์์ด ๋ ์ดํด๊ฐ ๊ฐ๊ณ ๊น๋ํ ๊ฑฐ ๊ฐ๋ค๋ ์๊ฐ์ด ๋ ๋ค.
moveOddItemsToBackLL
- ํ์๋ฅผ ๋ชจ๋ ๋ค๋ก ์ฎ๊ธด๋ค.
์ด ๋ถ๋ถ์ ํ๋ฉด์ ๋ง์ ์๊ฐ์ ํ ์ ํด์, ๊ฒฐ๊ตญ ๋ค๋ฅธ ๋๋ฃ๋ถ์ ์ฝ๋๋ฅผ ์ฐธ๊ณ ํด ๋ดค๋๋ฐ odd๋ฅผ ์ฐพ๊ณ ์ฐ๊ฒฐ๋ฆฌ์คํธ์ ๋ง์ง๋ง ๋ ธ๋์ ์ถ๊ฐํด ์ฃผ๋ ๋ถ๋ถ์ ๋ฐ๋ก ๊ตฌ๋ถํ์ง ์๊ณ while๋ฌธ ์์์ ๊ฐ์ด ๋๋ ค์(?) ์ ๋๋ ๊ฑฐ ๊ฐ๋ค.
๊ทธ๋ฆฌ๊ณ ์ดํดํ๋ ๋ถ๋ถ์์๋ ์๊ฐ์ด ์ข ๊ฑธ๋ ธ์ง๋ง, ์ฝ๋ ํ๋ํ๋ ๋๋ฒ๊น ํด์ ํ์ธํด ๋ณด๋ ์ ๋ ์นด.. ๋ฅผ ์ธ์น๊ฒ ๋์๋ค..
void moveOddItemsToBack(LinkedList *ll)
{
/* add your code here */
if (ll == NULL || ll->head == NULL )
return;
ListNode *cur = ll->head;
ListNode *prev, *odd, *tail = NULL;
while (cur != NULL)
{
//ํ์ฌ ๋
ธ๋๊ฐ ํ์์ด๋ฉด
if(cur->item % 2 != 0)
{
if(odd == NULL) //odd ๋ฆฌ์คํธ์ ์ถ๊ฐ
{
odd = cur; //ํ์ฌ ๋
ธ๋๋ฅผ odd ์ฒซ ๋ฒ์งธ ๋
ธ๋๋ก ์ค์
tail = cur; //ํ์ฌ ๋
ธ๋๋ฅผ tail๋ก ์ค์
}
else
{
tail->next = cur; //tail์ ๋ค์ ๋
ธ๋๋ฅผ ํ์ฌ ๋
ธ๋๋ก ์ค์
tail = cur; //tail์ ํ์ฌ ๋
ธ๋(๋ง์ง๋ง ๋
ธ๋)๋ก ์ค์
}
//์ด์ ๊ฐ ์์ผ๋ฉด
if(prev == NULL)
{
ll->head = cur->next;
}
else
{
prev->next = cur->next; //ํ์ฌ ๋
ธ๋์ ๋ค์ ๋
ธ๋๋ฅผ ์ด์ ๋
ธ๋์ ๋ค์ ๋
ธ๋๋ก ์ค์
}
}
//์ง์์ด๋ฉด
else
{
prev = cur; //์ด์ ๋
ธ๋๋ฅผ ํ์ฌ ๋
ธ๋๋ก ์
๋ฐ์ดํธ
}
cur = cur->next; //ํ์ฌ ๋
ธ๋๋ฅผ ๋ค์ ๋
ธ๋๋ก ์
๋ฐ์ดํธ
}
//odd๋ฆฌ์คํธ๊ฐ ๋น์ด์์ง ์์ผ๋ฉด
if(odd != NULL)
{
tail->next = NULL;
if(prev == NULL)
{
ll->head = odd;
}
else
{
prev->next = odd;
}
}
}
moveEvenItemsToBackLL
- ์ง์๋ฅผ ๋ชจ๋ ๋ค๋ก ์ฎ๊ธด๋ค.
์ด ๋ฌธ์ ๋ ํ์ ๋ฌธ์ ๋ ๋๊ฐ์์ ๋ณ์๋ ์ง์ ์ฐพ๋ ๋ถ๋ถ๋ง ๋ณ๊ฒฝํด ์ฃผ๋ฉด ๋๋ค.
void moveEvenItemsToBack(LinkedList *ll)
{
/* add your code here */
if(ll == NULL && ll->head == NULL)
return;
ListNode *cur = ll->head;
ListNode *even , *prev , *tail = NULL;
while(cur != NULL)
{
if(cur->item %2 == 0)
{
if(even ==NULL)
{
even = cur;
tail = cur;
}
else
{
tail->next = cur;
tail = cur;
}
if(prev ==NULL)
{
ll->head = prev;
}
else
{
prev->next = cur->next;
}
}
//ํ์์ด๋ฉด
else
{
prev = cur;
}
cur = cur->next;
}
if(even !=NULL)
{
tail->next =NULL;
if(prev ==NULL)
{
ll->head = even;
}
else
{
prev->next = even;
}
}
}
frontBackSplitLL
- ๋จ์ผ ์ฐ๊ฒฐ๋ฆฌ์คํธ๋ฅผ ๋ ๊ฐ์ ์๋ธ๋ฆฌ์คํธ๋ก ๋ถํ ํ๋ค.
- ํ๋๋ ์ ๋ฐ๋ถ(frontList), ๋ค๋ฅธ ํ๋๋ ํ๋ฐ๋ถ(backList)๋ฅผ ๋ํ๋ธ๋ค.
- ์์์ ๊ฐ์๊ฐ ํ์์ธ ๊ฒฝ์ฐ, ์ถ๊ฐ ์์๋ ์ ๋ฐ๋ถ ๋ฆฌ์คํธ์ ํฌํจํ๋ค.
์ด ๋ฌธ์ ๋ ๋๋ฃ๋ถ๊ป์ ํ๋ก์ด๋์ ํ ๋ผ์ ๊ฑฐ๋ถ์ด ์๊ณ ๋ฆฌ์ฆ์ ์์ฉํด์ ํ๋ฉด ๋๋ค๋ผ๊ณ ํ๋ฉด์ ์๋ ค์ฃผ์ จ๋ค.
ํ ๋ผ์ ๊ฑฐ๋ถ์ด ์๊ณ ๋ฆฌ์ฆ์ ์ฒ์ ๋ค์ด๋ดค๋ค. ์ด๋ฐ ์๊ณ ๋ฆฌ์ฆ์ด ์๋์ง๋ ๋ชฐ๋๋ค.
์๊ฐ์ด ๋๋ค๋ฉด ํ ๋ผ์ ๊ฑฐ๋ถ์ด ์๊ณ ๋ฆฌ์ฆ๋ ๊ณต๋ถํด ๋ด์ผ๊ฒ ๋ค.
void frontBackSplitLinkedList(LinkedList *ll, LinkedList *resultFrontList, LinkedList *resultBackList)
{
ListNode *temp1 = ll->head;
ListNode *temp2 = ll->head->next;
while(temp2 != NULL) //๋ฆฌ์คํธ์ ๋์ ๋๋ฌํ ๋๊น์ง
{
temp2 = temp2->next; //temp2๋ฅผ ํ ์นธ ์์ผ๋ก ์ด๋(์ด ๋ ์นธ ์ด๋์ํค๊ธฐ ์ํด์)
if(temp2 != NULL) //์ด๋ํ temp2๊ฐ null์ด ์๋๋ผ๋ฉด
{
temp1 = temp1->next; //temp1 ํ ์นธ์ฉ ๋ ์ด๋
temp2 = temp2->next; //temp2 ํ ์นธ์ฉ ๋ ์ด๋ (์ด ๋ ์นธ ์ด๋)
}
}
resultFrontList->head = ll->head;
resultFrontList->size = ll->size / 2;
resultBackList->head = temp1->next; //temp1์ ์ค๊ฐ์ ์์น
resultBackList->size = ll->size - resultFrontList->size;
temp1->next = NULL; //๋ ๋ฆฌ์คํธ๋ฅผ ์์ ํ ๋ถ๋ฆฌ
}
temp1์ ํ ๋ ธ๋์ฉ ์ด๋ํ๊ณ , temp2๋ ๋ ๋ ธ๋์ฉ ์ด๋ํ๋ค.
temp2๊ฐ NULL์ด ๋๋ค๋ ๋ง์ ์ฐ๊ฒฐ๋ฆฌ์คํธ์ ๋๊น์ง ๋ค ์ด๋ํ๋ค๋ ์๋ฏธ๋ก temp2๊ฐ ๋ฆฌ์คํธ์ ๋์ ๋๋ฌํ๋ฉด temp1์ ์ค๊ฐ์ ์์นํ๊ฒ ๋๋ค.
resultFrontList->head๋ฅผ ll->head๋ก ์ค์ ํด ์ฃผ๊ณ , size๋ ๋ฆฌ์คํธ์ ์ฌ์ด์ฆ๋ฅผ 2๋ก ๋๋ ์๋ก ์ค์ ํ๋ค.
resultBackList->head๋ฅผ temp1->next๋ก ์ค์ ํด ์ฃผ๋ ์ด์ ๋
temp1 ๋ฆฌ์คํธ๋ ์ค๊ฐ์ ์์นํ๊ธฐ ๋๋ฌธ์ temp1์ ๋ค์ ๋ ธ๋๋ฅผ head๋ก ์ค์ ํ๋ ๊ฒ์ด๋ค.
resultBackList->size๋ ๋ฆฌ์คํธ์ ์ ์ฒด ์ฌ์ด์ฆ์์ resultFrontList์ ์ฌ์ด์ฆ๋ฅผ ๋บ ๊ฐ์ด ๋๋ค.
๊ทธ๋ฆฌ๊ณ temp1->next๋ฅผ NULL๋ก ํด์ฃผ๋ ์ด์ ๋ ๋ ๋ฆฌ์คํธ๋ก ์์ ํ ๋ถ๋ฆฌํด์ผ ํ๊ธฐ ๋๋ฌธ์, temp1์ ๋ค์ ๋ ธ๋๋ฅผ null๋ก ํด์ค์ผ๋ก์จ ์์ ํ ๋ถ๋ฆฌ๋๋ค.
-> ์ค์ ์ด ์ฝ๋๋ฅผ ์ ์ผ๋ค๊ฐ ์๋ฌ๊ฐ ๋จ๊ณ , ๋ ๋ฆฌ์คํธ๋ก ์์ ํ ๋ถ๋ฆฌ๊ฐ ์์๋ค.
-> resultFrontList : 1 2 3 4 5 6
-> resultBackList : 5 6
moveMaxToFront
- ์ต๋ํ ํ ๋ฒ๋ง ์ฐ๊ฒฐ๋ฆฌ์คํธ๋ฅผ ์ํํ๋ ํจ์๋ฅผ ์์ฑํ๋ค.
- ๊ทธ๋ฆฌ๊ณ ๊ฐ์ฅ ํฐ ๊ฐ์ ์ ์ฅํ ๋ ธ๋๋ฅผ ๋ฆฌ์คํธ์ ์์ชฝ์ผ๋ก ์ด๋ํ๋ค.
์ด ๋ฌธ์ ๋ ๋น๊ต์ ๊ธ๋ฐฉ ํ์๋ค.
int moveMaxToFront(ListNode **ptrHead)
{
ListNode *temp = *ptrHead; //๋ฆฌ์คํธ์ head๋ฅผ ๊ฐ๋ฆฌํด
ListNode *prev = NULL;
ListNode *max = *ptrHead;
if(temp ==NULL) //head๊ฐ null์ด๋ฉด
return 0;
while(temp->next != NULL) //๋ฆฌ์คํธ์ ๋์ ๋๋ฌํ ๋๊น์ง
{
if(temp->next->item > max->item)
{
prev = temp; //์ด์ ๋
ธ๋๋ฅผ ํ์ฌ ๋
ธ๋๋ก ์ค์
max = temp->next; //max๋ฅผ ๋ค์ ๋
ธ๋๋ก ์
๋ฐ์ดํธ
}
temp = temp->next; //๋ค์ ๋
ธ๋๋ก ์ด๋
}
if(max != *ptrHead) //๋ง์ฝ max๊ฐ ํค๋๊ฐ ์๋๋ผ๋ฉด
{
prev->next = max->next; //prev์ ๋ค์ ๋
ธ๋๋ฅผ max์ ๋ค์ ๋
ธ๋๋ก
max->next = *ptrHead; //max์ next๋ฅผ ํค๋๋ก
*ptrHead = max; //ํค๋๋ฅผ max๋ก ์
๋ฐ์ดํธ
}
return 0;
}
์ ์ฒด์ ์ผ๋ก ๋ฆฌ์คํธ๋ฅผ ํ ๋ฒ๋ง ์ํํ๋ฏ๋ก ์๊ฐ ๋ณต์ก๋ O(n)
recursiveReverse
- ์ฃผ์ด์ง ์ฐ๊ฒฐ๋ฆฌ์คํธ์ next ํฌ์ธํฐ์ head ํฌ์ธํฐ๋ฅผ ๋ณ๊ฒฝํ์ฌ ์ฌ๊ท์ ์ผ๋ก ์ฐ๊ฒฐ๋ฆฌ์คํธ๋ฅผ ๋ค์ง๋ ํจ์๋ฅผ ์์ฑํ๋ค.
-> ํจ์ ๋ด๋ถ์์ ์๊ธฐ ์์ ์ ํธ์ถํ์ฌ ๋ฆฌ์คํธ์ ๋ ธ๋๋ฅผ ํ๋์ฉ ์ฒ๋ฆฌํ๋ฉด์ ๋ฆฌ์คํธ๋ฅผ ๋ค์ง์ด์ผ ํ๋ค.
๋ง์ง๋ง์ ํ์ฐ๋์ด ์ค๋ช ํด ์ฃผ์ ์ ์ค๋ช ๋ฃ๊ณ pdf ํ์ผ์ ์๋ ํํธ ์ฃผ์ ๋ด์์ ๊ตฌํํ๋๊น ๋๋ค.
void RecursiveReverse(ListNode **ptrHead)
{
if(*ptrHead == NULL || (*ptrHead)->next == NULL) //๋ฆฌ์คํธ๊ฐ ๋น์ด์๊ฑฐ๋, ๋ฆฌ์คํธ์ ๋
ธ๋๊ฐ ํ๋๋ผ๋ฉด
return;
ListNode *first = *ptrHead;
ListNode *rest = first->next;
RecursiveReverse(&rest);
//ํ์ฌ ๋
ธ๋๋ฅผ ๋ค์ ๋
ธ๋์ ๋ค์์ผ๋ก ์ค์ ํ์ฌ ์ญ์์ผ๋ก ์ฐ๊ฒฐ
first->next->next = first;
first->next = NULL; //๋ค์งํ ๋ฆฌ์คํธ์ ๋์ ํ์ํ๋ค.
*ptrHead = rest; //์๋ก์ด ํค๋๋ฅผ ์ค์ ํ๋ค.
}
๋ฆฌ์คํธ ํ ๋ฒ ์ํํ๋ฏ๋ก ์๊ฐ ๋ณต์ก๋ O(n)
'Krafton jungle' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
ํฌ๋ํํค ์ ๊ธ WEEK5 Day37 - Binary Tree (1) | 2024.02.14 |
---|---|
ํฌ๋ํํค ์ ๊ธ WEEK5 Day 36 - Stack and Queue (0) | 2024.02.13 |
ํฌ๋ํํค ์ ๊ธ WEEK5 Day 34 (2) | 2024.02.11 |
ํฌ๋ํํค ์ ๊ธ WEEK5 Day33 (0) | 2024.02.09 |
ํฌ๋ํํค ์ ๊ธ WEEK5 Day32 (1) | 2024.02.09 |