From bb1004545bee50b69741e6108d8eef9c09204bc2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=AF=BC=EC=84=9D?= <80371412+MinSeok0123@users.noreply.github.com> Date: Thu, 16 Nov 2023 00:03:41 +0900 Subject: [PATCH] Updates --- .../index.html" | 8 ++++---- .../index.html" | 8 ++++---- 404.html | 6 +++--- 404/index.html | 6 +++--- 63a8ec3f-7c2f188a91c57aaabce4.js | 2 ++ 63a8ec3f-7c2f188a91c57aaabce4.js.map | 1 + 63a8ec3f-93e1a0ad47f8b8b18696.js | 2 ++ 63a8ec3f-93e1a0ad47f8b8b18696.js.map | 1 + ...b400f66d09f337f68113b877142f92-d74f7497417ad3d42730.js | 2 ++ ...f66d09f337f68113b877142f92-d74f7497417ad3d42730.js.map | 1 + .../index.html" | 8 ++++---- "DFS\354\231\200 BFS/index.html" | 8 ++++---- .../index.html" | 8 ++++---- .../index.html" | 8 ++++---- .../index.html" | 8 ++++---- .../index.html" | 8 ++++---- _gatsby/slices/_gatsby-scripts-1.html | 4 ++-- chunk-map.json | 2 +- component---src-pages-404-tsx-e950cf19f7f97970aabd.js | 2 ++ component---src-pages-404-tsx-e950cf19f7f97970aabd.js.map | 1 + .../index.html" | 8 ++++---- .../index.html" | 8 ++++---- index.html | 6 +++--- page-data/app-data.json | 2 +- page-data/sq/d/1271460761.json | 1 + page-data/sq/d/2540524192.json | 2 +- .../index.html" | 8 ++++---- .../index.html" | 8 ++++---- recent/index.html | 6 +++--- .../index.html" | 8 ++++---- search/index.html | 6 +++--- sitemap-pages.xml | 2 +- sitemap.xml | 2 +- .../index.html" | 8 ++++---- .../index.html" | 8 ++++---- webpack-runtime-6d818bd7d955c9a16c3c.js | 2 ++ webpack-runtime-6d818bd7d955c9a16c3c.js.map | 1 + webpack-runtime-a664107c2b484150c8f9.js | 2 ++ webpack-runtime-a664107c2b484150c8f9.js.map | 1 + webpack.stats.json | 2 +- .../index.html" | 8 ++++---- .../index.html" | 8 ++++---- .../index.html" | 8 ++++---- "\353\246\254\354\225\241\355\212\270props/index.html" | 8 ++++---- .../index.html" | 8 ++++---- .../index.html" | 8 ++++---- .../index.html" | 8 ++++---- .../index.html" | 8 ++++---- .../index.html" | 8 ++++---- .../index.html" | 8 ++++---- .../index.html" | 8 ++++---- .../index.html" | 8 ++++---- .../index.html" | 8 ++++---- .../index.html" | 8 ++++---- .../index.html" | 8 ++++---- .../index.html" | 8 ++++---- .../index.html" | 8 ++++---- 57 files changed, 170 insertions(+), 151 deletions(-) create mode 100644 63a8ec3f-7c2f188a91c57aaabce4.js create mode 100644 63a8ec3f-7c2f188a91c57aaabce4.js.map create mode 100644 63a8ec3f-93e1a0ad47f8b8b18696.js create mode 100644 63a8ec3f-93e1a0ad47f8b8b18696.js.map create mode 100644 8e5f29247fb400f66d09f337f68113b877142f92-d74f7497417ad3d42730.js create mode 100644 8e5f29247fb400f66d09f337f68113b877142f92-d74f7497417ad3d42730.js.map create mode 100644 component---src-pages-404-tsx-e950cf19f7f97970aabd.js create mode 100644 component---src-pages-404-tsx-e950cf19f7f97970aabd.js.map create mode 100644 page-data/sq/d/1271460761.json create mode 100644 webpack-runtime-6d818bd7d955c9a16c3c.js create mode 100644 webpack-runtime-6d818bd7d955c9a16c3c.js.map create mode 100644 webpack-runtime-a664107c2b484150c8f9.js create mode 100644 webpack-runtime-a664107c2b484150c8f9.js.map diff --git "a/1\354\260\250\354\233\220 \353\260\260\354\227\264/index.html" "b/1\354\260\250\354\233\220 \353\260\260\354\227\264/index.html" index f58cc5c..111e2fa 100644 --- "a/1\354\260\250\354\233\220 \353\260\260\354\227\264/index.html" +++ "b/1\354\260\250\354\233\220 \353\260\260\354\227\264/index.html" @@ -101,7 +101,7 @@ setTheme(preferredTheme || (darkQuery.matches ? 'dark' : 'light')) }() -
minlog

1차원 배열

2023.11.12·조회수:
0
thumbnail
 

1차원 배열

+
minlog

1차원 배열

2023.11.12·조회수:
0
thumbnail
 

1차원 배열

배열 : 배열은 같은 데이터 타입의 데이터(Data)를 여러 개 저장할 수 있는 저장공간이다.

@@ -230,10 +230,10 @@

int[] 아파트 = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; // 11개의 공간만 할당

-

+
- \ No newline at end of file + \ No newline at end of file diff --git "a/2\354\260\250\354\233\220 \353\260\260\354\227\264\352\263\274 \352\260\200\353\263\200\353\260\260\354\227\264/index.html" "b/2\354\260\250\354\233\220 \353\260\260\354\227\264\352\263\274 \352\260\200\353\263\200\353\260\260\354\227\264/index.html" index c63218c..ccac4a5 100644 --- "a/2\354\260\250\354\233\220 \353\260\260\354\227\264\352\263\274 \352\260\200\353\263\200\353\260\260\354\227\264/index.html" +++ "b/2\354\260\250\354\233\220 \353\260\260\354\227\264\352\263\274 \352\260\200\353\263\200\353\260\260\354\227\264/index.html" @@ -101,7 +101,7 @@ setTheme(preferredTheme || (darkQuery.matches ? 'dark' : 'light')) }() -
minlog

2차원 배열과 가변배열

2023.11.12·조회수:
0
thumbnail
 

2차원 배열과 가변배열

+
minlog

2차원 배열과 가변배열

2023.11.12·조회수:
0
thumbnail
 
+
- \ No newline at end of file + \ No newline at end of file diff --git a/404.html b/404.html index 1cb773b..e812bde 100644 --- a/404.html +++ b/404.html @@ -101,10 +101,10 @@ setTheme(preferredTheme || (darkQuery.matches ? 'dark' : 'light')) }() -
404
찾을 수 없는 페이지입니다.
다른 콘텐츠를 보러 가보시겠어요?
메인으로
+
404
찾을 수 없는 페이지입니다.
다른 콘텐츠를 보러 가보시겠어요?
메인으로
- \ No newline at end of file + \ No newline at end of file diff --git a/404/index.html b/404/index.html index d0eabef..394f6c6 100644 --- a/404/index.html +++ b/404/index.html @@ -101,10 +101,10 @@ setTheme(preferredTheme || (darkQuery.matches ? 'dark' : 'light')) }() -
404
찾을 수 없는 페이지입니다.
다른 콘텐츠를 보러 가보시겠어요?
메인으로
+
404
찾을 수 없는 페이지입니다.
다른 콘텐츠를 보러 가보시겠어요?
메인으로
- \ No newline at end of file + \ No newline at end of file diff --git a/63a8ec3f-7c2f188a91c57aaabce4.js b/63a8ec3f-7c2f188a91c57aaabce4.js new file mode 100644 index 0000000..098a09c --- /dev/null +++ b/63a8ec3f-7c2f188a91c57aaabce4.js @@ -0,0 +1,2 @@ +"use strict";(self.webpackChunkgatsby_starter_default=self.webpackChunkgatsby_starter_default||[]).push([[470],{9297:function(e,t,r){var o=r(4316),i=r(7294),n=r(640),l=r.n(n),a=r(6042),d=r(917);const s=(0,o.Z)("div",{target:"e1ijh0y119"})({name:"1zgj01",styles:"display:flex;flex-direction:column;width:768px;margin:0 auto;padding:10px 0;word-break:break-all;line-height:1.8;font-size:16px;font-weight:400;p{padding:3px 0;}img{display:block;margin:3rem auto;max-width:100%;}h1,h2,h3{font-weight:800;margin-bottom:30px;@media (max-width: 768px){margin-bottom:10px;}}*+h1,*+h2,*+h3{margin-top:80px;@media (max-width: 768px){margin-top:30px;}}hr+h1,hr+h2,hr+h3{margin-top:0;}h1{font-size:30px;}h2{font-size:25px;}h3{font-size:20px;}blockquote{margin:2rem 0px;border-left:4px solid var(--velog);border-top-right-radius:4px;border-bottom-right-radius:4px;background:var(--bg-element2);padding:1rem 1rem 1rem 2rem;color:var(--text1);}ol,ul{margin-left:20px;padding:30px 0;}hr{border:1px solid var(--hr);margin:100px 0;}a{color:#4263eb;text-decoration:underline;}pre[class*='language-']{margin:30px 0;padding:15px;font-size:15px;@media (max-width: 768px){font-size:0.75rem;margin:20px 0;}::-webkit-scrollbar-thumb{background:rgba(255, 255, 255, 0.5);border-radius:3px;}}code[class*='language-'],pre[class*='language-']{tab-size:2;background:var(--prism-bg);color:var(--prism-default-text);}@media (max-width: 768px){width:100%;padding:80px 20px;line-height:1.6;font-size:14px;h1{font-size:23px;}h2{font-size:20px;}h3{font-size:17px;}img{width:100%;}hr{margin:50px 0;}}"}),p=(0,o.Z)("div",{target:"e1ijh0y118"})({name:"o80hwm",styles:"position:absolute;right:calc((100vw - 728px) / 2 - 340px);width:240px;overflow:hidden auto;padding:0.25rem 0.75rem;line-height:1.5;border-left:2px solid var(--border4);color:var(--text3);max-height:calc(100vh - 128px);font-size:0.875rem;@media (max-width: 1500px){right:calc((100vw - 728px) / 2 - 280px);}@media (max-width: 1200px){display:none;}a:hover{color:var(--text1);}div{display:block;transition:all 0.125s ease-in 0s;}.toc-level-1{margin-left:0;}.toc-level-2{margin-top:4px;margin-left:12px;}.toc-level-3{margin-top:4px;margin-left:24px;}"}),m=(0,o.Z)("div",{target:"e1ijh0y117"})({name:"8glmej",styles:"position:absolute;left:calc((100vw - 728px) / 2 - 140px);height:150px;width:64px;display:flex;@media (max-width: 1200px){display:none;}"}),g=(0,o.Z)("div",{target:"e1ijh0y116"})({name:"yj0bj1",styles:"width:4rem;background:var(--bg-element2);border:1px solid var(--border4);border-radius:2rem;padding:0.5rem;display:flex;flex-direction:column;-webkit-box-align:center;align-items:center"}),h=(0,o.Z)("div",{target:"e1ijh0y115"})({name:"gj8xbn",styles:"height:3rem;width:3rem;display:flex;-webkit-box-align:center;align-items:center;-webkit-box-pack:center;justify-content:center;background:var(--bg-element1);border:1px solid var(--border3);border-radius:1.5rem;color:var(--text3);cursor:pointer;z-index:5;:hover{border-color:var(--text1);color:var(--text1);}"}),c=(0,o.Z)("svg",{target:"e1ijh0y114"})({name:"rrel8y",styles:"width:24px;height:24px"}),x=(0,o.Z)("div",{target:"e1ijh0y113"})({name:"7rttet",styles:"margin-top:0.5rem;color:var(--text2);line-height:1;font-size:0.75rem;margin-bottom:1rem;font-weight:bold"}),u=(0,o.Z)("div",{target:"e1ijh0y112"})({name:"gj8xbn",styles:"height:3rem;width:3rem;display:flex;-webkit-box-align:center;align-items:center;-webkit-box-pack:center;justify-content:center;background:var(--bg-element1);border:1px solid var(--border3);border-radius:1.5rem;color:var(--text3);cursor:pointer;z-index:5;:hover{border-color:var(--text1);color:var(--text1);}"}),b=(0,o.Z)("svg",{target:"e1ijh0y111"})({name:"rrel8y",styles:"width:24px;height:24px"}),w=(0,o.Z)("div",{target:"e1ijh0y110"})({name:"ajh738",styles:"margin-top:3rem;margin-bottom:5rem;display:flex;width:768px;margin-left:auto;margin-right:auto;@media (max-width: 768px){flex-direction:column-reverse;padding-left:1rem;padding-right:1rem;width:100%;}"}),f=(0,o.Z)("div",{target:"e1ijh0y19"})({name:"1upo4t4",styles:"min-width:0px;flex:1 1 0%;@media (max-width: 768px){margin-left:0px;margin-bottom:1.5rem;flex:initial;width:100%;}"}),y=(0,o.Z)("div",{target:"e1ijh0y18"})({name:"1rezqhk",styles:"min-width:0px;flex:1 1 0%;margin-left:3rem;@media (max-width: 768px){margin-left:0px;margin-bottom:1.5rem;flex:initial;width:100%;}"}),v=(0,o.Z)("a",{target:"e1ijh0y17"})({name:"ykchvm",styles:"cursor:pointer;background:var(--bg-element2);box-shadow:rgba(0, 0, 0, 0.06) 0px 0px 4px 0px;width:100%;padding-left:1rem;padding-right:1rem;height:4rem;display:flex;-webkit-box-align:center;align-items:center;text-decoration:none"}),k=(0,o.Z)("a",{target:"e1ijh0y16"})({name:"e608jc",styles:"cursor:pointer;background:var(--bg-element2);box-shadow:rgba(0, 0, 0, 0.06) 0px 0px 4px 0px;width:100%;padding-left:1rem;padding-right:1rem;height:4rem;display:flex;-webkit-box-align:center;align-items:center;text-decoration:none;flex-direction:row-reverse"}),Z=(0,o.Z)("div",{target:"e1ijh0y15"})({name:"1hatppn",styles:"width:32px;height:32px;border-radius:16px;display:flex;-webkit-box-align:center;align-items:center;-webkit-box-pack:center;justify-content:center;border:1px solid var(--primary2);font-size:1.5rem;color:var(--primary2);margin-left:1rem"}),j=(0,o.Z)("div",{target:"e1ijh0y14"})({name:"8vop5x",styles:"width:32px;height:32px;border-radius:16px;display:flex;-webkit-box-align:center;align-items:center;-webkit-box-pack:center;justify-content:center;border:1px solid var(--primary2);font-size:1.5rem;color:var(--primary2);margin-right:1rem"}),z=(0,o.Z)("div",{target:"e1ijh0y13"})({name:"tr1knb",styles:"flex:1 1 0%;display:flex;flex-direction:column;align-items:flex-end;line-height:1;min-width:0px"}),C=(0,o.Z)("div",{target:"e1ijh0y12"})({name:"3zpd1g",styles:"flex:1 1 0%;display:flex;flex-direction:column;align-items:flex-start;line-height:1;min-width:0px"}),P=(0,o.Z)("div",{target:"e1ijh0y11"})({name:"14j0lhw",styles:"font-size:0.75rem;font-weight:bold;color:var(--text2);line-height:2;display:block"}),S=(0,o.Z)("div",{target:"e1ijh0y10"})({name:"lvm6g4",styles:"font-size:0.75rem;font-weight:bold;color:var(--text2);display:block;line-height:2"}),_=e=>{let{headings:t}=e;const{0:r,1:o}=(0,i.useState)(null),{0:n,1:s}=(0,i.useState)(!1);(0,i.useEffect)((()=>{function e(){const e=document.documentElement.scrollTop||document.body.scrollTop,t=document.querySelectorAll(".markdown-body h1, .markdown-body h2, .markdown-body h3"),r=Array.from(t).map((t=>({top:t.getBoundingClientRect().top+e,id:t.getAttribute("id")||""}))),i=r.findIndex((t=>{let{top:r}=t;return r>e+80}));o(-1===i?r.length-1:i>0?i-1:null),s(e>240)}return window.addEventListener("scroll",e),e(),()=>{window.removeEventListener("scroll",e)}}),[]);const{0:w,1:f}=(0,i.useState)(!0),{0:y,1:v}=(0,i.useState)(0),{0:k,1:Z}=(0,i.useState)();(0,i.useEffect)((()=>{(async()=>{try{const e=window.location.pathname,t=decodeURIComponent(e.replace(/^\/+|\/+$/g,"")),r=await fetch("https://port-0-minlog-be-dihik2mliwbygs1.sel4.cloudtype.app/api/get_count/"+encodeURIComponent(t),{method:"POST"});if(!r.ok)throw new Error("네트워크 응답이 좋지 않았습니다.");{const e=await r.json();v(e.like_count),Z(e.liked),f(!1),console.log(e.liked)}}catch(e){console.log("조회수, 좋아요를 불러오는데 에러 발생:",e)}})()}),[]);return(0,d.tZ)(i.Fragment,null,(0,d.tZ)(m,{style:{position:n?"fixed":"absolute",top:n?"112px":"355px"}},(0,d.tZ)(g,null,w?(0,d.tZ)(h,null):(0,d.tZ)(h,{onClick:async()=>{try{const e=window.location.pathname,t=decodeURIComponent(e.replace(/^\/+|\/+$/g,"")),r=await fetch("https://port-0-minlog-be-dihik2mliwbygs1.sel4.cloudtype.app/api/like/"+encodeURIComponent(t),{method:"PUT"});if(!r.ok)throw new Error("네트워크 응답이 좋지 않았습니다.");{const e=await r.json();v(e.like_count),Z(e.liked),console.log(e.liked)}}catch(e){console.log("좋아요를 업데이트하는 동안 에러 발생:",e)}},style:{backgroundColor:k?"rgb(56, 217, 169)":"",color:k?"var(--button-text)":"",borderColor:k?"rgb(56, 217, 169)":""}},(0,d.tZ)(c,null,(0,d.tZ)("path",{fill:"currentColor",d:"M18 1l-6 4-6-4-6 5v7l12 10 12-10v-7z"}))),w?(0,d.tZ)(x,null," "):(0,d.tZ)(x,null,y),(0,d.tZ)(u,{onClick:()=>{const e=window.location.href;l()(e),a.Am.success("링크가 복사되었습니다.",{position:"top-right",autoClose:2e3,hideProgressBar:!1,closeOnClick:!0,pauseOnHover:!0,draggable:!0,progress:void 0,theme:"colored",transition:a.BW})}},(0,d.tZ)(b,null,(0,d.tZ)("path",{fill:"currentColor",d:"M5 7c2.761 0 5 2.239 5 5s-2.239 5-5 5-5-2.239-5-5 2.239-5 5-5zm11.122 12.065c-.073.301-.122.611-.122.935 0 2.209 1.791 4 4 4s4-1.791 4-4-1.791-4-4-4c-1.165 0-2.204.506-2.935 1.301l-5.488-2.927c-.23.636-.549 1.229-.943 1.764l5.488 2.927zm7.878-15.065c0-2.209-1.791-4-4-4s-4 1.791-4 4c0 .324.049.634.122.935l-5.488 2.927c.395.535.713 1.127.943 1.764l5.488-2.927c.731.795 1.77 1.301 2.935 1.301 2.209 0 4-1.791 4-4z"}))),(0,d.tZ)(a.Ix,null))),(0,d.tZ)(p,{style:{position:n?"fixed":"absolute",top:n?"112px":"355px"}},t.map(((e,t)=>(0,d.tZ)("div",{key:e.id,className:"toc-level-"+e.level,style:{...t===r&&{transform:"scale(1.05)",display:"block",transition:"all 0.125s ease-in 0s",color:"var(--text1)"}}},(0,d.tZ)("a",{href:"#"+e.id},e.text))))))};t.Z=function(e){let{html:t}=e;const{0:r,1:o}=(0,i.useState)([]),{0:n,1:l}=(0,i.useState)({previousPage:null,nextPage:null});(0,i.useEffect)((()=>{const e=document.querySelectorAll(".markdown-body h1, .markdown-body h2, .markdown-body h3"),t=Array.from(e).map((e=>({id:e.getAttribute("id")||"",text:e.textContent||"",level:Number(e.tagName.charAt(1))})));o(t)}),[]),(0,i.useEffect)((()=>{const e=location.pathname,t=decodeURIComponent(e.replace(/^\/+|\/+$/g,""));fetch("https://port-0-minlog-be-dihik2mliwbygs1.sel4.cloudtype.app/api/view_count/"+encodeURIComponent(t),{method:"POST"}).then((e=>{e.ok?console.log("조회수 업데이트 성공"):console.log("조회수 업데이트 실패")})).catch((e=>{console.log("조회수를 업데이트하는 중에 오류가 발생했습니다.:",e)})),fetch("https://port-0-minlog-be-dihik2mliwbygs1.sel4.cloudtype.app/api/get_page/"+encodeURIComponent(t),{method:"POST"}).then((e=>e.json())).then((e=>{console.log("Data from localhost:8080/api/get_page/pathname:",e),l({previousPage:e.previousPage,nextPage:e.nextPage})})).catch((e=>{console.log("페이지를 가져오는데 오류가 발생했습니다.:",e)}))}),[]);const a=(e,t)=>e.length>t?e.slice(0,t)+"...":e;return(0,d.tZ)(i.Fragment,null,(0,d.tZ)(_,{headings:r}),(0,d.tZ)(s,{className:"markdown-body",dangerouslySetInnerHTML:{__html:t}}),(0,d.tZ)(w,null,!n.previousPage&&(0,d.tZ)(f,null),!n.nextPage&&(0,d.tZ)(y,null),n.previousPage&&(0,d.tZ)(f,null,(0,d.tZ)(v,{href:"/"+n.previousPage},(0,d.tZ)(j,null,(0,d.tZ)("svg",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",viewBox:"0 0 24 24",height:"1em",width:"1em",xmlns:"http://www.w3.org/2000/svg"},(0,d.tZ)("path",{d:"M20 11H7.83l5.59-5.59L12 4l-8 8 8 8 1.41-1.41L7.83 13H20v-2z"}))),(0,d.tZ)(C,null,(0,d.tZ)(S,null,"이전 포스트"),(0,d.tZ)("h3",null,a(n.previousPage,28))))),n.nextPage&&(0,d.tZ)(y,null,(0,d.tZ)(k,{href:"/"+n.nextPage},(0,d.tZ)(Z,null,(0,d.tZ)("svg",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",viewBox:"0 0 24 24",height:"1em",width:"1em",xmlns:"http://www.w3.org/2000/svg"},(0,d.tZ)("path",{d:"M12 4l-1.41 1.41L16.17 11H4v2h12.17l-5.58 5.59L12 20l8-8z"}))),(0,d.tZ)(z,null,(0,d.tZ)(P,null,"다음 포스트"),(0,d.tZ)("h3",null,a(n.nextPage,28)))))))}}}]); +//# sourceMappingURL=63a8ec3f-7c2f188a91c57aaabce4.js.map \ No newline at end of file diff --git a/63a8ec3f-7c2f188a91c57aaabce4.js.map b/63a8ec3f-7c2f188a91c57aaabce4.js.map new file mode 100644 index 0000000..943a103 --- /dev/null +++ b/63a8ec3f-7c2f188a91c57aaabce4.js.map @@ -0,0 +1 @@ +{"version":3,"file":"63a8ec3f-7c2f188a91c57aaabce4.js","mappings":"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","sources":["webpack://gatsby-starter-default/./src/components/Post/PostContent.tsx"],"sourcesContent":["import React, { FunctionComponent, useEffect, useState } from 'react'\nimport styled from '@emotion/styled'\nimport copy from 'copy-to-clipboard'\nimport { toast, ToastContainer, Flip } from 'react-toastify'\nimport { Link } from 'gatsby'\n\ntype PostContentProps = {\n html: string\n}\n\nconst MarkdownRenderer = styled.div`\n // Renderer Style\n display: flex;\n flex-direction: column;\n width: 768px;\n margin: 0 auto;\n padding: 10px 0;\n word-break: break-all;\n\n // Markdown Style\n line-height: 1.8;\n font-size: 16px;\n font-weight: 400;\n\n // Apply Padding Attribute to All Elements\n p {\n padding: 3px 0;\n }\n\n img {\n display: block;\n margin: 3rem auto;\n max-width: 100%;\n }\n\n // Adjust Heading Element Style\n h1,\n h2,\n h3 {\n font-weight: 800;\n margin-bottom: 30px;\n\n @media (max-width: 768px) {\n margin-bottom: 10px;\n }\n }\n\n * + h1,\n * + h2,\n * + h3 {\n margin-top: 80px;\n\n @media (max-width: 768px) {\n margin-top: 30px;\n }\n }\n\n hr + h1,\n hr + h2,\n hr + h3 {\n margin-top: 0;\n }\n\n h1 {\n font-size: 30px;\n }\n\n h2 {\n font-size: 25px;\n }\n\n h3 {\n font-size: 20px;\n }\n\n // Adjust Quotation Element Style\n blockquote {\n margin: 2rem 0px;\n border-left: 4px solid var(--velog);\n border-top-right-radius: 4px;\n border-bottom-right-radius: 4px;\n background: var(--bg-element2);\n padding: 1rem 1rem 1rem 2rem;\n color: var(--text1);\n }\n\n // Adjust List Element Style\n ol,\n ul {\n margin-left: 20px;\n padding: 30px 0;\n }\n\n // Adjust Horizontal Rule style\n hr {\n border: 1px solid var(--hr);\n margin: 100px 0;\n }\n\n // Adjust Link Element Style\n a {\n color: #4263eb;\n text-decoration: underline;\n }\n\n // Adjust Code Style\n pre[class*='language-'] {\n margin: 30px 0;\n padding: 15px;\n font-size: 15px;\n\n @media (max-width: 768px) {\n font-size: 0.75rem;\n margin: 20px 0;\n }\n\n ::-webkit-scrollbar-thumb {\n background: rgba(255, 255, 255, 0.5);\n border-radius: 3px;\n }\n }\n\n code[class*='language-'],\n pre[class*='language-'] {\n tab-size: 2;\n background: var(--prism-bg);\n color: var(--prism-default-text);\n }\n\n // Markdown Responsive Design\n @media (max-width: 768px) {\n width: 100%;\n padding: 80px 20px;\n line-height: 1.6;\n font-size: 14px;\n\n h1 {\n font-size: 23px;\n }\n\n h2 {\n font-size: 20px;\n }\n\n h3 {\n font-size: 17px;\n }\n\n img {\n width: 100%;\n }\n\n hr {\n margin: 50px 0;\n }\n }\n`\n\nconst TocWrapper = styled.div`\n position: absolute;\n right: calc((100vw - 728px) / 2 - 340px);\n width: 240px;\n overflow: hidden auto;\n padding: 0.25rem 0.75rem;\n line-height: 1.5;\n border-left: 2px solid var(--border4);\n color: var(--text3);\n max-height: calc(100vh - 128px);\n font-size: 0.875rem;\n\n @media (max-width: 1500px) {\n right: calc((100vw - 728px) / 2 - 280px);\n }\n\n @media (max-width: 1200px) {\n display: none;\n }\n\n a:hover {\n color: var(--text1);\n }\n\n div {\n display: block;\n transition: all 0.125s ease-in 0s;\n }\n\n .toc-level-1 {\n margin-left: 0;\n }\n .toc-level-2 {\n margin-top: 4px;\n margin-left: 12px;\n }\n .toc-level-3 {\n margin-top: 4px;\n margin-left: 24px;\n }\n`\n\nconst ShareWrap = styled.div`\n position: absolute;\n left: calc((100vw - 728px) / 2 - 140px);\n height: 150px;\n width: 64px;\n display: flex;\n\n @media (max-width: 1200px) {\n display: none;\n }\n`\n\nconst Share = styled.div`\n width: 4rem;\n background: var(--bg-element2);\n border: 1px solid var(--border4);\n border-radius: 2rem;\n padding: 0.5rem;\n display: flex;\n flex-direction: column;\n -webkit-box-align: center;\n align-items: center;\n`\n\nconst Heart = styled.div`\n height: 3rem;\n width: 3rem;\n display: flex;\n -webkit-box-align: center;\n align-items: center;\n -webkit-box-pack: center;\n justify-content: center;\n background: var(--bg-element1);\n border: 1px solid var(--border3);\n border-radius: 1.5rem;\n color: var(--text3);\n cursor: pointer;\n z-index: 5;\n :hover {\n border-color: var(--text1);\n color: var(--text1);\n }\n`\n\nconst Icon = styled.svg`\n width: 24px;\n height: 24px;\n`\n\nconst Like = styled.div`\n margin-top: 0.5rem;\n color: var(--text2);\n line-height: 1;\n font-size: 0.75rem;\n margin-bottom: 1rem;\n font-weight: bold;\n`\n\nconst ShareBtn = styled.div`\n height: 3rem;\n width: 3rem;\n display: flex;\n -webkit-box-align: center;\n align-items: center;\n -webkit-box-pack: center;\n justify-content: center;\n background: var(--bg-element1);\n border: 1px solid var(--border3);\n border-radius: 1.5rem;\n color: var(--text3);\n cursor: pointer;\n z-index: 5;\n :hover {\n border-color: var(--text1);\n color: var(--text1);\n }\n`\n\nconst ShareIcon = styled.svg`\n width: 24px;\n height: 24px;\n`\n\nconst PrevNextWrap = styled.div`\n margin-top: 3rem;\n margin-bottom: 5rem;\n display: flex;\n width: 768px;\n margin-left: auto;\n margin-right: auto;\n\n @media (max-width: 768px) {\n flex-direction: column-reverse;\n padding-left: 1rem;\n padding-right: 1rem;\n width: 100%;\n }\n`\n\nconst PrevGrid = styled.div`\n min-width: 0px;\n flex: 1 1 0%;\n\n @media (max-width: 768px) {\n margin-left: 0px;\n margin-bottom: 1.5rem;\n flex: initial;\n width: 100%;\n }\n`\nconst NextGrid = styled.div`\n min-width: 0px;\n flex: 1 1 0%;\n margin-left: 3rem;\n\n @media (max-width: 768px) {\n margin-left: 0px;\n margin-bottom: 1.5rem;\n flex: initial;\n width: 100%;\n }\n`\n\nconst Prev = styled.a`\n cursor: pointer;\n background: var(--bg-element2);\n box-shadow: rgba(0, 0, 0, 0.06) 0px 0px 4px 0px;\n width: 100%;\n padding-left: 1rem;\n padding-right: 1rem;\n height: 4rem;\n display: flex;\n -webkit-box-align: center;\n align-items: center;\n text-decoration: none;\n`\n\nconst Next = styled.a`\n cursor: pointer;\n background: var(--bg-element2);\n box-shadow: rgba(0, 0, 0, 0.06) 0px 0px 4px 0px;\n width: 100%;\n padding-left: 1rem;\n padding-right: 1rem;\n height: 4rem;\n display: flex;\n -webkit-box-align: center;\n align-items: center;\n text-decoration: none;\n flex-direction: row-reverse;\n`\n\nconst LeftDiv = styled.div`\n width: 32px;\n height: 32px;\n border-radius: 16px;\n display: flex;\n -webkit-box-align: center;\n align-items: center;\n -webkit-box-pack: center;\n justify-content: center;\n border: 1px solid var(--primary2);\n font-size: 1.5rem;\n color: var(--primary2);\n margin-left: 1rem;\n`\nconst RightDiv = styled.div`\n width: 32px;\n height: 32px;\n border-radius: 16px;\n display: flex;\n -webkit-box-align: center;\n align-items: center;\n -webkit-box-pack: center;\n justify-content: center;\n border: 1px solid var(--primary2);\n font-size: 1.5rem;\n color: var(--primary2);\n margin-right: 1rem;\n`\n\nconst LeftContentWrap = styled.div`\n flex: 1 1 0%;\n display: flex;\n flex-direction: column;\n align-items: flex-end;\n line-height: 1;\n min-width: 0px;\n`\nconst RightContentWrap = styled.div`\n flex: 1 1 0%;\n display: flex;\n flex-direction: column;\n align-items: flex-start;\n line-height: 1;\n min-width: 0px;\n`\n\nconst LeftDes = styled.div`\n font-size: 0.75rem;\n font-weight: bold;\n color: var(--text2);\n line-height: 2;\n display: block;\n`\n\nconst RightDes = styled.div`\n font-size: 0.75rem;\n font-weight: bold;\n color: var(--text2);\n display: block;\n line-height: 2;\n`\n\ntype TocProps = {\n headings: Array<{ id: string; text: string; level: number }>\n}\n\nconst PostContent: FunctionComponent = function ({ html }) {\n const [headings, setHeadings] = useState<\n Array<{ id: string; text: string; level: number }>\n >([])\n\n const [pageLinks, setPageLinks] = useState<{\n previousPage: string | null\n nextPage: string | null\n }>({\n previousPage: null,\n nextPage: null,\n })\n\n useEffect(() => {\n const headingElements = document.querySelectorAll(\n '.markdown-body h1, .markdown-body h2, .markdown-body h3',\n )\n const headings = Array.from(headingElements).map(headingElement => ({\n id: headingElement.getAttribute('id') || '',\n text: headingElement.textContent || '',\n level: Number(headingElement.tagName.charAt(1)),\n }))\n setHeadings(headings)\n }, [])\n\n useEffect(() => {\n const pathname = location.pathname\n const decodedValue = decodeURIComponent(pathname.replace(/^\\/+|\\/+$/g, ''))\n\n fetch(\n `https://port-0-minlog-be-dihik2mliwbygs1.sel4.cloudtype.app/api/view_count/${encodeURIComponent(\n decodedValue,\n )}`,\n {\n method: 'POST',\n },\n )\n .then(response => {\n if (response.ok) {\n console.log('조회수 업데이트 성공')\n } else {\n console.log('조회수 업데이트 실패')\n }\n })\n .catch(error => {\n console.log('조회수를 업데이트하는 중에 오류가 발생했습니다.:', error)\n })\n\n fetch(\n `https://port-0-minlog-be-dihik2mliwbygs1.sel4.cloudtype.app/api/get_page/${encodeURIComponent(\n decodedValue,\n )}`,\n {\n method: 'POST',\n },\n )\n .then(response => response.json())\n .then(data => {\n console.log('Data from localhost:8080/api/get_page/pathname:', data)\n\n setPageLinks({\n previousPage: data.previousPage,\n nextPage: data.nextPage,\n })\n })\n .catch(error => {\n console.log('페이지를 가져오는데 오류가 발생했습니다.:', error)\n })\n }, [])\n\n const truncateText = (text: string | any[], maxLength: number) => {\n return text.length > maxLength ? `${text.slice(0, maxLength)}...` : text\n }\n\n return (\n <>\n \n \n \n {!pageLinks.previousPage && }\n {!pageLinks.nextPage && }\n {pageLinks.previousPage && (\n \n \n \n \n \n \n \n \n 이전 포스트\n

{truncateText(pageLinks.previousPage, 28)}

\n
\n
\n
\n )}\n {pageLinks.nextPage && (\n \n \n \n \n \n \n \n \n 다음 포스트\n

{truncateText(pageLinks.nextPage, 28)}

\n
\n
\n
\n )}\n
\n \n )\n}\n\nconst Toc: FunctionComponent = ({ headings }) => {\n const [activeIndex, setActiveIndex] = useState(null)\n const [isFixed, setIsFixed] = useState(false)\n\n useEffect(() => {\n function handleScroll() {\n const scrollTop =\n document.documentElement.scrollTop || document.body.scrollTop\n\n const headingElements = document.querySelectorAll(\n '.markdown-body h1, .markdown-body h2, .markdown-body h3',\n )\n const headingOffsets = Array.from(headingElements).map(headingElement => {\n const elementTop =\n headingElement.getBoundingClientRect().top + scrollTop\n const headingId = headingElement.getAttribute('id') || ''\n return { top: elementTop, id: headingId }\n })\n\n const index = headingOffsets.findIndex(({ top }) => top > scrollTop + 80)\n if (index === -1) {\n setActiveIndex(headingOffsets.length - 1)\n } else if (index > 0) {\n setActiveIndex(index - 1)\n } else {\n setActiveIndex(null)\n }\n\n if (scrollTop > 240) {\n setIsFixed(true)\n } else {\n setIsFixed(false)\n }\n }\n\n window.addEventListener('scroll', handleScroll)\n handleScroll()\n\n return () => {\n window.removeEventListener('scroll', handleScroll)\n }\n }, [])\n\n const [isLoading, setIsLoading] = useState(true)\n const [likeCount, setLikeCount] = useState(0)\n const [likeStatus, setLikeStatus] = useState()\n\n useEffect(() => {\n const fetchLikeCount = async () => {\n try {\n const pathname = window.location.pathname\n const decodedValue = decodeURIComponent(\n pathname.replace(/^\\/+|\\/+$/g, ''),\n )\n const response = await fetch(\n `https://port-0-minlog-be-dihik2mliwbygs1.sel4.cloudtype.app/api/get_count/${encodeURIComponent(\n decodedValue,\n )}`,\n {\n method: 'POST',\n },\n )\n\n if (response.ok) {\n const data = await response.json()\n setLikeCount(data.like_count)\n setLikeStatus(data.liked)\n setIsLoading(false)\n console.log(data.liked)\n } else {\n throw new Error('네트워크 응답이 좋지 않았습니다.')\n }\n } catch (error) {\n console.log('조회수, 좋아요를 불러오는데 에러 발생:', error)\n }\n }\n\n fetchLikeCount()\n }, [])\n\n const copyToClipboard = () => {\n const url = window.location.href\n copy(url)\n toast.success('링크가 복사되었습니다.', {\n position: 'top-right',\n autoClose: 2000,\n hideProgressBar: false,\n closeOnClick: true,\n pauseOnHover: true,\n draggable: true,\n progress: undefined,\n theme: 'colored',\n transition: Flip,\n })\n }\n\n const handleClick = async () => {\n try {\n const pathname = window.location.pathname\n const decodedValue = decodeURIComponent(\n pathname.replace(/^\\/+|\\/+$/g, ''),\n )\n const response = await fetch(\n `https://port-0-minlog-be-dihik2mliwbygs1.sel4.cloudtype.app/api/like/${encodeURIComponent(\n decodedValue,\n )}`,\n {\n method: 'PUT',\n },\n )\n\n if (response.ok) {\n const data = await response.json()\n setLikeCount(data.like_count)\n setLikeStatus(data.liked)\n console.log(data.liked)\n } else {\n throw new Error('네트워크 응답이 좋지 않았습니다.')\n }\n } catch (error) {\n console.log('좋아요를 업데이트하는 동안 에러 발생:', error)\n }\n }\n\n return (\n <>\n \n \n {isLoading ? (\n \n ) : (\n \n \n \n \n \n )}\n {isLoading ?   : {likeCount}}\n \n \n \n \n \n \n \n \n \n {headings.map((heading, index) => (\n \n {heading.text}\n \n ))}\n \n \n )\n}\n\nexport default PostContent\n"],"names":["MarkdownRenderer","_styled","target","name","styles","TocWrapper","ShareWrap","Share","Heart","Icon","Like","ShareBtn","ShareIcon","PrevNextWrap","PrevGrid","NextGrid","Prev","Next","LeftDiv","RightDiv","LeftContentWrap","RightContentWrap","LeftDes","RightDes","Toc","_ref2","headings","activeIndex","setActiveIndex","useState","isFixed","setIsFixed","useEffect","handleScroll","scrollTop","document","documentElement","body","headingElements","querySelectorAll","headingOffsets","Array","from","map","headingElement","top","getBoundingClientRect","id","getAttribute","index","findIndex","_ref3","length","window","addEventListener","removeEventListener","isLoading","setIsLoading","likeCount","setLikeCount","likeStatus","setLikeStatus","async","pathname","location","decodedValue","decodeURIComponent","replace","response","fetch","encodeURIComponent","method","ok","Error","data","json","like_count","liked","console","log","error","fetchLikeCount","___EmotionJSX","React","style","position","onClick","backgroundColor","color","borderColor","fill","d","copyToClipboard","url","href","copy","toast","autoClose","hideProgressBar","closeOnClick","pauseOnHover","draggable","progress","undefined","theme","transition","Flip","ToastContainer","heading","key","className","level","transform","display","text","_ref","html","setHeadings","pageLinks","setPageLinks","previousPage","nextPage","textContent","Number","tagName","charAt","then","catch","truncateText","maxLength","slice","dangerouslySetInnerHTML","__html","stroke","viewBox","height","width","xmlns"],"sourceRoot":""} \ No newline at end of file diff --git a/63a8ec3f-93e1a0ad47f8b8b18696.js b/63a8ec3f-93e1a0ad47f8b8b18696.js new file mode 100644 index 0000000..e69c9c1 --- /dev/null +++ b/63a8ec3f-93e1a0ad47f8b8b18696.js @@ -0,0 +1,2 @@ +"use strict";(self.webpackChunkgatsby_starter_default=self.webpackChunkgatsby_starter_default||[]).push([[470],{9297:function(e,t,r){var o=r(4316),i=r(7294),n=r(640),l=r.n(n),a=r(6042),d=r(917);const s=(0,o.Z)("div",{target:"e1ijh0y119"})({name:"1zgj01",styles:"display:flex;flex-direction:column;width:768px;margin:0 auto;padding:10px 0;word-break:break-all;line-height:1.8;font-size:16px;font-weight:400;p{padding:3px 0;}img{display:block;margin:3rem auto;max-width:100%;}h1,h2,h3{font-weight:800;margin-bottom:30px;@media (max-width: 768px){margin-bottom:10px;}}*+h1,*+h2,*+h3{margin-top:80px;@media (max-width: 768px){margin-top:30px;}}hr+h1,hr+h2,hr+h3{margin-top:0;}h1{font-size:30px;}h2{font-size:25px;}h3{font-size:20px;}blockquote{margin:2rem 0px;border-left:4px solid var(--velog);border-top-right-radius:4px;border-bottom-right-radius:4px;background:var(--bg-element2);padding:1rem 1rem 1rem 2rem;color:var(--text1);}ol,ul{margin-left:20px;padding:30px 0;}hr{border:1px solid var(--hr);margin:100px 0;}a{color:#4263eb;text-decoration:underline;}pre[class*='language-']{margin:30px 0;padding:15px;font-size:15px;@media (max-width: 768px){font-size:0.75rem;margin:20px 0;}::-webkit-scrollbar-thumb{background:rgba(255, 255, 255, 0.5);border-radius:3px;}}code[class*='language-'],pre[class*='language-']{tab-size:2;background:var(--prism-bg);color:var(--prism-default-text);}@media (max-width: 768px){width:100%;padding:80px 20px;line-height:1.6;font-size:14px;h1{font-size:23px;}h2{font-size:20px;}h3{font-size:17px;}img{width:100%;}hr{margin:50px 0;}}"}),p=(0,o.Z)("div",{target:"e1ijh0y118"})({name:"o80hwm",styles:"position:absolute;right:calc((100vw - 728px) / 2 - 340px);width:240px;overflow:hidden auto;padding:0.25rem 0.75rem;line-height:1.5;border-left:2px solid var(--border4);color:var(--text3);max-height:calc(100vh - 128px);font-size:0.875rem;@media (max-width: 1500px){right:calc((100vw - 728px) / 2 - 280px);}@media (max-width: 1200px){display:none;}a:hover{color:var(--text1);}div{display:block;transition:all 0.125s ease-in 0s;}.toc-level-1{margin-left:0;}.toc-level-2{margin-top:4px;margin-left:12px;}.toc-level-3{margin-top:4px;margin-left:24px;}"}),m=(0,o.Z)("div",{target:"e1ijh0y117"})({name:"8glmej",styles:"position:absolute;left:calc((100vw - 728px) / 2 - 140px);height:150px;width:64px;display:flex;@media (max-width: 1200px){display:none;}"}),g=(0,o.Z)("div",{target:"e1ijh0y116"})({name:"yj0bj1",styles:"width:4rem;background:var(--bg-element2);border:1px solid var(--border4);border-radius:2rem;padding:0.5rem;display:flex;flex-direction:column;-webkit-box-align:center;align-items:center"}),c=(0,o.Z)("div",{target:"e1ijh0y115"})({name:"gj8xbn",styles:"height:3rem;width:3rem;display:flex;-webkit-box-align:center;align-items:center;-webkit-box-pack:center;justify-content:center;background:var(--bg-element1);border:1px solid var(--border3);border-radius:1.5rem;color:var(--text3);cursor:pointer;z-index:5;:hover{border-color:var(--text1);color:var(--text1);}"}),h=(0,o.Z)("svg",{target:"e1ijh0y114"})({name:"rrel8y",styles:"width:24px;height:24px"}),x=(0,o.Z)("div",{target:"e1ijh0y113"})({name:"7rttet",styles:"margin-top:0.5rem;color:var(--text2);line-height:1;font-size:0.75rem;margin-bottom:1rem;font-weight:bold"}),u=(0,o.Z)("div",{target:"e1ijh0y112"})({name:"gj8xbn",styles:"height:3rem;width:3rem;display:flex;-webkit-box-align:center;align-items:center;-webkit-box-pack:center;justify-content:center;background:var(--bg-element1);border:1px solid var(--border3);border-radius:1.5rem;color:var(--text3);cursor:pointer;z-index:5;:hover{border-color:var(--text1);color:var(--text1);}"}),b=(0,o.Z)("svg",{target:"e1ijh0y111"})({name:"rrel8y",styles:"width:24px;height:24px"}),w=(0,o.Z)("div",{target:"e1ijh0y110"})({name:"ajh738",styles:"margin-top:3rem;margin-bottom:5rem;display:flex;width:768px;margin-left:auto;margin-right:auto;@media (max-width: 768px){flex-direction:column-reverse;padding-left:1rem;padding-right:1rem;width:100%;}"}),f=(0,o.Z)("div",{target:"e1ijh0y19"})({name:"1upo4t4",styles:"min-width:0px;flex:1 1 0%;@media (max-width: 768px){margin-left:0px;margin-bottom:1.5rem;flex:initial;width:100%;}"}),y=(0,o.Z)("div",{target:"e1ijh0y18"})({name:"1rezqhk",styles:"min-width:0px;flex:1 1 0%;margin-left:3rem;@media (max-width: 768px){margin-left:0px;margin-bottom:1.5rem;flex:initial;width:100%;}"}),v=(0,o.Z)("a",{target:"e1ijh0y17"})({name:"ykchvm",styles:"cursor:pointer;background:var(--bg-element2);box-shadow:rgba(0, 0, 0, 0.06) 0px 0px 4px 0px;width:100%;padding-left:1rem;padding-right:1rem;height:4rem;display:flex;-webkit-box-align:center;align-items:center;text-decoration:none"}),k=(0,o.Z)("a",{target:"e1ijh0y16"})({name:"e608jc",styles:"cursor:pointer;background:var(--bg-element2);box-shadow:rgba(0, 0, 0, 0.06) 0px 0px 4px 0px;width:100%;padding-left:1rem;padding-right:1rem;height:4rem;display:flex;-webkit-box-align:center;align-items:center;text-decoration:none;flex-direction:row-reverse"}),Z=(0,o.Z)("div",{target:"e1ijh0y15"})({name:"1hatppn",styles:"width:32px;height:32px;border-radius:16px;display:flex;-webkit-box-align:center;align-items:center;-webkit-box-pack:center;justify-content:center;border:1px solid var(--primary2);font-size:1.5rem;color:var(--primary2);margin-left:1rem"}),j=(0,o.Z)("div",{target:"e1ijh0y14"})({name:"8vop5x",styles:"width:32px;height:32px;border-radius:16px;display:flex;-webkit-box-align:center;align-items:center;-webkit-box-pack:center;justify-content:center;border:1px solid var(--primary2);font-size:1.5rem;color:var(--primary2);margin-right:1rem"}),z=(0,o.Z)("div",{target:"e1ijh0y13"})({name:"tr1knb",styles:"flex:1 1 0%;display:flex;flex-direction:column;align-items:flex-end;line-height:1;min-width:0px"}),C=(0,o.Z)("div",{target:"e1ijh0y12"})({name:"3zpd1g",styles:"flex:1 1 0%;display:flex;flex-direction:column;align-items:flex-start;line-height:1;min-width:0px"}),P=(0,o.Z)("div",{target:"e1ijh0y11"})({name:"14j0lhw",styles:"font-size:0.75rem;font-weight:bold;color:var(--text2);line-height:2;display:block"}),S=(0,o.Z)("div",{target:"e1ijh0y10"})({name:"lvm6g4",styles:"font-size:0.75rem;font-weight:bold;color:var(--text2);display:block;line-height:2"}),_=e=>{let{headings:t}=e;const{0:r,1:o}=(0,i.useState)(null),{0:n,1:s}=(0,i.useState)(!1);(0,i.useEffect)((()=>{function e(){const e=document.documentElement.scrollTop||document.body.scrollTop,t=document.querySelectorAll(".markdown-body h1, .markdown-body h2, .markdown-body h3"),r=Array.from(t).map((t=>({top:t.getBoundingClientRect().top+e,id:t.getAttribute("id")||""}))),i=r.findIndex((t=>{let{top:r}=t;return r>e+80}));o(-1===i?r.length-1:i>0?i-1:null),s(e>240)}return window.addEventListener("scroll",e),e(),()=>{window.removeEventListener("scroll",e)}}),[]);const{0:w,1:f}=(0,i.useState)(!0),{0:y,1:v}=(0,i.useState)(0),{0:k,1:Z}=(0,i.useState)();(0,i.useEffect)((()=>{(async()=>{try{const e=window.location.pathname,t=decodeURIComponent(e.replace(/^\/+|\/+$/g,"")),r=await fetch("https://port-0-minlog-be-dihik2mliwbygs1.sel4.cloudtype.app/api/get_count/"+encodeURIComponent(t),{method:"POST"});if(!r.ok)throw new Error("네트워크 응답이 좋지 않았습니다.");{const e=await r.json();v(e.like_count),Z(e.liked),f(!1),console.log(e.liked)}}catch(e){console.log("조회수, 좋아요를 불러오는데 에러 발생:",e)}})()}),[]);return(0,d.tZ)(i.Fragment,null,(0,d.tZ)(m,{style:{position:n?"fixed":"absolute",top:n?"112px":"355px"}},(0,d.tZ)(g,null,w?(0,d.tZ)(c,null):(0,d.tZ)(c,{onClick:async()=>{try{const e=window.location.pathname,t=decodeURIComponent(e.replace(/^\/+|\/+$/g,"")),r=await fetch("https://port-0-minlog-be-dihik2mliwbygs1.sel4.cloudtype.app/api/like/"+encodeURIComponent(t),{method:"PUT"});if(!r.ok)throw new Error("네트워크 응답이 좋지 않았습니다.");{const e=await r.json();v(e.like_count),Z(e.liked),console.log(e.liked)}}catch(e){console.log("좋아요를 업데이트하는 동안 에러 발생:",e)}},style:{backgroundColor:k?"rgb(56, 217, 169)":"",color:k?"var(--button-text)":"",borderColor:k?"rgb(56, 217, 169)":""}},(0,d.tZ)(h,null,(0,d.tZ)("path",{fill:"currentColor",d:"M18 1l-6 4-6-4-6 5v7l12 10 12-10v-7z"}))),w?(0,d.tZ)(x,null," "):(0,d.tZ)(x,null,y),(0,d.tZ)(u,{onClick:()=>{const e=window.location.href;l()(e),a.Am.success("링크가 복사되었습니다.",{position:"top-right",autoClose:2e3,hideProgressBar:!1,closeOnClick:!0,pauseOnHover:!0,draggable:!0,progress:void 0,theme:"colored",transition:a.BW})}},(0,d.tZ)(b,null,(0,d.tZ)("path",{fill:"currentColor",d:"M5 7c2.761 0 5 2.239 5 5s-2.239 5-5 5-5-2.239-5-5 2.239-5 5-5zm11.122 12.065c-.073.301-.122.611-.122.935 0 2.209 1.791 4 4 4s4-1.791 4-4-1.791-4-4-4c-1.165 0-2.204.506-2.935 1.301l-5.488-2.927c-.23.636-.549 1.229-.943 1.764l5.488 2.927zm7.878-15.065c0-2.209-1.791-4-4-4s-4 1.791-4 4c0 .324.049.634.122.935l-5.488 2.927c.395.535.713 1.127.943 1.764l5.488-2.927c.731.795 1.77 1.301 2.935 1.301 2.209 0 4-1.791 4-4z"}))),(0,d.tZ)(a.Ix,null))),(0,d.tZ)(p,{style:{position:n?"fixed":"absolute",top:n?"112px":"355px"}},t.map(((e,t)=>(0,d.tZ)("div",{key:e.id,className:"toc-level-"+e.level,style:{...t===r&&{transform:"scale(1.05)",display:"block",transition:"all 0.125s ease-in 0s",color:"var(--text1)"}}},(0,d.tZ)("a",{href:"#"+e.id},e.text))))))};t.Z=function(e){let{html:t}=e;const{0:r,1:o}=(0,i.useState)([]),{0:n,1:l}=(0,i.useState)({previousPage:null,nextPage:null});(0,i.useEffect)((()=>{const e=document.querySelectorAll(".markdown-body h1, .markdown-body h2, .markdown-body h3"),t=Array.from(e).map((e=>({id:e.getAttribute("id")||"",text:e.textContent||"",level:Number(e.tagName.charAt(1))})));o(t)}),[]),(0,i.useEffect)((()=>{const e=location.pathname,t=decodeURIComponent(e.replace(/^\/+|\/+$/g,""));fetch("https://port-0-minlog-be-dihik2mliwbygs1.sel4.cloudtype.app/api/view_count/"+encodeURIComponent(t),{method:"POST"}).then((e=>{e.ok?console.log("조회수 업데이트 성공"):console.log("조회수 업데이트 실패")})).catch((e=>{console.log("조회수를 업데이트하는 중에 오류가 발생했습니다.:",e)})),fetch("https://port-0-minlog-be-dihik2mliwbygs1.sel4.cloudtype.app/api/get_page/"+encodeURIComponent(t),{method:"POST"}).then((e=>e.json())).then((e=>{console.log("Data from localhost:8080/api/get_page/pathname:",e),l({previousPage:e.previousPage,nextPage:e.nextPage})})).catch((e=>{console.log("페이지를 가져오는데 오류가 발생했습니다.:",e)}))}),[location]);const a=(e,t)=>e.length>t?e.slice(0,t)+"...":e;return(0,d.tZ)(i.Fragment,null,(0,d.tZ)(_,{headings:r}),(0,d.tZ)(s,{className:"markdown-body",dangerouslySetInnerHTML:{__html:t}}),(0,d.tZ)(w,null,!n.previousPage&&(0,d.tZ)(f,null),!n.nextPage&&(0,d.tZ)(y,null),n.previousPage&&(0,d.tZ)(f,null,(0,d.tZ)(v,{href:"/"+n.previousPage},(0,d.tZ)(j,null,(0,d.tZ)("svg",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",viewBox:"0 0 24 24",height:"1em",width:"1em",xmlns:"http://www.w3.org/2000/svg"},(0,d.tZ)("path",{d:"M20 11H7.83l5.59-5.59L12 4l-8 8 8 8 1.41-1.41L7.83 13H20v-2z"}))),(0,d.tZ)(C,null,(0,d.tZ)(S,null,"이전 포스트"),(0,d.tZ)("h3",null,a(n.previousPage,28))))),n.nextPage&&(0,d.tZ)(y,null,(0,d.tZ)(k,{href:"/"+n.nextPage},(0,d.tZ)(Z,null,(0,d.tZ)("svg",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",viewBox:"0 0 24 24",height:"1em",width:"1em",xmlns:"http://www.w3.org/2000/svg"},(0,d.tZ)("path",{d:"M12 4l-1.41 1.41L16.17 11H4v2h12.17l-5.58 5.59L12 20l8-8z"}))),(0,d.tZ)(z,null,(0,d.tZ)(P,null,"다음 포스트"),(0,d.tZ)("h3",null,a(n.nextPage,28)))))))}}}]); +//# sourceMappingURL=63a8ec3f-93e1a0ad47f8b8b18696.js.map \ No newline at end of file diff --git a/63a8ec3f-93e1a0ad47f8b8b18696.js.map b/63a8ec3f-93e1a0ad47f8b8b18696.js.map new file mode 100644 index 0000000..07ef5ba --- /dev/null +++ b/63a8ec3f-93e1a0ad47f8b8b18696.js.map @@ -0,0 +1 @@ +{"version":3,"file":"63a8ec3f-93e1a0ad47f8b8b18696.js","mappings":"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","sources":["webpack://gatsby-starter-default/./src/components/Post/PostContent.tsx"],"sourcesContent":["import React, { FunctionComponent, useEffect, useState } from 'react'\nimport styled from '@emotion/styled'\nimport copy from 'copy-to-clipboard'\nimport { toast, ToastContainer, Flip } from 'react-toastify'\nimport { Link } from 'gatsby'\n\ntype PostContentProps = {\n html: string\n}\n\nconst MarkdownRenderer = styled.div`\n // Renderer Style\n display: flex;\n flex-direction: column;\n width: 768px;\n margin: 0 auto;\n padding: 10px 0;\n word-break: break-all;\n\n // Markdown Style\n line-height: 1.8;\n font-size: 16px;\n font-weight: 400;\n\n // Apply Padding Attribute to All Elements\n p {\n padding: 3px 0;\n }\n\n img {\n display: block;\n margin: 3rem auto;\n max-width: 100%;\n }\n\n // Adjust Heading Element Style\n h1,\n h2,\n h3 {\n font-weight: 800;\n margin-bottom: 30px;\n\n @media (max-width: 768px) {\n margin-bottom: 10px;\n }\n }\n\n * + h1,\n * + h2,\n * + h3 {\n margin-top: 80px;\n\n @media (max-width: 768px) {\n margin-top: 30px;\n }\n }\n\n hr + h1,\n hr + h2,\n hr + h3 {\n margin-top: 0;\n }\n\n h1 {\n font-size: 30px;\n }\n\n h2 {\n font-size: 25px;\n }\n\n h3 {\n font-size: 20px;\n }\n\n // Adjust Quotation Element Style\n blockquote {\n margin: 2rem 0px;\n border-left: 4px solid var(--velog);\n border-top-right-radius: 4px;\n border-bottom-right-radius: 4px;\n background: var(--bg-element2);\n padding: 1rem 1rem 1rem 2rem;\n color: var(--text1);\n }\n\n // Adjust List Element Style\n ol,\n ul {\n margin-left: 20px;\n padding: 30px 0;\n }\n\n // Adjust Horizontal Rule style\n hr {\n border: 1px solid var(--hr);\n margin: 100px 0;\n }\n\n // Adjust Link Element Style\n a {\n color: #4263eb;\n text-decoration: underline;\n }\n\n // Adjust Code Style\n pre[class*='language-'] {\n margin: 30px 0;\n padding: 15px;\n font-size: 15px;\n\n @media (max-width: 768px) {\n font-size: 0.75rem;\n margin: 20px 0;\n }\n\n ::-webkit-scrollbar-thumb {\n background: rgba(255, 255, 255, 0.5);\n border-radius: 3px;\n }\n }\n\n code[class*='language-'],\n pre[class*='language-'] {\n tab-size: 2;\n background: var(--prism-bg);\n color: var(--prism-default-text);\n }\n\n // Markdown Responsive Design\n @media (max-width: 768px) {\n width: 100%;\n padding: 80px 20px;\n line-height: 1.6;\n font-size: 14px;\n\n h1 {\n font-size: 23px;\n }\n\n h2 {\n font-size: 20px;\n }\n\n h3 {\n font-size: 17px;\n }\n\n img {\n width: 100%;\n }\n\n hr {\n margin: 50px 0;\n }\n }\n`\n\nconst TocWrapper = styled.div`\n position: absolute;\n right: calc((100vw - 728px) / 2 - 340px);\n width: 240px;\n overflow: hidden auto;\n padding: 0.25rem 0.75rem;\n line-height: 1.5;\n border-left: 2px solid var(--border4);\n color: var(--text3);\n max-height: calc(100vh - 128px);\n font-size: 0.875rem;\n\n @media (max-width: 1500px) {\n right: calc((100vw - 728px) / 2 - 280px);\n }\n\n @media (max-width: 1200px) {\n display: none;\n }\n\n a:hover {\n color: var(--text1);\n }\n\n div {\n display: block;\n transition: all 0.125s ease-in 0s;\n }\n\n .toc-level-1 {\n margin-left: 0;\n }\n .toc-level-2 {\n margin-top: 4px;\n margin-left: 12px;\n }\n .toc-level-3 {\n margin-top: 4px;\n margin-left: 24px;\n }\n`\n\nconst ShareWrap = styled.div`\n position: absolute;\n left: calc((100vw - 728px) / 2 - 140px);\n height: 150px;\n width: 64px;\n display: flex;\n\n @media (max-width: 1200px) {\n display: none;\n }\n`\n\nconst Share = styled.div`\n width: 4rem;\n background: var(--bg-element2);\n border: 1px solid var(--border4);\n border-radius: 2rem;\n padding: 0.5rem;\n display: flex;\n flex-direction: column;\n -webkit-box-align: center;\n align-items: center;\n`\n\nconst Heart = styled.div`\n height: 3rem;\n width: 3rem;\n display: flex;\n -webkit-box-align: center;\n align-items: center;\n -webkit-box-pack: center;\n justify-content: center;\n background: var(--bg-element1);\n border: 1px solid var(--border3);\n border-radius: 1.5rem;\n color: var(--text3);\n cursor: pointer;\n z-index: 5;\n :hover {\n border-color: var(--text1);\n color: var(--text1);\n }\n`\n\nconst Icon = styled.svg`\n width: 24px;\n height: 24px;\n`\n\nconst Like = styled.div`\n margin-top: 0.5rem;\n color: var(--text2);\n line-height: 1;\n font-size: 0.75rem;\n margin-bottom: 1rem;\n font-weight: bold;\n`\n\nconst ShareBtn = styled.div`\n height: 3rem;\n width: 3rem;\n display: flex;\n -webkit-box-align: center;\n align-items: center;\n -webkit-box-pack: center;\n justify-content: center;\n background: var(--bg-element1);\n border: 1px solid var(--border3);\n border-radius: 1.5rem;\n color: var(--text3);\n cursor: pointer;\n z-index: 5;\n :hover {\n border-color: var(--text1);\n color: var(--text1);\n }\n`\n\nconst ShareIcon = styled.svg`\n width: 24px;\n height: 24px;\n`\n\nconst PrevNextWrap = styled.div`\n margin-top: 3rem;\n margin-bottom: 5rem;\n display: flex;\n width: 768px;\n margin-left: auto;\n margin-right: auto;\n\n @media (max-width: 768px) {\n flex-direction: column-reverse;\n padding-left: 1rem;\n padding-right: 1rem;\n width: 100%;\n }\n`\n\nconst PrevGrid = styled.div`\n min-width: 0px;\n flex: 1 1 0%;\n\n @media (max-width: 768px) {\n margin-left: 0px;\n margin-bottom: 1.5rem;\n flex: initial;\n width: 100%;\n }\n`\nconst NextGrid = styled.div`\n min-width: 0px;\n flex: 1 1 0%;\n margin-left: 3rem;\n\n @media (max-width: 768px) {\n margin-left: 0px;\n margin-bottom: 1.5rem;\n flex: initial;\n width: 100%;\n }\n`\n\nconst Prev = styled.a`\n cursor: pointer;\n background: var(--bg-element2);\n box-shadow: rgba(0, 0, 0, 0.06) 0px 0px 4px 0px;\n width: 100%;\n padding-left: 1rem;\n padding-right: 1rem;\n height: 4rem;\n display: flex;\n -webkit-box-align: center;\n align-items: center;\n text-decoration: none;\n`\n\nconst Next = styled.a`\n cursor: pointer;\n background: var(--bg-element2);\n box-shadow: rgba(0, 0, 0, 0.06) 0px 0px 4px 0px;\n width: 100%;\n padding-left: 1rem;\n padding-right: 1rem;\n height: 4rem;\n display: flex;\n -webkit-box-align: center;\n align-items: center;\n text-decoration: none;\n flex-direction: row-reverse;\n`\n\nconst LeftDiv = styled.div`\n width: 32px;\n height: 32px;\n border-radius: 16px;\n display: flex;\n -webkit-box-align: center;\n align-items: center;\n -webkit-box-pack: center;\n justify-content: center;\n border: 1px solid var(--primary2);\n font-size: 1.5rem;\n color: var(--primary2);\n margin-left: 1rem;\n`\nconst RightDiv = styled.div`\n width: 32px;\n height: 32px;\n border-radius: 16px;\n display: flex;\n -webkit-box-align: center;\n align-items: center;\n -webkit-box-pack: center;\n justify-content: center;\n border: 1px solid var(--primary2);\n font-size: 1.5rem;\n color: var(--primary2);\n margin-right: 1rem;\n`\n\nconst LeftContentWrap = styled.div`\n flex: 1 1 0%;\n display: flex;\n flex-direction: column;\n align-items: flex-end;\n line-height: 1;\n min-width: 0px;\n`\nconst RightContentWrap = styled.div`\n flex: 1 1 0%;\n display: flex;\n flex-direction: column;\n align-items: flex-start;\n line-height: 1;\n min-width: 0px;\n`\n\nconst LeftDes = styled.div`\n font-size: 0.75rem;\n font-weight: bold;\n color: var(--text2);\n line-height: 2;\n display: block;\n`\n\nconst RightDes = styled.div`\n font-size: 0.75rem;\n font-weight: bold;\n color: var(--text2);\n display: block;\n line-height: 2;\n`\n\ntype TocProps = {\n headings: Array<{ id: string; text: string; level: number }>\n}\n\nconst PostContent: FunctionComponent = function ({ html }) {\n const [headings, setHeadings] = useState<\n Array<{ id: string; text: string; level: number }>\n >([])\n\n const [pageLinks, setPageLinks] = useState<{\n previousPage: string | null\n nextPage: string | null\n }>({\n previousPage: null,\n nextPage: null,\n })\n\n useEffect(() => {\n const headingElements = document.querySelectorAll(\n '.markdown-body h1, .markdown-body h2, .markdown-body h3',\n )\n const headings = Array.from(headingElements).map(headingElement => ({\n id: headingElement.getAttribute('id') || '',\n text: headingElement.textContent || '',\n level: Number(headingElement.tagName.charAt(1)),\n }))\n setHeadings(headings)\n }, [])\n\n useEffect(() => {\n const pathname = location.pathname\n const decodedValue = decodeURIComponent(pathname.replace(/^\\/+|\\/+$/g, ''))\n\n fetch(\n `https://port-0-minlog-be-dihik2mliwbygs1.sel4.cloudtype.app/api/view_count/${encodeURIComponent(\n decodedValue,\n )}`,\n {\n method: 'POST',\n },\n )\n .then(response => {\n if (response.ok) {\n console.log('조회수 업데이트 성공')\n } else {\n console.log('조회수 업데이트 실패')\n }\n })\n .catch(error => {\n console.log('조회수를 업데이트하는 중에 오류가 발생했습니다.:', error)\n })\n\n fetch(\n `https://port-0-minlog-be-dihik2mliwbygs1.sel4.cloudtype.app/api/get_page/${encodeURIComponent(\n decodedValue,\n )}`,\n {\n method: 'POST',\n },\n )\n .then(response => response.json())\n .then(data => {\n console.log('Data from localhost:8080/api/get_page/pathname:', data)\n\n setPageLinks({\n previousPage: data.previousPage,\n nextPage: data.nextPage,\n })\n })\n .catch(error => {\n console.log('페이지를 가져오는데 오류가 발생했습니다.:', error)\n })\n }, [location])\n\n const truncateText = (text: string | any[], maxLength: number) => {\n return text.length > maxLength ? `${text.slice(0, maxLength)}...` : text\n }\n\n return (\n <>\n \n \n \n {!pageLinks.previousPage && }\n {!pageLinks.nextPage && }\n {pageLinks.previousPage && (\n \n \n \n \n \n \n \n \n 이전 포스트\n

{truncateText(pageLinks.previousPage, 28)}

\n
\n
\n
\n )}\n {pageLinks.nextPage && (\n \n \n \n \n \n \n \n \n 다음 포스트\n

{truncateText(pageLinks.nextPage, 28)}

\n
\n
\n
\n )}\n
\n \n )\n}\n\nconst Toc: FunctionComponent = ({ headings }) => {\n const [activeIndex, setActiveIndex] = useState(null)\n const [isFixed, setIsFixed] = useState(false)\n\n useEffect(() => {\n function handleScroll() {\n const scrollTop =\n document.documentElement.scrollTop || document.body.scrollTop\n\n const headingElements = document.querySelectorAll(\n '.markdown-body h1, .markdown-body h2, .markdown-body h3',\n )\n const headingOffsets = Array.from(headingElements).map(headingElement => {\n const elementTop =\n headingElement.getBoundingClientRect().top + scrollTop\n const headingId = headingElement.getAttribute('id') || ''\n return { top: elementTop, id: headingId }\n })\n\n const index = headingOffsets.findIndex(({ top }) => top > scrollTop + 80)\n if (index === -1) {\n setActiveIndex(headingOffsets.length - 1)\n } else if (index > 0) {\n setActiveIndex(index - 1)\n } else {\n setActiveIndex(null)\n }\n\n if (scrollTop > 240) {\n setIsFixed(true)\n } else {\n setIsFixed(false)\n }\n }\n\n window.addEventListener('scroll', handleScroll)\n handleScroll()\n\n return () => {\n window.removeEventListener('scroll', handleScroll)\n }\n }, [])\n\n const [isLoading, setIsLoading] = useState(true)\n const [likeCount, setLikeCount] = useState(0)\n const [likeStatus, setLikeStatus] = useState()\n\n useEffect(() => {\n const fetchLikeCount = async () => {\n try {\n const pathname = window.location.pathname\n const decodedValue = decodeURIComponent(\n pathname.replace(/^\\/+|\\/+$/g, ''),\n )\n const response = await fetch(\n `https://port-0-minlog-be-dihik2mliwbygs1.sel4.cloudtype.app/api/get_count/${encodeURIComponent(\n decodedValue,\n )}`,\n {\n method: 'POST',\n },\n )\n\n if (response.ok) {\n const data = await response.json()\n setLikeCount(data.like_count)\n setLikeStatus(data.liked)\n setIsLoading(false)\n console.log(data.liked)\n } else {\n throw new Error('네트워크 응답이 좋지 않았습니다.')\n }\n } catch (error) {\n console.log('조회수, 좋아요를 불러오는데 에러 발생:', error)\n }\n }\n\n fetchLikeCount()\n }, [])\n\n const copyToClipboard = () => {\n const url = window.location.href\n copy(url)\n toast.success('링크가 복사되었습니다.', {\n position: 'top-right',\n autoClose: 2000,\n hideProgressBar: false,\n closeOnClick: true,\n pauseOnHover: true,\n draggable: true,\n progress: undefined,\n theme: 'colored',\n transition: Flip,\n })\n }\n\n const handleClick = async () => {\n try {\n const pathname = window.location.pathname\n const decodedValue = decodeURIComponent(\n pathname.replace(/^\\/+|\\/+$/g, ''),\n )\n const response = await fetch(\n `https://port-0-minlog-be-dihik2mliwbygs1.sel4.cloudtype.app/api/like/${encodeURIComponent(\n decodedValue,\n )}`,\n {\n method: 'PUT',\n },\n )\n\n if (response.ok) {\n const data = await response.json()\n setLikeCount(data.like_count)\n setLikeStatus(data.liked)\n console.log(data.liked)\n } else {\n throw new Error('네트워크 응답이 좋지 않았습니다.')\n }\n } catch (error) {\n console.log('좋아요를 업데이트하는 동안 에러 발생:', error)\n }\n }\n\n return (\n <>\n \n \n {isLoading ? (\n \n ) : (\n \n \n \n \n \n )}\n {isLoading ?   : {likeCount}}\n \n \n \n \n \n \n \n \n \n {headings.map((heading, index) => (\n \n {heading.text}\n \n ))}\n \n \n )\n}\n\nexport default PostContent\n"],"names":["MarkdownRenderer","_styled","target","name","styles","TocWrapper","ShareWrap","Share","Heart","Icon","Like","ShareBtn","ShareIcon","PrevNextWrap","PrevGrid","NextGrid","Prev","Next","LeftDiv","RightDiv","LeftContentWrap","RightContentWrap","LeftDes","RightDes","Toc","_ref2","headings","activeIndex","setActiveIndex","useState","isFixed","setIsFixed","useEffect","handleScroll","scrollTop","document","documentElement","body","headingElements","querySelectorAll","headingOffsets","Array","from","map","headingElement","top","getBoundingClientRect","id","getAttribute","index","findIndex","_ref3","length","window","addEventListener","removeEventListener","isLoading","setIsLoading","likeCount","setLikeCount","likeStatus","setLikeStatus","async","pathname","location","decodedValue","decodeURIComponent","replace","response","fetch","encodeURIComponent","method","ok","Error","data","json","like_count","liked","console","log","error","fetchLikeCount","___EmotionJSX","React","style","position","onClick","backgroundColor","color","borderColor","fill","d","copyToClipboard","url","href","copy","toast","autoClose","hideProgressBar","closeOnClick","pauseOnHover","draggable","progress","undefined","theme","transition","Flip","ToastContainer","heading","key","className","level","transform","display","text","_ref","html","setHeadings","pageLinks","setPageLinks","previousPage","nextPage","textContent","Number","tagName","charAt","then","catch","truncateText","maxLength","slice","dangerouslySetInnerHTML","__html","stroke","viewBox","height","width","xmlns"],"sourceRoot":""} \ No newline at end of file diff --git a/8e5f29247fb400f66d09f337f68113b877142f92-d74f7497417ad3d42730.js b/8e5f29247fb400f66d09f337f68113b877142f92-d74f7497417ad3d42730.js new file mode 100644 index 0000000..10a75fa --- /dev/null +++ b/8e5f29247fb400f66d09f337f68113b877142f92-d74f7497417ad3d42730.js @@ -0,0 +1,2 @@ +"use strict";(self.webpackChunkgatsby_starter_default=self.webpackChunkgatsby_starter_default||[]).push([[679],{4316:function(e,t,n){n.d(t,{Z:function(){return y}});var r=n(7462),a=n(7294),i=n(5042),s=/^((children|dangerouslySetInnerHTML|key|ref|autoFocus|defaultValue|defaultChecked|innerHTML|suppressContentEditableWarning|suppressHydrationWarning|valueLink|abbr|accept|acceptCharset|accessKey|action|allow|allowUserMedia|allowPaymentRequest|allowFullScreen|allowTransparency|alt|async|autoComplete|autoPlay|capture|cellPadding|cellSpacing|challenge|charSet|checked|cite|classID|className|cols|colSpan|content|contentEditable|contextMenu|controls|controlsList|coords|crossOrigin|data|dateTime|decoding|default|defer|dir|disabled|disablePictureInPicture|download|draggable|encType|enterKeyHint|form|formAction|formEncType|formMethod|formNoValidate|formTarget|frameBorder|headers|height|hidden|high|href|hrefLang|htmlFor|httpEquiv|id|inputMode|integrity|is|keyParams|keyType|kind|label|lang|list|loading|loop|low|marginHeight|marginWidth|max|maxLength|media|mediaGroup|method|min|minLength|multiple|muted|name|nonce|noValidate|open|optimum|pattern|placeholder|playsInline|poster|preload|profile|radioGroup|readOnly|referrerPolicy|rel|required|reversed|role|rows|rowSpan|sandbox|scope|scoped|scrolling|seamless|selected|shape|size|sizes|slot|span|spellCheck|src|srcDoc|srcLang|srcSet|start|step|style|summary|tabIndex|target|title|translate|type|useMap|value|width|wmode|wrap|about|datatype|inlist|prefix|property|resource|typeof|vocab|autoCapitalize|autoCorrect|autoSave|color|incremental|fallback|inert|itemProp|itemScope|itemType|itemID|itemRef|on|option|results|security|unselectable|accentHeight|accumulate|additive|alignmentBaseline|allowReorder|alphabetic|amplitude|arabicForm|ascent|attributeName|attributeType|autoReverse|azimuth|baseFrequency|baselineShift|baseProfile|bbox|begin|bias|by|calcMode|capHeight|clip|clipPathUnits|clipPath|clipRule|colorInterpolation|colorInterpolationFilters|colorProfile|colorRendering|contentScriptType|contentStyleType|cursor|cx|cy|d|decelerate|descent|diffuseConstant|direction|display|divisor|dominantBaseline|dur|dx|dy|edgeMode|elevation|enableBackground|end|exponent|externalResourcesRequired|fill|fillOpacity|fillRule|filter|filterRes|filterUnits|floodColor|floodOpacity|focusable|fontFamily|fontSize|fontSizeAdjust|fontStretch|fontStyle|fontVariant|fontWeight|format|from|fr|fx|fy|g1|g2|glyphName|glyphOrientationHorizontal|glyphOrientationVertical|glyphRef|gradientTransform|gradientUnits|hanging|horizAdvX|horizOriginX|ideographic|imageRendering|in|in2|intercept|k|k1|k2|k3|k4|kernelMatrix|kernelUnitLength|kerning|keyPoints|keySplines|keyTimes|lengthAdjust|letterSpacing|lightingColor|limitingConeAngle|local|markerEnd|markerMid|markerStart|markerHeight|markerUnits|markerWidth|mask|maskContentUnits|maskUnits|mathematical|mode|numOctaves|offset|opacity|operator|order|orient|orientation|origin|overflow|overlinePosition|overlineThickness|panose1|paintOrder|pathLength|patternContentUnits|patternTransform|patternUnits|pointerEvents|points|pointsAtX|pointsAtY|pointsAtZ|preserveAlpha|preserveAspectRatio|primitiveUnits|r|radius|refX|refY|renderingIntent|repeatCount|repeatDur|requiredExtensions|requiredFeatures|restart|result|rotate|rx|ry|scale|seed|shapeRendering|slope|spacing|specularConstant|specularExponent|speed|spreadMethod|startOffset|stdDeviation|stemh|stemv|stitchTiles|stopColor|stopOpacity|strikethroughPosition|strikethroughThickness|string|stroke|strokeDasharray|strokeDashoffset|strokeLinecap|strokeLinejoin|strokeMiterlimit|strokeOpacity|strokeWidth|surfaceScale|systemLanguage|tableValues|targetX|targetY|textAnchor|textDecoration|textRendering|textLength|to|transform|u1|u2|underlinePosition|underlineThickness|unicode|unicodeBidi|unicodeRange|unitsPerEm|vAlphabetic|vHanging|vIdeographic|vMathematical|values|vectorEffect|version|vertAdvY|vertOriginX|vertOriginY|viewBox|viewTarget|visibility|widths|wordSpacing|writingMode|x|xHeight|x1|x2|xChannelSelector|xlinkActuate|xlinkArcrole|xlinkHref|xlinkRole|xlinkShow|xlinkTitle|xlinkType|xmlBase|xmlns|xmlnsXlink|xmlLang|xmlSpace|y|y1|y2|yChannelSelector|z|zoomAndPan|for|class|autofocus)|(([Dd][Aa][Tt][Aa]|[Aa][Rr][Ii][Aa]|x)-.*))$/,o=(0,i.Z)((function(e){return s.test(e)||111===e.charCodeAt(0)&&110===e.charCodeAt(1)&&e.charCodeAt(2)<91})),l=n(2443),u=n(444),c=n(9729),d=n(7278),h=o,p=function(e){return"theme"!==e},f=function(e){return"string"==typeof e&&e.charCodeAt(0)>96?h:p},m=function(e,t,n){var r;if(t){var a=t.shouldForwardProp;r=e.__emotion_forwardProp&&a?function(t){return e.__emotion_forwardProp(t)&&a(t)}:a}return"function"!=typeof r&&n&&(r=e.__emotion_forwardProp),r},g=function(e){var t=e.cache,n=e.serialized,r=e.isStringTag;(0,u.hC)(t,n,r);(0,d.L)((function(){return(0,u.My)(t,n,r)}));return null},y=function e(t,n){var i,s,o=t.__emotion_real===t,d=o&&t.__emotion_base||t;void 0!==n&&(i=n.label,s=n.target);var h=m(t,n,o),p=h||f(d),y=!p("as");return function(){var v=arguments,b=o&&void 0!==t.__emotion_styles?t.__emotion_styles.slice(0):[];if(void 0!==i&&b.push("label:"+i+";"),null==v[0]||void 0===v[0].raw)b.push.apply(b,v);else{0,b.push(v[0][0]);for(var w=v.length,_=1;_v(e,s),l=k();o.write=e=>v(e,l);var u=k();o.onStart=e=>v(e,u);var c=k();o.onFrame=e=>v(e,c);var d=k();o.onFinish=e=>v(e,d);var h=[];o.setTimeout=(e,t)=>{let n=o.now()+t,r=()=>{let e=h.findIndex((e=>e.cancel==r));~e&&h.splice(e,1),g-=~e?1:0},a={time:n,handler:e,cancel:r};return h.splice(p(n),0,a),g+=1,b(),a};var p=e=>~(~h.findIndex((t=>t.time>e))||~h.length);o.cancel=e=>{u.delete(e),c.delete(e),d.delete(e),s.delete(e),l.delete(e)},o.sync=e=>{y=!0,o.batchedUpdates(e),y=!1},o.throttle=e=>{let t;function n(){try{e(...t)}finally{t=null}}function r(...e){t=e,o.onStart(n)}return r.handler=e,r.cancel=()=>{u.delete(n),t=null},r};var f=typeof window<"u"?window.requestAnimationFrame:()=>{};o.use=e=>f=e,o.now=typeof performance<"u"?()=>performance.now():Date.now,o.batchedUpdates=e=>e(),o.catch=console.error,o.frameLoop="always",o.advance=()=>{"demand"!==o.frameLoop?console.warn("Cannot call the manual advancement of rafz whilst frameLoop is not set as demand"):_()};var m=-1,g=0,y=!1;function v(e,t){y?(t.delete(e),e(0)):(t.add(e),b())}function b(){m<0&&(m=0,"demand"!==o.frameLoop&&f(w))}function w(){~m&&(f(w),o.batchedUpdates(_))}function _(){let e=m;m=o.now();let t=p(m);t&&(x(h.splice(0,t),(e=>e.handler())),g-=t),g?(u.flush(),s.flush(e?Math.min(64,m-e):16.667),c.flush(),l.flush(),d.flush()):m=-1}function k(){let e=new Set,t=e;return{add(n){g+=t!=e||e.has(n)?0:1,e.add(n)},delete(n){return g-=t==e&&e.has(n)?1:0,e.delete(n)},flush(n){t.size&&(e=new Set,g-=t.size,x(t,(t=>t(n)&&e.add(t))),g+=e.size,t=e)}}}function x(e,t){e.forEach((e=>{try{t(e)}catch(n){o.catch(n)}}))}var C=Object.defineProperty,E={};function T(){}((e,t)=>{for(var n in t)C(e,n,{get:t[n],enumerable:!0})})(E,{assign:()=>F,colors:()=>V,createStringInterpolator:()=>R,skipAnimation:()=>q,to:()=>L,willAdvance:()=>j});var P={arr:Array.isArray,obj:e=>!!e&&"Object"===e.constructor.name,fun:e=>"function"==typeof e,str:e=>"string"==typeof e,num:e=>"number"==typeof e,und:e=>void 0===e};function I(e,t){if(P.arr(e)){if(!P.arr(t)||e.length!==t.length)return!1;for(let n=0;ne.forEach(t);function S(e,t,n){if(P.arr(e))for(let r=0;rP.und(e)?[]:P.arr(e)?e:[e];function A(e,t){if(e.size){let n=Array.from(e);e.clear(),M(n,t)}}var R,L,N=(e,...t)=>A(e,(e=>e(...t))),z=()=>typeof window>"u"||!window.navigator||/ServerSideRendering|^Deno\//.test(window.navigator.userAgent),V=null,q=!1,j=T,F=e=>{e.to&&(L=e.to),e.now&&(o.now=e.now),void 0!==e.colors&&(V=e.colors),null!=e.skipAnimation&&(q=e.skipAnimation),e.createStringInterpolator&&(R=e.createStringInterpolator),e.requestAnimationFrame&&o.use(e.requestAnimationFrame),e.batchedUpdates&&(o.batchedUpdates=e.batchedUpdates),e.willAdvance&&(j=e.willAdvance),e.frameLoop&&(o.frameLoop=e.frameLoop)},$=new Set,B=[],D=[],U=0,Q={get idle(){return!$.size&&!B.length},start(e){U>e.priority?($.add(e),o.onStart(Z)):(H(e),o(G))},advance:G,sort(e){if(U)o.onFrame((()=>Q.sort(e)));else{let t=B.indexOf(e);~t&&(B.splice(t,1),W(e))}},clear(){B=[],$.clear()}};function Z(){$.forEach(H),$.clear(),o(G)}function H(e){B.includes(e)||W(e)}function W(e){B.splice(function(e,t){let n=e.findIndex(t);return n<0?e.length:n}(B,(t=>t.priority>e.priority)),0,e)}function G(e){let t=D;for(let n=0;n0}var X="[-+]?\\d*\\.?\\d+",Y=X+"%";function K(...e){return"\\(\\s*("+e.join(")\\s*,\\s*(")+")\\s*\\)"}var J=new RegExp("rgb"+K(X,X,X)),ee=new RegExp("rgba"+K(X,X,X,X)),te=new RegExp("hsl"+K(X,Y,Y)),ne=new RegExp("hsla"+K(X,Y,Y,X)),re=/^#([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})$/,ae=/^#([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})$/,ie=/^#([0-9a-fA-F]{6})$/,se=/^#([0-9a-fA-F]{8})$/;function oe(e,t,n){return n<0&&(n+=1),n>1&&(n-=1),n<1/6?e+6*(t-e)*n:n<.5?t:n<2/3?e+(t-e)*(2/3-n)*6:e}function le(e,t,n){let r=n<.5?n*(1+t):n+t-n*t,a=2*n-r,i=oe(a,r,e+1/3),s=oe(a,r,e),o=oe(a,r,e-1/3);return Math.round(255*i)<<24|Math.round(255*s)<<16|Math.round(255*o)<<8}function ue(e){let t=parseInt(e,10);return t<0?0:t>255?255:t}function ce(e){return(parseFloat(e)%360+360)%360/360}function de(e){let t=parseFloat(e);return t<0?0:t>1?255:Math.round(255*t)}function he(e){let t=parseFloat(e);return t<0?0:t>100?1:t/100}function pe(e){let t=function(e){let t;return"number"==typeof e?e>>>0===e&&e>=0&&e<=4294967295?e:null:(t=ie.exec(e))?parseInt(t[1]+"ff",16)>>>0:V&&void 0!==V[e]?V[e]:(t=J.exec(e))?(ue(t[1])<<24|ue(t[2])<<16|ue(t[3])<<8|255)>>>0:(t=ee.exec(e))?(ue(t[1])<<24|ue(t[2])<<16|ue(t[3])<<8|de(t[4]))>>>0:(t=re.exec(e))?parseInt(t[1]+t[1]+t[2]+t[2]+t[3]+t[3]+"ff",16)>>>0:(t=se.exec(e))?parseInt(t[1],16)>>>0:(t=ae.exec(e))?parseInt(t[1]+t[1]+t[2]+t[2]+t[3]+t[3]+t[4]+t[4],16)>>>0:(t=te.exec(e))?(255|le(ce(t[1]),he(t[2]),he(t[3])))>>>0:(t=ne.exec(e))?(le(ce(t[1]),he(t[2]),he(t[3]))|de(t[4]))>>>0:null}(e);return null===t?e:(t=t||0,`rgba(${(4278190080&t)>>>24}, ${(16711680&t)>>>16}, ${(65280&t)>>>8}, ${(255&t)/255})`)}var fe=(e,t,n)=>{if(P.fun(e))return e;if(P.arr(e))return fe({range:e,output:t,extrapolate:n});if(P.str(e.output[0]))return R(e);let r=e,a=r.output,i=r.range||[0,1],s=r.extrapolateLeft||r.extrapolate||"extend",o=r.extrapolateRight||r.extrapolate||"extend",l=r.easing||(e=>e);return e=>{let t=function(e,t){for(var n=1;n=e);++n);return n-1}(e,i);return function(e,t,n,r,a,i,s,o,l){let u=l?l(e):e;if(un){if("identity"===o)return u;"clamp"===o&&(u=n)}return r===a?r:t===n?e<=t?r:a:(t===-1/0?u=-u:n===1/0?u-=t:u=(u-t)/(n-t),u=i(u),r===-1/0?u=-u:a===1/0?u+=r:u=u*(a-r)+r,u)}(e,i[t],i[t+1],a[t],a[t+1],l,s,o,r.map)}};var me=1.70158,ge=1.525*me,ye=me+1,ve=2*Math.PI/3,be=2*Math.PI/4.5,we=e=>e<1/2.75?7.5625*e*e:e<2/2.75?7.5625*(e-=1.5/2.75)*e+.75:e<2.5/2.75?7.5625*(e-=2.25/2.75)*e+.9375:7.5625*(e-=2.625/2.75)*e+.984375,_e={linear:e=>e,easeInQuad:e=>e*e,easeOutQuad:e=>1-(1-e)*(1-e),easeInOutQuad:e=>e<.5?2*e*e:1-Math.pow(-2*e+2,2)/2,easeInCubic:e=>e*e*e,easeOutCubic:e=>1-Math.pow(1-e,3),easeInOutCubic:e=>e<.5?4*e*e*e:1-Math.pow(-2*e+2,3)/2,easeInQuart:e=>e*e*e*e,easeOutQuart:e=>1-Math.pow(1-e,4),easeInOutQuart:e=>e<.5?8*e*e*e*e:1-Math.pow(-2*e+2,4)/2,easeInQuint:e=>e*e*e*e*e,easeOutQuint:e=>1-Math.pow(1-e,5),easeInOutQuint:e=>e<.5?16*e*e*e*e*e:1-Math.pow(-2*e+2,5)/2,easeInSine:e=>1-Math.cos(e*Math.PI/2),easeOutSine:e=>Math.sin(e*Math.PI/2),easeInOutSine:e=>-(Math.cos(Math.PI*e)-1)/2,easeInExpo:e=>0===e?0:Math.pow(2,10*e-10),easeOutExpo:e=>1===e?1:1-Math.pow(2,-10*e),easeInOutExpo:e=>0===e?0:1===e?1:e<.5?Math.pow(2,20*e-10)/2:(2-Math.pow(2,-20*e+10))/2,easeInCirc:e=>1-Math.sqrt(1-Math.pow(e,2)),easeOutCirc:e=>Math.sqrt(1-Math.pow(e-1,2)),easeInOutCirc:e=>e<.5?(1-Math.sqrt(1-Math.pow(2*e,2)))/2:(Math.sqrt(1-Math.pow(-2*e+2,2))+1)/2,easeInBack:e=>ye*e*e*e-me*e*e,easeOutBack:e=>1+ye*Math.pow(e-1,3)+me*Math.pow(e-1,2),easeInOutBack:e=>e<.5?Math.pow(2*e,2)*(2*(ge+1)*e-ge)/2:(Math.pow(2*e-2,2)*((ge+1)*(2*e-2)+ge)+2)/2,easeInElastic:e=>0===e?0:1===e?1:-Math.pow(2,10*e-10)*Math.sin((10*e-10.75)*ve),easeOutElastic:e=>0===e?0:1===e?1:Math.pow(2,-10*e)*Math.sin((10*e-.75)*ve)+1,easeInOutElastic:e=>0===e?0:1===e?1:e<.5?-Math.pow(2,20*e-10)*Math.sin((20*e-11.125)*be)/2:Math.pow(2,-20*e+10)*Math.sin((20*e-11.125)*be)/2+1,easeInBounce:e=>1-we(1-e),easeOutBounce:we,easeInOutBounce:e=>e<.5?(1-we(1-2*e))/2:(1+we(2*e-1))/2,steps:(e,t="end")=>n=>{let r=(n="end"===t?Math.min(n,.999):Math.max(n,.001))*e;return((e,t,n)=>Math.min(Math.max(n,e),t))(0,1,("end"===t?Math.floor(r):Math.ceil(r))/e)}},ke=Symbol.for("FluidValue.get"),xe=Symbol.for("FluidValue.observers"),Ce=e=>!(!e||!e[ke]),Ee=e=>e&&e[ke]?e[ke]():e,Te=e=>e[xe]||null;function Pe(e,t){let n=e[xe];n&&n.forEach((e=>{!function(e,t){e.eventObserved?e.eventObserved(t):e(t)}(e,t)}))}var Ie=class{[ke];[xe];constructor(e){if(!e&&!(e=this.get))throw Error("Unknown getter");Me(this,e)}},Me=(e,t)=>Re(e,ke,t);function Se(e,t){if(e[ke]){let n=e[xe];n||Re(e,xe,n=new Set),n.has(t)||(n.add(t),e.observerAdded&&e.observerAdded(n.size,t))}return t}function Oe(e,t){let n=e[xe];if(n&&n.has(t)){let r=n.size-1;r?n.delete(t):e[xe]=null,e.observerRemoved&&e.observerRemoved(r,t)}}var Ae,Re=(e,t,n)=>Object.defineProperty(e,t,{value:n,writable:!0,configurable:!0}),Le=/[+\-]?(?:0|[1-9]\d*)(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,Ne=/(#(?:[0-9a-f]{2}){2,4}|(#[0-9a-f]{3})|(rgb|hsl)a?\((-?\d+%?[,\s]+){2,3}\s*[\d\.]+%?\))/gi,ze=new RegExp(`(${Le.source})(%|[a-z]+)`,"i"),Ve=/rgba\(([0-9\.-]+), ([0-9\.-]+), ([0-9\.-]+), ([0-9\.-]+)\)/gi,qe=/var\((--[a-zA-Z0-9-_]+),? ?([a-zA-Z0-9 ()%#.,-]+)?\)/,je=e=>{let[t,n]=Fe(e);if(!t||z())return e;let r=window.getComputedStyle(document.documentElement).getPropertyValue(t);if(r)return r.trim();if(n&&n.startsWith("--")){return window.getComputedStyle(document.documentElement).getPropertyValue(n)||e}return n&&qe.test(n)?je(n):n||e},Fe=e=>{let t=qe.exec(e);if(!t)return[,];let[,n,r]=t;return[n,r]},$e=(e,t,n,r,a)=>`rgba(${Math.round(t)}, ${Math.round(n)}, ${Math.round(r)}, ${a})`,Be=e=>{Ae||(Ae=V?new RegExp(`(${Object.keys(V).join("|")})(?!\\w)`,"g"):/^\b$/);let t=e.output.map((e=>Ee(e).replace(qe,je).replace(Ne,pe).replace(Ae,pe))),n=t.map((e=>e.match(Le).map(Number))),r=n[0].map(((e,t)=>n.map((e=>{if(!(t in e))throw Error('The arity of each "output" value must be equal');return e[t]})))).map((t=>fe({...e,output:t})));return e=>{let n=!ze.test(t[0])&&t.find((e=>ze.test(e)))?.replace(Le,""),a=0;return t[0].replace(Le,(()=>`${r[a++](e)}${n||""}`)).replace(Ve,$e)}},De="react-spring: ",Ue=e=>{let t=e,n=!1;if("function"!=typeof t)throw new TypeError(`${De}once requires a function parameter`);return(...e)=>{n||(t(...e),n=!0)}},Qe=Ue(console.warn);var Ze=Ue(console.warn);function He(e){return P.str(e)&&("#"==e[0]||/\d/.test(e)||!z()&&qe.test(e)||e in(V||{}))}new WeakMap;new Set,new WeakMap,new WeakMap,new WeakMap;var We=z()?a.useEffect:a.useLayoutEffect,Ge=()=>{let e=(0,a.useRef)(!1);return We((()=>(e.current=!0,()=>{e.current=!1})),[]),e};function Xe(){let e=(0,a.useState)()[1],t=Ge();return()=>{t.current&&e(Math.random())}}var Ye=e=>(0,a.useEffect)(e,Ke),Ke=[];function Je(e){let t=(0,a.useRef)();return(0,a.useEffect)((()=>{t.current=e})),t.current}var et=Symbol.for("Animated:node"),tt=e=>e&&e[et],nt=(e,t)=>((e,t,n)=>Object.defineProperty(e,t,{value:n,writable:!0,configurable:!0}))(e,et,t),rt=e=>e&&e[et]&&e[et].getPayload(),at=class{payload;constructor(){nt(this,this)}getPayload(){return this.payload||[]}},it=class extends at{constructor(e){super(),this._value=e,P.num(this._value)&&(this.lastPosition=this._value)}done=!0;elapsedTime;lastPosition;lastVelocity;v0;durationProgress=0;static create(e){return new it(e)}getPayload(){return[this]}getValue(){return this._value}setValue(e,t){return P.num(e)&&(this.lastPosition=e,t&&(e=Math.round(e/t)*t,this.done&&(this.lastPosition=e))),this._value!==e&&(this._value=e,!0)}reset(){let{done:e}=this;this.done=!1,P.num(this._value)&&(this.elapsedTime=0,this.durationProgress=0,this.lastPosition=this._value,e&&(this.lastVelocity=null),this.v0=null)}},st=class extends it{_string=null;_toString;constructor(e){super(0),this._toString=fe({output:[e,e]})}static create(e){return new st(e)}getValue(){return this._string??(this._string=this._toString(this._value))}setValue(e){if(P.str(e)){if(e==this._string)return!1;this._string=e,this._value=1}else{if(!super.setValue(e))return!1;this._string=null}return!0}reset(e){e&&(this._toString=fe({output:[this.getValue(),e]})),this._value=0,super.reset()}},ot={dependencies:null},lt=class extends at{constructor(e){super(),this.source=e,this.setValue(e)}getValue(e){let t={};return S(this.source,((n,r)=>{var a;(a=n)&&a[et]===a?t[r]=n.getValue(e):Ce(n)?t[r]=Ee(n):e||(t[r]=n)})),t}setValue(e){this.source=e,this.payload=this._makePayload(e)}reset(){this.payload&&M(this.payload,(e=>e.reset()))}_makePayload(e){if(e){let t=new Set;return S(e,this._addToPayload,t),Array.from(t)}}_addToPayload(e){ot.dependencies&&Ce(e)&&ot.dependencies.add(e);let t=rt(e);t&&M(t,(e=>this.add(e)))}},ut=class extends lt{constructor(e){super(e)}static create(e){return new ut(e)}getValue(){return this.source.map((e=>e.getValue()))}setValue(e){let t=this.getPayload();return e.length==t.length?t.map(((t,n)=>t.setValue(e[n]))).some(Boolean):(super.setValue(e.map(ct)),!0)}};function ct(e){return(He(e)?st:it).create(e)}function dt(e){let t=tt(e);return t?t.constructor:P.arr(e)?ut:He(e)?st:it}var ht=(e,t)=>{let n=!P.fun(e)||e.prototype&&e.prototype.isReactComponent;return(0,a.forwardRef)(((r,i)=>{let s=(0,a.useRef)(null),l=n&&(0,a.useCallback)((e=>{s.current=function(e,t){return e&&(P.fun(e)?e(t):e.current=t),t}(i,e)}),[i]),[u,c]=function(e,t){let n=new Set;return ot.dependencies=n,e.style&&(e={...e,style:t.createAnimatedStyle(e.style)}),e=new lt(e),ot.dependencies=null,[e,n]}(r,t),d=Xe(),h=()=>{let e=s.current;n&&!e||!1===(!!e&&t.applyAnimatedValues(e,u.getValue(!0)))&&d()},p=new pt(h,c),f=(0,a.useRef)();We((()=>(f.current=p,M(c,(e=>Se(e,p))),()=>{f.current&&(M(f.current.deps,(e=>Oe(e,f.current))),o.cancel(f.current.update))}))),(0,a.useEffect)(h,[]),Ye((()=>()=>{let e=f.current;M(e.deps,(t=>Oe(t,e)))}));let m=t.getComponentProps(u.getValue());return a.createElement(e,{...m,ref:l})}))},pt=class{constructor(e,t){this.update=e,this.deps=t}eventObserved(e){"change"==e.type&&o.write(this.update)}};var ft=Symbol.for("AnimatedComponent"),mt=e=>P.str(e)?e:e&&P.str(e.displayName)?e.displayName:P.fun(e)&&e.name||null;function gt(e,...t){return P.fun(e)?e(...t):e}var yt=(e,t)=>!0===e||!!(t&&e&&(P.fun(e)?e(t):O(e).includes(t))),vt=(e,t)=>P.obj(e)?t&&e[t]:e,bt=(e,t)=>!0===e.default?e[t]:e.default?e.default[t]:void 0,wt=e=>e,_t=(e,t=wt)=>{let n=kt;e.default&&!0!==e.default&&(e=e.default,n=Object.keys(e));let r={};for(let a of n){let n=t(e[a],a);P.und(n)||(r[a]=n)}return r},kt=["config","onProps","onStart","onChange","onPause","onResume","onRest"],xt={config:1,from:1,to:1,ref:1,loop:1,reset:1,pause:1,cancel:1,reverse:1,immediate:1,default:1,delay:1,onProps:1,onStart:1,onChange:1,onPause:1,onResume:1,onRest:1,onResolve:1,items:1,trail:1,sort:1,expires:1,initial:1,enter:1,update:1,leave:1,children:1,onDestroyed:1,keys:1,callId:1,parentId:1};function Ct(e){let t=function(e){let t={},n=0;if(S(e,((e,r)=>{xt[r]||(t[r]=e,n++)})),n)return t}(e);if(t){let n={to:t};return S(e,((e,r)=>r in t||(n[r]=e))),n}return{...e}}function Et(e){return e=Ee(e),P.arr(e)?e.map(Et):He(e)?E.createStringInterpolator({range:[0,1],output:[e,e]})(1):e}function Tt(e){for(let t in e)return!0;return!1}function Pt(e){return P.fun(e)||P.arr(e)&&P.obj(e[0])}function It(e,t){e.ref?.delete(e),t?.delete(e)}function Mt(e,t){t&&e.ref!==t&&(e.ref?.delete(e),t.add(e),e.ref=t)}var St={tension:170,friction:26,mass:1,damping:1,easing:_e.linear,clamp:!1};function Ot(e,t){if(P.und(t.decay)){let n=!P.und(t.tension)||!P.und(t.friction);(n||!P.und(t.frequency)||!P.und(t.damping)||!P.und(t.mass))&&(e.duration=void 0,e.decay=void 0),n&&(e.frequency=void 0)}else e.duration=void 0}var At=[];function Rt(e,{key:t,props:n,defaultProps:r,state:a,actions:i}){return new Promise(((s,l)=>{let u,c,d=yt(n.cancel??r?.cancel,t);if(d)f();else{P.und(n.pause)||(a.paused=yt(n.pause,t));let e=r?.pause;!0!==e&&(e=a.paused||yt(e,t)),u=gt(n.delay||0,t),e?(a.resumeQueue.add(p),i.pause()):(i.resume(),p())}function h(){a.resumeQueue.add(p),a.timeouts.delete(c),c.cancel(),u=c.time-o.now()}function p(){u>0&&!E.skipAnimation?(a.delayed=!0,c=o.setTimeout(f,u),a.pauseQueue.add(h),a.timeouts.add(c)):f()}function f(){a.delayed&&(a.delayed=!1),a.pauseQueue.delete(h),a.timeouts.delete(c),e<=(a.cancelId||0)&&(d=!0);try{i.start({...n,callId:e,cancel:d},s)}catch(v){l(v)}}}))}var Lt=(e,t)=>1==t.length?t[0]:t.some((e=>e.cancelled))?Vt(e.get()):t.every((e=>e.noop))?Nt(e.get()):zt(e.get(),t.every((e=>e.finished))),Nt=e=>({value:e,noop:!0,finished:!0,cancelled:!1}),zt=(e,t,n=!1)=>({value:e,finished:t,cancelled:n}),Vt=e=>({value:e,cancelled:!0,finished:!1});function qt(e,t,n,r){let{callId:a,parentId:i,onRest:s}=t,{asyncTo:l,promise:u}=n;return i||e!==l||t.reset?n.promise=(async()=>{n.asyncId=a,n.asyncTo=e;let c,d,h,p=_t(t,((e,t)=>"onRest"===t?void 0:e)),f=new Promise(((e,t)=>(c=e,d=t))),g=e=>{let t=a<=(n.cancelId||0)&&Vt(r)||a!==n.asyncId&&zt(r,!1);if(t)throw e.result=t,d(e),e},y=(e,t)=>{let i=new Ft,s=new $t;return(async()=>{if(E.skipAnimation)throw jt(n),s.result=zt(r,!1),d(s),s;g(i);let o=P.obj(e)?{...e}:{...t,to:e};o.parentId=a,S(p,((e,t)=>{P.und(o[t])&&(o[t]=e)}));let l=await r.start(o);return g(i),n.paused&&await new Promise((e=>{n.resumeQueue.add(e)})),l})()};if(E.skipAnimation)return jt(n),zt(r,!1);try{let t;t=P.arr(e)?(async e=>{for(let t of e)await y(t)})(e):Promise.resolve(e(y,r.stop.bind(r))),await Promise.all([t.then(c),f]),h=zt(r.get(),!0,!1)}catch(m){if(m instanceof Ft)h=m.result;else{if(!(m instanceof $t))throw m;h=m.result}}finally{a==n.asyncId&&(n.asyncId=i,n.asyncTo=i?l:void 0,n.promise=i?u:void 0)}return P.fun(s)&&o.batchedUpdates((()=>{s(h,r,r.item)})),h})():u}function jt(e,t){A(e.timeouts,(e=>e.cancel())),e.pauseQueue.clear(),e.resumeQueue.clear(),e.asyncId=e.asyncTo=e.promise=void 0,t&&(e.cancelId=t)}var Ft=class extends Error{result;constructor(){super("An async animation has been interrupted. You see this error because you forgot to use `await` or `.catch(...)` on its returned promise.")}},$t=class extends Error{result;constructor(){super("SkipAnimationSignal")}},Bt=e=>e instanceof Ut,Dt=1,Ut=class extends Ie{id=Dt++;_priority=0;get priority(){return this._priority}set priority(e){this._priority!=e&&(this._priority=e,this._onPriorityChange(e))}get(){let e=tt(this);return e&&e.getValue()}to(...e){return E.to(this,e)}interpolate(...e){return Qe(`${De}The "interpolate" function is deprecated in v9 (use "to" instead)`),E.to(this,e)}toJSON(){return this.get()}observerAdded(e){1==e&&this._attach()}observerRemoved(e){0==e&&this._detach()}_attach(){}_detach(){}_onChange(e,t=!1){Pe(this,{type:"change",parent:this,value:e,idle:t})}_onPriorityChange(e){this.idle||Q.sort(this),Pe(this,{type:"priority",parent:this,priority:e})}},Qt=Symbol.for("SpringPhase"),Zt=e=>(1&e[Qt])>0,Ht=e=>(2&e[Qt])>0,Wt=e=>(4&e[Qt])>0,Gt=(e,t)=>t?e[Qt]|=3:e[Qt]&=-3,Xt=(e,t)=>t?e[Qt]|=4:e[Qt]&=-5,Yt=class extends Ut{key;animation=new class{changed=!1;values=At;toValues=null;fromValues=At;to;from;config=new class{tension;friction;frequency;damping;mass;velocity=0;restVelocity;precision;progress;duration;easing;clamp;bounce;decay;round;constructor(){Object.assign(this,St)}};immediate=!1};queue;defaultProps={};_state={paused:!1,delayed:!1,pauseQueue:new Set,resumeQueue:new Set,timeouts:new Set};_pendingCalls=new Set;_lastCallId=0;_lastToId=0;_memoizedDuration=0;constructor(e,t){if(super(),!P.und(e)||!P.und(t)){let n=P.obj(e)?{...e}:{...t,from:e};P.und(n.default)&&(n.default=!0),this.start(n)}}get idle(){return!(Ht(this)||this._state.asyncTo)||Wt(this)}get goal(){return Ee(this.animation.to)}get velocity(){let e=tt(this);return e instanceof it?e.lastVelocity||0:e.getPayload().map((e=>e.lastVelocity||0))}get hasAnimated(){return Zt(this)}get isAnimating(){return Ht(this)}get isPaused(){return Wt(this)}get isDelayed(){return this._state.delayed}advance(e){let t=!0,n=!1,r=this.animation,{toValues:a}=r,{config:i}=r,s=rt(r.to);!s&&Ce(r.to)&&(a=O(Ee(r.to))),r.values.forEach(((o,l)=>{if(o.done)return;let u=o.constructor==st?1:s?s[l].lastPosition:a[l],c=r.immediate,d=u;if(!c){if(d=o.lastPosition,i.tension<=0)return void(o.done=!0);let t,n=o.elapsedTime+=e,a=r.fromValues[l],s=null!=o.v0?o.v0:o.v0=P.arr(i.velocity)?i.velocity[l]:i.velocity,h=i.precision||(a==u?.005:Math.min(1,.001*Math.abs(u-a)));if(P.und(i.duration))if(i.decay){let e=!0===i.decay?.998:i.decay,r=Math.exp(-(1-e)*n);d=a+s/(1-e)*(1-r),c=Math.abs(o.lastPosition-d)<=h,t=s*r}else{t=null==o.lastVelocity?s:o.lastVelocity;let n,r=i.restVelocity||h/10,l=i.clamp?0:i.bounce,p=!P.und(l),f=a==u?o.v0>0:ar,n||(c=Math.abs(u-d)<=h,!c));++e){p&&(m=d==u||d>u==f,m&&(t=-t*l,d=u)),t+=(1e-6*-i.tension*(d-u)+.001*-i.friction*t)/i.mass*g,d+=t*g}}else{let r=1;i.duration>0&&(this._memoizedDuration!==i.duration&&(this._memoizedDuration=i.duration,o.durationProgress>0&&(o.elapsedTime=i.duration*o.durationProgress,n=o.elapsedTime+=e)),r=(i.progress||0)+n/this._memoizedDuration,r=r>1?1:r<0?0:r,o.durationProgress=r),d=a+i.easing(r)*(u-a),t=(d-o.lastPosition)/e,c=1==r}o.lastVelocity=t,Number.isNaN(d)&&(console.warn("Got NaN while animating:",this),c=!0)}s&&!s[l].done&&(c=!1),c?o.done=!0:t=!1,o.setValue(d,i.round)&&(n=!0)}));let o=tt(this),l=o.getValue();if(t){let e=Ee(r.to);l===e&&!n||i.decay?n&&i.decay&&this._onChange(l):(o.setValue(e),this._onChange(e)),this._stop()}else n&&this._onChange(l)}set(e){return o.batchedUpdates((()=>{this._stop(),this._focus(e),this._set(e)})),this}pause(){this._update({pause:!0})}resume(){this._update({pause:!1})}finish(){if(Ht(this)){let{to:e,config:t}=this.animation;o.batchedUpdates((()=>{this._onStart(),t.decay||this._set(e,!1),this._stop()}))}return this}update(e){return(this.queue||(this.queue=[])).push(e),this}start(e,t){let n;return P.und(e)?(n=this.queue||[],this.queue=[]):n=[P.obj(e)?e:{...t,to:e}],Promise.all(n.map((e=>this._update(e)))).then((e=>Lt(this,e)))}stop(e){let{to:t}=this.animation;return this._focus(this.get()),jt(this._state,e&&this._lastCallId),o.batchedUpdates((()=>this._stop(t,e))),this}reset(){this._update({reset:!0})}eventObserved(e){"change"==e.type?this._start():"priority"==e.type&&(this.priority=e.priority+1)}_prepareNode(e){let t=this.key||"",{to:n,from:r}=e;n=P.obj(n)?n[t]:n,(null==n||Pt(n))&&(n=void 0),r=P.obj(r)?r[t]:r,null==r&&(r=void 0);let a={to:n,from:r};return Zt(this)||(e.reverse&&([n,r]=[r,n]),r=Ee(r),P.und(r)?tt(this)||this._set(n):this._set(r)),a}_update({...e},t){let{key:n,defaultProps:r}=this;e.default&&Object.assign(r,_t(e,((e,t)=>/^on/.test(t)?vt(e,n):e))),an(this,e,"onProps"),sn(this,"onProps",e,this);let a=this._prepareNode(e);if(Object.isFrozen(this))throw Error("Cannot animate a `SpringValue` object that is frozen. Did you forget to pass your component to `animated(...)` before animating its props?");let i=this._state;return Rt(++this._lastCallId,{key:n,props:e,defaultProps:r,state:i,actions:{pause:()=>{Wt(this)||(Xt(this,!0),N(i.pauseQueue),sn(this,"onPause",zt(this,Kt(this,this.animation.to)),this))},resume:()=>{Wt(this)&&(Xt(this,!1),Ht(this)&&this._resume(),N(i.resumeQueue),sn(this,"onResume",zt(this,Kt(this,this.animation.to)),this))},start:this._merge.bind(this,a)}}).then((n=>{if(e.loop&&n.finished&&(!t||!n.noop)){let t=Jt(e);if(t)return this._update(t,!0)}return n}))}_merge(e,t,n){if(t.cancel)return this.stop(!0),n(Vt(this));let r=!P.und(e.to),a=!P.und(e.from);if(r||a){if(!(t.callId>this._lastToId))return n(Vt(this));this._lastToId=t.callId}let{key:i,defaultProps:s,animation:l}=this,{to:u,from:c}=l,{to:d=u,from:h=c}=e;a&&!r&&(!t.default||P.und(d))&&(d=h),t.reverse&&([d,h]=[h,d]);let p=!I(h,c);p&&(l.from=h),h=Ee(h);let f=!I(d,u);f&&this._focus(d);let m=Pt(t.to),{config:g}=l,{decay:y,velocity:v}=g;(r||a)&&(g.velocity=0),t.config&&!m&&function(e,t,n){n&&(Ot(n={...n},t),t={...n,...t}),Ot(e,t),Object.assign(e,t);for(let s in St)null==e[s]&&(e[s]=St[s]);let{frequency:r,damping:a}=e,{mass:i}=e;P.und(r)||(r<.01&&(r=.01),a<0&&(a=0),e.tension=Math.pow(2*Math.PI/r,2)*i,e.friction=4*Math.PI*a*i/r)}(g,gt(t.config,i),t.config!==s.config?gt(s.config,i):void 0);let b=tt(this);if(!b||P.und(d))return n(zt(this,!0));let w=P.und(t.reset)?a&&!t.default:!P.und(h)&&yt(t.reset,i),_=w?h:this.get(),k=Et(d),x=P.num(k)||P.arr(k)||He(k),C=!m&&(!x||yt(s.immediate||t.immediate,i));if(f){let e=dt(d);if(e!==b.constructor){if(!C)throw Error(`Cannot animate between ${b.constructor.name} and ${e.name}, as the "to" prop suggests`);b=this._set(k)}}let E=b.constructor,T=Ce(d),S=!1;if(!T){let e=w||!Zt(this)&&p;(f||e)&&(S=I(Et(_),k),T=!S),(!I(l.immediate,C)&&!C||!I(g.decay,y)||!I(g.velocity,v))&&(T=!0)}if(S&&Ht(this)&&(l.changed&&!w?T=!0:T||this._stop(u)),!m&&((T||Ce(u))&&(l.values=b.getPayload(),l.toValues=Ce(d)?null:E==st?[1]:O(k)),l.immediate!=C&&(l.immediate=C,!C&&!w&&this._set(u)),T)){let{onRest:e}=l;M(rn,(e=>an(this,t,e)));let r=zt(this,Kt(this,u));N(this._pendingCalls,r),this._pendingCalls.add(n),l.changed&&o.batchedUpdates((()=>{l.changed=!w,e?.(r,this),w?gt(s.onRest,r):l.onStart?.(r,this)}))}w&&this._set(_),m?n(qt(t.to,t,this._state,this)):T?this._start():Ht(this)&&!f?this._pendingCalls.add(n):n(Nt(_))}_focus(e){let t=this.animation;e!==t.to&&(Te(this)&&this._detach(),t.to=e,Te(this)&&this._attach())}_attach(){let e=0,{to:t}=this.animation;Ce(t)&&(Se(t,this),Bt(t)&&(e=t.priority+1)),this.priority=e}_detach(){let{to:e}=this.animation;Ce(e)&&Oe(e,this)}_set(e,t=!0){let n=Ee(e);if(!P.und(n)){let e=tt(this);if(!e||!I(n,e.getValue())){let r=dt(n);e&&e.constructor==r?e.setValue(n):nt(this,r.create(n)),e&&o.batchedUpdates((()=>{this._onChange(n,t)}))}}return tt(this)}_onStart(){let e=this.animation;e.changed||(e.changed=!0,sn(this,"onStart",zt(this,Kt(this,e.to)),this))}_onChange(e,t){t||(this._onStart(),gt(this.animation.onChange,e,this)),gt(this.defaultProps.onChange,e,this),super._onChange(e,t)}_start(){let e=this.animation;tt(this).reset(Ee(e.to)),e.immediate||(e.fromValues=e.values.map((e=>e.lastPosition))),Ht(this)||(Gt(this,!0),Wt(this)||this._resume())}_resume(){E.skipAnimation?this.finish():Q.start(this)}_stop(e,t){if(Ht(this)){Gt(this,!1);let n=this.animation;M(n.values,(e=>{e.done=!0})),n.toValues&&(n.onChange=n.onPause=n.onResume=void 0),Pe(this,{type:"idle",parent:this});let r=t?Vt(this.get()):zt(this.get(),Kt(this,e??n.to));N(this._pendingCalls,r),n.changed&&(n.changed=!1,sn(this,"onRest",r,this))}}};function Kt(e,t){let n=Et(t);return I(Et(e.get()),n)}function Jt(e,t=e.loop,n=e.to){let r=gt(t);if(r){let a=!0!==r&&Ct(r),i=(a||e).reverse,s=!a||a.reset;return en({...e,loop:t,default:!1,pause:void 0,to:!i||Pt(n)?n:void 0,from:s?e.from:void 0,reset:s,...a})}}function en(e){let{to:t,from:n}=e=Ct(e),r=new Set;return P.obj(t)&&nn(t,r),P.obj(n)&&nn(n,r),e.keys=r.size?Array.from(r):null,e}function tn(e){let t=en(e);return P.und(t.default)&&(t.default=_t(t)),t}function nn(e,t){S(e,((e,n)=>null!=e&&t.add(n)))}var rn=["onStart","onRest","onChange","onPause","onResume"];function an(e,t,n){e.animation[n]=t[n]!==bt(t,n)?vt(t[n],e.key):void 0}function sn(e,t,...n){e.animation[t]?.(...n),e.defaultProps[t]?.(...n)}var on=["onStart","onChange","onRest"],ln=1,un=class{id=ln++;springs={};queue=[];ref;_flush;_initialProps;_lastAsyncId=0;_active=new Set;_changed=new Set;_started=!1;_item;_state={paused:!1,pauseQueue:new Set,resumeQueue:new Set,timeouts:new Set};_events={onStart:new Map,onChange:new Map,onRest:new Map};constructor(e,t){this._onFrame=this._onFrame.bind(this),t&&(this._flush=t),e&&this.start({default:!0,...e})}get idle(){return!this._state.asyncTo&&Object.values(this.springs).every((e=>e.idle&&!e.isDelayed&&!e.isPaused))}get item(){return this._item}set item(e){this._item=e}get(){let e={};return this.each(((t,n)=>e[n]=t.get())),e}set(e){for(let t in e){let n=e[t];P.und(n)||this.springs[t].set(n)}}update(e){return e&&this.queue.push(en(e)),this}start(e){let{queue:t}=this;return e?t=O(e).map(en):this.queue=[],this._flush?this._flush(this,t):(gn(this,t),cn(this,t))}stop(e,t){if(e!==!!e&&(t=e),t){let n=this.springs;M(O(t),(t=>n[t].stop(!!e)))}else jt(this._state,this._lastAsyncId),this.each((t=>t.stop(!!e)));return this}pause(e){if(P.und(e))this.start({pause:!0});else{let t=this.springs;M(O(e),(e=>t[e].pause()))}return this}resume(e){if(P.und(e))this.start({pause:!1});else{let t=this.springs;M(O(e),(e=>t[e].resume()))}return this}each(e){S(this.springs,e)}_onFrame(){let{onStart:e,onChange:t,onRest:n}=this._events,r=this._active.size>0,a=this._changed.size>0;(r&&!this._started||a&&!this._started)&&(this._started=!0,A(e,(([e,t])=>{t.value=this.get(),e(t,this,this._item)})));let i=!r&&this._started,s=a||i&&n.size?this.get():null;a&&t.size&&A(t,(([e,t])=>{t.value=s,e(t,this,this._item)})),i&&(this._started=!1,A(n,(([e,t])=>{t.value=s,e(t,this,this._item)})))}eventObserved(e){if("change"==e.type)this._changed.add(e.parent),e.idle||this._active.add(e.parent);else{if("idle"!=e.type)return;this._active.delete(e.parent)}o.onFrame(this._onFrame)}};function cn(e,t){return Promise.all(t.map((t=>dn(e,t)))).then((t=>Lt(e,t)))}async function dn(e,t,n){let{keys:r,to:a,from:i,loop:s,onRest:l,onResolve:u}=t,c=P.obj(t.default)&&t.default;s&&(t.loop=!1),!1===a&&(t.to=null),!1===i&&(t.from=null);let d=P.arr(a)||P.fun(a)?a:void 0;d?(t.to=void 0,t.onRest=void 0,c&&(c.onRest=void 0)):M(on,(n=>{let r=t[n];if(P.fun(r)){let a=e._events[n];t[n]=({finished:e,cancelled:t})=>{let n=a.get(r);n?(e||(n.finished=!1),t&&(n.cancelled=!0)):a.set(r,{value:null,finished:e||!1,cancelled:t||!1})},c&&(c[n]=t[n])}}));let h=e._state;t.pause===!h.paused?(h.paused=t.pause,N(t.pause?h.pauseQueue:h.resumeQueue)):h.paused&&(t.pause=!0);let p=(r||Object.keys(e.springs)).map((n=>e.springs[n].start(t))),f=!0===t.cancel||!0===bt(t,"cancel");(d||f&&h.asyncId)&&p.push(Rt(++e._lastAsyncId,{props:t,state:h,actions:{pause:T,resume:T,start(t,n){f?(jt(h,e._lastAsyncId),n(Vt(e))):(t.onRest=l,n(qt(d,t,h,e)))}}})),h.paused&&await new Promise((e=>{h.resumeQueue.add(e)}));let m=Lt(e,await Promise.all(p));if(s&&m.finished&&(!n||!m.noop)){let n=Jt(t,s,a);if(n)return gn(e,[n]),dn(e,n,!0)}return u&&o.batchedUpdates((()=>u(m,e,e.item))),m}function hn(e,t){let n={...e.springs};return t&&M(O(t),(e=>{P.und(e.keys)&&(e=en(e)),P.obj(e.to)||(e={...e,to:void 0}),mn(n,e,(e=>fn(e)))})),pn(e,n),n}function pn(e,t){S(t,((t,n)=>{e.springs[n]||(e.springs[n]=t,Se(t,e))}))}function fn(e,t){let n=new Yt;return n.key=e,t&&Se(n,t),n}function mn(e,t,n){t.keys&&M(t.keys,(r=>{(e[r]||(e[r]=n(r)))._prepareNode(t)}))}function gn(e,t){M(t,(t=>{mn(e.springs,t,(t=>fn(t,e)))}))}var yn,vn,bn=({children:e,...t})=>{let n=(0,a.useContext)(wn),r=t.pause||!!n.pause,i=t.immediate||!!n.immediate;t=function(e,t){let[n]=(0,a.useState)((()=>({inputs:t,result:e()}))),r=(0,a.useRef)(),i=r.current,s=i;return s?t&&s.inputs&&function(e,t){if(e.length!==t.length)return!1;for(let n=0;n{r.current=s,i==n&&(n.inputs=n.result=void 0)}),[s]),s.result}((()=>({pause:r,immediate:i})),[r,i]);let{Provider:s}=wn;return a.createElement(s,{value:t},e)},wn=(yn=bn,vn={},Object.assign(yn,a.createContext(vn)),yn.Provider._context=yn,yn.Consumer._context=yn,yn);bn.Provider=wn.Provider,bn.Consumer=wn.Consumer;var _n=()=>{let e=[],t=function(t){Ze(`${De}Directly calling start instead of using the api object is deprecated in v9 (use ".start" instead), this will be removed in later 0.X.0 versions`);let r=[];return M(e,((e,a)=>{if(P.und(t))r.push(e.start());else{let i=n(t,e,a);i&&r.push(e.start(i))}})),r};t.current=e,t.add=function(t){e.includes(t)||e.push(t)},t.delete=function(t){let n=e.indexOf(t);~n&&e.splice(n,1)},t.pause=function(){return M(e,(e=>e.pause(...arguments))),this},t.resume=function(){return M(e,(e=>e.resume(...arguments))),this},t.set=function(t){M(e,((e,n)=>{let r=P.fun(t)?t(n,e):t;r&&e.set(r)}))},t.start=function(t){let n=[];return M(e,((e,r)=>{if(P.und(t))n.push(e.start());else{let a=this._getProps(t,e,r);a&&n.push(e.start(a))}})),n},t.stop=function(){return M(e,(e=>e.stop(...arguments))),this},t.update=function(t){return M(e,((e,n)=>e.update(this._getProps(t,e,n)))),this};let n=function(e,t,n){return P.fun(e)?e(n,t):e};return t._getProps=n,t};function kn(e,t,n){let r=P.fun(t)&&t;r&&!n&&(n=[]);let i=(0,a.useMemo)((()=>r||3==arguments.length?_n():void 0),[]),s=(0,a.useRef)(0),o=Xe(),l=(0,a.useMemo)((()=>({ctrls:[],queue:[],flush(e,t){let n=hn(e,t);return s.current>0&&!l.queue.length&&!Object.keys(n).some((t=>!e.springs[t]))?cn(e,t):new Promise((r=>{pn(e,n),l.queue.push((()=>{r(cn(e,t))})),o()}))}})),[]),u=(0,a.useRef)([...l.ctrls]),c=[],d=Je(e)||0;function h(e,n){for(let a=e;a{M(u.current.slice(e,d),(e=>{It(e,i),e.stop(!0)})),u.current.length=e,h(d,e)}),[e]),(0,a.useMemo)((()=>{h(0,Math.min(d,e))}),n);let p=u.current.map(((e,t)=>hn(e,c[t]))),f=(0,a.useContext)(bn),m=Je(f),g=f!==m&&Tt(f);We((()=>{s.current++,l.ctrls=u.current;let{queue:e}=l;e.length&&(l.queue=[],M(e,(e=>e()))),M(u.current,((e,t)=>{i?.add(e),g&&e.start({default:f});let n=c[t];n&&(Mt(e,n.ref),e.ref?e.queue.push(n):e.start(n))}))})),Ye((()=>()=>{M(l.ctrls,(e=>e.stop(!0)))}));let y=p.map((e=>({...e})));return i?[y,i]:y}function xn(e,t){let n=P.fun(e),[[r],a]=kn(1,n?e:[e],n?t||[]:t);return n||2==arguments.length?[r,a]:r}var Cn=class extends Ut{constructor(e,t){super(),this.source=e,this.calc=fe(...t);let n=this._get(),r=dt(n);nt(this,r.create(n))}key;idle=!0;calc;_active=new Set;advance(e){let t=this._get();I(t,this.get())||(tt(this).setValue(t),this._onChange(t,this.idle)),!this.idle&&Tn(this._active)&&Pn(this)}_get(){let e=P.arr(this.source)?this.source.map(Ee):O(Ee(this.source));return this.calc(...e)}_start(){this.idle&&!Tn(this._active)&&(this.idle=!1,M(rt(this),(e=>{e.done=!1})),E.skipAnimation?(o.batchedUpdates((()=>this.advance())),Pn(this)):Q.start(this))}_attach(){let e=1;M(O(this.source),(t=>{Ce(t)&&Se(t,this),Bt(t)&&(t.idle||this._active.add(t),e=Math.max(e,t.priority+1))})),this.priority=e,this._start()}_detach(){M(O(this.source),(e=>{Ce(e)&&Oe(e,this)})),this._active.clear(),Pn(this)}eventObserved(e){"change"==e.type?e.idle?this.advance():(this._active.add(e.parent),this._start()):"idle"==e.type?this._active.delete(e.parent):"priority"==e.type&&(this.priority=O(this.source).reduce(((e,t)=>Math.max(e,(Bt(t)?t.priority:0)+1)),0))}};function En(e){return!1!==e.idle}function Tn(e){return!e.size||Array.from(e).every(En)}function Pn(e){e.idle||(e.idle=!0,M(rt(e),(e=>{e.done=!0})),Pe(e,{type:"idle",parent:e}))}E.assign({createStringInterpolator:Be,to:(e,t)=>new Cn(e,t)});Q.advance;var In=n(3935),Mn=/^--/;function Sn(e,t){return null==t||"boolean"==typeof t||""===t?"":"number"!=typeof t||0===t||Mn.test(e)||An.hasOwnProperty(e)&&An[e]?(""+t).trim():t+"px"}var On={};var An={animationIterationCount:!0,borderImageOutset:!0,borderImageSlice:!0,borderImageWidth:!0,boxFlex:!0,boxFlexGroup:!0,boxOrdinalGroup:!0,columnCount:!0,columns:!0,flex:!0,flexGrow:!0,flexPositive:!0,flexShrink:!0,flexNegative:!0,flexOrder:!0,gridRow:!0,gridRowEnd:!0,gridRowSpan:!0,gridRowStart:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnSpan:!0,gridColumnStart:!0,fontWeight:!0,lineClamp:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,tabSize:!0,widows:!0,zIndex:!0,zoom:!0,fillOpacity:!0,floodOpacity:!0,stopOpacity:!0,strokeDasharray:!0,strokeDashoffset:!0,strokeMiterlimit:!0,strokeOpacity:!0,strokeWidth:!0},Rn=["Webkit","Ms","Moz","O"];An=Object.keys(An).reduce(((e,t)=>(Rn.forEach((n=>e[((e,t)=>e+t.charAt(0).toUpperCase()+t.substring(1))(n,t)]=e[t])),e)),An);var Ln=/^(matrix|translate|scale|rotate|skew)/,Nn=/^(translate)/,zn=/^(rotate|skew)/,Vn=(e,t)=>P.num(e)&&0!==e?e+t:e,qn=(e,t)=>P.arr(e)?e.every((e=>qn(e,t))):P.num(e)?e===t:parseFloat(e)===t,jn=class extends lt{constructor({x:e,y:t,z:n,...r}){let a=[],i=[];(e||t||n)&&(a.push([e||0,t||0,n||0]),i.push((e=>[`translate3d(${e.map((e=>Vn(e,"px"))).join(",")})`,qn(e,0)]))),S(r,((e,t)=>{if("transform"===t)a.push([e||""]),i.push((e=>[e,""===e]));else if(Ln.test(t)){if(delete r[t],P.und(e))return;let n=Nn.test(t)?"px":zn.test(t)?"deg":"";a.push(O(e)),i.push("rotate3d"===t?([e,t,r,a])=>[`rotate3d(${e},${t},${r},${Vn(a,n)})`,qn(a,0)]:e=>[`${t}(${e.map((e=>Vn(e,n))).join(",")})`,qn(e,t.startsWith("scale")?1:0)])}})),a.length&&(r.transform=new Fn(a,i)),super(r)}},Fn=class extends Ie{constructor(e,t){super(),this.inputs=e,this.transforms=t}_value=null;get(){return this._value||(this._value=this._get())}_get(){let e="",t=!0;return M(this.inputs,((n,r)=>{let a=Ee(n[0]),[i,s]=this.transforms[r](P.arr(a)?a:n.map(Ee));e+=" "+i,t=t&&s})),t?"none":e}observerAdded(e){1==e&&M(this.inputs,(e=>M(e,(e=>Ce(e)&&Se(e,this)))))}observerRemoved(e){0==e&&M(this.inputs,(e=>M(e,(e=>Ce(e)&&Oe(e,this)))))}eventObserved(e){"change"==e.type&&(this._value=null),Pe(this,e)}};E.assign({batchedUpdates:In.unstable_batchedUpdates,createStringInterpolator:Be,colors:{transparent:0,aliceblue:4042850303,antiquewhite:4209760255,aqua:16777215,aquamarine:2147472639,azure:4043309055,beige:4126530815,bisque:4293182719,black:255,blanchedalmond:4293643775,blue:65535,blueviolet:2318131967,brown:2771004159,burlywood:3736635391,burntsienna:3934150143,cadetblue:1604231423,chartreuse:2147418367,chocolate:3530104575,coral:4286533887,cornflowerblue:1687547391,cornsilk:4294499583,crimson:3692313855,cyan:16777215,darkblue:35839,darkcyan:9145343,darkgoldenrod:3095792639,darkgray:2846468607,darkgreen:6553855,darkgrey:2846468607,darkkhaki:3182914559,darkmagenta:2332068863,darkolivegreen:1433087999,darkorange:4287365375,darkorchid:2570243327,darkred:2332033279,darksalmon:3918953215,darkseagreen:2411499519,darkslateblue:1211993087,darkslategray:793726975,darkslategrey:793726975,darkturquoise:13554175,darkviolet:2483082239,deeppink:4279538687,deepskyblue:12582911,dimgray:1768516095,dimgrey:1768516095,dodgerblue:512819199,firebrick:2988581631,floralwhite:4294635775,forestgreen:579543807,fuchsia:4278255615,gainsboro:3705462015,ghostwhite:4177068031,gold:4292280575,goldenrod:3668254975,gray:2155905279,green:8388863,greenyellow:2919182335,grey:2155905279,honeydew:4043305215,hotpink:4285117695,indianred:3445382399,indigo:1258324735,ivory:4294963455,khaki:4041641215,lavender:3873897215,lavenderblush:4293981695,lawngreen:2096890111,lemonchiffon:4294626815,lightblue:2916673279,lightcoral:4034953471,lightcyan:3774873599,lightgoldenrodyellow:4210742015,lightgray:3553874943,lightgreen:2431553791,lightgrey:3553874943,lightpink:4290167295,lightsalmon:4288707327,lightseagreen:548580095,lightskyblue:2278488831,lightslategray:2005441023,lightslategrey:2005441023,lightsteelblue:2965692159,lightyellow:4294959359,lime:16711935,limegreen:852308735,linen:4210091775,magenta:4278255615,maroon:2147483903,mediumaquamarine:1724754687,mediumblue:52735,mediumorchid:3126187007,mediumpurple:2473647103,mediumseagreen:1018393087,mediumslateblue:2070474495,mediumspringgreen:16423679,mediumturquoise:1221709055,mediumvioletred:3340076543,midnightblue:421097727,mintcream:4127193855,mistyrose:4293190143,moccasin:4293178879,navajowhite:4292783615,navy:33023,oldlace:4260751103,olive:2155872511,olivedrab:1804477439,orange:4289003775,orangered:4282712319,orchid:3664828159,palegoldenrod:4008225535,palegreen:2566625535,paleturquoise:2951671551,palevioletred:3681588223,papayawhip:4293907967,peachpuff:4292524543,peru:3448061951,pink:4290825215,plum:3718307327,powderblue:2967529215,purple:2147516671,rebeccapurple:1714657791,red:4278190335,rosybrown:3163525119,royalblue:1097458175,saddlebrown:2336560127,salmon:4202722047,sandybrown:4104413439,seagreen:780883967,seashell:4294307583,sienna:2689740287,silver:3233857791,skyblue:2278484991,slateblue:1784335871,slategray:1887473919,slategrey:1887473919,snow:4294638335,springgreen:16744447,steelblue:1182971135,tan:3535047935,teal:8421631,thistle:3636451583,tomato:4284696575,turquoise:1088475391,violet:4001558271,wheat:4125012991,white:4294967295,whitesmoke:4126537215,yellow:4294902015,yellowgreen:2597139199}});var $n=((e,{applyAnimatedValues:t=(()=>!1),createAnimatedStyle:n=(e=>new lt(e)),getComponentProps:r=(e=>e)}={})=>{let a={applyAnimatedValues:t,createAnimatedStyle:n,getComponentProps:r},i=e=>{let t=mt(e)||"Anonymous";return(e=P.str(e)?i[e]||(i[e]=ht(e,a)):e[ft]||(e[ft]=ht(e,a))).displayName=`Animated(${t})`,e};return S(e,((t,n)=>{P.arr(e)&&(n=mt(t)),i[n]=i(t)})),{animated:i}})(["a","abbr","address","area","article","aside","audio","b","base","bdi","bdo","big","blockquote","body","br","button","canvas","caption","cite","code","col","colgroup","data","datalist","dd","del","details","dfn","dialog","div","dl","dt","em","embed","fieldset","figcaption","figure","footer","form","h1","h2","h3","h4","h5","h6","head","header","hgroup","hr","html","i","iframe","img","input","ins","kbd","keygen","label","legend","li","link","main","map","mark","menu","menuitem","meta","meter","nav","noscript","object","ol","optgroup","option","output","p","param","picture","pre","progress","q","rp","rt","ruby","s","samp","script","section","select","small","source","span","strong","style","sub","summary","sup","table","tbody","td","textarea","tfoot","th","thead","time","title","tr","track","u","ul","var","video","wbr","circle","clipPath","defs","ellipse","foreignObject","g","image","line","linearGradient","mask","path","pattern","polygon","polyline","radialGradient","rect","stop","svg","text","tspan"],{applyAnimatedValues:function(e,t){if(!e.nodeType||!e.setAttribute)return!1;let n="filter"===e.nodeName||e.parentNode&&"filter"===e.parentNode.nodeName,{style:r,children:a,scrollTop:i,scrollLeft:s,viewBox:o,...l}=t,u=Object.values(l),c=Object.keys(l).map((t=>n||e.hasAttribute(t)?t:On[t]||(On[t]=t.replace(/([A-Z])/g,(e=>"-"+e.toLowerCase())))));void 0!==a&&(e.textContent=a);for(let d in r)if(r.hasOwnProperty(d)){let t=Sn(d,r[d]);Mn.test(d)?e.style.setProperty(d,t):e.style[d]=t}c.forEach(((t,n)=>{e.setAttribute(t,u[n])})),void 0!==i&&(e.scrollTop=i),void 0!==s&&(e.scrollLeft=s),void 0!==o&&e.setAttribute("viewBox",o)},createAnimatedStyle:e=>new jn(e),getComponentProps:({scrollTop:e,scrollLeft:t,...n})=>n}),Bn=$n.animated;function Dn(){return Dn=Object.assign||function(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,["onChange","children","checked","size","animationProperties","moonColor","sunColor","style"]),m=(0,a.useState)(0),g=m[0],y=m[1];(0,a.useEffect)((function(){y(Qn+=1)}),[y]);var v=(0,a.useMemo)((function(){return l!==Un?Object.assign(Un,l):l}),[l])[r?"dark":"light"],b=v.circle,w=v.svg,_=v.lines,k=v.mask,x=xn(Dn({},w,{config:l.springConfig})),C=xn(Dn({},b,{config:l.springConfig})),E=xn(Dn({},k,{config:l.springConfig})),T=xn(Dn({},_,{config:l.springConfig})),P="circle-mask-"+g;return(0,a.createElement)(Bn.svg,Object.assign({xmlns:"http://www.w3.org/2000/svg",width:s,height:s,viewBox:"0 0 24 24",color:r?c:h,fill:"none",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round",stroke:"currentColor",onClick:function(){return t(!r)},style:Dn({cursor:"pointer"},x,p)},f),(0,a.createElement)("mask",{id:P},(0,a.createElement)("rect",{x:"0",y:"0",width:"100%",height:"100%",fill:"white"}),(0,a.createElement)(Bn.circle,{style:E,r:"9",fill:"black"})),(0,a.createElement)(Bn.circle,{cx:"12",cy:"12",fill:r?c:h,style:C,mask:"url(#"+P+")"}),(0,a.createElement)(Bn.g,{stroke:"currentColor",style:T},(0,a.createElement)("line",{x1:"12",y1:"1",x2:"12",y2:"3"}),(0,a.createElement)("line",{x1:"12",y1:"21",x2:"12",y2:"23"}),(0,a.createElement)("line",{x1:"4.22",y1:"4.22",x2:"5.64",y2:"5.64"}),(0,a.createElement)("line",{x1:"18.36",y1:"18.36",x2:"19.78",y2:"19.78"}),(0,a.createElement)("line",{x1:"1",y1:"12",x2:"3",y2:"12"}),(0,a.createElement)("line",{x1:"21",y1:"12",x2:"23",y2:"12"}),(0,a.createElement)("line",{x1:"4.22",y1:"19.78",x2:"5.64",y2:"18.36"}),(0,a.createElement)("line",{x1:"18.36",y1:"5.64",x2:"19.78",y2:"4.22"})))},Hn=n(4480),Wn=n(9899),Gn=n(917);const Xn=(0,r.Z)("div",{target:"e160b016"})({name:"zepct9",styles:"height:4rem;width:100%;display:flex;align-items:center;justify-content:center"}),Yn=(0,r.Z)("div",{target:"e160b015"})({name:"cwurok",styles:"width:100%;max-width:1728px;display:flex;justify-content:space-between;height:100%;align-items:center;@media (max-width: 1919px){max-width:1376px;}@media (max-width: 1440px){max-width:1024px;}@media (max-width: 1056px){max-width:calc(100% - 2rem);}"}),Kn=(0,r.Z)("a",{target:"e160b014"})({name:"1ploeh1",styles:"@import url('https://fonts.googleapis.com/css2?family=Fira+Mono&display=swap');{}font-family:'Fira Mono',monospace;font-weight:450;font-size:1.5rem"}),Jn=(0,r.Z)("div",{target:"e160b013"})({name:"ccejzk",styles:"width:auto;display:flex;align-items:center;height:100%;gap:15px;@media (max-width: 1056px){max-width:153px;gap:2px;}"}),er=(0,r.Z)("div",{target:"e160b012"})({name:"1mvtamq",styles:"display:flex;justify-content:center;align-items:center;width:2.5rem;height:2.5rem;border:none;outline:none;border-radius:50%;cursor:pointer;:hover{background-color:var(--darkhover);transition:all 0.125s ease-in 0s;}@media (max-width: 1056px){width:2.8rem;height:2rem;}"}),tr=(0,r.Z)("div",{target:"e160b011"})({name:"16cuq0l",styles:"display:flex;justify-content:center;align-items:center;width:2.5rem;height:2.5rem;border:none;outline:none;border-radius:50%;cursor:pointer;:hover{background-color:var(--darkhover);transition:all 0.125s ease-in 0s;}@media (max-width: 1056px){width:2rem;height:2rem;}"}),nr=(0,r.Z)("button",{target:"e160b010"})({name:"ic0n0a",styles:"padding-left:1rem;padding-right:1rem;height:2rem;font-size:1rem;border-radius:1rem;border:1px solid var(--bg-element5);color:var(--bg-element5);font-weight:600;outline:none;background-color:var(--bg-element2);cursor:pointer;:hover{background-color:black;transition:all 0.125s ease-in 0s;color:white;}"});var rr=function(e){let{}=e;const[t,n]=(0,i.F)(),[r,s]=a.useState(!0),o=e=>{s(e)},[l,u]=(0,Hn.FV)(Wn.XG);return a.useEffect((()=>{u("light"===t?"light":"dark")}),[t,u]),(0,Gn.tZ)(Xn,null,(0,Gn.tZ)(Yn,null,(0,Gn.tZ)(Kn,{href:"/"},"minlog"),(0,Gn.tZ)(Jn,null,(0,Gn.tZ)(er,{onClick:()=>{n("light"===t?"dark":"light"),o(!r)},role:"checkbox","aria-checked":"dark"===t,tabIndex:0},(0,Gn.tZ)(Zn,{checked:"dark"===t,onChange:o,size:25})),(0,Gn.tZ)("a",{href:"/search"},(0,Gn.tZ)(tr,null,(0,Gn.tZ)("svg",{width:"17",height:"17",viewBox:"0 0 17 17"},(0,Gn.tZ)("path",{"fill-rule":"evenodd",d:"M13.66 7.36a6.3 6.3 0 1 1-12.598 0 6.3 6.3 0 0 1 12.598 0zm-1.73 5.772a7.36 7.36 0 1 1 1.201-1.201l3.636 3.635c.31.31.31.815 0 1.126l-.075.075a.796.796 0 0 1-1.126 0l-3.636-3.635z","clip-rule":"evenodd",fill:"currentColor"})))),(0,Gn.tZ)("a",{href:"https://successful-star-405.notion.site/Lee-MinSeok-1812001504044d3f9b8a31b731823db5"},(0,Gn.tZ)(nr,null,"ABOUT")))))}},9899:function(e,t,n){n.d(t,{RJ:function(){return s},Uv:function(){return o},XG:function(){return l},p2:function(){return i},sq:function(){return a}});var r=n(4480);const a=(0,r.cn)({key:"selectedCategoryState",default:"All"}),i=(0,r.cn)({key:"categoryListState",default:{}}),s=(0,r.cn)({key:"categoryState",default:"close"}),o=(0,r.cn)({key:"activeTabState",default:"트렌딩"}),l=(0,r.cn)({key:"themeState",default:"light"})},6042:function(e,t,n){n.d(t,{BW:function(){return E},Ix:function(){return T},Am:function(){return z}});var r=n(7294);function a(e){var t,n,r="";if("string"==typeof e||"number"==typeof e)r+=e;else if("object"==typeof e)if(Array.isArray(e))for(t=0;t"number"==typeof e&&!isNaN(e),o=e=>"string"==typeof e,l=e=>"function"==typeof e,u=e=>o(e)||l(e)?e:null,c=e=>(0,r.isValidElement)(e)||o(e)||l(e)||s(e);function d(e){let{enter:t,exit:n,appendPosition:a=!1,collapse:i=!0,collapseDuration:s=300}=e;return function(e){let{children:o,position:l,preventExitTransition:u,done:c,nodeRef:d,isIn:h}=e;const p=a?`${t}--${l}`:t,f=a?`${n}--${l}`:n,m=(0,r.useRef)(0);return(0,r.useLayoutEffect)((()=>{const e=d.current,t=p.split(" "),n=r=>{r.target===d.current&&(e.dispatchEvent(new Event("d")),e.removeEventListener("animationend",n),e.removeEventListener("animationcancel",n),0===m.current&&"animationcancel"!==r.type&&e.classList.remove(...t))};e.classList.add(...t),e.addEventListener("animationend",n),e.addEventListener("animationcancel",n)}),[]),(0,r.useEffect)((()=>{const e=d.current,t=()=>{e.removeEventListener("animationend",t),i?function(e,t,n){void 0===n&&(n=300);const{scrollHeight:r,style:a}=e;requestAnimationFrame((()=>{a.minHeight="initial",a.height=r+"px",a.transition=`all ${n}ms`,requestAnimationFrame((()=>{a.height="0",a.padding="0",a.margin="0",setTimeout(t,n)}))}))}(e,c,s):c()};h||(u?t():(m.current=1,e.className+=` ${f}`,e.addEventListener("animationend",t)))}),[h]),r.createElement(r.Fragment,null,o)}}function h(e,t){return{content:e.content,containerId:e.props.containerId,id:e.props.toastId,theme:e.props.theme,type:e.props.type,data:e.props.data||{},isLoading:e.props.isLoading,icon:e.props.icon,status:t}}const p={list:new Map,emitQueue:new Map,on(e,t){return this.list.has(e)||this.list.set(e,[]),this.list.get(e).push(t),this},off(e,t){if(t){const n=this.list.get(e).filter((e=>e!==t));return this.list.set(e,n),this}return this.list.delete(e),this},cancelEmit(e){const t=this.emitQueue.get(e);return t&&(t.forEach(clearTimeout),this.emitQueue.delete(e)),this},emit(e){this.list.has(e)&&this.list.get(e).forEach((t=>{const n=setTimeout((()=>{t(...[].slice.call(arguments,1))}),0);this.emitQueue.has(e)||this.emitQueue.set(e,[]),this.emitQueue.get(e).push(n)}))}},f=e=>{let{theme:t,type:n,...a}=e;return r.createElement("svg",{viewBox:"0 0 24 24",width:"100%",height:"100%",fill:"colored"===t?"currentColor":`var(--toastify-icon-color-${n})`,...a})},m={info:function(e){return r.createElement(f,{...e},r.createElement("path",{d:"M12 0a12 12 0 1012 12A12.013 12.013 0 0012 0zm.25 5a1.5 1.5 0 11-1.5 1.5 1.5 1.5 0 011.5-1.5zm2.25 13.5h-4a1 1 0 010-2h.75a.25.25 0 00.25-.25v-4.5a.25.25 0 00-.25-.25h-.75a1 1 0 010-2h1a2 2 0 012 2v4.75a.25.25 0 00.25.25h.75a1 1 0 110 2z"}))},warning:function(e){return r.createElement(f,{...e},r.createElement("path",{d:"M23.32 17.191L15.438 2.184C14.728.833 13.416 0 11.996 0c-1.42 0-2.733.833-3.443 2.184L.533 17.448a4.744 4.744 0 000 4.368C1.243 23.167 2.555 24 3.975 24h16.05C22.22 24 24 22.044 24 19.632c0-.904-.251-1.746-.68-2.44zm-9.622 1.46c0 1.033-.724 1.823-1.698 1.823s-1.698-.79-1.698-1.822v-.043c0-1.028.724-1.822 1.698-1.822s1.698.79 1.698 1.822v.043zm.039-12.285l-.84 8.06c-.057.581-.408.943-.897.943-.49 0-.84-.367-.896-.942l-.84-8.065c-.057-.624.25-1.095.779-1.095h1.91c.528.005.84.476.784 1.1z"}))},success:function(e){return r.createElement(f,{...e},r.createElement("path",{d:"M12 0a12 12 0 1012 12A12.014 12.014 0 0012 0zm6.927 8.2l-6.845 9.289a1.011 1.011 0 01-1.43.188l-4.888-3.908a1 1 0 111.25-1.562l4.076 3.261 6.227-8.451a1 1 0 111.61 1.183z"}))},error:function(e){return r.createElement(f,{...e},r.createElement("path",{d:"M11.983 0a12.206 12.206 0 00-8.51 3.653A11.8 11.8 0 000 12.207 11.779 11.779 0 0011.8 24h.214A12.111 12.111 0 0024 11.791 11.766 11.766 0 0011.983 0zM10.5 16.542a1.476 1.476 0 011.449-1.53h.027a1.527 1.527 0 011.523 1.47 1.475 1.475 0 01-1.449 1.53h-.027a1.529 1.529 0 01-1.523-1.47zM11 12.5v-6a1 1 0 012 0v6a1 1 0 11-2 0z"}))},spinner:function(){return r.createElement("div",{className:"Toastify__spinner"})}};function g(e){const[,t]=(0,r.useReducer)((e=>e+1),0),[n,a]=(0,r.useState)([]),i=(0,r.useRef)(null),d=(0,r.useRef)(new Map).current,f=e=>-1!==n.indexOf(e),g=(0,r.useRef)({toastKey:1,displayedToast:0,count:0,queue:[],props:e,containerId:null,isToastActive:f,getToast:e=>d.get(e)}).current;function y(e){let{containerId:t}=e;const{limit:n}=g.props;!n||t&&g.containerId!==t||(g.count-=g.queue.length,g.queue=[])}function v(e){a((t=>null==e?[]:t.filter((t=>t!==e))))}function b(){const{toastContent:e,toastProps:t,staleId:n}=g.queue.shift();_(e,t,n)}function w(e,n){let{delay:a,staleId:f,...y}=n;if(!c(e)||function(e){return!i.current||g.props.enableMultiContainer&&e.containerId!==g.props.containerId||d.has(e.toastId)&&null==e.updateId}(y))return;const{toastId:w,updateId:k,data:x}=y,{props:C}=g,E=()=>v(w),T=null==k;T&&g.count++;const P={...C,style:C.toastStyle,key:g.toastKey++,...Object.fromEntries(Object.entries(y).filter((e=>{let[t,n]=e;return null!=n}))),toastId:w,updateId:k,data:x,closeToast:E,isIn:!1,className:u(y.className||C.toastClassName),bodyClassName:u(y.bodyClassName||C.bodyClassName),progressClassName:u(y.progressClassName||C.progressClassName),autoClose:!y.isLoading&&(I=y.autoClose,M=C.autoClose,!1===I||s(I)&&I>0?I:M),deleteToast(){const e=h(d.get(w),"removed");d.delete(w),p.emit(4,e);const n=g.queue.length;if(g.count=null==w?g.count-g.displayedToast:g.count-1,g.count<0&&(g.count=0),n>0){const e=null==w?g.props.limit:1;if(1===n||1===e)g.displayedToast++,b();else{const t=e>n?n:e;g.displayedToast=t;for(let e=0;ee in m)(n)&&(u=m[n](c))),u}(P),l(y.onOpen)&&(P.onOpen=y.onOpen),l(y.onClose)&&(P.onClose=y.onClose),P.closeButton=C.closeButton,!1===y.closeButton||c(y.closeButton)?P.closeButton=y.closeButton:!0===y.closeButton&&(P.closeButton=!c(C.closeButton)||C.closeButton);let S=e;(0,r.isValidElement)(e)&&!o(e.type)?S=(0,r.cloneElement)(e,{closeToast:E,toastProps:P,data:x}):l(e)&&(S=e({closeToast:E,toastProps:P,data:x})),C.limit&&C.limit>0&&g.count>C.limit&&T?g.queue.push({toastContent:S,toastProps:P,staleId:f}):s(a)?setTimeout((()=>{_(S,P,f)}),a):_(S,P,f)}function _(e,t,n){const{toastId:r}=t;n&&d.delete(n);const i={content:e,props:t};d.set(r,i),a((e=>[...e,r].filter((e=>e!==n)))),p.emit(4,h(i,null==i.props.updateId?"added":"updated"))}return(0,r.useEffect)((()=>(g.containerId=e.containerId,p.cancelEmit(3).on(0,w).on(1,(e=>i.current&&v(e))).on(5,y).emit(2,g),()=>{d.clear(),p.emit(3,g)})),[]),(0,r.useEffect)((()=>{g.props=e,g.isToastActive=f,g.displayedToast=n.length})),{getToastToRender:function(t){const n=new Map,r=Array.from(d.values());return e.newestOnTop&&r.reverse(),r.forEach((e=>{const{position:t}=e.props;n.has(t)||n.set(t,[]),n.get(t).push(e)})),Array.from(n,(e=>t(e[0],e[1])))},containerRef:i,isToastActive:f}}function y(e){return e.targetTouches&&e.targetTouches.length>=1?e.targetTouches[0].clientX:e.clientX}function v(e){return e.targetTouches&&e.targetTouches.length>=1?e.targetTouches[0].clientY:e.clientY}function b(e){const[t,n]=(0,r.useState)(!1),[a,i]=(0,r.useState)(!1),s=(0,r.useRef)(null),o=(0,r.useRef)({start:0,x:0,y:0,delta:0,removalDistance:0,canCloseOnClick:!0,canDrag:!1,boundingRect:null,didMove:!1}).current,u=(0,r.useRef)(e),{autoClose:c,pauseOnHover:d,closeToast:h,onClick:p,closeOnClick:f}=e;function m(t){if(e.draggable){"touchstart"===t.nativeEvent.type&&t.nativeEvent.preventDefault(),o.didMove=!1,document.addEventListener("mousemove",_),document.addEventListener("mouseup",k),document.addEventListener("touchmove",_),document.addEventListener("touchend",k);const n=s.current;o.canCloseOnClick=!0,o.canDrag=!0,o.boundingRect=n.getBoundingClientRect(),n.style.transition="",o.x=y(t.nativeEvent),o.y=v(t.nativeEvent),"x"===e.draggableDirection?(o.start=o.x,o.removalDistance=n.offsetWidth*(e.draggablePercent/100)):(o.start=o.y,o.removalDistance=n.offsetHeight*(80===e.draggablePercent?1.5*e.draggablePercent:e.draggablePercent/100))}}function g(t){if(o.boundingRect){const{top:n,bottom:r,left:a,right:i}=o.boundingRect;"touchend"!==t.nativeEvent.type&&e.pauseOnHover&&o.x>=a&&o.x<=i&&o.y>=n&&o.y<=r?w():b()}}function b(){n(!0)}function w(){n(!1)}function _(n){const r=s.current;o.canDrag&&r&&(o.didMove=!0,t&&w(),o.x=y(n),o.y=v(n),o.delta="x"===e.draggableDirection?o.x-o.start:o.y-o.start,o.start!==o.x&&(o.canCloseOnClick=!1),r.style.transform=`translate${e.draggableDirection}(${o.delta}px)`,r.style.opacity=""+(1-Math.abs(o.delta/o.removalDistance)))}function k(){document.removeEventListener("mousemove",_),document.removeEventListener("mouseup",k),document.removeEventListener("touchmove",_),document.removeEventListener("touchend",k);const t=s.current;if(o.canDrag&&o.didMove&&t){if(o.canDrag=!1,Math.abs(o.delta)>o.removalDistance)return i(!0),void e.closeToast();t.style.transition="transform 0.2s, opacity 0.2s",t.style.transform=`translate${e.draggableDirection}(0)`,t.style.opacity="1"}}(0,r.useEffect)((()=>{u.current=e})),(0,r.useEffect)((()=>(s.current&&s.current.addEventListener("d",b,{once:!0}),l(e.onOpen)&&e.onOpen((0,r.isValidElement)(e.children)&&e.children.props),()=>{const e=u.current;l(e.onClose)&&e.onClose((0,r.isValidElement)(e.children)&&e.children.props)})),[]),(0,r.useEffect)((()=>(e.pauseOnFocusLoss&&(document.hasFocus()||w(),window.addEventListener("focus",b),window.addEventListener("blur",w)),()=>{e.pauseOnFocusLoss&&(window.removeEventListener("focus",b),window.removeEventListener("blur",w))})),[e.pauseOnFocusLoss]);const x={onMouseDown:m,onTouchStart:m,onMouseUp:g,onTouchEnd:g};return c&&d&&(x.onMouseEnter=w,x.onMouseLeave=b),f&&(x.onClick=e=>{p&&p(e),o.canCloseOnClick&&h()}),{playToast:b,pauseToast:w,isRunning:t,preventExitTransition:a,toastRef:s,eventHandlers:x}}function w(e){let{closeToast:t,theme:n,ariaLabel:a="close"}=e;return r.createElement("button",{className:`Toastify__close-button Toastify__close-button--${n}`,type:"button",onClick:e=>{e.stopPropagation(),t(e)},"aria-label":a},r.createElement("svg",{"aria-hidden":"true",viewBox:"0 0 14 16"},r.createElement("path",{fillRule:"evenodd",d:"M7.71 8.23l3.75 3.75-1.48 1.48-3.75-3.75-3.75 3.75L1 11.98l3.75-3.75L1 4.48 2.48 3l3.75 3.75L9.98 3l1.48 1.48-3.75 3.75z"})))}function _(e){let{delay:t,isRunning:n,closeToast:a,type:s="default",hide:o,className:u,style:c,controlledProgress:d,progress:h,rtl:p,isIn:f,theme:m}=e;const g=o||d&&0===h,y={...c,animationDuration:`${t}ms`,animationPlayState:n?"running":"paused",opacity:g?0:1};d&&(y.transform=`scaleX(${h})`);const v=i("Toastify__progress-bar",d?"Toastify__progress-bar--controlled":"Toastify__progress-bar--animated",`Toastify__progress-bar-theme--${m}`,`Toastify__progress-bar--${s}`,{"Toastify__progress-bar--rtl":p}),b=l(u)?u({rtl:p,type:s,defaultClassName:v}):i(v,u);return r.createElement("div",{role:"progressbar","aria-hidden":g?"true":"false","aria-label":"notification timer",className:b,style:y,[d&&h>=1?"onTransitionEnd":"onAnimationEnd"]:d&&h<1?null:()=>{f&&a()}})}const k=e=>{const{isRunning:t,preventExitTransition:n,toastRef:a,eventHandlers:s}=b(e),{closeButton:o,children:u,autoClose:c,onClick:d,type:h,hideProgressBar:p,closeToast:f,transition:m,position:g,className:y,style:v,bodyClassName:k,bodyStyle:x,progressClassName:C,progressStyle:E,updateId:T,role:P,progress:I,rtl:M,toastId:S,deleteToast:O,isIn:A,isLoading:R,iconOut:L,closeOnClick:N,theme:z}=e,V=i("Toastify__toast",`Toastify__toast-theme--${z}`,`Toastify__toast--${h}`,{"Toastify__toast--rtl":M},{"Toastify__toast--close-on-click":N}),q=l(y)?y({rtl:M,position:g,type:h,defaultClassName:V}):i(V,y),j=!!I||!c,F={closeToast:f,type:h,theme:z};let $=null;return!1===o||($=l(o)?o(F):(0,r.isValidElement)(o)?(0,r.cloneElement)(o,F):w(F)),r.createElement(m,{isIn:A,done:O,position:g,preventExitTransition:n,nodeRef:a},r.createElement("div",{id:S,onClick:d,className:q,...s,style:v,ref:a},r.createElement("div",{...A&&{role:P},className:l(k)?k({type:h}):i("Toastify__toast-body",k),style:x},null!=L&&r.createElement("div",{className:i("Toastify__toast-icon",{"Toastify--animate-icon Toastify__zoom-enter":!R})},L),r.createElement("div",null,u)),$,r.createElement(_,{...T&&!j?{key:`pb-${T}`}:{},rtl:M,theme:z,delay:c,isRunning:t,isIn:A,closeToast:f,hide:p,type:h,style:E,className:C,controlledProgress:j,progress:I||0})))},x=function(e,t){return void 0===t&&(t=!1),{enter:`Toastify--animate Toastify__${e}-enter`,exit:`Toastify--animate Toastify__${e}-exit`,appendPosition:t}},C=d(x("bounce",!0)),E=(d(x("slide",!0)),d(x("zoom")),d(x("flip"))),T=(0,r.forwardRef)(((e,t)=>{const{getToastToRender:n,containerRef:a,isToastActive:s}=g(e),{className:o,style:c,rtl:d,containerId:h}=e;function p(e){const t=i("Toastify__toast-container",`Toastify__toast-container--${e}`,{"Toastify__toast-container--rtl":d});return l(o)?o({position:e,rtl:d,defaultClassName:t}):i(t,u(o))}return(0,r.useEffect)((()=>{t&&(t.current=a.current)}),[]),r.createElement("div",{ref:a,className:"Toastify",id:h},n(((e,t)=>{const n=t.length?{...c}:{...c,pointerEvents:"none"};return r.createElement("div",{className:p(e),style:n,key:`container-${e}`},t.map(((e,n)=>{let{content:a,props:i}=e;return r.createElement(k,{...i,isIn:s(i.toastId),style:{...i.style,"--nth":n+1,"--len":t.length},key:`toast-${i.key}`},a)})))})))}));T.displayName="ToastContainer",T.defaultProps={position:"top-right",transition:C,autoClose:5e3,closeButton:w,pauseOnHover:!0,pauseOnFocusLoss:!0,closeOnClick:!0,draggable:!0,draggablePercent:80,draggableDirection:"x",role:"alert",theme:"light"};let P,I=new Map,M=[],S=1;function O(){return""+S++}function A(e){return e&&(o(e.toastId)||s(e.toastId))?e.toastId:O()}function R(e,t){return I.size>0?p.emit(0,e,t):M.push({content:e,options:t}),t.toastId}function L(e,t){return{...t,type:t&&t.type||e,toastId:A(t)}}function N(e){return(t,n)=>R(t,L(e,n))}function z(e,t){return R(e,L("default",t))}z.loading=(e,t)=>R(e,L("default",{isLoading:!0,autoClose:!1,closeOnClick:!1,closeButton:!1,draggable:!1,...t})),z.promise=function(e,t,n){let r,{pending:a,error:i,success:s}=t;a&&(r=o(a)?z.loading(a,n):z.loading(a.render,{...n,...a}));const u={isLoading:null,autoClose:null,closeOnClick:null,closeButton:null,draggable:null},c=(e,t,a)=>{if(null==t)return void z.dismiss(r);const i={type:e,...u,...n,data:a},s=o(t)?{render:t}:t;return r?z.update(r,{...i,...s}):z(s.render,{...i,...s}),a},d=l(e)?e():e;return d.then((e=>c("success",s,e))).catch((e=>c("error",i,e))),d},z.success=N("success"),z.info=N("info"),z.error=N("error"),z.warning=N("warning"),z.warn=z.warning,z.dark=(e,t)=>R(e,L("default",{theme:"dark",...t})),z.dismiss=e=>{I.size>0?p.emit(1,e):M=M.filter((t=>null!=e&&t.options.toastId!==e))},z.clearWaitingQueue=function(e){return void 0===e&&(e={}),p.emit(5,e)},z.isActive=e=>{let t=!1;return I.forEach((n=>{n.isToastActive&&n.isToastActive(e)&&(t=!0)})),t},z.update=function(e,t){void 0===t&&(t={}),setTimeout((()=>{const n=function(e,t){let{containerId:n}=t;const r=I.get(n||P);return r&&r.getToast(e)}(e,t);if(n){const{props:r,content:a}=n,i={delay:100,...r,...t,toastId:t.toastId||e,updateId:O()};i.toastId!==e&&(i.staleId=e);const s=i.render||a;delete i.render,R(s,i)}}),0)},z.done=e=>{z.update(e,{progress:1})},z.onChange=e=>(p.on(4,e),()=>{p.off(4,e)}),z.POSITION={TOP_LEFT:"top-left",TOP_RIGHT:"top-right",TOP_CENTER:"top-center",BOTTOM_LEFT:"bottom-left",BOTTOM_RIGHT:"bottom-right",BOTTOM_CENTER:"bottom-center"},z.TYPE={INFO:"info",SUCCESS:"success",WARNING:"warning",ERROR:"error",DEFAULT:"default"},p.on(2,(e=>{P=e.containerId||e,I.set(P,e),M.forEach((e=>{p.emit(0,e.content,e.options)})),M=[]})).on(3,(e=>{I.delete(e.containerId||e),0===I.size&&p.off(0).off(1).off(5)}))}}]); +//# sourceMappingURL=8e5f29247fb400f66d09f337f68113b877142f92-d74f7497417ad3d42730.js.map \ No newline at end of file diff --git a/8e5f29247fb400f66d09f337f68113b877142f92-d74f7497417ad3d42730.js.map b/8e5f29247fb400f66d09f337f68113b877142f92-d74f7497417ad3d42730.js.map new file mode 100644 index 0000000..6fb3f45 --- /dev/null +++ b/8e5f29247fb400f66d09f337f68113b877142f92-d74f7497417ad3d42730.js.map @@ -0,0 +1 @@ +{"version":3,"file":"8e5f29247fb400f66d09f337f68113b877142f92-d74f7497417ad3d42730.js","mappings":"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","sources":["webpack://gatsby-starter-default/./node_modules/@emotion/is-prop-valid/dist/emotion-is-prop-valid.esm.js","webpack://gatsby-starter-default/./node_modules/@emotion/styled/base/dist/emotion-styled-base.browser.esm.js","webpack://gatsby-starter-default/./node_modules/@skagami/gatsby-plugin-dark-mode/index.js","webpack://gatsby-starter-default/./node_modules/@skagami/gatsby-plugin-dark-mode/theme-toggler.js","webpack://gatsby-starter-default/./src/components/Common/GlobalStyle.tsx","webpack://gatsby-starter-default/./node_modules/@react-spring/rafz/dist/esm/index.js","webpack://gatsby-starter-default/./node_modules/@react-spring/shared/dist/esm/index.js","webpack://gatsby-starter-default/./node_modules/@react-spring/animated/dist/esm/index.js","webpack://gatsby-starter-default/./node_modules/@react-spring/core/dist/esm/index.js","webpack://gatsby-starter-default/./node_modules/@react-spring/web/dist/esm/index.js","webpack://gatsby-starter-default/./node_modules/react-toggle-dark-mode/dist/react-toggle-dark-mode.esm.js","webpack://gatsby-starter-default/./src/components/Main/Introduction.tsx","webpack://gatsby-starter-default/./src/recoil/recoil.ts","webpack://gatsby-starter-default/./node_modules/clsx/dist/clsx.m.js","webpack://gatsby-starter-default/./node_modules/react-toastify/dist/react-toastify.esm.mjs"],"sourcesContent":["import memoize from '@emotion/memoize';\n\nvar reactPropsRegex = /^((children|dangerouslySetInnerHTML|key|ref|autoFocus|defaultValue|defaultChecked|innerHTML|suppressContentEditableWarning|suppressHydrationWarning|valueLink|abbr|accept|acceptCharset|accessKey|action|allow|allowUserMedia|allowPaymentRequest|allowFullScreen|allowTransparency|alt|async|autoComplete|autoPlay|capture|cellPadding|cellSpacing|challenge|charSet|checked|cite|classID|className|cols|colSpan|content|contentEditable|contextMenu|controls|controlsList|coords|crossOrigin|data|dateTime|decoding|default|defer|dir|disabled|disablePictureInPicture|download|draggable|encType|enterKeyHint|form|formAction|formEncType|formMethod|formNoValidate|formTarget|frameBorder|headers|height|hidden|high|href|hrefLang|htmlFor|httpEquiv|id|inputMode|integrity|is|keyParams|keyType|kind|label|lang|list|loading|loop|low|marginHeight|marginWidth|max|maxLength|media|mediaGroup|method|min|minLength|multiple|muted|name|nonce|noValidate|open|optimum|pattern|placeholder|playsInline|poster|preload|profile|radioGroup|readOnly|referrerPolicy|rel|required|reversed|role|rows|rowSpan|sandbox|scope|scoped|scrolling|seamless|selected|shape|size|sizes|slot|span|spellCheck|src|srcDoc|srcLang|srcSet|start|step|style|summary|tabIndex|target|title|translate|type|useMap|value|width|wmode|wrap|about|datatype|inlist|prefix|property|resource|typeof|vocab|autoCapitalize|autoCorrect|autoSave|color|incremental|fallback|inert|itemProp|itemScope|itemType|itemID|itemRef|on|option|results|security|unselectable|accentHeight|accumulate|additive|alignmentBaseline|allowReorder|alphabetic|amplitude|arabicForm|ascent|attributeName|attributeType|autoReverse|azimuth|baseFrequency|baselineShift|baseProfile|bbox|begin|bias|by|calcMode|capHeight|clip|clipPathUnits|clipPath|clipRule|colorInterpolation|colorInterpolationFilters|colorProfile|colorRendering|contentScriptType|contentStyleType|cursor|cx|cy|d|decelerate|descent|diffuseConstant|direction|display|divisor|dominantBaseline|dur|dx|dy|edgeMode|elevation|enableBackground|end|exponent|externalResourcesRequired|fill|fillOpacity|fillRule|filter|filterRes|filterUnits|floodColor|floodOpacity|focusable|fontFamily|fontSize|fontSizeAdjust|fontStretch|fontStyle|fontVariant|fontWeight|format|from|fr|fx|fy|g1|g2|glyphName|glyphOrientationHorizontal|glyphOrientationVertical|glyphRef|gradientTransform|gradientUnits|hanging|horizAdvX|horizOriginX|ideographic|imageRendering|in|in2|intercept|k|k1|k2|k3|k4|kernelMatrix|kernelUnitLength|kerning|keyPoints|keySplines|keyTimes|lengthAdjust|letterSpacing|lightingColor|limitingConeAngle|local|markerEnd|markerMid|markerStart|markerHeight|markerUnits|markerWidth|mask|maskContentUnits|maskUnits|mathematical|mode|numOctaves|offset|opacity|operator|order|orient|orientation|origin|overflow|overlinePosition|overlineThickness|panose1|paintOrder|pathLength|patternContentUnits|patternTransform|patternUnits|pointerEvents|points|pointsAtX|pointsAtY|pointsAtZ|preserveAlpha|preserveAspectRatio|primitiveUnits|r|radius|refX|refY|renderingIntent|repeatCount|repeatDur|requiredExtensions|requiredFeatures|restart|result|rotate|rx|ry|scale|seed|shapeRendering|slope|spacing|specularConstant|specularExponent|speed|spreadMethod|startOffset|stdDeviation|stemh|stemv|stitchTiles|stopColor|stopOpacity|strikethroughPosition|strikethroughThickness|string|stroke|strokeDasharray|strokeDashoffset|strokeLinecap|strokeLinejoin|strokeMiterlimit|strokeOpacity|strokeWidth|surfaceScale|systemLanguage|tableValues|targetX|targetY|textAnchor|textDecoration|textRendering|textLength|to|transform|u1|u2|underlinePosition|underlineThickness|unicode|unicodeBidi|unicodeRange|unitsPerEm|vAlphabetic|vHanging|vIdeographic|vMathematical|values|vectorEffect|version|vertAdvY|vertOriginX|vertOriginY|viewBox|viewTarget|visibility|widths|wordSpacing|writingMode|x|xHeight|x1|x2|xChannelSelector|xlinkActuate|xlinkArcrole|xlinkHref|xlinkRole|xlinkShow|xlinkTitle|xlinkType|xmlBase|xmlns|xmlnsXlink|xmlLang|xmlSpace|y|y1|y2|yChannelSelector|z|zoomAndPan|for|class|autofocus)|(([Dd][Aa][Tt][Aa]|[Aa][Rr][Ii][Aa]|x)-.*))$/; // https://esbench.com/bench/5bfee68a4cd7e6009ef61d23\n\nvar isPropValid = /* #__PURE__ */memoize(function (prop) {\n return reactPropsRegex.test(prop) || prop.charCodeAt(0) === 111\n /* o */\n && prop.charCodeAt(1) === 110\n /* n */\n && prop.charCodeAt(2) < 91;\n}\n/* Z+1 */\n);\n\nexport default isPropValid;\n","import _extends from '@babel/runtime/helpers/esm/extends';\nimport { useContext, createElement, Fragment } from 'react';\nimport isPropValid from '@emotion/is-prop-valid';\nimport { withEmotionCache, ThemeContext } from '@emotion/react';\nimport { getRegisteredStyles, registerStyles, insertStyles } from '@emotion/utils';\nimport { serializeStyles } from '@emotion/serialize';\nimport { useInsertionEffectAlwaysWithSyncFallback } from '@emotion/use-insertion-effect-with-fallbacks';\n\nvar testOmitPropsOnStringTag = isPropValid;\n\nvar testOmitPropsOnComponent = function testOmitPropsOnComponent(key) {\n return key !== 'theme';\n};\n\nvar getDefaultShouldForwardProp = function getDefaultShouldForwardProp(tag) {\n return typeof tag === 'string' && // 96 is one less than the char code\n // for \"a\" so this is checking that\n // it's a lowercase character\n tag.charCodeAt(0) > 96 ? testOmitPropsOnStringTag : testOmitPropsOnComponent;\n};\nvar composeShouldForwardProps = function composeShouldForwardProps(tag, options, isReal) {\n var shouldForwardProp;\n\n if (options) {\n var optionsShouldForwardProp = options.shouldForwardProp;\n shouldForwardProp = tag.__emotion_forwardProp && optionsShouldForwardProp ? function (propName) {\n return tag.__emotion_forwardProp(propName) && optionsShouldForwardProp(propName);\n } : optionsShouldForwardProp;\n }\n\n if (typeof shouldForwardProp !== 'function' && isReal) {\n shouldForwardProp = tag.__emotion_forwardProp;\n }\n\n return shouldForwardProp;\n};\n\nvar ILLEGAL_ESCAPE_SEQUENCE_ERROR = \"You have illegal escape sequence in your template literal, most likely inside content's property value.\\nBecause you write your CSS inside a JavaScript string you actually have to do double escaping, so for example \\\"content: '\\\\00d7';\\\" should become \\\"content: '\\\\\\\\00d7';\\\".\\nYou can read more about this here:\\nhttps://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Template_literals#ES2018_revision_of_illegal_escape_sequences\";\n\nvar Insertion = function Insertion(_ref) {\n var cache = _ref.cache,\n serialized = _ref.serialized,\n isStringTag = _ref.isStringTag;\n registerStyles(cache, serialized, isStringTag);\n var rules = useInsertionEffectAlwaysWithSyncFallback(function () {\n return insertStyles(cache, serialized, isStringTag);\n });\n\n return null;\n};\n\nvar createStyled = function createStyled(tag, options) {\n if (process.env.NODE_ENV !== 'production') {\n if (tag === undefined) {\n throw new Error('You are trying to create a styled element with an undefined component.\\nYou may have forgotten to import it.');\n }\n }\n\n var isReal = tag.__emotion_real === tag;\n var baseTag = isReal && tag.__emotion_base || tag;\n var identifierName;\n var targetClassName;\n\n if (options !== undefined) {\n identifierName = options.label;\n targetClassName = options.target;\n }\n\n var shouldForwardProp = composeShouldForwardProps(tag, options, isReal);\n var defaultShouldForwardProp = shouldForwardProp || getDefaultShouldForwardProp(baseTag);\n var shouldUseAs = !defaultShouldForwardProp('as');\n return function () {\n var args = arguments;\n var styles = isReal && tag.__emotion_styles !== undefined ? tag.__emotion_styles.slice(0) : [];\n\n if (identifierName !== undefined) {\n styles.push(\"label:\" + identifierName + \";\");\n }\n\n if (args[0] == null || args[0].raw === undefined) {\n styles.push.apply(styles, args);\n } else {\n if (process.env.NODE_ENV !== 'production' && args[0][0] === undefined) {\n console.error(ILLEGAL_ESCAPE_SEQUENCE_ERROR);\n }\n\n styles.push(args[0][0]);\n var len = args.length;\n var i = 1;\n\n for (; i < len; i++) {\n if (process.env.NODE_ENV !== 'production' && args[0][i] === undefined) {\n console.error(ILLEGAL_ESCAPE_SEQUENCE_ERROR);\n }\n\n styles.push(args[i], args[0][i]);\n }\n } // $FlowFixMe: we need to cast StatelessFunctionalComponent to our PrivateStyledComponent class\n\n\n var Styled = withEmotionCache(function (props, cache, ref) {\n var FinalTag = shouldUseAs && props.as || baseTag;\n var className = '';\n var classInterpolations = [];\n var mergedProps = props;\n\n if (props.theme == null) {\n mergedProps = {};\n\n for (var key in props) {\n mergedProps[key] = props[key];\n }\n\n mergedProps.theme = useContext(ThemeContext);\n }\n\n if (typeof props.className === 'string') {\n className = getRegisteredStyles(cache.registered, classInterpolations, props.className);\n } else if (props.className != null) {\n className = props.className + \" \";\n }\n\n var serialized = serializeStyles(styles.concat(classInterpolations), cache.registered, mergedProps);\n className += cache.key + \"-\" + serialized.name;\n\n if (targetClassName !== undefined) {\n className += \" \" + targetClassName;\n }\n\n var finalShouldForwardProp = shouldUseAs && shouldForwardProp === undefined ? getDefaultShouldForwardProp(FinalTag) : defaultShouldForwardProp;\n var newProps = {};\n\n for (var _key in props) {\n if (shouldUseAs && _key === 'as') continue;\n\n if ( // $FlowFixMe\n finalShouldForwardProp(_key)) {\n newProps[_key] = props[_key];\n }\n }\n\n newProps.className = className;\n newProps.ref = ref;\n return /*#__PURE__*/createElement(Fragment, null, /*#__PURE__*/createElement(Insertion, {\n cache: cache,\n serialized: serialized,\n isStringTag: typeof FinalTag === 'string'\n }), /*#__PURE__*/createElement(FinalTag, newProps));\n });\n Styled.displayName = identifierName !== undefined ? identifierName : \"Styled(\" + (typeof baseTag === 'string' ? baseTag : baseTag.displayName || baseTag.name || 'Component') + \")\";\n Styled.defaultProps = tag.defaultProps;\n Styled.__emotion_real = Styled;\n Styled.__emotion_base = baseTag;\n Styled.__emotion_styles = styles;\n Styled.__emotion_forwardProp = shouldForwardProp;\n Object.defineProperty(Styled, 'toString', {\n value: function value() {\n if (targetClassName === undefined && process.env.NODE_ENV !== 'production') {\n return 'NO_COMPONENT_SELECTOR';\n } // $FlowFixMe: coerce undefined to string\n\n\n return \".\" + targetClassName;\n }\n });\n\n Styled.withComponent = function (nextTag, nextOptions) {\n return createStyled(nextTag, _extends({}, options, nextOptions, {\n shouldForwardProp: composeShouldForwardProps(Styled, nextOptions, true)\n })).apply(void 0, styles);\n };\n\n return Styled;\n };\n};\n\nexport default createStyled;\n","\"use strict\";\n\nexports.__esModule = true;\nexports.useTheme = void 0;\n\nvar _themeToggler = require(\"./theme-toggler\");\n\nexports.useTheme = _themeToggler.useTheme;","\"use strict\";\n\nexports.__esModule = true;\nexports.useTheme = void 0;\n\nvar _react = require(\"react\");\n\nvar useTheme = function useTheme() {\n var _useState = (0, _react.useState)(typeof window === 'undefined' ? null : window.__theme),\n currentTheme = _useState[0],\n setCurrentTheme = _useState[1];\n\n (0, _react.useEffect)(function () {\n window.__onThemeChange = function () {\n setCurrentTheme(window.__theme);\n };\n }, []);\n var toggleTheme = (0, _react.useCallback)(function (theme) {\n window.__setPreferredTheme(theme);\n }, []);\n return [currentTheme, toggleTheme];\n};\n\nexports.useTheme = useTheme;","import React, { FunctionComponent } from 'react'\nimport { Global, css } from '@emotion/react'\n\nconst defaultStyle = css`\n @import url('https://cdn.jsdelivr.net/gh/projectnoonnu/noonfonts_11-01@1.0/NanumSquareNeo-Variable.woff2');\n\n * {\n padding: 0;\n margin: 0;\n box-sizing: border-box;\n font-family: 'NanumSquareNeo-Variable', normal;\n }\n\n html,\n body,\n #___gatsby {\n height: 100%;\n }\n\n a,\n a:hover {\n color: inherit;\n text-decoration: none;\n cursor: pointer;\n }\n\n body {\n --bg: white;\n --bg-element2: #f8f9fa;\n --bg-element5: #212529;\n --textNormal: #222;\n --textTitle: #222;\n --textLink: blue;\n --hr: hsla(0, 0%, 0%, 0.2);\n --darkhover: #dee2e6;\n --category: #495057;\n --tenseactiv: #212529;\n --tense: #868e96;\n --velog: #12b886;\n --catebg: #e9ecef;\n --border1: #343a62;\n --border2: #adb5bd;\n --border3: #dee2e6;\n --text1: #212529;\n --text2: #495057;\n --text3: #868e96;\n --bg-tag: #f8f9fa;\n --border4: #f1f3f5;\n --button-text: #ffffff;\n\n --prism-bg: #fbfcfd;\n --prism-default-text: #24292e;\n background-color: var(--bg);\n\n --primary2: #20C997;\n }\n\n body.dark {\n -webkit-font-smoothing: antialiased;\n\n --bg: #121212;\n --bg-element2: #1e1e1e;\n --bg-element5: #f1f3f5;\n --textNormal: white;\n --textTitle: white;\n --textLink: yellow;\n --hr: hsla(0, 0%, 100%, 0.2);\n --element: #1e1e1e;\n --darkhover: #4d4d4d;\n --postback: #121212;\n --category: #d9d9d9;\n --tenseactiv: #ececec;\n --tense: #acacac;\n --catebg: #121212;\n --border1: #e0e0e0;\n --border2: #a0a0a0;\n --border3: #4d4d4d;\n --text1: #ececec;\n --text2: #d9d9d9;\n --text3: #acacac;\n --bg-tag: #252525;\n --border4: #2a2a2a;\n --button-text: #121212;\n\n --prism-bg: #1e1e1e;\n --prism-default-text: #e0e6f1;\n color: var(--textNormal);\n\n --primary2: #63E6BE;\n }\n`\n\nconst GlobalStyle: FunctionComponent = function () {\n return \n}\n\nexport default GlobalStyle\n","var f=r(),n=e=>c(e,f),m=r();n.write=e=>c(e,m);var d=r();n.onStart=e=>c(e,d);var h=r();n.onFrame=e=>c(e,h);var p=r();n.onFinish=e=>c(e,p);var i=[];n.setTimeout=(e,t)=>{let a=n.now()+t,o=()=>{let F=i.findIndex(z=>z.cancel==o);~F&&i.splice(F,1),u-=~F?1:0},s={time:a,handler:e,cancel:o};return i.splice(w(a),0,s),u+=1,v(),s};var w=e=>~(~i.findIndex(t=>t.time>e)||~i.length);n.cancel=e=>{d.delete(e),h.delete(e),p.delete(e),f.delete(e),m.delete(e)};n.sync=e=>{T=!0,n.batchedUpdates(e),T=!1};n.throttle=e=>{let t;function a(){try{e(...t)}finally{t=null}}function o(...s){t=s,n.onStart(a)}return o.handler=e,o.cancel=()=>{d.delete(a),t=null},o};var y=typeof window<\"u\"?window.requestAnimationFrame:()=>{};n.use=e=>y=e;n.now=typeof performance<\"u\"?()=>performance.now():Date.now;n.batchedUpdates=e=>e();n.catch=console.error;n.frameLoop=\"always\";n.advance=()=>{n.frameLoop!==\"demand\"?console.warn(\"Cannot call the manual advancement of rafz whilst frameLoop is not set as demand\"):x()};var l=-1,u=0,T=!1;function c(e,t){T?(t.delete(e),e(0)):(t.add(e),v())}function v(){l<0&&(l=0,n.frameLoop!==\"demand\"&&y(b))}function R(){l=-1}function b(){~l&&(y(b),n.batchedUpdates(x))}function x(){let e=l;l=n.now();let t=w(l);if(t&&(Q(i.splice(0,t),a=>a.handler()),u-=t),!u){R();return}d.flush(),f.flush(e?Math.min(64,l-e):16.667),h.flush(),m.flush(),p.flush()}function r(){let e=new Set,t=e;return{add(a){u+=t==e&&!e.has(a)?1:0,e.add(a)},delete(a){return u-=t==e&&e.has(a)?1:0,e.delete(a)},flush(a){t.size&&(e=new Set,u-=t.size,Q(t,o=>o(a)&&e.add(o)),u+=e.size,t=e)}}}function Q(e,t){e.forEach(a=>{try{t(a)}catch(o){n.catch(o)}})}var S={count(){return u},isRunning(){return l>=0},clear(){l=-1,i=[],d=r(),f=r(),h=r(),m=r(),p=r(),u=0}};export{S as __raf,n as raf};\n","var ze=Object.defineProperty;var Le=(e,t)=>{for(var r in t)ze(e,r,{get:t[r],enumerable:!0})};var p={};Le(p,{assign:()=>U,colors:()=>c,createStringInterpolator:()=>k,skipAnimation:()=>ee,to:()=>J,willAdvance:()=>S});import{raf as I}from\"@react-spring/rafz\";function Y(){}var mt=(e,t,r)=>Object.defineProperty(e,t,{value:r,writable:!0,configurable:!0}),l={arr:Array.isArray,obj:e=>!!e&&e.constructor.name===\"Object\",fun:e=>typeof e==\"function\",str:e=>typeof e==\"string\",num:e=>typeof e==\"number\",und:e=>e===void 0};function bt(e,t){if(l.arr(e)){if(!l.arr(t)||e.length!==t.length)return!1;for(let r=0;re.forEach(t);function xt(e,t,r){if(l.arr(e)){for(let n=0;nl.und(e)?[]:l.arr(e)?e:[e];function Pe(e,t){if(e.size){let r=Array.from(e);e.clear(),Ve(r,t)}}var yt=(e,...t)=>Pe(e,r=>r(...t)),h=()=>typeof window>\"u\"||!window.navigator||/ServerSideRendering|^Deno\\//.test(window.navigator.userAgent);var k,J,c=null,ee=!1,S=Y,U=e=>{e.to&&(J=e.to),e.now&&(I.now=e.now),e.colors!==void 0&&(c=e.colors),e.skipAnimation!=null&&(ee=e.skipAnimation),e.createStringInterpolator&&(k=e.createStringInterpolator),e.requestAnimationFrame&&I.use(e.requestAnimationFrame),e.batchedUpdates&&(I.batchedUpdates=e.batchedUpdates),e.willAdvance&&(S=e.willAdvance),e.frameLoop&&(I.frameLoop=e.frameLoop)};import{raf as R}from\"@react-spring/rafz\";var E=new Set,u=[],H=[],A=0,qe={get idle(){return!E.size&&!u.length},start(e){A>e.priority?(E.add(e),R.onStart($e)):(te(e),R(B))},advance:B,sort(e){if(A)R.onFrame(()=>qe.sort(e));else{let t=u.indexOf(e);~t&&(u.splice(t,1),re(e))}},clear(){u=[],E.clear()}};function $e(){E.forEach(te),E.clear(),R(B)}function te(e){u.includes(e)||re(e)}function re(e){u.splice(Ge(u,t=>t.priority>e.priority),0,e)}function B(e){let t=H;for(let r=0;r0}function Ge(e,t){let r=e.findIndex(t);return r<0?e.length:r}var ne=(e,t,r)=>Math.min(Math.max(r,e),t);var It={transparent:0,aliceblue:4042850303,antiquewhite:4209760255,aqua:16777215,aquamarine:2147472639,azure:4043309055,beige:4126530815,bisque:4293182719,black:255,blanchedalmond:4293643775,blue:65535,blueviolet:2318131967,brown:2771004159,burlywood:3736635391,burntsienna:3934150143,cadetblue:1604231423,chartreuse:2147418367,chocolate:3530104575,coral:4286533887,cornflowerblue:1687547391,cornsilk:4294499583,crimson:3692313855,cyan:16777215,darkblue:35839,darkcyan:9145343,darkgoldenrod:3095792639,darkgray:2846468607,darkgreen:6553855,darkgrey:2846468607,darkkhaki:3182914559,darkmagenta:2332068863,darkolivegreen:1433087999,darkorange:4287365375,darkorchid:2570243327,darkred:2332033279,darksalmon:3918953215,darkseagreen:2411499519,darkslateblue:1211993087,darkslategray:793726975,darkslategrey:793726975,darkturquoise:13554175,darkviolet:2483082239,deeppink:4279538687,deepskyblue:12582911,dimgray:1768516095,dimgrey:1768516095,dodgerblue:512819199,firebrick:2988581631,floralwhite:4294635775,forestgreen:579543807,fuchsia:4278255615,gainsboro:3705462015,ghostwhite:4177068031,gold:4292280575,goldenrod:3668254975,gray:2155905279,green:8388863,greenyellow:2919182335,grey:2155905279,honeydew:4043305215,hotpink:4285117695,indianred:3445382399,indigo:1258324735,ivory:4294963455,khaki:4041641215,lavender:3873897215,lavenderblush:4293981695,lawngreen:2096890111,lemonchiffon:4294626815,lightblue:2916673279,lightcoral:4034953471,lightcyan:3774873599,lightgoldenrodyellow:4210742015,lightgray:3553874943,lightgreen:2431553791,lightgrey:3553874943,lightpink:4290167295,lightsalmon:4288707327,lightseagreen:548580095,lightskyblue:2278488831,lightslategray:2005441023,lightslategrey:2005441023,lightsteelblue:2965692159,lightyellow:4294959359,lime:16711935,limegreen:852308735,linen:4210091775,magenta:4278255615,maroon:2147483903,mediumaquamarine:1724754687,mediumblue:52735,mediumorchid:3126187007,mediumpurple:2473647103,mediumseagreen:1018393087,mediumslateblue:2070474495,mediumspringgreen:16423679,mediumturquoise:1221709055,mediumvioletred:3340076543,midnightblue:421097727,mintcream:4127193855,mistyrose:4293190143,moccasin:4293178879,navajowhite:4292783615,navy:33023,oldlace:4260751103,olive:2155872511,olivedrab:1804477439,orange:4289003775,orangered:4282712319,orchid:3664828159,palegoldenrod:4008225535,palegreen:2566625535,paleturquoise:2951671551,palevioletred:3681588223,papayawhip:4293907967,peachpuff:4292524543,peru:3448061951,pink:4290825215,plum:3718307327,powderblue:2967529215,purple:2147516671,rebeccapurple:1714657791,red:4278190335,rosybrown:3163525119,royalblue:1097458175,saddlebrown:2336560127,salmon:4202722047,sandybrown:4104413439,seagreen:780883967,seashell:4294307583,sienna:2689740287,silver:3233857791,skyblue:2278484991,slateblue:1784335871,slategray:1887473919,slategrey:1887473919,snow:4294638335,springgreen:16744447,steelblue:1182971135,tan:3535047935,teal:8421631,thistle:3636451583,tomato:4284696575,turquoise:1088475391,violet:4001558271,wheat:4125012991,white:4294967295,whitesmoke:4126537215,yellow:4294902015,yellowgreen:2597139199};var d=\"[-+]?\\\\d*\\\\.?\\\\d+\",M=d+\"%\";function C(...e){return\"\\\\(\\\\s*(\"+e.join(\")\\\\s*,\\\\s*(\")+\")\\\\s*\\\\)\"}var oe=new RegExp(\"rgb\"+C(d,d,d)),fe=new RegExp(\"rgba\"+C(d,d,d,d)),ae=new RegExp(\"hsl\"+C(d,M,M)),ie=new RegExp(\"hsla\"+C(d,M,M,d)),se=/^#([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})$/,ue=/^#([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})$/,le=/^#([0-9a-fA-F]{6})$/,ce=/^#([0-9a-fA-F]{8})$/;function be(e){let t;return typeof e==\"number\"?e>>>0===e&&e>=0&&e<=4294967295?e:null:(t=le.exec(e))?parseInt(t[1]+\"ff\",16)>>>0:c&&c[e]!==void 0?c[e]:(t=oe.exec(e))?(y(t[1])<<24|y(t[2])<<16|y(t[3])<<8|255)>>>0:(t=fe.exec(e))?(y(t[1])<<24|y(t[2])<<16|y(t[3])<<8|me(t[4]))>>>0:(t=se.exec(e))?parseInt(t[1]+t[1]+t[2]+t[2]+t[3]+t[3]+\"ff\",16)>>>0:(t=ce.exec(e))?parseInt(t[1],16)>>>0:(t=ue.exec(e))?parseInt(t[1]+t[1]+t[2]+t[2]+t[3]+t[3]+t[4]+t[4],16)>>>0:(t=ae.exec(e))?(de(pe(t[1]),z(t[2]),z(t[3]))|255)>>>0:(t=ie.exec(e))?(de(pe(t[1]),z(t[2]),z(t[3]))|me(t[4]))>>>0:null}function j(e,t,r){return r<0&&(r+=1),r>1&&(r-=1),r<1/6?e+(t-e)*6*r:r<1/2?t:r<2/3?e+(t-e)*(2/3-r)*6:e}function de(e,t,r){let n=r<.5?r*(1+t):r+t-r*t,f=2*r-n,o=j(f,n,e+1/3),i=j(f,n,e),s=j(f,n,e-1/3);return Math.round(o*255)<<24|Math.round(i*255)<<16|Math.round(s*255)<<8}function y(e){let t=parseInt(e,10);return t<0?0:t>255?255:t}function pe(e){return(parseFloat(e)%360+360)%360/360}function me(e){let t=parseFloat(e);return t<0?0:t>1?255:Math.round(t*255)}function z(e){let t=parseFloat(e);return t<0?0:t>100?1:t/100}function D(e){let t=be(e);if(t===null)return e;t=t||0;let r=(t&4278190080)>>>24,n=(t&16711680)>>>16,f=(t&65280)>>>8,o=(t&255)/255;return`rgba(${r}, ${n}, ${f}, ${o})`}var W=(e,t,r)=>{if(l.fun(e))return e;if(l.arr(e))return W({range:e,output:t,extrapolate:r});if(l.str(e.output[0]))return k(e);let n=e,f=n.output,o=n.range||[0,1],i=n.extrapolateLeft||n.extrapolate||\"extend\",s=n.extrapolateRight||n.extrapolate||\"extend\",x=n.easing||(a=>a);return a=>{let F=He(a,o);return Ue(a,o[F],o[F+1],f[F],f[F+1],x,i,s,n.map)}};function Ue(e,t,r,n,f,o,i,s,x){let a=x?x(e):e;if(ar){if(s===\"identity\")return a;s===\"clamp\"&&(a=r)}return n===f?n:t===r?e<=t?n:f:(t===-1/0?a=-a:r===1/0?a=a-t:a=(a-t)/(r-t),a=o(a),n===-1/0?a=-a:f===1/0?a=a+n:a=a*(f-n)+n,a)}function He(e,t){for(var r=1;r=e);++r);return r-1}var Be=(e,t=\"end\")=>r=>{r=t===\"end\"?Math.min(r,.999):Math.max(r,.001);let n=r*e,f=t===\"end\"?Math.floor(n):Math.ceil(n);return ne(0,1,f/e)},P=1.70158,L=P*1.525,xe=P+1,he=2*Math.PI/3,ye=2*Math.PI/4.5,V=e=>e<1/2.75?7.5625*e*e:e<2/2.75?7.5625*(e-=1.5/2.75)*e+.75:e<2.5/2.75?7.5625*(e-=2.25/2.75)*e+.9375:7.5625*(e-=2.625/2.75)*e+.984375,Lt={linear:e=>e,easeInQuad:e=>e*e,easeOutQuad:e=>1-(1-e)*(1-e),easeInOutQuad:e=>e<.5?2*e*e:1-Math.pow(-2*e+2,2)/2,easeInCubic:e=>e*e*e,easeOutCubic:e=>1-Math.pow(1-e,3),easeInOutCubic:e=>e<.5?4*e*e*e:1-Math.pow(-2*e+2,3)/2,easeInQuart:e=>e*e*e*e,easeOutQuart:e=>1-Math.pow(1-e,4),easeInOutQuart:e=>e<.5?8*e*e*e*e:1-Math.pow(-2*e+2,4)/2,easeInQuint:e=>e*e*e*e*e,easeOutQuint:e=>1-Math.pow(1-e,5),easeInOutQuint:e=>e<.5?16*e*e*e*e*e:1-Math.pow(-2*e+2,5)/2,easeInSine:e=>1-Math.cos(e*Math.PI/2),easeOutSine:e=>Math.sin(e*Math.PI/2),easeInOutSine:e=>-(Math.cos(Math.PI*e)-1)/2,easeInExpo:e=>e===0?0:Math.pow(2,10*e-10),easeOutExpo:e=>e===1?1:1-Math.pow(2,-10*e),easeInOutExpo:e=>e===0?0:e===1?1:e<.5?Math.pow(2,20*e-10)/2:(2-Math.pow(2,-20*e+10))/2,easeInCirc:e=>1-Math.sqrt(1-Math.pow(e,2)),easeOutCirc:e=>Math.sqrt(1-Math.pow(e-1,2)),easeInOutCirc:e=>e<.5?(1-Math.sqrt(1-Math.pow(2*e,2)))/2:(Math.sqrt(1-Math.pow(-2*e+2,2))+1)/2,easeInBack:e=>xe*e*e*e-P*e*e,easeOutBack:e=>1+xe*Math.pow(e-1,3)+P*Math.pow(e-1,2),easeInOutBack:e=>e<.5?Math.pow(2*e,2)*((L+1)*2*e-L)/2:(Math.pow(2*e-2,2)*((L+1)*(e*2-2)+L)+2)/2,easeInElastic:e=>e===0?0:e===1?1:-Math.pow(2,10*e-10)*Math.sin((e*10-10.75)*he),easeOutElastic:e=>e===0?0:e===1?1:Math.pow(2,-10*e)*Math.sin((e*10-.75)*he)+1,easeInOutElastic:e=>e===0?0:e===1?1:e<.5?-(Math.pow(2,20*e-10)*Math.sin((20*e-11.125)*ye))/2:Math.pow(2,-20*e+10)*Math.sin((20*e-11.125)*ye)/2+1,easeInBounce:e=>1-V(1-e),easeOutBounce:V,easeInOutBounce:e=>e<.5?(1-V(1-2*e))/2:(1+V(2*e-1))/2,steps:Be};var g=Symbol.for(\"FluidValue.get\"),m=Symbol.for(\"FluidValue.observers\");var Pt=e=>!!(e&&e[g]),ve=e=>e&&e[g]?e[g]():e,qt=e=>e[m]||null;function je(e,t){e.eventObserved?e.eventObserved(t):e(t)}function $t(e,t){let r=e[m];r&&r.forEach(n=>{je(n,t)})}var ge=class{[g];[m];constructor(t){if(!t&&!(t=this.get))throw Error(\"Unknown getter\");De(this,t)}},De=(e,t)=>Ee(e,g,t);function Gt(e,t){if(e[g]){let r=e[m];r||Ee(e,m,r=new Set),r.has(t)||(r.add(t),e.observerAdded&&e.observerAdded(r.size,t))}return t}function Qt(e,t){let r=e[m];if(r&&r.has(t)){let n=r.size-1;n?r.delete(t):e[m]=null,e.observerRemoved&&e.observerRemoved(n,t)}}var Ee=(e,t,r)=>Object.defineProperty(e,t,{value:r,writable:!0,configurable:!0});var O=/[+\\-]?(?:0|[1-9]\\d*)(?:\\.\\d*)?(?:[eE][+\\-]?\\d+)?/g,Oe=/(#(?:[0-9a-f]{2}){2,4}|(#[0-9a-f]{3})|(rgb|hsl)a?\\((-?\\d+%?[,\\s]+){2,3}\\s*[\\d\\.]+%?\\))/gi,K=new RegExp(`(${O.source})(%|[a-z]+)`,\"i\"),we=/rgba\\(([0-9\\.-]+), ([0-9\\.-]+), ([0-9\\.-]+), ([0-9\\.-]+)\\)/gi,b=/var\\((--[a-zA-Z0-9-_]+),? ?([a-zA-Z0-9 ()%#.,-]+)?\\)/;var N=e=>{let[t,r]=We(e);if(!t||h())return e;let n=window.getComputedStyle(document.documentElement).getPropertyValue(t);if(n)return n.trim();if(r&&r.startsWith(\"--\")){let f=window.getComputedStyle(document.documentElement).getPropertyValue(r);return f||e}else{if(r&&b.test(r))return N(r);if(r)return r}return e},We=e=>{let t=b.exec(e);if(!t)return[,];let[,r,n]=t;return[r,n]};var _,Ke=(e,t,r,n,f)=>`rgba(${Math.round(t)}, ${Math.round(r)}, ${Math.round(n)}, ${f})`,Xt=e=>{_||(_=c?new RegExp(`(${Object.keys(c).join(\"|\")})(?!\\\\w)`,\"g\"):/^\\b$/);let t=e.output.map(o=>ve(o).replace(b,N).replace(Oe,D).replace(_,D)),r=t.map(o=>o.match(O).map(Number)),f=r[0].map((o,i)=>r.map(s=>{if(!(i in s))throw Error('The arity of each \"output\" value must be equal');return s[i]})).map(o=>W({...e,output:o}));return o=>{let i=!K.test(t[0])&&t.find(x=>K.test(x))?.replace(O,\"\"),s=0;return t[0].replace(O,()=>`${f[s++](o)}${i||\"\"}`).replace(we,Ke)}};var Z=\"react-spring: \",Te=e=>{let t=e,r=!1;if(typeof t!=\"function\")throw new TypeError(`${Z}once requires a function parameter`);return(...n)=>{r||(t(...n),r=!0)}},Ne=Te(console.warn);function Jt(){Ne(`${Z}The \"interpolate\" function is deprecated in v9 (use \"to\" instead)`)}var _e=Te(console.warn);function er(){_e(`${Z}Directly calling start instead of using the api object is deprecated in v9 (use \".start\" instead), this will be removed in later 0.X.0 versions`)}function or(e){return l.str(e)&&(e[0]==\"#\"||/\\d/.test(e)||!h()&&b.test(e)||e in(c||{}))}import{raf as Re}from\"@react-spring/rafz\";var v,q=new WeakMap,Ze=e=>e.forEach(({target:t,contentRect:r})=>q.get(t)?.forEach(n=>n(r)));function Fe(e,t){v||typeof ResizeObserver<\"u\"&&(v=new ResizeObserver(Ze));let r=q.get(t);return r||(r=new Set,q.set(t,r)),r.add(e),v&&v.observe(t),()=>{let n=q.get(t);n&&(n.delete(e),!n.size&&v&&v.unobserve(t))}}var $=new Set,w,Xe=()=>{let e=()=>{$.forEach(t=>t({width:window.innerWidth,height:window.innerHeight}))};return window.addEventListener(\"resize\",e),()=>{window.removeEventListener(\"resize\",e)}},Ie=e=>($.add(e),w||(w=Xe()),()=>{$.delete(e),!$.size&&w&&(w(),w=void 0)});var ke=(e,{container:t=document.documentElement}={})=>t===document.documentElement?Ie(e):Fe(e,t);var Se=(e,t,r)=>t-e===0?1:(r-e)/(t-e);var Ye={x:{length:\"Width\",position:\"Left\"},y:{length:\"Height\",position:\"Top\"}},G=class{callback;container;info;constructor(t,r){this.callback=t,this.container=r,this.info={time:0,x:this.createAxis(),y:this.createAxis()}}createAxis=()=>({current:0,progress:0,scrollLength:0});updateAxis=t=>{let r=this.info[t],{length:n,position:f}=Ye[t];r.current=this.container[`scroll${f}`],r.scrollLength=this.container[\"scroll\"+n]-this.container[\"client\"+n],r.progress=Se(0,r.scrollLength,r.current)};update=()=>{this.updateAxis(\"x\"),this.updateAxis(\"y\")};sendEvent=()=>{this.callback(this.info)};advance=()=>{this.update(),this.sendEvent()}};var T=new WeakMap,Ae=new WeakMap,X=new WeakMap,Me=e=>e===document.documentElement?window:e,yr=(e,{container:t=document.documentElement}={})=>{let r=X.get(t);r||(r=new Set,X.set(t,r));let n=new G(e,t);if(r.add(n),!T.has(t)){let o=()=>(r?.forEach(s=>s.advance()),!0);T.set(t,o);let i=Me(t);window.addEventListener(\"resize\",o,{passive:!0}),t!==document.documentElement&&Ae.set(t,ke(o,{container:t})),i.addEventListener(\"scroll\",o,{passive:!0})}let f=T.get(t);return Re(f),()=>{Re.cancel(f);let o=X.get(t);if(!o||(o.delete(n),o.size))return;let i=T.get(t);T.delete(t),i&&(Me(t).removeEventListener(\"scroll\",i),window.removeEventListener(\"resize\",i),Ae.get(t)?.())}};import{useRef as Je}from\"react\";function Er(e){let t=Je(null);return t.current===null&&(t.current=e()),t.current}import{useState as nt}from\"react\";import{useRef as rt}from\"react\";import{useEffect as et,useLayoutEffect as tt}from\"react\";var Q=h()?et:tt;var Ce=()=>{let e=rt(!1);return Q(()=>(e.current=!0,()=>{e.current=!1}),[]),e};function Mr(){let e=nt()[1],t=Ce();return()=>{t.current&&e(Math.random())}}import{useEffect as ot,useRef as ft,useState as at}from\"react\";function Lr(e,t){let[r]=at(()=>({inputs:t,result:e()})),n=ft(),f=n.current,o=f;return o?t&&o.inputs&&it(t,o.inputs)||(o={inputs:t,result:e()}):o=r,ot(()=>{n.current=o,f==r&&(r.inputs=r.result=void 0)},[o]),o.result}function it(e,t){if(e.length!==t.length)return!1;for(let r=0;rst(e,ut),ut=[];import{useEffect as lt,useRef as ct}from\"react\";function Ur(e){let t=ct();return lt(()=>{t.current=e}),t.current}import{useState as dt}from\"react\";var Wr=()=>{let[e,t]=dt(null);return Q(()=>{let r=window.matchMedia(\"(prefers-reduced-motion)\"),n=f=>{t(f.matches),U({skipAnimation:f.matches})};return n(r),r.addEventListener(\"change\",n),()=>{r.removeEventListener(\"change\",n)}},[]),e};import{raf as yn}from\"@react-spring/rafz\";export{ge as FluidValue,p as Globals,Gt as addFluidObserver,je as callFluidObserver,$t as callFluidObservers,ne as clamp,D as colorToRgba,It as colors,W as createInterpolator,Xt as createStringInterpolator,mt as defineHidden,er as deprecateDirectCall,Jt as deprecateInterpolate,Ve as each,xt as eachProp,Lt as easings,Pe as flush,yt as flushCalls,qe as frameLoop,qt as getFluidObservers,ve as getFluidValue,Pt as hasFluidValue,se as hex3,ue as hex4,le as hex6,ce as hex8,ae as hsl,ie as hsla,l as is,or as isAnimatedString,bt as isEqual,h as isSSR,Y as noop,ke as onResize,yr as onScroll,Te as once,Z as prefix,yn as raf,Qt as removeFluidObserver,oe as rgb,fe as rgba,De as setFluidGetter,ht as toArray,Er as useConstant,Mr as useForceUpdate,Q as useIsomorphicLayoutEffect,Lr as useMemoOne,$r as useOnce,Ur as usePrev,Wr as useReducedMotion};\n","import{defineHidden as B}from\"@react-spring/shared\";var h=Symbol.for(\"Animated:node\"),v=e=>!!e&&e[h]===e,k=e=>e&&e[h],D=(e,t)=>B(e,h,t),F=e=>e&&e[h]&&e[h].getPayload(),c=class{payload;constructor(){D(this,this)}getPayload(){return this.payload||[]}};import{is as A}from\"@react-spring/shared\";var l=class extends c{constructor(r){super();this._value=r;A.num(this._value)&&(this.lastPosition=this._value)}done=!0;elapsedTime;lastPosition;lastVelocity;v0;durationProgress=0;static create(r){return new l(r)}getPayload(){return[this]}getValue(){return this._value}setValue(r,n){return A.num(r)&&(this.lastPosition=r,n&&(r=Math.round(r/n)*n,this.done&&(this.lastPosition=r))),this._value===r?!1:(this._value=r,!0)}reset(){let{done:r}=this;this.done=!1,A.num(this._value)&&(this.elapsedTime=0,this.durationProgress=0,this.lastPosition=this._value,r&&(this.lastVelocity=null),this.v0=null)}};import{is as K,createInterpolator as R}from\"@react-spring/shared\";var d=class extends l{_string=null;_toString;constructor(t){super(0),this._toString=R({output:[t,t]})}static create(t){return new d(t)}getValue(){let t=this._string;return t??(this._string=this._toString(this._value))}setValue(t){if(K.str(t)){if(t==this._string)return!1;this._string=t,this._value=1}else if(super.setValue(t))this._string=null;else return!1;return!0}reset(t){t&&(this._toString=R({output:[this.getValue(),t]})),this._value=0,super.reset()}};import{isAnimatedString as q}from\"@react-spring/shared\";import{each as L,eachProp as w,getFluidValue as M,hasFluidValue as C}from\"@react-spring/shared\";var f={dependencies:null};var u=class extends c{constructor(r){super();this.source=r;this.setValue(r)}getValue(r){let n={};return w(this.source,(a,i)=>{v(a)?n[i]=a.getValue(r):C(a)?n[i]=M(a):r||(n[i]=a)}),n}setValue(r){this.source=r,this.payload=this._makePayload(r)}reset(){this.payload&&L(this.payload,r=>r.reset())}_makePayload(r){if(r){let n=new Set;return w(r,this._addToPayload,n),Array.from(n)}}_addToPayload(r){f.dependencies&&C(r)&&f.dependencies.add(r);let n=F(r);n&&L(n,a=>this.add(a))}};var y=class extends u{constructor(t){super(t)}static create(t){return new y(t)}getValue(){return this.source.map(t=>t.getValue())}setValue(t){let r=this.getPayload();return t.length==r.length?r.map((n,a)=>n.setValue(t[a])).some(Boolean):(super.setValue(t.map(z)),!0)}};function z(e){return(q(e)?d:l).create(e)}import{is as G,isAnimatedString as J}from\"@react-spring/shared\";function Le(e){let t=k(e);return t?t.constructor:G.arr(e)?y:J(e)?d:l}import{is as g,eachProp as oe}from\"@react-spring/shared\";import*as O from\"react\";import{forwardRef as Q,useRef as H,useCallback as X,useEffect as Y}from\"react\";import{is as N,each as V,raf as U,useForceUpdate as Z,useOnce as ee,addFluidObserver as te,removeFluidObserver as E,useIsomorphicLayoutEffect as re}from\"@react-spring/shared\";var x=(e,t)=>{let r=!N.fun(e)||e.prototype&&e.prototype.isReactComponent;return Q((n,a)=>{let i=H(null),o=r&&X(s=>{i.current=ae(a,s)},[a]),[m,T]=ne(n,t),W=Z(),P=()=>{let s=i.current;if(r&&!s)return;(s?t.applyAnimatedValues(s,m.getValue(!0)):!1)===!1&&W()},_=new b(P,T),p=H();re(()=>(p.current=_,V(T,s=>te(s,_)),()=>{p.current&&(V(p.current.deps,s=>E(s,p.current)),U.cancel(p.current.update))})),Y(P,[]),ee(()=>()=>{let s=p.current;V(s.deps,S=>E(S,s))});let $=t.getComponentProps(m.getValue());return O.createElement(e,{...$,ref:o})})},b=class{constructor(t,r){this.update=t;this.deps=r}eventObserved(t){t.type==\"change\"&&U.write(this.update)}};function ne(e,t){let r=new Set;return f.dependencies=r,e.style&&(e={...e,style:t.createAnimatedStyle(e.style)}),e=new u(e),f.dependencies=null,[e,r]}function ae(e,t){return e&&(N.fun(e)?e(t):e.current=t),t}var j=Symbol.for(\"AnimatedComponent\"),Ke=(e,{applyAnimatedValues:t=()=>!1,createAnimatedStyle:r=a=>new u(a),getComponentProps:n=a=>a}={})=>{let a={applyAnimatedValues:t,createAnimatedStyle:r,getComponentProps:n},i=o=>{let m=I(o)||\"Anonymous\";return g.str(o)?o=i[o]||(i[o]=x(o,a)):o=o[j]||(o[j]=x(o,a)),o.displayName=`Animated(${m})`,o};return oe(e,(o,m)=>{g.arr(e)&&(m=I(o)),i[m]=i(o)}),{animated:i}},I=e=>g.str(e)?e:e&&g.str(e.displayName)?e.displayName:g.fun(e)&&e.name||null;export{c as Animated,y as AnimatedArray,u as AnimatedObject,d as AnimatedString,l as AnimatedValue,Ke as createHost,k as getAnimated,Le as getAnimatedType,F as getPayload,v as isAnimated,D as setAnimated};\n","import{each as ge,useIsomorphicLayoutEffect as an}from\"@react-spring/shared\";import{is as K,toArray as $t,eachProp as dt,getFluidValue as Zt,isAnimatedString as en,Globals as tn}from\"@react-spring/shared\";function I(t,...e){return K.fun(t)?t(...e):t}var te=(t,e)=>t===!0||!!(e&&t&&(K.fun(t)?t(e):$t(t).includes(e))),et=(t,e)=>K.obj(t)?e&&t[e]:t;var ke=(t,e)=>t.default===!0?t[e]:t.default?t.default[e]:void 0,nn=t=>t,ne=(t,e=nn)=>{let n=rn;t.default&&t.default!==!0&&(t=t.default,n=Object.keys(t));let r={};for(let o of n){let s=e(t[o],o);K.und(s)||(r[o]=s)}return r},rn=[\"config\",\"onProps\",\"onStart\",\"onChange\",\"onPause\",\"onResume\",\"onRest\"],on={config:1,from:1,to:1,ref:1,loop:1,reset:1,pause:1,cancel:1,reverse:1,immediate:1,default:1,delay:1,onProps:1,onStart:1,onChange:1,onPause:1,onResume:1,onRest:1,onResolve:1,items:1,trail:1,sort:1,expires:1,initial:1,enter:1,update:1,leave:1,children:1,onDestroyed:1,keys:1,callId:1,parentId:1};function sn(t){let e={},n=0;if(dt(t,(r,o)=>{on[o]||(e[o]=r,n++)}),n)return e}function de(t){let e=sn(t);if(e){let n={to:e};return dt(t,(r,o)=>o in e||(n[o]=r)),n}return{...t}}function me(t){return t=Zt(t),K.arr(t)?t.map(me):en(t)?tn.createStringInterpolator({range:[0,1],output:[t,t]})(1):t}function Ue(t){for(let e in t)return!0;return!1}function Ee(t){return K.fun(t)||K.arr(t)&&K.obj(t[0])}function xe(t,e){t.ref?.delete(t),e?.delete(t)}function he(t,e){e&&t.ref!==e&&(t.ref?.delete(t),e.add(t),t.ref=e)}function wr(t,e,n=1e3){an(()=>{if(e){let r=0;ge(t,(o,s)=>{let i=o.current;if(i.length){let a=n*e[s];isNaN(a)?a=r:r=a,ge(i,u=>{ge(u.queue,p=>{let f=p.delay;p.delay=d=>a+I(f||0,d)})}),o.start()}})}else{let r=Promise.resolve();ge(t,o=>{let s=o.current;if(s.length){let i=s.map(a=>{let u=a.queue;return a.queue=[],u});r=r.then(()=>(ge(s,(a,u)=>ge(i[u]||[],p=>a.queue.push(p))),Promise.all(o.start())))}})}})}import{is as Qn}from\"@react-spring/shared\";import{useContext as Mn,useMemo as Xe,useRef as Nt}from\"react\";import{is as jn,each as Ye,usePrev as Dt,useOnce as Nn,useForceUpdate as Dn,useIsomorphicLayoutEffect as qn}from\"@react-spring/shared\";import{is as R,raf as ve,each as At,isEqual as Y,toArray as Rt,eachProp as Pn,frameLoop as Tn,flushCalls as Qe,getFluidValue as ie,isAnimatedString as xn,Globals as bn,callFluidObservers as An,hasFluidValue as Se,addFluidObserver as Rn,removeFluidObserver as vn,getFluidObservers as vt}from\"@react-spring/shared\";import{AnimatedValue as Cn,AnimatedString as Ct,getPayload as In,getAnimated as ae,setAnimated as Vn,getAnimatedType as It}from\"@react-spring/animated\";import{is as re,easings as un}from\"@react-spring/shared\";var mt={default:{tension:170,friction:26},gentle:{tension:120,friction:14},wobbly:{tension:180,friction:12},stiff:{tension:210,friction:20},slow:{tension:280,friction:60},molasses:{tension:280,friction:120}};var tt={...mt.default,mass:1,damping:1,easing:un.linear,clamp:!1},we=class{tension;friction;frequency;damping;mass;velocity=0;restVelocity;precision;progress;duration;easing;clamp;bounce;decay;round;constructor(){Object.assign(this,tt)}};function gt(t,e,n){n&&(n={...n},ht(n,e),e={...n,...e}),ht(t,e),Object.assign(t,e);for(let i in tt)t[i]==null&&(t[i]=tt[i]);let{frequency:r,damping:o}=t,{mass:s}=t;return re.und(r)||(r<.01&&(r=.01),o<0&&(o=0),t.tension=Math.pow(2*Math.PI/r,2)*s,t.friction=4*Math.PI*o*s/r),t}function ht(t,e){if(!re.und(e.decay))t.duration=void 0;else{let n=!re.und(e.tension)||!re.und(e.friction);(n||!re.und(e.frequency)||!re.und(e.damping)||!re.und(e.mass))&&(t.duration=void 0,t.decay=void 0),n&&(t.frequency=void 0)}}var yt=[],Le=class{changed=!1;values=yt;toValues=null;fromValues=yt;to;from;config=new we;immediate=!1};import{is as pn,raf as St,Globals as ln}from\"@react-spring/shared\";function Me(t,{key:e,props:n,defaultProps:r,state:o,actions:s}){return new Promise((i,a)=>{let u,p,f=te(n.cancel??r?.cancel,e);if(f)b();else{pn.und(n.pause)||(o.paused=te(n.pause,e));let c=r?.pause;c!==!0&&(c=o.paused||te(c,e)),u=I(n.delay||0,e),c?(o.resumeQueue.add(m),s.pause()):(s.resume(),m())}function d(){o.resumeQueue.add(m),o.timeouts.delete(p),p.cancel(),u=p.time-St.now()}function m(){u>0&&!ln.skipAnimation?(o.delayed=!0,p=St.setTimeout(b,u),o.pauseQueue.add(d),o.timeouts.add(p)):b()}function b(){o.delayed&&(o.delayed=!1),o.pauseQueue.delete(d),o.timeouts.delete(p),t<=(o.cancelId||0)&&(f=!0);try{s.start({...n,callId:t,cancel:f},i)}catch(c){a(c)}}})}import{is as je,raf as cn,flush as fn,eachProp as dn,Globals as Pt}from\"@react-spring/shared\";var be=(t,e)=>e.length==1?e[0]:e.some(n=>n.cancelled)?q(t.get()):e.every(n=>n.noop)?nt(t.get()):E(t.get(),e.every(n=>n.finished)),nt=t=>({value:t,noop:!0,finished:!0,cancelled:!1}),E=(t,e,n=!1)=>({value:t,finished:e,cancelled:n}),q=t=>({value:t,cancelled:!0,finished:!1});function De(t,e,n,r){let{callId:o,parentId:s,onRest:i}=e,{asyncTo:a,promise:u}=n;return!s&&t===a&&!e.reset?u:n.promise=(async()=>{n.asyncId=o,n.asyncTo=t;let p=ne(e,(l,h)=>h===\"onRest\"?void 0:l),f,d,m=new Promise((l,h)=>(f=l,d=h)),b=l=>{let h=o<=(n.cancelId||0)&&q(r)||o!==n.asyncId&&E(r,!1);if(h)throw l.result=h,d(l),l},c=(l,h)=>{let g=new Ae,x=new Ne;return(async()=>{if(Pt.skipAnimation)throw oe(n),x.result=E(r,!1),d(x),x;b(g);let S=je.obj(l)?{...l}:{...h,to:l};S.parentId=o,dn(p,(V,_)=>{je.und(S[_])&&(S[_]=V)});let A=await r.start(S);return b(g),n.paused&&await new Promise(V=>{n.resumeQueue.add(V)}),A})()},P;if(Pt.skipAnimation)return oe(n),E(r,!1);try{let l;je.arr(t)?l=(async h=>{for(let g of h)await c(g)})(t):l=Promise.resolve(t(c,r.stop.bind(r))),await Promise.all([l.then(f),m]),P=E(r.get(),!0,!1)}catch(l){if(l instanceof Ae)P=l.result;else if(l instanceof Ne)P=l.result;else throw l}finally{o==n.asyncId&&(n.asyncId=s,n.asyncTo=s?a:void 0,n.promise=s?u:void 0)}return je.fun(i)&&cn.batchedUpdates(()=>{i(P,r,r.item)}),P})()}function oe(t,e){fn(t.timeouts,n=>n.cancel()),t.pauseQueue.clear(),t.resumeQueue.clear(),t.asyncId=t.asyncTo=t.promise=void 0,e&&(t.cancelId=e)}var Ae=class extends Error{result;constructor(){super(\"An async animation has been interrupted. You see this error because you forgot to use `await` or `.catch(...)` on its returned promise.\")}},Ne=class extends Error{result;constructor(){super(\"SkipAnimationSignal\")}};import{deprecateInterpolate as mn,frameLoop as hn,FluidValue as gn,Globals as Tt,callFluidObservers as xt}from\"@react-spring/shared\";import{getAnimated as yn}from\"@react-spring/animated\";var Re=t=>t instanceof X,Sn=1,X=class extends gn{id=Sn++;_priority=0;get priority(){return this._priority}set priority(e){this._priority!=e&&(this._priority=e,this._onPriorityChange(e))}get(){let e=yn(this);return e&&e.getValue()}to(...e){return Tt.to(this,e)}interpolate(...e){return mn(),Tt.to(this,e)}toJSON(){return this.get()}observerAdded(e){e==1&&this._attach()}observerRemoved(e){e==0&&this._detach()}_attach(){}_detach(){}_onChange(e,n=!1){xt(this,{type:\"change\",parent:this,value:e,idle:n})}_onPriorityChange(e){this.idle||hn.sort(this),xt(this,{type:\"priority\",parent:this,priority:e})}};var se=Symbol.for(\"SpringPhase\"),bt=1,rt=2,ot=4,qe=t=>(t[se]&bt)>0,Q=t=>(t[se]&rt)>0,ye=t=>(t[se]&ot)>0,st=(t,e)=>e?t[se]|=rt|bt:t[se]&=~rt,it=(t,e)=>e?t[se]|=ot:t[se]&=~ot;var ue=class extends X{key;animation=new Le;queue;defaultProps={};_state={paused:!1,delayed:!1,pauseQueue:new Set,resumeQueue:new Set,timeouts:new Set};_pendingCalls=new Set;_lastCallId=0;_lastToId=0;_memoizedDuration=0;constructor(e,n){if(super(),!R.und(e)||!R.und(n)){let r=R.obj(e)?{...e}:{...n,from:e};R.und(r.default)&&(r.default=!0),this.start(r)}}get idle(){return!(Q(this)||this._state.asyncTo)||ye(this)}get goal(){return ie(this.animation.to)}get velocity(){let e=ae(this);return e instanceof Cn?e.lastVelocity||0:e.getPayload().map(n=>n.lastVelocity||0)}get hasAnimated(){return qe(this)}get isAnimating(){return Q(this)}get isPaused(){return ye(this)}get isDelayed(){return this._state.delayed}advance(e){let n=!0,r=!1,o=this.animation,{toValues:s}=o,{config:i}=o,a=In(o.to);!a&&Se(o.to)&&(s=Rt(ie(o.to))),o.values.forEach((f,d)=>{if(f.done)return;let m=f.constructor==Ct?1:a?a[d].lastPosition:s[d],b=o.immediate,c=m;if(!b){if(c=f.lastPosition,i.tension<=0){f.done=!0;return}let P=f.elapsedTime+=e,l=o.fromValues[d],h=f.v0!=null?f.v0:f.v0=R.arr(i.velocity)?i.velocity[d]:i.velocity,g,x=i.precision||(l==m?.005:Math.min(1,Math.abs(m-l)*.001));if(R.und(i.duration))if(i.decay){let S=i.decay===!0?.998:i.decay,A=Math.exp(-(1-S)*P);c=l+h/(1-S)*(1-A),b=Math.abs(f.lastPosition-c)<=x,g=h*A}else{g=f.lastVelocity==null?h:f.lastVelocity;let S=i.restVelocity||x/10,A=i.clamp?0:i.bounce,V=!R.und(A),_=l==m?f.v0>0:lS,!(!v&&(b=Math.abs(m-c)<=x,b)));++L){V&&(w=c==m||c>m==_,w&&(g=-g*A,c=m));let N=-i.tension*1e-6*(c-m),y=-i.friction*.001*g,T=(N+y)/i.mass;g=g+T*C,c=c+g*C}}else{let S=1;i.duration>0&&(this._memoizedDuration!==i.duration&&(this._memoizedDuration=i.duration,f.durationProgress>0&&(f.elapsedTime=i.duration*f.durationProgress,P=f.elapsedTime+=e)),S=(i.progress||0)+P/this._memoizedDuration,S=S>1?1:S<0?0:S,f.durationProgress=S),c=l+i.easing(S)*(m-l),g=(c-f.lastPosition)/e,b=S==1}f.lastVelocity=g,Number.isNaN(c)&&(console.warn(\"Got NaN while animating:\",this),b=!0)}a&&!a[d].done&&(b=!1),b?f.done=!0:n=!1,f.setValue(c,i.round)&&(r=!0)});let u=ae(this),p=u.getValue();if(n){let f=ie(o.to);(p!==f||r)&&!i.decay?(u.setValue(f),this._onChange(f)):r&&i.decay&&this._onChange(p),this._stop()}else r&&this._onChange(p)}set(e){return ve.batchedUpdates(()=>{this._stop(),this._focus(e),this._set(e)}),this}pause(){this._update({pause:!0})}resume(){this._update({pause:!1})}finish(){if(Q(this)){let{to:e,config:n}=this.animation;ve.batchedUpdates(()=>{this._onStart(),n.decay||this._set(e,!1),this._stop()})}return this}update(e){return(this.queue||(this.queue=[])).push(e),this}start(e,n){let r;return R.und(e)?(r=this.queue||[],this.queue=[]):r=[R.obj(e)?e:{...n,to:e}],Promise.all(r.map(o=>this._update(o))).then(o=>be(this,o))}stop(e){let{to:n}=this.animation;return this._focus(this.get()),oe(this._state,e&&this._lastCallId),ve.batchedUpdates(()=>this._stop(n,e)),this}reset(){this._update({reset:!0})}eventObserved(e){e.type==\"change\"?this._start():e.type==\"priority\"&&(this.priority=e.priority+1)}_prepareNode(e){let n=this.key||\"\",{to:r,from:o}=e;r=R.obj(r)?r[n]:r,(r==null||Ee(r))&&(r=void 0),o=R.obj(o)?o[n]:o,o==null&&(o=void 0);let s={to:r,from:o};return qe(this)||(e.reverse&&([r,o]=[o,r]),o=ie(o),R.und(o)?ae(this)||this._set(r):this._set(o)),s}_update({...e},n){let{key:r,defaultProps:o}=this;e.default&&Object.assign(o,ne(e,(a,u)=>/^on/.test(u)?et(a,r):a)),_t(this,e,\"onProps\"),Ie(this,\"onProps\",e,this);let s=this._prepareNode(e);if(Object.isFrozen(this))throw Error(\"Cannot animate a `SpringValue` object that is frozen. Did you forget to pass your component to `animated(...)` before animating its props?\");let i=this._state;return Me(++this._lastCallId,{key:r,props:e,defaultProps:o,state:i,actions:{pause:()=>{ye(this)||(it(this,!0),Qe(i.pauseQueue),Ie(this,\"onPause\",E(this,Ce(this,this.animation.to)),this))},resume:()=>{ye(this)&&(it(this,!1),Q(this)&&this._resume(),Qe(i.resumeQueue),Ie(this,\"onResume\",E(this,Ce(this,this.animation.to)),this))},start:this._merge.bind(this,s)}}).then(a=>{if(e.loop&&a.finished&&!(n&&a.noop)){let u=at(e);if(u)return this._update(u,!0)}return a})}_merge(e,n,r){if(n.cancel)return this.stop(!0),r(q(this));let o=!R.und(e.to),s=!R.und(e.from);if(o||s)if(n.callId>this._lastToId)this._lastToId=n.callId;else return r(q(this));let{key:i,defaultProps:a,animation:u}=this,{to:p,from:f}=u,{to:d=p,from:m=f}=e;s&&!o&&(!n.default||R.und(d))&&(d=m),n.reverse&&([d,m]=[m,d]);let b=!Y(m,f);b&&(u.from=m),m=ie(m);let c=!Y(d,p);c&&this._focus(d);let P=Ee(n.to),{config:l}=u,{decay:h,velocity:g}=l;(o||s)&&(l.velocity=0),n.config&&!P&>(l,I(n.config,i),n.config!==a.config?I(a.config,i):void 0);let x=ae(this);if(!x||R.und(d))return r(E(this,!0));let S=R.und(n.reset)?s&&!n.default:!R.und(m)&&te(n.reset,i),A=S?m:this.get(),V=me(d),_=R.num(V)||R.arr(V)||xn(V),v=!P&&(!_||te(a.immediate||n.immediate,i));if(c){let L=It(d);if(L!==x.constructor)if(v)x=this._set(V);else throw Error(`Cannot animate between ${x.constructor.name} and ${L.name}, as the \"to\" prop suggests`)}let w=x.constructor,C=Se(d),$=!1;if(!C){let L=S||!qe(this)&&b;(c||L)&&($=Y(me(A),V),C=!$),(!Y(u.immediate,v)&&!v||!Y(l.decay,h)||!Y(l.velocity,g))&&(C=!0)}if($&&Q(this)&&(u.changed&&!S?C=!0:C||this._stop(p)),!P&&((C||Se(p))&&(u.values=x.getPayload(),u.toValues=Se(d)?null:w==Ct?[1]:Rt(V)),u.immediate!=v&&(u.immediate=v,!v&&!S&&this._set(p)),C)){let{onRest:L}=u;At(_n,y=>_t(this,n,y));let N=E(this,Ce(this,p));Qe(this._pendingCalls,N),this._pendingCalls.add(r),u.changed&&ve.batchedUpdates(()=>{u.changed=!S,L?.(N,this),S?I(a.onRest,N):u.onStart?.(N,this)})}S&&this._set(A),P?r(De(n.to,n,this._state,this)):C?this._start():Q(this)&&!c?this._pendingCalls.add(r):r(nt(A))}_focus(e){let n=this.animation;e!==n.to&&(vt(this)&&this._detach(),n.to=e,vt(this)&&this._attach())}_attach(){let e=0,{to:n}=this.animation;Se(n)&&(Rn(n,this),Re(n)&&(e=n.priority+1)),this.priority=e}_detach(){let{to:e}=this.animation;Se(e)&&vn(e,this)}_set(e,n=!0){let r=ie(e);if(!R.und(r)){let o=ae(this);if(!o||!Y(r,o.getValue())){let s=It(r);!o||o.constructor!=s?Vn(this,s.create(r)):o.setValue(r),o&&ve.batchedUpdates(()=>{this._onChange(r,n)})}}return ae(this)}_onStart(){let e=this.animation;e.changed||(e.changed=!0,Ie(this,\"onStart\",E(this,Ce(this,e.to)),this))}_onChange(e,n){n||(this._onStart(),I(this.animation.onChange,e,this)),I(this.defaultProps.onChange,e,this),super._onChange(e,n)}_start(){let e=this.animation;ae(this).reset(ie(e.to)),e.immediate||(e.fromValues=e.values.map(n=>n.lastPosition)),Q(this)||(st(this,!0),ye(this)||this._resume())}_resume(){bn.skipAnimation?this.finish():Tn.start(this)}_stop(e,n){if(Q(this)){st(this,!1);let r=this.animation;At(r.values,s=>{s.done=!0}),r.toValues&&(r.onChange=r.onPause=r.onResume=void 0),An(this,{type:\"idle\",parent:this});let o=n?q(this.get()):E(this.get(),Ce(this,e??r.to));Qe(this._pendingCalls,o),r.changed&&(r.changed=!1,Ie(this,\"onRest\",o,this))}}};function Ce(t,e){let n=me(e),r=me(t.get());return Y(r,n)}function at(t,e=t.loop,n=t.to){let r=I(e);if(r){let o=r!==!0&&de(r),s=(o||t).reverse,i=!o||o.reset;return Pe({...t,loop:e,default:!1,pause:void 0,to:!s||Ee(n)?n:void 0,from:i?t.from:void 0,reset:i,...o})}}function Pe(t){let{to:e,from:n}=t=de(t),r=new Set;return R.obj(e)&&Vt(e,r),R.obj(n)&&Vt(n,r),t.keys=r.size?Array.from(r):null,t}function Ot(t){let e=Pe(t);return R.und(e.default)&&(e.default=ne(e)),e}function Vt(t,e){Pn(t,(n,r)=>n!=null&&e.add(r))}var _n=[\"onStart\",\"onRest\",\"onChange\",\"onPause\",\"onResume\"];function _t(t,e,n){t.animation[n]=e[n]!==ke(e,n)?et(e[n],t.key):void 0}function Ie(t,e,...n){t.animation[e]?.(...n),t.defaultProps[e]?.(...n)}import{is as z,raf as kt,each as pe,noop as Ft,flush as ut,toArray as Ve,eachProp as Ut,flushCalls as On,addFluidObserver as Et}from\"@react-spring/shared\";var Fn=[\"onStart\",\"onChange\",\"onRest\"],kn=1,le=class{id=kn++;springs={};queue=[];ref;_flush;_initialProps;_lastAsyncId=0;_active=new Set;_changed=new Set;_started=!1;_item;_state={paused:!1,pauseQueue:new Set,resumeQueue:new Set,timeouts:new Set};_events={onStart:new Map,onChange:new Map,onRest:new Map};constructor(e,n){this._onFrame=this._onFrame.bind(this),n&&(this._flush=n),e&&this.start({default:!0,...e})}get idle(){return!this._state.asyncTo&&Object.values(this.springs).every(e=>e.idle&&!e.isDelayed&&!e.isPaused)}get item(){return this._item}set item(e){this._item=e}get(){let e={};return this.each((n,r)=>e[r]=n.get()),e}set(e){for(let n in e){let r=e[n];z.und(r)||this.springs[n].set(r)}}update(e){return e&&this.queue.push(Pe(e)),this}start(e){let{queue:n}=this;return e?n=Ve(e).map(Pe):this.queue=[],this._flush?this._flush(this,n):(jt(this,n),ze(this,n))}stop(e,n){if(e!==!!e&&(n=e),n){let r=this.springs;pe(Ve(n),o=>r[o].stop(!!e))}else oe(this._state,this._lastAsyncId),this.each(r=>r.stop(!!e));return this}pause(e){if(z.und(e))this.start({pause:!0});else{let n=this.springs;pe(Ve(e),r=>n[r].pause())}return this}resume(e){if(z.und(e))this.start({pause:!1});else{let n=this.springs;pe(Ve(e),r=>n[r].resume())}return this}each(e){Ut(this.springs,e)}_onFrame(){let{onStart:e,onChange:n,onRest:r}=this._events,o=this._active.size>0,s=this._changed.size>0;(o&&!this._started||s&&!this._started)&&(this._started=!0,ut(e,([u,p])=>{p.value=this.get(),u(p,this,this._item)}));let i=!o&&this._started,a=s||i&&r.size?this.get():null;s&&n.size&&ut(n,([u,p])=>{p.value=a,u(p,this,this._item)}),i&&(this._started=!1,ut(r,([u,p])=>{p.value=a,u(p,this,this._item)}))}eventObserved(e){if(e.type==\"change\")this._changed.add(e.parent),e.idle||this._active.add(e.parent);else if(e.type==\"idle\")this._active.delete(e.parent);else return;kt.onFrame(this._onFrame)}};function ze(t,e){return Promise.all(e.map(n=>wt(t,n))).then(n=>be(t,n))}async function wt(t,e,n){let{keys:r,to:o,from:s,loop:i,onRest:a,onResolve:u}=e,p=z.obj(e.default)&&e.default;i&&(e.loop=!1),o===!1&&(e.to=null),s===!1&&(e.from=null);let f=z.arr(o)||z.fun(o)?o:void 0;f?(e.to=void 0,e.onRest=void 0,p&&(p.onRest=void 0)):pe(Fn,P=>{let l=e[P];if(z.fun(l)){let h=t._events[P];e[P]=({finished:g,cancelled:x})=>{let S=h.get(l);S?(g||(S.finished=!1),x&&(S.cancelled=!0)):h.set(l,{value:null,finished:g||!1,cancelled:x||!1})},p&&(p[P]=e[P])}});let d=t._state;e.pause===!d.paused?(d.paused=e.pause,On(e.pause?d.pauseQueue:d.resumeQueue)):d.paused&&(e.pause=!0);let m=(r||Object.keys(t.springs)).map(P=>t.springs[P].start(e)),b=e.cancel===!0||ke(e,\"cancel\")===!0;(f||b&&d.asyncId)&&m.push(Me(++t._lastAsyncId,{props:e,state:d,actions:{pause:Ft,resume:Ft,start(P,l){b?(oe(d,t._lastAsyncId),l(q(t))):(P.onRest=a,l(De(f,P,d,t)))}}})),d.paused&&await new Promise(P=>{d.resumeQueue.add(P)});let c=be(t,await Promise.all(m));if(i&&c.finished&&!(n&&c.noop)){let P=at(e,i,o);if(P)return jt(t,[P]),wt(t,P,!0)}return u&&kt.batchedUpdates(()=>u(c,t,t.item)),c}function _e(t,e){let n={...t.springs};return e&&pe(Ve(e),r=>{z.und(r.keys)&&(r=Pe(r)),z.obj(r.to)||(r={...r,to:void 0}),Mt(n,r,o=>Lt(o))}),pt(t,n),n}function pt(t,e){Ut(e,(n,r)=>{t.springs[r]||(t.springs[r]=n,Et(n,t))})}function Lt(t,e){let n=new ue;return n.key=t,e&&Et(n,e),n}function Mt(t,e,n){e.keys&&pe(e.keys,r=>{(t[r]||(t[r]=n(r)))._prepareNode(e)})}function jt(t,e){pe(e,n=>{Mt(t.springs,n,r=>Lt(r,t))})}import*as Be from\"react\";import{useContext as Un}from\"react\";import{useMemoOne as En}from\"@react-spring/shared\";var H=({children:t,...e})=>{let n=Un(Ge),r=e.pause||!!n.pause,o=e.immediate||!!n.immediate;e=En(()=>({pause:r,immediate:o}),[r,o]);let{Provider:s}=Ge;return Be.createElement(s,{value:e},t)},Ge=wn(H,{});H.Provider=Ge.Provider;H.Consumer=Ge.Consumer;function wn(t,e){return Object.assign(t,Be.createContext(e)),t.Provider._context=t,t.Consumer._context=t,t}import{each as ce,is as Ke,deprecateDirectCall as Ln}from\"@react-spring/shared\";var fe=()=>{let t=[],e=function(r){Ln();let o=[];return ce(t,(s,i)=>{if(Ke.und(r))o.push(s.start());else{let a=n(r,s,i);a&&o.push(s.start(a))}}),o};e.current=t,e.add=function(r){t.includes(r)||t.push(r)},e.delete=function(r){let o=t.indexOf(r);~o&&t.splice(o,1)},e.pause=function(){return ce(t,r=>r.pause(...arguments)),this},e.resume=function(){return ce(t,r=>r.resume(...arguments)),this},e.set=function(r){ce(t,(o,s)=>{let i=Ke.fun(r)?r(s,o):r;i&&o.set(i)})},e.start=function(r){let o=[];return ce(t,(s,i)=>{if(Ke.und(r))o.push(s.start());else{let a=this._getProps(r,s,i);a&&o.push(s.start(a))}}),o},e.stop=function(){return ce(t,r=>r.stop(...arguments)),this},e.update=function(r){return ce(t,(o,s)=>o.update(this._getProps(r,o,s))),this};let n=function(r,o,s){return Ke.fun(r)?r(s,o):r};return e._getProps=n,e};function He(t,e,n){let r=jn.fun(e)&&e;r&&!n&&(n=[]);let o=Xe(()=>r||arguments.length==3?fe():void 0,[]),s=Nt(0),i=Dn(),a=Xe(()=>({ctrls:[],queue:[],flush(h,g){let x=_e(h,g);return s.current>0&&!a.queue.length&&!Object.keys(x).some(A=>!h.springs[A])?ze(h,g):new Promise(A=>{pt(h,x),a.queue.push(()=>{A(ze(h,g))}),i()})}}),[]),u=Nt([...a.ctrls]),p=[],f=Dt(t)||0;Xe(()=>{Ye(u.current.slice(t,f),h=>{xe(h,o),h.stop(!0)}),u.current.length=t,d(f,t)},[t]),Xe(()=>{d(0,Math.min(f,t))},n);function d(h,g){for(let x=h;x_e(h,p[g])),b=Mn(H),c=Dt(b),P=b!==c&&Ue(b);qn(()=>{s.current++,a.ctrls=u.current;let{queue:h}=a;h.length&&(a.queue=[],Ye(h,g=>g())),Ye(u.current,(g,x)=>{o?.add(g),P&&g.start({default:b});let S=p[x];S&&(he(g,S.ref),g.ref?g.queue.push(S):g.start(S))})}),Nn(()=>()=>{Ye(a.ctrls,h=>h.stop(!0))});let l=m.map(h=>({...h}));return o?[l,o]:l}function J(t,e){let n=Qn.fun(t),[[r],o]=He(1,n?t:[t],n?e||[]:e);return n||arguments.length==2?[r,o]:r}import{useState as zn}from\"react\";var Gn=()=>fe(),Xo=()=>zn(Gn)[0];import{useConstant as Bn,useOnce as Kn}from\"@react-spring/shared\";var Wo=(t,e)=>{let n=Bn(()=>new ue(t,e));return Kn(()=>()=>{n.stop()}),n};import{each as Xn,is as qt,useIsomorphicLayoutEffect as Yn}from\"@react-spring/shared\";function Qt(t,e,n){let r=qt.fun(e)&&e;r&&!n&&(n=[]);let o=!0,s,i=He(t,(a,u)=>{let p=r?r(a,u):e;return s=p.ref,o=o&&p.reverse,p},n||[{}]);if(Yn(()=>{Xn(i[1].current,(a,u)=>{let p=i[1].current[u+(o?1:-1)];if(he(a,s),a.ref){p&&a.update({to:p.springs});return}p?a.start({to:p.springs}):a.start()})},n),r||arguments.length==3){let a=s??i[1];return a._getProps=(u,p,f)=>{let d=qt.fun(u)?u(f,p):u;if(d){let m=a.current[f+(d.reverse?1:-1)];return m&&(d.to=m.springs),d}},i}return i[0]}import*as Oe from\"react\";import{useContext as Hn,useRef as lt,useMemo as Jn}from\"react\";import{is as G,toArray as zt,useForceUpdate as Wn,useOnce as $n,usePrev as Zn,each as j,useIsomorphicLayoutEffect as Je}from\"@react-spring/shared\";function Gt(t,e,n){let r=G.fun(e)&&e,{reset:o,sort:s,trail:i=0,expires:a=!0,exitBeforeEnter:u=!1,onDestroyed:p,ref:f,config:d}=r?r():e,m=Jn(()=>r||arguments.length==3?fe():void 0,[]),b=zt(t),c=[],P=lt(null),l=o?null:P.current;Je(()=>{P.current=c}),$n(()=>(j(c,y=>{m?.add(y.ctrl),y.ctrl.ref=m}),()=>{j(P.current,y=>{y.expired&&clearTimeout(y.expirationId),xe(y.ctrl,m),y.ctrl.stop(!0)})}));let h=tr(b,r?r():e,l),g=o&&P.current||[];Je(()=>j(g,({ctrl:y,item:T,key:F})=>{xe(y,m),I(p,T,F)}));let x=[];if(l&&j(l,(y,T)=>{y.expired?(clearTimeout(y.expirationId),g.push(y)):(T=x[T]=h.indexOf(y.key),~T&&(c[T]=y))}),j(b,(y,T)=>{c[T]||(c[T]={key:h[T],item:y,phase:\"mount\",ctrl:new le},c[T].ctrl.item=y)}),x.length){let y=-1,{leave:T}=r?r():e;j(x,(F,k)=>{let O=l[k];~F?(y=c.indexOf(O),c[y]={...O,item:b[F]}):T&&c.splice(++y,0,O)})}G.fun(s)&&c.sort((y,T)=>s(y.item,T.item));let S=-i,A=Wn(),V=ne(e),_=new Map,v=lt(new Map),w=lt(!1);j(c,(y,T)=>{let F=y.key,k=y.phase,O=r?r():e,U,D,Jt=I(O.delay||0,F);if(k==\"mount\")U=O.enter,D=\"enter\";else{let M=h.indexOf(F)<0;if(k!=\"leave\")if(M)U=O.leave,D=\"leave\";else if(U=O.update)D=\"update\";else return;else if(!M)U=O.enter,D=\"enter\";else return}if(U=I(U,y.item,T),U=G.obj(U)?de(U):{to:U},!U.config){let M=d||V.config;U.config=I(M,y.item,T,D)}S+=i;let Z={...V,delay:Jt+S,ref:f,immediate:O.immediate,reset:!1,...U};if(D==\"enter\"&&G.und(Z.from)){let M=r?r():e,Te=G.und(M.initial)||l?M.from:M.initial;Z.from=I(Te,y.item,T)}let{onResolve:Wt}=Z;Z.onResolve=M=>{I(Wt,M);let Te=P.current,B=Te.find(Fe=>Fe.key===F);if(B&&!(M.cancelled&&B.phase!=\"update\")&&B.ctrl.idle){let Fe=Te.every(ee=>ee.ctrl.idle);if(B.phase==\"leave\"){let ee=I(a,B.item);if(ee!==!1){let Ze=ee===!0?0:ee;if(B.expired=!0,!Fe&&Ze>0){Ze<=2147483647&&(B.expirationId=setTimeout(A,Ze));return}}}Fe&&Te.some(ee=>ee.expired)&&(v.current.delete(B),u&&(w.current=!0),A())}};let ft=_e(y.ctrl,Z);D===\"leave\"&&u?v.current.set(y,{phase:D,springs:ft,payload:Z}):_.set(y,{phase:D,springs:ft,payload:Z})});let C=Hn(H),$=Zn(C),L=C!==$&&Ue(C);Je(()=>{L&&j(c,y=>{y.ctrl.start({default:C})})},[C]),j(_,(y,T)=>{if(v.current.size){let F=c.findIndex(k=>k.key===T.key);c.splice(F,1)}}),Je(()=>{j(v.current.size?v.current:_,({phase:y,payload:T},F)=>{let{ctrl:k}=F;F.phase=y,m?.add(k),L&&y==\"enter\"&&k.start({default:C}),T&&(he(k,T.ref),(k.ref||m)&&!w.current?k.update(T):(k.start(T),w.current&&(w.current=!1)))})},o?void 0:n);let N=y=>Oe.createElement(Oe.Fragment,null,c.map((T,F)=>{let{springs:k}=_.get(T)||T.ctrl,O=y({...k},T.item,T,F);return O&&O.type?Oe.createElement(O.type,{...O.props,key:G.str(T.key)||G.num(T.key)?T.key:T.ctrl.id,ref:O.ref}):O}));return m?[N,m]:N}var er=1;function tr(t,{key:e,keys:n=e},r){if(n===null){let o=new Set;return t.map(s=>{let i=r&&r.find(a=>a.item===s&&a.phase!==\"leave\"&&!o.has(a));return i?(o.add(i),i.key):er++})}return G.und(n)?t:G.fun(n)?t.map(n):zt(n)}import{each as nr,onScroll as rr,useIsomorphicLayoutEffect as or}from\"@react-spring/shared\";var hs=({container:t,...e}={})=>{let[n,r]=J(()=>({scrollX:0,scrollY:0,scrollXProgress:0,scrollYProgress:0,...e}),[]);return or(()=>{let o=rr(({x:s,y:i})=>{r.start({scrollX:s.current,scrollXProgress:s.progress,scrollY:i.current,scrollYProgress:i.progress})},{container:t?.current||void 0});return()=>{nr(Object.values(n),s=>s.stop()),o()}},[]),n};import{onResize as sr,each as ir,useIsomorphicLayoutEffect as ar}from\"@react-spring/shared\";var Ps=({container:t,...e})=>{let[n,r]=J(()=>({width:0,height:0,...e}),[]);return ar(()=>{let o=sr(({width:s,height:i})=>{r.start({width:s,height:i,immediate:n.width.get()===0||n.height.get()===0})},{container:t?.current||void 0});return()=>{ir(Object.values(n),s=>s.stop()),o()}},[]),n};import{useRef as ur,useState as pr}from\"react\";import{is as Bt,useIsomorphicLayoutEffect as lr}from\"@react-spring/shared\";var cr={any:0,all:1};function Cs(t,e){let[n,r]=pr(!1),o=ur(),s=Bt.fun(t)&&t,i=s?s():{},{to:a={},from:u={},...p}=i,f=s?e:t,[d,m]=J(()=>({from:u,...p}),[]);return lr(()=>{let b=o.current,{root:c,once:P,amount:l=\"any\",...h}=f??{};if(!b||P&&n||typeof IntersectionObserver>\"u\")return;let g=new WeakMap,x=()=>(a&&m.start(a),r(!0),P?void 0:()=>{u&&m.start(u),r(!1)}),S=V=>{V.forEach(_=>{let v=g.get(_.target);if(_.isIntersecting!==!!v)if(_.isIntersecting){let w=x();Bt.fun(w)?g.set(_.target,w):A.unobserve(_.target)}else v&&(v(),g.delete(_.target))})},A=new IntersectionObserver(S,{root:c&&c.current||void 0,threshold:typeof l==\"number\"||Array.isArray(l)?l:cr[l],...h});return A.observe(b),()=>A.unobserve(b)},[f]),s?[o,d]:[o,n]}function qs({children:t,...e}){return t(J(e))}import{is as fr}from\"@react-spring/shared\";function Bs({items:t,children:e,...n}){let r=Qt(t.length,n);return t.map((o,s)=>{let i=e(o,s);return fr.fun(i)?i(r[s]):i})}function Ys({items:t,children:e,...n}){return Gt(t,n)(e)}import{deprecateInterpolate as Cr}from\"@react-spring/shared\";import{is as dr,raf as mr,each as $e,isEqual as hr,toArray as We,frameLoop as gr,getFluidValue as Kt,createInterpolator as yr,Globals as Sr,callFluidObservers as Pr,addFluidObserver as Tr,removeFluidObserver as xr,hasFluidValue as Xt}from\"@react-spring/shared\";import{getAnimated as br,setAnimated as Ar,getAnimatedType as Rr,getPayload as Ht}from\"@react-spring/animated\";var W=class extends X{constructor(n,r){super();this.source=n;this.calc=yr(...r);let o=this._get(),s=Rr(o);Ar(this,s.create(o))}key;idle=!0;calc;_active=new Set;advance(n){let r=this._get(),o=this.get();hr(r,o)||(br(this).setValue(r),this._onChange(r,this.idle)),!this.idle&&Yt(this._active)&&ct(this)}_get(){let n=dr.arr(this.source)?this.source.map(Kt):We(Kt(this.source));return this.calc(...n)}_start(){this.idle&&!Yt(this._active)&&(this.idle=!1,$e(Ht(this),n=>{n.done=!1}),Sr.skipAnimation?(mr.batchedUpdates(()=>this.advance()),ct(this)):gr.start(this))}_attach(){let n=1;$e(We(this.source),r=>{Xt(r)&&Tr(r,this),Re(r)&&(r.idle||this._active.add(r),n=Math.max(n,r.priority+1))}),this.priority=n,this._start()}_detach(){$e(We(this.source),n=>{Xt(n)&&xr(n,this)}),this._active.clear(),ct(this)}eventObserved(n){n.type==\"change\"?n.idle?this.advance():(this._active.add(n.parent),this._start()):n.type==\"idle\"?this._active.delete(n.parent):n.type==\"priority\"&&(this.priority=We(this.source).reduce((r,o)=>Math.max(r,(Re(o)?o.priority:0)+1),0))}};function vr(t){return t.idle!==!1}function Yt(t){return!t.size||Array.from(t).every(vr)}function ct(t){t.idle||(t.idle=!0,$e(Ht(t),e=>{e.done=!0}),Pr(t,{type:\"idle\",parent:t}))}var ui=(t,...e)=>new W(t,e),pi=(t,...e)=>(Cr(),new W(t,e));import{Globals as Ir,frameLoop as Vr,createStringInterpolator as _r}from\"@react-spring/shared\";Ir.assign({createStringInterpolator:_r,to:(t,e)=>new W(t,e)});var di=Vr.advance;import{createInterpolator as Ui,useIsomorphicLayoutEffect as Ei,useReducedMotion as wi,easings as Li}from\"@react-spring/shared\";export*from\"@react-spring/types\";export{Ae as BailSignal,le as Controller,X as FrameValue,Ir as Globals,W as Interpolation,qs as Spring,H as SpringContext,fe as SpringRef,ue as SpringValue,Bs as Trail,Ys as Transition,mt as config,Ui as createInterpolator,Li as easings,de as inferTo,pi as interpolate,ui as to,di as update,wr as useChain,Cs as useInView,Ei as useIsomorphicLayoutEffect,wi as useReducedMotion,Ps as useResize,hs as useScroll,J as useSpring,Xo as useSpringRef,Wo as useSpringValue,He as useSprings,Qt as useTrail,Gt as useTransition};\n","import{Globals as M}from\"@react-spring/core\";import{unstable_batchedUpdates as N}from\"react-dom\";import{createStringInterpolator as U,colors as D}from\"@react-spring/shared\";import{createHost as H}from\"@react-spring/animated\";var k=/^--/;function I(t,e){return e==null||typeof e==\"boolean\"||e===\"\"?\"\":typeof e==\"number\"&&e!==0&&!k.test(t)&&!(c.hasOwnProperty(t)&&c[t])?e+\"px\":(\"\"+e).trim()}var v={};function V(t,e){if(!t.nodeType||!t.setAttribute)return!1;let r=t.nodeName===\"filter\"||t.parentNode&&t.parentNode.nodeName===\"filter\",{style:i,children:s,scrollTop:u,scrollLeft:l,viewBox:a,...n}=e,d=Object.values(n),m=Object.keys(n).map(o=>r||t.hasAttribute(o)?o:v[o]||(v[o]=o.replace(/([A-Z])/g,p=>\"-\"+p.toLowerCase())));s!==void 0&&(t.textContent=s);for(let o in i)if(i.hasOwnProperty(o)){let p=I(o,i[o]);k.test(o)?t.style.setProperty(o,p):t.style[o]=p}m.forEach((o,p)=>{t.setAttribute(o,d[p])}),u!==void 0&&(t.scrollTop=u),l!==void 0&&(t.scrollLeft=l),a!==void 0&&t.setAttribute(\"viewBox\",a)}var c={animationIterationCount:!0,borderImageOutset:!0,borderImageSlice:!0,borderImageWidth:!0,boxFlex:!0,boxFlexGroup:!0,boxOrdinalGroup:!0,columnCount:!0,columns:!0,flex:!0,flexGrow:!0,flexPositive:!0,flexShrink:!0,flexNegative:!0,flexOrder:!0,gridRow:!0,gridRowEnd:!0,gridRowSpan:!0,gridRowStart:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnSpan:!0,gridColumnStart:!0,fontWeight:!0,lineClamp:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,tabSize:!0,widows:!0,zIndex:!0,zoom:!0,fillOpacity:!0,floodOpacity:!0,stopOpacity:!0,strokeDasharray:!0,strokeDashoffset:!0,strokeMiterlimit:!0,strokeOpacity:!0,strokeWidth:!0},F=(t,e)=>t+e.charAt(0).toUpperCase()+e.substring(1),L=[\"Webkit\",\"Ms\",\"Moz\",\"O\"];c=Object.keys(c).reduce((t,e)=>(L.forEach(r=>t[F(r,e)]=t[e]),t),c);import{AnimatedObject as S}from\"@react-spring/animated\";import{is as b,each as f,toArray as E,eachProp as P,FluidValue as T,getFluidValue as w,callFluidObservers as j,hasFluidValue as A,addFluidObserver as R,removeFluidObserver as W}from\"@react-spring/shared\";var _=/^(matrix|translate|scale|rotate|skew)/,$=/^(translate)/,G=/^(rotate|skew)/,y=(t,e)=>b.num(t)&&t!==0?t+e:t,h=(t,e)=>b.arr(t)?t.every(r=>h(r,e)):b.num(t)?t===e:parseFloat(t)===e,g=class extends S{constructor({x:e,y:r,z:i,...s}){let u=[],l=[];(e||r||i)&&(u.push([e||0,r||0,i||0]),l.push(a=>[`translate3d(${a.map(n=>y(n,\"px\")).join(\",\")})`,h(a,0)])),P(s,(a,n)=>{if(n===\"transform\")u.push([a||\"\"]),l.push(d=>[d,d===\"\"]);else if(_.test(n)){if(delete s[n],b.und(a))return;let d=$.test(n)?\"px\":G.test(n)?\"deg\":\"\";u.push(E(a)),l.push(n===\"rotate3d\"?([m,o,p,O])=>[`rotate3d(${m},${o},${p},${y(O,d)})`,h(O,0)]:m=>[`${n}(${m.map(o=>y(o,d)).join(\",\")})`,h(m,n.startsWith(\"scale\")?1:0)])}}),u.length&&(s.transform=new x(u,l)),super(s)}},x=class extends T{constructor(r,i){super();this.inputs=r;this.transforms=i}_value=null;get(){return this._value||(this._value=this._get())}_get(){let r=\"\",i=!0;return f(this.inputs,(s,u)=>{let l=w(s[0]),[a,n]=this.transforms[u](b.arr(l)?l:s.map(w));r+=\" \"+a,i=i&&n}),i?\"none\":r}observerAdded(r){r==1&&f(this.inputs,i=>f(i,s=>A(s)&&R(s,this)))}observerRemoved(r){r==0&&f(this.inputs,i=>f(i,s=>A(s)&&W(s,this)))}eventObserved(r){r.type==\"change\"&&(this._value=null),j(this,r)}};var C=[\"a\",\"abbr\",\"address\",\"area\",\"article\",\"aside\",\"audio\",\"b\",\"base\",\"bdi\",\"bdo\",\"big\",\"blockquote\",\"body\",\"br\",\"button\",\"canvas\",\"caption\",\"cite\",\"code\",\"col\",\"colgroup\",\"data\",\"datalist\",\"dd\",\"del\",\"details\",\"dfn\",\"dialog\",\"div\",\"dl\",\"dt\",\"em\",\"embed\",\"fieldset\",\"figcaption\",\"figure\",\"footer\",\"form\",\"h1\",\"h2\",\"h3\",\"h4\",\"h5\",\"h6\",\"head\",\"header\",\"hgroup\",\"hr\",\"html\",\"i\",\"iframe\",\"img\",\"input\",\"ins\",\"kbd\",\"keygen\",\"label\",\"legend\",\"li\",\"link\",\"main\",\"map\",\"mark\",\"menu\",\"menuitem\",\"meta\",\"meter\",\"nav\",\"noscript\",\"object\",\"ol\",\"optgroup\",\"option\",\"output\",\"p\",\"param\",\"picture\",\"pre\",\"progress\",\"q\",\"rp\",\"rt\",\"ruby\",\"s\",\"samp\",\"script\",\"section\",\"select\",\"small\",\"source\",\"span\",\"strong\",\"style\",\"sub\",\"summary\",\"sup\",\"table\",\"tbody\",\"td\",\"textarea\",\"tfoot\",\"th\",\"thead\",\"time\",\"title\",\"tr\",\"track\",\"u\",\"ul\",\"var\",\"video\",\"wbr\",\"circle\",\"clipPath\",\"defs\",\"ellipse\",\"foreignObject\",\"g\",\"image\",\"line\",\"linearGradient\",\"mask\",\"path\",\"pattern\",\"polygon\",\"polyline\",\"radialGradient\",\"rect\",\"stop\",\"svg\",\"text\",\"tspan\"];export*from\"@react-spring/core\";M.assign({batchedUpdates:N,createStringInterpolator:U,colors:D});var q=H(C,{applyAnimatedValues:V,createAnimatedStyle:t=>new g(t),getComponentProps:({scrollTop:t,scrollLeft:e,...r})=>r}),it=q.animated;export{it as a,it as animated};\n","import { useState, useEffect, useMemo, createElement } from 'react';\nimport { useSpring, animated } from 'react-spring';\n\nfunction _extends() {\n _extends = Object.assign || function (target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i];\n\n for (var key in source) {\n if (Object.prototype.hasOwnProperty.call(source, key)) {\n target[key] = source[key];\n }\n }\n }\n\n return target;\n };\n\n return _extends.apply(this, arguments);\n}\n\nfunction _objectWithoutPropertiesLoose(source, excluded) {\n if (source == null) return {};\n var target = {};\n var sourceKeys = Object.keys(source);\n var key, i;\n\n for (i = 0; i < sourceKeys.length; i++) {\n key = sourceKeys[i];\n if (excluded.indexOf(key) >= 0) continue;\n target[key] = source[key];\n }\n\n return target;\n}\n\nvar defaultProperties = {\n dark: {\n circle: {\n r: 9\n },\n mask: {\n cx: '50%',\n cy: '23%'\n },\n svg: {\n transform: 'rotate(40deg)'\n },\n lines: {\n opacity: 0\n }\n },\n light: {\n circle: {\n r: 5\n },\n mask: {\n cx: '100%',\n cy: '0%'\n },\n svg: {\n transform: 'rotate(90deg)'\n },\n lines: {\n opacity: 1\n }\n },\n springConfig: {\n mass: 4,\n tension: 250,\n friction: 35\n }\n};\nvar REACT_TOGGLE_DARK_MODE_GLOBAL_ID = 0;\nvar DarkModeSwitch = function DarkModeSwitch(_ref) {\n var onChange = _ref.onChange,\n _ref$checked = _ref.checked,\n checked = _ref$checked === void 0 ? false : _ref$checked,\n _ref$size = _ref.size,\n size = _ref$size === void 0 ? 24 : _ref$size,\n _ref$animationPropert = _ref.animationProperties,\n animationProperties = _ref$animationPropert === void 0 ? defaultProperties : _ref$animationPropert,\n _ref$moonColor = _ref.moonColor,\n moonColor = _ref$moonColor === void 0 ? 'white' : _ref$moonColor,\n _ref$sunColor = _ref.sunColor,\n sunColor = _ref$sunColor === void 0 ? 'black' : _ref$sunColor,\n style = _ref.style,\n rest = _objectWithoutPropertiesLoose(_ref, [\"onChange\", \"children\", \"checked\", \"size\", \"animationProperties\", \"moonColor\", \"sunColor\", \"style\"]);\n\n var _React$useState = useState(0),\n id = _React$useState[0],\n setId = _React$useState[1];\n\n useEffect(function () {\n REACT_TOGGLE_DARK_MODE_GLOBAL_ID += 1;\n setId(REACT_TOGGLE_DARK_MODE_GLOBAL_ID);\n }, [setId]);\n var properties = useMemo(function () {\n if (animationProperties !== defaultProperties) {\n return Object.assign(defaultProperties, animationProperties);\n }\n\n return animationProperties;\n }, [animationProperties]);\n var _properties = properties[checked ? 'dark' : 'light'],\n circle = _properties.circle,\n svg = _properties.svg,\n lines = _properties.lines,\n mask = _properties.mask;\n var svgContainerProps = useSpring(_extends({}, svg, {\n config: animationProperties.springConfig\n }));\n var centerCircleProps = useSpring(_extends({}, circle, {\n config: animationProperties.springConfig\n }));\n var maskedCircleProps = useSpring(_extends({}, mask, {\n config: animationProperties.springConfig\n }));\n var linesProps = useSpring(_extends({}, lines, {\n config: animationProperties.springConfig\n }));\n\n var toggle = function toggle() {\n return onChange(!checked);\n };\n\n var uniqueMaskId = \"circle-mask-\" + id;\n return createElement(animated.svg, Object.assign({\n xmlns: \"http://www.w3.org/2000/svg\",\n width: size,\n height: size,\n viewBox: \"0 0 24 24\",\n color: checked ? moonColor : sunColor,\n fill: \"none\",\n strokeWidth: \"2\",\n strokeLinecap: \"round\",\n strokeLinejoin: \"round\",\n stroke: \"currentColor\",\n onClick: toggle,\n style: _extends({\n cursor: 'pointer'\n }, svgContainerProps, style)\n }, rest), createElement(\"mask\", {\n id: uniqueMaskId\n }, createElement(\"rect\", {\n x: \"0\",\n y: \"0\",\n width: \"100%\",\n height: \"100%\",\n fill: \"white\"\n }), createElement(animated.circle // @ts-ignore\n , {\n // @ts-ignore\n style: maskedCircleProps,\n r: \"9\",\n fill: \"black\"\n })), createElement(animated.circle, {\n cx: \"12\",\n cy: \"12\",\n fill: checked ? moonColor : sunColor,\n // @ts-ignore\n style: centerCircleProps,\n mask: \"url(#\" + uniqueMaskId + \")\"\n }), createElement(animated.g, {\n stroke: \"currentColor\",\n style: linesProps\n }, createElement(\"line\", {\n x1: \"12\",\n y1: \"1\",\n x2: \"12\",\n y2: \"3\"\n }), createElement(\"line\", {\n x1: \"12\",\n y1: \"21\",\n x2: \"12\",\n y2: \"23\"\n }), createElement(\"line\", {\n x1: \"4.22\",\n y1: \"4.22\",\n x2: \"5.64\",\n y2: \"5.64\"\n }), createElement(\"line\", {\n x1: \"18.36\",\n y1: \"18.36\",\n x2: \"19.78\",\n y2: \"19.78\"\n }), createElement(\"line\", {\n x1: \"1\",\n y1: \"12\",\n x2: \"3\",\n y2: \"12\"\n }), createElement(\"line\", {\n x1: \"21\",\n y1: \"12\",\n x2: \"23\",\n y2: \"12\"\n }), createElement(\"line\", {\n x1: \"4.22\",\n y1: \"19.78\",\n x2: \"5.64\",\n y2: \"18.36\"\n }), createElement(\"line\", {\n x1: \"18.36\",\n y1: \"5.64\",\n x2: \"19.78\",\n y2: \"4.22\"\n })));\n};\n\nexport { DarkModeSwitch, defaultProperties };\n//# sourceMappingURL=react-toggle-dark-mode.esm.js.map\n","import React, { FunctionComponent } from 'react'\nimport styled from '@emotion/styled'\n// import { IGatsbyImageData } from 'gatsby-plugin-image'\nimport { toast, ToastContainer } from 'react-toastify'\nimport 'react-toastify/dist/ReactToastify.css'\nimport { useTheme } from '@skagami/gatsby-plugin-dark-mode'\nimport { DarkModeSwitch } from 'react-toggle-dark-mode'\nimport { useRecoilState } from 'recoil'\nimport { themeState } from '../../recoil/recoil'\n\n\n// type IntroductionProps = {\n// profileImage: IGatsbyImageData\n// }\n\nconst HeaderCon = styled.div`\n height: 4rem;\n width: 100%;\n display: flex;\n align-items: center;\n justify-content: center;\n`\n\nconst Header = styled.div`\n width: 100%;\n max-width: 1728px;\n display: flex;\n justify-content: space-between;\n height: 100%;\n align-items: center;\n\n @media (max-width: 1919px) {\n max-width: 1376px;\n }\n\n @media (max-width: 1440px) {\n max-width: 1024px;\n }\n\n @media (max-width: 1056px) {\n max-width: calc(100% - 2rem);\n }\n`\n\nconst Logo = styled.a`\n @import url('https://fonts.googleapis.com/css2?family=Fira+Mono&display=swap');\n font-family: 'Fira Mono', monospace;\n font-weight: 450;\n font-size: 1.5rem;\n`\n\nconst Nav = styled.div`\n width: auto;\n display: flex;\n align-items: center;\n height: 100%;\n gap: 15px;\n @media (max-width: 1056px) {\n max-width: 153px;\n gap: 2px;\n }\n`\nconst Dark = styled.div`\n display: flex;\n justify-content: center;\n align-items: center;\n width: 2.5rem;\n height: 2.5rem;\n border: none;\n outline: none;\n border-radius: 50%;\n cursor: pointer;\n :hover {\n background-color: var(--darkhover);\n transition: all 0.125s ease-in 0s;\n }\n\n @media (max-width: 1056px) {\n width: 2.8rem;\n height: 2rem;\n }\n`\n\nconst Search = styled.div`\n display: flex;\n justify-content: center;\n align-items: center;\n width: 2.5rem;\n height: 2.5rem;\n border: none;\n outline: none;\n border-radius: 50%;\n cursor: pointer;\n :hover {\n background-color: var(--darkhover);\n transition: all 0.125s ease-in 0s;\n }\n @media (max-width: 1056px) {\n width: 2rem;\n height: 2rem;\n }\n`\n\nconst About = styled.button`\n padding-left: 1rem;\n padding-right: 1rem;\n height: 2rem;\n font-size: 1rem;\n border-radius: 1rem;\n border: 1px solid var(--bg-element5);\n color: var(--bg-element5);\n font-weight: 600;\n outline: none;\n background-color: var(--bg-element2);\n cursor: pointer;\n :hover {\n background-color: black;\n transition: all 0.125s ease-in 0s;\n color: white;\n }\n`\n\nconst Introduction: FunctionComponent = function ({}) {\n const notify = () => toast('준비중입니다.')\n const [theme, toggleTheme] = useTheme()\n\n const [isDarkMode, setDarkMode] = React.useState(true)\n\n const toggleDarkMode = (checked: boolean) => {\n setDarkMode(checked)\n }\n\n const [globalTheme, setGlobalTheme] = useRecoilState(themeState)\n React.useEffect(() => {\n setGlobalTheme(theme === 'light' ? 'light' : 'dark')\n }, [theme, setGlobalTheme])\n\n return (\n \n
\n minlog\n \n
\n
\n )\n}\n\nexport default Introduction\n","import { atom } from 'recoil'\n\nexport const selectedCategoryState = atom({\n key: 'selectedCategoryState',\n default: 'All',\n})\n\nexport const categoryListState = atom({\n key: 'categoryListState',\n default: {},\n})\n\nexport const categoryState = atom({\n key: 'categoryState',\n default: 'close',\n})\n\nexport const activeTabState = atom({\n key: 'activeTabState',\n default: '트렌딩',\n})\n\nexport const themeState = atom<'light' | 'dark'>({\n key: 'themeState',\n default: 'light',\n})\n\n","function r(e){var t,f,n=\"\";if(\"string\"==typeof e||\"number\"==typeof e)n+=e;else if(\"object\"==typeof e)if(Array.isArray(e))for(t=0;t\"number\"==typeof t&&!isNaN(t),d=t=>\"string\"==typeof t,p=t=>\"function\"==typeof t,m=t=>d(t)||p(t)?t:null,f=t=>e(t)||d(t)||p(t)||u(t);function g(t,e,n){void 0===n&&(n=300);const{scrollHeight:o,style:s}=t;requestAnimationFrame(()=>{s.minHeight=\"initial\",s.height=o+\"px\",s.transition=`all ${n}ms`,requestAnimationFrame(()=>{s.height=\"0\",s.padding=\"0\",s.margin=\"0\",setTimeout(e,n)})})}function h(e){let{enter:a,exit:r,appendPosition:i=!1,collapse:l=!0,collapseDuration:c=300}=e;return function(e){let{children:u,position:d,preventExitTransition:p,done:m,nodeRef:f,isIn:h}=e;const y=i?`${a}--${d}`:a,v=i?`${r}--${d}`:r,T=n(0);return o(()=>{const t=f.current,e=y.split(\" \"),n=o=>{o.target===f.current&&(t.dispatchEvent(new Event(\"d\")),t.removeEventListener(\"animationend\",n),t.removeEventListener(\"animationcancel\",n),0===T.current&&\"animationcancel\"!==o.type&&t.classList.remove(...e))};t.classList.add(...e),t.addEventListener(\"animationend\",n),t.addEventListener(\"animationcancel\",n)},[]),s(()=>{const t=f.current,e=()=>{t.removeEventListener(\"animationend\",e),l?g(t,m,c):m()};h||(p?e():(T.current=1,t.className+=` ${v}`,t.addEventListener(\"animationend\",e)))},[h]),t.createElement(t.Fragment,null,u)}}function y(t,e){return{content:t.content,containerId:t.props.containerId,id:t.props.toastId,theme:t.props.theme,type:t.props.type,data:t.props.data||{},isLoading:t.props.isLoading,icon:t.props.icon,status:e}}const v={list:new Map,emitQueue:new Map,on(t,e){return this.list.has(t)||this.list.set(t,[]),this.list.get(t).push(e),this},off(t,e){if(e){const n=this.list.get(t).filter(t=>t!==e);return this.list.set(t,n),this}return this.list.delete(t),this},cancelEmit(t){const e=this.emitQueue.get(t);return e&&(e.forEach(clearTimeout),this.emitQueue.delete(t)),this},emit(t){this.list.has(t)&&this.list.get(t).forEach(e=>{const n=setTimeout(()=>{e(...[].slice.call(arguments,1))},0);this.emitQueue.has(t)||this.emitQueue.set(t,[]),this.emitQueue.get(t).push(n)})}},T=e=>{let{theme:n,type:o,...s}=e;return t.createElement(\"svg\",{viewBox:\"0 0 24 24\",width:\"100%\",height:\"100%\",fill:\"colored\"===n?\"currentColor\":`var(--toastify-icon-color-${o})`,...s})},E={info:function(e){return t.createElement(T,{...e},t.createElement(\"path\",{d:\"M12 0a12 12 0 1012 12A12.013 12.013 0 0012 0zm.25 5a1.5 1.5 0 11-1.5 1.5 1.5 1.5 0 011.5-1.5zm2.25 13.5h-4a1 1 0 010-2h.75a.25.25 0 00.25-.25v-4.5a.25.25 0 00-.25-.25h-.75a1 1 0 010-2h1a2 2 0 012 2v4.75a.25.25 0 00.25.25h.75a1 1 0 110 2z\"}))},warning:function(e){return t.createElement(T,{...e},t.createElement(\"path\",{d:\"M23.32 17.191L15.438 2.184C14.728.833 13.416 0 11.996 0c-1.42 0-2.733.833-3.443 2.184L.533 17.448a4.744 4.744 0 000 4.368C1.243 23.167 2.555 24 3.975 24h16.05C22.22 24 24 22.044 24 19.632c0-.904-.251-1.746-.68-2.44zm-9.622 1.46c0 1.033-.724 1.823-1.698 1.823s-1.698-.79-1.698-1.822v-.043c0-1.028.724-1.822 1.698-1.822s1.698.79 1.698 1.822v.043zm.039-12.285l-.84 8.06c-.057.581-.408.943-.897.943-.49 0-.84-.367-.896-.942l-.84-8.065c-.057-.624.25-1.095.779-1.095h1.91c.528.005.84.476.784 1.1z\"}))},success:function(e){return t.createElement(T,{...e},t.createElement(\"path\",{d:\"M12 0a12 12 0 1012 12A12.014 12.014 0 0012 0zm6.927 8.2l-6.845 9.289a1.011 1.011 0 01-1.43.188l-4.888-3.908a1 1 0 111.25-1.562l4.076 3.261 6.227-8.451a1 1 0 111.61 1.183z\"}))},error:function(e){return t.createElement(T,{...e},t.createElement(\"path\",{d:\"M11.983 0a12.206 12.206 0 00-8.51 3.653A11.8 11.8 0 000 12.207 11.779 11.779 0 0011.8 24h.214A12.111 12.111 0 0024 11.791 11.766 11.766 0 0011.983 0zM10.5 16.542a1.476 1.476 0 011.449-1.53h.027a1.527 1.527 0 011.523 1.47 1.475 1.475 0 01-1.449 1.53h-.027a1.529 1.529 0 01-1.523-1.47zM11 12.5v-6a1 1 0 012 0v6a1 1 0 11-2 0z\"}))},spinner:function(){return t.createElement(\"div\",{className:\"Toastify__spinner\"})}};function C(t){const[,o]=r(t=>t+1,0),[l,c]=i([]),g=n(null),h=n(new Map).current,T=t=>-1!==l.indexOf(t),C=n({toastKey:1,displayedToast:0,count:0,queue:[],props:t,containerId:null,isToastActive:T,getToast:t=>h.get(t)}).current;function b(t){let{containerId:e}=t;const{limit:n}=C.props;!n||e&&C.containerId!==e||(C.count-=C.queue.length,C.queue=[])}function I(t){c(e=>null==t?[]:e.filter(e=>e!==t))}function _(){const{toastContent:t,toastProps:e,staleId:n}=C.queue.shift();O(t,e,n)}function L(t,n){let{delay:s,staleId:r,...i}=n;if(!f(t)||function(t){return!g.current||C.props.enableMultiContainer&&t.containerId!==C.props.containerId||h.has(t.toastId)&&null==t.updateId}(i))return;const{toastId:l,updateId:c,data:T}=i,{props:b}=C,L=()=>I(l),N=null==c;N&&C.count++;const M={...b,style:b.toastStyle,key:C.toastKey++,...Object.fromEntries(Object.entries(i).filter(t=>{let[e,n]=t;return null!=n})),toastId:l,updateId:c,data:T,closeToast:L,isIn:!1,className:m(i.className||b.toastClassName),bodyClassName:m(i.bodyClassName||b.bodyClassName),progressClassName:m(i.progressClassName||b.progressClassName),autoClose:!i.isLoading&&(R=i.autoClose,w=b.autoClose,!1===R||u(R)&&R>0?R:w),deleteToast(){const t=y(h.get(l),\"removed\");h.delete(l),v.emit(4,t);const e=C.queue.length;if(C.count=null==l?C.count-C.displayedToast:C.count-1,C.count<0&&(C.count=0),e>0){const t=null==l?C.props.limit:1;if(1===e||1===t)C.displayedToast++,_();else{const n=t>e?e:t;C.displayedToast=n;for(let t=0;tt in E)(o)&&(i=E[o](l))),i}(M),p(i.onOpen)&&(M.onOpen=i.onOpen),p(i.onClose)&&(M.onClose=i.onClose),M.closeButton=b.closeButton,!1===i.closeButton||f(i.closeButton)?M.closeButton=i.closeButton:!0===i.closeButton&&(M.closeButton=!f(b.closeButton)||b.closeButton);let x=t;e(t)&&!d(t.type)?x=a(t,{closeToast:L,toastProps:M,data:T}):p(t)&&(x=t({closeToast:L,toastProps:M,data:T})),b.limit&&b.limit>0&&C.count>b.limit&&N?C.queue.push({toastContent:x,toastProps:M,staleId:r}):u(s)?setTimeout(()=>{O(x,M,r)},s):O(x,M,r)}function O(t,e,n){const{toastId:o}=e;n&&h.delete(n);const s={content:t,props:e};h.set(o,s),c(t=>[...t,o].filter(t=>t!==n)),v.emit(4,y(s,null==s.props.updateId?\"added\":\"updated\"))}return s(()=>(C.containerId=t.containerId,v.cancelEmit(3).on(0,L).on(1,t=>g.current&&I(t)).on(5,b).emit(2,C),()=>{h.clear(),v.emit(3,C)}),[]),s(()=>{C.props=t,C.isToastActive=T,C.displayedToast=l.length}),{getToastToRender:function(e){const n=new Map,o=Array.from(h.values());return t.newestOnTop&&o.reverse(),o.forEach(t=>{const{position:e}=t.props;n.has(e)||n.set(e,[]),n.get(e).push(t)}),Array.from(n,t=>e(t[0],t[1]))},containerRef:g,isToastActive:T}}function b(t){return t.targetTouches&&t.targetTouches.length>=1?t.targetTouches[0].clientX:t.clientX}function I(t){return t.targetTouches&&t.targetTouches.length>=1?t.targetTouches[0].clientY:t.clientY}function _(t){const[o,a]=i(!1),[r,l]=i(!1),c=n(null),u=n({start:0,x:0,y:0,delta:0,removalDistance:0,canCloseOnClick:!0,canDrag:!1,boundingRect:null,didMove:!1}).current,d=n(t),{autoClose:m,pauseOnHover:f,closeToast:g,onClick:h,closeOnClick:y}=t;function v(e){if(t.draggable){\"touchstart\"===e.nativeEvent.type&&e.nativeEvent.preventDefault(),u.didMove=!1,document.addEventListener(\"mousemove\",_),document.addEventListener(\"mouseup\",L),document.addEventListener(\"touchmove\",_),document.addEventListener(\"touchend\",L);const n=c.current;u.canCloseOnClick=!0,u.canDrag=!0,u.boundingRect=n.getBoundingClientRect(),n.style.transition=\"\",u.x=b(e.nativeEvent),u.y=I(e.nativeEvent),\"x\"===t.draggableDirection?(u.start=u.x,u.removalDistance=n.offsetWidth*(t.draggablePercent/100)):(u.start=u.y,u.removalDistance=n.offsetHeight*(80===t.draggablePercent?1.5*t.draggablePercent:t.draggablePercent/100))}}function T(e){if(u.boundingRect){const{top:n,bottom:o,left:s,right:a}=u.boundingRect;\"touchend\"!==e.nativeEvent.type&&t.pauseOnHover&&u.x>=s&&u.x<=a&&u.y>=n&&u.y<=o?C():E()}}function E(){a(!0)}function C(){a(!1)}function _(e){const n=c.current;u.canDrag&&n&&(u.didMove=!0,o&&C(),u.x=b(e),u.y=I(e),u.delta=\"x\"===t.draggableDirection?u.x-u.start:u.y-u.start,u.start!==u.x&&(u.canCloseOnClick=!1),n.style.transform=`translate${t.draggableDirection}(${u.delta}px)`,n.style.opacity=\"\"+(1-Math.abs(u.delta/u.removalDistance)))}function L(){document.removeEventListener(\"mousemove\",_),document.removeEventListener(\"mouseup\",L),document.removeEventListener(\"touchmove\",_),document.removeEventListener(\"touchend\",L);const e=c.current;if(u.canDrag&&u.didMove&&e){if(u.canDrag=!1,Math.abs(u.delta)>u.removalDistance)return l(!0),void t.closeToast();e.style.transition=\"transform 0.2s, opacity 0.2s\",e.style.transform=`translate${t.draggableDirection}(0)`,e.style.opacity=\"1\"}}s(()=>{d.current=t}),s(()=>(c.current&&c.current.addEventListener(\"d\",E,{once:!0}),p(t.onOpen)&&t.onOpen(e(t.children)&&t.children.props),()=>{const t=d.current;p(t.onClose)&&t.onClose(e(t.children)&&t.children.props)}),[]),s(()=>(t.pauseOnFocusLoss&&(document.hasFocus()||C(),window.addEventListener(\"focus\",E),window.addEventListener(\"blur\",C)),()=>{t.pauseOnFocusLoss&&(window.removeEventListener(\"focus\",E),window.removeEventListener(\"blur\",C))}),[t.pauseOnFocusLoss]);const O={onMouseDown:v,onTouchStart:v,onMouseUp:T,onTouchEnd:T};return m&&f&&(O.onMouseEnter=C,O.onMouseLeave=E),y&&(O.onClick=t=>{h&&h(t),u.canCloseOnClick&&g()}),{playToast:E,pauseToast:C,isRunning:o,preventExitTransition:r,toastRef:c,eventHandlers:O}}function L(e){let{closeToast:n,theme:o,ariaLabel:s=\"close\"}=e;return t.createElement(\"button\",{className:`Toastify__close-button Toastify__close-button--${o}`,type:\"button\",onClick:t=>{t.stopPropagation(),n(t)},\"aria-label\":s},t.createElement(\"svg\",{\"aria-hidden\":\"true\",viewBox:\"0 0 14 16\"},t.createElement(\"path\",{fillRule:\"evenodd\",d:\"M7.71 8.23l3.75 3.75-1.48 1.48-3.75-3.75-3.75 3.75L1 11.98l3.75-3.75L1 4.48 2.48 3l3.75 3.75L9.98 3l1.48 1.48-3.75 3.75z\"})))}function O(e){let{delay:n,isRunning:o,closeToast:s,type:a=\"default\",hide:r,className:i,style:l,controlledProgress:u,progress:d,rtl:m,isIn:f,theme:g}=e;const h=r||u&&0===d,y={...l,animationDuration:`${n}ms`,animationPlayState:o?\"running\":\"paused\",opacity:h?0:1};u&&(y.transform=`scaleX(${d})`);const v=c(\"Toastify__progress-bar\",u?\"Toastify__progress-bar--controlled\":\"Toastify__progress-bar--animated\",`Toastify__progress-bar-theme--${g}`,`Toastify__progress-bar--${a}`,{\"Toastify__progress-bar--rtl\":m}),T=p(i)?i({rtl:m,type:a,defaultClassName:v}):c(v,i);return t.createElement(\"div\",{role:\"progressbar\",\"aria-hidden\":h?\"true\":\"false\",\"aria-label\":\"notification timer\",className:T,style:y,[u&&d>=1?\"onTransitionEnd\":\"onAnimationEnd\"]:u&&d<1?null:()=>{f&&s()}})}const N=n=>{const{isRunning:o,preventExitTransition:s,toastRef:r,eventHandlers:i}=_(n),{closeButton:l,children:u,autoClose:d,onClick:m,type:f,hideProgressBar:g,closeToast:h,transition:y,position:v,className:T,style:E,bodyClassName:C,bodyStyle:b,progressClassName:I,progressStyle:N,updateId:M,role:R,progress:w,rtl:x,toastId:$,deleteToast:k,isIn:P,isLoading:B,iconOut:D,closeOnClick:A,theme:z}=n,F=c(\"Toastify__toast\",`Toastify__toast-theme--${z}`,`Toastify__toast--${f}`,{\"Toastify__toast--rtl\":x},{\"Toastify__toast--close-on-click\":A}),H=p(T)?T({rtl:x,position:v,type:f,defaultClassName:F}):c(F,T),S=!!w||!d,q={closeToast:h,type:f,theme:z};let Q=null;return!1===l||(Q=p(l)?l(q):e(l)?a(l,q):L(q)),t.createElement(y,{isIn:P,done:k,position:v,preventExitTransition:s,nodeRef:r},t.createElement(\"div\",{id:$,onClick:m,className:H,...i,style:E,ref:r},t.createElement(\"div\",{...P&&{role:R},className:p(C)?C({type:f}):c(\"Toastify__toast-body\",C),style:b},null!=D&&t.createElement(\"div\",{className:c(\"Toastify__toast-icon\",{\"Toastify--animate-icon Toastify__zoom-enter\":!B})},D),t.createElement(\"div\",null,u)),Q,t.createElement(O,{...M&&!S?{key:`pb-${M}`}:{},rtl:x,theme:z,delay:d,isRunning:o,isIn:P,closeToast:h,hide:g,type:f,style:N,className:I,controlledProgress:S,progress:w||0})))},M=function(t,e){return void 0===e&&(e=!1),{enter:`Toastify--animate Toastify__${t}-enter`,exit:`Toastify--animate Toastify__${t}-exit`,appendPosition:e}},R=h(M(\"bounce\",!0)),w=h(M(\"slide\",!0)),x=h(M(\"zoom\")),$=h(M(\"flip\")),k=l((e,n)=>{const{getToastToRender:o,containerRef:a,isToastActive:r}=C(e),{className:i,style:l,rtl:u,containerId:d}=e;function f(t){const e=c(\"Toastify__toast-container\",`Toastify__toast-container--${t}`,{\"Toastify__toast-container--rtl\":u});return p(i)?i({position:t,rtl:u,defaultClassName:e}):c(e,m(i))}return s(()=>{n&&(n.current=a.current)},[]),t.createElement(\"div\",{ref:a,className:\"Toastify\",id:d},o((e,n)=>{const o=n.length?{...l}:{...l,pointerEvents:\"none\"};return t.createElement(\"div\",{className:f(e),style:o,key:`container-${e}`},n.map((e,o)=>{let{content:s,props:a}=e;return t.createElement(N,{...a,isIn:r(a.toastId),style:{...a.style,\"--nth\":o+1,\"--len\":n.length},key:`toast-${a.key}`},s)}))}))});k.displayName=\"ToastContainer\",k.defaultProps={position:\"top-right\",transition:R,autoClose:5e3,closeButton:L,pauseOnHover:!0,pauseOnFocusLoss:!0,closeOnClick:!0,draggable:!0,draggablePercent:80,draggableDirection:\"x\",role:\"alert\",theme:\"light\"};let P,B=new Map,D=[],A=1;function z(){return\"\"+A++}function F(t){return t&&(d(t.toastId)||u(t.toastId))?t.toastId:z()}function H(t,e){return B.size>0?v.emit(0,t,e):D.push({content:t,options:e}),e.toastId}function S(t,e){return{...e,type:e&&e.type||t,toastId:F(e)}}function q(t){return(e,n)=>H(e,S(t,n))}function Q(t,e){return H(t,S(\"default\",e))}Q.loading=(t,e)=>H(t,S(\"default\",{isLoading:!0,autoClose:!1,closeOnClick:!1,closeButton:!1,draggable:!1,...e})),Q.promise=function(t,e,n){let o,{pending:s,error:a,success:r}=e;s&&(o=d(s)?Q.loading(s,n):Q.loading(s.render,{...n,...s}));const i={isLoading:null,autoClose:null,closeOnClick:null,closeButton:null,draggable:null},l=(t,e,s)=>{if(null==e)return void Q.dismiss(o);const a={type:t,...i,...n,data:s},r=d(e)?{render:e}:e;return o?Q.update(o,{...a,...r}):Q(r.render,{...a,...r}),s},c=p(t)?t():t;return c.then(t=>l(\"success\",r,t)).catch(t=>l(\"error\",a,t)),c},Q.success=q(\"success\"),Q.info=q(\"info\"),Q.error=q(\"error\"),Q.warning=q(\"warning\"),Q.warn=Q.warning,Q.dark=(t,e)=>H(t,S(\"default\",{theme:\"dark\",...e})),Q.dismiss=t=>{B.size>0?v.emit(1,t):D=D.filter(e=>null!=t&&e.options.toastId!==t)},Q.clearWaitingQueue=function(t){return void 0===t&&(t={}),v.emit(5,t)},Q.isActive=t=>{let e=!1;return B.forEach(n=>{n.isToastActive&&n.isToastActive(t)&&(e=!0)}),e},Q.update=function(t,e){void 0===e&&(e={}),setTimeout(()=>{const n=function(t,e){let{containerId:n}=e;const o=B.get(n||P);return o&&o.getToast(t)}(t,e);if(n){const{props:o,content:s}=n,a={delay:100,...o,...e,toastId:e.toastId||t,updateId:z()};a.toastId!==t&&(a.staleId=t);const r=a.render||s;delete a.render,H(r,a)}},0)},Q.done=t=>{Q.update(t,{progress:1})},Q.onChange=t=>(v.on(4,t),()=>{v.off(4,t)}),Q.POSITION={TOP_LEFT:\"top-left\",TOP_RIGHT:\"top-right\",TOP_CENTER:\"top-center\",BOTTOM_LEFT:\"bottom-left\",BOTTOM_RIGHT:\"bottom-right\",BOTTOM_CENTER:\"bottom-center\"},Q.TYPE={INFO:\"info\",SUCCESS:\"success\",WARNING:\"warning\",ERROR:\"error\",DEFAULT:\"default\"},v.on(2,t=>{P=t.containerId||t,B.set(P,t),D.forEach(t=>{v.emit(0,t.content,t.options)}),D=[]}).on(3,t=>{B.delete(t.containerId||t),0===B.size&&v.off(0).off(1).off(5)});export{R as Bounce,$ as Flip,E as Icons,w as Slide,k as ToastContainer,x as Zoom,g as collapseToast,h as cssTransition,Q as toast,_ as useToast,C as useToastContainer};\n//# sourceMappingURL=react-toastify.esm.mjs.map\n"],"names":["reactPropsRegex","prop","test","charCodeAt","testOmitPropsOnStringTag","testOmitPropsOnComponent","key","getDefaultShouldForwardProp","tag","composeShouldForwardProps","options","isReal","shouldForwardProp","optionsShouldForwardProp","__emotion_forwardProp","propName","Insertion","_ref","cache","serialized","isStringTag","createStyled","identifierName","targetClassName","__emotion_real","baseTag","__emotion_base","undefined","label","target","defaultShouldForwardProp","shouldUseAs","args","arguments","styles","__emotion_styles","slice","push","raw","apply","len","length","i","Styled","w","props","ref","FinalTag","as","className","classInterpolations","mergedProps","theme","useContext","T","registered","concat","name","finalShouldForwardProp","newProps","_key","createElement","Fragment","displayName","defaultProps","Object","defineProperty","value","withComponent","nextTag","nextOptions","exports","_themeToggler","require","useTheme","__esModule","_react","_useState","useState","window","__theme","currentTheme","setCurrentTheme","useEffect","__onThemeChange","useCallback","__setPreferredTheme","defaultStyle","___EmotionJSX","Global","f","r","e","c","m","write","d","onStart","h","onFrame","p","onFinish","setTimeout","t","a","now","o","F","findIndex","z","cancel","splice","u","s","time","handler","v","delete","sync","batchedUpdates","throttle","y","requestAnimationFrame","use","performance","Date","catch","console","error","frameLoop","advance","warn","x","l","add","b","Q","flush","Math","min","Set","has","size","forEach","ze","Y","get","enumerable","Le","assign","U","colors","createStringInterpolator","k","skipAnimation","ee","to","J","willAdvance","arr","Array","isArray","obj","constructor","fun","str","num","und","bt","Ve","xt","n","call","hasOwnProperty","ht","Pe","from","clear","yt","navigator","userAgent","E","H","A","qe","idle","start","priority","$e","te","B","sort","indexOf","re","includes","Ge","M","C","join","oe","RegExp","fe","ae","ie","se","ue","le","ce","de","round","parseInt","pe","parseFloat","me","D","exec","be","W","range","output","extrapolate","extrapolateLeft","extrapolateRight","easing","He","Ue","map","P","L","xe","he","PI","ye","V","Lt","linear","easeInQuad","easeOutQuad","easeInOutQuad","pow","easeInCubic","easeOutCubic","easeInOutCubic","easeInQuart","easeOutQuart","easeInOutQuart","easeInQuint","easeOutQuint","easeInOutQuint","easeInSine","cos","easeOutSine","sin","easeInOutSine","easeInExpo","easeOutExpo","easeInOutExpo","easeInCirc","sqrt","easeOutCirc","easeInOutCirc","easeInBack","easeOutBack","easeInOutBack","easeInElastic","easeOutElastic","easeInOutElastic","easeInBounce","easeOutBounce","easeInOutBounce","steps","max","ne","floor","ceil","g","Symbol","for","Pt","ve","$t","eventObserved","je","this","Error","De","Ee","Gt","observerAdded","Qt","observerRemoved","_","writable","configurable","O","K","source","we","N","We","getComputedStyle","document","documentElement","getPropertyValue","trim","startsWith","Ke","Xt","keys","replace","match","Number","find","Z","Te","TypeError","Ne","_e","WeakMap","Ce","current","Mr","random","$r","ut","Ur","getPayload","payload","super","_value","lastPosition","done","elapsedTime","lastVelocity","v0","durationProgress","static","getValue","setValue","reset","_string","_toString","dependencies","_makePayload","_addToPayload","some","Boolean","create","prototype","isReactComponent","style","createAnimatedStyle","applyAnimatedValues","deps","update","S","$","getComponentProps","type","I","et","default","nn","rn","on","config","loop","pause","reverse","immediate","delay","onProps","onChange","onPause","onResume","onRest","onResolve","items","trail","expires","initial","enter","leave","children","onDestroyed","callId","parentId","sn","tt","tension","friction","mass","damping","clamp","decay","frequency","duration","state","actions","Promise","paused","resumeQueue","resume","timeouts","delayed","pauseQueue","cancelId","cancelled","every","noop","nt","finished","asyncTo","promise","asyncId","result","async","resolve","stop","bind","all","then","item","Sn","id","_priority","_onPriorityChange","interpolate","toJSON","_attach","_detach","_onChange","parent","st","rt","animation","changed","values","toValues","fromValues","velocity","restVelocity","precision","progress","bounce","queue","_state","_pendingCalls","_lastCallId","_lastToId","_memoizedDuration","goal","hasAnimated","isAnimating","isPaused","isDelayed","abs","exp","isNaN","_stop","set","_focus","_set","_update","finish","_onStart","_start","_prepareNode","_t","isFrozen","_resume","_merge","at","gt","_n","Vt","Ot","Fn","kn","springs","_flush","_initialProps","_lastAsyncId","_active","_changed","_started","_item","_events","Map","_onFrame","each","jt","wt","Mt","pt","inputs","it","Provider","_context","Consumer","_getProps","ctrls","calc","_get","Yt","ct","reduce","vr","animationIterationCount","borderImageOutset","borderImageSlice","borderImageWidth","boxFlex","boxFlexGroup","boxOrdinalGroup","columnCount","columns","flex","flexGrow","flexPositive","flexShrink","flexNegative","flexOrder","gridRow","gridRowEnd","gridRowSpan","gridRowStart","gridColumn","gridColumnEnd","gridColumnSpan","gridColumnStart","fontWeight","lineClamp","lineHeight","opacity","order","orphans","tabSize","widows","zIndex","zoom","fillOpacity","floodOpacity","stopOpacity","strokeDasharray","strokeDashoffset","strokeMiterlimit","strokeOpacity","strokeWidth","charAt","toUpperCase","substring","transform","transforms","transparent","aliceblue","antiquewhite","aqua","aquamarine","azure","beige","bisque","black","blanchedalmond","blue","blueviolet","brown","burlywood","burntsienna","cadetblue","chartreuse","chocolate","coral","cornflowerblue","cornsilk","crimson","cyan","darkblue","darkcyan","darkgoldenrod","darkgray","darkgreen","darkgrey","darkkhaki","darkmagenta","darkolivegreen","darkorange","darkorchid","darkred","darksalmon","darkseagreen","darkslateblue","darkslategray","darkslategrey","darkturquoise","darkviolet","deeppink","deepskyblue","dimgray","dimgrey","dodgerblue","firebrick","floralwhite","forestgreen","fuchsia","gainsboro","ghostwhite","gold","goldenrod","gray","green","greenyellow","grey","honeydew","hotpink","indianred","indigo","ivory","khaki","lavender","lavenderblush","lawngreen","lemonchiffon","lightblue","lightcoral","lightcyan","lightgoldenrodyellow","lightgray","lightgreen","lightgrey","lightpink","lightsalmon","lightseagreen","lightskyblue","lightslategray","lightslategrey","lightsteelblue","lightyellow","lime","limegreen","linen","magenta","maroon","mediumaquamarine","mediumblue","mediumorchid","mediumpurple","mediumseagreen","mediumslateblue","mediumspringgreen","mediumturquoise","mediumvioletred","midnightblue","mintcream","mistyrose","moccasin","navajowhite","navy","oldlace","olive","olivedrab","orange","orangered","orchid","palegoldenrod","palegreen","paleturquoise","palevioletred","papayawhip","peachpuff","peru","pink","plum","powderblue","purple","rebeccapurple","red","rosybrown","royalblue","saddlebrown","salmon","sandybrown","seagreen","seashell","sienna","silver","skyblue","slateblue","slategray","slategrey","snow","springgreen","steelblue","tan","teal","thistle","tomato","turquoise","violet","wheat","white","whitesmoke","yellow","yellowgreen","animated","nodeType","setAttribute","nodeName","parentNode","scrollTop","scrollLeft","viewBox","hasAttribute","toLowerCase","textContent","setProperty","_extends","defaultProperties","dark","circle","mask","cx","cy","svg","lines","light","springConfig","REACT_TOGGLE_DARK_MODE_GLOBAL_ID","DarkModeSwitch","_ref$checked","checked","_ref$size","_ref$animationPropert","animationProperties","_ref$moonColor","moonColor","_ref$sunColor","sunColor","rest","excluded","sourceKeys","_objectWithoutPropertiesLoose","_React$useState","setId","_properties","useMemo","svgContainerProps","centerCircleProps","maskedCircleProps","linesProps","uniqueMaskId","xmlns","width","height","color","fill","strokeLinecap","strokeLinejoin","stroke","onClick","cursor","x1","y1","x2","y2","HeaderCon","_styled","Header","Logo","Nav","Dark","Search","About","toggleTheme","isDarkMode","setDarkMode","React","toggleDarkMode","globalTheme","setGlobalTheme","useRecoilState","themeState","href","role","tabIndex","selectedCategoryState","atom","categoryListState","categoryState","activeTabState","exit","appendPosition","collapse","collapseDuration","position","preventExitTransition","nodeRef","isIn","split","dispatchEvent","Event","removeEventListener","classList","remove","addEventListener","scrollHeight","minHeight","transition","padding","margin","content","containerId","toastId","data","isLoading","icon","status","list","emitQueue","off","filter","cancelEmit","clearTimeout","emit","info","warning","success","spinner","toastKey","displayedToast","count","isToastActive","getToast","limit","toastContent","toastProps","staleId","shift","enableMultiContainer","updateId","toastStyle","fromEntries","entries","closeToast","toastClassName","bodyClassName","progressClassName","autoClose","R","deleteToast","iconOut","onOpen","onClose","closeButton","getToastToRender","newestOnTop","containerRef","targetTouches","clientX","clientY","delta","removalDistance","canCloseOnClick","canDrag","boundingRect","didMove","pauseOnHover","closeOnClick","draggable","nativeEvent","preventDefault","getBoundingClientRect","draggableDirection","offsetWidth","draggablePercent","offsetHeight","top","bottom","left","right","once","pauseOnFocusLoss","hasFocus","onMouseDown","onTouchStart","onMouseUp","onTouchEnd","onMouseEnter","onMouseLeave","playToast","pauseToast","isRunning","toastRef","eventHandlers","ariaLabel","stopPropagation","fillRule","hide","controlledProgress","rtl","animationDuration","animationPlayState","defaultClassName","hideProgressBar","bodyStyle","progressStyle","q","pointerEvents","loading","pending","render","dismiss","clearWaitingQueue","isActive","POSITION","TOP_LEFT","TOP_RIGHT","TOP_CENTER","BOTTOM_LEFT","BOTTOM_RIGHT","BOTTOM_CENTER","TYPE","INFO","SUCCESS","WARNING","ERROR","DEFAULT"],"sourceRoot":""} \ No newline at end of file diff --git "a/C\354\203\265 Class\354\231\200 Struct\354\260\250\354\235\264/index.html" "b/C\354\203\265 Class\354\231\200 Struct\354\260\250\354\235\264/index.html" index c6967c8..768cd30 100644 --- "a/C\354\203\265 Class\354\231\200 Struct\354\260\250\354\235\264/index.html" +++ "b/C\354\203\265 Class\354\231\200 Struct\354\260\250\354\235\264/index.html" @@ -101,7 +101,7 @@ setTheme(preferredTheme || (darkQuery.matches ? 'dark' : 'light')) }() -
minlog

C# Class와 Struct차이

2023.10.26·조회수:
0
thumbnail
 

Class와 Struct차이

+
minlog

C# Class와 Struct차이

2023.10.26·조회수:
0
thumbnail
 

Class와 Struct차이

사용하는 이유!

기존 C 언어에서는 Class 구분이 없이 Struct를 사용해서 기존 C와 호환성을 위해 Struct를 사용한다.

@@ -244,10 +244,10 @@

Struct는

하지만 스텍 메모리만 사용하자니 스텍 메모리는 제한이 있어 많이 사용할 경우 스텍오버플로우가 발생할 수 있으니 적절히 균형있게 사용하는게 좋다.

결론

Struct와 Class의 큰 차이는 상속에 대한 처리 및 그 사용성도 있지만 타입(값, 참조)에 따른 메모리 할당 방식의 차이가 가장 크다.

-

하지만 아직 언제 사용하면 좋을지 감은 잘 오지 않는다. 이것에 대해서는 조금 더 공부해야겠다.

+

하지만 아직 언제 사용하면 좋을지 감은 잘 오지 않는다. 이것에 대해서는 조금 더 공부해야겠다.

- \ No newline at end of file + \ No newline at end of file diff --git "a/DFS\354\231\200 BFS/index.html" "b/DFS\354\231\200 BFS/index.html" index 3bd2b4c..e460380 100644 --- "a/DFS\354\231\200 BFS/index.html" +++ "b/DFS\354\231\200 BFS/index.html" @@ -101,7 +101,7 @@ setTheme(preferredTheme || (darkQuery.matches ? 'dark' : 'light')) }() -
minlog

DFS와 BFS

2023.05.15·조회수:
0
thumbnail
 

DFS

+
minlog

DFS와 BFS

2023.05.15·조회수:
0
thumbnail
 

DFS

루트 노드(혹은 다른 임의의 노드)에서 시작해서 다음 분기(branch)로 넘어가기 전에 해당 분기를 완벽하게 탐색하고 넘어가는 방법. 넓게(wide) 탐색하기 전에 깊게(deep) 탐색한다.모든 노드를 방문 하고자 하는 경우에 이 방법을 사용한다. DFS가 BFS보다 좀 더 간단하다.단순 검색 속도 자체는 BFS에 비해서 느리다. 스택이나 재귀 함수를 통해서 구현할 수 있는데 재귀 함수가 구현이 간편하므로 대부분 재귀 함수로 구현한다.

@@ -351,10 +351,10 @@

마지막 정리@media (max-width: 768px){.css-hx9xpc{padding:0 20px;}}

+
- \ No newline at end of file + \ No newline at end of file diff --git "a/ESP32\353\241\234 \353\247\214\353\223\240 \354\212\244\353\247\210\355\212\270 \352\270\260\354\210\231\354\202\254 \354\213\234\354\212\244\355\205\234/index.html" "b/ESP32\353\241\234 \353\247\214\353\223\240 \354\212\244\353\247\210\355\212\270 \352\270\260\354\210\231\354\202\254 \354\213\234\354\212\244\355\205\234/index.html" index b6133ef..25c690d 100644 --- "a/ESP32\353\241\234 \353\247\214\353\223\240 \354\212\244\353\247\210\355\212\270 \352\270\260\354\210\231\354\202\254 \354\213\234\354\212\244\355\205\234/index.html" +++ "b/ESP32\353\241\234 \353\247\214\353\223\240 \354\212\244\353\247\210\355\212\270 \352\270\260\354\210\231\354\202\254 \354\213\234\354\212\244\355\205\234/index.html" @@ -101,7 +101,7 @@ setTheme(preferredTheme || (darkQuery.matches ? 'dark' : 'light')) }() -
minlog

ESP32로 만든 스마트 기숙사 시스템

2023.06.20·조회수:
0
thumbnail
 

1. 기획의도

+
minlog

ESP32로 만든 스마트 기숙사 시스템

2023.06.20·조회수:
0
thumbnail
 

1. 기획의도

  • 웹을 통해 기숙사 방 문을 원격으로 쉽게 열 수 있습니다.
  • 일과시간 내에 외부 출입자를 감지하고, 해당 정보를 기록할 수 있습니다.
  • @@ -231,10 +231,10 @@

    4. 마무리https://github.com/MinSeok0123/BSSMSECOM

    -

+
- \ No newline at end of file + \ No newline at end of file diff --git "a/ESP8266\354\227\220 \352\264\200\355\225\230\354\227\254/index.html" "b/ESP8266\354\227\220 \352\264\200\355\225\230\354\227\254/index.html" index c9fc4e2..9cc1cfc 100644 --- "a/ESP8266\354\227\220 \352\264\200\355\225\230\354\227\254/index.html" +++ "b/ESP8266\354\227\220 \352\264\200\355\225\230\354\227\254/index.html" @@ -101,7 +101,7 @@ setTheme(preferredTheme || (darkQuery.matches ? 'dark' : 'light')) }() -
minlog

ESP8266에 관하여

2023.04.30·조회수:
0
thumbnail
 

ESP8266이란?

+
minlog

ESP8266에 관하여

2023.04.30·조회수:
0
thumbnail
 

ESP8266이란?

ESP8266은 Wi-Fi 모듈로, 저렴하고 매우 강력한 기능을 가지고 있습니다. 이 모듈은 고성능 마이크로컨트롤러와 Wi-Fi 기능을 하나의 칩에 통합한 것입니다. ESP8266 모듈은 TCP/IP 스택을 내장하여 인터넷에 직접 연결할 수 있으며, Wi-Fi로 인터넷 연결을 지원합니다.

ESP8266의 특징

1 .저렴하고 소형이며 경제적인 전력 소비 2. Wi-Fi 연결을 지원 3. 안정적인 TCP/IP 스택 내장 4. AT 명령어를 통한 제어 가능 5. 개발 도구 및 라이브러리가 많음 6. Arduino IDE와 함께 사용 가능

@@ -115,10 +115,10 @@

ESP8266을
  • 원격 제어 및 모니터링 시스템
  • IoT 기반 스마트 농업 시스템
  • Wi-Fi를 활용한 센서 네트워크 구축
  • -

    +
    - \ No newline at end of file + \ No newline at end of file diff --git "a/ESP8266\354\234\274\353\241\234 \353\247\214\353\223\240 \354\212\244\353\247\210\355\212\270\355\214\234/index.html" "b/ESP8266\354\234\274\353\241\234 \353\247\214\353\223\240 \354\212\244\353\247\210\355\212\270\355\214\234/index.html" index efb978d..ede0432 100644 --- "a/ESP8266\354\234\274\353\241\234 \353\247\214\353\223\240 \354\212\244\353\247\210\355\212\270\355\214\234/index.html" +++ "b/ESP8266\354\234\274\353\241\234 \353\247\214\353\223\240 \354\212\244\353\247\210\355\212\270\355\214\234/index.html" @@ -101,7 +101,7 @@ setTheme(preferredTheme || (darkQuery.matches ? 'dark' : 'light')) }() -
    minlog

    ESP8266으로 만든 스마트팜

    2021.10.19·조회수:
    0
    thumbnail
     

    프로젝트명

    +
    minlog

    ESP8266으로 만든 스마트팜

    2021.10.19·조회수:
    0
    thumbnail
     
    +
    - \ No newline at end of file + \ No newline at end of file diff --git "a/Java Collection Framework\354\227\220 \353\214\200\355\225\264 \354\225\214\354\225\204\353\263\264\354\236\220/index.html" "b/Java Collection Framework\354\227\220 \353\214\200\355\225\264 \354\225\214\354\225\204\353\263\264\354\236\220/index.html" index 9dc37b9..89c9827 100644 --- "a/Java Collection Framework\354\227\220 \353\214\200\355\225\264 \354\225\214\354\225\204\353\263\264\354\236\220/index.html" +++ "b/Java Collection Framework\354\227\220 \353\214\200\355\225\264 \354\225\214\354\225\204\353\263\264\354\236\220/index.html" @@ -101,7 +101,7 @@ setTheme(preferredTheme || (darkQuery.matches ? 'dark' : 'light')) }() -
    minlog

    Java Collection Framework에 대해 알아보자

    2023.03.29·조회수:
    0
    thumbnail
     

    Java Collection Framework

    +
    minlog

    Java Collection Framework에 대해 알아보자

    2023.03.29·조회수:
    0
    thumbnail
     

    Java Collection Framework

    Java Collection Framework는 자바에서 제공하는 데이터 구조와 관련된 클래스와 인터페이스의 집합이다. 이것은 다양한 자료구조의 구현을 제공하고, 컬렉션 클래스를 사용하여 데이터를 저장, 검색, 정렬, 삭제 등 다양한 연산을 수행할 수 있다. 여기서는 컬렉션 프레임워크의 중요한 두 가지 클래스인 ArrayList와 HashMap에 대해 알아보겠다.

    List : List 인터페이스는 순서가 있는 컬렉션을 나타내며, 데이터를 중복해서 저장할 수 있습니다. ArrayList, LinkedList, Vector 등이 이에 해당합니다.

    Set : Set 인터페이스는 순서가 없는 컬렉션을 나타내며, 데이터를 중복해서 저장할 수 없습니다. HashSet, TreeSet 등이 이에 해당합니다.

    @@ -176,10 +176,10 @@

    HashMapp} } -

    +
    - \ No newline at end of file + \ No newline at end of file diff --git a/_gatsby/slices/_gatsby-scripts-1.html b/_gatsby/slices/_gatsby-scripts-1.html index b0cc480..af69abb 100644 --- a/_gatsby/slices/_gatsby-scripts-1.html +++ b/_gatsby/slices/_gatsby-scripts-1.html @@ -2,6 +2,6 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/chunk-map.json b/chunk-map.json index 8d7e6e4..132621a 100644 --- a/chunk-map.json +++ b/chunk-map.json @@ -1 +1 @@ -{"app":["/app-9d4f72a0593cf38af373.js"],"component---src-pages-404-tsx":["/component---src-pages-404-tsx-1eefbc7aaf8c4f50be6c.js"],"component---src-pages-index-tsx":["/component---src-pages-index-tsx-87545ea7748068b24475.js"],"component---src-pages-recent-tsx":["/component---src-pages-recent-tsx-c68af4950cae6ae93f47.js"],"component---src-pages-search-tsx":["/component---src-pages-search-tsx-f0619a1254d9f72d4cee.js"],"component---src-templates-post-template-tsx":["/component---src-templates-post-template-tsx-f26c93d9cee0872ef069.js"]} \ No newline at end of file +{"app":["/app-9d4f72a0593cf38af373.js"],"component---src-pages-404-tsx":["/component---src-pages-404-tsx-e950cf19f7f97970aabd.js"],"component---src-pages-index-tsx":["/component---src-pages-index-tsx-87545ea7748068b24475.js"],"component---src-pages-recent-tsx":["/component---src-pages-recent-tsx-c68af4950cae6ae93f47.js"],"component---src-pages-search-tsx":["/component---src-pages-search-tsx-f0619a1254d9f72d4cee.js"],"component---src-templates-post-template-tsx":["/component---src-templates-post-template-tsx-f26c93d9cee0872ef069.js"]} \ No newline at end of file diff --git a/component---src-pages-404-tsx-e950cf19f7f97970aabd.js b/component---src-pages-404-tsx-e950cf19f7f97970aabd.js new file mode 100644 index 0000000..869b91f --- /dev/null +++ b/component---src-pages-404-tsx-e950cf19f7f97970aabd.js @@ -0,0 +1,2 @@ +"use strict";(self.webpackChunkgatsby_starter_default=self.webpackChunkgatsby_starter_default||[]).push([[218],{4316:function(e,t,r){r.d(t,{Z:function(){return y}});var n=r(7462),a=r(7294),i=r(5042),o=/^((children|dangerouslySetInnerHTML|key|ref|autoFocus|defaultValue|defaultChecked|innerHTML|suppressContentEditableWarning|suppressHydrationWarning|valueLink|abbr|accept|acceptCharset|accessKey|action|allow|allowUserMedia|allowPaymentRequest|allowFullScreen|allowTransparency|alt|async|autoComplete|autoPlay|capture|cellPadding|cellSpacing|challenge|charSet|checked|cite|classID|className|cols|colSpan|content|contentEditable|contextMenu|controls|controlsList|coords|crossOrigin|data|dateTime|decoding|default|defer|dir|disabled|disablePictureInPicture|download|draggable|encType|enterKeyHint|form|formAction|formEncType|formMethod|formNoValidate|formTarget|frameBorder|headers|height|hidden|high|href|hrefLang|htmlFor|httpEquiv|id|inputMode|integrity|is|keyParams|keyType|kind|label|lang|list|loading|loop|low|marginHeight|marginWidth|max|maxLength|media|mediaGroup|method|min|minLength|multiple|muted|name|nonce|noValidate|open|optimum|pattern|placeholder|playsInline|poster|preload|profile|radioGroup|readOnly|referrerPolicy|rel|required|reversed|role|rows|rowSpan|sandbox|scope|scoped|scrolling|seamless|selected|shape|size|sizes|slot|span|spellCheck|src|srcDoc|srcLang|srcSet|start|step|style|summary|tabIndex|target|title|translate|type|useMap|value|width|wmode|wrap|about|datatype|inlist|prefix|property|resource|typeof|vocab|autoCapitalize|autoCorrect|autoSave|color|incremental|fallback|inert|itemProp|itemScope|itemType|itemID|itemRef|on|option|results|security|unselectable|accentHeight|accumulate|additive|alignmentBaseline|allowReorder|alphabetic|amplitude|arabicForm|ascent|attributeName|attributeType|autoReverse|azimuth|baseFrequency|baselineShift|baseProfile|bbox|begin|bias|by|calcMode|capHeight|clip|clipPathUnits|clipPath|clipRule|colorInterpolation|colorInterpolationFilters|colorProfile|colorRendering|contentScriptType|contentStyleType|cursor|cx|cy|d|decelerate|descent|diffuseConstant|direction|display|divisor|dominantBaseline|dur|dx|dy|edgeMode|elevation|enableBackground|end|exponent|externalResourcesRequired|fill|fillOpacity|fillRule|filter|filterRes|filterUnits|floodColor|floodOpacity|focusable|fontFamily|fontSize|fontSizeAdjust|fontStretch|fontStyle|fontVariant|fontWeight|format|from|fr|fx|fy|g1|g2|glyphName|glyphOrientationHorizontal|glyphOrientationVertical|glyphRef|gradientTransform|gradientUnits|hanging|horizAdvX|horizOriginX|ideographic|imageRendering|in|in2|intercept|k|k1|k2|k3|k4|kernelMatrix|kernelUnitLength|kerning|keyPoints|keySplines|keyTimes|lengthAdjust|letterSpacing|lightingColor|limitingConeAngle|local|markerEnd|markerMid|markerStart|markerHeight|markerUnits|markerWidth|mask|maskContentUnits|maskUnits|mathematical|mode|numOctaves|offset|opacity|operator|order|orient|orientation|origin|overflow|overlinePosition|overlineThickness|panose1|paintOrder|pathLength|patternContentUnits|patternTransform|patternUnits|pointerEvents|points|pointsAtX|pointsAtY|pointsAtZ|preserveAlpha|preserveAspectRatio|primitiveUnits|r|radius|refX|refY|renderingIntent|repeatCount|repeatDur|requiredExtensions|requiredFeatures|restart|result|rotate|rx|ry|scale|seed|shapeRendering|slope|spacing|specularConstant|specularExponent|speed|spreadMethod|startOffset|stdDeviation|stemh|stemv|stitchTiles|stopColor|stopOpacity|strikethroughPosition|strikethroughThickness|string|stroke|strokeDasharray|strokeDashoffset|strokeLinecap|strokeLinejoin|strokeMiterlimit|strokeOpacity|strokeWidth|surfaceScale|systemLanguage|tableValues|targetX|targetY|textAnchor|textDecoration|textRendering|textLength|to|transform|u1|u2|underlinePosition|underlineThickness|unicode|unicodeBidi|unicodeRange|unitsPerEm|vAlphabetic|vHanging|vIdeographic|vMathematical|values|vectorEffect|version|vertAdvY|vertOriginX|vertOriginY|viewBox|viewTarget|visibility|widths|wordSpacing|writingMode|x|xHeight|x1|x2|xChannelSelector|xlinkActuate|xlinkArcrole|xlinkHref|xlinkRole|xlinkShow|xlinkTitle|xlinkType|xmlBase|xmlns|xmlnsXlink|xmlLang|xmlSpace|y|y1|y2|yChannelSelector|z|zoomAndPan|for|class|autofocus)|(([Dd][Aa][Tt][Aa]|[Aa][Rr][Ii][Aa]|x)-.*))$/,l=(0,i.Z)((function(e){return o.test(e)||111===e.charCodeAt(0)&&110===e.charCodeAt(1)&&e.charCodeAt(2)<91})),s=r(2443),c=r(444),d=r(9729),p=r(7278),u=l,f=function(e){return"theme"!==e},m=function(e){return"string"==typeof e&&e.charCodeAt(0)>96?u:f},g=function(e,t,r){var n;if(t){var a=t.shouldForwardProp;n=e.__emotion_forwardProp&&a?function(t){return e.__emotion_forwardProp(t)&&a(t)}:a}return"function"!=typeof n&&r&&(n=e.__emotion_forwardProp),n},h=function(e){var t=e.cache,r=e.serialized,n=e.isStringTag;(0,c.hC)(t,r,n);(0,p.L)((function(){return(0,c.My)(t,r,n)}));return null},y=function e(t,r){var i,o,l=t.__emotion_real===t,p=l&&t.__emotion_base||t;void 0!==r&&(i=r.label,o=r.target);var u=g(t,r,l),f=u||m(p),y=!f("as");return function(){var b=arguments,x=l&&void 0!==t.__emotion_styles?t.__emotion_styles.slice(0):[];if(void 0!==i&&x.push("label:"+i+";"),null==b[0]||void 0===b[0].raw)x.push.apply(x,b);else{0,x.push(b[0][0]);for(var v=b.length,k=1;k 96 ? testOmitPropsOnStringTag : testOmitPropsOnComponent;\n};\nvar composeShouldForwardProps = function composeShouldForwardProps(tag, options, isReal) {\n var shouldForwardProp;\n\n if (options) {\n var optionsShouldForwardProp = options.shouldForwardProp;\n shouldForwardProp = tag.__emotion_forwardProp && optionsShouldForwardProp ? function (propName) {\n return tag.__emotion_forwardProp(propName) && optionsShouldForwardProp(propName);\n } : optionsShouldForwardProp;\n }\n\n if (typeof shouldForwardProp !== 'function' && isReal) {\n shouldForwardProp = tag.__emotion_forwardProp;\n }\n\n return shouldForwardProp;\n};\n\nvar ILLEGAL_ESCAPE_SEQUENCE_ERROR = \"You have illegal escape sequence in your template literal, most likely inside content's property value.\\nBecause you write your CSS inside a JavaScript string you actually have to do double escaping, so for example \\\"content: '\\\\00d7';\\\" should become \\\"content: '\\\\\\\\00d7';\\\".\\nYou can read more about this here:\\nhttps://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Template_literals#ES2018_revision_of_illegal_escape_sequences\";\n\nvar Insertion = function Insertion(_ref) {\n var cache = _ref.cache,\n serialized = _ref.serialized,\n isStringTag = _ref.isStringTag;\n registerStyles(cache, serialized, isStringTag);\n var rules = useInsertionEffectAlwaysWithSyncFallback(function () {\n return insertStyles(cache, serialized, isStringTag);\n });\n\n return null;\n};\n\nvar createStyled = function createStyled(tag, options) {\n if (process.env.NODE_ENV !== 'production') {\n if (tag === undefined) {\n throw new Error('You are trying to create a styled element with an undefined component.\\nYou may have forgotten to import it.');\n }\n }\n\n var isReal = tag.__emotion_real === tag;\n var baseTag = isReal && tag.__emotion_base || tag;\n var identifierName;\n var targetClassName;\n\n if (options !== undefined) {\n identifierName = options.label;\n targetClassName = options.target;\n }\n\n var shouldForwardProp = composeShouldForwardProps(tag, options, isReal);\n var defaultShouldForwardProp = shouldForwardProp || getDefaultShouldForwardProp(baseTag);\n var shouldUseAs = !defaultShouldForwardProp('as');\n return function () {\n var args = arguments;\n var styles = isReal && tag.__emotion_styles !== undefined ? tag.__emotion_styles.slice(0) : [];\n\n if (identifierName !== undefined) {\n styles.push(\"label:\" + identifierName + \";\");\n }\n\n if (args[0] == null || args[0].raw === undefined) {\n styles.push.apply(styles, args);\n } else {\n if (process.env.NODE_ENV !== 'production' && args[0][0] === undefined) {\n console.error(ILLEGAL_ESCAPE_SEQUENCE_ERROR);\n }\n\n styles.push(args[0][0]);\n var len = args.length;\n var i = 1;\n\n for (; i < len; i++) {\n if (process.env.NODE_ENV !== 'production' && args[0][i] === undefined) {\n console.error(ILLEGAL_ESCAPE_SEQUENCE_ERROR);\n }\n\n styles.push(args[i], args[0][i]);\n }\n } // $FlowFixMe: we need to cast StatelessFunctionalComponent to our PrivateStyledComponent class\n\n\n var Styled = withEmotionCache(function (props, cache, ref) {\n var FinalTag = shouldUseAs && props.as || baseTag;\n var className = '';\n var classInterpolations = [];\n var mergedProps = props;\n\n if (props.theme == null) {\n mergedProps = {};\n\n for (var key in props) {\n mergedProps[key] = props[key];\n }\n\n mergedProps.theme = useContext(ThemeContext);\n }\n\n if (typeof props.className === 'string') {\n className = getRegisteredStyles(cache.registered, classInterpolations, props.className);\n } else if (props.className != null) {\n className = props.className + \" \";\n }\n\n var serialized = serializeStyles(styles.concat(classInterpolations), cache.registered, mergedProps);\n className += cache.key + \"-\" + serialized.name;\n\n if (targetClassName !== undefined) {\n className += \" \" + targetClassName;\n }\n\n var finalShouldForwardProp = shouldUseAs && shouldForwardProp === undefined ? getDefaultShouldForwardProp(FinalTag) : defaultShouldForwardProp;\n var newProps = {};\n\n for (var _key in props) {\n if (shouldUseAs && _key === 'as') continue;\n\n if ( // $FlowFixMe\n finalShouldForwardProp(_key)) {\n newProps[_key] = props[_key];\n }\n }\n\n newProps.className = className;\n newProps.ref = ref;\n return /*#__PURE__*/createElement(Fragment, null, /*#__PURE__*/createElement(Insertion, {\n cache: cache,\n serialized: serialized,\n isStringTag: typeof FinalTag === 'string'\n }), /*#__PURE__*/createElement(FinalTag, newProps));\n });\n Styled.displayName = identifierName !== undefined ? identifierName : \"Styled(\" + (typeof baseTag === 'string' ? baseTag : baseTag.displayName || baseTag.name || 'Component') + \")\";\n Styled.defaultProps = tag.defaultProps;\n Styled.__emotion_real = Styled;\n Styled.__emotion_base = baseTag;\n Styled.__emotion_styles = styles;\n Styled.__emotion_forwardProp = shouldForwardProp;\n Object.defineProperty(Styled, 'toString', {\n value: function value() {\n if (targetClassName === undefined && process.env.NODE_ENV !== 'production') {\n return 'NO_COMPONENT_SELECTOR';\n } // $FlowFixMe: coerce undefined to string\n\n\n return \".\" + targetClassName;\n }\n });\n\n Styled.withComponent = function (nextTag, nextOptions) {\n return createStyled(nextTag, _extends({}, options, nextOptions, {\n shouldForwardProp: composeShouldForwardProps(Styled, nextOptions, true)\n })).apply(void 0, styles);\n };\n\n return Styled;\n };\n};\n\nexport default createStyled;\n","import React, { FunctionComponent } from 'react'\nimport { Global, css } from '@emotion/react'\n\nconst defaultStyle = css`\n @import url('https://cdn.jsdelivr.net/gh/projectnoonnu/noonfonts_11-01@1.0/NanumSquareNeo-Variable.woff2');\n\n * {\n padding: 0;\n margin: 0;\n box-sizing: border-box;\n font-family: 'NanumSquareNeo-Variable', normal;\n }\n\n html,\n body,\n #___gatsby {\n height: 100%;\n }\n\n a,\n a:hover {\n color: inherit;\n text-decoration: none;\n cursor: pointer;\n }\n\n body {\n --bg: white;\n --bg-element2: #f8f9fa;\n --bg-element5: #212529;\n --textNormal: #222;\n --textTitle: #222;\n --textLink: blue;\n --hr: hsla(0, 0%, 0%, 0.2);\n --darkhover: #dee2e6;\n --category: #495057;\n --tenseactiv: #212529;\n --tense: #868e96;\n --velog: #12b886;\n --catebg: #e9ecef;\n --border1: #343a62;\n --border2: #adb5bd;\n --border3: #dee2e6;\n --text1: #212529;\n --text2: #495057;\n --text3: #868e96;\n --bg-tag: #f8f9fa;\n --border4: #f1f3f5;\n --button-text: #ffffff;\n\n --prism-bg: #fbfcfd;\n --prism-default-text: #24292e;\n background-color: var(--bg);\n\n --primary2: #20C997;\n }\n\n body.dark {\n -webkit-font-smoothing: antialiased;\n\n --bg: #121212;\n --bg-element2: #1e1e1e;\n --bg-element5: #f1f3f5;\n --textNormal: white;\n --textTitle: white;\n --textLink: yellow;\n --hr: hsla(0, 0%, 100%, 0.2);\n --element: #1e1e1e;\n --darkhover: #4d4d4d;\n --postback: #121212;\n --category: #d9d9d9;\n --tenseactiv: #ececec;\n --tense: #acacac;\n --catebg: #121212;\n --border1: #e0e0e0;\n --border2: #a0a0a0;\n --border3: #4d4d4d;\n --text1: #ececec;\n --text2: #d9d9d9;\n --text3: #acacac;\n --bg-tag: #252525;\n --border4: #2a2a2a;\n --button-text: #121212;\n\n --prism-bg: #1e1e1e;\n --prism-default-text: #e0e6f1;\n color: var(--textNormal);\n\n --primary2: #63E6BE;\n }\n`\n\nconst GlobalStyle: FunctionComponent = function () {\n return \n}\n\nexport default GlobalStyle\n","import React, { FunctionComponent } from 'react'\nimport styled from '@emotion/styled'\nimport { Link } from 'gatsby'\nimport GlobalStyle from 'components/Common/GlobalStyle'\n\nconst NotFoundPageWrapper = styled.div`\n display: flex;\n flex-direction: column;\n justify-content: center;\n align-items: center;\n height: 100vh;\n`\n\nconst NotFoundText = styled.div`\n font-size: 150px;\n font-weight: 800;\n\n @media (max-width: 768px) {\n font-size: 100px;\n }\n`\n\nconst NotFoundDescription = styled.div`\n font-size: 25px;\n text-align: center;\n line-height: 1.3;\n\n @media (max-width: 768px) {\n font-size: 20px;\n }\n`\n\nconst GoToMainButton = styled(Link)`\n margin-top: 30px;\n font-size: 20px;\n text-decoration: underline;\n\n &:hover {\n text-decoration: underline;\n }\n`\n\nconst NotFoundPage: FunctionComponent = function () {\n return (\n \n \n 404\n \n 찾을 수 없는 페이지입니다.
    \n 다른 콘텐츠를 보러 가보시겠어요?\n
    \n 메인으로\n
    \n )\n}\n\nexport default NotFoundPage\n"],"names":["reactPropsRegex","prop","test","charCodeAt","testOmitPropsOnStringTag","testOmitPropsOnComponent","key","getDefaultShouldForwardProp","tag","composeShouldForwardProps","options","isReal","shouldForwardProp","optionsShouldForwardProp","__emotion_forwardProp","propName","Insertion","_ref","cache","serialized","isStringTag","createStyled","identifierName","targetClassName","__emotion_real","baseTag","__emotion_base","undefined","label","target","defaultShouldForwardProp","shouldUseAs","args","arguments","styles","__emotion_styles","slice","push","raw","apply","len","length","i","Styled","w","props","ref","FinalTag","as","className","classInterpolations","mergedProps","theme","useContext","T","registered","concat","name","finalShouldForwardProp","newProps","_key","createElement","Fragment","displayName","defaultProps","Object","defineProperty","value","withComponent","nextTag","nextOptions","defaultStyle","___EmotionJSX","Global","NotFoundPageWrapper","_styled","NotFoundText","NotFoundDescription","GoToMainButton","Link","GlobalStyle","to"],"sourceRoot":""} \ No newline at end of file diff --git "a/const \354\203\201\354\210\230\354\231\200 readonly \354\203\201\354\210\230 \354\260\250\354\235\264/index.html" "b/const \354\203\201\354\210\230\354\231\200 readonly \354\203\201\354\210\230 \354\260\250\354\235\264/index.html" index 1977713..27a0022 100644 --- "a/const \354\203\201\354\210\230\354\231\200 readonly \354\203\201\354\210\230 \354\260\250\354\235\264/index.html" +++ "b/const \354\203\201\354\210\230\354\231\200 readonly \354\203\201\354\210\230 \354\260\250\354\235\264/index.html" @@ -101,7 +101,7 @@ setTheme(preferredTheme || (darkQuery.matches ? 'dark' : 'light')) }() -
    minlog

    const 상수와 readonly 상수 차이

    2023.11.03·조회수:
    0
    thumbnail
     

    const상수와 readonly 상수 차이

    +
    minlog

    const 상수와 readonly 상수 차이

    2023.11.03·조회수:
    0
    thumbnail
     

    const상수와 readonly 상수 차이

    const 상수

    • 상수 : 변수와는 달리 변경이 불가능하다. (예) 10 = 100;
    • @@ -191,10 +191,10 @@

      .WriteLine(normal.날씨흐림_NORMAL_READONLY); } -}

    +}
    - \ No newline at end of file + \ No newline at end of file diff --git "a/diff-svc \354\235\214\354\204\261\355\214\214\354\235\274 (\354\240\204\354\262\230\353\246\254)\353\247\214\353\223\234\353\212\224 \353\262\225/index.html" "b/diff-svc \354\235\214\354\204\261\355\214\214\354\235\274 (\354\240\204\354\262\230\353\246\254)\353\247\214\353\223\234\353\212\224 \353\262\225/index.html" index beb3ee5..ad4ce09 100644 --- "a/diff-svc \354\235\214\354\204\261\355\214\214\354\235\274 (\354\240\204\354\262\230\353\246\254)\353\247\214\353\223\234\353\212\224 \353\262\225/index.html" +++ "b/diff-svc \354\235\214\354\204\261\355\214\214\354\235\274 (\354\240\204\354\262\230\353\246\254)\353\247\214\353\223\234\353\212\224 \353\262\225/index.html" @@ -101,7 +101,7 @@ setTheme(preferredTheme || (darkQuery.matches ? 'dark' : 'light')) }() -
    minlog

    diff-svc 음성파일 (전처리)만드는 법

    2023.04.21·조회수:
    0
    thumbnail
     

    아래는 PyDub 라이브러리를 사용하여 음성 파일을 자동으로 분리하고 무음을 제거하는 Python 코드입니다. diff-svc 음성파일을 더 쉽게 만들기 위해 제작하였습니다.

    +
    minlog

    diff-svc 음성파일 (전처리)만드는 법

    2023.04.21·조회수:
    0
    thumbnail
     

    아래는 PyDub 라이브러리를 사용하여 음성 파일을 자동으로 분리하고 무음을 제거하는 Python 코드입니다. diff-svc 음성파일을 더 쉽게 만들기 위해 제작하였습니다.

    PyDub을 사용한 음성 파일 분리 및 무음 제거

    개요

    이번 포스트에서는 Python 라이브러리인 PyDub을 사용하여 음성 파일을 전처리하는 방법을 알아보겠습니다. PyDub은 오디오 파일의 다양한 처리 작업을 수행할 수 있는 라이브러리로, 간단한 API와 함께 사용하기 쉽습니다. 이번 포스트에서는 PyDub을 사용하여 음성 파일을 무음 구간을 기준으로 분리하고, 분리된 오디오 조각들을 최대 15초까지만 선택하여 WAV 파일로 저장하고, 마지막으로 무음을 제거하는 작업을 수행하는 코드를 살펴보겠습니다.

    @@ -185,10 +185,10 @@

    전체코드= os.path.join(output_folder, f'processed_{filename}') subprocess.call(['ffmpeg', '-i', input_path, '-af', 'silenceremove=1:0:-50dB', '-y', output_path]) os.remove(input_path) -

    +
    - \ No newline at end of file + \ No newline at end of file diff --git a/index.html b/index.html index 0cb6709..3d05bc5 100644 --- a/index.html +++ b/index.html @@ -101,10 +101,10 @@ setTheme(preferredTheme || (darkQuery.matches ? 'dark' : 'light')) }() -
    minlog
    트렌딩
    최신
    All
    Post Item Image
    아두이노 스마트 쓰레기통
    2021.10.14
    아두이노
    임베디드
    일상생활에서 가장 많이 사용하는 쓰레기통은 매우 중요한 용도를 가지고 있습니다. 하지만 쓰레기통이 너무 지저분하거나 차있어서 쓰레기를 버리는 것이 불편한 경우가 있습니다. 이러한 문제점을 해결하기 위해 아두이노를 이용한 스마트 쓰레기통을 만들어보았습니다.
    Post Item Image
    ESP8266으로 만든 스마트팜
    2021.10.19
    임베디드
    아두이노
    ESP8266
    하드웨어와 소프트웨어로 완벽한 식물을 기른다.
    Post Item Image
    Java Collection Framework에 대해 알아보자
    2023.03.29
    Java
    Java Collection Framework는 자바에서 제공하는 데이터 구조와 관련된 클래스와 인터페이스의 집합이다. 이것은 다양한 자료구조의 구현을 제공하고, 컬렉션 클래스를 사용하여 데이터를 저장, 검색, 정렬, 삭제 등 다양한 연산을 수행할 수 있다. 여기서는 컬렉션 프레임워크의 중요한 두 가지 클래스인 ArrayList와 HashMap에 대해 알아보겠다.
    Post Item Image
    리액트 props 사용하는 이유
    2023.04.11
    Web
    React
    리액트는 UI 라이브러리로서, 컴포넌트를 사용하여 UI를 구성한다. 이 때, 컴포넌트 간의 데이터 전달을 위해 프로퍼티(Props)를 사용해야한다.
    Post Item Image
    diff-svc 음성파일 (전처리)만드는 법
    2023.04.21
    Python
    diff-svc
    PyDub 라이브러리를 사용하여 음성 파일을 자동으로 분리하고 무음을 제거하는 Python 코드입니다. diff-svc 음성파일을 더 쉽게 만들기 위해 제작하였습니다.
    Post Item Image
    recoil을 한번 알아보자
    2023.04.21
    Web
    Frontend
    React
    Recoil은 페이스북에서 만든 React 상태 관리 라이브러리입니다. React는 기본적으로 단방향 데이터 흐름을 따르기 때문에 복잡한 상태 관리를 위해서는 상태를 끌어올리거나 Redux와 같은 상태 관리 라이브러리를 사용해야 했습니다. 하지만 Recoil은 기존 React 컴포넌트 내에서 상태를 관리할 수 있도록 해줍니다.
    Post Item Image
    ESP8266에 관하여
    2023.04.30
    ESP8266
    Arduino
    임베디드
    ESP8266은 Wi-Fi 모듈로, 저렴하고 매우 강력한 기능을 가지고 있습니다. 이 모듈은 고성능 마이크로컨트롤러와 Wi-Fi 기능을 하나의 칩에 통합한 것입니다. ESP8266 모듈은 TCP/IP 스택을 내장하여 인터넷에 직접 연결할 수 있으며, Wi-Fi로 인터넷 연결을 지원합니다.
    Post Item Image
    그리디 알고리즘
    2023.05.11
    알고리즘
    C
    그리디 알고리즘(탐욕법)은 현재 상황에서 지금 당장 좋은 것만 고르는 방법을 의미한다.
    Post Item Image
    시뮬레이션과 완전탐색
    2023.05.12
    알고리즘
    Python
    시뮬레이션과 완전탐색은 CS에서 중요한 개념으로, 다양한 문제를 해결하기 위해 사용된다. 시뮬레이션과 완전탐색에 대해 알아보고, 각각의 개념을 어떻게 활용하는지 알아보자.
    Post Item Image
    정렬 알고리즘
    2023.05.13
    알고리즘
    Python
    정렬 알고리즘은 주어진 데이터 집합을 특정한 기준에 따라 순서대로 정렬하는 알고리즘이다.
    +
    minlog
    트렌딩
    최신
    All
    Post Item Image
    아두이노 스마트 쓰레기통
    2021.10.14
    아두이노
    임베디드
    일상생활에서 가장 많이 사용하는 쓰레기통은 매우 중요한 용도를 가지고 있습니다. 하지만 쓰레기통이 너무 지저분하거나 차있어서 쓰레기를 버리는 것이 불편한 경우가 있습니다. 이러한 문제점을 해결하기 위해 아두이노를 이용한 스마트 쓰레기통을 만들어보았습니다.
    Post Item Image
    ESP8266으로 만든 스마트팜
    2021.10.19
    임베디드
    아두이노
    ESP8266
    하드웨어와 소프트웨어로 완벽한 식물을 기른다.
    Post Item Image
    Java Collection Framework에 대해 알아보자
    2023.03.29
    Java
    Java Collection Framework는 자바에서 제공하는 데이터 구조와 관련된 클래스와 인터페이스의 집합이다. 이것은 다양한 자료구조의 구현을 제공하고, 컬렉션 클래스를 사용하여 데이터를 저장, 검색, 정렬, 삭제 등 다양한 연산을 수행할 수 있다. 여기서는 컬렉션 프레임워크의 중요한 두 가지 클래스인 ArrayList와 HashMap에 대해 알아보겠다.
    Post Item Image
    리액트 props 사용하는 이유
    2023.04.11
    Web
    React
    리액트는 UI 라이브러리로서, 컴포넌트를 사용하여 UI를 구성한다. 이 때, 컴포넌트 간의 데이터 전달을 위해 프로퍼티(Props)를 사용해야한다.
    Post Item Image
    diff-svc 음성파일 (전처리)만드는 법
    2023.04.21
    Python
    diff-svc
    PyDub 라이브러리를 사용하여 음성 파일을 자동으로 분리하고 무음을 제거하는 Python 코드입니다. diff-svc 음성파일을 더 쉽게 만들기 위해 제작하였습니다.
    Post Item Image
    recoil을 한번 알아보자
    2023.04.21
    Web
    Frontend
    React
    Recoil은 페이스북에서 만든 React 상태 관리 라이브러리입니다. React는 기본적으로 단방향 데이터 흐름을 따르기 때문에 복잡한 상태 관리를 위해서는 상태를 끌어올리거나 Redux와 같은 상태 관리 라이브러리를 사용해야 했습니다. 하지만 Recoil은 기존 React 컴포넌트 내에서 상태를 관리할 수 있도록 해줍니다.
    Post Item Image
    ESP8266에 관하여
    2023.04.30
    ESP8266
    Arduino
    임베디드
    ESP8266은 Wi-Fi 모듈로, 저렴하고 매우 강력한 기능을 가지고 있습니다. 이 모듈은 고성능 마이크로컨트롤러와 Wi-Fi 기능을 하나의 칩에 통합한 것입니다. ESP8266 모듈은 TCP/IP 스택을 내장하여 인터넷에 직접 연결할 수 있으며, Wi-Fi로 인터넷 연결을 지원합니다.
    Post Item Image
    그리디 알고리즘
    2023.05.11
    알고리즘
    C
    그리디 알고리즘(탐욕법)은 현재 상황에서 지금 당장 좋은 것만 고르는 방법을 의미한다.
    Post Item Image
    시뮬레이션과 완전탐색
    2023.05.12
    알고리즘
    Python
    시뮬레이션과 완전탐색은 CS에서 중요한 개념으로, 다양한 문제를 해결하기 위해 사용된다. 시뮬레이션과 완전탐색에 대해 알아보고, 각각의 개념을 어떻게 활용하는지 알아보자.
    Post Item Image
    정렬 알고리즘
    2023.05.13
    알고리즘
    Python
    정렬 알고리즘은 주어진 데이터 집합을 특정한 기준에 따라 순서대로 정렬하는 알고리즘이다.
    - \ No newline at end of file + \ No newline at end of file diff --git a/page-data/app-data.json b/page-data/app-data.json index 3c355f8..007a9e0 100644 --- a/page-data/app-data.json +++ b/page-data/app-data.json @@ -1 +1 @@ -{"webpackCompilationHash":"0fec2879143cfd259622"} +{"webpackCompilationHash":"34064921e2db0da8e4ef"} diff --git a/page-data/sq/d/1271460761.json b/page-data/sq/d/1271460761.json new file mode 100644 index 0000000..8eda68b --- /dev/null +++ b/page-data/sq/d/1271460761.json @@ -0,0 +1 @@ +{"data":{"site":{"siteMetadata":{"siteUrl":"https://minseok0123.github.io"}}}} \ No newline at end of file diff --git a/page-data/sq/d/2540524192.json b/page-data/sq/d/2540524192.json index 8606841..780ae60 100644 --- a/page-data/sq/d/2540524192.json +++ b/page-data/sq/d/2540524192.json @@ -1 +1 @@ -{"data":{"allMarkdownRemark":{"nodes":[{"id":"85b1a28c-4124-533a-9ea6-de8755a2d949","excerpt":"연산자 오버로딩 연산자 오버로딩(Operator Overloading) 연산자의 종류는 이렇다. 예시코드","fields":{"slug":"/연산자 오버로딩/"},"frontmatter":{"title":"연산자 오버로딩","date":"2023.11.05","thumbnail":{"publicURL":"/static/d39e7bc53e8853f4f4908add0b4b795d/operator.png","childImageSharp":{"fluid":{"base64":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAOCAYAAAAvxDzwAAAACXBIWXMAAA7DAAAOwwHHb6hkAAABf0lEQVR42pVTScvCQAztT3c5eVAUwatboUVBcMOLSEEFsWLBoz2o1aNUcUNr9X0kMNJq1c9AOpmZzCPvJZXwZPf7/eP+W74UdHm5XHA4HHC9XnnvOA5utxvHm82G3bZtuK77Aip5D0SCpmlQVRXtdhuZTAaz2Qy1Wg3hcBjpdBrNZhOyLDOweC8wJBHQKgAnkwk6nQ6GwyF6vR4WiwVGoxFKpRLq9TqWyyXfPQOSS//R6Zv5KHvL7ff7KBQK0HUd3W6XaY3HY6xWKzQaDa66XC6jUqmg1WqxLJRLRhpzhfQRglerVUQiEWSzWfZUKsUUSYJ4PM6UY7EYQqEQcrkcx4qiPPR/obzf73E8HrHb7XA+n/mMOk3xdrt90KL70+n0WL06+prybKJJggEB0Eh5Zfo4NuLher1GIpFAMpnksSH6xWIR0WgU+XyenXK8b3xdDhpswzAwGAwwnU4xn895Fik2TROWZfmA3v4pv45QUG5ghaLzn/yd9m8r9Ar/S9V/hHke+VznqG0AAAAASUVORK5CYII=","aspectRatio":1.4534883720930232,"src":"/static/d39e7bc53e8853f4f4908add0b4b795d/46604/operator.png","srcSet":"/static/d39e7bc53e8853f4f4908add0b4b795d/62d80/operator.png 125w,\n/static/d39e7bc53e8853f4f4908add0b4b795d/e1953/operator.png 250w,\n/static/d39e7bc53e8853f4f4908add0b4b795d/46604/operator.png 500w,\n/static/d39e7bc53e8853f4f4908add0b4b795d/2a4de/operator.png 600w","sizes":"(max-width: 500px) 100vw, 500px"}}},"categories":["C샵"]},"rawMarkdownBody":"\n# 연산자 오버로딩\n\n연산자 오버로딩(Operator Overloading)\n\n> 연산자의 종류는 이렇다.\n\n + (더하기)\n - (빼기)\n * (곱하기)\n / (나누기)\n\n## 예시코드\n\n```csharp\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\n\nclass 귀요미\n{\n public static String operator + (귀요미 one, 귀요미 two)\n {\n return \"귀요미\";\n }\n\n public static String operator * (귀요미 one, 귀요미 two)\n {\n return \"과로사\";\n }\n\n public static String operator - (귀요미 one, 귀요미 two)\n {\n return \"행복해\";\n }\n\n public static String operator / (귀요미 one, 귀요미 two)\n {\n return \"너가해\";\n }\n}\n\nclass OperOverloadTestMain\n{\n public static void Main(string[] args)\n {\n 귀요미 일 = new 귀요미();\n\n Console.WriteLine(일 + 일);\n Console.WriteLine(일 * 일);\n Console.WriteLine(일 - 일);\n Console.WriteLine(일 / 일);\n }\n}\n```\n\n---\n"},{"id":"6187d309-5a08-50ef-9260-8d164b697bc2","excerpt":"1. 그래프(Graph)란? 그래프는 객체들 간의 연결 관계를 나타내는 수학적 구조로, 노드(Node)와 이를 연결하는 간선(Edge)으로 구성됩니다. 그래프는 현실 세계에서의 다양한 상호 관계를 추상화하여 모델링하는 데 사용됩니다. 서로소 집합 자료구조(Union-Find…","fields":{"slug":"/그래프 알고리즘/"},"frontmatter":{"title":"그래프 알고리즘","date":"2023.08.29","thumbnail":{"publicURL":"/static/033c3fd924832fdd40f362828c9081b3/graph.png","childImageSharp":{"fluid":{"base64":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAICAYAAAD5nd/tAAAACXBIWXMAAAsTAAALEwEAmpwYAAABoklEQVR42lWS6ZKiYAxFef/Hmpppp0exRQVEwKWV9QOaRdnhTEl3OzX5k9RN5VTdJFIQFyz1gLUlKPM7pB/4SYms+WzMkKbt+I5aRJzeDN5Xe5oops9zqoe2NLisDLq8QFIMH/WQopgJ671DnOa8KBeMc4GsC9wwewLFWkc1YzQrRszmDEmM++MV1U7RjJBsZyHFec3LxmWmvOPHOQw9vsj4ubqgWIK+H2AcJ2D7kXL+s+X8a0lpH4CRyg85/l5zXaj09xKJPMM9XemGgeRWcd3sYOwJ04K768EwMOHGccptU0+gLsvI5jJj1zGOA33XTn1prEo0/YxI75+2kow4u7E7+gSu4JM1Pm0XV4fKD6a6iSIaz+PmuJRfmnRwUxa6YGkIfEfQey6KHTJXA+THXm7VP9jpwn51wFwduNlH2jAkeduwW9pYK5vKC5C2VjAd5M2I2JouUZIyV53pUAst5PEF3xFrJpruo+se0atMLwT+TEYzBLrqUNgnpKpu2ZoB9iV+Dt6rlvU+4HhN/rM8NA1isyNW99NuJ62uCRWdRLcm7S8Nh1c7HGoK/QAAAABJRU5ErkJggg==","aspectRatio":2.358490566037736,"src":"/static/033c3fd924832fdd40f362828c9081b3/46604/graph.png","srcSet":"/static/033c3fd924832fdd40f362828c9081b3/62d80/graph.png 125w,\n/static/033c3fd924832fdd40f362828c9081b3/e1953/graph.png 250w,\n/static/033c3fd924832fdd40f362828c9081b3/46604/graph.png 500w,\n/static/033c3fd924832fdd40f362828c9081b3/d8815/graph.png 750w,\n/static/033c3fd924832fdd40f362828c9081b3/ee604/graph.png 800w","sizes":"(max-width: 500px) 100vw, 500px"}}},"categories":["알고리즘","C++"]},"rawMarkdownBody":"\n# 1. 그래프(Graph)란?\n\n그래프는 객체들 간의 연결 관계를 나타내는 수학적 구조로, 노드(Node)와 이를 연결하는 간선(Edge)으로 구성됩니다. 그래프는 현실 세계에서의 다양한 상호 관계를 추상화하여 모델링하는 데 사용됩니다.\n\n### 서로소 집합 자료구조(Union-Find)\n\n> 서로소 집합 자료구조는 원소들을 서로 중복되지 않는 부분 집합으로 나누는 데 사용되며, 주로 그래프 내 사이클을 판별하거나 연결성을 확인하는 데 활용됩니다.\n\n**주요 동작:**\n\n1. 두 원소의 합집합 연산을 확인하여 두 원소가 속한 그룹을 확인합니다.\n2. 각 그룹의 루트 노드를 찾아 부모 자식 관계를 설정합니다.\n\n![](https://velog.velcdn.com/images/minseok0123/post/594f36b4-7f9b-450e-adfc-95106e184f22/image.png)\n\n#### 서로소 집합을 활용한 사이클 판별\n\n서로소 집합은 무방향 그래프 내의 사이클을 판별하는 데 사용됩니다. 동일한 그룹에 속하는 원소들이 추가로 연결되면 사이클이 발생합니다. 이를 활용하여 그래프 내 사이클 여부를 판별할 수 있습니다.\n\n```cpp\n#include \nusing namespace std;\n\nchar vect[200];\n\nchar getBoss(char tar)\n{\n if (vect[tar] == 0) {\n return tar;\n }\n\n char ret = getBoss(vect[tar]);\n return ret;\n}\n\nvoid makeGroup(char t1, char t2)\n{\n char a = getBoss(t1);\n char b = getBoss(t2);\n\n if (a == b) return;\n vect[b] = a;\n}\n\nint main()\n{\n makeGroup('A', 'B');\n makeGroup('B', 'C');\n\n\n if (getBoss('A') == getBoss('C')) {\n cout << \"같은그룹\";\n }\n else\n {\n cout << \"다른그룹\";\n }\n\n \treturn 0;\n}\n```\n\n> 경로 압축\n> char ret = getBoss(vect[tar]);\n\n![](https://velog.velcdn.com/images/minseok0123/post/474ddbcd-5d72-40de-80cb-e94df9c63913/image.png)\n\n# 2. 그래프의 종류\n\n그래프에는 여러 가지 종류가 있으며, 주로 다음과 같이 분류합니다.\n\n**방향성에 따른 분류:**\n방향 그래프(Directed Graph): 각 간선이 특정 방향을 가진 경우.\n무방향 그래프(Undirected Graph): 각 간선이 방향성을 가지지 않은 경우.\n**가중치 유무에 따른 분류:**\n가중치 그래 프(Weighted Graph) : 각간 선에 가중치 값이 할당된 경우.\n비가중치 그라 프(Unweighted Graph) : 모든간 선의 가중치가 동일한(혹은 없음)경우.\n**연결성에 따른 분류:**\n연결된 그라 프(Connected Graph) : 모든노 드사 이에 경로가 존재하는 경우.\n비연결된그라 프(Disconnected Graph) : 일부노 드사 이에 경로가 존재하지 않음\n\n# 3. 신장 트리\n\n신장 트리는 그래프에서 모든 노드를 포함하면서 사이클이 없는 부분 그래프를 의미합니다.\n\n## 최소 신장 트리 (MST, 크루스칼 알고리즘)\n\n최소한의 비용으로 신장트리를 찾고싶을 때 사용한다.\n\n최소 신장 트리는 그래프 내에서 가장 적은 비용으로 모든 노드를 연결하는 트리를 찾는 알고리즘입니다. 크루스칼 알고리즘은 이러한 최소 신장 트리를 구하는 데 사용되며, 그리디 알고리즘에 속합니다. 모든 간선을 가중치 순으로 정렬한 후, 작은 가중치부터 간선을 트리에 추가하는 방식으로 동작합니다. 이때, 서로 연결된 노드의 부모를 찾기 위해 서로소 집합 자료구조를 활용합니다.\n\n![](https://velog.velcdn.com/images/minseok0123/post/5e4a6323-46fe-4071-9b99-4f9a45983669/image.png)\n\n![](https://velog.velcdn.com/images/minseok0123/post/50da0122-10d6-461c-8278-5bfadafc88e1/image.png)\n\n> 최종적으로 신장 트리에 포함되는 간선의 개수가 '노드의 개수 - 1' 과 같다.\n\n# 4. 위상 정렬\n\n위상 정렬은 방향 그래프에서 노드들을 순서대로 나열하는 알고리즘입니다. 이때, 간선은 방향을 따르며 노드 간의 의존 관계를 나타냅니다. 위상 정렬은 선행 관계를 만족하는 작업의 순서를 찾는 데 사용됩니다.\n\n위상 정렬 알고리즘\n\n> 1. 진입차수가 0 인 노드를 큐에 넣는다.\n> 2. 큐가 빌 때까지 다음의 과정을 반복한다.\n> I. 큐에서 원소를 꺼내 해당 노드에서 출발하는 간선을 그래프에서 제거한다.\n> II. 새롭게 진입차수가 0이 된 노드를 큐에 넣는다.\n\n진입차수란 -> 특정한 노드로 **들어오는** 간선의 개수를 의미한다.\n\n![](https://velog.velcdn.com/images/minseok0123/post/c06a7dc4-4e4f-472f-92ce-cf8642f20a93/image.png)\n\n참고로, 위상정렬의 답안은 여러가지가 될 수 있다. (한 단계에서 큐에 새롭게 들어가는 원소가 2개 이상일 경우)\n"},{"id":"7f7cf4b4-25b0-51fb-abfa-8d0cf382652d","excerpt":"생성자와 static 변수 1. 생성자 생성자 함수는 메모리가 생성된 직후 가장 먼저 호출되는 함수이다.\n모든 class는 메모리가 생성될 경우 자신과 이름이 똑같은 함수를 가장 먼저 호출한다. [디폴트 생성자] 만약 개발자가 생성자를 만들지 않았다면.\n컴파일러는 텅 빈 디폴트 생성자를 자동으로 만든다. (눈에는 보이지 않는다) [생성자의 용도] 모든 직원은 회사에 출근하면 출근체크부터 해야 한다.\n마찬가지로 함수를 호출시키자마자 처음…","fields":{"slug":"/생성자와 static 변수/"},"frontmatter":{"title":"생성자와 static 변수","date":"2023.11.01","thumbnail":{"publicURL":"/static/f48e91ca89f3ac1cfde9650ebdce6485/생성자.png","childImageSharp":{"fluid":{"base64":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAALCAYAAAB/Ca1DAAAACXBIWXMAAAsTAAALEwEAmpwYAAABrElEQVR42pVT2W7bMBD0/39VH4r0SIICddHKdKzDkKzYtKLElUyKx0yxsuLYCPLQBRa75IKzswdn1hKbitBNxK47onrpYXwAyf9VkTg7HDocDp7WkmYI7Kzj4D1DCAwhMgQwRkx+mPzTnXMDrTWikBiAOPPOAwjMcw+liL0esF4XSFcrFLlGmgJZJlrh4UGhaSQesVwSavkH9z8+4+bLJ2itTwxjBCRb1/UIwdMYwxgjh8G9FSI1TX5EHCscmUZhHMRC3owMcZLxTdd1/PrtO5dK8e72lqtswcdtyfa5mUBxBX4hbz18BbR2gLUDd9sdN5sNq6piWiz46/c983V6BvxAMdkToKR0zuKqxg9J4KIN4Jn0yZEexhFIa6IowPYZ3O8jy5Ks65ZKLWjMkVUFtq1j05BPT5beH88JXtGuSpZpzudAXQObKmI+J9LsBUnyE2qRIM8fUeQeaTqgLGXSPYzpZaB4x1AOeQ4qBe40WNdkkpQsipx13VMtDLX+yywlt9uG3kc6J/voLwY1AfZ9H733kKmHMK7Q6MtdCA6yr97zHAfGFl39komemPAPGPdUtIXnArsAAAAASUVORK5CYII=","aspectRatio":1.7605633802816902,"src":"/static/f48e91ca89f3ac1cfde9650ebdce6485/46604/%EC%83%9D%EC%84%B1%EC%9E%90.png","srcSet":"/static/f48e91ca89f3ac1cfde9650ebdce6485/62d80/%EC%83%9D%EC%84%B1%EC%9E%90.png 125w,\n/static/f48e91ca89f3ac1cfde9650ebdce6485/e1953/%EC%83%9D%EC%84%B1%EC%9E%90.png 250w,\n/static/f48e91ca89f3ac1cfde9650ebdce6485/46604/%EC%83%9D%EC%84%B1%EC%9E%90.png 500w","sizes":"(max-width: 500px) 100vw, 500px"}}},"categories":["C샵"]},"rawMarkdownBody":"\n# 생성자와 static 변수\n\n> ## 1. 생성자\n>\n> 생성자 함수는 메모리가 생성된 직후 **가장 먼저** 호출되는 함수이다.\n> 모든 class는 메모리가 생성될 경우 **자신과 이름이 똑같은** 함수를 가장 먼저 호출한다.\n\n### [디폴트 생성자]\n\n만약 개발자가 생성자를 만들지 않았다면.\n컴파일러는 텅 빈 디폴트 생성자를 자동으로 만든다. (눈에는 보이지 않는다)\n\n### [생성자의 용도]\n\n모든 직원은 회사에 출근하면 출근체크부터 해야 한다.\n마찬가지로 함수를 호출시키자마자 처음 1회 해야 되는 일이 필요하다면 (예: 값의 초기화)\n그것을 생성자 함수에 넣어준다.\n\n```csharp\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\n\nnamespace Creator\n{\n public class 출근\n {\n int 업무량;\n\n //생성자 함수 : 메모리가 할당되면 가장 먼저 1회 실행된다.\n public 출근()\n {\n 업무량 = 100;\n Console.WriteLine(\"출근 완료!\");\n }\n\n public void 업무중()\n {\n 업무량 -= 10;\n Console.WriteLine(\"남은 엄무량: {0}\", 업무량);\n }\n }\n\n internal class Program\n {\n static void Main(string[] args)\n {\n 출근 김대리 = new 출근();\n 김대리.업무중();\n 김대리.업무중();\n 김대리.업무중();\n 김대리.업무중();\n 김대리.업무중();\n 김대리.업무중();\n 김대리.업무중();\n 김대리.업무중();\n 김대리.업무중();\n }\n }\n```\n\n### 실행 결과\n\n> 출근 완료!\n> 남은 엄무량: 90\n> 남은 엄무량: 80\n> 남은 엄무량: 70\n> 남은 엄무량: 60\n> 남은 엄무량: 50\n> 남은 엄무량: 40\n> 남은 엄무량: 30\n> 남은 엄무량: 20\n> 남은 엄무량: 10\n\n생성자는 객체를 만들어 줬을때 한 번만 실행된다.\n엄무중 함수를 여러번 호출해도 생성자는 실행되지 않는다.\n\n---\n\n> ## 2. static 변수\n1. 일반 변수는 함수호출이 끝나면 **소멸**된다.\n2. 그러나 **static**으로 선언된 변수는 함수호출이 끝나도 **계속 메모리에 남아 있다.**\n\n```csharp\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\n\nnamespace @Static\n{\n class 출근\n {\n static int 업무량 = 0;\n int 내월급 = 0;\n\n //생성자 함수 (출근할때마다 자동으로 호출)\n public 출근()\n {\n Console.WriteLine(\"출근 완료!!\");\n 업무량++;\n 내월급++;\n }\n\n //일반 함수\n public void 업무시작()\n {\n Console.WriteLine(\"업무량: {0}\", 업무량);\n Console.WriteLine(\"내월급: {0} \\n\\n\", 내월급);\n }\n }\n internal class 회사\n {\n static void Main(string[] args)\n {\n int 연차 = 10;\n for(int i = 0; i <= 연차; i++)\n {\n Console.WriteLine(\"----- {0}년차 직장인 김대리의 하루 -----\", i);\n 출근 김대리 = new 출근();\n 김대리.업무시작();\n }\n }\n }\n}\n```\n\n### 실행 결과\n\n----- 0년차 직장인 김대리의 하루 -----\n출근 완료!!\n업무량: 1\n내월급: 1\n\n----- 1년차 직장인 김대리의 하루 -----\n출근 완료!!\n업무량: 2\n내월급: 1\n\n----- 2년차 직장인 김대리의 하루 -----\n출근 완료!!\n업무량: 3\n내월급: 1\n\n----- 3년차 직장인 김대리의 하루 -----\n출근 완료!!\n업무량: 4\n내월급: 1\n\n----- 4년차 직장인 김대리의 하루 -----\n출근 완료!!\n업무량: 5\n내월급: 1\n\n----- 5년차 직장인 김대리의 하루 -----\n출근 완료!!\n업무량: 6\n내월급: 1\n\n----- 6년차 직장인 김대리의 하루 -----\n출근 완료!!\n업무량: 7\n내월급: 1\n\n----- 7년차 직장인 김대리의 하루 -----\n출근 완료!!\n업무량: 8\n내월급: 1\n\n----- 8년차 직장인 김대리의 하루 -----\n출근 완료!!\n업무량: 9\n내월급: 1\n\n----- 9년차 직장인 김대리의 하루 -----\n출근 완료!!\n업무량: 10\n내월급: 1\n\n----- 10년차 직장인 김대리의 하루 -----\n출근 완료!!\n업무량: 11\n내월급: 1\n\n> 함수가 호출될 떄 마다 업무량을 1씩 증가 하였지만,\n> 월급을 늘지 않았다...\n\n---\n"},{"id":"a99447dc-9148-5a1b-b10a-714d9622f8b3","excerpt":"…","fields":{"slug":"/아두이노 스마트 쓰레기통/"},"frontmatter":{"title":"아두이노 스마트 쓰레기통","date":"2021.10.14","thumbnail":{"publicURL":"/static/6fa610f8862c87b1846b866a818c88df/arduino.png","childImageSharp":{"fluid":{"base64":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAACXBIWXMAAAsTAAALEwEAmpwYAAADxUlEQVR42nWUa0ybVRzGT7lsTBbcBITGTMgmEInDLYuyaIwmJuLiZRMv8/LB7IOXBDd0m1MyGAGUtgItbd+26wUKOHBOypA5miIuogtSWMyYNBTYyNgEYkSDGgfEpD+ltdCu3Zv8c5KT9/zO85z/RQijjYgwWFdWmcmG0JoQNVp2NjSTY7AgVBpSPz3JHU2tCMkSfi4CFAKLWYbpzBS0nGBg3AuLCzi+7eOjs04OlJbxXnExBSYLQnecmFsCg6vZjqhvYF+jncX5Gywswi9zfzJy6SK7CwrI27KZQ2XHSNdIASdBMVFhpgZErYEXFC/jUmYw2LSTkc6XONuu59HHd7Gn8Dne0GhJ1ZkQeguy0POrCq0rsHi1RKv0IKetKVxtSYTeteCK47cmwZsf7CZFY0XUSwjJGg4LV2gj1mhGSK08oXuLq11JOFRyLjkSGO9OYrQ7GdwbOG3MQCglZObGVZtRFf6vTqaWqFHl4jYmcqpqE19oduCoyaRPfzu95jW018vYUFmKMLcgDJZw2ArQ/6gW/0+5FYdwWos5/00nU1c8nPu6F2d3Fz8O9jF0rhWX9CIPFT2LMLUEzoSqjKYwuU5C0dZBR0cXwz956Ojs5IzFyvV+N8vfjb+W2HTwIMLUiCz47kbrTZaDtxxvRByrolqlpKvBhlavZ+raNZbGxliYnGRp4W/qHA5EeTVCY4is3TCgqYE1WiMbD3/IY1XV9F8cxuP14vP5+Mfn4+eZGbxeL+7hYfouXEDz3XnW1UeBrmwcbyRJUctTB94lr7QcoVRT53Tx++wsnonLzPw657d8fXqaz109DLjd3P2xKmA9KtBsJ0Gp5uHsbL60WRkaH2d4dJTvp2fQeUaRRjx+4JB3jMSyCkSFAlGrCzRBVMtGm79I1732Ok9XK2k58xVTExMMzP9B88Rl3PPzfuCVsTFy8vMpKDnKq6cciFDbEVleDnsrot6IOFyCzukCfMzOzTE4MEBlZSVZ2dnEx8VR9Mpeevp/QCjqAsmMsBxc9WZizXZiDFbk928jf8d27s3OIjU5mdvWryddno48PY3M7flsrv7EP2kiFQbVGVb7eXnmJW3JISEukbWZ95CalUVG2p2kye8ieWMquwrziK2tRZjstyjs0Fv0Zvaf/Iyj7+9F2p/LM0cKEUVHSLlvKxmZcvY9v40O6UniVdrVpEROm5B+1hiwODpxtpVwovlttioqAkqUagztbUz2qHik/B2EoXm1W6ICw+ahlhilHlGzPJGtgYksWXigqY3cGgNCbUJ2c8n8F/8C3uS4tDT63MUAAAAASUVORK5CYII=","aspectRatio":1,"src":"/static/6fa610f8862c87b1846b866a818c88df/46604/arduino.png","srcSet":"/static/6fa610f8862c87b1846b866a818c88df/62d80/arduino.png 125w,\n/static/6fa610f8862c87b1846b866a818c88df/e1953/arduino.png 250w,\n/static/6fa610f8862c87b1846b866a818c88df/46604/arduino.png 500w,\n/static/6fa610f8862c87b1846b866a818c88df/d8815/arduino.png 750w,\n/static/6fa610f8862c87b1846b866a818c88df/31987/arduino.png 1000w,\n/static/6fa610f8862c87b1846b866a818c88df/f3583/arduino.png 1200w","sizes":"(max-width: 500px) 100vw, 500px"}}},"categories":["아두이노","임베디드"]},"rawMarkdownBody":"\n# 아두이노 스마트 쓰레기통\n\n일상생활에서 가장 많이 사용하는 쓰레기통은 매우 중요한 용도를 가지고 있습니다. 하지만 쓰레기통이 너무 지저분하거나 차있어서 쓰레기를 버리는 것이 불편한 경우가 있습니다. 이러한 문제점을 해결하기 위해 아두이노를 이용한 스마트 쓰레기통을 만들어보았습니다.\n\n### 프로젝트 내용\n\n이 스마트 쓰레기통은 다음과 같은 기능을 가지고 있습니다.\n\n1. 움직임을 감지하는 센서를 이용하여 자동으로 열립니다.\n2. 초음파 센서를 이용하여 쓰레기통 안에 쓰레기가 얼마나 차있는지 감지합니다.\n3. 쓰레기통이 어느 정도 차면 LED와 부저를 이용하여 알립니다.\n\n### 프로젝트 목적\n\n이 스마트 쓰레기통을 만들기 위한 목적은 다음과 같습니다.\n\n1. 양손에 쓰레기를 들고 있을 때 손으로 쓰레기통을 열기 힘든 경우를 해결합니다.\n2. 지저분한 쓰레기통에 손을 닿지 않고 쓰레기를 버릴 수 있습니다.\n3. 쓰레기통이 너무 차서 더 이상 쓰레기를 넣을 수 없는 경우를 방지합니다.\n\n## 차별화 내용\n\n이 스마트 쓰레기통의 차별화된 기능은 쓰레기통이 어느 정도 차면 소리가 나게 한다는 점입니다. 이 기능은 LED와 부저를 이용하여 쓰레기통이 어느 정도 찼는지 알려주므로 쓰레기통이 넘치지 않도록 미리 비울 수 있습니다.\n\n### 기대 효과\n\n이 스마트 쓰레기통의 가장 큰 기대 효과는 손이 쓰레기통에 닿지 않고도 쓰레기를 버릴 수 있다는 것입니다. 이 기능은 특히 현재 코로나19 상황에서 매우 중요한 역할을 합니다. 또한 쓰레기통이 너무 차지 않도록 미리 비워서 쓰레기가 넘치지 않게 할 수 있으므로 환경보호에도 기여할 수 있습니다.\n\n![](https://velog.velcdn.com/images/minseok0123/post/9bdc5820-3c97-4f0a-8b4d-ea0d26a2a834/image.png)\n\n![](https://velog.velcdn.com/images/minseok0123/post/8b53aed2-0742-4bee-b76c-750ded87c62c/image.png)\n![](https://velog.velcdn.com/images/minseok0123/post/662f4ebf-25c9-4cf2-9117-327463f8a669/image.png)\n\n## 느낀점\n\n이번 아두이노 스마트 쓰레기통 프로젝트를 통해 다양한 센서와 모듈을 사용해보고, 센서 데이터를 이용하여 간단한 제어 작업을 구현하는 것에 대해 배울 수 있었습니다. 또한 쓰레기통이라는 일상적인 물건을 IoT 기술을 활용하여 새로운 기능을 추가하고, 더욱 편리하게 사용할 수 있는 것을 경험해볼 수 있어서 재미있었습니다.\n\n이번 프로젝트를 통해 스마트 홈 IoT 시스템 개발에 대한 관심도 생겼습니다. 미래의 스마트 홈 시스템에는 다양한 센서와 기기가 연결되어 사용자의 생활을 더욱 편리하고 안전하게 해줄 것입니다. 앞으로도 이와 관련된 다양한 프로젝트를 경험해보고 더 많은 것을 배워나갈 계획입니다.\n\n### **소스코드**\n\n> [\bGitHub : https://github.com/MinSeok0123/Arduino_Smartbin](https://github.com/MinSeok0123/Arduino_Smartbin)\n"},{"id":"64d56843-33c8-5cfe-ac7c-1ac3c3d9758f","excerpt":"오버로딩(Over loading) 오버로딩(Over loading) 하나의 이름으로 여러 개의 함수를 만드는 기법 [오버로딩(Over loading)을 사용하는 이유] 함수의 이름 하나로 여러 가지 작업에 대처할 수 있다. (오버로딩이 없을 경우,\n매개변수에 int 형이 들어오는 함수 따로,\ndouble형이 들어오는 함수 따로 만들어줘야 하므로 귀찮다) 오버로딩을 하지 않은 경우 오버로딩을 안한 개판…","fields":{"slug":"/오버로딩(Over loading)/"},"frontmatter":{"title":"오버로딩(Over loading)","date":"2023.11.04","thumbnail":{"publicURL":"/static/100360536dd277293ce19e0f8e301f46/overload.png","childImageSharp":{"fluid":{"base64":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAALCAYAAAB/Ca1DAAAACXBIWXMAAAPoAAAD6AG1e1JrAAABqElEQVR42mWSycoiQRCE+/0fwAdQT4IX8aS4IJ5EUXH9B/d9+cV9X2L4cqhGmIQiq6uiIyMjyzsej3o8Hrrf77peryJyuZyq1artb7ebwOz3ex/HGZFOp9VqtXzc5XKRB4B4v9+WV6uV5vO5SqWS3J0Df+PW67Umk4kKhYKPo6AH+PP52AF5uVzavl6vK5VKabfb6fV66XQ6yQX/jEYj23e7Xc1mM7+YBysBIJlMKpPJKJFIWA6FQvYDQKew1+uZKiygk2azqWw2q81mo+l0Kg/24XCoeDyuQCCgcrlsbReLRUUiEXU6HWuFgoPBQNFoVLFYTNvtVvl8XuFwWMFgUJVK5R8hVaiOJxzQ2ng8NiIWSlAIIUMDBzGEeIgYunCdeqhBJcQA8A5ipler1XyzwSwWC8sscOR2u20DdN56z+fTPpgUQ6Hi4XBQv983pQTK3CTJKEYl3eApAvwpu7f3HRDhj7uj8vl8/g9HUXC8Ap+QiuvfX1MGEYuLbwIw+MyTwhY8c8/JTZ+gW1MICM/+/PyoXKkYIe0DoD0w38NqNBomwL09cJBT+C8ZPjekU6DqXwAAAABJRU5ErkJggg==","aspectRatio":1.8115942028985508,"src":"/static/100360536dd277293ce19e0f8e301f46/46604/overload.png","srcSet":"/static/100360536dd277293ce19e0f8e301f46/62d80/overload.png 125w,\n/static/100360536dd277293ce19e0f8e301f46/e1953/overload.png 250w,\n/static/100360536dd277293ce19e0f8e301f46/46604/overload.png 500w,\n/static/100360536dd277293ce19e0f8e301f46/d8815/overload.png 750w,\n/static/100360536dd277293ce19e0f8e301f46/14a87/overload.png 813w","sizes":"(max-width: 500px) 100vw, 500px"}}},"categories":["C샵"]},"rawMarkdownBody":"\n\n# 오버로딩(Over loading)\n\n> **오버로딩(Over loading)**\n하나의 이름으로 여러 개의 함수를 만드는 기법\n\n## [오버로딩(Over loading)을 사용하는 이유]\n\n**함수**의 이름 **하나**로 **여러 가지 작업**에 대처할 수 있다.\n\n(오버로딩이 없을 경우,\n매개변수에 int 형이 들어오는 함수 따로,\ndouble형이 들어오는 함수 따로 만들어줘야 하므로 귀찮다)\n\n\n\n# 오버로딩을 하지 않은 경우\n\n\n**오버로딩**을 안한 개판 1분전 소스코드\n\n```csharp\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\n\npublic class 스트리머의_하루\n{\n // 무수히 많은 함수들이 존재.\n \n // 후원 관련 함수들\n public int 정기구독받기(int 정기구독)\n {\n return 정기구독;\n }\n\n public int 정기구독_음성도네(int 정기구독, int 음성도네)\n {\n return 정기구독 + 음성도네;\n }\n\n // 새 후원방식이 또 생겨서 (오버로딩을 안쓸 경우 : 별도의 함수 만듬)\n public int 정기구독_음성도네_영상도네받기(int 정기구독, int 음성도네, int 영상도네)\n {\n return 정기구독 + 음성도네 + 영상도네;\n }\n\n // 기타 잡다한 함수들\n public double 택배받기(double 택배) // 2.2kg~\n {\n return 택배;\n }\n\n public string 편지받기(string 편지)\n {\n return 편지;\n }\n}\n\npublic class 오늘수익\n{\n public static void Main(string[] args)\n {\n // 방송 켬\n 스트리머의_하루 getMoney = new 스트리머의_하루();\n\n // 트수들이 후원중\n int 오늘수익 = 0;\n 오늘수익 += getMoney.정기구독받기(5000); // OOO님이 1개월 구독으로 돈을 버리셨습니다.\n 오늘수익 += getMoney.정기구독_음성도네(5000, 1000); // 구독 + 음성도네\n 오늘수익 += getMoney.정기구독_음성도네_영상도네받기(5000, 1000, 20000);\n\n // 수익금 정산\n Console.WriteLine(\"오늘수익 수익: {0}\", 오늘수익);\n }\n}\n```\n\n\n\n그러자 함수가 많아질수록 다른 함수와 섞이고 코드가 지저분해지면서 복잡해졌고,\n결국 스트리머는 **오버로딩**을 이용해서\n**\"모든 후원금을 하나의 함수명\"**으로 관리하기로 결정하게 되었다.\n\n---\n\n# 오버로딩을 한 경우\n\n**오버로딩**을 한 소스코드\n\n```csharp\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\n\npublic class 스트리머의_하루\n{\n // 무수히 많은 함수들이 존재.\n \n // 후원 관련 함수들\n public int 후원받기(int 정기구독)\n {\n return 정기구독;\n }\n\n public int 후원받기(int 정기구독, int 음성도네)\n {\n return 정기구독 + 음성도네;\n }\n\n public int 후원받기(int 정기구독, int 음성도네, int 영상도네)\n {\n return 정기구독 + 음성도네 + 영상도네;\n }\n\n // 기타 잡다한 함수들\n public double 후원받기(double 택배) // 2.2kg~\n {\n return 택배;\n }\n\n public string 후원받기(string 편지)\n {\n return 편지;\n }\n}\n\npublic class 오늘수익\n{\n public static void Main(string[] args)\n {\n // 방송 켬\n 스트리머의_하루 getMoney = new 스트리머의_하루();\n\n // 트수들이 후원중\n int 오늘수익 = 0;\n 오늘수익 += getMoney.후원받기(5000); // OOO님이 1개월 구독으로 돈을 버리셨습니다.\n 오늘수익 += getMoney.후원받기(5000, 1000); // 구독 + 음성도네\n 오늘수익 += getMoney.후원받기(5000, 1000, 20000);\n\n // 집으로 날아온 택배선물\n double 오늘택배 = 0;\n 오늘택배 += getMoney.후원받기(5.5); // 5.5kg의 거대한 선물이 도착했다.\n 오늘택배 += getMoney.후원받기(2.2);\n 오늘택배 += getMoney.후원받기(0, 5);\n\n string 오늘편지 = \"\";\n 오늘편지 += getMoney.후원받기(\"안녕하세요\");\n\n // 하루 종료\n Console.WriteLine(\"오늘수익 : {0}\", 오늘수익);\n Console.WriteLine(\"오늘택배 : {0}\", 오늘택배);\n Console.WriteLine(\"오늘편지 : {0}\", 오늘편지);\n }\n\n}\n```\n---\n\n"},{"id":"9b1e6592-e940-54e4-b31b-7301ae1998b8","excerpt":"…","fields":{"slug":"/정렬 알고리즘/"},"frontmatter":{"title":"정렬 알고리즘","date":"2023.05.13","thumbnail":{"publicURL":"/static/eb51d20db908fb423189b6c6fe7e937c/sort.jpeg","childImageSharp":{"fluid":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAUABQDASIAAhEBAxEB/8QAGQABAAIDAAAAAAAAAAAAAAAAAAMEAQIF/8QAFgEBAQEAAAAAAAAAAAAAAAAAAAID/9oADAMBAAIQAxAAAAGlvfzNc9cE8ZGkQP/EABsQAQACAwEBAAAAAAAAAAAAAAEAEQIDEyEj/9oACAEBAAEFArIXPpDZR1Y53OeM8F2o/wD/xAAXEQADAQAAAAAAAAAAAAAAAAAAAREQ/9oACAEDAQE/ASkWf//EABURAQEAAAAAAAAAAAAAAAAAABAR/9oACAECAQE/ASn/xAAeEAABBAEFAAAAAAAAAAAAAAAAAQIxMpEDESEiUf/aAAgBAQAGPwKm5xpFG4IKnhAvVCG4P//EAB8QAAIBAgcAAAAAAAAAAAAAAAABETGBIUFRYXGR8P/aAAgBAQABPyH3MmWHcbUsAkxuexzTDuQk6uWUSpmRRA//2gAMAwEAAgADAAAAEOjo/wD/xAAYEQEBAAMAAAAAAAAAAAAAAAAAEQFRYf/aAAgBAwEBPxCo25Jh/8QAFxEAAwEAAAAAAAAAAAAAAAAAABARUf/aAAgBAgEBPxCEK1f/xAAfEAEAAgEDBQAAAAAAAAAAAAABABExIUFxUWGhwdH/2gAIAQEAAT8QTulfr9RCBLhTUSrxGXukNaQie4PbLGdWBJuLkvuKM0wotaEQBHGf/9k=","aspectRatio":1,"src":"/static/eb51d20db908fb423189b6c6fe7e937c/0f3a1/sort.jpg","srcSet":"/static/eb51d20db908fb423189b6c6fe7e937c/1ada3/sort.jpg 125w,\n/static/eb51d20db908fb423189b6c6fe7e937c/8f7df/sort.jpg 250w,\n/static/eb51d20db908fb423189b6c6fe7e937c/0f3a1/sort.jpg 500w,\n/static/eb51d20db908fb423189b6c6fe7e937c/f9913/sort.jpg 750w,\n/static/eb51d20db908fb423189b6c6fe7e937c/a7715/sort.jpg 1000w,\n/static/eb51d20db908fb423189b6c6fe7e937c/ec6c5/sort.jpg 1280w","sizes":"(max-width: 500px) 100vw, 500px"}}},"categories":["알고리즘","Python"]},"rawMarkdownBody":"\n- 정렬알고리즘\n\n**정렬 알고리즘은 주어진 데이터 집합을 특정한 기준에 따라 순서대로 정렬하는 알고리즘이다.**\n\n- 어떻게 정렬할 수 있을까?\n\n![](https://velog.velcdn.com/images/minseok0123/post/8395ff78-e9d1-4db0-941f-866e8bb99ece/image.png)\n\n# [선택정렬]\n\n처리되지 않은 데이터 중에서 가장 작은 데이터를 선택해 맨 앞에 있는 데이터와 바꾸는 것을 반복합니다.\n\n이 알고리즘의 핵심 아이디어는 매번 정렬되지 않은 부분에서 최소값을 찾아서 앞으로 이동시키는 것입니다. 이를 통해 배열의 가장 작은 요소가 정렬 과정 중에 제 위치를 찾아가게 되고, 나머지 요소들도 동일한 원리로 정렬됩니다.\n\n### 선택 정렬 동작 예시\n\n`[Step 0]` 처리되지 않은 데이터 중 가장 작은 '0'을 선택해 가장 앞의 '7'과 바꾼다.\n\n![](https://velog.velcdn.com/images/minseok0123/post/f49cf2aa-c493-4eb6-a1d9-a30e55687329/image.png)\n\n`[Step 1]` 처리되지 않은 데이터 중 가장 작은 '1'을 선택해 가장 앞의 '5'와 바꾼다.\n\n![](https://velog.velcdn.com/images/minseok0123/post/76d0da14-0233-48e3-83ce-ac4e3fb44983/image.png)\n\n`[Step 2]` 처리되지 않은 데이터 중 가장 작은 '2'를 선택해 가장 앞의 '9'와 바꾼다.\n\n![](https://velog.velcdn.com/images/minseok0123/post/321dee96-a939-4851-a718-9a2e0d6699de/image.png)\n\n`[Step 3]` 처리되지 않은 데이터 중 가장 작은 '3'을 선택해 가장 앞의 '7'과 바꾼다.\n\n![](https://velog.velcdn.com/images/minseok0123/post/f1c1055f-804b-4347-9611-7d53cd778719/image.png)\n\n이러한 과정을 반복하면 다음과 같이 정렬이 완료된다.\n\n→ 가장 작은 것을 선택해서 앞으로 보내는 과정을 반복해서 수행하다 보면, 전체 데이터의 정렬이 이루어진다.\n\n![](https://velog.velcdn.com/images/minseok0123/post/1c31e865-5abc-4aaa-bd0d-f5ae98079c6a/image.png)\n\n선택정렬 소스 코드\n\n```python\narray = [7, 5, 9, 0, 3, 1, 6, 2, 4, 8]\n\nfor i in range(len(array)):\n\tmin_index = i\n\tfor j in range(i+1, len(array)):\n\t\t\tif array[min_index] > array[j]:\n\t\t\t\t\tmin_index = j\n\tarray[i], array[min_index] = array[min_index], array[i]\n\nprint(array)\n```\n\n```\n[0 1 2 3 4 5 6 7 8 9]\n```\n\n### 선택 정렬의 시간 복잡도\n\n선택 정렬의 시간 복잡도는 O(n^2)로, 배열의 크기에 비례하여 비효율적입니다.\n그러나 선택 정렬은 구현이 간단하고 이해하기 쉬우며, 정렬해야 할 요소의 수가 상대적으로 작을 때 유용할 수 있습니다.\n\n- 선택 정렬은 N번 만큼 가장 작은 수를 찾아서 맨 앞으로 보내야 한다.\n- 구현 방식에 따라서 사소한 오차는 있을 수 있지만, 전체 연산 횟수는 다음과 같다.\n\n![](https://velog.velcdn.com/images/minseok0123/post/5868ecb5-6e5d-4b2b-92bc-f591635d2e36/image.png)\n\n- 이는 (*N^*2+_N_+2)/2로 표현할 수 있는데, 빅오 표현법에 따라서 *O*(*N^*2)이라고 작성한다.\n\n# [삽입정렬]\n\n삽입 정렬의 핵심 아이디어는 정렬된 부분 배열에 새로운 원소를 삽입하는 동안 정렬된 순서를 유지한다는 것입니다. 따라서, 배열이 이미 거의 정렬되어 있는 경우에는 효율적으로 동작하며, 작은 규모의 입력에 대해서도 성능이 좋습니다.\n\n- 처리되지 않은 데이터를 하나씩 골라 적절한 위치에 삽입한다.\n- 선택 정렬에 비해 구현 난이도가 높은 편이지만, 일반적으로 더 효율적으로 동작한다.\n\n### 삽입 정렬 동작 예시\n\n`[Step 0]` 첫 번째 데이터 '7'은 그 자체로 정렬이 되어 있다고 판단하고, 두 번째 데이터인 '5'가 어떤 위치로 들어갈지 판단한다. '7'의 왼쪽으로 들어가거나 오른쪽으로 들어가거나 두 경우만 존재한다.\n\n![](https://velog.velcdn.com/images/minseok0123/post/a5999124-08d7-4896-8665-ef86ae089268/image.png)\n\n`[Step 1]` 이어서 '9'가 어떤 위치로 들어갈지 판단한다.\n\n![](https://velog.velcdn.com/images/minseok0123/post/a992c974-23b7-4896-a7ac-96932f3ae382/image.png)\n\n‘9’는 차례대로 왼쪽에 있는 데이터와 비교해서 왼쪽 데이터보다 더 작다면 위치를 바꿔 주고 그렇지 않다면 그냥 그 자리에 머물러 있도록 한다. ‘9’는 ‘7’보다 더 크기 때문에 현재 위치 그대로 내버려 둔다.\n\n`[Step 2]`  이어서 '0'이 어떤 위치로 들어갈지 판단한다.\n\n![](https://velog.velcdn.com/images/minseok0123/post/8f710680-7ecb-4e71-8a9a-80f48a2a848e/image.png)\n\n‘0’은 ‘9’, ‘7’, ‘5’와 비교했을 때 모두 작기 때문에 ‘5’의 왼쪽에 위치한다.\n\n이러한 과정을 반복하면 다음과 같이 정렬이 완성된다.\n\n![](https://velog.velcdn.com/images/minseok0123/post/27af6645-9703-4601-9a34-495178c5ee50/image.png)\n\n### 삽입 정렬 소스코드\n\n```python\narray = [7, 5, 9, 0, 3, 1, 6, 2, 4, 8]\n\nfor i in range(1, len(array)):\n\tfor j in range(i, 0, -1):\n\t\t\tif array[j] < array[j-1]:\n\t\t\t\t\tarray[j], array[j-1] = array[j-1], array[j]\n\t\t\telse:\n\t\t\t\t\tbreak\n\nprint(array)\n```\n\n`[실행 결과]`\n\n```\n[0,1,2,3,4,5,6,7,8,9]\n```\n\n### 삽입 정렬의 시간 복잡도\n\n삽입 정렬의 시간 복잡도는 최악의 경우에는 O(n^2)이며, 최선의 경우에는 O(n)입니다. 여기서 n은 배열의 크기를 나타냅니다. 또한, 삽입 정렬은 제자리 정렬(in-place sorting) 알고리즘이므로, 추가적인 메모리 공간을 필요로 하지 않습니다.\n\n- 삽입 정렬의 시간 복잡도는 *O*(*N^*2)이며, 선택 정렬과 마찬가지로 반복문이 두 번 중첩되어 사용된다.\n- 삽입 정렬은 현재 리스트의 데이터가 거의 정렬되어 있는 상태라면 매우 빠르게 동작한다.`최선의 경우 O(N)의 시간 복잡도를 가진다.`\n\n# [퀵정렬]\n\n- 기준 데이터를 설정하고 **그 기준보다 큰 데이터와 작은 데이터의 위치를 바꾸는 방법**이다.\n- 일반적인 상황에서 가장 많이 사용되는 정렬 알고리즘 중 하나이다.\n- 병합 정렬과 더불어 대부분의 프로그래밍 언어의 정렬 라이브러리의 근간이 되는 알고리즘이다.\n- 가장 기본적인 퀵 정렬은 **첫 번째 데이터를 기준 데이터(pivot)로 설정**한다.\n\n### 퀵 정렬 동작 예시\n\n`[Step 0]` 현재 피벗의 값은 '5'이다. 왼쪽에서부터 '5'보다 큰 데이터를 선택하므로 '7'이 선택되고, 오른쪽에서부터 '5'보다 작은 데이터를 선택하므로 '4'가 선택된다.\n\n![](https://velog.velcdn.com/images/minseok0123/post/bc9e8f91-8faf-48d7-943d-776cc4fbd659/image.png)\n\n`[Step 1]` 현재 피벗의 값은 '5'이다. 왼쪽에서부터 '5'보다 큰 데이터를 선택하므로 '9'가 선택되고, 오른쪽에서부터 '5'보다 작은 데이터를 선택하므로 '2'가 선택된다. 이제 이 두 데이터의 위치를 서로 변경한다.\n\n![](https://velog.velcdn.com/images/minseok0123/post/c2e69da9-7aae-4449-9080-0689e133b060/image.png)\n\n`[Step 0]`현재 피벗의 값은 '5'이다. 왼쪽에서부터 '5'보다 큰 데이터를 선택하므로 '6'이 선택되고, 오른쪽에서부터 '5'보다 작은 데이터를 선택하므로 '1'이 선택된다. 단, 이처럼\n\n**위치가 엇갈리는 경우 '피벗'과 작은 데이터의 위치를 서로 변경**한다.\n\n![](https://velog.velcdn.com/images/minseok0123/post/22b5ce04-0a67-4326-bf30-883814eb9ed5/image.png)\n\n`[분할완료]`이제 '5'의 왼쪽에 있는 데이터는 모두 5보다 작고, 오른쪽에 있는 데이터는 모두 '5'보다 크다는 특징이 있다. 이렇게 피벗을 기준으로 데이터 묶음을 나누는 작업을 분할(Divide)이라고 한다.\n\n![](https://velog.velcdn.com/images/minseok0123/post/442f06f2-b4e2-46d8-8e46-4a367ac4e73f/image.png)\n\n`[왼쪽 데이터 묶음 정렬]`왼쪽에 있는 데이터에 대해서 마찬가지로 정렬을 수행한다.\n\n![](https://velog.velcdn.com/images/minseok0123/post/c99385af-1acd-43ac-848b-143169bb6e30/image.png)\n\n`[오른쪽 데이터 묶음 정렬]`오른쪽에 있는 데이터에 대해서 마찬가지로 정렬을 수행한다.\n\n![](https://velog.velcdn.com/images/minseok0123/post/1a8fb67f-9623-4443-a2a0-5c8bc19bba9d/image.png)\n\n이러한 과정을 반복하면 전체 데이터에 대해서 정렬이 수행된다.\n\n### 퀵 정렬이 빠른 이유: 직관적인 이해\n\n- 이상적인 경우 분할이 절반씩 일어난다면 전체 연산 횟수로 *O*(_NlogN_)를 기대할 수 있다.\n- `너비 X 높이 = N X logN = NlogN`\n\n![](https://velog.velcdn.com/images/minseok0123/post/f8e6ee2f-3dba-440c-9957-c8be82eb8297/image.png)\n\n### 퀵 정렬의 시간 복잡도\n\n퀵정렬은 평균적으로 O(n log n)의 시간 복잡도를 가지지만, 최악의 경우에는 O(n^2)의 시간 복잡도를 가질 수 있습니다. 최악의 경우는 피벗이 항상 최솟값 또는 최댓값으로 선택되는 경우에 발생합니다. 이러한 경우를 피하기 위해 피벗을 랜덤하게 선택하거나 중간값을 선택하는 방법 등을 사용할 수 있습니다.\n\n- 퀵 정렬은 평균의 경우 *O*(_NlogN_)의 시간 복잡도를 가진다.\n- 하지만 최악의 경우 *O*(*N*2)의 시간 복잡도를 가진다.\n\n`첫 번째 원소를 피벗으로 삼을 때, 이미 정렬된 배열에 대해서 퀵 정렬을 수행할 경우 최악의 경우이다.`\n\n- 표준 라이브러리를 사용하는 경우, 기본적으로 *O*(_NlogN_)을 보장한다.\n\n```python\narray = [5,7,9,0,3,1,6,2,4,8]\n\ndef quick_sort(array, start, end):\n\tif start >= end:\n\t\treturn\n\tpivot = start\n\tleft = start + 1\n\tright = end\n\twhile(left<=right):\n\t\twhile(left<=end and array[left]<=array[pivot]):\n\t\t\tleft += 1\n\t\twhile(right>start and array[right]>=array[pivot]):\n\t\t\tright -= 1\n\t\tif(left>right):\n\t\t\tarray[right], array[pivot] = array[pivot], array[right]\n\t\telse:\n\t\t\tarray[left], array[right] = array[right], array[left]\n\tquick_sort(array, start, right-1)\n\tquick_sort(array, right+1, end)\n\nquick_sort(array, 0, len(array)-1)\nprint(array)\n```\n\n`[실행 결과]`\n\n```\n[0,1,2,3,4,5,6,7,8,9]\n```\n\n# 문제 - 두 배열의 원소 교체\n\n> 동빈이는 두 개의 배열 A와 B를 가지고 있다. 두 배열은 N개의 원소로 구성되어 있으며, 배열의 원소는모두 자연수이다\n>\n> 동빈이는 최대 K 번의 바꿔치기 연산을 수행할 수 있는데, 바꿔치기 연산이란 배열 A에 있는 원소 하나와배열 B에 있는 원소 하나를 골라서 두 원소를 서로 바꾸는 것을 말한다\n>\n> 동빈이의 최종 목표는 배열 A의 모든 원소의 합이 최대가 되도록 하는 것이며, 여러분은 동빈이를 도와야한다\n>\n> N, K, 그리고 배열 A와 B의 정보가 주어졌을 때, 최대 K 번의 바꿔치기 연산을 수행하여 만들 수 있는배열 A의 모든 원소의 합의 최댓값을 출력하는 프로그램을 작성하라\n>\n> 예를 들어 N = 5, K = 3이고, 배열 A와 B가 다음과 같다고 해보자\n>\n> - 배열 A = [1, 2, 5, 4, 3]\n> - 배열 B = [5, 5, 6, 6, 5]이 경우, 다음과 같이 세 번의 연산을 수행할 수 있다\n> - 연산 1) 배열 A의 원소 '1'과 배열 B의 원소 '6'을 바꾸기\n> - 연산 2) 배열 A의 원소 '2'와 배열 B의 원소 '6'을 바꾸기\n> - 연산 3) 배열 A의 원소 '3'과 배열 B의 원소 '5'를 바꾸기세 번의 연산 이후 배열 A와 배열 B의 상태는 다음과 같이 구성될 것이다\n> - 배열 A = [6, 6, 5, 4, 5]\n> - 배열 B = [3, 5, 1, 2, 5]이때 배열 A의 모든 원소의 합은 26이 되며, 이보다 더 합을 크게 만들 수는 없다\n\n---\n\n### 입력\n\n- 첫 번째 줄: N, K 가 공백으로 구분되어 입력 (1 <= N <= 100,000, 0 <= K <= N)\n- 두 번째 줄: 배열 A의 원소들이 공백으로 구분되어 입력 (원소 a < 10,000,000인 자연수)\n- 세 번째 줄: 배열 B의 원소들이 공백으로 구분되어 입력 (원소 b < 10,000,000인 자연수)\n\n### 출력\n\n- 최대 K번 바꿔치기 연산을 수행해서 가장 최대의 합을 갖는 A의 모든 원소 값의 합을 출력\n\n**입력 예시**\n\n```\n5 3\n1 2 5 4 3\n5 5 6 6 5\n```\n\n**출력 예시**\n\n```\n26\n```\n\n---\n\n**`코드 구현`**\n\n```python\nn, k = map(int, input().split())\n\na = list(map(int, input().split()))\nb = list(map(int, input().split()))\n\na.sort()\nb.sort(reverse = True)\n\nfor i in range(k):\n if a[i] < b[i]:\n a[i], b[i] = b[i], a[i]\n else:\n break\n\nprint(sum(a))\n```\n\n---\n\n**`실행 결과`**\n\n```\n26\n```\n\n---\n"},{"id":"7a0477ec-6bae-5e88-9b70-97a6d13ed179","excerpt":"…","fields":{"slug":"/최단 경로/"},"frontmatter":{"title":"최단 경로","date":"2023.08.28","thumbnail":{"publicURL":"/static/a75398f78245969eab7384f600e18aac/shortest route.png","childImageSharp":{"fluid":{"base64":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAALCAIAAADwazoUAAAACXBIWXMAAAsTAAALEwEAmpwYAAABGElEQVR42oWR227CQAxE+f8vQyoqVCqi6RMgKCoNIZvLbmyP7YpERVQQMU+W18f2eiZ+J3N3EVcNqXlbzGOMDhiz3VVO/JFSaop4DhwPhwOJSFlqXftTWKHL5fsxnC4rMHMbh/zP8ZitVs9g1fVmkzdFHU4MERYzUyCUYb/bARiH2ygi5m5mZHJKIfvMYkpWVQ6omYiMwpISoP3RTEKZx/Ijy4ioTxiAUVhEBpKJ1/tt0dWsEGL/A1RVmP/BZhcLiOh1Nott6+5VFaYv02FgFyovy6EUqlB9MFlV8zzvuosvCq2RznXOXWTo1XxqW++7u9nja1tVQaDQSN13U+y+9sKiABEZ4GN/tl7X2N1jSovFvG2a26db+BcShIUSxpTSrwAAAABJRU5ErkJggg==","aspectRatio":1.7857142857142858,"src":"/static/a75398f78245969eab7384f600e18aac/46604/shortest%20route.png","srcSet":"/static/a75398f78245969eab7384f600e18aac/62d80/shortest%20route.png 125w,\n/static/a75398f78245969eab7384f600e18aac/e1953/shortest%20route.png 250w,\n/static/a75398f78245969eab7384f600e18aac/46604/shortest%20route.png 500w,\n/static/a75398f78245969eab7384f600e18aac/40725/shortest%20route.png 580w","sizes":"(max-width: 500px) 100vw, 500px"}}},"categories":["알고리즘"]},"rawMarkdownBody":"\n# 최단 경로 문제\n\n- 최단 경로 알고리즘은 그래프에서 가장 짧은 경로를 찾는 알고리즘을 의미합니다.\n- 다양한 문제 상황에서 사용될 수 있으며, 주요한 경우는 다음과 같습니다\n\n - 한 지점에서 다른 한 지점까지의 최단 경로\n - 한 지점에서 다른 모든 지점까지의 최단 경로\n - 모든 지점에서 다른 모든 지점까지의 최단 경로\n\n이때, 각 지점은 그래프에서 노드로 표현되며, 지점 간 연결된 도로는 그래프에서 간선으로 표현됩니다.\n\n![](https://velog.velcdn.com/images/minseok0123/post/49fe9c3a-0735-4eab-affb-73df0550e56e/image.png)\n\n# 다익스트라 최단 경로 알고리즘 개요\n\n다익스트라(Dijkstra) 최단 경로 알고리즘은 특정한 노드에서 출발하여 다른 모든 노드까지의 최단 경로를 계산하는 알고리즘입니다. 이 알고리즘은 음의 간선이 없을 때에만 정상적으로 동작하며, 그리디(Greedy) 알고리즘에 속합니다.\n\n## 다익스트라 알고리즘 동작과정\n\n[초기 상태] 그래프를 준비하고 출발 노드를 설정한다\n\n![](https://velog.velcdn.com/images/minseok0123/post/c4c49dbe-5f41-4676-aeef-ba1016dc76c7/image.png)\n\n1. 방문하지 않은 노드 중에서 최단 거리가 가장 짧은 노드인 1번 노드를 처리한다\n ![](https://velog.velcdn.com/images/minseok0123/post/b05ef06c-8348-4c40-9509-9bf90652f803/image.png)\n2. 방문하지 않은 노드 중에서 최단 거리가 가장 짧은 노드인 4번 노드를 처리한다\n ![](https://velog.velcdn.com/images/minseok0123/post/20dd98ef-17ab-4a5c-867a-ace0e7900569/image.png)\n3. 방문하지 않은 노드 중에서 최단 거리가 가장 짧은 노드인 2번 노드를 처리한다\n ![](https://velog.velcdn.com/images/minseok0123/post/c2c27133-f178-4c44-ac34-7517bec9ffa1/image.png)\n4. 방문하지 않은 노드 중에서 최단 거리가 가장 짧은 노드인 5번 노드를 처리한다\n ![](https://velog.velcdn.com/images/minseok0123/post/64599945-d9b8-414e-919e-23f11f2ddc5f/image.png)\n5. 방문하지 않은 노드 중에서 최단 거리가 가장 짧은 노드인 3번 노드를 처리한다\n ![](https://velog.velcdn.com/images/minseok0123/post/8877c391-282a-4c06-a571-d95d095cc210/image.png)\n6. 방문하지 않은 노드 중에서 최단 거리가 가장 짧은 노드인 6번 노드를 처리한다\n ![](https://velog.velcdn.com/images/minseok0123/post/8135d804-4de1-4ac6-a6cd-a721cfeaae4e/image.png)\n\n## 다익스트라 알고리즘의 특징\n\n**그리디 접근 방식**: 다익스트라 알고리즘은 각 단계에서 방문하지 않은 노드 중에서 현재까지의 최단 거리 추정치가 가장 작은 노드를 선택합니다. 이를 통해 임의의 과정을 반복하며 최단 거리를 점진적으로 갱신해 나갑니다.\n\n**최단 거리의 확정**: 알고리즘 수행 중 한 번 처리된 노드의 최단 거리는 더 이상 변경되지 않습니다. 다시 말해, 각 노드에 대한 최단 거리는 점점 정확하게 확정됩니다.\n\n**단계적 접근**: 다익스트라 알고리즘은 각 단계마다 하나의 노드에 대한 최단 거리를 확실히 찾아냅니다. 이러한 접근 방식을 통해 그래프의 모든 노드에 대한 최단 거리를 구할 수 있습니다.\n\n**최단 거리 정보 저장**: 알고리즘을 실행한 뒤에는 각 노드까지의 최단 거리 정보가 테이블에 저장됩니다. 이 정보를 통해 출발 노드로부터 다른 모든 노드까지의 최단 경로와 거리를 쉽게 확인할 수 있습니다.\n"},{"id":"aa0169f6-77cb-5507-b2e0-4418d1075102","excerpt":"순차탐색알고리즘 리스트 안에 있는 특정한 데이터를 찾기 위해 앞에서부터 데이터를 하나씩 차례대로 확인하는 방법 주로, 정렬되지 않는 리스트에서 데이터를 하나씩 차례대로 확인하는 방법 리스트 내에 데이터가 아무리 많아도 시간만 충분하다면 항상 원하는 원소(데이터)를 찾을 수 있다는 장점 리스트에 특정 원소가 있는 지 체크할 경우, 리스트에서 특정한 값을 가지는 원소의 개수를 세는 count…","fields":{"slug":"/탐색알고리즘/"},"frontmatter":{"title":"탐색알고리즘","date":"2023.06.17","thumbnail":{"publicURL":"/static/3f7fbd3be95364da1f101e9494b3be1c/탐색알고리즘.png","childImageSharp":{"fluid":{"base64":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAMCAIAAADtbgqsAAAACXBIWXMAAAPoAAAD6AG1e1JrAAACj0lEQVR42iXLyVLaAACA4TxWZ3rqph60LghioUhkUYmEsBMSsy8IJqABkwCRJSxZgYp9vw7Tme/wX35gUM0vmZon1pdUyeVq/+0aZdX7SuUskzpIYhGoX0DrUejqIET9juVD4dDeRWjvAnA42ibqPsf4Ir1RWl5HfO8r75q87b1+DKcz9knI0wbbHDKPTJlSCYaPg+DRbg5+CQJzEl01+LXIewLuiLgrN3yl6b00HZm3202HkWy5o+NC5QqZ4JJcJC/3Q4GvwfPvwdPPAcCiaYsillTJ4bF1S/QE3BKp9UBdG5qnKZ6i2E15wUlLVpIu8/fn0VwAvPkWzR1F0EAEsHBaLyI9ufM2WgwNc/I2Gw8NQ9PGurrUB+bryNUX78/mVlv87Zvb1/FHZ94tSNc/ArH9ILBtd3y26Uqy/7SzUhT3SfSaDbtBe3J7wbccTl5Jio0/ug/SCBXwCPLr4Prw02lkLwRsHlseL7iC6Lbamxdl01P9Rsdvd1fdV0/V7SfNFntLtDEjeQNn5RKGJrLx42T+LKxmEoDNMi7JurTgc8IfpjVDSKfG6Zm8UaxMSrhdEOcQ6eb5SbHqkMS6QToEMy8RffhWg9KARTIOtZsnpaKWQBb3zBKhpjCm3uY0MGdBjIMIoxziUqTL1tdYw80JRgJNHV6mfoYBE8VNFLdwWonBnXBOj5YHyeogXdPi1UkMd4vCJPOgIXfzKjqBUAfmxiAmRjLZkzAciAIqjIzKdS1dpo9vxAA0vsO0eLkLIv1U9S32MMoS0yJhoYxT4xyEm91hAwR+hlJGDhmlUaCVvNXvS+hJvHAYn2cpI4H24qUuWBCC2eENpt/UTJiaQoQF0/P0wwgqL/GaX+FMkDBB/B+NUXKz7GaGwwAAAABJRU5ErkJggg==","aspectRatio":1.6025641025641026,"src":"/static/3f7fbd3be95364da1f101e9494b3be1c/46604/%ED%83%90%EC%83%89%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98.png","srcSet":"/static/3f7fbd3be95364da1f101e9494b3be1c/62d80/%ED%83%90%EC%83%89%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98.png 125w,\n/static/3f7fbd3be95364da1f101e9494b3be1c/e1953/%ED%83%90%EC%83%89%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98.png 250w,\n/static/3f7fbd3be95364da1f101e9494b3be1c/46604/%ED%83%90%EC%83%89%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98.png 500w,\n/static/3f7fbd3be95364da1f101e9494b3be1c/d8815/%ED%83%90%EC%83%89%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98.png 750w,\n/static/3f7fbd3be95364da1f101e9494b3be1c/31987/%ED%83%90%EC%83%89%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98.png 1000w,\n/static/3f7fbd3be95364da1f101e9494b3be1c/e4d72/%ED%83%90%EC%83%89%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98.png 1280w","sizes":"(max-width: 500px) 100vw, 500px"}}},"categories":["알고리즘","Python"]},"rawMarkdownBody":"\n# 순차탐색알고리즘\n\n리스트 안에 있는 특정한 데이터를 찾기 위해 앞에서부터 데이터를 하나씩 차례대로 확인하는 방법\n\n- 주로, 정렬되지 않는 리스트에서 데이터를 하나씩 차례대로 확인하는 방법\n- 리스트 내에 데이터가 아무리 많아도 시간만 충분하다면 항상 원하는 원소(데이터)를 찾을 수 있다는 장점\n- 리스트에 특정 원소가 있는 지 체크할 경우, 리스트에서 특정한 값을 가지는 원소의 개수를 세는 count() 메서드 이용할 경우\n\n```python\n#순차 탐색 코드\n\ndef sequentail_search(n,target,array):\n #각 원소를 하나씩 확인하며\n for i in range(n):\n #현재의 원소가 찾고자 하는 원소가 동일한 경우\n if array[i] == target:\n return i+1 #현재의 위치 변환(인덱스는 0부터 시작하므로 1더하기)\n\nprint('생성할 원소 개수를 입력한 다음 한 칸 띄고 찾을 문자열을 입력하세요.')\ninput_data = input().split()\nn = int(input_data[0]) #원소의 개수\ntarget = input_data[1] #찾고자 하는 문자열\n\nprint('앞서 적은 원소 개수만큼 문자열을 입력하세요. 구분은 띄어쓰기 한 칸으로 합니다.')\narray = input().split()\n\n#순차 탐색 수형결과 출력\nprint(sequentail_search(n,target,array))\n```\n\n# 이진탐색알고리즘\n\n- 이진 탐색: 정렬되어 있는 리스트에서 탐색 범위를 절반씩 좁혀가며 데이터를 탐색하는 방법\n - 이진 탐색은 시작점, 끝점, 중간점을 이용하여 탐색 범위를 설정한다\n\n## 이진 탐색 동작 예시\n\n- 이미 정렬된 10개의 데이터 중에서 값이 4인 원소를 찾는 예시를 살펴보자\n ![](https://velog.velcdn.com/images/minseok0123/post/9ba4721a-c960-4925-97e8-a80eddcc3d55/image.png)\n- **[Step 1]** 시작점: 0, 끝점: 9, 중간점: 4 (소수점 이하 제거)\n ![](https://velog.velcdn.com/images/minseok0123/post/9d2823ae-177e-4255-a268-c10f29e78f5a/image.png)\n- **[Step 2]** 시작점:0, 끝점: 3, 중간점: 1 (소수점 이하 제거)\n ![](https://velog.velcdn.com/images/minseok0123/post/77cef67b-a7df-427c-99e0-957112c3655f/image.png)\n- **[Step 3]** 시작점: 2, 끝점: 3, 중간점: 2 (소수점 이하 제거)\n ![](https://velog.velcdn.com/images/minseok0123/post/b8a1ff21-c596-470b-9264-9bd14ecd401d/image.png)\n\n---\n\n## 이진 탐색의 시간 복잡도\n\n- 단계마다 탐색 범위를 2로 나누는 것과 동일하므로 연산 횟수는 log₂𝑁에 비례한다\n- 예를 들어 초기 데이터 개수가 32개일 때, 이상적으로 1단계를 거치면 16개가량의 데이터만 남는다\n - 2단계를 거치면 8개가량의 데이터만 남는다\n - 3단계를 거치면 4개가량의 데이터만 남는다\n\n---\n\n```python\n# 이진 탐색 소스코드 구현 (재귀 함수)\ndef binary_search(array, target, start, end):\n if start > end:\n return None\n mid = (start + end) // 2\n # 찾은 경우 중간점 인덱스 반환\n if array[mid] == target:\n return mid\n # 중간점의 값보다 찾고자 하는 값이 작은 경우 왼쪽 확인\n elif array[mid] > target:\n return binary_search(array, target, start, mid - 1)\n # 중간점의 값보다 찾고자 하는 값이 큰 경우 오른쪽 확인\n else:\n return binary_search(array, target, mid + 1, end)\n\n# n(원소의 개수)과 target(찾고자 하는 값)을 입력 받기\nn, target = list(map(int, input().split()))\n# 전체 원소 입력 받기\narray = list(map(int, input().split()))\n\n# 이진 탐색 수행 결과 출력\nresult = binary_search(array, target, 0, n - 1)\nif result == None:\n print(\"원소가 존재하지 않습니다\")\nelse:\n print(result + 1)\n```\n\n```python\n# 이진 탐색 소스코드 구현 (반복문)\ndef binary_search(array, target, start, end):\n while start <= end:\n mid = (start + end) // 2\n # 찾은 경우 중간점 인덱스 반환\n if array[mid] == target:\n return mid\n # 중간점의 값보다 찾고자 하는 값이 작은 경우 왼쪽 확인\n elif array[mid] > target:\n end = mid - 1\n # 중간점의 값보다 찾고자 하는 값이 큰 경우 오른쪽 확인\n else:\n start = mid + 1\n return None\n\n# n(원소의 개수)과 target(찾고자 하는 값)을 입력 받기\nn, target = list(map(int, input().split()))\n# 전체 원소 입력 받기\narray = list(map(int, input().split()))\n\n# 이진 탐색 수행 결과 출력\nresult = binary_search(array, target, 0, n - 1)\nif result == None:\n print(\"원소가 존재하지 않습니다.\")\nelse:\n print(result + 1)\n```\n\n## 마지막 정리\n\n**_이진 탐색_**\n\n- 정렬된 배열에서 중간 값을 비교하여 탐색 범위를 반씩 줄여가며 원하는 값을 찾는 알고리즘.\n- 시간 복잡도는 O(log n)으로 매우 효율적이지만, 배열이 정렬되어 있어야 한다는 제약이 있다.\n- 이진 탐색은 반복문 또는 재귀적으로 구현할 수 있다.\n\n_**순차 탐색**_\n\n- 배열이나 리스트와 같은 선형 구조에서 처음부터 끝까지 원하는 값을 찾을 때 사용하는 간단한 탐색 알고리즘.\n- 시간 복잡도는 O(n)으로 배열의 크기에 비례하여 선형적으로 증가한다.\n- 배열이나 리스트의 크기가 작거나 정렬되지 않은 경우에 유용하게 사용될 수 있다.\n"},{"id":"a8c6ae56-4ff1-5fab-bd90-96ad42b7bde1","excerpt":"Class와 Struct차이 사용하는 이유! 기존 C 언어에서는 Class 구분이 없이 Struct를 사용해서 기존 C와 호환성을 위해 Struct를 사용한다. - Struct Struct는 상속받을 수 없다. Struct는 값 타입(ValueType)이다. 그래서 new 키워드로 메모리를 할당 할 필요가 없다. 값 타임의 경우 스텍이라는 메모리 영역에 할당 된다. - Class Class는 상속받을 수 있다. Class…","fields":{"slug":"/C샵 Class와 Struct차이/"},"frontmatter":{"title":"C# Class와 Struct차이","date":"2023.10.26","thumbnail":{"publicURL":"/static/8a8d8d39fdfb9e97eb9f96e090c3d0bb/StructvsClass.png","childImageSharp":{"fluid":{"base64":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAQCAIAAACZeshMAAAACXBIWXMAAAsTAAALEwEAmpwYAAAB+ElEQVR42o2STU9TURCG+Ueu/QXAzsSFMca4E8JCouwVEuPHwqSbpgk1sNAWJQQX11RsrS2QQOUWwSZNKgER6MeltKW35/aerztzTO8xtYgFZzdn5pn3zHvOgOoJCeqogRUb9mtQbuJxCwlDhynCsGBBtYW7VXAYKqXQ7x/QGPhZoQI3wnRmTTxYYGNRdi1Epww+vSJGIyyYFkZO3pqhFduHsQfWSbWFd2bp6y9i8at8/lGMRVkgKcbn2eMYf/GJbx5AKC08UH8r6/BAWTZyqRyu2gwJR9uBSh08VHsnwKQiFLWMOg//XgE6g8EFGj+l72oiVvd8rV7s3zCg6hripppszW7HGt29APvDurR9BPky1AhKUHsnaFPMFaHchFwJsB+sp+bLMLHA3mZlICF2LBgOtF+ti9uz9OkSv/mS2vSP1WdgfVQ8xUmDvzHlkxgPfuYjczyY4hPzbHpVjERYqdkH7l677mDLRQKqLhAId1ERobjsfJhLDMPO4E6TV3X3J7c2hhKHgTw6slew/1P5HaLBzaHEQajAD93vD7cy1+Me0zxeCPu+tXfswrjZWD9eujKXuZvM3lt2S87lMPqw+4OsDBqWWfwWNrOPVo2rEV6j/6Gsq6CS999HBsPLU/HocDjzLH2mesH37Cr8TO1+GF20tkvnNTX8CzcBeoDC+yPjAAAAAElFTkSuQmCC","aspectRatio":1.288659793814433,"src":"/static/8a8d8d39fdfb9e97eb9f96e090c3d0bb/46604/StructvsClass.png","srcSet":"/static/8a8d8d39fdfb9e97eb9f96e090c3d0bb/62d80/StructvsClass.png 125w,\n/static/8a8d8d39fdfb9e97eb9f96e090c3d0bb/e1953/StructvsClass.png 250w,\n/static/8a8d8d39fdfb9e97eb9f96e090c3d0bb/46604/StructvsClass.png 500w,\n/static/8a8d8d39fdfb9e97eb9f96e090c3d0bb/d8815/StructvsClass.png 750w,\n/static/8a8d8d39fdfb9e97eb9f96e090c3d0bb/db955/StructvsClass.png 900w","sizes":"(max-width: 500px) 100vw, 500px"}}},"categories":["C샵"]},"rawMarkdownBody":"\n# Class와 Struct차이\n\n### 사용하는 이유!\n\n> _기존 C 언어에서는 Class 구분이 없이 Struct를 사용해서 기존 C와 호환성을 위해 Struct를 사용한다._\n\n## - Struct\n\n1. Struct는 상속받을 수 없다.\n2. Struct는 값 타입(ValueType)이다. 그래서 new 키워드로 메모리를 할당 할 필요가 없다.\n3. 값 타임의 경우 스텍이라는 메모리 영역에 할당 된다.\n\n```csharp\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\n\nnamespace StudyC\n{\n\n struct 할아버지\n {\n public void 할아버지재산()\n {\n Console.WriteLine(\"[1] 할아버지 재산\");\n }\n }\n\n struct 아버지\n {\n public void 아버지재산()\n {\n Console.WriteLine(\"[2] 아버지 재산\");\n }\n }\n\n struct 아들\n {\n public void 아들재산()\n {\n Console.WriteLine(\"[3] 아들 재산\");\n }\n }\n\n internal class Program\n {\n static void Main(string[] args)\n {\n 할아버지 grandFather; //값 타입이라서 new 키워드를 사용하지 않고 사용가능;\n grandFather.할아버지재산();\n\n 아버지 Father; //값 타입이라서 new 키워드를 사용하지 않고 사용가능;\n Father.아버지재산();\n\n 아들 son; //값 타입이라서 new 키워드를 사용하지 않고 사용가능;\n son.아들재산();\n }\n }\n\n}\n```\n\n---\n\n## - Class\n\n1. Class는 상속받을 수 있다.\n2. Class는 참조(Reference Type)이다. 그래서 new 키워드를 사용해 메모리 할당이 필요하다.\n3. 참조 타입은 힙에 할당하는 값의 주소를 가지고 있다.\n\n```csharp\n\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\n\nnamespace StudyC\n{\n\n class 할아버지\n {\n public void 할아버지재산()\n {\n Console.WriteLine(\"[1] 할아버지 재산\");\n }\n }\n\n class 아버지 : 할아버지 //아버지는 할아버지의 재산을 상속받았다.\n {\n public void 아버지재산()\n {\n Console.WriteLine(\"[2] 아버지 재산\");\n }\n }\n\n class 아들 : 아버지 //아들은 아버지의 재산을 상속받았다 => (아버지는 할아버지의 재산을 상속받았기 때문에 아들을 아버지, 할아버지 둘다 재산을 상속받는다)\n {\n public void 아들재산()\n {\n Console.WriteLine(\"[3] 아들 재산\");\n }\n }\n\n internal class Program\n {\n static void Main(string[] args)\n {\n 할아버지 GrandFather = new 할아버지(); //new 키워드를 이용해 메모리에 할당함;\n GrandFather.할아버지재산();\n\n 아버지 Father = new 아버지(); //new 키워드를 이용해 메모리에 할당함;\n Father.아버지재산();\n Father.할아버지재산() ; //할아버지 재산을 상속받아서 할아버지재산에 접근할 수 있다.\n\n 아들 son = new 아들(); //new 키워드를 이용해 메모리에 할당함;\n son.아들재산();\n son.아버지재산(); //아버지 재산을 상속받아서 아버지재산에 접근할 수 있다.\n son.할아버지재산(); //아버지 재산에 할아버지 재산이 포함되어 있기 때문에 할아버지 재산에도 접근이 가능하다.\n }\n }\n\n}\n```\n\n### 상속을 하는 이유\n\n> 만약 게임에서 캐릭터의 공통능력치가 약 5000줄 이라고 하면,\n> 각 캐릭터 클래스 마다 일일히 5000줄을 다 넣어줘야 한다.\n> 하지만 상속을 이용하면 공통능력치라는 클래스를 만들고\n> 각 캐릭터에 상속을 시켜주면 공통능력치를 다 줄수있다.\n\n### class에서 상속을 금지하는 방법\n\n```csharp\n sealed class 할아버지\n {\n public void 할아버지재산()\n {\n Console.WriteLine(\"[1] 할아버지 재산\");\n }\n }\n```\n\nclass 앞에 \"sealed\"를 붙이면 상속이 금지된다. =>\n(아버지가 상속을 받지 못하고, 아들도 할아버지의 재산을 상속받지 못한다)\n\n---\n\n### Struct는 언제 쓰면 좋을까?\n\n구조체가 클래스보다 속도가 빠르다는 장점이 있다.\n\n하지만 스텍 메모리만 사용하자니 스텍 메모리는 제한이 있어 많이 사용할 경우 스텍오버플로우가 발생할 수 있으니 적절히 균형있게 사용하는게 좋다.\n\n## 결론\n\nStruct와 Class의 큰 차이는 상속에 대한 처리 및 그 사용성도 있지만 타입(값, 참조)에 따른 메모리 할당 방식의 차이가 가장 크다.\n\n하지만 아직 언제 사용하면 좋을지 감은 잘 오지 않는다. 이것에 대해서는 조금 더 공부해야겠다.\n"},{"id":"62d166c7-a851-5574-a832-186fc08a4534","excerpt":"const상수와 readonly 상수 차이 const 상수 상수 : 변수와는 달리 변경이 불가능하다. (예) 10 = 100; const 키워드 : 상수를 선언하는 키워드이다. [const의 특징] 자동 static (static으로 선언하지 않아도 자동으로 static이 된다) 반드시 초기화 (초기화하지 않으면 에러가 발생한다) 초기화후 변경 불가 (const 상수는 단 한번만 초기화가 가능하다) readonly 상수 const…","fields":{"slug":"/const 상수와 readonly 상수 차이/"},"frontmatter":{"title":"const 상수와 readonly 상수 차이","date":"2023.11.03","thumbnail":{"publicURL":"/static/e5795fbecfe5d7db46c82eb6f188ec41/constVSreadonly.png","childImageSharp":{"fluid":{"base64":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAMCAIAAADtbgqsAAAACXBIWXMAAA7DAAAOwwHHb6hkAAABIElEQVR42qWQTYuDMBCG+///QaF4KbYXS+jVQ+lFqIKHevRUQjUkNUbjR6ImumCgy3a77S77nCYwT2bmXUz/YPHwHoahqirGWNd1fd9zzhljeZ7Xdf1KHsdxmqbb7RYEge/7CKGqqsIwBAAEQRDHsWl4NVlKiRDinJdlmWUZpZQQwhj71eSiKFzXtW17v9/vdrvj8Xg+n33fJ4Tce57IWutxHJVSbdsKIRhjSZJcr1cpZTfzSn5YoWma0+l0uVy+O4+yUiqKIkop5xxCWNc1mimKAmOc5zmEEGOcpqnW+lM2v0opHcexLGu5XK5Wq81ms91u1+v14XDwPI8QYgoAgEnOWF9u7meGGa01pVQIoZQyWWitTf1j2k95c/OfnLv8ATcnrTlW44OWAAAAAElFTkSuQmCC","aspectRatio":1.6025641025641026,"src":"/static/e5795fbecfe5d7db46c82eb6f188ec41/46604/constVSreadonly.png","srcSet":"/static/e5795fbecfe5d7db46c82eb6f188ec41/62d80/constVSreadonly.png 125w,\n/static/e5795fbecfe5d7db46c82eb6f188ec41/e1953/constVSreadonly.png 250w,\n/static/e5795fbecfe5d7db46c82eb6f188ec41/46604/constVSreadonly.png 500w,\n/static/e5795fbecfe5d7db46c82eb6f188ec41/9c108/constVSreadonly.png 585w","sizes":"(max-width: 500px) 100vw, 500px"}}},"categories":["C샵"]},"rawMarkdownBody":"\n# const상수와 readonly 상수 차이\n\n## const 상수\n\n- 상수 : 변수와는 달리 변경이 불가능하다. (예) 10 = 100;\n- const 키워드 : 상수를 선언하는 키워드이다.\n\n### [const의 특징]\n\n1. 자동 static (static으로 선언하지 않아도 자동으로 static이 된다)\n2. 반드시 초기화 (초기화하지 않으면 에러가 발생한다)\n3. 초기화후 변경 불가 (const 상수는 단 한번만 초기화가 가능하다)\n\n```csharp\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\n\n\npublic class ConstSample\n{\n public const double 로켓공식 = 3.14; // 절대로 바뀌면 안되는 정보\n\n public void 함수()\n {\n //로켓공식 = 4.2213; // 정수가 아니라 상수라서 값을 바꿀 수 없다\n }\n}\n\npublic class ConstTest\n{\n public static void Main(string[] args)\n {\n Console.WriteLine(ConstSample.로켓공식);\n\n // 객체 선언해서 메모리 할당X -> static이기 때문에 프로그램이 시작하자마자 바로 메모리가 할당되므로\n // 다이렉트로 접근 가능!\n }\n}\n```\n\n## readonly 상수\n\n### const 와의 차이점 (readonly 상수의 특징)\n\n1. 반드시 초기화할 필요없다.\n2. 생성자에서 딱 한번 값을 할당할 수 있다.\n3. const와는 다르게 자동으로 static이 되지 않는다.\n - static 키워드를 사용하면 스태틱 상수가 된다.\n - static 키워드를 사용하지 않으면 일반 상수가 된다.\n\n```csharp\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\n\n\npublic class 로켓외부요인\n{\n // readonly 스태틱 방식\n // readonly 일반 방식\n\n public readonly static int 날씨맑음_STATIC_READONLY; // readonly로 선언한 상수 : 초기화를 안시켜도 에러가 안남\n public readonly int 날씨흐림_NORMAL_READONLY;\n\n // 1. static 생성자\n static 로켓외부요인()\n {\n // readonly에서는 static은 static끼리 할당 가능함\n 날씨맑음_STATIC_READONLY = 100;\n //날씨흐림_NORMAL_READONLY = 200; // static이 아니라서 할당 불가능\n }\n // 2. 일반 생성자\n 로켓외부요인(int 바람세기)\n {\n //날씨맑음_STATIC_READONLY = 100; // static이라서 할당 불가능\n 날씨흐림_NORMAL_READONLY = 바람세기;\n }\n\n public static void Main(string[] args)\n {\n // 1. static readonly 호출 : static 호출방식 (별도의 메모리 할당과정 없이 바로 사용)\n Console.WriteLine(로켓외부요인.날씨맑음_STATIC_READONLY);\n\n // 2. normal readonly 호출 : 일반 호출방식 (객체를 만들어서 메모리를 할당한 뒤에 사용 가능)\n 로켓외부요인 normal = new 로켓외부요인(1000);\n Console.WriteLine(normal.날씨흐림_NORMAL_READONLY);\n\n }\n}\n```\n"},{"id":"07549a5f-1215-5908-b0ce-13d89002a299","excerpt":"DFS 루트 노드(혹은 다른 임의의 노드)에서 시작해서 다음 분기(branch)로 넘어가기 전에 해당 분기를 완벽하게 탐색하고 넘어가는 방법. 넓게(wide) 탐색하기 전에 깊게(deep) 탐색한다.모든 노드를 방문 하고자 하는 경우에 이 방법을 사용한다.\n 보다 좀 더 간단하다.단순 검색 속도 자체는 BFS…","fields":{"slug":"/DFS와 BFS/"},"frontmatter":{"title":"DFS와 BFS","date":"2023.05.15","thumbnail":{"publicURL":"/static/b8ff6dc0a1e900b190c9d40910300f12/DFS AND BFS.png","childImageSharp":{"fluid":{"base64":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAJCAYAAAAywQxIAAAACXBIWXMAAAsTAAALEwEAmpwYAAABoklEQVR42l3STUuUURgG4GvG0ZIZHW2GGccZp7TJGT+SKVQyTaQPIWoVQRKRCNGuMoQ2gS2MIFpIu2gVLoL6A/2DWgW1alEt+gftW7xx5n2t6IZznodz7vN83OeBRTzGFFxiNkNVgis4QAoZsb2F+8huUEYxoaY6ex9dSAf/K8UhGgs0PlCIECXkFJnLsT9QJBeRO0MbzV3/4HNir9KcZGYBk5insclMlGTO0B3sKF4w3KYVku1hnBEMdgIlVXQvMb3M0XC2hBLF1ThgJnDyScCAY7TG4rv+iOLLWK7Wp33CVieJ3HVqO1SCBFu0nlG4zeg3UofpfovXHHpCfZvqOyq/yM/FOvZ2VkR6lsXTDGH4Giez9J+nfYGePuY+xu2kAneeU2uMrzMR9NuL3028p1zkhDcMrFN5Tn2DrqfUgm7fk+qjv3J3Wl+lskbhB+VHHImovaL0k/zNoMxZ5sLX52ncoTrN1INY5D/oJb0Zf051g+N3aZ+j1GI0R2E/8cXgLJMTj052hYNhkm6Q9V+FX+jZob7C4D3Gdhl5SFPC3Y6r9xtWAUcUds4EfgAAAABJRU5ErkJggg==","aspectRatio":2.272727272727273,"src":"/static/b8ff6dc0a1e900b190c9d40910300f12/46604/DFS%20AND%20BFS.png","srcSet":"/static/b8ff6dc0a1e900b190c9d40910300f12/62d80/DFS%20AND%20BFS.png 125w,\n/static/b8ff6dc0a1e900b190c9d40910300f12/e1953/DFS%20AND%20BFS.png 250w,\n/static/b8ff6dc0a1e900b190c9d40910300f12/46604/DFS%20AND%20BFS.png 500w,\n/static/b8ff6dc0a1e900b190c9d40910300f12/d8815/DFS%20AND%20BFS.png 750w,\n/static/b8ff6dc0a1e900b190c9d40910300f12/31987/DFS%20AND%20BFS.png 1000w,\n/static/b8ff6dc0a1e900b190c9d40910300f12/ed396/DFS%20AND%20BFS.png 2000w","sizes":"(max-width: 500px) 100vw, 500px"}}},"categories":["알고리즘","Python"]},"rawMarkdownBody":"\n# DFS\n\n**루트 노드(혹은 다른 임의의 노드)에서 시작해서 다음 분기(branch)로 넘어가기 전에 해당 분기를 완벽하게 탐색하고 넘어가는 방법.** 넓게(wide) 탐색하기 전에 **깊게(deep)** 탐색한다.**모든 노드를 방문 하고자 하는 경우**에 이 방법을 사용한다.\n`DFS가` `BFS`보다 좀 더 간단하다.단순 검색 속도 자체는 BFS에 비해서 느리다.\n스택이나 재귀 함수를 통해서 구현할 수 있는데 재귀 함수가 구현이 간편하므로 대부분 재귀 함수로 구현한다.\n\n- 구현할 때 주의할 점 : 그래프 탐색의 경우 어떤 노드를 방문했었는지 여부를 반드시 검사 해야 한다.\n - 이를 검사하지 않을 경우 무한루프에 빠질 위험이 있다.\n\n### DFS 알고리즘 구현방식\n\n![](https://velog.velcdn.com/images/minseok0123/post/be4be19c-dce2-4c21-9d57-b499d69f729e/image.png)\n\n1. a 노드(시작 노드)를 방문\n\n- 방문한 노드는 방문했다고 체크한다!\n\n2. a와 인접한 노드들을 차례로 순회\n\n- a와 인접한 노드가 없다면 종료\n\n3. a와 이웃한 노드 b를 방문했다면, a와 인접한 또 다른 노드를 방문하기 전에 b의 이웃 노드들을 전부 방문해야 한다.\n\n- b를 시작 정점으로 DFS를 다시 시작하여 b의 이웃 노드들을 방문한다.\n\n4. b의 분기를 전부 완벽하게 탐색했다면 다시 a에 인접한 정점들 중에서 아직 방문이 안 된 정점을 찾는다.\n\n- 즉, b의 분기를 전부 완벽하게 탐색한 뒤에야 a의 다른 이웃 노드를 방문할 수 있다는 뜻이다.\n- 아직 방문이 안 된 정점이 없으면 종료\n- 있으면 다시 그 정점을 시작 정점으로 DFS를 시작!\n\n```python\nvoid search(Node root) {\n if (root == null) return;\n\n // 1. root 노드 방문\n visit(root);\n root.visited = true; // 1-1. 방문한 노드를 표시\n\n // 2. root 노드와 인접한 정점을 모두 방문\n for each (Node n in root.adjacent) {\n if (n.visited == false) { // 4. 방문하지 않은 정점을 찾는다.\n search(n); // 3. root 노드와 인접한 정점 정점을 시작 정점으로 DFS를 시작\n }\n }\n}\n```\n\n---\n\n```python\ngraph = [[0],\n [2, 3, 8],\n [1, 7],\n [1, 4, 5],\n [3, 5],\n [3, 4],\n [7],\n [2, 6, 8],\n [1, 7]]\n\nvisited = [False] * 9\ndef dfs(v, graph, visited):\n visited[v] = True\n print(v, end=\" \")\n for node in graph[v]:\n if not visited[node]:\n dfs(node, graph, visited)\n\n\ndfs(1, graph, visited)\n```\n\n### DFS의 장점\n\n- 현재 경로상의 노드들만 기억하면 되므로, 저장 공간의 수요가 비교적 적음\n- 목표 노드가 깊은 단계에 있는 경우 해를 빨리 구할 수 있음\n- 구현이 너비 우선 탐색(BFS) 보다 간단함\n\n### DFS의 단점\n\n- 단순 검색 속도는 너비 우선 탐색(BFS) 보다 느림\n- 해가 없는 경우에 빠질 가능성이 있음(사전에 임의의 깊이를 지정한 후 탐색하고, 목표 노드를 발견하지 못할 경우 다음 경로를 탐색하도록 함)\n- 깊이 우선 탐색은 해를 구하면 탐색이 종료되므로, 구한 해가 최단 경로가 된다는 보장이 없음(목표에 이르는 경로가 다수인 경우 구한 해가 최적이 아닐 수 있음)\n\n### DFS의 시간 복잡도\n\n- DFS는 그래프(정점의 수: N, 간선의 수: E)의 모든 간선을 조회한다.\n - 인접 리스트로 표현된 그래프: O(N+E)\n - 인접 행렬로 표현된 그래프: O(N^2)\n\n# BFS\n\n그래프 전체를 탐색하는 방법 중 하나.루트 노드 (혹은 다른 임의의 노드)에서 시작해서 인접한 노드를 먼저 탐색하는 방법.시작 정점으로부터 가까운 정점을 먼저 방문하고 멀리 떨어져 있는 정점을 나중에 방문하는 순회방법.종이에 먹물이 퍼지는 것과 같음.즉, 깊게(deep) 탐색하기 전에 넓게(wide) 탐색한다 !BFS가 진행될수록 탐색 범위는 출발점에서 멀어진다.\n주로 두 노드 사이의 최단 경로 혹은 임의의 경로를 찾고 싶을 때 사용하는 방법이다.(최단 경로, 길찾기)방문한 노드들을 차례대로 저장한 후 꺼낼 수 있는 자료구조인 Queue를 사용한다.\n\n### queue\n\nQueue는 **선입선출(FIFO, Fisrt In First Out)** 자료구조.먼저 들어온 것이 먼저 나간다.고속도로 톨게이트를 생각하자.\n\n- 특징\n - 재귀적으로 동작하지 않는다.\n - 어떤 노드를 방문했었는지 여부를 반드시 검사해야 한다.\n - 검사하지 않을 경우 무한루프에 빠질 위험이 있다.\n- 장점\n - 로직이 단순하다.\n - 최초 발견 루트를 최단 경로라고 보장할 수 있다.\n - 노드의 숫자가 적고, 깊이가 얕은 경우 -> 단순검색속도가 DFS보다 빠르다.\n- 단점\n - 비교적 많은 저장 공간이 필요하다.\n\n### BFS 알고리즘 구현방식\n\n**큐**를 활용해서 구현.\n![](https://velog.velcdn.com/images/minseok0123/post/e38ad96a-db7a-47cf-a9fd-4f82318c78c6/image.png)\n\n1. a 노드(시작 노드)를 방문. (방문한 노드 체크)\n\n- 큐에 방문한 노드를 삽입. `enqueue`\n- 초기 상태의 큐에는 시작 노드만 저장되어 있다.\n - 즉, a노드의 이웃 노드를 모두 방문한 다음에 이웃의 이웃들을 방문한다 !\n\n2. 큐에서 꺼낸 노드와 인접한 노드들을 모두 차례대로 방문.\n\n- 큐에서 꺼낸 노드를 방문\n- 큐에서 꺼낸 노드와 인접한 노드들을 방문\n - 인접한 노드가 없다면 큐의 앞에서 노드를 꺼낸다. `dequeue`\n- 큐에 방문된 노드를 삽입. `enqueue`\n\n3. 큐가 다 소진될 때까지 계속 반복.\n\n```python\nvoid search(Node root) {\n Queue queue = new Queue();\n root.marked = true; // (방문한 노드 체크)\n queue.enqueue(root); // 1-1. 큐의 끝에 추가\n\n // 3. 큐가 소진될 때까지 계속한다.\n while (!queue.isEmpty()) {\n Node r = queue.dequeue(); // 큐의 앞에서 노드 추출\n visit(r); // 2-1. 큐에서 추출한 노드 방문\n // 2-2. 큐에서 꺼낸 노드와 인접한 노드들을 모두 차례로 방문한다.\n foreach (Node n in r.adjacent) {\n if (n.marked == false) {\n n.marked = true; // (방문한 노드 체크)\n queue.enqueue(n); // 2-3. 큐의 끝에 추가\n }\n }\n }\n}\n```\n\n```python\nlet bfs = function (node) {\n // TODO: 노드의 탐색을 treeBFS 탐색 순으로 배열에 담아내자\n let result = [];\n let queue = [node]; // 조회할 노드를 순차적으로 넣는다.\n\n // 조회할 노드가 없을때까지\n while (queue.length) {\n let target = queue.shift();\n result.push(target.value);\n // 자식 노드들을 순차적으로 queue에 쌓아준다.\n for (let node of root.children) {\n queue.push(node);\n }\n\n }\n return result;\n};\nlet Node = function (value) {\n this.value = value;\n this.children = [];\n};\n\n// 위 Node 객체로 구성되는 트리는 매우 단순한 형태의 트리.\n// membership check(중복 확인)를 따로 하지 않는다.\nNode.prototype.addChild = function (child) {\n this.children.push(child);\n return child;\n};\n```\n\n---\n\n```python\nfrom collections import deque\n\nvisited = [False] * 9\ngraph = [[0],\n [2, 3, 8],\n [1, 7],\n [1, 4, 5],\n [3, 5],\n [3, 4],\n [7],\n [2, 6, 8],\n [1, 7]]\n\nq = deque()\n\ndef bfs(start, graph, visited):\n visited[start] = True\n q.append(start)\n\n while q:\n v = q.popleft()\n print(v, end=\" \")\n for i in graph[v]:\n if not visited[i]:\n q.append(i)\n visited[i] = True\n\nbfs(1, graph, visited)\n```\n\n### BFS의 장점\n\n- 노드의 수가 적고 깊이가 얕은 경우 빠르게 동작할 수 있다.\n- 단순 검색 속도가 DFS보다 빠르다.\n- 최단 경로가 존재한다면 어느 한 경로가 무한히 깊어진다고 해도 최단 경로를 반드시 찾을 수 있다.\n\n### BFS의 단점\n\n- 노드의 수가 늘어나면 탐색해야 하는 노드 또한 많아지기 때문에 비현실적이다.\n- 재귀호출의 DFS와는 달리 다음에 탐색할 정점들을 큐에 저장해야 하므로 저장공간이 많이 필요하다.\n\n### BFS의 시간 복잡도\n\n- 인접 리스트로 표현된 그래프 : `O(N+E)`\n- 인접 행렬로 표현된 그래프 : `O(N^2)`\n\n## 마지막 정리\n\n> DFS (깊이 우선 탐색): 트리나 그래프에서 한 노드의 자식들을 우선으로 탐색하는 방식. 더 이상 자식이 없을 때까지 계속해서 깊이를 우선으로 내려가며 탐색한다.\n\n> BFS (너비 우선 탐색): 트리나 그래프에서 한 노드의 형제들을 우선으로 탐색하는 방식. 같은 레벨에 있는 노드들을 먼저 탐색한 후, 다음 레벨로 이동한다.\n\n> DFS는 스택 또는 재귀 함수를 이용하여 구현할 수 있으며, BFS는 큐를 이용하여 구현할 수 있다.\n"},{"id":"eef22044-29c8-5dca-9531-08bfcd10c1d5","excerpt":"1. 기획의도 웹을 통해 기숙사 방 문을 원격으로 쉽게 열 수 있습니다. 일과시간 내에 외부 출입자를 감지하고, 해당 정보를 기록할 수 있습니다. 기숙사의 온도와 습도를 실시간으로 모니터링할 수 있습니다. 2. 프로젝트 구성 하드웨어 구성 1. 모션 감지 센서: 사람의 출입을 감지하고, 해당 출입시간을 데이터베이스에 기록합니다. 학교의 일과시간 중에 출입이 감지되면 부저를 울리고 웹으로 경고 메시지를 전송합니다.…","fields":{"slug":"/ESP32로 만든 스마트 기숙사 시스템/"},"frontmatter":{"title":"ESP32로 만든 스마트 기숙사 시스템","date":"2023.06.20","thumbnail":{"publicURL":"/static/28647871d9e4c8d77b2e3dd8245a493a/ESP32.png","childImageSharp":{"fluid":{"base64":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAALCAIAAADwazoUAAAACXBIWXMAAAPoAAAD6AG1e1JrAAACe0lEQVR42hXO3U7aUAAA4GZeKFShp6ftac8p9JSWQis4FUEFwZ9KKSioc5rNoYlz6AU4NXHBJct24eKyqHEPYLJkybJd+ArzYt7IWy37nuBj8EAE9RMYEMLhof6BAY6DCocQL0ZFLITEMMRBqA4CCSHFST+dyuedpIkNNTU5JscJg0KKEBTZYNh1Xc/zstlceAhWXX+x5Na8pWx2quwvl4pz8/Nuvd5o1JfTaScIWKiIyCCMoGIoS5ZlPTz87fV6v3/91DTz8vK6VJi7ufl2fHSyv3+wsOBeXl6VPa97dgZFwHLBEAaAACYQsOPWsO0M39//eXx8/PHjO1Hp+fnnwkyp231/d3fnVaq1Wv3i4svt7e2i74lYJBgOsoFBNsD09SWCYZMa8U8fP1xffT3Yb9GYZTlpMzlMTUvVYhBhmURJlJoJWzN1FEW6EYEQAMAxnBQDGEd1M6pqkoSRhCOa0Vhdq/jVQnF2bt6tr6yWK361tsSLcnYyV3JnV5/VdarplDI8JkBCqmaMjU5kxnOKHKEx6/DtUbvTedXc3t19/Xxj8/j4ZG/vTb5Q7HQOu91uu932i8XM+DiDNMop2DQ0ikHfk35RQJpubm3v7LX2X7zcaja3m82d6fxMq9VaWVkjhDrOcC6Xy2cyoymbUWWiSIRE9KnJaUVRZaRourmwWF5u/N/6taX1jc1y2fP9qudVBEWTaDKVTqftxIgdZygkfEgQJHx6+q7X662vbwIBASXC0yRHdE7CMCJzURjSwsACQNZCxEJJ20nGUnac4XlxkIMkSnUzbliW7ThAjnBYY80JCAUeEd4BAWOAVVguFaKxGEkk9dGRlGWmU8l/t9uJbqkmulUAAAAASUVORK5CYII=","aspectRatio":1.7857142857142858,"src":"/static/28647871d9e4c8d77b2e3dd8245a493a/46604/ESP32.png","srcSet":"/static/28647871d9e4c8d77b2e3dd8245a493a/62d80/ESP32.png 125w,\n/static/28647871d9e4c8d77b2e3dd8245a493a/e1953/ESP32.png 250w,\n/static/28647871d9e4c8d77b2e3dd8245a493a/46604/ESP32.png 500w,\n/static/28647871d9e4c8d77b2e3dd8245a493a/d8815/ESP32.png 750w,\n/static/28647871d9e4c8d77b2e3dd8245a493a/31987/ESP32.png 1000w,\n/static/28647871d9e4c8d77b2e3dd8245a493a/e4d72/ESP32.png 1280w","sizes":"(max-width: 500px) 100vw, 500px"}}},"categories":["아두이노","ESP32","PHP","임베디드"]},"rawMarkdownBody":"\n\n# 1. 기획의도\n- 웹을 통해 기숙사 방 문을 원격으로 쉽게 열 수 있습니다.\n- 일과시간 내에 외부 출입자를 감지하고, 해당 정보를 기록할 수 있습니다.\n- 기숙사의 온도와 습도를 실시간으로 모니터링할 수 있습니다.\n---\n\n# 2. 프로젝트 구성\n## 하드웨어 구성\n### 1. 모션 감지 센서:\n- 사람의 출입을 감지하고, 해당 출입시간을 데이터베이스에 기록합니다.\n- 학교의 일과시간 중에 출입이 감지되면 부저를 울리고 웹으로 경고 메시지를 전송합니다.\n### 2. 온/습도 센서:\n- 기숙사 방 안의 온도와 습도를 실시간으로 측정합니다.\n- 웹에서 실시간으로 이 정보를 확인할 수 있습니다.\n### 3. 서보모터:\n- 웹에서 열림 버튼을 누르면 기숙사 방 내의 서보모터를 제어하여 원격으로 문을 열 수 있습니다.\n### 4. 부저:\n- 정해진 시간 외에 출입이 감지되면 소리를 시끄럽게 울립니다.\n### 5. LCD 디스플레이:\n- 와이파이에 연결되면 IP 주소를 디스플레이에 표시합니다.\n- 온도와 습도 정보를 디스플레이에 표시하여 실시간 모니터링이 가능합니다.\n---\n\n## 소프트웨어 구성\n### DB : MYSQL\n### SERVER : PHP\n### WEB : HTML/CSS/JAVASCRIPT\n---\n### 1. 홈페이지:\n- DB에서 페이지 3개의 최근 값을 가져와 네비게이션에 표시해 줍니다.\n- ajax를 이용해 5초 마다 값을 새로 고침해서 DB에서 실시간으로 값을 불러옵니다.\n![](https://velog.velcdn.com/images/minseok0123/post/ce6d51a7-162e-4eee-8ce9-dc1d4bb7094e/image.png)\n### 2. 기숙사 상태\n- ajax를 이용해 5초 마다 값을 새로 고침해서 DB에서 실시간으로 값을 불러옵니다.\n- 현재 기숙사의 온/습도를 ESP32에서 보낸 값을 DB에 저장하고 불러옵니다.\n![](https://velog.velcdn.com/images/minseok0123/post/fc2c3885-2def-4c92-9d68-2ff59db80bfb/image.png)\n### 3. 출입자 관리\n- 전체 보기를 누르면 입과 출입 여부 상관없이 전체 시간대의 출입 내용을 모두 보여준다.\n- 일과 출입 여부를 누르면 일과시간 출입인 값만 필터링해서 가져온다.\n- 데이터값이 많으면 자동으로 페이지네이션 된다.\n- 최근 업데이트를 만들어서 쉽게 몇 분, 몇 시, 며칠 전에 출입했는지 확인할 수 있다.\n- ajax를 이용해 5초 마다 값을 새로 고침해서 DB에서 실시간으로 값을 불러옵니다.\n![](https://velog.velcdn.com/images/minseok0123/post/0ce3c217-21f9-4d39-a008-a8e482481f81/image.png)\n---\n### 3-1 일과시간 수정\n- 일과시간 수정 버튼을 누르면 일과시간을 수정할 수 있는 모달창이 뜬다.\n- 등교시간/하교시간을 수정하고 저장 버튼을 누르면 ESP32웹 서버에 GET으로 값이 전달된다.\n- DB에도 값이 업데이트 되서 필터링 되는 조건이 변경이 된다.\n![](https://velog.velcdn.com/images/minseok0123/post/21528970-57a0-4aad-9148-8f9087b963f2/image.png)\n\n### 4. 원격제어\n- ESP32 웹 서버에 OPEN이라는 값을 GET으로 넘긴다.\n- 값이 들어오면 서보모터를 작동시킨다.\n![](https://velog.velcdn.com/images/minseok0123/post/e3637ae3-289e-4bb4-91e7-5a8e5b4ab15a/image.png)\n### 5. 로그인\n- 디바이스를 할당하기 위해서 계정이 필요했다.\n- 그래서 로그인/회원가입을 만들기로 했다.\n![](https://velog.velcdn.com/images/minseok0123/post/ac7823d8-5fa9-46df-b8bc-45ff17002a7b/image.png)\n### 6. 회원가입\n- 아이디를 입력하고 중복확인을 누르면 DB에 중복되는 아이디가 있는지 확인하다.\n- 비밀번호를 4자리 이상으로 입력해야 한다. (비밀번호는 해시로 암호화 한다)\n- 회원가입 할 때 ESP32의 웹 서버 IP주소를 입력하면 디바이스가 할당된다.\n- 이메일도 중복되지 않아야지 가입이 된다.\n![](https://velog.velcdn.com/images/minseok0123/post/2d81404b-9864-4b47-a458-219663ecf6ef/image.png)\n\n### 7. 비밀번호 찾기\n- 로그인을 만들면서 만약 비밀번호를 까먹으면 새로 가입해야 하는 번거로움이 생겼다.\n만약 새로 가입하지 않을려면 DB를 직접 수정해야 했다.\n- 그래서 비밀번호 찾기를 만들기로 결정했다.\n- PHP MAILER를 이용해서 이메일로 비밀번호 재설정 코드를 보내줬다.\n![](https://velog.velcdn.com/images/minseok0123/post/50dfb2ec-9d15-4d1b-a8bc-7123679badfb/image.png)\n- 이렇게 재설정 인증 코드가 이메일로 온다.\n![](https://velog.velcdn.com/images/minseok0123/post/dcfe5cc8-3758-45d0-b683-0822becfc991/image.png)\n- 인증 코드를 입력하면가 일치하면 비밀번호가 재설정 된다. \n![](https://velog.velcdn.com/images/minseok0123/post/37c4021a-f665-4385-b74b-e7c97e50f318/image.png)\n---\n# 3. 기대효과\n\n- 1. 웹을 통한 원격 문 열기로 인해 출입의 편의성이 향상됩니다.\n- 2. 외부 출입자의 감지와 출입 기록으로 보안 강화와 출입 관리가 용이해집니다.\n- 3. 기숙사 내 온도와 습도를 실시간으로 모니터링하여 안전하고 편리한 환경을 조성합니다.\n---\n\n# 4. 마무리\n\n> 이 프로젝트는 스마트 기숙사 시스템으로 원격 문 열기와 출입 감지, 온/습도 모니터링 등을 제공합니다. 다양한 센서와 LCD 디스플레이를 활용하여 학생들의 안전과 편의성을 향상시킬 수 있습니다. 이 프로젝트는 현대적인 기술과 창의적인 아이디어를 결합하여 효율적인 기숙사 관리 시스템을 구축하는 데 성공하였습니다.\n\n**GITHUB**\n> https://github.com/MinSeok0123/BSSMSECOM"},{"id":"8c0f6337-037a-5f8f-96a9-db46ceccf70e","excerpt":"ESP8266이란? ESP8266은 Wi-Fi 모듈로, 저렴하고 매우 강력한 기능을 가지고 있습니다. 이 모듈은 고성능 마이크로컨트롤러와 Wi-Fi 기능을 하나의 칩에 통합한 것입니다. ESP8266 모듈은 TCP/IP 스택을 내장하여 인터넷에 직접 연결할 수 있으며, Wi-Fi로 인터넷 연결을 지원합니다. ESP8266의 특징 1 .저렴하고 소형이며 경제적인 전력 소비 2. Wi-Fi 연결을 지원 3. 안정적인 TCP/IP 스택 내장…","fields":{"slug":"/ESP8266에 관하여/"},"frontmatter":{"title":"ESP8266에 관하여","date":"2023.04.30","thumbnail":{"publicURL":"/static/17e9e1bda5eeb18bdf00ffb03a9c155b/esp8266.png","childImageSharp":{"fluid":{"base64":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAIAAAAC64paAAAACXBIWXMAAAsTAAALEwEAmpwYAAACOUlEQVR42mP4TwFgoK3mv3///v337+/fv6Rp/vf/399/f6FMKPmPKM3/YLZdu3F9waKefYf2ggX//vv3j4BmkDawmmOnj3kE+Fjamnj7mp85Mev//z///v2HOQdD8z8w+P///+u3r7om9jh6usxZ2PHwwc4TR+fNnhI2Y2r2u3cvIcpQNMPd+efPn/1HDgZFR5pY6i9Z2vri2b4nj3a9fXVw356ZQZE+0UmRN29dhKhngLsTYtjDxw/bezuNra0cHcxion1q6tOOH1927/b27Zvbiov8HFztNfW0du5aBtYMthmi7du3rxu3bAwID9Ex1HNyd01Iic7KSXJwsU9KDpjQmx4f7+Xg5haTGLdwyaw/f39C3MoA0Xnj+rnAYD9rB1tjMxNfP7fM7MTo+Gg9I4PCoixvP3cHZ9u45JSC0vy29spHT65Bgg3kZ0jAL1vcGx8fEp8Ua2RqFBDo4+3n6u/n6ebsoKCiZG5pkZ2XXVqe29FZcf3GiT9/f8BjC2rzly8fFiyYfPr00Z4J3bra6n6uDhZmRoZ6Oo4ujiWlBWVlWUuWTHr//gmuFPb38ZNrV68dnz6jJzk5xs/HU0VdLT0ztaw8r6429/jxbX/+focEEhbN//79/fzlzakzeydMbC4qSFZQlLS2syory548uenps5uQMEXTiZZI/n399v7mnfNz5rR2tWd1dddu3770x48P8OggmDH+/fz15f2HJ/cfXnrx8v5fcJTg0IgzbcNyz7+BLQzwaAYAYqX0bt12wf0AAAAASUVORK5CYII=","aspectRatio":1,"src":"/static/17e9e1bda5eeb18bdf00ffb03a9c155b/46604/esp8266.png","srcSet":"/static/17e9e1bda5eeb18bdf00ffb03a9c155b/62d80/esp8266.png 125w,\n/static/17e9e1bda5eeb18bdf00ffb03a9c155b/e1953/esp8266.png 250w,\n/static/17e9e1bda5eeb18bdf00ffb03a9c155b/46604/esp8266.png 500w,\n/static/17e9e1bda5eeb18bdf00ffb03a9c155b/d8815/esp8266.png 750w,\n/static/17e9e1bda5eeb18bdf00ffb03a9c155b/31987/esp8266.png 1000w,\n/static/17e9e1bda5eeb18bdf00ffb03a9c155b/40a76/esp8266.png 1360w","sizes":"(max-width: 500px) 100vw, 500px"}}},"categories":["ESP8266","Arduino","임베디드"]},"rawMarkdownBody":"\n# ESP8266이란?\n\nESP8266은 Wi-Fi 모듈로, 저렴하고 매우 강력한 기능을 가지고 있습니다. 이 모듈은 고성능 마이크로컨트롤러와 Wi-Fi 기능을 하나의 칩에 통합한 것입니다. ESP8266 모듈은 TCP/IP 스택을 내장하여 인터넷에 직접 연결할 수 있으며, Wi-Fi로 인터넷 연결을 지원합니다.\n\n# ESP8266의 특징\n\n1 .저렴하고 소형이며 경제적인 전력 소비 2. Wi-Fi 연결을 지원 3. 안정적인 TCP/IP 스택 내장 4. AT 명령어를 통한 제어 가능 5. 개발 도구 및 라이브러리가 많음 6. Arduino IDE와 함께 사용 가능\n\n## ESP8266을 사용하는 방법\n\nESP8266 모듈은 AT 명령어를 통해 제어할 수 있습니다. AT 명령어는 모듈에서 사용할 수 있는 명령어를 나타냅니다. ESP8266 모듈은 AT 명령어를 사용하여 Wi-Fi 연결, 인터넷 통신 등을 수행할 수 있습니다. 또한 Arduino IDE를 사용하여 ESP8266을 쉽게 제어할 수 있습니다.\n\nESP8266 모듈을 사용하여 IoT 기기를 개발하는 경우, ESP8266 모듈을 사용하여 Wi-Fi 연결 및 데이터 전송 기능을 구현할 수 있습니다. 이를 위해 ESP8266 모듈과 다른 센서 및 장치를 연결하여 데이터를 수집하고 처리하는 코드를 작성해야 합니다.\n\n## ESP8266을 활용한 프로젝트\n\n1. 스마트 홈 제어 시스템\n2. 날씨 예보 및 알림 시스템\n3. 원격 제어 및 모니터링 시스템\n4. IoT 기반 스마트 농업 시스템\n5. Wi-Fi를 활용한 센서 네트워크 구축\n"},{"id":"8d3dbfa5-b2c0-5cf5-9607-2eb30a58de2c","excerpt":"프로젝트명 스마트팜 Great Brain 제품 설명 나만의 작은 스마트팜 “하드웨어와 소프트웨어로 완벽한 식물을 기른다.” 토양 수분 센서를 이용해 토양 수분 확인 토양수분 센서를 흙에 꽃아 흙의 수분양을 파악 자동으로 펌프를 이용해서 수분공급 토양수분 센서로 인식된 값이 일정 수준보다 낮을 때 자동으로 수분을 공급 식물 관리를 위한 앱 현재 수분/ 습도/ 광량을 앱에서 모니터링 및 수동 제어 가능 💡 자세한 것은 GitHub…","fields":{"slug":"/ESP8266으로 만든 스마트팜/"},"frontmatter":{"title":"ESP8266으로 만든 스마트팜","date":"2021.10.19","thumbnail":{"publicURL":"/static/ffd913ea2c0d67b777d7e1310e8ad91e/gb.png","childImageSharp":{"fluid":{"base64":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAALCAYAAAB/Ca1DAAAACXBIWXMAABYlAAAWJQFJUiTwAAADNUlEQVR42l3O20+TdwDG8fcP2NUSd7EEGQhYoQXachqnYoFSKC1dy8nSlrZAKSOiMBUzwMF2MY2MMZQgui2bIZnGRV1YyA6yZQcJiclgUyxTGQ4jQhlE3Ryve5ffdxlXy75Xz9WTj1RZ2/jE6vT8rc3c/VeiLk9R6/MVVUq2otKkK1GxaiUY8ConjrYrk5dOK5MXR5WJjwaVifPDyszUVWUxfEsJz8wq4dlZ5db1OeWry+OKpMu1PNVmm9iRqCc6Lon4RC2xqlSid6iISdDQ2NREc52ZT8cGmBg7xoXRbr64cJKZH65xY26O//bg13tIRqtPNtmDpOfZhTajWOizTEKTli+e375TRMXuEk6XTwSqC0X/G10ix/K60Ba/KboPHhR378yJ5fsR8c21c+LjzwYEIJZuLwjJ5joge0K9GM3VQpdhIiu7FHVqGsk6NdoMDQ5fC+7qMvINJTwTU8+zcQ1YjBYeP4xsqTqHXsR2SGLq+iVWFpeRnHVBua65nczyBrHTFCD5pXYyXX501T6SCswUO0NUmAtoa93PvsMncFaU8trLNWxE1ljbWKb+SBSOTonpuU9YXVxB6ul7R67qG6V8Zl10/PQ79qk/KPr8Ebu/XMMzeIUDfecwG3No9noZPvs9fl89vR1uHm2ssylv0vl2JmPjPVvaxfmfkSzOkGzd203Oq4PC2HyE8n39qP1dRFftRV/hx+o5TKmpEKelnOMj49RWOdkfsPFbZGXr5OqNDwgvTG/tX27OI1mrQvLRgbM4vB3C4GjAWNlCkSNAVn45CfEq9OlGDLm5WMts9L51ngprGY17TKyvrRKJRPju2ykmr3zNk80/Wbp9B8ls98nuYC/+YJ/IK6yjqKwJdZKBhDgtu1RaUpPTKDHmEaz30tbeRa3dRNBVwuqD+2w+lZldmubm0o9bwoXwPFJbe7fsDx3CXhMSNd5W6htfwWL3kpKsRq9LweN20docoKbSTjDgptbxr7CExw83+H+rd+8hnTz1rlxqsxMVvV08t20bL8TEo1Kn4Q60UFyQS06GhlKzAVtRFr5qM64KAz2hPZweGWLkzAhDp0YYPjPK+x++x/H+Y/wDsAgaJjEJjE4AAAAASUVORK5CYII=","aspectRatio":1.7605633802816902,"src":"/static/ffd913ea2c0d67b777d7e1310e8ad91e/46604/gb.png","srcSet":"/static/ffd913ea2c0d67b777d7e1310e8ad91e/62d80/gb.png 125w,\n/static/ffd913ea2c0d67b777d7e1310e8ad91e/e1953/gb.png 250w,\n/static/ffd913ea2c0d67b777d7e1310e8ad91e/46604/gb.png 500w,\n/static/ffd913ea2c0d67b777d7e1310e8ad91e/d8815/gb.png 750w,\n/static/ffd913ea2c0d67b777d7e1310e8ad91e/38fcf/gb.png 846w","sizes":"(max-width: 500px) 100vw, 500px"}}},"categories":["임베디드","아두이노","ESP8266"]},"rawMarkdownBody":"\n# 프로젝트명\n\n### 스마트팜 Great Brain\n\n---\n\n### 제품 설명\n\n**나만의 작은 스마트팜**\n\n\"하드웨어와 소프트웨어로 완벽한 식물을 기른다.”\n\n- **토양 수분 센서를 이용해 토양 수분 확인**\n\n토양수분 센서를 흙에 꽃아 흙의 수분양을 파악\n\n- **자동으로 펌프를 이용해서 수분공급**\n\n토양수분 센서로 인식된 값이 일정 수준보다 낮을 때 자동으로 수분을 공급\n\n- **식물 관리를 위한 앱**\n\n현재 수분/ 습도/ 광량을 앱에서 모니터링 및 수동 제어 가능\n\n---\n\n> 💡 자세한 것은 GitHub & YouTube에서 확인할 수 있습니다.\n\n**유튜브**\n\n> [https://youtu.be/KRRq1sTHHP8](https://youtu.be/KRRq1sTHHP8)\n\n**깃허브**\n\n> [https://github.com/MinSeok0123/ESP8266_SmartPlant](https://github.com/MinSeok0123/ESP8266_SmartPlant)\n\n### 나의 역할\n\n- 하드웨어를 맡아 전체적인 하드웨어 개발\n- 소개 영상편집 및 자료정리\n- 123design를 이용해 하드웨어 외형을 설계하고 3D프린터로 제작\n- 하드웨어 사용을 위한 회로를 설계하고 연결\n- 하드웨어에 토양수분센서를 통해 값을 받아 불필요한 값을 처리해서 서버로 전송\n- ESP를 통해 WIFI를 연결하고 Node.Js를 통해 값을 전달\n- 토양수분센서를 통해 값이 낮으면 서버에 값을 넘겨서 펌프작동\n- 습도/온도 값을 ESP8266을 통해 받아 서버에 값을 보내기\n\n---\n\n## 느낀점\n\n- 1년 프로젝트이기에 힘들었던 점도 있고 많은 것을 했기에 좋은 경험인 것 같다.\n- 팀원들과의 갈등과 협업을 해야 하는 일이 생기면서 팀원들과 소통의 중요성을 알게 되었다.\n- 프로젝트를 하기 전에 설문 조사, 자료 조사를 하면서 사용자는 내 생각과는 다른 문제점을 가지고 있을 수도 있다는 것을 알게 되었다.\n- 123design를 통해 3D 모델링을 설계하고 3D 프린터를 통해 제작하는 것에 대해 알게 되었다.\n- 회로를 설계하는 것에 저항 등 많은 것을 생각해야 한다는 것을 알게 되었다.\n- ESP를 통해 WIFI를 연결하고 Node.Js로 서버 통신을 하는 것을 알게 되었다.\n- 1년 동안 준비한 프로젝트인데 상을 타게 되어서 뿌듯했고 더 열심히 할 것이라고 다짐하였다.\n"},{"id":"f1a01283-84b4-5340-baa9-e6e277cd514b","excerpt":"private, public, protected 접근제어 1. public : 다른 클래스에서도 접근 가능\n2. private : 그 맴버를 선언한 클래스 내부에서만 접근 가능\n3. protected : 그 멤버를 선언한 클래스 + 그걸 상속받은 자식 클래스 내부에서만 접근 가능 1. Public 그래서 도둑이 아버지를 납치하기로 했다. 하지만 접근하지 못하였다. 2. Private…","fields":{"slug":"/private, public, protected 접근제어/"},"frontmatter":{"title":"private, public, protected 접근제어","date":"2023.10.30","thumbnail":{"publicURL":"/static/a6c0c8b314db05f584d0d6f3f08d9ecf/public.png","childImageSharp":{"fluid":{"base64":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAKCAYAAAC0VX7mAAAACXBIWXMAABJ0AAASdAHeZh94AAABvUlEQVR42nWSvW/TQBiH/c8yVBUDExsDExMTWxmABYSKkKiKhAJqpYRWoRGhUWqSpk1SR44/GseO7Ts7TuwH+UhRaNqT7qR7P5733nt/GkBRFGrfXpuWzdjbedp6wLIoiLMF/jzjWiYYkylOJPDTjNk8Y57nd4LXoRqrS5gtsEWCFUtGkaQzCajp57RMh6tQYEZC+b10rgqXqyx+A77ZWukoXzCOJUYoOHUD6vaUSs9gr9Vlv93juznhp+Nz4UfYscQRCYu8wBHpxpdoWZ4r2CgU1C2PA8Nlf2DzoWPwstrg7a9z9vo2laGjwN1pqKDlI4ahZBYEXLsurusShiGaWCxVm7o342Dkstszea0bPG9e8PS4zbNGl532kHedEV+GDg17quK9ZI4exKRJgpASIQRpmqLlRYEjU1W5cuXwRjd4XP/NdrXFg89Vtr6d8PDojBenfT5dWjRdHzOWxIslR5PZZsvlUbZdQluTgI+XY56cdBVw6+sPtg+bPDrW2Tm7ojb2GISCaDWMph8pcf03lPXRl1WNWFJ3fHYHFq96Ju/7FjXLoz/7K59sJR2Vd6ds/hmKDVHn9wn+Hg2WwD9j/PLOE3zswgAAAABJRU5ErkJggg==","aspectRatio":1.953125,"src":"/static/a6c0c8b314db05f584d0d6f3f08d9ecf/46604/public.png","srcSet":"/static/a6c0c8b314db05f584d0d6f3f08d9ecf/62d80/public.png 125w,\n/static/a6c0c8b314db05f584d0d6f3f08d9ecf/e1953/public.png 250w,\n/static/a6c0c8b314db05f584d0d6f3f08d9ecf/46604/public.png 500w,\n/static/a6c0c8b314db05f584d0d6f3f08d9ecf/d8815/public.png 750w,\n/static/a6c0c8b314db05f584d0d6f3f08d9ecf/31987/public.png 1000w,\n/static/a6c0c8b314db05f584d0d6f3f08d9ecf/6d589/public.png 1019w","sizes":"(max-width: 500px) 100vw, 500px"}}},"categories":["C샵"]},"rawMarkdownBody":"\n# private, public, protected 접근제어\n\n> **1. public :** 다른 클래스에서도 접근 가능\n> **2. private :** 그 맴버를 선언한 클래스 내부에서만 접근 가능\n> **3. protected :** 그 멤버를 선언한 클래스 + 그걸 상속받은 자식 클래스 내부에서만 접근 가능\n\n## 1. Public\n\n```csharp\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\n\nnamespace @protected\n{\n class 아버지\n {\n public String 잡담 = \"가족 정보\";\n private String 기밀 = \"아주아주 중요한 맛의 비밀\";\n protected String 비법전수 = \"자식에게만 알려주는 가문의 비법들\";\n }\n\n internal class Program\n {\n static void Main(string[] args)\n {\n 아버지 father = new 아버지();\n String 도둑;\n\n 도둑 = father.잡담;\n 도둑 = father.기밀; // 도둑이 애를 써도 가져갈 수 업다.\n 도둑 = father.비법전수; // 도둑이 애를 써도 가져갈 수 업다.\n }\n }\n}\n```\n\n---\n\n그래서 도둑이 아버지를 납치하기로 했다. 하지만 접근하지 못하였다.\n\n## 2. Private\n\n```csharp\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\n\nnamespace @protected\n{\n class 아버지\n {\n public String 잡담 = \"가족 정보\";\n private String 기밀 = \"아주아주 중요한 맛의 비밀\";\n protected String 비법전수 = \"자식에게만 알려주는 가문의 비법들\";\n }\n\n class 도둑\n {\n void 함수()\n {\n 아버지 father = new 아버지();\n\n String a1 = father.잡담;\n String a2 = father.기밀;\n String a3 = father.비법전수;\n }\n }\n\n internal class Program\n {\n static void Main(string[] args)\n {\n 아버지 father = new 아버지();\n String 도둑;\n\n 도둑 = father.잡담;\n 도둑 = father.기밀;\n 도둑 = father.비법전수;\n }\n }\n}\n```\n\n---\n\n그렇게 아들이 탄생하고 나서 아버지가 아들에게 비법을 상속을 했다.\n\n## Protected\n\n```csharp\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\n\nnamespace @protected\n{\n class 아버지\n {\n public String 잡담 = \"가족 정보\";\n private String 기밀 = \"아주아주 중요한 맛의 비밀\";\n protected String 비법전수 = \"자식에게만 알려주는 가문의 비법들\";\n }\n\n class 아들 : 아버지 // 아들이 아버지를 상속받는다.\n {\n void 함수()\n {\n String a1 = 잡담;\n String a2 = 기밀; // 기밀은 전달받지 못한다.\n String a3 = 비법전수; // 비법전수를 상속을 받으면 열람할 수 있기 때문에 열람이 가능하다.\n }\n\n }\n\n class 도둑\n {\n void 함수()\n {\n 아버지 father = new 아버지();\n\n String a1 = father.잡담;\n String a2 = father.기밀;\n String a3 = father.비법전수;\n }\n }\n\n internal class Program\n {\n static void Main(string[] args)\n {\n 아버지 father = new 아버지();\n String 도둑;\n\n 도둑 = father.잡담;\n 도둑 = father.기밀;\n 도둑 = father.비법전수;\n }\n }\n}\n```\n\n---\n\n# 결론\n\n- 아버지는 잡담, 기밀, 비법전수 모두 접근이 가능하고\n- 아들은 잡담, 비법전수 까지 접근이 가능하고\n- 도둑은 잡담 밖에 접근이 불가능하다.\n"},{"id":"358fd236-49d7-57ca-97a9-c99d7afdbff0","excerpt":"private에 접근하기 : get set과 property 속성 접근제어란? 메모리를 보유한 객체를 이용해서 맴버에 점(.)을 찍고 접근할 수 있는지 없는지의 제어를 말한다. public과 private의 차이점은 무엇일까? 그래서 private 맴버에 어떻게 접근하는데? Set : public 맴버 함수의 매개변수(Parameter)를 통해서 private 맴버에 값을 할당 Get : public 맴버 함수의 리턴(Return…","fields":{"slug":"/private에 접근하기, get set과 property 속성/"},"frontmatter":{"title":"private에 접근하기, get set과 property 속성","date":"2023.10.27","thumbnail":{"publicURL":"/static/a43609684e8ffd3e2873b997725bd4b0/Property.png","childImageSharp":{"fluid":{"base64":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAMCAIAAADtbgqsAAAACXBIWXMAAAsTAAALEwEAmpwYAAABhElEQVR42o2Rz0rDQBDGfTVN0ybZDWhR8R/iUUXxIKW1Vtum2d1oxSp60aIgHsQq+ApexYMoiODBdnd2Y1NfQrdVES1Y+GCGYX7zDTN9mIHLYKwiBzckZoAZIAbJskyWJWLgBjC0qevDW3JsW+kihU4bZtCHKAxuQPmqlTppFs6iYq1ZOI/8WkQvW16ttVB9zZw25w7DpaNX/yKaPQgTvnCDb7g9fnRbjlTkfDVcPG5N74WTO2pmX2tiR03uquEtObUrxyvyG/uEOyG+rmKrobHGB1buE6W6Q8HyheULm4BNAFGwic5/kl8w5Yn1hl0MbQ+s/CMmDTfQJm77HB23Tt4NZgIRMLMynuOJtTcz24xlHuK5O/ynuxscgONLc0VhbSK1qECE9wZrcadUtwrS9l4QrdvFZ8z08j3CgIgwMlH/8r2Rujazt/EcR6RH50A4XmikuZG+MbNPRlpYeYWI6A2m3Ck1tLxnTEPbU5jxX1/tDiPKHf+l/RXpBgoz4Qbi32t9wO+WEZ3gdhqNDAAAAABJRU5ErkJggg==","aspectRatio":1.7123287671232876,"src":"/static/a43609684e8ffd3e2873b997725bd4b0/46604/Property.png","srcSet":"/static/a43609684e8ffd3e2873b997725bd4b0/62d80/Property.png 125w,\n/static/a43609684e8ffd3e2873b997725bd4b0/e1953/Property.png 250w,\n/static/a43609684e8ffd3e2873b997725bd4b0/46604/Property.png 500w,\n/static/a43609684e8ffd3e2873b997725bd4b0/0178f/Property.png 707w","sizes":"(max-width: 500px) 100vw, 500px"}}},"categories":["C샵"]},"rawMarkdownBody":"\n# private에 접근하기 : get set과 property 속성\n\n## 접근제어란?\n\n> _메모리를 보유한 객체를 이용해서 맴버에 점(.)을 찍고 접근할 수 있는지 없는지의 제어를 말한다._\n\n### public과 private의 차이점은 무엇일까?\n\n```csharp\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\n\n\nclass 여친 //클래스를 생성한다.\n{\n public int 나이 = 25; //퍼블릭으로 나이를 만들고 25라는 값을 넣는다.\n private int 몸무게 = 70; //프라이빗으로 몸무게를 만들고 70이라는 값을 넣는다.\n}\n\n\nnamespace @private\n{\n internal class Program\n {\n static void Main(string[] args)\n {\n 여친 none = new 여친(); //클래스를 인스턴스화 한다. (객체를 메모리에 할당)\n Console.WriteLine(\"나이 : \" + none.나이); //퍼블릭이기 때문에 나이가 접근이 가능해서 출력이 된다.\n Console.WriteLine(\"몸무게 : \" + none.몸무게); //프라이빗이기 때문에 몸무게가 접근이 불가능해 출력이 되지 않는다.\n }\n }\n}\n```\n\n---\n\n### 그래서 private 맴버에 어떻게 접근하는데?\n\n1. Set : public 맴버 함수의 매개변수(Parameter)를 통해서 private 맴버에 값을 할당\n2. Get : public 맴버 함수의 리턴(Return)을 통해서 private 맴버의 값 내보내기\n\n```csharp\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\n\n\nclass 여친\n{\n public int 나이 = 25;\n private int 몸무게 = 70;\n\n //set 함수\n public void SetWeight(int weight)\n {\n 몸무게 = weight;\n }\n\n //get 함수\n public int GetWeight()\n {\n return 몸무게;\n }\n}\n\n\nnamespace @private\n{\n internal class Program\n {\n static void Main(string[] args)\n {\n 여친 none = new 여친();\n\n //set 함수를 통해 몸무게에 값을 할당\n none.SetWeight(100);\n\n //get 함수를 통해 몸무게의 값을 얻어온다\n int a = none.GetWeight();\n\n Console.WriteLine(\"나이 : \" + none.나이);\n Console.WriteLine(\"몸무게 : \" + a);\n }\n }\n}\n```\n\n---\n\n위 코드와 값이 함수를 통해서 값을 접근/수정을 할 수 있다.\n\n**그런데 C#에서 이미 내부적으로 get, set이 구현되어 있다.**\n결국, 우리가 어렵게 함수를 굳이 안 만들어줘도 갖다 쓰면 된다.\n\n### 속성(Property)\n\n- Set과 Get 형식의 함수를 일반화한 형태\n\n```csharp\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\n\n\nclass 여친\n{\n public int 나이 = 25;\n private int 몸무게 = 70;\n\n public int 속성\n {\n get\n {\n return 몸무게;\n }\n\n set\n {\n 몸무게 = value; // set 접근자가 갖는 디폴트 매개변수\n }\n }\n}\n\n\nnamespace @private\n{\n internal class Program\n {\n static void Main(string[] args)\n {\n 여친 none = new 여친();\n\n none.속성 = 100; // 자동으로 set\n int a = none.속성; //자동으로 get\n\n Console.WriteLine(\"나이 : \" + none.나이);\n Console.WriteLine(\"몸무게 : \" + a);\n }\n }\n}\n\n```\n\n# 결론\n\n> 위와 같이 속성을 가져다 쓰면 편하게 구현 할 수 있다.\n"},{"id":"cbe6b2fd-5ac7-5a66-89b3-ae76e0bfc38f","excerpt":"static 접근방식 변수, 함수, 생성자 일반 맴버 변수는 객체를 생성해야지만 메모리가 생성된다. (별도로 메모리를 할당해야 접근가능) 하지만 스태틱 변수는 객체 생성 이전에 접근할 수 있다. (프로그램 시작과 동시에 가장 먼저 할당) 1. Static 변수 : 객체생성 X 특징 : 클래스명으로 바로 접근 (프로그램 시작과 동시에 접근 가능) 2. 일반 맴버 변수 : 객체생성 O…","fields":{"slug":"/static 접근방식 변수, 함수, 생성자/"},"frontmatter":{"title":"static 접근방식 변수, 함수, 생성자","date":"2023.11.02","thumbnail":{"publicURL":"/static/fcc42778bbeefb1759f3eda87c1b8b2a/static.png","childImageSharp":{"fluid":{"base64":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAACXBIWXMAAA7EAAAOxAGVKw4bAAADyklEQVR42q2UbU/bZhSG/Rc7aS2tNKmFhJdQIH6JE8exEzuJY4ckQNVBCqWs7WjD1vGiQdt1SBWUJE4C9OVDaYH+lmuyQ6k2ad/64dY5tp7n0jnnObqFT58+8T0lnJ2fc35+ztf4NT89O7vUWaDg/0XeP3f2H53z5csXBL/t03xzQKfZptVs0Wo26fg+x0dHHB8dhrHrdwjOHfYO6XZ7NFs+B+0eB83OhXzevDlgf38foepWyKUNqtk8jmVjmzkqrsuztadsb22wurJCtejhOS53536mVpnBzLpknftohUXMyiqGs4CSSCKKEkLNrVDM5SmbNiXLJqvr2IbB6sMVXj3f5v78z+TNHE6hiFcqU8g7pNMmmUwRVc+TMlxS6RyynOgDZ8s1HKuAa1hUiy53ZmZ5+vhxWN3e/h6/LC/j5CymXY/qdAWnWELXTRKJBKqqoqUzqGoKSVYQJQlhfm6e+t17PFv7jb3Xe3T8Lpsbmzx69JBOr8vvjQZeoRACS0UHwzDIGgUsM0cmo2FYRdRUGkmSkCQZYXf3NX6nx/v37+n1evyxvkXs9gQJVUUUxXAE8YkJIpEhBgYGiI2Pc+tmlNGRMZKpBLKSCCsL2g1b7na7HB0d8e7tO3rdHhtb2xS9GZKagSSrGOkMA9eucuWHK0SHh/nx6lV+uj6IIiWRZBFRlEOgJIl9YLPVphNCj/nw4QO7r3ZRlRRjo7fRMyaKJDNw7QbjsQlisXEGh4a4cf0mw5EoshyAlLDVoJsQ2G774W61Wm0+npzw985LZr0q0+Uym1sbrDUaWNk8llEga1eozS1hWdNk9CyKojA5OYUYjyOKceIBMAAt1pdwHY/l5QfYOYtC3ubX1cfU6ws8ebLKvfoC47EY0cgwcVHh1tAIQ6NTTMgGg5ExhkcmUFQtBAvrO8+oTFfJmTnyts1CfZ7t7T958eIFXrlMqVTC8zxqtSp37sxRrVSQg5mJEqNjMYYiowxGJ5G0EppVQdjaWWdxsY7rlniwsszznW1M08S280xNTpFMJi9lGiapZBIjk8FzXRRZJjY2xnA0QjQSQU3pCJvr6+HONRpP+OvlS2q1WlhtcFlP65Q9D9uy0ZIpFFkho+vIohRKT6dxikW0VCqUkdER1tYaLC0tsrLygNmZGbSUhuuU+pCUFgKLhUL4AGlNC8cixsVwXgEkoSiMjoyQNTK4JQfh5OTjhS2dhmsTOMrxcX+Fvu3o235+2Hcf3/fpXXwHud9uh7HZbCJ8/vz50hxPT08vPe//8q9++G9v/Cbhuzt2UOH31D8gA4jPehE6bwAAAABJRU5ErkJggg==","aspectRatio":1,"src":"/static/fcc42778bbeefb1759f3eda87c1b8b2a/46604/static.png","srcSet":"/static/fcc42778bbeefb1759f3eda87c1b8b2a/62d80/static.png 125w,\n/static/fcc42778bbeefb1759f3eda87c1b8b2a/e1953/static.png 250w,\n/static/fcc42778bbeefb1759f3eda87c1b8b2a/46604/static.png 500w,\n/static/fcc42778bbeefb1759f3eda87c1b8b2a/7f4a1/static.png 604w","sizes":"(max-width: 500px) 100vw, 500px"}}},"categories":["C샵"]},"rawMarkdownBody":"\n# static 접근방식 변수, 함수, 생성자\n\n**일반 맴버 변수**는 객체를 생성해야지만 메모리가 생성된다. _(별도로 메모리를 할당해야 접근가능)_ \n하지만 **스태틱 변수**는 객체 생성 이전에 접근할 수 있다. _(프로그램 시작과 동시에 가장 먼저 할당)_\n\n## 1. Static 변수 : 객체생성 X\n\n- 특징 : **클래스명**으로 바로 접근 (프로그램 시작과 동시에 접근 가능)\n\n## 2. 일반 맴버 변수 : 객체생성 O\n\n- 특징 : **객체를 생성**해야만 메모리가 생성된다. (별도로 메모리를 할당하는 과정 -> 접근가능)\n\n```csharp\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\n\n\n// 다른 클래스\npublic class Access\n{\n public static int 스태틱변수 = 0;\n public int 일반변수 = 0;\n}\n\nclass main\n{\n public static void Main(string[] args)\n {\n // 스태틱 변수 : 바로 다이렉트로 클래스명으로 접근가능\n Access.스태틱변수 = 1; // 객체생성을 안해도, 프로그램이 시작되면 이미 메모리가 할당되어 있다.\n\n // 이 코드는 쓰레기에요!\n Access.일반변수 = 2; // 별도로 메모리를 할당한 뒤에야 접근 가능\n\n\n // 이 코드는 사용할 수 있어요!\n Access 객체 = new Access(); //메모리를 할당\n 객체.일반변수 = 2;\n\n Console.WriteLine(객체.일반변수); // 일반 변수\n Console.WriteLine(Access.스태틱변수); // 스태틱 변수\n }\n}\n```\n\n---\n\n# static 함수 vs 일반 함수 접근 차이\n\n### [Static 맴버 함수]와 [일반 멤버 함수] 접근 방식의 차이\n\n- 사실 위에서 언급한 변수 접근 방식의 차이와 비슷하다\n\n### [스태틱 맴버 함수에서 주의할 점]\n\n- 스태틱 함수를 이용해서 일반 멤버 필드에 접근 불가\n 이유 : 일반 멤버 필드는 객체 생성 후에 존재하기 때문에 스태틱 함수에서는 접근 불가\n\n---\n\n# 스태틱 생성자\n\n1. 생성자를 **static** 생성자로 선언할 수도 있다.\n 그러나 **static** 생성자에서는 일반 변수는 쓸 수 없다.\n\n- 일반 멤버 변수는 객체를 생성해야만 메모리가 생성된다.\n- 하지만 스태틱 함수는 객체 생성 이전에 접근할 수 있기 때문\n\n```csharp\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\n\n\n// class 선언 : 스태틱 변수, 일반 변수\nclass 테스트\n{\n public static int 스태틱변수 = 0;\n public int 일반변수 = 0;\n\n\n // 1. static 생성자 함수\n static 테스트()\n {\n // 일반변수 = 10;\n 스태틱변수 = 10;\n\n Console.WriteLine(\"[1. static 생성자 최초 실행]\");\n }\n\n // 2. 일반 생성자 함수\n public 테스트()\n {\n 일반변수 = 20;\n 스태틱변수 = 20;\n\n Console.WriteLine(\"[2. 일반 생성자 최초 실행]\");\n }\n}\n\n\nclass main\n{\n static void Main(String[] args)\n {\n // 스태틱 변수를 호출할 경우: static 생성자만 호출됩니다.\n 테스트.스태틱변수 = 100; // 실행시 결과 = [1. static 생성자 최초 실행]가 실행된다.\n\n\n 테스트 test = new 테스트(); // 실행시 결과 = [1. static 생성자 최초 실행], [2. 일반 생성자 최초 실행]가 실행된다.\n }\n}\n\n```\n"},{"id":"2fa9a166-7468-5cad-975d-a2b9398546ea","excerpt":"this와 this를 통한 생성자 호출 this 클래스 내에서 정의된 맴버를 가르킬때 사용한다. 만약 클래스 내에서 생성된 변수와 매개변수의 이름이 똑같다면 코드 this를 통한 생성자 호출 생성자를 여러개 만든 경우, 그 중 조건에 맞는 생성자만 호출이 된다.\n이때, this를 사용해서 여러개의 생성자를 한꺼번에 호출할 수 있다. 1. this를 사용 안해서 매번 따로따로 생성자 함수를 호출하는 경우 2. this를 사용해서 한방에…","fields":{"slug":"/this와 this를 통한 생성자 호출/"},"frontmatter":{"title":"this와 this를 통한 생성자 호출","date":"2023.11.07","thumbnail":{"publicURL":"/static/381b648e7fa624f6687fe70ae9648a54/C#.png","childImageSharp":{"fluid":{"base64":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAALCAYAAAB/Ca1DAAAACXBIWXMAAAsTAAALEwEAmpwYAAACnElEQVR42nXRXUiTYRQH8P87Z94EXphBYDCxaYaTTBczqJuwglJBL9KaRaWp7UvTpe1Dc1SOUlM0dS7dnDPUtYIspRKJ9CJCzbRy7sssEgktIdA5t/eJNwiC6YHD4YGHH+cD+C+6lC50KZ1MUt1qN8W8x178COqucJWbVc663pvucL1kBn0qJ6rSR1ldJQ48u7WALeMfZlI40aOZQ3eFK91wzTGtl80SnchGdKKZxQeyzyLmb61wDNbKeWq0ZQUZEQ83B00MpnTCdN3JMatc/Qa5g1iq58j44NLG1PCy16p1kdb8j8RYZHtff34i2aKaQ6/CTWVF9QZi7fIZZmQ2M6ZZ7dIy2EDzt3W/n/YRQghN00zxD7V/9YiSBsmp8M6XipRRPFIuUIfZLYGg/uonmMqdbIPcAWOZQ9tRaifL3z3e9TUfeVozT1s0bvqN9QtdJx3x8dFI+KgfCIYa23EHAjQEgi2SaRhK7ew2iQ16qU1rlM8yHXmnhpZo1bHXJG2nkRwJ1tGDJpvvRJiOJKFmIBw3cDSkEwLUBYL3Cz+gs9QR1CGzo6N4ttpYbCerv/zen4urJDWygeaHqOlW9QityXnlE+AeEaD2+QE0IgV9EOBuINiUP4ka4Tt2U+4kWgqnaiWH+oni9JM1Zm++DT/5vbL2d5Va6WNPDEqIgH17mIcy7MMVHET15lc+uauZlclpRxbXGJ+AyoloyMmZpCZi1b/dGOwZ3xCn60g0csleXFqIo8Sp0cgBF0IqkarYHBTGmpEW0UwJY7ugKewBf5tKtAfiRQ4uEw4ukt0454lFnjZhW3Eoj5KCi7MUC6HYEsxLtCCD04bsGAMLyMR+qhzHI6t2xLPFjXFBBX3JYUWxXFwAj10AHiVjRSE7APkD5udH9ik+GzMAAAAASUVORK5CYII=","aspectRatio":1.7857142857142858,"src":"/static/381b648e7fa624f6687fe70ae9648a54/46604/C%23.png","srcSet":"/static/381b648e7fa624f6687fe70ae9648a54/62d80/C%23.png 125w,\n/static/381b648e7fa624f6687fe70ae9648a54/e1953/C%23.png 250w,\n/static/381b648e7fa624f6687fe70ae9648a54/46604/C%23.png 500w,\n/static/381b648e7fa624f6687fe70ae9648a54/f3dec/C%23.png 640w","sizes":"(max-width: 500px) 100vw, 500px"}}},"categories":["C샵"]},"rawMarkdownBody":"\n# this와 this를 통한 생성자 호출\n\n## this\n\n**클래스 내**에서 정의된 **맴버**를 가르킬때 사용한다.\n\n> 만약 클래스 내에서 생성된 변수와 매개변수의 이름이 똑같다면\n\n - this를 붙이면 클래스 내에서 생성된 변수를 출력한다.\n - this를 빼면 매개변수를 출력한다.\n\n### 코드\n\n```csharp\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\n\n\npublic class ThisTest\n{\n private string name = \"하이\";\n\n public ThisTest(String name)\n {\n Console.WriteLine(name);\n Console.WriteLine(this.name);\n }\n\n public static void Main(string[] args)\n {\n ThisTest a = new ThisTest(\"바이\");\n }\n}\n\n```\n\n---\n\n# this를 통한 생성자 호출\n\n> 생성자를 여러개 만든 경우, 그 중 조건에 맞는 생성자만 호출이 된다.\n> 이때, this를 사용해서 여러개의 생성자를 한꺼번에 호출할 수 있다.\n\n## 1. this를 사용 안해서 매번 따로따로 생성자 함수를 호출하는 경우\n\n```csharp\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\n\n\npublic class 알바호출\n{\n // 1번 생성자\n public 알바호출()\n {\n Console.WriteLine(\"[1번 생성자 호출]\");\n Console.WriteLine(\"계산대에서 멍때리기\\n\\n\");\n }\n // 2번 생성자\n public 알바호출(string clean)\n {\n Console.WriteLine(\"[2번 생성자: 매개변수가 1개]\");\n Console.WriteLine(\"사장 왈: \" + clean + \"\\n\\n\");\n }\n // 3번 생성자\n public 알바호출(string clean, int calculation)\n {\n Console.WriteLine(\"[3번 생성자: 매개변수가 2개]\");\n Console.WriteLine(\"손님 왈: 계산 좀 해주세요~ \" + calculation);\n Console.WriteLine(\"사장 왈: \" + clean + \"\\n\\n\");\n }\n\n public static void Main(string[] args)\n {\n // 알바호출1\n 알바호출 call1 = new 알바호출();\n // 알바호출2\n 알바호출 call2 = new 알바호출(\"알바야 청소 좀 해라\");\n // 알바호출3\n 알바호출 call3 = new 알바호출(\"알바야 청소 좀 해라\", 5000);\n }\n}\n```\n\n---\n\n## 2. this를 사용해서 한방에 3개의 생성자 함수를 호출하는 경우\n\n하지만 혼자서 여러가지 일을 처리하는 것이 불만이었던 알바는\n분신술을 사용해서 자신을 여러명 소환한 뒤, 한꺼번에 여러가지 일을 처리하기로 했다.\nthis를 사용해서 한꺼번에 여러개의 생성자 함수를 호출\n\n```csharp\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\n\n\npublic class 알바호출\n{\n // 1번 생성자\n public 알바호출() : this (\"분신술 사용\")\n {\n Console.WriteLine(\"[1번 생성자 호출]\");\n Console.WriteLine(\"계산대에서 멍때리기\\n\\n\");\n }\n // 2번 생성자\n public 알바호출(string clean) : this (\"또 분신술 사용\", 5000)\n {\n Console.WriteLine(\"[2번 생성자: 매개변수가 1개]\");\n Console.WriteLine(\"사장 왈: \" + clean + \"\\n\\n\");\n }\n // 3번 생성자\n public 알바호출(string clean, int calculation)\n {\n Console.WriteLine(\"[3번 생성자: 매개변수가 2개]\");\n Console.WriteLine(\"손님 왈: 계산 좀 해주세요~ \" + calculation);\n Console.WriteLine(\"사장 왈: \" + clean + \"\\n\\n\");\n }\n\n public static void Main(string[] args)\n {\n // 알바호출1\n 알바호출 call1 = new 알바호출();\n }\n}\n```\n\n### 상속 배울때 나온 예제\n\n> [할아버지 -> 아빠 -> 아들] 순서로 실행되는 것처럼\n> 생성자도 [3번 -> 2번 -> 1번] 순서로 호출되게 된다.\n\n---\n"},{"id":"43ff11f6-1f8d-5d67-affe-7828935f8dd6","excerpt":"Java Collection Framework Java Collection Framework는 자바에서 제공하는 데이터 구조와 관련된 클래스와 인터페이스의 집합이다. 이것은 다양한 자료구조의 구현을 제공하고, 컬렉션 클래스를 사용하여 데이터를 저장, 검색, 정렬, 삭제 등 다양한 연산을 수행할 수 있다. 여기서는 컬렉션 프레임워크의 중요한 두 가지 클래스인 ArrayList와 HashMap에 대해 알아보겠다. List : List…","fields":{"slug":"/Java Collection Framework에 대해 알아보자/"},"frontmatter":{"title":"Java Collection Framework에 대해 알아보자","date":"2023.03.29","thumbnail":{"publicURL":"/static/3aa370900eed0712859f2bc47d4b807e/java.png","childImageSharp":{"fluid":{"base64":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAACXBIWXMAABRNAAAUTQGUyo0vAAAD7UlEQVR42m2Uf0zUZRzHv4AIwnnoFn9gJCBRMwe6RnPSH5G1XLV0s621tdyqlZstwx8zMKSLA+8nUpuAljgCEfQPGJAiv44fJ/cDvBAMRzniOHHCzBYSAncHr/b93p3ceXy3Z8+zZ8/39bzfn+fz+QhrtWaChwmZOGtMxOgshBSaiFC0kVliYJu+BeFEO0llgySU/MZada/nrPe8EATTLMPkIiy/m3fL2rGM2GFhlnpDL9omMwePKziclcXuHxoIKbhOjG4loMYkzTKNiXV6C6sKejhyyQi4we1k6sHfDA0NsXvXm6Q+n8DRXAXJJ68SqfG6CgD6wdbrzAiFFl4r+hUWF5h3Ork9MkJXRxu7dmayZ+/7HNCXk6BqJVxlQu79T/w/AChuxmjNrFKZ2aJrwXb7DuI3t+BkYtzOR1/nkHqkhM2aFiKUXUSozQGwAIVi3ORaE2u0VhLUbfzluCfBXO5FlpaWpPXE/SlSlA0IKqsUM7nXpr/DAIVi3ARFN3n1ZgkwO+/E7XJJa6fLLc0Fta0I2VdYV9QXoMzHEfxTRa6zsjq/k+rOG4BHVV1dHaPj4/i+uw4HidlVROr6kIsg3wgCSpsmorRWPlSWUX6mBPu4g+qaGgwVFTiMRo/SuVlSvqkgSgRKlpdfeBnovUVM4lBFByrdWQy1VfxUfp5HMzMsjo7itI8zP/eY4svNhB2uRcjvIUpr8T6mOVChzBsHESgoe3hdcRGzbZih4WHcbjcLi4vYHQ7+GBmhu3+QZssgxW2DPFPQSvQT6FMKxedfrTKxo+gq75SKgW9E29jLw8l72O9O8O/srGT5wdQkN239jN4aICWnkgitXyz9gR51Rg6VN8HSDB03hhiw3WTJPobr4T8wNsaAoZPLdfXYLCb2q88gHG0k5lS/pM5n+4llSbbOijy/jc/OXaOqrgnb4C1+v/8f06N2+PMOjycnOZaTQ0ZGBgfz9ey70EtEYc9Keei9wQsVvutAOFCFss7ItGuJR/Mupqan+fH0abampbEmWkbWF5/Q1TdAWG4zcr012PJyy+pl/al+wlVmXsh8j48/2Mtbb+xk65aXSNqUTGJiEgnPxfPiK6+SprhERKFRin9Qpcj8klRMh82qK6SmbycsRECeso241O0kb4glbsOzbNoYT+a+rwg70YJc76kYWXCl+CxbkBcY+Pl8BZ3NTZQXq9mjPEfY56XE7Xib1JfTOZl3nC+1ZwnNbSbGZzeolv1kR6uuk55XyaHSWj7V/8LG7CqidX2Efm9gf1EFNReriT9WKTUSX4OQrQSU+RV6uKYP4UQbwrfXiFR7Oku0zkpsYTuxeQ3S3tONQQT+D0iADDNOE6BCAAAAAElFTkSuQmCC","aspectRatio":1,"src":"/static/3aa370900eed0712859f2bc47d4b807e/46604/java.png","srcSet":"/static/3aa370900eed0712859f2bc47d4b807e/62d80/java.png 125w,\n/static/3aa370900eed0712859f2bc47d4b807e/e1953/java.png 250w,\n/static/3aa370900eed0712859f2bc47d4b807e/46604/java.png 500w,\n/static/3aa370900eed0712859f2bc47d4b807e/d8815/java.png 750w,\n/static/3aa370900eed0712859f2bc47d4b807e/31987/java.png 1000w,\n/static/3aa370900eed0712859f2bc47d4b807e/22f13/java.png 2048w","sizes":"(max-width: 500px) 100vw, 500px"}}},"categories":["Java"]},"rawMarkdownBody":"\n# Java Collection Framework\nJava Collection Framework는 자바에서 제공하는 데이터 구조와 관련된 클래스와 인터페이스의 집합이다. 이것은 다양한 자료구조의 구현을 제공하고, 컬렉션 클래스를 사용하여 데이터를 저장, 검색, 정렬, 삭제 등 다양한 연산을 수행할 수 있다. 여기서는 컬렉션 프레임워크의 중요한 두 가지 클래스인 ArrayList와 HashMap에 대해 알아보겠다.\n\n**List** : List 인터페이스는 순서가 있는 컬렉션을 나타내며, 데이터를 중복해서 저장할 수 있습니다. ArrayList, LinkedList, Vector 등이 이에 해당합니다.\n\n**Set** : Set 인터페이스는 순서가 없는 컬렉션을 나타내며, 데이터를 중복해서 저장할 수 없습니다. HashSet, TreeSet 등이 이에 해당합니다.\n\n**Map** : Map 인터페이스는 키-값 쌍으로 이루어진 데이터를 저장합니다. HashMap, TreeMap 등이 이에 해당합니다.\n\n\n# 1. 메모리 구조와 함께 파악하기\n\nArrayList와 HashMap은 모두 컬렉션 클래스이지만, 메모리 구조는 다르다.\n\n## ArrayList\nArrayList는 내부적으로 배열을 사용하여 요소를 저장한다. 요소가 추가될 때마다 배열의 크기가 자동으로 증가하며, 요소가 제거될 때마다 배열의 크기가 자동으로 감소한다. 이러한 메모리 구조는 다음과 같다.\n\n![](https://velog.velcdn.com/images/minseok0123/post/16e13dc3-0295-4be9-8e41-23b9331bc115/image.png)\n\n\n## HashMap\nHashMap은 내부적으로 해시 테이블을 사용하여 요소를 저장한다. 해시 테이블은 해시 함수를 사용하여 각 요소를 키-값 쌍으로 매핑하고, 각 키에 대한 값을 해시 테이블 내의 해당 위치에 저장한다. 이러한 메모리 구조는 다음과 같다.\n\n![](https://velog.velcdn.com/images/minseok0123/post/6d4ce393-be97-4756-b243-257999d1fd85/image.png)\n\n\n# 2. Code (Java)\n\n## ArrayList\n```java\nimport java.util.ArrayList;\n\npublic class ArrayListExample {\n\n public static void main(String[] args) {\n // ArrayList 생성\n ArrayList names = new ArrayList<>();\n\n // 요소 추가\n names.add(\"Mcdonald\");\n names.add(\"BugerKing\");\n names.add(\"LotteRia\");\n\n // 요소 접근\n System.out.println(names.get(0)); // 출력: Mcdonald\n\n // 요소 수정\n names.set(1, \"Shack Shack\");\n\n // 요소 제거\n names.remove(2);\n\n // 전체 출력\n for (String name : names) {\n System.out.println(name);\n }\n }\n\n}\n\n```\n\n\n## HashMapp\n```java\nimport java.util.HashMap;\n\npublic class HashMapExample {\n\n public static void main(String[] args) {\n // HashMap 생성\n HashMap ages = new HashMap<>();\n\n // 요소 추가\n ages.put(\"Mcdonald\", 82);\n ages.put(\"BugerKing\", 69);\n ages.put(\"LotteRia\", 43);\n\n // 요소 접근\n System.out.println(ages.get(\"BugerKing\")); // 출력: 69\n\n // 요소 수정\n ages.replace(\"LotteRia\", 44);\n\n // 요소 제거\n ages.remove(\"Mcdonald\");\n\n // 전체 출력\n for (String name : ages.keySet()) {\n System.out.println(name + \": \" + ages.get(name));\n }\n }\n\n}\n\n```\n"},{"id":"813d4b3a-2e13-5f1c-994c-6428fb76781b","excerpt":"recoil 이란 무엇인가? Recoil은 페이스북에서 만든 React 상태 관리 라이브러리입니다. React는 기본적으로 단방향 데이터 흐름을 따르기 때문에 복잡한 상태 관리를 위해서는 상태를 끌어올리거나 Redux와 같은 상태 관리 라이브러리를 사용해야 했습니다. 하지만 Recoil은 기존 React 컴포넌트 내에서 상태를 관리할 수 있도록 해줍니다. Recoil의 특징 Recoil은 다음과 같은 특징을 가지고 있습니다.…","fields":{"slug":"/recoil을 한번 알아보자/"},"frontmatter":{"title":"recoil을 한번 알아보자","date":"2023.04.21","thumbnail":{"publicURL":"/static/99c93761c35cacaf0b3380b23024878f/recoil.png","childImageSharp":{"fluid":{"base64":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAARCAIAAABSJhvpAAAACXBIWXMAAAsTAAALEwEAmpwYAAABZUlEQVR42tWTSU/CQBiG+auePPojvBj1QESNNihBWSwgCFVkkc0AbkSJYAIJdAUU6EKLC3WmHYNoVQ6acDCaTL5kJu+T95tvMdGiNvEx/QGYEuDkMCPpP6opAX72+IBrHZXkgXElecBI+khqAKysMdJXZ5IH7QFatbmjuauOiiherXfVZl8n+edR5GRIi4CWYJkRK817I0cTJUBORiVaXLXhVtce20PecMbuDRPJC8zh9xyknYH4biTrCh55w5n1bX8sX2o9oFEuQ7jZR4VKa86MrW35au3B4vLmktU9u7Bi2XDPW6zZIokTKXw/HT8pT03PxPLXrzB4gxsKKta7Zszhj+ZIHhDJ83ShGkqcuYLx48uq3XcYiOZ2QgmcSDkDsdMbtqG8Ow//3AU8QJjDE8kW754Q29M4WW8oGi1CRoKMBDgFcrLO9rTbx2GkhPFqQ5IHRm2Nloy9GJpvJgz+7oT9q616AaeylZZ46NGLAAAAAElFTkSuQmCC","aspectRatio":1.179245283018868,"src":"/static/99c93761c35cacaf0b3380b23024878f/46604/recoil.png","srcSet":"/static/99c93761c35cacaf0b3380b23024878f/62d80/recoil.png 125w,\n/static/99c93761c35cacaf0b3380b23024878f/e1953/recoil.png 250w,\n/static/99c93761c35cacaf0b3380b23024878f/46604/recoil.png 500w,\n/static/99c93761c35cacaf0b3380b23024878f/aa591/recoil.png 672w","sizes":"(max-width: 500px) 100vw, 500px"}}},"categories":["Web","Frontend","React"]},"rawMarkdownBody":"\n\n# recoil 이란 무엇인가?\n\nRecoil은 페이스북에서 만든 React 상태 관리 라이브러리입니다. React는 기본적으로 단방향 데이터 흐름을 따르기 때문에 복잡한 상태 관리를 위해서는 상태를 끌어올리거나 Redux와 같은 상태 관리 라이브러리를 사용해야 했습니다. 하지만 Recoil은 기존 React 컴포넌트 내에서 상태를 관리할 수 있도록 해줍니다.\n\n# Recoil의 특징\n\nRecoil은 다음과 같은 특징을 가지고 있습니다.\n\n### 1. 기존 컴포넌트에서 상태 관리\n\nRecoil은 React의 Context API와 유사한 방식으로 상태를 관리합니다. 컴포넌트 내에서 상태를 정의하고 사용할 수 있으며, 다른 컴포넌트에서도 해당 상태를 사용할 수 있습니다. 이렇게 함으로써 Redux와 같은 별도의 상태 관리 라이브러리를 사용하지 않아도 되는 장점이 있습니다.\n\n### 2. 비동기 처리\n\nRecoil은 비동기 상태 관리도 지원합니다. Promise나 async/await를 사용하여 비동기 처리를 할 수 있으며, 상태 변화를 감지하여 자동으로 컴포넌트를 업데이트합니다.\n\n### 3. DevTools 제공\n\nRecoil은 개발자 도구(DevTools)를 제공합니다. DevTools를 사용하면 상태 변화를 쉽게 추적하고 디버깅할 수 있습니다.\n\n## Recoil 사용 예시\n\nRecoil을 사용하면 다음과 같이 컴포넌트 내에서 상태를 정의하고 사용할 수 있습니다.\n\n```js\nimport { atom, useRecoilState } from 'recoil';\n\n// 상태 정의\nconst counterState = atom({\n key: 'counterState',\n default: 0,\n});\n\n// 컴포넌트에서 상태 사용\nfunction Counter() {\n const [count, setCount] = useRecoilState(counterState);\n\n function handleClick() {\n setCount(count + 1);\n }\n\n return (\n
    \n

    Count: {count}

    \n \n
    \n );\n}\n\n```\n\n위 코드에서 atom 함수를 사용하여 상태를 정의하고, useRecoilState 훅을 사용하여 해당 상태를 컴포넌트 내에서 사용합니다. handleClick 함수에서 setCount 함수를 사용하여 상태를 업데이트합니다.\n\n## 결론\n\nRecoil은 React 상태 관리를 쉽게 해주는 라이브러리로, 기존의 Redux와 같은 상태 관리 라이브러리보다 더 직관적이고 간단하게 상태를 관리할 수 있습니다. Recoil을 사용하면 기존의 React 컴포넌트 내에서 상태를 관리할 수 있어서 별도의 상태 관리 라이브러리를 사용하지 않아도 됩니다. 또한 비동기 상태 관리도 지원하며 개발자 도구(DevTools)를 제공하여 상태 변화를 쉽게 추적하고 디버깅할 수 있습니다.\n\n"},{"id":"0a474589-ef01-5bd6-8fd2-1bd5bee90474","excerpt":"…","fields":{"slug":"/그리디 알고리즘/"},"frontmatter":{"title":"그리디 알고리즘","date":"2023.05.11","thumbnail":{"publicURL":"/static/cdd912ffc0119bc7769fc61a1db10078/greedy.png","childImageSharp":{"fluid":{"base64":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAMCAIAAADtbgqsAAAACXBIWXMAAAPoAAAD6AG1e1JrAAACr0lEQVR42hXLfVvhAAAA8H2HOwldRRNaaAldh5llMmYbZl7z2prUTaVoWirphbhydaq7D3tPz/P79wewsXgQQymCYMgwRRDxaCzFcQxFMmQ4TkW4OMvF2RTHCYXscf1QkqTb29vBw91j/2E46AMUQQRQjw0CzaAKsZvLxYLUbJ1LrY50VuN5uX12cS6fNhryaeOue1nNsU2x1r/tjoYP4/EIMM5Pm/UzZlDlMGkQmynFhE4OqhenR8OH3n23++/j/X3yOh4NJq/Pz8P+z2L6IE2L24lPxSRgBRXWBRVmM6Cw7vvStNdukuqCfCIOe1f3nfaof3d/fdHrSL2O1GkeP/bOb5r1s+q2LOSezvcBt2U6htoS+WxJFMntTEYQ9lutal08bZ/JsnzVvbm+vnkdvz0/jiYvk5fR+O/Ln49fg0Fj9713AmCrasZjSBIIRRARzFNI0PVSSuDISpIRs0y7Vmjs5KRa+bJxcNUUj7O0nKfvS+QTT/7eowAfrPHBGhox5aO+lpCql2OVBJ4OuqtcaD8V4hNEMYLtUchO2M2TnqMo2k6il2n/s0i9XVWAFf1XJzTlhKZskBI2zMGLWotWvaL/ZjNpHatWtxdxexEURXEcJ7bwMLFFEUQ0QrI0lY4xwA9o1m/TO5bmncsgbJjbsOjRVZNuRglqFKBGgSGuUACnQp/HYTU74eVVC2SFjFbIuLZiBpyQFtQolhbUoEahm1HOqxWz01/XlvWYdyPo9yXjjFAp13j+uH7IsTGWppJswufasFuWYcgIOEw6UKPUqr64rSBuh2jck0slKvm8UCnvlks1nv+0U9qrFHNcNBoOhP2Yyw7DkNFsWgQym3bWC6exNc67xnptDLaejmxmKH+WDuYYIhfxp8MYF/RwARe3uZ4NuPIEUqLwIr2VCvn+AyQr7HErLkBDAAAAAElFTkSuQmCC","aspectRatio":1.6025641025641026,"src":"/static/cdd912ffc0119bc7769fc61a1db10078/46604/greedy.png","srcSet":"/static/cdd912ffc0119bc7769fc61a1db10078/62d80/greedy.png 125w,\n/static/cdd912ffc0119bc7769fc61a1db10078/e1953/greedy.png 250w,\n/static/cdd912ffc0119bc7769fc61a1db10078/46604/greedy.png 500w,\n/static/cdd912ffc0119bc7769fc61a1db10078/d8815/greedy.png 750w,\n/static/cdd912ffc0119bc7769fc61a1db10078/31987/greedy.png 1000w,\n/static/cdd912ffc0119bc7769fc61a1db10078/e4d72/greedy.png 1280w","sizes":"(max-width: 500px) 100vw, 500px"}}},"categories":["알고리즘","C"]},"rawMarkdownBody":"\n## 그리디 알고리즘 개념\n그리디 알고리즘(탐욕법)은 **현재 상황에서 지금 당장 좋은 것만** 고르는 방법을 의미한다.\n**일반적인 그리디 알고리즘은 문제를 풀기 위한 최소한의 아이디어를 떠올릴 수 있는 능력을 요구합니다.**\n\n### 작동 방식\n그리디 알고리즘은 다음과 같은 단계로 동작합니다.\n\n1. 문제를 하위 문제로 나눕니다.\n2. 각 하위 문제에 대해 가장 좋아 보이는 선택을 합니다.\n3. 선택한 해를 부분해 집합에 추가합니다.\n4. 부분해 집합이 최종 해답이 되는지 확인합니다.\n5. 만약 최종 해답이 아니라면, 2단계로 돌아가 반복합니다.\n\n![](https://velog.velcdn.com/images/minseok0123/post/da8b64eb-e2fc-47fb-99b5-5f2413e4f365/image.png)\n\n### 장단점\n그리디 알고리즘의 주요 장점은 다음과 같습니다.\n\n1. 구현이 비교적 간단하다.\n2. 실행 속도가 빠르다.\n\n하지만 그리디 알고리즘은 항상 최적해를 구할 수 있는 것은 아닙니다. 최적해를 보장하기 위해서는 추가적인 검증 단계가 필요할 수 있습니다. 그리디 알고리즘은 각 단계에서의 선택이 최적일 뿐, 그 선택들이 전체적으로 최적인지 보장하지 않기 때문입니다. 따라서 그리디 알고리즘을 사용할 때에는 문제의 성질과 제약 조건을 분석하여 최적해를 보장할 수 있는지 판단해야 합니다.\n\n## 예시\n\n### 문제: 거스름돈 문제\n\n> 당신은 음식점의 계산을 도와주는 점원이다. 카운터에는 거스름돈으로 사용할 500원, 100원, 50원, 10원짜리의 동전이 무한히 존재한다고 가정한다. 손님에게 거슬러줘야 할 돈이 N원일 때 거슬러 줘야 할 동전의 최소 개수를 구하라. 단, 거슬러 줘야 할 돈 N은 항상 10의 배수이다.\n\n\n#### 해결 방법:\n\n동전의 최소 개수를 구해야 하는 문제이기 때문에, **가장 큰 화폐 단위부터 돈을 거슬러 주는 것**입니다.\n\n거스름 돈이 N원일 때, `500원`으로 최대한 많이 거슬러주고, 순서대로 `100원`, `50원`, `10원`을 써서 거슬러주면 됩니다.\n\n이제 N이 1,260 일 때의 예시를 확인해봅시다.\n\n# 코드\n\n```c\n#include \n\nvoid giveChange(int amount) {\n int coins[] = {500, 100, 50, 10}; // 동전 종류\n int numCoins = sizeof(coins) / sizeof(coins[0]); // 동전 종류의 개수\n int count[numCoins]; // 동전 개수를 저장할 배열\n\n // 각 동전의 개수 초기화\n for (int i = 0; i < numCoins; i++) {\n count[i] = 0;\n }\n\n // 가장 큰 동전부터 시작하여 거스름돈 주기\n for (int i = 0; i < numCoins; i++) {\n while (amount >= coins[i]) {\n amount -= coins[i];\n count[i]++;\n }\n }\n\n // 거스름돈 출력\n for (int i = 0; i < numCoins; i++) {\n if (count[i] > 0) {\n printf(\"%d원 동전: %d개\\n\", coins[i], count[i]);\n }\n }\n}\n\nint main() {\n int amount = 1260; // 거스름돈 금액\n giveChange(amount);\n return 0;\n}\n\n```\n\n# 정당성 분석\n\n가장 큰 화폐 단위부터 돈을 거슬러 주는 것이 최적의 해를 보장하는 이유는 무엇일까요?\n\n- 가지고 있는 동전 중에서 큰 단위가 항상 작은 단위의 배수이므로 작은 단위의 동전들을 종합해 다른 해가 나올 수 없기 때문\n\nQ) 만약에 800원을 거슬러 주어야 하는데 화폐 단위가 500원, 400원, 100원이라면 어떻게 될까요?\n\n- 4개의 동전 / 2개의 동전\n\n**대부분의 그리디 알고리즘 문제에서는 이처럼 문제 풀이를 위한 최소한의 아이디어를 떠올리고 이것이 정당한지 검토할 수있어야 답을 도출할 수 있다.**"},{"id":"4a7fcc04-390f-5cbc-8d48-4472857c23e8","excerpt":"다이나믹 프로그래밍 다이나믹 프로그래밍은 메모리를 적절히 사용하여 수행 시간 효율성을 비약적으로 향상시키는 방법 이미 계산된 결과(작은 문제)는 별도의 메모리 영역에 저장하여 다시 계산하지 않도록 함 다이나믹 프로그래밍의 구현은 일반적으로 **두 가지 방식(탑다운과 보텀업)**으로 구성 다이나믹 프로그래밍은 동적 계획법이라고도 부름 일반적인 프로그래밍 분야에서의 동적(Dynamic…","fields":{"slug":"/다이나믹 프로그래밍/"},"frontmatter":{"title":"다이나믹 프로그래밍","date":"2023.06.18","thumbnail":{"publicURL":"/static/4fd18ad7d6fe83b8aaf4c639d01365bc/다이나믹 프로그래밍.png","childImageSharp":{"fluid":{"base64":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAMCAIAAADtbgqsAAAACXBIWXMAAAPoAAAD6AG1e1JrAAACnklEQVR42j2N+U/acADF+zdobb/f3i2UlrYUJDgUYXIJHgG8kOI5EM9scsx5RN3mFBcny+bcZvxBt0QTdRrvZP/ewliWfH54Ly/vPWTYq8ZccsguB3WpxSp6FCnpUbIBpU2Xn9pVj011SLJDknVJ0kS5hm6xaqKsiBbkda9jo0f7kNT3cqGDQur8feH7jPdkc+ysMnf2NX+6++J0d/nXu+y3uc7D8tLe4lQlF3sVVQtRbSakIp8H7fvD+lHGflEMXm/nbrbS1+v+u0/jD0fzt8ezt8ez9wezV+We65LvYiNzsT50Mt/+zVDLcWkhZEbKUbYSE/YT5iNDOJ92Peyv3pWzjxvx+53k2bbx+8vo4/bgzUr3w8fiyeJQJcpWIkQ5CJd8RLGVREoeuBYgtqe6tvKD5UKqUkofro0fr6ZOtiYOltOXb43LNeNqLXO6MvlzIfPj5ehxcWxnoi/fQuZbSMRjgkELGW8UikZXPhFYGYmV+gJbI+1v0uFC3Ls64Nt81rkQb11Jd5R6/JPhxud9kW6H6Je5VpFFRAJaKehvcg73xJId4YHOSCIcyKX6x5L9+emJjJHKGKlkRzjZFe2NhBLhkJGINTt0TTApvIAIEKgcaxN4h9lsE3iN52wC65QsDlFwK5LbKugmwS6wKkerHKtyrMIwMstZaJoBADFRVfMXRiQpC01baNpMkFaaVhnCp3AMAArDSAxtov6lJoriIcUBEgH1DRQOYANKA4KDkMYwniB4oqr9KmPjSIhiNAZoDDA4QWB4VQOiWkExxMyyXqfW5rJ7G/Ww2zngc7okAdQ34HVoRCUZAGrrDF4t1BBImocUTxCIXbb0+p4kQ+6U35XtbE0Hm2LNGgdxvA518pBEUQZgHIQQxf5Tu6Vw8AcQ/74lfblC+QAAAABJRU5ErkJggg==","aspectRatio":1.6025641025641026,"src":"/static/4fd18ad7d6fe83b8aaf4c639d01365bc/46604/%EB%8B%A4%EC%9D%B4%EB%82%98%EB%AF%B9%20%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D.png","srcSet":"/static/4fd18ad7d6fe83b8aaf4c639d01365bc/62d80/%EB%8B%A4%EC%9D%B4%EB%82%98%EB%AF%B9%20%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D.png 125w,\n/static/4fd18ad7d6fe83b8aaf4c639d01365bc/e1953/%EB%8B%A4%EC%9D%B4%EB%82%98%EB%AF%B9%20%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D.png 250w,\n/static/4fd18ad7d6fe83b8aaf4c639d01365bc/46604/%EB%8B%A4%EC%9D%B4%EB%82%98%EB%AF%B9%20%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D.png 500w,\n/static/4fd18ad7d6fe83b8aaf4c639d01365bc/d8815/%EB%8B%A4%EC%9D%B4%EB%82%98%EB%AF%B9%20%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D.png 750w,\n/static/4fd18ad7d6fe83b8aaf4c639d01365bc/31987/%EB%8B%A4%EC%9D%B4%EB%82%98%EB%AF%B9%20%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D.png 1000w,\n/static/4fd18ad7d6fe83b8aaf4c639d01365bc/e4d72/%EB%8B%A4%EC%9D%B4%EB%82%98%EB%AF%B9%20%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D.png 1280w","sizes":"(max-width: 500px) 100vw, 500px"}}},"categories":["알고리즘","Python"]},"rawMarkdownBody":"\n# 다이나믹 프로그래밍\n\n- 다이나믹 프로그래밍은 **메모리를 적절히 사용하여 수행 시간 효율성을 비약적으로 향상시키는 방법**\n- **이미 계산된 결과(작은 문제)는 별도의 메모리 영역에 저장**하여 다시 계산하지 않도록 함\n- 다이나믹 프로그래밍의 구현은 일반적으로 **두 가지 방식(탑다운과 보텀업)**으로 구성\n- 다이나믹 프로그래밍은 **동적 계획법**이라고도 부름\n- 일반적인 프로그래밍 분야에서의 동적(Dynamic)이란 어떤 의미를 가질까?\n - 자료구조에서 **동적 할당(Dynamic Allocation)**은 **'프로그램이 실행되는 도중에 실행에 필요한 메모리를 할당하는 기법'**을 의미\n - 반면에 다이나믹 프로그래밍에서 '다이나믹'은 별다른 의미 없이 사용된 단어\n- 다이나믹 프로그래밍은 문제가 다음의 조건을 만족할 떄 사용 가능\n - **최적 부분 구조 (Optimal Substructure)**\n - 큰 문제를 작은 문제로 나눌 수 있으며 작은 문제의 답을 모아서 큰 문제를 해결할 수 있음\n - **중복되는 부분 문제 (Overlapping Subproblem)**\n - 동일한 작은 문제를 반복적으로 해결해야 함\n\n### 피보나치 수열\n\n- **피보나치 수열**은 다음과 같은 형태의 수열이며, 다이나믹 프로그래밍으로 효과적으로 계산 가능\n - 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, ...\n- **점화식**이란 **인접한 항들 사이의 관계식**을 의미\n- 피보나치 수열을 점화식으로 표현하면 다음과 같음\n - `a(n) = a(n-1) + a(n-2)`\n - `a(1) = 1, a(2) = 1`\n- 피보나치 수열이 계산되는 과정은 다음과 같이 표현할 수 있음 - 프로그래밍에서는 이러한 수열을 **배열이나 리스트를 이용**해 표현\n ![](https://velog.velcdn.com/images/minseok0123/post/799c3a2e-fcea-4414-9c29-040c9c308a24/image.png)\n- 피보나치 수열이 계산되는 과정은 다음과 같이 표현할 수 있음\n - n번째 피보나치 수를 f(n)라고 할 때 4번째 피보나치 수 f(4)를 구하는 과정은 다음과 같음\n\n![](https://velog.velcdn.com/images/minseok0123/post/565e15b7-596c-45ca-b7a6-5d39691794c8/image.png)\n\n```python\n# 피보나치 함수(Fibonacci Function)을 재귀함수로 구현\ndef fibo(x):\n if x == 1 or x == 2:\n return 1\n return fibo(x - 1) + fibo(x - 2)\n\nprint(fibo(4))\n\n>>> 3\n```\n\n### 피보나치 수열의 시간 복잡도 분석\n\n- 단순 재귀 함수로 피보나치 수열을 해결하면 지수 시간 복잡도를 가지게 됨\n- 다음과 같이 f(2)가 여러번 호출되는 것을 확인할 수 있음 (중복되는 부분 문제)\n\n![](https://velog.velcdn.com/images/minseok0123/post/d0be3388-35c6-4aa8-ae6a-e13509a3455b/image.png)\n\n- 피보나치 수열의 시간 복잡도는 다음과 같음\n - 세타 표기법: 𝜃(1.618⋯ᴺ)\n - 빅오 표기법: O(2ᴺ)\n- 빅오 표기법을 기준으로 f(30)을 계산하기 위해 약 10억가량의 연산을 수행해야 함\n\n### 피보나치 수열의 효율적인 해법: 다이나믹 프로그래밍\n\n- **다이나믹 프로그래밍의 사용 조건**을 만족하는지 확인\n - **최적 부분 구조**: 큰 문제를 작은 문제로 나눌 수 있음\n - **중복되는 부분 문제**: 동일한 작은 문제를 반복적으로 해결\n- 피보나치 수열은 다이나믹 프로그래밍의 사용 조건을 만족\n\n### 메모이제이션 (Memoization)\n\n- **메모이제이션**은 다이나믹 프로그래밍을 구현하는 방법 중 하나 (**탑다운 방식=하향식**)\n- **한 번 계산한 결과를 메모리 공간에 메모하는 기법**\n - 같은 문제를 다시 호출하면 메모했던 결과를 그대로 가져옴\n - 값을 기록해 놓는다는 점에서 **캐싱(Caching)**이라고도 함\n\n### 탑다운 vs 보텀업\n\n- **탑다운(메모이제이션) 방식**은 **하향식**이라고도 하며 **보텀업 방식**은 **상향식**이라고도 함\n- **다이나믹 프로그래밍의 전형적인 형태는 보텀업 방식**\n - **결과 저장용 리스트는 DP 테이블**이라고 부름\n- 엄밀히 말하면 메모이제이션은 이전에 계산된 결과를 일시적으로 기록해 놓는 넓은 개념을 의미\n - 따라서 메모이제이션은 다이나믹 프로그래밍에 국한된 개념은 아님\n - 한 번 계산된 결과를 담아 놓기만 하고 다이나믹 프로그래밍을 위해 활용하지 않을 수도 있음\n\n---\n\n```python\n# 피보나치 수열: 탑다운 다이나믹 프로그래밍 소스코드\n\n# 한 번 계산된 결과를 메모이제이션(Memoization)하기 위한 리스트 초기화\nd = [0] * 100\n\n# 피보나치 함수(Fibonacci Function)를 재귀함수로 구현(탑다운 다이나믹 프로그래밍)\ndef fibo(x):\n # 종료 조건(1 혹은 2일 때 1을 반환)\n if x == 1 or x == 2:\n return 1\n # 이미 계산한 적 있는 문제라면 그대로 반환\n if d[x] != 0:\n return d[x]\n # 아직 계산하지 않은 문제라면 점화식에 따라서 피보나치 결과 반환\n d[x] = fibo(x - 1) + fibo(x - 2)\n return d[x]\n\nprint(fibo(99))\n\n>>> 218922995834555169026\n```\n\n---\n\n```python\n# 피보나치 수열: 보텀업 다이나믹 프로그래밍 소스코드\n\n# 앞서 계산된 결과를 저장하기 위한 DP 테이블 초기화\nd = [0] * 100\n\n# 첫번째 피보나치 수와 두번째 피보나치 수는 1\nd[1] = 1\nd[2] = 2\nn = 99\n\n# 피보나치 함수(Fibonacci Function) 반복문으로 구현(보텀업 다이나믹 프로그래밍)\nfor i in range(3, n + 1):\n d[i] = d[i - 1] + d[i - 2]\n\nprint(d[n])\n\n>>> 218922995834555169026\n```\n\n### 피보나치 수열: 메모이제이션 동작 분석\n\n- 이미 계산된 결과를 메모리에 저장하면 다음과 같이 색칠된 노드만 처리할 것을 기대할 수 있음\n\n![](https://velog.velcdn.com/images/minseok0123/post/d4af10cd-c6b6-4d7a-af51-cc6b68e5b5fa/image.png)\n\n- 실제로 호출되는 함수에 대해서만 확인해보면 다음과 같이 방문\n\n![](https://velog.velcdn.com/images/minseok0123/post/d2fdc836-cabe-4f8f-8f03-ce46d370e185/image.png)\n\n- 메모이제이션을 이용하는 경우 피보나치 수열 함수의 시간 복잡도는 O(N)\n\n```python\nd = [0] * 100\n\ndef fibo(x):\n print('f(' + str(x) + ')', end=' ')\n if x == 1 or x == 2:\n return 1\n if d[x] != 0:\n return d[x]\n d[x] = fibo(x - 1) + fibo(x - 2)\n return d[x]\n\nfibo(6)\n\n>>>> f(6) f(5) f(4) f(3) f(2) f(1) f(2) f(3) f(4)\n```\n\n### 다이나믹 프로그래밍 vs 분할 정복\n\n- **다이나믹 프로그래밍**과 **분할 정복**은 **모두 최적 부분 구조를 가질 때 사용 가능**\n - **큰 문제를 작은 문제로 나눌 수 있으며 작은 문제의 답을 모아서 큰 문제를 해결할 수 있는 상황**\n- 다이나믹 프로그래밍과 분할 정복의 **차이점**은 **부분 문제의 중복**\n - 다이나믹 프로그래밍 문제에서는 각 부분 문제들이 서로 영향을 미치며 부분 문제가 중복\n - 분할 정복 문제에서는 동일한 부분 문제가 반복적으로 계산되지 않음\n- **분할 정복**의 대표적인 예시로 **퀵 정렬**이 있음\n - 한 번 기준 원소(Pivot)가 자리를 변경해서 자리를 잡으면 그 기준 원소의 위치는 바뀌지 않음\n - 분할 이후에 해당 피벗을 다시 처리하는 부분 문제는 호출하지 않음\n\n![](https://velog.velcdn.com/images/minseok0123/post/1ba8ff89-f534-4403-b637-016a9041b75d/image.png)\n\n### 다이나믹 프로그래밍 문제에 접근하는 방법\n\n- 주어진 문제가 **다이나믹 프로그래밍 유형임을 파악**하는 것이 중요\n- 가장 먼저 그리디, 구현, 완전 탐색 등의 아이디어로 문제를 해결할 수 있는지 검토할 수 있음\n - 다른 알고리즘으로 풀이 방법이 떠오르지 않는다면 다이나믹 프로그래밍을 고려\n- 일단 재귀 함수로 비효율적인 완전 탐색 프로그램을 작성한 뒤에 (탑다운) 작은 문제에서 구한 답이 큰 문제에서 그대로 사용될 수 있으면, 코드를 개선하는 방법을 사용할 수 있음\n- 일반적인 코딩 테스트 수준에서는 기본 유형의 다이나믹 프로그래밍 문제가 출제되는 경우가 많음\n\n## 마지막 정리\n\n> 다이나믹 프로그래밍(Dynamic Programming)은 문제를 작은 부분 문제로 나누어 해결하고, 중복 계산을 피하여 효율적으로 최적해를 구하는 알고리즘 기법이다. 주어진 문제를 작은 부분 문제로 쪼갠 후 하향식(Top-down) 메모이제이션 기법이나 상향식(Bottom-up) 반복적인 계산 기법을 사용하여 최적해를 구한다.\n"},{"id":"43e5fe65-95f9-5606-bd24-45463e65e210","excerpt":"1. 리액트 프로퍼티 (props)를 사용하는 이유 리액트는 UI 라이브러리로서, 컴포넌트를 사용하여 UI를 구성한다. 이 때, 컴포넌트 간의 데이터 전달을 위해 프로퍼티(Props)를 사용해야한다. 2. 프로퍼티의 특징은 무엇인가? 프로퍼티는 부모 컴포넌트에서 자식 컴포넌트로 전달되는 데이터라서. 이 데이터는 자식 컴포넌트에서 읽기 전용으로 사용된다. 즉, 자식 컴포넌트에서는 해당 데이터를 직접 수정할 수 없다.…","fields":{"slug":"/리액트props/"},"frontmatter":{"title":"리액트 props 사용하는 이유","date":"2023.04.11","thumbnail":{"publicURL":"/static/08313e5f3a1c429de915af9fa1ccfeaa/1.png","childImageSharp":{"fluid":{"base64":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAACXBIWXMAABRNAAAUTQGUyo0vAAADsklEQVR42nWUW0ybZRjHe6vJvJkmExF16pU7aLIL40AHjUBQyCaHcehKC6wHhEkmQWHTRbMME8WbzSAGCURIo5sOh9mAZTjc5sA5xrp2HFrOlB4otI2j7Tj0Z75vFErp3uTL8+XNm9/z/J+TRG2DTZ81gMoGKmsArR0UNpAPe/jMaOFo/wTZo14q3FA+D6qZZfGtevW9JBwmXAatxgHyqUW+7B/FYLHh97j44/rf6PRDfHqymiOlJVRe6RUdaoQgNgFDYFobKKaX+OGuCRYf8nDhARarFb1eT4o0gVeitlFWWYWmb5zDjlVVocBHkT261FoD5Dvhk94B8C3g9fu5ZzDSdbmT+NhYUlJTOdbQgtZgpdC+DhM4kvC8CbbQAUf6JzGMjiMc/+IiI8PDKCsqkTX/Tkn/JMoJP4fDYBElq2ah2Gjnxj+38DhncXs8BI9pbAzVzUEK50Fj2wzbEGEwb7LpZZoMI8yMmLjVdwefzyfClgMB0Z7pvErW4DzFDjbBNkkWqpo/5qXDMATLSyKgtbWVkfHxtSgHBwaQXbqJeg7UMysi7LHAoOTypp+pO3OaiakpWnQ6uhobGe/uFoGuWQfytr/WgbYIRQl6EZo4b3SB+iYdFxsbqKv/EZfbzZLJBHY7Pq+X2rZL7L82gNyygsoRUszwCINAIYdVl3vRD5oYNpvXpJ49f564uDi2xrxITeNPdNrcFBgd69DwCMV2sUHFbTMn+kzk3ndyvPks31SfIidPRkx0NFFRUaKt/76WoTt9KC7eQBWSyw1AoQ3yZwJ83d4Nnjmqv6vliS1PsWWvlCeVZUS/voc3du/ml3O/cu3PLo41NHPAMEuxczVloZKDi0AtzO59JzU9etTlFWx75mmiS6rYerKO5/Ylsf2FGDKzssjLy+Pz07V8a5ykYGppw9hKwreLAM0x/8fBu1b25Cp49uVXeT4+me2v7WTXjh0kJibxblIyJ8qPcqWnF9mQS2y3iDkU/2dW0ArT4oS0Ii3xsXtJeOtNkqUJfJCRSXZuLukZGaQdyqeos4dCy/LjJyVYrQ8dkH57CmmBhvREKfty5byvLCI7LZWDmRkoUlNQHv+CnCGX6DxyY69KF1ZRqdnNoZYLSK5O89FXNZQ1n+O9C9dJK/2Yd3Lk7DpVy4HG31AMzqGZZcO0SCIuV8sSqe3/8lL7Pd7WdSLr6BUnSDbyAKWuDamug9guIyUhsIjANagdtE7Qmt0UDLvW1pQgr8jkRtk3QfFqd6hD5ArA/wFMH9PDxsg+KQAAAABJRU5ErkJggg==","aspectRatio":1,"src":"/static/08313e5f3a1c429de915af9fa1ccfeaa/46604/1.png","srcSet":"/static/08313e5f3a1c429de915af9fa1ccfeaa/62d80/1.png 125w,\n/static/08313e5f3a1c429de915af9fa1ccfeaa/e1953/1.png 250w,\n/static/08313e5f3a1c429de915af9fa1ccfeaa/46604/1.png 500w,\n/static/08313e5f3a1c429de915af9fa1ccfeaa/d8815/1.png 750w,\n/static/08313e5f3a1c429de915af9fa1ccfeaa/31987/1.png 1000w,\n/static/08313e5f3a1c429de915af9fa1ccfeaa/22f13/1.png 2048w","sizes":"(max-width: 500px) 100vw, 500px"}}},"categories":["Web","React"]},"rawMarkdownBody":"\n# 1. 리액트 프로퍼티 (props)를 사용하는 이유\n\n리액트는 UI 라이브러리로서, 컴포넌트를 사용하여 UI를 구성한다. 이 때, 컴포넌트 간의 데이터 전달을 위해 프로퍼티(Props)를 사용해야한다.\n\n# 2. 프로퍼티의 특징은 무엇인가?\n\n프로퍼티는 부모 컴포넌트에서 자식 컴포넌트로 전달되는 데이터라서. 이 데이터는 자식 컴포넌트에서 읽기 전용으로 사용된다. 즉, 자식 컴포넌트에서는 해당 데이터를 직접 수정할 수 없다.\n\n# 3. 프로퍼티 전달방법\n\n프로퍼티는 부모 컴포넌트에서 자식 컴포넌트로 전달될 때 객체 형태로 전달된다. 자식 컴포넌트에서는 이 객체를 받아서 사용할 수 있다. 프로퍼티는 함수형 컴포넌트에서는 함수의 매개변수로, 클래스형 컴포넌트에서는 this.props로 접근할 수 있다.\n\n> 아래는 프로퍼티를 이용하여 부모 컴포넌트에서 자식 컴포넌트로 이름과 나이를 전달하는 코드이다.\n\n_부모 컴포넌트_\n\n```js\nimport React from 'react';\nimport ChildComponent from './ChildComponent';\n\nfunction ParentComponent() {\n return (\n
    \n \n
    \n );\n}\n\nexport default ParentComponent;\n\n```\n\n_자식 컴포넌트_\n\n```js\nimport React from 'react';\n\nfunction ChildComponent(props) {\n const { name, age } = props;\n return (\n
    \n

    Name: {name}

    \n

    Age: {age}

    \n
    \n );\n}\n\nexport default ChildComponent;\n\n```\n\n# 4. 자식 컴포넌트에서 부모 컴포넌트의 상태 변경을 위한 콜백 함수 전달 방법\n\n프로퍼티를 사용하여 자식 컴포넌트에서 부모 컴포넌트의 상태를 변경하고 싶다면, 콜백 함수를 프로퍼티로 전달하여 사용할 수 있다. 이 콜백 함수는 자식 컴포넌트에서 실행되어 부모 컴포넌트의 상태를 변경할 수 있다.\n\n> 부모 컴포넌트에서 자식 컴포넌트에서 실행될 콜백 함수를 만들어 전달하는 코드이다.\n\n_부모 컴포넌트_\n\n```js\nimport React, { useState } from 'react';\nimport ChildComponent from './ChildComponent';\n\nfunction ParentComponent() {\n const [name, setName] = useState('John');\n\n const handleNameChange = (newName) => {\n setName(newName);\n };\n\n return (\n
    \n

    Name: {name}

    \n \n
    \n );\n}\n\nexport default ParentComponent;\n\n```\n\n_자식 컴포넌트_\n\n```js\nimport React, { useState } from 'react';\n\nfunction ChildComponent(props) {\n const [inputName, setInputName] = useState('');\n\n const handleInputChange = (event) => {\n setInputName(event.target.value);\n };\n\n const handleButtonClick = () => {\n props.onNameChange(inputName);\n setInputName('');\n };\n\n return (\n
    \n \n \n
    \n );\n}\n\nexport default ChildComponent;\n\n```\n\n# 5. 프로퍼티를 사용한 컴포넌트 간 데이터 전달의 장점은 무엇인가?\n\n프로퍼티를 사용하면 데이터를 쉽게 공유하고 재사용할 수 있어 코드의 재사용성이 높아지며, 단방향 데이터 흐름으로 인해 데이터 추적이 쉬워지고 디버깅이 쉬워지며, 컴포넌트 간의 의존성이 낮아져 코드 수정이나 유지 보수가 쉬워지며, 가상 DOM을 사용하여 성능을 개선할 수 있다.\n"},{"id":"d3342002-e371-5bb7-ab44-e71983320c31","excerpt":"시뮬레이션과 완전탐색 개념 시뮬레이션과 완전탐색은 CS에서 중요한 개념으로, 다양한 문제를 해결하기 위해 사용된다.\n시뮬레이션과 완전탐색에 대해 알아보고, 각각의 개념을 어떻게 활용하는지 알아보자. 1. 시뮬레이션(Simulation…","fields":{"slug":"/시뮬레이션과 완전탐색/"},"frontmatter":{"title":"시뮬레이션과 완전탐색","date":"2023.05.12","thumbnail":{"publicURL":"/static/cc3ebf5b6a941408a03a690e03ec3a5f/simulation.png","childImageSharp":{"fluid":{"base64":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAIAAAAC64paAAAACXBIWXMAAAsTAAALEwEAmpwYAAAEz0lEQVR42gHEBDv7AA8qMRArMxEsNBEtNBAuNRAvNxExOREzOxE2PhI5QhA7RQ89RxE+Rw08RBQ/SBI6RRM8RRAyOg0rNAwnMAARLTURLTURLzYRMjkSNj0SOUISPkYTQUoTRE4QSlMVWF4mYWYUV101XmcgU14WWmBKZW8MPkoQND0OLDUAETI5ETU8EjlCEz9HE0VNFEpRFExVFk9WFFFXEVpfdYKBfYmIZmt6STlTOV9pW29/QUBbE1djD0ZSDjI8ABM8RBRBShRIUBVNVBZQVxZSWBZVWxVWWw1WWmmIg7mCfqd2fUwvTTIfNFlAXj0lRCwoPFBwhz5wgyBSXgAWSlIWT1YXU1oXVlwYWF0YWl8WW18lZ2gXZWa0r5fAfXVkQmIwHzpCLkw1JD8sGipDMFE7MFVZWnomWGcAGVhdGVtfGl1hGmBiG2FkHGRmE2FiPX56uL6nxZOBgUVMXC01Vy0wTCo0KxQYGREmJBs0EAwZRh0XJmVjAB1kZh1mZx1qaR1sah1sah1sahtsaid0bcbEqNGGeIYrE4A0GX4yEFwjBC0OBEgaAEoWAWEiAGMmCS5BWAAjd3Ile3QlfHUjenMhd3Egc24dcGwrfXTBs4rUijJfUgtQHCGTcBRZgRsgDAlaIQRpXFY2L0EaEBw1KD8AI6eIGbWKHq2HJ5iAJ4h7I4B2I3pxHH52jItp5bIbZHoTNgkOyIQYb2QNFgIOIxQgRjtCLCpEFRInTj1JAAfOjwrYlBXUkh/BjCughiqPfySFeR+EeKKvlbRiPk8ZDnsyKqpFO14kKH89QXQyOCoODSkWJTcvPa9cPwBhz50z0pMT0Y0Sy4gktYgxm4UqkX4eh3k5l4OpqIusXEjYk271xZHqq4a6YFJdNTYvITk1LTrEhE+vTy0A/+nb6OHJvdu3i9GfOsGKL6qHLpeBKZB9H417Mp6EfKSAk35cypBmw2hVZTIyCxgqGBk2FyI9qnlElEUnAPXhzfzm0v3dxP/PrJ/Ikh2/ijKdgiSbgyKfhBqkhR+/jl6zdXAvImIJCUkpKhEZMBIWLwARNH9ZOXo2IQD01bz37NX37dPww5XjsX83yIwluodCsX82uIFYsXVunHFUZFpVOjI1FhkYJjEMCx0NEioEGD0yIzNgKB4Ar5iH/+TC9uTC6bmK4pJyl55ymIlWxFw+u2A+4Gc/rGNMKklahFdFcD8yTllOcldNGh8+AQ8qMB4qSyEaACpAS9KQbvCzhOOfe9SOdNV8Yp9DP3gwN6tCOb9YRLZTONNkP65ROVNAS1tSXD09WBUhPwIMHz8gHzcYFQAWVWStclHccUOJUEiwb1zYi26aVVVlITRjJiZPICZPNTx6W1B2QkAqKUkQJU0YKE8PGDAHDBo+IiEsExIAWU1Mq2dNxV9AWjQ5XDM2slE+/61c1ppieT1DgUpMqGNdtHtqm3NnUkFMIyI4HSM9DxszDRYpLBkaIxETAEIxOlY1N3E7OFYxMlQsL6ZJNPq2TeWbUJZJRGlCQkw4PisoOhwkPzAtPjcwPjMuPywuRCE0TBwwRR8lMQAvNEMJKTsgLjw5ND5CMThAKS1hLCtjLy8mHisSHjMTITsfKEAkJzoiITIcGyoUFCIRFCIdMEMkPFEmP1Z1pYey/tyskAAAAABJRU5ErkJggg==","aspectRatio":1,"src":"/static/cc3ebf5b6a941408a03a690e03ec3a5f/46604/simulation.png","srcSet":"/static/cc3ebf5b6a941408a03a690e03ec3a5f/62d80/simulation.png 125w,\n/static/cc3ebf5b6a941408a03a690e03ec3a5f/e1953/simulation.png 250w,\n/static/cc3ebf5b6a941408a03a690e03ec3a5f/46604/simulation.png 500w,\n/static/cc3ebf5b6a941408a03a690e03ec3a5f/bc59e/simulation.png 512w","sizes":"(max-width: 500px) 100vw, 500px"}}},"categories":["알고리즘","Python"]},"rawMarkdownBody":"\n## 시뮬레이션과 완전탐색 개념\n\n시뮬레이션과 완전탐색은 CS에서 중요한 개념으로, 다양한 문제를 해결하기 위해 사용된다.\n시뮬레이션과 완전탐색에 대해 알아보고, 각각의 개념을 어떻게 활용하는지 알아보자.\n\n### 1. 시뮬레이션(Simulation)\n\n머릿 속에 있는 알고리즘을 소스코드로 바꾸는 과정이다.\n알고리즘을 잘 세우더라도 알고리즘이 실제로 동작하지 않기 때문에 이러한 구현은 반드시 필요한 과정어떠한 알고리즘의 문제를 풀더라도 소스코드로 구현해야 하기 때문에 구현을 구분하지는 않지만, 알고리즘 과정에서 구현이 필요한 문제는 대체적으로 구현에 초점을 둔 어려운 문제가 많이 존재한다.\n\n![](https://velog.velcdn.com/images/minseok0123/post/e55ed6bb-5bdd-4a6d-82db-265db5ca1cc5/image.png)\n\n### 2. 완전탐색(Exhaustive Search)\n\n완전탐색은 가능한 모든 경우의 수를 나열하고, 그 중에서 문제의 조건을 만족하는 해결책을 찾는 방법이다. 모든 가능한 경우를 일일이 탐색하기 때문에 정확한 해결책을 찾을 수 있지만, 경우의 수가 많을 경우에는 시간과 리소스가 많이 소요될 수 있다. 따라서 완전탐색은 경우의 수가 비교적 작을 때에 유용하게 활용된다.\n\n## 문제 - 상하좌우\n\n> 여행가 A는 NxN 크기의 정사각형 공간에 서 있고, 이 공간은 1 x 1 크기의 정사각형으로 나누어져 있다.가장 왼쪽 위 좌표는 (1, 1)이고 가장 오른쪽 아래 좌표는 (N, N)이다.상하좌우로 이동할 수 있으며, 시작 좌표는 (1,1)이다.\n>\n> 계획서대로 이동하면 되는데 L, R, U, D는 각각 왼쪽, 오른쪽, 위, 아래로 한칸씩 이동하라는 뜻이다.\n>\n> 만약 공간을 벗어나는 움직임이 있다면 그 움직임은 무시하고 다음으로 넘어간다.\n>\n> 계획서에는 하나의 줄에 띄어쓰기를 기준으로 L, R, U, D 중 하나의 문자가 반복적으로 적혀있다. 각 문자의 의미는 다음과 같다\n>\n> - L: 왼쪽으로 한 칸 이동\n> - R: 오른쪽으로 한 칸 이동\n> - U: 위로 한 칸 이동\n> - D: 아래로 한 칸 이동\n\n이때 여행가 A가 N × N 크기의 정사각형 공간을 벗어나는 움직임은 무시된다예를 들어 (1, 1)의 위치에서 L 혹은 U를 만나면 무시된다다음은 N = 5인 지도와 계획이다.\n\n![](https://velog.velcdn.com/images/minseok0123/post/0cda2031-eff7-40d9-83d2-ed69060b26de/image.png)\n\n## 코드\n\n```python\nn = int(input()) # 정사각형 공간을 입력받는다.\nx, y = 1, 1 # 시작 좌표는 항상 (1, 1)이므로 1, 1로 x, y 초기화\nplans = input().split() # 이동 계획을 입력받는다.\n\n# 상하좌우(L, R, U, D)에 따른 이동 방향\ndx = [0, 0, -1, 1]\ndy = [-1, 1, 0, 0]\n\nmove_types = ['L', 'R', 'U', 'D']\n\n# 입력받은 이동 계획을 하나씩 조회\nfor plan in plans:\n for i in range(len(move_types)):\n \t# move_types와 일치하는 plan이 있다면\n if plan == move_types[i]:\n # 이동한 A의 좌표 nx, ny\n nx = x + dx[i]\n ny = y + dy[i]\n\n # N x N 크기의 정사각형을 벗어나면 움직임은 무시되므로\n if nx < 1 or ny < 1 or nx > n or ny > n:\n continue\n\n # 공간안에 있다면 A의 좌표 이동\n x, y = nx, ny\n\nprint(x, y)\n```\n\n1. 입력으로 정사각형 공간의 크기 N을 받습니다.\n2. A의 초기 위치를 (1, 1)로 설정합니다.\n3. 이동 계획을 입력받습니다.\n4. 상하좌우 이동에 따른 x, y의 변화량을 설정합니다.\n5. 이동 계획을 하나씩 조회하며, 이동 계획과 move_types를 비교하여 일치하는 이동 방향을 찾습니다.\n6. 해당 이동 방향에 따라 A의 좌표를 이동합니다.\n7. 이동한 좌표가 정사각형 공간을 벗어나지 않는지 체크하고, 벗어나면 움직임을 무시합니다.\n8. 모든 이동 계획을 처리한 후 A의 최종 위치를 출력합니다.\n\n### 3. 시뮬레이션과 완전탐색의 활용 예시\n\n시뮬레이션과 완전탐색은 다양한 문제 해결에 활용될 수 있다.\n\n- 게임 개발: 게임에서 특정 상황의 결과를 예측하고 시뮬레이션하여 게임의 균형을 조절하거나 최적화할 수 있다. 완전탐색을 사용하여 게임의 모든 가능한 상태를 탐색하여 최적 전략을 찾을 수도 있다.\n- 경제 모델링: 경제학자들은 경제 시스템을 모델링하여 다양한 정책 결정에 대한 결과를 예측하고 분석한다. 시뮬레이션을 통해 경제 시스템의 동작을 모방하고, 완전탐색을 통해 최적의 정책을 찾을 수 있다.\n- 여행 경로 최적화: 여행 경로 최적화 문제는 주어진 도시들을 방문하는 가장 짧은 경로를 찾는 문제이다. 가능한 모든 경로를 탐색하여 최단 경로를 찾을 수 있다.\n"},{"id":"fec65332-50ca-555c-8362-439ad33e3857","excerpt":"아래는 PyDub 라이브러리를 사용하여 음성 파일을 자동으로 분리하고 무음을 제거하는 Python 코드입니다. diff-svc 음성파일을 더 쉽게 만들기 위해 제작하였습니다. PyDub을 사용한 음성 파일 분리 및 무음 제거 개요 이번 포스트에서는 Python 라이브러리인 PyDub을 사용하여 음성 파일을 전처리하는 방법을 알아보겠습니다. PyDub은 오디오 파일의 다양한 처리 작업을 수행할 수 있는 라이브러리로, 간단한 API…","fields":{"slug":"/diff-svc 음성파일 (전처리)만드는 법/"},"frontmatter":{"title":"diff-svc 음성파일 (전처리)만드는 법","date":"2023.04.21","thumbnail":{"publicURL":"/static/84fafe303a969987ed1f8a59457a80e6/diffsvc.png","childImageSharp":{"fluid":{"base64":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAFCAYAAABFA8wzAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAvElEQVR42k3QTSsEYBQF4CcZdppSKJIyKRZqIiQaZkYaHymNj6ZZMIuxsFPyA/xx3ZzF3MX7dc4997wH3nCKE3RxjD7usYF5DLCHVxxiIfwjPGLVf83VcpvLEFcY4Qe/WA+psCU0wtnCGGdo4sBMDbP3cBmXF3G5jE2s4Bnn6EToBWvYCXeKdgndRLAb+wXu5muNnM0MLfwbLVwnohr6hc8ifUSssnzCBHd5q1rEQ3KueLbxHmyQnnai2v8DPXgVhKA+pTcAAAAASUVORK5CYII=","aspectRatio":3.676470588235294,"src":"/static/84fafe303a969987ed1f8a59457a80e6/46604/diffsvc.png","srcSet":"/static/84fafe303a969987ed1f8a59457a80e6/62d80/diffsvc.png 125w,\n/static/84fafe303a969987ed1f8a59457a80e6/e1953/diffsvc.png 250w,\n/static/84fafe303a969987ed1f8a59457a80e6/46604/diffsvc.png 500w,\n/static/84fafe303a969987ed1f8a59457a80e6/d8815/diffsvc.png 750w,\n/static/84fafe303a969987ed1f8a59457a80e6/31987/diffsvc.png 1000w,\n/static/84fafe303a969987ed1f8a59457a80e6/a4fbc/diffsvc.png 1213w","sizes":"(max-width: 500px) 100vw, 500px"}}},"categories":["Python","diff-svc"]},"rawMarkdownBody":"\n아래는 PyDub 라이브러리를 사용하여 음성 파일을 자동으로 분리하고 무음을 제거하는 Python 코드입니다. diff-svc 음성파일을 더 쉽게 만들기 위해 제작하였습니다.\n\n# PyDub을 사용한 음성 파일 분리 및 무음 제거\n\n## 개요\n\n이번 포스트에서는 Python 라이브러리인 PyDub을 사용하여 음성 파일을 전처리하는 방법을 알아보겠습니다. PyDub은 오디오 파일의 다양한 처리 작업을 수행할 수 있는 라이브러리로, 간단한 API와 함께 사용하기 쉽습니다. 이번 포스트에서는 PyDub을 사용하여 음성 파일을 무음 구간을 기준으로 분리하고, 분리된 오디오 조각들을 최대 15초까지만 선택하여 WAV 파일로 저장하고, 마지막으로 무음을 제거하는 작업을 수행하는 코드를 살펴보겠습니다.\n\n### 들어가기에 앞서 아래코드는 pydub 라이브러리가 필요합니다.\n\n파이썬 2.7, 3.3 이상의 버전에서 사용 가능합니다. pydub를 설치하려면 pip를 사용합니다.\n\n```python\npip install pydub\n\n```\n\n## 코드\n\n먼저 필요한 라이브러리를 import합니다.\n\n```python\nfrom pydub import AudioSegment\nfrom pydub.silence import split_on_silence\nimport os\nimport subprocess\n\n```\n\n다음으로, 입력 파일 경로와 출력 폴더를 설정합니다.\n\n```python\ninput_file = 'input_file.mp3'\noutput_folder = 'output_folder'\n\n```\n\n이제, 입력 파일을 PyDub으로 로드하고, 샘플링 레이트, 채널, 샘플 넓이를 설정합니다.\n\n```python\nsound = AudioSegment.from_file(input_file)\nsound = sound.set_frame_rate(44100).set_channels(1).set_sample_width(2)\n\n```\n\n이제, PyDub의 split_on_silence() 함수를 사용하여 입력된 음성 파일을 무음을 기준으로 자동으로 분리합니다. 이 함수는 최소 무음 길이, 무음으로 간주되는 dBFS 값, 분리된 각 음성 조각들 간의 추가적인 무음 길이를 인자로 받습니다.\n\n```python\naudio_chunks = split_on_silence(sound,\n min_silence_len=1000, # 최소 무음 길이 (밀리초 단위)\n silence_thresh=-35, # 무음으로 간주되는 dBFS 값\n keep_silence=500 # 분리된 오디오 조각들 간의 추가적인 무음 길이 (밀리초 단위)\n)\n\n```\n\n분리된 음성 조각들 중 최대 15초까지만 선택하여 WAV 파일로 저장합니다.\n이 작업은 각 음성의 길이가 너무 긴 경우 파일 크기가 너무 커지는 것을 방지하기 위한 것입니다.\n\n```python\nfor i, chunk in enumerate(audio_chunks):\n if len(chunk) > 15000:\n chunk = chunk[:15000]\n output_file = os.path.join(output_folder, f'chunk_{i}.wav')\n chunk.export(output_file, format='wav')\n\n```\n\n마지막으로 무음제거 코드입니다.\n\n```python\nfor filename in os.listdir(output_folder):\n if filename.endswith('.wav'):\n input_path = os.path.join(output_folder, filename)\n output_path = os.path.join(output_folder, f'processed_{filename}')\n subprocess.call(['ffmpeg', '-i', input_path, '-af', 'silenceremove=1:0:-50dB', '-y', output_path])\n os.remove(input_path)\n```\n\n# 전체코드\n\n```python\nfrom pydub import AudioSegment\nfrom pydub.silence import split_on_silence\nimport os\nimport subprocess\n\n# 음성파일 경로 설정\ninput_file = 'input_file.mp3'\noutput_folder = 'output_folder'\n\n# 오디오 파일 로드 및 변환\nsound = AudioSegment.from_file(input_file)\nsound = sound.set_frame_rate(44100).set_channels(1).set_sample_width(2)\n\n# 무음 구간을 기준으로 오디오 파일 분리\naudio_chunks = split_on_silence(sound,\n min_silence_len=1000, # 최소 무음 길이 (밀리초 단위)\n silence_thresh=-35, # 무음으로 간주되는 dBFS 값\n keep_silence=500 # 분리된 오디오 조각들 간의 추가적인 무음 길이 (밀리초 단위)\n)\n\n# 출력 파일명 설정 및 출력 폴더 생성\nif not os.path.exists(output_folder):\n os.makedirs(output_folder)\n\n# 분리된 오디오 조각들 중 최대 15초까지만 선택하여 wav 파일로 저장\nfor i, chunk in enumerate(audio_chunks):\n if len(chunk) > 15000:\n chunk = chunk[:15000]\n output_file = os.path.join(output_folder, f'chunk_{i}.wav')\n chunk.export(output_file, format='wav')\n\n# 무음 제거\nfor filename in os.listdir(output_folder):\n if filename.endswith('.wav'):\n input_path = os.path.join(output_folder, filename)\n output_path = os.path.join(output_folder, f'processed_{filename}')\n subprocess.call(['ffmpeg', '-i', input_path, '-af', 'silenceremove=1:0:-50dB', '-y', output_path])\n os.remove(input_path)\n\n```\n"},{"id":"9e97a580-a062-59df-97f2-3c7f678aa33a","excerpt":"오버라이딩 상속 받은 것을 그대로 안 쓰고 고쳐서 쓴다 (재정의)\n즉, 아빠가 입던 옷을 물려받은 뒤, 그걸 수선집에서 고쳐서 입는 셈 base 자식 클래스에서 부모 클래스를 가리키는 키워드 앞에서 오버라이딩이란 개념을 살펴봤었다.\n오버라이딩이란, 자식이 부모로부터 아빠옷을 상속받은 뒤 그것을 자신의 몸에 맞게 수선하는 것이다.\n그런데 수선하기 이전의 오리지날 아빠옷을 다시 입어야 하는 경우라면 어떻게 해야 할까? [base…","fields":{"slug":"/오버라이딩/"},"frontmatter":{"title":"오버라이딩","date":"2023.11.08","thumbnail":{"publicURL":"/static/737fda6f7a0bbee8c4f493c3e0eca1d4/overriding.png","childImageSharp":{"fluid":{"base64":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAKCAYAAAC0VX7mAAAACXBIWXMAAA7DAAAOwwHHb6hkAAABBElEQVR42q1SOY6DQBDkFxziPgyCZxDwBd4AARBABBmBQSSWAyQgI+AD/K9WjYQFvjZxUJqZmlJ1dc8wl8sFvwRzPFiW9e/+G3cy3AWmacIwDDiOc8JRt3O2bb8YM89mruvC8zywLAtBEMBx3AZFUTaQbuckSXoU2T0eCamiKIqoqgrzPCNNU8RxjKIokCQJmqZB13VYlgVlWSLLMoRhCFVVt6QvLRMpyzKiKML1ekXbtrjdbhiGAXmeo65rTNOEcRxxv9+xriv6vgfP86eRnFqmldomUFpd16Fp2paCVuJJQ6PwfR9BEHxO+PyqR9GR3+/IaJ/p2xl++wrvQKYfX/mXH/sPgIA5vexqHFcAAAAASUVORK5CYII=","aspectRatio":1.9841269841269842,"src":"/static/737fda6f7a0bbee8c4f493c3e0eca1d4/46604/overriding.png","srcSet":"/static/737fda6f7a0bbee8c4f493c3e0eca1d4/62d80/overriding.png 125w,\n/static/737fda6f7a0bbee8c4f493c3e0eca1d4/e1953/overriding.png 250w,\n/static/737fda6f7a0bbee8c4f493c3e0eca1d4/46604/overriding.png 500w,\n/static/737fda6f7a0bbee8c4f493c3e0eca1d4/3c17d/overriding.png 720w","sizes":"(max-width: 500px) 100vw, 500px"}}},"categories":["C샵"]},"rawMarkdownBody":"\n# 오버라이딩\n\n> 상속 받은 것을 그대로 안 쓰고 고쳐서 쓴다 **(재정의)**\n> 즉, 아빠가 입던 옷을 물려받은 뒤, 그걸 수선집에서 고쳐서 입는 셈\n\n```csharp\nusing System.Configuration;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\n\n\nclass 아버지\n{\n public void 아빠옷()\n {\n // 300개의 함수들\n Console.WriteLine(\"아빠가 입다 버린 구닥다리 옷\");\n }\n}\n\nclass 아들 : 아버지 // 아버지로부터 상속을 받음\n{\n // 아들이 물려받은 뒤 고쳐 쓴 함수들\n new public void 아빠옷() // 오버라이딩 (구별하기 위해 new 키워드를 쓰자)\n {\n Console.WriteLine(\"자식이 아빠 옷을 수선했다\");\n }\n\n // 아들 함수들\n public void 내옷()\n {\n Console.WriteLine(\"자식 전용 옷\");\n }\n}\n\nclass 메인\n{\n public static void Main(string[] args)\n {\n 아들 son = new 아들();\n son.아빠옷();\n son.내옷();\n }\n}\n\n```\n\n---\n\n# base\n\n> **자식 클래스**에서 **부모 클래스**를 가리키는 키워드\n\n앞에서 오버라이딩이란 개념을 살펴봤었다.\n오버라이딩이란, 자식이 부모로부터 아빠옷을 상속받은 뒤 그것을 자신의 몸에 맞게 수선하는 것이다.\n그런데 수선하기 이전의 오리지날 아빠옷을 다시 입어야 하는 경우라면 어떻게 해야 할까?\n\n## [base 사용 예시]\n\n**base**를 사용해서 다시 구닥다리 아빠옷을 입는 아들\n\n```csharp\nusing System;\nusing System.Collections.Generic;\nusing System.Configuration;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\n\n\nclass 아버지\n{\n public void 아빠옷()\n {\n Console.WriteLine(\"아빠의 냄새나는 옛날 옷\");\n }\n}\n\nclass 아들 : 아버지\n{\n new public void 아빠옷()\n {\n Console.WriteLine(\"아들이 고쳐 씀\");\n }\n\n public void 돈없는_아들()\n {\n base.아빠옷(); // 아빠 클래스에 있는 함수가 호출 됨\n 아빠옷(); // 아들 클레스에 있는 오버라이딩 된 함수가 호출 됨\n }\n}\n\nclass 메인\n{\n public static void Main(string[] args)\n {\n 아들 son = new 아들();\n son.돈없는_아들();\n }\n}\n```\n\n---\n\n### 또한 **부모클래스**의 생성자 함수가 **매개변수**를 받아야 하는 상황일 경우\n\n상속받는 **자식클래스**는 반드시 **부모클래스**의 **매개변수**에 값을 전달해줘야 한다.\n\n**자식 클래스**가 호출되면 **부모 클래스**도 덩달아 같이 호출이 되는데\n**부모 클래스**의 생성자의 **매개변수**에 값을 전달하지 않는다면 에러가 발생한다.\n이때 **base**를 통해 부모 클래스의 생성자에 값을 전달할 수 있다.\n\n```csharp\nusing System;\nusing System.Collections.Generic;\nusing System.Configuration;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\n\n\nclass 아버지\n{\n //생성자 함수 (아빠라는 형태의 객체가 메모리에 할당되면 가장 먼저 호출되는 함수)\n public 아버지(String father)\n {\n Console.WriteLine(\"1. 아빠 생성자 생성 : {0}\", father);\n }\n}\n\nclass 아들 : 아버지\n{\n public 아들(String son) : base(son)\n {\n Console.WriteLine(\"2. 아들 생성자 생성: {0}\", son);\n }\n}\n\nclass 메인\n{\n public static void Main(string[] args)\n {\n 아들 son = new 아들(\"아들에게 준 값\");\n }\n}\n```\n"},{"id":"6b7fb6ac-4bc9-51c9-925a-355ffd1abe96","excerpt":"콜바이밸류 vs 콜바이레퍼런스 ref와 out 차이 Call by value (값에 의한 전달) : 값만 보내니, 보낸 값을 아무리 바꿔도 원본 값은 안 바뀐다. Call by reference (참조에 의한 전달) : 원본 값의 주소를 보내니, 값을 바꾸면 원본도 바뀐다. 1. 콜바이밸류 (Call by value) 원본값이 바뀌지 않아서 아들은 콜바이레퍼런스 방식으로 주소를 전달하도록 함수를 수정하였다. 2. 콜바이레퍼런스 (Call by…","fields":{"slug":"/콜바이밸류 vs 콜바이레퍼런스 ref와 out 차이/"},"frontmatter":{"title":"콜바이밸류 vs 콜바이레퍼런스 ref와 out 차이","date":"2023.10.31","thumbnail":{"publicURL":"/static/9c5b3d213876b2e211193f074ae31d84/callbyvaluevscallbyrefrence.png","childImageSharp":{"fluid":{"base64":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAGCAIAAABM9SnKAAAACXBIWXMAAAPoAAAD6AG1e1JrAAABM0lEQVR42mP4DwO/f37+dbnu/5/v/3GAW/f/Xbv9G1mE4feVhl8XSn+dzfp5Mv7rWoEfO/X/vj35////79++v3379tevX//////79//STX/dEn5X9fycuODP1CV/Z634++zlX4bvazi+r+P7sV3rxza1Hzu0v68X/L6W+9el6qNHDq1bu3bTps0v3/zLb/oTnP07pfJPUgUIxZX8cYr5feL8L7Dm9QI/91r/2GP2c5/tj40S39ZwvTyU+/rVi8ePH1+8ePHxs2+Z1e9Csn8nlv9JKPsTVfg7qvC3U8zvY2d/MbzYFfp8u9/zrR7PNzt+WSPwfr3Sm9vb/v37h+y3X79+LV772iPxW2XX2+mLXy9Y/Xrl5tcvX/9ggKv48/vHi/3JXz+9whVgd+5/vHT9K3KAAQCrzSIrjusUMAAAAABJRU5ErkJggg==","aspectRatio":3.5714285714285716,"src":"/static/9c5b3d213876b2e211193f074ae31d84/46604/callbyvaluevscallbyrefrence.png","srcSet":"/static/9c5b3d213876b2e211193f074ae31d84/62d80/callbyvaluevscallbyrefrence.png 125w,\n/static/9c5b3d213876b2e211193f074ae31d84/e1953/callbyvaluevscallbyrefrence.png 250w,\n/static/9c5b3d213876b2e211193f074ae31d84/46604/callbyvaluevscallbyrefrence.png 500w,\n/static/9c5b3d213876b2e211193f074ae31d84/45a45/callbyvaluevscallbyrefrence.png 601w","sizes":"(max-width: 500px) 100vw, 500px"}}},"categories":["C샵"]},"rawMarkdownBody":"\n# 콜바이밸류 vs 콜바이레퍼런스 ref와 out 차이\n\n> 1. **Call by value (값에 의한 전달)** : 값만 보내니, 보낸 값을 아무리 바꿔도 원본 값은 안 바뀐다.\n> 2. **Call by reference (참조에 의한 전달)** : 원본 값의 주소를 보내니, 값을 바꾸면 원본도 바뀐다.\n\n## 1. 콜바이밸류 (Call by value)\n\n```csharp\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\n\n\n\nclass 바꿔치기\n{\n public void Change(int 위스키남은양)\n {\n int 맥주 = 1000;\n 위스키남은양 = 맥주;\n }\n}\n\nclass 불속성효자\n{\n public static void Main(string[] args)\n {\n int 위스키남은양 = 0; //아빠의 위스키를 다 먹은 상황\n\n 바꿔치기 change = new 바꿔치기();\n change.Change(위스키남은양);\n Console.WriteLine(\"위스키 남은양 : \" + 위스키남은양);\n }\n}\n```\n\n---\n\n원본값이 바뀌지 않아서 아들은 콜바이레퍼런스 방식으로 주소를 전달하도록 함수를 수정하였다.\n\n## 2. 콜바이레퍼런스 (Call by reference)\n\n```csharp\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\n\n\n\nclass 바꿔치기\n{\n public void Change(ref int 위스키남은양) // 주소값을 받음\n {\n int 맥주 = 1000;\n 위스키남은양 = 맥주;\n }\n}\n\nclass 불속성효자\n{\n public static void Main(string[] args)\n {\n int 위스키남은양 = 0; //아빠의 위스키를 다 먹은 상황\n\n 바꿔치기 change = new 바꿔치기();\n change.Change(ref 위스키남은양); // 주소값을 보냄\n Console.WriteLine(\"위스키 남은양 : \" + 위스키남은양);\n }\n}\n```\n\n---\n\n### C#의 Call by reference 방식은 ref 외에도 out도 존재한다.\n\n## ref와 out의 차이\n\n**ref** : ref는 함수 외부 -> 함수 내부로 주소를 전달할 때 사용하는 참조 키워드\n**out** : out은 함수 내부 -> 함수 외부로 주소가 나갈 때 사용하는 참조 키워드\n\n> - 따라서 ref 변수는 반드시 초기화가 필요하다\n> -> 초기화를 하지 않으면 쓰래기 값이 함수 내부로 전달 됨(오류 발생)\n\n### ref예제\n\n```csharp\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\n\n\nclass Call\n{\n static void 함수내부(ref int x)\n {\n x = 1234;\n }\n\n\n public static void Main(string[] args)\n {\n int x1 = 0; // 변수를 초기화 함\n 함수내부(ref x1);\n Console.WriteLine(x1);\n }\n}\n```\n\n---\n\n### out예제\n\n```csharp\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\n\n\nclass Call\n{\n static void 함수내부(out int x)\n {\n x = 1234;\n }\n\n\n public static void Main(string[] args)\n {\n int x1; // 변수를 초기화 하지 않음\n 함수내부(out x1);\n Console.WriteLine(x1);\n }\n}\n```\n\n---\n"},{"id":"5e14b0de-fa04-5b11-b85e-d69481986148","excerpt":"추상클래스 vs 인터페이스 차이 C 같은 절차지향 언어 : 클래스x (함수 혼자 놈)\nJAVA, C…","fields":{"slug":"/추상클래스 vs 인터페이스 차이/"},"frontmatter":{"title":"추상클래스 vs 인터페이스 차이","date":"2023.11.09","thumbnail":{"publicURL":"/static/57433fedf2afff74919acccd97c9a65d/ClassAndInterface.png","childImageSharp":{"fluid":{"base64":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAALCAYAAAB/Ca1DAAAACXBIWXMAAAsTAAALEwEAmpwYAAACFUlEQVR42nWTTU8TURSG+UmoIB+hUxI3/gZ2yMqlS7e6dOHCnZK4coMgRmMohEBoC6U40+8PKdUAip2pCYV25t6Z6cw8pjOR8OXiybnn3Nw377nn3iFKMYJiDEoKfm4Sb28ELztMoA5DYcAdKNyFwr2I4ggURyNK40TnlTAONIbCpBzH18bo5V8iTrYRh5+xfixhHbzD2p9H1F8hqi8Q5WfI0lNk4Qky/xiRmcHTlEuilwS97Ajd/QR9wPUjpAO2ewknQkofF9CLx7Q/zEB9gqAQv+bw6yin5UUs26fXPeX87BTXkUhpYVk9hGViWSZCWNhS4NHHKP2ktTAH38auCgblOOQmaG69IbGeZDXxheXlJdLpFInECvl8Dk1TWV9fY3Nzg3QqSa6k8Uv7jrE0B/Wxmw69vVHOax/pCp+20aLT6WCaZkiz2URVVRqNBgcHDWq1Kke/j8OW9fePbjr8J9itL9MPoO9IXMfBsW1cx8bsdcOWhRCYvV6YO56NUTxCX7xNsBKnnx04jIbieD5uwAWDWjgsz8UbrAMIgHbVoLXwH4e+dh9j9Tl6dg89s4W+m0LPJKO4s0k7l+fspENrZxsjm6Stpjla2eDPp9mrd3jxhsoxPHUCmVKw03HstBKRiuPsxOiuPaDx9jWH87P0d8eRYX0aPz99yzu8EFWgGoPKdRSoTeJkphCph1CZgqoS7V37KX8B0nfaLAxpFLUAAAAASUVORK5CYII=","aspectRatio":1.7857142857142858,"src":"/static/57433fedf2afff74919acccd97c9a65d/46604/ClassAndInterface.png","srcSet":"/static/57433fedf2afff74919acccd97c9a65d/62d80/ClassAndInterface.png 125w,\n/static/57433fedf2afff74919acccd97c9a65d/e1953/ClassAndInterface.png 250w,\n/static/57433fedf2afff74919acccd97c9a65d/46604/ClassAndInterface.png 500w,\n/static/57433fedf2afff74919acccd97c9a65d/d8815/ClassAndInterface.png 750w,\n/static/57433fedf2afff74919acccd97c9a65d/ee604/ClassAndInterface.png 800w","sizes":"(max-width: 500px) 100vw, 500px"}}},"categories":["C샵"]},"rawMarkdownBody":"\n# 추상클래스 vs 인터페이스 차이\n\n> C 같은 절차지향 언어 : 클래스x (함수 혼자 놈)\n> JAVA, C# 같은 객체지향 언어 : 클래스 안에 함수\n\n## 추상 함수 (추상 메소드)\n\n- 클래스에 속한 함수가 구현이 되어있지 않을 경우\n- 즉, 머리만 있고 몸통은 없으므로 이를 상속받는 자식 클래스는\n 반드시 오버라이딩해서 기능을 추가해서 써야 한다.\n- 만약 오버라이딩을 하지 않을 경우, 에러가 발생하므로\n 반드시 그 함수를 구현하도록 강제한다.\n\n### 추상 클래스 (Abstract Class)\n\n구현이 안 되어 있고 선언만 한 추상 함수(추상 메소드)를 1개라도 포함하고 있어야 한다.\n참고로 메소드라는 단어는 '클래스 안에 포함된 함수'를 뜻하는 말인데,\n함수든 메소드든 거의 같은 뜻으로 쓰인다.\n\n추상 함수를 대체 왜 쓰는 걸까? -> 설계 (구현 안하면 에러뜨게 해서 강제로 구현하게 한다)\n\n```csharp\nusing System;\nusing System.Collections.Generic;\nusing System.Configuration;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\n\n\nabstract class 직업\n{\n // 고쳐서 써야 하는 일반함수 -> 추상함수로 수정\n public abstract void 공격스킬();\n\n // 고쳐서 써야 하는 일반함수 : 일반함수로 선언시, 개발자가 깜빡하고 구현 안할 수도 있다.\n public abstract void 방어스킬();\n\n\n // 일반변수\n int hp = 100;\n int mp = 100;\n\n // 일반함수\n public void 공통스킬()\n {\n\n }\n\n public void 공통능력치()\n {\n\n }\n}\n\nclass 마법사 : 직업\n{\n // new public void 공격스킬() new : 일반함수를 오버라이딩\n // 추상함수를 오버라이딩 :\n public override void 공격스킬()\n {\n Console.WriteLine(\"자식이 부모꺼 오버라이딩해서 고쳐 씀\");\n }\n\n public override void 방어스킬()\n {\n Console.WriteLine(\"자식이 부모꺼 오버라이딩해서 고쳐 씀\");\n }\n}\n\nclass AbstractTestMain\n{\n public static void Main(string[] args)\n {\n 마법사 wizard = new 마법사();\n //wizard.공통능력치();\n //wizard.공통스킬();\n wizard.방어스킬();\n wizard.공격스킬();\n }\n}\n```\n\n---\n\n## [추상클래스의 문제점] : 다중 상속을 할 수 없다.\n\n**[C#이 다중 상속을 금지하는 이유]**\n\n> 만약 아버지A 클래스에 [say]라는 함수가 있고,\n> 만약 아버지B 클래스에 [say]라는 똑같은 이름의 함수가 있을 때,\n> 아들 객체가 두개 다 상속받으면 같은 이름의 함수가 2개가 들어오는 문제가 발생한다.\n\n만약 이런 상황에서 아들 객체가 say()를 호출하면\n아버지A의 say()를 호출해야 할지, 아니면\n아버지B의 say()를 호출해야 할지 모호해진다.\n\n```csharp\nusing System;\nusing System.Collections.Generic;\nusing System.Configuration;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\n\n\nabstract class 아버지A\n{\n public abstract void Say();\n\n}\n\nabstract class 아버지B\n{\n abstract public void Say();\n}\n\nclass 아들 : 아버지A//, 아버지B\n{\n public override void Say()\n {\n Console.WriteLine(\"돌 굴러가유~\");\n }\n}\n\n\nclass 메인\n{\n public static void Main(string[] args)\n {\n 아들 son = new 아들();\n son.Say(); // 모호한 상황\n }\n}\n```\n\n---\n\n## 인터페이스\n\n> 그래서 다중상속을 받을 수 있도록 하기 위해 탄생한 것이 인터페이스이다.\n> 인터페이스는 추상클래스와는 달리, 절대로 일반변수와 일반함수를 선언할 수 없다.\n\n즉 모든 함수가 **\"텅 빈\"** 빈 껍데기 추상함수로만 구성되어 있다.\n따라서 중복이 되더라도 프로그램이 충돌하지 않는다.\n(아무런 구현이 되어 있지 않으므로)\n\n```csharp\nusing System;\nusing System.Collections.Generic;\nusing System.Configuration;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\n\n\n// 인터페이스 여러개\ninterface 마법사_파이어볼\n{\n // 인터페이스 : 어차피 추상함수들 밖에 없으므로 abstract 키워드를 굳이 안붙여도 된다.\n void FireBall();\n}\n\ninterface 마법사의무기\n{\n // 추상함수들\n void 몽둥이찜질();\n void 마나(); // 실수로 이름이 같은 함수를 또 넣었네\n}\n\ninterface 마법사의대사\n{\n void Magic();\n void 마나(); // 실수로 이름이 같은 함수를 또 넣었네 (근데 어차피 구현안된 빈 껍데기라서 충돌되지 않음)\n}\n\nclass 마법사 : 마법사_파이어볼, 마법사의대사, 마법사의무기\n{\n // 인터페이스 오버라이딩\n\n public void FireBall()\n {\n Console.WriteLine(\"파이어 볼\");\n }\n public void 몽둥이찜질()\n {\n Console.WriteLine(\"몽둥이로 팬다\");\n }\n public void 마나() // 인터페이스 안에 있는 마나 추상함수는 중복이 되도 문제 X\n {\n Console.WriteLine(\"마나가 없어\");\n }\n public void Magic()\n {\n Console.WriteLine(\"매직\");\n }\n\n}\n\n\nclass 메인\n{\n public static void Main(string[] args)\n {\n 마법사 Wizard = new 마법사();\n Wizard.몽둥이찜질();\n Wizard.FireBall();\n Wizard.마나();\n Wizard.Magic();\n }\n}\n```\n\n---\n"},{"id":"7877535f-6779-5a18-a66f-3ee1f24336a7","excerpt":"업캐스팅의 유용함 업캐스팅 특정 객체가 하위 클래스의 형에서 상위의 클래스형으로 캐스팅 되는 것\n하나의 매개변수의 형으로 여러 형을 받아줄 수 있다. [만약 C…","fields":{"slug":"/업캐스팅의 유용함/"},"frontmatter":{"title":"업캐스팅의 유용함","date":"2023.11.10","thumbnail":{"publicURL":"/static/93c42ad9de9f5e732db1f8116216354a/upcasting.png","childImageSharp":{"fluid":{"base64":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAASCAYAAABb0P4QAAAACXBIWXMAAAsTAAALEwEAmpwYAAACu0lEQVR42qVUy47jNhD0XyQjUnxTlChKsmzJkuEZeweLzSFYJIcAueT/v6OCpmzvzB6TQ6HVBFns7ipqN51OiOdv8IcrbHuAsgGuW1AdbjCxQ7gs8G8r/GWGNBqiLCGEQFmWTzxyiruUWvR9h+LlBSVn9018A2eQtJkzcMZQFAU453kPrWsloeSd/E66CyHAGJMX/HiB37/CdTN0aOH6Fa47wewvGOcTvn//Heu6QGuN4C3+uK747TzBOfesfJdSyhUyzqF9gDRugzJb1BbK1dDWoq5rOGefFVXWZCi9jYLWdsRONzLGwRi1xD7MZ2uvpDY5z5fyeyUEav8xAiIj0h0lsQ6wWqHyHs5acFag5MVGVLAt0iHGNhTFU4QnHhXGGHE435CmC5puhA8NlI8w9QDpPMy+gwoeSiroLm7oE6RRnxR/EO+O04x2eYduZ6iQILSFjWMWRFc1musZduyglYaeBphpD3s6QliNgrFPtskqN02D1DYofv0FQsosghAyz5Jiyck2JZRSMEJB8q11oxTa4KCl/Fwh2YZEEVIhTDf48RXVsMDGAW44w9H3eMXxvOLvf/7C9f0t7/fO4LJPiHUDpX6QPn0opcQ8z2hixDDskbrurqjMlwkpYJyG0urZHqn+qOxJSCSbsSXq+Quq4w1+v0KHBD++wfYrpuWI99uEr19fMY6HbCcaz89k4qEytWCsQdv14CVZQKJkPEdBuZB5hnSQ8xJFwbJvKS/u8eHH3LK1NrPr+yGyhl0OsPMI1Scc5x7ndcByGjDNHeZlj8NhwHlI+PO6YO5btG0LIcofohCaps43qVBtfosNZKgQ2xpdCkipzmhTjbqu0HiHpW9ROQvioR9Gto3WJivlvdtKJzxeBT05+tOwLbKPkXO8FOzTE9zF2ORHzz6Y9P9g17Yx90+EPyv2Xwj/BQHC/Q5/875DAAAAAElFTkSuQmCC","aspectRatio":1.0964912280701755,"src":"/static/93c42ad9de9f5e732db1f8116216354a/994e1/upcasting.png","srcSet":"/static/93c42ad9de9f5e732db1f8116216354a/62d80/upcasting.png 125w,\n/static/93c42ad9de9f5e732db1f8116216354a/e1953/upcasting.png 250w,\n/static/93c42ad9de9f5e732db1f8116216354a/994e1/upcasting.png 288w","sizes":"(max-width: 288px) 100vw, 288px"}}},"categories":["C샵"]},"rawMarkdownBody":"\n# 업캐스팅의 유용함\n\n## 업캐스팅\n\n> 특정 객체가 **하위 클래스**의 형에서 **상위의 클래스형**으로 캐스팅 되는 것\n> 하나의 **매개변수**의 형으로 여러 형을 받아줄 수 있다.\n\n### [만약 C#이 업캐스팅 문법을 지원하지 않을 때 생기는 문제점]\n\n새로운 **하위 클래스**를 만들 때 마다\n**'동물병원 클래스'** 안에도 그 **하위클래스**에 맞는 **'환자추가 함수'** 를 새로 만들어야 한다.\n\n# 업캐스팅을 하지 않았을 때 생기는 불편함\n\n```csharp\nusing System;\nusing System.Collections.Generic;\nusing System.Configuration;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\n\n // 상위클래스\npublic class Animal\n{\n\n}\n\npublic class Dog : Animal\n{\n\n}\n\npublic class Cat : Animal\n{\n\n}\n\npublic class Rabbit : Animal\n{\n\n}\n\npublic class 동물1 : Animal\n{\n\n}\npublic class 동물2 : Animal\n{\n\n}\npublic class 동물3 : Animal\n{\n\n}\n\n\nclass 동물병원\n{\n public void 진료(Dog ani)\n {\n Console.WriteLine(\"환자 도착 : \" + ani);\n }\n\n public void 진료(Cat ani)\n {\n Console.WriteLine(\"환자 도착 : \" + ani);\n }\n\n public void 진료(Rabbit ani)\n {\n Console.WriteLine(\"환자 도착 : \" + ani);\n }\n}\n\nclass main\n{\n public static void Main(string[] args)\n {\n Dog d = new Dog();\n Cat c = new Cat();\n Rabbit r = new Rabbit();\n\n // 이후 소문듣고 몰려온 새 환자들\n 동물1 a1 = new 동물1();\n 동물2 a2 = new 동물2();\n 동물3 a3 = new 동물3();\n\n 동물병원 hospital = new 동물병원();\n hospital.진료(d);\n hospital.진료(c);\n hospital.진료(r);\n\n //hospital.진료(a1);\n //hospital.진료(a2);\n //hospital.진료(a3);\n }\n}\n```\n\n그래서 열받은 병원장은 **업캐스팅**을 사용해서\n새로운 **하위클래스**가 추가되더라고 더이상\n동물병원 클래스를 고칠 필요가 없도록 수정하였다.\n\n---\n\n# 업캐스팅을 한 경우\n\n```csharp\nusing System;\nusing System.Collections.Generic;\nusing System.Configuration;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\n\n // 상위클래스\npublic class Animal\n{\n\n}\n\npublic class Dog : Animal\n{\n\n}\n\npublic class Cat : Animal\n{\n\n}\n\npublic class Rabbit : Animal\n{\n\n}\n\npublic class 동물1 : Animal\n{\n\n}\npublic class 동물2 : Animal\n{\n\n}\npublic class 동물3 : Animal\n{\n\n}\n\n\nclass 동물병원\n{\n public void 진료(Animal ani)\n {\n Console.WriteLine(\"환자 도착 : \" + ani);\n }\n\n}\n\nclass main\n{\n public static void Main(string[] args)\n {\n Dog d = new Dog();\n Cat c = new Cat();\n Rabbit r = new Rabbit();\n\n // 이후 소문듣고 몰려온 새 환자들\n 동물1 a1 = new 동물1();\n 동물2 a2 = new 동물2();\n 동물3 a3 = new 동물3();\n\n 동물병원 hospital = new 동물병원();\n hospital.진료(d);\n hospital.진료(c);\n hospital.진료(r);\n\n hospital.진료(a1);\n hospital.진료(a2);\n hospital.진료(a3);\n }\n}\n```\n\n---\n\n## 인터페이스와 추상클래스의 업캐스팅 차이\n\n```csharp\nusing System;\nusing System.Collections.Generic;\nusing System.Configuration;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\n\n// 인터페이스\npublic interface 인터페이스\n{\n void 추상함수1(); // abstract를 굳이 안 붙인다 (어차피 100% 추상함수밖에 없으므로)\n}\n\n// 추상클래스\npublic abstract class 추상클래스\n{\n // 추상함수\n public abstract void 추상함수2();\n\n // 일반함수도 존재할 수 있다\n}\n\npublic class 하위클래스 : 추상클래스, 인터페이스\n{\n public void 추상함수1()\n {\n Console.WriteLine(\"인터페이스에 있던 추상함수\");\n }\n\n public override void 추상함수2()\n {\n Console.WriteLine(\"추상클래스에 있던 추상함수\");\n }\n}\n\npublic class TestMain\n{\n public static void Main(string[] args)\n {\n 하위클래스 하위 = new 하위클래스();\n\n // 1. 인터페이스의 업캐스팅 예시\n 인터페이스 up1 = 하위; // 인터페이스 : 상위클래스\n up1.추상함수1();\n\n // 2. 추상클래스의 업캐스팅 예시\n 추상클래스 up2 = 하위; // 추상클래스 : 상위클래스\n up2.추상함수2();\n\n }\n}\n```\n\n---\n"},{"id":"7394bcc4-61a8-591a-9988-220a0dabd201","excerpt":"박싱과 언박싱 Boxing : 값타입을 참조타입으로 변환하는 기법\nUnBoxing : 참조타입을 값타입으로 변환하는 기법 1. 값타입 스택 : 저장 선언되는 즉시 메모리를 할당하게 된다. 따라서 생성과 동시에 값을 할당할 수도 있다. int a = 3; 2. 참조타입 힙 : 저장\n스택 : (C의 포인터처럼) 저장된 것의 주소값만 가짐 쿠팡이라는 온라인마켓\nint 모양의 상품, double 모양의 상품, String…","fields":{"slug":"/박싱과 언박싱/"},"frontmatter":{"title":"박싱과 언박싱","date":"2023.11.11","thumbnail":{"publicURL":"/static/f4d7b3a1114c4a515a6a522123598c5e/unboxing.png","childImageSharp":{"fluid":{"base64":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAQCAYAAAAWGF8bAAAACXBIWXMAAA7DAAAOwwHHb6hkAAAC9UlEQVR42nWTXW8bVRCGT1zBr+GyFK6QQCAhLhrxA7jkHsEf6AVICBGuqwISIAXENRIUmkSq0sa2mo2T+GN37V3vt90a1453nfhjvedBezZJLaQcaTSvRjPvmXnPHMH6kbLw/hF4GsQD8A4hrMNsAskQpkN40YZxCNOXRc5avXiFJciMnFJWt8n2HyAf34dHW8g/v4RH38LTH5EPv0bufw8735H9s4X8+xtI56rumlBednblmQ4g6cFiihxHMHRgHCHHIfKsB2c95CyGUAPt9+vB5DrhFdkqTRlNEpwgYpVdJq4Za773/AXjeMo6h7giyrKiOgwC9nZ3+OXnnxiNzlS5lNmlvhKZZSyXC5X726/b7O7uKpymqfKqw+FwiGEYdLtdWs0mrVYLz/Not9tYloVpmlzl6bqObdsqt9lsKstxp9NRpgjz4ul0yk3HdV3VQRAExHF8Y941oe/7JPFEjZStUrIst5Xyecx1HUUYRSGTySgXKFd7Tc0MKZdYVrsgzG+ez+WNNwdhn3S5JIr6TM+L2Pk59J8v8PyYOClidrdXELqujWnsEYVVfK9Mv1emH5UJvAqBf8BxbU+9ieM1qdfu0fO2qD79nL/++ITHO59SefIFnv0Vz6o/IObzjK5dJdA3GPklxkGJ2pMS9WqOX+OlK2jVPlQrFOrbjDzBaiQgFgwsgd8scDoUtE/fQywWEqtTxjwSBIYgMgWdY4Gh5biE3xLUKu8j/41xDx7Qqt0m7LyFb95Br71J4/AOvvk2nvEGWuUzhGHYHGkPWY1LkApCY4PTiqC2L/D0WyoW6O+SziDoRQwGExZLOL+QzBeSvKGLC8lsBoZhXWroHFKvbOA2SuiHt2g9K2FoJXTtdewTgVb+SL1rGLokSfy///IKd7s2YrkE2zpgEgqycaGHdSzUqDnO9bKb75Cu8m1wSJLkxm3IP4HqsN9vY5zcxTHu0tU3MU42MU83cYyPsZsf0Dq9pwqiKKDRaOA4jvot65aT1et1/gMkWHmafvk6hQAAAABJRU5ErkJggg==","aspectRatio":1.2376237623762376,"src":"/static/f4d7b3a1114c4a515a6a522123598c5e/46604/unboxing.png","srcSet":"/static/f4d7b3a1114c4a515a6a522123598c5e/62d80/unboxing.png 125w,\n/static/f4d7b3a1114c4a515a6a522123598c5e/e1953/unboxing.png 250w,\n/static/f4d7b3a1114c4a515a6a522123598c5e/46604/unboxing.png 500w,\n/static/f4d7b3a1114c4a515a6a522123598c5e/64686/unboxing.png 746w","sizes":"(max-width: 500px) 100vw, 500px"}}},"categories":["C샵"]},"rawMarkdownBody":"\n# 박싱과 언박싱\n\n> **Boxing** : 값타입을 참조타입으로 변환하는 기법\n> **UnBoxing** : 참조타입을 값타입으로 변환하는 기법\n\n## 1. 값타입\n\n스택 : 저장\n\n- 선언되는 즉시 메모리를 할당하게 된다.\n- 따라서 생성과 동시에 값을 할당할 수도 있다. int a = 3;\n\n## 2. 참조타입\n\n힙 : 저장\n스택 : (C의 포인터처럼) 저장된 것의 주소값만 가짐\n\n```csharp\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\n\n\n// 유리병(값타입) -> 유리병 그대로 배달 X -> 택배차 : 거부 (우린 택배박스만 받는다)\n// 유리병 -> 택배포장 -> 택배차\n// 값타입 -> 참조타입으로 포장(박싱) -> 참조타입만 받는 매개변수에 전달\npublic class BoxingTest\n{\n public static void Main(string[] args)\n {\n int p = 123; // 값타입\n Object o = p; // (자동으로 박싱) 박싱후 o에 들어가는 상황\n int j = (int)o; // 언박싱 : 내가 명시적으로 캐스팅을 해줘야 한다\n\n Console.WriteLine(p);\n Console.WriteLine(o);\n Console.WriteLine(j);\n }\n}\n\n비유하자면 우리집이라는 객체를 메모리에할당할 경우,\n우리집은 힙 영역에 저장되고 스택 영역에서는 우리집을 가르키는 주소\n* 참조타입은 새로운 값을 할당하기 위해서는 new를 통해 선은을 해줘야 한다.\n\nclass 우리집\n{\n public void 안방()\n {\n\n }\n}\n\n\npublic class BoxingTest\n{\n public static void Main(string[] args)\n {\n int a = 10; // 값타입\n 우리집 b201호 = new 우리집(); // 참조타입\n b201호.안방();\n }\n}\n```\n\n---\n\n쿠팡이라는 온라인마켓\nint 모양의 상품, double 모양의 상품, String 모양의 상품, 객체 모양의 상품 (별의별 물건 다 팜)\n할때마다 int 전용 택배차 따로, double 전용 택배차를 일일히 다 만들면 비효율적이다\n포장 -> 모두 같은 택배차에 실어 나르자\n\n```csharp\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\n\n\npublic class 쿠팡맨\n{\n public void 배송출발(Object o)\n {\n Console.WriteLine(\"배달하는 물건 : \"+ o );\n }\n}\n\npublic class BoxingTest\n{\n public static void Main(string[] args)\n {\n 쿠팡맨 man = new 쿠팡맨();\n int 주문상품1 = 123; // 값타입 (그냥 택배차에 못 실음)\n double 주문상품2 = 3.14; // 값타입\n String 주문상품3 = \"이미포장됨\"; // 참조타입\n\n man.배송출발(주문상품1); // 값 타입이 자동으로 참조타입으로 박싱된 후 전달됨 (택배포장이 된 후)\n man.배송출발(주문상품2); // 값 타입이 자동으로 참조타입으로 박싱된 후 전달됨 (택배포장이 된 후)\n man.배송출발(주문상품3);\n man.배송출발(man); // 쿠팡맨은 포장 안하고 그냥 택배차에 올라탐 (참조타입은 그냥 들어감)\n }\n}\n```\n\n---\n\n```csharp\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\n\nusing System.Collections; // ArrayList 쓰려고 추가함\n\npublic class BoxingTest\n{\n public static void Main(string[] args)\n {\n ArrayList list = new ArrayList();\n\n // 1. 박싱되는 예시\n list.Add(new BoxingTest()); // list[0] 공간 : 참조타입인 객체가 전달\n list.Add(\"안녕하세요\"); // list[1] 공간 : 참조타입인 문자열이 전달 (heap 영역에 저장 근데 문자열은 특이하게도 new 키워드를 안써도 된다)\n list.Add(3.14); // list[2] 공간 : 값타입인 실수가 (자동으로 박싱이 된 후) 전달\n list.Add(123); // list[3] 공간 : 값타입인 정수가 (자동으로 박싱이 된 후) 전달\n\n // 2. 정상 삽입됐나 확인\n Object o1 = list[2]; // list.Add(3.14); 이게 정상적으로 삽입됐나?\n Object o2 = list[3]; // list.Add(123); 이게 정상적으로 삽입됐나?\n\n Console.WriteLine(o1);\n Console.WriteLine(o2);\n\n // 3. 전체 출력\n PrintValues(list);\n }\n\n // 출력 함수\n public static void PrintValues(IEnumerable 리스트)\n {\n foreach (Object obj in 리스트)\n {\n Console.WriteLine(\"{0}\", obj);\n }\n }\n}\n```\n\n---\n"},{"id":"0c364a17-8fc9-5d96-8aaf-70f716c557fc","excerpt":"1차원 배열 배열 : 배열은 같은 데이터 타입의 데이터(Data)를 여러 개 저장할 수 있는 저장공간이다. 배열 또한 메모리를 생성할 때 new 키워드를 사용한다. 이를 통해 배열은 stack이 아닌 heap 영역에 저장된다는 사실을 짐작할 수 있다. 배열의 이름은 주소값을 저장하는 참조변수다.\n즉, “heap 영역에 저장된” 배열의 주소값이 저장된다.\n우리는 이 주소값을 통해 배열에 접근한다. 결과 아파트[0] = 0 아파트[1] =…","fields":{"slug":"/1차원 배열/"},"frontmatter":{"title":"1차원 배열","date":"2023.11.12","thumbnail":{"publicURL":"/static/0bfed996c015433bba3c4297621b2883/1array.png","childImageSharp":{"fluid":{"base64":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAOCAYAAAAvxDzwAAAACXBIWXMAABYlAAAWJQFJUiTwAAACkklEQVR42nWTWbOaWBSF/f//qfspXddc44iIikwikyAgoITpfF2cO6WSyqlaZw8Pq9aeJkIIBLzh0xcI6TxBRIghQAwhcMW25gT+hr736TpPomlchr5kfJPxE8OA6AeZGO0g/YHirpNlGmV5Is8P3O9HGXupytGb86r8w2z7L9Z1Q5xrIFomw88WcStpooyLqvP0E0gf1HlGGG5wnB+kqYbvr/H9FUG05nhZojkL9u4C1Zqh2nOcaM3QV0y6rCI9nUksF2OpkJhnUvNCfnalsttNo6reFJbFifC6QTFeUIzvHC5LtuYrK/0FK1gx9A8mbVZir3a4uyPn7YHgYOJujzzCiDzb43kr0nQv1Y4Iog2aM0Nz5uzPc1R7xtaaYQXLN8LmVpAaLpnjkTs+me1RupEkLAudMFIoCp3rdUscq/jBCtV6xQgVWfKo8uitMP0FYngnjA4WV8MhNs/EhkNqeVRBKAlvt9271cizA56/RLW+s9anaOc5a/2F+f7bLyXnFbl54W573G1f2sIKaJKb7Ns4iCzbE0WKVGmfZ+zsGW56kOrMSMGOdxjeu0K5MkWNKJ4MH7jX0DcUxZG+v/B4mBJC+LiXBZvTixzGWOpoR7W2nPJI+LHUvwE6svRrB0eVz6dJEK7ZmlOsqyp7qPtrTsEG018iJOF4HX8AuaTjlOvalkO533Wanw7XZItiTFGtH2jnhezhSp9+lcxfn+BRWtS1QfU4UVU6dW1RVkcMf87WnqK548pM2Zj/4Uab8cyYDMNA27Z0XUff99J23Rj3tO2D+unRtSFdG9E2IUN/petCmnZEQNuFtO2Yf77dctM0hGFAkiTc85w4jkmSWMZZlnO7pfRd/yFatuS9yZ+5T1cI/gc/Thi/sQG/xQAAAABJRU5ErkJggg==","aspectRatio":1.404494382022472,"src":"/static/0bfed996c015433bba3c4297621b2883/46604/1array.png","srcSet":"/static/0bfed996c015433bba3c4297621b2883/62d80/1array.png 125w,\n/static/0bfed996c015433bba3c4297621b2883/e1953/1array.png 250w,\n/static/0bfed996c015433bba3c4297621b2883/46604/1array.png 500w,\n/static/0bfed996c015433bba3c4297621b2883/d8815/1array.png 750w,\n/static/0bfed996c015433bba3c4297621b2883/91f34/1array.png 942w","sizes":"(max-width: 500px) 100vw, 500px"}}},"categories":["C샵"]},"rawMarkdownBody":"\n\n# 1차원 배열\n\n> **배열** : 배열은 **같은 데이터 타입**의 데이터(Data)를 여러 개 저장할 수 있는 저장공간이다.\n\n- 배열 또한 메모리를 생성할 때 **new 키워드**를 사용한다.\n1. 이를 통해 배열은 **stack**이 아닌 **heap** 영역에 저장된다는 사실을 짐작할 수 있다.\n2. 배열의 이름은 주소값을 저장하는 참조변수다.\n\t즉, **\"heap 영역에 저장된\"** 배열의 주소값이 저장된다.\n\t우리는 이 주소값을 통해 배열에 접근한다.\n\n```csharp\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\n\n\nclass Program\n{\n static void Main(string[] args)\n {\n // 1. 주소를 기억할 변수\n // 2. 메모리 할당\n int[] 아파트 = new int[10];\n // int[0] = ?\n // int[1] = ?\n // ...\n\n for(int i = 0; i<10; i++)\n {\n Console.WriteLine(\"아파트[\"+i+\"] = \" + 아파트[i]);\n }\n }\n}\n```\n\n### 결과\n\n> 아파트[0] = 0\n아파트[1] = 0\n아파트[2] = 0\n아파트[3] = 0\n아파트[4] = 0\n아파트[5] = 0\n아파트[6] = 0\n아파트[7] = 0\n아파트[8] = 0\n아파트[9] = 0\n\n자동으로 배열의 값이 0으로 초기화 된다.\n\n---\n\n# 배열에 값을 넣는 법\n\n\n```csharp\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\n\n\nclass Program\n{\n static void Main(string[] args)\n {\n int[] 아파트 = new int[10] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };\n\n for (int i = 0; i<10; i++)\n {\n Console.WriteLine(\"아파트[\"+i+\"] = \" + 아파트[i]);\n }\n }\n}\n```\n\n### 결과\n\n> 아파트[0] = 0\n아파트[1] = 1\n아파트[2] = 2\n아파트[3] = 3\n아파트[4] = 4\n아파트[5] = 5\n아파트[6] = 6\n아파트[7] = 7\n아파트[8] = 8\n아파트[9] = 9\n\n---\n\n# 배열의 참조\n\n```csharp\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\n\n\nclass Program\n{\n static void Main(string[] args)\n {\n int[] 아파트 = new int[10] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };\n\n int[] 메모1 = 아파트; // 참조값 값복사\n int[] 메모2 = 메모1; // 참조값 값복사\n\n for (int i = 0; i<10; i++)\n {\n Console.WriteLine(\"메모1[\"+i+\"] = \" + 메모1[i]);\n }\n }\n}\n```\n\n### 결과\n\n> 메모1[0] = 0\n메모1[1] = 1\n메모1[2] = 2\n메모1[3] = 3\n메모1[4] = 4\n메모1[5] = 5\n메모1[6] = 6\n메모1[7] = 7\n메모1[8] = 8\n메모1[9] = 9\n\n---\n\n## 메모리를 할당하는 다른 방법\n\n> int[] 아파트 = new int[10] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };\n\n> int[] 아파트 = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; // 11개의 공간만 할당"},{"id":"6948127a-ebf1-5623-a330-e33a6a8e4e73","excerpt":"2차원 배열과 가변배열 앞에서는 10개의 공간을 1차원 배열로 표현해봤는데, 이번에는 10개의 공간을 2차원 배열로 표현해볼 것이다. 출력 i값 : 0 j값 : 0 값 : 0\ni값 : 0 j값 : 1 값 : 1 i값 : 1 j값 : 0 값 : 2\ni값 : 1 j값 : 1 값 : 3 i값 : 2 j값 : 0 값 : 4\ni값 : 2 j값 :…","fields":{"slug":"/2차원 배열과 가변배열/"},"frontmatter":{"title":"2차원 배열과 가변배열","date":"2023.11.12","thumbnail":{"publicURL":"/static/7d35e5d916f06d9aa06d9bcc7a842483/2array.png","childImageSharp":{"fluid":{"base64":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAGCAYAAADDl76dAAAACXBIWXMAAA7DAAAOwwHHb6hkAAABIUlEQVR42m2R3WrCQBBG81p9kr5l70tvelMvFEGsLYYkRpOYmGw25lez2egpbkFoceAwAwuHmf0sHtT1er3PVdWQyyO90rTdmb7XnPuBy4WHZY1aI3NBkiREUUTXnczDOF4oZE6ebRGphzh4pLFDkW2Qmc/Q13SnM67rGhzHwfM8rF5dWTt7ptMZk8kHx0IaodYjUbClSFdU4pNKLE2vxZI6XzGcMrNxGIbEcWy6EAKrCV4IX59Al0b0PreZrwMzt01FlthU0qXMHUMtHarCQ50kSmn2+4ggCNjtdkZsNfs3gvdnRlVy+7nZt8/XJjbCrimRyZIyW1Cmv9TZwmyrugNqGLFtG9/3zbk3qXUP4l8Y5uxhoGmbP7Q3uhY9qIeh/ACoVMXSbz794QAAAABJRU5ErkJggg==","aspectRatio":3.4722222222222223,"src":"/static/7d35e5d916f06d9aa06d9bcc7a842483/46604/2array.png","srcSet":"/static/7d35e5d916f06d9aa06d9bcc7a842483/62d80/2array.png 125w,\n/static/7d35e5d916f06d9aa06d9bcc7a842483/e1953/2array.png 250w,\n/static/7d35e5d916f06d9aa06d9bcc7a842483/46604/2array.png 500w,\n/static/7d35e5d916f06d9aa06d9bcc7a842483/d8815/2array.png 750w,\n/static/7d35e5d916f06d9aa06d9bcc7a842483/a9ac2/2array.png 945w","sizes":"(max-width: 500px) 100vw, 500px"}}},"categories":["C샵"]},"rawMarkdownBody":"\n\n# 2차원 배열과 가변배열\n\n> 앞에서는 10개의 공간을 **1차원 배열**로 표현해봤는데,\n이번에는 10개의 공간을 **2차원 배열**로 표현해볼 것이다.\n\n```csharp\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\n\n\nclass Array\n{\n static void Main(string[] args)\n {\n // 1차원 배열\n int[] 아파트1 = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }; // 1차원 배열로 표현한 경우\n\n // 2차원 배열\n int[ , ] 아파트2 = new int[5, 2];\n\n 아파트2[0, 0] = 0;\n 아파트2[0, 1] = 1;\n\n 아파트2[1, 0] = 2;\n 아파트2[1, 1] = 3;\n\n 아파트2[2, 0] = 4;\n 아파트2[2, 1] = 5;\n\n 아파트2[3, 0] = 6;\n 아파트2[3, 1] = 7;\n\n 아파트2[4, 0] = 8;\n 아파트2[4, 1] = 9;\n\n // 출력\n for (int i = 0; i<5; i++)\n {\n for(int j = 0; j<2; j++)\n {\n Console.WriteLine(\"i값 : \" + i + \" j값 : \"+ j + \" 값 : \"+ 아파트2[i,j]);\n }\n Console.WriteLine();\n }\n }\n}\n```\n\n### 출력\n\ni값 : 0 j값 : 0 값 : 0\ni값 : 0 j값 : 1 값 : 1\n\ni값 : 1 j값 : 0 값 : 2\ni값 : 1 j값 : 1 값 : 3\n\ni값 : 2 j값 : 0 값 : 4\ni값 : 2 j값 : 1 값 : 5\n\ni값 : 3 j값 : 0 값 : 6\ni값 : 3 j값 : 1 값 : 7\n\ni값 : 4 j값 : 0 값 : 8\ni값 : 4 j값 : 1 값 : 9\n\n---\n\n# 가변배열\n\n\n```csharp\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\n\n\nclass Array\n{\n static void Main(string[] args)\n {\n // 1차원 배열\n int[] 아파트1 = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }; // 1차원 배열로 표현한 경우\n\n // 2차원 배열\n int[,] 아파트2 = new int[5, 2];\n\n // 가변 배열\n // int[][] 아파트3 = new int[5][2]; // 에러! => 가변 배열 표현 방식에서는 [5][2]라고 열까지 정해주면 에러\n int[][] 아파트4 = new int[5][]; // 가변 배열 : 열은 자유롭게\n\n // 1번째 행\n 아파트4[0] = new int[2]; // 가변 배열 : 따로 공간을 만들어줘야 한다.\n 아파트4[0][0] = 0;\n 아파트4[0][1] = 1;\n // 아파트4[0][2] = 2; // 에러! => 존재하지 않는 공간\n\n // 2번째 행\n 아파트4[1] = new int[1];\n 아파트4[1][0] = 2;\n\n // 3번째 행\n 아파트4[2] = new int[3];\n 아파트4[2][0] = 3;\n 아파트4[2][1] = 4;\n 아파트4[2][2] = 5;\n\n // 4번째 행\n 아파트4[3] = new int[3];\n 아파트4[3][0] = 6;\n 아파트4[3][1] = 7;\n 아파트4[3][2] = 8;\n\n // 5번째 행\n 아파트4[4] = new int[1];\n 아파트4[4][0] = 9;\n\n\n\n // 출력\n for (int i = 0; i < 아파트4.Length; i++)\n {\n for (int j = 0; j < 아파트4[i].Length; j++)\n {\n Console.WriteLine(\"i : \" + i + \" j : \"+j+\" 값 : \" + 아파트4[i][j]);\n }\n Console.WriteLine();\n }\n }\n}\n```\n\n### 출력\n\ni : 0 j : 0 값 : 0\ni : 0 j : 1 값 : 1\n\ni : 1 j : 0 값 : 2\n\ni : 2 j : 0 값 : 3\ni : 2 j : 1 값 : 4\ni : 2 j : 2 값 : 5\n\ni : 3 j : 0 값 : 6\ni : 3 j : 1 값 : 7\ni : 3 j : 2 값 : 8\n\ni : 4 j : 0 값 : 9\n\n---\n\n\n# 가변배열 + 2차원배열\n\n\n```csharp\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\n\n\nclass Array\n{\n static void Main(string[] args)\n {\n\n // 가변 배열\n // int[][] 아파트3 = new int[5][2]; // 에러! => 가변 배열 표현 방식에서는 [5][2]라고 열까지 정해주면 에러\n // int[][] 아파트4 = new int[5][]; // 가변 배열 : 열은 자유롭게\n int[][,] 가변배열 = new int[3][,];\n\n // 1번째 행\n 가변배열[0] = new int[2, 3] { { 0, 1, 2 },{ 3, 4, 5 } };\n\n\n // 2번째 행\n 가변배열[1] = new int[2, 3];\n 가변배열[1][0, 0] = 0;\n 가변배열[1][0, 1] = 1;\n 가변배열[1][0, 2] = 2;\n\n 가변배열[1][1, 0] = 3;\n 가변배열[1][1, 1] = 4;\n 가변배열[1][1, 2] = 5;\n\n\n\n // 3번째 행\n 가변배열[2] = new int[3, 2] { {0,1},{2,3},{4,5} };\n\n\n\n\n\n // 출력\n for (int a = 0; a < 가변배열.Length; a++)\n {\n for(int b = 0; b<가변배열[a].GetLength(0); b++)\n {\n for(int c = 0; c < 가변배열[a].GetLength(1); c++)\n {\n Console.WriteLine(가변배열[a][b,c]);\n }\n }\n Console.WriteLine();\n }\n }\n}\n```\n\n### 출력\n\n0\n1\n2\n3\n4\n5\n\n0\n1\n2\n3\n4\n5\n\n0\n1\n2\n3\n4\n5\n\n---"}]}}} \ No newline at end of file +{"data":{"allMarkdownRemark":{"nodes":[{"id":"0c364a17-8fc9-5d96-8aaf-70f716c557fc","excerpt":"1차원 배열 배열 : 배열은 같은 데이터 타입의 데이터(Data)를 여러 개 저장할 수 있는 저장공간이다. 배열 또한 메모리를 생성할 때 new 키워드를 사용한다. 이를 통해 배열은 stack이 아닌 heap 영역에 저장된다는 사실을 짐작할 수 있다. 배열의 이름은 주소값을 저장하는 참조변수다.\n즉, “heap 영역에 저장된” 배열의 주소값이 저장된다.\n우리는 이 주소값을 통해 배열에 접근한다. 결과 아파트[0] = 0 아파트[1] =…","fields":{"slug":"/1차원 배열/"},"frontmatter":{"title":"1차원 배열","date":"2023.11.12","thumbnail":{"publicURL":"/static/0bfed996c015433bba3c4297621b2883/1array.png","childImageSharp":{"fluid":{"base64":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAOCAYAAAAvxDzwAAAACXBIWXMAABYlAAAWJQFJUiTwAAACkklEQVR42nWTWbOaWBSF/f//qfspXddc44iIikwikyAgoITpfF2cO6WSyqlaZw8Pq9aeJkIIBLzh0xcI6TxBRIghQAwhcMW25gT+hr736TpPomlchr5kfJPxE8OA6AeZGO0g/YHirpNlGmV5Is8P3O9HGXupytGb86r8w2z7L9Z1Q5xrIFomw88WcStpooyLqvP0E0gf1HlGGG5wnB+kqYbvr/H9FUG05nhZojkL9u4C1Zqh2nOcaM3QV0y6rCI9nUksF2OpkJhnUvNCfnalsttNo6reFJbFifC6QTFeUIzvHC5LtuYrK/0FK1gx9A8mbVZir3a4uyPn7YHgYOJujzzCiDzb43kr0nQv1Y4Iog2aM0Nz5uzPc1R7xtaaYQXLN8LmVpAaLpnjkTs+me1RupEkLAudMFIoCp3rdUscq/jBCtV6xQgVWfKo8uitMP0FYngnjA4WV8MhNs/EhkNqeVRBKAlvt9271cizA56/RLW+s9anaOc5a/2F+f7bLyXnFbl54W573G1f2sIKaJKb7Ns4iCzbE0WKVGmfZ+zsGW56kOrMSMGOdxjeu0K5MkWNKJ4MH7jX0DcUxZG+v/B4mBJC+LiXBZvTixzGWOpoR7W2nPJI+LHUvwE6svRrB0eVz6dJEK7ZmlOsqyp7qPtrTsEG018iJOF4HX8AuaTjlOvalkO533Wanw7XZItiTFGtH2jnhezhSp9+lcxfn+BRWtS1QfU4UVU6dW1RVkcMf87WnqK548pM2Zj/4Uab8cyYDMNA27Z0XUff99J23Rj3tO2D+unRtSFdG9E2IUN/petCmnZEQNuFtO2Yf77dctM0hGFAkiTc85w4jkmSWMZZlnO7pfRd/yFatuS9yZ+5T1cI/gc/Thi/sQG/xQAAAABJRU5ErkJggg==","aspectRatio":1.404494382022472,"src":"/static/0bfed996c015433bba3c4297621b2883/46604/1array.png","srcSet":"/static/0bfed996c015433bba3c4297621b2883/62d80/1array.png 125w,\n/static/0bfed996c015433bba3c4297621b2883/e1953/1array.png 250w,\n/static/0bfed996c015433bba3c4297621b2883/46604/1array.png 500w,\n/static/0bfed996c015433bba3c4297621b2883/d8815/1array.png 750w,\n/static/0bfed996c015433bba3c4297621b2883/91f34/1array.png 942w","sizes":"(max-width: 500px) 100vw, 500px"}}},"categories":["C샵"]},"rawMarkdownBody":"\n\n# 1차원 배열\n\n> **배열** : 배열은 **같은 데이터 타입**의 데이터(Data)를 여러 개 저장할 수 있는 저장공간이다.\n\n- 배열 또한 메모리를 생성할 때 **new 키워드**를 사용한다.\n1. 이를 통해 배열은 **stack**이 아닌 **heap** 영역에 저장된다는 사실을 짐작할 수 있다.\n2. 배열의 이름은 주소값을 저장하는 참조변수다.\n\t즉, **\"heap 영역에 저장된\"** 배열의 주소값이 저장된다.\n\t우리는 이 주소값을 통해 배열에 접근한다.\n\n```csharp\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\n\n\nclass Program\n{\n static void Main(string[] args)\n {\n // 1. 주소를 기억할 변수\n // 2. 메모리 할당\n int[] 아파트 = new int[10];\n // int[0] = ?\n // int[1] = ?\n // ...\n\n for(int i = 0; i<10; i++)\n {\n Console.WriteLine(\"아파트[\"+i+\"] = \" + 아파트[i]);\n }\n }\n}\n```\n\n### 결과\n\n> 아파트[0] = 0\n아파트[1] = 0\n아파트[2] = 0\n아파트[3] = 0\n아파트[4] = 0\n아파트[5] = 0\n아파트[6] = 0\n아파트[7] = 0\n아파트[8] = 0\n아파트[9] = 0\n\n자동으로 배열의 값이 0으로 초기화 된다.\n\n---\n\n# 배열에 값을 넣는 법\n\n\n```csharp\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\n\n\nclass Program\n{\n static void Main(string[] args)\n {\n int[] 아파트 = new int[10] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };\n\n for (int i = 0; i<10; i++)\n {\n Console.WriteLine(\"아파트[\"+i+\"] = \" + 아파트[i]);\n }\n }\n}\n```\n\n### 결과\n\n> 아파트[0] = 0\n아파트[1] = 1\n아파트[2] = 2\n아파트[3] = 3\n아파트[4] = 4\n아파트[5] = 5\n아파트[6] = 6\n아파트[7] = 7\n아파트[8] = 8\n아파트[9] = 9\n\n---\n\n# 배열의 참조\n\n```csharp\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\n\n\nclass Program\n{\n static void Main(string[] args)\n {\n int[] 아파트 = new int[10] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };\n\n int[] 메모1 = 아파트; // 참조값 값복사\n int[] 메모2 = 메모1; // 참조값 값복사\n\n for (int i = 0; i<10; i++)\n {\n Console.WriteLine(\"메모1[\"+i+\"] = \" + 메모1[i]);\n }\n }\n}\n```\n\n### 결과\n\n> 메모1[0] = 0\n메모1[1] = 1\n메모1[2] = 2\n메모1[3] = 3\n메모1[4] = 4\n메모1[5] = 5\n메모1[6] = 6\n메모1[7] = 7\n메모1[8] = 8\n메모1[9] = 9\n\n---\n\n## 메모리를 할당하는 다른 방법\n\n> int[] 아파트 = new int[10] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };\n\n> int[] 아파트 = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; // 11개의 공간만 할당"},{"id":"6948127a-ebf1-5623-a330-e33a6a8e4e73","excerpt":"2차원 배열과 가변배열 앞에서는 10개의 공간을 1차원 배열로 표현해봤는데, 이번에는 10개의 공간을 2차원 배열로 표현해볼 것이다. 출력 i값 : 0 j값 : 0 값 : 0\ni값 : 0 j값 : 1 값 : 1 i값 : 1 j값 : 0 값 : 2\ni값 : 1 j값 : 1 값 : 3 i값 : 2 j값 : 0 값 : 4\ni값 : 2 j값 :…","fields":{"slug":"/2차원 배열과 가변배열/"},"frontmatter":{"title":"2차원 배열과 가변배열","date":"2023.11.12","thumbnail":{"publicURL":"/static/7d35e5d916f06d9aa06d9bcc7a842483/2array.png","childImageSharp":{"fluid":{"base64":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAGCAYAAADDl76dAAAACXBIWXMAAA7DAAAOwwHHb6hkAAABIUlEQVR42m2R3WrCQBBG81p9kr5l70tvelMvFEGsLYYkRpOYmGw25lez2egpbkFoceAwAwuHmf0sHtT1er3PVdWQyyO90rTdmb7XnPuBy4WHZY1aI3NBkiREUUTXnczDOF4oZE6ebRGphzh4pLFDkW2Qmc/Q13SnM67rGhzHwfM8rF5dWTt7ptMZk8kHx0IaodYjUbClSFdU4pNKLE2vxZI6XzGcMrNxGIbEcWy6EAKrCV4IX59Al0b0PreZrwMzt01FlthU0qXMHUMtHarCQ50kSmn2+4ggCNjtdkZsNfs3gvdnRlVy+7nZt8/XJjbCrimRyZIyW1Cmv9TZwmyrugNqGLFtG9/3zbk3qXUP4l8Y5uxhoGmbP7Q3uhY9qIeh/ACoVMXSbz794QAAAABJRU5ErkJggg==","aspectRatio":3.4722222222222223,"src":"/static/7d35e5d916f06d9aa06d9bcc7a842483/46604/2array.png","srcSet":"/static/7d35e5d916f06d9aa06d9bcc7a842483/62d80/2array.png 125w,\n/static/7d35e5d916f06d9aa06d9bcc7a842483/e1953/2array.png 250w,\n/static/7d35e5d916f06d9aa06d9bcc7a842483/46604/2array.png 500w,\n/static/7d35e5d916f06d9aa06d9bcc7a842483/d8815/2array.png 750w,\n/static/7d35e5d916f06d9aa06d9bcc7a842483/a9ac2/2array.png 945w","sizes":"(max-width: 500px) 100vw, 500px"}}},"categories":["C샵"]},"rawMarkdownBody":"\n\n# 2차원 배열과 가변배열\n\n> 앞에서는 10개의 공간을 **1차원 배열**로 표현해봤는데,\n이번에는 10개의 공간을 **2차원 배열**로 표현해볼 것이다.\n\n```csharp\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\n\n\nclass Array\n{\n static void Main(string[] args)\n {\n // 1차원 배열\n int[] 아파트1 = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }; // 1차원 배열로 표현한 경우\n\n // 2차원 배열\n int[ , ] 아파트2 = new int[5, 2];\n\n 아파트2[0, 0] = 0;\n 아파트2[0, 1] = 1;\n\n 아파트2[1, 0] = 2;\n 아파트2[1, 1] = 3;\n\n 아파트2[2, 0] = 4;\n 아파트2[2, 1] = 5;\n\n 아파트2[3, 0] = 6;\n 아파트2[3, 1] = 7;\n\n 아파트2[4, 0] = 8;\n 아파트2[4, 1] = 9;\n\n // 출력\n for (int i = 0; i<5; i++)\n {\n for(int j = 0; j<2; j++)\n {\n Console.WriteLine(\"i값 : \" + i + \" j값 : \"+ j + \" 값 : \"+ 아파트2[i,j]);\n }\n Console.WriteLine();\n }\n }\n}\n```\n\n### 출력\n\ni값 : 0 j값 : 0 값 : 0\ni값 : 0 j값 : 1 값 : 1\n\ni값 : 1 j값 : 0 값 : 2\ni값 : 1 j값 : 1 값 : 3\n\ni값 : 2 j값 : 0 값 : 4\ni값 : 2 j값 : 1 값 : 5\n\ni값 : 3 j값 : 0 값 : 6\ni값 : 3 j값 : 1 값 : 7\n\ni값 : 4 j값 : 0 값 : 8\ni값 : 4 j값 : 1 값 : 9\n\n---\n\n# 가변배열\n\n\n```csharp\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\n\n\nclass Array\n{\n static void Main(string[] args)\n {\n // 1차원 배열\n int[] 아파트1 = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }; // 1차원 배열로 표현한 경우\n\n // 2차원 배열\n int[,] 아파트2 = new int[5, 2];\n\n // 가변 배열\n // int[][] 아파트3 = new int[5][2]; // 에러! => 가변 배열 표현 방식에서는 [5][2]라고 열까지 정해주면 에러\n int[][] 아파트4 = new int[5][]; // 가변 배열 : 열은 자유롭게\n\n // 1번째 행\n 아파트4[0] = new int[2]; // 가변 배열 : 따로 공간을 만들어줘야 한다.\n 아파트4[0][0] = 0;\n 아파트4[0][1] = 1;\n // 아파트4[0][2] = 2; // 에러! => 존재하지 않는 공간\n\n // 2번째 행\n 아파트4[1] = new int[1];\n 아파트4[1][0] = 2;\n\n // 3번째 행\n 아파트4[2] = new int[3];\n 아파트4[2][0] = 3;\n 아파트4[2][1] = 4;\n 아파트4[2][2] = 5;\n\n // 4번째 행\n 아파트4[3] = new int[3];\n 아파트4[3][0] = 6;\n 아파트4[3][1] = 7;\n 아파트4[3][2] = 8;\n\n // 5번째 행\n 아파트4[4] = new int[1];\n 아파트4[4][0] = 9;\n\n\n\n // 출력\n for (int i = 0; i < 아파트4.Length; i++)\n {\n for (int j = 0; j < 아파트4[i].Length; j++)\n {\n Console.WriteLine(\"i : \" + i + \" j : \"+j+\" 값 : \" + 아파트4[i][j]);\n }\n Console.WriteLine();\n }\n }\n}\n```\n\n### 출력\n\ni : 0 j : 0 값 : 0\ni : 0 j : 1 값 : 1\n\ni : 1 j : 0 값 : 2\n\ni : 2 j : 0 값 : 3\ni : 2 j : 1 값 : 4\ni : 2 j : 2 값 : 5\n\ni : 3 j : 0 값 : 6\ni : 3 j : 1 값 : 7\ni : 3 j : 2 값 : 8\n\ni : 4 j : 0 값 : 9\n\n---\n\n\n# 가변배열 + 2차원배열\n\n\n```csharp\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\n\n\nclass Array\n{\n static void Main(string[] args)\n {\n\n // 가변 배열\n // int[][] 아파트3 = new int[5][2]; // 에러! => 가변 배열 표현 방식에서는 [5][2]라고 열까지 정해주면 에러\n // int[][] 아파트4 = new int[5][]; // 가변 배열 : 열은 자유롭게\n int[][,] 가변배열 = new int[3][,];\n\n // 1번째 행\n 가변배열[0] = new int[2, 3] { { 0, 1, 2 },{ 3, 4, 5 } };\n\n\n // 2번째 행\n 가변배열[1] = new int[2, 3];\n 가변배열[1][0, 0] = 0;\n 가변배열[1][0, 1] = 1;\n 가변배열[1][0, 2] = 2;\n\n 가변배열[1][1, 0] = 3;\n 가변배열[1][1, 1] = 4;\n 가변배열[1][1, 2] = 5;\n\n\n\n // 3번째 행\n 가변배열[2] = new int[3, 2] { {0,1},{2,3},{4,5} };\n\n\n\n\n\n // 출력\n for (int a = 0; a < 가변배열.Length; a++)\n {\n for(int b = 0; b<가변배열[a].GetLength(0); b++)\n {\n for(int c = 0; c < 가변배열[a].GetLength(1); c++)\n {\n Console.WriteLine(가변배열[a][b,c]);\n }\n }\n Console.WriteLine();\n }\n }\n}\n```\n\n### 출력\n\n0\n1\n2\n3\n4\n5\n\n0\n1\n2\n3\n4\n5\n\n0\n1\n2\n3\n4\n5\n\n---"},{"id":"a8c6ae56-4ff1-5fab-bd90-96ad42b7bde1","excerpt":"Class와 Struct차이 사용하는 이유! 기존 C 언어에서는 Class 구분이 없이 Struct를 사용해서 기존 C와 호환성을 위해 Struct를 사용한다. - Struct Struct는 상속받을 수 없다. Struct는 값 타입(ValueType)이다. 그래서 new 키워드로 메모리를 할당 할 필요가 없다. 값 타임의 경우 스텍이라는 메모리 영역에 할당 된다. - Class Class는 상속받을 수 있다. Class…","fields":{"slug":"/C샵 Class와 Struct차이/"},"frontmatter":{"title":"C# Class와 Struct차이","date":"2023.10.26","thumbnail":{"publicURL":"/static/8a8d8d39fdfb9e97eb9f96e090c3d0bb/StructvsClass.png","childImageSharp":{"fluid":{"base64":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAQCAIAAACZeshMAAAACXBIWXMAAAsTAAALEwEAmpwYAAAB+ElEQVR42o2STU9TURCG+Ueu/QXAzsSFMca4E8JCouwVEuPHwqSbpgk1sNAWJQQX11RsrS2QQOUWwSZNKgER6MeltKW35/aerztzTO8xtYgFZzdn5pn3zHvOgOoJCeqogRUb9mtQbuJxCwlDhynCsGBBtYW7VXAYKqXQ7x/QGPhZoQI3wnRmTTxYYGNRdi1Epww+vSJGIyyYFkZO3pqhFduHsQfWSbWFd2bp6y9i8at8/lGMRVkgKcbn2eMYf/GJbx5AKC08UH8r6/BAWTZyqRyu2gwJR9uBSh08VHsnwKQiFLWMOg//XgE6g8EFGj+l72oiVvd8rV7s3zCg6hripppszW7HGt29APvDurR9BPky1AhKUHsnaFPMFaHchFwJsB+sp+bLMLHA3mZlICF2LBgOtF+ti9uz9OkSv/mS2vSP1WdgfVQ8xUmDvzHlkxgPfuYjczyY4hPzbHpVjERYqdkH7l677mDLRQKqLhAId1ERobjsfJhLDMPO4E6TV3X3J7c2hhKHgTw6slew/1P5HaLBzaHEQajAD93vD7cy1+Me0zxeCPu+tXfswrjZWD9eujKXuZvM3lt2S87lMPqw+4OsDBqWWfwWNrOPVo2rEV6j/6Gsq6CS999HBsPLU/HocDjzLH2mesH37Cr8TO1+GF20tkvnNTX8CzcBeoDC+yPjAAAAAElFTkSuQmCC","aspectRatio":1.288659793814433,"src":"/static/8a8d8d39fdfb9e97eb9f96e090c3d0bb/46604/StructvsClass.png","srcSet":"/static/8a8d8d39fdfb9e97eb9f96e090c3d0bb/62d80/StructvsClass.png 125w,\n/static/8a8d8d39fdfb9e97eb9f96e090c3d0bb/e1953/StructvsClass.png 250w,\n/static/8a8d8d39fdfb9e97eb9f96e090c3d0bb/46604/StructvsClass.png 500w,\n/static/8a8d8d39fdfb9e97eb9f96e090c3d0bb/d8815/StructvsClass.png 750w,\n/static/8a8d8d39fdfb9e97eb9f96e090c3d0bb/db955/StructvsClass.png 900w","sizes":"(max-width: 500px) 100vw, 500px"}}},"categories":["C샵"]},"rawMarkdownBody":"\n# Class와 Struct차이\n\n### 사용하는 이유!\n\n> _기존 C 언어에서는 Class 구분이 없이 Struct를 사용해서 기존 C와 호환성을 위해 Struct를 사용한다._\n\n## - Struct\n\n1. Struct는 상속받을 수 없다.\n2. Struct는 값 타입(ValueType)이다. 그래서 new 키워드로 메모리를 할당 할 필요가 없다.\n3. 값 타임의 경우 스텍이라는 메모리 영역에 할당 된다.\n\n```csharp\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\n\nnamespace StudyC\n{\n\n struct 할아버지\n {\n public void 할아버지재산()\n {\n Console.WriteLine(\"[1] 할아버지 재산\");\n }\n }\n\n struct 아버지\n {\n public void 아버지재산()\n {\n Console.WriteLine(\"[2] 아버지 재산\");\n }\n }\n\n struct 아들\n {\n public void 아들재산()\n {\n Console.WriteLine(\"[3] 아들 재산\");\n }\n }\n\n internal class Program\n {\n static void Main(string[] args)\n {\n 할아버지 grandFather; //값 타입이라서 new 키워드를 사용하지 않고 사용가능;\n grandFather.할아버지재산();\n\n 아버지 Father; //값 타입이라서 new 키워드를 사용하지 않고 사용가능;\n Father.아버지재산();\n\n 아들 son; //값 타입이라서 new 키워드를 사용하지 않고 사용가능;\n son.아들재산();\n }\n }\n\n}\n```\n\n---\n\n## - Class\n\n1. Class는 상속받을 수 있다.\n2. Class는 참조(Reference Type)이다. 그래서 new 키워드를 사용해 메모리 할당이 필요하다.\n3. 참조 타입은 힙에 할당하는 값의 주소를 가지고 있다.\n\n```csharp\n\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\n\nnamespace StudyC\n{\n\n class 할아버지\n {\n public void 할아버지재산()\n {\n Console.WriteLine(\"[1] 할아버지 재산\");\n }\n }\n\n class 아버지 : 할아버지 //아버지는 할아버지의 재산을 상속받았다.\n {\n public void 아버지재산()\n {\n Console.WriteLine(\"[2] 아버지 재산\");\n }\n }\n\n class 아들 : 아버지 //아들은 아버지의 재산을 상속받았다 => (아버지는 할아버지의 재산을 상속받았기 때문에 아들을 아버지, 할아버지 둘다 재산을 상속받는다)\n {\n public void 아들재산()\n {\n Console.WriteLine(\"[3] 아들 재산\");\n }\n }\n\n internal class Program\n {\n static void Main(string[] args)\n {\n 할아버지 GrandFather = new 할아버지(); //new 키워드를 이용해 메모리에 할당함;\n GrandFather.할아버지재산();\n\n 아버지 Father = new 아버지(); //new 키워드를 이용해 메모리에 할당함;\n Father.아버지재산();\n Father.할아버지재산() ; //할아버지 재산을 상속받아서 할아버지재산에 접근할 수 있다.\n\n 아들 son = new 아들(); //new 키워드를 이용해 메모리에 할당함;\n son.아들재산();\n son.아버지재산(); //아버지 재산을 상속받아서 아버지재산에 접근할 수 있다.\n son.할아버지재산(); //아버지 재산에 할아버지 재산이 포함되어 있기 때문에 할아버지 재산에도 접근이 가능하다.\n }\n }\n\n}\n```\n\n### 상속을 하는 이유\n\n> 만약 게임에서 캐릭터의 공통능력치가 약 5000줄 이라고 하면,\n> 각 캐릭터 클래스 마다 일일히 5000줄을 다 넣어줘야 한다.\n> 하지만 상속을 이용하면 공통능력치라는 클래스를 만들고\n> 각 캐릭터에 상속을 시켜주면 공통능력치를 다 줄수있다.\n\n### class에서 상속을 금지하는 방법\n\n```csharp\n sealed class 할아버지\n {\n public void 할아버지재산()\n {\n Console.WriteLine(\"[1] 할아버지 재산\");\n }\n }\n```\n\nclass 앞에 \"sealed\"를 붙이면 상속이 금지된다. =>\n(아버지가 상속을 받지 못하고, 아들도 할아버지의 재산을 상속받지 못한다)\n\n---\n\n### Struct는 언제 쓰면 좋을까?\n\n구조체가 클래스보다 속도가 빠르다는 장점이 있다.\n\n하지만 스텍 메모리만 사용하자니 스텍 메모리는 제한이 있어 많이 사용할 경우 스텍오버플로우가 발생할 수 있으니 적절히 균형있게 사용하는게 좋다.\n\n## 결론\n\nStruct와 Class의 큰 차이는 상속에 대한 처리 및 그 사용성도 있지만 타입(값, 참조)에 따른 메모리 할당 방식의 차이가 가장 크다.\n\n하지만 아직 언제 사용하면 좋을지 감은 잘 오지 않는다. 이것에 대해서는 조금 더 공부해야겠다.\n"},{"id":"07549a5f-1215-5908-b0ce-13d89002a299","excerpt":"DFS 루트 노드(혹은 다른 임의의 노드)에서 시작해서 다음 분기(branch)로 넘어가기 전에 해당 분기를 완벽하게 탐색하고 넘어가는 방법. 넓게(wide) 탐색하기 전에 깊게(deep) 탐색한다.모든 노드를 방문 하고자 하는 경우에 이 방법을 사용한다.\n 보다 좀 더 간단하다.단순 검색 속도 자체는 BFS…","fields":{"slug":"/DFS와 BFS/"},"frontmatter":{"title":"DFS와 BFS","date":"2023.05.15","thumbnail":{"publicURL":"/static/b8ff6dc0a1e900b190c9d40910300f12/DFS AND BFS.png","childImageSharp":{"fluid":{"base64":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAJCAYAAAAywQxIAAAACXBIWXMAAAsTAAALEwEAmpwYAAABoklEQVR42l3STUuUURgG4GvG0ZIZHW2GGccZp7TJGT+SKVQyTaQPIWoVQRKRCNGuMoQ2gS2MIFpIu2gVLoL6A/2DWgW1alEt+gftW7xx5n2t6IZznodz7vN83OeBRTzGFFxiNkNVgis4QAoZsb2F+8huUEYxoaY6ex9dSAf/K8UhGgs0PlCIECXkFJnLsT9QJBeRO0MbzV3/4HNir9KcZGYBk5insclMlGTO0B3sKF4w3KYVku1hnBEMdgIlVXQvMb3M0XC2hBLF1ThgJnDyScCAY7TG4rv+iOLLWK7Wp33CVieJ3HVqO1SCBFu0nlG4zeg3UofpfovXHHpCfZvqOyq/yM/FOvZ2VkR6lsXTDGH4Giez9J+nfYGePuY+xu2kAneeU2uMrzMR9NuL3028p1zkhDcMrFN5Tn2DrqfUgm7fk+qjv3J3Wl+lskbhB+VHHImovaL0k/zNoMxZ5sLX52ncoTrN1INY5D/oJb0Zf051g+N3aZ+j1GI0R2E/8cXgLJMTj052hYNhkm6Q9V+FX+jZob7C4D3Gdhl5SFPC3Y6r9xtWAUcUds4EfgAAAABJRU5ErkJggg==","aspectRatio":2.272727272727273,"src":"/static/b8ff6dc0a1e900b190c9d40910300f12/46604/DFS%20AND%20BFS.png","srcSet":"/static/b8ff6dc0a1e900b190c9d40910300f12/62d80/DFS%20AND%20BFS.png 125w,\n/static/b8ff6dc0a1e900b190c9d40910300f12/e1953/DFS%20AND%20BFS.png 250w,\n/static/b8ff6dc0a1e900b190c9d40910300f12/46604/DFS%20AND%20BFS.png 500w,\n/static/b8ff6dc0a1e900b190c9d40910300f12/d8815/DFS%20AND%20BFS.png 750w,\n/static/b8ff6dc0a1e900b190c9d40910300f12/31987/DFS%20AND%20BFS.png 1000w,\n/static/b8ff6dc0a1e900b190c9d40910300f12/ed396/DFS%20AND%20BFS.png 2000w","sizes":"(max-width: 500px) 100vw, 500px"}}},"categories":["알고리즘","Python"]},"rawMarkdownBody":"\n# DFS\n\n**루트 노드(혹은 다른 임의의 노드)에서 시작해서 다음 분기(branch)로 넘어가기 전에 해당 분기를 완벽하게 탐색하고 넘어가는 방법.** 넓게(wide) 탐색하기 전에 **깊게(deep)** 탐색한다.**모든 노드를 방문 하고자 하는 경우**에 이 방법을 사용한다.\n`DFS가` `BFS`보다 좀 더 간단하다.단순 검색 속도 자체는 BFS에 비해서 느리다.\n스택이나 재귀 함수를 통해서 구현할 수 있는데 재귀 함수가 구현이 간편하므로 대부분 재귀 함수로 구현한다.\n\n- 구현할 때 주의할 점 : 그래프 탐색의 경우 어떤 노드를 방문했었는지 여부를 반드시 검사 해야 한다.\n - 이를 검사하지 않을 경우 무한루프에 빠질 위험이 있다.\n\n### DFS 알고리즘 구현방식\n\n![](https://velog.velcdn.com/images/minseok0123/post/be4be19c-dce2-4c21-9d57-b499d69f729e/image.png)\n\n1. a 노드(시작 노드)를 방문\n\n- 방문한 노드는 방문했다고 체크한다!\n\n2. a와 인접한 노드들을 차례로 순회\n\n- a와 인접한 노드가 없다면 종료\n\n3. a와 이웃한 노드 b를 방문했다면, a와 인접한 또 다른 노드를 방문하기 전에 b의 이웃 노드들을 전부 방문해야 한다.\n\n- b를 시작 정점으로 DFS를 다시 시작하여 b의 이웃 노드들을 방문한다.\n\n4. b의 분기를 전부 완벽하게 탐색했다면 다시 a에 인접한 정점들 중에서 아직 방문이 안 된 정점을 찾는다.\n\n- 즉, b의 분기를 전부 완벽하게 탐색한 뒤에야 a의 다른 이웃 노드를 방문할 수 있다는 뜻이다.\n- 아직 방문이 안 된 정점이 없으면 종료\n- 있으면 다시 그 정점을 시작 정점으로 DFS를 시작!\n\n```python\nvoid search(Node root) {\n if (root == null) return;\n\n // 1. root 노드 방문\n visit(root);\n root.visited = true; // 1-1. 방문한 노드를 표시\n\n // 2. root 노드와 인접한 정점을 모두 방문\n for each (Node n in root.adjacent) {\n if (n.visited == false) { // 4. 방문하지 않은 정점을 찾는다.\n search(n); // 3. root 노드와 인접한 정점 정점을 시작 정점으로 DFS를 시작\n }\n }\n}\n```\n\n---\n\n```python\ngraph = [[0],\n [2, 3, 8],\n [1, 7],\n [1, 4, 5],\n [3, 5],\n [3, 4],\n [7],\n [2, 6, 8],\n [1, 7]]\n\nvisited = [False] * 9\ndef dfs(v, graph, visited):\n visited[v] = True\n print(v, end=\" \")\n for node in graph[v]:\n if not visited[node]:\n dfs(node, graph, visited)\n\n\ndfs(1, graph, visited)\n```\n\n### DFS의 장점\n\n- 현재 경로상의 노드들만 기억하면 되므로, 저장 공간의 수요가 비교적 적음\n- 목표 노드가 깊은 단계에 있는 경우 해를 빨리 구할 수 있음\n- 구현이 너비 우선 탐색(BFS) 보다 간단함\n\n### DFS의 단점\n\n- 단순 검색 속도는 너비 우선 탐색(BFS) 보다 느림\n- 해가 없는 경우에 빠질 가능성이 있음(사전에 임의의 깊이를 지정한 후 탐색하고, 목표 노드를 발견하지 못할 경우 다음 경로를 탐색하도록 함)\n- 깊이 우선 탐색은 해를 구하면 탐색이 종료되므로, 구한 해가 최단 경로가 된다는 보장이 없음(목표에 이르는 경로가 다수인 경우 구한 해가 최적이 아닐 수 있음)\n\n### DFS의 시간 복잡도\n\n- DFS는 그래프(정점의 수: N, 간선의 수: E)의 모든 간선을 조회한다.\n - 인접 리스트로 표현된 그래프: O(N+E)\n - 인접 행렬로 표현된 그래프: O(N^2)\n\n# BFS\n\n그래프 전체를 탐색하는 방법 중 하나.루트 노드 (혹은 다른 임의의 노드)에서 시작해서 인접한 노드를 먼저 탐색하는 방법.시작 정점으로부터 가까운 정점을 먼저 방문하고 멀리 떨어져 있는 정점을 나중에 방문하는 순회방법.종이에 먹물이 퍼지는 것과 같음.즉, 깊게(deep) 탐색하기 전에 넓게(wide) 탐색한다 !BFS가 진행될수록 탐색 범위는 출발점에서 멀어진다.\n주로 두 노드 사이의 최단 경로 혹은 임의의 경로를 찾고 싶을 때 사용하는 방법이다.(최단 경로, 길찾기)방문한 노드들을 차례대로 저장한 후 꺼낼 수 있는 자료구조인 Queue를 사용한다.\n\n### queue\n\nQueue는 **선입선출(FIFO, Fisrt In First Out)** 자료구조.먼저 들어온 것이 먼저 나간다.고속도로 톨게이트를 생각하자.\n\n- 특징\n - 재귀적으로 동작하지 않는다.\n - 어떤 노드를 방문했었는지 여부를 반드시 검사해야 한다.\n - 검사하지 않을 경우 무한루프에 빠질 위험이 있다.\n- 장점\n - 로직이 단순하다.\n - 최초 발견 루트를 최단 경로라고 보장할 수 있다.\n - 노드의 숫자가 적고, 깊이가 얕은 경우 -> 단순검색속도가 DFS보다 빠르다.\n- 단점\n - 비교적 많은 저장 공간이 필요하다.\n\n### BFS 알고리즘 구현방식\n\n**큐**를 활용해서 구현.\n![](https://velog.velcdn.com/images/minseok0123/post/e38ad96a-db7a-47cf-a9fd-4f82318c78c6/image.png)\n\n1. a 노드(시작 노드)를 방문. (방문한 노드 체크)\n\n- 큐에 방문한 노드를 삽입. `enqueue`\n- 초기 상태의 큐에는 시작 노드만 저장되어 있다.\n - 즉, a노드의 이웃 노드를 모두 방문한 다음에 이웃의 이웃들을 방문한다 !\n\n2. 큐에서 꺼낸 노드와 인접한 노드들을 모두 차례대로 방문.\n\n- 큐에서 꺼낸 노드를 방문\n- 큐에서 꺼낸 노드와 인접한 노드들을 방문\n - 인접한 노드가 없다면 큐의 앞에서 노드를 꺼낸다. `dequeue`\n- 큐에 방문된 노드를 삽입. `enqueue`\n\n3. 큐가 다 소진될 때까지 계속 반복.\n\n```python\nvoid search(Node root) {\n Queue queue = new Queue();\n root.marked = true; // (방문한 노드 체크)\n queue.enqueue(root); // 1-1. 큐의 끝에 추가\n\n // 3. 큐가 소진될 때까지 계속한다.\n while (!queue.isEmpty()) {\n Node r = queue.dequeue(); // 큐의 앞에서 노드 추출\n visit(r); // 2-1. 큐에서 추출한 노드 방문\n // 2-2. 큐에서 꺼낸 노드와 인접한 노드들을 모두 차례로 방문한다.\n foreach (Node n in r.adjacent) {\n if (n.marked == false) {\n n.marked = true; // (방문한 노드 체크)\n queue.enqueue(n); // 2-3. 큐의 끝에 추가\n }\n }\n }\n}\n```\n\n```python\nlet bfs = function (node) {\n // TODO: 노드의 탐색을 treeBFS 탐색 순으로 배열에 담아내자\n let result = [];\n let queue = [node]; // 조회할 노드를 순차적으로 넣는다.\n\n // 조회할 노드가 없을때까지\n while (queue.length) {\n let target = queue.shift();\n result.push(target.value);\n // 자식 노드들을 순차적으로 queue에 쌓아준다.\n for (let node of root.children) {\n queue.push(node);\n }\n\n }\n return result;\n};\nlet Node = function (value) {\n this.value = value;\n this.children = [];\n};\n\n// 위 Node 객체로 구성되는 트리는 매우 단순한 형태의 트리.\n// membership check(중복 확인)를 따로 하지 않는다.\nNode.prototype.addChild = function (child) {\n this.children.push(child);\n return child;\n};\n```\n\n---\n\n```python\nfrom collections import deque\n\nvisited = [False] * 9\ngraph = [[0],\n [2, 3, 8],\n [1, 7],\n [1, 4, 5],\n [3, 5],\n [3, 4],\n [7],\n [2, 6, 8],\n [1, 7]]\n\nq = deque()\n\ndef bfs(start, graph, visited):\n visited[start] = True\n q.append(start)\n\n while q:\n v = q.popleft()\n print(v, end=\" \")\n for i in graph[v]:\n if not visited[i]:\n q.append(i)\n visited[i] = True\n\nbfs(1, graph, visited)\n```\n\n### BFS의 장점\n\n- 노드의 수가 적고 깊이가 얕은 경우 빠르게 동작할 수 있다.\n- 단순 검색 속도가 DFS보다 빠르다.\n- 최단 경로가 존재한다면 어느 한 경로가 무한히 깊어진다고 해도 최단 경로를 반드시 찾을 수 있다.\n\n### BFS의 단점\n\n- 노드의 수가 늘어나면 탐색해야 하는 노드 또한 많아지기 때문에 비현실적이다.\n- 재귀호출의 DFS와는 달리 다음에 탐색할 정점들을 큐에 저장해야 하므로 저장공간이 많이 필요하다.\n\n### BFS의 시간 복잡도\n\n- 인접 리스트로 표현된 그래프 : `O(N+E)`\n- 인접 행렬로 표현된 그래프 : `O(N^2)`\n\n## 마지막 정리\n\n> DFS (깊이 우선 탐색): 트리나 그래프에서 한 노드의 자식들을 우선으로 탐색하는 방식. 더 이상 자식이 없을 때까지 계속해서 깊이를 우선으로 내려가며 탐색한다.\n\n> BFS (너비 우선 탐색): 트리나 그래프에서 한 노드의 형제들을 우선으로 탐색하는 방식. 같은 레벨에 있는 노드들을 먼저 탐색한 후, 다음 레벨로 이동한다.\n\n> DFS는 스택 또는 재귀 함수를 이용하여 구현할 수 있으며, BFS는 큐를 이용하여 구현할 수 있다.\n"},{"id":"8c0f6337-037a-5f8f-96a9-db46ceccf70e","excerpt":"ESP8266이란? ESP8266은 Wi-Fi 모듈로, 저렴하고 매우 강력한 기능을 가지고 있습니다. 이 모듈은 고성능 마이크로컨트롤러와 Wi-Fi 기능을 하나의 칩에 통합한 것입니다. ESP8266 모듈은 TCP/IP 스택을 내장하여 인터넷에 직접 연결할 수 있으며, Wi-Fi로 인터넷 연결을 지원합니다. ESP8266의 특징 1 .저렴하고 소형이며 경제적인 전력 소비 2. Wi-Fi 연결을 지원 3. 안정적인 TCP/IP 스택 내장…","fields":{"slug":"/ESP8266에 관하여/"},"frontmatter":{"title":"ESP8266에 관하여","date":"2023.04.30","thumbnail":{"publicURL":"/static/17e9e1bda5eeb18bdf00ffb03a9c155b/esp8266.png","childImageSharp":{"fluid":{"base64":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAIAAAAC64paAAAACXBIWXMAAAsTAAALEwEAmpwYAAACOUlEQVR42mP4TwFgoK3mv3///v337+/fv6Rp/vf/399/f6FMKPmPKM3/YLZdu3F9waKefYf2ggX//vv3j4BmkDawmmOnj3kE+Fjamnj7mp85Mev//z///v2HOQdD8z8w+P///+u3r7om9jh6usxZ2PHwwc4TR+fNnhI2Y2r2u3cvIcpQNMPd+efPn/1HDgZFR5pY6i9Z2vri2b4nj3a9fXVw356ZQZE+0UmRN29dhKhngLsTYtjDxw/bezuNra0cHcxion1q6tOOH1927/b27Zvbiov8HFztNfW0du5aBtYMthmi7du3rxu3bAwID9Ex1HNyd01Iic7KSXJwsU9KDpjQmx4f7+Xg5haTGLdwyaw/f39C3MoA0Xnj+rnAYD9rB1tjMxNfP7fM7MTo+Gg9I4PCoixvP3cHZ9u45JSC0vy29spHT65Bgg3kZ0jAL1vcGx8fEp8Ua2RqFBDo4+3n6u/n6ebsoKCiZG5pkZ2XXVqe29FZcf3GiT9/f8BjC2rzly8fFiyYfPr00Z4J3bra6n6uDhZmRoZ6Oo4ujiWlBWVlWUuWTHr//gmuFPb38ZNrV68dnz6jJzk5xs/HU0VdLT0ztaw8r6429/jxbX/+focEEhbN//79/fzlzakzeydMbC4qSFZQlLS2syory548uenps5uQMEXTiZZI/n399v7mnfNz5rR2tWd1dddu3770x48P8OggmDH+/fz15f2HJ/cfXnrx8v5fcJTg0IgzbcNyz7+BLQzwaAYAYqX0bt12wf0AAAAASUVORK5CYII=","aspectRatio":1,"src":"/static/17e9e1bda5eeb18bdf00ffb03a9c155b/46604/esp8266.png","srcSet":"/static/17e9e1bda5eeb18bdf00ffb03a9c155b/62d80/esp8266.png 125w,\n/static/17e9e1bda5eeb18bdf00ffb03a9c155b/e1953/esp8266.png 250w,\n/static/17e9e1bda5eeb18bdf00ffb03a9c155b/46604/esp8266.png 500w,\n/static/17e9e1bda5eeb18bdf00ffb03a9c155b/d8815/esp8266.png 750w,\n/static/17e9e1bda5eeb18bdf00ffb03a9c155b/31987/esp8266.png 1000w,\n/static/17e9e1bda5eeb18bdf00ffb03a9c155b/40a76/esp8266.png 1360w","sizes":"(max-width: 500px) 100vw, 500px"}}},"categories":["ESP8266","Arduino","임베디드"]},"rawMarkdownBody":"\n# ESP8266이란?\n\nESP8266은 Wi-Fi 모듈로, 저렴하고 매우 강력한 기능을 가지고 있습니다. 이 모듈은 고성능 마이크로컨트롤러와 Wi-Fi 기능을 하나의 칩에 통합한 것입니다. ESP8266 모듈은 TCP/IP 스택을 내장하여 인터넷에 직접 연결할 수 있으며, Wi-Fi로 인터넷 연결을 지원합니다.\n\n# ESP8266의 특징\n\n1 .저렴하고 소형이며 경제적인 전력 소비 2. Wi-Fi 연결을 지원 3. 안정적인 TCP/IP 스택 내장 4. AT 명령어를 통한 제어 가능 5. 개발 도구 및 라이브러리가 많음 6. Arduino IDE와 함께 사용 가능\n\n## ESP8266을 사용하는 방법\n\nESP8266 모듈은 AT 명령어를 통해 제어할 수 있습니다. AT 명령어는 모듈에서 사용할 수 있는 명령어를 나타냅니다. ESP8266 모듈은 AT 명령어를 사용하여 Wi-Fi 연결, 인터넷 통신 등을 수행할 수 있습니다. 또한 Arduino IDE를 사용하여 ESP8266을 쉽게 제어할 수 있습니다.\n\nESP8266 모듈을 사용하여 IoT 기기를 개발하는 경우, ESP8266 모듈을 사용하여 Wi-Fi 연결 및 데이터 전송 기능을 구현할 수 있습니다. 이를 위해 ESP8266 모듈과 다른 센서 및 장치를 연결하여 데이터를 수집하고 처리하는 코드를 작성해야 합니다.\n\n## ESP8266을 활용한 프로젝트\n\n1. 스마트 홈 제어 시스템\n2. 날씨 예보 및 알림 시스템\n3. 원격 제어 및 모니터링 시스템\n4. IoT 기반 스마트 농업 시스템\n5. Wi-Fi를 활용한 센서 네트워크 구축\n"},{"id":"eef22044-29c8-5dca-9531-08bfcd10c1d5","excerpt":"1. 기획의도 웹을 통해 기숙사 방 문을 원격으로 쉽게 열 수 있습니다. 일과시간 내에 외부 출입자를 감지하고, 해당 정보를 기록할 수 있습니다. 기숙사의 온도와 습도를 실시간으로 모니터링할 수 있습니다. 2. 프로젝트 구성 하드웨어 구성 1. 모션 감지 센서: 사람의 출입을 감지하고, 해당 출입시간을 데이터베이스에 기록합니다. 학교의 일과시간 중에 출입이 감지되면 부저를 울리고 웹으로 경고 메시지를 전송합니다.…","fields":{"slug":"/ESP32로 만든 스마트 기숙사 시스템/"},"frontmatter":{"title":"ESP32로 만든 스마트 기숙사 시스템","date":"2023.06.20","thumbnail":{"publicURL":"/static/28647871d9e4c8d77b2e3dd8245a493a/ESP32.png","childImageSharp":{"fluid":{"base64":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAALCAIAAADwazoUAAAACXBIWXMAAAPoAAAD6AG1e1JrAAACe0lEQVR42hXO3U7aUAAA4GZeKFShp6ftac8p9JSWQis4FUEFwZ9KKSioc5rNoYlz6AU4NXHBJct24eKyqHEPYLJkybJd+ArzYt7IWy37nuBj8EAE9RMYEMLhof6BAY6DCocQL0ZFLITEMMRBqA4CCSHFST+dyuedpIkNNTU5JscJg0KKEBTZYNh1Xc/zstlceAhWXX+x5Na8pWx2quwvl4pz8/Nuvd5o1JfTaScIWKiIyCCMoGIoS5ZlPTz87fV6v3/91DTz8vK6VJi7ufl2fHSyv3+wsOBeXl6VPa97dgZFwHLBEAaAACYQsOPWsO0M39//eXx8/PHjO1Hp+fnnwkyp231/d3fnVaq1Wv3i4svt7e2i74lYJBgOsoFBNsD09SWCYZMa8U8fP1xffT3Yb9GYZTlpMzlMTUvVYhBhmURJlJoJWzN1FEW6EYEQAMAxnBQDGEd1M6pqkoSRhCOa0Vhdq/jVQnF2bt6tr6yWK361tsSLcnYyV3JnV5/VdarplDI8JkBCqmaMjU5kxnOKHKEx6/DtUbvTedXc3t19/Xxj8/j4ZG/vTb5Q7HQOu91uu932i8XM+DiDNMop2DQ0ikHfk35RQJpubm3v7LX2X7zcaja3m82d6fxMq9VaWVkjhDrOcC6Xy2cyoymbUWWiSIRE9KnJaUVRZaRourmwWF5u/N/6taX1jc1y2fP9qudVBEWTaDKVTqftxIgdZygkfEgQJHx6+q7X662vbwIBASXC0yRHdE7CMCJzURjSwsACQNZCxEJJ20nGUnac4XlxkIMkSnUzbliW7ThAjnBYY80JCAUeEd4BAWOAVVguFaKxGEkk9dGRlGWmU8l/t9uJbqkmulUAAAAASUVORK5CYII=","aspectRatio":1.7857142857142858,"src":"/static/28647871d9e4c8d77b2e3dd8245a493a/46604/ESP32.png","srcSet":"/static/28647871d9e4c8d77b2e3dd8245a493a/62d80/ESP32.png 125w,\n/static/28647871d9e4c8d77b2e3dd8245a493a/e1953/ESP32.png 250w,\n/static/28647871d9e4c8d77b2e3dd8245a493a/46604/ESP32.png 500w,\n/static/28647871d9e4c8d77b2e3dd8245a493a/d8815/ESP32.png 750w,\n/static/28647871d9e4c8d77b2e3dd8245a493a/31987/ESP32.png 1000w,\n/static/28647871d9e4c8d77b2e3dd8245a493a/e4d72/ESP32.png 1280w","sizes":"(max-width: 500px) 100vw, 500px"}}},"categories":["아두이노","ESP32","PHP","임베디드"]},"rawMarkdownBody":"\n\n# 1. 기획의도\n- 웹을 통해 기숙사 방 문을 원격으로 쉽게 열 수 있습니다.\n- 일과시간 내에 외부 출입자를 감지하고, 해당 정보를 기록할 수 있습니다.\n- 기숙사의 온도와 습도를 실시간으로 모니터링할 수 있습니다.\n---\n\n# 2. 프로젝트 구성\n## 하드웨어 구성\n### 1. 모션 감지 센서:\n- 사람의 출입을 감지하고, 해당 출입시간을 데이터베이스에 기록합니다.\n- 학교의 일과시간 중에 출입이 감지되면 부저를 울리고 웹으로 경고 메시지를 전송합니다.\n### 2. 온/습도 센서:\n- 기숙사 방 안의 온도와 습도를 실시간으로 측정합니다.\n- 웹에서 실시간으로 이 정보를 확인할 수 있습니다.\n### 3. 서보모터:\n- 웹에서 열림 버튼을 누르면 기숙사 방 내의 서보모터를 제어하여 원격으로 문을 열 수 있습니다.\n### 4. 부저:\n- 정해진 시간 외에 출입이 감지되면 소리를 시끄럽게 울립니다.\n### 5. LCD 디스플레이:\n- 와이파이에 연결되면 IP 주소를 디스플레이에 표시합니다.\n- 온도와 습도 정보를 디스플레이에 표시하여 실시간 모니터링이 가능합니다.\n---\n\n## 소프트웨어 구성\n### DB : MYSQL\n### SERVER : PHP\n### WEB : HTML/CSS/JAVASCRIPT\n---\n### 1. 홈페이지:\n- DB에서 페이지 3개의 최근 값을 가져와 네비게이션에 표시해 줍니다.\n- ajax를 이용해 5초 마다 값을 새로 고침해서 DB에서 실시간으로 값을 불러옵니다.\n![](https://velog.velcdn.com/images/minseok0123/post/ce6d51a7-162e-4eee-8ce9-dc1d4bb7094e/image.png)\n### 2. 기숙사 상태\n- ajax를 이용해 5초 마다 값을 새로 고침해서 DB에서 실시간으로 값을 불러옵니다.\n- 현재 기숙사의 온/습도를 ESP32에서 보낸 값을 DB에 저장하고 불러옵니다.\n![](https://velog.velcdn.com/images/minseok0123/post/fc2c3885-2def-4c92-9d68-2ff59db80bfb/image.png)\n### 3. 출입자 관리\n- 전체 보기를 누르면 입과 출입 여부 상관없이 전체 시간대의 출입 내용을 모두 보여준다.\n- 일과 출입 여부를 누르면 일과시간 출입인 값만 필터링해서 가져온다.\n- 데이터값이 많으면 자동으로 페이지네이션 된다.\n- 최근 업데이트를 만들어서 쉽게 몇 분, 몇 시, 며칠 전에 출입했는지 확인할 수 있다.\n- ajax를 이용해 5초 마다 값을 새로 고침해서 DB에서 실시간으로 값을 불러옵니다.\n![](https://velog.velcdn.com/images/minseok0123/post/0ce3c217-21f9-4d39-a008-a8e482481f81/image.png)\n---\n### 3-1 일과시간 수정\n- 일과시간 수정 버튼을 누르면 일과시간을 수정할 수 있는 모달창이 뜬다.\n- 등교시간/하교시간을 수정하고 저장 버튼을 누르면 ESP32웹 서버에 GET으로 값이 전달된다.\n- DB에도 값이 업데이트 되서 필터링 되는 조건이 변경이 된다.\n![](https://velog.velcdn.com/images/minseok0123/post/21528970-57a0-4aad-9148-8f9087b963f2/image.png)\n\n### 4. 원격제어\n- ESP32 웹 서버에 OPEN이라는 값을 GET으로 넘긴다.\n- 값이 들어오면 서보모터를 작동시킨다.\n![](https://velog.velcdn.com/images/minseok0123/post/e3637ae3-289e-4bb4-91e7-5a8e5b4ab15a/image.png)\n### 5. 로그인\n- 디바이스를 할당하기 위해서 계정이 필요했다.\n- 그래서 로그인/회원가입을 만들기로 했다.\n![](https://velog.velcdn.com/images/minseok0123/post/ac7823d8-5fa9-46df-b8bc-45ff17002a7b/image.png)\n### 6. 회원가입\n- 아이디를 입력하고 중복확인을 누르면 DB에 중복되는 아이디가 있는지 확인하다.\n- 비밀번호를 4자리 이상으로 입력해야 한다. (비밀번호는 해시로 암호화 한다)\n- 회원가입 할 때 ESP32의 웹 서버 IP주소를 입력하면 디바이스가 할당된다.\n- 이메일도 중복되지 않아야지 가입이 된다.\n![](https://velog.velcdn.com/images/minseok0123/post/2d81404b-9864-4b47-a458-219663ecf6ef/image.png)\n\n### 7. 비밀번호 찾기\n- 로그인을 만들면서 만약 비밀번호를 까먹으면 새로 가입해야 하는 번거로움이 생겼다.\n만약 새로 가입하지 않을려면 DB를 직접 수정해야 했다.\n- 그래서 비밀번호 찾기를 만들기로 결정했다.\n- PHP MAILER를 이용해서 이메일로 비밀번호 재설정 코드를 보내줬다.\n![](https://velog.velcdn.com/images/minseok0123/post/50dfb2ec-9d15-4d1b-a8bc-7123679badfb/image.png)\n- 이렇게 재설정 인증 코드가 이메일로 온다.\n![](https://velog.velcdn.com/images/minseok0123/post/dcfe5cc8-3758-45d0-b683-0822becfc991/image.png)\n- 인증 코드를 입력하면가 일치하면 비밀번호가 재설정 된다. \n![](https://velog.velcdn.com/images/minseok0123/post/37c4021a-f665-4385-b74b-e7c97e50f318/image.png)\n---\n# 3. 기대효과\n\n- 1. 웹을 통한 원격 문 열기로 인해 출입의 편의성이 향상됩니다.\n- 2. 외부 출입자의 감지와 출입 기록으로 보안 강화와 출입 관리가 용이해집니다.\n- 3. 기숙사 내 온도와 습도를 실시간으로 모니터링하여 안전하고 편리한 환경을 조성합니다.\n---\n\n# 4. 마무리\n\n> 이 프로젝트는 스마트 기숙사 시스템으로 원격 문 열기와 출입 감지, 온/습도 모니터링 등을 제공합니다. 다양한 센서와 LCD 디스플레이를 활용하여 학생들의 안전과 편의성을 향상시킬 수 있습니다. 이 프로젝트는 현대적인 기술과 창의적인 아이디어를 결합하여 효율적인 기숙사 관리 시스템을 구축하는 데 성공하였습니다.\n\n**GITHUB**\n> https://github.com/MinSeok0123/BSSMSECOM"},{"id":"43ff11f6-1f8d-5d67-affe-7828935f8dd6","excerpt":"Java Collection Framework Java Collection Framework는 자바에서 제공하는 데이터 구조와 관련된 클래스와 인터페이스의 집합이다. 이것은 다양한 자료구조의 구현을 제공하고, 컬렉션 클래스를 사용하여 데이터를 저장, 검색, 정렬, 삭제 등 다양한 연산을 수행할 수 있다. 여기서는 컬렉션 프레임워크의 중요한 두 가지 클래스인 ArrayList와 HashMap에 대해 알아보겠다. List : List…","fields":{"slug":"/Java Collection Framework에 대해 알아보자/"},"frontmatter":{"title":"Java Collection Framework에 대해 알아보자","date":"2023.03.29","thumbnail":{"publicURL":"/static/3aa370900eed0712859f2bc47d4b807e/java.png","childImageSharp":{"fluid":{"base64":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAACXBIWXMAABRNAAAUTQGUyo0vAAAD7UlEQVR42m2Uf0zUZRzHv4AIwnnoFn9gJCBRMwe6RnPSH5G1XLV0s621tdyqlZstwx8zMKSLA+8nUpuAljgCEfQPGJAiv44fJ/cDvBAMRzniOHHCzBYSAncHr/b93p3ceXy3Z8+zZ8/39bzfn+fz+QhrtWaChwmZOGtMxOgshBSaiFC0kVliYJu+BeFEO0llgySU/MZada/nrPe8EATTLMPkIiy/m3fL2rGM2GFhlnpDL9omMwePKziclcXuHxoIKbhOjG4loMYkzTKNiXV6C6sKejhyyQi4we1k6sHfDA0NsXvXm6Q+n8DRXAXJJ68SqfG6CgD6wdbrzAiFFl4r+hUWF5h3Ork9MkJXRxu7dmayZ+/7HNCXk6BqJVxlQu79T/w/AChuxmjNrFKZ2aJrwXb7DuI3t+BkYtzOR1/nkHqkhM2aFiKUXUSozQGwAIVi3ORaE2u0VhLUbfzluCfBXO5FlpaWpPXE/SlSlA0IKqsUM7nXpr/DAIVi3ARFN3n1ZgkwO+/E7XJJa6fLLc0Fta0I2VdYV9QXoMzHEfxTRa6zsjq/k+rOG4BHVV1dHaPj4/i+uw4HidlVROr6kIsg3wgCSpsmorRWPlSWUX6mBPu4g+qaGgwVFTiMRo/SuVlSvqkgSgRKlpdfeBnovUVM4lBFByrdWQy1VfxUfp5HMzMsjo7itI8zP/eY4svNhB2uRcjvIUpr8T6mOVChzBsHESgoe3hdcRGzbZih4WHcbjcLi4vYHQ7+GBmhu3+QZssgxW2DPFPQSvQT6FMKxedfrTKxo+gq75SKgW9E29jLw8l72O9O8O/srGT5wdQkN239jN4aICWnkgitXyz9gR51Rg6VN8HSDB03hhiw3WTJPobr4T8wNsaAoZPLdfXYLCb2q88gHG0k5lS/pM5n+4llSbbOijy/jc/OXaOqrgnb4C1+v/8f06N2+PMOjycnOZaTQ0ZGBgfz9ey70EtEYc9Keei9wQsVvutAOFCFss7ItGuJR/Mupqan+fH0abampbEmWkbWF5/Q1TdAWG4zcr012PJyy+pl/al+wlVmXsh8j48/2Mtbb+xk65aXSNqUTGJiEgnPxfPiK6+SprhERKFRin9Qpcj8klRMh82qK6SmbycsRECeso241O0kb4glbsOzbNoYT+a+rwg70YJc76kYWXCl+CxbkBcY+Pl8BZ3NTZQXq9mjPEfY56XE7Xib1JfTOZl3nC+1ZwnNbSbGZzeolv1kR6uuk55XyaHSWj7V/8LG7CqidX2Efm9gf1EFNReriT9WKTUSX4OQrQSU+RV6uKYP4UQbwrfXiFR7Oku0zkpsYTuxeQ3S3tONQQT+D0iADDNOE6BCAAAAAElFTkSuQmCC","aspectRatio":1,"src":"/static/3aa370900eed0712859f2bc47d4b807e/46604/java.png","srcSet":"/static/3aa370900eed0712859f2bc47d4b807e/62d80/java.png 125w,\n/static/3aa370900eed0712859f2bc47d4b807e/e1953/java.png 250w,\n/static/3aa370900eed0712859f2bc47d4b807e/46604/java.png 500w,\n/static/3aa370900eed0712859f2bc47d4b807e/d8815/java.png 750w,\n/static/3aa370900eed0712859f2bc47d4b807e/31987/java.png 1000w,\n/static/3aa370900eed0712859f2bc47d4b807e/22f13/java.png 2048w","sizes":"(max-width: 500px) 100vw, 500px"}}},"categories":["Java"]},"rawMarkdownBody":"\n# Java Collection Framework\nJava Collection Framework는 자바에서 제공하는 데이터 구조와 관련된 클래스와 인터페이스의 집합이다. 이것은 다양한 자료구조의 구현을 제공하고, 컬렉션 클래스를 사용하여 데이터를 저장, 검색, 정렬, 삭제 등 다양한 연산을 수행할 수 있다. 여기서는 컬렉션 프레임워크의 중요한 두 가지 클래스인 ArrayList와 HashMap에 대해 알아보겠다.\n\n**List** : List 인터페이스는 순서가 있는 컬렉션을 나타내며, 데이터를 중복해서 저장할 수 있습니다. ArrayList, LinkedList, Vector 등이 이에 해당합니다.\n\n**Set** : Set 인터페이스는 순서가 없는 컬렉션을 나타내며, 데이터를 중복해서 저장할 수 없습니다. HashSet, TreeSet 등이 이에 해당합니다.\n\n**Map** : Map 인터페이스는 키-값 쌍으로 이루어진 데이터를 저장합니다. HashMap, TreeMap 등이 이에 해당합니다.\n\n\n# 1. 메모리 구조와 함께 파악하기\n\nArrayList와 HashMap은 모두 컬렉션 클래스이지만, 메모리 구조는 다르다.\n\n## ArrayList\nArrayList는 내부적으로 배열을 사용하여 요소를 저장한다. 요소가 추가될 때마다 배열의 크기가 자동으로 증가하며, 요소가 제거될 때마다 배열의 크기가 자동으로 감소한다. 이러한 메모리 구조는 다음과 같다.\n\n![](https://velog.velcdn.com/images/minseok0123/post/16e13dc3-0295-4be9-8e41-23b9331bc115/image.png)\n\n\n## HashMap\nHashMap은 내부적으로 해시 테이블을 사용하여 요소를 저장한다. 해시 테이블은 해시 함수를 사용하여 각 요소를 키-값 쌍으로 매핑하고, 각 키에 대한 값을 해시 테이블 내의 해당 위치에 저장한다. 이러한 메모리 구조는 다음과 같다.\n\n![](https://velog.velcdn.com/images/minseok0123/post/6d4ce393-be97-4756-b243-257999d1fd85/image.png)\n\n\n# 2. Code (Java)\n\n## ArrayList\n```java\nimport java.util.ArrayList;\n\npublic class ArrayListExample {\n\n public static void main(String[] args) {\n // ArrayList 생성\n ArrayList names = new ArrayList<>();\n\n // 요소 추가\n names.add(\"Mcdonald\");\n names.add(\"BugerKing\");\n names.add(\"LotteRia\");\n\n // 요소 접근\n System.out.println(names.get(0)); // 출력: Mcdonald\n\n // 요소 수정\n names.set(1, \"Shack Shack\");\n\n // 요소 제거\n names.remove(2);\n\n // 전체 출력\n for (String name : names) {\n System.out.println(name);\n }\n }\n\n}\n\n```\n\n\n## HashMapp\n```java\nimport java.util.HashMap;\n\npublic class HashMapExample {\n\n public static void main(String[] args) {\n // HashMap 생성\n HashMap ages = new HashMap<>();\n\n // 요소 추가\n ages.put(\"Mcdonald\", 82);\n ages.put(\"BugerKing\", 69);\n ages.put(\"LotteRia\", 43);\n\n // 요소 접근\n System.out.println(ages.get(\"BugerKing\")); // 출력: 69\n\n // 요소 수정\n ages.replace(\"LotteRia\", 44);\n\n // 요소 제거\n ages.remove(\"Mcdonald\");\n\n // 전체 출력\n for (String name : ages.keySet()) {\n System.out.println(name + \": \" + ages.get(name));\n }\n }\n\n}\n\n```\n"},{"id":"8d3dbfa5-b2c0-5cf5-9607-2eb30a58de2c","excerpt":"프로젝트명 스마트팜 Great Brain 제품 설명 나만의 작은 스마트팜 “하드웨어와 소프트웨어로 완벽한 식물을 기른다.” 토양 수분 센서를 이용해 토양 수분 확인 토양수분 센서를 흙에 꽃아 흙의 수분양을 파악 자동으로 펌프를 이용해서 수분공급 토양수분 센서로 인식된 값이 일정 수준보다 낮을 때 자동으로 수분을 공급 식물 관리를 위한 앱 현재 수분/ 습도/ 광량을 앱에서 모니터링 및 수동 제어 가능 💡 자세한 것은 GitHub…","fields":{"slug":"/ESP8266으로 만든 스마트팜/"},"frontmatter":{"title":"ESP8266으로 만든 스마트팜","date":"2021.10.19","thumbnail":{"publicURL":"/static/ffd913ea2c0d67b777d7e1310e8ad91e/gb.png","childImageSharp":{"fluid":{"base64":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAALCAYAAAB/Ca1DAAAACXBIWXMAABYlAAAWJQFJUiTwAAADNUlEQVR42l3O20+TdwDG8fcP2NUSd7EEGQhYoQXachqnYoFSKC1dy8nSlrZAKSOiMBUzwMF2MY2MMZQgui2bIZnGRV1YyA6yZQcJiclgUyxTGQ4jQhlE3Ryve5ffdxlXy75Xz9WTj1RZ2/jE6vT8rc3c/VeiLk9R6/MVVUq2otKkK1GxaiUY8ConjrYrk5dOK5MXR5WJjwaVifPDyszUVWUxfEsJz8wq4dlZ5db1OeWry+OKpMu1PNVmm9iRqCc6Lon4RC2xqlSid6iISdDQ2NREc52ZT8cGmBg7xoXRbr64cJKZH65xY26O//bg13tIRqtPNtmDpOfZhTajWOizTEKTli+e375TRMXuEk6XTwSqC0X/G10ix/K60Ba/KboPHhR378yJ5fsR8c21c+LjzwYEIJZuLwjJ5joge0K9GM3VQpdhIiu7FHVqGsk6NdoMDQ5fC+7qMvINJTwTU8+zcQ1YjBYeP4xsqTqHXsR2SGLq+iVWFpeRnHVBua65nczyBrHTFCD5pXYyXX501T6SCswUO0NUmAtoa93PvsMncFaU8trLNWxE1ljbWKb+SBSOTonpuU9YXVxB6ul7R67qG6V8Zl10/PQ79qk/KPr8Ebu/XMMzeIUDfecwG3No9noZPvs9fl89vR1uHm2ssylv0vl2JmPjPVvaxfmfkSzOkGzd203Oq4PC2HyE8n39qP1dRFftRV/hx+o5TKmpEKelnOMj49RWOdkfsPFbZGXr5OqNDwgvTG/tX27OI1mrQvLRgbM4vB3C4GjAWNlCkSNAVn45CfEq9OlGDLm5WMts9L51ngprGY17TKyvrRKJRPju2ykmr3zNk80/Wbp9B8ls98nuYC/+YJ/IK6yjqKwJdZKBhDgtu1RaUpPTKDHmEaz30tbeRa3dRNBVwuqD+2w+lZldmubm0o9bwoXwPFJbe7fsDx3CXhMSNd5W6htfwWL3kpKsRq9LweN20docoKbSTjDgptbxr7CExw83+H+rd+8hnTz1rlxqsxMVvV08t20bL8TEo1Kn4Q60UFyQS06GhlKzAVtRFr5qM64KAz2hPZweGWLkzAhDp0YYPjPK+x++x/H+Y/wDsAgaJjEJjE4AAAAASUVORK5CYII=","aspectRatio":1.7605633802816902,"src":"/static/ffd913ea2c0d67b777d7e1310e8ad91e/46604/gb.png","srcSet":"/static/ffd913ea2c0d67b777d7e1310e8ad91e/62d80/gb.png 125w,\n/static/ffd913ea2c0d67b777d7e1310e8ad91e/e1953/gb.png 250w,\n/static/ffd913ea2c0d67b777d7e1310e8ad91e/46604/gb.png 500w,\n/static/ffd913ea2c0d67b777d7e1310e8ad91e/d8815/gb.png 750w,\n/static/ffd913ea2c0d67b777d7e1310e8ad91e/38fcf/gb.png 846w","sizes":"(max-width: 500px) 100vw, 500px"}}},"categories":["임베디드","아두이노","ESP8266"]},"rawMarkdownBody":"\n# 프로젝트명\n\n### 스마트팜 Great Brain\n\n---\n\n### 제품 설명\n\n**나만의 작은 스마트팜**\n\n\"하드웨어와 소프트웨어로 완벽한 식물을 기른다.”\n\n- **토양 수분 센서를 이용해 토양 수분 확인**\n\n토양수분 센서를 흙에 꽃아 흙의 수분양을 파악\n\n- **자동으로 펌프를 이용해서 수분공급**\n\n토양수분 센서로 인식된 값이 일정 수준보다 낮을 때 자동으로 수분을 공급\n\n- **식물 관리를 위한 앱**\n\n현재 수분/ 습도/ 광량을 앱에서 모니터링 및 수동 제어 가능\n\n---\n\n> 💡 자세한 것은 GitHub & YouTube에서 확인할 수 있습니다.\n\n**유튜브**\n\n> [https://youtu.be/KRRq1sTHHP8](https://youtu.be/KRRq1sTHHP8)\n\n**깃허브**\n\n> [https://github.com/MinSeok0123/ESP8266_SmartPlant](https://github.com/MinSeok0123/ESP8266_SmartPlant)\n\n### 나의 역할\n\n- 하드웨어를 맡아 전체적인 하드웨어 개발\n- 소개 영상편집 및 자료정리\n- 123design를 이용해 하드웨어 외형을 설계하고 3D프린터로 제작\n- 하드웨어 사용을 위한 회로를 설계하고 연결\n- 하드웨어에 토양수분센서를 통해 값을 받아 불필요한 값을 처리해서 서버로 전송\n- ESP를 통해 WIFI를 연결하고 Node.Js를 통해 값을 전달\n- 토양수분센서를 통해 값이 낮으면 서버에 값을 넘겨서 펌프작동\n- 습도/온도 값을 ESP8266을 통해 받아 서버에 값을 보내기\n\n---\n\n## 느낀점\n\n- 1년 프로젝트이기에 힘들었던 점도 있고 많은 것을 했기에 좋은 경험인 것 같다.\n- 팀원들과의 갈등과 협업을 해야 하는 일이 생기면서 팀원들과 소통의 중요성을 알게 되었다.\n- 프로젝트를 하기 전에 설문 조사, 자료 조사를 하면서 사용자는 내 생각과는 다른 문제점을 가지고 있을 수도 있다는 것을 알게 되었다.\n- 123design를 통해 3D 모델링을 설계하고 3D 프린터를 통해 제작하는 것에 대해 알게 되었다.\n- 회로를 설계하는 것에 저항 등 많은 것을 생각해야 한다는 것을 알게 되었다.\n- ESP를 통해 WIFI를 연결하고 Node.Js로 서버 통신을 하는 것을 알게 되었다.\n- 1년 동안 준비한 프로젝트인데 상을 타게 되어서 뿌듯했고 더 열심히 할 것이라고 다짐하였다.\n"},{"id":"f1a01283-84b4-5340-baa9-e6e277cd514b","excerpt":"private, public, protected 접근제어 1. public : 다른 클래스에서도 접근 가능\n2. private : 그 맴버를 선언한 클래스 내부에서만 접근 가능\n3. protected : 그 멤버를 선언한 클래스 + 그걸 상속받은 자식 클래스 내부에서만 접근 가능 1. Public 그래서 도둑이 아버지를 납치하기로 했다. 하지만 접근하지 못하였다. 2. Private…","fields":{"slug":"/private, public, protected 접근제어/"},"frontmatter":{"title":"private, public, protected 접근제어","date":"2023.10.30","thumbnail":{"publicURL":"/static/a6c0c8b314db05f584d0d6f3f08d9ecf/public.png","childImageSharp":{"fluid":{"base64":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAKCAYAAAC0VX7mAAAACXBIWXMAABJ0AAASdAHeZh94AAABvUlEQVR42nWSvW/TQBiH/c8yVBUDExsDExMTWxmABYSKkKiKhAJqpYRWoRGhUWqSpk1SR44/GseO7Ts7TuwH+UhRaNqT7qR7P5733nt/GkBRFGrfXpuWzdjbedp6wLIoiLMF/jzjWiYYkylOJPDTjNk8Y57nd4LXoRqrS5gtsEWCFUtGkaQzCajp57RMh6tQYEZC+b10rgqXqyx+A77ZWukoXzCOJUYoOHUD6vaUSs9gr9Vlv93juznhp+Nz4UfYscQRCYu8wBHpxpdoWZ4r2CgU1C2PA8Nlf2DzoWPwstrg7a9z9vo2laGjwN1pqKDlI4ahZBYEXLsurusShiGaWCxVm7o342Dkstszea0bPG9e8PS4zbNGl532kHedEV+GDg17quK9ZI4exKRJgpASIQRpmqLlRYEjU1W5cuXwRjd4XP/NdrXFg89Vtr6d8PDojBenfT5dWjRdHzOWxIslR5PZZsvlUbZdQluTgI+XY56cdBVw6+sPtg+bPDrW2Tm7ojb2GISCaDWMph8pcf03lPXRl1WNWFJ3fHYHFq96Ju/7FjXLoz/7K59sJR2Vd6ds/hmKDVHn9wn+Hg2WwD9j/PLOE3zswgAAAABJRU5ErkJggg==","aspectRatio":1.953125,"src":"/static/a6c0c8b314db05f584d0d6f3f08d9ecf/46604/public.png","srcSet":"/static/a6c0c8b314db05f584d0d6f3f08d9ecf/62d80/public.png 125w,\n/static/a6c0c8b314db05f584d0d6f3f08d9ecf/e1953/public.png 250w,\n/static/a6c0c8b314db05f584d0d6f3f08d9ecf/46604/public.png 500w,\n/static/a6c0c8b314db05f584d0d6f3f08d9ecf/d8815/public.png 750w,\n/static/a6c0c8b314db05f584d0d6f3f08d9ecf/31987/public.png 1000w,\n/static/a6c0c8b314db05f584d0d6f3f08d9ecf/6d589/public.png 1019w","sizes":"(max-width: 500px) 100vw, 500px"}}},"categories":["C샵"]},"rawMarkdownBody":"\n# private, public, protected 접근제어\n\n> **1. public :** 다른 클래스에서도 접근 가능\n> **2. private :** 그 맴버를 선언한 클래스 내부에서만 접근 가능\n> **3. protected :** 그 멤버를 선언한 클래스 + 그걸 상속받은 자식 클래스 내부에서만 접근 가능\n\n## 1. Public\n\n```csharp\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\n\nnamespace @protected\n{\n class 아버지\n {\n public String 잡담 = \"가족 정보\";\n private String 기밀 = \"아주아주 중요한 맛의 비밀\";\n protected String 비법전수 = \"자식에게만 알려주는 가문의 비법들\";\n }\n\n internal class Program\n {\n static void Main(string[] args)\n {\n 아버지 father = new 아버지();\n String 도둑;\n\n 도둑 = father.잡담;\n 도둑 = father.기밀; // 도둑이 애를 써도 가져갈 수 업다.\n 도둑 = father.비법전수; // 도둑이 애를 써도 가져갈 수 업다.\n }\n }\n}\n```\n\n---\n\n그래서 도둑이 아버지를 납치하기로 했다. 하지만 접근하지 못하였다.\n\n## 2. Private\n\n```csharp\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\n\nnamespace @protected\n{\n class 아버지\n {\n public String 잡담 = \"가족 정보\";\n private String 기밀 = \"아주아주 중요한 맛의 비밀\";\n protected String 비법전수 = \"자식에게만 알려주는 가문의 비법들\";\n }\n\n class 도둑\n {\n void 함수()\n {\n 아버지 father = new 아버지();\n\n String a1 = father.잡담;\n String a2 = father.기밀;\n String a3 = father.비법전수;\n }\n }\n\n internal class Program\n {\n static void Main(string[] args)\n {\n 아버지 father = new 아버지();\n String 도둑;\n\n 도둑 = father.잡담;\n 도둑 = father.기밀;\n 도둑 = father.비법전수;\n }\n }\n}\n```\n\n---\n\n그렇게 아들이 탄생하고 나서 아버지가 아들에게 비법을 상속을 했다.\n\n## Protected\n\n```csharp\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\n\nnamespace @protected\n{\n class 아버지\n {\n public String 잡담 = \"가족 정보\";\n private String 기밀 = \"아주아주 중요한 맛의 비밀\";\n protected String 비법전수 = \"자식에게만 알려주는 가문의 비법들\";\n }\n\n class 아들 : 아버지 // 아들이 아버지를 상속받는다.\n {\n void 함수()\n {\n String a1 = 잡담;\n String a2 = 기밀; // 기밀은 전달받지 못한다.\n String a3 = 비법전수; // 비법전수를 상속을 받으면 열람할 수 있기 때문에 열람이 가능하다.\n }\n\n }\n\n class 도둑\n {\n void 함수()\n {\n 아버지 father = new 아버지();\n\n String a1 = father.잡담;\n String a2 = father.기밀;\n String a3 = father.비법전수;\n }\n }\n\n internal class Program\n {\n static void Main(string[] args)\n {\n 아버지 father = new 아버지();\n String 도둑;\n\n 도둑 = father.잡담;\n 도둑 = father.기밀;\n 도둑 = father.비법전수;\n }\n }\n}\n```\n\n---\n\n# 결론\n\n- 아버지는 잡담, 기밀, 비법전수 모두 접근이 가능하고\n- 아들은 잡담, 비법전수 까지 접근이 가능하고\n- 도둑은 잡담 밖에 접근이 불가능하다.\n"},{"id":"fec65332-50ca-555c-8362-439ad33e3857","excerpt":"아래는 PyDub 라이브러리를 사용하여 음성 파일을 자동으로 분리하고 무음을 제거하는 Python 코드입니다. diff-svc 음성파일을 더 쉽게 만들기 위해 제작하였습니다. PyDub을 사용한 음성 파일 분리 및 무음 제거 개요 이번 포스트에서는 Python 라이브러리인 PyDub을 사용하여 음성 파일을 전처리하는 방법을 알아보겠습니다. PyDub은 오디오 파일의 다양한 처리 작업을 수행할 수 있는 라이브러리로, 간단한 API…","fields":{"slug":"/diff-svc 음성파일 (전처리)만드는 법/"},"frontmatter":{"title":"diff-svc 음성파일 (전처리)만드는 법","date":"2023.04.21","thumbnail":{"publicURL":"/static/84fafe303a969987ed1f8a59457a80e6/diffsvc.png","childImageSharp":{"fluid":{"base64":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAFCAYAAABFA8wzAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAvElEQVR42k3QTSsEYBQF4CcZdppSKJIyKRZqIiQaZkYaHymNj6ZZMIuxsFPyA/xx3ZzF3MX7dc4997wH3nCKE3RxjD7usYF5DLCHVxxiIfwjPGLVf83VcpvLEFcY4Qe/WA+psCU0wtnCGGdo4sBMDbP3cBmXF3G5jE2s4Bnn6EToBWvYCXeKdgndRLAb+wXu5muNnM0MLfwbLVwnohr6hc8ifUSssnzCBHd5q1rEQ3KueLbxHmyQnnai2v8DPXgVhKA+pTcAAAAASUVORK5CYII=","aspectRatio":3.676470588235294,"src":"/static/84fafe303a969987ed1f8a59457a80e6/46604/diffsvc.png","srcSet":"/static/84fafe303a969987ed1f8a59457a80e6/62d80/diffsvc.png 125w,\n/static/84fafe303a969987ed1f8a59457a80e6/e1953/diffsvc.png 250w,\n/static/84fafe303a969987ed1f8a59457a80e6/46604/diffsvc.png 500w,\n/static/84fafe303a969987ed1f8a59457a80e6/d8815/diffsvc.png 750w,\n/static/84fafe303a969987ed1f8a59457a80e6/31987/diffsvc.png 1000w,\n/static/84fafe303a969987ed1f8a59457a80e6/a4fbc/diffsvc.png 1213w","sizes":"(max-width: 500px) 100vw, 500px"}}},"categories":["Python","diff-svc"]},"rawMarkdownBody":"\n아래는 PyDub 라이브러리를 사용하여 음성 파일을 자동으로 분리하고 무음을 제거하는 Python 코드입니다. diff-svc 음성파일을 더 쉽게 만들기 위해 제작하였습니다.\n\n# PyDub을 사용한 음성 파일 분리 및 무음 제거\n\n## 개요\n\n이번 포스트에서는 Python 라이브러리인 PyDub을 사용하여 음성 파일을 전처리하는 방법을 알아보겠습니다. PyDub은 오디오 파일의 다양한 처리 작업을 수행할 수 있는 라이브러리로, 간단한 API와 함께 사용하기 쉽습니다. 이번 포스트에서는 PyDub을 사용하여 음성 파일을 무음 구간을 기준으로 분리하고, 분리된 오디오 조각들을 최대 15초까지만 선택하여 WAV 파일로 저장하고, 마지막으로 무음을 제거하는 작업을 수행하는 코드를 살펴보겠습니다.\n\n### 들어가기에 앞서 아래코드는 pydub 라이브러리가 필요합니다.\n\n파이썬 2.7, 3.3 이상의 버전에서 사용 가능합니다. pydub를 설치하려면 pip를 사용합니다.\n\n```python\npip install pydub\n\n```\n\n## 코드\n\n먼저 필요한 라이브러리를 import합니다.\n\n```python\nfrom pydub import AudioSegment\nfrom pydub.silence import split_on_silence\nimport os\nimport subprocess\n\n```\n\n다음으로, 입력 파일 경로와 출력 폴더를 설정합니다.\n\n```python\ninput_file = 'input_file.mp3'\noutput_folder = 'output_folder'\n\n```\n\n이제, 입력 파일을 PyDub으로 로드하고, 샘플링 레이트, 채널, 샘플 넓이를 설정합니다.\n\n```python\nsound = AudioSegment.from_file(input_file)\nsound = sound.set_frame_rate(44100).set_channels(1).set_sample_width(2)\n\n```\n\n이제, PyDub의 split_on_silence() 함수를 사용하여 입력된 음성 파일을 무음을 기준으로 자동으로 분리합니다. 이 함수는 최소 무음 길이, 무음으로 간주되는 dBFS 값, 분리된 각 음성 조각들 간의 추가적인 무음 길이를 인자로 받습니다.\n\n```python\naudio_chunks = split_on_silence(sound,\n min_silence_len=1000, # 최소 무음 길이 (밀리초 단위)\n silence_thresh=-35, # 무음으로 간주되는 dBFS 값\n keep_silence=500 # 분리된 오디오 조각들 간의 추가적인 무음 길이 (밀리초 단위)\n)\n\n```\n\n분리된 음성 조각들 중 최대 15초까지만 선택하여 WAV 파일로 저장합니다.\n이 작업은 각 음성의 길이가 너무 긴 경우 파일 크기가 너무 커지는 것을 방지하기 위한 것입니다.\n\n```python\nfor i, chunk in enumerate(audio_chunks):\n if len(chunk) > 15000:\n chunk = chunk[:15000]\n output_file = os.path.join(output_folder, f'chunk_{i}.wav')\n chunk.export(output_file, format='wav')\n\n```\n\n마지막으로 무음제거 코드입니다.\n\n```python\nfor filename in os.listdir(output_folder):\n if filename.endswith('.wav'):\n input_path = os.path.join(output_folder, filename)\n output_path = os.path.join(output_folder, f'processed_{filename}')\n subprocess.call(['ffmpeg', '-i', input_path, '-af', 'silenceremove=1:0:-50dB', '-y', output_path])\n os.remove(input_path)\n```\n\n# 전체코드\n\n```python\nfrom pydub import AudioSegment\nfrom pydub.silence import split_on_silence\nimport os\nimport subprocess\n\n# 음성파일 경로 설정\ninput_file = 'input_file.mp3'\noutput_folder = 'output_folder'\n\n# 오디오 파일 로드 및 변환\nsound = AudioSegment.from_file(input_file)\nsound = sound.set_frame_rate(44100).set_channels(1).set_sample_width(2)\n\n# 무음 구간을 기준으로 오디오 파일 분리\naudio_chunks = split_on_silence(sound,\n min_silence_len=1000, # 최소 무음 길이 (밀리초 단위)\n silence_thresh=-35, # 무음으로 간주되는 dBFS 값\n keep_silence=500 # 분리된 오디오 조각들 간의 추가적인 무음 길이 (밀리초 단위)\n)\n\n# 출력 파일명 설정 및 출력 폴더 생성\nif not os.path.exists(output_folder):\n os.makedirs(output_folder)\n\n# 분리된 오디오 조각들 중 최대 15초까지만 선택하여 wav 파일로 저장\nfor i, chunk in enumerate(audio_chunks):\n if len(chunk) > 15000:\n chunk = chunk[:15000]\n output_file = os.path.join(output_folder, f'chunk_{i}.wav')\n chunk.export(output_file, format='wav')\n\n# 무음 제거\nfor filename in os.listdir(output_folder):\n if filename.endswith('.wav'):\n input_path = os.path.join(output_folder, filename)\n output_path = os.path.join(output_folder, f'processed_{filename}')\n subprocess.call(['ffmpeg', '-i', input_path, '-af', 'silenceremove=1:0:-50dB', '-y', output_path])\n os.remove(input_path)\n\n```\n"},{"id":"813d4b3a-2e13-5f1c-994c-6428fb76781b","excerpt":"recoil 이란 무엇인가? Recoil은 페이스북에서 만든 React 상태 관리 라이브러리입니다. React는 기본적으로 단방향 데이터 흐름을 따르기 때문에 복잡한 상태 관리를 위해서는 상태를 끌어올리거나 Redux와 같은 상태 관리 라이브러리를 사용해야 했습니다. 하지만 Recoil은 기존 React 컴포넌트 내에서 상태를 관리할 수 있도록 해줍니다. Recoil의 특징 Recoil은 다음과 같은 특징을 가지고 있습니다.…","fields":{"slug":"/recoil을 한번 알아보자/"},"frontmatter":{"title":"recoil을 한번 알아보자","date":"2023.04.21","thumbnail":{"publicURL":"/static/99c93761c35cacaf0b3380b23024878f/recoil.png","childImageSharp":{"fluid":{"base64":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAARCAIAAABSJhvpAAAACXBIWXMAAAsTAAALEwEAmpwYAAABZUlEQVR42tWTSU/CQBiG+auePPojvBj1QESNNihBWSwgCFVkkc0AbkSJYAIJdAUU6EKLC3WmHYNoVQ6acDCaTL5kJu+T95tvMdGiNvEx/QGYEuDkMCPpP6opAX72+IBrHZXkgXElecBI+khqAKysMdJXZ5IH7QFatbmjuauOiiherXfVZl8n+edR5GRIi4CWYJkRK817I0cTJUBORiVaXLXhVtce20PecMbuDRPJC8zh9xyknYH4biTrCh55w5n1bX8sX2o9oFEuQ7jZR4VKa86MrW35au3B4vLmktU9u7Bi2XDPW6zZIokTKXw/HT8pT03PxPLXrzB4gxsKKta7Zszhj+ZIHhDJ83ShGkqcuYLx48uq3XcYiOZ2QgmcSDkDsdMbtqG8Ow//3AU8QJjDE8kW754Q29M4WW8oGi1CRoKMBDgFcrLO9rTbx2GkhPFqQ5IHRm2Nloy9GJpvJgz+7oT9q616AaeylZZ46NGLAAAAAElFTkSuQmCC","aspectRatio":1.179245283018868,"src":"/static/99c93761c35cacaf0b3380b23024878f/46604/recoil.png","srcSet":"/static/99c93761c35cacaf0b3380b23024878f/62d80/recoil.png 125w,\n/static/99c93761c35cacaf0b3380b23024878f/e1953/recoil.png 250w,\n/static/99c93761c35cacaf0b3380b23024878f/46604/recoil.png 500w,\n/static/99c93761c35cacaf0b3380b23024878f/aa591/recoil.png 672w","sizes":"(max-width: 500px) 100vw, 500px"}}},"categories":["Web","Frontend","React"]},"rawMarkdownBody":"\n\n# recoil 이란 무엇인가?\n\nRecoil은 페이스북에서 만든 React 상태 관리 라이브러리입니다. React는 기본적으로 단방향 데이터 흐름을 따르기 때문에 복잡한 상태 관리를 위해서는 상태를 끌어올리거나 Redux와 같은 상태 관리 라이브러리를 사용해야 했습니다. 하지만 Recoil은 기존 React 컴포넌트 내에서 상태를 관리할 수 있도록 해줍니다.\n\n# Recoil의 특징\n\nRecoil은 다음과 같은 특징을 가지고 있습니다.\n\n### 1. 기존 컴포넌트에서 상태 관리\n\nRecoil은 React의 Context API와 유사한 방식으로 상태를 관리합니다. 컴포넌트 내에서 상태를 정의하고 사용할 수 있으며, 다른 컴포넌트에서도 해당 상태를 사용할 수 있습니다. 이렇게 함으로써 Redux와 같은 별도의 상태 관리 라이브러리를 사용하지 않아도 되는 장점이 있습니다.\n\n### 2. 비동기 처리\n\nRecoil은 비동기 상태 관리도 지원합니다. Promise나 async/await를 사용하여 비동기 처리를 할 수 있으며, 상태 변화를 감지하여 자동으로 컴포넌트를 업데이트합니다.\n\n### 3. DevTools 제공\n\nRecoil은 개발자 도구(DevTools)를 제공합니다. DevTools를 사용하면 상태 변화를 쉽게 추적하고 디버깅할 수 있습니다.\n\n## Recoil 사용 예시\n\nRecoil을 사용하면 다음과 같이 컴포넌트 내에서 상태를 정의하고 사용할 수 있습니다.\n\n```js\nimport { atom, useRecoilState } from 'recoil';\n\n// 상태 정의\nconst counterState = atom({\n key: 'counterState',\n default: 0,\n});\n\n// 컴포넌트에서 상태 사용\nfunction Counter() {\n const [count, setCount] = useRecoilState(counterState);\n\n function handleClick() {\n setCount(count + 1);\n }\n\n return (\n
    \n

    Count: {count}

    \n \n
    \n );\n}\n\n```\n\n위 코드에서 atom 함수를 사용하여 상태를 정의하고, useRecoilState 훅을 사용하여 해당 상태를 컴포넌트 내에서 사용합니다. handleClick 함수에서 setCount 함수를 사용하여 상태를 업데이트합니다.\n\n## 결론\n\nRecoil은 React 상태 관리를 쉽게 해주는 라이브러리로, 기존의 Redux와 같은 상태 관리 라이브러리보다 더 직관적이고 간단하게 상태를 관리할 수 있습니다. Recoil을 사용하면 기존의 React 컴포넌트 내에서 상태를 관리할 수 있어서 별도의 상태 관리 라이브러리를 사용하지 않아도 됩니다. 또한 비동기 상태 관리도 지원하며 개발자 도구(DevTools)를 제공하여 상태 변화를 쉽게 추적하고 디버깅할 수 있습니다.\n\n"},{"id":"358fd236-49d7-57ca-97a9-c99d7afdbff0","excerpt":"private에 접근하기 : get set과 property 속성 접근제어란? 메모리를 보유한 객체를 이용해서 맴버에 점(.)을 찍고 접근할 수 있는지 없는지의 제어를 말한다. public과 private의 차이점은 무엇일까? 그래서 private 맴버에 어떻게 접근하는데? Set : public 맴버 함수의 매개변수(Parameter)를 통해서 private 맴버에 값을 할당 Get : public 맴버 함수의 리턴(Return…","fields":{"slug":"/private에 접근하기, get set과 property 속성/"},"frontmatter":{"title":"private에 접근하기, get set과 property 속성","date":"2023.10.27","thumbnail":{"publicURL":"/static/a43609684e8ffd3e2873b997725bd4b0/Property.png","childImageSharp":{"fluid":{"base64":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAMCAIAAADtbgqsAAAACXBIWXMAAAsTAAALEwEAmpwYAAABhElEQVR42o2Rz0rDQBDGfTVN0ybZDWhR8R/iUUXxIKW1Vtum2d1oxSp60aIgHsQq+ApexYMoiODBdnd2Y1NfQrdVES1Y+GCGYX7zDTN9mIHLYKwiBzckZoAZIAbJskyWJWLgBjC0qevDW3JsW+kihU4bZtCHKAxuQPmqlTppFs6iYq1ZOI/8WkQvW16ttVB9zZw25w7DpaNX/yKaPQgTvnCDb7g9fnRbjlTkfDVcPG5N74WTO2pmX2tiR03uquEtObUrxyvyG/uEOyG+rmKrobHGB1buE6W6Q8HyheULm4BNAFGwic5/kl8w5Yn1hl0MbQ+s/CMmDTfQJm77HB23Tt4NZgIRMLMynuOJtTcz24xlHuK5O/ynuxscgONLc0VhbSK1qECE9wZrcadUtwrS9l4QrdvFZ8z08j3CgIgwMlH/8r2Rujazt/EcR6RH50A4XmikuZG+MbNPRlpYeYWI6A2m3Ck1tLxnTEPbU5jxX1/tDiPKHf+l/RXpBgoz4Qbi32t9wO+WEZ3gdhqNDAAAAABJRU5ErkJggg==","aspectRatio":1.7123287671232876,"src":"/static/a43609684e8ffd3e2873b997725bd4b0/46604/Property.png","srcSet":"/static/a43609684e8ffd3e2873b997725bd4b0/62d80/Property.png 125w,\n/static/a43609684e8ffd3e2873b997725bd4b0/e1953/Property.png 250w,\n/static/a43609684e8ffd3e2873b997725bd4b0/46604/Property.png 500w,\n/static/a43609684e8ffd3e2873b997725bd4b0/0178f/Property.png 707w","sizes":"(max-width: 500px) 100vw, 500px"}}},"categories":["C샵"]},"rawMarkdownBody":"\n# private에 접근하기 : get set과 property 속성\n\n## 접근제어란?\n\n> _메모리를 보유한 객체를 이용해서 맴버에 점(.)을 찍고 접근할 수 있는지 없는지의 제어를 말한다._\n\n### public과 private의 차이점은 무엇일까?\n\n```csharp\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\n\n\nclass 여친 //클래스를 생성한다.\n{\n public int 나이 = 25; //퍼블릭으로 나이를 만들고 25라는 값을 넣는다.\n private int 몸무게 = 70; //프라이빗으로 몸무게를 만들고 70이라는 값을 넣는다.\n}\n\n\nnamespace @private\n{\n internal class Program\n {\n static void Main(string[] args)\n {\n 여친 none = new 여친(); //클래스를 인스턴스화 한다. (객체를 메모리에 할당)\n Console.WriteLine(\"나이 : \" + none.나이); //퍼블릭이기 때문에 나이가 접근이 가능해서 출력이 된다.\n Console.WriteLine(\"몸무게 : \" + none.몸무게); //프라이빗이기 때문에 몸무게가 접근이 불가능해 출력이 되지 않는다.\n }\n }\n}\n```\n\n---\n\n### 그래서 private 맴버에 어떻게 접근하는데?\n\n1. Set : public 맴버 함수의 매개변수(Parameter)를 통해서 private 맴버에 값을 할당\n2. Get : public 맴버 함수의 리턴(Return)을 통해서 private 맴버의 값 내보내기\n\n```csharp\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\n\n\nclass 여친\n{\n public int 나이 = 25;\n private int 몸무게 = 70;\n\n //set 함수\n public void SetWeight(int weight)\n {\n 몸무게 = weight;\n }\n\n //get 함수\n public int GetWeight()\n {\n return 몸무게;\n }\n}\n\n\nnamespace @private\n{\n internal class Program\n {\n static void Main(string[] args)\n {\n 여친 none = new 여친();\n\n //set 함수를 통해 몸무게에 값을 할당\n none.SetWeight(100);\n\n //get 함수를 통해 몸무게의 값을 얻어온다\n int a = none.GetWeight();\n\n Console.WriteLine(\"나이 : \" + none.나이);\n Console.WriteLine(\"몸무게 : \" + a);\n }\n }\n}\n```\n\n---\n\n위 코드와 값이 함수를 통해서 값을 접근/수정을 할 수 있다.\n\n**그런데 C#에서 이미 내부적으로 get, set이 구현되어 있다.**\n결국, 우리가 어렵게 함수를 굳이 안 만들어줘도 갖다 쓰면 된다.\n\n### 속성(Property)\n\n- Set과 Get 형식의 함수를 일반화한 형태\n\n```csharp\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\n\n\nclass 여친\n{\n public int 나이 = 25;\n private int 몸무게 = 70;\n\n public int 속성\n {\n get\n {\n return 몸무게;\n }\n\n set\n {\n 몸무게 = value; // set 접근자가 갖는 디폴트 매개변수\n }\n }\n}\n\n\nnamespace @private\n{\n internal class Program\n {\n static void Main(string[] args)\n {\n 여친 none = new 여친();\n\n none.속성 = 100; // 자동으로 set\n int a = none.속성; //자동으로 get\n\n Console.WriteLine(\"나이 : \" + none.나이);\n Console.WriteLine(\"몸무게 : \" + a);\n }\n }\n}\n\n```\n\n# 결론\n\n> 위와 같이 속성을 가져다 쓰면 편하게 구현 할 수 있다.\n"},{"id":"cbe6b2fd-5ac7-5a66-89b3-ae76e0bfc38f","excerpt":"static 접근방식 변수, 함수, 생성자 일반 맴버 변수는 객체를 생성해야지만 메모리가 생성된다. (별도로 메모리를 할당해야 접근가능) 하지만 스태틱 변수는 객체 생성 이전에 접근할 수 있다. (프로그램 시작과 동시에 가장 먼저 할당) 1. Static 변수 : 객체생성 X 특징 : 클래스명으로 바로 접근 (프로그램 시작과 동시에 접근 가능) 2. 일반 맴버 변수 : 객체생성 O…","fields":{"slug":"/static 접근방식 변수, 함수, 생성자/"},"frontmatter":{"title":"static 접근방식 변수, 함수, 생성자","date":"2023.11.02","thumbnail":{"publicURL":"/static/fcc42778bbeefb1759f3eda87c1b8b2a/static.png","childImageSharp":{"fluid":{"base64":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAACXBIWXMAAA7EAAAOxAGVKw4bAAADyklEQVR42q2UbU/bZhSG/Rc7aS2tNKmFhJdQIH6JE8exEzuJY4ckQNVBCqWs7WjD1vGiQdt1SBWUJE4C9OVDaYH+lmuyQ6k2ad/64dY5tp7n0jnnObqFT58+8T0lnJ2fc35+ztf4NT89O7vUWaDg/0XeP3f2H53z5csXBL/t03xzQKfZptVs0Wo26fg+x0dHHB8dhrHrdwjOHfYO6XZ7NFs+B+0eB83OhXzevDlgf38foepWyKUNqtk8jmVjmzkqrsuztadsb22wurJCtejhOS53536mVpnBzLpknftohUXMyiqGs4CSSCKKEkLNrVDM5SmbNiXLJqvr2IbB6sMVXj3f5v78z+TNHE6hiFcqU8g7pNMmmUwRVc+TMlxS6RyynOgDZ8s1HKuAa1hUiy53ZmZ5+vhxWN3e/h6/LC/j5CymXY/qdAWnWELXTRKJBKqqoqUzqGoKSVYQJQlhfm6e+t17PFv7jb3Xe3T8Lpsbmzx69JBOr8vvjQZeoRACS0UHwzDIGgUsM0cmo2FYRdRUGkmSkCQZYXf3NX6nx/v37+n1evyxvkXs9gQJVUUUxXAE8YkJIpEhBgYGiI2Pc+tmlNGRMZKpBLKSCCsL2g1b7na7HB0d8e7tO3rdHhtb2xS9GZKagSSrGOkMA9eucuWHK0SHh/nx6lV+uj6IIiWRZBFRlEOgJIl9YLPVphNCj/nw4QO7r3ZRlRRjo7fRMyaKJDNw7QbjsQlisXEGh4a4cf0mw5EoshyAlLDVoJsQ2G774W61Wm0+npzw985LZr0q0+Uym1sbrDUaWNk8llEga1eozS1hWdNk9CyKojA5OYUYjyOKceIBMAAt1pdwHY/l5QfYOYtC3ubX1cfU6ws8ebLKvfoC47EY0cgwcVHh1tAIQ6NTTMgGg5ExhkcmUFQtBAvrO8+oTFfJmTnyts1CfZ7t7T958eIFXrlMqVTC8zxqtSp37sxRrVSQg5mJEqNjMYYiowxGJ5G0EppVQdjaWWdxsY7rlniwsszznW1M08S280xNTpFMJi9lGiapZBIjk8FzXRRZJjY2xnA0QjQSQU3pCJvr6+HONRpP+OvlS2q1WlhtcFlP65Q9D9uy0ZIpFFkho+vIohRKT6dxikW0VCqUkdER1tYaLC0tsrLygNmZGbSUhuuU+pCUFgKLhUL4AGlNC8cixsVwXgEkoSiMjoyQNTK4JQfh5OTjhS2dhmsTOMrxcX+Fvu3o235+2Hcf3/fpXXwHud9uh7HZbCJ8/vz50hxPT08vPe//8q9++G9v/Cbhuzt2UOH31D8gA4jPehE6bwAAAABJRU5ErkJggg==","aspectRatio":1,"src":"/static/fcc42778bbeefb1759f3eda87c1b8b2a/46604/static.png","srcSet":"/static/fcc42778bbeefb1759f3eda87c1b8b2a/62d80/static.png 125w,\n/static/fcc42778bbeefb1759f3eda87c1b8b2a/e1953/static.png 250w,\n/static/fcc42778bbeefb1759f3eda87c1b8b2a/46604/static.png 500w,\n/static/fcc42778bbeefb1759f3eda87c1b8b2a/7f4a1/static.png 604w","sizes":"(max-width: 500px) 100vw, 500px"}}},"categories":["C샵"]},"rawMarkdownBody":"\n# static 접근방식 변수, 함수, 생성자\n\n**일반 맴버 변수**는 객체를 생성해야지만 메모리가 생성된다. _(별도로 메모리를 할당해야 접근가능)_ \n하지만 **스태틱 변수**는 객체 생성 이전에 접근할 수 있다. _(프로그램 시작과 동시에 가장 먼저 할당)_\n\n## 1. Static 변수 : 객체생성 X\n\n- 특징 : **클래스명**으로 바로 접근 (프로그램 시작과 동시에 접근 가능)\n\n## 2. 일반 맴버 변수 : 객체생성 O\n\n- 특징 : **객체를 생성**해야만 메모리가 생성된다. (별도로 메모리를 할당하는 과정 -> 접근가능)\n\n```csharp\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\n\n\n// 다른 클래스\npublic class Access\n{\n public static int 스태틱변수 = 0;\n public int 일반변수 = 0;\n}\n\nclass main\n{\n public static void Main(string[] args)\n {\n // 스태틱 변수 : 바로 다이렉트로 클래스명으로 접근가능\n Access.스태틱변수 = 1; // 객체생성을 안해도, 프로그램이 시작되면 이미 메모리가 할당되어 있다.\n\n // 이 코드는 쓰레기에요!\n Access.일반변수 = 2; // 별도로 메모리를 할당한 뒤에야 접근 가능\n\n\n // 이 코드는 사용할 수 있어요!\n Access 객체 = new Access(); //메모리를 할당\n 객체.일반변수 = 2;\n\n Console.WriteLine(객체.일반변수); // 일반 변수\n Console.WriteLine(Access.스태틱변수); // 스태틱 변수\n }\n}\n```\n\n---\n\n# static 함수 vs 일반 함수 접근 차이\n\n### [Static 맴버 함수]와 [일반 멤버 함수] 접근 방식의 차이\n\n- 사실 위에서 언급한 변수 접근 방식의 차이와 비슷하다\n\n### [스태틱 맴버 함수에서 주의할 점]\n\n- 스태틱 함수를 이용해서 일반 멤버 필드에 접근 불가\n 이유 : 일반 멤버 필드는 객체 생성 후에 존재하기 때문에 스태틱 함수에서는 접근 불가\n\n---\n\n# 스태틱 생성자\n\n1. 생성자를 **static** 생성자로 선언할 수도 있다.\n 그러나 **static** 생성자에서는 일반 변수는 쓸 수 없다.\n\n- 일반 멤버 변수는 객체를 생성해야만 메모리가 생성된다.\n- 하지만 스태틱 함수는 객체 생성 이전에 접근할 수 있기 때문\n\n```csharp\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\n\n\n// class 선언 : 스태틱 변수, 일반 변수\nclass 테스트\n{\n public static int 스태틱변수 = 0;\n public int 일반변수 = 0;\n\n\n // 1. static 생성자 함수\n static 테스트()\n {\n // 일반변수 = 10;\n 스태틱변수 = 10;\n\n Console.WriteLine(\"[1. static 생성자 최초 실행]\");\n }\n\n // 2. 일반 생성자 함수\n public 테스트()\n {\n 일반변수 = 20;\n 스태틱변수 = 20;\n\n Console.WriteLine(\"[2. 일반 생성자 최초 실행]\");\n }\n}\n\n\nclass main\n{\n static void Main(String[] args)\n {\n // 스태틱 변수를 호출할 경우: static 생성자만 호출됩니다.\n 테스트.스태틱변수 = 100; // 실행시 결과 = [1. static 생성자 최초 실행]가 실행된다.\n\n\n 테스트 test = new 테스트(); // 실행시 결과 = [1. static 생성자 최초 실행], [2. 일반 생성자 최초 실행]가 실행된다.\n }\n}\n\n```\n"},{"id":"2fa9a166-7468-5cad-975d-a2b9398546ea","excerpt":"this와 this를 통한 생성자 호출 this 클래스 내에서 정의된 맴버를 가르킬때 사용한다. 만약 클래스 내에서 생성된 변수와 매개변수의 이름이 똑같다면 코드 this를 통한 생성자 호출 생성자를 여러개 만든 경우, 그 중 조건에 맞는 생성자만 호출이 된다.\n이때, this를 사용해서 여러개의 생성자를 한꺼번에 호출할 수 있다. 1. this를 사용 안해서 매번 따로따로 생성자 함수를 호출하는 경우 2. this를 사용해서 한방에…","fields":{"slug":"/this와 this를 통한 생성자 호출/"},"frontmatter":{"title":"this와 this를 통한 생성자 호출","date":"2023.11.07","thumbnail":{"publicURL":"/static/381b648e7fa624f6687fe70ae9648a54/C#.png","childImageSharp":{"fluid":{"base64":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAALCAYAAAB/Ca1DAAAACXBIWXMAAAsTAAALEwEAmpwYAAACnElEQVR42nXRXUiTYRQH8P87Z94EXphBYDCxaYaTTBczqJuwglJBL9KaRaWp7UvTpe1Dc1SOUlM0dS7dnDPUtYIspRKJ9CJCzbRy7sssEgktIdA5t/eJNwiC6YHD4YGHH+cD+C+6lC50KZ1MUt1qN8W8x178COqucJWbVc663pvucL1kBn0qJ6rSR1ldJQ48u7WALeMfZlI40aOZQ3eFK91wzTGtl80SnchGdKKZxQeyzyLmb61wDNbKeWq0ZQUZEQ83B00MpnTCdN3JMatc/Qa5g1iq58j44NLG1PCy16p1kdb8j8RYZHtff34i2aKaQ6/CTWVF9QZi7fIZZmQ2M6ZZ7dIy2EDzt3W/n/YRQghN00zxD7V/9YiSBsmp8M6XipRRPFIuUIfZLYGg/uonmMqdbIPcAWOZQ9tRaifL3z3e9TUfeVozT1s0bvqN9QtdJx3x8dFI+KgfCIYa23EHAjQEgi2SaRhK7ew2iQ16qU1rlM8yHXmnhpZo1bHXJG2nkRwJ1tGDJpvvRJiOJKFmIBw3cDSkEwLUBYL3Cz+gs9QR1CGzo6N4ttpYbCerv/zen4urJDWygeaHqOlW9QityXnlE+AeEaD2+QE0IgV9EOBuINiUP4ka4Tt2U+4kWgqnaiWH+oni9JM1Zm++DT/5vbL2d5Va6WNPDEqIgH17mIcy7MMVHET15lc+uauZlclpRxbXGJ+AyoloyMmZpCZi1b/dGOwZ3xCn60g0csleXFqIo8Sp0cgBF0IqkarYHBTGmpEW0UwJY7ugKewBf5tKtAfiRQ4uEw4ukt0454lFnjZhW3Eoj5KCi7MUC6HYEsxLtCCD04bsGAMLyMR+qhzHI6t2xLPFjXFBBX3JYUWxXFwAj10AHiVjRSE7APkD5udH9ik+GzMAAAAASUVORK5CYII=","aspectRatio":1.7857142857142858,"src":"/static/381b648e7fa624f6687fe70ae9648a54/46604/C%23.png","srcSet":"/static/381b648e7fa624f6687fe70ae9648a54/62d80/C%23.png 125w,\n/static/381b648e7fa624f6687fe70ae9648a54/e1953/C%23.png 250w,\n/static/381b648e7fa624f6687fe70ae9648a54/46604/C%23.png 500w,\n/static/381b648e7fa624f6687fe70ae9648a54/f3dec/C%23.png 640w","sizes":"(max-width: 500px) 100vw, 500px"}}},"categories":["C샵"]},"rawMarkdownBody":"\n# this와 this를 통한 생성자 호출\n\n## this\n\n**클래스 내**에서 정의된 **맴버**를 가르킬때 사용한다.\n\n> 만약 클래스 내에서 생성된 변수와 매개변수의 이름이 똑같다면\n\n - this를 붙이면 클래스 내에서 생성된 변수를 출력한다.\n - this를 빼면 매개변수를 출력한다.\n\n### 코드\n\n```csharp\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\n\n\npublic class ThisTest\n{\n private string name = \"하이\";\n\n public ThisTest(String name)\n {\n Console.WriteLine(name);\n Console.WriteLine(this.name);\n }\n\n public static void Main(string[] args)\n {\n ThisTest a = new ThisTest(\"바이\");\n }\n}\n\n```\n\n---\n\n# this를 통한 생성자 호출\n\n> 생성자를 여러개 만든 경우, 그 중 조건에 맞는 생성자만 호출이 된다.\n> 이때, this를 사용해서 여러개의 생성자를 한꺼번에 호출할 수 있다.\n\n## 1. this를 사용 안해서 매번 따로따로 생성자 함수를 호출하는 경우\n\n```csharp\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\n\n\npublic class 알바호출\n{\n // 1번 생성자\n public 알바호출()\n {\n Console.WriteLine(\"[1번 생성자 호출]\");\n Console.WriteLine(\"계산대에서 멍때리기\\n\\n\");\n }\n // 2번 생성자\n public 알바호출(string clean)\n {\n Console.WriteLine(\"[2번 생성자: 매개변수가 1개]\");\n Console.WriteLine(\"사장 왈: \" + clean + \"\\n\\n\");\n }\n // 3번 생성자\n public 알바호출(string clean, int calculation)\n {\n Console.WriteLine(\"[3번 생성자: 매개변수가 2개]\");\n Console.WriteLine(\"손님 왈: 계산 좀 해주세요~ \" + calculation);\n Console.WriteLine(\"사장 왈: \" + clean + \"\\n\\n\");\n }\n\n public static void Main(string[] args)\n {\n // 알바호출1\n 알바호출 call1 = new 알바호출();\n // 알바호출2\n 알바호출 call2 = new 알바호출(\"알바야 청소 좀 해라\");\n // 알바호출3\n 알바호출 call3 = new 알바호출(\"알바야 청소 좀 해라\", 5000);\n }\n}\n```\n\n---\n\n## 2. this를 사용해서 한방에 3개의 생성자 함수를 호출하는 경우\n\n하지만 혼자서 여러가지 일을 처리하는 것이 불만이었던 알바는\n분신술을 사용해서 자신을 여러명 소환한 뒤, 한꺼번에 여러가지 일을 처리하기로 했다.\nthis를 사용해서 한꺼번에 여러개의 생성자 함수를 호출\n\n```csharp\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\n\n\npublic class 알바호출\n{\n // 1번 생성자\n public 알바호출() : this (\"분신술 사용\")\n {\n Console.WriteLine(\"[1번 생성자 호출]\");\n Console.WriteLine(\"계산대에서 멍때리기\\n\\n\");\n }\n // 2번 생성자\n public 알바호출(string clean) : this (\"또 분신술 사용\", 5000)\n {\n Console.WriteLine(\"[2번 생성자: 매개변수가 1개]\");\n Console.WriteLine(\"사장 왈: \" + clean + \"\\n\\n\");\n }\n // 3번 생성자\n public 알바호출(string clean, int calculation)\n {\n Console.WriteLine(\"[3번 생성자: 매개변수가 2개]\");\n Console.WriteLine(\"손님 왈: 계산 좀 해주세요~ \" + calculation);\n Console.WriteLine(\"사장 왈: \" + clean + \"\\n\\n\");\n }\n\n public static void Main(string[] args)\n {\n // 알바호출1\n 알바호출 call1 = new 알바호출();\n }\n}\n```\n\n### 상속 배울때 나온 예제\n\n> [할아버지 -> 아빠 -> 아들] 순서로 실행되는 것처럼\n> 생성자도 [3번 -> 2번 -> 1번] 순서로 호출되게 된다.\n\n---\n"},{"id":"6187d309-5a08-50ef-9260-8d164b697bc2","excerpt":"1. 그래프(Graph)란? 그래프는 객체들 간의 연결 관계를 나타내는 수학적 구조로, 노드(Node)와 이를 연결하는 간선(Edge)으로 구성됩니다. 그래프는 현실 세계에서의 다양한 상호 관계를 추상화하여 모델링하는 데 사용됩니다. 서로소 집합 자료구조(Union-Find…","fields":{"slug":"/그래프 알고리즘/"},"frontmatter":{"title":"그래프 알고리즘","date":"2023.08.29","thumbnail":{"publicURL":"/static/033c3fd924832fdd40f362828c9081b3/graph.png","childImageSharp":{"fluid":{"base64":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAICAYAAAD5nd/tAAAACXBIWXMAAAsTAAALEwEAmpwYAAABoklEQVR42lWS6ZKiYAxFef/Hmpppp0exRQVEwKWV9QOaRdnhTEl3OzX5k9RN5VTdJFIQFyz1gLUlKPM7pB/4SYms+WzMkKbt+I5aRJzeDN5Xe5oops9zqoe2NLisDLq8QFIMH/WQopgJ671DnOa8KBeMc4GsC9wwewLFWkc1YzQrRszmDEmM++MV1U7RjJBsZyHFec3LxmWmvOPHOQw9vsj4ubqgWIK+H2AcJ2D7kXL+s+X8a0lpH4CRyg85/l5zXaj09xKJPMM9XemGgeRWcd3sYOwJ04K768EwMOHGccptU0+gLsvI5jJj1zGOA33XTn1prEo0/YxI75+2kow4u7E7+gSu4JM1Pm0XV4fKD6a6iSIaz+PmuJRfmnRwUxa6YGkIfEfQey6KHTJXA+THXm7VP9jpwn51wFwduNlH2jAkeduwW9pYK5vKC5C2VjAd5M2I2JouUZIyV53pUAst5PEF3xFrJpruo+se0atMLwT+TEYzBLrqUNgnpKpu2ZoB9iV+Dt6rlvU+4HhN/rM8NA1isyNW99NuJ62uCRWdRLcm7S8Nh1c7HGoK/QAAAABJRU5ErkJggg==","aspectRatio":2.358490566037736,"src":"/static/033c3fd924832fdd40f362828c9081b3/46604/graph.png","srcSet":"/static/033c3fd924832fdd40f362828c9081b3/62d80/graph.png 125w,\n/static/033c3fd924832fdd40f362828c9081b3/e1953/graph.png 250w,\n/static/033c3fd924832fdd40f362828c9081b3/46604/graph.png 500w,\n/static/033c3fd924832fdd40f362828c9081b3/d8815/graph.png 750w,\n/static/033c3fd924832fdd40f362828c9081b3/ee604/graph.png 800w","sizes":"(max-width: 500px) 100vw, 500px"}}},"categories":["알고리즘","C++"]},"rawMarkdownBody":"\n# 1. 그래프(Graph)란?\n\n그래프는 객체들 간의 연결 관계를 나타내는 수학적 구조로, 노드(Node)와 이를 연결하는 간선(Edge)으로 구성됩니다. 그래프는 현실 세계에서의 다양한 상호 관계를 추상화하여 모델링하는 데 사용됩니다.\n\n### 서로소 집합 자료구조(Union-Find)\n\n> 서로소 집합 자료구조는 원소들을 서로 중복되지 않는 부분 집합으로 나누는 데 사용되며, 주로 그래프 내 사이클을 판별하거나 연결성을 확인하는 데 활용됩니다.\n\n**주요 동작:**\n\n1. 두 원소의 합집합 연산을 확인하여 두 원소가 속한 그룹을 확인합니다.\n2. 각 그룹의 루트 노드를 찾아 부모 자식 관계를 설정합니다.\n\n![](https://velog.velcdn.com/images/minseok0123/post/594f36b4-7f9b-450e-adfc-95106e184f22/image.png)\n\n#### 서로소 집합을 활용한 사이클 판별\n\n서로소 집합은 무방향 그래프 내의 사이클을 판별하는 데 사용됩니다. 동일한 그룹에 속하는 원소들이 추가로 연결되면 사이클이 발생합니다. 이를 활용하여 그래프 내 사이클 여부를 판별할 수 있습니다.\n\n```cpp\n#include \nusing namespace std;\n\nchar vect[200];\n\nchar getBoss(char tar)\n{\n if (vect[tar] == 0) {\n return tar;\n }\n\n char ret = getBoss(vect[tar]);\n return ret;\n}\n\nvoid makeGroup(char t1, char t2)\n{\n char a = getBoss(t1);\n char b = getBoss(t2);\n\n if (a == b) return;\n vect[b] = a;\n}\n\nint main()\n{\n makeGroup('A', 'B');\n makeGroup('B', 'C');\n\n\n if (getBoss('A') == getBoss('C')) {\n cout << \"같은그룹\";\n }\n else\n {\n cout << \"다른그룹\";\n }\n\n \treturn 0;\n}\n```\n\n> 경로 압축\n> char ret = getBoss(vect[tar]);\n\n![](https://velog.velcdn.com/images/minseok0123/post/474ddbcd-5d72-40de-80cb-e94df9c63913/image.png)\n\n# 2. 그래프의 종류\n\n그래프에는 여러 가지 종류가 있으며, 주로 다음과 같이 분류합니다.\n\n**방향성에 따른 분류:**\n방향 그래프(Directed Graph): 각 간선이 특정 방향을 가진 경우.\n무방향 그래프(Undirected Graph): 각 간선이 방향성을 가지지 않은 경우.\n**가중치 유무에 따른 분류:**\n가중치 그래 프(Weighted Graph) : 각간 선에 가중치 값이 할당된 경우.\n비가중치 그라 프(Unweighted Graph) : 모든간 선의 가중치가 동일한(혹은 없음)경우.\n**연결성에 따른 분류:**\n연결된 그라 프(Connected Graph) : 모든노 드사 이에 경로가 존재하는 경우.\n비연결된그라 프(Disconnected Graph) : 일부노 드사 이에 경로가 존재하지 않음\n\n# 3. 신장 트리\n\n신장 트리는 그래프에서 모든 노드를 포함하면서 사이클이 없는 부분 그래프를 의미합니다.\n\n## 최소 신장 트리 (MST, 크루스칼 알고리즘)\n\n최소한의 비용으로 신장트리를 찾고싶을 때 사용한다.\n\n최소 신장 트리는 그래프 내에서 가장 적은 비용으로 모든 노드를 연결하는 트리를 찾는 알고리즘입니다. 크루스칼 알고리즘은 이러한 최소 신장 트리를 구하는 데 사용되며, 그리디 알고리즘에 속합니다. 모든 간선을 가중치 순으로 정렬한 후, 작은 가중치부터 간선을 트리에 추가하는 방식으로 동작합니다. 이때, 서로 연결된 노드의 부모를 찾기 위해 서로소 집합 자료구조를 활용합니다.\n\n![](https://velog.velcdn.com/images/minseok0123/post/5e4a6323-46fe-4071-9b99-4f9a45983669/image.png)\n\n![](https://velog.velcdn.com/images/minseok0123/post/50da0122-10d6-461c-8278-5bfadafc88e1/image.png)\n\n> 최종적으로 신장 트리에 포함되는 간선의 개수가 '노드의 개수 - 1' 과 같다.\n\n# 4. 위상 정렬\n\n위상 정렬은 방향 그래프에서 노드들을 순서대로 나열하는 알고리즘입니다. 이때, 간선은 방향을 따르며 노드 간의 의존 관계를 나타냅니다. 위상 정렬은 선행 관계를 만족하는 작업의 순서를 찾는 데 사용됩니다.\n\n위상 정렬 알고리즘\n\n> 1. 진입차수가 0 인 노드를 큐에 넣는다.\n> 2. 큐가 빌 때까지 다음의 과정을 반복한다.\n> I. 큐에서 원소를 꺼내 해당 노드에서 출발하는 간선을 그래프에서 제거한다.\n> II. 새롭게 진입차수가 0이 된 노드를 큐에 넣는다.\n\n진입차수란 -> 특정한 노드로 **들어오는** 간선의 개수를 의미한다.\n\n![](https://velog.velcdn.com/images/minseok0123/post/c06a7dc4-4e4f-472f-92ce-cf8642f20a93/image.png)\n\n참고로, 위상정렬의 답안은 여러가지가 될 수 있다. (한 단계에서 큐에 새롭게 들어가는 원소가 2개 이상일 경우)\n"},{"id":"62d166c7-a851-5574-a832-186fc08a4534","excerpt":"const상수와 readonly 상수 차이 const 상수 상수 : 변수와는 달리 변경이 불가능하다. (예) 10 = 100; const 키워드 : 상수를 선언하는 키워드이다. [const의 특징] 자동 static (static으로 선언하지 않아도 자동으로 static이 된다) 반드시 초기화 (초기화하지 않으면 에러가 발생한다) 초기화후 변경 불가 (const 상수는 단 한번만 초기화가 가능하다) readonly 상수 const…","fields":{"slug":"/const 상수와 readonly 상수 차이/"},"frontmatter":{"title":"const 상수와 readonly 상수 차이","date":"2023.11.03","thumbnail":{"publicURL":"/static/e5795fbecfe5d7db46c82eb6f188ec41/constVSreadonly.png","childImageSharp":{"fluid":{"base64":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAMCAIAAADtbgqsAAAACXBIWXMAAA7DAAAOwwHHb6hkAAABIElEQVR42qWQTYuDMBCG+///QaF4KbYXS+jVQ+lFqIKHevRUQjUkNUbjR6ImumCgy3a77S77nCYwT2bmXUz/YPHwHoahqirGWNd1fd9zzhljeZ7Xdf1KHsdxmqbb7RYEge/7CKGqqsIwBAAEQRDHsWl4NVlKiRDinJdlmWUZpZQQwhj71eSiKFzXtW17v9/vdrvj8Xg+n33fJ4Tce57IWutxHJVSbdsKIRhjSZJcr1cpZTfzSn5YoWma0+l0uVy+O4+yUiqKIkop5xxCWNc1mimKAmOc5zmEEGOcpqnW+lM2v0opHcexLGu5XK5Wq81ms91u1+v14XDwPI8QYgoAgEnOWF9u7meGGa01pVQIoZQyWWitTf1j2k95c/OfnLv8ATcnrTlW44OWAAAAAElFTkSuQmCC","aspectRatio":1.6025641025641026,"src":"/static/e5795fbecfe5d7db46c82eb6f188ec41/46604/constVSreadonly.png","srcSet":"/static/e5795fbecfe5d7db46c82eb6f188ec41/62d80/constVSreadonly.png 125w,\n/static/e5795fbecfe5d7db46c82eb6f188ec41/e1953/constVSreadonly.png 250w,\n/static/e5795fbecfe5d7db46c82eb6f188ec41/46604/constVSreadonly.png 500w,\n/static/e5795fbecfe5d7db46c82eb6f188ec41/9c108/constVSreadonly.png 585w","sizes":"(max-width: 500px) 100vw, 500px"}}},"categories":["C샵"]},"rawMarkdownBody":"\n# const상수와 readonly 상수 차이\n\n## const 상수\n\n- 상수 : 변수와는 달리 변경이 불가능하다. (예) 10 = 100;\n- const 키워드 : 상수를 선언하는 키워드이다.\n\n### [const의 특징]\n\n1. 자동 static (static으로 선언하지 않아도 자동으로 static이 된다)\n2. 반드시 초기화 (초기화하지 않으면 에러가 발생한다)\n3. 초기화후 변경 불가 (const 상수는 단 한번만 초기화가 가능하다)\n\n```csharp\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\n\n\npublic class ConstSample\n{\n public const double 로켓공식 = 3.14; // 절대로 바뀌면 안되는 정보\n\n public void 함수()\n {\n //로켓공식 = 4.2213; // 정수가 아니라 상수라서 값을 바꿀 수 없다\n }\n}\n\npublic class ConstTest\n{\n public static void Main(string[] args)\n {\n Console.WriteLine(ConstSample.로켓공식);\n\n // 객체 선언해서 메모리 할당X -> static이기 때문에 프로그램이 시작하자마자 바로 메모리가 할당되므로\n // 다이렉트로 접근 가능!\n }\n}\n```\n\n## readonly 상수\n\n### const 와의 차이점 (readonly 상수의 특징)\n\n1. 반드시 초기화할 필요없다.\n2. 생성자에서 딱 한번 값을 할당할 수 있다.\n3. const와는 다르게 자동으로 static이 되지 않는다.\n - static 키워드를 사용하면 스태틱 상수가 된다.\n - static 키워드를 사용하지 않으면 일반 상수가 된다.\n\n```csharp\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\n\n\npublic class 로켓외부요인\n{\n // readonly 스태틱 방식\n // readonly 일반 방식\n\n public readonly static int 날씨맑음_STATIC_READONLY; // readonly로 선언한 상수 : 초기화를 안시켜도 에러가 안남\n public readonly int 날씨흐림_NORMAL_READONLY;\n\n // 1. static 생성자\n static 로켓외부요인()\n {\n // readonly에서는 static은 static끼리 할당 가능함\n 날씨맑음_STATIC_READONLY = 100;\n //날씨흐림_NORMAL_READONLY = 200; // static이 아니라서 할당 불가능\n }\n // 2. 일반 생성자\n 로켓외부요인(int 바람세기)\n {\n //날씨맑음_STATIC_READONLY = 100; // static이라서 할당 불가능\n 날씨흐림_NORMAL_READONLY = 바람세기;\n }\n\n public static void Main(string[] args)\n {\n // 1. static readonly 호출 : static 호출방식 (별도의 메모리 할당과정 없이 바로 사용)\n Console.WriteLine(로켓외부요인.날씨맑음_STATIC_READONLY);\n\n // 2. normal readonly 호출 : 일반 호출방식 (객체를 만들어서 메모리를 할당한 뒤에 사용 가능)\n 로켓외부요인 normal = new 로켓외부요인(1000);\n Console.WriteLine(normal.날씨흐림_NORMAL_READONLY);\n\n }\n}\n```\n"},{"id":"4a7fcc04-390f-5cbc-8d48-4472857c23e8","excerpt":"다이나믹 프로그래밍 다이나믹 프로그래밍은 메모리를 적절히 사용하여 수행 시간 효율성을 비약적으로 향상시키는 방법 이미 계산된 결과(작은 문제)는 별도의 메모리 영역에 저장하여 다시 계산하지 않도록 함 다이나믹 프로그래밍의 구현은 일반적으로 **두 가지 방식(탑다운과 보텀업)**으로 구성 다이나믹 프로그래밍은 동적 계획법이라고도 부름 일반적인 프로그래밍 분야에서의 동적(Dynamic…","fields":{"slug":"/다이나믹 프로그래밍/"},"frontmatter":{"title":"다이나믹 프로그래밍","date":"2023.06.18","thumbnail":{"publicURL":"/static/4fd18ad7d6fe83b8aaf4c639d01365bc/다이나믹 프로그래밍.png","childImageSharp":{"fluid":{"base64":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAMCAIAAADtbgqsAAAACXBIWXMAAAPoAAAD6AG1e1JrAAACnklEQVR42j2N+U/acADF+zdobb/f3i2UlrYUJDgUYXIJHgG8kOI5EM9scsx5RN3mFBcny+bcZvxBt0QTdRrvZP/ewliWfH54Ly/vPWTYq8ZccsguB3WpxSp6FCnpUbIBpU2Xn9pVj011SLJDknVJ0kS5hm6xaqKsiBbkda9jo0f7kNT3cqGDQur8feH7jPdkc+ysMnf2NX+6++J0d/nXu+y3uc7D8tLe4lQlF3sVVQtRbSakIp8H7fvD+lHGflEMXm/nbrbS1+v+u0/jD0fzt8ezt8ez9wezV+We65LvYiNzsT50Mt/+zVDLcWkhZEbKUbYSE/YT5iNDOJ92Peyv3pWzjxvx+53k2bbx+8vo4/bgzUr3w8fiyeJQJcpWIkQ5CJd8RLGVREoeuBYgtqe6tvKD5UKqUkofro0fr6ZOtiYOltOXb43LNeNqLXO6MvlzIfPj5ehxcWxnoi/fQuZbSMRjgkELGW8UikZXPhFYGYmV+gJbI+1v0uFC3Ls64Nt81rkQb11Jd5R6/JPhxud9kW6H6Je5VpFFRAJaKehvcg73xJId4YHOSCIcyKX6x5L9+emJjJHKGKlkRzjZFe2NhBLhkJGINTt0TTApvIAIEKgcaxN4h9lsE3iN52wC65QsDlFwK5LbKugmwS6wKkerHKtyrMIwMstZaJoBADFRVfMXRiQpC01baNpMkFaaVhnCp3AMAArDSAxtov6lJoriIcUBEgH1DRQOYANKA4KDkMYwniB4oqr9KmPjSIhiNAZoDDA4QWB4VQOiWkExxMyyXqfW5rJ7G/Ww2zngc7okAdQ34HVoRCUZAGrrDF4t1BBImocUTxCIXbb0+p4kQ+6U35XtbE0Hm2LNGgdxvA518pBEUQZgHIQQxf5Tu6Vw8AcQ/74lfblC+QAAAABJRU5ErkJggg==","aspectRatio":1.6025641025641026,"src":"/static/4fd18ad7d6fe83b8aaf4c639d01365bc/46604/%EB%8B%A4%EC%9D%B4%EB%82%98%EB%AF%B9%20%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D.png","srcSet":"/static/4fd18ad7d6fe83b8aaf4c639d01365bc/62d80/%EB%8B%A4%EC%9D%B4%EB%82%98%EB%AF%B9%20%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D.png 125w,\n/static/4fd18ad7d6fe83b8aaf4c639d01365bc/e1953/%EB%8B%A4%EC%9D%B4%EB%82%98%EB%AF%B9%20%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D.png 250w,\n/static/4fd18ad7d6fe83b8aaf4c639d01365bc/46604/%EB%8B%A4%EC%9D%B4%EB%82%98%EB%AF%B9%20%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D.png 500w,\n/static/4fd18ad7d6fe83b8aaf4c639d01365bc/d8815/%EB%8B%A4%EC%9D%B4%EB%82%98%EB%AF%B9%20%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D.png 750w,\n/static/4fd18ad7d6fe83b8aaf4c639d01365bc/31987/%EB%8B%A4%EC%9D%B4%EB%82%98%EB%AF%B9%20%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D.png 1000w,\n/static/4fd18ad7d6fe83b8aaf4c639d01365bc/e4d72/%EB%8B%A4%EC%9D%B4%EB%82%98%EB%AF%B9%20%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D.png 1280w","sizes":"(max-width: 500px) 100vw, 500px"}}},"categories":["알고리즘","Python"]},"rawMarkdownBody":"\n# 다이나믹 프로그래밍\n\n- 다이나믹 프로그래밍은 **메모리를 적절히 사용하여 수행 시간 효율성을 비약적으로 향상시키는 방법**\n- **이미 계산된 결과(작은 문제)는 별도의 메모리 영역에 저장**하여 다시 계산하지 않도록 함\n- 다이나믹 프로그래밍의 구현은 일반적으로 **두 가지 방식(탑다운과 보텀업)**으로 구성\n- 다이나믹 프로그래밍은 **동적 계획법**이라고도 부름\n- 일반적인 프로그래밍 분야에서의 동적(Dynamic)이란 어떤 의미를 가질까?\n - 자료구조에서 **동적 할당(Dynamic Allocation)**은 **'프로그램이 실행되는 도중에 실행에 필요한 메모리를 할당하는 기법'**을 의미\n - 반면에 다이나믹 프로그래밍에서 '다이나믹'은 별다른 의미 없이 사용된 단어\n- 다이나믹 프로그래밍은 문제가 다음의 조건을 만족할 떄 사용 가능\n - **최적 부분 구조 (Optimal Substructure)**\n - 큰 문제를 작은 문제로 나눌 수 있으며 작은 문제의 답을 모아서 큰 문제를 해결할 수 있음\n - **중복되는 부분 문제 (Overlapping Subproblem)**\n - 동일한 작은 문제를 반복적으로 해결해야 함\n\n### 피보나치 수열\n\n- **피보나치 수열**은 다음과 같은 형태의 수열이며, 다이나믹 프로그래밍으로 효과적으로 계산 가능\n - 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, ...\n- **점화식**이란 **인접한 항들 사이의 관계식**을 의미\n- 피보나치 수열을 점화식으로 표현하면 다음과 같음\n - `a(n) = a(n-1) + a(n-2)`\n - `a(1) = 1, a(2) = 1`\n- 피보나치 수열이 계산되는 과정은 다음과 같이 표현할 수 있음 - 프로그래밍에서는 이러한 수열을 **배열이나 리스트를 이용**해 표현\n ![](https://velog.velcdn.com/images/minseok0123/post/799c3a2e-fcea-4414-9c29-040c9c308a24/image.png)\n- 피보나치 수열이 계산되는 과정은 다음과 같이 표현할 수 있음\n - n번째 피보나치 수를 f(n)라고 할 때 4번째 피보나치 수 f(4)를 구하는 과정은 다음과 같음\n\n![](https://velog.velcdn.com/images/minseok0123/post/565e15b7-596c-45ca-b7a6-5d39691794c8/image.png)\n\n```python\n# 피보나치 함수(Fibonacci Function)을 재귀함수로 구현\ndef fibo(x):\n if x == 1 or x == 2:\n return 1\n return fibo(x - 1) + fibo(x - 2)\n\nprint(fibo(4))\n\n>>> 3\n```\n\n### 피보나치 수열의 시간 복잡도 분석\n\n- 단순 재귀 함수로 피보나치 수열을 해결하면 지수 시간 복잡도를 가지게 됨\n- 다음과 같이 f(2)가 여러번 호출되는 것을 확인할 수 있음 (중복되는 부분 문제)\n\n![](https://velog.velcdn.com/images/minseok0123/post/d0be3388-35c6-4aa8-ae6a-e13509a3455b/image.png)\n\n- 피보나치 수열의 시간 복잡도는 다음과 같음\n - 세타 표기법: 𝜃(1.618⋯ᴺ)\n - 빅오 표기법: O(2ᴺ)\n- 빅오 표기법을 기준으로 f(30)을 계산하기 위해 약 10억가량의 연산을 수행해야 함\n\n### 피보나치 수열의 효율적인 해법: 다이나믹 프로그래밍\n\n- **다이나믹 프로그래밍의 사용 조건**을 만족하는지 확인\n - **최적 부분 구조**: 큰 문제를 작은 문제로 나눌 수 있음\n - **중복되는 부분 문제**: 동일한 작은 문제를 반복적으로 해결\n- 피보나치 수열은 다이나믹 프로그래밍의 사용 조건을 만족\n\n### 메모이제이션 (Memoization)\n\n- **메모이제이션**은 다이나믹 프로그래밍을 구현하는 방법 중 하나 (**탑다운 방식=하향식**)\n- **한 번 계산한 결과를 메모리 공간에 메모하는 기법**\n - 같은 문제를 다시 호출하면 메모했던 결과를 그대로 가져옴\n - 값을 기록해 놓는다는 점에서 **캐싱(Caching)**이라고도 함\n\n### 탑다운 vs 보텀업\n\n- **탑다운(메모이제이션) 방식**은 **하향식**이라고도 하며 **보텀업 방식**은 **상향식**이라고도 함\n- **다이나믹 프로그래밍의 전형적인 형태는 보텀업 방식**\n - **결과 저장용 리스트는 DP 테이블**이라고 부름\n- 엄밀히 말하면 메모이제이션은 이전에 계산된 결과를 일시적으로 기록해 놓는 넓은 개념을 의미\n - 따라서 메모이제이션은 다이나믹 프로그래밍에 국한된 개념은 아님\n - 한 번 계산된 결과를 담아 놓기만 하고 다이나믹 프로그래밍을 위해 활용하지 않을 수도 있음\n\n---\n\n```python\n# 피보나치 수열: 탑다운 다이나믹 프로그래밍 소스코드\n\n# 한 번 계산된 결과를 메모이제이션(Memoization)하기 위한 리스트 초기화\nd = [0] * 100\n\n# 피보나치 함수(Fibonacci Function)를 재귀함수로 구현(탑다운 다이나믹 프로그래밍)\ndef fibo(x):\n # 종료 조건(1 혹은 2일 때 1을 반환)\n if x == 1 or x == 2:\n return 1\n # 이미 계산한 적 있는 문제라면 그대로 반환\n if d[x] != 0:\n return d[x]\n # 아직 계산하지 않은 문제라면 점화식에 따라서 피보나치 결과 반환\n d[x] = fibo(x - 1) + fibo(x - 2)\n return d[x]\n\nprint(fibo(99))\n\n>>> 218922995834555169026\n```\n\n---\n\n```python\n# 피보나치 수열: 보텀업 다이나믹 프로그래밍 소스코드\n\n# 앞서 계산된 결과를 저장하기 위한 DP 테이블 초기화\nd = [0] * 100\n\n# 첫번째 피보나치 수와 두번째 피보나치 수는 1\nd[1] = 1\nd[2] = 2\nn = 99\n\n# 피보나치 함수(Fibonacci Function) 반복문으로 구현(보텀업 다이나믹 프로그래밍)\nfor i in range(3, n + 1):\n d[i] = d[i - 1] + d[i - 2]\n\nprint(d[n])\n\n>>> 218922995834555169026\n```\n\n### 피보나치 수열: 메모이제이션 동작 분석\n\n- 이미 계산된 결과를 메모리에 저장하면 다음과 같이 색칠된 노드만 처리할 것을 기대할 수 있음\n\n![](https://velog.velcdn.com/images/minseok0123/post/d4af10cd-c6b6-4d7a-af51-cc6b68e5b5fa/image.png)\n\n- 실제로 호출되는 함수에 대해서만 확인해보면 다음과 같이 방문\n\n![](https://velog.velcdn.com/images/minseok0123/post/d2fdc836-cabe-4f8f-8f03-ce46d370e185/image.png)\n\n- 메모이제이션을 이용하는 경우 피보나치 수열 함수의 시간 복잡도는 O(N)\n\n```python\nd = [0] * 100\n\ndef fibo(x):\n print('f(' + str(x) + ')', end=' ')\n if x == 1 or x == 2:\n return 1\n if d[x] != 0:\n return d[x]\n d[x] = fibo(x - 1) + fibo(x - 2)\n return d[x]\n\nfibo(6)\n\n>>>> f(6) f(5) f(4) f(3) f(2) f(1) f(2) f(3) f(4)\n```\n\n### 다이나믹 프로그래밍 vs 분할 정복\n\n- **다이나믹 프로그래밍**과 **분할 정복**은 **모두 최적 부분 구조를 가질 때 사용 가능**\n - **큰 문제를 작은 문제로 나눌 수 있으며 작은 문제의 답을 모아서 큰 문제를 해결할 수 있는 상황**\n- 다이나믹 프로그래밍과 분할 정복의 **차이점**은 **부분 문제의 중복**\n - 다이나믹 프로그래밍 문제에서는 각 부분 문제들이 서로 영향을 미치며 부분 문제가 중복\n - 분할 정복 문제에서는 동일한 부분 문제가 반복적으로 계산되지 않음\n- **분할 정복**의 대표적인 예시로 **퀵 정렬**이 있음\n - 한 번 기준 원소(Pivot)가 자리를 변경해서 자리를 잡으면 그 기준 원소의 위치는 바뀌지 않음\n - 분할 이후에 해당 피벗을 다시 처리하는 부분 문제는 호출하지 않음\n\n![](https://velog.velcdn.com/images/minseok0123/post/1ba8ff89-f534-4403-b637-016a9041b75d/image.png)\n\n### 다이나믹 프로그래밍 문제에 접근하는 방법\n\n- 주어진 문제가 **다이나믹 프로그래밍 유형임을 파악**하는 것이 중요\n- 가장 먼저 그리디, 구현, 완전 탐색 등의 아이디어로 문제를 해결할 수 있는지 검토할 수 있음\n - 다른 알고리즘으로 풀이 방법이 떠오르지 않는다면 다이나믹 프로그래밍을 고려\n- 일단 재귀 함수로 비효율적인 완전 탐색 프로그램을 작성한 뒤에 (탑다운) 작은 문제에서 구한 답이 큰 문제에서 그대로 사용될 수 있으면, 코드를 개선하는 방법을 사용할 수 있음\n- 일반적인 코딩 테스트 수준에서는 기본 유형의 다이나믹 프로그래밍 문제가 출제되는 경우가 많음\n\n## 마지막 정리\n\n> 다이나믹 프로그래밍(Dynamic Programming)은 문제를 작은 부분 문제로 나누어 해결하고, 중복 계산을 피하여 효율적으로 최적해를 구하는 알고리즘 기법이다. 주어진 문제를 작은 부분 문제로 쪼갠 후 하향식(Top-down) 메모이제이션 기법이나 상향식(Bottom-up) 반복적인 계산 기법을 사용하여 최적해를 구한다.\n"},{"id":"0a474589-ef01-5bd6-8fd2-1bd5bee90474","excerpt":"…","fields":{"slug":"/그리디 알고리즘/"},"frontmatter":{"title":"그리디 알고리즘","date":"2023.05.11","thumbnail":{"publicURL":"/static/cdd912ffc0119bc7769fc61a1db10078/greedy.png","childImageSharp":{"fluid":{"base64":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAMCAIAAADtbgqsAAAACXBIWXMAAAPoAAAD6AG1e1JrAAACr0lEQVR42hXLfVvhAAAA8H2HOwldRRNaaAldh5llMmYbZl7z2prUTaVoWirphbhydaq7D3tPz/P79wewsXgQQymCYMgwRRDxaCzFcQxFMmQ4TkW4OMvF2RTHCYXscf1QkqTb29vBw91j/2E46AMUQQRQjw0CzaAKsZvLxYLUbJ1LrY50VuN5uX12cS6fNhryaeOue1nNsU2x1r/tjoYP4/EIMM5Pm/UzZlDlMGkQmynFhE4OqhenR8OH3n23++/j/X3yOh4NJq/Pz8P+z2L6IE2L24lPxSRgBRXWBRVmM6Cw7vvStNdukuqCfCIOe1f3nfaof3d/fdHrSL2O1GkeP/bOb5r1s+q2LOSezvcBt2U6htoS+WxJFMntTEYQ9lutal08bZ/JsnzVvbm+vnkdvz0/jiYvk5fR+O/Ln49fg0Fj9713AmCrasZjSBIIRRARzFNI0PVSSuDISpIRs0y7Vmjs5KRa+bJxcNUUj7O0nKfvS+QTT/7eowAfrPHBGhox5aO+lpCql2OVBJ4OuqtcaD8V4hNEMYLtUchO2M2TnqMo2k6il2n/s0i9XVWAFf1XJzTlhKZskBI2zMGLWotWvaL/ZjNpHatWtxdxexEURXEcJ7bwMLFFEUQ0QrI0lY4xwA9o1m/TO5bmncsgbJjbsOjRVZNuRglqFKBGgSGuUACnQp/HYTU74eVVC2SFjFbIuLZiBpyQFtQolhbUoEahm1HOqxWz01/XlvWYdyPo9yXjjFAp13j+uH7IsTGWppJswufasFuWYcgIOEw6UKPUqr64rSBuh2jck0slKvm8UCnvlks1nv+0U9qrFHNcNBoOhP2Yyw7DkNFsWgQym3bWC6exNc67xnptDLaejmxmKH+WDuYYIhfxp8MYF/RwARe3uZ4NuPIEUqLwIr2VCvn+AyQr7HErLkBDAAAAAElFTkSuQmCC","aspectRatio":1.6025641025641026,"src":"/static/cdd912ffc0119bc7769fc61a1db10078/46604/greedy.png","srcSet":"/static/cdd912ffc0119bc7769fc61a1db10078/62d80/greedy.png 125w,\n/static/cdd912ffc0119bc7769fc61a1db10078/e1953/greedy.png 250w,\n/static/cdd912ffc0119bc7769fc61a1db10078/46604/greedy.png 500w,\n/static/cdd912ffc0119bc7769fc61a1db10078/d8815/greedy.png 750w,\n/static/cdd912ffc0119bc7769fc61a1db10078/31987/greedy.png 1000w,\n/static/cdd912ffc0119bc7769fc61a1db10078/e4d72/greedy.png 1280w","sizes":"(max-width: 500px) 100vw, 500px"}}},"categories":["알고리즘","C"]},"rawMarkdownBody":"\n## 그리디 알고리즘 개념\n그리디 알고리즘(탐욕법)은 **현재 상황에서 지금 당장 좋은 것만** 고르는 방법을 의미한다.\n**일반적인 그리디 알고리즘은 문제를 풀기 위한 최소한의 아이디어를 떠올릴 수 있는 능력을 요구합니다.**\n\n### 작동 방식\n그리디 알고리즘은 다음과 같은 단계로 동작합니다.\n\n1. 문제를 하위 문제로 나눕니다.\n2. 각 하위 문제에 대해 가장 좋아 보이는 선택을 합니다.\n3. 선택한 해를 부분해 집합에 추가합니다.\n4. 부분해 집합이 최종 해답이 되는지 확인합니다.\n5. 만약 최종 해답이 아니라면, 2단계로 돌아가 반복합니다.\n\n![](https://velog.velcdn.com/images/minseok0123/post/da8b64eb-e2fc-47fb-99b5-5f2413e4f365/image.png)\n\n### 장단점\n그리디 알고리즘의 주요 장점은 다음과 같습니다.\n\n1. 구현이 비교적 간단하다.\n2. 실행 속도가 빠르다.\n\n하지만 그리디 알고리즘은 항상 최적해를 구할 수 있는 것은 아닙니다. 최적해를 보장하기 위해서는 추가적인 검증 단계가 필요할 수 있습니다. 그리디 알고리즘은 각 단계에서의 선택이 최적일 뿐, 그 선택들이 전체적으로 최적인지 보장하지 않기 때문입니다. 따라서 그리디 알고리즘을 사용할 때에는 문제의 성질과 제약 조건을 분석하여 최적해를 보장할 수 있는지 판단해야 합니다.\n\n## 예시\n\n### 문제: 거스름돈 문제\n\n> 당신은 음식점의 계산을 도와주는 점원이다. 카운터에는 거스름돈으로 사용할 500원, 100원, 50원, 10원짜리의 동전이 무한히 존재한다고 가정한다. 손님에게 거슬러줘야 할 돈이 N원일 때 거슬러 줘야 할 동전의 최소 개수를 구하라. 단, 거슬러 줘야 할 돈 N은 항상 10의 배수이다.\n\n\n#### 해결 방법:\n\n동전의 최소 개수를 구해야 하는 문제이기 때문에, **가장 큰 화폐 단위부터 돈을 거슬러 주는 것**입니다.\n\n거스름 돈이 N원일 때, `500원`으로 최대한 많이 거슬러주고, 순서대로 `100원`, `50원`, `10원`을 써서 거슬러주면 됩니다.\n\n이제 N이 1,260 일 때의 예시를 확인해봅시다.\n\n# 코드\n\n```c\n#include \n\nvoid giveChange(int amount) {\n int coins[] = {500, 100, 50, 10}; // 동전 종류\n int numCoins = sizeof(coins) / sizeof(coins[0]); // 동전 종류의 개수\n int count[numCoins]; // 동전 개수를 저장할 배열\n\n // 각 동전의 개수 초기화\n for (int i = 0; i < numCoins; i++) {\n count[i] = 0;\n }\n\n // 가장 큰 동전부터 시작하여 거스름돈 주기\n for (int i = 0; i < numCoins; i++) {\n while (amount >= coins[i]) {\n amount -= coins[i];\n count[i]++;\n }\n }\n\n // 거스름돈 출력\n for (int i = 0; i < numCoins; i++) {\n if (count[i] > 0) {\n printf(\"%d원 동전: %d개\\n\", coins[i], count[i]);\n }\n }\n}\n\nint main() {\n int amount = 1260; // 거스름돈 금액\n giveChange(amount);\n return 0;\n}\n\n```\n\n# 정당성 분석\n\n가장 큰 화폐 단위부터 돈을 거슬러 주는 것이 최적의 해를 보장하는 이유는 무엇일까요?\n\n- 가지고 있는 동전 중에서 큰 단위가 항상 작은 단위의 배수이므로 작은 단위의 동전들을 종합해 다른 해가 나올 수 없기 때문\n\nQ) 만약에 800원을 거슬러 주어야 하는데 화폐 단위가 500원, 400원, 100원이라면 어떻게 될까요?\n\n- 4개의 동전 / 2개의 동전\n\n**대부분의 그리디 알고리즘 문제에서는 이처럼 문제 풀이를 위한 최소한의 아이디어를 떠올리고 이것이 정당한지 검토할 수있어야 답을 도출할 수 있다.**"},{"id":"7394bcc4-61a8-591a-9988-220a0dabd201","excerpt":"박싱과 언박싱 Boxing : 값타입을 참조타입으로 변환하는 기법\nUnBoxing : 참조타입을 값타입으로 변환하는 기법 1. 값타입 스택 : 저장 선언되는 즉시 메모리를 할당하게 된다. 따라서 생성과 동시에 값을 할당할 수도 있다. int a = 3; 2. 참조타입 힙 : 저장\n스택 : (C의 포인터처럼) 저장된 것의 주소값만 가짐 쿠팡이라는 온라인마켓\nint 모양의 상품, double 모양의 상품, String…","fields":{"slug":"/박싱과 언박싱/"},"frontmatter":{"title":"박싱과 언박싱","date":"2023.11.11","thumbnail":{"publicURL":"/static/f4d7b3a1114c4a515a6a522123598c5e/unboxing.png","childImageSharp":{"fluid":{"base64":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAQCAYAAAAWGF8bAAAACXBIWXMAAA7DAAAOwwHHb6hkAAAC9UlEQVR42nWTXW8bVRCGT1zBr+GyFK6QQCAhLhrxA7jkHsEf6AVICBGuqwISIAXENRIUmkSq0sa2mo2T+GN37V3vt90a1453nfhjvedBezZJLaQcaTSvRjPvmXnPHMH6kbLw/hF4GsQD8A4hrMNsAskQpkN40YZxCNOXRc5avXiFJciMnFJWt8n2HyAf34dHW8g/v4RH38LTH5EPv0bufw8735H9s4X8+xtI56rumlBednblmQ4g6cFiihxHMHRgHCHHIfKsB2c95CyGUAPt9+vB5DrhFdkqTRlNEpwgYpVdJq4Za773/AXjeMo6h7giyrKiOgwC9nZ3+OXnnxiNzlS5lNmlvhKZZSyXC5X726/b7O7uKpymqfKqw+FwiGEYdLtdWs0mrVYLz/Not9tYloVpmlzl6bqObdsqt9lsKstxp9NRpgjz4ul0yk3HdV3VQRAExHF8Y941oe/7JPFEjZStUrIst5Xyecx1HUUYRSGTySgXKFd7Tc0MKZdYVrsgzG+ez+WNNwdhn3S5JIr6TM+L2Pk59J8v8PyYOClidrdXELqujWnsEYVVfK9Mv1emH5UJvAqBf8BxbU+9ieM1qdfu0fO2qD79nL/++ITHO59SefIFnv0Vz6o/IObzjK5dJdA3GPklxkGJ2pMS9WqOX+OlK2jVPlQrFOrbjDzBaiQgFgwsgd8scDoUtE/fQywWEqtTxjwSBIYgMgWdY4Gh5biE3xLUKu8j/41xDx7Qqt0m7LyFb95Br71J4/AOvvk2nvEGWuUzhGHYHGkPWY1LkApCY4PTiqC2L/D0WyoW6O+SziDoRQwGExZLOL+QzBeSvKGLC8lsBoZhXWroHFKvbOA2SuiHt2g9K2FoJXTtdewTgVb+SL1rGLokSfy///IKd7s2YrkE2zpgEgqycaGHdSzUqDnO9bKb75Cu8m1wSJLkxm3IP4HqsN9vY5zcxTHu0tU3MU42MU83cYyPsZsf0Dq9pwqiKKDRaOA4jvot65aT1et1/gMkWHmafvk6hQAAAABJRU5ErkJggg==","aspectRatio":1.2376237623762376,"src":"/static/f4d7b3a1114c4a515a6a522123598c5e/46604/unboxing.png","srcSet":"/static/f4d7b3a1114c4a515a6a522123598c5e/62d80/unboxing.png 125w,\n/static/f4d7b3a1114c4a515a6a522123598c5e/e1953/unboxing.png 250w,\n/static/f4d7b3a1114c4a515a6a522123598c5e/46604/unboxing.png 500w,\n/static/f4d7b3a1114c4a515a6a522123598c5e/64686/unboxing.png 746w","sizes":"(max-width: 500px) 100vw, 500px"}}},"categories":["C샵"]},"rawMarkdownBody":"\n# 박싱과 언박싱\n\n> **Boxing** : 값타입을 참조타입으로 변환하는 기법\n> **UnBoxing** : 참조타입을 값타입으로 변환하는 기법\n\n## 1. 값타입\n\n스택 : 저장\n\n- 선언되는 즉시 메모리를 할당하게 된다.\n- 따라서 생성과 동시에 값을 할당할 수도 있다. int a = 3;\n\n## 2. 참조타입\n\n힙 : 저장\n스택 : (C의 포인터처럼) 저장된 것의 주소값만 가짐\n\n```csharp\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\n\n\n// 유리병(값타입) -> 유리병 그대로 배달 X -> 택배차 : 거부 (우린 택배박스만 받는다)\n// 유리병 -> 택배포장 -> 택배차\n// 값타입 -> 참조타입으로 포장(박싱) -> 참조타입만 받는 매개변수에 전달\npublic class BoxingTest\n{\n public static void Main(string[] args)\n {\n int p = 123; // 값타입\n Object o = p; // (자동으로 박싱) 박싱후 o에 들어가는 상황\n int j = (int)o; // 언박싱 : 내가 명시적으로 캐스팅을 해줘야 한다\n\n Console.WriteLine(p);\n Console.WriteLine(o);\n Console.WriteLine(j);\n }\n}\n\n비유하자면 우리집이라는 객체를 메모리에할당할 경우,\n우리집은 힙 영역에 저장되고 스택 영역에서는 우리집을 가르키는 주소\n* 참조타입은 새로운 값을 할당하기 위해서는 new를 통해 선은을 해줘야 한다.\n\nclass 우리집\n{\n public void 안방()\n {\n\n }\n}\n\n\npublic class BoxingTest\n{\n public static void Main(string[] args)\n {\n int a = 10; // 값타입\n 우리집 b201호 = new 우리집(); // 참조타입\n b201호.안방();\n }\n}\n```\n\n---\n\n쿠팡이라는 온라인마켓\nint 모양의 상품, double 모양의 상품, String 모양의 상품, 객체 모양의 상품 (별의별 물건 다 팜)\n할때마다 int 전용 택배차 따로, double 전용 택배차를 일일히 다 만들면 비효율적이다\n포장 -> 모두 같은 택배차에 실어 나르자\n\n```csharp\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\n\n\npublic class 쿠팡맨\n{\n public void 배송출발(Object o)\n {\n Console.WriteLine(\"배달하는 물건 : \"+ o );\n }\n}\n\npublic class BoxingTest\n{\n public static void Main(string[] args)\n {\n 쿠팡맨 man = new 쿠팡맨();\n int 주문상품1 = 123; // 값타입 (그냥 택배차에 못 실음)\n double 주문상품2 = 3.14; // 값타입\n String 주문상품3 = \"이미포장됨\"; // 참조타입\n\n man.배송출발(주문상품1); // 값 타입이 자동으로 참조타입으로 박싱된 후 전달됨 (택배포장이 된 후)\n man.배송출발(주문상품2); // 값 타입이 자동으로 참조타입으로 박싱된 후 전달됨 (택배포장이 된 후)\n man.배송출발(주문상품3);\n man.배송출발(man); // 쿠팡맨은 포장 안하고 그냥 택배차에 올라탐 (참조타입은 그냥 들어감)\n }\n}\n```\n\n---\n\n```csharp\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\n\nusing System.Collections; // ArrayList 쓰려고 추가함\n\npublic class BoxingTest\n{\n public static void Main(string[] args)\n {\n ArrayList list = new ArrayList();\n\n // 1. 박싱되는 예시\n list.Add(new BoxingTest()); // list[0] 공간 : 참조타입인 객체가 전달\n list.Add(\"안녕하세요\"); // list[1] 공간 : 참조타입인 문자열이 전달 (heap 영역에 저장 근데 문자열은 특이하게도 new 키워드를 안써도 된다)\n list.Add(3.14); // list[2] 공간 : 값타입인 실수가 (자동으로 박싱이 된 후) 전달\n list.Add(123); // list[3] 공간 : 값타입인 정수가 (자동으로 박싱이 된 후) 전달\n\n // 2. 정상 삽입됐나 확인\n Object o1 = list[2]; // list.Add(3.14); 이게 정상적으로 삽입됐나?\n Object o2 = list[3]; // list.Add(123); 이게 정상적으로 삽입됐나?\n\n Console.WriteLine(o1);\n Console.WriteLine(o2);\n\n // 3. 전체 출력\n PrintValues(list);\n }\n\n // 출력 함수\n public static void PrintValues(IEnumerable 리스트)\n {\n foreach (Object obj in 리스트)\n {\n Console.WriteLine(\"{0}\", obj);\n }\n }\n}\n```\n\n---\n"},{"id":"d3342002-e371-5bb7-ab44-e71983320c31","excerpt":"시뮬레이션과 완전탐색 개념 시뮬레이션과 완전탐색은 CS에서 중요한 개념으로, 다양한 문제를 해결하기 위해 사용된다.\n시뮬레이션과 완전탐색에 대해 알아보고, 각각의 개념을 어떻게 활용하는지 알아보자. 1. 시뮬레이션(Simulation…","fields":{"slug":"/시뮬레이션과 완전탐색/"},"frontmatter":{"title":"시뮬레이션과 완전탐색","date":"2023.05.12","thumbnail":{"publicURL":"/static/cc3ebf5b6a941408a03a690e03ec3a5f/simulation.png","childImageSharp":{"fluid":{"base64":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAIAAAAC64paAAAACXBIWXMAAAsTAAALEwEAmpwYAAAEz0lEQVR42gHEBDv7AA8qMRArMxEsNBEtNBAuNRAvNxExOREzOxE2PhI5QhA7RQ89RxE+Rw08RBQ/SBI6RRM8RRAyOg0rNAwnMAARLTURLTURLzYRMjkSNj0SOUISPkYTQUoTRE4QSlMVWF4mYWYUV101XmcgU14WWmBKZW8MPkoQND0OLDUAETI5ETU8EjlCEz9HE0VNFEpRFExVFk9WFFFXEVpfdYKBfYmIZmt6STlTOV9pW29/QUBbE1djD0ZSDjI8ABM8RBRBShRIUBVNVBZQVxZSWBZVWxVWWw1WWmmIg7mCfqd2fUwvTTIfNFlAXj0lRCwoPFBwhz5wgyBSXgAWSlIWT1YXU1oXVlwYWF0YWl8WW18lZ2gXZWa0r5fAfXVkQmIwHzpCLkw1JD8sGipDMFE7MFVZWnomWGcAGVhdGVtfGl1hGmBiG2FkHGRmE2FiPX56uL6nxZOBgUVMXC01Vy0wTCo0KxQYGREmJBs0EAwZRh0XJmVjAB1kZh1mZx1qaR1sah1sah1sahtsaid0bcbEqNGGeIYrE4A0GX4yEFwjBC0OBEgaAEoWAWEiAGMmCS5BWAAjd3Ile3QlfHUjenMhd3Egc24dcGwrfXTBs4rUijJfUgtQHCGTcBRZgRsgDAlaIQRpXFY2L0EaEBw1KD8AI6eIGbWKHq2HJ5iAJ4h7I4B2I3pxHH52jItp5bIbZHoTNgkOyIQYb2QNFgIOIxQgRjtCLCpEFRInTj1JAAfOjwrYlBXUkh/BjCughiqPfySFeR+EeKKvlbRiPk8ZDnsyKqpFO14kKH89QXQyOCoODSkWJTcvPa9cPwBhz50z0pMT0Y0Sy4gktYgxm4UqkX4eh3k5l4OpqIusXEjYk271xZHqq4a6YFJdNTYvITk1LTrEhE+vTy0A/+nb6OHJvdu3i9GfOsGKL6qHLpeBKZB9H417Mp6EfKSAk35cypBmw2hVZTIyCxgqGBk2FyI9qnlElEUnAPXhzfzm0v3dxP/PrJ/Ikh2/ijKdgiSbgyKfhBqkhR+/jl6zdXAvImIJCUkpKhEZMBIWLwARNH9ZOXo2IQD01bz37NX37dPww5XjsX83yIwluodCsX82uIFYsXVunHFUZFpVOjI1FhkYJjEMCx0NEioEGD0yIzNgKB4Ar5iH/+TC9uTC6bmK4pJyl55ymIlWxFw+u2A+4Gc/rGNMKklahFdFcD8yTllOcldNGh8+AQ8qMB4qSyEaACpAS9KQbvCzhOOfe9SOdNV8Yp9DP3gwN6tCOb9YRLZTONNkP65ROVNAS1tSXD09WBUhPwIMHz8gHzcYFQAWVWStclHccUOJUEiwb1zYi26aVVVlITRjJiZPICZPNTx6W1B2QkAqKUkQJU0YKE8PGDAHDBo+IiEsExIAWU1Mq2dNxV9AWjQ5XDM2slE+/61c1ppieT1DgUpMqGNdtHtqm3NnUkFMIyI4HSM9DxszDRYpLBkaIxETAEIxOlY1N3E7OFYxMlQsL6ZJNPq2TeWbUJZJRGlCQkw4PisoOhwkPzAtPjcwPjMuPywuRCE0TBwwRR8lMQAvNEMJKTsgLjw5ND5CMThAKS1hLCtjLy8mHisSHjMTITsfKEAkJzoiITIcGyoUFCIRFCIdMEMkPFEmP1Z1pYey/tyskAAAAABJRU5ErkJggg==","aspectRatio":1,"src":"/static/cc3ebf5b6a941408a03a690e03ec3a5f/46604/simulation.png","srcSet":"/static/cc3ebf5b6a941408a03a690e03ec3a5f/62d80/simulation.png 125w,\n/static/cc3ebf5b6a941408a03a690e03ec3a5f/e1953/simulation.png 250w,\n/static/cc3ebf5b6a941408a03a690e03ec3a5f/46604/simulation.png 500w,\n/static/cc3ebf5b6a941408a03a690e03ec3a5f/bc59e/simulation.png 512w","sizes":"(max-width: 500px) 100vw, 500px"}}},"categories":["알고리즘","Python"]},"rawMarkdownBody":"\n## 시뮬레이션과 완전탐색 개념\n\n시뮬레이션과 완전탐색은 CS에서 중요한 개념으로, 다양한 문제를 해결하기 위해 사용된다.\n시뮬레이션과 완전탐색에 대해 알아보고, 각각의 개념을 어떻게 활용하는지 알아보자.\n\n### 1. 시뮬레이션(Simulation)\n\n머릿 속에 있는 알고리즘을 소스코드로 바꾸는 과정이다.\n알고리즘을 잘 세우더라도 알고리즘이 실제로 동작하지 않기 때문에 이러한 구현은 반드시 필요한 과정어떠한 알고리즘의 문제를 풀더라도 소스코드로 구현해야 하기 때문에 구현을 구분하지는 않지만, 알고리즘 과정에서 구현이 필요한 문제는 대체적으로 구현에 초점을 둔 어려운 문제가 많이 존재한다.\n\n![](https://velog.velcdn.com/images/minseok0123/post/e55ed6bb-5bdd-4a6d-82db-265db5ca1cc5/image.png)\n\n### 2. 완전탐색(Exhaustive Search)\n\n완전탐색은 가능한 모든 경우의 수를 나열하고, 그 중에서 문제의 조건을 만족하는 해결책을 찾는 방법이다. 모든 가능한 경우를 일일이 탐색하기 때문에 정확한 해결책을 찾을 수 있지만, 경우의 수가 많을 경우에는 시간과 리소스가 많이 소요될 수 있다. 따라서 완전탐색은 경우의 수가 비교적 작을 때에 유용하게 활용된다.\n\n## 문제 - 상하좌우\n\n> 여행가 A는 NxN 크기의 정사각형 공간에 서 있고, 이 공간은 1 x 1 크기의 정사각형으로 나누어져 있다.가장 왼쪽 위 좌표는 (1, 1)이고 가장 오른쪽 아래 좌표는 (N, N)이다.상하좌우로 이동할 수 있으며, 시작 좌표는 (1,1)이다.\n>\n> 계획서대로 이동하면 되는데 L, R, U, D는 각각 왼쪽, 오른쪽, 위, 아래로 한칸씩 이동하라는 뜻이다.\n>\n> 만약 공간을 벗어나는 움직임이 있다면 그 움직임은 무시하고 다음으로 넘어간다.\n>\n> 계획서에는 하나의 줄에 띄어쓰기를 기준으로 L, R, U, D 중 하나의 문자가 반복적으로 적혀있다. 각 문자의 의미는 다음과 같다\n>\n> - L: 왼쪽으로 한 칸 이동\n> - R: 오른쪽으로 한 칸 이동\n> - U: 위로 한 칸 이동\n> - D: 아래로 한 칸 이동\n\n이때 여행가 A가 N × N 크기의 정사각형 공간을 벗어나는 움직임은 무시된다예를 들어 (1, 1)의 위치에서 L 혹은 U를 만나면 무시된다다음은 N = 5인 지도와 계획이다.\n\n![](https://velog.velcdn.com/images/minseok0123/post/0cda2031-eff7-40d9-83d2-ed69060b26de/image.png)\n\n## 코드\n\n```python\nn = int(input()) # 정사각형 공간을 입력받는다.\nx, y = 1, 1 # 시작 좌표는 항상 (1, 1)이므로 1, 1로 x, y 초기화\nplans = input().split() # 이동 계획을 입력받는다.\n\n# 상하좌우(L, R, U, D)에 따른 이동 방향\ndx = [0, 0, -1, 1]\ndy = [-1, 1, 0, 0]\n\nmove_types = ['L', 'R', 'U', 'D']\n\n# 입력받은 이동 계획을 하나씩 조회\nfor plan in plans:\n for i in range(len(move_types)):\n \t# move_types와 일치하는 plan이 있다면\n if plan == move_types[i]:\n # 이동한 A의 좌표 nx, ny\n nx = x + dx[i]\n ny = y + dy[i]\n\n # N x N 크기의 정사각형을 벗어나면 움직임은 무시되므로\n if nx < 1 or ny < 1 or nx > n or ny > n:\n continue\n\n # 공간안에 있다면 A의 좌표 이동\n x, y = nx, ny\n\nprint(x, y)\n```\n\n1. 입력으로 정사각형 공간의 크기 N을 받습니다.\n2. A의 초기 위치를 (1, 1)로 설정합니다.\n3. 이동 계획을 입력받습니다.\n4. 상하좌우 이동에 따른 x, y의 변화량을 설정합니다.\n5. 이동 계획을 하나씩 조회하며, 이동 계획과 move_types를 비교하여 일치하는 이동 방향을 찾습니다.\n6. 해당 이동 방향에 따라 A의 좌표를 이동합니다.\n7. 이동한 좌표가 정사각형 공간을 벗어나지 않는지 체크하고, 벗어나면 움직임을 무시합니다.\n8. 모든 이동 계획을 처리한 후 A의 최종 위치를 출력합니다.\n\n### 3. 시뮬레이션과 완전탐색의 활용 예시\n\n시뮬레이션과 완전탐색은 다양한 문제 해결에 활용될 수 있다.\n\n- 게임 개발: 게임에서 특정 상황의 결과를 예측하고 시뮬레이션하여 게임의 균형을 조절하거나 최적화할 수 있다. 완전탐색을 사용하여 게임의 모든 가능한 상태를 탐색하여 최적 전략을 찾을 수도 있다.\n- 경제 모델링: 경제학자들은 경제 시스템을 모델링하여 다양한 정책 결정에 대한 결과를 예측하고 분석한다. 시뮬레이션을 통해 경제 시스템의 동작을 모방하고, 완전탐색을 통해 최적의 정책을 찾을 수 있다.\n- 여행 경로 최적화: 여행 경로 최적화 문제는 주어진 도시들을 방문하는 가장 짧은 경로를 찾는 문제이다. 가능한 모든 경로를 탐색하여 최단 경로를 찾을 수 있다.\n"},{"id":"85b1a28c-4124-533a-9ea6-de8755a2d949","excerpt":"연산자 오버로딩 연산자 오버로딩(Operator Overloading) 연산자의 종류는 이렇다. 예시코드","fields":{"slug":"/연산자 오버로딩/"},"frontmatter":{"title":"연산자 오버로딩","date":"2023.11.05","thumbnail":{"publicURL":"/static/d39e7bc53e8853f4f4908add0b4b795d/operator.png","childImageSharp":{"fluid":{"base64":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAOCAYAAAAvxDzwAAAACXBIWXMAAA7DAAAOwwHHb6hkAAABf0lEQVR42pVTScvCQAztT3c5eVAUwatboUVBcMOLSEEFsWLBoz2o1aNUcUNr9X0kMNJq1c9AOpmZzCPvJZXwZPf7/eP+W74UdHm5XHA4HHC9XnnvOA5utxvHm82G3bZtuK77Aip5D0SCpmlQVRXtdhuZTAaz2Qy1Wg3hcBjpdBrNZhOyLDOweC8wJBHQKgAnkwk6nQ6GwyF6vR4WiwVGoxFKpRLq9TqWyyXfPQOSS//R6Zv5KHvL7ff7KBQK0HUd3W6XaY3HY6xWKzQaDa66XC6jUqmg1WqxLJRLRhpzhfQRglerVUQiEWSzWfZUKsUUSYJ4PM6UY7EYQqEQcrkcx4qiPPR/obzf73E8HrHb7XA+n/mMOk3xdrt90KL70+n0WL06+prybKJJggEB0Eh5Zfo4NuLher1GIpFAMpnksSH6xWIR0WgU+XyenXK8b3xdDhpswzAwGAwwnU4xn895Fik2TROWZfmA3v4pv45QUG5ghaLzn/yd9m8r9Ar/S9V/hHke+VznqG0AAAAASUVORK5CYII=","aspectRatio":1.4534883720930232,"src":"/static/d39e7bc53e8853f4f4908add0b4b795d/46604/operator.png","srcSet":"/static/d39e7bc53e8853f4f4908add0b4b795d/62d80/operator.png 125w,\n/static/d39e7bc53e8853f4f4908add0b4b795d/e1953/operator.png 250w,\n/static/d39e7bc53e8853f4f4908add0b4b795d/46604/operator.png 500w,\n/static/d39e7bc53e8853f4f4908add0b4b795d/2a4de/operator.png 600w","sizes":"(max-width: 500px) 100vw, 500px"}}},"categories":["C샵"]},"rawMarkdownBody":"\n# 연산자 오버로딩\n\n연산자 오버로딩(Operator Overloading)\n\n> 연산자의 종류는 이렇다.\n\n + (더하기)\n - (빼기)\n * (곱하기)\n / (나누기)\n\n## 예시코드\n\n```csharp\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\n\nclass 귀요미\n{\n public static String operator + (귀요미 one, 귀요미 two)\n {\n return \"귀요미\";\n }\n\n public static String operator * (귀요미 one, 귀요미 two)\n {\n return \"과로사\";\n }\n\n public static String operator - (귀요미 one, 귀요미 two)\n {\n return \"행복해\";\n }\n\n public static String operator / (귀요미 one, 귀요미 two)\n {\n return \"너가해\";\n }\n}\n\nclass OperOverloadTestMain\n{\n public static void Main(string[] args)\n {\n 귀요미 일 = new 귀요미();\n\n Console.WriteLine(일 + 일);\n Console.WriteLine(일 * 일);\n Console.WriteLine(일 - 일);\n Console.WriteLine(일 / 일);\n }\n}\n```\n\n---\n"},{"id":"7f7cf4b4-25b0-51fb-abfa-8d0cf382652d","excerpt":"생성자와 static 변수 1. 생성자 생성자 함수는 메모리가 생성된 직후 가장 먼저 호출되는 함수이다.\n모든 class는 메모리가 생성될 경우 자신과 이름이 똑같은 함수를 가장 먼저 호출한다. [디폴트 생성자] 만약 개발자가 생성자를 만들지 않았다면.\n컴파일러는 텅 빈 디폴트 생성자를 자동으로 만든다. (눈에는 보이지 않는다) [생성자의 용도] 모든 직원은 회사에 출근하면 출근체크부터 해야 한다.\n마찬가지로 함수를 호출시키자마자 처음…","fields":{"slug":"/생성자와 static 변수/"},"frontmatter":{"title":"생성자와 static 변수","date":"2023.11.01","thumbnail":{"publicURL":"/static/f48e91ca89f3ac1cfde9650ebdce6485/생성자.png","childImageSharp":{"fluid":{"base64":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAALCAYAAAB/Ca1DAAAACXBIWXMAAAsTAAALEwEAmpwYAAABrElEQVR42pVT2W7bMBD0/39VH4r0SIICddHKdKzDkKzYtKLElUyKx0yxsuLYCPLQBRa75IKzswdn1hKbitBNxK47onrpYXwAyf9VkTg7HDocDp7WkmYI7Kzj4D1DCAwhMgQwRkx+mPzTnXMDrTWikBiAOPPOAwjMcw+liL0esF4XSFcrFLlGmgJZJlrh4UGhaSQesVwSavkH9z8+4+bLJ2itTwxjBCRb1/UIwdMYwxgjh8G9FSI1TX5EHCscmUZhHMRC3owMcZLxTdd1/PrtO5dK8e72lqtswcdtyfa5mUBxBX4hbz18BbR2gLUDd9sdN5sNq6piWiz46/c983V6BvxAMdkToKR0zuKqxg9J4KIN4Jn0yZEexhFIa6IowPYZ3O8jy5Ks65ZKLWjMkVUFtq1j05BPT5beH88JXtGuSpZpzudAXQObKmI+J9LsBUnyE2qRIM8fUeQeaTqgLGXSPYzpZaB4x1AOeQ4qBe40WNdkkpQsipx13VMtDLX+yywlt9uG3kc6J/voLwY1AfZ9H733kKmHMK7Q6MtdCA6yr97zHAfGFl39komemPAPGPdUtIXnArsAAAAASUVORK5CYII=","aspectRatio":1.7605633802816902,"src":"/static/f48e91ca89f3ac1cfde9650ebdce6485/46604/%EC%83%9D%EC%84%B1%EC%9E%90.png","srcSet":"/static/f48e91ca89f3ac1cfde9650ebdce6485/62d80/%EC%83%9D%EC%84%B1%EC%9E%90.png 125w,\n/static/f48e91ca89f3ac1cfde9650ebdce6485/e1953/%EC%83%9D%EC%84%B1%EC%9E%90.png 250w,\n/static/f48e91ca89f3ac1cfde9650ebdce6485/46604/%EC%83%9D%EC%84%B1%EC%9E%90.png 500w","sizes":"(max-width: 500px) 100vw, 500px"}}},"categories":["C샵"]},"rawMarkdownBody":"\n# 생성자와 static 변수\n\n> ## 1. 생성자\n>\n> 생성자 함수는 메모리가 생성된 직후 **가장 먼저** 호출되는 함수이다.\n> 모든 class는 메모리가 생성될 경우 **자신과 이름이 똑같은** 함수를 가장 먼저 호출한다.\n\n### [디폴트 생성자]\n\n만약 개발자가 생성자를 만들지 않았다면.\n컴파일러는 텅 빈 디폴트 생성자를 자동으로 만든다. (눈에는 보이지 않는다)\n\n### [생성자의 용도]\n\n모든 직원은 회사에 출근하면 출근체크부터 해야 한다.\n마찬가지로 함수를 호출시키자마자 처음 1회 해야 되는 일이 필요하다면 (예: 값의 초기화)\n그것을 생성자 함수에 넣어준다.\n\n```csharp\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\n\nnamespace Creator\n{\n public class 출근\n {\n int 업무량;\n\n //생성자 함수 : 메모리가 할당되면 가장 먼저 1회 실행된다.\n public 출근()\n {\n 업무량 = 100;\n Console.WriteLine(\"출근 완료!\");\n }\n\n public void 업무중()\n {\n 업무량 -= 10;\n Console.WriteLine(\"남은 엄무량: {0}\", 업무량);\n }\n }\n\n internal class Program\n {\n static void Main(string[] args)\n {\n 출근 김대리 = new 출근();\n 김대리.업무중();\n 김대리.업무중();\n 김대리.업무중();\n 김대리.업무중();\n 김대리.업무중();\n 김대리.업무중();\n 김대리.업무중();\n 김대리.업무중();\n 김대리.업무중();\n }\n }\n```\n\n### 실행 결과\n\n> 출근 완료!\n> 남은 엄무량: 90\n> 남은 엄무량: 80\n> 남은 엄무량: 70\n> 남은 엄무량: 60\n> 남은 엄무량: 50\n> 남은 엄무량: 40\n> 남은 엄무량: 30\n> 남은 엄무량: 20\n> 남은 엄무량: 10\n\n생성자는 객체를 만들어 줬을때 한 번만 실행된다.\n엄무중 함수를 여러번 호출해도 생성자는 실행되지 않는다.\n\n---\n\n> ## 2. static 변수\n1. 일반 변수는 함수호출이 끝나면 **소멸**된다.\n2. 그러나 **static**으로 선언된 변수는 함수호출이 끝나도 **계속 메모리에 남아 있다.**\n\n```csharp\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\n\nnamespace @Static\n{\n class 출근\n {\n static int 업무량 = 0;\n int 내월급 = 0;\n\n //생성자 함수 (출근할때마다 자동으로 호출)\n public 출근()\n {\n Console.WriteLine(\"출근 완료!!\");\n 업무량++;\n 내월급++;\n }\n\n //일반 함수\n public void 업무시작()\n {\n Console.WriteLine(\"업무량: {0}\", 업무량);\n Console.WriteLine(\"내월급: {0} \\n\\n\", 내월급);\n }\n }\n internal class 회사\n {\n static void Main(string[] args)\n {\n int 연차 = 10;\n for(int i = 0; i <= 연차; i++)\n {\n Console.WriteLine(\"----- {0}년차 직장인 김대리의 하루 -----\", i);\n 출근 김대리 = new 출근();\n 김대리.업무시작();\n }\n }\n }\n}\n```\n\n### 실행 결과\n\n----- 0년차 직장인 김대리의 하루 -----\n출근 완료!!\n업무량: 1\n내월급: 1\n\n----- 1년차 직장인 김대리의 하루 -----\n출근 완료!!\n업무량: 2\n내월급: 1\n\n----- 2년차 직장인 김대리의 하루 -----\n출근 완료!!\n업무량: 3\n내월급: 1\n\n----- 3년차 직장인 김대리의 하루 -----\n출근 완료!!\n업무량: 4\n내월급: 1\n\n----- 4년차 직장인 김대리의 하루 -----\n출근 완료!!\n업무량: 5\n내월급: 1\n\n----- 5년차 직장인 김대리의 하루 -----\n출근 완료!!\n업무량: 6\n내월급: 1\n\n----- 6년차 직장인 김대리의 하루 -----\n출근 완료!!\n업무량: 7\n내월급: 1\n\n----- 7년차 직장인 김대리의 하루 -----\n출근 완료!!\n업무량: 8\n내월급: 1\n\n----- 8년차 직장인 김대리의 하루 -----\n출근 완료!!\n업무량: 9\n내월급: 1\n\n----- 9년차 직장인 김대리의 하루 -----\n출근 완료!!\n업무량: 10\n내월급: 1\n\n----- 10년차 직장인 김대리의 하루 -----\n출근 완료!!\n업무량: 11\n내월급: 1\n\n> 함수가 호출될 떄 마다 업무량을 1씩 증가 하였지만,\n> 월급을 늘지 않았다...\n\n---\n"},{"id":"a99447dc-9148-5a1b-b10a-714d9622f8b3","excerpt":"…","fields":{"slug":"/아두이노 스마트 쓰레기통/"},"frontmatter":{"title":"아두이노 스마트 쓰레기통","date":"2021.10.14","thumbnail":{"publicURL":"/static/6fa610f8862c87b1846b866a818c88df/arduino.png","childImageSharp":{"fluid":{"base64":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAACXBIWXMAAAsTAAALEwEAmpwYAAADxUlEQVR42nWUa0ybVRzGT7lsTBbcBITGTMgmEInDLYuyaIwmJuLiZRMv8/LB7IOXBDd0m1MyGAGUtgItbd+26wUKOHBOypA5miIuogtSWMyYNBTYyNgEYkSDGgfEpD+ltdCu3Zv8c5KT9/zO85z/RQijjYgwWFdWmcmG0JoQNVp2NjSTY7AgVBpSPz3JHU2tCMkSfi4CFAKLWYbpzBS0nGBg3AuLCzi+7eOjs04OlJbxXnExBSYLQnecmFsCg6vZjqhvYF+jncX5Gywswi9zfzJy6SK7CwrI27KZQ2XHSNdIASdBMVFhpgZErYEXFC/jUmYw2LSTkc6XONuu59HHd7Gn8Dne0GhJ1ZkQeguy0POrCq0rsHi1RKv0IKetKVxtSYTeteCK47cmwZsf7CZFY0XUSwjJGg4LV2gj1mhGSK08oXuLq11JOFRyLjkSGO9OYrQ7GdwbOG3MQCglZObGVZtRFf6vTqaWqFHl4jYmcqpqE19oduCoyaRPfzu95jW018vYUFmKMLcgDJZw2ArQ/6gW/0+5FYdwWos5/00nU1c8nPu6F2d3Fz8O9jF0rhWX9CIPFT2LMLUEzoSqjKYwuU5C0dZBR0cXwz956Ojs5IzFyvV+N8vfjb+W2HTwIMLUiCz47kbrTZaDtxxvRByrolqlpKvBhlavZ+raNZbGxliYnGRp4W/qHA5EeTVCY4is3TCgqYE1WiMbD3/IY1XV9F8cxuP14vP5+Mfn4+eZGbxeL+7hYfouXEDz3XnW1UeBrmwcbyRJUctTB94lr7QcoVRT53Tx++wsnonLzPw657d8fXqaz109DLjd3P2xKmA9KtBsJ0Gp5uHsbL60WRkaH2d4dJTvp2fQeUaRRjx+4JB3jMSyCkSFAlGrCzRBVMtGm79I1732Ok9XK2k58xVTExMMzP9B88Rl3PPzfuCVsTFy8vMpKDnKq6cciFDbEVleDnsrot6IOFyCzukCfMzOzTE4MEBlZSVZ2dnEx8VR9Mpeevp/QCjqAsmMsBxc9WZizXZiDFbk928jf8d27s3OIjU5mdvWryddno48PY3M7flsrv7EP2kiFQbVGVb7eXnmJW3JISEukbWZ95CalUVG2p2kye8ieWMquwrziK2tRZjstyjs0Fv0Zvaf/Iyj7+9F2p/LM0cKEUVHSLlvKxmZcvY9v40O6UniVdrVpEROm5B+1hiwODpxtpVwovlttioqAkqUagztbUz2qHik/B2EoXm1W6ICw+ahlhilHlGzPJGtgYksWXigqY3cGgNCbUJ2c8n8F/8C3uS4tDT63MUAAAAASUVORK5CYII=","aspectRatio":1,"src":"/static/6fa610f8862c87b1846b866a818c88df/46604/arduino.png","srcSet":"/static/6fa610f8862c87b1846b866a818c88df/62d80/arduino.png 125w,\n/static/6fa610f8862c87b1846b866a818c88df/e1953/arduino.png 250w,\n/static/6fa610f8862c87b1846b866a818c88df/46604/arduino.png 500w,\n/static/6fa610f8862c87b1846b866a818c88df/d8815/arduino.png 750w,\n/static/6fa610f8862c87b1846b866a818c88df/31987/arduino.png 1000w,\n/static/6fa610f8862c87b1846b866a818c88df/f3583/arduino.png 1200w","sizes":"(max-width: 500px) 100vw, 500px"}}},"categories":["아두이노","임베디드"]},"rawMarkdownBody":"\n# 아두이노 스마트 쓰레기통\n\n일상생활에서 가장 많이 사용하는 쓰레기통은 매우 중요한 용도를 가지고 있습니다. 하지만 쓰레기통이 너무 지저분하거나 차있어서 쓰레기를 버리는 것이 불편한 경우가 있습니다. 이러한 문제점을 해결하기 위해 아두이노를 이용한 스마트 쓰레기통을 만들어보았습니다.\n\n### 프로젝트 내용\n\n이 스마트 쓰레기통은 다음과 같은 기능을 가지고 있습니다.\n\n1. 움직임을 감지하는 센서를 이용하여 자동으로 열립니다.\n2. 초음파 센서를 이용하여 쓰레기통 안에 쓰레기가 얼마나 차있는지 감지합니다.\n3. 쓰레기통이 어느 정도 차면 LED와 부저를 이용하여 알립니다.\n\n### 프로젝트 목적\n\n이 스마트 쓰레기통을 만들기 위한 목적은 다음과 같습니다.\n\n1. 양손에 쓰레기를 들고 있을 때 손으로 쓰레기통을 열기 힘든 경우를 해결합니다.\n2. 지저분한 쓰레기통에 손을 닿지 않고 쓰레기를 버릴 수 있습니다.\n3. 쓰레기통이 너무 차서 더 이상 쓰레기를 넣을 수 없는 경우를 방지합니다.\n\n## 차별화 내용\n\n이 스마트 쓰레기통의 차별화된 기능은 쓰레기통이 어느 정도 차면 소리가 나게 한다는 점입니다. 이 기능은 LED와 부저를 이용하여 쓰레기통이 어느 정도 찼는지 알려주므로 쓰레기통이 넘치지 않도록 미리 비울 수 있습니다.\n\n### 기대 효과\n\n이 스마트 쓰레기통의 가장 큰 기대 효과는 손이 쓰레기통에 닿지 않고도 쓰레기를 버릴 수 있다는 것입니다. 이 기능은 특히 현재 코로나19 상황에서 매우 중요한 역할을 합니다. 또한 쓰레기통이 너무 차지 않도록 미리 비워서 쓰레기가 넘치지 않게 할 수 있으므로 환경보호에도 기여할 수 있습니다.\n\n![](https://velog.velcdn.com/images/minseok0123/post/9bdc5820-3c97-4f0a-8b4d-ea0d26a2a834/image.png)\n\n![](https://velog.velcdn.com/images/minseok0123/post/8b53aed2-0742-4bee-b76c-750ded87c62c/image.png)\n![](https://velog.velcdn.com/images/minseok0123/post/662f4ebf-25c9-4cf2-9117-327463f8a669/image.png)\n\n## 느낀점\n\n이번 아두이노 스마트 쓰레기통 프로젝트를 통해 다양한 센서와 모듈을 사용해보고, 센서 데이터를 이용하여 간단한 제어 작업을 구현하는 것에 대해 배울 수 있었습니다. 또한 쓰레기통이라는 일상적인 물건을 IoT 기술을 활용하여 새로운 기능을 추가하고, 더욱 편리하게 사용할 수 있는 것을 경험해볼 수 있어서 재미있었습니다.\n\n이번 프로젝트를 통해 스마트 홈 IoT 시스템 개발에 대한 관심도 생겼습니다. 미래의 스마트 홈 시스템에는 다양한 센서와 기기가 연결되어 사용자의 생활을 더욱 편리하고 안전하게 해줄 것입니다. 앞으로도 이와 관련된 다양한 프로젝트를 경험해보고 더 많은 것을 배워나갈 계획입니다.\n\n### **소스코드**\n\n> [\bGitHub : https://github.com/MinSeok0123/Arduino_Smartbin](https://github.com/MinSeok0123/Arduino_Smartbin)\n"},{"id":"43e5fe65-95f9-5606-bd24-45463e65e210","excerpt":"1. 리액트 프로퍼티 (props)를 사용하는 이유 리액트는 UI 라이브러리로서, 컴포넌트를 사용하여 UI를 구성한다. 이 때, 컴포넌트 간의 데이터 전달을 위해 프로퍼티(Props)를 사용해야한다. 2. 프로퍼티의 특징은 무엇인가? 프로퍼티는 부모 컴포넌트에서 자식 컴포넌트로 전달되는 데이터라서. 이 데이터는 자식 컴포넌트에서 읽기 전용으로 사용된다. 즉, 자식 컴포넌트에서는 해당 데이터를 직접 수정할 수 없다.…","fields":{"slug":"/리액트props/"},"frontmatter":{"title":"리액트 props 사용하는 이유","date":"2023.04.11","thumbnail":{"publicURL":"/static/08313e5f3a1c429de915af9fa1ccfeaa/1.png","childImageSharp":{"fluid":{"base64":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAACXBIWXMAABRNAAAUTQGUyo0vAAADsklEQVR42nWUW0ybZRjHe6vJvJkmExF16pU7aLIL40AHjUBQyCaHcehKC6wHhEkmQWHTRbMME8WbzSAGCURIo5sOh9mAZTjc5sA5xrp2HFrOlB4otI2j7Tj0Z75vFErp3uTL8+XNm9/z/J+TRG2DTZ81gMoGKmsArR0UNpAPe/jMaOFo/wTZo14q3FA+D6qZZfGtevW9JBwmXAatxgHyqUW+7B/FYLHh97j44/rf6PRDfHqymiOlJVRe6RUdaoQgNgFDYFobKKaX+OGuCRYf8nDhARarFb1eT4o0gVeitlFWWYWmb5zDjlVVocBHkT261FoD5Dvhk94B8C3g9fu5ZzDSdbmT+NhYUlJTOdbQgtZgpdC+DhM4kvC8CbbQAUf6JzGMjiMc/+IiI8PDKCsqkTX/Tkn/JMoJP4fDYBElq2ah2Gjnxj+38DhncXs8BI9pbAzVzUEK50Fj2wzbEGEwb7LpZZoMI8yMmLjVdwefzyfClgMB0Z7pvErW4DzFDjbBNkkWqpo/5qXDMATLSyKgtbWVkfHxtSgHBwaQXbqJeg7UMysi7LHAoOTypp+pO3OaiakpWnQ6uhobGe/uFoGuWQfytr/WgbYIRQl6EZo4b3SB+iYdFxsbqKv/EZfbzZLJBHY7Pq+X2rZL7L82gNyygsoRUszwCINAIYdVl3vRD5oYNpvXpJ49f564uDi2xrxITeNPdNrcFBgd69DwCMV2sUHFbTMn+kzk3ndyvPks31SfIidPRkx0NFFRUaKt/76WoTt9KC7eQBWSyw1AoQ3yZwJ83d4Nnjmqv6vliS1PsWWvlCeVZUS/voc3du/ml3O/cu3PLo41NHPAMEuxczVloZKDi0AtzO59JzU9etTlFWx75mmiS6rYerKO5/Ylsf2FGDKzssjLy+Pz07V8a5ykYGppw9hKwreLAM0x/8fBu1b25Cp49uVXeT4+me2v7WTXjh0kJibxblIyJ8qPcqWnF9mQS2y3iDkU/2dW0ArT4oS0Ii3xsXtJeOtNkqUJfJCRSXZuLukZGaQdyqeos4dCy/LjJyVYrQ8dkH57CmmBhvREKfty5byvLCI7LZWDmRkoUlNQHv+CnCGX6DxyY69KF1ZRqdnNoZYLSK5O89FXNZQ1n+O9C9dJK/2Yd3Lk7DpVy4HG31AMzqGZZcO0SCIuV8sSqe3/8lL7Pd7WdSLr6BUnSDbyAKWuDamug9guIyUhsIjANagdtE7Qmt0UDLvW1pQgr8jkRtk3QfFqd6hD5ArA/wFMH9PDxsg+KQAAAABJRU5ErkJggg==","aspectRatio":1,"src":"/static/08313e5f3a1c429de915af9fa1ccfeaa/46604/1.png","srcSet":"/static/08313e5f3a1c429de915af9fa1ccfeaa/62d80/1.png 125w,\n/static/08313e5f3a1c429de915af9fa1ccfeaa/e1953/1.png 250w,\n/static/08313e5f3a1c429de915af9fa1ccfeaa/46604/1.png 500w,\n/static/08313e5f3a1c429de915af9fa1ccfeaa/d8815/1.png 750w,\n/static/08313e5f3a1c429de915af9fa1ccfeaa/31987/1.png 1000w,\n/static/08313e5f3a1c429de915af9fa1ccfeaa/22f13/1.png 2048w","sizes":"(max-width: 500px) 100vw, 500px"}}},"categories":["Web","React"]},"rawMarkdownBody":"\n# 1. 리액트 프로퍼티 (props)를 사용하는 이유\n\n리액트는 UI 라이브러리로서, 컴포넌트를 사용하여 UI를 구성한다. 이 때, 컴포넌트 간의 데이터 전달을 위해 프로퍼티(Props)를 사용해야한다.\n\n# 2. 프로퍼티의 특징은 무엇인가?\n\n프로퍼티는 부모 컴포넌트에서 자식 컴포넌트로 전달되는 데이터라서. 이 데이터는 자식 컴포넌트에서 읽기 전용으로 사용된다. 즉, 자식 컴포넌트에서는 해당 데이터를 직접 수정할 수 없다.\n\n# 3. 프로퍼티 전달방법\n\n프로퍼티는 부모 컴포넌트에서 자식 컴포넌트로 전달될 때 객체 형태로 전달된다. 자식 컴포넌트에서는 이 객체를 받아서 사용할 수 있다. 프로퍼티는 함수형 컴포넌트에서는 함수의 매개변수로, 클래스형 컴포넌트에서는 this.props로 접근할 수 있다.\n\n> 아래는 프로퍼티를 이용하여 부모 컴포넌트에서 자식 컴포넌트로 이름과 나이를 전달하는 코드이다.\n\n_부모 컴포넌트_\n\n```js\nimport React from 'react';\nimport ChildComponent from './ChildComponent';\n\nfunction ParentComponent() {\n return (\n
    \n \n
    \n );\n}\n\nexport default ParentComponent;\n\n```\n\n_자식 컴포넌트_\n\n```js\nimport React from 'react';\n\nfunction ChildComponent(props) {\n const { name, age } = props;\n return (\n
    \n

    Name: {name}

    \n

    Age: {age}

    \n
    \n );\n}\n\nexport default ChildComponent;\n\n```\n\n# 4. 자식 컴포넌트에서 부모 컴포넌트의 상태 변경을 위한 콜백 함수 전달 방법\n\n프로퍼티를 사용하여 자식 컴포넌트에서 부모 컴포넌트의 상태를 변경하고 싶다면, 콜백 함수를 프로퍼티로 전달하여 사용할 수 있다. 이 콜백 함수는 자식 컴포넌트에서 실행되어 부모 컴포넌트의 상태를 변경할 수 있다.\n\n> 부모 컴포넌트에서 자식 컴포넌트에서 실행될 콜백 함수를 만들어 전달하는 코드이다.\n\n_부모 컴포넌트_\n\n```js\nimport React, { useState } from 'react';\nimport ChildComponent from './ChildComponent';\n\nfunction ParentComponent() {\n const [name, setName] = useState('John');\n\n const handleNameChange = (newName) => {\n setName(newName);\n };\n\n return (\n
    \n

    Name: {name}

    \n \n
    \n );\n}\n\nexport default ParentComponent;\n\n```\n\n_자식 컴포넌트_\n\n```js\nimport React, { useState } from 'react';\n\nfunction ChildComponent(props) {\n const [inputName, setInputName] = useState('');\n\n const handleInputChange = (event) => {\n setInputName(event.target.value);\n };\n\n const handleButtonClick = () => {\n props.onNameChange(inputName);\n setInputName('');\n };\n\n return (\n
    \n \n \n
    \n );\n}\n\nexport default ChildComponent;\n\n```\n\n# 5. 프로퍼티를 사용한 컴포넌트 간 데이터 전달의 장점은 무엇인가?\n\n프로퍼티를 사용하면 데이터를 쉽게 공유하고 재사용할 수 있어 코드의 재사용성이 높아지며, 단방향 데이터 흐름으로 인해 데이터 추적이 쉬워지고 디버깅이 쉬워지며, 컴포넌트 간의 의존성이 낮아져 코드 수정이나 유지 보수가 쉬워지며, 가상 DOM을 사용하여 성능을 개선할 수 있다.\n"},{"id":"64d56843-33c8-5cfe-ac7c-1ac3c3d9758f","excerpt":"오버로딩(Over loading) 오버로딩(Over loading) 하나의 이름으로 여러 개의 함수를 만드는 기법 [오버로딩(Over loading)을 사용하는 이유] 함수의 이름 하나로 여러 가지 작업에 대처할 수 있다. (오버로딩이 없을 경우,\n매개변수에 int 형이 들어오는 함수 따로,\ndouble형이 들어오는 함수 따로 만들어줘야 하므로 귀찮다) 오버로딩을 하지 않은 경우 오버로딩을 안한 개판…","fields":{"slug":"/오버로딩(Over loading)/"},"frontmatter":{"title":"오버로딩(Over loading)","date":"2023.11.04","thumbnail":{"publicURL":"/static/100360536dd277293ce19e0f8e301f46/overload.png","childImageSharp":{"fluid":{"base64":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAALCAYAAAB/Ca1DAAAACXBIWXMAAAPoAAAD6AG1e1JrAAABqElEQVR42mWSycoiQRCE+/0fwAdQT4IX8aS4IJ5EUXH9B/d9+cV9X2L4cqhGmIQiq6uiIyMjyzsej3o8Hrrf77peryJyuZyq1artb7ebwOz3ex/HGZFOp9VqtXzc5XKRB4B4v9+WV6uV5vO5SqWS3J0Df+PW67Umk4kKhYKPo6AH+PP52AF5uVzavl6vK5VKabfb6fV66XQ6yQX/jEYj23e7Xc1mM7+YBysBIJlMKpPJKJFIWA6FQvYDQKew1+uZKiygk2azqWw2q81mo+l0Kg/24XCoeDyuQCCgcrlsbReLRUUiEXU6HWuFgoPBQNFoVLFYTNvtVvl8XuFwWMFgUJVK5R8hVaiOJxzQ2ng8NiIWSlAIIUMDBzGEeIgYunCdeqhBJcQA8A5ipler1XyzwSwWC8sscOR2u20DdN56z+fTPpgUQ6Hi4XBQv983pQTK3CTJKEYl3eApAvwpu7f3HRDhj7uj8vl8/g9HUXC8Ap+QiuvfX1MGEYuLbwIw+MyTwhY8c8/JTZ+gW1MICM/+/PyoXKkYIe0DoD0w38NqNBomwL09cJBT+C8ZPjekU6DqXwAAAABJRU5ErkJggg==","aspectRatio":1.8115942028985508,"src":"/static/100360536dd277293ce19e0f8e301f46/46604/overload.png","srcSet":"/static/100360536dd277293ce19e0f8e301f46/62d80/overload.png 125w,\n/static/100360536dd277293ce19e0f8e301f46/e1953/overload.png 250w,\n/static/100360536dd277293ce19e0f8e301f46/46604/overload.png 500w,\n/static/100360536dd277293ce19e0f8e301f46/d8815/overload.png 750w,\n/static/100360536dd277293ce19e0f8e301f46/14a87/overload.png 813w","sizes":"(max-width: 500px) 100vw, 500px"}}},"categories":["C샵"]},"rawMarkdownBody":"\n\n# 오버로딩(Over loading)\n\n> **오버로딩(Over loading)**\n하나의 이름으로 여러 개의 함수를 만드는 기법\n\n## [오버로딩(Over loading)을 사용하는 이유]\n\n**함수**의 이름 **하나**로 **여러 가지 작업**에 대처할 수 있다.\n\n(오버로딩이 없을 경우,\n매개변수에 int 형이 들어오는 함수 따로,\ndouble형이 들어오는 함수 따로 만들어줘야 하므로 귀찮다)\n\n\n\n# 오버로딩을 하지 않은 경우\n\n\n**오버로딩**을 안한 개판 1분전 소스코드\n\n```csharp\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\n\npublic class 스트리머의_하루\n{\n // 무수히 많은 함수들이 존재.\n \n // 후원 관련 함수들\n public int 정기구독받기(int 정기구독)\n {\n return 정기구독;\n }\n\n public int 정기구독_음성도네(int 정기구독, int 음성도네)\n {\n return 정기구독 + 음성도네;\n }\n\n // 새 후원방식이 또 생겨서 (오버로딩을 안쓸 경우 : 별도의 함수 만듬)\n public int 정기구독_음성도네_영상도네받기(int 정기구독, int 음성도네, int 영상도네)\n {\n return 정기구독 + 음성도네 + 영상도네;\n }\n\n // 기타 잡다한 함수들\n public double 택배받기(double 택배) // 2.2kg~\n {\n return 택배;\n }\n\n public string 편지받기(string 편지)\n {\n return 편지;\n }\n}\n\npublic class 오늘수익\n{\n public static void Main(string[] args)\n {\n // 방송 켬\n 스트리머의_하루 getMoney = new 스트리머의_하루();\n\n // 트수들이 후원중\n int 오늘수익 = 0;\n 오늘수익 += getMoney.정기구독받기(5000); // OOO님이 1개월 구독으로 돈을 버리셨습니다.\n 오늘수익 += getMoney.정기구독_음성도네(5000, 1000); // 구독 + 음성도네\n 오늘수익 += getMoney.정기구독_음성도네_영상도네받기(5000, 1000, 20000);\n\n // 수익금 정산\n Console.WriteLine(\"오늘수익 수익: {0}\", 오늘수익);\n }\n}\n```\n\n\n\n그러자 함수가 많아질수록 다른 함수와 섞이고 코드가 지저분해지면서 복잡해졌고,\n결국 스트리머는 **오버로딩**을 이용해서\n**\"모든 후원금을 하나의 함수명\"**으로 관리하기로 결정하게 되었다.\n\n---\n\n# 오버로딩을 한 경우\n\n**오버로딩**을 한 소스코드\n\n```csharp\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\n\npublic class 스트리머의_하루\n{\n // 무수히 많은 함수들이 존재.\n \n // 후원 관련 함수들\n public int 후원받기(int 정기구독)\n {\n return 정기구독;\n }\n\n public int 후원받기(int 정기구독, int 음성도네)\n {\n return 정기구독 + 음성도네;\n }\n\n public int 후원받기(int 정기구독, int 음성도네, int 영상도네)\n {\n return 정기구독 + 음성도네 + 영상도네;\n }\n\n // 기타 잡다한 함수들\n public double 후원받기(double 택배) // 2.2kg~\n {\n return 택배;\n }\n\n public string 후원받기(string 편지)\n {\n return 편지;\n }\n}\n\npublic class 오늘수익\n{\n public static void Main(string[] args)\n {\n // 방송 켬\n 스트리머의_하루 getMoney = new 스트리머의_하루();\n\n // 트수들이 후원중\n int 오늘수익 = 0;\n 오늘수익 += getMoney.후원받기(5000); // OOO님이 1개월 구독으로 돈을 버리셨습니다.\n 오늘수익 += getMoney.후원받기(5000, 1000); // 구독 + 음성도네\n 오늘수익 += getMoney.후원받기(5000, 1000, 20000);\n\n // 집으로 날아온 택배선물\n double 오늘택배 = 0;\n 오늘택배 += getMoney.후원받기(5.5); // 5.5kg의 거대한 선물이 도착했다.\n 오늘택배 += getMoney.후원받기(2.2);\n 오늘택배 += getMoney.후원받기(0, 5);\n\n string 오늘편지 = \"\";\n 오늘편지 += getMoney.후원받기(\"안녕하세요\");\n\n // 하루 종료\n Console.WriteLine(\"오늘수익 : {0}\", 오늘수익);\n Console.WriteLine(\"오늘택배 : {0}\", 오늘택배);\n Console.WriteLine(\"오늘편지 : {0}\", 오늘편지);\n }\n\n}\n```\n---\n\n"},{"id":"9e97a580-a062-59df-97f2-3c7f678aa33a","excerpt":"오버라이딩 상속 받은 것을 그대로 안 쓰고 고쳐서 쓴다 (재정의)\n즉, 아빠가 입던 옷을 물려받은 뒤, 그걸 수선집에서 고쳐서 입는 셈 base 자식 클래스에서 부모 클래스를 가리키는 키워드 앞에서 오버라이딩이란 개념을 살펴봤었다.\n오버라이딩이란, 자식이 부모로부터 아빠옷을 상속받은 뒤 그것을 자신의 몸에 맞게 수선하는 것이다.\n그런데 수선하기 이전의 오리지날 아빠옷을 다시 입어야 하는 경우라면 어떻게 해야 할까? [base…","fields":{"slug":"/오버라이딩/"},"frontmatter":{"title":"오버라이딩","date":"2023.11.08","thumbnail":{"publicURL":"/static/737fda6f7a0bbee8c4f493c3e0eca1d4/overriding.png","childImageSharp":{"fluid":{"base64":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAKCAYAAAC0VX7mAAAACXBIWXMAAA7DAAAOwwHHb6hkAAABBElEQVR42q1SOY6DQBDkFxziPgyCZxDwBd4AARBABBmBQSSWAyQgI+AD/K9WjYQFvjZxUJqZmlJ1dc8wl8sFvwRzPFiW9e/+G3cy3AWmacIwDDiOc8JRt3O2bb8YM89mruvC8zywLAtBEMBx3AZFUTaQbuckSXoU2T0eCamiKIqoqgrzPCNNU8RxjKIokCQJmqZB13VYlgVlWSLLMoRhCFVVt6QvLRMpyzKiKML1ekXbtrjdbhiGAXmeo65rTNOEcRxxv9+xriv6vgfP86eRnFqmldomUFpd16Fp2paCVuJJQ6PwfR9BEHxO+PyqR9GR3+/IaJ/p2xl++wrvQKYfX/mXH/sPgIA5vexqHFcAAAAASUVORK5CYII=","aspectRatio":1.9841269841269842,"src":"/static/737fda6f7a0bbee8c4f493c3e0eca1d4/46604/overriding.png","srcSet":"/static/737fda6f7a0bbee8c4f493c3e0eca1d4/62d80/overriding.png 125w,\n/static/737fda6f7a0bbee8c4f493c3e0eca1d4/e1953/overriding.png 250w,\n/static/737fda6f7a0bbee8c4f493c3e0eca1d4/46604/overriding.png 500w,\n/static/737fda6f7a0bbee8c4f493c3e0eca1d4/3c17d/overriding.png 720w","sizes":"(max-width: 500px) 100vw, 500px"}}},"categories":["C샵"]},"rawMarkdownBody":"\n# 오버라이딩\n\n> 상속 받은 것을 그대로 안 쓰고 고쳐서 쓴다 **(재정의)**\n> 즉, 아빠가 입던 옷을 물려받은 뒤, 그걸 수선집에서 고쳐서 입는 셈\n\n```csharp\nusing System.Configuration;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\n\n\nclass 아버지\n{\n public void 아빠옷()\n {\n // 300개의 함수들\n Console.WriteLine(\"아빠가 입다 버린 구닥다리 옷\");\n }\n}\n\nclass 아들 : 아버지 // 아버지로부터 상속을 받음\n{\n // 아들이 물려받은 뒤 고쳐 쓴 함수들\n new public void 아빠옷() // 오버라이딩 (구별하기 위해 new 키워드를 쓰자)\n {\n Console.WriteLine(\"자식이 아빠 옷을 수선했다\");\n }\n\n // 아들 함수들\n public void 내옷()\n {\n Console.WriteLine(\"자식 전용 옷\");\n }\n}\n\nclass 메인\n{\n public static void Main(string[] args)\n {\n 아들 son = new 아들();\n son.아빠옷();\n son.내옷();\n }\n}\n\n```\n\n---\n\n# base\n\n> **자식 클래스**에서 **부모 클래스**를 가리키는 키워드\n\n앞에서 오버라이딩이란 개념을 살펴봤었다.\n오버라이딩이란, 자식이 부모로부터 아빠옷을 상속받은 뒤 그것을 자신의 몸에 맞게 수선하는 것이다.\n그런데 수선하기 이전의 오리지날 아빠옷을 다시 입어야 하는 경우라면 어떻게 해야 할까?\n\n## [base 사용 예시]\n\n**base**를 사용해서 다시 구닥다리 아빠옷을 입는 아들\n\n```csharp\nusing System;\nusing System.Collections.Generic;\nusing System.Configuration;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\n\n\nclass 아버지\n{\n public void 아빠옷()\n {\n Console.WriteLine(\"아빠의 냄새나는 옛날 옷\");\n }\n}\n\nclass 아들 : 아버지\n{\n new public void 아빠옷()\n {\n Console.WriteLine(\"아들이 고쳐 씀\");\n }\n\n public void 돈없는_아들()\n {\n base.아빠옷(); // 아빠 클래스에 있는 함수가 호출 됨\n 아빠옷(); // 아들 클레스에 있는 오버라이딩 된 함수가 호출 됨\n }\n}\n\nclass 메인\n{\n public static void Main(string[] args)\n {\n 아들 son = new 아들();\n son.돈없는_아들();\n }\n}\n```\n\n---\n\n### 또한 **부모클래스**의 생성자 함수가 **매개변수**를 받아야 하는 상황일 경우\n\n상속받는 **자식클래스**는 반드시 **부모클래스**의 **매개변수**에 값을 전달해줘야 한다.\n\n**자식 클래스**가 호출되면 **부모 클래스**도 덩달아 같이 호출이 되는데\n**부모 클래스**의 생성자의 **매개변수**에 값을 전달하지 않는다면 에러가 발생한다.\n이때 **base**를 통해 부모 클래스의 생성자에 값을 전달할 수 있다.\n\n```csharp\nusing System;\nusing System.Collections.Generic;\nusing System.Configuration;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\n\n\nclass 아버지\n{\n //생성자 함수 (아빠라는 형태의 객체가 메모리에 할당되면 가장 먼저 호출되는 함수)\n public 아버지(String father)\n {\n Console.WriteLine(\"1. 아빠 생성자 생성 : {0}\", father);\n }\n}\n\nclass 아들 : 아버지\n{\n public 아들(String son) : base(son)\n {\n Console.WriteLine(\"2. 아들 생성자 생성: {0}\", son);\n }\n}\n\nclass 메인\n{\n public static void Main(string[] args)\n {\n 아들 son = new 아들(\"아들에게 준 값\");\n }\n}\n```\n"},{"id":"5e14b0de-fa04-5b11-b85e-d69481986148","excerpt":"추상클래스 vs 인터페이스 차이 C 같은 절차지향 언어 : 클래스x (함수 혼자 놈)\nJAVA, C…","fields":{"slug":"/추상클래스 vs 인터페이스 차이/"},"frontmatter":{"title":"추상클래스 vs 인터페이스 차이","date":"2023.11.09","thumbnail":{"publicURL":"/static/57433fedf2afff74919acccd97c9a65d/ClassAndInterface.png","childImageSharp":{"fluid":{"base64":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAALCAYAAAB/Ca1DAAAACXBIWXMAAAsTAAALEwEAmpwYAAACFUlEQVR42nWTTU8TURSG+UmoIB+hUxI3/gZ2yMqlS7e6dOHCnZK4coMgRmMohEBoC6U40+8PKdUAip2pCYV25t6Z6cw8pjOR8OXiybnn3Nw377nn3iFKMYJiDEoKfm4Sb28ELztMoA5DYcAdKNyFwr2I4ggURyNK40TnlTAONIbCpBzH18bo5V8iTrYRh5+xfixhHbzD2p9H1F8hqi8Q5WfI0lNk4Qky/xiRmcHTlEuilwS97Ajd/QR9wPUjpAO2ewknQkofF9CLx7Q/zEB9gqAQv+bw6yin5UUs26fXPeX87BTXkUhpYVk9hGViWSZCWNhS4NHHKP2ktTAH38auCgblOOQmaG69IbGeZDXxheXlJdLpFInECvl8Dk1TWV9fY3Nzg3QqSa6k8Uv7jrE0B/Wxmw69vVHOax/pCp+20aLT6WCaZkiz2URVVRqNBgcHDWq1Kke/j8OW9fePbjr8J9itL9MPoO9IXMfBsW1cx8bsdcOWhRCYvV6YO56NUTxCX7xNsBKnnx04jIbieD5uwAWDWjgsz8UbrAMIgHbVoLXwH4e+dh9j9Tl6dg89s4W+m0LPJKO4s0k7l+fspENrZxsjm6Stpjla2eDPp9mrd3jxhsoxPHUCmVKw03HstBKRiuPsxOiuPaDx9jWH87P0d8eRYX0aPz99yzu8EFWgGoPKdRSoTeJkphCph1CZgqoS7V37KX8B0nfaLAxpFLUAAAAASUVORK5CYII=","aspectRatio":1.7857142857142858,"src":"/static/57433fedf2afff74919acccd97c9a65d/46604/ClassAndInterface.png","srcSet":"/static/57433fedf2afff74919acccd97c9a65d/62d80/ClassAndInterface.png 125w,\n/static/57433fedf2afff74919acccd97c9a65d/e1953/ClassAndInterface.png 250w,\n/static/57433fedf2afff74919acccd97c9a65d/46604/ClassAndInterface.png 500w,\n/static/57433fedf2afff74919acccd97c9a65d/d8815/ClassAndInterface.png 750w,\n/static/57433fedf2afff74919acccd97c9a65d/ee604/ClassAndInterface.png 800w","sizes":"(max-width: 500px) 100vw, 500px"}}},"categories":["C샵"]},"rawMarkdownBody":"\n# 추상클래스 vs 인터페이스 차이\n\n> C 같은 절차지향 언어 : 클래스x (함수 혼자 놈)\n> JAVA, C# 같은 객체지향 언어 : 클래스 안에 함수\n\n## 추상 함수 (추상 메소드)\n\n- 클래스에 속한 함수가 구현이 되어있지 않을 경우\n- 즉, 머리만 있고 몸통은 없으므로 이를 상속받는 자식 클래스는\n 반드시 오버라이딩해서 기능을 추가해서 써야 한다.\n- 만약 오버라이딩을 하지 않을 경우, 에러가 발생하므로\n 반드시 그 함수를 구현하도록 강제한다.\n\n### 추상 클래스 (Abstract Class)\n\n구현이 안 되어 있고 선언만 한 추상 함수(추상 메소드)를 1개라도 포함하고 있어야 한다.\n참고로 메소드라는 단어는 '클래스 안에 포함된 함수'를 뜻하는 말인데,\n함수든 메소드든 거의 같은 뜻으로 쓰인다.\n\n추상 함수를 대체 왜 쓰는 걸까? -> 설계 (구현 안하면 에러뜨게 해서 강제로 구현하게 한다)\n\n```csharp\nusing System;\nusing System.Collections.Generic;\nusing System.Configuration;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\n\n\nabstract class 직업\n{\n // 고쳐서 써야 하는 일반함수 -> 추상함수로 수정\n public abstract void 공격스킬();\n\n // 고쳐서 써야 하는 일반함수 : 일반함수로 선언시, 개발자가 깜빡하고 구현 안할 수도 있다.\n public abstract void 방어스킬();\n\n\n // 일반변수\n int hp = 100;\n int mp = 100;\n\n // 일반함수\n public void 공통스킬()\n {\n\n }\n\n public void 공통능력치()\n {\n\n }\n}\n\nclass 마법사 : 직업\n{\n // new public void 공격스킬() new : 일반함수를 오버라이딩\n // 추상함수를 오버라이딩 :\n public override void 공격스킬()\n {\n Console.WriteLine(\"자식이 부모꺼 오버라이딩해서 고쳐 씀\");\n }\n\n public override void 방어스킬()\n {\n Console.WriteLine(\"자식이 부모꺼 오버라이딩해서 고쳐 씀\");\n }\n}\n\nclass AbstractTestMain\n{\n public static void Main(string[] args)\n {\n 마법사 wizard = new 마법사();\n //wizard.공통능력치();\n //wizard.공통스킬();\n wizard.방어스킬();\n wizard.공격스킬();\n }\n}\n```\n\n---\n\n## [추상클래스의 문제점] : 다중 상속을 할 수 없다.\n\n**[C#이 다중 상속을 금지하는 이유]**\n\n> 만약 아버지A 클래스에 [say]라는 함수가 있고,\n> 만약 아버지B 클래스에 [say]라는 똑같은 이름의 함수가 있을 때,\n> 아들 객체가 두개 다 상속받으면 같은 이름의 함수가 2개가 들어오는 문제가 발생한다.\n\n만약 이런 상황에서 아들 객체가 say()를 호출하면\n아버지A의 say()를 호출해야 할지, 아니면\n아버지B의 say()를 호출해야 할지 모호해진다.\n\n```csharp\nusing System;\nusing System.Collections.Generic;\nusing System.Configuration;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\n\n\nabstract class 아버지A\n{\n public abstract void Say();\n\n}\n\nabstract class 아버지B\n{\n abstract public void Say();\n}\n\nclass 아들 : 아버지A//, 아버지B\n{\n public override void Say()\n {\n Console.WriteLine(\"돌 굴러가유~\");\n }\n}\n\n\nclass 메인\n{\n public static void Main(string[] args)\n {\n 아들 son = new 아들();\n son.Say(); // 모호한 상황\n }\n}\n```\n\n---\n\n## 인터페이스\n\n> 그래서 다중상속을 받을 수 있도록 하기 위해 탄생한 것이 인터페이스이다.\n> 인터페이스는 추상클래스와는 달리, 절대로 일반변수와 일반함수를 선언할 수 없다.\n\n즉 모든 함수가 **\"텅 빈\"** 빈 껍데기 추상함수로만 구성되어 있다.\n따라서 중복이 되더라도 프로그램이 충돌하지 않는다.\n(아무런 구현이 되어 있지 않으므로)\n\n```csharp\nusing System;\nusing System.Collections.Generic;\nusing System.Configuration;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\n\n\n// 인터페이스 여러개\ninterface 마법사_파이어볼\n{\n // 인터페이스 : 어차피 추상함수들 밖에 없으므로 abstract 키워드를 굳이 안붙여도 된다.\n void FireBall();\n}\n\ninterface 마법사의무기\n{\n // 추상함수들\n void 몽둥이찜질();\n void 마나(); // 실수로 이름이 같은 함수를 또 넣었네\n}\n\ninterface 마법사의대사\n{\n void Magic();\n void 마나(); // 실수로 이름이 같은 함수를 또 넣었네 (근데 어차피 구현안된 빈 껍데기라서 충돌되지 않음)\n}\n\nclass 마법사 : 마법사_파이어볼, 마법사의대사, 마법사의무기\n{\n // 인터페이스 오버라이딩\n\n public void FireBall()\n {\n Console.WriteLine(\"파이어 볼\");\n }\n public void 몽둥이찜질()\n {\n Console.WriteLine(\"몽둥이로 팬다\");\n }\n public void 마나() // 인터페이스 안에 있는 마나 추상함수는 중복이 되도 문제 X\n {\n Console.WriteLine(\"마나가 없어\");\n }\n public void Magic()\n {\n Console.WriteLine(\"매직\");\n }\n\n}\n\n\nclass 메인\n{\n public static void Main(string[] args)\n {\n 마법사 Wizard = new 마법사();\n Wizard.몽둥이찜질();\n Wizard.FireBall();\n Wizard.마나();\n Wizard.Magic();\n }\n}\n```\n\n---\n"},{"id":"7877535f-6779-5a18-a66f-3ee1f24336a7","excerpt":"업캐스팅의 유용함 업캐스팅 특정 객체가 하위 클래스의 형에서 상위의 클래스형으로 캐스팅 되는 것\n하나의 매개변수의 형으로 여러 형을 받아줄 수 있다. [만약 C…","fields":{"slug":"/업캐스팅의 유용함/"},"frontmatter":{"title":"업캐스팅의 유용함","date":"2023.11.10","thumbnail":{"publicURL":"/static/93c42ad9de9f5e732db1f8116216354a/upcasting.png","childImageSharp":{"fluid":{"base64":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAASCAYAAABb0P4QAAAACXBIWXMAAAsTAAALEwEAmpwYAAACu0lEQVR42qVUy47jNhD0XyQjUnxTlChKsmzJkuEZeweLzSFYJIcAueT/v6OCpmzvzB6TQ6HVBFns7ipqN51OiOdv8IcrbHuAsgGuW1AdbjCxQ7gs8G8r/GWGNBqiLCGEQFmWTzxyiruUWvR9h+LlBSVn9018A2eQtJkzcMZQFAU453kPrWsloeSd/E66CyHAGJMX/HiB37/CdTN0aOH6Fa47wewvGOcTvn//Heu6QGuN4C3+uK747TzBOfesfJdSyhUyzqF9gDRugzJb1BbK1dDWoq5rOGefFVXWZCi9jYLWdsRONzLGwRi1xD7MZ2uvpDY5z5fyeyUEav8xAiIj0h0lsQ6wWqHyHs5acFag5MVGVLAt0iHGNhTFU4QnHhXGGHE435CmC5puhA8NlI8w9QDpPMy+gwoeSiroLm7oE6RRnxR/EO+O04x2eYduZ6iQILSFjWMWRFc1musZduyglYaeBphpD3s6QliNgrFPtskqN02D1DYofv0FQsosghAyz5Jiyck2JZRSMEJB8q11oxTa4KCl/Fwh2YZEEVIhTDf48RXVsMDGAW44w9H3eMXxvOLvf/7C9f0t7/fO4LJPiHUDpX6QPn0opcQ8z2hixDDskbrurqjMlwkpYJyG0urZHqn+qOxJSCSbsSXq+Quq4w1+v0KHBD++wfYrpuWI99uEr19fMY6HbCcaz89k4qEytWCsQdv14CVZQKJkPEdBuZB5hnSQ8xJFwbJvKS/u8eHH3LK1NrPr+yGyhl0OsPMI1Scc5x7ndcByGjDNHeZlj8NhwHlI+PO6YO5btG0LIcofohCaps43qVBtfosNZKgQ2xpdCkipzmhTjbqu0HiHpW9ROQvioR9Gto3WJivlvdtKJzxeBT05+tOwLbKPkXO8FOzTE9zF2ORHzz6Y9P9g17Yx90+EPyv2Xwj/BQHC/Q5/875DAAAAAElFTkSuQmCC","aspectRatio":1.0964912280701755,"src":"/static/93c42ad9de9f5e732db1f8116216354a/994e1/upcasting.png","srcSet":"/static/93c42ad9de9f5e732db1f8116216354a/62d80/upcasting.png 125w,\n/static/93c42ad9de9f5e732db1f8116216354a/e1953/upcasting.png 250w,\n/static/93c42ad9de9f5e732db1f8116216354a/994e1/upcasting.png 288w","sizes":"(max-width: 288px) 100vw, 288px"}}},"categories":["C샵"]},"rawMarkdownBody":"\n# 업캐스팅의 유용함\n\n## 업캐스팅\n\n> 특정 객체가 **하위 클래스**의 형에서 **상위의 클래스형**으로 캐스팅 되는 것\n> 하나의 **매개변수**의 형으로 여러 형을 받아줄 수 있다.\n\n### [만약 C#이 업캐스팅 문법을 지원하지 않을 때 생기는 문제점]\n\n새로운 **하위 클래스**를 만들 때 마다\n**'동물병원 클래스'** 안에도 그 **하위클래스**에 맞는 **'환자추가 함수'** 를 새로 만들어야 한다.\n\n# 업캐스팅을 하지 않았을 때 생기는 불편함\n\n```csharp\nusing System;\nusing System.Collections.Generic;\nusing System.Configuration;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\n\n // 상위클래스\npublic class Animal\n{\n\n}\n\npublic class Dog : Animal\n{\n\n}\n\npublic class Cat : Animal\n{\n\n}\n\npublic class Rabbit : Animal\n{\n\n}\n\npublic class 동물1 : Animal\n{\n\n}\npublic class 동물2 : Animal\n{\n\n}\npublic class 동물3 : Animal\n{\n\n}\n\n\nclass 동물병원\n{\n public void 진료(Dog ani)\n {\n Console.WriteLine(\"환자 도착 : \" + ani);\n }\n\n public void 진료(Cat ani)\n {\n Console.WriteLine(\"환자 도착 : \" + ani);\n }\n\n public void 진료(Rabbit ani)\n {\n Console.WriteLine(\"환자 도착 : \" + ani);\n }\n}\n\nclass main\n{\n public static void Main(string[] args)\n {\n Dog d = new Dog();\n Cat c = new Cat();\n Rabbit r = new Rabbit();\n\n // 이후 소문듣고 몰려온 새 환자들\n 동물1 a1 = new 동물1();\n 동물2 a2 = new 동물2();\n 동물3 a3 = new 동물3();\n\n 동물병원 hospital = new 동물병원();\n hospital.진료(d);\n hospital.진료(c);\n hospital.진료(r);\n\n //hospital.진료(a1);\n //hospital.진료(a2);\n //hospital.진료(a3);\n }\n}\n```\n\n그래서 열받은 병원장은 **업캐스팅**을 사용해서\n새로운 **하위클래스**가 추가되더라고 더이상\n동물병원 클래스를 고칠 필요가 없도록 수정하였다.\n\n---\n\n# 업캐스팅을 한 경우\n\n```csharp\nusing System;\nusing System.Collections.Generic;\nusing System.Configuration;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\n\n // 상위클래스\npublic class Animal\n{\n\n}\n\npublic class Dog : Animal\n{\n\n}\n\npublic class Cat : Animal\n{\n\n}\n\npublic class Rabbit : Animal\n{\n\n}\n\npublic class 동물1 : Animal\n{\n\n}\npublic class 동물2 : Animal\n{\n\n}\npublic class 동물3 : Animal\n{\n\n}\n\n\nclass 동물병원\n{\n public void 진료(Animal ani)\n {\n Console.WriteLine(\"환자 도착 : \" + ani);\n }\n\n}\n\nclass main\n{\n public static void Main(string[] args)\n {\n Dog d = new Dog();\n Cat c = new Cat();\n Rabbit r = new Rabbit();\n\n // 이후 소문듣고 몰려온 새 환자들\n 동물1 a1 = new 동물1();\n 동물2 a2 = new 동물2();\n 동물3 a3 = new 동물3();\n\n 동물병원 hospital = new 동물병원();\n hospital.진료(d);\n hospital.진료(c);\n hospital.진료(r);\n\n hospital.진료(a1);\n hospital.진료(a2);\n hospital.진료(a3);\n }\n}\n```\n\n---\n\n## 인터페이스와 추상클래스의 업캐스팅 차이\n\n```csharp\nusing System;\nusing System.Collections.Generic;\nusing System.Configuration;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\n\n// 인터페이스\npublic interface 인터페이스\n{\n void 추상함수1(); // abstract를 굳이 안 붙인다 (어차피 100% 추상함수밖에 없으므로)\n}\n\n// 추상클래스\npublic abstract class 추상클래스\n{\n // 추상함수\n public abstract void 추상함수2();\n\n // 일반함수도 존재할 수 있다\n}\n\npublic class 하위클래스 : 추상클래스, 인터페이스\n{\n public void 추상함수1()\n {\n Console.WriteLine(\"인터페이스에 있던 추상함수\");\n }\n\n public override void 추상함수2()\n {\n Console.WriteLine(\"추상클래스에 있던 추상함수\");\n }\n}\n\npublic class TestMain\n{\n public static void Main(string[] args)\n {\n 하위클래스 하위 = new 하위클래스();\n\n // 1. 인터페이스의 업캐스팅 예시\n 인터페이스 up1 = 하위; // 인터페이스 : 상위클래스\n up1.추상함수1();\n\n // 2. 추상클래스의 업캐스팅 예시\n 추상클래스 up2 = 하위; // 추상클래스 : 상위클래스\n up2.추상함수2();\n\n }\n}\n```\n\n---\n"},{"id":"6b7fb6ac-4bc9-51c9-925a-355ffd1abe96","excerpt":"콜바이밸류 vs 콜바이레퍼런스 ref와 out 차이 Call by value (값에 의한 전달) : 값만 보내니, 보낸 값을 아무리 바꿔도 원본 값은 안 바뀐다. Call by reference (참조에 의한 전달) : 원본 값의 주소를 보내니, 값을 바꾸면 원본도 바뀐다. 1. 콜바이밸류 (Call by value) 원본값이 바뀌지 않아서 아들은 콜바이레퍼런스 방식으로 주소를 전달하도록 함수를 수정하였다. 2. 콜바이레퍼런스 (Call by…","fields":{"slug":"/콜바이밸류 vs 콜바이레퍼런스 ref와 out 차이/"},"frontmatter":{"title":"콜바이밸류 vs 콜바이레퍼런스 ref와 out 차이","date":"2023.10.31","thumbnail":{"publicURL":"/static/9c5b3d213876b2e211193f074ae31d84/callbyvaluevscallbyrefrence.png","childImageSharp":{"fluid":{"base64":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAGCAIAAABM9SnKAAAACXBIWXMAAAPoAAAD6AG1e1JrAAABM0lEQVR42mP4DwO/f37+dbnu/5/v/3GAW/f/Xbv9G1mE4feVhl8XSn+dzfp5Mv7rWoEfO/X/vj35////79++v3379tevX//////79//STX/dEn5X9fycuODP1CV/Z634++zlX4bvazi+r+P7sV3rxza1Hzu0v68X/L6W+9el6qNHDq1bu3bTps0v3/zLb/oTnP07pfJPUgUIxZX8cYr5feL8L7Dm9QI/91r/2GP2c5/tj40S39ZwvTyU+/rVi8ePH1+8ePHxs2+Z1e9Csn8nlv9JKPsTVfg7qvC3U8zvY2d/MbzYFfp8u9/zrR7PNzt+WSPwfr3Sm9vb/v37h+y3X79+LV772iPxW2XX2+mLXy9Y/Xrl5tcvX/9ggKv48/vHi/3JXz+9whVgd+5/vHT9K3KAAQCrzSIrjusUMAAAAABJRU5ErkJggg==","aspectRatio":3.5714285714285716,"src":"/static/9c5b3d213876b2e211193f074ae31d84/46604/callbyvaluevscallbyrefrence.png","srcSet":"/static/9c5b3d213876b2e211193f074ae31d84/62d80/callbyvaluevscallbyrefrence.png 125w,\n/static/9c5b3d213876b2e211193f074ae31d84/e1953/callbyvaluevscallbyrefrence.png 250w,\n/static/9c5b3d213876b2e211193f074ae31d84/46604/callbyvaluevscallbyrefrence.png 500w,\n/static/9c5b3d213876b2e211193f074ae31d84/45a45/callbyvaluevscallbyrefrence.png 601w","sizes":"(max-width: 500px) 100vw, 500px"}}},"categories":["C샵"]},"rawMarkdownBody":"\n# 콜바이밸류 vs 콜바이레퍼런스 ref와 out 차이\n\n> 1. **Call by value (값에 의한 전달)** : 값만 보내니, 보낸 값을 아무리 바꿔도 원본 값은 안 바뀐다.\n> 2. **Call by reference (참조에 의한 전달)** : 원본 값의 주소를 보내니, 값을 바꾸면 원본도 바뀐다.\n\n## 1. 콜바이밸류 (Call by value)\n\n```csharp\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\n\n\n\nclass 바꿔치기\n{\n public void Change(int 위스키남은양)\n {\n int 맥주 = 1000;\n 위스키남은양 = 맥주;\n }\n}\n\nclass 불속성효자\n{\n public static void Main(string[] args)\n {\n int 위스키남은양 = 0; //아빠의 위스키를 다 먹은 상황\n\n 바꿔치기 change = new 바꿔치기();\n change.Change(위스키남은양);\n Console.WriteLine(\"위스키 남은양 : \" + 위스키남은양);\n }\n}\n```\n\n---\n\n원본값이 바뀌지 않아서 아들은 콜바이레퍼런스 방식으로 주소를 전달하도록 함수를 수정하였다.\n\n## 2. 콜바이레퍼런스 (Call by reference)\n\n```csharp\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\n\n\n\nclass 바꿔치기\n{\n public void Change(ref int 위스키남은양) // 주소값을 받음\n {\n int 맥주 = 1000;\n 위스키남은양 = 맥주;\n }\n}\n\nclass 불속성효자\n{\n public static void Main(string[] args)\n {\n int 위스키남은양 = 0; //아빠의 위스키를 다 먹은 상황\n\n 바꿔치기 change = new 바꿔치기();\n change.Change(ref 위스키남은양); // 주소값을 보냄\n Console.WriteLine(\"위스키 남은양 : \" + 위스키남은양);\n }\n}\n```\n\n---\n\n### C#의 Call by reference 방식은 ref 외에도 out도 존재한다.\n\n## ref와 out의 차이\n\n**ref** : ref는 함수 외부 -> 함수 내부로 주소를 전달할 때 사용하는 참조 키워드\n**out** : out은 함수 내부 -> 함수 외부로 주소가 나갈 때 사용하는 참조 키워드\n\n> - 따라서 ref 변수는 반드시 초기화가 필요하다\n> -> 초기화를 하지 않으면 쓰래기 값이 함수 내부로 전달 됨(오류 발생)\n\n### ref예제\n\n```csharp\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\n\n\nclass Call\n{\n static void 함수내부(ref int x)\n {\n x = 1234;\n }\n\n\n public static void Main(string[] args)\n {\n int x1 = 0; // 변수를 초기화 함\n 함수내부(ref x1);\n Console.WriteLine(x1);\n }\n}\n```\n\n---\n\n### out예제\n\n```csharp\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\n\n\nclass Call\n{\n static void 함수내부(out int x)\n {\n x = 1234;\n }\n\n\n public static void Main(string[] args)\n {\n int x1; // 변수를 초기화 하지 않음\n 함수내부(out x1);\n Console.WriteLine(x1);\n }\n}\n```\n\n---\n"},{"id":"aa0169f6-77cb-5507-b2e0-4418d1075102","excerpt":"순차탐색알고리즘 리스트 안에 있는 특정한 데이터를 찾기 위해 앞에서부터 데이터를 하나씩 차례대로 확인하는 방법 주로, 정렬되지 않는 리스트에서 데이터를 하나씩 차례대로 확인하는 방법 리스트 내에 데이터가 아무리 많아도 시간만 충분하다면 항상 원하는 원소(데이터)를 찾을 수 있다는 장점 리스트에 특정 원소가 있는 지 체크할 경우, 리스트에서 특정한 값을 가지는 원소의 개수를 세는 count…","fields":{"slug":"/탐색알고리즘/"},"frontmatter":{"title":"탐색알고리즘","date":"2023.06.17","thumbnail":{"publicURL":"/static/3f7fbd3be95364da1f101e9494b3be1c/탐색알고리즘.png","childImageSharp":{"fluid":{"base64":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAMCAIAAADtbgqsAAAACXBIWXMAAAPoAAAD6AG1e1JrAAACj0lEQVR42iXLyVLaAACA4TxWZ3rqph60LghioUhkUYmEsBMSsy8IJqABkwCRJSxZgYp9vw7Tme/wX35gUM0vmZon1pdUyeVq/+0aZdX7SuUskzpIYhGoX0DrUejqIET9juVD4dDeRWjvAnA42ibqPsf4Ir1RWl5HfO8r75q87b1+DKcz9knI0wbbHDKPTJlSCYaPg+DRbg5+CQJzEl01+LXIewLuiLgrN3yl6b00HZm3202HkWy5o+NC5QqZ4JJcJC/3Q4GvwfPvwdPPAcCiaYsillTJ4bF1S/QE3BKp9UBdG5qnKZ6i2E15wUlLVpIu8/fn0VwAvPkWzR1F0EAEsHBaLyI9ufM2WgwNc/I2Gw8NQ9PGurrUB+bryNUX78/mVlv87Zvb1/FHZ94tSNc/ArH9ILBtd3y26Uqy/7SzUhT3SfSaDbtBe3J7wbccTl5Jio0/ug/SCBXwCPLr4Prw02lkLwRsHlseL7iC6Lbamxdl01P9Rsdvd1fdV0/V7SfNFntLtDEjeQNn5RKGJrLx42T+LKxmEoDNMi7JurTgc8IfpjVDSKfG6Zm8UaxMSrhdEOcQ6eb5SbHqkMS6QToEMy8RffhWg9KARTIOtZsnpaKWQBb3zBKhpjCm3uY0MGdBjIMIoxziUqTL1tdYw80JRgJNHV6mfoYBE8VNFLdwWonBnXBOj5YHyeogXdPi1UkMd4vCJPOgIXfzKjqBUAfmxiAmRjLZkzAciAIqjIzKdS1dpo9vxAA0vsO0eLkLIv1U9S32MMoS0yJhoYxT4xyEm91hAwR+hlJGDhmlUaCVvNXvS+hJvHAYn2cpI4H24qUuWBCC2eENpt/UTJiaQoQF0/P0wwgqL/GaX+FMkDBB/B+NUXKz7GaGwwAAAABJRU5ErkJggg==","aspectRatio":1.6025641025641026,"src":"/static/3f7fbd3be95364da1f101e9494b3be1c/46604/%ED%83%90%EC%83%89%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98.png","srcSet":"/static/3f7fbd3be95364da1f101e9494b3be1c/62d80/%ED%83%90%EC%83%89%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98.png 125w,\n/static/3f7fbd3be95364da1f101e9494b3be1c/e1953/%ED%83%90%EC%83%89%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98.png 250w,\n/static/3f7fbd3be95364da1f101e9494b3be1c/46604/%ED%83%90%EC%83%89%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98.png 500w,\n/static/3f7fbd3be95364da1f101e9494b3be1c/d8815/%ED%83%90%EC%83%89%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98.png 750w,\n/static/3f7fbd3be95364da1f101e9494b3be1c/31987/%ED%83%90%EC%83%89%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98.png 1000w,\n/static/3f7fbd3be95364da1f101e9494b3be1c/e4d72/%ED%83%90%EC%83%89%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98.png 1280w","sizes":"(max-width: 500px) 100vw, 500px"}}},"categories":["알고리즘","Python"]},"rawMarkdownBody":"\n# 순차탐색알고리즘\n\n리스트 안에 있는 특정한 데이터를 찾기 위해 앞에서부터 데이터를 하나씩 차례대로 확인하는 방법\n\n- 주로, 정렬되지 않는 리스트에서 데이터를 하나씩 차례대로 확인하는 방법\n- 리스트 내에 데이터가 아무리 많아도 시간만 충분하다면 항상 원하는 원소(데이터)를 찾을 수 있다는 장점\n- 리스트에 특정 원소가 있는 지 체크할 경우, 리스트에서 특정한 값을 가지는 원소의 개수를 세는 count() 메서드 이용할 경우\n\n```python\n#순차 탐색 코드\n\ndef sequentail_search(n,target,array):\n #각 원소를 하나씩 확인하며\n for i in range(n):\n #현재의 원소가 찾고자 하는 원소가 동일한 경우\n if array[i] == target:\n return i+1 #현재의 위치 변환(인덱스는 0부터 시작하므로 1더하기)\n\nprint('생성할 원소 개수를 입력한 다음 한 칸 띄고 찾을 문자열을 입력하세요.')\ninput_data = input().split()\nn = int(input_data[0]) #원소의 개수\ntarget = input_data[1] #찾고자 하는 문자열\n\nprint('앞서 적은 원소 개수만큼 문자열을 입력하세요. 구분은 띄어쓰기 한 칸으로 합니다.')\narray = input().split()\n\n#순차 탐색 수형결과 출력\nprint(sequentail_search(n,target,array))\n```\n\n# 이진탐색알고리즘\n\n- 이진 탐색: 정렬되어 있는 리스트에서 탐색 범위를 절반씩 좁혀가며 데이터를 탐색하는 방법\n - 이진 탐색은 시작점, 끝점, 중간점을 이용하여 탐색 범위를 설정한다\n\n## 이진 탐색 동작 예시\n\n- 이미 정렬된 10개의 데이터 중에서 값이 4인 원소를 찾는 예시를 살펴보자\n ![](https://velog.velcdn.com/images/minseok0123/post/9ba4721a-c960-4925-97e8-a80eddcc3d55/image.png)\n- **[Step 1]** 시작점: 0, 끝점: 9, 중간점: 4 (소수점 이하 제거)\n ![](https://velog.velcdn.com/images/minseok0123/post/9d2823ae-177e-4255-a268-c10f29e78f5a/image.png)\n- **[Step 2]** 시작점:0, 끝점: 3, 중간점: 1 (소수점 이하 제거)\n ![](https://velog.velcdn.com/images/minseok0123/post/77cef67b-a7df-427c-99e0-957112c3655f/image.png)\n- **[Step 3]** 시작점: 2, 끝점: 3, 중간점: 2 (소수점 이하 제거)\n ![](https://velog.velcdn.com/images/minseok0123/post/b8a1ff21-c596-470b-9264-9bd14ecd401d/image.png)\n\n---\n\n## 이진 탐색의 시간 복잡도\n\n- 단계마다 탐색 범위를 2로 나누는 것과 동일하므로 연산 횟수는 log₂𝑁에 비례한다\n- 예를 들어 초기 데이터 개수가 32개일 때, 이상적으로 1단계를 거치면 16개가량의 데이터만 남는다\n - 2단계를 거치면 8개가량의 데이터만 남는다\n - 3단계를 거치면 4개가량의 데이터만 남는다\n\n---\n\n```python\n# 이진 탐색 소스코드 구현 (재귀 함수)\ndef binary_search(array, target, start, end):\n if start > end:\n return None\n mid = (start + end) // 2\n # 찾은 경우 중간점 인덱스 반환\n if array[mid] == target:\n return mid\n # 중간점의 값보다 찾고자 하는 값이 작은 경우 왼쪽 확인\n elif array[mid] > target:\n return binary_search(array, target, start, mid - 1)\n # 중간점의 값보다 찾고자 하는 값이 큰 경우 오른쪽 확인\n else:\n return binary_search(array, target, mid + 1, end)\n\n# n(원소의 개수)과 target(찾고자 하는 값)을 입력 받기\nn, target = list(map(int, input().split()))\n# 전체 원소 입력 받기\narray = list(map(int, input().split()))\n\n# 이진 탐색 수행 결과 출력\nresult = binary_search(array, target, 0, n - 1)\nif result == None:\n print(\"원소가 존재하지 않습니다\")\nelse:\n print(result + 1)\n```\n\n```python\n# 이진 탐색 소스코드 구현 (반복문)\ndef binary_search(array, target, start, end):\n while start <= end:\n mid = (start + end) // 2\n # 찾은 경우 중간점 인덱스 반환\n if array[mid] == target:\n return mid\n # 중간점의 값보다 찾고자 하는 값이 작은 경우 왼쪽 확인\n elif array[mid] > target:\n end = mid - 1\n # 중간점의 값보다 찾고자 하는 값이 큰 경우 오른쪽 확인\n else:\n start = mid + 1\n return None\n\n# n(원소의 개수)과 target(찾고자 하는 값)을 입력 받기\nn, target = list(map(int, input().split()))\n# 전체 원소 입력 받기\narray = list(map(int, input().split()))\n\n# 이진 탐색 수행 결과 출력\nresult = binary_search(array, target, 0, n - 1)\nif result == None:\n print(\"원소가 존재하지 않습니다.\")\nelse:\n print(result + 1)\n```\n\n## 마지막 정리\n\n**_이진 탐색_**\n\n- 정렬된 배열에서 중간 값을 비교하여 탐색 범위를 반씩 줄여가며 원하는 값을 찾는 알고리즘.\n- 시간 복잡도는 O(log n)으로 매우 효율적이지만, 배열이 정렬되어 있어야 한다는 제약이 있다.\n- 이진 탐색은 반복문 또는 재귀적으로 구현할 수 있다.\n\n_**순차 탐색**_\n\n- 배열이나 리스트와 같은 선형 구조에서 처음부터 끝까지 원하는 값을 찾을 때 사용하는 간단한 탐색 알고리즘.\n- 시간 복잡도는 O(n)으로 배열의 크기에 비례하여 선형적으로 증가한다.\n- 배열이나 리스트의 크기가 작거나 정렬되지 않은 경우에 유용하게 사용될 수 있다.\n"},{"id":"9b1e6592-e940-54e4-b31b-7301ae1998b8","excerpt":"…","fields":{"slug":"/정렬 알고리즘/"},"frontmatter":{"title":"정렬 알고리즘","date":"2023.05.13","thumbnail":{"publicURL":"/static/eb51d20db908fb423189b6c6fe7e937c/sort.jpeg","childImageSharp":{"fluid":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAUABQDASIAAhEBAxEB/8QAGQABAAIDAAAAAAAAAAAAAAAAAAMEAQIF/8QAFgEBAQEAAAAAAAAAAAAAAAAAAAID/9oADAMBAAIQAxAAAAGlvfzNc9cE8ZGkQP/EABsQAQACAwEBAAAAAAAAAAAAAAEAEQIDEyEj/9oACAEBAAEFArIXPpDZR1Y53OeM8F2o/wD/xAAXEQADAQAAAAAAAAAAAAAAAAAAAREQ/9oACAEDAQE/ASkWf//EABURAQEAAAAAAAAAAAAAAAAAABAR/9oACAECAQE/ASn/xAAeEAABBAEFAAAAAAAAAAAAAAAAAQIxMpEDESEiUf/aAAgBAQAGPwKm5xpFG4IKnhAvVCG4P//EAB8QAAIBAgcAAAAAAAAAAAAAAAABETGBIUFRYXGR8P/aAAgBAQABPyH3MmWHcbUsAkxuexzTDuQk6uWUSpmRRA//2gAMAwEAAgADAAAAEOjo/wD/xAAYEQEBAAMAAAAAAAAAAAAAAAAAEQFRYf/aAAgBAwEBPxCo25Jh/8QAFxEAAwEAAAAAAAAAAAAAAAAAABARUf/aAAgBAgEBPxCEK1f/xAAfEAEAAgEDBQAAAAAAAAAAAAABABExIUFxUWGhwdH/2gAIAQEAAT8QTulfr9RCBLhTUSrxGXukNaQie4PbLGdWBJuLkvuKM0wotaEQBHGf/9k=","aspectRatio":1,"src":"/static/eb51d20db908fb423189b6c6fe7e937c/0f3a1/sort.jpg","srcSet":"/static/eb51d20db908fb423189b6c6fe7e937c/1ada3/sort.jpg 125w,\n/static/eb51d20db908fb423189b6c6fe7e937c/8f7df/sort.jpg 250w,\n/static/eb51d20db908fb423189b6c6fe7e937c/0f3a1/sort.jpg 500w,\n/static/eb51d20db908fb423189b6c6fe7e937c/f9913/sort.jpg 750w,\n/static/eb51d20db908fb423189b6c6fe7e937c/a7715/sort.jpg 1000w,\n/static/eb51d20db908fb423189b6c6fe7e937c/ec6c5/sort.jpg 1280w","sizes":"(max-width: 500px) 100vw, 500px"}}},"categories":["알고리즘","Python"]},"rawMarkdownBody":"\n- 정렬알고리즘\n\n**정렬 알고리즘은 주어진 데이터 집합을 특정한 기준에 따라 순서대로 정렬하는 알고리즘이다.**\n\n- 어떻게 정렬할 수 있을까?\n\n![](https://velog.velcdn.com/images/minseok0123/post/8395ff78-e9d1-4db0-941f-866e8bb99ece/image.png)\n\n# [선택정렬]\n\n처리되지 않은 데이터 중에서 가장 작은 데이터를 선택해 맨 앞에 있는 데이터와 바꾸는 것을 반복합니다.\n\n이 알고리즘의 핵심 아이디어는 매번 정렬되지 않은 부분에서 최소값을 찾아서 앞으로 이동시키는 것입니다. 이를 통해 배열의 가장 작은 요소가 정렬 과정 중에 제 위치를 찾아가게 되고, 나머지 요소들도 동일한 원리로 정렬됩니다.\n\n### 선택 정렬 동작 예시\n\n`[Step 0]` 처리되지 않은 데이터 중 가장 작은 '0'을 선택해 가장 앞의 '7'과 바꾼다.\n\n![](https://velog.velcdn.com/images/minseok0123/post/f49cf2aa-c493-4eb6-a1d9-a30e55687329/image.png)\n\n`[Step 1]` 처리되지 않은 데이터 중 가장 작은 '1'을 선택해 가장 앞의 '5'와 바꾼다.\n\n![](https://velog.velcdn.com/images/minseok0123/post/76d0da14-0233-48e3-83ce-ac4e3fb44983/image.png)\n\n`[Step 2]` 처리되지 않은 데이터 중 가장 작은 '2'를 선택해 가장 앞의 '9'와 바꾼다.\n\n![](https://velog.velcdn.com/images/minseok0123/post/321dee96-a939-4851-a718-9a2e0d6699de/image.png)\n\n`[Step 3]` 처리되지 않은 데이터 중 가장 작은 '3'을 선택해 가장 앞의 '7'과 바꾼다.\n\n![](https://velog.velcdn.com/images/minseok0123/post/f1c1055f-804b-4347-9611-7d53cd778719/image.png)\n\n이러한 과정을 반복하면 다음과 같이 정렬이 완료된다.\n\n→ 가장 작은 것을 선택해서 앞으로 보내는 과정을 반복해서 수행하다 보면, 전체 데이터의 정렬이 이루어진다.\n\n![](https://velog.velcdn.com/images/minseok0123/post/1c31e865-5abc-4aaa-bd0d-f5ae98079c6a/image.png)\n\n선택정렬 소스 코드\n\n```python\narray = [7, 5, 9, 0, 3, 1, 6, 2, 4, 8]\n\nfor i in range(len(array)):\n\tmin_index = i\n\tfor j in range(i+1, len(array)):\n\t\t\tif array[min_index] > array[j]:\n\t\t\t\t\tmin_index = j\n\tarray[i], array[min_index] = array[min_index], array[i]\n\nprint(array)\n```\n\n```\n[0 1 2 3 4 5 6 7 8 9]\n```\n\n### 선택 정렬의 시간 복잡도\n\n선택 정렬의 시간 복잡도는 O(n^2)로, 배열의 크기에 비례하여 비효율적입니다.\n그러나 선택 정렬은 구현이 간단하고 이해하기 쉬우며, 정렬해야 할 요소의 수가 상대적으로 작을 때 유용할 수 있습니다.\n\n- 선택 정렬은 N번 만큼 가장 작은 수를 찾아서 맨 앞으로 보내야 한다.\n- 구현 방식에 따라서 사소한 오차는 있을 수 있지만, 전체 연산 횟수는 다음과 같다.\n\n![](https://velog.velcdn.com/images/minseok0123/post/5868ecb5-6e5d-4b2b-92bc-f591635d2e36/image.png)\n\n- 이는 (*N^*2+_N_+2)/2로 표현할 수 있는데, 빅오 표현법에 따라서 *O*(*N^*2)이라고 작성한다.\n\n# [삽입정렬]\n\n삽입 정렬의 핵심 아이디어는 정렬된 부분 배열에 새로운 원소를 삽입하는 동안 정렬된 순서를 유지한다는 것입니다. 따라서, 배열이 이미 거의 정렬되어 있는 경우에는 효율적으로 동작하며, 작은 규모의 입력에 대해서도 성능이 좋습니다.\n\n- 처리되지 않은 데이터를 하나씩 골라 적절한 위치에 삽입한다.\n- 선택 정렬에 비해 구현 난이도가 높은 편이지만, 일반적으로 더 효율적으로 동작한다.\n\n### 삽입 정렬 동작 예시\n\n`[Step 0]` 첫 번째 데이터 '7'은 그 자체로 정렬이 되어 있다고 판단하고, 두 번째 데이터인 '5'가 어떤 위치로 들어갈지 판단한다. '7'의 왼쪽으로 들어가거나 오른쪽으로 들어가거나 두 경우만 존재한다.\n\n![](https://velog.velcdn.com/images/minseok0123/post/a5999124-08d7-4896-8665-ef86ae089268/image.png)\n\n`[Step 1]` 이어서 '9'가 어떤 위치로 들어갈지 판단한다.\n\n![](https://velog.velcdn.com/images/minseok0123/post/a992c974-23b7-4896-a7ac-96932f3ae382/image.png)\n\n‘9’는 차례대로 왼쪽에 있는 데이터와 비교해서 왼쪽 데이터보다 더 작다면 위치를 바꿔 주고 그렇지 않다면 그냥 그 자리에 머물러 있도록 한다. ‘9’는 ‘7’보다 더 크기 때문에 현재 위치 그대로 내버려 둔다.\n\n`[Step 2]`  이어서 '0'이 어떤 위치로 들어갈지 판단한다.\n\n![](https://velog.velcdn.com/images/minseok0123/post/8f710680-7ecb-4e71-8a9a-80f48a2a848e/image.png)\n\n‘0’은 ‘9’, ‘7’, ‘5’와 비교했을 때 모두 작기 때문에 ‘5’의 왼쪽에 위치한다.\n\n이러한 과정을 반복하면 다음과 같이 정렬이 완성된다.\n\n![](https://velog.velcdn.com/images/minseok0123/post/27af6645-9703-4601-9a34-495178c5ee50/image.png)\n\n### 삽입 정렬 소스코드\n\n```python\narray = [7, 5, 9, 0, 3, 1, 6, 2, 4, 8]\n\nfor i in range(1, len(array)):\n\tfor j in range(i, 0, -1):\n\t\t\tif array[j] < array[j-1]:\n\t\t\t\t\tarray[j], array[j-1] = array[j-1], array[j]\n\t\t\telse:\n\t\t\t\t\tbreak\n\nprint(array)\n```\n\n`[실행 결과]`\n\n```\n[0,1,2,3,4,5,6,7,8,9]\n```\n\n### 삽입 정렬의 시간 복잡도\n\n삽입 정렬의 시간 복잡도는 최악의 경우에는 O(n^2)이며, 최선의 경우에는 O(n)입니다. 여기서 n은 배열의 크기를 나타냅니다. 또한, 삽입 정렬은 제자리 정렬(in-place sorting) 알고리즘이므로, 추가적인 메모리 공간을 필요로 하지 않습니다.\n\n- 삽입 정렬의 시간 복잡도는 *O*(*N^*2)이며, 선택 정렬과 마찬가지로 반복문이 두 번 중첩되어 사용된다.\n- 삽입 정렬은 현재 리스트의 데이터가 거의 정렬되어 있는 상태라면 매우 빠르게 동작한다.`최선의 경우 O(N)의 시간 복잡도를 가진다.`\n\n# [퀵정렬]\n\n- 기준 데이터를 설정하고 **그 기준보다 큰 데이터와 작은 데이터의 위치를 바꾸는 방법**이다.\n- 일반적인 상황에서 가장 많이 사용되는 정렬 알고리즘 중 하나이다.\n- 병합 정렬과 더불어 대부분의 프로그래밍 언어의 정렬 라이브러리의 근간이 되는 알고리즘이다.\n- 가장 기본적인 퀵 정렬은 **첫 번째 데이터를 기준 데이터(pivot)로 설정**한다.\n\n### 퀵 정렬 동작 예시\n\n`[Step 0]` 현재 피벗의 값은 '5'이다. 왼쪽에서부터 '5'보다 큰 데이터를 선택하므로 '7'이 선택되고, 오른쪽에서부터 '5'보다 작은 데이터를 선택하므로 '4'가 선택된다.\n\n![](https://velog.velcdn.com/images/minseok0123/post/bc9e8f91-8faf-48d7-943d-776cc4fbd659/image.png)\n\n`[Step 1]` 현재 피벗의 값은 '5'이다. 왼쪽에서부터 '5'보다 큰 데이터를 선택하므로 '9'가 선택되고, 오른쪽에서부터 '5'보다 작은 데이터를 선택하므로 '2'가 선택된다. 이제 이 두 데이터의 위치를 서로 변경한다.\n\n![](https://velog.velcdn.com/images/minseok0123/post/c2e69da9-7aae-4449-9080-0689e133b060/image.png)\n\n`[Step 0]`현재 피벗의 값은 '5'이다. 왼쪽에서부터 '5'보다 큰 데이터를 선택하므로 '6'이 선택되고, 오른쪽에서부터 '5'보다 작은 데이터를 선택하므로 '1'이 선택된다. 단, 이처럼\n\n**위치가 엇갈리는 경우 '피벗'과 작은 데이터의 위치를 서로 변경**한다.\n\n![](https://velog.velcdn.com/images/minseok0123/post/22b5ce04-0a67-4326-bf30-883814eb9ed5/image.png)\n\n`[분할완료]`이제 '5'의 왼쪽에 있는 데이터는 모두 5보다 작고, 오른쪽에 있는 데이터는 모두 '5'보다 크다는 특징이 있다. 이렇게 피벗을 기준으로 데이터 묶음을 나누는 작업을 분할(Divide)이라고 한다.\n\n![](https://velog.velcdn.com/images/minseok0123/post/442f06f2-b4e2-46d8-8e46-4a367ac4e73f/image.png)\n\n`[왼쪽 데이터 묶음 정렬]`왼쪽에 있는 데이터에 대해서 마찬가지로 정렬을 수행한다.\n\n![](https://velog.velcdn.com/images/minseok0123/post/c99385af-1acd-43ac-848b-143169bb6e30/image.png)\n\n`[오른쪽 데이터 묶음 정렬]`오른쪽에 있는 데이터에 대해서 마찬가지로 정렬을 수행한다.\n\n![](https://velog.velcdn.com/images/minseok0123/post/1a8fb67f-9623-4443-a2a0-5c8bc19bba9d/image.png)\n\n이러한 과정을 반복하면 전체 데이터에 대해서 정렬이 수행된다.\n\n### 퀵 정렬이 빠른 이유: 직관적인 이해\n\n- 이상적인 경우 분할이 절반씩 일어난다면 전체 연산 횟수로 *O*(_NlogN_)를 기대할 수 있다.\n- `너비 X 높이 = N X logN = NlogN`\n\n![](https://velog.velcdn.com/images/minseok0123/post/f8e6ee2f-3dba-440c-9957-c8be82eb8297/image.png)\n\n### 퀵 정렬의 시간 복잡도\n\n퀵정렬은 평균적으로 O(n log n)의 시간 복잡도를 가지지만, 최악의 경우에는 O(n^2)의 시간 복잡도를 가질 수 있습니다. 최악의 경우는 피벗이 항상 최솟값 또는 최댓값으로 선택되는 경우에 발생합니다. 이러한 경우를 피하기 위해 피벗을 랜덤하게 선택하거나 중간값을 선택하는 방법 등을 사용할 수 있습니다.\n\n- 퀵 정렬은 평균의 경우 *O*(_NlogN_)의 시간 복잡도를 가진다.\n- 하지만 최악의 경우 *O*(*N*2)의 시간 복잡도를 가진다.\n\n`첫 번째 원소를 피벗으로 삼을 때, 이미 정렬된 배열에 대해서 퀵 정렬을 수행할 경우 최악의 경우이다.`\n\n- 표준 라이브러리를 사용하는 경우, 기본적으로 *O*(_NlogN_)을 보장한다.\n\n```python\narray = [5,7,9,0,3,1,6,2,4,8]\n\ndef quick_sort(array, start, end):\n\tif start >= end:\n\t\treturn\n\tpivot = start\n\tleft = start + 1\n\tright = end\n\twhile(left<=right):\n\t\twhile(left<=end and array[left]<=array[pivot]):\n\t\t\tleft += 1\n\t\twhile(right>start and array[right]>=array[pivot]):\n\t\t\tright -= 1\n\t\tif(left>right):\n\t\t\tarray[right], array[pivot] = array[pivot], array[right]\n\t\telse:\n\t\t\tarray[left], array[right] = array[right], array[left]\n\tquick_sort(array, start, right-1)\n\tquick_sort(array, right+1, end)\n\nquick_sort(array, 0, len(array)-1)\nprint(array)\n```\n\n`[실행 결과]`\n\n```\n[0,1,2,3,4,5,6,7,8,9]\n```\n\n# 문제 - 두 배열의 원소 교체\n\n> 동빈이는 두 개의 배열 A와 B를 가지고 있다. 두 배열은 N개의 원소로 구성되어 있으며, 배열의 원소는모두 자연수이다\n>\n> 동빈이는 최대 K 번의 바꿔치기 연산을 수행할 수 있는데, 바꿔치기 연산이란 배열 A에 있는 원소 하나와배열 B에 있는 원소 하나를 골라서 두 원소를 서로 바꾸는 것을 말한다\n>\n> 동빈이의 최종 목표는 배열 A의 모든 원소의 합이 최대가 되도록 하는 것이며, 여러분은 동빈이를 도와야한다\n>\n> N, K, 그리고 배열 A와 B의 정보가 주어졌을 때, 최대 K 번의 바꿔치기 연산을 수행하여 만들 수 있는배열 A의 모든 원소의 합의 최댓값을 출력하는 프로그램을 작성하라\n>\n> 예를 들어 N = 5, K = 3이고, 배열 A와 B가 다음과 같다고 해보자\n>\n> - 배열 A = [1, 2, 5, 4, 3]\n> - 배열 B = [5, 5, 6, 6, 5]이 경우, 다음과 같이 세 번의 연산을 수행할 수 있다\n> - 연산 1) 배열 A의 원소 '1'과 배열 B의 원소 '6'을 바꾸기\n> - 연산 2) 배열 A의 원소 '2'와 배열 B의 원소 '6'을 바꾸기\n> - 연산 3) 배열 A의 원소 '3'과 배열 B의 원소 '5'를 바꾸기세 번의 연산 이후 배열 A와 배열 B의 상태는 다음과 같이 구성될 것이다\n> - 배열 A = [6, 6, 5, 4, 5]\n> - 배열 B = [3, 5, 1, 2, 5]이때 배열 A의 모든 원소의 합은 26이 되며, 이보다 더 합을 크게 만들 수는 없다\n\n---\n\n### 입력\n\n- 첫 번째 줄: N, K 가 공백으로 구분되어 입력 (1 <= N <= 100,000, 0 <= K <= N)\n- 두 번째 줄: 배열 A의 원소들이 공백으로 구분되어 입력 (원소 a < 10,000,000인 자연수)\n- 세 번째 줄: 배열 B의 원소들이 공백으로 구분되어 입력 (원소 b < 10,000,000인 자연수)\n\n### 출력\n\n- 최대 K번 바꿔치기 연산을 수행해서 가장 최대의 합을 갖는 A의 모든 원소 값의 합을 출력\n\n**입력 예시**\n\n```\n5 3\n1 2 5 4 3\n5 5 6 6 5\n```\n\n**출력 예시**\n\n```\n26\n```\n\n---\n\n**`코드 구현`**\n\n```python\nn, k = map(int, input().split())\n\na = list(map(int, input().split()))\nb = list(map(int, input().split()))\n\na.sort()\nb.sort(reverse = True)\n\nfor i in range(k):\n if a[i] < b[i]:\n a[i], b[i] = b[i], a[i]\n else:\n break\n\nprint(sum(a))\n```\n\n---\n\n**`실행 결과`**\n\n```\n26\n```\n\n---\n"},{"id":"7a0477ec-6bae-5e88-9b70-97a6d13ed179","excerpt":"…","fields":{"slug":"/최단 경로/"},"frontmatter":{"title":"최단 경로","date":"2023.08.28","thumbnail":{"publicURL":"/static/a75398f78245969eab7384f600e18aac/shortest route.png","childImageSharp":{"fluid":{"base64":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAALCAIAAADwazoUAAAACXBIWXMAAAsTAAALEwEAmpwYAAABGElEQVR42oWR227CQAxE+f8vQyoqVCqi6RMgKCoNIZvLbmyP7YpERVQQMU+W18f2eiZ+J3N3EVcNqXlbzGOMDhiz3VVO/JFSaop4DhwPhwOJSFlqXftTWKHL5fsxnC4rMHMbh/zP8ZitVs9g1fVmkzdFHU4MERYzUyCUYb/bARiH2ygi5m5mZHJKIfvMYkpWVQ6omYiMwpISoP3RTEKZx/Ijy4ioTxiAUVhEBpKJ1/tt0dWsEGL/A1RVmP/BZhcLiOh1Nott6+5VFaYv02FgFyovy6EUqlB9MFlV8zzvuosvCq2RznXOXWTo1XxqW++7u9nja1tVQaDQSN13U+y+9sKiABEZ4GN/tl7X2N1jSovFvG2a26db+BcShIUSxpTSrwAAAABJRU5ErkJggg==","aspectRatio":1.7857142857142858,"src":"/static/a75398f78245969eab7384f600e18aac/46604/shortest%20route.png","srcSet":"/static/a75398f78245969eab7384f600e18aac/62d80/shortest%20route.png 125w,\n/static/a75398f78245969eab7384f600e18aac/e1953/shortest%20route.png 250w,\n/static/a75398f78245969eab7384f600e18aac/46604/shortest%20route.png 500w,\n/static/a75398f78245969eab7384f600e18aac/40725/shortest%20route.png 580w","sizes":"(max-width: 500px) 100vw, 500px"}}},"categories":["알고리즘"]},"rawMarkdownBody":"\n# 최단 경로 문제\n\n- 최단 경로 알고리즘은 그래프에서 가장 짧은 경로를 찾는 알고리즘을 의미합니다.\n- 다양한 문제 상황에서 사용될 수 있으며, 주요한 경우는 다음과 같습니다\n\n - 한 지점에서 다른 한 지점까지의 최단 경로\n - 한 지점에서 다른 모든 지점까지의 최단 경로\n - 모든 지점에서 다른 모든 지점까지의 최단 경로\n\n이때, 각 지점은 그래프에서 노드로 표현되며, 지점 간 연결된 도로는 그래프에서 간선으로 표현됩니다.\n\n![](https://velog.velcdn.com/images/minseok0123/post/49fe9c3a-0735-4eab-affb-73df0550e56e/image.png)\n\n# 다익스트라 최단 경로 알고리즘 개요\n\n다익스트라(Dijkstra) 최단 경로 알고리즘은 특정한 노드에서 출발하여 다른 모든 노드까지의 최단 경로를 계산하는 알고리즘입니다. 이 알고리즘은 음의 간선이 없을 때에만 정상적으로 동작하며, 그리디(Greedy) 알고리즘에 속합니다.\n\n## 다익스트라 알고리즘 동작과정\n\n[초기 상태] 그래프를 준비하고 출발 노드를 설정한다\n\n![](https://velog.velcdn.com/images/minseok0123/post/c4c49dbe-5f41-4676-aeef-ba1016dc76c7/image.png)\n\n1. 방문하지 않은 노드 중에서 최단 거리가 가장 짧은 노드인 1번 노드를 처리한다\n ![](https://velog.velcdn.com/images/minseok0123/post/b05ef06c-8348-4c40-9509-9bf90652f803/image.png)\n2. 방문하지 않은 노드 중에서 최단 거리가 가장 짧은 노드인 4번 노드를 처리한다\n ![](https://velog.velcdn.com/images/minseok0123/post/20dd98ef-17ab-4a5c-867a-ace0e7900569/image.png)\n3. 방문하지 않은 노드 중에서 최단 거리가 가장 짧은 노드인 2번 노드를 처리한다\n ![](https://velog.velcdn.com/images/minseok0123/post/c2c27133-f178-4c44-ac34-7517bec9ffa1/image.png)\n4. 방문하지 않은 노드 중에서 최단 거리가 가장 짧은 노드인 5번 노드를 처리한다\n ![](https://velog.velcdn.com/images/minseok0123/post/64599945-d9b8-414e-919e-23f11f2ddc5f/image.png)\n5. 방문하지 않은 노드 중에서 최단 거리가 가장 짧은 노드인 3번 노드를 처리한다\n ![](https://velog.velcdn.com/images/minseok0123/post/8877c391-282a-4c06-a571-d95d095cc210/image.png)\n6. 방문하지 않은 노드 중에서 최단 거리가 가장 짧은 노드인 6번 노드를 처리한다\n ![](https://velog.velcdn.com/images/minseok0123/post/8135d804-4de1-4ac6-a6cd-a721cfeaae4e/image.png)\n\n## 다익스트라 알고리즘의 특징\n\n**그리디 접근 방식**: 다익스트라 알고리즘은 각 단계에서 방문하지 않은 노드 중에서 현재까지의 최단 거리 추정치가 가장 작은 노드를 선택합니다. 이를 통해 임의의 과정을 반복하며 최단 거리를 점진적으로 갱신해 나갑니다.\n\n**최단 거리의 확정**: 알고리즘 수행 중 한 번 처리된 노드의 최단 거리는 더 이상 변경되지 않습니다. 다시 말해, 각 노드에 대한 최단 거리는 점점 정확하게 확정됩니다.\n\n**단계적 접근**: 다익스트라 알고리즘은 각 단계마다 하나의 노드에 대한 최단 거리를 확실히 찾아냅니다. 이러한 접근 방식을 통해 그래프의 모든 노드에 대한 최단 거리를 구할 수 있습니다.\n\n**최단 거리 정보 저장**: 알고리즘을 실행한 뒤에는 각 노드까지의 최단 거리 정보가 테이블에 저장됩니다. 이 정보를 통해 출발 노드로부터 다른 모든 노드까지의 최단 경로와 거리를 쉽게 확인할 수 있습니다.\n"}]}}} \ No newline at end of file diff --git "a/private, public, protected \354\240\221\352\267\274\354\240\234\354\226\264/index.html" "b/private, public, protected \354\240\221\352\267\274\354\240\234\354\226\264/index.html" index c8e3405..def9174 100644 --- "a/private, public, protected \354\240\221\352\267\274\354\240\234\354\226\264/index.html" +++ "b/private, public, protected \354\240\221\352\267\274\354\240\234\354\226\264/index.html" @@ -101,7 +101,7 @@ setTheme(preferredTheme || (darkQuery.matches ? 'dark' : 'light')) }() -
    minlog

    private, public, protected 접근제어

    2023.10.30·조회수:
    0
    thumbnail
     

    private, public, protected 접근제어

    +
    minlog

    private, public, protected 접근제어

    2023.10.30·조회수:
    0
    thumbnail
     

    private, public, protected 접근제어

    1. public : 다른 클래스에서도 접근 가능 2. private : 그 맴버를 선언한 클래스 내부에서만 접근 가능 @@ -239,10 +239,10 @@

    결론아버지는 잡담, 기밀, 비법전수 모두 접근이 가능하고
  • 아들은 잡담, 비법전수 까지 접근이 가능하고
  • 도둑은 잡담 밖에 접근이 불가능하다.
  • -

    +
    - \ No newline at end of file + \ No newline at end of file diff --git "a/private\354\227\220 \354\240\221\352\267\274\355\225\230\352\270\260, get set\352\263\274 property \354\206\215\354\204\261/index.html" "b/private\354\227\220 \354\240\221\352\267\274\355\225\230\352\270\260, get set\352\263\274 property \354\206\215\354\204\261/index.html" index 6b0f03e..3a8dc51 100644 --- "a/private\354\227\220 \354\240\221\352\267\274\355\225\230\352\270\260, get set\352\263\274 property \354\206\215\354\204\261/index.html" +++ "b/private\354\227\220 \354\240\221\352\267\274\355\225\230\352\270\260, get set\352\263\274 property \354\206\215\354\204\261/index.html" @@ -101,7 +101,7 @@ setTheme(preferredTheme || (darkQuery.matches ? 'dark' : 'light')) }() -
    minlog

    private에 접근하기, get set과 property 속성

    2023.10.27·조회수:
    0
    thumbnail
     

    private에 접근하기 : get set과 property 속성

    +
    minlog

    private에 접근하기, get set과 property 속성

    2023.10.27·조회수:
    0
    thumbnail
     

    private에 접근하기 : get set과 property 속성

    접근제어란?

    메모리를 보유한 객체를 이용해서 맴버에 점(.)을 찍고 접근할 수 있는지 없는지의 제어를 말한다.

    @@ -239,10 +239,10 @@

    속성(Property)결론

    위와 같이 속성을 가져다 쓰면 편하게 구현 할 수 있다.

    -
    +
    - \ No newline at end of file + \ No newline at end of file diff --git a/recent/index.html b/recent/index.html index 77ca312..af9a51b 100644 --- a/recent/index.html +++ b/recent/index.html @@ -101,10 +101,10 @@ setTheme(preferredTheme || (darkQuery.matches ? 'dark' : 'light')) }() -
    minlog
    트렌딩
    최신
    All
    Post Item Image
    1차원 배열
    2023.11.12
    C샵
    배열 : 배열은 같은 데이터 타입의 데이터(Data)를 여러 개 저장할 수 있는 저장공간이다. - 배열 또한 메모리를 생성할 때 new 키워드를 사용한다. 1. 이를 통해 배열은 stack이 아닌 heap 영역에 저장된다는 사실을 짐작할 수 있다. 2. 배열의 이름은 주소값을 저장하는 참조변수다. 즉, "heap 영역에 저장된" 배열의 주소값이 저장된다. 우리는 이 주소값을 통해 배열에 접근한다.
    Post Item Image
    2차원 배열과 가변배열
    2023.11.12
    C샵
    앞에서는 10개의 공간을 1차원 배열로 표현해봤는데, 이번에는 10개의 공간을 2차원 배열로 표현해볼 것이다.
    Post Item Image
    박싱과 언박싱
    2023.11.11
    C샵
    Boxing : 값타입을 참조타입으로 변환하는 기법 UnBoxing : 참조타입을 값타입으로 변환하는 기법
    Post Item Image
    업캐스팅의 유용함
    2023.11.10
    C샵
    특정 객체가 하위 클래스의 형에서 상위의 클래스형으로 캐스팅 되는 것 하나의 매개변수의 형으로 여러 형을 받아줄 수 있다.
    Post Item Image
    추상클래스 vs 인터페이스 차이
    2023.11.09
    C샵
    C 같은 절차지향 언어 : 클래스x (함수 혼자 놈) JAVA, C# 같은 객체지향 언어 : 클래스 안에 함수
    Post Item Image
    오버라이딩
    2023.11.08
    C샵
    오버라이딩 상속 받은 것을 그대로 안 쓰고 고쳐서 쓴다 (재정의) 즉, 아빠가 입던 옷을 물려받은 뒤, 그걸 수선집에서 고쳐서 입는 셈
    Post Item Image
    this와 this를 통한 생성자 호출
    2023.11.07
    C샵
    this 클래스 내에서 정의된 맴버를 가르킬때 사용한다. 만약 클래스 내에서 생성된 변수와 매개변수의 이름이 똑같다면 - this를 붙이면 클래스 내에서 생성된 변수를 출력한다. - this를 빼면 매개변수를 출력한다.
    Post Item Image
    연산자 오버로딩
    2023.11.05
    C샵
    연산자 오버로딩(Operator Overloading) 연산자의 종류는 이렇다. + (더하기) - (빼기) * (곱하기) / (나누기)
    Post Item Image
    오버로딩(Over loading)
    2023.11.04
    C샵
    하나의 이름으로 여러 개의 함수를 만드는 기법 [오버로딩(Over loading)을 사용하는 이유] 함수의 이름 하나로 여러 가지 작업에 대처할 수 있다.
    Post Item Image
    const 상수와 readonly 상수 차이
    2023.11.03
    C샵
    상수 : 변수와는 달리 변경이 불가능하다. (예) 10 = 100; const 키워드 : 상수를 선언하는 키워드이다.
    +
    minlog
    트렌딩
    최신
    All
    Post Item Image
    1차원 배열
    2023.11.12
    C샵
    배열 : 배열은 같은 데이터 타입의 데이터(Data)를 여러 개 저장할 수 있는 저장공간이다. - 배열 또한 메모리를 생성할 때 new 키워드를 사용한다. 1. 이를 통해 배열은 stack이 아닌 heap 영역에 저장된다는 사실을 짐작할 수 있다. 2. 배열의 이름은 주소값을 저장하는 참조변수다. 즉, "heap 영역에 저장된" 배열의 주소값이 저장된다. 우리는 이 주소값을 통해 배열에 접근한다.
    Post Item Image
    2차원 배열과 가변배열
    2023.11.12
    C샵
    앞에서는 10개의 공간을 1차원 배열로 표현해봤는데, 이번에는 10개의 공간을 2차원 배열로 표현해볼 것이다.
    Post Item Image
    박싱과 언박싱
    2023.11.11
    C샵
    Boxing : 값타입을 참조타입으로 변환하는 기법 UnBoxing : 참조타입을 값타입으로 변환하는 기법
    Post Item Image
    업캐스팅의 유용함
    2023.11.10
    C샵
    특정 객체가 하위 클래스의 형에서 상위의 클래스형으로 캐스팅 되는 것 하나의 매개변수의 형으로 여러 형을 받아줄 수 있다.
    Post Item Image
    추상클래스 vs 인터페이스 차이
    2023.11.09
    C샵
    C 같은 절차지향 언어 : 클래스x (함수 혼자 놈) JAVA, C# 같은 객체지향 언어 : 클래스 안에 함수
    Post Item Image
    오버라이딩
    2023.11.08
    C샵
    오버라이딩 상속 받은 것을 그대로 안 쓰고 고쳐서 쓴다 (재정의) 즉, 아빠가 입던 옷을 물려받은 뒤, 그걸 수선집에서 고쳐서 입는 셈
    Post Item Image
    this와 this를 통한 생성자 호출
    2023.11.07
    C샵
    this 클래스 내에서 정의된 맴버를 가르킬때 사용한다. 만약 클래스 내에서 생성된 변수와 매개변수의 이름이 똑같다면 - this를 붙이면 클래스 내에서 생성된 변수를 출력한다. - this를 빼면 매개변수를 출력한다.
    Post Item Image
    연산자 오버로딩
    2023.11.05
    C샵
    연산자 오버로딩(Operator Overloading) 연산자의 종류는 이렇다. + (더하기) - (빼기) * (곱하기) / (나누기)
    Post Item Image
    오버로딩(Over loading)
    2023.11.04
    C샵
    하나의 이름으로 여러 개의 함수를 만드는 기법 [오버로딩(Over loading)을 사용하는 이유] 함수의 이름 하나로 여러 가지 작업에 대처할 수 있다.
    Post Item Image
    const 상수와 readonly 상수 차이
    2023.11.03
    C샵
    상수 : 변수와는 달리 변경이 불가능하다. (예) 10 = 100; const 키워드 : 상수를 선언하는 키워드이다.
    - \ No newline at end of file + \ No newline at end of file diff --git "a/recoil\354\235\204 \355\225\234\353\262\210 \354\225\214\354\225\204\353\263\264\354\236\220/index.html" "b/recoil\354\235\204 \355\225\234\353\262\210 \354\225\214\354\225\204\353\263\264\354\236\220/index.html" index 20c47cf..d843246 100644 --- "a/recoil\354\235\204 \355\225\234\353\262\210 \354\225\214\354\225\204\353\263\264\354\236\220/index.html" +++ "b/recoil\354\235\204 \355\225\234\353\262\210 \354\225\214\354\225\204\353\263\264\354\236\220/index.html" @@ -101,7 +101,7 @@ setTheme(preferredTheme || (darkQuery.matches ? 'dark' : 'light')) }() -
    minlog

    recoil을 한번 알아보자

    2023.04.21·조회수:
    0
    thumbnail
     

    recoil 이란 무엇인가?

    +
    minlog

    recoil을 한번 알아보자

    2023.04.21·조회수:
    0
    thumbnail
     

    recoil 이란 무엇인가?

    Recoil은 페이스북에서 만든 React 상태 관리 라이브러리입니다. React는 기본적으로 단방향 데이터 흐름을 따르기 때문에 복잡한 상태 관리를 위해서는 상태를 끌어올리거나 Redux와 같은 상태 관리 라이브러리를 사용해야 했습니다. 하지만 Recoil은 기존 React 컴포넌트 내에서 상태를 관리할 수 있도록 해줍니다.

    Recoil의 특징

    Recoil은 다음과 같은 특징을 가지고 있습니다.

    @@ -139,10 +139,10 @@

    Recoil 사용 예시

    위 코드에서 atom 함수를 사용하여 상태를 정의하고, useRecoilState 훅을 사용하여 해당 상태를 컴포넌트 내에서 사용합니다. handleClick 함수에서 setCount 함수를 사용하여 상태를 업데이트합니다.

    결론

    -

    Recoil은 React 상태 관리를 쉽게 해주는 라이브러리로, 기존의 Redux와 같은 상태 관리 라이브러리보다 더 직관적이고 간단하게 상태를 관리할 수 있습니다. Recoil을 사용하면 기존의 React 컴포넌트 내에서 상태를 관리할 수 있어서 별도의 상태 관리 라이브러리를 사용하지 않아도 됩니다. 또한 비동기 상태 관리도 지원하며 개발자 도구(DevTools)를 제공하여 상태 변화를 쉽게 추적하고 디버깅할 수 있습니다.

    +

    Recoil은 React 상태 관리를 쉽게 해주는 라이브러리로, 기존의 Redux와 같은 상태 관리 라이브러리보다 더 직관적이고 간단하게 상태를 관리할 수 있습니다. Recoil을 사용하면 기존의 React 컴포넌트 내에서 상태를 관리할 수 있어서 별도의 상태 관리 라이브러리를 사용하지 않아도 됩니다. 또한 비동기 상태 관리도 지원하며 개발자 도구(DevTools)를 제공하여 상태 변화를 쉽게 추적하고 디버깅할 수 있습니다.

    - \ No newline at end of file + \ No newline at end of file diff --git a/search/index.html b/search/index.html index dda4e24..a9f555b 100644 --- a/search/index.html +++ b/search/index.html @@ -101,10 +101,10 @@ setTheme(preferredTheme || (darkQuery.matches ? 'dark' : 'light')) }() -
    minlog
    minlog
    +
    minlog
    minlog
    - \ No newline at end of file + \ No newline at end of file diff --git a/sitemap-pages.xml b/sitemap-pages.xml index 5053691..dc9ecaa 100644 --- a/sitemap-pages.xml +++ b/sitemap-pages.xml @@ -1 +1 @@ -https://minseok0123.github.io/1%EC%B0%A8%EC%9B%90%20%EB%B0%B0%EC%97%B42023-11-13T12:37:41.097Zhttps://minseok0123.github.io/2%EC%B0%A8%EC%9B%90%20%EB%B0%B0%EC%97%B4%EA%B3%BC%20%EA%B0%80%EB%B3%80%EB%B0%B0%EC%97%B42023-11-13T12:37:41.097Zhttps://minseok0123.github.io/%EB%B0%95%EC%8B%B1%EA%B3%BC%20%EC%96%B8%EB%B0%95%EC%8B%B12023-11-13T12:37:41.097Zhttps://minseok0123.github.io/%EC%97%85%EC%BA%90%EC%8A%A4%ED%8C%85%EC%9D%98%20%EC%9C%A0%EC%9A%A9%ED%95%A82023-11-13T12:37:41.097Zhttps://minseok0123.github.io/%EC%B6%94%EC%83%81%ED%81%B4%EB%9E%98%EC%8A%A4%20vs%20%EC%9D%B8%ED%84%B0%ED%8E%98%EC%9D%B4%EC%8A%A4%20%EC%B0%A8%EC%9D%B42023-11-13T12:37:41.097Zhttps://minseok0123.github.io/%EC%98%A4%EB%B2%84%EB%9D%BC%EC%9D%B4%EB%94%A92023-11-13T12:37:41.097Zhttps://minseok0123.github.io/this%EC%99%80%20this%EB%A5%BC%20%ED%86%B5%ED%95%9C%20%EC%83%9D%EC%84%B1%EC%9E%90%20%ED%98%B8%EC%B6%9C2023-11-13T12:37:41.097Zhttps://minseok0123.github.io/%EC%97%B0%EC%82%B0%EC%9E%90%20%EC%98%A4%EB%B2%84%EB%A1%9C%EB%94%A92023-11-13T12:37:41.097Zhttps://minseok0123.github.io/%EC%98%A4%EB%B2%84%EB%A1%9C%EB%94%A9(Over%20loading)2023-11-13T12:37:41.098Zhttps://minseok0123.github.io/const%20%EC%83%81%EC%88%98%EC%99%80%20readonly%20%EC%83%81%EC%88%98%20%EC%B0%A8%EC%9D%B42023-11-13T12:37:41.098Zhttps://minseok0123.github.io/static%20%EC%A0%91%EA%B7%BC%EB%B0%A9%EC%8B%9D%20%EB%B3%80%EC%88%98,%20%ED%95%A8%EC%88%98,%20%EC%83%9D%EC%84%B1%EC%9E%902023-11-13T12:37:41.098Zhttps://minseok0123.github.io/%EC%83%9D%EC%84%B1%EC%9E%90%EC%99%80%20static%20%EB%B3%80%EC%88%982023-11-13T12:37:41.098Zhttps://minseok0123.github.io/%EC%BD%9C%EB%B0%94%EC%9D%B4%EB%B0%B8%EB%A5%98%20vs%20%EC%BD%9C%EB%B0%94%EC%9D%B4%EB%A0%88%ED%8D%BC%EB%9F%B0%EC%8A%A4%20ref%EC%99%80%20out%20%EC%B0%A8%EC%9D%B42023-11-13T12:37:41.098Zhttps://minseok0123.github.io/private,%20public,%20protected%20%EC%A0%91%EA%B7%BC%EC%A0%9C%EC%96%B42023-11-13T12:37:41.098Zhttps://minseok0123.github.io/private%EC%97%90%20%EC%A0%91%EA%B7%BC%ED%95%98%EA%B8%B0,%20get%20set%EA%B3%BC%20property%20%EC%86%8D%EC%84%B12023-11-13T12:37:41.098Zhttps://minseok0123.github.io/C%EC%83%B5%20Class%EC%99%80%20Struct%EC%B0%A8%EC%9D%B42023-11-13T12:37:41.098Zhttps://minseok0123.github.io/%EA%B7%B8%EB%9E%98%ED%94%84%20%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%982023-11-13T12:37:41.098Zhttps://minseok0123.github.io/%EC%B5%9C%EB%8B%A8%20%EA%B2%BD%EB%A1%9C2023-11-13T12:37:41.098Zhttps://minseok0123.github.io/ESP32%EB%A1%9C%20%EB%A7%8C%EB%93%A0%20%EC%8A%A4%EB%A7%88%ED%8A%B8%20%EA%B8%B0%EC%88%99%EC%82%AC%20%EC%8B%9C%EC%8A%A4%ED%85%9C2023-11-13T12:37:41.098Zhttps://minseok0123.github.io/%EB%8B%A4%EC%9D%B4%EB%82%98%EB%AF%B9%20%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D2023-11-13T12:37:41.098Zhttps://minseok0123.github.io/%ED%83%90%EC%83%89%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%982023-11-13T12:37:41.098Zhttps://minseok0123.github.io/DFS%EC%99%80%20BFS2023-11-13T12:37:41.098Zhttps://minseok0123.github.io/%EC%A0%95%EB%A0%AC%20%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%982023-11-13T12:37:41.098Zhttps://minseok0123.github.io/%EC%8B%9C%EB%AE%AC%EB%A0%88%EC%9D%B4%EC%85%98%EA%B3%BC%20%EC%99%84%EC%A0%84%ED%83%90%EC%83%892023-11-13T12:37:41.098Zhttps://minseok0123.github.io/%EA%B7%B8%EB%A6%AC%EB%94%94%20%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%982023-11-13T12:37:41.098Zhttps://minseok0123.github.io/ESP8266%EC%97%90%20%EA%B4%80%ED%95%98%EC%97%AC2023-11-13T12:37:41.098Zhttps://minseok0123.github.io/diff-svc%20%EC%9D%8C%EC%84%B1%ED%8C%8C%EC%9D%BC%20(%EC%A0%84%EC%B2%98%EB%A6%AC)%EB%A7%8C%EB%93%9C%EB%8A%94%20%EB%B2%952023-11-13T12:37:41.098Zhttps://minseok0123.github.io/recoil%EC%9D%84%20%ED%95%9C%EB%B2%88%20%EC%95%8C%EC%95%84%EB%B3%B4%EC%9E%902023-11-13T12:37:41.098Zhttps://minseok0123.github.io/%EB%A6%AC%EC%95%A1%ED%8A%B8props2023-11-13T12:37:41.098Zhttps://minseok0123.github.io/Java%20Collection%20Framework%EC%97%90%20%EB%8C%80%ED%95%B4%20%EC%95%8C%EC%95%84%EB%B3%B4%EC%9E%902023-11-13T12:37:41.098Zhttps://minseok0123.github.io/ESP8266%EC%9C%BC%EB%A1%9C%20%EB%A7%8C%EB%93%A0%20%EC%8A%A4%EB%A7%88%ED%8A%B8%ED%8C%9C2023-11-13T12:37:41.098Zhttps://minseok0123.github.io/%EC%95%84%EB%91%90%EC%9D%B4%EB%85%B8%20%EC%8A%A4%EB%A7%88%ED%8A%B8%20%EC%93%B0%EB%A0%88%EA%B8%B0%ED%86%B52023-11-13T12:37:41.098Zhttps://minseok0123.github.io/2023-11-13T12:37:41.098Zhttps://minseok0123.github.io/recent2023-11-13T12:37:41.098Zhttps://minseok0123.github.io/search2023-11-13T12:37:41.098Z \ No newline at end of file +https://minseok0123.github.io/1%EC%B0%A8%EC%9B%90%20%EB%B0%B0%EC%97%B42023-11-15T15:03:39.485Zhttps://minseok0123.github.io/2%EC%B0%A8%EC%9B%90%20%EB%B0%B0%EC%97%B4%EA%B3%BC%20%EA%B0%80%EB%B3%80%EB%B0%B0%EC%97%B42023-11-15T15:03:39.485Zhttps://minseok0123.github.io/%EB%B0%95%EC%8B%B1%EA%B3%BC%20%EC%96%B8%EB%B0%95%EC%8B%B12023-11-15T15:03:39.485Zhttps://minseok0123.github.io/%EC%97%85%EC%BA%90%EC%8A%A4%ED%8C%85%EC%9D%98%20%EC%9C%A0%EC%9A%A9%ED%95%A82023-11-15T15:03:39.486Zhttps://minseok0123.github.io/%EC%B6%94%EC%83%81%ED%81%B4%EB%9E%98%EC%8A%A4%20vs%20%EC%9D%B8%ED%84%B0%ED%8E%98%EC%9D%B4%EC%8A%A4%20%EC%B0%A8%EC%9D%B42023-11-15T15:03:39.486Zhttps://minseok0123.github.io/%EC%98%A4%EB%B2%84%EB%9D%BC%EC%9D%B4%EB%94%A92023-11-15T15:03:39.486Zhttps://minseok0123.github.io/this%EC%99%80%20this%EB%A5%BC%20%ED%86%B5%ED%95%9C%20%EC%83%9D%EC%84%B1%EC%9E%90%20%ED%98%B8%EC%B6%9C2023-11-15T15:03:39.486Zhttps://minseok0123.github.io/%EC%97%B0%EC%82%B0%EC%9E%90%20%EC%98%A4%EB%B2%84%EB%A1%9C%EB%94%A92023-11-15T15:03:39.486Zhttps://minseok0123.github.io/%EC%98%A4%EB%B2%84%EB%A1%9C%EB%94%A9(Over%20loading)2023-11-15T15:03:39.487Zhttps://minseok0123.github.io/const%20%EC%83%81%EC%88%98%EC%99%80%20readonly%20%EC%83%81%EC%88%98%20%EC%B0%A8%EC%9D%B42023-11-15T15:03:39.487Zhttps://minseok0123.github.io/static%20%EC%A0%91%EA%B7%BC%EB%B0%A9%EC%8B%9D%20%EB%B3%80%EC%88%98,%20%ED%95%A8%EC%88%98,%20%EC%83%9D%EC%84%B1%EC%9E%902023-11-15T15:03:39.487Zhttps://minseok0123.github.io/%EC%83%9D%EC%84%B1%EC%9E%90%EC%99%80%20static%20%EB%B3%80%EC%88%982023-11-15T15:03:39.487Zhttps://minseok0123.github.io/%EC%BD%9C%EB%B0%94%EC%9D%B4%EB%B0%B8%EB%A5%98%20vs%20%EC%BD%9C%EB%B0%94%EC%9D%B4%EB%A0%88%ED%8D%BC%EB%9F%B0%EC%8A%A4%20ref%EC%99%80%20out%20%EC%B0%A8%EC%9D%B42023-11-15T15:03:39.487Zhttps://minseok0123.github.io/private,%20public,%20protected%20%EC%A0%91%EA%B7%BC%EC%A0%9C%EC%96%B42023-11-15T15:03:39.487Zhttps://minseok0123.github.io/private%EC%97%90%20%EC%A0%91%EA%B7%BC%ED%95%98%EA%B8%B0,%20get%20set%EA%B3%BC%20property%20%EC%86%8D%EC%84%B12023-11-15T15:03:39.487Zhttps://minseok0123.github.io/C%EC%83%B5%20Class%EC%99%80%20Struct%EC%B0%A8%EC%9D%B42023-11-15T15:03:39.487Zhttps://minseok0123.github.io/%EA%B7%B8%EB%9E%98%ED%94%84%20%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%982023-11-15T15:03:39.487Zhttps://minseok0123.github.io/%EC%B5%9C%EB%8B%A8%20%EA%B2%BD%EB%A1%9C2023-11-15T15:03:39.487Zhttps://minseok0123.github.io/ESP32%EB%A1%9C%20%EB%A7%8C%EB%93%A0%20%EC%8A%A4%EB%A7%88%ED%8A%B8%20%EA%B8%B0%EC%88%99%EC%82%AC%20%EC%8B%9C%EC%8A%A4%ED%85%9C2023-11-15T15:03:39.487Zhttps://minseok0123.github.io/%EB%8B%A4%EC%9D%B4%EB%82%98%EB%AF%B9%20%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D2023-11-15T15:03:39.487Zhttps://minseok0123.github.io/%ED%83%90%EC%83%89%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%982023-11-15T15:03:39.487Zhttps://minseok0123.github.io/DFS%EC%99%80%20BFS2023-11-15T15:03:39.487Zhttps://minseok0123.github.io/%EC%A0%95%EB%A0%AC%20%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%982023-11-15T15:03:39.487Zhttps://minseok0123.github.io/%EC%8B%9C%EB%AE%AC%EB%A0%88%EC%9D%B4%EC%85%98%EA%B3%BC%20%EC%99%84%EC%A0%84%ED%83%90%EC%83%892023-11-15T15:03:39.487Zhttps://minseok0123.github.io/%EA%B7%B8%EB%A6%AC%EB%94%94%20%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%982023-11-15T15:03:39.487Zhttps://minseok0123.github.io/ESP8266%EC%97%90%20%EA%B4%80%ED%95%98%EC%97%AC2023-11-15T15:03:39.487Zhttps://minseok0123.github.io/diff-svc%20%EC%9D%8C%EC%84%B1%ED%8C%8C%EC%9D%BC%20(%EC%A0%84%EC%B2%98%EB%A6%AC)%EB%A7%8C%EB%93%9C%EB%8A%94%20%EB%B2%952023-11-15T15:03:39.487Zhttps://minseok0123.github.io/recoil%EC%9D%84%20%ED%95%9C%EB%B2%88%20%EC%95%8C%EC%95%84%EB%B3%B4%EC%9E%902023-11-15T15:03:39.487Zhttps://minseok0123.github.io/%EB%A6%AC%EC%95%A1%ED%8A%B8props2023-11-15T15:03:39.487Zhttps://minseok0123.github.io/Java%20Collection%20Framework%EC%97%90%20%EB%8C%80%ED%95%B4%20%EC%95%8C%EC%95%84%EB%B3%B4%EC%9E%902023-11-15T15:03:39.487Zhttps://minseok0123.github.io/ESP8266%EC%9C%BC%EB%A1%9C%20%EB%A7%8C%EB%93%A0%20%EC%8A%A4%EB%A7%88%ED%8A%B8%ED%8C%9C2023-11-15T15:03:39.487Zhttps://minseok0123.github.io/%EC%95%84%EB%91%90%EC%9D%B4%EB%85%B8%20%EC%8A%A4%EB%A7%88%ED%8A%B8%20%EC%93%B0%EB%A0%88%EA%B8%B0%ED%86%B52023-11-15T15:03:39.487Zhttps://minseok0123.github.io/2023-11-15T15:03:39.487Zhttps://minseok0123.github.io/recent2023-11-15T15:03:39.487Zhttps://minseok0123.github.io/search2023-11-15T15:03:39.488Z \ No newline at end of file diff --git a/sitemap.xml b/sitemap.xml index 525b22d..b825923 100644 --- a/sitemap.xml +++ b/sitemap.xml @@ -1 +1 @@ -https://minseok0123.github.io/sitemap-pages.xml2023-11-13T12:37:41.120Z \ No newline at end of file +https://minseok0123.github.io/sitemap-pages.xml2023-11-15T15:03:39.493Z \ No newline at end of file diff --git "a/static \354\240\221\352\267\274\353\260\251\354\213\235 \353\263\200\354\210\230, \355\225\250\354\210\230, \354\203\235\354\204\261\354\236\220/index.html" "b/static \354\240\221\352\267\274\353\260\251\354\213\235 \353\263\200\354\210\230, \355\225\250\354\210\230, \354\203\235\354\204\261\354\236\220/index.html" index 5c9ad9e..5ed75c8 100644 --- "a/static \354\240\221\352\267\274\353\260\251\354\213\235 \353\263\200\354\210\230, \355\225\250\354\210\230, \354\203\235\354\204\261\354\236\220/index.html" +++ "b/static \354\240\221\352\267\274\353\260\251\354\213\235 \353\263\200\354\210\230, \355\225\250\354\210\230, \354\203\235\354\204\261\354\236\220/index.html" @@ -101,7 +101,7 @@ setTheme(preferredTheme || (darkQuery.matches ? 'dark' : 'light')) }() -
    minlog

    static 접근방식 변수, 함수, 생성자

    2023.11.02·조회수:
    0
    thumbnail
     

    static 접근방식 변수, 함수, 생성자

    +
    minlog

    static 접근방식 변수, 함수, 생성자

    2023.11.02·조회수:
    0
    thumbnail
     

    static 접근방식 변수, 함수, 생성자

    일반 맴버 변수는 객체를 생성해야지만 메모리가 생성된다. (별도로 메모리를 할당해야 접근가능)
    하지만 스태틱 변수는 객체 생성 이전에 접근할 수 있다. (프로그램 시작과 동시에 가장 먼저 할당)

    1. Static 변수 : 객체생성 X

    @@ -211,10 +211,10 @@

    스태틱 생성자= new 테스트(); // 실행시 결과 = [1. static 생성자 최초 실행], [2. 일반 생성자 최초 실행]가 실행된다. } } -

    +
    - \ No newline at end of file + \ No newline at end of file diff --git "a/this\354\231\200 this\353\245\274 \355\206\265\355\225\234 \354\203\235\354\204\261\354\236\220 \355\230\270\354\266\234/index.html" "b/this\354\231\200 this\353\245\274 \355\206\265\355\225\234 \354\203\235\354\204\261\354\236\220 \355\230\270\354\266\234/index.html" index 5708fbd..c6fcb46 100644 --- "a/this\354\231\200 this\353\245\274 \355\206\265\355\225\234 \354\203\235\354\204\261\354\236\220 \355\230\270\354\266\234/index.html" +++ "b/this\354\231\200 this\353\245\274 \355\206\265\355\225\234 \354\203\235\354\204\261\354\236\220 \355\230\270\354\266\234/index.html" @@ -101,7 +101,7 @@ setTheme(preferredTheme || (darkQuery.matches ? 'dark' : 'light')) }() -
    minlog

    this와 this를 통한 생성자 호출

    2023.11.07·조회수:
    0
    thumbnail
     

    this와 this를 통한 생성자 호출

    +
    minlog

    this와 this를 통한 생성자 호출

    2023.11.07·조회수:
    0
    thumbnail
     

    this와 this를 통한 생성자 호출

    this

    클래스 내에서 정의된 맴버를 가르킬때 사용한다.

    @@ -224,10 +224,10 @@

    상속 배울

    [할아버지 -> 아빠 -> 아들] 순서로 실행되는 것처럼 생성자도 [3번 -> 2번 -> 1번] 순서로 호출되게 된다.

    -
    +
    - \ No newline at end of file + \ No newline at end of file diff --git a/webpack-runtime-6d818bd7d955c9a16c3c.js b/webpack-runtime-6d818bd7d955c9a16c3c.js new file mode 100644 index 0000000..aa0888a --- /dev/null +++ b/webpack-runtime-6d818bd7d955c9a16c3c.js @@ -0,0 +1,2 @@ +!function(){"use strict";var e,t,n,r,o,c={},f={};function u(e){var t=f[e];if(void 0!==t)return t.exports;var n=f[e]={exports:{}};return c[e](n,n.exports,u),n.exports}u.m=c,e=[],u.O=function(t,n,r,o){if(!n){var c=1/0;for(s=0;s=o)&&Object.keys(u.O).every((function(e){return u.O[e](n[a])}))?n.splice(a--,1):(f=!1,o0&&e[s-1][2]>o;s--)e[s]=e[s-1];e[s]=[n,r,o]},u.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return u.d(t,{a:t}),t},n=Object.getPrototypeOf?function(e){return Object.getPrototypeOf(e)}:function(e){return e.__proto__},u.t=function(e,r){if(1&r&&(e=this(e)),8&r)return e;if("object"==typeof e&&e){if(4&r&&e.__esModule)return e;if(16&r&&"function"==typeof e.then)return e}var o=Object.create(null);u.r(o);var c={};t=t||[null,n({}),n([]),n(n)];for(var f=2&r&&e;"object"==typeof f&&!~t.indexOf(f);f=n(f))Object.getOwnPropertyNames(f).forEach((function(t){c[t]=function(){return e[t]}}));return c.default=function(){return e},u.d(o,c),o},u.d=function(e,t){for(var n in t)u.o(t,n)&&!u.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:t[n]})},u.f={},u.e=function(e){return Promise.all(Object.keys(u.f).reduce((function(t,n){return u.f[n](e,t),t}),[]))},u.u=function(e){return({133:"component---src-templates-post-template-tsx",206:"component---src-pages-recent-tsx",218:"component---src-pages-404-tsx",334:"component---src-pages-search-tsx",417:"41384b3c",470:"63a8ec3f",679:"8e5f29247fb400f66d09f337f68113b877142f92",691:"component---src-pages-index-tsx",814:"0c4cdc70b932cf3bbeb74bf4a34299c3d3bc0c27",840:"3f2356c6c582ac409c3f15f0578f4ec9be7dcbc5"}[e]||e)+"-"+{133:"f26c93d9cee0872ef069",206:"c68af4950cae6ae93f47",218:"e950cf19f7f97970aabd",334:"f0619a1254d9f72d4cee",417:"0c4482b27eaf2cec067d",470:"7c2f188a91c57aaabce4",679:"d74f7497417ad3d42730",691:"87545ea7748068b24475",731:"4c1e76c10075794178e2",814:"7c9571ace2cb54d10812",840:"a27fd4e673597a7ed503",843:"4d22e4d87d98fa226c97"}[e]+".js"},u.miniCssF=function(e){return"styles.094b275f741c4a654a9b.css"},u.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),u.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},r={},o="gatsby-starter-default:",u.l=function(e,t,n,c){if(r[e])r[e].push(t);else{var f,a;if(void 0!==n)for(var i=document.getElementsByTagName("script"),s=0;s 0 && deferred[i - 1][2] > priority; i--) deferred[i] = deferred[i - 1];\n\t\tdeferred[i] = [chunkIds, fn, priority];\n\t\treturn;\n\t}\n\tvar notFulfilled = Infinity;\n\tfor (var i = 0; i < deferred.length; i++) {\n\t\tvar chunkIds = deferred[i][0];\n\t\tvar fn = deferred[i][1];\n\t\tvar priority = deferred[i][2];\n\t\tvar fulfilled = true;\n\t\tfor (var j = 0; j < chunkIds.length; j++) {\n\t\t\tif ((priority & 1 === 0 || notFulfilled >= priority) && Object.keys(__webpack_require__.O).every(function(key) { return __webpack_require__.O[key](chunkIds[j]); })) {\n\t\t\t\tchunkIds.splice(j--, 1);\n\t\t\t} else {\n\t\t\t\tfulfilled = false;\n\t\t\t\tif(priority < notFulfilled) notFulfilled = priority;\n\t\t\t}\n\t\t}\n\t\tif(fulfilled) {\n\t\t\tdeferred.splice(i--, 1)\n\t\t\tvar r = fn();\n\t\t\tif (r !== undefined) result = r;\n\t\t}\n\t}\n\treturn result;\n};","var getProto = Object.getPrototypeOf ? function(obj) { return Object.getPrototypeOf(obj); } : function(obj) { return obj.__proto__; };\nvar leafPrototypes;\n// create a fake namespace object\n// mode & 1: value is a module id, require it\n// mode & 2: merge all properties of value into the ns\n// mode & 4: return value when already ns object\n// mode & 16: return value when it's Promise-like\n// mode & 8|1: behave like require\n__webpack_require__.t = function(value, mode) {\n\tif(mode & 1) value = this(value);\n\tif(mode & 8) return value;\n\tif(typeof value === 'object' && value) {\n\t\tif((mode & 4) && value.__esModule) return value;\n\t\tif((mode & 16) && typeof value.then === 'function') return value;\n\t}\n\tvar ns = Object.create(null);\n\t__webpack_require__.r(ns);\n\tvar def = {};\n\tleafPrototypes = leafPrototypes || [null, getProto({}), getProto([]), getProto(getProto)];\n\tfor(var current = mode & 2 && value; typeof current == 'object' && !~leafPrototypes.indexOf(current); current = getProto(current)) {\n\t\tObject.getOwnPropertyNames(current).forEach(function(key) { def[key] = function() { return value[key]; }; });\n\t}\n\tdef['default'] = function() { return value; };\n\t__webpack_require__.d(ns, def);\n\treturn ns;\n};","var inProgress = {};\nvar dataWebpackPrefix = \"gatsby-starter-default:\";\n// loadScript function to load a script via script tag\n__webpack_require__.l = function(url, done, key, chunkId) {\n\tif(inProgress[url]) { inProgress[url].push(done); return; }\n\tvar script, needAttach;\n\tif(key !== undefined) {\n\t\tvar scripts = document.getElementsByTagName(\"script\");\n\t\tfor(var i = 0; i < scripts.length; i++) {\n\t\t\tvar s = scripts[i];\n\t\t\tif(s.getAttribute(\"src\") == url || s.getAttribute(\"data-webpack\") == dataWebpackPrefix + key) { script = s; break; }\n\t\t}\n\t}\n\tif(!script) {\n\t\tneedAttach = true;\n\t\tscript = document.createElement('script');\n\n\t\tscript.charset = 'utf-8';\n\t\tscript.timeout = 120;\n\t\tif (__webpack_require__.nc) {\n\t\t\tscript.setAttribute(\"nonce\", __webpack_require__.nc);\n\t\t}\n\t\tscript.setAttribute(\"data-webpack\", dataWebpackPrefix + key);\n\t\tscript.src = url;\n\t}\n\tinProgress[url] = [done];\n\tvar onScriptComplete = function(prev, event) {\n\t\t// avoid mem leaks in IE.\n\t\tscript.onerror = script.onload = null;\n\t\tclearTimeout(timeout);\n\t\tvar doneFns = inProgress[url];\n\t\tdelete inProgress[url];\n\t\tscript.parentNode && script.parentNode.removeChild(script);\n\t\tdoneFns && doneFns.forEach(function(fn) { return fn(event); });\n\t\tif(prev) return prev(event);\n\t}\n\tvar timeout = setTimeout(onScriptComplete.bind(null, undefined, { type: 'timeout', target: script }), 120000);\n\tscript.onerror = onScriptComplete.bind(null, script.onerror);\n\tscript.onload = onScriptComplete.bind(null, script.onload);\n\tneedAttach && document.head.appendChild(script);\n};","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n// expose the modules object (__webpack_modules__)\n__webpack_require__.m = __webpack_modules__;\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = function(module) {\n\tvar getter = module && module.__esModule ?\n\t\tfunction() { return module['default']; } :\n\t\tfunction() { return module; };\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = function(exports, definition) {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.f = {};\n// This file contains only the entry chunk.\n// The chunk loading function for additional chunks\n__webpack_require__.e = function(chunkId) {\n\treturn Promise.all(Object.keys(__webpack_require__.f).reduce(function(promises, key) {\n\t\t__webpack_require__.f[key](chunkId, promises);\n\t\treturn promises;\n\t}, []));\n};","// This function allow to reference async chunks\n__webpack_require__.u = function(chunkId) {\n\t// return url for filenames based on template\n\treturn \"\" + ({\"133\":\"component---src-templates-post-template-tsx\",\"206\":\"component---src-pages-recent-tsx\",\"218\":\"component---src-pages-404-tsx\",\"334\":\"component---src-pages-search-tsx\",\"417\":\"41384b3c\",\"470\":\"63a8ec3f\",\"679\":\"8e5f29247fb400f66d09f337f68113b877142f92\",\"691\":\"component---src-pages-index-tsx\",\"814\":\"0c4cdc70b932cf3bbeb74bf4a34299c3d3bc0c27\",\"840\":\"3f2356c6c582ac409c3f15f0578f4ec9be7dcbc5\"}[chunkId] || chunkId) + \"-\" + {\"133\":\"f26c93d9cee0872ef069\",\"206\":\"c68af4950cae6ae93f47\",\"218\":\"e950cf19f7f97970aabd\",\"334\":\"f0619a1254d9f72d4cee\",\"417\":\"0c4482b27eaf2cec067d\",\"470\":\"7c2f188a91c57aaabce4\",\"679\":\"d74f7497417ad3d42730\",\"691\":\"87545ea7748068b24475\",\"731\":\"4c1e76c10075794178e2\",\"814\":\"7c9571ace2cb54d10812\",\"840\":\"a27fd4e673597a7ed503\",\"843\":\"4d22e4d87d98fa226c97\"}[chunkId] + \".js\";\n};","// This function allow to reference all chunks\n__webpack_require__.miniCssF = function(chunkId) {\n\t// return url for filenames based on template\n\treturn \"\" + \"styles\" + \".\" + \"094b275f741c4a654a9b\" + \".css\";\n};","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.o = function(obj, prop) { return Object.prototype.hasOwnProperty.call(obj, prop); }","// define __esModule on exports\n__webpack_require__.r = function(exports) {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","__webpack_require__.p = \"/\";","// no baseURI\n\n// object to store loaded and loading chunks\n// undefined = chunk not loaded, null = chunk preloaded/prefetched\n// [resolve, reject, Promise] = chunk loading, 0 = chunk loaded\nvar installedChunks = {\n\t658: 0,\n\t532: 0\n};\n\n__webpack_require__.f.j = function(chunkId, promises) {\n\t\t// JSONP chunk loading for javascript\n\t\tvar installedChunkData = __webpack_require__.o(installedChunks, chunkId) ? installedChunks[chunkId] : undefined;\n\t\tif(installedChunkData !== 0) { // 0 means \"already installed\".\n\n\t\t\t// a Promise means \"currently loading\".\n\t\t\tif(installedChunkData) {\n\t\t\t\tpromises.push(installedChunkData[2]);\n\t\t\t} else {\n\t\t\t\tif(!/^(532|658)$/.test(chunkId)) {\n\t\t\t\t\t// setup Promise in chunk cache\n\t\t\t\t\tvar promise = new Promise(function(resolve, reject) { installedChunkData = installedChunks[chunkId] = [resolve, reject]; });\n\t\t\t\t\tpromises.push(installedChunkData[2] = promise);\n\n\t\t\t\t\t// start chunk loading\n\t\t\t\t\tvar url = __webpack_require__.p + __webpack_require__.u(chunkId);\n\t\t\t\t\t// create error before stack unwound to get useful stacktrace later\n\t\t\t\t\tvar error = new Error();\n\t\t\t\t\tvar loadingEnded = function(event) {\n\t\t\t\t\t\tif(__webpack_require__.o(installedChunks, chunkId)) {\n\t\t\t\t\t\t\tinstalledChunkData = installedChunks[chunkId];\n\t\t\t\t\t\t\tif(installedChunkData !== 0) installedChunks[chunkId] = undefined;\n\t\t\t\t\t\t\tif(installedChunkData) {\n\t\t\t\t\t\t\t\tvar errorType = event && (event.type === 'load' ? 'missing' : event.type);\n\t\t\t\t\t\t\t\tvar realSrc = event && event.target && event.target.src;\n\t\t\t\t\t\t\t\terror.message = 'Loading chunk ' + chunkId + ' failed.\\n(' + errorType + ': ' + realSrc + ')';\n\t\t\t\t\t\t\t\terror.name = 'ChunkLoadError';\n\t\t\t\t\t\t\t\terror.type = errorType;\n\t\t\t\t\t\t\t\terror.request = realSrc;\n\t\t\t\t\t\t\t\tinstalledChunkData[1](error);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t\t\t__webpack_require__.l(url, loadingEnded, \"chunk-\" + chunkId, chunkId);\n\t\t\t\t} else installedChunks[chunkId] = 0;\n\t\t\t}\n\t\t}\n};\n\n// no prefetching\n\n// no preloaded\n\n// no HMR\n\n// no HMR manifest\n\n__webpack_require__.O.j = function(chunkId) { return installedChunks[chunkId] === 0; };\n\n// install a JSONP callback for chunk loading\nvar webpackJsonpCallback = function(parentChunkLoadingFunction, data) {\n\tvar chunkIds = data[0];\n\tvar moreModules = data[1];\n\tvar runtime = data[2];\n\t// add \"moreModules\" to the modules object,\n\t// then flag all \"chunkIds\" as loaded and fire callback\n\tvar moduleId, chunkId, i = 0;\n\tif(chunkIds.some(function(id) { return installedChunks[id] !== 0; })) {\n\t\tfor(moduleId in moreModules) {\n\t\t\tif(__webpack_require__.o(moreModules, moduleId)) {\n\t\t\t\t__webpack_require__.m[moduleId] = moreModules[moduleId];\n\t\t\t}\n\t\t}\n\t\tif(runtime) var result = runtime(__webpack_require__);\n\t}\n\tif(parentChunkLoadingFunction) parentChunkLoadingFunction(data);\n\tfor(;i < chunkIds.length; i++) {\n\t\tchunkId = chunkIds[i];\n\t\tif(__webpack_require__.o(installedChunks, chunkId) && installedChunks[chunkId]) {\n\t\t\tinstalledChunks[chunkId][0]();\n\t\t}\n\t\tinstalledChunks[chunkId] = 0;\n\t}\n\treturn __webpack_require__.O(result);\n}\n\nvar chunkLoadingGlobal = self[\"webpackChunkgatsby_starter_default\"] = self[\"webpackChunkgatsby_starter_default\"] || [];\nchunkLoadingGlobal.forEach(webpackJsonpCallback.bind(null, 0));\nchunkLoadingGlobal.push = webpackJsonpCallback.bind(null, chunkLoadingGlobal.push.bind(chunkLoadingGlobal));"],"names":["deferred","leafPrototypes","getProto","inProgress","dataWebpackPrefix","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","undefined","exports","module","__webpack_modules__","m","O","result","chunkIds","fn","priority","notFulfilled","Infinity","i","length","fulfilled","j","Object","keys","every","key","splice","r","n","getter","__esModule","d","a","getPrototypeOf","obj","__proto__","t","value","mode","this","then","ns","create","def","current","indexOf","getOwnPropertyNames","forEach","definition","o","defineProperty","enumerable","get","f","e","chunkId","Promise","all","reduce","promises","u","miniCssF","g","globalThis","Function","window","prop","prototype","hasOwnProperty","call","l","url","done","push","script","needAttach","scripts","document","getElementsByTagName","s","getAttribute","createElement","charset","timeout","nc","setAttribute","src","onScriptComplete","prev","event","onerror","onload","clearTimeout","doneFns","parentNode","removeChild","setTimeout","bind","type","target","head","appendChild","Symbol","toStringTag","p","installedChunks","installedChunkData","test","promise","resolve","reject","error","Error","errorType","realSrc","message","name","request","webpackJsonpCallback","parentChunkLoadingFunction","data","moreModules","runtime","some","id","chunkLoadingGlobal","self"],"sourceRoot":""} \ No newline at end of file diff --git a/webpack-runtime-a664107c2b484150c8f9.js b/webpack-runtime-a664107c2b484150c8f9.js new file mode 100644 index 0000000..e93b8ac --- /dev/null +++ b/webpack-runtime-a664107c2b484150c8f9.js @@ -0,0 +1,2 @@ +!function(){"use strict";var e,t,n,r,o,c={},f={};function u(e){var t=f[e];if(void 0!==t)return t.exports;var n=f[e]={exports:{}};return c[e](n,n.exports,u),n.exports}u.m=c,e=[],u.O=function(t,n,r,o){if(!n){var c=1/0;for(s=0;s=o)&&Object.keys(u.O).every((function(e){return u.O[e](n[a])}))?n.splice(a--,1):(f=!1,o0&&e[s-1][2]>o;s--)e[s]=e[s-1];e[s]=[n,r,o]},u.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return u.d(t,{a:t}),t},n=Object.getPrototypeOf?function(e){return Object.getPrototypeOf(e)}:function(e){return e.__proto__},u.t=function(e,r){if(1&r&&(e=this(e)),8&r)return e;if("object"==typeof e&&e){if(4&r&&e.__esModule)return e;if(16&r&&"function"==typeof e.then)return e}var o=Object.create(null);u.r(o);var c={};t=t||[null,n({}),n([]),n(n)];for(var f=2&r&&e;"object"==typeof f&&!~t.indexOf(f);f=n(f))Object.getOwnPropertyNames(f).forEach((function(t){c[t]=function(){return e[t]}}));return c.default=function(){return e},u.d(o,c),o},u.d=function(e,t){for(var n in t)u.o(t,n)&&!u.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:t[n]})},u.f={},u.e=function(e){return Promise.all(Object.keys(u.f).reduce((function(t,n){return u.f[n](e,t),t}),[]))},u.u=function(e){return({133:"component---src-templates-post-template-tsx",206:"component---src-pages-recent-tsx",218:"component---src-pages-404-tsx",334:"component---src-pages-search-tsx",417:"41384b3c",470:"63a8ec3f",679:"8e5f29247fb400f66d09f337f68113b877142f92",691:"component---src-pages-index-tsx",814:"0c4cdc70b932cf3bbeb74bf4a34299c3d3bc0c27",840:"3f2356c6c582ac409c3f15f0578f4ec9be7dcbc5"}[e]||e)+"-"+{133:"f26c93d9cee0872ef069",206:"c68af4950cae6ae93f47",218:"e950cf19f7f97970aabd",334:"f0619a1254d9f72d4cee",417:"0c4482b27eaf2cec067d",470:"93e1a0ad47f8b8b18696",679:"d74f7497417ad3d42730",691:"87545ea7748068b24475",731:"4c1e76c10075794178e2",814:"7c9571ace2cb54d10812",840:"a27fd4e673597a7ed503",843:"4d22e4d87d98fa226c97"}[e]+".js"},u.miniCssF=function(e){return"styles.094b275f741c4a654a9b.css"},u.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),u.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},r={},o="gatsby-starter-default:",u.l=function(e,t,n,c){if(r[e])r[e].push(t);else{var f,a;if(void 0!==n)for(var i=document.getElementsByTagName("script"),s=0;s 0 && deferred[i - 1][2] > priority; i--) deferred[i] = deferred[i - 1];\n\t\tdeferred[i] = [chunkIds, fn, priority];\n\t\treturn;\n\t}\n\tvar notFulfilled = Infinity;\n\tfor (var i = 0; i < deferred.length; i++) {\n\t\tvar chunkIds = deferred[i][0];\n\t\tvar fn = deferred[i][1];\n\t\tvar priority = deferred[i][2];\n\t\tvar fulfilled = true;\n\t\tfor (var j = 0; j < chunkIds.length; j++) {\n\t\t\tif ((priority & 1 === 0 || notFulfilled >= priority) && Object.keys(__webpack_require__.O).every(function(key) { return __webpack_require__.O[key](chunkIds[j]); })) {\n\t\t\t\tchunkIds.splice(j--, 1);\n\t\t\t} else {\n\t\t\t\tfulfilled = false;\n\t\t\t\tif(priority < notFulfilled) notFulfilled = priority;\n\t\t\t}\n\t\t}\n\t\tif(fulfilled) {\n\t\t\tdeferred.splice(i--, 1)\n\t\t\tvar r = fn();\n\t\t\tif (r !== undefined) result = r;\n\t\t}\n\t}\n\treturn result;\n};","var getProto = Object.getPrototypeOf ? function(obj) { return Object.getPrototypeOf(obj); } : function(obj) { return obj.__proto__; };\nvar leafPrototypes;\n// create a fake namespace object\n// mode & 1: value is a module id, require it\n// mode & 2: merge all properties of value into the ns\n// mode & 4: return value when already ns object\n// mode & 16: return value when it's Promise-like\n// mode & 8|1: behave like require\n__webpack_require__.t = function(value, mode) {\n\tif(mode & 1) value = this(value);\n\tif(mode & 8) return value;\n\tif(typeof value === 'object' && value) {\n\t\tif((mode & 4) && value.__esModule) return value;\n\t\tif((mode & 16) && typeof value.then === 'function') return value;\n\t}\n\tvar ns = Object.create(null);\n\t__webpack_require__.r(ns);\n\tvar def = {};\n\tleafPrototypes = leafPrototypes || [null, getProto({}), getProto([]), getProto(getProto)];\n\tfor(var current = mode & 2 && value; typeof current == 'object' && !~leafPrototypes.indexOf(current); current = getProto(current)) {\n\t\tObject.getOwnPropertyNames(current).forEach(function(key) { def[key] = function() { return value[key]; }; });\n\t}\n\tdef['default'] = function() { return value; };\n\t__webpack_require__.d(ns, def);\n\treturn ns;\n};","var inProgress = {};\nvar dataWebpackPrefix = \"gatsby-starter-default:\";\n// loadScript function to load a script via script tag\n__webpack_require__.l = function(url, done, key, chunkId) {\n\tif(inProgress[url]) { inProgress[url].push(done); return; }\n\tvar script, needAttach;\n\tif(key !== undefined) {\n\t\tvar scripts = document.getElementsByTagName(\"script\");\n\t\tfor(var i = 0; i < scripts.length; i++) {\n\t\t\tvar s = scripts[i];\n\t\t\tif(s.getAttribute(\"src\") == url || s.getAttribute(\"data-webpack\") == dataWebpackPrefix + key) { script = s; break; }\n\t\t}\n\t}\n\tif(!script) {\n\t\tneedAttach = true;\n\t\tscript = document.createElement('script');\n\n\t\tscript.charset = 'utf-8';\n\t\tscript.timeout = 120;\n\t\tif (__webpack_require__.nc) {\n\t\t\tscript.setAttribute(\"nonce\", __webpack_require__.nc);\n\t\t}\n\t\tscript.setAttribute(\"data-webpack\", dataWebpackPrefix + key);\n\t\tscript.src = url;\n\t}\n\tinProgress[url] = [done];\n\tvar onScriptComplete = function(prev, event) {\n\t\t// avoid mem leaks in IE.\n\t\tscript.onerror = script.onload = null;\n\t\tclearTimeout(timeout);\n\t\tvar doneFns = inProgress[url];\n\t\tdelete inProgress[url];\n\t\tscript.parentNode && script.parentNode.removeChild(script);\n\t\tdoneFns && doneFns.forEach(function(fn) { return fn(event); });\n\t\tif(prev) return prev(event);\n\t}\n\tvar timeout = setTimeout(onScriptComplete.bind(null, undefined, { type: 'timeout', target: script }), 120000);\n\tscript.onerror = onScriptComplete.bind(null, script.onerror);\n\tscript.onload = onScriptComplete.bind(null, script.onload);\n\tneedAttach && document.head.appendChild(script);\n};","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n// expose the modules object (__webpack_modules__)\n__webpack_require__.m = __webpack_modules__;\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = function(module) {\n\tvar getter = module && module.__esModule ?\n\t\tfunction() { return module['default']; } :\n\t\tfunction() { return module; };\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = function(exports, definition) {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.f = {};\n// This file contains only the entry chunk.\n// The chunk loading function for additional chunks\n__webpack_require__.e = function(chunkId) {\n\treturn Promise.all(Object.keys(__webpack_require__.f).reduce(function(promises, key) {\n\t\t__webpack_require__.f[key](chunkId, promises);\n\t\treturn promises;\n\t}, []));\n};","// This function allow to reference async chunks\n__webpack_require__.u = function(chunkId) {\n\t// return url for filenames based on template\n\treturn \"\" + ({\"133\":\"component---src-templates-post-template-tsx\",\"206\":\"component---src-pages-recent-tsx\",\"218\":\"component---src-pages-404-tsx\",\"334\":\"component---src-pages-search-tsx\",\"417\":\"41384b3c\",\"470\":\"63a8ec3f\",\"679\":\"8e5f29247fb400f66d09f337f68113b877142f92\",\"691\":\"component---src-pages-index-tsx\",\"814\":\"0c4cdc70b932cf3bbeb74bf4a34299c3d3bc0c27\",\"840\":\"3f2356c6c582ac409c3f15f0578f4ec9be7dcbc5\"}[chunkId] || chunkId) + \"-\" + {\"133\":\"f26c93d9cee0872ef069\",\"206\":\"c68af4950cae6ae93f47\",\"218\":\"e950cf19f7f97970aabd\",\"334\":\"f0619a1254d9f72d4cee\",\"417\":\"0c4482b27eaf2cec067d\",\"470\":\"93e1a0ad47f8b8b18696\",\"679\":\"d74f7497417ad3d42730\",\"691\":\"87545ea7748068b24475\",\"731\":\"4c1e76c10075794178e2\",\"814\":\"7c9571ace2cb54d10812\",\"840\":\"a27fd4e673597a7ed503\",\"843\":\"4d22e4d87d98fa226c97\"}[chunkId] + \".js\";\n};","// This function allow to reference all chunks\n__webpack_require__.miniCssF = function(chunkId) {\n\t// return url for filenames based on template\n\treturn \"\" + \"styles\" + \".\" + \"094b275f741c4a654a9b\" + \".css\";\n};","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.o = function(obj, prop) { return Object.prototype.hasOwnProperty.call(obj, prop); }","// define __esModule on exports\n__webpack_require__.r = function(exports) {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","__webpack_require__.p = \"/\";","// no baseURI\n\n// object to store loaded and loading chunks\n// undefined = chunk not loaded, null = chunk preloaded/prefetched\n// [resolve, reject, Promise] = chunk loading, 0 = chunk loaded\nvar installedChunks = {\n\t658: 0,\n\t532: 0\n};\n\n__webpack_require__.f.j = function(chunkId, promises) {\n\t\t// JSONP chunk loading for javascript\n\t\tvar installedChunkData = __webpack_require__.o(installedChunks, chunkId) ? installedChunks[chunkId] : undefined;\n\t\tif(installedChunkData !== 0) { // 0 means \"already installed\".\n\n\t\t\t// a Promise means \"currently loading\".\n\t\t\tif(installedChunkData) {\n\t\t\t\tpromises.push(installedChunkData[2]);\n\t\t\t} else {\n\t\t\t\tif(!/^(532|658)$/.test(chunkId)) {\n\t\t\t\t\t// setup Promise in chunk cache\n\t\t\t\t\tvar promise = new Promise(function(resolve, reject) { installedChunkData = installedChunks[chunkId] = [resolve, reject]; });\n\t\t\t\t\tpromises.push(installedChunkData[2] = promise);\n\n\t\t\t\t\t// start chunk loading\n\t\t\t\t\tvar url = __webpack_require__.p + __webpack_require__.u(chunkId);\n\t\t\t\t\t// create error before stack unwound to get useful stacktrace later\n\t\t\t\t\tvar error = new Error();\n\t\t\t\t\tvar loadingEnded = function(event) {\n\t\t\t\t\t\tif(__webpack_require__.o(installedChunks, chunkId)) {\n\t\t\t\t\t\t\tinstalledChunkData = installedChunks[chunkId];\n\t\t\t\t\t\t\tif(installedChunkData !== 0) installedChunks[chunkId] = undefined;\n\t\t\t\t\t\t\tif(installedChunkData) {\n\t\t\t\t\t\t\t\tvar errorType = event && (event.type === 'load' ? 'missing' : event.type);\n\t\t\t\t\t\t\t\tvar realSrc = event && event.target && event.target.src;\n\t\t\t\t\t\t\t\terror.message = 'Loading chunk ' + chunkId + ' failed.\\n(' + errorType + ': ' + realSrc + ')';\n\t\t\t\t\t\t\t\terror.name = 'ChunkLoadError';\n\t\t\t\t\t\t\t\terror.type = errorType;\n\t\t\t\t\t\t\t\terror.request = realSrc;\n\t\t\t\t\t\t\t\tinstalledChunkData[1](error);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t\t\t__webpack_require__.l(url, loadingEnded, \"chunk-\" + chunkId, chunkId);\n\t\t\t\t} else installedChunks[chunkId] = 0;\n\t\t\t}\n\t\t}\n};\n\n// no prefetching\n\n// no preloaded\n\n// no HMR\n\n// no HMR manifest\n\n__webpack_require__.O.j = function(chunkId) { return installedChunks[chunkId] === 0; };\n\n// install a JSONP callback for chunk loading\nvar webpackJsonpCallback = function(parentChunkLoadingFunction, data) {\n\tvar chunkIds = data[0];\n\tvar moreModules = data[1];\n\tvar runtime = data[2];\n\t// add \"moreModules\" to the modules object,\n\t// then flag all \"chunkIds\" as loaded and fire callback\n\tvar moduleId, chunkId, i = 0;\n\tif(chunkIds.some(function(id) { return installedChunks[id] !== 0; })) {\n\t\tfor(moduleId in moreModules) {\n\t\t\tif(__webpack_require__.o(moreModules, moduleId)) {\n\t\t\t\t__webpack_require__.m[moduleId] = moreModules[moduleId];\n\t\t\t}\n\t\t}\n\t\tif(runtime) var result = runtime(__webpack_require__);\n\t}\n\tif(parentChunkLoadingFunction) parentChunkLoadingFunction(data);\n\tfor(;i < chunkIds.length; i++) {\n\t\tchunkId = chunkIds[i];\n\t\tif(__webpack_require__.o(installedChunks, chunkId) && installedChunks[chunkId]) {\n\t\t\tinstalledChunks[chunkId][0]();\n\t\t}\n\t\tinstalledChunks[chunkId] = 0;\n\t}\n\treturn __webpack_require__.O(result);\n}\n\nvar chunkLoadingGlobal = self[\"webpackChunkgatsby_starter_default\"] = self[\"webpackChunkgatsby_starter_default\"] || [];\nchunkLoadingGlobal.forEach(webpackJsonpCallback.bind(null, 0));\nchunkLoadingGlobal.push = webpackJsonpCallback.bind(null, chunkLoadingGlobal.push.bind(chunkLoadingGlobal));"],"names":["deferred","leafPrototypes","getProto","inProgress","dataWebpackPrefix","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","undefined","exports","module","__webpack_modules__","m","O","result","chunkIds","fn","priority","notFulfilled","Infinity","i","length","fulfilled","j","Object","keys","every","key","splice","r","n","getter","__esModule","d","a","getPrototypeOf","obj","__proto__","t","value","mode","this","then","ns","create","def","current","indexOf","getOwnPropertyNames","forEach","definition","o","defineProperty","enumerable","get","f","e","chunkId","Promise","all","reduce","promises","u","miniCssF","g","globalThis","Function","window","prop","prototype","hasOwnProperty","call","l","url","done","push","script","needAttach","scripts","document","getElementsByTagName","s","getAttribute","createElement","charset","timeout","nc","setAttribute","src","onScriptComplete","prev","event","onerror","onload","clearTimeout","doneFns","parentNode","removeChild","setTimeout","bind","type","target","head","appendChild","Symbol","toStringTag","p","installedChunks","installedChunkData","test","promise","resolve","reject","error","Error","errorType","realSrc","message","name","request","webpackJsonpCallback","parentChunkLoadingFunction","data","moreModules","runtime","some","id","chunkLoadingGlobal","self"],"sourceRoot":""} \ No newline at end of file diff --git a/webpack.stats.json b/webpack.stats.json index 70e76fa..65980c5 100644 --- a/webpack.stats.json +++ b/webpack.stats.json @@ -1 +1 @@ -{"name":"build-javascript","namedChunkGroups":{"app":{"name":"app","assets":[{"name":"webpack-runtime-b09f0d42610145b4806d.js","size":4369},{"name":"styles.094b275f741c4a654a9b.css","size":12448},{"name":"framework-6a525285796fb83f2864.js","size":140785},{"name":"76d8c668-a21b29cb6c19911264a5.js","size":78340},{"name":"7112840a-fb39337c868b4a8e175d.js","size":29999},{"name":"a198fdd9-76ef94a57d9355507fc2.js","size":108714},{"name":"e90c0614-0b013dfe0daa7a069af5.js","size":61335},{"name":"app-9d4f72a0593cf38af373.js","size":177835}],"filteredAssets":0,"assetsSize":613825,"filteredAuxiliaryAssets":7,"auxiliaryAssetsSize":3713989},"component---src-pages-404-tsx":{"name":"component---src-pages-404-tsx","assets":[{"name":"component---src-pages-404-tsx-1eefbc7aaf8c4f50be6c.js","size":8674}],"filteredAssets":0,"assetsSize":8674,"filteredAuxiliaryAssets":1,"auxiliaryAssetsSize":19495},"component---src-pages-index-tsx":{"name":"component---src-pages-index-tsx","assets":[{"name":"styles.094b275f741c4a654a9b.css","size":12448},{"name":"8e5f29247fb400f66d09f337f68113b877142f92-59676d551c9241822d90.js","size":71820},{"name":"3f2356c6c582ac409c3f15f0578f4ec9be7dcbc5-a27fd4e673597a7ed503.js","size":27411},{"name":"0c4cdc70b932cf3bbeb74bf4a34299c3d3bc0c27-7c9571ace2cb54d10812.js","size":112159},{"name":"component---src-pages-index-tsx-87545ea7748068b24475.js","size":1032}],"filteredAssets":0,"assetsSize":224870,"filteredAuxiliaryAssets":4,"auxiliaryAssetsSize":935434},"component---src-pages-recent-tsx":{"name":"component---src-pages-recent-tsx","assets":[{"name":"styles.094b275f741c4a654a9b.css","size":12448},{"name":"8e5f29247fb400f66d09f337f68113b877142f92-59676d551c9241822d90.js","size":71820},{"name":"3f2356c6c582ac409c3f15f0578f4ec9be7dcbc5-a27fd4e673597a7ed503.js","size":27411},{"name":"0c4cdc70b932cf3bbeb74bf4a34299c3d3bc0c27-7c9571ace2cb54d10812.js","size":112159},{"name":"component---src-pages-recent-tsx-c68af4950cae6ae93f47.js","size":1033}],"filteredAssets":0,"assetsSize":224871,"filteredAuxiliaryAssets":4,"auxiliaryAssetsSize":935437},"component---src-pages-search-tsx":{"name":"component---src-pages-search-tsx","assets":[{"name":"styles.094b275f741c4a654a9b.css","size":12448},{"name":"41384b3c-0c4482b27eaf2cec067d.js","size":6152},{"name":"8e5f29247fb400f66d09f337f68113b877142f92-59676d551c9241822d90.js","size":71820},{"name":"component---src-pages-search-tsx-f0619a1254d9f72d4cee.js","size":15786}],"filteredAssets":0,"assetsSize":106206,"filteredAuxiliaryAssets":3,"auxiliaryAssetsSize":270210},"component---src-templates-post-template-tsx":{"name":"component---src-templates-post-template-tsx","assets":[{"name":"styles.094b275f741c4a654a9b.css","size":12448},{"name":"63a8ec3f-184a0ec42d7a0e63badc.js","size":7722},{"name":"8e5f29247fb400f66d09f337f68113b877142f92-59676d551c9241822d90.js","size":71820},{"name":"3f2356c6c582ac409c3f15f0578f4ec9be7dcbc5-a27fd4e673597a7ed503.js","size":27411},{"name":"component---src-templates-post-template-tsx-f26c93d9cee0872ef069.js","size":8457}],"filteredAssets":0,"assetsSize":127858,"filteredAuxiliaryAssets":4,"auxiliaryAssetsSize":374607}},"assetsByChunkName":{"app":["webpack-runtime-b09f0d42610145b4806d.js","styles.094b275f741c4a654a9b.css","framework-6a525285796fb83f2864.js","76d8c668-a21b29cb6c19911264a5.js","7112840a-fb39337c868b4a8e175d.js","a198fdd9-76ef94a57d9355507fc2.js","e90c0614-0b013dfe0daa7a069af5.js","app-9d4f72a0593cf38af373.js"],"component---src-pages-404-tsx":["component---src-pages-404-tsx-1eefbc7aaf8c4f50be6c.js"],"component---src-pages-index-tsx":["styles.094b275f741c4a654a9b.css","8e5f29247fb400f66d09f337f68113b877142f92-59676d551c9241822d90.js","3f2356c6c582ac409c3f15f0578f4ec9be7dcbc5-a27fd4e673597a7ed503.js","0c4cdc70b932cf3bbeb74bf4a34299c3d3bc0c27-7c9571ace2cb54d10812.js","component---src-pages-index-tsx-87545ea7748068b24475.js"],"component---src-pages-recent-tsx":["styles.094b275f741c4a654a9b.css","8e5f29247fb400f66d09f337f68113b877142f92-59676d551c9241822d90.js","3f2356c6c582ac409c3f15f0578f4ec9be7dcbc5-a27fd4e673597a7ed503.js","0c4cdc70b932cf3bbeb74bf4a34299c3d3bc0c27-7c9571ace2cb54d10812.js","component---src-pages-recent-tsx-c68af4950cae6ae93f47.js"],"component---src-pages-search-tsx":["styles.094b275f741c4a654a9b.css","41384b3c-0c4482b27eaf2cec067d.js","8e5f29247fb400f66d09f337f68113b877142f92-59676d551c9241822d90.js","component---src-pages-search-tsx-f0619a1254d9f72d4cee.js"],"component---src-templates-post-template-tsx":["styles.094b275f741c4a654a9b.css","63a8ec3f-184a0ec42d7a0e63badc.js","8e5f29247fb400f66d09f337f68113b877142f92-59676d551c9241822d90.js","3f2356c6c582ac409c3f15f0578f4ec9be7dcbc5-a27fd4e673597a7ed503.js","component---src-templates-post-template-tsx-f26c93d9cee0872ef069.js"]},"childAssetsByChunkName":{}} \ No newline at end of file +{"name":"build-javascript","namedChunkGroups":{"app":{"name":"app","assets":[{"name":"webpack-runtime-6d818bd7d955c9a16c3c.js","size":4369},{"name":"styles.094b275f741c4a654a9b.css","size":12448},{"name":"framework-6a525285796fb83f2864.js","size":140785},{"name":"76d8c668-a21b29cb6c19911264a5.js","size":78340},{"name":"7112840a-fb39337c868b4a8e175d.js","size":29999},{"name":"a198fdd9-76ef94a57d9355507fc2.js","size":108714},{"name":"e90c0614-0b013dfe0daa7a069af5.js","size":61335},{"name":"app-9d4f72a0593cf38af373.js","size":177835}],"filteredAssets":0,"assetsSize":613825,"filteredAuxiliaryAssets":7,"auxiliaryAssetsSize":3713989},"component---src-pages-404-tsx":{"name":"component---src-pages-404-tsx","assets":[{"name":"component---src-pages-404-tsx-e950cf19f7f97970aabd.js","size":8713}],"filteredAssets":0,"assetsSize":8713,"filteredAuxiliaryAssets":1,"auxiliaryAssetsSize":19551},"component---src-pages-index-tsx":{"name":"component---src-pages-index-tsx","assets":[{"name":"styles.094b275f741c4a654a9b.css","size":12448},{"name":"8e5f29247fb400f66d09f337f68113b877142f92-d74f7497417ad3d42730.js","size":71859},{"name":"3f2356c6c582ac409c3f15f0578f4ec9be7dcbc5-a27fd4e673597a7ed503.js","size":27411},{"name":"0c4cdc70b932cf3bbeb74bf4a34299c3d3bc0c27-7c9571ace2cb54d10812.js","size":112159},{"name":"component---src-pages-index-tsx-87545ea7748068b24475.js","size":1032}],"filteredAssets":0,"assetsSize":224909,"filteredAuxiliaryAssets":4,"auxiliaryAssetsSize":935490},"component---src-pages-recent-tsx":{"name":"component---src-pages-recent-tsx","assets":[{"name":"styles.094b275f741c4a654a9b.css","size":12448},{"name":"8e5f29247fb400f66d09f337f68113b877142f92-d74f7497417ad3d42730.js","size":71859},{"name":"3f2356c6c582ac409c3f15f0578f4ec9be7dcbc5-a27fd4e673597a7ed503.js","size":27411},{"name":"0c4cdc70b932cf3bbeb74bf4a34299c3d3bc0c27-7c9571ace2cb54d10812.js","size":112159},{"name":"component---src-pages-recent-tsx-c68af4950cae6ae93f47.js","size":1033}],"filteredAssets":0,"assetsSize":224910,"filteredAuxiliaryAssets":4,"auxiliaryAssetsSize":935493},"component---src-pages-search-tsx":{"name":"component---src-pages-search-tsx","assets":[{"name":"styles.094b275f741c4a654a9b.css","size":12448},{"name":"41384b3c-0c4482b27eaf2cec067d.js","size":6152},{"name":"8e5f29247fb400f66d09f337f68113b877142f92-d74f7497417ad3d42730.js","size":71859},{"name":"component---src-pages-search-tsx-f0619a1254d9f72d4cee.js","size":15786}],"filteredAssets":0,"assetsSize":106245,"filteredAuxiliaryAssets":3,"auxiliaryAssetsSize":270266},"component---src-templates-post-template-tsx":{"name":"component---src-templates-post-template-tsx","assets":[{"name":"styles.094b275f741c4a654a9b.css","size":12448},{"name":"63a8ec3f-7c2f188a91c57aaabce4.js","size":11587},{"name":"8e5f29247fb400f66d09f337f68113b877142f92-d74f7497417ad3d42730.js","size":71859},{"name":"3f2356c6c582ac409c3f15f0578f4ec9be7dcbc5-a27fd4e673597a7ed503.js","size":27411},{"name":"component---src-templates-post-template-tsx-f26c93d9cee0872ef069.js","size":8457}],"filteredAssets":0,"assetsSize":131762,"filteredAuxiliaryAssets":4,"auxiliaryAssetsSize":382530}},"assetsByChunkName":{"app":["webpack-runtime-6d818bd7d955c9a16c3c.js","styles.094b275f741c4a654a9b.css","framework-6a525285796fb83f2864.js","76d8c668-a21b29cb6c19911264a5.js","7112840a-fb39337c868b4a8e175d.js","a198fdd9-76ef94a57d9355507fc2.js","e90c0614-0b013dfe0daa7a069af5.js","app-9d4f72a0593cf38af373.js"],"component---src-pages-404-tsx":["component---src-pages-404-tsx-e950cf19f7f97970aabd.js"],"component---src-pages-index-tsx":["styles.094b275f741c4a654a9b.css","8e5f29247fb400f66d09f337f68113b877142f92-d74f7497417ad3d42730.js","3f2356c6c582ac409c3f15f0578f4ec9be7dcbc5-a27fd4e673597a7ed503.js","0c4cdc70b932cf3bbeb74bf4a34299c3d3bc0c27-7c9571ace2cb54d10812.js","component---src-pages-index-tsx-87545ea7748068b24475.js"],"component---src-pages-recent-tsx":["styles.094b275f741c4a654a9b.css","8e5f29247fb400f66d09f337f68113b877142f92-d74f7497417ad3d42730.js","3f2356c6c582ac409c3f15f0578f4ec9be7dcbc5-a27fd4e673597a7ed503.js","0c4cdc70b932cf3bbeb74bf4a34299c3d3bc0c27-7c9571ace2cb54d10812.js","component---src-pages-recent-tsx-c68af4950cae6ae93f47.js"],"component---src-pages-search-tsx":["styles.094b275f741c4a654a9b.css","41384b3c-0c4482b27eaf2cec067d.js","8e5f29247fb400f66d09f337f68113b877142f92-d74f7497417ad3d42730.js","component---src-pages-search-tsx-f0619a1254d9f72d4cee.js"],"component---src-templates-post-template-tsx":["styles.094b275f741c4a654a9b.css","63a8ec3f-7c2f188a91c57aaabce4.js","8e5f29247fb400f66d09f337f68113b877142f92-d74f7497417ad3d42730.js","3f2356c6c582ac409c3f15f0578f4ec9be7dcbc5-a27fd4e673597a7ed503.js","component---src-templates-post-template-tsx-f26c93d9cee0872ef069.js"]},"childAssetsByChunkName":{}} \ No newline at end of file diff --git "a/\352\267\270\353\236\230\355\224\204 \354\225\214\352\263\240\353\246\254\354\246\230/index.html" "b/\352\267\270\353\236\230\355\224\204 \354\225\214\352\263\240\353\246\254\354\246\230/index.html" index 9dae607..bc7bf11 100644 --- "a/\352\267\270\353\236\230\355\224\204 \354\225\214\352\263\240\353\246\254\354\246\230/index.html" +++ "b/\352\267\270\353\236\230\355\224\204 \354\225\214\352\263\240\353\246\254\354\246\230/index.html" @@ -101,7 +101,7 @@ setTheme(preferredTheme || (darkQuery.matches ? 'dark' : 'light')) }() -
    minlog

    그래프 알고리즘

    2023.08.29·조회수:
    0
    thumbnail
     

    1. 그래프(Graph)란?

    +
    minlog

    그래프 알고리즘

    2023.08.29·조회수:
    0
    thumbnail
     

    1. 그래프(Graph)란?

    그래프는 객체들 간의 연결 관계를 나타내는 수학적 구조로, 노드(Node)와 이를 연결하는 간선(Edge)으로 구성됩니다. 그래프는 현실 세계에서의 다양한 상호 관계를 추상화하여 모델링하는 데 사용됩니다.

    서로소 집합 자료구조(Union-Find)

    @@ -194,10 +194,10 @@

    4. 위상 정렬

    -

    참고로, 위상정렬의 답안은 여러가지가 될 수 있다. (한 단계에서 큐에 새롭게 들어가는 원소가 2개 이상일 경우)

    +

    참고로, 위상정렬의 답안은 여러가지가 될 수 있다. (한 단계에서 큐에 새롭게 들어가는 원소가 2개 이상일 경우)

    - \ No newline at end of file + \ No newline at end of file diff --git "a/\352\267\270\353\246\254\353\224\224 \354\225\214\352\263\240\353\246\254\354\246\230/index.html" "b/\352\267\270\353\246\254\353\224\224 \354\225\214\352\263\240\353\246\254\354\246\230/index.html" index 06546a4..7f4fe65 100644 --- "a/\352\267\270\353\246\254\353\224\224 \354\225\214\352\263\240\353\246\254\354\246\230/index.html" +++ "b/\352\267\270\353\246\254\353\224\224 \354\225\214\352\263\240\353\246\254\354\246\230/index.html" @@ -101,7 +101,7 @@ setTheme(preferredTheme || (darkQuery.matches ? 'dark' : 'light')) }() -
    minlog

    그리디 알고리즘

    2023.05.11·조회수:
    0
    thumbnail
     

    그리디 알고리즘 개념

    +
    minlog

    그리디 알고리즘

    2023.05.11·조회수:
    0
    thumbnail
     

    그리디 알고리즘 개념

    그리디 알고리즘(탐욕법)은 현재 상황에서 지금 당장 좋은 것만 고르는 방법을 의미한다. 일반적인 그리디 알고리즘은 문제를 풀기 위한 최소한의 아이디어를 떠올릴 수 있는 능력을 요구합니다.

    작동 방식

    @@ -174,10 +174,10 @@

    정당성 분석@media (max-width: 768px){.css-hx9xpc{padding:0 20px;}}

    +

    대부분의 그리디 알고리즘 문제에서는 이처럼 문제 풀이를 위한 최소한의 아이디어를 떠올리고 이것이 정당한지 검토할 수있어야 답을 도출할 수 있다.

    - \ No newline at end of file + \ No newline at end of file diff --git "a/\353\213\244\354\235\264\353\202\230\353\257\271 \355\224\204\353\241\234\352\267\270\353\236\230\353\260\215/index.html" "b/\353\213\244\354\235\264\353\202\230\353\257\271 \355\224\204\353\241\234\352\267\270\353\236\230\353\260\215/index.html" index 9751e75..84e7474 100644 --- "a/\353\213\244\354\235\264\353\202\230\353\257\271 \355\224\204\353\241\234\352\267\270\353\236\230\353\260\215/index.html" +++ "b/\353\213\244\354\235\264\353\202\230\353\257\271 \355\224\204\353\241\234\352\267\270\353\236\230\353\260\215/index.html" @@ -101,7 +101,7 @@ setTheme(preferredTheme || (darkQuery.matches ? 'dark' : 'light')) }() -
    minlog

    다이나믹 프로그래밍

    2023.06.18·조회수:
    0
    thumbnail
     

    다이나믹 프로그래밍

    +
    minlog

    다이나믹 프로그래밍

    2023.06.18·조회수:
    0
    thumbnail
     

    다이나믹 프로그래밍

    • 다이나믹 프로그래밍은 메모리를 적절히 사용하여 수행 시간 효율성을 비약적으로 향상시키는 방법
    • 이미 계산된 결과(작은 문제)는 별도의 메모리 영역에 저장하여 다시 계산하지 않도록 함
    • @@ -310,10 +310,10 @@

      마지막 정리

      다이나믹 프로그래밍(Dynamic Programming)은 문제를 작은 부분 문제로 나누어 해결하고, 중복 계산을 피하여 효율적으로 최적해를 구하는 알고리즘 기법이다. 주어진 문제를 작은 부분 문제로 쪼갠 후 하향식(Top-down) 메모이제이션 기법이나 상향식(Bottom-up) 반복적인 계산 기법을 사용하여 최적해를 구한다.

      -
    +
    - \ No newline at end of file + \ No newline at end of file diff --git "a/\353\246\254\354\225\241\355\212\270props/index.html" "b/\353\246\254\354\225\241\355\212\270props/index.html" index 61be54c..ff59687 100644 --- "a/\353\246\254\354\225\241\355\212\270props/index.html" +++ "b/\353\246\254\354\225\241\355\212\270props/index.html" @@ -101,7 +101,7 @@ setTheme(preferredTheme || (darkQuery.matches ? 'dark' : 'light')) }() -
    minlog

    리액트 props 사용하는 이유

    2023.04.11·조회수:
    0
    thumbnail
     

    1. 리액트 프로퍼티 (props)를 사용하는 이유

    +
    minlog

    리액트 props 사용하는 이유

    2023.04.11·조회수:
    0
    thumbnail
     

    1. 리액트 프로퍼티 (props)를 사용하는 이유

    리액트는 UI 라이브러리로서, 컴포넌트를 사용하여 UI를 구성한다. 이 때, 컴포넌트 간의 데이터 전달을 위해 프로퍼티(Props)를 사용해야한다.

    2. 프로퍼티의 특징은 무엇인가?

    프로퍼티는 부모 컴포넌트에서 자식 컴포넌트로 전달되는 데이터라서. 이 데이터는 자식 컴포넌트에서 읽기 전용으로 사용된다. 즉, 자식 컴포넌트에서는 해당 데이터를 직접 수정할 수 없다.

    @@ -191,10 +191,10 @@

    export default ChildComponent;

    5. 프로퍼티를 사용한 컴포넌트 간 데이터 전달의 장점은 무엇인가?

    -

    프로퍼티를 사용하면 데이터를 쉽게 공유하고 재사용할 수 있어 코드의 재사용성이 높아지며, 단방향 데이터 흐름으로 인해 데이터 추적이 쉬워지고 디버깅이 쉬워지며, 컴포넌트 간의 의존성이 낮아져 코드 수정이나 유지 보수가 쉬워지며, 가상 DOM을 사용하여 성능을 개선할 수 있다.

    +

    프로퍼티를 사용하면 데이터를 쉽게 공유하고 재사용할 수 있어 코드의 재사용성이 높아지며, 단방향 데이터 흐름으로 인해 데이터 추적이 쉬워지고 디버깅이 쉬워지며, 컴포넌트 간의 의존성이 낮아져 코드 수정이나 유지 보수가 쉬워지며, 가상 DOM을 사용하여 성능을 개선할 수 있다.

    - \ No newline at end of file + \ No newline at end of file diff --git "a/\353\260\225\354\213\261\352\263\274 \354\226\270\353\260\225\354\213\261/index.html" "b/\353\260\225\354\213\261\352\263\274 \354\226\270\353\260\225\354\213\261/index.html" index 4ee3742..8916856 100644 --- "a/\353\260\225\354\213\261\352\263\274 \354\226\270\353\260\225\354\213\261/index.html" +++ "b/\353\260\225\354\213\261\352\263\274 \354\226\270\353\260\225\354\213\261/index.html" @@ -101,7 +101,7 @@ setTheme(preferredTheme || (darkQuery.matches ? 'dark' : 'light')) }() -
    minlog

    박싱과 언박싱

    2023.11.11·조회수:
    0
    thumbnail
     

    박싱과 언박싱

    +
    minlog

    박싱과 언박싱

    2023.11.11·조회수:
    0
    thumbnail
     

    박싱과 언박싱

    Boxing : 값타입을 참조타입으로 변환하는 기법 UnBoxing : 참조타입을 값타입으로 변환하는 기법

    @@ -237,10 +237,10 @@

    2. 참조타입} } }

    -
    +
    - \ No newline at end of file + \ No newline at end of file diff --git "a/\354\203\235\354\204\261\354\236\220\354\231\200 static \353\263\200\354\210\230/index.html" "b/\354\203\235\354\204\261\354\236\220\354\231\200 static \353\263\200\354\210\230/index.html" index c87c110..d157c5f 100644 --- "a/\354\203\235\354\204\261\354\236\220\354\231\200 static \353\263\200\354\210\230/index.html" +++ "b/\354\203\235\354\204\261\354\236\220\354\231\200 static \353\263\200\354\210\230/index.html" @@ -101,7 +101,7 @@ setTheme(preferredTheme || (darkQuery.matches ? 'dark' : 'light')) }() -
    minlog

    생성자와 static 변수

    2023.11.01·조회수:
    0
    thumbnail
     

    생성자와 static 변수

    +
    minlog

    생성자와 static 변수

    2023.11.01·조회수:
    0
    thumbnail
     
    +
    - \ No newline at end of file + \ No newline at end of file diff --git "a/\354\213\234\353\256\254\353\240\210\354\235\264\354\205\230\352\263\274 \354\231\204\354\240\204\355\203\220\354\203\211/index.html" "b/\354\213\234\353\256\254\353\240\210\354\235\264\354\205\230\352\263\274 \354\231\204\354\240\204\355\203\220\354\203\211/index.html" index 149e565..c8356db 100644 --- "a/\354\213\234\353\256\254\353\240\210\354\235\264\354\205\230\352\263\274 \354\231\204\354\240\204\355\203\220\354\203\211/index.html" +++ "b/\354\213\234\353\256\254\353\240\210\354\235\264\354\205\230\352\263\274 \354\231\204\354\240\204\355\203\220\354\203\211/index.html" @@ -101,7 +101,7 @@ setTheme(preferredTheme || (darkQuery.matches ? 'dark' : 'light')) }() -
    minlog

    시뮬레이션과 완전탐색

    2023.05.12·조회수:
    0
    thumbnail
     

    시뮬레이션과 완전탐색 개념

    +
    minlog

    시뮬레이션과 완전탐색

    2023.05.12·조회수:
    0
    thumbnail
     

    시뮬레이션과 완전탐색 개념

    시뮬레이션과 완전탐색은 CS에서 중요한 개념으로, 다양한 문제를 해결하기 위해 사용된다. 시뮬레이션과 완전탐색에 대해 알아보고, 각각의 개념을 어떻게 활용하는지 알아보자.

    1. 시뮬레이션(Simulation)

    @@ -169,10 +169,10 @@

    @media (max-width: 768px){.css-hx9xpc{padding:0 20px;}}

    +
    - \ No newline at end of file + \ No newline at end of file diff --git "a/\354\225\204\353\221\220\354\235\264\353\205\270 \354\212\244\353\247\210\355\212\270 \354\223\260\353\240\210\352\270\260\355\206\265/index.html" "b/\354\225\204\353\221\220\354\235\264\353\205\270 \354\212\244\353\247\210\355\212\270 \354\223\260\353\240\210\352\270\260\355\206\265/index.html" index 96cf35c..a693f49 100644 --- "a/\354\225\204\353\221\220\354\235\264\353\205\270 \354\212\244\353\247\210\355\212\270 \354\223\260\353\240\210\352\270\260\355\206\265/index.html" +++ "b/\354\225\204\353\221\220\354\235\264\353\205\270 \354\212\244\353\247\210\355\212\270 \354\223\260\353\240\210\352\270\260\355\206\265/index.html" @@ -101,7 +101,7 @@ setTheme(preferredTheme || (darkQuery.matches ? 'dark' : 'light')) }() -
    minlog

    아두이노 스마트 쓰레기통

    2021.10.14·조회수:
    0
    thumbnail
     

    아두이노 스마트 쓰레기통

    +
    minlog

    아두이노 스마트 쓰레기통

    2021.10.14·조회수:
    0
    thumbnail
     

    아두이노 스마트 쓰레기통

    일상생활에서 가장 많이 사용하는 쓰레기통은 매우 중요한 용도를 가지고 있습니다. 하지만 쓰레기통이 너무 지저분하거나 차있어서 쓰레기를 버리는 것이 불편한 경우가 있습니다. 이러한 문제점을 해결하기 위해 아두이노를 이용한 스마트 쓰레기통을 만들어보았습니다.

    프로젝트 내용

    이 스마트 쓰레기통은 다음과 같은 기능을 가지고 있습니다.

    @@ -130,10 +130,10 @@

    느낀점소스코드

    GitHub : https://github.com/MinSeok0123/Arduino_Smartbin

    -
    +
    - \ No newline at end of file + \ No newline at end of file diff --git "a/\354\227\205\354\272\220\354\212\244\355\214\205\354\235\230 \354\234\240\354\232\251\355\225\250/index.html" "b/\354\227\205\354\272\220\354\212\244\355\214\205\354\235\230 \354\234\240\354\232\251\355\225\250/index.html" index 55d0d05..76b4c62 100644 --- "a/\354\227\205\354\272\220\354\212\244\355\214\205\354\235\230 \354\234\240\354\232\251\355\225\250/index.html" +++ "b/\354\227\205\354\272\220\354\212\244\355\214\205\354\235\230 \354\234\240\354\232\251\355\225\250/index.html" @@ -101,7 +101,7 @@ setTheme(preferredTheme || (darkQuery.matches ? 'dark' : 'light')) }() -
    minlog

    업캐스팅의 유용함

    2023.11.10·조회수:
    0
    thumbnail
     

    업캐스팅의 유용함

    +
    minlog

    업캐스팅의 유용함

    2023.11.10·조회수:
    0
    thumbnail
     

    업캐스팅의 유용함

    업캐스팅

    특정 객체가 하위 클래스의 형에서 상위의 클래스형으로 캐스팅 되는 것 @@ -326,10 +326,10 @@

    } }

    -
    +
    - \ No newline at end of file + \ No newline at end of file diff --git "a/\354\227\260\354\202\260\354\236\220 \354\230\244\353\262\204\353\241\234\353\224\251/index.html" "b/\354\227\260\354\202\260\354\236\220 \354\230\244\353\262\204\353\241\234\353\224\251/index.html" index 72d039b..9a396f2 100644 --- "a/\354\227\260\354\202\260\354\236\220 \354\230\244\353\262\204\353\241\234\353\224\251/index.html" +++ "b/\354\227\260\354\202\260\354\236\220 \354\230\244\353\262\204\353\241\234\353\224\251/index.html" @@ -101,7 +101,7 @@ setTheme(preferredTheme || (darkQuery.matches ? 'dark' : 'light')) }() -
    minlog

    연산자 오버로딩

    2023.11.05·조회수:
    0
    thumbnail
     

    연산자 오버로딩

    +
    minlog

    연산자 오버로딩

    2023.11.05·조회수:
    0
    thumbnail
     

    연산자 오버로딩

    연산자 오버로딩(Operator Overloading)

    연산자의 종류는 이렇다.

    @@ -152,10 +152,10 @@

    예시코드.WriteLine(/); } }

    -
    +
    - \ No newline at end of file + \ No newline at end of file diff --git "a/\354\230\244\353\262\204\353\235\274\354\235\264\353\224\251/index.html" "b/\354\230\244\353\262\204\353\235\274\354\235\264\353\224\251/index.html" index 20dd70b..f1c3e4c 100644 --- "a/\354\230\244\353\262\204\353\235\274\354\235\264\353\224\251/index.html" +++ "b/\354\230\244\353\262\204\353\235\274\354\235\264\353\224\251/index.html" @@ -101,7 +101,7 @@ setTheme(preferredTheme || (darkQuery.matches ? 'dark' : 'light')) }() -
    minlog

    오버라이딩

    2023.11.08·조회수:
    0
    thumbnail
     

    오버라이딩

    +
    minlog

    오버라이딩

    2023.11.08·조회수:
    0
    thumbnail
     

    오버라이딩

    상속 받은 것을 그대로 안 쓰고 고쳐서 쓴다 (재정의) 즉, 아빠가 입던 옷을 물려받은 뒤, 그걸 수선집에서 고쳐서 입는 셈

    @@ -231,10 +231,10 @@

    { 아들 son = new 아들("아들에게 준 값"); } -}

    +}
    - \ No newline at end of file + \ No newline at end of file diff --git "a/\354\230\244\353\262\204\353\241\234\353\224\251(Over loading)/index.html" "b/\354\230\244\353\262\204\353\241\234\353\224\251(Over loading)/index.html" index 998c824..6a11c28 100644 --- "a/\354\230\244\353\262\204\353\241\234\353\224\251(Over loading)/index.html" +++ "b/\354\230\244\353\262\204\353\241\234\353\224\251(Over loading)/index.html" @@ -101,7 +101,7 @@ setTheme(preferredTheme || (darkQuery.matches ? 'dark' : 'light')) }() -
    minlog

    오버로딩(Over loading)

    2023.11.04·조회수:
    0
    thumbnail
     

    오버로딩(Over loading)

    +
    minlog

    오버로딩(Over loading)

    2023.11.04·조회수:
    0
    thumbnail
     

    오버로딩(Over loading)

    오버로딩(Over loading)

    @@ -242,10 +242,10 @@

    오버로딩을 } }

    -
    +
    - \ No newline at end of file + \ No newline at end of file diff --git "a/\354\240\225\353\240\254 \354\225\214\352\263\240\353\246\254\354\246\230/index.html" "b/\354\240\225\353\240\254 \354\225\214\352\263\240\353\246\254\354\246\230/index.html" index 81d780c..839245c 100644 --- "a/\354\240\225\353\240\254 \354\225\214\352\263\240\353\246\254\354\246\230/index.html" +++ "b/\354\240\225\353\240\254 \354\225\214\352\263\240\353\246\254\354\246\230/index.html" @@ -101,7 +101,7 @@ setTheme(preferredTheme || (darkQuery.matches ? 'dark' : 'light')) }() -
    minlog

    정렬 알고리즘

    2023.05.13·조회수:
    0
    thumbnail
     
      +
      minlog

      정렬 알고리즘

      2023.05.13·조회수:
      0
      thumbnail
       
      • 정렬알고리즘

      정렬 알고리즘은 주어진 데이터 집합을 특정한 기준에 따라 순서대로 정렬하는 알고리즘이다.

      @@ -299,10 +299,10 @@

      출력

      실행 결과

      26
      -

      +
    - \ No newline at end of file + \ No newline at end of file diff --git "a/\354\265\234\353\213\250 \352\262\275\353\241\234/index.html" "b/\354\265\234\353\213\250 \352\262\275\353\241\234/index.html" index 0736932..0f8ec5f 100644 --- "a/\354\265\234\353\213\250 \352\262\275\353\241\234/index.html" +++ "b/\354\265\234\353\213\250 \352\262\275\353\241\234/index.html" @@ -101,7 +101,7 @@ setTheme(preferredTheme || (darkQuery.matches ? 'dark' : 'light')) }() -
    minlog

    최단 경로

    2023.08.28·조회수:
    0
    thumbnail
     

    최단 경로 문제

    +
    minlog

    최단 경로

    2023.08.28·조회수:
    0
    thumbnail
     

    최단 경로 문제

    • 최단 경로 알고리즘은 그래프에서 가장 짧은 경로를 찾는 알고리즘을 의미합니다.

      @@ -140,10 +140,10 @@

      그리디 접근 방식: 다익스트라 알고리즘은 각 단계에서 방문하지 않은 노드 중에서 현재까지의 최단 거리 추정치가 가장 작은 노드를 선택합니다. 이를 통해 임의의 과정을 반복하며 최단 거리를 점진적으로 갱신해 나갑니다.

      최단 거리의 확정: 알고리즘 수행 중 한 번 처리된 노드의 최단 거리는 더 이상 변경되지 않습니다. 다시 말해, 각 노드에 대한 최단 거리는 점점 정확하게 확정됩니다.

      단계적 접근: 다익스트라 알고리즘은 각 단계마다 하나의 노드에 대한 최단 거리를 확실히 찾아냅니다. 이러한 접근 방식을 통해 그래프의 모든 노드에 대한 최단 거리를 구할 수 있습니다.

      -

      최단 거리 정보 저장: 알고리즘을 실행한 뒤에는 각 노드까지의 최단 거리 정보가 테이블에 저장됩니다. 이 정보를 통해 출발 노드로부터 다른 모든 노드까지의 최단 경로와 거리를 쉽게 확인할 수 있습니다.

    +

    최단 거리 정보 저장: 알고리즘을 실행한 뒤에는 각 노드까지의 최단 거리 정보가 테이블에 저장됩니다. 이 정보를 통해 출발 노드로부터 다른 모든 노드까지의 최단 경로와 거리를 쉽게 확인할 수 있습니다.

    - \ No newline at end of file + \ No newline at end of file diff --git "a/\354\266\224\354\203\201\355\201\264\353\236\230\354\212\244 vs \354\235\270\355\204\260\355\216\230\354\235\264\354\212\244 \354\260\250\354\235\264/index.html" "b/\354\266\224\354\203\201\355\201\264\353\236\230\354\212\244 vs \354\235\270\355\204\260\355\216\230\354\235\264\354\212\244 \354\260\250\354\235\264/index.html" index 5b129c6..02db316 100644 --- "a/\354\266\224\354\203\201\355\201\264\353\236\230\354\212\244 vs \354\235\270\355\204\260\355\216\230\354\235\264\354\212\244 \354\260\250\354\235\264/index.html" +++ "b/\354\266\224\354\203\201\355\201\264\353\236\230\354\212\244 vs \354\235\270\355\204\260\355\216\230\354\235\264\354\212\244 \354\260\250\354\235\264/index.html" @@ -101,7 +101,7 @@ setTheme(preferredTheme || (darkQuery.matches ? 'dark' : 'light')) }() -
    minlog

    추상클래스 vs 인터페이스 차이

    2023.11.09·조회수:
    0
    thumbnail
     

    추상클래스 vs 인터페이스 차이

    +
    minlog

    추상클래스 vs 인터페이스 차이

    2023.11.09·조회수:
    0
    thumbnail
     

    추상클래스 vs 인터페이스 차이

    C 같은 절차지향 언어 : 클래스x (함수 혼자 놈) JAVA, C# 같은 객체지향 언어 : 클래스 안에 함수

    @@ -297,10 +297,10 @@

    인터페이스.Magic(); } }

    -
    +
    - \ No newline at end of file + \ No newline at end of file diff --git "a/\354\275\234\353\260\224\354\235\264\353\260\270\353\245\230 vs \354\275\234\353\260\224\354\235\264\353\240\210\355\215\274\353\237\260\354\212\244 ref\354\231\200 out \354\260\250\354\235\264/index.html" "b/\354\275\234\353\260\224\354\235\264\353\260\270\353\245\230 vs \354\275\234\353\260\224\354\235\264\353\240\210\355\215\274\353\237\260\354\212\244 ref\354\231\200 out \354\260\250\354\235\264/index.html" index 55b4543..c5156e9 100644 --- "a/\354\275\234\353\260\224\354\235\264\353\260\270\353\245\230 vs \354\275\234\353\260\224\354\235\264\353\240\210\355\215\274\353\237\260\354\212\244 ref\354\231\200 out \354\260\250\354\235\264/index.html" +++ "b/\354\275\234\353\260\224\354\235\264\353\260\270\353\245\230 vs \354\275\234\353\260\224\354\235\264\353\240\210\355\215\274\353\237\260\354\212\244 ref\354\231\200 out \354\260\250\354\235\264/index.html" @@ -101,7 +101,7 @@ setTheme(preferredTheme || (darkQuery.matches ? 'dark' : 'light')) }() -
    minlog

    콜바이밸류 vs 콜바이레퍼런스 ref와 out 차이

    2023.10.31·조회수:
    0
    thumbnail
     

    콜바이밸류 vs 콜바이레퍼런스 ref와 out 차이

    +
    minlog

    콜바이밸류 vs 콜바이레퍼런스 ref와 out 차이

    2023.10.31·조회수:
    0
    thumbnail
     

    콜바이밸류 vs 콜바이레퍼런스 ref와 out 차이

    1. Call by value (값에 의한 전달) : 값만 보내니, 보낸 값을 아무리 바꿔도 원본 값은 안 바뀐다.
    2. @@ -226,10 +226,10 @@

      out예제.WriteLine(x1); } }

    -
    +
    - \ No newline at end of file + \ No newline at end of file diff --git "a/\355\203\220\354\203\211\354\225\214\352\263\240\353\246\254\354\246\230/index.html" "b/\355\203\220\354\203\211\354\225\214\352\263\240\353\246\254\354\246\230/index.html" index 422f053..29fd6a3 100644 --- "a/\355\203\220\354\203\211\354\225\214\352\263\240\353\246\254\354\246\230/index.html" +++ "b/\355\203\220\354\203\211\354\225\214\352\263\240\353\246\254\354\246\230/index.html" @@ -101,7 +101,7 @@ setTheme(preferredTheme || (darkQuery.matches ? 'dark' : 'light')) }() -
    minlog

    탐색알고리즘

    2023.06.17·조회수:
    0
    thumbnail
     

    순차탐색알고리즘

    +
    minlog

    탐색알고리즘

    2023.06.17·조회수:
    0
    thumbnail
     

    순차탐색알고리즘

    리스트 안에 있는 특정한 데이터를 찾기 위해 앞에서부터 데이터를 하나씩 차례대로 확인하는 방법

    +
    - \ No newline at end of file + \ No newline at end of file