From 6a3b604d13ffcea44869671c493ebb5e986394e9 Mon Sep 17 00:00:00 2001 From: gahusb Date: Sun, 18 Jan 2026 14:10:00 +0900 Subject: [PATCH] =?UTF-8?q?blog=20=EC=9D=B4=EC=A0=84=20=20-=20git=20blog?= =?UTF-8?q?=20io=20=EC=82=AC=EC=9A=A9=ED=95=A0=EB=95=8C=20=EC=93=B4=20?= =?UTF-8?q?=ED=8F=AC=EC=8A=A4=ED=8C=85=20=EC=9D=B4=EC=A0=84=20=20-=20?= =?UTF-8?q?=ED=98=84=EC=9E=AC=20=ED=98=95=EC=8B=9D=EC=97=90=20=EB=A7=9E?= =?UTF-8?q?=EA=B2=8C=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/assets/myPhoto.jpg | Bin 0 -> 371359 bytes src/content/blog/2026-01-lotto-lab.md | 2 +- src/content/blog/2026-01-welcome.md | 2 +- .../blog/{ => daily}/2022-03-11-firstdiary.md | 3 +- .../2022-03-13-transferring-git-storage.md | 2 +- .../blog/{ => daily}/2022-03-15-samgyub.md | 2 +- .../{ => daily}/2022-04-02-warehouse43.md | 4 +- .../{ => daily}/2022-04-09-oh_codingtest.md | 6 +- .../blog/{ => daily}/2022-04-25-dairyhard.md | 2 +- .../2022-06-09-publicdatacontest.md | 4 +- .../2022-07-06-publicdatacontest.md | 4 +- .../blog/{ => daily}/2023-04-29-daily.md | 2 +- .../blog/{ => dev}/2022-04-07-slicknlist.md | 9 +- .../flutter/2022-04-05-flutter-envbuild.md | 12 + .../dev/flutter/2022-04-05-flutter-start.md | 108 ++++ .../dev/flutter/2022-04-06-flutter-dart.md | 496 ++++++++++++++++++ .../dev/sideprojects/2022-11-01-glotto.md | 47 ++ .../2022-11-01-sideprojects-start.md | 28 + .../dev/synology/2022-11-23-synology-start.md | 40 ++ .../blog/ideas/2022-03-17-startideas.md | 12 + .../study/algorithms/2022-03-08-firsttest.md | 17 + .../study/algorithms/2022-03-14-greedy.md | 7 + .../study/algorithms/2022-03-24-arraysort.md | 215 ++++++++ .../2022-03-08-algo-samsung-14501.md | 184 +++++++ .../2022-03-08-algo-samsung-14502.md | 195 +++++++ .../2022-03-09-algo-samsung-14503.md | 152 ++++++ .../2022-03-09-algo-samsung-17144.md | 230 ++++++++ .../2022-03-14-algo-baekjoon-2212.md | 88 ++++ .../2022-03-16-algo-baekjoon-18185.md | 163 ++++++ .../2022-03-18-algo-baekjoon-2885.md | 95 ++++ .../2022-03-26-algo-baekjoon-8980.md | 271 ++++++++++ .../2022-03-27-algo-problem-2-6.md | 78 +++ .../2022-03-29-algo-baekjoon-6198.md | 118 +++++ .../2022-03-30-algo-baekjoon-1717.md | 152 ++++++ .../2022-04-05-algo-baekjoon-2302.md | 138 +++++ .../2022-04-06-algo-baekjoon-20166.md | 197 +++++++ .../2022-04-07-algo-baekjoon-15681.md | 231 ++++++++ .../2022-04-08-algo-baekjoon-1174.md | 117 +++++ .../2022-04-12-algo-samsungSW-21610.md | 219 ++++++++ .../2022-04-13-algo-baekjoon-20182.md | 162 ++++++ .../2022-04-18-algo-programmers-1835.md | 163 ++++++ .../blog/study/aws/2024-05-15-start-aws.md | 70 +++ .../blog/study/aws/2024-05-15-start-aws2.md | 207 ++++++++ .../blog/study/cs/2022-12-13-byteOrdering.md | 76 +++ .../blog/study/cs/2022-12-13-multiProcess.md | 289 ++++++++++ .../blog/study/cs/2022-12-13-tcp-protocol.md | 51 ++ .../blog/study/java/2022-04-03-java-start.md | 17 + .../blog/study/java/2022-04-04-java-memory.md | 66 +++ .../markdown/2022-04-05-markdown-emoji.md | 339 ++++++++++++ .../markdown/2022-05-24-github-profile.md | 153 ++++++ .../study/react/2022-06-07-web-reactjs.md | 216 ++++++++ .../study/spring/2022-11-01-jpa-lombok.md | 286 ++++++++++ .../study/spring/2022-11-01-maven-gradle.md | 100 ++++ .../blog/study/webdev/2022-03-24-web-note.md | 14 + .../blog/study/webdev/2022-03-24-web-npm.md | 273 ++++++++++ .../blog/study/webdev/2022-03-25-web-seo.md | 31 ++ .../study/webdev/2022-03-26-web-npmcarrot.md | 70 +++ src/data/blog.js | 53 +- 58 files changed, 6256 insertions(+), 32 deletions(-) create mode 100644 src/assets/myPhoto.jpg rename src/content/blog/{ => daily}/2022-03-11-firstdiary.md (94%) rename src/content/blog/{ => daily}/2022-03-13-transferring-git-storage.md (100%) rename src/content/blog/{ => daily}/2022-03-15-samgyub.md (100%) rename src/content/blog/{ => daily}/2022-04-02-warehouse43.md (96%) rename src/content/blog/{ => daily}/2022-04-09-oh_codingtest.md (96%) rename src/content/blog/{ => daily}/2022-04-25-dairyhard.md (100%) rename src/content/blog/{ => daily}/2022-06-09-publicdatacontest.md (98%) rename src/content/blog/{ => daily}/2022-07-06-publicdatacontest.md (97%) rename src/content/blog/{ => daily}/2023-04-29-daily.md (100%) rename src/content/blog/{ => dev}/2022-04-07-slicknlist.md (99%) create mode 100644 src/content/blog/dev/flutter/2022-04-05-flutter-envbuild.md create mode 100644 src/content/blog/dev/flutter/2022-04-05-flutter-start.md create mode 100644 src/content/blog/dev/flutter/2022-04-06-flutter-dart.md create mode 100644 src/content/blog/dev/sideprojects/2022-11-01-glotto.md create mode 100644 src/content/blog/dev/sideprojects/2022-11-01-sideprojects-start.md create mode 100644 src/content/blog/dev/synology/2022-11-23-synology-start.md create mode 100644 src/content/blog/ideas/2022-03-17-startideas.md create mode 100644 src/content/blog/study/algorithms/2022-03-08-firsttest.md create mode 100644 src/content/blog/study/algorithms/2022-03-14-greedy.md create mode 100644 src/content/blog/study/algorithms/2022-03-24-arraysort.md create mode 100644 src/content/blog/study/algorithmsolutions/2022-03-08-algo-samsung-14501.md create mode 100644 src/content/blog/study/algorithmsolutions/2022-03-08-algo-samsung-14502.md create mode 100644 src/content/blog/study/algorithmsolutions/2022-03-09-algo-samsung-14503.md create mode 100644 src/content/blog/study/algorithmsolutions/2022-03-09-algo-samsung-17144.md create mode 100644 src/content/blog/study/algorithmsolutions/2022-03-14-algo-baekjoon-2212.md create mode 100644 src/content/blog/study/algorithmsolutions/2022-03-16-algo-baekjoon-18185.md create mode 100644 src/content/blog/study/algorithmsolutions/2022-03-18-algo-baekjoon-2885.md create mode 100644 src/content/blog/study/algorithmsolutions/2022-03-26-algo-baekjoon-8980.md create mode 100644 src/content/blog/study/algorithmsolutions/2022-03-27-algo-problem-2-6.md create mode 100644 src/content/blog/study/algorithmsolutions/2022-03-29-algo-baekjoon-6198.md create mode 100644 src/content/blog/study/algorithmsolutions/2022-03-30-algo-baekjoon-1717.md create mode 100644 src/content/blog/study/algorithmsolutions/2022-04-05-algo-baekjoon-2302.md create mode 100644 src/content/blog/study/algorithmsolutions/2022-04-06-algo-baekjoon-20166.md create mode 100644 src/content/blog/study/algorithmsolutions/2022-04-07-algo-baekjoon-15681.md create mode 100644 src/content/blog/study/algorithmsolutions/2022-04-08-algo-baekjoon-1174.md create mode 100644 src/content/blog/study/algorithmsolutions/2022-04-12-algo-samsungSW-21610.md create mode 100644 src/content/blog/study/algorithmsolutions/2022-04-13-algo-baekjoon-20182.md create mode 100644 src/content/blog/study/algorithmsolutions/2022-04-18-algo-programmers-1835.md create mode 100644 src/content/blog/study/aws/2024-05-15-start-aws.md create mode 100644 src/content/blog/study/aws/2024-05-15-start-aws2.md create mode 100644 src/content/blog/study/cs/2022-12-13-byteOrdering.md create mode 100644 src/content/blog/study/cs/2022-12-13-multiProcess.md create mode 100644 src/content/blog/study/cs/2022-12-13-tcp-protocol.md create mode 100644 src/content/blog/study/java/2022-04-03-java-start.md create mode 100644 src/content/blog/study/java/2022-04-04-java-memory.md create mode 100644 src/content/blog/study/markdown/2022-04-05-markdown-emoji.md create mode 100644 src/content/blog/study/markdown/2022-05-24-github-profile.md create mode 100644 src/content/blog/study/react/2022-06-07-web-reactjs.md create mode 100644 src/content/blog/study/spring/2022-11-01-jpa-lombok.md create mode 100644 src/content/blog/study/spring/2022-11-01-maven-gradle.md create mode 100644 src/content/blog/study/webdev/2022-03-24-web-note.md create mode 100644 src/content/blog/study/webdev/2022-03-24-web-npm.md create mode 100644 src/content/blog/study/webdev/2022-03-25-web-seo.md create mode 100644 src/content/blog/study/webdev/2022-03-26-web-npmcarrot.md diff --git a/src/assets/myPhoto.jpg b/src/assets/myPhoto.jpg new file mode 100644 index 0000000000000000000000000000000000000000..584ea6e1482a87c3ef46b58c08b617becb823f6c GIT binary patch literal 371359 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

F3|K96+ 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

Q0b3 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 XuK_K<~?FthPc}OZy z2IF8h<`C*LgK=Pyu(5-r!IY0TGRlyUZb&!$qgSe4PJol8WQ$vCT){S1>nSO*2aduB zx#mpOTM13|H~{U;5`qJB9C*Vt>XQiaSv%((FIf(wpkY~s2iWgDSwFU$jmhO?gg~5$$4&}op zJwo!3(D6%^bbPPGj6FiDw^OH7TJr^s)X4_K7>y;TR2WV9KddLz=G>`FD_g2k1=5gJ zeWNmNmkLriPTWJI3S5`(CdU;3sGVe7Tb`GLRT;t_LO~pH-U!N1rb(2LM(_)cE^Y9k zwTA)$$H`L4mqUV=nW99ZdKg{3mjU$2MKhRx#s~ zv-L)197-kFom(ks0PV5}y~g{-sp{6Aag|-1Ep(EH$yq;EKg1c~VfvVGV7z}+aj|5Ab~O>rScGFij$xh$%RNQAt{= zjm|o-(h2BEAf1S`HFD$N=i&PRC_7Vjt%zR-Qod?oL?8bE6j(=ZPm?xiER9lUClJy%*)LizX*xotmWTyHXZ_T~)iD{JT3g-Rc{{WLSA^92KIVCz)P(Iz_K5A&9b4Wo0 z{ZS<3#K@ncOuOZVicglGb9mB#L#N46R_fSq8qCWmtvdpcZw6->QEVQ=dq5s}Ljz-} zJxGaO2Cj`hStY`C9)#_%5xH?KqfM=0cnvcPE?KnPs9yabb0((~b=VG6L=6NMn3FS7 z;HPAr?nHSAEU7^$^rvf{urrEqu#~rTSO7amgGpB= zwKCCL6V0eCx7${gr1u0xt?+m8aK?TcCMBtuu)m5h@)VS*;%@x9Kdqz8`iG*p{P2I+ z^;!>Gj!K4Z8QCdB+@DZV$i1L&wJ=VkkO<-<&ktTDaDR#19WPqKbtWcK@ zEjqG1ut~neLn61AC{w!IMw=UP6TMRoA$f4b#j_)hZZq(rs>sXm8YTz;#X}0Fth45rrA@LN%;5rjk@e)DGU; zLwU?Hvf(QPkZ;EvMAciti_ou4$6sh|O<~U^WhzN0y`m;N+(cbBK~rc_R7eDYdqH2= z%4+r{T`k%qTCN?^ozrvnggJ@=ibl#C@;X7L!%Z=&)S8$#Ae4=`;te94U9y1Nv@R-! zNYbu@@sA>uq#d^dXg%};LK3Mgtd)6oH{8IjQxKNy6{RG8FudJ03FH!@IE{rdwH+h@ z*!GKAK-!pxFDzJ2kX5BebABO0RH>4msO{6NA4Lry3vcb(4NFqeM%U6J{nkf`3F3H- zw5VD%HGL+*DhK=K6&uqV-JrT@K#~Xo!uK&=>nUQ7lqNfgOHSA|bq+^E1Rci# zn}I5&5N&W_R&tt__clF`;Rv%b36@IDwo$xAnqC=x&Ns~gJD8=UD^mp|d%z#(*XPy> z8q>c#+7RoC4=klSUu!|SeK}I{=+Z`&aR=^6_Q>$TE)eL-+(5+6Ytm(^DQR-=x$8rM z;E-<@r!bkJvqO-nNJ_}cIVQ!FrkhGsMYtw8!e>N|YGJf$DO2-lO~>9XrhMahjK9EA zpdrUmJhZS#-#}Mb^uCzt7S9Fia=hDqioxM`#B}e2j~ms=nxxB;_%||V*6T`E%(nU4 z>r9NQ30COIX^W|cncIbH`u_R z4*viW6B(g^p21j&<0p%-lD7z>W!mZ*u#dYMe^KP^r$O+^!13ZKk25ug{4NI zs{oVkK;|TWE((lNCvO41A*HL?Q&5tqO9vWl<%|0muf8y*WN{-d`2;RfPHR?$8>Z1BjjsS0xw#J( z^K%95Ari?*S59K~J&%`P&S_SgaRY^FzcJ6x0oWDFhBd3#7p*8#yq3upD&8!lr9P!0 znru!rG~#|-XwZ6#^BJm9fq^%mtm!t&))+<+wKNzdQnNd)twh*`Hf|>~ja8A&8^6|+q!S1w0 z9}k+nXEd|2v5l(;adRLEe=^*uJ3{Zo!mBY=rh@WF)3E%n4G)K>iUX6hiMmBnNw?7R z<@Vhv8k4Bp-W-1r9K@&QmJep7Akl9?y3$3ju?P9aEp|xzb$p(a(cwRLb4NFGNxRY% zpsS$WR`-bPr`Db?d&J9Dz%!WUQR#UQ*;-D?QMLZjAJ+0~65-~`o~JzELHd%L+9n3Q zvi(9W=d_8(BI+MImw~gnL9qv>(O^Cvl{so>iCJV!w3k^!UocR4x>N|aA}vN zADUT(TdY#$UqY!&c~dPd78=k7;v=5}zAiA{XJg!RNoJC;DYXTpI#Xaz1b$)(;X3^v z1LBH?xrSR4`w}f>4Y~XxD9eh47b9~g7R}IAb5VG$(Q#!f>b<`h^m53rgT^Sf>WEX~ zGl!o40Pm2gR3)U=C8ki1DM33Ea$)7+nrdCY3zf-9l_|NlwK$g5w?V(?VU^++H)>gd zjJ(H^ga*Zh$GiuJ@zSYSDts$I3TD>7CeeYxZ@;szk0hx?xY>D$W$G9bn&KYxiFAHD z2wFvXzc13hIKN1*9v8DdUl(P%63o(6sTBs)kbj0I96L~H=h7E)leBGy1mn3Fa%O5& z$p;C#nWtJ^f``@2R~%!FsF*K5YZy^eDN3q`=4F#@ijO1ni%*xdS$B|yB%~9#KJiua z+rza&r{eTtSqT(5B_fa?7r81oBTwhNE_!CFfx)Uty}{W5rgaHY6fJSzc#yF66n>>F z%7O?`+%W{HLS`Y0afzD^hQM(QPUzNrx%a=1_#4 z2~D;=;Pkyclq4h&M*xGoJLIsmqL>HE1b`sIu&kQg1ros|@_Rsqxr~=747`#G_8bew zxL%PbEmYK!3W~35-W{{JQHH|q+Cdx;VJ3}8YEH5gTGPFW5oj4P&ScmO3xUP>gqovL zsT%=*v^i9!-;xEeINWuH-Fj0>j=*ocRKG&l-l#Pwk+3%4LwmVc5dtMxKl1;37 zg|zbs^U`gHb{ih&m|18@nJp!gbllq8#6zEy#vY?QumXw_R0X*giJj?7i*jNs&zWH_ zM0L#}NwEYDe$WrFit$Qyw;di@0Y^KF5MUbAg~FCu)Gcl|R34?xGW*9sN;I9p=?iTt zoMjR76HK&_3H2S|Tcc9CA}m!bC9br~1cZPOycfcAA#8sTacHEu4T z!;S!bAw$(}EfDQ1#8oE`&kM_`UGz06c#@S=N>?a+q&C`8>IVT<{{YlJ@@};yg{$)G zaX&EB%i#cXq^Rs7xXLZs6xO9VpfA#-4ngU(O_?boKWRxhF>ummknPV)5e|Ps8byxr z8(vJU9-B7Qsq)Z-rFI`q+?b>uA*k!BR~f6ID5m8KMqpQ?=@F5PQy$)Q9b%zYYX;!4| zz3h9!Jzi9-jgxC{4M-Luvoob66q2QjDBp-bhmzdYU8a;RU=&C;v;*=9cVGqY3K(jh zBz)I>B~7O4x#k-P@(6*5<;{CA=`{UU*7{Tc-1X`)wTA&AE)UTO}CRK(tN$FE(CM6Q@K&l(!=9o+cM~zQc|Ko76|0YY|A2beKVXP?npE_`Pa^QYAnupiLUz=kHigO|##YI5 z2vNYHwzQFT5!Z7bhXxR%DT-rSxAcyl(dZS9`7z11+eK^EmTZu#TVd_AUGIdKh>DMf zWmKnS@s&Rh$fO!baq8_PiaYRokXM+MEefWkXi3KK72LI7LZ0 zt1@a9_)*&Bc*MaK`ozrA@obFT?D5v~&O2h^;^Y0HK<6$NuDF)j#FT=yboqb`a=GlR zdar`p#8NT_YMRtM3xY?6useU%7|JfpT{2JmyzZ+auI9C;@Nwh5RvuQ$nUCw1l7% zNx2+e@PUNpzs!{o5aN`S8}4qNonh%UESWiE?s@0^F{%prD(Edb3gyy4Ay@q2GI>fC z7B=gDv?xBHwt{bU18yJ(51(Ro197wtMNDjZ3o;IZEn+}BK&kT(y920kZt=Ixp#sSs zzB_b{Wzt+(N|cbL9gh&I2-u4fl9Duwf(&>vRzXk+)zEwtrFkEEa2}!uL1f&E40zisrBm(->jU@i?9)qL? zB>dZrv=MazAjUnet{7x-($=&WH1ywyD|tS#w8 zD2C=Y;E3ywfFFuJ7V%36l`LF*iIeWVbO>d8HaQw15An!}Y= zYE*fb>6J-krN*CWMF#03^o~})(;=QVxRKoS-&UTT?VmCK0MYb|H6|WK$qQ`mg&^=C zlbV|rSSm&NiUIKE_`b+vd3tsU%oQ4aaR4&Z+K=wv-oW3#5zrQ>`pX{)ql!oar7~ff{>4 zWZQOdAlw7oM2+%Iyn;#v!MN^W4y}gUdr=kyjfYsY4}1(M+DRa!fI^HS)Tm(#B!ut4 zw-EZAq^?@m1cA2P!ZhPIx$?-jaT90_P{OOxN0faw)oa=t)e1O6L?t8B*3l$X*g~4p z6J>$Txr8~&Q1Z=_v4NuE$kL}l)4Gv;uX}9>6$&y2s{jS~i86YcrL3h^2^?*)hV5R4 zJi%dWL~4Ul7!#C&+o>Q9EgCgTy{rH#=?>ZYSlEy?4`?R26r^k{Vw)PJV^!HbE-Vkg z#!*jJw2&_g&QgJNkbomAl?|rBKWG-hv?U@-Qi^+TyljaAcpz`jFn38w7aN$)oA8~6 z&?vSO{hoDfcY?1rZltVO{{S%xZmUJEEP9^83Cv6&wxD-6{9x>*7Q}hB0Boe+a}AtA zzm;TycZV%jqL$iP?_f9(&aJv?9>|^#kwObh7is_zdl+!bNuQP@f&kl~g4AgZ zPV2Vh?meNy@+B!C3m@eMqz*(!m5Ezso(MYFmJ;M*me(~CMO{W}eA5l)Ba~&h`4~|3mKSY&D0ZKz!!R=rp)_Qe&XU)B3 zx2TaGcyGf~PGR-9mR7dZ02^K^{{X}X!d@%M+<3-x<--mlt4&s_tcxi&oNJP+4o#xw zcxJ_au-7vvRD_{dQUbUeL)yPI-C|l{my1hjNLAZV1T0&K+bMBJ7E9=;*#+WOm*Tr7 zlUb*@*r~Fe6Vim)##RR4r=DRa6s1%0OKI?1N=?B%AqT~WfSgH_xVC3Aaz;a@~gw9iHaqqX_J#Hbt`8<2|Bj+F&|(l73PLKnVFwy zPDx6VQK>$ixQD0qTZ^Jz@YLV=KLpcISp~;Xl`M^j+k3>JSe<>mM=JUnQkzwYP#xkn z!j-0*SY@J=Ha#N8fFaoKec|jOM|Jv?^9`9$Kt;h(FuapUM%Uz#F~rQ4AHi=_=Uzm) zZ5p*G*b(m(PJ0JUc%RKDrxKS_LzQ^x1RF1YL`qef-YW5Rh>;;CiJ3ek9Z6c0l9fC; z{Gxoz?4+jU?Kz5FJ*JeFjnu0P-Xvt4LdQL?f~~#byy5zh`BwvNq+Aj=`$K;_>5o#f z;np2h(g8^(E)F!q^3v1G3TX+}IEvrn2AMA}f+j)~lr2K`9LF{VznMoG2$<=TnPcY@y^(|-VSWzE%j+&Ku@uF*@fakOa#}i&n|MA&p`y^LGwjPuKQimV z#DxRB_~1d;uzMf1%)*Ij$3jv`HrHr$K$kA@hs!_Eb(V z=aij#Z*$PvJDB8;ACo#$Xn^wv3sPK@QVUw$we z*r2l}%1)G`$+h^{^AW^^gKsjR*+!K08=rU@w`Qyov=s1xmx{pDxu)F;8kPb`Jo6SB zpEM=fNo{3CT>BV{uo6s|(t?zSHURBtkg)pxY1AMrYu5PQI;U8hno@PV=(!+uFoTEW1I{&dk5L!5@b3~sSXCyDNC~pW=G()dj4n#- zgI@(zz_Q=0D#2Fk6GjSL^R(vtw$H5~Ln^g~Q%$XaP*tykYuNXRPc9yHihE!%ttlH4 zIgMLs8JyE*k4evH1xWyr-*E}G8a(Mh(hcw4BsQg{XILlYl9K^VVcLUNS{OmN*k52_ zZ5E|OYV$P)>=Kec2*WMZ6tx8dZ+LgrBIQG zYN0+@Qo^qjXsztjqtlIH! zqF*D96ctC?mbz8};KCJZr!@P2_bzX6 zdqdUyHkGrm2d}gtRVY4DHUORg5HbNTv6V4DFkL#GQ0W9;ebVKM!QZSnXC#u6tDqzU zVF@p?5o-=$3!xffr0Yp33p!5Mv_^T`G~uAkG)V|rNxA6~>++1a!8WnA$h1Yd&nUyR zw_DUWH|+yl@=7U2dgip=Sjnl`X4K-GvO!3_jqP*o5M_TlF%~B!Zd4p>EE_hBlAh6L zvp*{rimA#=4GD)^B$kve9K2TSQ-fvj-9hPEtc>*ZCJ{_1+xp7J)2+c9c+Qsz#?Kb@3!8=E4V&_|KTYtFrj7Ui;QMxto6Uq}X-j#f8+{-x~u>so*{Xvo3iQEpptAY*haIJhZa`a zQc{(hgV?|CFA{{UE2sIFz{ zVo(5G>`5HMcD*B1lm*#DrEVvb6Kj~89q@_nB1FuZLsgkKgu22O%KXNOJf<5GIgpxF zJ=$dU=}@s(OTu+85LKq>=|sz4ytb3Q>|wWv>GN(*22{eAtlX>(hY_i9$(~ZSBw|Wh zMST-*EgvZ3$vYeRZxcQpbI5j4hMY-YtOU3Y$`|htl>Qi>sGv(L%nj<&E+OBAS3ig7 zh?ZWr7SXav?H6dGg8NRSC?fa#B4U!o ztl?&Sry5d=pahe|Bhx4gq+w}ACRu)ZY!;hXfpH6N(^FQJY&_4YCg7fsxj!QynDeDn z47C+gDLz_e8sAS_?+~Ubk!rtIS#ee+WP&0_s7=kcLNaX&rozXnc7~Q3z|-x|`O^tO zQ;Iu(;~8fzcr~TC-iMY_uSlSvs^@ZVXn0ccy)rGfw5@6jJ8y6x+=DDr8%ZldLVA7> z;iqC&Wo1Q(2|>1##k-hQJLI*DQNvg*_ZkV6bQKTvZD>_>nT$IwRXo{Fo=Q(Jk3`3b zlc;N8q;J77rY_CVFpUqil!9!o#w{mwH>E?an~5bWGDQhKUZHfJ$A~#hs-|6nh1itt zFTL%+h>4uXl#>LdK>(fi;uA3zd9fzmmL9Tzxfk5PPZjVo6QXFVIU`nUOv4Qk@6sa- zV@Z*eoO9&;1f56N!xfC|n5n!psd|Y38{9$mYL3o3sbzLi-saHEQBmm2smr^H6=j!m za&2fOQJG5CpqnUO$Jz%%z($e{lsoYW@5_3K1Qd6Nrs&4#@*Pdd(`~`E;Oq0Lr(s#S zf8&nB`>VO`Uu(_$wq#Jn{pm zD>wW&h05w?mq2vNm3h4F4O}5mOwy5Y$tENkacyiZDHc+IDU2Cq%^DJzIL5Y6QcHz0%pRJn&MlVs}>70``LR89)|X zzqh zP3&)YPN~V4Sr)bUG17wjG0nBneR99WXNT+$lXF;BRW+H(l`^C&%0kO-F5LFy2&Yy0 zG_>_vY4#9XY3G)-qx}Gzf%zC~VP;n;KH4lnzXOB3JK3g|{PhJWmo^vP$J#pBK2cm8 zZ1=cCdkUZ|=_}H%eMj09@WxiZi)T|WET@S=tVkxw2GH@#?3SIy?j$M2C6z1{E0PoK z6GaON$l!{5a`J8HC>B!BEBnUGI(v5^0uBwpOlAEcxklV8aH~?4eaW}{Lfp_)(#4I! zQ*-x>zR#cPxw3dCv}oEw3DTfet?%3I8xl!U4Inn!N*+j2C&hLpWR-FfK- zT26^$fJ1g85D$7m+HXONo)fVJ#K@tR7wp_U6O+E#>>9Uy);jl$bf!cc9#;t8P(ZOi$) zuY}qKY2q9SP|`u)eoREj7;(Ur9klOj{t@pim1^Z8HDY0ejVJ2iHxas>uq1<|cIymo zCGdGta&E}FwM;qlX&@o6k5A%ZGGLSvld<;e3Sgzg-8MRf&d^!b0#&JB`-Dvw7AK`4 z0BYSzy^LtJtze51K`o8N*huz=qQmT)CJDA?@_aq=-S9;HnyD1EnAEil;y zw_7$^4{;Z_;hphjoWS!E*fTPw^~eh~DNu0j&8(x+DI@J`)9E@dW9iFlJZfE?Ef=UyPcM&NQS@&}tH|PtGZh+q%M&tlDGP1J)D)5kfTr0hQL~D- zaU6*FYJ5v-9v`tZwhYG8Zoh{nh(xT@swc=+!o;2gb+-=UX-sWLm!6P$sfjtH1+?=@ z)Rh7|$BNZyXM%1LN4C>y@#cb*7$R9p)Bw4(X*Dc*k}P1;j(mX96MOaV84ouw+15xW zpy?Uu4`N!J2v90FNrDqg32{UNYr?G4ETKT&$-EYsl}n73q}&5-`oNaB5oVb~o~^Ii z5@%?NcTv~~aTzo%L=kHUFEvUFNG-dj{EI=NHZp2hOoFFWyN-Z#ggS*U<;QS(M1em@ zQv-Et+j~MCLYAA{AlSsAZFv|q3UW=hxrAzk6ewIn-mOTmQAppVp$=|HfC1a^fTCE- zo}z*Xw&V4Lhp8bKBwF6k_?wde9fioWA=KojP)RqvxPVI3+DN}xP*@7vfdr? zJ%lN~jc`t8UdK@!UhynC8?|X~G;nN8CA};VfRY8Tv^pM^^FcaIp*+YX_pR9MV$%r( z=`^CJ1&15j6{cm9%Q|}VaR(`M?H-idk$s~|^tzjubJ8paFxW0dWn?9rxO%rrt;ym_ z4BM%hrz=;JeVyDy{{Vn~Ab4{(X>__KA}-PE5~^*ti{PcT5wRehp`|HSm8Leyn{6eu zuIBxqre|RMKbYE6NTi}|@_lHkJ}I>`X~M z1(e%>#J@S0ZEJJNc$Acq2s~anS%&iO9cA4`*J%&cY3oXXN*yNG_J_4M#pZM1Nu{P? z^-Lp9k`|IS5u#7Q%=poJYSPWnB_>e(<7h3CG^t$=5l8$}VO+h&7>;4uyp*f+vdU7D z`yeI2d)z~QL&Y{K&dg5jI;P^OkGyp1B!I4vBK$rl4Noa`S?8xqiqti#_rJVcLyICT zP|ar)Qbx1mh>lUjgmm!3)09sgR zvZjhiP}=_h*pFtjG|KYk6p3bAT7e@c=V(8*2*Xid0Tvu+g~z}&;bF0rLo08Sw@Y`HN{CdET?kr^^K ze1V!tt_xX)>9Tlp4>v1MWu{vR2?YQP2seQ#Ym=)uw+T`SzWdr6SO*c)aXmQ;mYM*s z_(_Qq15z4WiY_^B-C_9JX;G278rhvpYNDlJ@w$5-ujD zDT#@2wfYDN{5!;L;nB$ozFpAJ)9Oo%At8HxM%Iao5X(!VpDeYMsVO6VphrcvcwJL| z>!P)Iq+#qj>C&Ys9$2>hEfCfb#A>^VbwRtNgr@y@iQC3{*m|6WGT;Ox0-N3{?2;Tr z=qV~Txgs4EYR-c$6jMjE?9bpNS$(<2h3s$gt}2Nr6llT$I|kB=A=cPLdCZL^ASgf zI!aaKty1J_w@x>UKZj@`GRRUxg(Pq}5ztULxg~Fs4#hcMx_v|`#siy+6!eKZEpU{Q z=`EGZsVX}GZMKIkYYhp7AgPj~JC0%RfpFqwso-2n?hK0w@Cal|6x zY&ZV^OmxfGCw@7JfY1Y1vH%L}ZQ(Z%Ve({@bR?T`XbwoZDTjq%+y%GLrD){vzhc!#c2Oq4dCDI(+zz~TyB2Oi1Jn<^C2YzYG2 zgeZv+v;(Jf?Y~$_!qZQ@!(~bXXjk%{Q5ITu=?fYL?1%^iC)7FG0+z$yGUAkkTd=ep zW?k0@sEd=t9;VB>)3*eX7Ko6X_7{Dra#Ec_(A}v~CTvrnY8SQoM3&n0Axb2U-tbPL zD3@9*weSPH+@&W6~@gUY?|)=r*z3_K2f4=5E({Wy%-AgJnNbP-){p)D}5rrKIh2G$}n-F9Kr z6Y}knHs7o#%ugvxDI|pTFdK8q^97acBMg&9xTMg$-C1ZtR<;ioDFe4y0W%L5(%@lw zRlSJfGa*zzE;qW4_B{+OQ>PIygpq53>IN<{85}WwL`k`TUMgl;)Prq?`~Bk*^UeoU zmB~1*uk`Z|NfieakP?lqcMzv2q&P@Y6LoE1ovjX1ZIS7t_AuIYw2*#HX}>m1ZpztF zDfxE+K)=xveL02}<7rz>s^`;j#4l5*vP*eG<(n4Zkqovg+Dpj?rR1UDqbf=ThRMI< z3bIvZQc|ChI+ebyJD+HkrzuhrYY7ZAkfmz2ox~HUQ>75WQw+2SH@H0Q0@&<$((RG* zCfJ%#OR{T92MPk#j6W{emnmtrYD%qrJcx5X+B~pQfI$8mb%H6MOLI%QLPBf^w=kC7 z8*yTT@-*9N_vQ*jvaNG-Xe%>Lo|tsF+baWLKsyL_KT$(77t#Q|_S>!Cvg%4Hb4`L% z)7~*;lT32K53!pwhpJ`El-VFyo#33~H5pb&SRj4<;p~dwTYjPl?G4)HK~pX~l@csH zKG3GyVS8{Ik5(sT+$uuU*-fp#JHmZ)70ypH^B>G7>W1|LLmy1lP;(wE~}B&(U}Z4^W=H!JMVkIj5u6ugXt+(UeIb`^0c8Z3ai5PTo0(Hjgpf!*xpK1x}|p(|2v?mqD>r84ub>TPLIUgTeK?-d0#^-|F))T`wVX#&9U#7$W|YVM|3 zxcb(m5TkQ@jiU}+b;;Dhk+!2nfWfzrbqONmm?@aK-#LVFGcpZJugX!dP)`=O^Mm+h z&oNDffB*vLw$Q&bhU9A_%zX{IMXaSJs4fuO!)CSr_P=!*F(yha*-{&k?S$ z#cHDCAt+1kl1h2Mc!Gl-W805U9PtvSc~6>*;AuXSeMkQQE5cNkNlnynd$k4%iAdF? zbdI}{NXDZnJ`mK9oNa}KB!W)e_ltSpe+VtSAmv0Lq|6ecNZjverqr5L%X8%xA$qi? z{W?cSd_7ax!x=+P9#UIbVJc7`Xw9i~(nGZO*?!<#5ul z@NJh;q&Ve{l?}j$u5VQiYIvcSmI^MhFEE>=b<#vBc%P&qiG%K!uWTP{{Z-PB$SJU59lM%KZSaOZ)G%#gbS%Vf_EPA=nG~!I&XuYGm1$B4axlk z5u0c!vt=9e_JtRaZL)SFm?1STQVHJN$8H7*_HBh!rz;5;xacBY%Pb1^GpM8YYBKFC zY9v@I?G1c_$$FMMuZfj3rfIUq?mDE{D~*I&DlHmXipp7(X)QLNPfg>$puqOrjy8F% z+!|4-%wY;(mX=5)3lnQz3N4h(Jg~KBCx7J!CX#&R4X?2R_kuoIbwkX!w-)3_TWVE8 z698KtV!W@dBXq0%P)=e+ZA=ufq$z3GrC-I@m{m(Dl)BM!N_{uzV-m87a$Qb1pWZE2 zzi1Z=4#c^crzLE+lHv=Nu5OFRe7*b^hWa??nf)Xy^ z`$EPa#B5b$7WAo8?I?XKMwc7=h*jSVWtzCon}Rhcb+yQXGp(uAAx(>^D&FVb6;mze z`kPoFf9?W(w${>8(odVXKJiZDbQ2By2Um0O9($QOMX}*e$Y-~ zhZ`+vRf0*m?+PNTNlEGtgkZ3@jaq$7J?(Zc@# z1D_BaVc=sFvcn(!O9#%n49t?rSCEo-DeWDf$h`W)9wjg&rXj=CCLe9~!Eux<6*6o# zB0OHZK|MUF^m|Pnwi)Ab>~+in%0{Njf#$;YjY1Ie2m-^92#t|8hJh(@O19gMv6Uq^ z)^;(5tk}TZm1RI&SivdkNmv>P7vJp%+n8*mf|IKJzz?*y7jUa2bcm5cJk=#_+S~i~ zgj$4?fkh+$kqRd(1TTx(1j?DIEQsoP@%$YvHc+mrqL=p3qqO+F{Lzu zqHPGX4c$iY<*Bu$&q%eogjvQktg77e3uB`B5|q$4zTyc!$ltdRsOw}MptH>qc;BoA z4~r61&D^&iey|M8kqQFb^9u=<1w@f!84_h{7qx^$8<2-HDWwT09^64@F!*qehWCdn zwBI$WY%D)G7FLtwC

tumJXhiYs*?ExKov5)uMUt$0txGX6w@)Ss-2*u%PFm|JK7 z1^vV}@pQOmLDee2r-*cWLMJOkWaN;k&$TZ7%Wki6)+~R79JZ&?vC~R%q^S-f_g8qY zD?*u>Wz%7yV1pK;!mI151U;ZF#`fcIEgr*2z9{*hsW0xxdH9l|Q)R17Jj}Z(2|&J) zv4~;%6oxUx3>W2E4Ylb$os=R`@d-ZkHgP~1b3=F4e~`di*)@zrta+jy67CKZ&b(R97)^F22r_K0ql<>!(J zz0Klj%89__f)GdvNFouIEF6JZN-4tCClM~{n$mp$M4yoPsIdEzwIw9E{0j%_5Y5CG zWm7XD)`Hfct_iiEoR$}vK-AJo7Mmy$v}cT^7ie9U8ncL+bp=TYEU0(A;;DG}rAlIq zG|Jit^BW$a`2PU4qDRAcx^1a@qAZ`pyRl2f~L`{?m zj@itTDjmu=L$$Vj?C`|4r)eyOASFX}D$!_8^=L2j@UfaMnS@YQ0Aew z>Eah?IFg*ykO2=TPqxMol_sQ%m5o>C*Mp5K%V;9$>A>O&Lfhn1sbaYYS+W{@sQ&=t z#1U@2EW7Jz%ial8r`%;A?Xm3yO;{HbsBk|x3o7{+9mJ9>eQda^?FiLOVIt7F8F4l} zV6@clnQ|}qh)1bDhnA3}D{iJIiwHdSHD_5KO7!%(v?1c$W*00%5vOkaM#^al^bjmP z;j@d9hGdqc-)@(H3&9xUj8^phU+5(%Jz_-3Sw*_*Yx0UwvHT({#4U$vfnjOVqhdP5 zxsr92w$fU#DF9hVj$q$K!SYSiiDp|G(%Q6#+g7Wj^8wN7S|ths zg@E6*8(XPyce-tD>|h5Nmz;SaDYqT@g-U$O<*=lSlhBAvX<Jm$v5N*6L^8sa<1*r@AcHgW8@*G(JR*>YSanoxe_WMM4;^I%|@~Tc? z{Y*Gee$f5JRdA~M#*zu!VazlULj{El`S}=6@__fARdbMgB1yNHngb)DPI9yL4prSse+QVY9RA& zV+L7UH(`Y#T28gCy%!?F=Wl3LrdLRRNOId)fMKsrZ9&xfNK1edZqThEE9IMm>Ix@# z2)Y|6q3uSjIi%fsx`Tc=haEO)$JPiSk~iOR3^`Yp5`u$rdG>{w8l&tR1t{EHbd4}q z$PXh*nD~=@#vTeBqt&-f;bvO0>YEx|wvlgmV$0XvYy_06Yh3g&Z~Vltf}PTBaC`4) z(47mr9F^**=5N1m z>_AB-It)@3CldOuun=~&`t*d^ndLg>=Hwfb$KeIb!Dmv9fZjFNsNDDGv?6Md_%~n= z)=O@8FscS(9`Blp-KZv2CjQ^5SDP&)j5sQ(n_~-zz#1Gsw(E0N|=2bi9!fI z(GE;YuNGoA-9^jIU0{*2PqY>AG6+1)KC1pCV??`)NJvn!b~dzHoQt2BeqEt3$zg1y z0tko$2V=Rs7dnRLWzh1Qw&ZaVmK^a-M5cs^hK#eu!B$O$yT)wLljz%mQH#4QTJbU| zQl;kxlqY2#fJ2Ufm~^?BG?OseLWYn^hUOtkE^*K?tu;(HQI}J1ixI2T3`E$QHj#qy z8`RaUPfN1r?v{gli}j2$!R4BzkvbWJef^*7jvHJDl8j7cK4-dS<7ZUO$0P+M5H3tW&6G{Wh2Z6ty^Y8MfIesLIcD^{=oCRiyW{{Y455M=&K zQl^7$1SK;Ke-Q6`-W~JUih2A#sTWih(QC`U;bCY@wXtsKC}|}XL@(h+jI3wkDxo~$ z3ezm&mA?C_U-1r48WQ2G(({skcI#SIZiHL@VRtI9sLE>W%>0Q+RMISfoeqRP|gGB|3O%#4!>YF)9U5H0%0y!7u+Z~K{72b$Ju*Wru_60FlH z?Mg{D)U>R)(3Ca;ZUC?+xq#AvCdeuR$=q#dKGirpf}?cqE$;zNp)HV|1SLF!%y+ox z*1M1(h}D*$*jdw<@;Eh{Hf4 zST^f{XHdA{YzOvZ(t+0|N)uq)Y0^#X2!RaJ98g1O)Cd}sNgmO%9089dDFhGVJz!M? zzbE?;k&5wW`Fc#0gY%CaETDh(ii5RWHa($YYDEE( zse8+mZ**)-IqLG_Y}ud!O_Bs7ROyeB62nB4+!1~L@G^oyrV*8?33TXmp|=L*XJo7I z2AM~mfUBh|NY!D%-=rf=Nur|4ns6*9Rrl*?(nw> z#{8Hj&eel0rxp7uqSuk_DW!!mi*8w@+vRg&-$kQG9Z*m{S1$B*?NPk0{abbB2KsK+{|#J-C* z6x(LVx`^m{Kp?nOLAT$uY+eFmN(d(V$CFW0ZUiZyFSYx}F;UY3bUxZnpb0<93B4?3 z+Y8i^rE_Dv8mchic?;I01HkEM)e`9m)}jx*65s(gd@1IF$iANN*QU9T5w^+EYN|cyE7=16d z^!+1fFerebHv;0q*6$05`Ug(233!OC3U&snxTG5;g_1uAH5-yeIec3vOCB^U zm>V9>Nz5%X^u#`WEBcZzz%hTm9X>s94lk-AQTni@PONG2CP+!YvFjXl#T8Rl#FYm^ ztd&eGr|o+{3_jx%O*+fZOH4FT%26oQ#>wCYaV?Zk3t!k@(#8F+k{mXoZPv0WXt0cY2D*iW(R9Vf{z8JHKv zjt~G|kXRgL1`COQ#iN#vzH1x#EWX_e{Lxb%Q)^bd^>YPEbx3o?R zlk(bLpi(!8YdB>`lJbxZ@3s2C;Xv6CsI4I-JYSyBGc`w&r6i~k^xVeN4i}qIMvxP^ z?FClarP8%1l1f2H=^Cgjqgs5*rRwNc)__1GRjm^)Rg}7dq&cAqH?imY<{=4|lGO7` zQj`Vt3v?iJ68=;x=H=VawE{pl9`LD0z^u%d7-YJwAnXTDuyLtkhLoKNQC}X=n@?Ag zmdBf@Y!7n|N<&FimQ zkPgG9-67kaQmv&eOra!c;EqQ~Wa0^i>R4USSE!VZdhG*7%nq6=1}>LV6*p3CsH*(m zYwZZ>vNc@sv^(+bJxQ#(n-yG@18>F}Qvfohr)^w)<3xHkNvk%Ibvlw&z0JR*F4BQa z`+9$l*MtcoguP{4008D4xJ`!4^E{Fi2m^Bw@-<0qvUJOII9Oz)i+}<}t!S8Ek~1`+ zbI1gK0wavNpe?rL?%4rJ1auKIQ0a~$L=~`Ap*t$v@w5(1ZOGtf=5~tXopey+mQpmN z5^ZQ;za+$QD6(b(c1TautKVzG>n~;$n!^ij+Dd@?ZyF+%mzG=? zdmw3!wDk#9f&!JM*09>~V(9X9AD6n= zAwy$r!G@y)VZ!t7FJbAp{2iyDQ<^m3Lar~&1jgfZ?C0Jr zkzbtRkf4;C-6y4?msVt@+g(aFH@D#uE^5-=p<=1|H&Rfkcb1X}*!qYu9oC*uDpGc_ zu`m*R9awWrMxB@Q8M6)4B=CE022c~LR{9PcqLbMc>0tW{CZyr@cN*0rE zQMkDJf4jkVr`v1-3E!u9fhLWx}W#032NNLB4%lf)KPX`)nt zxwZD#h|Q8oqeeE&IXstHS_vUXgWeMo6t@->H50XuFf8ojUVo(T)(A}1O9xj{Ju!x6 z{A?vwV7gUf^zpvu?+DJzsiyD2;K9n3V9Y#pgQT8&!8y64v=o&afCz*%XkW05!V>T) zHc7p&+6qjt+?zpY0FiIB4D+GGdlcWi5}k2NN^GH^bc#!w0#d#L@3=Nnt#uQ424Zr^ zu_Scg`NkJ=-k@$f{xDf-(vnH*1kk5rpD#7d)KsDLq*}%wq0{CkwYLz=%Jro$sYC#q z9jy-yZMd>;*3eN#9F1MTljxv{X?2soe($re2a zV+^1GG1U9Cj2O2NQWEhX_b2}VP}s;+Hstfqx#|um*pq&+qndL>;dUA-u>`8$lr%6U zb<8_Ub)=xF#VC}K$ObK|R8EIpV?32&cM3?c*a6ZR_2$paD4p(@k#N3FRxyJgJo*+j z4M1CfU<^f*^HNAk^pXcVME6k0#>m?YO3X1f7Si5i{{Z5mEMfluK$H22fb7$XaM)a| z-V3J-J5C8uWof?Kh|#wuTAU5Il9tM}#$2=9YR4KDW*9N1qhoU4>A zu2s)cx3}P6 z3AxtFZkqy|54>gCw7knpO~RM=+(AbhWyTakhgU(`-C{?uQfcsNmm8TjD=8}2S_U#G zRhthteht;_3GGUyO9d*}d-7nVLYm=s(6SFddqFa!gEck_4iV-fPObNkLOZnQon$st zr6^ke0EBugau@#q1eZm^jA1G?yp*SF_$(n(pploWt{B=Q6itCKFjKq^r-{5|1BD71@&+!8On zw8CuqmgCx+My1;J8^AcS(hE(?c?lZGC#Q8^pn~kOqbK{oP?ZyY1qWTTAnF%3ZxqBhaUPzR>Byxlu;Ka?OcJR-Kt1r9SA?vU}Xd zf0KL!opv^rOseL5BK$c$`ImZfC)=hAP;WvX^QIb^+ZfG zB%e}JQdyWrw!!ZW`Rd{)Y7acN3q{oxE6Y0r*3iXKEhfh=mek86p+PE1w;Wm%YE7zC zrD(EG8!K@HY50kvOI~TeBIkYKLCOCBoR$f?eJ64S%v+Lu71v{WdBvoa1b_!$XilCU zYh)CuWnFEshdlF5vnrrdVxzGM>1aZHY(hspxs0=oI}JM#lR6|9WT(v3cLeSChYXEH zQ*5N4`zlW7ix@=`&C4ZfQaxt&-FLdx=>ZN~l9QA3vw;S|?%8C;Ez!ITuNZJD@2!LvH=AF`1kPiOH=7Tr6l>ys`)>BZB}tD&tF97F$s&AS(9< zXgubHf=LP&2?pH8lQPL|kdm#EE&_h22N98wp6e(mI+T{ukO?IJ03#dV{8?AZjBh82 zFuePe+RTfZ+jX@N9UFR8+(rw2bjW4Zr3gs5DjeT|1t$QLP$X$UuofM5fR-rAE;3e_ z{CON?r58;dh4^)RP3Rsh>5bv~@{vTx5-AB=1lbdy4c3F#jw0A9c?=D~1fNJT^PNne zox)XlYNZ}^$qJN_3znH>Wh-cl*xY|+I&1La__oUD1N8g@nTl>l6(Y^ZRJCblp<%(l z3)_hDUZd$R6W@#R{{YeJeLK|_Z-!6H{{UtEnVT=RN`W3&*dDN5siip8lAX9d(W{eW zIi*R^2=w2AASc$6f|l=n_&moRj=8kNt;MaWAlO25#FEgGvOdGK9&ONskX+xffF4?O ztx9tC8wiZ68})f#HM?5i7;04IRHdyq*bBqXZ-b-@7(%GXh3c}bqs$Ds3C7it)or46 zCtxkiH6|VM-cYu{{!skHvSlk+9B*OT7?%G>N> z)}<3IE~JyXhxCfm;}&&v{H?7zkP5t&BoDZYLy6_myC{Amv{SE${wGBPBC9VYWu=rU z2`B#mxj*d%f;XBg_Fh?S!8v}8QYv6R^NtQ2acBPk+Atz+ReRdkFiuUiG|Ol`6TBNt z&Xf^rl^c&}_9<|D-udM6URfhm?hV1>6fmYJs$hIV%~FjyF;1UpT9We%DOcleV3(T! z&p#GW=J8^yRLxi9<|qr(3H#oV&nbS%o2(#f(LtFSL_mvKCS z?-PbI#!?v8ikh7crzcjY%p=T0vd)E#`;L*ykdU;gHWnjs&EdtC*|Uf;ex#Y24DzML z{{VR`qp62QxG9CKDRPQ%O;LQ16s08q+f~6mi0=YA*OI#xY9nwv#Bq^cBU$jhku9oE7f{?PU_PF0@VoKrUNTJmEfjb+Xqj+vSURkRY%E6oXeRA~)g`pZy zO|Aq*Q|;(h#>90ac%O68)XL1S({KqNc!6pT2c{IF03_d@Af+B?-4|-WB@h)bE-a;O z_J`hCQrA0KXtshz{{W4l@BVmAkT>4l#8x-{Qm%UhedK;SHX2WEMf`ed2J!0gd|-0wlQicGc&UE@32O_3;M$$;E`K z>rg!1T*9L?nZ*?D&;$Pf7&vJ&PP73?DL}on?-7HwjRevjN(#V2Ji~Htz2iYiP*sUe zs9&nnUS$@sPObi!OiOA*pI=_7-YSX-CYIts7fqm*Qj`?HNh49~4o0Z1%nOB*Ipc^e zKZjgetW>KL+AfPoj_T5HA@G!6Vm`(YaTKc6Dnh^oKdeZz*nQL~MJpuU!_y6HPePbX zs`cK$bR57il(-;_TOsok1RISe!qB~z?y5#*v;^xMZXmWWrc6sdLar1J+jDqO%c^tB zo%I!MZU40=R-T2}0Dd4m?Wjvaifa39lnYzfMUOD7DV# zv^6VKf*bUJLBBBftji!Ytx75+h;7uorqD*_#P#L|K#XdYHBFyVHUpl}&Bm1X7c8)j zEq}R*GN_ioE3hWlDZDVTRZ*o%ta*E+oBKiFWpP-15R4Pyq8|(g@56M!kQ$~ zQdE<0oxp@P5Xe$Ua>Nf%J>c|{DovD!FTKDfHDiBfS)pYT$4Jz$ke)rGcV&FHRCT86 z^(M!NBn!)Hkgj(2v|u*lsw61-M+E->D0PakLuI&in-NFm{84rZFX6T1H;}eA|g>1Fgw`l#*7)LM^(8CKJI`Tz@=dDAF#}pS_fp({PLT zJt9`5d^mF&u_V*2(;Agig6Ga%h!J&s9Qb9XEzi~` z9I!w_Q_ulzqs{8QMq8SJ=(M^RMSS@=sy-Kal&8o{tce%CqV0{X1u8!aoX$%mrdmx_ z`ctUi^Nx|Or#xLYD%3X-g;u9f2dQZ&+wB;CnVI=EEiNwz<{e+*tC> zzVO$md_40lr>?3J?R$UR0`b;0Vkv^4RCRPW9LBHK73G~wgK=xyh>KT0vVR^PQONV~ z{>;{b!`N}n#gIdQ-VrA}3Fe%uPNjHWXoTL@vA*%xRaFj~p(#y;tziNtxVLPr4XCG~ zK!T31BJ8K7gXrSK?}L2JlW$k~My9m&(vAcsKjCjM>17V?B&^D;3q(Lm!y4)Ff~i)nJHTi9x@+SUb-SR{|UDLs`q zre5lE4px}}*lLwl{`^N_1x{1bc`192p|B%Y=A~y6x}+`nQUro!&dHO}A) z>kjEfCUl*xW|g!jzl17mJNwBA)GQktw5`8L?A*l`jWD32N|6g28#Fh9b68@5G}sPN zWR#$G{mO2CNHwj=Hoyw)tf6me6WmXn-g)piFlVbNtLuvdvM4rDaxS-+b*wW>c=OwVR zWw6|;++nnZdO%Wn1DnFddnj=Absl1aOetqcBlt{OxqJabl5H%eku9JdlcqI$Ea(oY zWmJR|t7Rl4esG`UPqRdH&|DNh6L@rOu`v4T|}4)|VmDR9ayD(rb5XbI(Rw?}z4P97qTkDY+Nj zFip&fDR?-9uE{%kwu{)04>)Dl8xBjnv>={U^+%rY=Y+TNko#b45_b`jvUX{4!}L+n zkh3p(z*tSKZh{0~hMI!xTk}Stb7;GagpgzaE9fm4z6#@VxTlL;fZi1(J` zinv7^pYX$5l0!;L7D9#Y4fPmLcO&aEPZYe{fZJjLv|fpvoKvY%8k`N==u(U`@%~EU z`C3w@X+~0@W$t{fBU*>Icoim?wT?GMPGce~j;`&YdH_2qCz#5zhO&hE<=t3sjVL?u z5>(%cDa-*@c9~nH85yRF>BGK=3$ z&pg@=Gc0AmQ-LDF_JA9kNz_UKJvDFyeYw6lK4gH@uPvgh6%`I(yqiv?g{-RE8;fp7 zv?xin^C)r0t`wVuCx}R>Fyy+H>eiIBo0VNw1KJg3p$`^U8pBdg%*?AuN(zuVld-qn z5ikV_oO6w3zMN>Z6|x==rZq;CADmgp^zgeg1UxPy)Si2`C!pxaPgyYt!_ z_4#ixM#lQVI&H^TR!H$>p}9?cwJA$Y&8$*XZD@Ak#gvpQ%t1}=Q+|8HH8QK0eOmoK zp|zpcg&qwtr9>qv19RVKUOpLasBz4^mt{w!5)Q+*(2G=PA%GH+7j4Hjg$CSG08i8} za*%k9CtFj?NpDCzZOx&rS}8HG^uO;Co13IvK*D87r&xaIxE38RcyQEJ{{UBHCx7C& z>jhts^GZRou5L~D5uQO^OuVMn9zt7jKyDSVR1%q>2O3@M zf(FEM088qXYzI){(2jvz#VWo?hXlOSj-ah5DIAm!;o1u!%^Hc^fxY*F^tzh;JCvYU z9;yR~Hv0&DS`edf0lDiBRLensFV1x?1rJWf<8UAenG`=ThZLRAZ(*>5>R_p1B|_t4 zw>!X72}?Erl>-W#Ut|l3g2cHh3JE;za3H(-mfC?%m27t23>73y1gloB(g9m4b9F07 zu>cR!7EnD&*$SOiPzc|Mg8os>H91Im2gK<1)G!-fGNE} z2{#A(>j2WKW22F-QPK~FKgBWJd?fPQGAAY5uS%phOsY&QAWo!g6083J9j*6{fRG$X zA!$h<6p(oy(etHMlT_1TZK+JnFrc;`ZB|=L91uqv$4b5w-xBm@41~5^=2ZG+@dTZj zrBt3+37tt-8WRPEjs076~dQ95o=2*bSp`))OXM zF3XS;VtYkUY1$aridRZ32BQ(~Bb6*Zqi#;%Z4!PUlX6*llADkX%tzRwRZlpgZ+lwZ zj3#J2U5&{#{_{y7lh=zv%%VtAN==7B-W#fL%gt%E&m_Z=ji#!QuBe-u9H00GS`?*Q1 zp#(8L)%FDN7u-Zf(!9_Q0NT;(BGL2b8g$Iqm32FQF|kUNY_6lPNWzk-R}`Qwlh7OW zjI8TUvTd{(R0!DAZ?Z=N@DY?gEI}6sb8cfs&ZA;Y_#V--YVtrTNr)1VdWln;!}V!t z`3F?gloxVLy6waO{{l{27N1*JV@kVjBS;w9`17SjkiimhX7@M15? zX{vT%;W0kxoCkUxeSC2>bSZ=Ofh7HKR~+fcgP zS0ekugEIm3-6$!z+!L^ZcxMQ?CZrWjA<_Q;{EpE5qTv~L9STz0Ae-^DA!4>KaMF2~ zCZyIB(b*)V_Z^{!F(?c3K5Jz^>A1DFiyi)0r>0DR<66_d)5I{bZXBnw;)w<7 zddEmSa^$1FBHKxrSw~C$1|TYoy8P=AV6Fb$;^KIW!7>vi#UbP*@(3KoX0KqSH97U9 zBKr~B-Vr!+XG${QZ{f)@s)`eEl=HuMoH9aHGL@!*NLeIYf%?QVYimm z`6ub^CDouPi|(GV{zBSRxl&v}1L?Tfdq$ae$%0+lBD~a>6H;V3v9YiMD=uK+?=E%F zgU?%WXtkM;1MRHp)y>7W5nb{8vq+k7rAZ-YuUIHBRgo+7m8dvUHETB9Z`i~0ENSks zI>K90(h0He2nC?iE0VOsdYHoO6Ffp{{YgSA#DvMEuzy8kT%&oK!cI6v|0s<5@EL+wwDur zeWOXaa1m=cen;8~$gNC~smE3b+ioCgi>;-wb2QjSol;KK}zrFZ`iUi0Lfki7IouZrY5?qr85X3((pr|gyTEN4~TB?VIl7(Gd zo5X2`ooV))SYhjn5xt@1PJP7eC6~G9S1>oo(S0qW%oa}Po#9TED6pWRYXiRUgu}~N zx62#wJy54E`9oSuDhB-wU6zpM677b@po?`kgltOtQV0P^Nf!SAR1}%0ExCP}Qj$fl zeZ)2K4kSttv?;Qioxwaru%AY1SdFBGS)?ncJt3)7uNO_w+i3&2gxcOFA<~pKq=I|% z4fm?guH-kQ9_NS|144~rsQUNv&}Y~taJJQ07y!auMZ5X)u7w0 zpW(LWv4;Mj+LYQz0Fh(;A$qQ~YEn(W>^UQ}Hm8;um?0NV{C(p*`{3(gVTDY2OrK5-ot$B366c|8&Y?-|v^z|f&MtR&Br%4*fnbs2g z%LxqmV?#hBKntm?wo<0bRD<{!-mL4Mex#FSfTM0l8$k)FlBAU@P&^SHMsAtwQm}JA zDDPt7SMm@(4_q-y}7h%+o3BK zNVWIdcqis5Lt%S2SSde%fTkv#7AZFFAvNlp z$WS&m;^UZ`*N~wPp-d8m8>n-%We*h_D&y}6Vsc^UGys16AXeulT2+At-TOq|6UHi~ zLA0Blgc6&1MMFx-0Ks3Im|C@JNt?{xOsFo%>-RBoa_NUI4!18Y$uw?AkVQp z$QoCOOdg`^63E07C@x9O6b(vH8zA=vIe(3@lN6j}noU-Wx@6p}(UzJDNdW{Z#QmeL z63B8~f==l-zi6huJ2Kjg?kt*{c2U2aea|$nNaoSMNfkG>n6+zcccMMR87YP_6oW5* z(G4Zkg%pL6%z6dLsv}iN<|U>Q3r-N51N4t*^mP`3CnxMm{P+7U$9yo%J&4iN5R8$gn?;FfAhaM_nOCclFOc;3yLpqaU z;T!v2&@Fz#PwY&7S+&_j=}_kIT6+z(H7>UXl&03dKJcpJZOo-Dtpz0~as|w5Zy|m| z8#1q}S9qj~Y+_cZ4KUrDNY<+qk;S1XPA*<}AwUEkE!T*C)Tzl!ibC{}$rj^lLw2`E zZfQ14U?dBLUyiVuL&^jb7ow~880n_qLug*mp-EvIl&lVWdkwV<=| zDq6hY06`|-rvCt}9F>tVJyO3k(#dg2w_$zYBP?A3r8qrY+;oF(B`R}8t$lz4uSn4- z(mg<0_ORX+v>`R}xj<6dwH`*1z>L$U%Zt{Vm68F!5TWuK9oCej2L+9e&`N4SQi@91 zDFFuLbb;E@5Uu63`kh|1p<8N6JM@BTwTQ4bHwT@dt8))6z@wxKaDP}mEl@QFn?Xxb z``D`17K_}U1Pd*zBYisWZJ{;KHInI3xFX51;v8b0!I@AlAyx*&aH9#2wpxE+k`u@y zZJ~08-bf&{vee2F>Ooo96V?v-M9ZUKlv>AV8fIA&>iytaRF9_Heo=d^CL2pc4%?aV19z=S7Kj*7VH&kO%c(0#3TL4Q^*->4QJQlfB1IkS`i)nAl};=gHE4g-68bW@N0kT4pr#yBL~LA*y9X!=z87aD@~6 zc8lt^Qsd+;dUS7Kd5@gUFS9tAxl*=gq})r=&$MjgE~eH{KZJIB;Q`}A4EXWGOkgZo zR&xyIr44{m<;Rm&XnI1@70Ke`-aO{7(H`yCxJ>k#PhF1PxmPH%GpEf^2|7SOoDzQR z*Z>Xr{321sJ`S<25?`54dY@mFUrk<1fc=ifBfM9KD_9m_wOyf9siws1E%}X~vXgk_ zW%S)dJ6HY=rY}{~?T(;=Fh9$SHGNl8iMbujC~42PIXmAX#X9UzTnk^cZz z;3CLY=He8vGpUqWXp4mOzj)50Qln(0ap00L#DaXWqUo@(w$SRJNR=;Iy<2c$w};#) zZ2r@`11htZ(noF~ zIjx+RrO6Uz8w+ixO0Bwfh*ph@&KAZ1v~1}mH}3LNF$qg6;DGi>xp>8y1T*=(Z5U$UxHNz$;B ztTwfDAjJOw;)lVmTKq%uO&D7n(;Qx(RHaT_=$Mdp+bs(IW2}0u9!=2X@SdZlSm(j> z5|W}p09fn?c-0`Fk!_-P_=!)*}0J8ycgSYySXnlY1LLjkZ)tQmtWq;2?|G+kg0hS!}H;u^Vg>dc_dJ97+fW zQCf}tfsN%8smoYwFTVsv7E7&cMx^XX*qGewAvP%&01!IfA!(C$f$tLIA~EZ9x}(ch z8LhkJzE*A}9Xlbx>`ulyseo|w+|4G!}w02E>!BaH;P^ad-DbmiBc7uZC#L$Xq^Dj$iaV;T5 zI~&>~Y+r^ZrVEz=Tbp}DkCLVeoT?JEOKMQ$qzglD7GWd?TnkLPR0hR8A<8NCTx}FP zIWT10#KWa&Q!23n`-{bX#yDxpYF6WmD!#{05qR^v41C%ai=`<|_w5y*G;kluw5@7F zk;nkv;s$t=TpDAPgr(Y;OwbAd4L~4`?m3BpQV#ofi2PE66958|PX59t z9}aYPU-F3!`i=J-Mp#1R9$9c$90x;bnI;KRK|7Uc;velL64GMR2u7jGhdV(m2}nXD z6RAxANERcAaz8|6hW$><+WZbZpyc^7zDScZCd{<6njAvZ2KE~d@A^e(%sP=w!}`sN zNdO478NMY_!BP~;f=1vDJ4IN{7Zj<-ioh5&M(MY0y&eAxZ~t;fJntqAGIyhu5JBxU9iWu)0dnAH|X&qbcd$@iXptG%T{*076h zmh(#T8B(3uL~uBYi;~tym12acHs9JUURP9-Wg2Y0*f-db!P*PR9toch%pkOG`QrD} zv4vJt1A6@B+;jwZ5w$cIZ76@iuMYI&1YbgTXObF`b$_NT} z{YINWh;c|jyy7N)=aPY_QGg)uskshcF80OBY(_DJ|*ZLrz^OP~NPaSrJ^nhQV_JHHnehGiAhq$bm6 zZ{fD)9MVC@8Pq0@-4vJ_9YV~#L2WBhY0U{Yyem^D8-0RQ+kl|v>lTa|T^zn4%pJKvaEn44jwl>FlF zZIVPav5i#)qLBG199Tu7=w;PBmx(2%0-kTu5hl{wf`U-1A9xoKRXmleOQy%ThTP>` zsbFrZ~p+?#`LL{ zQ#6lREfb|l{{T=hwC}O2j!sVE`8BgVkfi8ZE)+Pi2YbU-w8~cIucWBn{{Zb4Z^y<% z{{ZmjXfA41D*cgK)iBDr4XD_W`o(L+5@X3qh#(Pr^$?7)r^(UNv z6eQjK;z1_F6VKmhP6$qbokRj)?4xK)X5^HfEeU4S!>FjdnUE5oTN?|WU{%g3B#ZkS{V}^pTU|neh2R{kq6&thq_z}Q%D4u`&?LQGMZgqP8y=ndm`+Qc zQpT$uzTG1&yq2E1JoM%zu#`nK)(LQg-_m#cL*v8FCHy(eNq1Cu0U=`l0Hh~9>|^jjZ%pm2P0davXhHR*D<1m@Ao|wg zjnQQ&+};#v(^BJi5z6|iIB@}X$MZ?+d*}zWu>~ncNGT(cv=}L%le2CRR8XQi?YMx` zq>GbbZlicm`N9-Vk-s7WeZ)F|3J2j7T47W^+EJ+{$AbYsF|36fTfb;D-;#iCl!7|i z3r=Xb3AV?iK-1&}1+@d}+n|k$fef8Idq8b60{PpR6V45egz**=1A1|_HEkeRTkQpe z#*`2Rug#!!DFo~VqZ-nYz}_KgcmPw%B6@xSX13>lY<;q@u` zr~Yzz#T7d8)7RVDJ?8z~Bg;7bp358)F-24JwKvfHPGMf8@(>Q-1MLoUvJ&`Gh)ElP z8>O@|prj3rxA%hc?6&Kd^9WezVyd_-)}-Q#r9VNpLvmp~EEe1fQMes?g9lXjNIHd; zV3KXQ-U=w)N=izQ4+YvI?vcP3#8736=b_ zB`P}5NzywAh0xfk$ui@L9+7L>+`?q7K~mF7Z7DvJ_S*2|n~-fqzciGSxlOEX_k`M< znh>%OkU;=y>Ma@P3U-E|^sDX8G76Pt5wYlC>fJ-~$N=e5cGJ-B#5JU9DwUYirB@>0 z^bomEo%5GlxLnh{tv%IXhNYVdZ3|L| zUwiWxw$VsRs-!7Ipc0XLCjS6Up(1mTg zh#Xt(6p>+RCraf4Z*-@Ec8@0Pyc`O;4;yYo0?e3Y(B`rdEn)th<7X;plbJ{wRji8; zHtQEfS~ZxLSt@k^BqUs$>|ndg1;hnh`ffn!yd0REE;gWxAluX}v=p+YUP!tdHY0tH z_jnY8Psk8TWfHy#CzJgkd?i$=VLVwSh$uBVnk{mS;C@bWU1bYtR~r&J9?$_^o1tdu zD*U~mwCkowdOamT6?VJ~(`Y3$ou5K~1y74izm06SRt?70DLHJ)p{L7vr1}Kn2h!qi z&HBafc6k%5C5PK>#~M|Zmk zO;ZlYq17Kt?4!$AJ@pGjS&M!g*g~m)lC9V1&N@g!kob9^uW&?8s9TzwY5S$QfC_GG zP+(VGH1GE+x}(8cR|xOFmy$Yf4tVVA>mm@<81PoYdLE+qc2vms2xRFn|@7_7FW`c@3N z^q9JHwMW@=g?y{ql_z}%xQr&S`!o6%X8=yYKzhe`rRi8#NYK51JMAV^CPhg~DKtvB zQa4aC%DDdkhzg@itxNVto0IZ{)p1-A+iwF@f3?Hlp-fLo}#-15+c zp_kA#0E=jJeY?c}087G8_1xb`p_rp0vkw`(p-#fHN=mm%olr*q0Pz*6pMW-OX2yNa zV*E#mB=Dq@q!8Sdomoigty~?1b^3m^sih^vI#_uI>qz=kKF~^`Q!CV6QiG?3gR-EZ z>3AUbP`sYIs*ljE4pnyj_ck2+d zW{A#phAOS0b%(@=vSnR>AvHB z4dR;MwD~&2@R9hS({mDDLo9PWY@-vT2B`Hnj+9i=EE0ti!p6hi(bCFI6>@VZLg@q4 zpXG964>N!>3aFV( z!o$pj%FHdzBCg0bN`?ObkAO$C6eQE+&zlv;WdqYCr&N&XCjG4j znrH`WqPaUoX%h%<%L)Zs@5E1j9I2$1f?5l(7TzHV=~kJj?xovV+O+P`Ka6z>|&nyqj?TxwjwOdxZB8-aZRXy0*Cd3gXD>Ps70q! z$$nMUq=Eum1xNcaAmC{;DKwHALV|WX$1JcNUa3yRGBYey>PdNuiWRTsR85Mv9PT}% zrg>>s4zVKXQ>xU;6sz)X0la9(J7k=8mVYWkiDjjR5C+GXu=#sZbxCJLt5?3;^@_ok z)yCx5PyN*mtRleWm3mp=(NbUZ?`w62iA=C~dZ9Wzu(>8|o(8C1cBL}%E%FQ`fHa%) z46GxKSuY_9YHh>;f2W9cF^Z%dxBWEb(yLeqyCt4_YGEy}%#oKMs@kv20Nl*L1g1@- z>DceY3sRqxnQW9MWOcQ;gym19ygd^hph4T1vV}=XgUvOxvr4|!zYt!fQJ70!iFT4c z@C3ZeB$4I6Vba{dbF&D2p{0qSPDtlwKeZXj78#wH@1RLt7JN&&gIOTZM@UTs3bvZ8D^fUz>0 zVrPZzd!F%}I<_5BMu$$V_T~kQL*k05wIR0>8cNbPxrc1D?Bv5~HfLDei`YX-j@vCI zzumlgLxNUzS&?@bnCNyKKn@%dQ&UUjECv1GF|MIe=OdU^B*8uGn8$4F}83bf;m*=b=vW5h4woKYoBSPn4$h3rx~Lqihc zDsm)?j57VNYbx@A<5}>)u@FV zjypg}@LKFEF+DKSNmrIHegrl#O+sl+C=!B@KQ7SWpQ%fdpc1eYHy-fS#I-qeB|ss; zeTX~l3YS5qMwo%uU7A=bN>r0;_k(m7-DzWX$xl(W#3N!_>jvv0e(H;6joXb z3qva)3*5lNk&@^O#I8uAKQbD6Q2A@BQ(IKTxg&dlxCS|UU#1#!uF6axhnQJy#Hd)H zgJT^_#(p4ZStWzssn$tprJ(cBS~;nlIO>g=nD(t%p^znKCRD9F5qm+-Hn|&yRnZex zn=+F`B{vuA0Z7l?K?^(Z4`^7#l0@*HH@`@4iEk}h!MMHm5sjmz84GPp=vI?!0da1z zho=HqQLzVNJ-C1+?&=cgBUe!yvXJOfi3+~N9+0;mBO5n$^ys>YxVQrU0IX=j)vH>* zn_NIoHk9d6QPc_a^U@8lr3n#Yoy1C@;_H)obwxgEi9VF^ze(TG-YmF zT`Il!Js?vsZDZaym#eipbekJ>9Kg!ZRsl`#v?(RvD}F-XHLk$hXw)w1ybkkdCgCFI zemHRTaNITqHuXr|zm8~{V7r!tJ+m5wzmeR4!j8h<8ZuyoF z3ej`Ti0c9eUL*d{OaV7AwAhr`kJch%B4J9>kU1g)DN?!X0jbjA;M_-$qLaB1b`mxT z?->azBczCQEAgU*uQH!V;VIOAIJ*s1C0)|5FH%6_DG!UPyK`BaI)<04NC`LT9j{7X+&Lbs zn!xOha8q`k2XUnC2UzrLg`6_8Wk7&$awE~`4=kFZN5VK7n}sABWhEbReW1?F8SPQ>_te5!yZP9uGO#1ljp?r*J~7K)ey1Z$gUFHIcoq zYevqjsjx^=w3~q%mlULIf-aPwynF?g< zQdR0r_}&JQD_cr$g@A5I_KGY3%8ek4kPYwpKr>}cr9>k476#jhJkowuK`TzKk)ltR zGL@SYb-#FprV#QLrGUGe3+f-k1s#=3TN8ILz0WYPR+lDRR-hXr>Ax_RmfDqfLWiiH zNr+oq*`PuTA+n)zHw1AB)9Y<0^2LBo=G}xIs5B+qLW-^}VQ#0iC)6APkU(UM(C`)BZCs0f_kx)#F#jRRW2{-nIT4ht_(47R4*QfWyXva6?jRw-i zz$#Xr+s3Px2`N!gRgXx~;INWW-Y4gdKnMhi0pKXLOwdAf%+$-}IR)J+3hzUq8 zylt@OwV>I4*RpIB1%WrxBX-^mQXlx(3Sa2`sp( zbmpByP*&%sFuGKhRHUgofa-XH%aju!Els62^#VGM@QFscBQV;Rq&nCEN!)-f_`;Np zO_tbGPN_+CNB3ux@7@un9#pg28>H?B>AVVD8&w+kvz3IGFj0xxkAi&a5Z(v^h-Ex_UxatPS_i1Utz z(Pbv&k_op^dHka)LY>s4sBO3qQMLKy(3cI9u>+|+Vx(I=GS;A#HbQsbygf2MJMnjh zywav)d=XT3mx!q91eBdE&NeJdP7a{MHQOx>B|zOA5+?nsZ5 z&kQ~$v9E)C;E~6e5~%#7{G#`6s&nJh;t z+679STpnbrzr>O|9pMdApt3^N=#~@Z5S<}vO4}!4{7HZm`c~V_x`iwgVW(}NRE11T z1e+nj>eJBvKZFX(lQ4tjjYMpuk?Ii);Ug~VQt3in2?Xu6$Jzj%Qr5~P-2gbrx(MV8 z-q51mIV9W6(_^xFr``+9Goi5Zz;vZrbtkCzizn<$nQ1C?d0|?JwT}w#06iv`nrx7^ zG?EJMeK&=dq;3n1q!bO)zYq&4`Jz-?Atz(D!`>n+M4G1*5&r<&EE@tg)F72ji>b7{ zl>(A9?ZJiT>F&-YO@#oI5Jk37F{_lf)P)eFsEce)$KEWoHRc&?D}7A@ZGLQEyy_l# z1Oydhg;OwQo>$CLDYk18&KePfadV}SZz-ffXcWj{t#lV7K+Q`C&JY$#ZE@o z@O5do8e+35xnk>fA+-_dSKLR;{{V?E4mJM(3R%%xz&M^&#%Cz*tL5J*Av4mz*$$_; zB0jh()OlKZ93Y1qSkzLji0SzM0K{`|ELY-UWTXK2pn0hub9%qpDOkBk&->GLa{6 zZ(w)403AL<=~8rpH%dj1NYTdCeL8kl;B~dRfTf>I!c%+n0^ghtR0DP@D%#@W#?e$2 znOZc<9U{R*8(-=dj2pZ-15V)o0K9D7?xiI9hSuUdZsUO{02L#Oz1!ZY@fDMX( z7WOd_8T3`~b@-D~ej|Ar-6Fj7jXN{2%YH=sn$`lR5SswJrX@e?H(yNq(To%=2%%c9L)H;GTkE9<49xZVH0K^Nz%_khv zADCi%Br{f#)=K2&5-g;V+WW!AUJUth*C-n_@Y~N9Lu|`{dZ5KS@c~Gjr_Hzqf`uFG zc#C(8<(igZ^r88uK?jh1FQ6Z*RI4S5lz-#XXb(>PY4g@Z8%7mu<20I#vMG2>?f`l$ik9oG#9n6f8!vZ3txy ztlg%$Eh6rfu%eJbAl!~3mH4OE{{Y7rflZdw9c4#hvD{uQ?qf49<4);u@GWHWFZYUn z;)+Fy90y%3II={$iZ&+0WBqLx64&H&TLr8C0IIfZKutxp8}tEj(yX(bb-5`dB&1!W z3-;JYHZVIOn!^pGse0$qEKk%+ml4vev89KkBv++nN@=j6{*$C$9fk5(lj$Xdn_gl zd2+2Jwx(2i*j^mcbF)pjLQJ_Gz=*>H)|zdxX67svW3l|9)ZKZ6l0qIN@-!R4u826F zsn1_VsbZ7Cv=U8faV`}3%%lT-(|AOC5;O;`r-Dwy(*$MbC8XSO&|e{E_^+{uSL}Ks zr!rBf8Er$TOc$BOlhSU4U5hJa5H^Gc@e3YC$yg=`&*D@TioB(paRS+CiWr9yPcjyK z=2VWN+xtTo5m)A>lCrm2NFvq(2C3rYIu@0*um;8%IFl7L*-{HmqWkXx%ZjeXzBZbe zdSIV19mRwPhG(W&m;}6)Z`+7YtJkIHX2{aJ1IJk2ky2%s3cR(X6Sen&VWLu_Ri=)c zIDkm%A!<&cJO};e!LaEO{TmfFgd}-S8*D5g#UqNE8+lI~dmZ3L*z=H_nSDRJTX(j` z52X+JS4!KxuWs=uF^w24r7CUGv9-X1MI^%&*(Ft6ZBDq9mii8` z)x}cfGRg{dum=D_wMw|m!PF4%+R)F$^>&W2rF`=d1>kE}9t;u-slPizc7AtDfQJR6 zY(r6KzHF5Xk|7pmsMuHir7FX>yaQihMTefK=xnT%-0uwxU0V5cD#`#V=iI@nt!0l@ z(&(@|0n9WpRbi)P7E4YIBl3h#p^1!|q4)wj>O{Zx2EIv(KN#Wih@8%QBKaJ4h&P@8(AwYfoIvMPEl7S zEi<>xHiP9~f%b>b8j`iZ5tTkl-o`F!XekbW0qA$UC%HD;o2J{rI=wkElSNIf3Q0EG zYg^hAKWTX`=}5Xsz57NvVrbtC@v0p1YemkJYmJ8{4$CD9U?|vF?|8`#=Q0PS@rIp^=q_gt0;hAX!G>ewKk4kuyz{TFG%bPqpB(YA92nTv+T0 zKThy+N}$_QDNmRzlW$`Rl5}W`qpcqe{7&^}!M+_zh+3pjWs145PpA4stv1ijl9JuY z{bH|tCb8eo_;{#OTNnMAKH?3xzNKpZv13(=HB1mt>uM(Zi1Jz5jM`_a!51hgAl$t* z5~}nhgUyT#R<_g*oyOu4*NDhb)p35JGMeh#xeco0r+CcdyboC9`C+H09xJ&)0CO6d zqDA;Ng2J+=FR8PrentUj5TRj7EtHUKZxw8(5X#i2mH-C+@F11DSGAxcQr6Ym16ODT zH5bpP${>z?;sHUFp>2U>UN=vgQlb<-&_#2PsTR^f=ws5;6Dn{djgMHg%Ao6o#kN6J zkKO=7D^b#?e;e@{DW@(1mA(G}DAmT5YwF{OAR77%c`8sKxEJ<}Aqi<9DBOMcg!492 zs9xQz0j6-2*sPczXQf7}-k3(dS!btoTr!lp&7s^i?iVr42D8;GE&*fdg$k|R|kSR0FVjTFdI0SZ5i zc@m*1zOsL$K#{mfM%TYs+td&9jS|Rf_>a6{O_h1SJhF;^3=m4zMy2 zXG+p6K()I-YL_+zM#>xBHFZh_04*RGwMC$HJX>z-O|93wCrl}8T9&OP1nRJjo^@J5 zQ>S2dw#G6Z*4PcCCcy3Z#WWHCRLb9z{nApDq>xIWvRe7KMxr*}@M%u4prjWP(L940 zm0Y{XD+()dB=oQz(G`_{U~EYZ3LpKT+wJcO^@@6QdVo##DkqEegHyGykszTv4xaEy zz$)#XX>e`<)Oj&YFz6!FjZ3Lv!U|fwk4x>mBvcgJuNM%4;3w%DSVGlICYtY*@-Bxs zzi;fqEAM$O>1-V*t)UbBj9;*$ZVd%V2c3b9LKfiG00B0>@MYza*a=OKJBTh4q&A%@ z3BNr><2`sFpHZc^QnHktB|n4#N~k7VTWS6R0KaHfdS6S(Q8(M9CRC|uTcO652|KAH zXe65KEBh5`)idWP1EeovK)JMHb*6=ml2RcZpt9;N=8_Kn@V6{{>l0*@^S?X8BhLT> z$j&BhC`uAjU=jkl!PlvQnR4ot<*7qWj?h)KgglfbJFFX?&}Mpj=Tm2Z(gu(~;@x4( zu2?>J6DFPV+tf~=4b6q)M1EdxcLb& zJ?2v7+xm#$-q#R7KKz@iRhW)tsY;89E(HrpfPnZ4LTuQ3#y@-9aSVVZnuYcUe@y3Ed>z6VfAX z6rGA;g}*G)oLV)g?65nYAwIDx8gp4u2<_PO9%gh&RJ5r@O(T)o`v}~$Cla7ai)vQN z>LQ!+6^QRGK&tzc-roIxtN^lwr_36G1E~5TQfgQ?y{?cAk9aK9nI$BU3eNqu--wBq z=ES#JN}CJ5{B7D3(DK^~Zo@&}S6Ex9h6}_gy99A_=wlpYlCS=jJX%w z+hR?-UL}tN-Z621fb8~?$GApiN{}w46{=>V<w3Gh;c>|#xW9btqGkS-g zS$Rsu_)4P9PLEP#Jkr@#q=0R3ZNc6Wucih_CCqvrEI)N2!nG_51uP3GC#A#)+Ja}M zQd6SI3b+?bmx7H{+ABiEf|hKw^@9yg>2W}Wofad0L{$K6zaf@VP~zJQHww0-{f}t$ zx>A5vG=*tCl%1SOk9^#-4lUMgrP2Gu9j(#=nW#xH+iFU^AobX!#4Q<6Xs}e+E)?46 zR?19iH2Y~&VJXtPackZ%?PgfMppct^>QLg)R(BOJ(?|d|6yCvI3`%6Q2qxV~7iP^U z=qpF?6TvW@KOr(+c`9?rd<*IyL#g|Bj7;L^rj(!>Nm7QBq-;mLBGe~m-<1ugP*X`h zSUZqAMB2+YsU}KUkhdHUDYJB;M%q8(AwL%xfM)Vj6R}U0Np*^QgrktM6B0b#73tYk zy!^;OPRd9dgZ|LS%*h#9Y!_Py(!EkHm86b+F%n6Pi}HM*)Z1~aLsv`fggf)|3Q_^M z1iGt>`)>qYVOk1`ZjsjfL$5jHlTXj=eJI&VTb9IAh)5g(=9O*tyf&7yR7H=L=JqG> zg*8I^2%%O`DdU?#rhwgFUAqVkZ6^9#>D0!ox>;AJVoXAp9flR8xKxcv7v#pl7ExLH zQb5>qxBNz1vxrEwk2m}{j3sJltya2779BZ?4$P$&u^yvqSoRUJ6kE9{DHgT5_q=Mb zC6Ea90qQ&cCNgFSWePVdR|NDBEQzCMRFL8qebhJ8%44BF;nne!uMeInYM2VCGL~q# z^^Y=8x~n!Oke{d6sDCKuqirST);Vy3LBA&d0PzD+t8@5rvnf-j%sVMlr#vQQUO}>% za2<$>{i5A9$@LeRHHy0q%sKl$Q%<6rq=RwHR*dYNoTjDIgp*caoFttUhcIMc zRYgRl7g4^@^2qA6;}fk}w!m(}@YBXKrOJ^Z(6E!x!-ptdL7QzqGL!;rZeu*B8>

NxwD`VzV8e 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 literal 0 HcmV?d00001 diff --git a/src/content/blog/2026-01-lotto-lab.md b/src/content/blog/2026-01-lotto-lab.md index 0324ed8..fba3dc0 100644 --- a/src/content/blog/2026-01-lotto-lab.md +++ b/src/content/blog/2026-01-lotto-lab.md @@ -4,7 +4,6 @@ date: 2026-01-12 tags: ๊ฐœ๋ฐœ, product, lotto excerpt: ์ž‘์€ ์‹คํ—˜์œผ๋กœ ์‹œ์ž‘ํ•œ ๋กœ๋˜ ํŽ˜์ด์ง€๋ฅผ ์•ž์œผ๋กœ ์–ด๋–ป๊ฒŒ ๋ฐœ์ „์‹œํ‚ค๋ ค๋Š”์ง€ ์ •๋ฆฌํ–ˆ์Šต๋‹ˆ๋‹ค. --- - # ๋กœ๋˜ ์‹คํ—˜์‹ค์„ ์กฐ๊ธˆ ๋” ์žฌ๋ฏธ์žˆ๊ฒŒ ์ฒ˜์Œ์—๋Š” ์ˆซ์ž๋ฅผ ๋ฝ‘๋Š” ๊ธฐ๋Šฅ๋งŒ ์žˆ์—ˆ์ง€๋งŒ, ๋ฐ์ดํ„ฐ ๊ธฐ๋ก๊ณผ ํŒจํ„ด ์‹œ๊ฐํ™”๋ฅผ ๋”ํ•ด๋ณด๊ณ  ์‹ถ์—ˆ์Šต๋‹ˆ๋‹ค. @@ -15,3 +14,4 @@ excerpt: ์ž‘์€ ์‹คํ—˜์œผ๋กœ ์‹œ์ž‘ํ•œ ๋กœ๋˜ ํŽ˜์ด์ง€๋ฅผ ์•ž์œผ๋กœ ์–ด๋–ป๊ฒŒ - ๊ฐœ์ธ๋ณ„ ๊ธฐ๋ก์„ ๋น„๊ตํ•  ์ˆ˜ ์žˆ๋Š” ๋ฆฌํฌํŠธ ์ด ๋ธ”๋กœ๊ทธ์— ์ค‘๊ฐ„ ๊ณผ์ •๊ณผ ๊ณ ๋ฏผ๋“ค์„ ๊ณ„์† ๊ธฐ๋กํ•ด ๋ณด๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. + diff --git a/src/content/blog/2026-01-welcome.md b/src/content/blog/2026-01-welcome.md index ddf65df..90d346c 100644 --- a/src/content/blog/2026-01-welcome.md +++ b/src/content/blog/2026-01-welcome.md @@ -4,7 +4,6 @@ date: 2026-01-18 tags: ์ผ์ƒ, intro, blog excerpt: ์ด์ œ๋ถ€ํ„ฐ ๊ฐœ๋ฐœ ๊ธฐ๋ก๊ณผ ์—ฌํ–‰ ๊ธฐ๋ก์„ ์ด๊ณณ์— ์ฐจ๊ณก์ฐจ๊ณก ์Œ“์•„๊ฐ‘๋‹ˆ๋‹ค. --- - # ์ƒˆ ๋ธ”๋กœ๊ทธ๋ฅผ ์—ด์—ˆ์Šต๋‹ˆ๋‹ค ์ฒ˜์Œ์—” ๋กœ๋˜ ํŽ˜์ด์ง€๋กœ ์‹œ์ž‘ํ–ˆ์ง€๋งŒ, ์ด ๊ณต๊ฐ„์„ ๊ฐœ์ธ ์•„์นด์ด๋ธŒ๋กœ ํ™•์žฅํ•˜๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. @@ -16,3 +15,4 @@ excerpt: ์ด์ œ๋ถ€ํ„ฐ ๊ฐœ๋ฐœ ๊ธฐ๋ก๊ณผ ์—ฌํ–‰ ๊ธฐ๋ก์„ ์ด๊ณณ์— ์ฐจ๊ณก์ฐจ๊ณก - ๋‚˜๋งŒ์˜ ํ”„๋กœ์ ํŠธ ํšŒ๊ณ  ์ฒซ ํŽ˜์ด์ง€๋ฅผ ์—ด์–ด๋‘ก๋‹ˆ๋‹ค. ์ฒœ์ฒœํžˆ ์ฑ„์›Œ๋‚˜๊ฐˆ๊ฒŒ์š”. + diff --git a/src/content/blog/2022-03-11-firstdiary.md b/src/content/blog/daily/2022-03-11-firstdiary.md similarity index 94% rename from src/content/blog/2022-03-11-firstdiary.md rename to src/content/blog/daily/2022-03-11-firstdiary.md index 353c60e..0a422a2 100644 --- a/src/content/blog/2022-03-11-firstdiary.md +++ b/src/content/blog/daily/2022-03-11-firstdiary.md @@ -4,7 +4,6 @@ date: 2022-03-11 tags: ์ผ์ƒ excerpt: ์ผ์ƒ ๊ธฐ๋ก ์ฒซ ๋ฒˆ์งธ ์ด์•ผ๊ธฐ --- - # ์ผ์ƒ ๊ธฐ๋ก ์ฒซ ๋ฒˆ์งธ ์ด์•ผ๊ธฐ ~~๊นƒ~~ ๋ธ”๋กœ๊ทธ๋ฅผ ๋งŒ๋“ค๋ฉด์„œ ์•ž์œผ๋กœ ์จ ๋‚ด๋ ค๊ฐˆ ์ผ์ƒ ๋””๋ ‰ํ† ๋ฆฌ์˜ ์ฒซ ๋ฒˆ์งธ ํฌ์ŠคํŠธ๋ฅผ ์ž‘์„ฑํ•ด ๋ด…๋‹ˆ๋‹ค. @@ -17,4 +16,4 @@ excerpt: ์ผ์ƒ ๊ธฐ๋ก ์ฒซ ๋ฒˆ์งธ ์ด์•ผ๊ธฐ ๋•Œ๋ฌธ์— ์ผ์ƒ ํฌ์ŠคํŠธ๋ฅผ ๊ผญ ํ•ด๋ณด๊ณ  ์‹ถ์—ˆ๋‹ค. -~~๊นƒ~~ ๋ธ”๋กœ๊ทธ ์ผ์ƒ ํฌ์ŠคํŠธ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค. \ No newline at end of file +~~๊นƒ~~ ๋ธ”๋กœ๊ทธ ์ผ์ƒ ํฌ์ŠคํŠธ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค. diff --git a/src/content/blog/2022-03-13-transferring-git-storage.md b/src/content/blog/daily/2022-03-13-transferring-git-storage.md similarity index 100% rename from src/content/blog/2022-03-13-transferring-git-storage.md rename to src/content/blog/daily/2022-03-13-transferring-git-storage.md index 1926e09..17bfc80 100644 --- a/src/content/blog/2022-03-13-transferring-git-storage.md +++ b/src/content/blog/daily/2022-03-13-transferring-git-storage.md @@ -4,7 +4,6 @@ date: 2022-03-13 tags: ์ผ์ƒ excerpt: ๊นƒ ์ €์žฅ์†Œ ๋ณ€๊ฒฝํ•˜๋ฉด์„œ ์ž ๊น ์‰ฌ๋Š” ํƒ€์ž„์— ๋„์ ์—ฌ๋ณด๋Š” ์ผ์ƒ ๊ธฐ๋ก --- - # ์ผ์ƒ ๊ธฐ๋ก - ๊นƒ ์ €์žฅ์†Œ ๋ณ€๊ฒฝ ๊ธฐ์กด ํ•™๋ถ€์‹œ์ ˆ๋ถ€ํ„ฐ ์‚ฌ์šฉํ–ˆ๋˜ ๊นƒ ์ €์žฅ์†Œ([git_storage_gahu](https://github.com/gahu))์—์„œ ํ–ˆ์—ˆ๋˜ ํ”„๋กœ์ ํŠธ์™€ ๊ณต๋ถ€ ํ–ˆ๋˜ ๊ธฐ๋ก๋“ค์„ ์ •๋ฆฌํ•ด์„œ @@ -18,3 +17,4 @@ excerpt: ๊นƒ ์ €์žฅ์†Œ ๋ณ€๊ฒฝํ•˜๋ฉด์„œ ์ž ๊น ์‰ฌ๋Š” ํƒ€์ž„์— ๋„์ ์—ฌ๋ณด๋Š” ๋ธ”๋กœ๊ทธ ์ž‘์—… ์ค€๋น„๋„ ํ•˜๋ฉด์„œ ๊ธฐ์กด ํ”„๋กœ์ ํŠธ๋“ค์„ ์˜ฎ๊ธฐ๊ณ  ์ •๋ฆฌํ•œ๋‹ค๋Š”๊ฒŒ ์‰ฌ์šด ์ผ์€ ์•„๋‹ˆ์ง€๋งŒ ์ง€๊ธˆ ๋ชฉํ‘œ๋กœ ํ•˜๊ณ  ์žˆ๋Š” ์ผ์ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์‹œ์ž‘์„ ํ•  ์ˆ˜ ์žˆ์—ˆ๋˜๊ฒƒ ๊ฐ™๊ณ , ๋ฌด์—‡๋ณด๋‹ค๋„ ์ƒˆ๋กœ ์‚ฐ Macbook M1 Max๋ฅผ ์ž˜ ํ™œ์šฉํ•ด ๋ณผ ์ˆ˜ ์žˆ๋Š” ๊ธฐํšŒ๊ฐ€ ๋˜์ง€ ์•Š์„๊นŒ ์ƒ๊ฐํ•˜๋ฉด์„œ ์ž‘์—…ํ•˜๊ณ  ์žˆ๋‹ค. + diff --git a/src/content/blog/2022-03-15-samgyub.md b/src/content/blog/daily/2022-03-15-samgyub.md similarity index 100% rename from src/content/blog/2022-03-15-samgyub.md rename to src/content/blog/daily/2022-03-15-samgyub.md index e7bd647..ac3e4dd 100644 --- a/src/content/blog/2022-03-15-samgyub.md +++ b/src/content/blog/daily/2022-03-15-samgyub.md @@ -4,7 +4,6 @@ date: 2022-03-15 tags: ์ผ์ƒ excerpt: ์˜ค๋žœ๋งŒ์— ์‚ผ๊ฒน์‚ด์ง‘์— ๊ฐ€์„œ ๋จน๋ถ€๋ฆผํ•œ ํ•˜๋ฃจ ๊ธฐ๋ก. --- - # ์ผ์ƒ ๊ธฐ๋ก - ์‚ผ๊ฒน์‚ด ๋จน๋ถ€๋ฆผ ์˜ค๋Š˜ ์˜ค๋žœ๋งŒ์— ์ง‘ ๊ทผ์ฒ˜์— ์žˆ๋Š” ์‚ผ๊ฒน์‚ด์ง‘์— ๊ฐ”๋‹ค. @@ -16,3 +15,4 @@ excerpt: ์˜ค๋žœ๋งŒ์— ์‚ผ๊ฒน์‚ด์ง‘์— ๊ฐ€์„œ ๋จน๋ถ€๋ฆผํ•œ ํ•˜๋ฃจ ๊ธฐ๋ก. ๋ผ์ง€ ๋ฐ˜๋งˆ๋ฆฌ๋ฅผ ์‹œ์ผฐ๋Š”๋ฐ, ์œ„์— ์‚ฌ์ง„ ์ฒ˜๋Ÿผ ๋‘๊บผ์šด ์‚ผ๊ฒน์‚ด๊ณผ ํ•ญ์ •์‚ด, ๊ฐˆ๋น„์‚ด, ๋ชฉ์‚ด ๋“ฑ์ด 500g ๋‚˜์˜ค๋Š”๋ฐ ์šฐ๋ฆฌ ๋‘˜์ด์„œ๋Š” ์ด์ •๋„๊ฐ€ ๋”ฑ ์ •๋‹นํžˆ ๋ฐฐ๋ถ€๋ฅด๊ณ  ์ข‹์€ ๊ฒƒ ๊ฐ™๋‹ค. ์ตœ๊ทผ์— ๊ฐ๊ธฐ ๊ธฐ์šด์ด ์žˆ์–ด์„œ ๋ชฉ๋„ ์นผ์นผํ•˜๋‹ˆ ๋ณ„๋กœ ์ข‹์ง€ ์•Š์•˜๋Š”๋ฐ ๊ธฐ๋ฆ„์ง„ ๊ณ ๊ธฐ๋ฅผ ๋จน์œผ๋ฉฐ ํž๋งํ–ˆ๋˜ ์‹œ๊ฐ„ + diff --git a/src/content/blog/2022-04-02-warehouse43.md b/src/content/blog/daily/2022-04-02-warehouse43.md similarity index 96% rename from src/content/blog/2022-04-02-warehouse43.md rename to src/content/blog/daily/2022-04-02-warehouse43.md index f6c27b9..cd923e2 100644 --- a/src/content/blog/2022-04-02-warehouse43.md +++ b/src/content/blog/daily/2022-04-02-warehouse43.md @@ -2,9 +2,8 @@ title: ์†Œ๊ณ ๊ธฐ ๋จน๋ถ€๋ฆผ date: 2022-04-02 tags: ์ผ์ƒ -excerpt: ์—ฌ์˜๋„ ์ฐฝ๊ณ  43์—์„œ ์˜ค๋žœ๋งŒ์— ์†Œ๊ณ ๊ธฐ์™€ ์™€์ธ์„ ์ฆ๊ธด ๊ธฐ๋ก. +excerpt: ์Šนํ† ๋ฆฌ์™€ ์—ฌ์˜๋„ ์ฐฝ๊ณ  43 ์ถœ๊ฒฉ --- - # ์ผ์ƒ ๊ธฐ๋ก - ์†Œ๋Š” ๋ˆ„๊ฐ€~~ ํ‚ค์šฐ๋‚˜?! ์˜ค๋žœ๋งŒ์— ์Šนํ† ๋ฆฌ์™€ ๋ชธ๋ณด์‹ (?)์„ ํ•˜๊ธฐ ์œ„ํ•ด์„œ ์—ฌ์˜๋„์— ์žˆ๋Š” ๊ณ ๊นƒ์ง‘์„ ํƒ์ƒ‰ํ–ˆ๋‹ค. @@ -47,3 +46,4 @@ excerpt: ์—ฌ์˜๋„ ์ฐฝ๊ณ  43์—์„œ ์˜ค๋žœ๋งŒ์— ์†Œ๊ณ ๊ธฐ์™€ ์™€์ธ์„ ์ฆ๊ธด ์ž…์— ๋„ฃ์ž๋งˆ์ž ์‚ฌ๋ผ์ง€๋Š” ๋งˆ๋ฒ•์„ ๋А๋ผ๋ฉฐ ์ •๋ง ๊ดœ์ฐฎ์€ ์†Œ๊ณ ๊ธฐ๋ฅผ ๋จน์–ด๋ณธ ๊ฒƒ ๊ฐ™๋‹ค. ๊ณ ๊ธฐ์™€ ์™€์ธ์„ ๋จน๊ณ  ๋ƒ‰๋ฉด, ๊น๋‘๊ธฐ ๋ณถ์Œ๋ฐฅ๊นŒ์ง€ ์™„๋ฒฝํ•˜๊ฒŒ ๋งˆ๋ฌด๋ฆฌ๋ฅผ ์ง€์œผ๋ฉฐ ๋ฐฐ ํ„ฐ์ง€๊ฒŒ ์ž˜ ๋จน๊ณ ์„œ ๋‚˜์™”๋‹ค. :) + diff --git a/src/content/blog/2022-04-09-oh_codingtest.md b/src/content/blog/daily/2022-04-09-oh_codingtest.md similarity index 96% rename from src/content/blog/2022-04-09-oh_codingtest.md rename to src/content/blog/daily/2022-04-09-oh_codingtest.md index 72702e2..789d631 100644 --- a/src/content/blog/2022-04-09-oh_codingtest.md +++ b/src/content/blog/daily/2022-04-09-oh_codingtest.md @@ -1,10 +1,9 @@ --- -title: ์ฝ”๋”ฉํ…Œ์ŠคํŠธ +title: ์˜ค๋Š˜์˜์ง‘ ์ฝ”๋”ฉํ…Œ์ŠคํŠธ date: 2022-04-09 -tags: ๊ณต๋ถ€ +tags: ์ผ์ƒ excerpt: ์˜ค๋Š˜์˜์ง‘ ์ฝ”๋”ฉํ…Œ์ŠคํŠธ๋ฅผ ์น˜๋ฅด๋ฉฐ ๋А๋‚€ ์ ์„ ์ •๋ฆฌํ•œ ๊ธฐ๋ก. --- - # ์ฝ”๋”ฉ ํ…Œ์ŠคํŠธ ๊ธฐ๋ก ์˜ค๋Š˜์˜์ง‘ ๊ฐœ๋ฐœ์ž ๋Œ€๊ทœ๋ชจ ์ฑ„์šฉ ์ฝ”๋”ฉํ…Œ์ŠคํŠธ @@ -22,3 +21,4 @@ excerpt: ์˜ค๋Š˜์˜์ง‘ ์ฝ”๋”ฉํ…Œ์ŠคํŠธ๋ฅผ ์น˜๋ฅด๋ฉฐ ๋А๋‚€ ์ ์„ ์ •๋ฆฌํ•œ ๊ธฐ ์ง€๊ธˆ๊นŒ์ง€ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ด๋ ‡๊ฒŒ ๊พธ์ค€ํžˆ ํ•œ ๊ฒฝํ—˜์ด ๋งŽ์ง€ ์•Š์•„์„œ์ธ์ง€ ์ƒ๊ฐ๋ณด๋‹ค ๊ตฌํ˜„์—๋Š” ์–ด๋ ค์›€์ด ์—†์—ˆ๊ณ , ํ‰์†Œ์— ์–ผ๋งˆ๋‚˜ ํ•˜๋А๋ƒ๊ฐ€ ํฌ๊ฒŒ ๋‹ค๊ฐ€์™”์—ˆ๋‹ค. ~~(์‹ฌ์ง€์–ด ์ „๋‚  ์ƒˆ๋ฒฝ๊นŒ์ง€ ๋†€๊ณ  ์ง‘์ค‘ํ•ด์„œ ํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค๋Š”๊ฒŒ ๋†€๋ผ์šธ ์ •๋„)~~ ๋ชฉํ‘œ์ธ IT ๋Œ€์žฅ๊ธ‰์ด๋ผ๊ณ  ๋ถˆ๋ฆฌ๋Š” ๊ธฐ์—…์˜ ์ฝ”ํ…Œ ์˜ฌ์†”ํ•  ์ˆ˜ ์žˆ๋Š” ์‹ค๋ ฅ์„ ๊ฐ–์ถœ๋•Œ๊นŒ์ง€ ๋ฉˆ์ถ”์ง€ ์•Š๊ณ  ๊ณ„์† ํ•  ๊ฒƒ์ด๋‹ค. + diff --git a/src/content/blog/2022-04-25-dairyhard.md b/src/content/blog/daily/2022-04-25-dairyhard.md similarity index 100% rename from src/content/blog/2022-04-25-dairyhard.md rename to src/content/blog/daily/2022-04-25-dairyhard.md index 2510dfb..4ed2891 100644 --- a/src/content/blog/2022-04-25-dairyhard.md +++ b/src/content/blog/daily/2022-04-25-dairyhard.md @@ -4,7 +4,6 @@ date: 2022-04-25 tags: ์ผ์ƒ excerpt: ๋ฐ”์œ ์ผ์ • ์†์—์„œ ๋‹ค์‹œ ๋ฃจํ‹ด์„ ์žก์•„๊ฐ€๋ ค๋Š” ๋งˆ์Œ ๊ธฐ๋ก. --- - # ์ผ์ƒ์˜ ๊ธฐ๋ก - 04์›”25์ผ ์ตœ๊ทผ์—๋Š” ์—…๋ฌด๋„ ๋ฐ”๋น ์„œ ๋Šฆ๊ฒŒ๊นŒ์ง€ ์•ผ๊ทผํ•˜๊ณ , ๊ทธ๋Ÿฌ์ง€ ์•Š์€ ๋‚ ์—๋Š” ๋ฏธ๋ค„์ง„ ์•ฝ์†์„ ๊ฐ€๋А๋ผ๊ณ  ๋ชฉํ‘œ๋กœ ํ–ˆ๋˜ 1์ผ 1commit 100์ผ ๋ชฉํ‘œ์—์„œ ๋งŽ์ด ๋–จ์–ด์ง€๊ฒŒ ๋œ ๊ฒƒ ๊ฐ™๋‹ค. @@ -14,3 +13,4 @@ excerpt: ๋ฐ”์œ ์ผ์ • ์†์—์„œ ๋‹ค์‹œ ๋ฃจํ‹ด์„ ์žก์•„๊ฐ€๋ ค๋Š” ๋งˆ์Œ ๊ธฐ๋ก. ์ฒ˜์Œ 1์ผ 1commit์„ ๋ชฉํ‘œ๋กœ ํ–ˆ์„ ๋•Œ์—๋Š” ๊ณต๋ถ€๋„ ํฅ๋ฏธ๋กญ๊ณ , ์ผ๋„ ์—ฌ์œ ๊ฐ€ ์žˆ์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ณต๋ถ€์— ํˆฌ์žํ•˜๋Š” ์‹œ๊ฐ„๋„ ๋งŽ์•˜๋Š”๋ฐ ๊ทธ๋Ÿฌ์ง€ ๋ชปํ•˜๋Š”๊ฒŒ ๋„ˆ๋ฌด ๋ถˆํŽธํ•œ ์ƒํ™ฉ์ด ๋˜์—ˆ๋‹ค. ์ด๋ฒˆ์ฃผ๋งŒ ์ง€๋‚˜๋ฉด ๊ทธ๋ž˜๋„ ์—ฌ์œ ๋ฅผ ์ฐพ์„ ์ˆ˜ ์žˆ์„๊ฒƒ ๊ฐ™์œผ๋‹ˆ ์ข€ ๋” ๊ณต๋ถ€ํ•˜๊ณ  ๋ชฉํ‘œ๋ฅผ ์ฑ„์›Œ๊ฐ€๋Š” ์ผ์ƒ์„ ๊ธฐ๋ก ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋…ธ๋ ฅํ•  ๊ฒƒ์ด๋‹ค. + diff --git a/src/content/blog/2022-06-09-publicdatacontest.md b/src/content/blog/daily/2022-06-09-publicdatacontest.md similarity index 98% rename from src/content/blog/2022-06-09-publicdatacontest.md rename to src/content/blog/daily/2022-06-09-publicdatacontest.md index fb2d225..a2f4d7c 100644 --- a/src/content/blog/2022-06-09-publicdatacontest.md +++ b/src/content/blog/daily/2022-06-09-publicdatacontest.md @@ -1,10 +1,9 @@ --- title: ์‹์˜์•ฝ ๊ณต๊ณต๋ฐ์ดํ„ฐ ํ™œ์šฉ ๊ณต๋ชจ์ „ ์ค€๋น„ date: 2022-06-09 -tags: ๊ฐœ๋ฐœ, ์•„์ด๋””์–ด +tags: ์ผ์ƒ excerpt: ๊ณต๊ณต๋ฐ์ดํ„ฐ ๊ณต๋ชจ์ „ ์ค€๋น„ ๊ณผ์ •๊ณผ ์•„์ด๋””์–ด ์„ ์ • ๊ธฐ๋ก. --- - # ์‹์˜์•ฝ ๊ณต๊ณต๋ฐ์ดํ„ฐ ํ™œ์šฉ ๊ณต๋ชจ์ „ ์ค€๋น„ ์ด๋ฒˆ์— ๊ฐ™์€ ํŒ€์˜ ๋™๋ฃŒ์™€ ๋™๊ธฐ 3๋ช…์ด์„œ ์‹์˜์•ฝ ๊ณต๊ณต๋ฐ์ดํ„ฐ ํ™œ์šฉ์„ ํ•ด์„œ ์›น/์•ฑ ๊ฐœ๋ฐœ์„ ํ•˜๋Š” ๊ณต๋ชจ์ „์— ์ฐธ๊ฐ€ํ•˜๋ ค๊ณ  ํ•œ๋‹ค.
@@ -17,3 +16,4 @@ excerpt: ๊ณต๊ณต๋ฐ์ดํ„ฐ ๊ณต๋ชจ์ „ ์ค€๋น„ ๊ณผ์ •๊ณผ ์•„์ด๋””์–ด ์„ ์ • ๊ธฐ๋ก. (๊ฐœ๋ฐœํ•˜๋А๋ผ ๊ณ ์ƒํ• ๊ฑฐ ์ƒ๊ฐํ•˜๋ฉด ์•„์ฐ”ํ•˜๊ธด ํ•˜๋‹ค..)
8์›” ์ดˆ๊นŒ์ง€ ๊ฐœ๋ฐœ์ด ์–ด๋А์ •๋„ ์™„๋ฃŒ๊ฐ€ ๋˜์–ด์•ผ ํ•˜๋‹ˆ ์Šค์ผ€์ค„ ์ •ํ•ด์ง„๋Œ€๋กœ ์™„๋ฃŒํ•ด์„œ ์ข‹์€ ์„ฑ๊ณผ๋ฅผ ๋ƒˆ์œผ๋ฉด ํ•œ๋‹ค.
+ diff --git a/src/content/blog/2022-07-06-publicdatacontest.md b/src/content/blog/daily/2022-07-06-publicdatacontest.md similarity index 97% rename from src/content/blog/2022-07-06-publicdatacontest.md rename to src/content/blog/daily/2022-07-06-publicdatacontest.md index dded096..4f55a29 100644 --- a/src/content/blog/2022-07-06-publicdatacontest.md +++ b/src/content/blog/daily/2022-07-06-publicdatacontest.md @@ -1,10 +1,9 @@ --- title: ์‹์˜์•ฝ ๊ณต๊ณต๋ฐ์ดํ„ฐ ํ™œ์šฉ ๊ณต๋ชจ์ „ 1์ฐจ ํ‰๊ฐ€ ํ†ต๊ณผ date: 2022-07-06 -tags: ๊ฐœ๋ฐœ, ์•„์ด๋””์–ด +tags: ์ผ์ƒ excerpt: ๊ณต๋ชจ์ „ 1์ฐจ ํ†ต๊ณผ ํ›„ ์ผ์ •๊ณผ ํ•ด์•ผ ํ•  ์ผ ์ •๋ฆฌ. --- - # ์‹์˜์•ฝ ๊ณต๊ณต๋ฐ์ดํ„ฐ ํ™œ์šฉ ๊ณต๋ชจ์ „ 1์ฐจ ํ‰๊ฐ€ ํ†ต๊ณผ '๊ทธ๋ฆฐ๋ผ์ดํŠธ'๋ผ๋Š” ์žฅ๊ธฐ ๊ธฐ์ฆ ํ™œ์„ฑํ™”๋ฅผ ์ฃผ์ œ๋กœ ํ•˜๋Š” ์บ ํŽ˜์ธ์˜ ์ด๋ฆ„์„ ๋”ฐ์„œ ์‹์˜์•ฝ ๊ณต๊ณต๋ฐ์ดํ„ฐ ํ™œ์šฉ ๊ณต๋ชจ์ „์— ์ง€๋‚œ 6์›”์— ์ฐธ๊ฐ€๋ฅผ ํ–ˆ์—ˆ๋‹ค.
@@ -15,3 +14,4 @@ excerpt: ๊ณต๋ชจ์ „ 1์ฐจ ํ†ต๊ณผ ํ›„ ์ผ์ •๊ณผ ํ•ด์•ผ ํ•  ์ผ ์ •๋ฆฌ. ๊ณต๊ณต๋ฐ์ดํ„ฐ๋„ ์‚ฌ์šฉ ์‹ ์ฒญ๋„ ๋ฏธํกํ•œ ์ƒํƒœ๋ผ ๊ฑฑ์ •์ด ๋˜๊ธด ํ•˜์ง€๋งŒ ํŒ€์›๋“ค๊ณผ ๋ชจ์—ฌ์„œ ํ•ฉ์˜ํ•˜๊ณ  ์ผ์ • ๋ฐ ์—…๋ฌด ๋ถ„๋‹ด์„ ํ•˜๊ธฐ๋กœ ํ–ˆ๋‹ค. ์ด๋ฒˆ์—๋„ ์ข‹์€ ๊ฒฐ๊ณผ๋ฅผ ๊ฑฐ๋‘˜ ์ˆ˜ ์žˆ๋Š” ๊ณต๋ชจ์ „์ด ๋˜์—ˆ์œผ๋ฉด ์ข‹๊ฒ ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๊ณ  ์žˆ๋‹ค. + diff --git a/src/content/blog/2023-04-29-daily.md b/src/content/blog/daily/2023-04-29-daily.md similarity index 100% rename from src/content/blog/2023-04-29-daily.md rename to src/content/blog/daily/2023-04-29-daily.md index e800e6b..4c4bee0 100644 --- a/src/content/blog/2023-04-29-daily.md +++ b/src/content/blog/daily/2023-04-29-daily.md @@ -4,7 +4,6 @@ date: 2023-04-29 tags: ์ผ์ƒ excerpt: ์˜ค๋žœ๋งŒ์— ๊ธฐ๋ก์„ ๋‹ค์‹œ ์‹œ์ž‘ํ•˜๋ฉฐ ํ•˜๋ฃจ๋ฅผ ์ •๋ฆฌํ•œ ๊ธ€. --- - # ์ผ์ƒ์˜ ๊ธฐ๋ก ์˜ค๋žซ๋งŒ์— ์ผ์ƒ์˜ ๊ธฐ๋ก @@ -29,3 +28,4 @@ excerpt: ์˜ค๋žœ๋งŒ์— ๊ธฐ๋ก์„ ๋‹ค์‹œ ์‹œ์ž‘ํ•˜๋ฉฐ ํ•˜๋ฃจ๋ฅผ ์ •๋ฆฌํ•œ ๊ธ€. ๋˜ํ•œ ์Šนํ† ๋ฆฌ์™€ 6์›”์— ๊ฒฐํ˜ผ์„ ์ค€๋น„ํ•˜๋Š” ๋‹จ๊ณ„์— ๋„์ž…ํ•˜๊ธฐ๋กœ ํ–ˆ๋‹ค. ์ด๊ฒƒ์€ ์—„์ฒญ๋‚˜๊ฒŒ ์˜๋ฏธ ์žˆ๋Š” ๊ฒƒ์ด๋ฉฐ, ์ธ์ƒ์—์„œ ์ „ํ™˜๊ธฐ๊ฐ€ ๋  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•œ๋‹ค. ์ง€๊ธˆ ์ด์‚ฌ๊ฐ€๋Š” ์ง‘์—์„œ ๊ฐ™์ด ์‹œ์ž‘ํ•˜๊ธฐ์—๋Š” ๋‚ด๊ฐ€ ์ƒ๊ฐํ–ˆ๋˜ ๋ถ€๋ถ„๋ณด๋‹ค๋Š” ์†Œ์†Œํ•  ์ˆ˜ ์žˆ๊ฒ ์ง€๋งŒ, ์ฐจ๊ทผ์ฐจ๊ทผ ์ค€๋น„ํ•ด๋ณด๋ ค๊ณ  ํ•œ๋‹ค. ๐Ÿ’ช + diff --git a/src/content/blog/2022-04-07-slicknlist.md b/src/content/blog/dev/2022-04-07-slicknlist.md similarity index 99% rename from src/content/blog/2022-04-07-slicknlist.md rename to src/content/blog/dev/2022-04-07-slicknlist.md index f642047..336bcbf 100644 --- a/src/content/blog/2022-04-07-slicknlist.md +++ b/src/content/blog/dev/2022-04-07-slicknlist.md @@ -4,14 +4,6 @@ date: 2022-04-07 tags: ๊ฐœ๋ฐœ excerpt: slick ์Šฌ๋ผ์ด๋”, ๋ชฉ์ฐจ, ํŽ˜์ด์ง€ ๋ฒ„ํŠผ, ์œ ํŠœ๋ธŒ ์ž„๋ฒ ๋“œ ์ถ”๊ฐ€ ์ •๋ฆฌ. --- - -# ๊ฒŒ์‹œ๊ธ€ ํ…Œ์ŠคํŠธ - -* toc -{:toc .large-only} - ---- - ## slick image [Slick](https://kenwheeler.github.io/slick/) slick ์‚ฌ์ดํŠธ์— ๋“ค์–ด๊ฐ€์„œ `get it now`๋ฅผ ๋ˆŒ๋Ÿฌ ๋‹ค์šด๋กœ๋“œ ๋ฐ›์•„์ฃผ์–ด slick ํด๋”๋ฅผ `/assets/css/slick`์— ๋ณต์‚ฌ>๋ถ™์—ฌ๋„ฃ๊ธฐ ํ•ด์ค€๋‹ค. @@ -261,3 +253,4 @@ a.external::after, a::after { --- + diff --git a/src/content/blog/dev/flutter/2022-04-05-flutter-envbuild.md b/src/content/blog/dev/flutter/2022-04-05-flutter-envbuild.md new file mode 100644 index 0000000..f0cacad --- /dev/null +++ b/src/content/blog/dev/flutter/2022-04-05-flutter-envbuild.md @@ -0,0 +1,12 @@ +--- +title: Flutter ๊ฐœ๋ฐœ +date: 2022-04-05 +tags: flutter, ๊ฐœ๋ฐœ +excerpt: Flutter ๊ฐœ๋ฐœ ํ™˜๊ฒฝ ์„ธํŒ… +--- +# Flutter ๊ฐœ๋ฐœ ํ™˜๊ฒฝ + +ํ”Œ๋Ÿฌํ„ฐ ๊ฐœ๋ฐœ์„ ์œ„ํ•ด Android Studio๋ฅผ ์„ค์น˜ํ•˜๊ณ  ๊ฐœ๋ฐœ ํ”„๋กœ์ ํŠธ๋ฅผ ๋งŒ๋“ค์–ด์„œ emulator๋ฅผ ์‹คํ–‰์‹œ์ผฐ๋‹ค. +![image](/assets/img/flutter/flutter_start.png) + +์ƒ์†Œํ•˜๋‹ค๋ฉด ์ƒ์†Œํ•œ ๋””๋ ‰ํ† ๋ฆฌ ๊ตฌ์„ฑ๊ณผ ํ™˜๊ฒฝ์„ ๊ตฌ์ถ•ํ•ด๋ณด๊ณ  ๋‚˜๋‹ˆ ์ด์ œ๋ถ€ํ„ฐ ์‹œ์ž‘์ด๊ฒ ๊ตฌ๋‚˜ ๋ง‰๋ง‰ํ•˜๋ฉด์„œ๋„ ๋‘๊ทผ๊ฑฐ๋ฆผ์ด ์žˆ๋‹ค. diff --git a/src/content/blog/dev/flutter/2022-04-05-flutter-start.md b/src/content/blog/dev/flutter/2022-04-05-flutter-start.md new file mode 100644 index 0000000..a2f0c03 --- /dev/null +++ b/src/content/blog/dev/flutter/2022-04-05-flutter-start.md @@ -0,0 +1,108 @@ +--- +title: Flutter ๊ฐœ๋ฐœ ์ผ์ง€ +date: 2022-04-05 +tags: flutter, ๊ฐœ๋ฐœ +excerpt: Flutter์— ๋Œ€ํ•œ ์ดํ•ด +--- +# Flutter? + +* toc +{:toc .large-only} + +> Flutter๋ž€ ์ƒ์†Œํ•œ ์–ธ์–ด์˜ ์ถœํ˜„๊ณผ ๋™์‹œ์— ์ •๋ง ํฅ๋ฏธ๊ฐ€ ์ƒ๊ฒผ๋‹ค. +๋„ค์ดํ‹ฐ๋ธŒ ์•ฑ์— ๊ทผ์ ‘ํ•œ ์†๋„๋ฅผ ๋‚ด๋ฉด์„œ ํ•˜๋‚˜์˜ ์ฝ”๋“œ๋กœ Android, iOS๋ฅผ ๋™์‹œ์— ๊ฐœ๋ฐœํ•  ์ˆ˜ ์žˆ๋‹ค๋‹ˆ! +๋•Œ๋ฌธ์— ๋ฐฐ์›Œ๋ณด๋ฉด์„œ, ๊ฐœ๋ฐœํ•ด๋ณด๋ฉด์„œ ์‹œ๋Œ€์˜ ํ๋ฆ„์„ ๋”ฐ๋ผ๊ฐ€๋ณด๋ ค๊ณ  ํ•œ๋‹ค. + +### ์ž‘์„ฑ๋˜๋Š” ๊ธ€ + +์ด ๋””๋ ‰ํ† ๋ฆฌ์—๋Š” ํ”Œ๋Ÿฌํ„ฐ์— ๋Œ€ํ•ด์„œ ๊ณต๋ถ€ํ•˜๊ณ  ๋‚ด์šฉ์„ ์ •๋ฆฌํ•˜๋ฉด์„œ ๋‚ด๊ฐ€ ์ดํ•ดํ•œ ๋‚ด์šฉ์„ ์ž‘์„ฑํ•˜๋Š” ์ €์žฅ์†Œ์ด๋‹ค. + +ํ”Œ๋Ÿฌํ„ฐ๋Š” ๋‹คํŠธ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ฐœ๋ฐœ ์–ธ์–ด์ด๋‹ค. ์—ฌ๋Ÿฌ ์žฅ์ ์„ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฉฐ ๋ฌด์—‡๋ณด๋‹ค๋„ ์•ˆ๋“œ๋กœ์ด๋“œ์™€ ์• ํ”Œ์„ ๊ตฌ๋ถ„์—†์ด ๊ฐœ๋ฐœ ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์—์„œ ๋‚ด ๊ด€์‹ฌ์„ ๋Œ์—ˆ๋‹ค. + +๋˜ํ•œ ๋„ค์ดํ‹ฐ๋ธŒ ์•ฑ ๋ชป์ง€ ์•Š์€ ๋น ๋ฅธ ์†๋„๋ฅผ ์ž๋ž‘ํ•œ๋‹ค๋‹ˆ ์ด๋Ÿฐ ์–ด์ธํ•œ ์–ธ์–ด์— ๊ด€์‹ฌ์ด ๊ฐ€๋Š”๊ฒŒ ๋‹น์—ฐํ•˜์ง€ ์•Š๊ฒ ๋Š”๊ฐ€? + +๋•Œ๋ฌธ์— ์ด ์นดํ…Œ๊ณ ๋ฆฌ๋Š” ํ”Œ๋Ÿฌํ„ฐ๋ฅผ ๋ฐฐ์šฐ๋ฉฐ, ๊ฐœ๋ฐœํ•˜๋ฉฐ ์ตํžŒ ์ง€์‹์ด๋‚˜ ์ •๋ฆฌํ•  ๋‚ด์šฉ๋“ค์„ ์ž‘์„ฑํ•˜๋Š” ์ €์žฅ์†Œ์ด๋‹ค. + +์ง€๊ธˆ ๊ตฌ์ƒํ•˜๊ณ  ์žˆ๋Š” ์•ฑ์ด ๋‘ ๊ฐ€์ง€ ์ •๋„ ์žˆ๋Š”๋ฐ, ์ด๊ฒƒ์„ ์‹ค์šฉํ™” ํ•  ์ˆ˜ ์žˆ์„ ์ •๋„์˜ ์ˆ˜์ค€๊นŒ์ง€ ๋” ๋…ธ๋ ฅํ•ด๋ณด๋ ค ํ•œ๋‹ค. + +-------------------------------------------------------- + +## ํ”Œ๋Ÿฌํ„ฐ์˜ ๋“ฑ์žฅ ๋ฐฐ๊ฒฝ + +2007๋…„ ์• ํ”Œ์˜ ์•„์ดํฐ์ด ๋“ฑ์žฅํ•œ ์ดํ›„ ์Šค๋งˆํŠธํฐ์€ ๋Š์ž„์—†์ด ๋ฐœ์ „ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์• ํ”Œ์€ iOS ์šด์˜์ฒด์ œ๋ฅผ ๋ฐœํ‘œํ•˜๋ฉด์„œ ์˜ค๋ธŒ์ ํŠธ๋ธŒ-C(Objective-C)๋กœ ๋งŒ๋“  ์•„์ดํฐ์šฉ ์•ฑ์„ ์ถœ์‹œํ•  ์ˆ˜ ์žˆ๋Š” ์•ฑ์Šคํ† ์–ด๋ฅผ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋กœ๋ถ€ํ„ฐ 1๋…„ ๋’ค ๊ตฌ๊ธ€๋„ ์•ˆ๋“œ๋กœ์ด๋“œ ์šด์˜์ฒด์ œ๋ฅผ ๋ฐœํ‘œํ•˜๋ฉด์„œ ์ž๋ฐ”(Java)๋ฅผ ์‚ฌ์šฉํ•ด ์•ˆ๋“œ๋กœ์ด๋“œ์šฉ ์•ฑ์„ ํŒ๋งคํ•  ์ˆ˜ ์žˆ๋Š” ๊ตฌ๊ธ€ ํ”Œ๋ ˆ์ด๋ฅผ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค. + +๋‹ค์–‘ํ•œ ๊ธฐ์—…์ด ์ž‡๋”ฐ๋ผ ์ด ์‹ธ์›€์— ๋›ฐ์–ด๋“ค์—ˆ์ง€๋งŒ 10๋…„์ด ํ›จ์”ฌ ์ง€๋‚œ ์ง€๊ธˆ๋„ ์•ˆ๋“œ๋กœ์ด๋“œ์™€ iOS์˜ ์ ์œ ์œจ์ด ๊ฑฐ์˜ 100%๋ผ๊ณ  ํ•ด๋„ ๊ณผ์–ธ์ด ์•„๋‹ ์ •๋„๋กœ ๋‘ ํ”Œ๋žซํผ์ด ๋ชจ๋ฐ”์ผ ์‹œ์žฅ์„ ์žฅ์•…ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. +![image](https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbDXCgs%2Fbtq13yV3Rs3%2Fv09BjkJaxJ1ssPCtrOo1F1%2Fimg.png "2021๋…„ 3์›” ๊ธฐ์ค€ ์ „์„ธ๊ณ„ ๋ชจ๋ฐ”์ผ ์šด์˜์ฒด์ œ ์ ์œ ์œจ(์ถœ์ฒ˜ : statcounter)") + +์• ํ”Œ๊ณผ ๊ตฌ๊ธ€์€ ๊ฐ์ž์˜ ์•ฑ ๊ฐœ๋ฐœ ์ƒํƒœ๊ณ„๋ฅผ ํ™•์žฅํ•˜๋ ค๋Š” ๋ชฉ์ ์œผ๋กœ ์ƒˆ๋กœ์šด ์–ธ์–ด๋ฅผ ๋‚ด๋†“์•˜์Šต๋‹ˆ๋‹ค. ์• ํ”Œ์€ ์˜ค๋ธŒ์ ํ‹ฐ๋ธŒ-C ๋Œ€์‹ ์— ์Šค์œ„ํ”„ํŠธ(Swift)๋ผ๋Š” ์–ธ์–ด๋ฅผ ๋งŒ๋“ค์—ˆ๊ณ , ๊ตฌ๊ธ€์€ ์ฝ”ํ‹€๋ฆฐ(Kotlin)์ด๋ผ๋Š” ์ƒˆ๋กœ์šด ์–ธ์–ด๋กœ ์ž๋ฐ”๋ฅผ ๋Œ€์ฒดํ•˜๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ์ƒˆ๋กญ๊ฒŒ ๋“ฑ์žฅํ•œ ๋‘ ์–ธ์–ด๋Š” ์ง€๊ธˆ๋„ ๊ณ„์† ์ง„ํ™”ํ•˜๋ฉด์„œ ์•ฑ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์„ ๋” ๋‚˜์€ ๋ฐฉํ–ฅ์œผ๋กœ ์ด๋Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ค๋ธŒ์ ํ‹ฐ๋ธŒ-C๋‚˜ ์Šค์œ„ํ”„ํŠธ๋กœ iOS ์•ฑ์„ ๊ฐœ๋ฐœํ•˜๊ฑฐ๋‚˜ ์ž๋ฐ”๋‚˜ ์ฝ”ํ‹€๋ฆฐ์œผ๋กœ ์•ˆ๋“œ๋กœ์ด๋“œ ์•ฑ์„ ๊ฐœ๋ฐœํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๊ฐ ๋ชจ๋ฐ”์ผ ์šด์˜์ฒด์ œ์— ๋งž๋Š” ์–ธ์–ด๋กœ ๊ฐœ๋ฐœํ•œ ์•ฑ์„ ๋„ค์ดํ‹ฐ๋ธŒ ์•ฑ(native app)์ด๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค. + +## ์›น์•ฑ, ํ•˜์ด๋ธŒ๋ฆฌ๋“œ ์•ฑ์˜ ๋“ฑ์žฅ + +๋‘ ํšŒ์‚ฌ๊ฐ€ ์‹œ์žฅ์„ ๋‚˜๋ˆ  ๋จน๋Š” ์‚ฌ์ด ๊ฐœ๋ฐœ์ž๋“ค์€ ๋” ๋งŽ์€ ์‚ฌ์šฉ์ž๊ฐ€ ์•ฑ์„ ์‚ฌ์šฉํ•˜๊ฒŒ ํ•˜๋ ค๊ณ  ๋˜‘๊ฐ™์€ ์•ฑ์„ iOS์šฉ๊ณผ ์•ˆ๋“œ๋กœ์ด๋“œ์šฉ์œผ๋กœ ๋‘ ๋ฒˆ ๊ฐœ๋ฐœํ•ด์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ฐœ๋ฐœ์ž์—๊ฒŒ๋Š” ์กฐ๊ธˆ ํ”ผ๊ณคํ•œ ์ƒํ™ฉ์ด์ง€ ์•Š์„ ์ˆ˜ ์—†์—ˆ์ฃ . ๊ทธ๋ž˜์„œ "ํ•˜๋‚˜์˜ ์†Œ์Šค๋กœ ์•ˆ๋“œ๋กœ์ด๋“œ์™€ iOS ๋ชจ๋‘์—์„œ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด ์—†์„๊นŒ?" ๋ฅผ ๊ณ ๋ฏผํ•˜๊ฒŒ ๋˜์—ˆ๊ณ , ๊ทธ ๊ฒฐ๊ณผ๋กœ ์›น์•ฑ๊ณผ ํ•˜์ด๋ธŒ๋ฆฌ๋“œ ์•ฑ์ด ๋“ฑ์žฅํ–ˆ์Šต๋‹ˆ๋‹ค. + +**์›น์•ฑ** (web apps)์€ ์›น ๊ธฐ์ˆ ์„ ์ด์šฉํ•ด์„œ ๋งŒ๋“  ์•ฑ์ž…๋‹ˆ๋‹ค. ์•ฑ์˜ ํ™”๋ฉด์„ ๋‚˜ํƒ€๋‚ด๋Š” ๋ทฐ(view)๋ฅผ ๋ชจ๋ฐ”์ผ์šฉ ์›น์œผ๋กœ ๋งŒ๋“ค์–ด์„œ ๋‹ค์–‘ํ•œ ๊ธฐ์ข…๊ณผ ํ•ด์ƒ๋„์— ๋Œ€์‘ํ•˜๋ฉฐ ๋น ๋ฅด๊ฒŒ ๊ฐœ๋ฐœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์š”์ฆ˜์€ ๋„ค์ดํ‹ฐ๋ธŒ ์•ฑ์ฒ˜๋Ÿผ ์•Œ๋ฆผ๋„ ๋ณด๋‚ด๊ณ  ์˜คํ”„๋ผ์ธ์—์„œ๋„ ๋™์ž‘ํ•˜๋Š” **ํ”„๋กœ๊ทธ๋ ˆ์‹œ๋ธŒ ์›น์•ฑ** (progressive web apps, PWA)๋„ ์ฃผ๋ชฉ๋ฐ›๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. +๊ทธ๋ฆฌ๊ณ  **ํ•˜์ด๋ธŒ๋ฆฌ๋“œ ์•ฑ** (hybride apps)์€ ์›น์•ฑ์„ ๋งŒ๋“  ํ›„ ๋ณ„๋„์˜ ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ์ด์šฉํ•ด ์šด์˜์ฒด์ œ๋ณ„๋กœ ๋™์ž‘ํ•˜๋Š” ์•ฑ์„ ๋งŒ๋“œ๋Š” ๊ธฐ์ˆ ์ž…๋‹ˆ๋‹ค. + +ํ•˜์ง€๋งŒ ์ด๋Ÿฌํ•œ ๊ธฐ์ˆ ๋กœ ๋งŒ๋“  ์•ฑ์€ ๋„ค์ดํ‹ฐ๋ธŒ ์•ฑ๊ณผ ๋น„๊ตํ•ด ์ƒ๋Œ€์ ์œผ๋กœ ์†๋„๊ฐ€ ๋А๋ฆฌ๊ณ  ์• ๋‹ˆ๋ฉ”์ด์…˜ ์‚ฌ์šฉ์—๋„ ์ œ์•ฝ์ด ์žˆ๋Š” ๋“ฑ ์Šค๋งˆํŠธํฐ์˜ ์„ฑ๋Šฅ์„ ์ถฉ๋ถ„ํžˆ ํ™œ์šฉํ•  ์ˆ˜ ์—†์—ˆ์Šต๋‹ˆ๋‹ค. ์ด๋•Œ ๋ฆฌ์•กํŠธ ๋„ค์ดํ‹ฐ๋ธŒ๊ฐ€ ๋“ฑ์žฅํ–ˆ์Šต๋‹ˆ๋‹ค. + +## ๋ฆฌ์•กํŠธ ๋„ค์ดํ‹ฐ๋ธŒ์™€ ํ”Œ๋Ÿฌํ„ฐ + +ํŽ˜์ด์Šค๋ถ์—์„œ ๋งŒ๋“  **๋ฆฌ์•กํŠธ ๋„ค์ดํ‹ฐ๋ธŒ** (React Native)๋Š” ์—ฌ๋Ÿฌ ์šด์˜์ฒด์ œ์—์„œ ๋™์ž‘ํ•˜๋Š” ์•ฑ์„ ๊ฐœ๋ฐœ ํ•  ์ˆ˜ ์žˆ๋Š” ํฌ๋กœ์Šค ํ”Œ๋žซํผ ์•ฑ ๊ฐœ๋ฐœ ํ”„๋ ˆ์ž„์›Œํฌ์ž…๋‹ˆ๋‹ค. ํŠนํžˆ ์›น ๊ฐœ๋ฐœ์ž์—๊ฒŒ ์ต์ˆ™ํ•œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ ์›น ๊ฐœ๋ฐœ์ž๊ฐ€ ์ƒˆ๋กœ์šด ์–ธ์–ด๋ฅผ ๋ฐฐ์šฐ์ง€ ์•Š๊ณ ์„œ๋„ ์•ฑ์„ ๊ฐœ๋ฐœํ•  ์ˆ˜ ์žˆ๋Š” ๊ธธ์„ ํ„ฐ์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ๋„ค์ดํ‹ฐ๋ธŒ ์–ธ์–ด๋กœ ๊ฐœ๋ฐœํ•  ๋•Œ๋Š” ์‚ฌ์šฉ์ž ์ธํ„ฐํŽ˜์ด์Šค(UI, user interface)๋ฅผ ๋ณ€๊ฒฝํ•  ๋•Œ๋งˆ๋‹ค ๋‹ค์‹œ ๋นŒ๋“œํ•ด์•ผ ํ–ˆ์ง€๋งŒ, ๋ฆฌ์•กํŠธ ๋„ค์ดํ‹ฐ๋ธŒ๋Š” ์ฝ”๋“œ๋ฅผ ๋ณ€๊ฒฝํ•˜๋ฉด ํ™”๋ฉด์— ๋ฐ”๋กœ ํ‘œ์‹œ๋˜๋ฏ€๋กœ ๊ฐœ๋ฐœ ํšจ์œจ๋„ ์ข‹์Šต๋‹ˆ๋‹ค. + +๋ฆฌ์•กํŠธ ๋„ค์ดํ‹ฐ๋ธŒ์—์„œ๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๊ฐ€ ๋‹ค๋ฆฌ ์—ญํ• ์„ ํ•˜๋ฉด์„œ ์•ˆ๋“œ๋กœ์ด๋“œ๋‚˜ iOS์˜ ๋„ค์ดํ‹ฐ๋ธŒ API์— ์ ‘๊ทผํ•ฉ๋‹ˆ๋‹ค. ๋˜‘๊ฐ™์€ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์ฝ”๋“œ๊ฐ€ ์•ˆ๋“œ๋กœ์ด๋“œ์™€ iOS์ฒ˜๋Ÿผ ๊ฐ๊ธฐ ๋‹ค๋ฅธ ์šด์˜์ฒด์ œ์—์„œ ์‹คํ–‰๋˜๊ฒŒ ์—ฐ๊ฒฐํ•ด ์ฃผ๋Š” ๊ฑฐ์ฃ . ๋”ฐ๋ผ์„œ ์›น์•ฑ์ด๋‚˜ ํ•˜์ด๋ธŒ๋ฆฌ๋“œ ์•ฑ๋ณด๋‹ค๋Š” ์†๋„๊ฐ€ ๋น ๋ฅด์ง€๋งŒ ํ™”๋ฉด์— ํ‘œ์‹œํ•  ๋‚ด์šฉ์ด ๋งŽ์œผ๋ฉด ๋А๋ ค์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์šด์˜์ฒด์ œ๊ฐ€ ์—…๋ฐ์ดํŠธ๋˜๋ฉด ๋””์ž์ธ์ด ์˜๋„ํ•œ ๋ฐ”์™€ ๋‹ฌ๋ผ์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. + +๋ฐ˜๋ฉด์— **ํ”Œ๋Ÿฌํ„ฐ** (Flutter)๋Š” ๋˜‘๊ฐ™์ด ํฌ๋กœ์Šค ํ”Œ๋žซํผ ์•ฑ ๊ฐœ๋ฐœ ํ”„๋ ˆ์ž„์›Œํฌ์ง€๋งŒ ๊ตฌ๊ธ€์—์„œ ๋งŒ๋“  ๋‹คํŠธ(Dart)๋ผ๋Š” ์–ธ์–ด๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ž๋ฐ”๋‚˜ C# ๊ฐ™์€ ์ปดํŒŒ์ผ ์–ธ์–ด๊ฐ€ ๊ฐ€์ง„ ํŠน์ง•์„ ํ™œ์šฉํ•ด ์•ฑ์„ ๊ฐœ๋ฐœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. + +ํ”Œ๋Ÿฌํ„ฐ๋Š” ํฌ๊ฒŒ ํ”„๋ ˆ์ž„์›Œํฌ์™€ ์—”์ง„, ์ž„๋ฒ ๋” ๊ณ„์ธต์œผ๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ํ”„๋ ˆ์ž„์›Œํฌ ๊ณ„์ธต์—๋Š” ๋‹คํŠธ ์–ธ์–ด๋กœ ๊ฐœ๋ฐœ๋œ ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ํด๋ž˜์Šค๊ฐ€ ์žˆ์œผ๋ฉฐ ์ด๋Ÿฌํ•œ ํด๋ž˜์Šค๋ฅผ ์ด์šฉํ•ด ์•ฑ์„ ๊ฐœ๋ฐœํ•ฉ๋‹ˆ๋‹ค. ๊ทธ ๋‹คํŠธ ์–ธ์–ด๋กœ ๊ฐœ๋ฐœ๋œ ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ํด๋ž˜์Šค๊ฐ€ ์žˆ์œผ๋ฉฐ ์ด๋Ÿฌํ•œ ํด๋ž˜์Šค๋ฅผ ์ด์šฉํ•ด ์•ฑ์„ ๊ฐœ๋ฐœํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์—”์ง„ ๊ณ„์ธต์€ ํ”Œ๋Ÿฌํ„ฐ์˜ ์ฝ”์–ด๋ฅผ ๋‹ด๋‹นํ•˜๋Š”๋ฐ ๋Œ€๋ถ€๋ถ„ C์™€ C++ ์–ธ์–ด๋กœ ๋งŒ๋“ค์–ด์กŒ์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ๋Š” ๋ฐ์ดํ„ฐ ํ†ต์‹ , ๋‹คํŠธ ์ปดํŒŒ์ผ, ๋ Œ๋”๋ง ๊ทธ๋ฆฌ๊ณ  ์‹œ์Šคํ…œ ์ด๋ฒคํŠธ ๋“ฑ์„ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค. + +![image](https://flutter-ko.dev/assets/resources/diagram-layercake-73512ded89f7df8301f622c66178633f04f91187822daf1ddff0d54b2d2676dc.png "ํ”Œ๋Ÿฌํ„ฐ ํ”„๋ ˆ์ž„์›Œํฌ์˜ ๊ณ„์ธต") + +๋งˆ์ง€๋ง‰์œผ๋กœ ์ž„๋ฒ ๋” ๊ณ„์ธต์—๋Š” ํ”Œ๋Ÿฌํ„ฐ ์•ฑ์ด ํฌ๋กœ์Šค ํ”Œ๋žซํผ์—์„œ ๋™์ž‘ํ•˜๋„๋ก ํ”Œ๋Ÿฌํ„ฐ ์—”์ง„์ด ๋ Œ๋”๋งํ•œ ๊ฒฐ๊ณผ๋ฅผ ํ”Œ๋žซํผ๋ณ„ ๋„ค์ดํ‹ฐ๋ธŒ ์–ธ์–ด๋กœ ๋ทฐ๋ฅผ ๋งŒ๋“ค์–ด ํ™”๋ฉด์— ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. ์•ˆ๋“œ๋กœ์ด๋“œ ์•ฑ์€ ์ž๋ฐ”์™€ C, C++ ์–ธ์–ด๋กœ ๋งŒ๋“ค๊ณ , iOS ์•ฑ์€ ์˜ค๋ธŒ์ ํ‹ฐ๋ธŒ-C์™€ ์˜ค๋ธŒ์ ํ‹ฐ๋ธŒ-C++ ์–ธ์–ด๋กœ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋ฆฌ๋ˆ…์Šค์™€ ์œˆ๋„์šฐ ์•ฑ์€ C++ ์–ธ์–ด๋กœ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋‹คํŠธ ์–ธ์–ด๋กœ ์†Œ์Šค ํŒŒ์ผ๋งŒ ์ž‘์„ฑํ•˜๋ฉด ํ”Œ๋Ÿฌํ„ฐ์˜ ๊ฐ ๊ณ„์ธต์„ ๊ฑฐ์ณ ํ”Œ๋žซํผ๋ณ„ ์•ฑ์„ ๊ฐœ๋ฐœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ฐ€์šด๋ฐ ๋‚ด๋ถ€์ ์ธ ์ฒ˜๋ฆฌ๋Š” ์‹ ๊ฒฝ ์“ฐ์ง€ ์•Š๊ณ ์„œ ํ”Œ๋Ÿฌํ„ฐ๋‚˜ ๋‹คํŠธ ์–ธ์–ด๋ฅผ ์—…๋ฐ์ดํŠธ๋งŒ ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. + +| ๊ตฌ๋ถ„ | ๋ฆฌ์•กํŠธ ๋„ค์ดํ‹ฐ๋ธŒ | ํ”Œ๋Ÿฌํ„ฐ | +|-----|-------------|------| +|๊ฐœ๋ฐœ ์ฃผ์ฒด| ํŽ˜์ด์Šค๋ถ | ๊ตฌ๊ธ€ | +| ์–ธ์–ด | ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ | ๋‹คํŠธ | +| ์ถœ์‹œ | 2015๋…„๋„ |2017๋…„๋„| +| ์„ฑ๋Šฅ | ๋น ๋ฅด์ง€๋งŒ ๋„ค์ดํ‹ฐ๋ธŒ ์•ฑํผ์€ ์•„๋‹˜ | ๋„ค์ดํ‹ฐ๋ธŒ ์•ฑ์— ๊ทผ์ ‘ํ•œ ์†๋„ | +|ํ•™์Šต ๊ณก์„ | ๋†’์Œ(๋„ค์ดํ‹ฐ๋ธŒ ์•ฑ ๊ฐœ๋ฐœ์ž ๊ธฐ์ค€) | ๋‚ฎ์Œ(๋„ค์ดํ‹ฐ๋ธŒ ์•ฑ ๊ฐœ๋ฐœ์ž ๊ธฐ์ค€) | +|๋Œ€ํ‘œ ์•ฑ| ํŽ˜์ด์Šค๋ถ, ์ธ์Šคํƒ€๊ทธ๋žจ, ํ•€ํ„ฐ๋ ˆ์ŠคํŠธ ๋“ฑ | ์•Œ๋ฆฌ๋ฐ”๋ฐ”, ๊ตฌ๊ธ€ ์• ๋“œ์„ผ์Šค, ๋ฆฌํ”Œ๋ ‰ํ‹€๋ฆฌ ๋“ฑ | +|์žฅ์ | - ์ €๋ณ€์ด ๋„“์€ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์ƒํƒœ๊ณ„ | - ๋‹ค์–‘ํ•œ ์œ„์ ฏ | +| | - ์›น ๊ฐœ๋ฐœ์ž์˜ ์ ‘๊ทผ์„ฑ | - ๊ฐ•๋ ฅํ•œ ์• ๋‹ˆ๋ฉ”์ด์…˜ ๊ธฐ๋Šฅ | +| | - npm์œผ๋กœ ๋งŽ์€ ํŒจํ‚ค์ง€ ์ด์šฉ ๊ฐ€๋Šฅ | - ๋ธ”๋ฃจํˆฌ์Šค ๋“ฑ ๋„ค์ดํ‹ฐ๋ธŒ ํ•˜๋“œ์›จ์–ด์™€์˜ ์—ฐ๊ฒฐ์„ฑ | +|๋‹จ์ | - ๊ธฐ๋ณธ ์œ„์ ฏ์ด ๋ถ€์กฑํ•ด ์ปค์Šคํ…€ํ•ด์„œ ์‚ฌ์šฉ | - ํ”Œ๋Ÿฌํ„ฐ SDK๋กœ ์•ฑ ํฌ๊ธฐ๊ฐ€ ํผ(๋„ค์ดํ‹ฐ๋ธŒ ๋Œ€๋น„) | +| | - ์•ˆ๋“œ๋กœ์ด๋“œ/iOS ๋„ค์ดํ‹ฐ๋ธŒ ์œ„์ ฏ์„ ์ด์šฉํ•˜๊ธฐ์— OS ํŒ์˜ฌ๋ฆผ์— ๋”ฐ๋ฅธ ์—…๋ฐ์ดํŠธ ํ•„์š” | - ์•„์ง ๊ฐœ๋ฐœ ์ƒํƒœ๊ณ„๊ฐ€ ์„ฑ์ˆ™ํ•˜์ง€ ์•Š์•„ ๋น ๋ฅธ ํ”ผ๋“œ๋ฐฑ ์–ป๊ธฐ๊ฐ€ ์–ด๋ ค์›€ | +| | - ๋ธ”๋ฃจํˆฌ์Šค ๋“ฑ ๋„ค์ดํ‹ฐ๋ธŒ ์ปค์Šคํ…€ํ•ด ํ†ต์‹ ํ•˜๋Š” ๋ถ€๋ถ„ ๊ฐœ๋ฐœ์ด ์–ด๋ ค์›€ | - ์—…๋ฐ์ดํŠธ ์ฃผ๊ฐ€๊ฐ€ ๋น ๋ฆ„(๋ถ„๊ธฐ๋ณ„) | +|์ตœ์ข… ๋ชฉํ‘œ| ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋กœ ์›น, ์•ฑ, ๋ฐ์Šคํฌํ†ฑ ๋ชจ๋“  ํ”Œ๋žซํผ์„ ๊ฐœ๋ฐœํ•  ์ˆ˜ ์žˆ๋Š” ํ†ตํ•ฉ ์†”๋ฃจ์…˜ ๊ฐœ๋ฐœ | ์•ˆ๋“œ๋กœ์ด๋“œ, iOS, ์›น, ์œˆ๋„์šฐ 10 ์•ฑ์„ ๊ฐ™์€ ์ฝ”๋“œ๋กœ ๊ฐœ๋ฐœํ•  ์ˆ˜ ์žˆ๋Š” ํ”Œ๋žซํผ ๊ฐœ๋ฐœ| + +## ํ”Œ๋Ÿฌํ„ฐ๊ฐ€ ์ฃผ๋ชฉ๋ฐ›๋Š” ์ด์œ  + +ํ”Œ๋Ÿฌํ„ฐ๋ฅผ ์ƒ์ง•ํ•˜๋Š” ๋Œ€ํ‘œ์ ์ธ ํŠน์ง• 3๊ฐ€์ง€! + +### ํ•˜๋‚˜, ๋†’์€ ๊ฐœ๋ฐœ ํšจ์œจ + +ํ”Œ๋Ÿฌํ„ฐ๋ฅผ ์ด์šฉํ•˜๋ฉด ์•ˆ๋“œ๋กœ์ด๋“œ์™€ iOS ์•ฑ์„ ๋™์‹œ์— ๊ฐœ๋ฐœํ•  ์ˆ˜ ์žˆ์–ด์„œ ํšจ์œจ์ ์ž…๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ๊ฐœ๋ฐœ๋œ ์•ฑ์€ ์–ด๋–ค ์šด์˜์ฒด์ œ์—์„œ๋„ ๋˜‘๊ฐ™์€ ์‚ฌ์šฉ์ž ์ธํ„ฐํŽ˜์ด์Šค์™€ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜(UX, user experience)์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ, ํ”Œ๋Ÿฌํ„ฐ์˜ **ํ•ซ ๋ฆฌ๋กœ๋“œ** (hot reload) ๊ธฐ๋Šฅ์€ ์†Œ์Šค ์ˆ˜์ • ํ›„ ๋ฒˆ๊ฑฐ๋กœ์šด ๋นŒ๋“œ ๊ณผ์ • ์—†์ด ๊ฒฐ๊ณผ ํ™”๋ฉด์— ๋ฐ”๋กœ ํ‘œ์‹œํ•ด ์ฃผ๋ฏ€๋กœ ๊ฐœ๋ฐœ ์‹œ๊ฐ„์„ ์ค„์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. + +### ๋‘˜, ์œ ์—ฐํ•œ ์‚ฌ์šฉ์ž ์ธํ„ฐํŽ˜์ด์Šค + +์—ญ๋™์ ์ด๋ฉด์„œ๋„ ์œ ์—ฐํ•œ ์‚ฌ์šฉ์ž ์ธํ„ฐํŽ˜์ด์Šค๋Š” ํ”Œ๋Ÿฌํ„ฐ์˜ ํฐ ์žฅ์ ์ž…๋‹ˆ๋‹ค. ๋‹ค์–‘ํ•œ **์œ„์ ฏ** (widget)์„ ์ œ๊ณตํ•˜๋ฏ€๋กœ ์‚ฌ์šฉ์ž ๋งž์ถคํ˜• ์•ฑ์„ ์‰ฝ๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋งŒ์•ฝ ์›ํ•˜๋Š” ์œ„์ ฏ์ด ์—†์œผ๋ฉด ์„ ๊ณผ ๋„ํ˜•์œผ๋กœ ์ง์ ‘ ๊ทธ๋ ค์„œ ๋งŒ๋“ค ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. +๋˜ํ•œ, ๊ฐ•๋ ฅํ•œ ์• ๋‹ˆ๋ฉ”์ด์…˜ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜์—ฌ ๋ณต์žกํ•œ ๊ณ„์‚ฐ์‹ ์—†์ด ์ ์€ ๋…ธ๋ ฅ์œผ๋กœ ๋งŒ์กฑ์Šค๋Ÿฌ์šด ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์„ ์ค„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ”Œ๋กœํ„ฐ์˜ ์œ„์ ฏ์„ ํ™œ์šฉํ•˜๋ฉด iOS์—์„œ ๊ตฌ๊ธ€์˜ ๋จธํ„ฐ๋ฆฌ์–ผ ๋””์ž์ธ์ด ์ ์šฉ๋œ ์•ฑ์„ ๋งŒ๋“ค๊ฑฐ๋‚˜ ๋ฐ˜๋Œ€๋กœ ์•ˆ๋“œ๋กœ์ด๋“œ์—์„œ iOS์Šคํƒ€์ผ ์•ฑ์„ ๊ฐœ๋ฐœํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. +> ํ”Œ๋Ÿฌํ„ฐ์—์„œ๋Š” iOS ์Šคํƒ€์ผ์˜ ์œ„์ ฏ์„ ์ฟ ํผํ‹ฐ๋…ธ(cupertino)๋ผ๊ณ  ๋ถ€๋ฆ…๋‹ˆ๋‹ค. + +### ์…‹, ๋น ๋ฅธ ์†๋„ + +ํ”Œ๋Ÿฌํ„ฐ๋Š” ์ „์ฒด ํ™”๋ฉด์„ ๊ทธ๋ฆด ๋•Œ **์Šคํ‚ค์•„** (skia) ์—”์ง„์„ ์ด์šฉํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๋ฐฐ๊ฒฝ์€ ๋…ธ๋ž€์ƒ‰์œผ๋กœ ํ•˜๊ณ  ๊ทธ ์œ„์— ์•„์ด์ฝ˜์„ ๊ทธ๋ฆฐ๋‹ค๊ณ  ํ–ˆ์„ ๋•Œ, ํ”Œ๋Ÿฌํ„ฐ๋Š” ๋…ธ๋ž€์ƒ‰์„ ์ „์ฒด ํ™”๋ฉด์— ์น ํ•œ ๋‹ค์Œ ์•„์ด์ฝ˜์„ ๊ทธ๋ฆฌ๋Š” ๋‘ ๋ฒˆ์˜ ์ž‘์—…์„ ํ•œ ๋ฒˆ์— ํ•ด์„œ ์ดˆ๋‹น 60ํ”„๋ ˆ์ž„ ์ด์ƒ์˜ ์†๋„๋กœ ํ™”๋ฉด์„ ๊ฐฑ์‹ ํ•ฉ๋‹ˆ๋‹ค. +์ด์ฒ˜๋Ÿผ ๋น ๋ฅด๊ณ  ์ž์—ฐ์Šค๋Ÿฌ์šด ํ™”๋ฉด ์ „ํ™˜ ๋•๋ถ„์— ๋„ค์ดํ‹ฐ๋ธŒ ์•ฑ๊ณผ ์†๋„ ์ฐจ์ด๋ฅผ ๊ฑฐ์˜ ๋А๋‚„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. +> ์Šคํ‚ค์•„๋Š” C++๋กœ ๊ฐœ๋ฐœ๋œ ์˜คํ”ˆ์†Œ์Šค 2D ๊ทธ๋ž˜ํ”ฝ ์—”์ง„์œผ๋กœ ํ”Œ๋Ÿฌํ„ฐ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ํฌ๋กฌ, ์•ˆ๋“œ๋กœ์ด๋“œ, ํŒŒ์ด์–ดํญ์Šค, ๋ฆฌ๋ธŒ๋ ˆ์˜คํ”ผ์Šค ๋“ฑ ๋‹ค์–‘ํ•œ ํ”Œ๋žซํผ๊ณผ ์ œํ’ˆ์—์„œ ์‚ฌ์šฉ๋˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. + +--- + +### ํ”Œ๋Ÿฌํ„ฐ ๊ฐค๋Ÿฌ๋ฆฌ + +[![flutterGallery](https://t1.daumcdn.net/thumb/R720x0.fjpg/?fname=http://t1.daumcdn.net/brunch/service/user/2Kn8/image/z1tIuX5m0Uwx1bGWih2fIAn_mrY.jpg "ํ”Œ๋Ÿฌํ„ฐ ๊ฐค๋Ÿฌ๋ฆฌ")](https://gallery.flutter.dev/#/) + + +----- + +ํ”Œ๋Ÿฌํ„ฐ์˜ ์ฃผ๋ชฉ๋„๊ฐ€ ์ตœ๊ทผ ๋กœ์ผ“์„ฑ์žฅํ•˜๋Š” ์ด์œ ๊ฐ€ ๋‹ค ์žˆ๋Š”๊ฒƒ ๊ฐ™๋‹ค.
+๊ทธ๋ž˜์„œ Dart ์–ธ์–ด๋ฅผ ์ตํžˆ๋ฉด์„œ ํ”Œ๋Ÿฌํ„ฐ ๊ณต๋ถ€๋ฅผ ํ•ด๋ณด๋ ค๊ณ  ํ•œ๋‹ค.
diff --git a/src/content/blog/dev/flutter/2022-04-06-flutter-dart.md b/src/content/blog/dev/flutter/2022-04-06-flutter-dart.md new file mode 100644 index 0000000..bb58e07 --- /dev/null +++ b/src/content/blog/dev/flutter/2022-04-06-flutter-dart.md @@ -0,0 +1,496 @@ +--- +title: Dart ์–ธ์–ด +date: 2022-04-06 +tags: flutter, ๊ฐœ๋ฐœ +excerpt: ๋‹คํŠธ? ์•Œ์•„๋ณด์ž +--- +# ํ”Œ๋Ÿฌํ„ฐ๋ฅผ ์œ„ํ•œ ํ•„์ˆ˜! ๋‹คํŠธ๋ฅผ ์•Œ์ž! + +* toc +{:toc .large-only} + +ํ”Œ๋Ÿฌํ„ฐ๋Š” ๋‹คํŠธ(Dart)๋ผ๋Š” ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด๋กœ ๊ฐœ๋ฐœ๋์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ํ”Œ๋Ÿฌํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ๋‹คํŠธ๋ผ๋Š” ์ƒˆ๋กœ์šด ์–ธ์–ด๋ฅผ ์•Œ์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค. +๋‹คํŠธ ํ™ˆํŽ˜์ด์ง€์—๋Š” `"์ž๋ฐ”๋‚˜ C# ๊ฐœ๋ฐœ์ž๋ผ๋ฉด ํ•˜๋ฃจ๋ฉด ๋ฐฐ์šธ ์ˆ˜ ์žˆ๋‹ค."` ๋ผ๊ณ  ์†Œ๊ฐœํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋‹คํŠธ๋Š” ์ƒ๊ฐ๋ณด๋‹ค ์–ด๋ ต์ง€ ์•Š์€ ์–ธ์–ด์ž…๋‹ˆ๋‹ค. + +๋‹คํŠธ ์–ธ์–ด์˜ ์ฒ ํ•™์€ "๊ฐ„๋‹จํ•˜๊ฒŒ ๋ฐฐ์›Œ์„œ ๋‹ค์–‘ํ•œ ํ”Œ๋žซํผ์— ์จ๋จน์ž!" ์ž…๋‹ˆ๋‹ค. ์ง€๊ธˆ ๋‹คํŠธ๋ฅผ ์ตํ˜€ ๋‘๋ฉด ๋ชจ๋ฐ”์ผ ์•ฑ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์„œ๋ฒ„์™€ ์›น ํ”„๋ŸฐํŠธ์—”๋“œ, ๋ฐ์Šคํฌํ†ฑ ์•ฑ์„ ๋งŒ๋“ค ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. +๋‹ค๋งŒ, ํ”Œ๋Ÿฌํ„ฐ๊ฐ€ ์ฃผ์ œ์ด๋ฏ€๋กœ ๋‹คํŠธ๋ฅผ ์ „๋ฌธ์ ์œผ๋กœ ๋ฐฐ์šฐ์ง€๋Š” ์•Š๊ณ  ํ•ต์‹ฌ ๋‚ด์šฉ๋งŒ ๊ฐ„๋žตํ•˜๊ฒŒ ๋‹ค๋ฃฐ ์˜ˆ์ •์ž…๋‹ˆ๋‹ค. + +## ๋‹คํŠธ(Dart)! + +๋‹คํŠธ๋Š” ๊ตฌ๊ธ€์ด Web Front-end ๊ตฌํ˜„์„ ๋ชฉ์ ์œผ๋กœ ๊ฐœ๋ฐœํ•œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด๋กœ 2011๋…„ 10์›”์— ๊ณต๊ฐœ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. +๋‹คํŠธ๋Š” ๋งˆ์น˜ ์นด๋ฉœ๋ ˆ์˜จ์ฒ˜๋Ÿผ ์–ด๋–ป๊ฒŒ ํ™œ์šฉํ•˜๋А๋ƒ์— ๋”ฐ๋ผ ์„œ๋ฒ„๋‚˜ ์›น, ์•ฑ์„ ๋งŒ๋“ค ๋•Œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. + +### ๋‹คํŠธ ์–ธ์–ด์˜ 9๊ฐ€์ง€ ํŠน์ง• + +๋‹คํŠธ๋Š” ๋‹ค๋ฅธ ์–ธ์–ด์™€ ๋น„๊ตํ•ด 9๊ฐ€์ง€ ๋‘๋“œ๋Ÿฌ์ง„ ํŠน์ง•์ด ์žˆ์Šต๋‹ˆ๋‹ค. + +1. ๋‹คํŠธ๋Š” main() ํ•จ์ˆ˜๋กœ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค. +2. ๋‹คํŠธ๋Š” ์–ด๋””์—์„œ๋‚˜ ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•˜๊ณ  ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. +3. ๋‹คํŠธ์—์„œ๋Š” ๋ชจ๋“  ๋ณ€์ˆ˜๊ฐ€ ๊ฐ์ฒด์ž…๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋ชจ๋“  ๊ฐ์ฒด๋Š” Object ํด๋ž˜์Šค๋ฅผ ์ƒ์†๋ฐ›์Šต๋‹ˆ๋‹ค. +4. ๋‹คํŠธ๋Š” ์ž๋ฃŒํ˜•์ด ์—„๊ฒฉํ•œ ์–ธ์–ด์ž…๋‹ˆ๋‹ค. ์ด ๋ง์€ ๋ณ€์ˆ˜์— ์ง€์ •ํ•œ ์ž๋ฃŒํ˜•๊ณผ ๋‹ค๋ฅธ ์œ ํ˜•์˜ ๊ฐ’์„ ์ €์žฅํ•˜๋ฉด ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค๋Š” ์˜๋ฏธ์ž…๋‹ˆ๋‹ค. ๋งŒ์•ฝ ์—ฌ๋Ÿฌ ์ž๋ฃŒํ˜•์„ ํ—ˆ์šฉํ•˜๋ ค๋ฉด dynamic ํƒ€์ž…์„ ์ด์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. +5. ๋‹คํŠธ๋Š” ์ œ๋„ค๋ฆญ ํƒ€์ž…์„ ์ด์šฉํ•ด ๊ฐœ๋ฐœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  `List`์ฒ˜๋Ÿผ intํ˜•์„ ๋„ฃ์„ ์ˆ˜๋„ ์žˆ๊ณ , `List`์ฒ˜๋Ÿผ ๋‹ค์–‘ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ๋„ฃ์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. +6. ๋‹คํŠธ๋Š” public, protected ๊ฐ™์€ ํ‚ค์›Œ๋“œ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๋งŒ์•ฝ ์™ธ๋ถ€๋กœ ๋…ธ์ถœํ•˜๊ณ  ์‹ถ์ง€ ์•Š๋‹ค๋ฉด ๋ณ€์ˆ˜๋‚˜ ํ•จ์ˆ˜ ์ด๋ฆ„ ์•ž์— ์–ธ๋”์Šค์ฝ”์–ด(_)๋ฅผ ์ด์šฉํ•ด ํ‘œ์‹œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. +7. ๋ณ€์ˆ˜๋‚˜ ํ•จ์ˆ˜์˜ ์‹œ์ž‘์€ ์–ธ๋”์Šค์ฝ”์–ด ๋˜๋Š” ๋ฌธ์ž์—ด๋กœ ์‹œ์ž‘ํ•˜๊ณ  ๊ทธ ์ดํ›„์— ์ˆซ์ž๋ฅผ ์ž…๋ ฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. +8. ๋‹คํŠธ๋Š” ์‚ผํ•ญ ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. +9. Null safety๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” 2.0์—์„œ ์ƒˆ๋กญ๊ฒŒ ์ถ”๊ฐ€๋œ ๊ธฐ๋Šฅ์œผ๋กœ, Null safety๋ฅผ ์ด์šฉํ•˜๋ฉด ์ปดํŒŒ์ผ ์ „์— ๋„ ์˜ˆ์™ธ(Null Exception)๋ฅผ ์•Œ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ๋„์— ๋Œ€ํ•œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š๋„๋ก ์ž‘์—…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. + +#### 8) ์‚ผํ•ญ์—ฐ์‚ฐ์ž + +๋‹ค์Œ ์ฝ”๋“œ์—์„œ ์ฒซ ๋ฒˆ์งธ ์ค„์„ ๋ณด๋ฉด isPublic์ด ์ฐธ์ด๋ฉด "public", ์ฐธ์ด ์•„๋‹ˆ๋ฉด "private"๋ฅผ ๋ฐ˜ํ™˜ํ•˜์—ฌ visibility์— ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ๋‘ ๋ฒˆ์งธ ์ค„์€ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์ „๋‹ฌ๋ฐ›์€ name์ด null์ด๋ฉด "Guest"๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ณ , ์•„๋‹ˆ๋ฉด ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์ „๋‹ฌ ๋ฐ›์€ ๊ฐ’์„ ๊ทธ๋Œ€๋กœ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. +```dart +var visibility = isPublic ? 'public' : 'private'; +String playerName(String name) => name ?? 'Guest'; +``` + +### ๊ฐ„๋‹จํ•œ ์ฝ”๋“œ๋กœ ๋‹คํŠธ์˜ ํŠน์ง• ์ดํ•ดํ•˜๊ธฐ + +๋‹คํŠธ๋กœ ๋งŒ๋“  ํ”„๋กœ๊ทธ๋žจ์˜ ์‹œ์ž‘์ ์€ ์ž๋ฐ”๋‚˜ C์ฒ˜๋Ÿผ **main()** ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค. + +```dart +// ํ•จ์ˆ˜ ์ •์˜ +printInteger(int aNumber) { + print('The number is $aNumber.'); // ์ฝ˜์†”์— ์ถœ๋ ฅ +} + +// main() ํ•จ์ˆ˜์—์„œ ์‹œ์ž‘ +main() { + var number = 42; // ๋™์  ํƒ€์ž… ๋ณ€์ˆ˜ ์ง€์ • + printInteger(number); // ํ•จ์ˆ˜ ํ˜ธ์ถœ +} +``` +```console +๊ฒฐ๊ณผ > +The number is 42. +``` +> `var ํ‚ค์›Œ๋“œ๋กœ ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•˜๋ฉด ํ•ด๋‹น ๋ณ€์ˆ˜์— ์ €์žฅ๋˜๋Š” ๊ฐ’์˜ ์œ ํ˜•์— ๋”ฐ๋ผ ์ž๋ฃŒํ˜•์ด ์ •ํ•ด์ง‘๋‹ˆ๋‹ค. ์ด๊ฒƒ์„ ์ž๋ฃŒํ˜• ์ถ”๋ก (type inference)์ด๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค.` + +๋‹คํŠธ์—์„œ๋Š” ๋ฌธ์ž์—ด์„ ํ‘œํ˜„ํ•  ๋•Œ๋Š” ํฐ๋”ฐ์˜ดํ‘œ๋‚˜ ์ž‘์€๋”ฐ์˜ดํ‘œ๋ฅผ ์ด์šฉํ•˜๋Š”๋ฐ, ์ด๋•Œ ๋”ฐ์˜ดํ‘œ ์•ˆ์— **`${ํ‘œํ˜„์‹}`**๊ณผ ๊ฐ™์€ ํ˜•ํƒœ๋กœ ์‚ฌ์šฉํ•˜๋ฉด ํ‘œํ˜„์‹์— ๋ณ€์ˆ˜๋ฅผ ์ง์ ‘ ๋„ฃ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. + +| ๊ตฌ๋ถ„ | ์ž๋ฃŒํ˜• | ์„ค๋ช… | +|:---:|:----:|:-----:| +| ์ˆซ์ž | int | ์ •์ˆ˜ํ˜• ์ˆซ์ž | +| | double | ์‹ค์ˆ˜ํ˜• ์ˆซ์ž | +| | num | ์ •์ˆ˜ํ˜• ๋˜๋Š” ์‹ค์ˆ˜ํ˜• ์ˆซ์ž | +|๋ฌธ์ž์—ด| String | ํ…์ŠคํŠธ ๊ธฐ๋ฐ˜ ๋ฌธ์ž | +|๋…ผ๋ฆฌํ˜•| bool | True๋‚˜ false | +| ์ž๋ฃŒํ˜• ์ถ”๋ก  | var | ์ž…๋ ฅ๋ฐ›์€ ๊ฐ’์— ๋”ฐ๋ผ ์ž๋ฃŒํ˜• ๊ฒฐ์ •. ํ•œ ๋ฒˆ ๊ฒฐ์ •๋œ ์ž๋ฃŒํ˜•์€ ๋ณ€๊ฒฝ ๋ถˆ๊ฐ€ | +| | dynamic | ์ž…๋ ฅ๋ฐ›์€ ๊ฐ’์—๋”ฐ๋ผ ์ž๋ฃŒํ˜• ๊ฒฐ์ •. ๋‹ค๋ฅธ ๋ณ€์ˆ˜ ์ž…๋ ฅํ•˜๋ฉด ์ž๋ฃŒํ˜• ๋ณ€๊ฒฝ ๊ฐ€๋Šฅ | + + +### Null safety + +Null safety๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด pubspec.yaml ํŒŒ์ผ์˜ SDK ํ™˜๊ฒฝ์„ ๋ณ€๊ฒฝํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ๊ณผ ๊ฐ™์ด 2.12.0 ๋ฒ„์ „ ์ด์ƒ๋ถ€ํ„ฐ Null safety๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. +```yaml +enviroment: + sdk: ">=2.12.0 <3.0.0" +``` +> [๋ฒ„์ „ ํ‘œ๊ธฐ ์ดํ•ด](https://gahusb.github.io/devlog/web-npmcarrot.html) + +๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์œผ๋กœ, ์ž๋ฃŒํ˜• ๋‹ค์Œ์— `?`๋ฅผ ๋ถ™์ด๋ฉด Null์ด ๊ฐ€๋Šฅํ•˜๊ณ  ๋ถ™์ด์ง€ ์•Š์œผ๋ฉด Null์ด ๋ถˆ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์‹ ๋‹ค์Œ์— `!`๋ฅผ ๋ถ™์ด๋ฉด Null์ด ์•„๋‹˜์„ ์ง์ ‘ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. + +```dart +int? couldReturnNullButDoesnt() => -3; + +void main() { + int? couldBeNullButIsnt = 1; // null๋กœ ๋ณ€๊ฒฝ ๊ฐ€๋Šฅ + List listThatCouldHoldNulls = [2, null, 4]; // List์˜ int์— null ๊ฐ’ ํฌํ•จ ๊ฐ€๋Šฅ + List? nullsList; // List ์ž์ฒด๊ฐ€ null์ผ ์ˆ˜ ์žˆ์Œ + int a = couldBeNullButIsnt; // null์„ ๋„ฃ์œผ๋ฉด ์˜ค๋ฅ˜ + int b = listThatCouldHoldNulls.first; // int b๋Š” ?๊ฐ€ ์—†์œผ๋ฏ€๋กœ ์˜ค๋ฅ˜ + int b = listThatCouldHoldNulls.first!; // null์ด ์•„๋‹˜์„ ์ง์ ‘ ํ‘œ์‹œ + int c = couldReturnNullButDoesnt().abs(); // null์ผ ์ˆ˜๋„ ์žˆ์œผ๋ฏ€๋กœ abs()์—์„œ ์˜ค๋ฅ˜ + int c = couldReturnNullButDoesnt()!.abs(); // null์ด ์•„๋‹˜์„ ์ง์ ‘ ํ‘œ์‹œ + + print('a is $a.'); + print('b is $b.'); + print('c is $c.'); +} +``` + +Null safety๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ ๋Š” ํ”„๋กœ๊ทธ๋žจ ์‹คํ–‰ ์ค‘ ๋„ ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ํ”„๋กœ๊ทธ๋žจ์ด ์ค‘์ง€๋˜๋Š”๋ฐ, ์ด๋ฅผ ์ฝ”๋“œ ๋‹จ๊ณ„์—์„œ ๊ตฌ๋ถ„ํ•˜์—ฌ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๊ธฐ ์œ„ํ•ด์„œ์ž…๋‹ˆ๋‹ค. ์ด๋Ÿฐ ์ด์œ ๋กœ ์š”์ฆ˜ ๋‚˜์˜ค๋Š” ์–ธ์–ด ์ค‘์—๋Š” Null safety๋ฅผ ์ œ๊ณตํ•˜๋Š” ์–ธ์–ด๊ฐ€ ๋งŽ์Šต๋‹ˆ๋‹ค. + +### ๋‹คํŠธ๊ฐ€ ์ œ๊ณตํ•˜๋Š” ํ‚ค์›Œ๋“œ + +| ํ‚ค์›Œ๋“œ | - | - | - | +| :--: |:--:|:--:|:--:| +| abstract | dynamic | implements | show | +| as | else | import | static | +| assert | enum | in | super | +| async | export | interface | switch | +| await | extends | is | sync | +| break | external | library | this | +| case | factory | mixin | throw | +| catch | false | new | true | +| class | final | null | try | +| const | finally | on | typedef | +| continue | for | operator | var | +| convariant | Function | part | void | +| default | get | rethrow | while | +| deferred | hide | return | with | +| do | if | set | yield | + +> [๋‹คํŠธ๊ฐ€ ์ œ๊ณตํ•˜๋Š” ํ‚ค์›Œ๋“œ](https://dart.dev/guides/language/language-tour#keywords) + +--- +## ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ ๋ฐฉ์‹ + +๋‹คํŠธ๋Š” ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๋ฅผ ์ง€์›ํ•˜๋Š” ์–ธ์–ด์ž…๋‹ˆ๋‹ค. ๋น„๋™๊ธฐ(asynchronous)๋ž€ ์–ธ์ œ ๋๋‚ ์ง€ ๋ชจ๋ฅด๋Š” ์ž‘์—…์„ ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š๊ณ  ๋‹ค์Œ ์ž‘์—…์„ ์ฒ˜๋ฆฌํ•˜๊ฒŒ ํ•˜๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ๋งŒ์•ฝ ๋น„๋™๊ธฐ๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š๊ณ  ๋™๊ธฐ(synchronous)๋กœ๋งŒ ์ฒ˜๋ฆฌํ•œ๋‹ค๋ฉด ์–ด๋–ค ์ž‘์—…์ด ์˜ค๋ž˜ ๊ฑธ๋ฆด ๊ฒฝ์šฐ ์‚ฌ์šฉ์ž๋Š” ์‹คํ–‰์ด ๋ฉˆ์ถ˜ ๊ฒƒ์œผ๋กœ ์ƒ๊ฐํ•˜๊ณ  ํ”„๋กœ๊ทธ๋žจ์„ ์ข…๋ฃŒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ ๋„คํŠธ์›Œํฌ์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๊ฑฐ๋‚˜ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์“ฐ๊ธฐ, ํŒŒ์ผ ์ฝ๊ธฐ ๋“ฑ์˜ ์ž‘์—…์€ ์ƒํ™ฉ์— ๋”ฐ๋ผ ์–ธ์ œ ๋๋‚ ์ง€ ์•Œ ์ˆ˜ ์—†์œผ๋ฏ€๋กœ ๋น„๋™๊ธฐ๋กœ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค. + + +![synchronous](https://res.cloudinary.com/practicaldev/image/fetch/s--IB0Ikc71--/c_imagga_scale,f_auto,fl_progressive,h_900,q_auto,w_1600/https://cl.ly/3N0P302P0H2g/Image%25202018-07-19%2520at%25209.16.55%2520AM.png) [1](#footnote_1) +1: ์ถœ์ฒ˜: DEV.to + +### ๋น„๋™๊ธฐ ํ”„๋กœ์„ธ์Šค์˜ ์ž‘๋™ ๋ฐฉ์‹ + +๋‹คํŠธ๋Š” async์™€ await ํ‚ค์›Œ๋“œ๋ฅผ ์ด์šฉํ•ด ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๋ฅผ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค. +1. ํ•จ์ˆ˜ ์ด๋ฆ„ ๋’ค, ๋ณธ๋ฌธ์ด ์‹œ์ž‘ํ•˜๋Š” ์ค‘๊ด„ํ˜ธ `{` ์•ž์— async ํ‚ค์›Œ๋“œ๋ฅผ ๋ถ™์—ฌ ๋น„๋™๊ธฐ๋กœ ๋งŒ๋“ ๋‹ค. +2. ๋น„๋™๊ธฐ ํ•จ์ˆ˜ ์•ˆ์—์„œ ์–ธ์ œ ๋๋‚ ์ง€ ๋ชจ๋ฅด๋Š” ์ž‘์—… ์•ž์— await ํ‚ค์›Œ๋“œ๋ฅผ ๋ถ™์ธ๋‹ค. +3. 2๋ฒˆ ์ž‘์—…์„ ๋งˆ์นœ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ›๊ธฐ ์œ„ํ•ด ๋น„๋™๊ธฐ ํ•จ์ˆ˜ ์ด๋ฆ„ ์•ž์— Future(๊ฐ’์ด ์—ฌ๋Ÿฌ ๊ฐœ๋ฉด Stream) ํด๋ž˜์Šค๋ฅผ ์ง€์ •ํ•œ๋‹ค. + +๋‹ค์Œ ์˜ˆ์‹œ๋ฅผ ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. + +```dart +void main() { + checkVersion(); + print('end process'); +} +Future checkVersion() async { + var version = await lookUpVersion(); + print(version); +} + +int lookUpVersion() { + return 12; +} +``` + +์ผ๋ฐ˜์ ์ธ ์ƒ๊ฐ์œผ๋กœ ์ฝ”๋“œ๋ฅผ ๋ณด๋ฉด main() ํ•จ์ˆ˜์—์„œ ์ œ์ผ ๋จผ์ € checkVersion() ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ–ˆ์œผ๋ฏ€๋กœ checkVersion() ํ•จ์ˆ˜์— ์žˆ๋Š” lookUpVersion() ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋˜์–ด 12๋ฅผ ์ „๋‹ฌ๋ฐ›์•„ ์ถœ๋ ฅํ•œ ๋‹ค์Œ, ๋‹ค์‹œ main()์œผ๋กœ ๋Œ์•„์™€์„œ 'end process'๊ฐ€ ์ถœ๋ ฅ๋  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๊ฒฐ๊ณผ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. + +```console +์‹คํ–‰ ๊ฒฐ๊ณผ > +end process +12 +``` + +์ด๋Ÿฌํ•œ ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜์˜ค๋Š” ์ด์œ ๋Š” ๋จผ์ € checkVersion() ํ•จ์ˆ˜๋ฅผ ๋ณด๋ฉด ์ด๋ฆ„ ์•ž๋’ค๋กœ Future์™€ async๊ฐ€ ๋ถ™์—ˆ์Šต๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด checkVersion() ํ•จ์ˆ˜๋ฅผ ๋น„๋™๊ธฐ๋กœ ๋งŒ๋“ค๊ฒ ๋‹ค๋Š” ์˜๋ฏธ์ž…๋‹ˆ๋‹ค. ์ฆ‰, checkVersion() ํ•จ์ˆ˜ ์•ˆ์— await๊ฐ€ ๋ถ™์€ ํ•จ์ˆ˜๋ฅผ ๋น„๋™๊ธฐ๋กœ ์ฒ˜๋ฆฌํ•œ ๋‹ค์Œ ๊ทธ ๊ฒฐ๊ณผ๋Š” Future ํด๋ž˜์Šค์— ์ €์žฅํ•ด ๋‘˜ ํ…Œ๋‹ˆ ๋จผ์ € checkVersion() ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•œ main() ํ•จ์ˆ˜์˜ ๋‚˜๋จธ์ง€ ์ฝ”๋“œ๋ฅผ ๋ชจ๋‘ ์‹คํ–‰ํ•˜๋ผ๋Š” ์˜๋ฏธ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  main() ํ•จ์ˆ˜๋ฅผ ๋ชจ๋‘ ์‹คํ–‰ํ–ˆ์œผ๋ฉด ๊ทธ๋•Œ Future ํด๋ž˜์Šค์— ์ €์žฅํ•ด ๋‘” ๊ฒฐ๊ณผ๋ฅผ ์ด์šฉํ•ด์„œ checkVersion() ํ•จ์ˆ˜์˜ ๋‚˜๋จธ์ง€ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. + +์•ž์„  ์ฝ”๋“œ์—์„œ lookUpVersion() ํ•จ์ˆ˜ ์•ž์— await ํ‚ค์›Œ๋“œ๊ฐ€ ๋ถ™์—ˆ์Šต๋‹ˆ๋‹ค. await ํ‚ค์›Œ๋“œ๋Š” ์ฒ˜๋ฆฌ๋ฅผ ์™„๋ฃŒํ•˜๊ณ  ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•  ๋•Œ๊นŒ์ง€ ์ดํ›„ ์ฝ”๋“œ์˜ ์ฒ˜๋ฆฌ๋ฅผ ๋ฉˆ์ถฅ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ lookUpVersion() ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•ด version ๋ณ€์ˆ˜์— 12๊ฐ€ ์ €์žฅ๋œ ๋‹ค์Œ์—์•ผ ๋น„๋กœ์†Œ print(version) ๋ฌธ์œผ๋กœ ์ด๋ฅผ ์ถœ๋ ฅํ•ฉ๋‹ˆ๋‹ค. +์ด์ฒ˜๋Ÿผ ๋น„๋™๊ธฐ ํ•จ์ˆ˜์—์„œ ์–ด๋–ค ๊ฒฐ๊ณผ๊ฐ’์ด ํ•„์š”ํ•˜๋‹ค๋ฉด ํ•ด๋‹น ์ฝ”๋“œ๋ฅผ await๋กœ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ๋„คํŠธ์›Œํฌ ์ง€์—ฐ ๋“ฑ์œผ๋กœ ์ œ๋Œ€๋กœ ๋œ ๊ฐ’์„ ๋ฐ˜ํ™˜๋ฐ›์ง€ ๋ชปํ•œ ์ฑ„ ์ดํ›„ ๊ณผ์ •์ด ์‹คํ–‰๋˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. + +์ด๋Ÿฌํ•œ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๋ฅผ ์ด์šฉํ•˜๋ฉด ์ง€์—ฐ์ด ๋ฐœ์ƒํ•˜๋Š” ๋™์•ˆ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ๋ฉˆ์ถฐ ์žˆ์ง€ ์•Š๊ณ  ๋‹ค๋ฅธ ๋™์ž‘์„ ํ•˜๊ฒŒ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. + +### ๋น„๋™๊ธฐ ํ•จ์ˆ˜๊ฐ€ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฐ’ ํ™œ์šฉํ•˜๊ธฐ + +๋น„๋™๊ธฐ ํ•จ์ˆ˜๊ฐ€ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฐ’์„ ์ฒ˜๋ฆฌํ•˜๋ ค๋ฉด then() ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•ฉ๋‹ˆ๋‹ค. + +```dart +void main() async { + await getVersionName().then((value) => { + print(value); + }); + print('end process'); +} + +Future getVersionName() async { + var versionName = await lookUpVersionName(); + return versionName; +} + +String lookUpVersionName() { + return 'Android Q'; +} +``` +```console +์‹คํ–‰ ๊ฒฐ๊ณผ > +Android Q +end process +``` + +์ฝ”๋“œ๋ฅผ ๋ณด๋ฉด Future์ด๋ผ๋Š” ๋ฐ˜ํ™˜๊ฐ’์„ ์ •ํ•ด ๋†“์€ getVersionName() ์ด๋ผ๋Š” ํ•จ์ˆ˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ํ•จ์ˆ˜๋Š” async ํ‚ค์›Œ๋“œ๊ฐ€ ๋ถ™์—ˆ์œผ๋ฏ€๋กœ ๋น„๋™๊ธฐ ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค. ์ด์ฒ˜๋Ÿผ ๋น„๋™๊ธฐ ํ•จ์ˆ˜๊ฐ€ ๋ฐ์ดํ„ฐ๋ฅผ ์„ฑ๊ณต์ ์œผ๋กœ ๋ฐ˜ํ™˜ํ•˜๋ฉด ํ˜ธ์ถœํ•˜๋Š” ์ชฝ์—์„œ then() ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•ด ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. + +then() ์ด์™ธ์— error() ํ•จ์ˆ˜๋„ ์ด์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. error() ํ•จ์ˆ˜๋Š” ์‹คํ–‰ ๊ณผ์ •์—์„œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๋•Œ ํ˜ธ์ถœ๋˜๋ฏ€๋กœ ์ด๋ฅผ ์ด์šฉํ•ด ์˜ˆ์™ธ๋ฅผ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. + +### ๋‹คํŠธ์™€ ์Šค๋ ˆ๋“œ + +๋‹คํŠธ๋Š” **ํ•˜๋‚˜์˜ ์Šค๋ ˆ๋“œ(thread)๋กœ ๋™์ž‘**ํ•˜๋Š” ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์ž…๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ await ํ‚ค์›Œ๋“œ๋ฅผ ์ž˜ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. + +```dart +void main() { + printOne(); + printTwo(); + printThree(); +} + +void printOne() { + print('One'); +} + +void printThree() { + print('Three'); +} + +void printTwo async { + Future.delayed(Duration(seconds: 1), () { + print('Future!!'); + }); + print('Two'); +} +``` +```console +์‹คํ–‰ ๊ฒฐ๊ณผ > +One +Two +Three +Future!! +``` +'One' ์ถœ๋ ฅ ์ดํ›„์— printTwo() ํ•จ์ˆ˜์— ์ง„์ž…ํ•˜๋ฉด Future๋ฅผ 1์ดˆ ์ง€์—ฐํ–ˆ์œผ๋ฏ€๋กœ async๋กœ ์ •์˜ํ•œ ๋น„๋™๊ธฐ ํ•จ์ˆ˜์˜ ํŠน์ง•์— ๋Œ€ํ•ด 'Two'๊ฐ€ ๋จผ์ € ์ถœ๋ ฅ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  'Three'๋ฅผ ์ถœ๋ ฅํ•˜๊ณ  'Future!!'๊ฐ€ ๊ฐ€์žฅ ๋Šฆ๊ฒŒ ์ถœ๋ ฅ๋ฉ๋‹ˆ๋‹ค. + +์ด๋•Œ, printTwo() ํ•จ์ˆ˜๋ฅผ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ˆ˜์ •ํ•œ๋‹ค๋ฉด? +```dart +void printTwo() async { + await Future.delayed(Duration(seconds: 2), () { + print('Future Method'); + }); + print('Two'); +} +``` +Future.delayed() ์ฝ”๋“œ ์•ž์— await ํ‚ค์›Œ๋“œ๋ฅผ ๋ถ™์˜€์œผ๋ฏ€๋กœ ์ดํ›„ ์ฝ”๋“œ์˜ ์‹คํ–‰์ด ๋ฉˆ์ถฅ๋‹ˆ๋‹ค. +๋”ฐ๋ผ์„œ printTwo() ํ•จ์ˆ˜๋ฅผ ๋ฒ—์–ด๋‚˜ main() ํ•จ์ˆ˜์˜ ๋‚˜๋จธ์ง€ ์ฝ”๋“œ๋ฅผ ๋ชจ๋‘ ์‹คํ–‰ํ•˜๊ณ , ๊ทธ ๋‹ค์Œ์— await๊ฐ€ ๋ถ™์€ ์ฝ”๋“œ๋ถ€ํ„ฐ ์ฐจ๋ก€๋Œ€๋กœ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. +```console +์‹คํ–‰ ๊ฒฐ๊ณผ > +One +Three +Future Method +Two +``` +์ด์ฒ˜๋Ÿผ await ํ‚ค์›Œ๋“œ๋ฅผ ์ด์šฉํ•˜๋ฉด await๊ฐ€ ์†ํ•œ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•œ ์ชฝ์˜ ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋๋‚  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฌ๊ธฐ ๋•Œ๋ฌธ์— ์ด๋ฅผ ์ž˜ ๊ณ ๋ คํ•ด์„œ ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. + +--- + +## JSON ๋ฐ์ดํ„ฐ ์ฃผ๊ณ  ๋ฐ›๊ธฐ + +์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ฐœ๋ฐœํ•˜๋‹ค ๋ณด๋ฉด ์„œ๋ฒ„์™€์˜ ํ†ต์‹ ์ด ์ค‘์š”ํ•˜๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ๋Œ€๋ถ€๋ถ„ ์•ฑ์€ ์„œ๋ฒ„์™€ ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ  ๋ฐ›์œผ๋ฉฐ ์ƒํ˜ธ ์ž‘์šฉํ•˜๊ณ  ํ™”๋ฉด์— ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ์ถœ๋ ฅํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ตํ™˜ํ•  ๋•Œ ๊ฐ€์žฅ ๋งŽ์ด ์“ฐ๋Š” ํ˜•์‹์ด **JSON**์ž…๋‹ˆ๋‹ค. +์ง์ ‘ ๋ฌธ์ž์—ด ํ˜•ํƒœ๋‚˜ XML์„ ์ด์šฉํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ  ๋ฐ›๊ธฐ๋„ ํ•˜์ง€๋งŒ, ๊ฐ€์žฅ ํŽธ๋ฆฌํ•˜๋ฉด์„œ ํŒŒ์ผ ํฌ๊ธฐ๋„ ์ž‘์€ JSON ํ˜•์‹์„ ์ฃผ๋กœ ์ด์šฉํ•ฉ๋‹ˆ๋‹ค. ๋‹คํŠธ์—์„œ๋Š” ์ด๋Ÿฌํ•œ JSON ํ†ต์‹ ์„ ๊ฐ„ํŽธํ•˜๊ฒŒ ์ด์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. +JSON์„ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ์†Œ์Šค์— convert๋ผ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ํฌํ•จํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. +```dart +import 'dart:conver'; + +void main() { + var jsonString = ''' + [ + {"score": 40}, + {"score": 80} + ] + '''; + var scores = jsonDecode(jsonString); + print(scores is List); // true + var firstScore = scores[0]; + print(firstScore is Map); // true + print(firstScore['score'] == 40); // true +} +``` +์œ„ ์ฝ”๋“œ์—์„œ jsonString ๋ณ€์ˆ˜์— ์ €์žฅ๋œ ๋ฐ์ดํ„ฐ๊ฐ€ JSON์„ ํ˜•ํƒœ์˜ ๋ฌธ์ž์—ด์ž…๋‹ˆ๋‹ค. ์ด ๋ฐ์ดํ„ฐ๋ฅผ convert ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ์žˆ๋Š” jsonDecode() ํ•จ์ˆ˜์— ์ „๋‹ฌํ•œ ํ›„ ๊ทธ ๊ฒฐ๊ณผ๋ฅผ scores ๋ณ€์ˆ˜์— ์ €์žฅํ–ˆ์Šต๋‹ˆ๋‹ค. jsonDecode() ํ•จ์ˆ˜๋Š” JSON ํ˜•ํƒœ์˜ ๋ฐ์ดํ„ฐ๋ฅผ dynamic ํ˜•์‹์˜ ๋ฆฌ์ŠคํŠธ๋กœ ๋ณ€ํ™˜ํ•ด์„œ ๋ฐ˜ํ™˜ํ•ด ์ค๋‹ˆ๋‹ค. +scores ๋ณ€์ˆ˜๊ฐ€ ๋ฆฌ์ŠคํŠธ์ธ์ง€๋Š” True/False๋กœ ์ ๊ฒ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. + +๊ทธ๋ฆฌ๊ณ  scores ๋ฆฌ์ŠคํŠธ์—์„œ ์ฒซ ๋ฒˆ์งธ ๊ฐ’์„ firstScore์— ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ฐ’์€ ํ‚ค(key)์™€ ๊ฐ’(values)์ด ์žˆ๋Š” Map ํ˜•ํƒœ์ž…๋‹ˆ๋‹ค. print(firstScore['score'] == 40) ์ฝ”๋“œ๋Š” firstScore ๋ฐ์ดํ„ฐ์˜ score ํ‚ค์— ํ•ด๋‹นํ•˜๋Š” ๊ฐ’์ด 40์ด๋ผ๋Š” ๊ฒƒ์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. ์ด์ฒ˜๋Ÿผ jsonDecode() ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•˜๋ฉด ์„œ๋ฒ„์—์„œ JSON ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์•„์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. + +์ด์ œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์„œ๋ฒ„๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด๋‚ด๋Š” ์˜ˆ๋„ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์ด๋•Œ๋Š” jsonEncode() ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•ด JSON ํ˜•ํƒœ๋กœ ๋ณ€ํ™˜ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ์„œ๋ฒ„๋กœ ๋ณด๋‚ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. + +```dart +import 'dart:convert'; + +void main() { + var scores = [ + {'score': 40}, + {'score': 80}, + {'score': 100, 'overtime': true, 'special_guest': null}, + ]; + + var jsonText = jsonEncode(scores); + print(jsonText == + '[{"score": 40},{"score": 80},' + '{"score": 100, "overtime": true,' + '"special_guest": null}]'); // true ์ถœ๋ ฅ +} +``` + +scores ๋ฐ์ดํ„ฐ๋Š” ๋ฐฐ์—ด๋กœ ์ด๋ฃจ์–ด์กŒ๊ณ  ๊ฐ ํ•ญ๋ชฉ์€ score๊ฐ’์œผ๋กœ ๊ตฌ์„ฑ๋˜๋ฉฐ ๋งˆ์ง€๋ง‰ ํ•ญ๋ชฉ์—๋Š” overtime๊ณผ special_guest๊ฐ’์„ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค. +์•ž์˜ ์ฝ”๋“œ์—์„œ๋Š” {"score": 40}์ฒ˜๋Ÿผ ํ‚ค์— ํฐ๋”ฐ์˜ดํ‘œ๋ฅผ ์‚ฌ์šฉํ•ด JSON ๋ฐ์ดํ„ฐ์ž„์„ ํ‘œ์‹œํ–ˆ๊ณ , ์ง€๊ธˆ ์ฝ”๋“œ๋Š” {'score': 40}์ฒ˜๋Ÿผ ์ž‘์€๋”ฐ์˜ดํ‘œ๋ฅผ ์ด์šฉํ•ด ๋ณ€์ˆ˜์ž„์„ ํ‘œ์‹œํ–ˆ์Šต๋‹ˆ๋‹ค. + +์ด scores ๋ฐ์ดํ„ฐ๋ฅผ ์ธ์ž๋กœ jsonEncode() ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด ํ‚ค๊ฐ’์ด ํฐ๋”ฐ์˜ดํ‘œ๋กœ ๋ฌถ์ด๊ณ  ์ „์ฒด ๋ฐ์ดํ„ฐ๋ฅผ ์ž‘์€๋”ฐ์˜ดํ‘œ๋กœ ํ•œ ๋ฒˆ ๋ฌถ์–ด์„œ JSON ํ˜•ํƒœ์˜ ๋ฐ์ดํ„ฐ๊ฐ€ ๋ฉ๋‹ˆ๋‹ค. +์ด์ฒ˜๋Ÿผ ๋‹คํŠธ๋Š” ๊ฐ„๋‹จํ•˜๊ฒŒ JSON์„ ๋งŒ๋“ค๊ณ  ํŒŒ์‹ฑํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ ๋ฐ›๋Š” ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. + +--- + +## ์ŠคํŠธ๋ฆผ ํ†ต์‹ ํ•˜๊ธฐ + +์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ฐœ๋ฐœํ•˜๋‹ค ๋ณด๋ฉด ๋ฐ์ดํ„ฐ๋ฅผ ์ˆœ์„œ๋Œ€๋กœ ์ฃผ๊ณ ๋ฐ›์•„์•ผ ํ•  ๋•Œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฐ์ดํ„ฐ๋ฅผ ์ˆœ์„œ๋Œ€๋กœ ์ฃผ๊ณ ๋ฐ›์„ ๊ฒƒ์œผ๋กœ ์ƒ๊ฐํ•ด์„œ ํ™”๋ฉด์„ ๊ตฌ์„ฑํ–ˆ๋Š”๋ฐ ๋„คํŠธ์›Œํฌ๋‚˜ ์™€์ดํŒŒ์ด ์—ฐ๊ฒฐ์ด ๋Š๊ธฐ๊ฑฐ๋‚˜ ํŠน์ • API ํ˜ธ์ถœ์ด ๋Šฆ์–ด์ ธ ์ˆœ์„œ๊ฐ€ ๋‹ฌ๋ผ์ง€๋ฉด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์›ํ•˜๋Š” ํ๋ฆ„๋Œ€๋กœ ์ž‘๋™ํ•˜์ง€ ์•Š์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. + +์ด์ฒ˜๋Ÿผ ์ˆœ์„œ๋ฅผ ๋ณด์žฅ๋ฐ›๊ณ  ์‹ถ์„ ๋•Œ ์ŠคํŠธ๋ฆผ(stream)์„ ์ด์šฉํ•ฉ๋‹ˆ๋‹ค. +์ŠคํŠธ๋ฆผ์€ ์ฒ˜์Œ์— ๋„ฃ์€ ๋ฐ์ดํ„ฐ๊ฐ€ ๊บผ๋‚ผ ๋•Œ๋„ ๊ฐ€์žฅ ๋จผ์ € ๋‚˜์˜ค๋Š” ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๋กœ ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ŠคํŠธ๋ฆผ์„ ์ด์šฉํ•˜๋ฉด ๋ฐ์ดํ„ฐ๋ฅผ ์ฐจ๋ก€๋Œ€๋กœ ์ฃผ๊ณ ๋ฐ›๋Š” ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. + +```dart +import 'dart:async'; + +Future sumStream(Stream stream) async { + var sum = 0; + await for (var value in stream) { + print('sumStream : $value'); + sum += value; + } + return sum; +} + +Stream countStream(int to) async* { + for (int i = 0; i <= to; i++) { + print('countStream : $i'); + yield i; + } +} + +main() async { + var stream = countStream(10); + var sum = await sumStream(stream); + print(sum); // 55 +} +``` + +main() ํ•จ์ˆ˜๋ฅผ ์‚ดํŽด๋ณด๋ฉด ๋จผ์ € countStream(10) ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค. ์ด ํ•จ์ˆ˜๋Š” async*dhk yield ํ‚ค์›Œ๋“œ๋ฅผ ์ด์šฉํ•ด ๋น„๋™๊ธฐ ํ•จ์ˆ˜๋กœ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค. ์ด ํ•จ์ˆ˜๋Š” for ๋ฌธ์„ ์ด์šฉํ•ด 1๋ถ€ํ„ฐ intํ˜• ๋งค๊ฐœ๋ณ€์ˆ˜ to๋กœ ์ „๋‹ฌ๋ฐ›์€ ์ˆซ์ž๊นŒ์ง€ ๋ฐ˜๋ณตํ•ฉ๋‹ˆ๋‹ค. + +async* ๋ช…๋ น์–ด๋Š” ์•ž์œผ๋กœ yield๋ฅผ ์ด์šฉํ•ด ์ง€์†์ ์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌํ•˜๊ฒ ๋‹ค๋Š” ์˜๋ฏธ์ž…๋‹ˆ๋‹ค. ์œ„ ์ฝ”๋“œ์—์„œ yield๋Š” intํ˜• i๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š”๋ฐ, return์€ ํ•œ ๋ฒˆ ๋ฐ˜ํ™˜ํ•˜๋ฉด ํ•จ์ˆ˜๊ฐ€ ๋๋‚˜์ง€๋งŒ yield๋Š” ๋ฐ˜ํ™˜ ํ›„์—๋„ ๊ณ„์† ํ•จ์ˆ˜๋ฅผ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค. + +์ด๋ ‡๊ฒŒ ๋ฐ›์€ yield๊ฐ’์„ ์ธ์žใ…— sumStream() ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด ์ด ๊ฐ’์ด ์ „๋‹ฌ๋  ๋•Œ๋งˆ๋‹ค sum ๋ณ€์ˆ˜์— ๋ˆ„์ ํ•ด์„œ ๋ฐ˜ํ™˜ํ•ด ์ค๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  main() ํ•จ์ˆ˜์—์„œ ์ด ๊ฐ’์„ ๋ฐ›์•„์„œ ์ถœ๋ ฅํ•˜๋ฉด 55๊ฐ€ ๋‚˜์˜ต๋‹ˆ๋‹ค. +์ถœ๋ ฅ ๊ฒฐ๊ณผ๋ฅผ ๋ณด๋ฉด ํ•จ์ˆ˜๊ฐ€ ์–ด๋–ค ํ๋ฆ„์œผ๋กœ ์ง„ํ–‰๋˜๋Š”์ง€ ์•Œ ์ˆ˜ ์žˆ์„๊ฒ๋‹ˆ๋‹ค. + +```console +์‹คํ–‰ ๊ฒฐ๊ณผ > +countStream : 1 +sumStream : 1 +countStream : 2 +sumStream : 2 +... +countcountStream : 9 +sumStream : 9 +countStream : 10 +sumStream : 10 +55 +``` +์ด์ฒ˜๋Ÿผ ์ŠคํŠธ๋ฆผ์„ ์ด์šฉํ•˜๋ฉด ๋ฐ์ดํ„ฐ๋ฅผ ์ฐจ๋ก€๋Œ€๋กœ ๋ฐ›์•„์„œ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. + +์•„๋‹ˆ๋ฉด then() ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•ด ์ŠคํŠธ๋ฆผ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. +```dart +main() { + var stream = Stream.fromIterable([1, 2, 3, 4, 5]); + + // ๊ฐ€์žฅ ์•ž์˜ ๋ฐ์ดํ„ฐ ๊ฒฐ๊ณผ: 1 + stream.first.then((value) => print('first: $value')); + // ๊ฐ€์žฅ ๋งˆ์ง€๋ง‰ ๋ฐ์ดํ„ฐ์˜ ๊ฒฐ๊ณผ : 5 + stream.last.then((value) => print('last: $value')); + // ํ˜„์žฌ ์ŠคํŠธ๋ฆผ์ด ๋น„์–ด ์žˆ๋Š”์ง€ ํ™•์ธ: false + stream.isEmpty.then((value) => print('isEmpty: $value')); + // ์ „์ฒด ๊ธธ์ด: 5 + stream.length.then((value) => print('length: $value')); +} +``` +์ฝ”๋“œ๋ฅผ ๋ณด๋ฉด Streamํด๋ž˜์Šค๋ฅผ ์ด์šฉํ•ด ๋ฐฐ์—ด์„ ํ•˜๋‚˜ ๋งŒ๋“  ํ›„ ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•ด์„œ ๊ฐ’์„ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค. +๊ทธ๋Ÿฐ ๋‹ค์Œ then() ํ•จ์ˆ˜๋กœ ๊ฐ€์ ธ๋‹ค ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. +๊ทธ๋Ÿฐ๋ฐ ์ด ์ฝ”๋“œ๋Š” ๊ทธ๋Œ€๋กœ ์‹คํ–‰ํ•˜๋ฉด ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ์ผ๋‹จ ์ŠคํŠธ๋ฆผ์„ ํ†ตํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ฐ์ดํ„ฐ๋Š” ์‚ฌ๋ผ์ง€๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋‹ค์Œ์ฒ˜๋Ÿผ ํ•œ ๋ฒˆ๋งŒ ์‹คํ–‰ํ•˜๋„๋ก ๋ณ€๊ฒฝํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. + +```dart +main() { + var stream = Stream.fromIterable([1, 2, 3, 4, 5]); + + // ๊ฐ€์žฅ ๋งˆ์ง€๋ง‰ ๋ฐ์ดํ„ฐ์˜ ๊ฒฐ๊ณผ: 5 + stream.last.then((value) => print('last: $value')); +} +``` + +์ŠคํŠธ๋ฆผ์€ ์‹ค์‹œ๊ฐ„์œผ๋กœ ์„œ๋ฒ„๋ฅผ ์‚ดํŽด๋ณด๋‹ค๊ฐ€ ์„œ๋ฒ„์—์„œ ๋ฐ์ดํ„ฐ๊ฐ€ ๋ณ€๊ฒฝ๋˜๋ฉด ํ™”๋ฉด์„ ์ƒˆ๋กœ ๊ณ ์นจํ•˜์ง€ ์•Š๋”๋ผ๋„ ์ž๋™์œผ๋กœ ๋ณ€๊ฒฝ๋œ ๋ฐ์ดํ„ฐ๊ฐ€ ๋ฐ˜์˜๋˜์–ด์•ผ ํ•  ๋•Œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์œ ์šฉํ•œ ํด๋ž˜์Šค์ž…๋‹ˆ๋‹ค. + +--- + +## ๋‹คํŠธ ํ”„๋กœ๊ทธ๋žจ ๋งŒ๋“ค๊ธฐ +### 1. ๊ตฌ๊ตฌ๋‹จ ํ”„๋กœ๊ทธ๋žจ ์ž‘์„ฑํ•˜๊ธฐ +```dart +void main() { + for(int i = 0; i <= 9; i++) { + for(int j = 0; j <=9; j++) { + print('$i * $j = ${i * j}'); + } + } +} +``` + +### 2. ์ž๋™์ฐจ ํด๋ž˜์Šค ๊ตฌํ˜„ํ•˜๊ธฐ +๋‹ค์Œ๊ณผ ๊ฐ™์€ ์†์„ฑ์„ ํฌํ•จํ•˜๋Š” ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค์–ด ๋ด…๋‹ˆ๋‹ค. +| ์ด๋ฆ„ | ์ž๋ฃŒํ˜• | ์˜๋ฏธ | +|:---:|:----:|:---:| +|maxSpeed|int|์ตœ๊ณ  ์†๋„| +|price|num|๊ฐ€๊ฒฉ| +|name|String|์ด๋ฆ„| + +Car ํด๋ž˜์Šค ์•ˆ์— saleCar()๋ผ๋Š” ์ด๋ฆ„์œผ๋กœ ํ•จ์ˆ˜๋ฅผ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค. ์ด ํ•จ์ˆ˜๋Š” ์ž๋™์ฐจ ๊ฐ€๊ฒฉ์„ 10% ํ• ์ธํ•ด์„œ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  main() ํ•จ์ˆ˜์—์„œ Car ํด๋ž˜์Šค๋ฅผ ์ด์šฉํ•ด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์†์„ฑ๊ฐ’์œผ๋กœ 3์ข…๋ฅ˜์˜ ์ž๋™์ฐจ๋ฅผ ์„ ์–ธํ•ฉ๋‹ˆ๋‹ค. ์ƒˆ๋กœ์šด ๊ฐ์ฒด๋ฅผ ์„ ์–ธํ•  ๋•Œ ์ž๋ฐ”์—์„ ๋Š” new๋ผ๋Š” ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์ง€๋งŒ ๋‹คํŠธ์—์„œ๋Š” ์ƒ๋žตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฌผ๋ก  ์‚ฌ์šฉํ•ด๋„ ๋ฌด๋ฐฉํ•ฉ๋‹ˆ๋‹ค. + +|maxSpeed|price|name| +|:----:|:----:|:----:| +|320|100000|BMW| +|250|70000|BENZ| +|200|80000|FORD| + +BMW๋ฅผ 3๋ฒˆ ํ• ์ธํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•œ ๋’ค์— ์ฐจ๋Ÿ‰ ๊ฐ€๊ฒฉ์„ ์ถœ๋ ฅํ•ด๋ด…๋‹ˆ๋‹ค. + +```dart +void main() { + Car bmw = Car(320, 100000, BMW); + Car benz = Car(250, 70000, BENZ); + Car ford = Car(200, 80000, FORD); + + bmw.saleCar(); + bmw.saleCar(); + bmw.saleCar(); + print(bmw.price); +} + +class Car { + int maxSpeed; + num price; + String name; + + Car(int maxSpeed, num price, String name) { + this.maxSpeed = maxSpeed; + this.price = price; + this.name = name; + } + + num saleCar() { + price = price * 0.9; + return price; + } +} +``` + +### 3. ๋กœ๋˜ ๋ฒˆํ˜ธ ์ƒ์„ฑ๊ธฐ +๋ฌด์ž‘์œ„ ์ˆ˜๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋žœ๋ค ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•˜๋ ค๋ฉด dart:math ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. +import 'dart:math' as math; +as math ์ฝ”๋“œ๋Š” importํ•œ dart:math ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ math๋ผ๋Š” ์ด๋ฆ„์œผ๋กœ ์‚ฌ์šฉํ•˜๊ฒ ๋‹ค๋Š” ์˜๋ฏธ์ž…๋‹ˆ๋‹ค. ์ด math๋ฅผ ์ด์šฉํ•ด 6๊ฐœ์˜ ๋ฌด์ž‘์œ„ ์ˆ˜๋ฅผ ๋งŒ๋“œ๋Š” ๋กœ๋˜ ๋ฒˆํ˜ธ ์ƒ์„ฑ๊ธฐ๋ฅผ ๋งŒ๋“ค์–ด ๋ด…์‹œ๋‹ค. ๋งŒ์•ฝ, ์ƒ์„ฑํ•œ ๋ฒˆํ˜ธ๊ฐ€ ์ค‘๋ณต์ผ ๊ฒฝ์šฐ์—๋Š” ๋‹ค์‹œ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. + +```dart +import 'dart:collection'; +import 'dart:math' as math; + +void main() { + var rand = math.Random(); + HashSet lotteryNumber HashSet(); + + while(lotteryNumber.length < 6) { + lotteyNumber.add(rand.nextInt(45) + 1); + } + print(lotteryNumber); +} +``` +```console +์‹คํ–‰ ๊ฒฐ๊ณผ > +{2, 9, 13, 24, 33, 42} +``` + +HashSet๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด dart:collection์ด๋ผ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ importํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. diff --git a/src/content/blog/dev/sideprojects/2022-11-01-glotto.md b/src/content/blog/dev/sideprojects/2022-11-01-glotto.md new file mode 100644 index 0000000..c674c36 --- /dev/null +++ b/src/content/blog/dev/sideprojects/2022-11-01-glotto.md @@ -0,0 +1,47 @@ +--- +title: GLotto +date: 2022-11-01 +tags: sideprojects, ๊ฐœ๋ฐœ +excerpt: GLotto ์ถ”์ฒจ๊ธฐ์— ๋Œ€ํ•œ ์•„์ด๋””์–ด +--- +# ์‚ฌ์ด๋“œ ํ”„๋กœ์ ํŠธ - GLotto ์ถ”์ฒจ๊ธฐ +## GLotto ๊ฐœ์š” + +์‚ฌ์ด๋“œ ํ”„๋กœ์ ํŠธ๋ฅผ ์‹œ์ž‘ํ•˜๋ฉด์„œ ์ œ์ผ ๋จผ์ € ๋งŒ๋“ค์–ด๋ณผ ์ˆ˜ ์žˆ๋Š”๊ฒŒ ๋ฌด์—‡์ด ์žˆ์„๊นŒ ์ƒ๊ฐํ•ด๋ณด์•˜๋‹ค.
+๊ทธ๋ž˜์„œ ์ƒ๊ฐํ•œ๊ฒŒ ๋กœ๋˜ ์ถ”์ฒจ๊ธฐ๋ฅผ ์ด์ „ ๋ฐ์ดํ„ฐ๋ฅผ ํ†ต๊ณ„์  ๊ธฐ๋ฐ˜์œผ๋กœ ์ถ”์ฒจํ•ด์ฃผ๋Š” ์ถ”์ฒจ๊ธฐ๋ฅผ ๋งŒ๋“ค์–ด๋ณด๋ฉด ์–ด๋–จ๊นŒ๋ผ๊ณ  ์ƒ๊ฐ์„ ํ•ด๋ณด์•˜๋‹ค.
+ +์‚ฌ์‹ค ๋กœ๋˜๋ผ๋Š”๊ฒŒ ๋…๋ฆฝ์  ์ˆ˜ํ–‰์ด๊ธฐ ๋•Œ๋ฌธ์— ์ด์ „์˜ ๊ฒฐ๊ณผ๊ฐ€ ์ดํ›„์˜ ๊ฒฐ๊ณผ์— ์˜ํ–ฅ์„ ๋ฏธ์น˜์ง€๋Š” ์•Š๋‹ค๋Š”๊ฒƒ์„ ์•Œ์ง€๋งŒ ์ด๊ฒƒ์„ ํ†ต๊ณ„์ ์œผ๋กœ ๋ˆ„์ ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๋ฒˆํ˜ธ๋ฅผ ๋ฝ‘์•„๋‚ผ ์ˆ˜ ์žˆ๋‹ค๋ฉด ์–ด๋–จ๊นŒ๋ผ๊ณ  ์ƒ๊ฐํ•˜๋ฉด์„œ ์‹œ์ž‘ํ•˜๊ฒŒ ๋˜์—ˆ๋‹ค.
+์ด์ „์˜ ๋ฐ์ดํ„ฐ๋ฅผ ํ•™์Šต์‹œํ‚ค๊ณ  ์ด ๋ฐ์ดํ„ฐ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ†ต๊ณ„์— ๊ทผ๊ฑฐํ•˜์—ฌ ์ข€ ๋” ๋งž์•„ ๋–จ์–ด์ง€๋Š” ๋ฒˆํ˜ธ๋ฅผ ์ƒ์„ฑํ•ด๋‚ด๋ฉด ์–ด๋–จ๊นŒ๋ผ๋Š”๊ฒŒ ์•„์ด๋””์–ด์˜ ์‹œ์ž‘์ด์—ˆ๋‹ค.
+ +--- + +## ์„ค๊ณ„ + - ํด๋ผ์ด์–ธํŠธ : ์•ˆ๋“œ๋กœ์ด๋“œ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ + - ์„œ๋ฒ„ : ์Šคํ”„๋ง ์„œ๋ฒ„ + - ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค : mariaDB + +๊ฐ„๋‹จํžˆ ์–ธ์ œ๋“ ์ง€ ๋“ค๊ณ ๋‹ค๋‹ˆ๋ฉด์„œ ๋ฒˆํ˜ธ๋ฅผ ๋ฐ›์„ ์ˆ˜ ์žˆ๊ณ , ์ด๊ฒƒ์œผ๋กœ ์ˆ˜์ต์„ฑ์„ ๋‚ผ ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด ๋ญ๊ฐ€ ์žˆ์„๊นŒ ๊ณ ๋ฏผํ•˜๋‹ค๋ณด๋‹ˆ ์•ˆ๋“œ๋กœ์ด๋“œ์— ์ถœ์‹œํ•˜์—ฌ ์‚ฌ์šฉํ•ด๋ณด๋ฉด ์–ด๋–จ๊นŒ ์ƒ๊ฐํ•ด๋ณด์•˜๋‹ค. ์•ˆ๋“œ๋กœ์ด๋“œ ์•ฑ ์ถœ์‹œ ๊ฒฝํ—˜๋„ ํ•ด๋ณด๊ณ , ์„œ๋ฒ„์™€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์—ฐ๋™ํ•˜์—ฌ ์ด์ „ ์‹ค์ œ ๋ฐ์ดํ„ฐ๋“ค์€ ์„œ๋ฒ„์— ๊ณ„์†ํ•ด์„œ ๋ˆ„์ ํ•˜๋ฉด์„œ ๋งŒ๋“ค์–ด๋‚ด๋Š” ๊ฒƒ์ด๋‹ค. + +Synology NAS๋ฅผ ํ™œ์šฉํ•˜์—ฌ Spring Server๋ฅผ ๊ตฌ๋™ํ•˜๊ณ , MariaDB๋ฅผ ๊ตฌ์ถ•ํ•˜์—ฌ ํ•ด๋‹น ์„œ๋น„์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๊ณ ์ž ํ•œ๋‹ค.
+(์ง„์ž‘์— ์ด๋ ‡๊ฒŒ ์ข€ ํ™œ์šฉํ•ด๋ณด์ง€ NAS์‚ฌ๊ณ  ์ง€๊ธˆ๊นŒ์ง€ ๊ทธ๋ƒฅ ์ €์žฅ์†Œ๋กœ๋งŒ ์‚ฌ์šฉํ•˜๋‹ค๋‹ˆ ๋ฉ์ถฉ..) + +--- + +## ๊ตฌํ˜„ +### ํด๋ผ์ด์–ธํŠธ +์ด ์‚ฌ์ด๋“œ ํ”„๋กœ์ ํŠธ๋ฅผ ์ œ์ผ ๋จผ์ € ํ•˜๊ฒŒ๋œ ์ด์œ ๋Š” ์•ž์œผ๋กœ ์‚ฌ์ด๋“œ ํ”„๋กœ์ ํŠธ๋ฅผ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด ํฌํ† ์ƒต์„ ํ•„์ˆ˜์ ์œผ๋กœ ๋ฐฐ์šธ์ˆ˜๋ฐ–์— ์—†๊ฒŒ ๋˜์—ˆ๋Š”๋ฐ, ๊ฐ€์žฅ ๊ฐ„๋‹จํ•˜๊ฒŒ UI๋ฅผ ๋ฝ‘์•„๋‚ผ ์ˆ˜ ์žˆ์„๊ฒƒ ๊ฐ™์•„์„œ์ด๋‹ค. + +๊ทธ๋ƒฅ ๋กœ๋˜ ๊ณต๋งŒ ๊ทธ๋ ค์„œ ๋ฒˆํ˜ธ๋ฅผ ๋ฟŒ๋ ค์ฃผ๊ฑฐ๋‚˜ ๋กœ๋˜ ์šฉ์ง€๋ฅผ ๊ทธ๋ ค์„œ ์œ„์— ๋ฟŒ๋ ค์ฃผ๋ฉด ๋˜๋‹ˆ ์ฐธ ์‰ฝ์ง€ ์•Š์€๊ฐ€?
+๊ทธ ์™ธ์— ๋‹ค๋ฅธ ์•ฑ์ ์ธ ์š”์†Œ๋Š” Material 3.0์„ ์ ๊ทน ํ™œ์šฉํ•ด๋ณด๋ ค๊ณ  ํ•œ๋‹ค.
+ +### ์„œ๋ฒ„ +์‚ฌ์‹ค ์ œ์ผ ๊ฑฑ์ •๋˜๋Š” ๋ถ€๋ถ„์ด ์ด ๋ถ€๋ถ„์ด์—ˆ๋‹ค. ๋‚˜๋งŒ์˜ ์„œ๋ฒ„๋ฅผ ๊ตฌ์ถ•ํ•˜์—ฌ ์„œ๋น„์Šค๋ฅผ ๋งŒ๋“ค์–ด๋‚ธ๋‹ค๋Š”๊ฒƒ ์ž์ฒด๊ฐ€ ๊ฒฝํ—˜์ด ๋งŽ์ด ๋ถ€์กฑํ•˜๊ณ , ์ด์ „์— ๋ฐฐ์› ๋˜ Spring ๋‚ด์šฉ์€ ๋‚ด ๋จธ๋ฆฟ์†์— ๊ฑฐ์˜ ๋‚จ์•„์žˆ์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์ด๋ž„๊นŒ....?
+๊ทธ๋ž˜๋„ NAS์— Spring war๋ฅผ ์˜ฌ๋ ค์„œ ๊ตฌ๋™ํ•  ์ˆ˜ ์žˆ๊ฒŒ๋” ์ œ๊ณตํ•˜๊ณ  ์žˆ์–ด์„œ ๋‹คํ–‰์ด์—ˆ๋‹ค.
+์„œ๋ฒ„๋ฅผ ๋”ฐ๋กœ ๊ตฌ์ž…ํ•˜๊ธฐ์—๋Š” ์ข€...๐Ÿ˜•
+ +### ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค +๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋Š” NAS์— MediaWiki๋ฅผ ๋งŒ๋“ค์–ด๋ณธ ๊ฒฝํ—˜์ด ์žˆ์—ˆ๊ธฐ ๋•Œ๋ฌธ์— MariaDB๋ฅผ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉํ•˜๊ธฐ๋กœ ํ–ˆ๋‹ค. ๊ทธ๋‚˜๋งˆ ์•Œ๊ณ  ์žˆ๋Š”๊ฒŒ SQL๋ฌธ์ด๊ธฐ ๋•Œ๋ฌธ์— ์ ๊ทน์ ์œผ๋กœ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๊ณ , ์‚ฌ์‹ค ์ถ”์ฒจ ๋ฒˆํ˜ธ๋งŒ ์ €์žฅํ•˜๋ฉด ๋˜๊ธฐ ๋•Œ๋ฌธ์— ๊ทธ๋ฆฌ ๋ณต์žกํ•˜์ง€๋„ ์•Š๋‹ค.
+CRUD๋งŒ ๊ตฌํ˜„ํ•ด๋‘๋ฉด ์•ž์œผ๋กœ ๋ณ€๋™ ๊ฐ€๋Šฅํ•œ ๋ถ€๋ถ„๋„ ๋งŽ๊ณ , ์† ์‰ฝ๊ฒŒ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ์„๊ฒƒ ๊ฐ™์•˜๋‹ค.
+ +๋Œ€์ถฉ ์œ„์—์„œ ์ •๋ฆฌํ•œ๋Œ€๋กœ ์ง„ํ–‰ ํ•  ์˜ˆ์ •์ด๊ณ , ๊ฐ€๋Šฅํ•˜๋ฉด ๊ตฌํ˜„ํ•˜๋ฉด์„œ ์ƒˆ๋กญ๊ฒŒ ๋ฐฐ์šด ๋‚ด์šฉ๋“ค๋„ ๊ฐ™์ด ์ •๋ฆฌํ•˜๋ ค๊ณ  ํ•œ๋‹ค.
+์‚ฌ์ด๋“œ ํ”„๋กœ์ ํŠธ ๊ฐ€๋ณด์ž๊ตฌ์šฐ~~~! diff --git a/src/content/blog/dev/sideprojects/2022-11-01-sideprojects-start.md b/src/content/blog/dev/sideprojects/2022-11-01-sideprojects-start.md new file mode 100644 index 0000000..cb9f2cd --- /dev/null +++ b/src/content/blog/dev/sideprojects/2022-11-01-sideprojects-start.md @@ -0,0 +1,28 @@ +--- +title: ์‚ฌ์ด๋“œ ํ”„๋กœ์ ํŠธ ์‹œ์ž‘?! +date: 2022-11-01 +tags: sideprojects, devlog, ?? +excerpt: ์‚ฌ์ด๋“œ ํ”„๋กœ์ ํŠธ ์‹œ์ž‘?! +--- +# ์‚ฌ์ด๋“œ ํ”„๋กœ์ ํŠธ ์‹œ์ž‘?! +## ์‚ฌ์ด๋“œ ํ”„๋กœ์ ํŠธ๋ฅผ ์‹œ์ž‘ํ•˜๊ฒŒ๋œ ๊ณ„๊ธฐ +์‚ฌ์‹ค ์‚ฌ์ด๋“œ ํ”„๋กœ์ ํŠธ๋ฅผ ์‹œ์ž‘ํ•˜๋ ค๊ณ  ์ƒ๊ฐํ•˜๊ณ  ๋ฉ”๋ชจ ํ–ˆ๋˜ ๋‚ด์šฉ์€ ๋Š˜ ์žˆ์—ˆ๋‹ค. ๊ทธ๋Ÿผ์—๋„ ์‹œ๊ฐ„์ด ์—†๋‹ค๋Š” ํ•‘๊ณ„๋กœ.. ์•„์ด๋””์–ด๊ฐ€ ์—†๋‹ค๋Š” ํ•‘๊ณ„๋กœ.. ์ฒ˜์Œ๋ถ€ํ„ฐ ๋งŒ๋“ค์–ด ๋ณผ ์—ฌ์œ ๊ฐ€ ์ข€์ฒ˜๋Ÿผ ์ƒ๊ธฐ์ง€ ์•Š์•˜๋‹ค.
+๊ทธ๋ž˜๋„ ๋ญ”๊ฐ€ ์ž‘์€ ํ”„๋กœ์ ํŠธ๋ฅผ ๋งŒ๋“ค๊ธฐ ์‹œ์ž‘ํ•˜๊ณ , ํšŒ์‚ฌ ์ผ์—๋„ ์—ฌ์œ ๊ฐ€ ์ƒ๊ธฐ๊ณ ๋ถ€ํ„ฐ ๋งŒ๋“ค์–ด๋ณด๊ณ  ์‹ถ์—ˆ๋˜๊ฒƒ๋“ค์„ ๋ฆฌ์ŠคํŠธํ™”ํ•˜๊ณ  ์ด๊ฒƒ์„ ์ •๋ฆฌํ•˜๋ฉด์„œ ๋งŒ๋“ค์–ด๊ฐˆ ํ•„์š”์„ฑ์„ ๋А๊ผˆ๋‹ค.
+๋ญ, ์ด๊ฒƒ๋„ ๊ฒฐ๊ตญ์—๋Š” ๋‚ด ๊ฒฝํ—˜์น˜๊ฐ€ ๋  ๊ฒƒ์ด๋‹ˆ๊นŒ? + +## ์‚ฌ์ด๋“œ ํ”„๋กœ์ ํŠธ ๊ณ„ํš + - ๋ฆฌ์ŠคํŠธ ์—… + - ์‹คํ˜„ ๊ฐ€๋Šฅ์„ฑ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์šฐ์„ ์ˆœ์œ„ ์ •๋ฆฌ + - ์„ค๊ณ„ + - ํ”„๋กœ์ ํŠธ ๋ณ„ ๊ด€๋ฆฌ + +## ๋ฆฌ์ŠคํŠธ ์—… +์ค‘๊ฐ„ ์ค‘๊ฐ„ ์ƒ๊ฐ๋‚˜๋Š”๋Œ€๋กœ ๋ฆฌ์ŠคํŠธ์—…์„ ์—…๋ฐ์ดํŠธ ํ•  ์˜ˆ์ •์ธ๋ฐ ์šฐ์„  ์ •๋ฆฌํ•œ๊ฒƒ๋“ค์€ ์ด๋ ‡๋‹ค.
+ +![listup](https://gahusb.synology.me:5001/photo/gitBlog/idea-listup.png) + +NAS Note์— ์ •๋ฆฌํ•œ ์•„์ด๋””์–ด์˜ ์ผ๋ถ€์ธ๋ฐ ์ง„์ž‘์— ์ข€ ํ™œ์šฉํ• ๊ป„ ๋„ˆ๋ฌด ๋Šฆ์€๊ฑฐ ์•„๋‹ˆ๋‹ˆ..
+ +## ๊ณ„ํš +์šฐ์„ ์ ์œผ๋กœ ํฌํ† ์ƒต์„ ์•„์ง ๋ฐฐ์šฐ๋Š”์ค‘์ด๊ธฐ ๋•Œ๋ฌธ์— UI์ž‘์—…์ด ์ œ์ผ ๊นŒ๋‹ค๋กญ์ง€ ์•Š์„๊ฒƒ ๊ฐ™์€ ๋กœ๋˜์•ฑ์„ ์ถœ์‹œํ•ด๋ณด๋ ค๊ณ  ํ•œ๋‹ค.
+ํ•ด๋‹น ๋‚ด์šฉ์€ ๋‹ค๋ฅธ ํฌ์ŠคํŠธ๋กœ ์—…๋กœ๋“œ ํ•  ์˜ˆ์ •์ด๋‹ค. diff --git a/src/content/blog/dev/synology/2022-11-23-synology-start.md b/src/content/blog/dev/synology/2022-11-23-synology-start.md new file mode 100644 index 0000000..3d17228 --- /dev/null +++ b/src/content/blog/dev/synology/2022-11-23-synology-start.md @@ -0,0 +1,40 @@ +--- +title: Synology NAS ์‚ฌ์šฉ ์ •๋ฆฌ +date: 2022-11-23 +tags: synology, ๊ฐœ๋ฐœ +excerpt: ์‹œ๋†€๋กœ์ง€ NAS +--- +## ์™œ NAS? +์š”์ฆ˜์—๋Š” ์‚ฌ๋žŒ๋“ค์ด NAS๋ฅผ ๋งŽ์ด๋“ค ํ™œ์šฉํ•˜๊ณ  ์žˆ๋‹ค.
+NAS๋Š” Network Attached Storage์˜ ์•ฝ์ž๋กœ ๋„คํŠธ์›Œํฌ์— ์—ฐ๊ฒฐ๋œ ์ €์žฅ์žฅ์น˜๋กœ ์‚ฌ๋žŒ๋“ค์ด ํ”ํžˆ ์“ฐ๋Š” ํด๋ผ์šฐ๋“œ์˜ ๊ธฐ๋Šฅ์„ ํ•˜๊ณ  ์žˆ๋Š” ์ผ์ข…์˜ ์„œ๋ฒ„์ด๋‹ค. + +๋‹จ์ˆœํžˆ ํด๋ผ์šฐ๋“œ ์„œ๋น„์Šค์™€ ๊ฐ™์ด ์ €์žฅ์†Œ๋กœ ํ™œ์šฉ์„ ๋งŽ์ด ํ•˜๊ณ  ์žˆ์ง€๋งŒ, ๊ทธ ๋ฟ๋งŒ์ด ์•„๋‹Œ ์„œ๋ฒ„ ์šด์˜, DB, ๊ณต์œ  ๋“ฑ์˜ ๋‹ค์–‘ํ•œ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๊ธฐ๋„ ํ•œ๋‹ค.
+๋˜ํ•œ ์–ด๋””์„œ๋“  ์™ธ์žฅํ•˜๋“œ ๊ฐ™์€ ๊ฒƒ์„ ๋ฒˆ๊ฑฐ๋กญ๊ฒŒ ๋“ค๊ณ  ๋‹ค๋‹ˆ์ง€ ์•Š์•„๋„ ๋œ๋‹ค.
+์ด ๋ถ€๋ถ„์ด ๋‚ด๊ฐ€ NAS๋ฅผ ๊ตฌ๋งคํ•œ ์ด์œ  ์ค‘ ํ•˜๋‚˜์ด๋‹ค.
+ +์‚ฌ์‹ค NAS๋ฅผ ๊ตฌ๋งคํ•œ๊ฑด 22๋…„ 05์›”๋กœ ์‚ฌ์šฉํ•œ์ง€๋Š” ๋ฒŒ์จ ๋ฐ˜๋…„์ด ์ง€๋‚ฌ์ง€๋งŒ ์ด์ œ์„œ์•ผ ๊ธ€๋กœ ์ž‘์„ฑํ•˜๋ฉด์„œ ์‚ฌ์šฉํ–ˆ๋˜ ๋ฐฉ์‹์ด๋‚˜ ํ™œ์šฉ๋ฒ•์„ ๊ธ€๋กœ ์ ์–ด๋ณด๋ ค๊ณ  ํ•œ๋‹ค...ใ…Ž
+๊ตฌ๋งคํ•œ ์ด์œ ๋Š” ๊ฐ€์กฑ๋“ค์˜ ์‚ฌ์ง„์„ ์ €์žฅํ•˜๊ณ  ์–ด๋””์„œ๋“  ๊ณต์œ ํ•˜๋ฉด์„œ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•œ ๋ชฉ์ ์ด ์šฐ์„ ์ ์ด๋ฉด์„œ ๋ฌด๋ฃŒ ํด๋ผ์šฐ๋“œ๊ฐ€ ๊ฐ€๋“ ์ฐผ๊ธฐ์— ๋งค๋‹ฌ ์š”๊ธˆ์„ ๋‚ด๋ฉด์„œ ์‚ฌ์šฉํ•˜๊ธฐ ์‹ซ์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ํฐ ์ถœํ˜ˆ์ด ์žˆ๋”๋ผ๊ณ  ๊ตฌ๋งคํ•˜์˜€๋‹ค.
+ +๊ทธ๋Ÿฌ๋ฉด์„œ ๋”๋”์šฑ ์š•์‹ฌ์„ ๋‚ด๋ฉฐ ์‚ฌ์ด๋“œ ํ”„๋กœ์ ํŠธ๋ฅผ ์œ„ํ•œ ์„œ๋ฒ„๋กœ๋„ ํ™œ์šฉํ•˜๋ฉด ์ข‹์„ ๊ฒƒ ๊ฐ™๋‹ค๋Š” ์ƒ๊ฐ์„ ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ด€๋ จ ๊ธฐ๋Šฅ์„ ์ง€์›ํ•˜๋Š” NAS๋ฅผ ์ฐพ์•„๋ณด์•˜๋‹ค.
+(์‹ค์ œ๋กœ ์ด ๊ธ€์„ ์“ฐ๋Š” ์ง€๊ธˆ ์„œ๋ฒ„๋กœ ํ™œ์šฉํ•˜์—ฌ ๊ฐœ๋ฐœํ•œ ํ”„๋กœ์ ํŠธ๊ฐ€ 2~3๊ฐœ๋Š” ๋œ๋‹ค.) + +## Synology +์—ฌ๋Ÿฌ๊ฐ€์ง€ ์žฅ๋น„๋ฅผ ๋น„๊ตํ•˜๋ฉฐ ์ฐพ์•„๋ณด๋‹ค๊ฐ€ Synology ์‚ฌ์˜ ์žฅ๋น„๋ฅผ ๊ตฌ๋งคํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ๋‹ค.
+๊ทธ ์ด์œ ๋Š” DSM์„ผํ„ฐ๋ฅผ ํ†ตํ•ด์„œ ์‚ฌ์šฉํ•˜๊ธฐ ํŽธ๋ฆฌํ•œ UI๋ฅผ ์ œ๊ณตํ•˜๊ณ  ์žˆ์œผ๋ฉฐ, Synology์‚ฌ์˜ ๋‹ค์–‘ํ•œ ๋‚ด๋ถ€ ํŒจํ‚ค์ง€ ๊ธฐ๋Šฅ์„ ํ™œ์šฉํ•˜๋ฉด ์‚ฌ์šฉ ๋ฒ”์œ„์„ฑ์ด ๋ฌด๊ถ๋ฌด์ง„ํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
+ +ํ˜„์žฌ ๊ตฌ๋งคํ•œ NAS๋Š” DS220+ 2Bay ์ œํ’ˆ์œผ๋กœ, ๊ฐ€๊ฒฉ์ ์œผ๋กœ๋„ ๊ทธ๋ ‡๊ณ  ๋‚ด๊ฐ€ ์›ํ•˜๋Š” ๊ธฐ๋Šฅ ์ •๋„๋กœ๋งŒ ์‚ฌ์šฉํ•˜๊ธฐ์— ์ ๋‹นํ•œ ์ œํ’ˆ์ด๋‹ค.
+![DS220+](https://cdn.011st.com/11dims/resize/1000x1000/quality/75/11src/asin/B087ZCBWFH/B.jpg?1669202174482) + +๋‚ด๊ฐ€ NAS๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด์„œ ํ˜„์žฌ ์“ฐ๊ณ  ์žˆ๋Š” ๊ธฐ๋Šฅ๋“ค์€ ์•„๋ž˜์™€ ๊ฐ™๋‹ค.
+> - DS Photo๋ฅผ ํ†ตํ•ด ๊ฐ€์กฑ๋“ค์ด๋ž‘ ์—ฐ๊ฒฐํ•ด์„œ ๋ชจ๋ฐ”์ผ์˜ ์‚ฌ์ง„์„ ์ €์žฅํ•˜๊ณ  ๊ณต์œ ํ•˜๋Š” ๊ธฐ๋Šฅ +> - Video Station ๊ธฐ๋Šฅ์„ ํ†ตํ•ด ๋‚˜๋งŒ์˜ OTT ์„œ๋น„์Šค +> - ๊ฐœ์ธ ํŒŒ์ผ๋“ค์˜ ์ €์žฅ +> - Note Station์„ ํ†ตํ•œ ๋‚˜๋งŒ์˜ ๋…ธํŠธ ์ •๋ฆฌ +> - ์›น ์„œ๋น„์Šค ๊ตฌ๋™ +> - MariaDB ๊ตฌ๋™ +> - ์•ˆ๋“œ๋กœ์ด๋“œ ์•ฑ์„ ์œ„ํ•œ Spring ์„œ๋ฒ„ (์‚ฌ์ด๋“œ ํ”„๋กœ์ ํŠธ) +> - Docker ํ™œ์šฉํ•˜๊ธฐ + +์ด์ œ์™€์„œ ๋ด๋„ ์ฐธ ์•Œ์ฐจ๊ฒŒ ์‚ฌ์šฉํ•œ๊ฒƒ ๊ฐ™์•„์„œ ๋ฟŒ๋“ฏํ•˜๋„ค!
+ +์ด๋ ‡๊ฒŒ ๋‹ค์–‘ํ•˜๊ฒŒ ํ™œ์šฉํ•˜๋ฉด์„œ ์ตํ˜”๋˜ ๊ธฐ๋Šฅ์ด๋‚˜ ๊นŒ๋จน๊ธฐ ์‰ฌ์šด ๊ธฐ๋Šฅ๋“ค์„ ์ •๋ฆฌํ•˜๋ ค๊ณ  ํ•œ๋‹ค.
diff --git a/src/content/blog/ideas/2022-03-17-startideas.md b/src/content/blog/ideas/2022-03-17-startideas.md new file mode 100644 index 0000000..3a8fd9a --- /dev/null +++ b/src/content/blog/ideas/2022-03-17-startideas.md @@ -0,0 +1,12 @@ +--- +title: ์•„์ด๋””์–ด๋‚˜ ๊ธฐ๋ก ์‹œ์ž‘ +date: 2022-03-17 +tags: ์•„์ด๋””์–ด +excerpt: ์•„์ด๋””์–ด๋‚˜ ์ƒ๊ฐ ๊ธฐ๋ก ํฌ์ŠคํŠธ ์‹œ์ž‘ +--- +# ์•„์ด๋””์–ด๋‚˜ ์ƒ๊ฐ ๊ธฐ๋ก ํฌ์ŠคํŠธ ์‹œ์ž‘ +์ผ์ƒ ๊ธฐ๋กํ•˜๋Š” ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ๋งŒ๋“ค๊ณ  ๋‚˜๋‹ˆ ๋‚ด ์ƒ๊ฐ์ด๋‚˜ ์•„์ด๋””์–ด๊ฐ€ ๋– ์˜ค๋ฅด๋ฉด ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋Š” ํŽ˜์ด์ง€๊ฐ€ ์žˆ๋‹ค๋ฉด ์ข‹์„ ๊ฒƒ ๊ฐ™๋‹ค๋Š” ์ƒ๊ฐ์ด ๋“ค์—ˆ๋‹ค. + +ํ‰์†Œ์— ์ด๋Ÿฐ ์ €๋Ÿฐ ์ƒ๊ฐ์„ ๋งŽ์ด ํ•˜๋Š” ๋‚˜๋Š” ์ข‹์€ ์ƒ๊ฐ์ด ๋– ์˜ค๋ฅด๋‹ค๊ฐ€๋„ ๋ฉ”๋ชจ์žฅ์— ์ ๋˜ ์Šต๊ด€์ด ๋ถ€์กฑํ•ด์„œ ๊ธˆ๋ฐฉ ์žŠ๊ณค ํ–ˆ๋Š”๋ฐ, ๊ทธ๋Ÿฐ ์ƒ๊ฐ์„ ๊ฐ„๋‹จํ•˜๊ฒŒ ์ ์„ ์ˆ˜ ์žˆ๋‹ค๋ฉด ์ข‹์„ ๊ฒƒ ๊ฐ™์•„์„œ ๋”ฐ๋กœ ๋ถ„๋ฆฌํ•˜๊ฒŒ ๋˜์—ˆ๋‹ค. + +์ด ๋””๋ ‰ํ† ๋ฆฌ๊ฐ€ ๊ฐ€๋“ ์ฐฐ ์ˆ˜ ์žˆ๋‹ค๋ฉด ์ข‹๊ฒ ๋Š”๊ฑธ.. diff --git a/src/content/blog/study/algorithms/2022-03-08-firsttest.md b/src/content/blog/study/algorithms/2022-03-08-firsttest.md new file mode 100644 index 0000000..1af6ed0 --- /dev/null +++ b/src/content/blog/study/algorithms/2022-03-08-firsttest.md @@ -0,0 +1,17 @@ +--- +title: ์ฒซ ๋ฒˆ์งธ ํ…Œ์ŠคํŠธ +date: 2022-03-08 +tags: algorithms, ๊ณต๋ถ€ +excerpt: Study-Algorithms-test +--- +# Study-Algorithms-test +> ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๊ณต๋ถ€ํ•˜๊ณ  ๊ธฐ๋กํ•˜๋Š” ํŽ˜์ด์ง€๋ฅผ ๋ชจ์•„ ๋†“๋Š”๋‹ค. + +### ์ž‘์„ฑ๋˜๋Š” ๊ธ€ +์ด ๋””๋ ‰ํ† ๋ฆฌ์—๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์— ๋Œ€ํ•ด์„œ ๊ณต๋ถ€ํ•˜๊ณ  ๋‚ด์šฉ์„ ์ •๋ฆฌํ•˜๋ฉด์„œ ๋‚ด๊ฐ€ ์ดํ•ดํ•œ ๋‚ด์šฉ์„ ์ž‘์„ฑํ•˜๋Š” ์ €์žฅ์†Œ์ด๋‹ค. + +์ง€๊ธˆ๊นŒ์ง€๋Š” ๋จธ๋ฆฌ์†์œผ๋กœ ์ดํ•ดํ•˜๊ณ  ๊ทธ๊ฒƒ์„ ํ™œ์šฉํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ๊ณต๋ถ€๋ฅผ ํ–ˆ์ง€๋งŒ ์„ฑ๊ณผ๊ฐ€ ํ•ญ์ƒ ์ข‹์ง€๋งŒ์€ ์•Š์•˜๋‹ค. + +๊ทธ๋ž˜์„œ ๋‚ด๊ฐ€ ๊ณต๋ถ€ํ•˜๊ณ  ์ดํ•ดํ•œ ๋‚ด์šฉ์„ ๋ฐ”ํƒ•์œผ๋กœ ๊ธ€๋กœ ์ž‘์„ฑํ•˜๋ฉด์„œ ๋‹ค์‹œ ํ•œ ๋ฒˆ ๋– ์˜ฌ๋ฆฌ๊ณ , ์ž‘์„ฑํ•˜๋ฉด์„œ ์ƒ๊ฐ์˜ ์˜ค๋ฅ˜๋ฅผ ์ˆ˜์ •ํ•˜๊ณ , ๋‚จ์—๊ฒŒ ๋ณด์—ฌ์ง€๋Š” ๊ธ€์ด๊ธฐ ๋•Œ๋ฌธ์— ์ •ํ™•ํžˆ ์•Œ์•„์•ผ๋งŒ ํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐ์ด ๋“ ๋‹ค. + +์ด ๊ณต๊ฐ„์„ ๊ฐ€๋“ ์ฑ„์šธ ์ˆ˜ ์žˆ๋„๋ก ๋‹ค์‹œ ํ•œ ๋ฒˆ ๋‹ค์งํ•ด ๋ณธ๋‹ค! diff --git a/src/content/blog/study/algorithms/2022-03-14-greedy.md b/src/content/blog/study/algorithms/2022-03-14-greedy.md new file mode 100644 index 0000000..25df699 --- /dev/null +++ b/src/content/blog/study/algorithms/2022-03-14-greedy.md @@ -0,0 +1,7 @@ +--- +title: Greedy Algorithm +date: 2022-03-14 +tags: algorithms, ๊ณต๋ถ€ +excerpt: ๊ทธ๋ฆฌ๋”” ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋ž€? +--- + diff --git a/src/content/blog/study/algorithms/2022-03-24-arraysort.md b/src/content/blog/study/algorithms/2022-03-24-arraysort.md new file mode 100644 index 0000000..e47d219 --- /dev/null +++ b/src/content/blog/study/algorithms/2022-03-24-arraysort.md @@ -0,0 +1,215 @@ +--- +title: Array Sort +date: 2022-03-24 +tags: algorithms, ๊ณต๋ถ€ +excerpt: sort์— ๋Œ€ํ•œ ์ •๋ฆฌ +--- +# ๊ฐ ์–ธ์–ด๋ณ„ sort์— ๋Œ€ํ•œ ์ •๋ฆฌ +sort๋Š” ์ž์ฃผ ์‚ฌ์šฉํ•˜๋ฉด์„œ๋„ ๋‚˜์ค‘์— ์‚ฌ์šฉ ํ• ๋•Œ๋งˆ๋‹ค ์กฐ๊ธˆ์”ฉ ํ—ท๊ฐˆ๋ฆฌ๋Š” ๋ถ€๋ถ„์ด๋ผ ์ •๋ฆฌํ•ด๋‘˜๊นŒ ํ•œ๋‹ค. + +## JAVA +์ž๋ฐ”์— ์—ฌ๋Ÿฌ๊ฐ€์ง€ ๋ฐฉ์‹์ด ์žˆ๋‹ค. +- Comparator +- Comparable +- Lambda + +### Comparator +Comparator ๋ฐฉ์‹์œผ๋กœ ๋‚ด๊ฐ€ ์ž์ฃผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ์‹์ด๋‹ค. +์ด ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜๋ฉด ๊ฐœ์ธ์ ์œผ๋กœ ๋‚ด๊ฐ€ ์›ํ•˜๋Š” ์ •๋ ฌ ๋ฐฉ์‹์œผ๋กœ ๋ณ€๊ฒฝํ•˜๊ธฐ๋„ ๊ฐ„ํŽธํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. + +์•„๋ž˜ ์ฝ”๋“œ๋ฅผ ๋ณด๋ฉด + +1์ฐจ์› ๋ฐฐ์—ด +```java +import java.util.Arrays; +import java.util.Comparator; + +int N = 10; +int[] arr = new int[N]; + +Arrays.sort(arr, new Comparator) { + @Override + public int compare(Object o1, Object o2) { + return o1 - o2; // ์˜ค๋ฆ„์ฐจ์ˆœ + } +} +``` + +2์ฐจ์› ๋ฐฐ์—ด +```java +import java.util.Arrays; +import java.util.Comparator; + +int N = 10; +int[][] arr = new int[N][N]; + +Arrays.sort(arr, new Comparator) { + @Override + public int compare(int[] o1, int[] o2) { + if(o1[0] == o2[0]) { + return o1[1] - o2[1]; // ์˜ค๋ฆ„์ฐจ์ˆœ + } else { + return o1[0] - o2[0]; + } + } +} +``` + +์œ„ ์†Œ์Šค๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ์˜ค๋ฆ„์ฐจ์ˆœ์œผ๋กœ ๋˜์–ด ์žˆ๊ณ , ๋‚ด๋ฆผ์ฐจ์ˆœ์œผ๋กœ ์ •๋ ฌ์„ ์›ํ•œ๋‹ค๋ฉด ๋ฐ˜๋Œ€๋กœ ๋ฆฌํ„ดํ•ด์ค€๋‹ค. +```java + return o2 - o1; // ๋‚ด๋ฆผ์ฐจ์ˆœ +``` + +๊ธฐ๋ณธ์ ์œผ๋กœ ๋ฆฌํ„ด์˜ ๊ฐ’์ด ์Œ์ˆ˜์ด๋ฉด ์˜ค๋ฆ„์ฐจ์ˆœ, ์–‘์ˆ˜์ด๋ฉด ๋‚ด๋ฆผ์ฐจ์ˆœ์œผ๋กœ ์ •๋ ฌ์ด ๋œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋ฉด ์ดํ•ดํ•˜๊ธฐ ์‰ฝ๋‹ค. + + +### Comparable +Comparable ์ธํ„ฐํŽ˜์ด์Šค์—๋Š” comepareTo() ์ถ”์ƒ๋ฉ”์„œ๋“œ ํ•˜๋‚˜๋งŒ ์กด์žฌํ•œ๋‹ค. + +์ฃผ์–ด์ง„ ๊ฐ์ฒด๋ณด๋‹ค ์ž‘์œผ๋ฉด ์Œ์ˆ˜, ๊ฐ™์œผ๋ฉด0, ํฌ๋ฉด ์–‘์ˆ˜๋ฅผ ๋ฆฌํ„ดํ•œ๋‹ค. + +```java +public class NameCard implements Comparable { + public String name; + public int age; + + public NameCard(String name, int age) { + this.name = name; + this.age = age; + } + + @Override + public int compareTo(NameCard o) { + if(this.age < o.age) { + return -1; + } else (this.age > o.age) { + return 1; + } else + return 0; + } +} + +public class Main { + public static void main(String[] args) { + List list = new ArrayList<>(); + list.add(new NameCard("๊น€์ž๋ฐ”", 9)); + list.add(new NameCard("๋ฐ•ํŒŒ์ด์ฌ", 10)); + list.add(new NameCard("์‹ ์”จ", 1)); + list.add(new NameCard("์–‘์ž์Šค", 7)); + + Collections.sort(list); + + for(NameCard n : list) { + System.out.println(n.name + " " + n.age); + } + } +} +``` + +> Result :
+์‹ ์”จ 1
+์–‘์ž์Šค 7
+๊น€์ž๋ฐ” 9
+๋ฐ•ํŒŒ์ด์ฌ 10
+ + +### Lambda +๋žŒ๋‹ค ๋ฐฉ์‹์œผ๋กœ๋„ ๊ฐ„๊ฒฐํ•˜๊ฒŒ ํ‘œํ˜„ํ•˜์—ฌ ์ •๋ ฌํ•  ์ˆ˜ ์žˆ๋‹ค. + +1์ฐจ์› ๋ฐฐ์—ด +```java +import java.util.Arrays; + +int N = 10; +int[] arr = new int[N]; + +Arrays.sort(arrays, (o1, o2) -> o1 - o2); +``` + +2์ฐจ์› ๋ฐฐ์—ด +```java +import java.util.Arrays; + +int N = 10; +int[] arr = new int[N]; + +Arrays.sort(arrays, (o1, o2) -> o1[0] == o2[0] ? o1[1] - o2[1] : o1[0] - o2[0]); +``` + +๊ฐ™์€ ๋ฐฉ์‹์ด์ง€๋งŒ ์‚ฌ์šฉํ•˜๋ฉด์„œ ๋” ํŽธํ•œ ๋ฐฉ๋ฒ•์œผ๋กœ ์‚ฌ์šฉํ•˜๋ฉด ๋  ๊ฒƒ ๊ฐ™๋‹ค. + +-------- + +## JavaScript +์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ฐฉ์‹์€ ์ตœ๊ทผ์— ์›น ํ”„๋ก ํŠธ ๊ฐœ๋ฐœ์ž๋กœ ์ด์งํ•˜๊ธฐ ์œ„ํ•ด์„œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ํ•˜๋ฉด์„œ ์‚ฌ์šฉํ•ด ๋ณด์•˜๋‹ค. + +```javascript +let arr = []; + +arr.sort([compareFunction]); +``` +**ํŒŒ๋ผ๋ฏธํ„ฐ**
+**compareFunction**
+> ์ •๋ ฌ ์ˆœ์„œ๋ฅผ ์ •์˜ํ•˜๋Š” ํ•จ์ˆ˜
+*์ด ๊ฐ’์ด ์ƒ๋žต๋˜๋ฉด, ๋ฐฐ์—ด์˜ element๋“ค์€ ๋ฌธ์ž์—ด๋กœ ์ทจ๊ธ‰๋˜์–ด ์œ ๋‹ˆ์ฝ”๋“œ ๊ฐ’ ์ˆœ์„œ๋Œ€๋กœ ์ •๋ ฌ๋œ๋‹ค.*
+์ด ํ•จ์ˆ˜๋Š” ๋‘ ๊ฐœ์˜ ๋ฐฐ์—ด element๋ฅผ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ์ž…๋ ฅ ๋ฐ›๋Š”๋‹ค.
+์ด ํ•จ์ˆ˜๊ฐ€ a, b ๋‘๊ฐœ์˜ element๋ฅผ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ์ž…๋ ฅ๋ฐ›์„ ๊ฒฝ์šฐ,
+์ด ํ•จ์ˆ˜๊ฐ€ ๋ฆฌํ„ดํ•˜๋Š” ๊ฐ’์ด 0๋ณด๋‹ค ์ž‘์„ ๊ฒฝ์šฐ, a๊ฐ€ b๋ณด๋‹ค ์•ž์— ์˜ค๋„๋ก ์ •๋ ฌํ•˜๊ณ ,
+์ด ํ•จ์ˆ˜๊ฐ€ ๋ฆฌํ„ดํ•˜๋Š” ๊ฐ’์ด 0๋ณด๋‹ค ํด ๊ฒฝ์šฐ, b๊ฐ€ a๋ณด๋‹ค ์•ž์— ์˜ค๋„๋ก ์ •๋ ฌํ•œ๋‹ค.
+๋งŒ์•ฝ 0์„ ๋ฆฌํ„ดํ•˜๋ฉด, a์™€ b์˜ ์ˆœ์„œ๋ฅผ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š๋Š”๋‹ค.
+ + +**๋ฆฌํ„ด๊ฐ’**
+*compareFunction* ๊ทœ์น™์— ๋”ฐ๋ผ์„œ ์ •๋ ฌ๋œ ๋ฐฐ์—ด์„ ๋ฆฌํ„ดํ•œ๋‹ค.
+์ด๋•Œ, ์›๋ณธ ๋ฐฐ์—ด์ธ arr๊ฐ€ ์ •๋ ฌ์ด ๋˜๊ณ , ๋ฆฌํ„ดํ•˜๋Š” ๊ฐ’ ๋˜ํ•œ ์›๋ณธ ๋ฐฐ์—ด์ธ arr์„ ๊ฐ€๋ฆฌํ‚ค๊ณ  ์žˆ๋‹ค. + +```javascript +const arr1 = [2, 1, 3]; +const arr2 = ['banana', 'apple', 'orange']; + +arr1.sort(); +document.writeln(arr1 + '
'); + +arr2.sort(); +document.writeln(arr2 + '
'); +``` +> Result :
+1, 2, 3
+apple,banana,orange
+ +```javascript +const arr = [2, 1, 3, 10]; + +arr.sort(function(a, b) { + return a - b; +}); +document.writeln(arr + '
'); +``` + +> Result :
+1, 2, 3, 10 + +์ด ๊ฒฝ์šฐ์—๋„ a - b๊ฐ€ ์Œ์ˆ˜๋ฉด ์˜ค๋ฆ„์ฐจ์ˆœ, ์–‘์ˆ˜๋ฉด ๋‚ด๋ฆผ์ฐจ์ˆœ์ด ๋œ๋‹ค. + +๋˜ํ•œ ๊ฐ์ฒด๋กœ ๊ตฌ๋ถ„ํ•˜์—ฌ ์ •๋ ฌํ•˜๋Š” ๋ฐฉ๋ฒ•๋„ ์ƒ๊ฐํ•ด ๋ณผ ์ˆ˜ ์žˆ๋‹ค. + +```javascript +const arr = [ + {name: 'banana', price: 3000}, + {name: 'apple', price: 1000}, + {name: 'orange', price: 500} +]; + +arr.sort(function(a, b) { + return a.price - b.price; +}); +document.writeln(JSON.stringify(arr[0]) + '
'); +``` + +> Result
+{name: 'orange', price: 500}, +{name: 'apple', price: 1000}, +{name: 'banana', price: 3000}, + + +ํ‹€๋ฆฌ๊ฑฐ๋‚˜ ์ด์ƒํ•œ ๋‚ด์šฉ์ด ์žˆ๋‹ค๋ฉด ์•Œ๋ ค์ฃผ์„ธ์š”! diff --git a/src/content/blog/study/algorithmsolutions/2022-03-08-algo-samsung-14501.md b/src/content/blog/study/algorithmsolutions/2022-03-08-algo-samsung-14501.md new file mode 100644 index 0000000..b62f110 --- /dev/null +++ b/src/content/blog/study/algorithmsolutions/2022-03-08-algo-samsung-14501.md @@ -0,0 +1,184 @@ +--- +title: Samsung sorftware Algorithms. 14501 ํ‡ด์‚ฌ +date: 2022-03-08 +tags: algorithmsolutions, ๊ณต๋ถ€ +excerpt: 14501.ํ‡ด์‚ฌ - ์‚ผ์„ฑ๊ธฐ์ถœ๋ฌธ์ œ (from.๋ฐฑ์ค€์•Œ๊ณ ๋ฆฌ์ฆ˜) +--- +# 14501.ํ‡ด์‚ฌ - ์‚ผ์„ฑ๊ธฐ์ถœ๋ฌธ์ œ (from.๋ฐฑ์ค€์•Œ๊ณ ๋ฆฌ์ฆ˜) + +ํ•ด๋‹น ๋ฌธ์ œ๋Š” DP(Dynamic Programing) ๋˜๋Š” ์™„์ „ํƒ์ƒ‰์œผ๋กœ ํ’€ ์ˆ˜ ์žˆ๋Š” ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค. + +์šฐ์„  ๋ฌธ์ œ๋ฅผ DP๋ฅผ ์ด์šฉํ•ด์„œ ํ’€์–ด๋ณด๊ณ , ๊ทธ ๋‹ค์Œ ์™„์ „ํƒ์ƒ‰์„ ์ด์šฉํ•ด์„œ ํ’€์–ด ๋ณด์•˜์Šต๋‹ˆ๋‹ค. + +--- + +### **14051\. ํ‡ด์‚ฌ** + +์ƒ๋‹ด์›์œผ๋กœ ์ผํ•˜๊ณ  ์žˆ๋Š” ๋ฐฑ์ค€์ด๋Š” ํ‡ด์‚ฌ๋ฅผ ํ•˜๋ ค๊ณ  ํ•œ๋‹ค. + +์˜ค๋Š˜๋ถ€ํ„ฐ N+1์ผ์งธ ๋˜๋Š” ๋‚  ํ‡ด์‚ฌ๋ฅผ ํ•˜๊ธฐ ์œ„ํ•ด์„œ, ๋‚จ์€ N์ผ ๋™์•ˆ ์ตœ๋Œ€ํ•œ ๋งŽ์€ ์ƒ๋‹ด์„ ํ•˜๋ ค๊ณ  ํ•œ๋‹ค. + +๋ฐฑ์ค€์ด๋Š” ๋น„์„œ์—๊ฒŒ ์ตœ๋Œ€ํ•œ ๋งŽ์€ ์ƒ๋‹ด์„ ์žก์œผ๋ผ๊ณ  ๋ถ€ํƒ์„ ํ–ˆ๊ณ , ๋น„์„œ๋Š” ํ•˜๋ฃจ์— ํ•˜๋‚˜์”ฉ ์„œ๋กœ ๋‹ค๋ฅธ ์‚ฌ๋žŒ์˜ ์ƒ๋‹ด์„ ์žก์•„๋†“์•˜๋‹ค. + +๊ฐ๊ฐ์˜ ์ƒ๋‹ด์€ ์ƒ๋‹ด์„ ์™„๋ฃŒํ•˜๋Š”๋ฐ ๊ฑธ๋ฆฌ๋Š” ๊ธฐ๊ฐ„ Ti์™€ ์ƒ๋‹ด์„ ํ–ˆ์„ ๋•Œ ๋ฐ›์„ ์ˆ˜ ์žˆ๋Š” ๊ธˆ์•ก Pi๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ๋‹ค. + +N = 7์ธ ๊ฒฝ์šฐ์— ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ƒ๋‹ด ์ผ์ •ํ‘œ๋ฅผ ๋ณด์ž. + +| ย  | 1์ผ | 2์ผ | 3์ผ | 4์ผ | 5์ผ | 6์ผ | 7์ผ | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Ti | 3 | 5 | 1 | 1 | 2 | 4 | 2 | +| Pi | 10 | 20 | 10 | 20 | 15 | 40 | 200 | + +1์ผ์— ์žกํ˜€์žˆ๋Š” ์ƒ๋‹ด์€ ์ด 3์ผ์ด ๊ฑธ๋ฆฌ๋ฉฐ, ์ƒ๋‹ดํ–ˆ์„ ๋•Œ ๋ฐ›์„ ์ˆ˜ ์žˆ๋Š” ๊ธˆ์•ก์€ 10์ด๋‹ค. 5์ผ์— ์žกํ˜€์žˆ๋Š” ์ƒ๋‹ด์€ ์ด 2์ผ์ด ๊ฑธ๋ฆฌ๋ฉฐ, ๋ฐ›์„ ์ˆ˜ ์žˆ๋Š” ๊ธˆ์•ก์€ 15์ด๋‹ค. + +์ƒ๋‹ด์„ ํ•˜๋Š”๋ฐ ํ•„์š”ํ•œ ๊ธฐ๊ฐ„์€ 1์ผ๋ณด๋‹ค ํด ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, ๋ชจ๋“  ์ƒ๋‹ด์„ ํ•  ์ˆ˜๋Š” ์—†๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด์„œ 1์ผ์— ์ƒ๋‹ด์„ ํ•˜๊ฒŒ ๋˜๋ฉด, 2์ผ, 3์ผ์— ์žˆ๋Š” ์ƒ๋‹ด์€ ํ•  ์ˆ˜ ์—†๊ฒŒ ๋œ๋‹ค. 2์ผ์— ์žˆ๋Š” ์ƒ๋‹ด์„ ํ•˜๊ฒŒ ๋˜๋ฉด, 3, 4, 5, 6์ผ์— ์žกํ˜€์žˆ๋Š” ์ƒ๋‹ด์€ ํ•  ์ˆ˜ ์—†๋‹ค. + +๋˜ํ•œ, N+1์ผ์งธ์—๋Š” ํšŒ์‚ฌ์—ย ์—†๊ธฐ ๋•Œ๋ฌธ์—, 6, 7์ผ์— ์žˆ๋Š” ์ƒ๋‹ด์„ ํ•  ์ˆ˜ ์—†๋‹ค. + +ํ‡ด์‚ฌ ์ „์— ํ•  ์ˆ˜ ์žˆ๋Š” ์ƒ๋‹ด์˜ ์ตœ๋Œ€ ์ด์ต์€ 1์ผ, 4์ผ, 5์ผ์— ์žˆ๋Š” ์ƒ๋‹ด์„ ํ•˜๋Š” ๊ฒƒ์ด๋ฉฐ, ์ด๋•Œ์˜ ์ด์ต์€ 10+20+15=45์ด๋‹ค. + +์ƒ๋‹ด์„ ์ ์ ˆํžˆ ํ–ˆ์„ ๋•Œ, ๋ฐฑ์ค€์ด๊ฐ€ ์–ป์„ ์ˆ˜ ์žˆ๋Š” ์ตœ๋Œ€ ์ˆ˜์ต์„ ๊ตฌํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค. + +**์ž…๋ ฅ(Input)** + +์ฒซ์งธ ์ค„์— N (1 โ‰ค N โ‰ค 15)์ด ์ฃผ์–ด์ง„๋‹ค. + +๋‘˜์งธ ์ค„๋ถ€ํ„ฐ N๊ฐœ์˜ ์ค„์— Ti์™€ Pi๊ฐ€ ๊ณต๋ฐฑ์œผ๋กœ ๊ตฌ๋ถ„๋˜์–ด์„œ ์ฃผ์–ด์ง€๋ฉฐ, 1์ผ๋ถ€ํ„ฐ N์ผ๊นŒ์ง€ ์ˆœ์„œ๋Œ€๋กœ ์ฃผ์–ด์ง„๋‹ค. (1 โ‰ค Tiย โ‰ค 5, 1 โ‰ค Piย โ‰คย 1,000) + +**์ถœ๋ ฅ(Output)** + +์ฒซ์งธ ์ค„์— ๋ฐฑ์ค€์ด๊ฐ€ ์–ป์„ ์ˆ˜ ์žˆ๋Š” ์ตœ๋Œ€ ์ด์ต์„ ์ถœ๋ ฅํ•œ๋‹ค. + +--- + +## 1\. DP๋กœ ์ ‘๊ทผ + +ย ํ•ด๋‹น ๋ฌธ์ œ๋Š” ์ฒซ์งธ๋‚ -->๋งˆ์ง€๋ง‰๋‚ ๋กœ ์ ‘๊ทผํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค, ๋งˆ์ง€๋ง‰๋‚ -->์ฒซ์งธ๋‚ ๋กœ ์ ‘๊ทผํ•˜๋Š” ๊ฒƒ์ด ๋” ์‰ฝ์Šต๋‹ˆ๋‹ค. + +7์ผ์— ์žกํ˜€์žˆ๋Š” ์ผ์€ 2์ผ์ด ๊ฑธ๋ฆฌ๊ธฐ ๋•Œ๋ฌธ์— ์•„๋ฌด๋ฆฌ ๊ธˆ์•ก์ด ๋†’๋”๋ผ๋„ ์ง„ํ–‰ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. + +6์ผ์—๋„ 4์ผ์ด ๊ฑธ๋ฆฌ๊ธฐ ๋•Œ๋ฌธ์— N+1 ์ฆ‰, 7์ผ์ด ๋„˜์–ด๊ฐ€๊ธฐ ๋•Œ๋ฌธ์— ์ง„ํ–‰ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. + +5์ผ์—๋Š” 2์ผ์ด ๊ฑธ๋ฆฌ๋Š” ์ผ์ด ์žˆ์Šต๋‹ˆ๋‹ค. 5~6์ผ์— ์ผ์„ ํ•˜๊ณ  ์–ป๋Š” 15์˜ ์ˆ˜์ต์ด ์–ป์„ ์ˆ˜ ์žˆ๋Š” ์ตœ๋Œ€ ์ˆ˜์ต์ž…๋‹ˆ๋‹ค. + +4์ผ์งธ์—๋Š” 1์ผ์งœ๋ฆฌ ์ผ์„ ์ถ”๊ฐ€๋กœ ํ•˜๊ณ , 5์ผ๊นŒ์ง€์˜ ์ผ์— ๋”ํ•ด์ฃผ๋Š” ๊ฒƒ์ด ์ตœ๋Œ€ ์ˆ˜์ต์ด ๋ฉ๋‹ˆ๋‹ค. ์ฆ‰, 20 + 15 = 35 + +3์ผ์งธ์—๋„ 1์ผ์งœ๋ฆฌ ์ผ์„ ์ถ”๊ฐ€๋กœ ํ•˜๊ณ , 4์ผ๊นŒ์ง€์˜ ์ผ์— ๋”ํ•ด์ฃผ๋Š” ๊ฒƒ์ด ์ตœ๋Œ€ ์ˆ˜์ต์ด ๋ฉ๋‹ˆ๋‹ค. 10 + 20 + 15 = 45 + +2์ผ์งธ์—๋Š” 5์ผ์ด ๊ฑธ๋ฆฌ๋Š” ์ผ์ด ์žˆ์Šต๋‹ˆ๋‹ค. 5์ผ์„ ํ–ˆ์„๋•Œ ์ตœ๋Œ€ ์ด์ต๊ณผ ์œ„์—์„œ ํ–ˆ๋˜ ์ผ์ค‘์—์„œ ๋น„๊ต๋ฅผ ํ•ด๋ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. + +2~6์ผ๊นŒ์ง€ ์ผ์„ ํ•ด์„œ ์–ป๋Š” ์ˆ˜์ต์€ 20์ž…๋‹ˆ๋‹ค. + +์ด๊ฒƒ์€ 3~6๊นŒ์ง€ ์„ธ๊ฐ€์ง€ ์ผ์„ ํ•ด์„œ ์–ป๋Š” ์ˆ˜์ต 45์™€ ๋น„๊ตํ•˜๋ฉด ๋‚ฎ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฏ€๋กœ 2์ผ์งธ ์ผ์€ ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. + +1์ผ์งธ์—๋„ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ 3์ผ์ด ๊ฑธ๋ฆฌ๋Š” ์ผ์ด ์žˆ์Šต๋‹ˆ๋‹ค. + +1~3์ผ์„ ์ผ์„ ํ•˜๋ฉด 10์˜ ์ˆ˜์ต์„ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. + +์ด๊ฒƒ์€ 3์ผ์งธ์— ์ผ์„ ํ•˜๋Š” 10์˜ ์ˆ˜์ต๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฏ€๋กœ 1์ผ์งธ์— ์ผ์„ ์„ ํƒํ•˜๋˜์ง€ 3์ผ์งธ์˜ ์ผ์„ ์„ ํƒํ•˜๋˜์ง€ ํ•˜๋ฉด ์ตœ๋Œ€ ์ˆ˜์ต์„ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. + +| ย  | 1์ผ | 2์ผ | 3์ผ | 4์ผ | 5์ผ | 6์ผ | 7์ผ | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Ti | 3 | 5 | 1 | 1 | 2 | 4 | 2 | +| Pi | 10 | 20 | 10 | 20 | 15 | 40 | 200 | +| DP | 45 | 45 | 45 | 35 | 15 | \- | \- | + +์ด๋Ÿฌํ•œ ์กฐ๊ฑด์—์„œ ์œ„์™€ ๊ฐ™์ด ์ตœ๋Œ€ ์ˆ˜์ต์€ 45๊ฐ€ ๋‚˜์˜ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. + +์ด๊ฒƒ์„ ์ฝ”๋“œ๋กœ ํ‘œํ˜„ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. + +--- + +```java +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.util.StringTokenizer; + +/** + * 14501. ํ‡ด์‚ฌ + * @author gahusb + * Input : N - ํ‡ด์‚ฌ์ „๊นŒ์ง€ ๋‚จ์€ ๊ธฐ๊ฐ„, Ti - ์ƒ๋‹ด์„ ์™„๋ฃŒํ•˜๋Š”๋ฐ ๊ฑธ๋ฆฌ๋Š” ๊ธฐ๊ฐ„, Pi - ์ƒ๋‹ด์„ ํ–ˆ์„ ๋•Œ ๋ฐ›์„ ์ˆ˜ ์žˆ๋Š” ๊ธˆ์•ก + * Output : ์ƒ๋‹ด์„ ์ ์ ˆํžˆ ํ–ˆ์„ ๋•Œ, ๋ฐฑ์ค€์ด๊ฐ€ ์–ป์„ ์ˆ˜ ์žˆ๋Š” ์ตœ๋Œ€ ์ˆ˜์ต + * + */ +public class Resignation { + static int[] t, p, dp; + + static void calcMaxIncome(int dDay) { + int next; + + for (int i = dDay; i > 0; i--) { + next = i + t[i]; + if (next > dDay + 1) { + dp[i] = dp[i + 1]; + } else { + dp[i] = dp[i + 1] > dp[next] + p[i] ? dp[i + 1] : dp[next] + p[i]; + } + } + + System.out.println(dp[1]); + } + + public static void main(String[] args) throws IOException { + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + StringTokenizer st = new StringTokenizer(br.readLine()); + + int N = Integer.parseInt(st.nextToken()); + t = new int[N+2]; + p = new int[N+2]; + dp = new int[N+2]; + for (int i = 1; i <= N; i++) { + if (!st.hasMoreTokens()) st = new StringTokenizer(br.readLine()); + t[i] = Integer.parseInt(st.nextToken()); + p[i] = Integer.parseInt(st.nextToken()); + } + + calcMaxIncome(N); + } +} +``` + +--- + +## 2\. ์™„์ „ํƒ์ƒ‰ + +\-- ์™„์ „ ํƒ์ƒ‰์˜ ๋ฐฉ๋ฒ•์€ ๋‚˜์ค‘์— ์ถ”ํ›„ ์—…๋ฐ์ดํŠธ -- + +์ด๊ฒƒ์„ ์ฝ”๋“œ๋กœ ํ‘œํ˜„ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. + +```java +public class Resignation { + static int[] t, p; + static int N, income; + + static void calcMaxIncome(int day, int cost) { + if(day > N) { + return; + } + + income = income > cost ? income : cost; + + for (int i = day; i < N; i++) { + calcMaxIncome(i + t[i], cost + p[i]); + } + } + + public static void main(String[] args) throws IOException { + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + StringTokenizer st = new StringTokenizer(br.readLine()); + + N = Integer.parseInt(st.nextToken()); + t = new int[N]; + p = new int[N]; + for (int i = 0; i < N; i++) { + if (!st.hasMoreTokens()) st = new StringTokenizer(br.readLine()); + t[i] = Integer.parseInt(st.nextToken()); + p[i] = Integer.parseInt(st.nextToken()); + } + + calcMaxIncome(0, 0); + System.out.println(income); + } +} +``` diff --git a/src/content/blog/study/algorithmsolutions/2022-03-08-algo-samsung-14502.md b/src/content/blog/study/algorithmsolutions/2022-03-08-algo-samsung-14502.md new file mode 100644 index 0000000..d19c0d2 --- /dev/null +++ b/src/content/blog/study/algorithmsolutions/2022-03-08-algo-samsung-14502.md @@ -0,0 +1,195 @@ +--- +title: SSamsung sorftware Algorithms. 14502 ์—ฐ๊ตฌ์†Œ +date: 2022-03-08 +tags: algorithmsolutions, ๊ณต๋ถ€ +excerpt: 14502.์—ฐ๊ตฌ์†Œ - ์‚ผ์„ฑ๊ธฐ์ถœ๋ฌธ์ œ (from.๋ฐฑ์ค€์•Œ๊ณ ๋ฆฌ์ฆ˜) +--- +# 14502.์—ฐ๊ตฌ์†Œ - ์‚ผ์„ฑ๊ธฐ์ถœ๋ฌธ์ œ (from.๋ฐฑ์ค€์•Œ๊ณ ๋ฆฌ์ฆ˜) + +ํ•ด๋‹น ๋ฌธ์ œ๋Š” ์™„์ „ํƒ์ƒ‰์œผ๋กœ ํ’€ ์ˆ˜ ์žˆ๋Š” ๋ฌธ์ œ๋‹ค. ๋ฒฝ์„ ์„ธ์šฐ๋Š” ๊ฒฝ์šฐ๋ฅผ ์ „๋ถ€ ํ•ด๋ณด๊ณ  ์•ˆ์ „ ์˜์—ญ์˜ ์ตœ๋Œ€ ํฌ๊ธฐ๋ฅผ ๊ตฌํ•˜๋ฉด ๋œ๋‹ค. + +--- + +### 14502\. ์—ฐ๊ตฌ์†Œ + +์ธ์ฒด์— ์น˜๋ช…์ ์ธ ๋ฐ”์ด๋Ÿฌ์Šค๋ฅผ ์—ฐ๊ตฌํ•˜๋˜ ์—ฐ๊ตฌ์†Œ์—์„œ ๋ฐ”์ด๋Ÿฌ์Šค๊ฐ€ ์œ ์ถœ๋˜์—ˆ๋‹ค. ๋‹คํ–‰ํžˆ ๋ฐ”์ด๋Ÿฌ์Šค๋Š” ์•„์ง ํผ์ง€์ง€ ์•Š์•˜๊ณ , ๋ฐ”์ด๋Ÿฌ์Šค์˜ ํ™•์‚ฐ์„ ๋ง‰๊ธฐ ์œ„ํ•ด์„œ ์—ฐ๊ตฌ์†Œ์— ๋ฒฝ์„ ์„ธ์šฐ๋ ค๊ณ  ํ•œ๋‹ค. + +์—ฐ๊ตฌ์†Œ๋Š” ํฌ๊ธฐ๊ฐ€ Nร—M์ธ ์ง์‚ฌ๊ฐํ˜•์œผ๋กœ ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ง์‚ฌ๊ฐํ˜•์€ 1ร—1 ํฌ๊ธฐ์˜ ์ •์‚ฌ๊ฐํ˜•์œผ๋กœ ๋‚˜๋ˆ„์–ด์ ธ ์žˆ๋‹ค. ์—ฐ๊ตฌ์†Œ๋Š” ๋นˆ ์นธ, ๋ฒฝ์œผ๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ์œผ๋ฉฐ, ๋ฒฝ์€ ์นธ ํ•˜๋‚˜๋ฅผ ๊ฐ€๋“ ์ฐจ์ง€ํ•œ๋‹ค. + +์ผ๋ถ€ ์นธ์€ ๋ฐ”์ด๋Ÿฌ์Šค๊ฐ€ ์กด์žฌํ•˜๋ฉฐ, ์ด ๋ฐ”์ด๋Ÿฌ์Šค๋Š” ์ƒํ•˜์ขŒ์šฐ๋กœ ์ธ์ ‘ํ•œ ๋นˆ ์นธ์œผ๋กœ ๋ชจ๋‘ ํผ์ ธ๋‚˜๊ฐˆ ์ˆ˜ ์žˆ๋‹ค. ์ƒˆ๋กœ ์„ธ์šธ ์ˆ˜ ์žˆ๋Š” ๋ฒฝ์˜ ๊ฐœ์ˆ˜๋Š” 3๊ฐœ์ด๋ฉฐ, ๊ผญ 3๊ฐœ๋ฅผ ์„ธ์›Œ์•ผ ํ•œ๋‹ค. + +์˜ˆ๋ฅผ ๋“ค์–ด, ์•„๋ž˜์™€ ๊ฐ™์ด ์—ฐ๊ตฌ์†Œ๊ฐ€ ์ƒ๊ธด ๊ฒฝ์šฐ๋ฅผ ์‚ดํŽด๋ณด์ž. + +> 2 0 0 0 1 1 0 +> 0 0 1 0 1 2 0 +> 0 1 1 0 1 0 0 +> 0 1 0 0 0 0 0 +> 0 0 0 0 0 1 1 +> 0 1 0 0 0 0 0 +> 0 1 0 0 0 0 0 + +์ด๋•Œ, 0์€ ๋นˆ ์นธ, 1์€ ๋ฒฝ, 2๋Š” ๋ฐ”์ด๋Ÿฌ์Šค๊ฐ€ ์žˆ๋Š” ๊ณณ์ด๋‹ค. ์•„๋ฌด๋Ÿฐ ๋ฒฝ์„ ์„ธ์šฐ์ง€ ์•Š๋Š”๋‹ค๋ฉด, ๋ฐ”์ด๋Ÿฌ์Šค๋Š” ๋ชจ๋“  ๋นˆ ์นธ์œผ๋กœ ํผ์ ธ๋‚˜๊ฐˆ ์ˆ˜ ์žˆ๋‹ค. + +2ํ–‰ 1์—ด, 1ํ–‰ 2์—ด, 4ํ–‰ 6์—ด์— ๋ฒฝ์„ ์„ธ์šด๋‹ค๋ฉด ์ง€๋„์˜ ๋ชจ์–‘์€ ์•„๋ž˜์™€ ๊ฐ™์•„์ง€๊ฒŒ ๋œ๋‹ค. + +> 2 1 0 0 1 1 0 +> 1 0 1 0 1 2 0 +> 0 1 1 0 1 0 0 +> 0 1 0 0 0 1 0 +> 0 0 0 0 0 1 1 +> 0 1 0 0 0 0 0 +> 0 1 0 0 0 0 0 + +๋ฐ”์ด๋Ÿฌ์Šค๊ฐ€ ํผ์ง„ ๋’ค์˜ ๋ชจ์Šต์€ ์•„๋ž˜์™€ ๊ฐ™์•„์ง„๋‹ค. + +> 2 1 0 0 1 1 2 +> 1 0 1 0 1 2 2 +> 0 1 1 0 1 2 2 +> 0 1 0 0 0 1 2 +> 0 0 0 0 0 1 1 +> 0 1 0 0 0 0 0 +> 0 1 0 0 0 0 0 + +๋ฒฝ์„ 3๊ฐœ ์„ธ์šด ๋’ค, ๋ฐ”์ด๋Ÿฌ์Šค๊ฐ€ ํผ์งˆ ์ˆ˜ ์—†๋Š” ๊ณณ์„ ์•ˆ์ „ ์˜์—ญ์ด๋ผ๊ณ  ํ•œ๋‹ค. ์œ„์˜ ์ง€๋„์—์„œ ์•ˆ์ „ ์˜์—ญ์˜ ํฌ๊ธฐ๋Š” 27์ด๋‹ค. + +์—ฐ๊ตฌ์†Œ์˜ ์ง€๋„๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ ์–ป์„ ์ˆ˜ ์žˆ๋Š” ์•ˆ์ „ ์˜์—ญ ํฌ๊ธฐ์˜ ์ตœ๋Œ“๊ฐ’์„ ๊ตฌํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค. + +#### ์ž…๋ ฅ (Input) + +์ฒซ์งธ ์ค„์— ์ง€๋„์˜ ์„ธ๋กœ ํฌ๊ธฐ N๊ณผ ๊ฐ€๋กœ ํฌ๊ธฐ M์ด ์ฃผ์–ด์ง„๋‹ค. (3 โ‰ค N, M โ‰ค 8) + +๋‘˜์งธ ์ค„๋ถ€ํ„ฐ N๊ฐœ์˜ ์ค„์— ์ง€๋„์˜ ๋ชจ์–‘์ด ์ฃผ์–ด์ง„๋‹ค. 0์€ ๋นˆ ์นธ, 1์€ ๋ฒฝ, 2๋Š” ๋ฐ”์ด๋Ÿฌ์Šค๊ฐ€ ์žˆ๋Š” ์œ„์น˜์ด๋‹ค. 2์˜ ๊ฐœ์ˆ˜๋Š” 2๋ณด๋‹ค ํฌ๊ฑฐ๋‚˜ ๊ฐ™๊ณ , 10๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ ๊ฐ™์€ ์ž์—ฐ์ˆ˜์ด๋‹ค. + +๋นˆ ์นธ์˜ ๊ฐœ์ˆ˜๋Š” 3๊ฐœ ์ด์ƒ์ด๋‹ค. + +#### ์ถœ๋ ฅ(Output) + +์ฒซ์งธ ์ค„์— ์–ป์„ ์ˆ˜ ์žˆ๋Š” ์•ˆ์ „ ์˜์—ญ์˜ ์ตœ๋Œ€ ํฌ๊ธฐ๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค. + +--- + +1\. ๋ฌธ์ œํ’€์ด + +์ด ๋ฌธ์ œ๋ฅผ ํ’€๋•Œ์— ์ƒ๊ฐํ•ด์•ผํ•  ๋ถ€๋ถ„์€ ๋‘ ๊ฐ€์ง€ ์ž…๋‹ˆ๋‹ค. + +1. ์ด ์ฐจ์› ๋ฐฐ์—ด๋กœ ์ด๋ฃจ์–ด์ง„ map์— ์ž„์˜์˜ ๋ฒฝ 3๊ฐœ๋ฅผ ์–ด๋–ค ๋ฐฉ์‹์œผ๋กœ ์„ธ์šด๋‹ค๊ณ  ๊ฐ€์ •ํ•  ๊ฒƒ์ธ๊ฐ€? +2. ํ™•์‚ฐ์‹œ ๋ฐฉ๋ฌธ ์ฒดํฌ์™€ ์–ด๋–ป๊ฒŒ ์ „์ฒด์— ๋ฐ”์ด๋Ÿฌ์Šค๋ฅผ ํผ์กŒ๋‹ค๊ณ  ํ• ๊นŒ? + +1๋ฒˆ์€ ์™„์ „ ํƒ์ƒ‰ DFS๋ฅผ ํ†ตํ•ด์„œ ์„ธ์šฐ๊ณ  ํ•ด์ œํ•˜๊ณ ๋ฅผ ํ•˜๋ฉฐ ์žฌ๊ท€๋ฅผ ๋Œ์•„ ์ตœ์ข…์ ์œผ๋กœ ๋ฒฝ์„ 3๊ฐœ ์„ธ์› ์„ ๋•Œ, ํ™•์‚ฐ์„ ์‹คํ–‰ํ•˜์—ฌ ๋‚จ์€ ์•ˆ์ „ ์˜์—ญ์„ ๊ตฌํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. + +2๋ฒˆ์€ ํ™•์‚ฐ์— ๋Œ€ํ•œ ์ขŒํ‘œ๋ฅผ ํ์— ๋‹ด๊ณ , ํ์—์„œ ๋ฐ”์ด๋Ÿฌ์Šค๊ฐ€ ์žˆ๋Š” ๊ณต๊ฐ„์„ ํ•˜๋‚˜์”ฉ ๋นผ์„œ ์ƒ, ํ•˜, ์ขŒ, ์šฐ๋กœ ๋ฐ”์ด๋Ÿฌ์Šค๊ฐ€ ํผ์งˆ ์ˆ˜ ์žˆ๋Š” ๊ณต๊ฐ„์ด๋ฉด ๋งต์— ๊ธฐ๋กํ•˜๊ณ  ํ์— ์ƒˆ๋กœ์šด ๋ฐ”์ด๋Ÿฌ์Šค๋ฅผ ๋„ฃ์–ด์ฃผ๋ฉฐ ํ์— ๋”์ด์ƒ ํ™•์‚ฐํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐ”์ด๋Ÿฌ์Šค๊ฐ€ ์—†์„๋•Œ๊นŒ์ง€ ๋ฐ˜๋ณตํ•˜์—ฌ ํ•ด๊ฒฐํ•ฉ๋‹ˆ๋‹ค. + +์ด๊ฒƒ์„ ์ฝ”๋“œ๋กœ ํ‘œํ˜„ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. + +--- + +```java +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.util.ArrayList; +import java.util.LinkedList; +import java.util.Queue; +import java.util.StringTokenizer; + +public class Institute { + // ๋ฒฝ์„ 3๊ฐœ ์„ธ์šด ๋’ค, ๋ฐ”์ด๋Ÿฌ์Šค๊ฐ€ ํผ์งˆ ์ˆ˜ ์—†๋Š” ๊ณณ์„ ์•ˆ์ „ ์˜์—ญ์ด๋ผ๊ณ  ํ•œ๋‹ค. + // ๋ฐ”์ด๋Ÿฌ์Šค๋Š” ์ƒ, ํ•˜, ์ขŒ, ์šฐ๋กœ ํผ์ ธ ๋‚˜๊ฐ„๋‹ค. + // 0์€ ๋นˆ์นธ, 1์€ ๋ฒฝ, 2๋Š” ๋ฐ”์ด๋Ÿฌ์Šค + static int N, M, safty, listSize; + static ArrayList list, virusList; + static Queue virus; + static int[][] map; + static boolean[][] visited; + static int[][] dif = { + {0, 1, -1, 0}, + {1, 0, 0, -1}, + }; + + static void virus(int cnt, int idx) { + if(cnt == 3) { + visited = new boolean[N][M]; + diffusion(); + int max = searchSafy(); + if(max > safty) safty = max; + return; + } + + if(listSize <= idx) return; + + Block tmp = list.get(idx); + map[tmp.x][tmp.y] = 1; + virus(cnt + 1, idx + 1); + map[tmp.x][tmp.y] = 0; + virus(cnt, idx + 1); + } + + static void diffusion() { + virus.clear(); + + for (int i = 0; i < virusList.size(); i++) { + virus.add(virusList.get(i)); + } + + while(!virus.isEmpty()) { + Block tmp = virus.poll(); + visited[tmp.x][tmp.y] = true; + for (int i = 0; i < 4; i++) { + int nx = tmp.x + dif[0][i]; + int ny = tmp.y + dif[1][i]; + if(0 <= nx && nx < N && 0 <= ny && ny < M && map[nx][ny] == 0 && !visited[nx][ny]) { + visited[nx][ny] = true; + virus.add(new Block(nx, ny)); + } + } + } + } + + static int searchSafy() { + int area = 0; + + for (int i = 0; i < N; i++) { + for (int j = 0; j < M; j++) { + if(map[i][j] == 0 && !visited[i][j]) area++; + } + } + + return area; + } + + public static void main(String[] args) throws IOException { + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + StringTokenizer st = new StringTokenizer(br.readLine()); + + N = Integer.parseInt(st.nextToken()); + M = Integer.parseInt(st.nextToken()); + map = new int[N][M]; + list = new ArrayList<>(); + virusList = new ArrayList<>(); + virus = new LinkedList(); + for (int i = 0; i < N; i++) { + if(!st.hasMoreTokens()) st = new StringTokenizer(br.readLine()); + for (int j = 0; j < M; j++) { + map[i][j] = Integer.parseInt(st.nextToken()); + if(map[i][j] == 0) { + list.add(new Block(i, j)); + listSize++; + } else if(map[i][j] == 2) virusList.add(new Block(i, j)); + } + } + + safty = 0; + virus(0, 0); + + System.out.println(safty); + } + + public static class Block { + int x, y; + public Block(int x, int y) { + this.x = x; + this.y = y; + } + } +} +``` diff --git a/src/content/blog/study/algorithmsolutions/2022-03-09-algo-samsung-14503.md b/src/content/blog/study/algorithmsolutions/2022-03-09-algo-samsung-14503.md new file mode 100644 index 0000000..fffed44 --- /dev/null +++ b/src/content/blog/study/algorithmsolutions/2022-03-09-algo-samsung-14503.md @@ -0,0 +1,152 @@ +--- +title: Samsung sorftware Algorithms. 14503 ๋กœ๋ด‡ ์ฒญ์†Œ๊ธฐ +date: 2022-03-09 +tags: algorithmsolutions, ๊ณต๋ถ€ +excerpt: 14503.๋กœ๋ด‡ ์ฒญ์†Œ๊ธฐ - ์‚ผ์„ฑ๊ธฐ์ถœ๋ฌธ์ œ (from.๋ฐฑ์ค€์•Œ๊ณ ๋ฆฌ์ฆ˜) +--- +# 14503.๋กœ๋ด‡ ์ฒญ์†Œ๊ธฐ - ์‚ผ์„ฑ๊ธฐ์ถœ๋ฌธ์ œ (from.๋ฐฑ์ค€์•Œ๊ณ ๋ฆฌ์ฆ˜) + +ํ•ด๋‹น ๋ฌธ์ œ๋Š” ์‹œ๋ฎฌ๋ ˆ์ด์…˜ ๋ฌธ์ œ๋กœ ๋‹จ๊ณ„๋ณ„๋กœ ์ˆ˜ํ–‰ํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•˜์—ฌ ํ’€ ์ˆ˜ ์žˆ๋Š” ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค. + +--- + +### 14503\. ๋กœ๋ด‡ ์ฒญ์†Œ๊ธฐ + +๋กœ๋ด‡ ์ฒญ์†Œ๊ธฐ๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ, ์ฒญ์†Œํ•˜๋Š” ์˜์—ญ์˜ ๊ฐœ์ˆ˜๋ฅผ ๊ตฌํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค. + +๋กœ๋ด‡ ์ฒญ์†Œ๊ธฐ๊ฐ€ ์žˆ๋Š” ์žฅ์†Œ๋Š” Nร—M ํฌ๊ธฐ์˜ ์ง์‚ฌ๊ฐํ˜•์œผ๋กœ ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์žˆ์œผ๋ฉฐ, 1ร—1ํฌ๊ธฐ์˜ ์ •์‚ฌ๊ฐํ˜• ์นธ์œผ๋กœ ๋‚˜๋ˆ„์–ด์ ธ ์žˆ๋‹ค. ๊ฐ๊ฐ์˜ ์นธ์€ ๋ฒฝ ๋˜๋Š” ๋นˆ ์นธ์ด๋‹ค. ์ฒญ์†Œ๊ธฐ๋Š” ๋ฐ”๋ผ๋ณด๋Š” ๋ฐฉํ–ฅ์ด ์žˆ์œผ๋ฉฐ, ์ด ๋ฐฉํ–ฅ์€ ๋™, ์„œ, ๋‚จ, ๋ถ์ค‘ ํ•˜๋‚˜์ด๋‹ค. ์ง€๋„์˜ ๊ฐ ์นธ์€ (r, c)๋กœ ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์žˆ๊ณ , r์€ ๋ถ์ชฝ์œผ๋กœ๋ถ€ํ„ฐ ๋–จ์–ด์ง„ ์นธ์˜ ๊ฐœ์ˆ˜, c๋Š” ์„œ์ชฝ์œผ๋กœ ๋ถ€ํ„ฐ ๋–จ์–ด์ง„ ์นธ์˜ ๊ฐœ์ˆ˜์ด๋‹ค. + +๋กœ๋ด‡ ์ฒญ์†Œ๊ธฐ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ž‘๋™ํ•œ๋‹ค. + +1. ํ˜„์žฌ ์œ„์น˜๋ฅผ ์ฒญ์†Œํ•œ๋‹ค. +2. ํ˜„์žฌ ์œ„์น˜์—์„œ ํ˜„์žฌ ๋ฐฉํ–ฅ์„ ๊ธฐ์ค€์œผ๋กœ ์™ผ์ชฝ๋ฐฉํ–ฅ๋ถ€ํ„ฐ ์ฐจ๋ก€๋Œ€๋กœ ํƒ์ƒ‰์„ ์ง„ํ–‰ํ•œ๋‹ค. + 1. ์™ผ์ชฝ ๋ฐฉํ–ฅ์— ์•„์ง ์ฒญ์†Œํ•˜์ง€ ์•Š์€ ๊ณต๊ฐ„์ด ์กด์žฌํ•œ๋‹ค๋ฉด, ๊ทธ ๋ฐฉํ–ฅ์œผ๋กœ ํšŒ์ „ํ•œ ๋‹ค์Œ ํ•œ ์นธ์„ ์ „์ง„ํ•˜๊ณ  1๋ฒˆ๋ถ€ํ„ฐ ์ง„ํ–‰ํ•œ๋‹ค. + 2. ์™ผ์ชฝ ๋ฐฉํ–ฅ์— ์ฒญ์†Œํ•  ๊ณต๊ฐ„์ด ์—†๋‹ค๋ฉด, ๊ทธ ๋ฐฉํ–ฅ์œผ๋กœ ํšŒ์ „ํ•˜๊ณ  2๋ฒˆ์œผ๋กœ ๋Œ์•„๊ฐ„๋‹ค. + 3. ๋„ค ๋ฐฉํ–ฅ ๋ชจ๋‘ ์ฒญ์†Œ๊ฐ€ ์ด๋ฏธ ๋˜์–ด์žˆ๊ฑฐ๋‚˜ ๋ฒฝ์ธ ๊ฒฝ์šฐ์—๋Š”, ๋ฐ”๋ผ๋ณด๋Š” ๋ฐฉํ–ฅ์„ ์œ ์ง€ํ•œ ์ฑ„๋กœ ํ•œ ์นธ ํ›„์ง„์„ ํ•˜๊ณ  2๋ฒˆ์œผ๋กœ ๋Œ์•„๊ฐ„๋‹ค. + 4. ๋„ค ๋ฐฉํ–ฅ ๋ชจ๋‘ ์ฒญ์†Œ๊ฐ€ ์ด๋ฏธ ๋˜์–ด์žˆ๊ฑฐ๋‚˜ ๋ฒฝ์ด๋ฉด์„œ, ๋’ค์ชฝ ๋ฐฉํ–ฅ์ด ๋ฒฝ์ด๋ผ ํ›„์ง„๋„ ํ•  ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ์—๋Š” ์ž‘๋™์„ ๋ฉˆ์ถ˜๋‹ค. + +๋กœ๋ด‡ ์ฒญ์†Œ๊ธฐ๋Š” ์ด๋ฏธ ์ฒญ์†Œ๋˜์–ด์žˆ๋Š” ์นธ์„ ๋˜ ์ฒญ์†Œํ•˜์ง€ ์•Š์œผ๋ฉฐ, ๋ฒฝ์„ ํ†ต๊ณผํ•  ์ˆ˜ ์—†๋‹ค. + +#### ์ž…๋ ฅ(Input) + +์ฒซ์งธ ์ค„์— ์„ธ๋กœ ํฌ๊ธฐ N๊ณผ ๊ฐ€๋กœ ํฌ๊ธฐ M์ด ์ฃผ์–ด์ง„๋‹ค. (3 โ‰ค N, M โ‰ค 50) + +๋‘˜์งธ ์ค„์— ๋กœ๋ด‡ ์ฒญ์†Œ๊ธฐ๊ฐ€ ์žˆ๋Š” ์นธ์˜ ์ขŒํ‘œ (r, c)์™€ ๋ฐ”๋ผ๋ณด๋Š” ๋ฐฉํ–ฅ d๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. d๊ฐ€ 0์ธ ๊ฒฝ์šฐ์—๋Š” ๋ถ์ชฝ์„, 1์ธ ๊ฒฝ์šฐ์—๋Š” ๋™์ชฝ์„, 2์ธ ๊ฒฝ์šฐ์—๋Š” ๋‚จ์ชฝ์„, 3์ธ ๊ฒฝ์šฐ์—๋Š” ์„œ์ชฝ์„ ๋ฐ”๋ผ๋ณด๊ณ  ์žˆ๋Š” ๊ฒƒ์ด๋‹ค. + +์…‹์งธ ์ค„๋ถ€ํ„ฐ N๊ฐœ์˜ ์ค„์— ์žฅ์†Œ์˜ ์ƒํƒœ๊ฐ€ ๋ถ์ชฝ๋ถ€ํ„ฐ ๋‚จ์ชฝ ์ˆœ์„œ๋Œ€๋กœ, ๊ฐ ์ค„์€ ์„œ์ชฝ๋ถ€ํ„ฐ ๋™์ชฝ ์ˆœ์„œ๋Œ€๋กœ ์ฃผ์–ด์ง„๋‹ค. ๋นˆ ์นธ์€ 0, ๋ฒฝ์€ 1๋กœ ์ฃผ์–ด์ง„๋‹ค. ์ง€๋„์˜ ์ฒซ ํ–‰, ๋งˆ์ง€๋ง‰ ํ–‰, ์ฒซ ์—ด, ๋งˆ์ง€๋ง‰ ์—ด์— ์žˆ๋Š” ๋ชจ๋“  ์นธ์€ ๋ฒฝ์ด๋‹ค. + +๋กœ๋ด‡ ์ฒญ์†Œ๊ธฐ๊ฐ€ ์žˆ๋Š” ์นธ์˜ ์ƒํƒœ๋Š” ํ•ญ์ƒ ๋นˆ ์นธ์ด๋‹ค. + +#### ์ถœ๋ ฅ(Output) + +์ฒซ์งธ ์ค„์— T์ดˆ๊ฐ€ ์ง€๋‚œ ํ›„ ๊ตฌ์‚ฌ๊ณผ ๋ฐฉ์— ๋‚จ์•„์žˆ๋Š” ๋ฏธ์„ธ๋จผ์ง€์˜ ์–‘์„ ์ถœ๋ ฅํ•œ๋‹ค. + +--- + +### 1\. ๋ฌธ์ œ ํ’€์ด + +์ด ๋ฌธ์ œ๋ฅผ ํ’€๋•Œ์— ์ƒ๊ฐํ•ด์•ผ ํ•  ๊ฒƒ์€ ๋‘ ๊ฐ€์ง€ ์ž…๋‹ˆ๋‹ค. + +1. ์ตœ์ดˆ์˜ ์ž๋ฆฌ๋„ ์ฒญ์†Œ +2. ๋ฐ”๋ผ๋ณด๊ณ  ์žˆ๋Š” ๋ฐฉํ–ฅ์— ๋”ฐ๋ผ์„œ ์™ผ์ชฝ์˜ ์ขŒํ‘œ๋ฅผ ์„ค์ •ํ•˜๋Š” ๊ฒƒ + +์ตœ์ดˆ์— ์ž๋ฆฌ๋ฅผ ์ฒญ์†Œํ•œ๋‹ค๊ณ  ํ•˜๊ณ  map์—์„œ ํ˜„ ์ž๋ฆฌ๋ฅผ ์ฒญ์†Œ ํ•œ๊ฑธ๋กœ ํ‘œ์‹œํ•˜๊ณ  ์Šคํƒ€ํŠธ ํ•ฉ๋‹ˆ๋‹ค. + +๊ทธ๋ฆฌ๊ณ  ๋ฐ”๋ผ๋ณด๊ณ  ์žˆ๋Š” ๋ฐฉํ–ฅ ์™ผ์ชฝ ์ขŒํ‘œ๋ฅผ ๋ฐ”๋ผ๋ณด๊ธฐ ๋•Œ๋ฌธ์— ๋ฐฐ์—ด์— ํ˜„์žฌ ๋ฐ”๋ผ๋ณด๊ณ  ์žˆ๋Š” ๋ฐฉํ–ฅ์„ ์ธ๋ฑ์Šค๋กœ ์™ผ์ชฝ์„ ๋ณด๋Š” ๊ฐ’์„ ๊ณ ์ • ์‹œ์ผœ์ค๋‹ˆ๋‹ค. ์ €๋Š” + +> // ๋ถ - (0,-1), ๋™ - (-1,0), ๋‚จ - (0,1), ์„œ - (1,0) +> static int\[\]\[\] left = { {0, -1, 0, 1}, {-1, 0, 1, 0}, }; + +์œผ๋กœ ๊ณ ์ •์‹œ์ผœ์„œ ์‚ฌ์šฉํ•˜์˜€์Šต๋‹ˆ๋‹ค. + +- ํ˜„์žฌ ๋ถ์ชฝ์„ ๋ฐ”๋ผ๋ณด๊ณ  ์žˆ๊ณ , ์™ผ์ชฝ ๋ฐฉํ–ฅ์„ ํƒ์ƒ‰ํ•˜๋ ค ํ•ฉ๋‹ˆ๋‹ค. +- left\[0\]\[\] ์— ์žˆ๋Š” ๊ฐ’์„ ํ˜„์žฌ ์œ„์น˜์—์„œ ๋”ํ•ด์ฃผ๊ณ , ์ฒญ์†Œ๊ฐ€ ๊ฐ€๋Šฅํ•˜๋ฉด ์ฒญ์†Œ๋ฅผํ•˜๊ณ  ํ•ด๋‹น ๋ฐฉํ–ฅ์œผ๋กœ ๋ณ€๊ฒฝ +- ์ฒญ์†Œ๊ฐ€ ๋ถˆ๊ฐ€๋Šฅํ•˜๋ฉด ํ•ด๋‹น ๋ฐฉํ–ฅ์œผ๋กœ ํšŒ์ „ํ•˜์—ฌ ๋‹ค์‹œ ์ง„ํ–‰ +- ๋„ค ๋ฐฉํ–ฅ ๋ชจ๋‘ ๋ถˆ๊ฐ€ํ•œ ๊ฒƒ์„ ์ฒดํฌํ•˜๊ธฐ ์œ„ํ•ด count ๋ณ€์ˆ˜๋ฅผ ๋‘์–ด ํ™•์ธํ•ด ์ฃผ๊ณ  ๋„ค ๋ฐฉํ–ฅ ์ „๋ถ€ ๋ถˆ๊ฐ€๋Šฅ ํ•˜๋ฉด ํ˜„์žฌ ๋ฐ”๋ผ๋ณด๊ณ  ์žˆ๋Š” ๋ฐฉํ–ฅ์—์„œ ๋’ค๋กœ ํ•œ ์นธ ํ›„์ง„ ํ•ฉ๋‹ˆ๋‹ค. +- ๋งŒ์•ฝ ํ›„์ง„๋„ ๋ชปํ•˜๋ฉด ์ข…๋ฃŒํ•ฉ๋‹ˆ๋‹ค. + +์ด๊ฒƒ์„ ์ฝ”๋“œ๋กœ ํ‘œํ˜„ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. + +--- + +```java +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.util.StringTokenizer; + + +public class Robot_Vaccumcleaner { + // 3 <= N, M <= 50 || 0 - empty, 1 - wall + // d : 0 - North, 1 - East, 2 - South, 3 - West + // ํ˜„์žฌ ์œ„์น˜์—์„œ ํ˜„์žฌ ๋ฐฉํ–ฅ์„ ๊ธฐ์ค€์œผ๋กœ ์™ผ์ชฝ๋ฐฉํ–ฅ๋ถ€ํ„ฐ ์ฐจ๋ก€๋Œ€๋กœ ํƒ์ƒ‰ + // ๋กœ๋ด‡ ์ฒญ์†Œ๊ธฐ๊ฐ€ ์žˆ๋Š” ์นธ์˜ ์ƒํƒœ๋Š” ํ•ญ์ƒ ๋นˆ ์นธ์ด๋‹ค. + static int N, M, r, c, d; + static int clean; + static int[][] map; + // ๋ฐ”๋ผ๋ณด๊ณ  ์žˆ๋Š” ๋ฐฉํ–ฅ์— ๋”ฐ๋ผ์„œ ํƒ์ƒ‰ํ•˜๋Š” ์™ผ์ชฝ์˜ ์ขŒํ‘œ๊ฐ€ ๋‹ค๋ฅด๋‹ค. + // ๋ถ - (0,-1), ๋™ - (-1,0), ๋‚จ - (0,1), ์„œ - (1,0) + static int[][] left = { + {0, -1, 0, 1}, + {-1, 0, 1, 0}, + }; + + static void cleanning() { + int cnt = 0; + while(true) { + int nxR = r + left[0][d]; + int nxC = c + left[1][d]; + if(nxR < 0 || N <= nxR || nxC < 0 || M <= nxC || map[nxR][nxC] == -1 || map[nxR][nxC] == 1) { // ์™ผ์ชฝ์— ์ฒญ์†Œ ํ•  ๊ณต๊ฐ„์ด ์—†๋‹ค๋ฉด, ๊ทธ ์œ„์น˜๋กœ ํšŒ์ „. + if(cnt >= 4) { // ๋„ค ๋ฐฉํ–ฅ ๋ชจ๋‘ ์ฒญ์†Œ๊ฐ€ ๋˜์–ด ์žˆ๊ฑฐ๋‚˜ ๋ฒฝ์ธ๊ฒฝ์šฐ ๋ฐฉํ–ฅ ๊ทธ๋Œ€๋กœ ๋’ค๋กœ ํ›„์ง„ + switch(d) { + case 0: nxR = r + 1; nxC = c; break; + case 1: nxR = r; nxC = c - 1; break; + case 2: nxR = r - 1; nxC = c; break; + case 3: nxR = r; nxC = c + 1; break; + } + if(map[nxR][nxC] == 1) { // ๋„ค ๋ฐฉํ–ฅ ๋ชจ๋‘ ์ฒญ์†Œ๊ฐ€ ๋ญ ์žˆ๊ณ , ๋’ค๊ฐ€ ๋ฒฝ์ธ ๊ฒฝ์šฐ ์ข…๋ฃŒ. + break; + } + r = nxR; c = nxC; + cnt = 0; + } else { + d -= 1; + if(d < 0) d = 3; + cnt++; + } + } else if(map[nxR][nxC] == 0) { // ์™ผ์ชฝ ๋ฐฉํ–ฅ์— ์ฒญ์†Œ ๊ณต๊ฐ„์ด ์กด์žฌํ•œ๋‹ค๋ฉด, + d -= 1; + if(d < 0) d = 3; + map[nxR][nxC] = -1; + clean++; + cnt = 0; + r = nxR; c = nxC; + } + } + } + + public static void main(String[] args) throws IOException { + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + StringTokenizer st = new StringTokenizer(br.readLine()); + + N = Integer.parseInt(st.nextToken()); + M = Integer.parseInt(st.nextToken()); + map = new int[N][M]; + st = new StringTokenizer(br.readLine()); + r = Integer.parseInt(st.nextToken()); + c = Integer.parseInt(st.nextToken()); + d = Integer.parseInt(st.nextToken()); + for (int i = 0; i < N; i++) { + if(!st.hasMoreTokens()) st = new StringTokenizer(br.readLine()); + for (int j = 0; j < M; j++) { + map[i][j] = Integer.parseInt(st.nextToken()); + } + } + + clean = 1; map[r][c] = -1; + cleanning(); + + System.out.println(clean); + } +} +``` diff --git a/src/content/blog/study/algorithmsolutions/2022-03-09-algo-samsung-17144.md b/src/content/blog/study/algorithmsolutions/2022-03-09-algo-samsung-17144.md new file mode 100644 index 0000000..224c371 --- /dev/null +++ b/src/content/blog/study/algorithmsolutions/2022-03-09-algo-samsung-17144.md @@ -0,0 +1,230 @@ +--- +title: Samsung sorftware Algorithms. 17144.๋ฏธ์„ธ๋จผ์ง€ ์•ˆ๋…•! +date: 2022-03-09 +tags: algorithmsolutions, ๊ณต๋ถ€ +excerpt: 17144.๋ฏธ์„ธ๋จผ์ง€ ์•ˆ๋…•! - ์‚ผ์„ฑ๊ธฐ์ถœ๋ฌธ์ œ (from.๋ฐฑ์ค€์•Œ๊ณ ๋ฆฌ์ฆ˜) +--- +# 17144.๋ฏธ์„ธ๋จผ์ง€ ์•ˆ๋…•! - ์‚ผ์„ฑ๊ธฐ์ถœ๋ฌธ์ œ (from.๋ฐฑ์ค€์•Œ๊ณ ๋ฆฌ์ฆ˜) + +ํ•ด๋‹น ๋ฌธ์ œ๋Š” ์‹œ๋ฎฌ๋ ˆ์ด์…˜ ๋ฌธ์ œ๋กœ ๋‹จ๊ณ„๋ณ„๋กœ ์ˆ˜ํ–‰ํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•˜์—ฌ ํ’€ ์ˆ˜ ์žˆ๋Š” ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค. + +--- + +### 17144\. ๋ฏธ์„ธ๋จผ์ง€ ์•ˆ๋…•! + +๋ฏธ์„ธ๋จผ์ง€๋ฅผ ์ œ๊ฑฐํ•˜๊ธฐ ์œ„ํ•ด ๊ตฌ์‚ฌ๊ณผ๋Š” ๊ณต๊ธฐ์ฒญ์ •๊ธฐ๋ฅผ ์„ค์น˜ํ•˜๋ ค๊ณ  ํ•œ๋‹ค. ๊ณต๊ธฐ์ฒญ์ •๊ธฐ์˜ ์„ฑ๋Šฅ์„ ํ…Œ์ŠคํŠธํ•˜๊ธฐ ์œ„ํ•ด ๊ตฌ์‚ฌ๊ณผ๋Š” ์ง‘์„ ํฌ๊ธฐ๊ฐ€ Rร—C์ธ ๊ฒฉ์žํŒ์œผ๋กœ ๋‚˜ํƒ€๋ƒˆ๊ณ , 1ร—1 ํฌ๊ธฐ์˜ ์นธ์œผ๋กœ ๋‚˜๋ˆด๋‹ค. ๊ตฌ์‚ฌ๊ณผ๋Š” ๋›ฐ์–ด๋‚œ ์ฝ”๋”ฉ ์‹ค๋ ฅ์„ ์ด์šฉํ•ด ๊ฐ ์นธ (r, c)์— ์žˆ๋Š” ๋ฏธ์„ธ๋จผ์ง€์˜ ์–‘์„ ์‹ค์‹œ๊ฐ„์œผ๋กœ ๋ชจ๋‹ˆํ„ฐ๋งํ•˜๋Š” ์‹œ์Šคํ…œ์„ ๊ฐœ๋ฐœํ–ˆ๋‹ค. (r, c)๋Š” rํ–‰ c์—ด์„ ์˜๋ฏธํ•œ๋‹ค. + +![Picture](/assets/img/algo_img/17144/17144_1.png) + +๊ณต๊ธฐ์ฒญ์ •๊ธฐ๋Š” ํ•ญ์ƒ 1๋ฒˆ ์—ด์— ์„ค์น˜๋˜์–ด ์žˆ๊ณ , ํฌ๊ธฐ๋Š” ๋‘ ํ–‰์„ ์ฐจ์ง€ํ•œ๋‹ค. ๊ณต๊ธฐ์ฒญ์ •๊ธฐ๊ฐ€ ์„ค์น˜๋˜์–ด ์žˆ์ง€ ์•Š์€ ์นธ์—๋Š” ๋ฏธ์„ธ๋จผ์ง€๊ฐ€ ์žˆ๊ณ , (r, c)์— ์žˆ๋Š” ๋ฏธ์„ธ๋จผ์ง€์˜ ์–‘์€ Ar,c์ด๋‹ค. + +1์ดˆ ๋™์•ˆ ์•„๋ž˜ ์ ํžŒ ์ผ์ด ์ˆœ์„œ๋Œ€๋กœ ์ผ์–ด๋‚œ๋‹ค. + +1. ๋ฏธ์„ธ๋จผ์ง€๊ฐ€ ํ™•์‚ฐ๋œ๋‹ค. ํ™•์‚ฐ์€ ๋ฏธ์„ธ๋จผ์ง€๊ฐ€ ์žˆ๋Š” ๋ชจ๋“  ์นธ์—์„œ ๋™์‹œ์— ์ผ์–ด๋‚œ๋‹ค. + - (r, c)์— ์žˆ๋Š” ๋ฏธ์„ธ๋จผ์ง€๋Š” ์ธ์ ‘ํ•œ ๋„ค ๋ฐฉํ–ฅ์œผ๋กœ ํ™•์‚ฐ๋œ๋‹ค. + - ์ธ์ ‘ํ•œ ๋ฐฉํ–ฅ์— ๊ณต๊ธฐ์ฒญ์ •๊ธฐ๊ฐ€ ์žˆ๊ฑฐ๋‚˜, ์นธ์ด ์—†์œผ๋ฉด ๊ทธ ๋ฐฉํ–ฅ์œผ๋กœ๋Š” ํ™•์‚ฐ์ด ์ผ์–ด๋‚˜์ง€ ์•Š๋Š”๋‹ค. + - ํ™•์‚ฐ๋˜๋Š” ์–‘์€ Ar,c/5์ด๊ณ  ์†Œ์ˆ˜์ ์€ ๋ฒ„๋ฆฐ๋‹ค. + - (r, c)์— ๋‚จ์€ ๋ฏธ์„ธ๋จผ์ง€์˜ ์–‘์€ Ar,c - (Ar,c/5)ร—(ํ™•์‚ฐ๋œ ๋ฐฉํ–ฅ์˜ ๊ฐœ์ˆ˜) ์ด๋‹ค. +2. ๊ณต๊ธฐ์ฒญ์ •๊ธฐ๊ฐ€ ์ž‘๋™ํ•œ๋‹ค. + - ๊ณต๊ธฐ์ฒญ์ •๊ธฐ์—์„œ๋Š” ๋ฐ”๋žŒ์ด ๋‚˜์˜จ๋‹ค. + - ์œ„์ชฝ ๊ณต๊ธฐ์ฒญ์ •๊ธฐ์˜ ๋ฐ”๋žŒ์€ ๋ฐ˜์‹œ๊ณ„๋ฐฉํ–ฅ์œผ๋กœ ์ˆœํ™˜ํ•˜๊ณ , ์•„๋ž˜์ชฝ ๊ณต๊ธฐ์ฒญ์ •๊ธฐ์˜ ๋ฐ”๋žŒ์€ ์‹œ๊ณ„๋ฐฉํ–ฅ์œผ๋กœ ์ˆœํ™˜ํ•œ๋‹ค. + - ๋ฐ”๋žŒ์ด ๋ถˆ๋ฉด ๋ฏธ์„ธ๋จผ์ง€๊ฐ€ ๋ฐ”๋žŒ์˜ ๋ฐฉํ–ฅ๋Œ€๋กœ ๋ชจ๋‘ ํ•œ ์นธ์”ฉ ์ด๋™ํ•œ๋‹ค. + - ๊ณต๊ธฐ์ฒญ์ •๊ธฐ์—์„œ ๋ถ€๋Š” ๋ฐ”๋žŒ์€ ๋ฏธ์„ธ๋จผ์ง€๊ฐ€ ์—†๋Š” ๋ฐ”๋žŒ์ด๊ณ , ๊ณต๊ธฐ์ฒญ์ •๊ธฐ๋กœ ๋“ค์–ด๊ฐ„ ๋ฏธ์„ธ๋จผ์ง€๋Š” ๋ชจ๋‘ ์ •ํ™”๋œ๋‹ค. + +๋‹ค์Œ์€ ํ™•์‚ฐ์˜ ์˜ˆ์‹œ์ด๋‹ค. + +![Picture](/assets/img/algo_img/17144/17144_2.png) + +์™ผ์ชฝ๊ณผ ์˜ค๋ฅธ์ชฝ์— ์นธ์ด ์—†๊ธฐ ๋•Œ๋ฌธ์—, ๋‘ ๋ฐฉํ–ฅ์œผ๋กœ๋งŒ ํ™•์‚ฐ์ด ์ผ์–ด๋‚ฌ๋‹ค. + +![Picture](/assets/img/algo_img/17144/17144_3.png) + +์ธ์ ‘ํ•œ ๋„ค ๋ฐฉํ–ฅ์œผ๋กœ ๋ชจ๋‘ ํ™•์‚ฐ์ด ์ผ์–ด๋‚œ๋‹ค. + +![Picture](/assets/img/algo_img/17144/17144_4.png) + +๊ณต๊ธฐ์ฒญ์ •๊ธฐ๊ฐ€ ์žˆ๋Š” ์นธ์œผ๋กœ๋Š” ํ™•์‚ฐ์ด ์ผ์–ด๋‚˜์ง€ ์•Š๋Š”๋‹ค. + +๊ณต๊ธฐ์ฒญ์ •๊ธฐ์˜ ๋ฐ”๋žŒ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ฐฉํ–ฅ์œผ๋กœ ์ˆœํ™˜ํ•œ๋‹ค. + +![Picture](/assets/img/algo_img/17144/17144_5.png) + +๋ฐฉ์˜ ์ •๋ณด๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ, T์ดˆ๊ฐ€ ์ง€๋‚œ ํ›„ ๊ตฌ์‚ฌ๊ณผ์˜ ๋ฐฉ์— ๋‚จ์•„์žˆ๋Š” ๋ฏธ์„ธ๋จผ์ง€์˜ ์–‘์„ ๊ตฌํ•ด๋ณด์ž. + +#### ์ž…๋ ฅ(Input) + +์ฒซ์งธ ์ค„์— R, C, T (6 โ‰ค R, C โ‰ค 50, 1 โ‰ค T โ‰ค 1,000) ๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. + +๋‘˜์งธ ์ค„๋ถ€ํ„ฐ R๊ฐœ์˜ ์ค„์— Ar,c (-1 โ‰ค Ar,c โ‰ค 1,000)๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. ๊ณต๊ธฐ์ฒญ์ •๊ธฐ๊ฐ€ ์„ค์น˜๋œ ๊ณณ์€ Ar,c๊ฐ€ -1์ด๊ณ , ๋‚˜๋จธ์ง€ ๊ฐ’์€ ๋ฏธ์„ธ๋จผ์ง€์˜ ์–‘์ด๋‹ค. -1์€ 2๋ฒˆ ์œ„์•„๋ž˜๋กœ ๋ถ™์–ด์ ธ ์žˆ๊ณ , ๊ฐ€์žฅ ์œ— ํ–‰, ์•„๋žซ ํ–‰๊ณผ ๋‘ ์นธ์ด์ƒ ๋–จ์–ด์ ธ ์žˆ๋‹ค. + +#### ์ถœ๋ ฅ(Output) + +์ฒซ์งธ ์ค„์— T์ดˆ๊ฐ€ ์ง€๋‚œ ํ›„ ๊ตฌ์‚ฌ๊ณผ ๋ฐฉ์— ๋‚จ์•„์žˆ๋Š” ๋ฏธ์„ธ๋จผ์ง€์˜ ์–‘์„ ์ถœ๋ ฅํ•œ๋‹ค. + +--- + +### 1\. ๋ฌธ์ œ ํ’€์ด + +์ด ๋ฌธ์ œ๋ฅผ ํ’€๋•Œ์— ์ƒ๊ฐํ•ด์•ผํ•  ์ œ์ผ ์ค‘์š”ํ•œ ํ•ต์‹ฌ์€ ๋‘ ๊ฐ€์ง€ ์ž…๋‹ˆ๋‹ค. + +1. ํ™•์‚ฐ์—์„œ ๊ฐ ํ˜„ ์œ„์น˜์˜ ๊ฐ’๋งŒ ๊ณ ๋ คํ•ด์„œ ๊ฒน์น˜๋Š” ์นธ์€ ๋”ํ•ด์ง„๋‹ค. +2. ๊ณต๊ธฐ์ฒญ์ •์‹œ ๋Œ์•„๊ฐ€๋Š” ๋ฐฐ์—ด ๋Œ๋ฆฌ๊ธฐ. + +1๋ฒˆ์€ ํ™•์‚ฐ ์˜ˆ์‹œ 3๋ฒˆ ๊ทธ๋ฆผ์„ ๋ณด์•˜์„๋•Œ + +- (0, 1)์— 30์ด ์„ธ ๋ฐฉํ–ฅ์œผ๋กœ ํ™•์‚ฐ๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์— 30 - ((30/5)\*3) = 12๋ผ๋Š” ๋‚จ๋Š” ๋ถ€๋ถ„๊ณผ ํ™•์‚ฐ๋˜์–ด ์˜ค๋Š” ๋‘ ๋ฐฉํ–ฅ์—์„œ์˜ ๊ณ„์‚ฐ์‹ 11 / 5 = 2, 7 / 5 = 1 ์ฆ‰, 12 + 2 + 1 = 15 +- (0, 2)์— 7์ด ๋‘ ๋ฐฉํ–ฅ์œผ๋กœ ํ™•์‚ฐ๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์— 7 - ((7/5)\*2) = 5๋ผ๋Š” ๋‚จ๋Š” ๋ถ€๋ถ„๊ณผ ํ™•์‚ฐ๋˜์–ด ์˜ค๋Š” ํ•œ ๋ฐฉํ–ฅ์—์„œ์˜ ๊ณ„์‚ฐ์‹ 30/5 = 6 ์ฆ‰, 5 + 6 = 11 + +๋”ฐ๋ผ์„œ ํ•œ ์นธ์”ฉ ์ด๋™ํ•˜๋ฉด์„œ ๊ณ„์‚ฐ์„ ํ•ด์ฃผ๋ฉด ๋ฉ๋‹ˆ๋‹ค. + +2๋ฒˆ์€ ๋ฐฐ์—ด๋Œ๋ฆฌ๊ธฐ ์ž…๋‹ˆ๋‹ค. ๋ฐฐ์—ด์€ ์‚ฌ๊ฐํ˜• ๋ชจ์–‘์œผ๋กœ ๋์„ ๋งŒ๋‚˜๊ธฐ ์ „๊นŒ์ง€ INDEX๋ฅผ ๊ณ„์† ๋ฐ˜๋ณตํ•˜์—ฌ ์ฆ๊ฐ€/๊ฐ์†Œ๋ฅผ ํ•˜๋‹ค๊ฐ€ ๋์ด๋ผ๋Š” ๊ฒฝ๊ณ„๋ฅผ ๋งŒ๋‚˜๋ฉด ๊ฐ ์ธ๋ฑ์Šค์˜ ์ฆ๊ฐ€/๊ฐ์†Œ ํ”Œ๋ž˜๊ทธ๋ฅผ ๋ฐ”๊ฟ”์ฃผ๋ฉด ๋ฉ๋‹ˆ๋‹ค. + +- ์ธ๋ฑ์Šค๋Š” i,j๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค. (์—ฌ๊ธฐ์„œ ๋์€ ๋ฐฐ์—ด ๊ตฌ๋ถ„์„  ์ง์ „๊นŒ์ง€๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰, ์ธ๋ฑ์Šค์˜ ๋ฒ”์œ„) +- ์ฒ˜์Œ ๊ณต๊ธฐ์ฒญ์ •๊ธฐ์˜ ์œ„์น˜์— ๋”ฐ๋ผ์„œ ๋ฐ˜์œผ๋กœ ๋‚˜๋ˆ„๊ณ  i,j์˜ ๋ฒ”์œ„๋ฅผ ์ •ํ•ด์ค๋‹ˆ๋‹ค. (์˜ˆ์‹œ๋Š” ์•„๋ž˜์ชฝ ๊ธฐ์ค€) +- ์ฒ˜์Œ์—๋Š” i๊ฐ€ ์ฆ๊ฐ€ํ•˜๋Š” ๋ฐฉํ–ฅ์œผ๋กœ ๊ฐ€๋‹ค๊ฐ€ ๋์„ ๋งŒ๋‚˜๋ฉด ๋ฉˆ์ถ”๊ณ  j๋ฅผ ์ฆ๊ฐ€์‹œ์ผœ ์ค๋‹ˆ๋‹ค. +- j๊ฐ€ ์ฆ๊ฐ€ํ•˜๋Š” ๋ฐฉํ–ฅ์œผ๋กœ ๊ฐ€๋‹ค๊ฐ€ ๋์„ ๋งŒ๋‚˜๋ฉด ๋ฉˆ์ถ”๊ณ  i๋ฅผ ๊ฐ์†Œ์‹œ์ผœ ์ค๋‹ˆ๋‹ค. +- i๋ฅผ ๊ฐ์†Œ์‹œ์ผœ์ฃผ๋‹ค๊ฐ€ ๊ณต๊ธฐ์ฒญ์ •๊ธฐ๋ฅผ ๋งŒ๋‚˜๋ฉด ์ข…๋ฃŒํ•ฉ๋‹ˆ๋‹ค. + +์ด๋ ‡๊ฒŒ ์ˆœ์ฐจ์ ์œผ๋กœ ๋ฐฐ์—ด๋Œ๋ฆฌ๊ธฐ๋ฅผ ํ•˜๋ฉด์„œ ๋‹ค์Œ์— ์žˆ๋Š” ๊ฐ’์„ ์ €์žฅํ•˜๊ณ , ํ•ด๋‹น ์œ„์น˜๋กœ ์ด๋™ํ•ด ๋„ฃ์–ด์ฃผ๊ณ ๋ฅผ ๋ฐ˜๋ณตํ•ด์ค๋‹ˆ๋‹ค. + +์ด๊ฒƒ์„ ์ฝ”๋“œ๋กœ ํ‘œํ˜„ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. + +--- + +```java +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.util.StringTokenizer; + + +public class Bye_Microcum { + // (6 <= R,C <= 50, 1<= T <= 1000) (-1 <= Arc <= 1000) + // ๊ณต๊ธฐ์ฒญ์ •๊ธฐ ์œ„์น˜๋Š” -1, -1์€ ์œ„์•„๋ž˜ ๋ถ™์–ด์žˆ๊ณ , ๊ฐ€์žฅ ์œ— ํ–‰, ์•„๋žซ ํ–‰๊ณผ ๋‘ ์นธ์ด์ƒ ๋–จ์–ด์ ธ ์žˆ๋‹ค. + static int R, C, T, result; + static int[][] A, B; + static int[][] idx = { + {-1, 0, 1, 0}, + {0, -1, 0, 1} + }; + static int upR, upC, downR, downC; + + static void diffusion() { + B = new int[R][C]; + + for (int i = 0; i < R; i++) { + for (int j = 0; j < C; j++) { + if(A[i][j] == -1) { + B[i][j] = -1; + continue; + } + int cnt = 0; + if(A[i][j] != 0) { + for (int k = 0; k < 4; k++) { + int nxR = i + idx[0][k]; + int nxC = j + idx[1][k]; + if(nxR < 0 || nxC < 0 || nxR >= R || nxC >= C || A[nxR][nxC] == -1) { + continue; + } else { + B[nxR][nxC] += A[i][j] / 5; + cnt++; + } + } + B[i][j] += A[i][j] - ((A[i][j]/5)*cnt); + } + } + } + + // ๋ฐฐ์—ด ๋ณต์‚ฌ + for (int i = 0; i < R; i++) { + for (int j = 0; j < C; j++) { + A[i][j] = B[i][j]; + } + } + } + + static void air_cleanning() { + int temp, nextTemp, dir; + + int[][] up = { + {0, -1, 0, 1}, + {1, 0, -1, 0}, + }; + int i = upR, j = upC + 1; dir = 0; + nextTemp = A[i][j]; + A[i][j] = 0; + while(true) { + temp = nextTemp; + int nR = i + up[0][dir]; + int nC = j + up[1][dir]; + if(nR < 0 || R <= nR || nC < 0 || C <= nC) { + dir++; + nR = i + up[0][dir]; + nC = j + up[1][dir]; + } else if(A[nR][nC] == -1) break; + nextTemp = A[nR][nC]; + A[nR][nC] = temp; + i = nR; j = nC; + } + + int[][] down = { + {0, 1, 0, -1}, + {1, 0, -1, 0}, + }; + i = downR; j = downC + 1; dir = 0; + nextTemp = A[i][j]; + A[i][j] = 0; + while(true) { + temp = nextTemp; + int nR = i + down[0][dir]; + int nC = j + down[1][dir]; + if(nR < 0 || R <= nR || nC < 0 || C <= nC) { + dir++; + nR = i + down[0][dir]; + nC = j + down[1][dir]; + } else if(A[nR][nC] == -1) break; + nextTemp = A[nR][nC]; + A[nR][nC] = temp; + i = nR; j = nC; + } + } + + public static void main(String[] args) throws IOException { + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + StringTokenizer st = new StringTokenizer(br.readLine()); + + R = Integer.parseInt(st.nextToken()); + C = Integer.parseInt(st.nextToken()); + T = Integer.parseInt(st.nextToken()); + + A = new int[R][C]; + boolean air_condition = false; + for (int i = 0; i < R; i++) { + if(!st.hasMoreTokens()) st = new StringTokenizer(br.readLine()); + for (int j = 0; j < C; j++) { + A[i][j] = Integer.parseInt(st.nextToken()); + if(A[i][j] == -1 && !air_condition) { + upR = i; upC = j; + downR = i + 1; downC = j; + air_condition = true; + } + } + + } + + for (int i = 0; i < T; i++) { + diffusion(); + air_cleanning(); + } + + for (int i = 0; i < R; i++) { + for (int j = 0; j < C; j++) { + if(A[i][j] == -1) continue; + result += A[i][j]; + } + } + + System.out.println(result); + } +} +``` diff --git a/src/content/blog/study/algorithmsolutions/2022-03-14-algo-baekjoon-2212.md b/src/content/blog/study/algorithmsolutions/2022-03-14-algo-baekjoon-2212.md new file mode 100644 index 0000000..ffcc3ca --- /dev/null +++ b/src/content/blog/study/algorithmsolutions/2022-03-14-algo-baekjoon-2212.md @@ -0,0 +1,88 @@ +--- +title: Baekjoon online judge. 2212.์„ผ์„œ +date: 2022-03-14 +tags: algorithmsolutions, ๊ณต๋ถ€ +excerpt: 2212.์„ผ์„œ - ๋ฐฑ์ค€์˜จ๋ผ์ธ +--- +# 2212.์„ผ์„œ - ๋ฐฑ์ค€์˜จ๋ผ์ธ + +ํ•ด๋‹น ๋ฌธ์ œ๋Š” ํƒ์š•(greedy) ๋ฌธ์ œ๋กœ ํ˜„์žฌ ์ˆ˜ํ–‰ ํ•˜๋Š”๊ฒƒ์ด ์ตœ์„ ์ž„์„ ์ •์˜ํ•˜์—ฌ ํ’€์–ด๋ณด์•˜์Šต๋‹ˆ๋‹ค. + +๋งํฌ : +[![image](/assets/img/algo_img/baekjoon_logo.png)](https://www.acmicpc.net/problem/2212) + +--- + +### 2212\. ์„ผ์„œ + +ํ•œ๊ตญ๋„๋กœ๊ณต์‚ฌ๋Š” ๊ณ ์†๋„๋กœ์˜ ์œ ๋น„์ฟผํ„ฐ์Šคํ™”๋ฅผ ์œ„ํ•ด ๊ณ ์†๋„๋กœ ์œ„์— N๊ฐœ์˜ ์„ผ์„œ๋ฅผ ์„ค์น˜ํ•˜์˜€๋‹ค. ๋ฌธ์ œ๋Š” ์ด ์„ผ์„œ๋“ค์ด ์ˆ˜์ง‘ํ•œ ์ž๋ฃŒ๋“ค์„ ๋ชจ์œผ๊ณ  ๋ถ„์„ํ•  ๋ช‡ ๊ฐœ์˜ ์ง‘์ค‘๊ตญ์„ ์„ธ์šฐ๋Š” ์ผ์ธ๋ฐ, ์˜ˆ์‚ฐ์ƒ์˜ ๋ฌธ์ œ๋กœ, ๊ณ ์†๋„๋กœ ์œ„์— ์ตœ๋Œ€ K๊ฐœ์˜ ์ง‘์ค‘๊ตญ์„ ์„ธ์šธ ์ˆ˜ ์žˆ๋‹ค๊ณ  ํ•œ๋‹ค. + +๊ฐ ์ง‘์ค‘๊ตญ์€ ์„ผ์„œ์˜ ์ˆ˜์‹  ๊ฐ€๋Šฅ ์˜์—ญ์„ ์กฐ์ ˆํ•  ์ˆ˜ ์žˆ๋‹ค. ์ง‘์ค‘๊ตญ์˜ ์ˆ˜์‹  ๊ฐ€๋Šฅ ์˜์—ญ์€ ๊ณ ์†๋„๋กœ ์ƒ์—์„œ ์—ฐ๊ฒฐ๋œ ๊ตฌ๊ฐ„์œผ๋กœ ๋‚˜ํƒ€๋‚˜๊ฒŒ ๋œ๋‹ค. N๊ฐœ์˜ ์„ผ์„œ๊ฐ€ ์ ์–ด๋„ ํ•˜๋‚˜์˜ ์ง‘์ค‘๊ตญ๊ณผ๋Š” ํ†ต์‹ ์ด ๊ฐ€๋Šฅํ•ด์•ผ ํ•˜๋ฉฐ, ์ง‘์ค‘๊ตญ์˜ ์œ ์ง€๋น„ ๋ฌธ์ œ๋กœ ์ธํ•ด ๊ฐ ์ง‘์ค‘๊ตญ์˜ ์ˆ˜์‹  ๊ฐ€๋Šฅ ์˜์—ญ์˜ ๊ธธ์ด์˜ ํ•ฉ์„ ์ตœ์†Œํ™”ํ•ด์•ผ ํ•œ๋‹ค. + +ํŽธ์˜๋ฅผ ์œ„ํ•ด ๊ณ ์†๋„๋กœ๋Š” ํ‰๋ฉด์ƒ์˜ ์ง์„ ์ด๋ผ๊ณ  ๊ฐ€์ •ํ•˜๊ณ , ์„ผ์„œ๋“ค์€ ์ด ์ง์„  ์œ„์˜ ํ•œ ๊ธฐ์ ์ธ ์›์ ์œผ๋กœ๋ถ€ํ„ฐ์˜ ์ •์ˆ˜ ๊ฑฐ๋ฆฌ์˜ ์œ„์น˜์— ๋†“์—ฌ ์žˆ๋‹ค๊ณ  ํ•˜์ž. ๋”ฐ๋ผ์„œ, ๊ฐ ์„ผ์„œ์˜ ์ขŒํ‘œ๋Š” ์ •์ˆ˜ ํ•˜๋‚˜๋กœ ํ‘œํ˜„๋œ๋‹ค. ์ด ์ƒํ™ฉ์—์„œ ๊ฐ ์ง‘์ค‘๊ตญ์˜ ์ˆ˜์‹  ๊ฐ€๋Šฅ์˜์—ญ์˜ ๊ฑฐ๋ฆฌ์˜ ํ•ฉ์˜ ์ตœ์†Ÿ๊ฐ’์„ ๊ตฌํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค. ๋‹จ, ์ง‘์ค‘๊ตญ์˜ ์ˆ˜์‹  ๊ฐ€๋Šฅ์˜์—ญ์˜ ๊ธธ์ด๋Š” 0 ์ด์ƒ์ด๋ฉฐ ๋ชจ๋“  ์„ผ์„œ์˜ ์ขŒํ‘œ๊ฐ€ ๋‹ค๋ฅผ ํ•„์š”๋Š” ์—†๋‹ค. + +#### ์ž…๋ ฅ(Input) + +์ฒซ์งธ ์ค„์— ์„ผ์„œ์˜ ๊ฐœ์ˆ˜ N(1 โ‰ค N โ‰ค 10,000), ๋‘˜์งธ ์ค„์— ์ง‘์ค‘๊ตญ์˜ ๊ฐœ์ˆ˜ K(1 โ‰ค K โ‰ค 1000)๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. ์…‹์งธ ์ค„์—๋Š” N๊ฐœ์˜ ์„ผ์„œ์˜ ์ขŒํ‘œ๊ฐ€ ํ•œ ๊ฐœ์˜ ์ •์ˆ˜๋กœ N๊ฐœ ์ฃผ์–ด์ง„๋‹ค. ๊ฐ ์ขŒํ‘œ ์‚ฌ์ด์—๋Š” ๋นˆ ์นธ์ด ํ•˜๋‚˜ ์žˆ์œผ๋ฉฐ, ์ขŒํ‘œ์˜ ์ ˆ๋Œ“๊ฐ’์€ 1,000,000 ์ดํ•˜์ด๋‹ค. + +#### ์ถœ๋ ฅ(Output) + +์ฒซ์งธ ์ค„์— ๋ฌธ์ œ์—์„œ ์„ค๋ช…ํ•œ ์ตœ๋Œ€ K๊ฐœ์˜ ์ง‘์ค‘๊ตญ์˜ ์ˆ˜์‹  ๊ฐ€๋Šฅ ์˜์—ญ์˜ ๊ธธ์ด์˜ ํ•ฉ์˜ ์ตœ์†Ÿ๊ฐ’์„ ์ถœ๋ ฅํ•œ๋‹ค. + +--- + +### 1\. ๋ฌธ์ œ ํ’€์ด + + + +์ด๊ฒƒ์„ ์ฝ”๋“œ๋กœ ํ‘œํ˜„ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. + +--- + +```java +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.util.Arrays; +import java.util.StringTokenizer; + +public class Sensor_2212 { + static int[] sensors; + static int[] diff; + public static void main(String[] args) throws IOException { + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + StringTokenizer st = new StringTokenizer(br.readLine()); + + int N = Integer.parseInt(st.nextToken()); + st = new StringTokenizer(br.readLine()); + int K = Integer.parseInt(st.nextToken()); + + sensors = new int[N]; + diff = new int[N - 1]; + st = new StringTokenizer(br.readLine()); + for(int i = 0; i < N; i++) { + sensors[i] = Integer.parseInt(st.nextToken()); + } + + if(K >= N) System.out.println("0"); + else { + Arrays.sort(sensors); + + for(int i = 0; i < N - 1; i++) { + diff[i] = sensors[i + 1] - sensors[i]; + } + + Arrays.sort(diff); + + int answer = 0; + + for(int i = 0; i < N - K; i++) { + answer += diff[i]; + } + + System.out.println(answer); + } + } +} + +``` diff --git a/src/content/blog/study/algorithmsolutions/2022-03-16-algo-baekjoon-18185.md b/src/content/blog/study/algorithmsolutions/2022-03-16-algo-baekjoon-18185.md new file mode 100644 index 0000000..6e7a97f --- /dev/null +++ b/src/content/blog/study/algorithmsolutions/2022-03-16-algo-baekjoon-18185.md @@ -0,0 +1,163 @@ +--- +title: Baekjoon online judge. 18185.๋ผ๋ฉด ์‚ฌ๊ธฐ(small) +date: 2022-03-16 +tags: algorithmsolutions, ๊ณต๋ถ€ +excerpt: 18185.๋ผ๋ฉด ์‚ฌ๊ธฐ(small) - ๋ฐฑ์ค€์˜จ๋ผ์ธ +--- +# 18185.๋ผ๋ฉด ์‚ฌ๊ธฐ(small) - ๋ฐฑ์ค€์˜จ๋ผ์ธ + +ํ•ด๋‹น ๋ฌธ์ œ๋Š” ํƒ์š•(greedy) ๋ฌธ์ œ๋กœ ํ˜„์žฌ ์ˆ˜ํ–‰ ํ•˜๋Š”๊ฒƒ์ด ์ตœ์„ ์ž„์„ ์ •์˜ํ•˜์—ฌ ํ‘ธ๋Š” ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค. + +๊ทธ๋ฆฌ๋””๋„ ์ค‘์š”ํ•˜์ง€๋งŒ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ๊ฐ€ ์ค‘์š”ํ•œ ๋ถ€๋ถ„์ด๋‹ค. + +๋งํฌ : +[![image](/assets/img/algo_img/baekjoon_logo.png)](https://www.acmicpc.net/problem/18185) + +--- + +## 18185\.๋ผ๋ฉด ์‚ฌ๊ธฐ(small) + +๋ผ๋ฉด๋งค๋‹ˆ์•„ ๊ต์ค€์ด๋„ค ์ง‘ ์ฃผ๋ณ€์—๋Š” N๊ฐœ์˜ ๋ผ๋ฉด ๊ณต์žฅ์ด ์žˆ๋‹ค. ๊ฐ ๊ณต์žฅ์€ 1๋ฒˆ๋ถ€ํ„ฐ N๋ฒˆ๊นŒ์ง€ ์ฐจ๋ก€๋Œ€๋กœ ๋ฒˆํ˜ธ๊ฐ€ ๋ถ€์—ฌ๋˜์–ด ์žˆ๋‹ค. ๊ต์ค€์ด๋Š” i๋ฒˆ ๊ณต์žฅ์—์„œ ์ •ํ™•ํ•˜๊ฒŒ Ai๊ฐœ์˜ ๋ผ๋ฉด์„ ๊ตฌ๋งคํ•˜๊ณ ์ž ํ•œ๋‹ค(1 โ‰ค i โ‰ค N). + +๊ต์ค€์ด๋Š” ์•„๋ž˜์˜ ์„ธ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์œผ๋กœ ๋ผ๋ฉด์„ ๊ตฌ๋งคํ•  ์ˆ˜ ์žˆ๋‹ค. + +i๋ฒˆ ๊ณต์žฅ์—์„œ ๋ผ๋ฉด์„ ํ•˜๋‚˜ ๊ตฌ๋งคํ•œ๋‹ค(1 โ‰ค i โ‰ค N). ์ด ๊ฒฝ์šฐ ๋น„์šฉ์€ 3์›์ด ๋“ ๋‹ค. +i๋ฒˆ ๊ณต์žฅ๊ณผ (i+1)๋ฒˆ ๊ณต์žฅ์—์„œ ๊ฐ๊ฐ ๋ผ๋ฉด์„ ํ•˜๋‚˜์”ฉ ๊ตฌ๋งคํ•œ๋‹ค(1 โ‰ค i โ‰ค N-1). ์ด ๊ฒฝ์šฐ ๋น„์šฉ์€ 5์›์ด ๋“ ๋‹ค. +i๋ฒˆ ๊ณต์žฅ๊ณผ (i+1)๋ฒˆ ๊ณต์žฅ, (i+2)๋ฒˆ ๊ณต์žฅ์—์„œ ๊ฐ๊ฐ ๋ผ๋ฉด์„ ํ•˜๋‚˜์”ฉ ๊ตฌ๋งคํ•œ๋‹ค(1 โ‰ค i โ‰ค N-2). ์ด ๊ฒฝ์šฐ ๋น„์šฉ์€ 7์›์ด ๋“ ๋‹ค. +์ตœ์†Œ์˜ ๋น„์šฉ์œผ๋กœ ๋ผ๋ฉด์„ ๊ตฌ๋งคํ•˜๊ณ ์ž ํ•  ๋•Œ, ๊ต์ค€์ด๊ฐ€ ํ•„์š”ํ•œ ๊ธˆ์•ก์„ ์ถœ๋ ฅํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค. + +### ์ž…๋ ฅ(Input) + +์ฒซ์งธ ์ค„์— ์„ผ์„œ์˜ ๊ฐœ์ˆ˜ N(1 โ‰ค N โ‰ค 10,000), ๋‘˜์งธ ์ค„์— ์ง‘์ค‘๊ตญ์˜ ๊ฐœ์ˆ˜ K(1 โ‰ค K โ‰ค 1000)๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. ์…‹์งธ ์ค„์—๋Š” N๊ฐœ์˜ ์„ผ์„œ์˜ ์ขŒํ‘œ๊ฐ€ ํ•œ ๊ฐœ์˜ ์ •์ˆ˜๋กœ N๊ฐœ ์ฃผ์–ด์ง„๋‹ค. ๊ฐ ์ขŒํ‘œ ์‚ฌ์ด์—๋Š” ๋นˆ ์นธ์ด ํ•˜๋‚˜ ์žˆ์œผ๋ฉฐ, ์ขŒํ‘œ์˜ ์ ˆ๋Œ“๊ฐ’์€ 1,000,000 ์ดํ•˜์ด๋‹ค. + +### ์ถœ๋ ฅ(Output) + +์ฒซ์งธ ์ค„์— ๋ฌธ์ œ์—์„œ ์„ค๋ช…ํ•œ ์ตœ๋Œ€ K๊ฐœ์˜ ์ง‘์ค‘๊ตญ์˜ ์ˆ˜์‹  ๊ฐ€๋Šฅ ์˜์—ญ์˜ ๊ธธ์ด์˜ ํ•ฉ์˜ ์ตœ์†Ÿ๊ฐ’์„ ์ถœ๋ ฅํ•œ๋‹ค. + +--- + +### 1\. ๋ฌธ์ œ ํ’€์ด +๊ทธ๋ฆฌ๋”” ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ด์šฉํ•˜๋Š” ๋ฌธ์ œ์ธ๋ฐ, ๊ตฌ๋งค ๊ฐ€๋Šฅํ•œ ํ–‰๋™์ด 3๊ฐ€์ง€์ด๋‹ค.
+๊ทธ๋ฆฌ๊ณ , i ๋ฒˆ์งธ ๊ณต์žฅ i + 1 ๋ฒˆ์งธ ๊ณต์žฅ, i + 2 ๋ฒˆ์งธ ๊ณต์žฅ์˜ ๋ผ๋ฉด ๊ฐœ์ˆ˜์— ๋”ฐ๋ผ์„œ ๊ตฌ๋งค ๋ฐฉ์‹์„ ๋‹ค๋ฅด๊ฒŒ ์ ‘๊ทผํ•ด์•ผ ํ•œ๋‹ค.
+ +ํ•˜๋‚˜์˜ ๊ณต์žฅ์—์„œ 3์›์œผ๋กœ ๊ตฌ๋งคํ•˜๋Š”๊ฒƒ ๋ณด๋‹ค ๋‘ ๊ฐœ์˜ ๊ณต์žฅ์—์„œ 5์›์œผ๋กœ ๊ตฌ๋งคํ•˜๋Š”๊ฒƒ์ด,
+์„ธ ๊ฐœ์˜ ๊ณต์žฅ์—์„œ 7์›์œผ๋กœ ๊ตฌ๋งคํ•˜๋Š”๊ฒƒ์ด ํšจ์œจ์ ์ด๋ผ๋Š”๊ฒƒ์€ ๋ˆ„๊ตฌ๋‚˜ ์•Œ ์ˆ˜ ์žˆ๋‹ค.
+ +๊ทธ๋ž˜์„œ ์ฒ˜์Œ์—๋Š” ํ˜„ ์œ„์น˜ i์—์„œ i + 1 ๋ฒˆ์งธ์™€ i + 2 ๋ฒˆ์งธ ๊ณต์žฅ๊ณผ์˜ ์‚ด ์ˆ˜ ์žˆ๋Š” ์ตœ๋Œ€ํ•œ์œผ๋กœ ๋ฌถ์–ด์„œ ๊ตฌ๋งคํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ๋ฌธ์ œ๋ฅผ ํ’€์–ด ๋ดค๋‹ค. + + - 3๊ฐœ์”ฉ ๋ฌถ์–ด์„œ ๊ตฌ๋งค +> 1 2 3
+> ์ตœ์†Œ๊ฐ’์ธ 1๊ฐœ์”ฉ ๊ตฌ๋งคํ•˜์—ฌ
+> 0 1 2
+> ์„ ๋งŒ๋“ค๋ฉด, ํ˜„ ์œ„์น˜์—์„œ ๊ตฌ๋งค ํ•œ ๊ธˆ์•ก์€ ์ตœ์†Œ ๊ฐ’ 1 * 7 = 7์›
+ + - 2๊ฐœ์”ฉ ๋ฌถ์–ด์„œ ๊ตฌ๋งค +> 4 2 0 3
+> ์ตœ์†Œ ๊ฐ’์ธ 2๊ฐœ์”ฉ ๊ตฌ๋งคํ•˜์—ฌ
+> 2 0 0 3
+> 0 0 0 3
+> 2 * 5 + 2 * 3 = 16์› + + +๊ทธ๋Ÿฌ๋‚˜ ์œ„์˜ ๋ฐฉ์‹๋Œ€๋กœ ์ ‘๊ทผํ•˜๋‹ˆ ๋” ํšจ์œจ์ ์œผ๋กœ ๊ตฌ๋งคํ•˜์ง€ ๋ชปํ•˜๋Š” ์˜ˆ์™ธ ๊ฒฝ์šฐ๊ฐ€ ์žˆ์—ˆ๋‹ค.
+๋ฐ”๋กœ i + 1 ๋ฒˆ์งธ๊ฐ€ i + 2 ๋ฒˆ์งธ๋ณด๋‹ค ํฐ ๊ฒฝ์šฐ์ธ๋ฐ, ์•„๋ž˜๋ฅผ ์‚ดํŽด๋ณด๋ฉด + +> 2 3 2 1
+> ์ธ๊ทผ ์ตœ์†Œ๊ฐ’์ธ 2๊ฐœ์”ฉ ๊ตฌ๋งคํ•˜์—ฌ
+> 0 1 0 1
+> 0 0 0 1
+> 0 0 0 0
+> (2 * 7) + (1 * 3) + (1 * 3) = 20์›
+ +์œ„์™€ ๊ฐ™์ด 20์›์ด ๋‚˜์˜ค์ง€๋งŒ, ์•„๋ž˜์™€ ๊ฐ™์ด ์•ž์˜ 2๊ฐœ์”ฉ ๋ฌถ์–ด์„œ ๋’ค์˜ ์ˆ˜์™€ ์ผ์น˜ ์‹œ์ผœ์ฃผ๋ฉด +> 2 3 2 1
+> 1 2 2 1
+> 0 2 2 1
+> 0 1 1 1
+> 0 0 0 0
+> (1 * 5) + (1 * 3) + (1 * 5) + (1 * 7) = 19์› + +19์›์œผ๋กœ ๋” ์‹ธ๊ฒŒ ๊ตฌ๋งค๊ฐ€ ๊ฐ€๋Šฅํ•œ ๊ฒƒ์ด๋‹ค.
+ +์ด๋Š” i + 1 ๋ฒˆ์งธ ๊ฐ’์ด i + 2 ๋ฒˆ์งธ ๊ฐ’๋ณด๋‹ค ํด ๊ฒฝ์šฐ์ธ๋ฐ, ์ด ๋•Œ์—๋Š” i ๋ฒˆ์งธ์˜ ๊ฐ’๊ณผ [i + 1] - [i + 2] ์˜ ๊ฐ’์˜ ์ตœ์†Œ๊ฐ’ ๋งŒํผ ์•ž์˜ ๋‘๊ฐœ๋ฅผ ๋ฌถ์–ด์„œ ์‚ฌ๋ฉด ๋‹ค์Œ ๊ตฌ๋งค์— ๋” ์‹ธ๊ฒŒ ๊ตฌ๋งค๊ฐ€ ๊ฐ€๋Šฅํ•˜๊ฒŒ ๋œ๋‹ค. + +๋”ฐ๋ผ์„œ ์•„๋ž˜์˜ ๋‘ ๊ฐ€์ง€ ๋ฐฉ์‹์œผ๋กœ ๋ถ„๊ธฐํ•˜์—ฌ ๊ทธ๋ฆฌ๋”” ๋ฐฉ์‹์œผ๋กœ ์ตœ๋Œ€ํ•œ ์ด์ต์„ ๋‚ด์„œ ๊ตฌ๋งค๋ฅผ ํ•œ๋‹ค๋ฉด, + +1. [i + 1] ๊ณต์žฅ์˜ ๋ผ๋ฉด > [i + 2] ๊ณต์žฅ์˜ ๋ผ๋ฉด
+ - [i], [i + 1] - [i + 2] ์ค‘์˜ ์ตœ์†Œ๊ฐ’์œผ๋กœ ์„  ๊ตฌ๋งค (2๋ฌถ์Œ)
+ - [i], [i + 1], [i + 2] ์ค‘์˜ ์ตœ์†Œ๊ฐ’์œผ๋กœ ๊ตฌ๋งค (3๋ฌถ์Œ)
+2. [i + 1] ๊ณต์žฅ์˜ ๋ผ๋ฉด < [i + 2] ๊ณต์žฅ์˜ ๋ผ๋ฉด
+ - [i], [i + 1], [i + 2] ์ค‘์˜ ์ตœ์†Œ๊ฐ’์œผ๋กœ ์„  ๊ตฌ๋งค (3๋ฌถ์Œ)
+ - [i], [i + 1] ์ค‘์˜ ์ตœ์†Œ๊ฐ’์œผ๋กœ ๊ตฌ๋งค (2๋ฌถ์Œ)
+ + + [i] ์˜ ๋‚จ์€ ๊ฐœ์ˆ˜ ๊ตฌ๋งค + +๊ฐ€์žฅ ์ตœ์†Œ์˜ ๊ธˆ์•ก์œผ๋กœ ๊ตฌ๋งค ํ•  ์ˆ˜ ์žˆ๋Š” ๊ธˆ์•ก์ด ๋‚˜์˜ค๊ฒŒ ๋œ๋‹ค. + + +์ด๊ฒƒ์„ ์ฝ”๋“œ๋กœ ํ‘œํ˜„ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. + +--- + +```java +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.util.StringTokenizer; + +public class Ramyeon_18185 { + public static void main(String[] args) throws IOException { + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + StringTokenizer st = new StringTokenizer(br.readLine()); + + int N = Integer.parseInt(st.nextToken()); + int factory[] = new int[N + 2]; + + st = new StringTokenizer(br.readLine()); + for (int i = 0; i < N; i++) { + factory[i] = Integer.parseInt(st.nextToken()); + } + + int answer = 0; + for(int i = 0; i < N; i++) { + if(factory[i] > 0) { + // i + 1, i + 2 ๋ฒˆ ๊ฐ€๊ฒŒ์˜ ๋ผ๋ฉด ์œ ๋ฌด๋ฅผ ํ™•์ธ + // ํ˜„์žฌ ์‚ด ์ˆ˜ ์žˆ๋Š” ๊ฐ€์žฅ ๋งŽ์€ ๋ผ๋ฉด์„ ์‚ฐ๋‹ค. + int min = 0; + + if(factory[i + 1] > factory[i + 2]) { + // i + 1์˜ ์ˆ˜๊ฐ€ i + 2์˜ ์ˆ˜๋ณด๋‹ค ํฌ๋ฉด, + // ๋งจ ์•ž์˜ ๋‘๊ฐœ๋ฅผ ๋ฌถ์–ด์„œ ๋จผ์ € ์‚ฌ๊ณ , ์„ธ ๊ฐœ๋ฅผ ๋ฌถ์–ด์„œ ์‚ฌ๋Š”๊ฒŒ ์‹ธ๋‹ค. + // ์ด ๋•Œ, [i] > [i+1] - [i+2] ์˜ ๊ฐ’์„ ๋น„๊ตํ•˜์—ฌ ์ตœ์†Œ๊ฐ’์œผ๋กœ ๊ตฌ๋งค + min = Math.min(factory[i], factory[i + 1] - factory[i + 2]); + answer += min * 5; + factory[i] -= min; + factory[i + 1] -= min; + + min = Math.min(factory[i], Math.min(factory[i + 1], factory[i + 2])); + answer += min * 7; + factory[i] -= min; + factory[i + 1] -= min; + factory[i + 2] -= min; + } else { // ๋ฐ˜๋Œ€๋Š” ์„ธ๊ฐœ ๋ฌถ์–ด ์‚ฌ๊ณ , ๋‘๊ฐœ ๋ฌถ์–ด ์‚ฌ๋Š”๊ฒŒ ์‹ธ๋‹ค. + min = Math.min(factory[i], Math.min(factory[i + 1], factory[i + 2])); + answer += min * 7; + factory[i] -= min; + factory[i + 1] -= min; + factory[i + 2] -= min; + + min = Math.min(factory[i], factory[i + 1]); + answer += min * 5; + factory[i] -= min; + factory[i + 1] -= min; + } + answer += factory[i] * 3; + factory[i] = 0; + } + } + + System.out.println(answer); + } +} + +``` diff --git a/src/content/blog/study/algorithmsolutions/2022-03-18-algo-baekjoon-2885.md b/src/content/blog/study/algorithmsolutions/2022-03-18-algo-baekjoon-2885.md new file mode 100644 index 0000000..94b2b10 --- /dev/null +++ b/src/content/blog/study/algorithmsolutions/2022-03-18-algo-baekjoon-2885.md @@ -0,0 +1,95 @@ +--- +title: Baekjoon online judge. 2885.์ดˆ์ฝœ๋ฆฟ ์‹์‚ฌ +date: 2022-03-18 +tags: algorithmsolutions, ๊ณต๋ถ€, greedy +excerpt: 2885.์ดˆ์ฝœ๋ฆฟ ์‹์‚ฌ - ๋ฐฑ์ค€์˜จ๋ผ์ธ +--- +# 2885.์ดˆ์ฝœ๋ฆฟ ์‹์‚ฌ - ๋ฐฑ์ค€์˜จ๋ผ์ธ + +ํ•ด๋‹น ๋ฌธ์ œ๋Š” ํƒ์š•(greedy) ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐ ํ–ˆ์Šต๋‹ˆ๋‹ค. + +๋งํฌ : +[![image](/assets/img/algo_img/baekjoon_logo.png)](https://www.acmicpc.net/problem/2885) + +--- + +## 2885\.์ดˆ์ฝœ๋ฆฟ ์‹์‚ฌ + +ํ•™๊ต ๊ทผ์ฒ˜ ํŽธ์˜์ ์— ์ƒˆ ์ดˆ์ฝœ๋ฆฟ์ด ๋“ค์–ด์™”๋‹ค. ์ด ์ดˆ์ฝœ๋ฆฟ์€ ๋ง‰๋Œ€ ๋ชจ์–‘์ด๊ณ , ๊ฐ ๋ง‰๋Œ€๋Š” ์ •์‚ฌ๊ฐํ˜• N๊ฐœ๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ๋‹ค. ์ดˆ์ฝœ๋ฆฟ์˜ ํฌ๊ธฐ(์ •์‚ฌ๊ฐํ˜•์˜ ๊ฐœ์ˆ˜)๋Š” ํ•ญ์ƒ 2์˜ ์ œ๊ณฑ ํ˜•ํƒœ์ด๋‹ค. ์ฆ‰, 1, 2, 4, 8, 16, ...๊ฐœ์˜ ์ •์‚ฌ๊ฐํ˜•์œผ๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ๋‹ค. + +์ƒ๊ทผ์ด๋Š” ์ ์‹ฌ์‹์‚ฌ๋กœ ์ดˆ์ฝœ๋ฆฟ์„ ๋จน๋Š”๋‹ค. ์ด๋•Œ, ์ ์–ด๋„ K๊ฐœ ์ •์‚ฌ๊ฐํ˜•์„ ๋จน์–ด์•ผ ๋‚จ์€ ์ˆ˜์—…์„ ์กธ์ง€ ์•Š๊ณ  ๋ฒ„ํ‹ธ ์ˆ˜ ์žˆ๋‹ค. ์ƒ๊ทผ์ด์˜ ์นœ๊ตฌ ์„ ์˜์ด๋„ ์ดˆ์ฝœ๋ฆฟ์„ ์ข‹์•„ํ•œ๋‹ค. ์„ ์˜์ด๋Š” ์ดˆ์ฝœ๋ฆฟ์€ ๋ˆ์„ ์ฃผ๊ณ  ์‚ฌ๊ธฐ ์•„๊น๋‹ค๊ณ  ์ƒ๊ฐํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ์ƒ๊ทผ์ด๊ฐ€ ์ฃผ๋Š” ์ดˆ์ฝœ๋ฆฟ๋งŒ ๋จน๋Š”๋‹ค. + +์ƒ๊ทผ์ด๋Š” ๋ง‰๋Œ€ ์ดˆ์ฝœ๋ฆฟ๋ฅผ ํ•˜๋‚˜ ์‚ฐ ๋‹ค์Œ์—, ์ •ํ™•ํ•˜๊ฒŒ K๊ฐœ ์ •์‚ฌ๊ฐํ˜•์ด ๋˜๋„๋ก ์ดˆ์ฝœ๋ฆฟ์„ ์ชผ๊ฐ ๋‹ค. K๊ฐœ๋Š” ์ž์‹ ์ด ๋จน๊ณ  ๋‚จ๋Š” ๊ฒƒ์€ ์„ ์˜์ด์—๊ฒŒ ์ค€๋‹ค. + +๋ง‰๋Œ€ ์ดˆ์ฝœ๋ฆฟ์€ ๋‚˜๋ˆ„๊ธฐ ์กฐ๊ธˆ ์–ด๋ ต๊ฒŒ ๋˜์–ด ์žˆ์–ด์„œ, ํ•ญ์ƒ ๊ฐ€์šด๋ฐ๋กœ๋งŒ ์ชผ๊ฐœ์ง„๋‹ค. ์ฆ‰, ์ •์‚ฌ๊ฐํ˜•์ด D๊ฐœ ์žˆ๋Š” ๋ง‰๋Œ€๋Š” D/2๊ฐœ ๋ง‰๋Œ€ ๋‘ ์กฐ๊ฐ์œผ๋กœ ์ชผ๊ฐœ์ง„๋‹ค. + +K๊ฐœ ์ •์‚ฌ๊ฐํ˜•์„ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด์„œ, ์ตœ์†Œ ๋ช‡ ๋ฒˆ ์ดˆ์ฝœ๋ฆฟ์„ ์ชผ๊ฐœ์•ผ ํ•˜๋Š”์ง€์™€ ์‚ฌ์•ผํ•˜๋Š” ๊ฐ€์žฅ ์ž‘์€ ์ดˆ์ฝœ๋ฆฟ์˜ ํฌ๊ธฐ๋ฅผ ๊ตฌํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค. ์ƒ๊ทผ์ด๋Š” ์ดˆ์ฝœ๋ฆฟ์„ ํ•˜๋‚˜๋งŒ ์‚ด ์ˆ˜ ์žˆ๋‹ค. ๊ผญ ํ•œ ์กฐ๊ฐ์ด K๊ฐœ์ผ ํ•„์š”๋Š” ์—†๊ณ , ์—ฌ๋Ÿฌ ์กฐ๊ฐ์— ์žˆ๋Š” ์ •์‚ฌ๊ฐํ˜•์„ ํ•ฉ์ณค์„ ๋•Œ K๊ฐœ์ด๋ฉด ๋œ๋‹ค. + +### ์ž…๋ ฅ(Input) + +์ฒซ์งธ ์ค„์— K๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. (1 โ‰ค K โ‰ค 1,000,000) + +### ์ถœ๋ ฅ(Output) + +์ฒซ์งธ ์ค„์—๋Š” ์ƒ๊ทผ์ด๊ฐ€ ๊ตฌ๋งคํ•ด์•ผํ•˜๋Š” ๊ฐ€์žฅ ์ž‘์€ ์ดˆ์ฝœ๋ฆฟ์˜ ํฌ๊ธฐ์™€ ์ตœ์†Œ ๋ช‡ ๋ฒˆ ์ชผ๊ฐœ์•ผ ํ•˜๋Š”์ง€๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค. + +--- + +### 1\. ๋ฌธ์ œ ํ’€์ด +๊ทธ๋ฆฌ๋”” ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ด์šฉํ•˜๋Š” ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•ด๋ณด์•˜๋‹ค. + +์ดˆ์ฝœ๋ฆฟ์ด ๋‚˜๋ˆ„์–ด์ง€๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋ฌด์กฐ๊ฑด D = D / 2๋กœ ๋ฐ˜์œผ๋กœ๋งŒ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ๊ณ , ์ดˆ์ฝœ๋ฆฟ์˜ ํฌ๊ธฐ๋Š” 2์˜ ์ œ๊ณฑ ํ˜•ํƒœ์ด๋‹ค. + +์ดˆ์ฝœ๋ฆฟ์„ ๋ฐ˜์œผ๋กœ ๋‚˜๋ˆ„๋ฉด ๋‚˜๋ˆ„์–ด์ง„ ์ดˆ์ฝœ๋ฆฟ ์ค‘ ๋ฐ˜ ์ชฝ์€ ๊ทธ ์ƒํƒœ๋กœ ๋‚จ๊ณ , ๋‹ค๋ฅธ ๋ฐ˜ ์ชฝ์œผ๋กœ ๋‹ค์‹œ ๋‚˜๋ˆ„๊ธฐ๋ฅผ ์‹œ๋„ํ•˜์—ฌ ์ด ์ดˆ์ฝœ๋ฆฟ์˜ ๋ˆ„์  ๊ฐœ์ˆ˜๊ฐ€ K๊ฐ€ ๋˜๋ฉด ๋˜๋Š” ๋ฌธ์ œ์ด๋‹ค. + +๊ณ„์† ๋‚˜๋ˆ„๋‹ค๋ณด๋ฉด ๊ฒฐ๊ตญ์—๋Š” 2 = 1 + 1์ด ๋  ๊ฒƒ์ด๋‹ˆ, ํ•„์š”ํ•œ K์˜ ๊ฐฏ์ˆ˜๋ณด๋‹ค ํ•œ ์ œ๊ณฑ ๋” ํฐ ์ดˆ์ฝœ๋ฆฟ์„ ์‚ฌ๋ฉด ๋˜๋Š” ๊ฒƒ์ด๋‹ค. + +> K = 6
+> $$2^2 = 4$$ +> $$2^3 = 8$$ +> ์ด๋ฏ€๋กœ 4 < K < 8
+> 8์˜ ์ดˆ์ฝœ๋ฆฟ์„ ๊ตฌ๋งค
+ +์œ„์˜ ๋ฐฉ์‹๋Œ€๋กœ ์ดˆ์ฝœ๋ฆฟ์„ ๊ตฌ๋งคํ•˜๊ณ , ๋‚จ์€ ๊ฐœ์ˆ˜๋Š” ๋‹ค๋ฅธ ๋ฐ˜์ชฝ์„ ๋‚˜๋ˆ„์–ด๊ฐ€๋ฉฐ ์ฑ„์›Œ๊ฐ€๋ฉด ๋œ๋‹ค. + +> 8์„ ๋‚˜๋ˆ„์–ด 4๊ฐœ | 4๊ฐœ
+> ๋ฐ˜์ชฝ์ธ 4๊ฐœ๋ฅผ K์—์„œ ์ œ์™ธํ•˜๊ณ , ๋‹ค๋ฅธ ๋ฐ˜์ชฝ์„ ๋‚˜๋ˆˆ๋‹ค.
+> K(6) - 4 = 2
+> 4์„ ๋‚˜๋ˆ„์–ด 2๊ฐœ | 2๊ฐœ
+> ๋ฐ˜์ชฝ์ธ 2๊ฐœ๋ฅผ K์—์„œ ์ œ์™ธํ•˜๋ฉด ์ •๋Ÿ‰์ด ๋œ๋‹ค.
+> K(2) - 2 = 0
+ + +์ด๊ฒƒ์„ ์ฝ”๋“œ๋กœ ํ‘œํ˜„ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. + +--- + +```java +import java.util.Scanner; + +public class ChocolateEat_2885 { + public static void main(String[] args) { + Scanner sc = new Scanner(System.in); + int K = sc.nextInt(); + int D = 0; + int i = 0; + + while(D < K) { + D = (int)Math.pow(2, i); // 1, 2, 4, 8, 16... + i++; + } + + int size = D, cnt = 0; + while(K > 0) { + if(K >= D) { + K -= D; + } else { + D /= 2; + cnt++; + } + } + + System.out.println(size + " " + cnt); + } +} +``` diff --git a/src/content/blog/study/algorithmsolutions/2022-03-26-algo-baekjoon-8980.md b/src/content/blog/study/algorithmsolutions/2022-03-26-algo-baekjoon-8980.md new file mode 100644 index 0000000..227df53 --- /dev/null +++ b/src/content/blog/study/algorithmsolutions/2022-03-26-algo-baekjoon-8980.md @@ -0,0 +1,271 @@ +--- +title: Baekjoon online judge. 8980.ํƒ๋ฐฐ +date: 2022-03-26 +tags: algorithmsolutions, ๊ณต๋ถ€, greedy +excerpt: 8980.ํƒ๋ฐฐ - ๋ฐฑ์ค€์˜จ๋ผ์ธ +--- +# 8980.ํƒ๋ฐฐ - ๋ฐฑ์ค€์˜จ๋ผ์ธ +ํ•ด๋‹น ๋ฌธ์ œ๋Š” ๊ทธ๋ฆฌ๋”” ๋ฐฉ์‹์œผ๋กœ ํ’€์–ด๋ณด์•˜์Šต๋‹ˆ๋‹ค. + +๋งํฌ : +[![image](/assets/img/algo_img/baekjoon_logo.png)](https://www.acmicpc.net/problem/8980) + +--- +## 1. ๋ฌธ์ œ +
+๋ฌธ์ œ ๋ณด๊ธฐ +
+ +|์‹œ๊ฐ„ ์ œํ•œ|๋ฉ”๋ชจ๋ฆฌ ์ œํ•œ| +|------|---| +|1 ์ดˆ|128 MB| + +์ง์„  ๋„๋กœ์ƒ์— ์™ผ์ชฝ๋ถ€ํ„ฐ ์˜ค๋ฅธ์ชฝ์œผ๋กœ 1๋ฒˆ๋ถ€ํ„ฐ ์ฐจ๋ก€๋Œ€๋กœ ๋ฒˆํ˜ธ๊ฐ€ ๋ถ™์—ฌ์ง„ ๋งˆ์„๋“ค์ด ์žˆ๋‹ค. ๋งˆ์„์— ์žˆ๋Š” ๋ฌผ๊ฑด์„ ๋ฐฐ์†กํ•˜๊ธฐ ์œ„ํ•œ ํŠธ๋Ÿญ ํ•œ ๋Œ€๊ฐ€ ์žˆ๊ณ , ํŠธ๋Ÿญ์ด ์žˆ๋Š” ๋ณธ๋ถ€๋Š” 1๋ฒˆ ๋งˆ์„ ์™ผ์ชฝ์— ์žˆ๋‹ค. ์ด ํŠธ๋Ÿญ์€ ๋ณธ๋ถ€์—์„œ ์ถœ๋ฐœํ•˜์—ฌ 1๋ฒˆ ๋งˆ์„๋ถ€ํ„ฐ ๋งˆ์ง€๋ง‰ ๋งˆ์„๊นŒ์ง€ ์˜ค๋ฅธ์ชฝ์œผ๋กœ ๊ฐ€๋ฉด์„œ ๋งˆ์„์— ์žˆ๋Š” ๋ฌผ๊ฑด์„ ๋ฐฐ์†กํ•œ๋‹ค. + +๊ฐ ๋งˆ์„์€ ๋ฐฐ์†กํ•  ๋ฌผ๊ฑด๋“ค์„ ๋ฐ•์Šค์— ๋„ฃ์–ด ๋ณด๋‚ด๋ฉฐ, ๋ณธ๋ถ€์—์„œ๋Š” ๋ฐ•์Šค๋ฅผ ๋ณด๋‚ด๋Š” ๋งˆ์„๋ฒˆํ˜ธ, ๋ฐ•์Šค๋ฅผ ๋ฐ›๋Š” ๋งˆ์„๋ฒˆํ˜ธ์™€ ๋ณด๋‚ผ ๋ฐ•์Šค์˜ ๊ฐœ์ˆ˜๋ฅผ ์•Œ๊ณ  ์žˆ๋‹ค. ๋ฐ•์Šค๋“ค์€ ๋ชจ๋‘ ํฌ๊ธฐ๊ฐ€ ๊ฐ™๋‹ค. ํŠธ๋Ÿญ์— ์ตœ๋Œ€๋กœ ์‹ค์„ ์ˆ˜ ์žˆ๋Š” ๋ฐ•์Šค์˜ ๊ฐœ์ˆ˜, ์ฆ‰ ํŠธ๋Ÿญ์˜ ์šฉ๋Ÿ‰์ด ์žˆ๋‹ค. ์ด ํŠธ๋Ÿญ ํ•œ๋Œ€๋ฅผ ์ด์šฉํ•˜์—ฌ ๋‹ค์Œ์˜ ์กฐ๊ฑด์„ ๋ชจ๋‘ ๋งŒ์กฑํ•˜๋ฉด์„œ ์ตœ๋Œ€ํ•œ ๋งŽ์€ ๋ฐ•์Šค๋“ค์„ ๋ฐฐ์†กํ•˜๋ ค๊ณ  ํ•œ๋‹ค. + + - ์กฐ๊ฑด 1: ๋ฐ•์Šค๋ฅผ ํŠธ๋Ÿญ์— ์‹ค์œผ๋ฉด, ์ด ๋ฐ•์Šค๋Š” ๋ฐ›๋Š” ๋งˆ์„์—์„œ๋งŒ ๋‚ด๋ฆฐ๋‹ค. + - ์กฐ๊ฑด 2: ํŠธ๋Ÿญ์€ ์ง€๋‚˜์˜จ ๋งˆ์„๋กœ ๋˜๋Œ์•„๊ฐ€์ง€ ์•Š๋Š”๋‹ค. + - ์กฐ๊ฑด 3: ๋ฐ•์Šค๋“ค ์ค‘ ์ผ๋ถ€๋งŒ ๋ฐฐ์†กํ•  ์ˆ˜๋„ ์žˆ๋‹ค. + +๋งˆ์„์˜ ๊ฐœ์ˆ˜, ํŠธ๋Ÿญ์˜ ์šฉ๋Ÿ‰, ๋ฐ•์Šค ์ •๋ณด(๋ณด๋‚ด๋Š” ๋งˆ์„๋ฒˆํ˜ธ, ๋ฐ›๋Š” ๋งˆ์„๋ฒˆํ˜ธ, ๋ฐ•์Šค ๊ฐœ์ˆ˜)๊ฐ€ ์ฃผ์–ด์งˆ ๋•Œ, ํŠธ๋Ÿญ ํ•œ ๋Œ€๋กœ ๋ฐฐ์†กํ•  ์ˆ˜ ์žˆ๋Š” ์ตœ๋Œ€ ๋ฐ•์Šค ์ˆ˜๋ฅผ ๊ตฌํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค. ๋‹จ, ๋ฐ›๋Š” ๋งˆ์„๋ฒˆํ˜ธ๋Š” ๋ณด๋‚ด๋Š” ๋งˆ์„๋ฒˆํ˜ธ๋ณด๋‹ค ํ•ญ์ƒ ํฌ๋‹ค. + +์˜ˆ๋ฅผ ๋“ค์–ด, ํŠธ๋Ÿญ ์šฉ๋Ÿ‰์ด 40์ด๊ณ  ๋ณด๋‚ด๋Š” ๋ฐ•์Šค๋“ค์ด ๋‹ค์Œ ํ‘œ์™€ ๊ฐ™๋‹ค๊ณ  ํ•˜์ž. + +|๋ณด๋‚ด๋Š” ๋งˆ์„|๋ฐ›๋Š” ๋งˆ์„|๋ฐ•์Šค ๊ฐœ์ˆ˜| +|------|------|----| +|1|2|10| +|1|3|20| +|1|4|30| +|2|3|10| +|2|4|20| +|3|4|20| + +์ด๋“ค ๋ฐ•์Šค์— ๋Œ€ํ•˜์—ฌ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ฐฐ์†กํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๊ณ ๋ คํ•ด ๋ณด์ž. + +(1) 1๋ฒˆ ๋งˆ์„์— ๋„์ฐฉํ•˜๋ฉด + - ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ฐ•์Šค๋“ค์„ ํŠธ๋Ÿญ์— ์‹ฃ๋Š”๋‹ค. (1๋ฒˆ ๋งˆ์„์—์„œ 4๋ฒˆ ๋งˆ์„๋กœ ๋ณด๋‚ด๋Š” ๋ฐ•์Šค๋Š” 30๊ฐœ ์ค‘ 10๊ฐœ๋ฅผ ์‹ฃ๋Š”๋‹ค.) + +|๋ณด๋‚ด๋Š” ๋งˆ์„|๋ฐ›๋Š” ๋งˆ์„|๋ฐ•์Šค ๊ฐœ์ˆ˜| +|------|------|----| +|1|2|10| +|1|3|20| +|1|4|30| + +(2) 2๋ฒˆ ๋งˆ์„์— ๋„์ฐฉํ•˜๋ฉด + - ํŠธ๋Ÿญ์— ์‹ค๋ ค์ง„ ๋ฐ•์Šค๋“ค ์ค‘ ๋ฐ›๋Š” ๋งˆ์„๋ฒˆํ˜ธ๊ฐ€ 2์ธ ๋ฐ•์Šค 10๊ฐœ๋ฅผ ๋‚ด๋ ค ๋ฐฐ์†กํ•œ๋‹ค. (์ด๋•Œ ํŠธ๋Ÿญ์— ๋‚จ์•„์žˆ๋Š” ๋ฐ•์Šค๋Š” 30๊ฐœ๊ฐ€ ๋œ๋‹ค.) + - ๊ทธ๋ฆฌ๊ณ  ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ฐ•์Šค๋“ค์„ ์‹ฃ๋Š”๋‹ค. (์ด๋•Œ ํŠธ๋Ÿญ์— ์‹ค๋ ค ์žˆ๋Š” ๋ฐ•์Šค๋Š” 40๊ฐœ๊ฐ€ ๋œ๋‹ค.) + +|๋ณด๋‚ด๋Š” ๋งˆ์„|๋ฐ›๋Š” ๋งˆ์„|๋ฐ•์Šค ๊ฐœ์ˆ˜| +|------|------|----| +|2|3|10| + +(3) 3๋ฒˆ ๋งˆ์„์— ๋„์ฐฉํ•˜๋ฉด + - ํŠธ๋Ÿญ์— ์‹ค๋ ค์ง„ ๋ฐ•์Šค๋“ค ์ค‘ ๋ฐ›๋Š” ๋งˆ์„๋ฒˆํ˜ธ๊ฐ€ 3์ธ ๋ฐ•์Šค 30๊ฐœ๋ฅผ ๋‚ด๋ ค ๋ฐฐ์†กํ•œ๋‹ค. (์ด๋•Œ ํŠธ๋Ÿญ์— ๋‚จ์•„์žˆ๋Š” ๋ฐ•์Šค๋Š” 10๊ฐœ๊ฐ€ ๋œ๋‹ค.) + - ๊ทธ๋ฆฌ๊ณ  ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ฐ•์Šค๋“ค์„ ์‹ฃ๋Š”๋‹ค. (์ด๋•Œ ํŠธ๋Ÿญ์— ์‹ค๋ ค ์žˆ๋Š” ๋ฐ•์Šค๋Š” 30๊ฐœ๊ฐ€ ๋œ๋‹ค.) + +|๋ณด๋‚ด๋Š” ๋งˆ์„|๋ฐ›๋Š” ๋งˆ์„|๋ฐ•์Šค ๊ฐœ์ˆ˜| +|------|------|----| +|3|4|20| + +(4) 4๋ฒˆ ๋งˆ์„์— ๋„์ฐฉํ•˜๋ฉด + - ๋ฐ›๋Š” ๋งˆ์„๋ฒˆํ˜ธ๊ฐ€ 4์ธ ๋ฐ•์Šค 30๊ฐœ๋ฅผ ๋‚ด๋ ค ๋ฐฐ์†กํ•œ๋‹ค. + +์œ„์™€ ๊ฐ™์ด ๋ฐฐ์†กํ•˜๋ฉด ๋ฐฐ์†กํ•œ ์ „์ฒด ๋ฐ•์Šค๋Š” 70๊ฐœ์ด๋‹ค. ์ด๋Š” ๋ฐฐ์†กํ•  ์ˆ˜ ์žˆ๋Š” ์ตœ๋Œ€ ๋ฐ•์Šค ๊ฐœ์ˆ˜์ด๋‹ค. + +### ์ž…๋ ฅ(Input) + +์ž…๋ ฅ์˜ ์ฒซ ์ค„์€ ๋งˆ์„ ์ˆ˜ N๊ณผ ํŠธ๋Ÿญ์˜ ์šฉ๋Ÿ‰ C๊ฐ€ ๋นˆ์นธ์„ ์‚ฌ์ด์— ๋‘๊ณ  ์ฃผ์–ด์ง„๋‹ค. N์€ 2์ด์ƒ 2,000์ดํ•˜ ์ •์ˆ˜์ด๊ณ , C๋Š” 1์ด์ƒ 10,000์ดํ•˜ ์ •์ˆ˜์ด๋‹ค. ๋‹ค์Œ ์ค„์—, ๋ณด๋‚ด๋Š” ๋ฐ•์Šค ์ •๋ณด์˜ ๊ฐœ์ˆ˜ M์ด ์ฃผ์–ด์ง„๋‹ค. M์€ 1์ด์ƒ 10,000์ดํ•˜ ์ •์ˆ˜์ด๋‹ค. ๋‹ค์Œ M๊ฐœ์˜ ๊ฐ ์ค„์— ๋ฐ•์Šค๋ฅผ ๋ณด๋‚ด๋Š” ๋งˆ์„๋ฒˆํ˜ธ, ๋ฐ•์Šค๋ฅผ ๋ฐ›๋Š” ๋งˆ์„๋ฒˆํ˜ธ, ๋ณด๋‚ด๋Š” ๋ฐ•์Šค ๊ฐœ์ˆ˜(1์ด์ƒ 10,000์ดํ•˜ ์ •์ˆ˜)๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ์–‘์˜ ์ •์ˆ˜๊ฐ€ ๋นˆ์นธ์„ ์‚ฌ์ด์— ๋‘๊ณ  ์ฃผ์–ด์ง„๋‹ค. ๋ฐ•์Šค๋ฅผ ๋ฐ›๋Š” ๋งˆ์„๋ฒˆํ˜ธ๋Š” ๋ณด๋‚ด๋Š” ๋งˆ์„๋ฒˆํ˜ธ๋ณด๋‹ค ํฌ๋‹ค. + +### ์ถœ๋ ฅ(Output) + +ํŠธ๋Ÿญ ํ•œ ๋Œ€๋กœ ๋ฐฐ์†กํ•  ์ˆ˜ ์žˆ๋Š” ์ตœ๋Œ€ ๋ฐ•์Šค ์ˆ˜๋ฅผ ํ•œ ์ค„์— ์ถœ๋ ฅํ•œ๋‹ค. + +--- + +## ์„œ๋ธŒํƒœ์Šคํฌ + +|๋ฒˆํ˜ธ|๋ฐฐ์ |์ œํ•œ| +|--|---|---------------| +|1|15|๋ณด๋‚ด๋Š” ๋งˆ์„๋ฒˆํ˜ธ๋Š” ๋ชจ๋‘ 1, N โ‰ค 20| +|2|17|๋ฐ›๋Š” ๋งˆ์„๋ฒˆํ˜ธ๋Š” N-1 ๋˜๋Š” N, 3 โ‰ค N โ‰ค 20| +|3|20|N โ‰ค 5, M โ‰ค 5, C โ‰ค 10| +|4|23|N โ‰ค 100, M โ‰ค 1,000, C โ‰ค 2,000| +|5|25|์ถ”๊ฐ€์ ์ธ ์ œ์•ฝ์กฐ๊ฑด์€ ์—†๋‹ค.| + +
+
+ +--- + +## 2. ๋ฌธ์ œ ํ’€์ด +์ฒ˜์Œ์— ๊ทธ๋ƒฅ ๊ทธ๋ฆฌ๋””์  ๊ฐ€๋ฒผ์šด ์ ‘๊ทผ์œผ๋กœ ํ•ด๊ฒฐํ•˜๋ ค๊ณ  ํ•˜๋‹ˆ ๋‹ต์ด ๋‚˜์˜ค์ง€ ์•Š์•˜๋‹ค. +์ฃผ์–ด์ง„ ์กฐ๊ฑด์—์„œ ํƒ๋ฐฐ์˜ ๊ฑฐ๋ฆฌ๋กœ ์งง์€ ์ˆœ์„œ๋Œ€๋กœ ์ •๋ ฌํ•˜๊ณ  ํ˜„ ์œ„์น˜์—์„œ ์‹ฃ์„ ์ˆ˜ ์žˆ๋Š” ๊ฐ€์žฅ ๋งŽ์€ ํƒ๋ฐฐ๋งŒํผ ์‹ฃ๊ณ  ๊ฐ€๋ ค๊ณ  ํ–ˆ์—ˆ๋‹ค. + +๊ทธ๋Ÿฌ๋‚˜ ๊ทธ๋ ‡๊ฒŒ ์ ‘๊ทผํ•˜๋‹ˆ ์˜ˆ์™ธ์ฒ˜๋ฆฌ๋ฅผ ํ•ด์•ผํ•˜๋Š” ๋ถ€๋ถ„์—์„œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜์˜€๋‹ค. + +๋ช‡ ์‹œ๊ฐ„์„ ํ—ค๋งค์ด๋‹ค๊ฐ€ ๊ฒฐ๊ตญ์—๋Š” ํžŒํŠธ๋ฅผ ๋ณด๊ณ ์„œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐ ํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค. + + 1. ๋งˆ์„ ๋ณ„๋กœ ๋‚ด๋ฆฌ๋Š” ์ง์˜ ๊ฐœ์ˆ˜ ๋Œ€์‹ ์— K ๋งˆ์„์— ๋ฐฉ๋ฌธํ•ด์„œ ์ง์„ ๋‚ด๋ฆฐ ํ›„, ํŠธ๋Ÿญ์— ์‹ฃ๊ณ  ์žˆ๋Š” ๋ฐ•์Šค์˜ ๊ฐœ์ˆ˜๋ฅผ ํŒŒ์•…ํ•œ๋‹ค. + 2. ๋ณด๋‚ด๋Š” ๋งˆ์„๊ณผ ๋ฐ›๋Š” ๋งˆ์„์˜ ๊ฑฐ๋ฆฌ๊ฐ€ ๋ฉ€์ˆ˜๋ก ๋ณด๋‚ด๋Š” ๋งˆ์„๋กœ๋ถ€ํ„ฐ ๋‹ค์Œ ๋งˆ์„๋“ค์„ ์ˆœ์ฐจ์ ์œผ๋กœ ๋ฐฉ๋ฌธํ•  ๋•Œ๋งˆ๋‹ค ๋ฐ›๋Š” ๋งˆ์„ ๋ฐ”๋กœ ์ง์ „์˜ ๋งˆ์„๊นŒ์ง€ ์ง์„ ๊ณ„์†ํ•ด์„œ ๋“ค๊ณ  ์žˆ์–ด์•ผ ํ•œ๋‹ค. + + ๊ทธ ์‚ฌ์ด์— ๋” ํฐ ์ง์„ ์‹ฃ๊ณ  ๋‚ด๋ฆฌ๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ณด๋‚ด๋Š” ๋งˆ์„๊ณผ ๋ฐ›๋Š” ๋งˆ์„์˜ ๊ฑฐ๋ฆฌ๊ฐ€ ๋ฉ€๋ฉด ๊ทธ๋งŒํผ ์†ํ•ด๋ฅผ ๋ณผ ์ˆ˜ ์žˆ๋‹ค. + 3. **'๋ฌด์กฐ๊ฑด 1๋ฒˆ ๋งˆ์„๋ถ€ํ„ฐ N๋ฒˆ ๋งˆ์„๊นŒ์ง€ ์ˆœ์ฐจ์ ์œผ๋กœ ๋ฐฉ๋ฌธํ•œ๋‹ค๋Š” ์กฐ๊ฑด'** & **'๋ณด๋‚ด๋Š” ๋งˆ์„๋ณด๋‹ค ๋ฌด์กฐ๊ฑด ๋ฐ›๋Š” ๋งˆ์„์˜ ๋ฒˆํ˜ธ๊ฐ€ ๋†’๋‹ค๋Š” ์กฐ๊ฑด'** ์ด ๋‘ ์กฐ๊ฑด์„ ํ™œ์šฉํ•˜๋Š” ๊ฒƒ์œผ๋กœ ๋ฌธ์ œ๋ฅผ ํ’€ ์ˆ˜ ์žˆ๋‹ค. + +๊ทธ๋ ‡๋‹ค๋ฉด ๋ณด๋‚ด๋Š” ๋งˆ์„์ด ๋ฐ›๋Š” ๋งˆ์„๊ณผ ๊ฑฐ๋ฆฌ๊ฐ€ ๊ฐ€๊น๋‹ค๋Š” ๋œป์€ ๋ฐ›๋Š” ๋งˆ์„์˜ ๋ฒˆํ˜ธ๋ฅผ ์˜ค๋ฆ„์ฐจ์ˆœ์œผ๋กœ ์ •๋ ฌํ–ˆ์„ ๋•Œ ๊ฐ€์žฅ ์•ž์— ์žˆ์„์ˆ˜๋ก ๊ฐ€๊น๋‹ค๋Š” ๋œป์ด ๋œ๋‹ค. + +๊ทธ ๋‹ค์Œ ์šฐ์„ ์ˆœ์œ„๋กœ๋Š” ๋ณด๋‚ด๋Š” ๋งˆ์„์„ ์˜ค๋ฆ„์ฐจ์ˆœ์œผ๋กœ ์ •๋ ฌํ•˜๋Š” ๊ฒƒ์ด๋‹ค. +** ๋‘ ๋ฒˆ์งธ ์šฐ์„ ์ˆœ์œ„๋Š” ๊ตณ์ด ์•ˆํ•ด๋„ ํ’€ ์ˆ˜ ์žˆ๋‹ค. + +์ฆ‰! ์•„๋ž˜์˜ ๋‹จ๊ณ„๋กœ ํ•ด๊ฒฐ ํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค. + 1. ๋ฐ›๋Š” ๋งˆ์„ ๋ฒˆํ˜ธ๋ฅผ ์˜ค๋ฆ„์ฐจ์ˆœ์œผ๋กœ ์ •๋ ฌ + 2. ๊ฐ ๋งˆ์„ ๋ณ„๋กœ ๋ฐ•์Šค์˜ ๊ฐœ์ˆ˜๋ฅผ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ๋Š” Array ์ƒ์„ฑ + 3. ์•ž์—์„œ๋ถ€ํ„ฐ (๋ณด๋‚ด๋Š” ๋งˆ์„, ๋ฐ›๋Š” ๋งˆ์„, ๋ฐ•์Šค ๊ฐœ์ˆ˜) ๋ฅผ ๊บผ๋‚ด์„œ ์‚ฌ์šฉ + ** ์ฐธ๊ณ ๋กœ, ๋ฐ›๋Š” ๋งˆ์„์—์„œ ๋ฐ•์Šค ๊ฐœ์ˆ˜๋Š” ๊ณ ๋ คํ•˜์ง€ ์•Š๋Š”๋‹ค. ๋„์ฐฉํ•˜๋ฉด ๋ฐ•์Šค๋ฅผ ๋‚ด๋ฆฌ๊ธฐ ๋•Œ๋ฌธ์— + +2์˜ ์ถ”๊ฐ€ ๋‚ด์šฉ + - ์ •๋ ฌ ํ›„ + +|๋ณด๋‚ด๋Š” ๋งˆ์„|๋ฐ›๋Š” ๋งˆ์„|๋ฐ•์Šค ๊ฐœ์ˆ˜| +|------|------|----| +|1|2|10| +|2|3|10| +|1|3|20| +|3|4|20| +|2|4|20| +|1|4|30| + +3) ์ถ”๊ฐ€ ๋‚ด์šฉ + - 1๋ฒˆ ์งธ ๊บผ๋‚ธ ๊ฒฝ์šฐ + +> +ํŠธ๋Ÿญ์˜ ์šฉ๋Ÿ‰ : 40 +๋งˆ์„ : 1 // 2 // 3 // 4 +๋งˆ์„์—์„œ์˜ ํŠธ๋Ÿญ์— ์‹ฃ์€ ๋ฐ•์Šค ๊ฐœ์ˆ˜ : 10 // 0 // 0 // 0 ( +10 ๋‚ด๋ฆผ = 10) + + - 2๋ฒˆ ์งธ ๊บผ๋‚ธ ๊ฒฝ์šฐ + +> +ํŠธ๋Ÿญ์˜ ์šฉ๋Ÿ‰ : 40 +๋งˆ์„ : 1 // 2 // 3 // 4 +๋งˆ์„์—์„œ์˜ ํŠธ๋Ÿญ์— ์‹ฃ์€ ๋ฐ•์Šค ๊ฐœ์ˆ˜ : 10 // 10 // 0 // 0 ( + 10 ๋‚ด๋ฆผ = 20) + + - 3๋ฒˆ ์งธ ๊บผ๋‚ธ ๊ฒฝ์šฐ + +> +ํŠธ๋Ÿญ์˜ ์šฉ๋Ÿ‰ : 40 +๋งˆ์„ : 1 // 2 // 3 // 4 +๋งˆ์„์—์„œ์˜ ํŠธ๋Ÿญ์— ์‹ฃ์€ ๋ฐ•์Šค ๊ฐœ์ˆ˜ : 30(+20) // 30(+20) // 0 // 0 ( + 20 ๋‚ด๋ฆผ = 40) + + - 4๋ฒˆ ์งธ ๊บผ๋‚ธ ๊ฒฝ์šฐ + +> +ํŠธ๋Ÿญ์˜ ์šฉ๋Ÿ‰ : 40 +๋งˆ์„ : 1 // 2 // 3 // 4 +๋งˆ์„์—์„œ์˜ ํŠธ๋Ÿญ์— ์‹ฃ์€ ๋ฐ•์Šค ๊ฐœ์ˆ˜ : 30 // 30 // 20(+ 20) // 0 ( + 20 ๋‚ด๋ฆผ = 60) + + - 5๋ฒˆ ์งธ ๊บผ๋‚ธ ๊ฒฝ์šฐ + +> +ํŠธ๋Ÿญ์˜ ์šฉ๋Ÿ‰ : 40 +๋งˆ์„ : 1 // 2 // 3 // 4 +๋งˆ์„์—์„œ์˜ ํŠธ๋Ÿญ์— ์‹ฃ์€ ๋ฐ•์Šค ๊ฐœ์ˆ˜ : 30 // 40(+10) // 30(+ 10) // 0 ( + 10 ๋‚ด๋ฆผ = 70) +** ํŠธ๋Ÿญ์˜ ์šฉ๋Ÿ‰์ด 40์ด๊ธฐ ๋•Œ๋ฌธ์— 2๋ฒˆ ๋งˆ์„์— ๋ฐ•์Šค๊ฐ€ 20๊ฐœ๋‚˜ ์žˆ์Œ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  10๋งŒ ์‹ฃ์„ ์ˆ˜ ์žˆ๋‹ค. +** 3๋ฒˆ ๋งˆ์„์—๋Š” 2๋ฒˆ์—์„œ 10๋งŒ ์‹ฃ์—ˆ์œผ๋‹ˆ ๋‹น์—ฐํžˆ 10์ด ์ถ”๊ฐ€๋œ๋‹ค. + + - 6๋ฒˆ ์งธ ๊บผ๋‚ธ ๊ฒฝ์šฐ + +> +ํŠธ๋Ÿญ์˜ ์šฉ๋Ÿ‰ : 40 +๋งˆ์„ : 1 // 2 // 3 // 4 +๋งˆ์„์—์„œ์˜ ํŠธ๋Ÿญ์— ์‹ฃ์€ ๋ฐ•์Šค ๊ฐœ์ˆ˜ : 30 // 40 // 30 // 0 ( + 0 ๋‚ด๋ฆผ = 70) + +๋”ฐ๋ผ์„œ ์ตœ๋Œ€ ์˜ฎ๊ธฐ๋Š” ๋ฐ•์Šค์˜ ๊ฐœ์ˆ˜๋Š” 70๊ฐœ๊ฐ€ ๋œ๋‹ค. + +--- + +## 3. ์†Œ์Šค ์ฝ”๋“œ + +```java +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.util.ArrayList; +import java.util.Collections; +import java.util.StringTokenizer; + +public class ParcelService_8980 { + public int solution(int n, int c, ArrayList townboxes) { + Collections.sort(townboxes); + + int[] boxes = new int[n + 1]; + int boxCount = 0; + for(TownBoxes town : townboxes) { + int start = town.start; + int end = town.end; + int box = town.boxes; + + int max = 0; + boolean isLoad = true; + for(int i = start; i < end; i++) { + if(boxes[i] >= c) { + isLoad = false; + break; + } + max = Math.max(boxes[i], max); + } + + if(isLoad) { + int dropOff = c - max; + if(dropOff > box) { + dropOff = box; + } + boxCount += dropOff; + + for(int i = start; i < end; i++) { + boxes[i] += dropOff; + } + } + } + + return boxCount; + } + public static void main(String[] args) throws IOException { + ParcelService_8980 mc = new ParcelService_8980(); + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + StringTokenizer st = new StringTokenizer(br.readLine()); + + int N = Integer.parseInt(st.nextToken()); + int C = Integer.parseInt(st.nextToken()); + + st = new StringTokenizer(br.readLine()); + int M = Integer.parseInt(st.nextToken()); + ArrayList boxes = new ArrayList<>(); + for (int i = 0; i < M; i++) { + st = new StringTokenizer(br.readLine()); + int start = Integer.parseInt(st.nextToken()); + int end = Integer.parseInt(st.nextToken()); + int box = Integer.parseInt(st.nextToken()); + boxes.add(new TownBoxes(start, end, box)); + } + + System.out.println(mc.solution(N, C, boxes)); + } +} + +class TownBoxes implements Comparable { + int start = 0; + int end = 0; + int boxes = 0; + TownBoxes(int start, int end, int boxes) { + this.start = start; + this.end = end; + this.boxes = boxes; + } + + @Override + public int compareTo(TownBoxes box) { + if(this.end == box.end) return this.start - box.start; + else return this.end - box.end; + } +} +``` diff --git a/src/content/blog/study/algorithmsolutions/2022-03-27-algo-problem-2-6.md b/src/content/blog/study/algorithmsolutions/2022-03-27-algo-problem-2-6.md new file mode 100644 index 0000000..9de4f1b --- /dev/null +++ b/src/content/blog/study/algorithmsolutions/2022-03-27-algo-problem-2-6.md @@ -0,0 +1,78 @@ +--- +title: Algorithm ๊ฐ•์˜ 02-06.๋’ค์ง‘์€ ์†Œ์ˆ˜ +date: 2022-03-27 +tags: algorithmsolutions, ๊ณต๋ถ€ +excerpt: 02-06.๋’ค์ง‘์€ ์†Œ์ˆ˜ +--- +# 02-06.๋’ค์ง‘์€ ์†Œ์ˆ˜ +์•Œ๊ณ ๋ฆฌ์ฆ˜ ๊ฐ•์˜๋ฅผ ๋“ฃ๊ณ  ํ‘ธ๋Š” ์ค‘์— ๊ธฐ๋กํ•  ๋งŒํ•œ ๋‚ด์šฉ์„ ๊ธฐ๋กํ•ด ๋ด…๋‹ˆ๋‹ค. + +--- + +## 1. ๋ฌธ์ œ +
+๋ฌธ์ œ ๋ณด๊ธฐ +
+ +N๊ฐœ์˜ ์ž์—ฐ์ˆ˜๊ฐ€ ์ž…๋ ฅ๋˜๋ฉด ๊ฐ ์ž์—ฐ์ˆ˜๋ฅผ ๋’ค์ง‘์€ ํ›„ ๊ทธ ๋’ค์ง‘์€ ์ˆ˜๊ฐ€ ์†Œ์ˆ˜์ด๋ฉด ๊ทธ ์†Œ์ˆ˜๋ฅผ ์ถœ๋ ฅํ•˜ ๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์„ธ์š”. ์˜ˆ๋ฅผ ๋“ค์–ด 32๋ฅผ ๋’ค์ง‘์œผ๋ฉด 23์ด๊ณ , 23์€ ์†Œ์ˆ˜์ด๋‹ค. ๊ทธ๋Ÿฌ๋ฉด 23์„ ์ถœ ๋ ฅํ•œ๋‹ค. ๋‹จ 910๋ฅผ ๋’ค์ง‘์œผ๋ฉด 19๋กœ ์ˆซ์žํ™” ํ•ด์•ผ ํ•œ๋‹ค. ์ฒซ ์ž๋ฆฌ๋ถ€ํ„ฐ์˜ ์—ฐ์†๋œ 0์€ ๋ฌด์‹œํ•œ๋‹ค. + +### ์ž…๋ ฅ(Input) + +์ฒซ ์ค„์— ์ž์—ฐ์ˆ˜์˜ ๊ฐœ์ˆ˜ N(3<=N<=100)์ด ์ฃผ์–ด์ง€๊ณ , ๊ทธ ๋‹ค์Œ ์ค„์— N๊ฐœ์˜ ์ž์—ฐ์ˆ˜๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. ๊ฐ ์ž์—ฐ์ˆ˜์˜ ํฌ๊ธฐ๋Š” 100,000๋ฅผ ๋„˜์ง€ ์•Š๋Š”๋‹ค. + +### ์ถœ๋ ฅ(Output) + +์ฒซ ์ค„์— ๋’ค์ง‘์€ ์†Œ์ˆ˜๋ฅผ ์ถœ๋ ฅํ•ฉ๋‹ˆ๋‹ค. ์ถœ๋ ฅ์ˆœ์„œ๋Š” ์ž…๋ ฅ๋œ ์ˆœ์„œ๋Œ€๋กœ ์ถœ๋ ฅํ•ฉ๋‹ˆ๋‹ค. + +
+
+ +--- + +## 2. ๋ฌธ์ œ ํ’€์ด + +```java +import java.util.ArrayList; +import java.util.Scanner; + +class problem_02_06 { + public boolean isPrime(int num) { + if(num == 1) return false; + for(int i = 2; i < num; i++) { + if(num % i == 0) return false; + } + return true; + } + + public ArrayList solution(int N, int[] arr) { + ArrayList list = new ArrayList<>(); + + for(int i = 0; i < N; i++) { + int tmp = arr[i]; + int res = 0; + while(tmp > 0) { + int t = tmp % 10; + res = res * 10 + t; + tmp = tmp / 10; + } + + if(isPrime(res)) list.add(res); + } + + return list; + } + public static void main(String[] args) { + problem_02_06 mc = new problem_02_06(); + Scanner sc = new Scanner(System.in); + int N = sc.nextInt(); + int[] arr = new int[N]; + for(int i = 0; i < N; i++) { + arr[i] = sc.nextInt(); + } + for(int x : mc.solution(N, arr)) { + System.out.print(x + " "); + } + } +} + +``` diff --git a/src/content/blog/study/algorithmsolutions/2022-03-29-algo-baekjoon-6198.md b/src/content/blog/study/algorithmsolutions/2022-03-29-algo-baekjoon-6198.md new file mode 100644 index 0000000..b45a937 --- /dev/null +++ b/src/content/blog/study/algorithmsolutions/2022-03-29-algo-baekjoon-6198.md @@ -0,0 +1,118 @@ +--- +title: Baekjoon online judge. 6198.์˜ฅ์ƒ ์ •์› ๊พธ๋ฏธ๊ธฐ +date: 2022-03-29 +tags: algorithmsolutions, ๊ณต๋ถ€, stack +excerpt: 6198.์˜ฅ์ƒ ์ •์› ๊พธ๋ฏธ๊ธฐ - ๋ฐฑ์ค€์˜จ๋ผ์ธ +--- +# 6198.์˜ฅ์ƒ ์ •์› ๊พธ๋ฏธ๊ธฐ - ๋ฐฑ์ค€์˜จ๋ผ์ธ +ํ•ด๋‹น ๋ฌธ์ œ๋Š” ์Šคํƒ(stack) ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ํ™œ์šฉํ•˜์—ฌ ํ’€์–ด๋ณด์•˜์Šต๋‹ˆ๋‹ค. + +๋งํฌ : +[![image](/assets/img/algo_img/baekjoon_logo.png)](https://www.acmicpc.net/problem/6198) + +--- +## 1. ๋ฌธ์ œ +
+๋ฌธ์ œ ๋ณด๊ธฐ +
+ +|์‹œ๊ฐ„ ์ œํ•œ|๋ฉ”๋ชจ๋ฆฌ ์ œํ•œ| +|------|---| +|1 ์ดˆ|128 MB| + +๋„์‹œ์—๋Š” N๊ฐœ์˜ ๋นŒ๋”ฉ์ด ์žˆ๋‹ค. + +๋นŒ๋”ฉ ๊ด€๋ฆฌ์ธ๋“ค์€ ๋งค์šฐ ์„ฑ์‹ค ํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ๋‹ค๋ฅธ ๋นŒ๋”ฉ์˜ ์˜ฅ์ƒ ์ •์›์„ ๋ฒค์น˜๋งˆํ‚น ํ•˜๊ณ  ์‹ถ์–ดํ•œ๋‹ค. + +i๋ฒˆ์งธ ๋นŒ๋”ฉ์˜ ํ‚ค๊ฐ€ hi์ด๊ณ , ๋ชจ๋“  ๋นŒ๋”ฉ์€ ์ผ๋ ฌ๋กœ ์„œ ์žˆ๊ณ  ์˜ค๋ฅธ์ชฝ์œผ๋กœ๋งŒ ๋ณผ ์ˆ˜ ์žˆ๋‹ค. + +i๋ฒˆ์งธ ๋นŒ๋”ฉ ๊ด€๋ฆฌ์ธ์ด ๋ณผ ์ˆ˜ ์žˆ๋Š” ๋‹ค๋ฅธ ๋นŒ๋”ฉ์˜ ์˜ฅ์ƒ ์ •์›์€ i+1, i+2, .... , N์ด๋‹ค. + +๊ทธ๋Ÿฐ๋ฐ ์ž์‹ ์ด ์œ„์น˜ํ•œ ๋นŒ๋”ฉ๋ณด๋‹ค ๋†’๊ฑฐ๋‚˜ ๊ฐ™์€ ๋นŒ๋”ฉ์ด ์žˆ์œผ๋ฉด ๊ทธ ๋‹ค์Œ์— ์žˆ๋Š” ๋ชจ๋“  ๋นŒ๋”ฉ์˜ ์˜ฅ์ƒ์€ ๋ณด์ง€ ๋ชปํ•œ๋‹ค. + +์˜ˆ) N=6, H = {10, 3, 7, 4, 12, 2}์ธ ๊ฒฝ์šฐ + +``` + = + = = + = - = + = = = -> ๊ด€๋ฆฌ์ธ์ด ๋ณด๋Š” ๋ฐฉํ–ฅ + = - = = = + = = = = = = +10 3 7 4 12 2 -> ๋นŒ๋”ฉ์˜ ๋†’์ด +[1][2][3][4][5][6] -> ๋นŒ๋”ฉ์˜ ๋ฒˆํ˜ธ +``` + + - 1๋ฒˆ ๊ด€๋ฆฌ์ธ์€ 2, 3, 4๋ฒˆ ๋นŒ๋”ฉ์˜ ์˜ฅ์ƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค. + - 2๋ฒˆ ๊ด€๋ฆฌ์ธ์€ ๋‹ค๋ฅธ ๋นŒ๋”ฉ์˜ ์˜ฅ์ƒ์„ ํ™•์ธํ•  ์ˆ˜ ์—†๋‹ค. + - 3๋ฒˆ ๊ด€๋ฆฌ์ธ์€ 4๋ฒˆ ๋นŒ๋”ฉ์˜ ์˜ฅ์ƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค. + - 4๋ฒˆ ๊ด€๋ฆฌ์ธ์€ ๋‹ค๋ฅธ ๋นŒ๋”ฉ์˜ ์˜ฅ์ƒ์„ ํ™•์ธํ•  ์ˆ˜ ์—†๋‹ค. + - 5๋ฒˆ ๊ด€๋ฆฌ์ธ์€ 6๋ฒˆ ๋นŒ๋”ฉ์˜ ์˜ฅ์ƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค. + - 6๋ฒˆ ๊ด€๋ฆฌ์ธ์€ ๋งˆ์ง€๋ง‰์ด๋ฏ€๋กœ ๋‹ค๋ฅธ ๋นŒ๋”ฉ์˜ ์˜ฅ์ƒ์„ ํ™•์ธํ•  ์ˆ˜ ์—†๋‹ค. + +๋”ฐ๋ผ์„œ, ๊ด€๋ฆฌ์ธ๋“ค์ด ์˜ฅ์ƒ์ •์›์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋Š” ์ด ์ˆ˜๋Š” 3 + 0 + 1 + 0 + 1 + 0 = 5์ด๋‹ค. + + +### ์ž…๋ ฅ(Input) + + - ์ฒซ ๋ฒˆ์งธ ์ค„์— ๋นŒ๋”ฉ์˜ ๊ฐœ์ˆ˜ N์ด ์ž…๋ ฅ๋œ๋‹ค.(1 โ‰ค N โ‰ค 80,000) + - ๋‘ ๋ฒˆ์งธ ์ค„ ๋ถ€ํ„ฐ N+1๋ฒˆ์งธ ์ค„๊นŒ์ง€ ๊ฐ ๋นŒ๋”ฉ์˜ ๋†’์ด๊ฐ€ hi ์ž…๋ ฅ๋œ๋‹ค. (1 โ‰ค hi โ‰ค 1,000,000,000) + +### ์ถœ๋ ฅ(Output) + + - ๊ฐ ๊ด€๋ฆฌ์ธ๋“ค์ด ๋ฒค์น˜๋งˆํ‚น์ด ๊ฐ€๋Šฅํ•œ ๋นŒ๋”ฉ์˜ ์ˆ˜์˜ ํ•ฉ์„ ์ถœ๋ ฅํ•œ๋‹ค. + +
+
+ +--- + +## 2. ๋ฌธ์ œ ํ’€์ด + +์ฒ˜์Œ์—๋Š” ์ž…๋ ฅ์˜ ์ƒ์„ธ๋ฅผ ๋ณด์ง€ ์•Š๊ณ  ํ‰์†Œ์ฒ˜๋Ÿผ intํ˜•์„ ์‚ฌ์šฉํ•ด์„œ ๋ฌธ์ œ๋ฅผ ํ’€๋ ค๊ณ  ํ–ˆ์—ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‹ˆ ํ‹€๋ ธ์Šต๋‹ˆ๋‹ค๊ฐ€ ๋‚˜์˜ค๊ณ , ํ‹€๋ฆฐ ๋ฐฉํ–ฅ์„ ๋ชป ์ฐพ์•„์„œ ๊ณ ๋ฏผํ–ˆ์—ˆ๋‹ค. ์ด ๋ฌธ์ œ๋Š” ๋†’์ด์˜ ๋ฒ”์œ„๊ฐ€ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— long ํƒ€์ž…์„ ์„ ์–ธํ•ด์•ผ ์ •ํ™•ํ•œ ๋‹ต์„ ๊ตฌํ•  ์ˆ˜ ์žˆ๋‹ค. + +๋ฌธ์ œ ํ•ด๊ฒฐ์„ ์œ„ํ•ด์„œ๋Š” Stack์„ ์ž˜ ํ™œ์šฉ ํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•ด๊ฒฐ ํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค. +์ด์ค‘ ๋ฐฐ์—ด์„ ์„ค์ •ํ•ด์„œ ๋’ค์˜ ๋†’์ด๊ฐ€ ํ˜„ ์œ„์น˜ ๋นŒ๋”ฉ๋ณด๋‹ค ๋†’๊ฑฐ๋‚˜ ๊ฐ™์œผ๋ฉด ํƒˆ์ถœํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ๋ฌธ์ œ๋ฅผ ์ ‘๊ทผํ–ˆ์—ˆ๋Š”๋ฐ, ๊ทธ๋Ÿฌ๋‹ˆ ํ–ˆ์—ˆ๋‹ค. + +๊ทธ๋ž˜์„œ Stack์˜ ์„ฑ์งˆ์„ ์ด์šฉํ•˜์—ฌ ์ž…๋ ฅ์˜ ์•ž๋ถ€ํ„ฐ ๋น„๊ตํ•˜์—ฌ ์ถ”๊ฐ€ํ•˜๋ฉฐ ์ตœ์ข…์ ์œผ๋กœ ๊ฐ ๊ด€๋ฆฌ์ธ๋“ค์ด ๋ฒค์น˜๋งˆํ‚น ๊ฐ€๋Šฅํ•œ ๋นŒ๋”ฉ์˜ ์ˆ˜ ํ•ฉ์„ ๊ตฌํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค. + + +```java +import java.io.IOException; +import java.util.Scanner; +import java.util.Stack; + +public class RooftopGarden_6198 { + public long solution(long[] b) { + long answer = 0; + int bLen = b.length; + Stack st = new Stack<>(); + + for(int i = 0; i < bLen; i++) { + + while(!st.isEmpty()) { + if(st.peek() <= b[i]) st.pop(); + else break; + } + + answer += st.size(); + st.add(b[i]); + } + + return answer; + } + public static void main(String[] args) throws IOException { + RooftopGarden_6198 mc = new RooftopGarden_6198(); + Scanner sc = new Scanner(System.in); + int N = sc.nextInt(); + + long[] building = new long[N]; + for(int i = 0; i < N; i++) { + building[i] = sc.nextLong(); + } + + System.out.println(mc.solution(building)); + } +} + +``` diff --git a/src/content/blog/study/algorithmsolutions/2022-03-30-algo-baekjoon-1717.md b/src/content/blog/study/algorithmsolutions/2022-03-30-algo-baekjoon-1717.md new file mode 100644 index 0000000..2658b6c --- /dev/null +++ b/src/content/blog/study/algorithmsolutions/2022-03-30-algo-baekjoon-1717.md @@ -0,0 +1,152 @@ +--- +title: Baekjoon online judge. 1717.์ง‘ํ•ฉ์˜ ํ‘œํ˜„ +date: 2022-03-30 +tags: algorithmsolutions, ๊ณต๋ถ€, union-find +excerpt: 1717.์ง‘ํ•ฉ์˜ ํ‘œํ˜„ - ๋ฐฑ์ค€์˜จ๋ผ์ธ +--- +# 1717.์ง‘ํ•ฉ์˜ ํ‘œํ˜„ - ๋ฐฑ์ค€์˜จ๋ผ์ธ +ํ•ด๋‹น ๋ฌธ์ œ๋Š” union, find ๋ผ๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๊ธฐ๋ฒ•์„ ํ™œ์šฉํ•˜์—ฌ ํ’€์–ด๋ณด์•˜์Šต๋‹ˆ๋‹ค. + +๋งํฌ : +[![image](/assets/img/algo_img/baekjoon_logo.png)](https://www.acmicpc.net/problem/1717) + +--- +## 1. ๋ฌธ์ œ +
+๋ฌธ์ œ ๋ณด๊ธฐ +
+ +|์‹œ๊ฐ„ ์ œํ•œ|๋ฉ”๋ชจ๋ฆฌ ์ œํ•œ| +|------|---| +|2 ์ดˆ|128 MB| + +์ดˆ๊ธฐ์— {0}, {1}, {2}, ... {n} ์ด ๊ฐ๊ฐ n+1๊ฐœ์˜ ์ง‘ํ•ฉ์„ ์ด๋ฃจ๊ณ  ์žˆ๋‹ค. ์—ฌ๊ธฐ์— ํ•ฉ์ง‘ํ•ฉ ์—ฐ์‚ฐ๊ณผ, ๋‘ ์›์†Œ๊ฐ€ ๊ฐ™์€ ์ง‘ํ•ฉ์— ํฌํ•จ๋˜์–ด ์žˆ๋Š”์ง€๋ฅผ ํ™•์ธํ•˜๋Š” ์—ฐ์‚ฐ์„ ์ˆ˜ํ–‰ํ•˜๋ ค๊ณ  ํ•œ๋‹ค. + +์ง‘ํ•ฉ์„ ํ‘œํ˜„ํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค. + +### ์ž…๋ ฅ(Input) + +์ฒซ์งธ ์ค„์— n(1 โ‰ค n โ‰ค 1,000,000), m(1 โ‰ค m โ‰ค 100,000)์ด ์ฃผ์–ด์ง„๋‹ค. m์€ ์ž…๋ ฅ์œผ๋กœ ์ฃผ์–ด์ง€๋Š” ์—ฐ์‚ฐ์˜ ๊ฐœ์ˆ˜์ด๋‹ค. ๋‹ค์Œ m๊ฐœ์˜ ์ค„์—๋Š” ๊ฐ๊ฐ์˜ ์—ฐ์‚ฐ์ด ์ฃผ์–ด์ง„๋‹ค. ํ•ฉ์ง‘ํ•ฉ์€ 0 a b์˜ ํ˜•ํƒœ๋กœ ์ž…๋ ฅ์ด ์ฃผ์–ด์ง„๋‹ค. ์ด๋Š” a๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ๋Š” ์ง‘ํ•ฉ๊ณผ, b๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ๋Š” ์ง‘ํ•ฉ์„ ํ•ฉ์นœ๋‹ค๋Š” ์˜๋ฏธ์ด๋‹ค. ๋‘ ์›์†Œ๊ฐ€ ๊ฐ™์€ ์ง‘ํ•ฉ์— ํฌํ•จ๋˜์–ด ์žˆ๋Š”์ง€๋ฅผ ํ™•์ธํ•˜๋Š” ์—ฐ์‚ฐ์€ 1 a b์˜ ํ˜•ํƒœ๋กœ ์ž…๋ ฅ์ด ์ฃผ์–ด์ง„๋‹ค. ์ด๋Š” a์™€ b๊ฐ€ ๊ฐ™์€ ์ง‘ํ•ฉ์— ํฌํ•จ๋˜์–ด ์žˆ๋Š”์ง€๋ฅผ ํ™•์ธํ•˜๋Š” ์—ฐ์‚ฐ์ด๋‹ค. a์™€ b๋Š” n ์ดํ•˜์˜ ์ž์—ฐ์ˆ˜ ๋˜๋Š” 0์ด๋ฉฐ ๊ฐ™์„ ์ˆ˜๋„ ์žˆ๋‹ค. + +### ์ถœ๋ ฅ(Output) + +1๋กœ ์‹œ์ž‘ํ•˜๋Š” ์ž…๋ ฅ์— ๋Œ€ํ•ด์„œ ํ•œ ์ค„์— ํ•˜๋‚˜์”ฉ YES/NO๋กœ ๊ฒฐ๊ณผ๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค. (yes/no ๋ฅผ ์ถœ๋ ฅํ•ด๋„ ๋œ๋‹ค) + +
+
+ +--- + +## 2. ๋ฌธ์ œ ํ’€์ด + +์ด ๋ฌธ์ œ๋Š” ์ด์ „์— SSAFY๋ฅผ ๋‹ค๋‹ˆ๋ฉด์„œ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ˆ˜์—… ์‹œ๊ฐ„์— ๋ฐฐ์› ๋˜ union, find ๋ฐฉ๋ฒ•์„ ํ™œ์šฉํ•ด์„œ ๋ฌธ์ œ๋ฅผ ํ’€์–ด๋ณผ ์ˆ˜ ์žˆ์—ˆ๋‹ค. + +์˜ค๋žœ๋œ ๊ธฐ์–ต์ด๋ผ์„œ ์ฒ˜์Œ์—๋Š” ํ—ค๋งค๊ธฐ๋„ ํ–ˆ์ง€๋งŒ ์ •๋ฆฌํ•ด๋‘” ๋‚ด์šฉ์„ ๋‹ค์‹œ ์ƒ๊ฐํ•ด๋ณด๋ฉฐ ๋”๋“ฌ์–ด๊ฐ€๋ฉด์„œ ํ’€์—ˆ๋‹ค. + +union, find ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด์„œ ๋‹ค์‹œ ํ•œ ๋ฒˆ ์ •๋ฆฌํ•˜์ž๋ฉด ์ฒดํฌ ํ•  ๋ฉค๋ฒ„๋“ค์˜ ์ˆ˜์˜ ๋ฐฐ์—ด์— ํ•ด๋‹น ์—ฐ๊ด€์ด ์žˆ๋Š”์ง€ ํ‘œ์‹œ๋ฅผ ํ•˜๊ณ , ๊ฐ™์€ ๊ทธ๋ฃน์ธ์ง€ ์•„๋‹Œ์ง€ ํ™•์ธ ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค. + +์ด ๋ฌธ์ œ์—์„œ์˜ ์กฐ๊ฑด์€ 0 ์ž…๋ ฅ์ด ๋“ค์–ด์˜ค๋ฉด find๋กœ ์ฐพ์•„์„œ union์œผ๋กœ ๋ฌถ๊ณ , 1 ์ž…๋ ฅ์ด ๋“ค์–ด์˜ค๋ฉด find๋กœ ์ฐพ์•„์„œ ํ‘œ์ถœํ•ด ์ฃผ๋ผ๊ณ  ํ•œ๋‹ค. + +``` +[0][1][2][3][4][5] + -1 -1 -1 -1 -1 -1 + +์ฒ˜์Œ์—๋Š” ๊ทธ๋ฃน์ด ์—†๋‹ค๊ณ  ํ•˜์—ฌ ์œ„์™€ ๊ฐ™์ด ์„ธํŒ…์„ ํ•œ๋‹ค. +``` + +๋ถ€๋ชจ ๋ฐฐ์—ด์„ ์„ ์–ธํ•˜๊ณ  union, find์˜ ๋ฐฉ๋ฒ•์„ ๊ฐ๊ฐ ์ •์˜ ํ•œ๋‹ค. + +union์€ ๊ฐ™์€ ๊ทธ๋ฃน์ธ์ง€ ๋จผ์ € ์ฐพ์•„๋ด์•ผ ํ•˜๋ฏ€๋กœ find๋ฅผ ๋จผ์ € ์ •์˜ํ•ด๋ณด์ž. + +์ฐพ๊ณ ์žํ•˜๋Š” ์ˆ˜์˜ ๋ฐฐ์—ด ์œ„์น˜๋ฅผ ํ™•์ธํ•˜์—ฌ ํ•ด๋‹น ๊ทธ๋ฃน์ด ์กด์žฌํ•˜๋ฉด ์žฌ๊ท€์˜ ๋ฐฉ๋ฒ•์œผ๋กœ ์ตœ์ข… root๋ฅผ ์ฐพ๋Š”๋‹ค. + +``` +[0][1][2][3][4][5] + -1 -1 -1 1 -1 3 + +find(5); + -> 5๋ฅผ find ํ•˜๋ฉด ํ•ด๋‹น ๋ถ€๋ชจ ๋ฐฐ์—ด์—์„œ 3์„ ์ฐพ์„ ์ˆ˜ ์žˆ๋‹ค. + ๊ทธ๋Ÿฌ๋ฉด 3์„ ๋‹ค์‹œ findํ•œ๋‹ค. + +find(3) + -> 3์„ find ํ•˜๋ฉด ๋ถ€๋ชจ ๋ฐฐ์—ด์—์„œ 1์„ ์ฐพ์„ ์ˆ˜ ์žˆ๋‹ค. + ๊ทธ๋Ÿฌ๋ฉด 1์„ ๋‹ค์‹œ findํ•œ๋‹ค. + +find(1) + -> 1์„ findํ•˜๋ฉด -1 ์ฆ‰, ์ตœ์ƒ๋‹จ ๋ถ€๋ชจ๋ผ๋Š” ๋œป์ด๋œ๋‹ค. + +๊ทธ๋Ÿฌ๋ฉด 1-3-5 ์˜ ํŠธ๋ฆฌ์™€ ๊ฐ™์€ ๊ตฌ์กฐ๋กœ ๊ทธ๋ฃน์„ ๊ทธ๋ ค ๋ณผ ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค. +``` + +์œ„์™€ ๊ฐ™์ด find์˜ ๋ฐฉ๋ฒ•์„ ์„ค๋ช…ํ–ˆ๋‹ค๋ฉด ์ด๋ฒˆ์—๋Š” union์„ ์•Œ์•„๋ณธ๋‹ค. +``` +[0][1][2][3][4][5] + -1 -1 -1 1 2 3 + +union(4, 5)๊ฐ€ ๋˜๋ฉด ๊ฐ๊ฐ์˜ 4์™€ 5์˜ ์ตœ์ƒ๋‹จ์„ find๋กœ ์ฐพ์•„๋‚ธ๋‹ค. +find(5) => 1 || find(4) => 2 +๊ฐ€ ๋˜๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค. +``` + +์ด ๋‘˜์€ ๋‹ค๋ฅธ ๊ทธ๋ฃน์ด๊ธฐ ๋•Œ๋ฌธ์— ํ•ฉ์น  ์ˆ˜ ์žˆ๋‹ค. +๊ฐ๊ฐ์˜ ๋ฃจํŠธ๋ฅผ ์ฐพ์•˜๊ธฐ ๋•Œ๋ฌธ์— ์ด์ œ ์–ด๋А ํ•œ ์ชฝ์˜ ๋ฃจํŠธ๋ฅผ ๋‹ค๋ฅธ์ชฝ์˜ ๋ฃจํŠธ์˜ ์ž์‹์œผ๋กœ ๋„ฃ์–ด์ฃผ๊ธฐ๋งŒ ํ•˜๋ฉด ๋œ๋‹ค. +1์„ 2์˜ ์ž์‹์œผ๋กœ ๋„ฃ๊ฒŒ๋˜๋ฉด parents[1] = 2 ๊ฐ€ ๋˜๊ฒ ๋‹ค. + +๊ทธ๋Ÿฌ๋ฉด ๊ฒฐ๊ตญ union ํ›„์˜ ๋ชจ์Šต์€ ๋…ผ๋ฆฌ์ ์œผ๋กœ ์•„๋ž˜์™€ ๊ฐ™์„ ๊ฒƒ์ด๋‹ค. + +``` +[0] [1] [2] [3] : depth + 2 - 1 - 3 - 5 + - 4 +``` + +์ด๋Ÿฌํ•œ ๋ฐฉ์‹์„ ์ด์šฉํ•˜์—ฌ ์ง‘ํ•ฉ์„ ํ‘œํ˜„ํ•˜๊ณ  ๋ฌถ์–ด์ค„ ์ˆ˜ ์žˆ๋‹ค. + +๊ทธ๋Ÿผ ์ด๊ฒƒ์„ ํ™œ์šฉํ•˜์—ฌ ์ฝ”๋“œ๋กœ ํ‘œํ˜„ํ•ด๋ณด์ž. + +```java +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.util.Arrays; +import java.util.StringTokenizer; + +public class SetRepre_1717 { + static int[] parents; + private static boolean union(int a, int b) { + int aRoot = find(a); + int bRoot = find(b); + if(aRoot != bRoot) { + parents[bRoot] = aRoot; + return true; + } + return false; + } + private static int find(int a) { + if(parents[a] < 0) return a; + return parents[a] = find(parents[a]); + } + public static void main(String[] args) throws IOException { + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + StringTokenizer st = new StringTokenizer(br.readLine()); + + int n = Integer.parseInt(st.nextToken()); + int m = Integer.parseInt(st.nextToken()); + parents = new int[n + 1]; + Arrays.fill(parents, -1); + for(int i = 0; i < m; i++) { + if(!st.hasMoreTokens()) st = new StringTokenizer(br.readLine()); + // ํ•ฉ์ง‘ํ•ฉ์€ 0 a b์˜ ํ˜•ํƒœ๋กœ ์ž…๋ ฅ์ด ์ฃผ์–ด์ง„๋‹ค. ์ด๋Š” a๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ๋Š” ์ง‘ํ•ฉ๊ณผ, b๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ๋Š” ์ง‘ํ•ฉ์„ ํ•ฉ์นœ๋‹ค๋Š” ์˜๋ฏธ + int condition = Integer.parseInt(st.nextToken()); + int a = Integer.parseInt(st.nextToken()); + int b = Integer.parseInt(st.nextToken()); + if(condition == 0) { + union(a, b); + } else { // ๋‘ ์›์†Œ๊ฐ€ ๊ฐ™์€ ์ง‘ํ•ฉ์— ํฌํ•จ๋˜์–ด ์žˆ๋Š”์ง€๋ฅผ ํ™•์ธํ•˜๋Š” ์—ฐ์‚ฐ์€ 1 a b + if(find(a) == find(b)) System.out.println("YES"); + else System.out.println("NO"); + } + } + } +} +``` diff --git a/src/content/blog/study/algorithmsolutions/2022-04-05-algo-baekjoon-2302.md b/src/content/blog/study/algorithmsolutions/2022-04-05-algo-baekjoon-2302.md new file mode 100644 index 0000000..cdc1457 --- /dev/null +++ b/src/content/blog/study/algorithmsolutions/2022-04-05-algo-baekjoon-2302.md @@ -0,0 +1,138 @@ +--- +title: Baekjoon online judge. 2302.๊ทน์žฅ ์ขŒ์„ +date: 2022-04-05 +tags: algorithmsolutions, ๊ณต๋ถ€, DP +excerpt: 2302.๊ทน์žฅ ์ขŒ์„ - ๋ฐฑ์ค€์˜จ๋ผ์ธ +--- +# 2302.๊ทน์žฅ ์ขŒ์„ - ๋ฐฑ์ค€์˜จ๋ผ์ธ +ํ•ด๋‹น ๋ฌธ์ œ๋Š” DP ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๊ธฐ๋ฒ•์„ ํ™œ์šฉํ•˜์—ฌ ํ’€์–ด๋ณด์•˜์Šต๋‹ˆ๋‹ค. + +๋งํฌ : +[![image](/assets/img/algo_img/baekjoon_logo.png)](https://www.acmicpc.net/problem/2302) + +--- +## 1. ๋ฌธ์ œ +
+๋ฌธ์ œ ๋ณด๊ธฐ +
+ +|์‹œ๊ฐ„ ์ œํ•œ|๋ฉ”๋ชจ๋ฆฌ ์ œํ•œ| +|------|---| +|2 ์ดˆ|128 MB| + +์–ด๋–ค ๊ทน์žฅ์˜ ์ขŒ์„์€ ํ•œ ์ค„๋กœ ๋˜์–ด ์žˆ์œผ๋ฉฐ ์™ผ์ชฝ๋ถ€ํ„ฐ ์ฐจ๋ก€๋Œ€๋กœ 1๋ฒˆ๋ถ€ํ„ฐ N๋ฒˆ๊นŒ์ง€ ๋ฒˆํ˜ธ๊ฐ€ ๋งค๊ฒจ์ ธ ์žˆ๋‹ค. ๊ณต์—ฐ์„ ๋ณด๋Ÿฌ ์˜จ ์‚ฌ๋žŒ๋“ค์€ ์ž๊ธฐ์˜ ์ž…์žฅ๊ถŒ์— ํ‘œ์‹œ๋˜์–ด ์žˆ๋Š” ์ขŒ์„์— ์•‰์•„์•ผ ํ•œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด์„œ, ์ž…์žฅ๊ถŒ์— 5๋ฒˆ์ด ์“ฐ์—ฌ ์žˆ์œผ๋ฉด 5๋ฒˆ ์ขŒ์„์— ์•‰์•„์•ผ ํ•œ๋‹ค. ๋‹จ, ์ž๊ธฐ์˜ ๋ฐ”๋กœ ์™ผ์ชฝ ์ขŒ์„ ๋˜๋Š” ๋ฐ”๋กœ ์˜ค๋ฅธ์ชฝ ์ขŒ์„์œผ๋กœ๋Š” ์ž๋ฆฌ๋ฅผ ์˜ฎ๊ธธ ์ˆ˜ ์žˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด์„œ, 7๋ฒˆ ์ž…์žฅ๊ถŒ์„ ๊ฐ€์ง„ ์‚ฌ๋žŒ์€ 7๋ฒˆ ์ขŒ์„์€ ๋ฌผ๋ก ์ด๊ณ , 6๋ฒˆ ์ขŒ์„์ด๋‚˜ 8๋ฒˆ ์ขŒ์„์—๋„ ์•‰์„ ์ˆ˜ ์žˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ 5๋ฒˆ ์ขŒ์„์ด๋‚˜ 9๋ฒˆ ์ขŒ์„์—๋Š” ์•‰์„ ์ˆ˜ ์—†๋‹ค. + +๊ทธ๋Ÿฐ๋ฐ ์ด ๊ทน์žฅ์—๋Š” โ€œVIP ํšŒ์›โ€๋“ค์ด ์žˆ๋‹ค. ์ด ์‚ฌ๋žŒ๋“ค์€ ๋ฐ˜๋“œ์‹œ ์ž๊ธฐ ์ขŒ์„์—๋งŒ ์•‰์•„์•ผ ํ•˜๋ฉฐ ์˜† ์ขŒ์„์œผ๋กœ ์ž๋ฆฌ๋ฅผ ์˜ฎ๊ธธ ์ˆ˜ ์—†๋‹ค. + +์˜ค๋Š˜ ๊ณต์—ฐ์€ ์ž…์žฅ๊ถŒ์ด ๋งค์ง„๋˜์–ด 1๋ฒˆ ์ขŒ์„๋ถ€ํ„ฐ N๋ฒˆ ์ขŒ์„๊นŒ์ง€ ๋ชจ๋“  ์ขŒ์„์ด ๋‹ค ํŒ”๋ ธ๋‹ค. VIP ํšŒ์›๋“ค์˜ ์ขŒ์„ ๋ฒˆํ˜ธ๋“ค์ด ์ฃผ์–ด์กŒ์„ ๋•Œ, ์‚ฌ๋žŒ๋“ค์ด ์ขŒ์„์— ์•‰๋Š” ์„œ๋กœ ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์˜ ๊ฐ€์ง“์ˆ˜๋ฅผ ๊ตฌํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค. + +์˜ˆ๋ฅผ ๋“ค์–ด์„œ, ๊ทธ๋ฆผ๊ณผ ๊ฐ™์ด ์ขŒ์„์ด 9๊ฐœ์ด๊ณ , 4๋ฒˆ ์ขŒ์„๊ณผ 7๋ฒˆ ์ขŒ์„์ด VIP์„์ธ ๊ฒฝ์šฐ์— <123456789>๋Š” ๋ฌผ๋ก  ๊ฐ€๋Šฅํ•œ ๋ฐฐ์น˜์ด๋‹ค. ๋˜ํ•œ <213465789> ์™€ <132465798> ๋„ ๊ฐ€๋Šฅํ•œ ๋ฐฐ์น˜์ด๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ <312456789> ์™€ <123546789> ๋Š” ํ—ˆ์šฉ๋˜์ง€ ์•Š๋Š” ๋ฐฐ์น˜ ๋ฐฉ๋ฒ•์ด๋‹ค. + +![image](/assets/img/algo_img/boj_2302.jpeg) + +### ์ž…๋ ฅ(Input) + +์ฒซ์งธ ์ค„์—๋Š” ์ขŒ์„์˜ ๊ฐœ์ˆ˜ N์ด ์ž…๋ ฅ๋œ๋‹ค. N์€ 1 ์ด์ƒ 40 ์ดํ•˜์ด๋‹ค. ๋‘˜์งธ ์ค„์—๋Š” ๊ณ ์ •์„์˜ ๊ฐœ์ˆ˜ M์ด ์ž…๋ ฅ๋œ๋‹ค. M์€ 0 ์ด์ƒ N ์ดํ•˜์ด๋‹ค. ๋‹ค์Œ M ๊ฐœ์˜ ์ค„์—๋Š” ๊ณ ์ •์„์˜ ๋ฒˆํ˜ธ๊ฐ€ ์ž‘์€ ์ˆ˜๋ถ€ํ„ฐ ํฐ ์ˆ˜์˜ ์ˆœ์„œ๋กœ ํ•œ ์ค„์— ํ•˜๋‚˜์”ฉ ์ž…๋ ฅ๋œ๋‹ค. + +### ์ถœ๋ ฅ(Output) + +์ฃผ์–ด์ง„ ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋ฉด์„œ ์‚ฌ๋žŒ๋“ค์ด ์ขŒ์„์— ์•‰์„ ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์˜ ๊ฐ€์ง“์ˆ˜๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค. ๋ฐฉ๋ฒ•์˜ ๊ฐ€์ง“์ˆ˜๋Š” 2,000,000,000์„ ๋„˜์ง€ ์•Š๋Š”๋‹ค. (2,000,000,000 < 231-1) + +
+
+ +--- + +## 2. ๋ฌธ์ œ ํ’€์ด + +์ด ๋ฌธ์ œ๋ฅผ DP ๋ฐฉ์‹์œผ๋กœ ํ’€๊ธฐ ์œ„ํ•ด์„œ ์ ํ™”์‹์„ ๋จผ์ € ์„ธ์›Œ ๋ณด๊ธฐ๋กœ ํ–ˆ๋‹ค. + +``` +์ขŒ์„์ด 1๊ฐœ์ธ ๊ฒฝ์šฐ + -> [1] +``` + +``` +์ขŒ์„์ด 2๊ฐœ์ธ ๊ฒฝ์šฐ + -> [1][2] + -> [2][1] +``` + +``` +์ขŒ์„์ด 3๊ฐœ์ธ ๊ฒฝ์šฐ + -> [1][2][3] + -> [1][3][2] + -> [2][1][3] +``` + +``` +์ขŒ์„์ด 4๊ฐœ์ธ ๊ฒฝ์šฐ + -> [1][2][3][4] + -> [1][2][4][3] + -> [1][3][2][4] + -> [2][1][3][4] + -> [2][1][4][3] + -> [1][3][2][4] +``` + +์ขŒ์„์ด 5๊ฐœ์ธ ๊ฒฝ์šฐ๋ถ€ํ„ฐ๋Š” ๊ฒฝ์šฐ์˜ ์ˆ˜๊ฐ€ ๋งŽ์•„์ง€๋‹ˆ ๋…ธ๊ฐ€๋‹ค๋กœ ์‰ฝ๊ฒŒ ์–ป์„ ์ˆ˜ ์žˆ๋Š” ์—ฌ๊ธฐ๊นŒ์ง€๋งŒ ์•Œ์•„๋ณด๋ฉด, +์ˆ˜์—ด์˜ ํ•ฉ์ด [1,2,3,5]๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ๋‹ค. +๋”ฐ๋ผ์„œ dp[i] = dp[i - 1] + dp[i - 2]; ์˜ ํ˜•ํƒœ๋กœ ๋ณด์ธ๋‹ค. + +์ด๋ ‡๊ฒŒ ์—ฐ์†ํ•œ ์ขŒ์„ ์ˆ˜์— ๋”ฐ๋ฅธ ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ์•Œ์•˜์œผ๋ฏ€๋กœ VIP์„์œผ๋กœ ์ธํ•ด์„œ ๊ตฌ๋ถ„๋œ ์ขŒ์„์˜ ์—ฐ์† ์ˆ˜๋ฅผ ์ €์žฅํ•ด์„œ ํ•ด๋‹นํ•˜๋Š” ๋ชจ๋“  DP ๊ฐ’์„ ๊ณฑํ•ด์ฃผ๋ฉด ๊ตฌํ•˜๊ณ ์ž ํ•˜๋Š” ๋ชจ๋“  ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ๊ตฌํ•  ์ˆ˜ ์žˆ๋‹ค. + +์—ฌ๊ธฐ์„œ 5๊ฐœ์ธ ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ๊ตฌํ•  ๋•Œ, DP๋ฅผ ๊ตฌํ•˜๋Š” ๋ฐฉ์‹์ฒ˜๋Ÿผ ์ชผ๊ฐœ์„œ ์ƒ๊ฐํ•ด๋ณด๋ฉด +์•„๋ž˜๋Š” **์ขŒ์„ 5๊ฐœ๋ฅผ 4๊ฐœ 1๊ฐœ๋กœ ๋‚˜๋ˆ„์–ด ์ƒ๊ฐํ•ด ๋ณธ ๊ฒฝ์šฐ**์ด๋‹ค. +```markdown +[1][2][3][4] [5] +DP[5] = DP[4] * DP[1] = 5 * 1 = 5 +``` + +์œ„์˜ ๊ฒฝ์šฐ์ฒ˜๋Ÿผ ์ชผ๊ฐœ์„œ ๊ตฌํ•œ ๊ฒฝ์šฐ์˜ ์ˆ˜์™€ ์ค‘๋ณต๋˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ๋Š” ๋ฌด์—‡์ด ์žˆ์„์ง€ ์ƒ๊ฐํ•ด๋ณด์ž. + +๋งˆ์ง€๋ง‰ `5`๋ฒˆ ์ขŒ์„์ด ๋ฐ”๋กœ ์•ž์œผ๋กœ ๊ฐ€๋Š” ๊ฒฝ์šฐ๋ฅผ ์ƒ๊ฐํ•ด ๋ณผ ์ˆ˜ ์žˆ๋‹ค. + +```markdown +[1][2][3] [5][4] +๋’ค์ชฝ์˜ 2๊ฐœ์˜ ์ขŒ์„์€ 5 4 ๋กœ ๊ณ ์ •์ด๋‹ค. +5๊ฐ€ ๋งจ ๋งˆ์ง€๋ง‰์— ์˜ค๋Š” ๊ฒฝ์šฐ๋Š” ์•ž์˜ DP[5] = DP[4] * DP[1] ์—์„œ ๊ตฌํ–ˆ๋‹ค. + +*DP[3] * DP[2]๊ฐ€ ์•„๋‹˜์— ์ฃผ์˜!!* +``` + + +๊ทธ๋Ÿผ ์ด๊ฒƒ์„ ํ™œ์šฉํ•˜์—ฌ ์ฝ”๋“œ๋กœ ํ‘œํ˜„ํ•ด๋ณด์ž. + +```java +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; + +public class Theater_2302 { + public static int seat[]; + public static void main(String[] args) throws IOException { + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + int N = Integer.parseInt(br.readLine()); + int M = Integer.parseInt(br.readLine()); + + seat = new int[N + 1]; + + seat[0] = 1; + seat[1] = 1; + seat[2] = 2; + for(int i = 3; i <= N; i++) { + seat[i] = seat[i - 1] + seat[i - 2]; + } + + int result = 1, prev = 0; + for(int i = 0; i < M; i++) { + int temp = Integer.parseInt(br.readLine()); + result *= seat[temp - prev - 1]; + prev = temp; + } + result *= seat[N - prev]; + + System.out.println(result); + } +} +``` diff --git a/src/content/blog/study/algorithmsolutions/2022-04-06-algo-baekjoon-20166.md b/src/content/blog/study/algorithmsolutions/2022-04-06-algo-baekjoon-20166.md new file mode 100644 index 0000000..34d68af --- /dev/null +++ b/src/content/blog/study/algorithmsolutions/2022-04-06-algo-baekjoon-20166.md @@ -0,0 +1,197 @@ +--- +title: Baekjoon online judge. 20166.๋ฌธ์ž์—ด ์ง€์˜ฅ์— ๋น ์ง„ ํ˜ธ์„ +date: 2022-04-06 +tags: algorithmsolutions, ๊ณต๋ถ€, ์™„์ „ํƒ์ƒ‰ +excerpt: 20166.๋ฌธ์ž์—ด ์ง€์˜ฅ์— ๋น ์ง„ ํ˜ธ์„ - ๋ฐฑ์ค€์˜จ๋ผ์ธ +--- +# 20166.๋ฌธ์ž์—ด ์ง€์˜ฅ์— ๋น ์ง„ ํ˜ธ์„ - ๋ฐฑ์ค€์˜จ๋ผ์ธ +ํ•ด๋‹น ๋ฌธ์ œ๋Š” ์ œํ•œ ์กฐ๊ฑด์ด ์žˆ์—ˆ๊ธฐ ๋•Œ๋ฌธ์ด๋ผ๋„ ์™„์ „ ํƒ์ƒ‰ ํ™œ์šฉํ•˜์—ฌ ํ’€์–ด๋ณด์•˜์Šต๋‹ˆ๋‹ค. + +๋งํฌ : +[![image](/assets/img/algo_img/baekjoon_logo.png)](https://www.acmicpc.net/problem/20166) + +--- +## 1. ๋ฌธ์ œ +
+๋ฌธ์ œ ๋ณด๊ธฐ +
+ +|์‹œ๊ฐ„ ์ œํ•œ|๋ฉ”๋ชจ๋ฆฌ ์ œํ•œ| +|------|---| +|1 ์ดˆ|512 MB| + +ํ•˜๋ฃจ ์ข…์ผ ๋‚ด๋ฆฌ๋Š” ๋น„์— ์„ธ์ƒ์ด ์ถœ๋ ์ด๊ณ  ๊ตฌ๋ฆ„์ด ํ•ด๋ฅผ ๋จน์–ด ๋ฐค์ธ์ง€ ๋‚ฎ์ธ์ง€ ๋ชจ๋ฅด๋Š” ์–ด๋А ์—ฌ๋ฆ„ ๋‚  + +์ž  ๋“ค๊ธฐ ์‹ซ์–ด ๋ฒ„ํ‹ฐ๋˜ ํ˜ธ์„์ด๋Š” ๋ฌด๊ฑฐ์šด ๋ˆˆ๊บผํ’€์— ํŒจ๋ฐฐํ–ˆ๋‹ค. ์ •์‹ ์„ ์ฐจ๋ ค๋ณด๋‹ˆ ๋ฐ”๋‹ฅ์—๋Š” ๊ฒฉ์ž ๋ชจ์–‘์˜ ํƒ€์ผ์ด ๊ฐ€๋“ํ•œ ์„ธ์ƒ์ด์—ˆ๊ณ , ๊ฐ ํƒ€์ผ๋งˆ๋‹ค ์•ŒํŒŒ๋ฒณ ์†Œ๋ฌธ์ž๊ฐ€ ํ•˜๋‚˜์”ฉ ์จ์žˆ๋‹ค๋”๋ผ. ๋‘๋ ค์›€์— ๊ฐ€๋“ํ•ด ๋ฏธ์นœ๋“ฏ์ด ์•ž๋งŒ ๋ณด๊ณ  ๋‹ฌ๋ ค ๋์„ ์ฐพ์•„ ํ—ค๋งธ์ง€๋งŒ ์ด ์„ธ์ƒ์€ ๋์ด ์—†์—ˆ๊ณ , ๋‹ฌ๋ฆฌ๋‹ค ์ง€์ณ ๋ฐ”๋‹ฅ์— ๋“œ๋Ÿฌ๋ˆ„์šฐ๋‹ˆ ํ•˜๋Š˜์— ์ด๋Ÿฐ ๋ฌธ๊ตฌ๊ฐ€ ํ•๋น› ๊ตฌ๋ฆ„์œผ๋กœ ๋– ๋‹ค๋‹ˆ๊ณ  ์žˆ์—ˆ๋‹ค. + + - ์ด ์„ธ์ƒ์€ Nํ–‰ M์—ด์˜ ๊ฒฉ์ž๋กœ ์ƒ๊ฒผ์œผ๋ฉฐ, ๊ฐ ์นธ์— ์•ŒํŒŒ๋ฒณ์ด ์จ์žˆ๊ณ  ํ™˜ํ˜•์œผ๋กœ ์ด์–ด์ง„๋‹ค. ์™ผ์ชฝ ์œ„๋ฅผ (1, 1), ์˜ค๋ฅธ์ชฝ ์•„๋ž˜๋ฅผ (N, M)์ด๋ผ๊ณ  ํ•˜์ž. + - ๋„ˆ๋Š” ์•„๋ฌด ๊ณณ์—์„œ๋‚˜ ์‹œ์ž‘ํ•ด์„œ ์ƒํ•˜์ขŒ์šฐ๋‚˜ ๋Œ€๊ฐ์„  ๋ฐฉํ–ฅ์˜ ์นธ์œผ๋กœ ํ•œ ์นธ์”ฉ ์ด๋™ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด ๋•Œ, ์ด๋ฏธ ์ง€๋‚˜ ์™”๋˜ ์นธ๋“ค์„ ๋‹ค์‹œ ๋ฐฉ๋ฌธํ•˜๋Š” ๊ฒƒ์€ ํ—ˆ์šฉํ•œ๋‹ค. + - ์‹œ์ž‘ํ•˜๋Š” ๊ฒฉ์ž์˜ ์•ŒํŒŒ๋ฒณ์„ ์‹œ์ž‘์œผ๋กœ, ์ด๋™ํ•  ๋•Œ๋งˆ๋‹ค ๊ฐ ์นธ์— ์จ์ง„ ์•ŒํŒŒ๋ฒณ์„ ์ด์–ด ๋ถ™์—ฌ์„œ ๋ฌธ์ž์—ด์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค. + - ์ด ๊ณณ์˜ ์‹ ์ธ ๋‚ด๊ฐ€ ์ข‹์•„ํ•˜๋Š” ๋ฌธ์ž์—ด์„ K ๊ฐœ ์•Œ๋ ค์ค„ ํ„ฐ์ด๋‹ˆ, ๊ฐ ๋ฌธ์ž์—ด ๋งˆ๋‹ค ๋„ˆ๊ฐ€ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ์ž˜ ๋Œ€๋‹ตํ•ด์•ผ ๋„ˆ์˜ ์„ธ๊ณ„๋กœ ๋Œ์•„๊ฐˆ ๊ฒƒ์ด๋‹ค. + - ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ์…€ ๋•Œ, ๋ฐฉ๋ฌธ ์ˆœ์„œ๊ฐ€ ๋‹ค๋ฅด๋ฉด ๋‹ค๋ฅธ ๊ฒฝ์šฐ์ด๋‹ค. ์ฆ‰, (1,1)->(1,2) ๋กœ ๊ฐ€๋Š” ๊ฒƒ๊ณผ (1,2)->(1,1) ์„ ๊ฐ€๋Š” ๊ฒƒ์€ ์„œ๋กœ ๋‹ค๋ฅธ ๊ฒฝ์šฐ์ด๋‹ค. + + +ํ˜ธ์„์ด๋Š” ํ•˜๋Š˜์„ ๋ณด๊ณ ์„œ "ํ™˜ํ˜•์ด ๋ฌด์—‡์ธ์ง€๋Š” ์•Œ๋ ค๋‹ฌ๋ผ!" ๋ฉฐ ์†Œ๋ฆฌ๋ฅผ ์ง€๋ฅด๋‹ˆ ํ•๋น› ๊ตฌ๋ฆ„์ด ํฉ์–ด์กŒ๋‹ค๊ฐ€ ๋ชจ์ด๋ฉฐ ์•„๋ž˜์™€ ๊ฐ™์€ ๋ง์„ ๊ทธ๋ ธ๋‹ค. + + - ๋„ˆ๊ฐ€ 1ํ–‰์—์„œ ์œ„๋กœ ๊ฐ€๋ฉด N ํ–‰์œผ๋กœ ๊ฐ€๊ฒŒ ๋˜๋ฉฐ ๋ฐ˜๋Œ€๋„ ๊ฐ€๋Šฅํ•˜๋‹ค. + - ๋„ˆ๊ฐ€ 1์—ด์—์„œ ์™ผ์ชฝ์œผ๋กœ ๊ฐ€๋ฉด M ์—ด๋กœ ๊ฐ€๊ฒŒ ๋˜๋ฉฐ ๋ฐ˜๋Œ€๋„ ๊ฐ€๋Šฅํ•˜๋‹ค. + - ๋Œ€๊ฐ์„  ๋ฐฉํ–ฅ์— ๋Œ€ํ•ด์„œ๋„ ๋™์ผํ•œ ๊ทœ์น™์ด ์ ์šฉ๋œ๋‹ค. + - ํ•˜๋Š˜์— ์•„๋ž˜์™€ ๊ฐ™์€ ๊ทธ๋ฆผ์„ ๊ตฌ๋ฆ„์œผ๋กœ ๊ทธ๋ ค์ค„ ํ„ฐ์ด๋‹ˆ ์ดํ•ดํ•ด ๋•๋„๋ก ํ•˜์—ฌ๋ผ. + - ์˜ˆ๋ฅผ ๋“ค์–ด์„œ, ๋„ˆ๊ฐ€ (1, 1)์—์„œ ์œ„๋กœ ๊ฐ€๋ฉด (N, 1)์ด๊ณ , ์™ผ์ชฝ์œผ๋กœ ๊ฐ€๋ฉด (1, M)์ด๋ฉฐ ์™ผ์ชฝ ์œ„ ๋Œ€๊ฐ์„  ๋ฐฉํ–ฅ์œผ๋กœ ๊ฐ€๋ฉด (N, M)์ธ ๊ฒƒ์ด๋‹ค. + +![image](https://upload.acmicpc.net/3701860f-0ca1-45a8-8f99-ad149d1f5771/-/preview/) + +์„ธ์ƒ์„ ์ด๋ฃจ๋Š” ๊ฒฉ์ž์˜ ์ •๋ณด์™€, K ๊ฐœ์˜ ๋ฌธ์ž์—ด์ด ์ฃผ์–ด์กŒ์„ ๋•Œ, ํ˜ธ์„์ด๊ฐ€ ๋Œ€๋‹ตํ•ด์•ผ ํ•˜๋Š” ์ •๋‹ต์„ ๊ตฌํ•ด์ฃผ๋„๋ก ํ•˜์ž. + +### ์ž…๋ ฅ(Input) + +์ฒซ๋ฒˆ์งธ ์ค„์— ๊ฒฉ์ž์˜ ํฌ๊ธฐ N, M๊ณผ ์‹ ์ด ์ข‹์•„ํ•˜๋Š” ๋ฌธ์ž์—ด์˜ ๊ฐœ์ˆ˜ K ๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. + +๋‹ค์Œ์— N๊ฐœ์˜ ์ค„์— ๊ฑธ์ณ์„œ M๊ฐœ์˜ ์•ŒํŒŒ๋ฒณ ์†Œ๋ฌธ์ž๊ฐ€ ๊ณต๋ฐฑ์—†์ด ์ฃผ์–ด์ง„๋‹ค. ์—ฌ๊ธฐ์„œ์˜ ์ฒซ ๋ฒˆ์งธ ์ค„์€ 1ํ–‰์˜ ์ •๋ณด์ด๋ฉฐ, N ๋ฒˆ์งธ ์ค„์€ Nํ–‰์˜ ์ •๋ณด์ด๋‹ค. + +์ด์–ด์„œ K๊ฐœ์˜ ์ค„์— ๊ฑธ์ณ์„œ ์‹ ์ด ์ข‹์•„ํ•˜๋Š” ๋ฌธ์ž์—ด์ด ์ฃผ์–ด์ง„๋‹ค. ๋ชจ๋‘ ์•ŒํŒŒ๋ฒณ ์†Œ๋ฌธ์ž๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ๋‹ค. + + +### ์ถœ๋ ฅ(Output) + +K๊ฐœ์˜ ์ค„์— ๊ฑธ์ณ์„œ, ์‹ ์ด ์ข‹์•„ํ•˜๋Š” ๋ฌธ์ž์—ด์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ์ˆœ์„œ๋Œ€๋กœ ์ถœ๋ ฅํ•œ๋‹ค. + +### ์ œํ•œ + + - 3 โ‰ค N, M โ‰ค 10, N๊ณผ M์€ ์ž์—ฐ์ˆ˜์ด๋‹ค. + - 1 โ‰ค K โ‰ค 1,000, K๋Š” ์ž์—ฐ์ˆ˜์ด๋‹ค. + - 1 โ‰ค ์‹ ์ด ์ข‹์•„ํ•˜๋Š” ๋ฌธ์ž์—ด์˜ ๊ธธ์ด โ‰ค 5 + - ์‹ ์ด ์ข‹์•„ํ•˜๋Š” ๋ฌธ์ž์—ด์€ ์ค‘๋ณต๋  ์ˆ˜๋„ ์žˆ๋‹ค. + +
+
+ +--- + +## 2. ๋ฌธ์ œ ํ’€์ด + +์‹ ์ด ์ข‹์•„ํ•˜๋Š” ๋ฌธ์ž์—ด ๊ธธ์ด๊ฐ€ 5 ์ดํ•˜์ด๊ณ , N๊ณผ M, K์˜ ์ˆ˜๊ฐ€ ํฌ์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์™„์ „ ํƒ์ƒ‰์„ ํ†ตํ•ด์„œ ๋ฌธ์ œ๋ฅผ ํ’€์–ด๋ณผ ์ˆ˜ ์žˆ์„๊ฒƒ ๊ฐ™์•˜๋‹ค. + +์šฐ์„  ์ƒ, ํ•˜, ์ขŒ, ์šฐ ์˜ 4๋ฐฉํ–ฅ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๋Œ€๊ฐ์„ ์œผ๋กœ๋„ ๊ฐ€๋Š” 8๋ฐฉํ–ฅ์œผ๋กœ ๊ฐˆ ์ˆ˜ ์žˆ๋‹ค๊ณ  ๋‚˜์™€ ์žˆ๋‹ค. +์‹ฌ์ง€์–ด ์™”๋˜ ๋ฐฉํ–ฅ์„ ๋Œ์•„๊ฐ€์„œ ๋ฌธ์ž์—ด์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ์œผ๋‹ˆ ์™”๋˜ ๋ฐฉํ–ฅ์„ ์ฒดํฌํ•ด์ฃผ์ง€ ์•Š์•„๋„ ๋œ๋‹ค. + +๋•Œ๋ฌธ์— ํ๋ฅผ ์ด์šฉํ•ด์„œ ๋ฐ˜๋ณต์ ์œผ๋กœ ํ์— ๋„ฃ๊ณ , ํ์— ๋“ค์–ด๊ฐ„ ๋ฌธ์ž๊ฐ€ ์‹ ์ด ์ข‹์•„ํ•˜๋Š” ๋ฌธ์ž์—ด๊ณผ ๊ฐ™์œผ๋ฉด ์นด์šดํŠธ๋ฅผ ์˜ฌ๋ ค์ฃผ๋Š” ๋ฐฉ์‹์œผ๋กœ ํ’€ ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ๋‹ค. + +ํด๋ž˜์Šค๋ฅผ ํ•˜๋‚˜ ์ •์˜ํ•ด์„œ ํ์— ๋„ฃ์–ด์ฃผ๊ณ  ๋‹ค์‹œ ๊บผ๋‚ผ ๋•Œ ํ˜„์žฌ์˜ ์œ„์น˜์™€ ์ด๋™ ๊ฐ€๋Šฅ ๋ฐฉํ–ฅ์œผ๋กœ ์ด๋™ํ•˜์—ฌ ๋ฌธ์ž์—ด์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋„๋ก ์ •์˜ ํ•œ๋‹ค. +```java +// ํ์— ๋“ค์–ด๊ฐ€๋Š” ํด๋ž˜์Šค +class Words + +int x, y, len; +String str; +``` + +๋ฌธ์ž์—ด์˜ ๊ธธ์ด๊ฐ€ 5์ด๊ธฐ ๋•Œ๋ฌธ์— ๊ธธ์ด 5๊ฐ€ ๋„˜์–ด๊ฐ€๋ฉด ๋” ์ด์ƒ ํ์— ๋„ฃ์ง€ ์•Š๊ณ , ๋‹ค์‹œ ํ์—์„œ ๋‹ค์Œ Words๋ฅผ ๊บผ๋‚ด๋Š” ์‹์œผ๋กœ ์กฐ๊ฑด์„ ๊ฑด๋‹ค. + +``` +a -> ๊ธธ์ด๊ฐ€ 5๊ฐ€ ๋„˜๋Š”์ง€ ์ฒดํฌ -> ์‹ ์ด ์ข‹์•„ํ•˜๋Š” ๋ฌธ์ž์—ด์ด ์žˆ๋Š”์ง€ ์ฒดํฌ, ์žˆ๋‹ค๋ฉด ์นด์šดํŒ… -> 8๋ฐฉํ–ฅ์œผ๋กœ ๋ณด๊ณ  ๋’ค์— ๋ฌธ์ž์—ด ์ถ”๊ฐ€ -> (ํ์— ๋„ฃ๊ธฐ) -> ๋‹ค์‹œ ์ฐจ๋ก€๊ฐ€ ์™€์„œ ๊บผ๋‚ด๊ณ  (๋ฐ˜๋ณต) +``` +์œ„์™€ ๊ฐ™์€ ๋ฐ˜๋ณต์„ ํ†ตํ•ด ์ „๋ถ€ ๋‹ค ๋Œ๋ ค๋ณด๋„๋กํ•ด์„œ ๋ฌธ์ œ๋ฅผ ํ’€ ์ˆ˜ ์žˆ์—ˆ๋‹ค. + + +๊ทธ๋Ÿผ ์ด๊ฒƒ์„ ํ™œ์šฉํ•˜์—ฌ ์ฝ”๋“œ๋กœ ํ‘œํ˜„ํ•ด๋ณด์ž. + +```java +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.util.LinkedList; +import java.util.Queue; +import java.util.StringTokenizer; + +public class Hellhoseok_20166 { + static int N, M, K; + static char[][] cloud; + static int[][] dir = { // ๋ฐฐ์—ด ์ƒ, ํ•˜, ์ขŒ, ์šฐ, ์ขŒ์ƒ, ์šฐ์ƒ, ์ขŒํ•˜, ์šฐํ•˜ + {-1, 1, 0, 0, -1, -1, 1, 1}, + {0, 0, -1, 1, -1, 1, -1, 1} + }; + static int[] result; + + public static void solution(int x, int y, String[] keywords) { + Queue q = new LinkedList<>(); + q.add(new Words(x, y, 1, cloud[x][y]+"")); + + while(!q.isEmpty()) { + Words tmpW = q.poll(); + + if(tmpW.len > 5) continue; + + for(int j = 0; j < K; j++) { + if(keywords[j].equals(tmpW.str)) { + result[j]++; + } + } + + for(int i = 0; i < 8; i++) { + int nx = tmpW.x + dir[0][i]; + int ny = tmpW.y + dir[1][i]; + + if(nx == 0) nx = N; + if(ny == 0) ny = M; + if(nx > N) nx = 1; + if(ny > M) ny = 1; + + q.add(new Words(nx, ny, tmpW.len + 1, tmpW.str + cloud[nx][ny])); + } + } + } + public static void main(String[] args) throws IOException { + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + StringTokenizer st = new StringTokenizer(br.readLine()); + + N = Integer.parseInt(st.nextToken()); + M = Integer.parseInt(st.nextToken()); + K = Integer.parseInt(st.nextToken()); + + cloud = new char[N + 1][M + 1]; + result = new int[K]; + + String tmp = ""; + for(int i = 1; i <= N; i++) { + tmp = br.readLine(); + for(int j = 1; j <= M; j++) { + cloud[i][j] = tmp.charAt(j - 1); + } + } + + String[] keywords = new String[K]; + for(int i = 0; i < K; i++) { + tmp = br.readLine(); + keywords[i] = tmp; + + } + + for(int i = 1; i <= N; i++) { + for(int j = 1; j <= M; j++) { + solution(i, j, keywords); + } + } + + StringBuilder sb = new StringBuilder(); + for(int i = 0; i < K; i++) { + sb.append(result[i] + "\n"); + } + + System.out.println(sb.toString()); + } +} + +class Words { + int x; + int y; + int len; + String str; + public Words(int x, int y, int len, String str) { + this.x = x; + this.y = y; + this.len = len; + this.str = str; + } +} +``` diff --git a/src/content/blog/study/algorithmsolutions/2022-04-07-algo-baekjoon-15681.md b/src/content/blog/study/algorithmsolutions/2022-04-07-algo-baekjoon-15681.md new file mode 100644 index 0000000..542f828 --- /dev/null +++ b/src/content/blog/study/algorithmsolutions/2022-04-07-algo-baekjoon-15681.md @@ -0,0 +1,231 @@ +--- +title: Baekjoon online judge. 15681.ํŠธ๋ฆฌ์™€ ์ฟผ๋ฆฌ +date: 2022-04-07 +tags: algorithmsolutions, ๊ณต๋ถ€, ํŠธ๋ฆฌ, ํƒ์ƒ‰ +excerpt: 15681.ํŠธ๋ฆฌ์™€ ์ฟผ๋ฆฌ - ๋ฐฑ์ค€์˜จ๋ผ์ธ +--- +# 15681.ํŠธ๋ฆฌ์™€ ์ฟผ๋ฆฌ - ๋ฐฑ์ค€์˜จ๋ผ์ธ +ํ•ด๋‹น ๋ฌธ์ œ๋Š” ํŠธ๋ฆฌ์™€ ํƒ์ƒ‰ ๋ฌธ์ œ๋กœ ๊ฐœ์ธ์ ์œผ๋กœ ๋ถ€์กฑํ•˜๋‹ค๊ณ  ๋งŽ์ด ๋А๋ผ๋Š” ๋ถ€๋ถ„์ด๋ผ ๋’ค์— ์žˆ๋Š” ๋ฒˆํ˜ธ๋“ค๋„ ์ถ”ํ›„ ํ’€์–ด๋ณผ ์˜ˆ์ •์ž…๋‹ˆ๋‹ค. + +๋งํฌ : +[![image](/assets/img/algo_img/baekjoon_logo.png)](https://www.acmicpc.net/problem/15681) + +--- +## 1. ๋ฌธ์ œ +
+๋ฌธ์ œ ๋ณด๊ธฐ +
+ +|์‹œ๊ฐ„ ์ œํ•œ|๋ฉ”๋ชจ๋ฆฌ ์ œํ•œ| +|------|---| +|1 ์ดˆ|128 MB| + +๊ฐ„์„ ์— ๊ฐ€์ค‘์น˜์™€ ๋ฐฉํ–ฅ์„ฑ์ด ์—†๋Š” ์ž„์˜์˜ ๋ฃจํŠธ ์žˆ๋Š” ํŠธ๋ฆฌ๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ, ์•„๋ž˜์˜ ์ฟผ๋ฆฌ์— ๋‹ตํ•ด๋ณด๋„๋ก ํ•˜์ž. + + - ์ •์  U๋ฅผ ๋ฃจํŠธ๋กœ ํ•˜๋Š” ์„œ๋ธŒํŠธ๋ฆฌ์— ์†ํ•œ ์ •์ ์˜ ์ˆ˜๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค. + +๋งŒ์•ฝ ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐ์— ์–ด๋ ค์›€์ด ์žˆ๋‹ค๋ฉด, ํ•˜๋‹จ์˜ ํžŒํŠธ์— ์ฒจ๋ถ€ํ•œ ๋ฌธ์„œ๋ฅผ ์ฐธ๊ณ ํ•˜์ž. + + +### ์ž…๋ ฅ(Input) + +ํŠธ๋ฆฌ์˜ ์ •์ ์˜ ์ˆ˜ N๊ณผ ๋ฃจํŠธ์˜ ๋ฒˆํ˜ธ R, ์ฟผ๋ฆฌ์˜ ์ˆ˜ Q๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. (2 โ‰ค N โ‰ค 105, 1 โ‰ค R โ‰ค N, 1 โ‰ค Q โ‰ค 105) + +์ด์–ด N-1์ค„์— ๊ฑธ์ณ, U V์˜ ํ˜•ํƒœ๋กœ ํŠธ๋ฆฌ์— ์†ํ•œ ๊ฐ„์„ ์˜ ์ •๋ณด๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. (1 โ‰ค U, V โ‰ค N, U โ‰  V) + +์ด๋Š” U์™€ V๋ฅผ ์–‘ ๋์ ์œผ๋กœ ํ•˜๋Š” ๊ฐ„์„ ์ด ํŠธ๋ฆฌ์— ์†ํ•จ์„ ์˜๋ฏธํ•œ๋‹ค. + +์ด์–ด Q์ค„์— ๊ฑธ์ณ, ๋ฌธ์ œ์— ์„ค๋ช…ํ•œ U๊ฐ€ ํ•˜๋‚˜์”ฉ ์ฃผ์–ด์ง„๋‹ค. (1 โ‰ค U โ‰ค N) + +์ž…๋ ฅ์œผ๋กœ ์ฃผ์–ด์ง€๋Š” ํŠธ๋ฆฌ๋Š” ํ•ญ์ƒ ์˜ฌ๋ฐ”๋ฅธ ํŠธ๋ฆฌ์ž„์ด ๋ณด์žฅ๋œ๋‹ค. + + +### ์ถœ๋ ฅ(Output) + +Q์ค„์— ๊ฑธ์ณ ๊ฐ ์ฟผ๋ฆฌ์˜ ๋‹ต์„ ์ •์ˆ˜ ํ•˜๋‚˜๋กœ ์ถœ๋ ฅํ•œ๋‹ค. + +
+
+ +
+๋ฌธ์ œ ํžŒํŠธ ๋ณด๊ธฐ +
+ +![image](https://onlinejudgeimages.s3-ap-northeast-1.amazonaws.com/problem/15681/1.png) + +๊ทธ๋ž˜ํ”„๋ž€, ์ •์ ๋“ค๊ณผ ์ •์  ๋‘˜์„ ์ž‡๋Š” ๊ฐ„์„ ๋“ค๋กœ ์ด๋ฃจ์–ด์ง„ ์ง‘ํ•ฉ์„ ์˜๋ฏธํ•œ๋‹ค. + +์œ„๋Š” 9๊ฐœ์˜ ์ •์ (์› ๋ชจ์–‘)๊ณผ, 10๊ฐœ์˜ ๊ฐ„์„ (์‹ค์„ ) ๋“ค๋กœ ์ด๋ฃจ์–ด์ง„ ๊ทธ๋ž˜ํ”„์ด๋‹ค. ๊ฐ ์›์˜ ๋‚ด๋ถ€์— ์“ฐ์—ฌ ์žˆ๋Š” ์ˆซ์ž๋Š” ํŽธ์˜์ƒ ์ •์ ์— ๋งค๊ธด ๋ฒˆํ˜ธ๋ฅผ ์˜๋ฏธํ•œ๋‹ค. + +๋ถ‰์€ ๊ฐ„์„ ์€ ์ฐจํ›„ ์„ค๋ช…์˜ ํŽธ์˜์ƒ ์ƒ‰์น ํ•ด ๋‘” ๊ฒƒ์œผ๋กœ, ์šฐ์„ ์€ ๋‹ค๋ฅธ ๊ฒ€์€ ๊ฐ„์„ ๊ณผ ๋™์ผํ•œ ๊ฒƒ์œผ๋กœ ๊ฐ„์ฃผํ•˜๋„๋ก ํ•˜์ž. + +๊ฐ„์„ ์€ ํ•ญ์ƒ ๋‘ ์ •์ ์„ ์ž‡๊ฒŒ ๋œ๋‹ค. ์ด์ œ๋ถ€ํ„ฐ์˜ ์„ค๋ช…์—์„œ๋Š”, ๊ฐ ์ •์ ์„ ๋ฒˆํ˜ธ๋กœ(1๋ฒˆ ์ •์ , 2๋ฒˆ ์ •์ .. ), ๊ฐ„์„ ์„ ์–‘ ๋์ ์˜ ์ •์ ์˜ ๋ฒˆํ˜ธ๋กœ(1-3, 3-2โ€ฆ ) ํ‘œ๊ธฐํ•˜๋„๋ก ํ•˜์ž. + +๊ทธ๋ž˜ํ”„์˜ ๊ฐ„์„ ์—๋Š” ๊ฐ€์ค‘์น˜๊ฐ€ ์žˆ์„ ์ˆ˜๋„ ์žˆ๋‹ค. ๋งŒ์ผ ํŠน๋ณ„ํ•œ ์–ธ๊ธ‰์ด ์—†๋‹ค๋ฉด ๋ชจ๋“  ๊ฐ„์„ ์˜ ๊ฐ€์ค‘์น˜๊ฐ€ 1์ธ ๊ทธ๋ž˜ํ”„๋กœ ๊ฐ„์ฃผํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๊ฐ€์ค‘์น˜๊ฐ€ ์กด์žฌํ•œ๋‹ค๋ฉด, ์˜ˆ๋ฅผ ๋“ค์–ด 1-3 ๊ฐ„์„ ์˜ ๊ฐ€์ค‘์น˜๊ฐ€ 3์ด๋ผ๋ฉด, 1๋ฒˆ ์ •์ ์—์„œ 3๋ฒˆ ์ •์ ์œผ๋กœ ๊ฐ€๊ธฐ ์œ„ํ•ด์„  ๊ธธ์ด 3์ธ ๊ฐ„์„ ์„ ์ง€๋‚˜์•ผ ํ•œ๋‹ค๊ณ  ํ‘œํ˜„ํ•œ๋‹ค. ์œ„์˜ ๊ทธ๋ž˜ํ”„๋Š” ๋ชจ๋“  ๊ฐ„์„ ์˜ ๊ธธ์ด๊ฐ€ 1์ธ ์˜ˆ์‹œ๋ผ๊ณ  ๋ณด๋ฉด ๋œ๋‹ค. + +๊ทธ๋ž˜ํ”„์˜ ๊ฐ„์„ ์—๋Š” ๋ฐฉํ–ฅ์„ฑ์ด ์žˆ์„ ์ˆ˜๋„ ์žˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, 1๋ฒˆ๊ณผ 3๋ฒˆ ์ •์  ์‚ฌ์ด์— ๋†“์ธ 1-3 ๊ฐ„์„ ์˜ ๊ฒฝ์šฐ, 1->3 ๋˜๋Š” 3->1์˜ ๋ฐฉํ–ฅ์„ฑ์„ ๊ฐ€์ง€๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•˜๋‹ค. ๋ฐฉํ–ฅ์„ฑ ๊ฐ„์„ ์„ ๊ฐ–๊ณ  ์žˆ๋Š” ๊ทธ๋ž˜ํ”„๋ฅผ โ€˜์œ ํ–ฅ ๊ทธ๋ž˜ํ”„โ€™, ์œ„์˜ ๊ทธ๋ฆผ์ฒ˜๋Ÿผ ๋ฐฉํ–ฅ์„ฑ์ด ์—†๋Š” ๊ฐ„์„ ๋งŒ์œผ๋กœ ์ด๋ฃจ์–ด์ง„ ๊ทธ๋ž˜ํ”„๋ฅผ โ€˜๋ฌดํ–ฅ ๊ทธ๋ž˜ํ”„โ€™ ๋ผ ํ•œ๋‹ค. ๊ฐ„์„ ์˜ ๋ฐฉํ–ฅ์„ฑ์€ ๊ทธ๋ž˜ํ”„์—์„œ ํƒ์ƒ‰์„ ์ง„ํ–‰ํ•  ๋•Œ ๊ฒฐ๊ณผ๋ฅผ ๋‹ฌ๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ํ˜„์žฌ ์œ„์˜ ๊ทธ๋ž˜ํ”„์—์„œ 1๋ฒˆ ์ •์ ์—์„œ 4๋ฒˆ ์ •์ ๊นŒ์ง€ ๊ฐ€๋ฉด์„œ, ๊ฐ„์„ ์„ ์ตœ์†Œํ•œ ๊ฑฐ์น˜๋Š” ๊ฒฝ๋กœ๋Š” 1->3->4๋กœ, ์ด 2๊ฐœ์˜ ๊ฐ„์„ ์„ ๊ฑฐ์นœ๋‹ค. ์šฐ๋ฆฌ๋Š” ์ด๊ฒƒ์„ โ€˜1๋ฒˆ ์ •์ ๊ณผ 4๋ฒˆ ์ •์ ์˜ ์ตœ๋‹จ ๊ฒฝ๋กœ๋Š” 2๋‹คโ€™ ๋ผ๊ณ  ํ‘œํ˜„ํ•œ๋‹ค. ํ•˜์ง€๋งŒ ๋งŒ์•ฝ 3๋ฒˆ ์ •์ ๊ณผ 4๋ฒˆ ์ •์  ์‚ฌ์ด์˜ ๊ฐ„์„ ์ด 4->3์˜ ๋ฐฉํ–ฅ์„ฑ์„ ๊ฐ€์ง„๋‹ค๋ฉด, 1๋ฒˆ ์ •์ ์—์„œ 4๋ฒˆ ์ •์ ์œผ๋กœ ๊ฐ€๋Š” ์ตœ๋‹จ ๊ฒฝ๋กœ๋Š” 1->3->6->5->4 ๋กœ, ์ด 4๊ฐœ์˜ ๊ฐ„์„ ์„ ์ง€๋‚˜์•ผ ํ•œ๋‹ค. ์ฆ‰, ์ตœ๋‹จ ๊ฒฝ๋กœ๊ฐ€ 4๊ฐ€ ๋œ๋‹ค. + +๊ทธ๋ž˜ํ”„์—์„œ๋Š” โ€˜์‚ฌ์ดํดโ€™ ์„ ์ •์˜ํ•  ์ˆ˜ ์žˆ๋‹ค. ๋ฌดํ–ฅ ๊ทธ๋ž˜ํ”„์—์„œ์˜ ์‚ฌ์ดํด์ด๋ž€, ์–ด๋–ค ์ •์ ์—์„œ ์ถœ๋ฐœํ•ด ์‹œ์ž‘์ ์„ ์ œ์™ธํ•œ ์–ด๋–ค ์ •์ ๋„, ์–ด๋–ค ๊ฐ„์„ ๋„ ๋‘ ๋ฒˆ ์ด์ƒ ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š๊ณ  ์‹œ์ž‘์ ์œผ๋กœ ๋Œ์•„์˜ฌ ์ˆ˜ ์žˆ๋Š” ๊ฒฝ๋กœ๋ฅผ ์˜๋ฏธํ•œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์œ„์˜ ๊ทธ๋ฆผ์—์„œ๋Š” 3-6-5-4-3 ์‚ฌ์ดํด๊ณผ, 6-7-9 ์‚ฌ์ดํด์ด ์กด์žฌํ•œ๋‹ค. 1-3-1์€ 1-3 ๊ฐ„์„ ์„ ๋‘ ๋ฒˆ ์ง€๋‚ฌ์œผ๋ฏ€๋กœ ์‚ฌ์ดํด์ด ๋  ์ˆ˜ ์—†์œผ๋ฉฐ, 1-3-6-5-4-3์€ ์‹œ์ž‘์ ์œผ๋กœ ๋Œ์•„์˜ค์ง€ ์•Š๋Š” ๊ฒฝ๋กœ์ด๋ฏ€๋กœ ์‚ฌ์ดํด์ด ์•„๋‹ˆ๋‹ค. + +๋งŒ์ผ ๊ทธ๋ž˜ํ”„์— ๋‹จ ํ•˜๋‚˜์˜ ์‚ฌ์ดํด๋„ ์—†๋‹ค๋ฉด, ํ•ด๋‹น ๊ทธ๋ž˜ํ”„๋Š” โ€˜ํŠธ๋ฆฌโ€™ ๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค. ์ด๋Š” ๊ทธ๋ž˜ํ”„๊ฐ€ ๋งˆ์น˜ ํ•˜๋‚˜์˜ ์ •์ ์—์„œ ์ถœ๋ฐœํ•ด ํ”ผ์–ด๋‚œ ๋‚˜๋ฌด ๋ชจ์–‘๊ณผ๋„ ๊ฐ™์Œ์— ๋ถ™์—ฌ์ง„ ์ด๋ฆ„์œผ๋กœ, ์˜ˆ๋ฅผ ๋“ค์–ด ์œ„์˜ ๊ทธ๋ฆผ์—์„œ ๋นจ๊ฐ„ ๊ฐ„์„  ๋‘ ๊ฐœ๋ฅผ ์ œ๊ฑฐํ•œ๋‹ค๋ฉด ์œ„์˜ ๊ทธ๋ž˜ํ”„๋Š” ํŠธ๋ฆฌ๊ฐ€ ๋œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์ƒ๋‹จ์— ์ฃผ์–ด์ง„ ๊ทธ๋ž˜ํ”„์—์„œ ๋นจ๊ฐ„ ๊ฐ„์„  ๋‘ ๊ฐœ๋ฅผ ์ œ๊ฑฐํ•œ ๋’ค ๋งŒ๋“ค์–ด์ง„ ํŠธ๋ฆฌ์˜ ๋ชจ์Šต์€ ์•„๋ž˜์™€ ๊ฐ™๋‹ค. + +![image](https://onlinejudgeimages.s3-ap-northeast-1.amazonaws.com/problem/15681/2.png) + +์ผ๋ฐ˜์ ์œผ๋กœ ๊ทธ๋ž˜ํ”„์—์„œ๋Š” ์ •์ ์˜ ์œ„์น˜๋‚˜ ๊ฐ„์„ ์˜ ๋ชจ์–‘ ๋“ฑ์— ๋Œ€ํ•œ ์กฐ๊ฑด์€ ์ „ํ˜€ ๊ณ ๋ คํ•˜์ง€ ์•Š์œผ๋ฉฐ, ์˜ค์ง ์—ฐ๊ฒฐ์„ฑ๋งŒ์„ ๊ณ ๋ คํ•˜๋ฏ€๋กœ, ๊ฐ„์„ ์˜ ์ง‘ํ•ฉ์ด ๋ณ€ํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฐ€์ • ํ•˜์— ๊ทธ๋ž˜ํ”„๋ฅผ ์–ผ๋งˆ๋“ ์ง€ ๋‹ค์‹œ ๊ทธ๋ฆด ์ˆ˜๊ฐ€ ์žˆ๋‹ค. ์œ„์˜ ํŠธ๋ฆฌ์—์„œ 5๋ฒˆ ์ •์ ์„ ์žก๊ณ  ์œ„๋กœ ๋“ค์–ด์˜ฌ๋ฆฌ๋Š” ์˜ˆ์‹œ๋ฅผ ์ƒ๊ฐํ•ด ๋ณด์ž. ์•„๋ž˜์ชฝ์— ์ค‘๋ ฅ์ด ์ž‘์šฉํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๊ณ  5๋ฒˆ ์ •์ ์„ ์œ„์ชฝ์œผ๋กœ ๋“ค์–ด์˜ฌ๋ฆฌ๊ฒŒ ๋˜๋ฉด ํŠธ๋ฆฌ์˜ ๋ชจ์–‘์€ ์•„๋ž˜์™€ ๊ฐ™์ด ๋ณ€ํ•  ๊ฒƒ์ด๋‹ค. + +![image](https://onlinejudgeimages.s3-ap-northeast-1.amazonaws.com/problem/15681/3.png) + +๊ฐ„์„ ์˜ ์ง‘ํ•ฉ์— ๋ณ€ํ•จ์ด ์—†๋Š” ํ•œ, ๊ทธ๋ž˜ํ”„๋Š” ์–ผ๋งˆ๋“ ์ง€ ์›ํ•˜๋Š” ๋Œ€๋กœ ๋‹ค์‹œ ๊ทธ๋ฆด ์ˆ˜๊ฐ€ ์žˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์œ„์˜ ํŠธ๋ฆฌ๋ฅผ ๊ฑฐ์šธ์— ๋น„์ถ”์–ด ์ขŒ์šฐ๋ฅผ ๋ฐ”๊ฟ€ ๊ฒฝ์šฐ์—๋„ ๋™์ผํ•œ ํŠธ๋ฆฌ๊ฐ€ ๋œ๋‹ค. + +ํŠธ๋ฆฌ์—๋Š” ๋ฃจํŠธ(root)๊ฐ€ ์žˆ์„ ์ˆ˜๋„ ์—†์„ ์ˆ˜๋„ ์žˆ์ง€๋งŒ, ํŽธ์˜๋ฅผ ์œ„ํ•ด์„œ๋ผ๋ฉด ์•„๋ฌด ์ •์ ์ด๋‚˜ ๋ฃจํŠธ๋กœ ์„ ํƒํ•  ์ˆ˜ ์žˆ๋‹ค. 5๋ฒˆ ์ •์ ์„ ๋ฃจํŠธ๋กœ ํ•˜์˜€๋‹ค๊ณ  ์ƒ๊ฐํ•œ ๋’ค ์œ„์˜ ํŠธ๋ฆฌ๋ฅผ ๋‹ค์‹œ ๋ณด๋„๋ก ํ•˜์ž. + +ํŠธ๋ฆฌ๋Š” ํ•ญ์ƒ ๋ฃจํŠธ๋ฅผ ๊ธฐ์ค€์œผ๋กœ ๋‹ค์‹œ ๊ทธ๋ฆด ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, ๋ฃจํŠธ๊ฐ€ ๊ณ ์ •๋˜์ง€ ์•Š๋Š” ํ•œ ์–ด๋–ค ์ •์ ์ด โ€˜์œ„์—โ€™ ์žˆ๋Š”์ง€ ํŒ์ •ํ•  ์ˆ˜๋Š” ์—†๋‹ค. ํ•˜์ง€๋งŒ ๋ฃจํŠธ๊ฐ€ ๊ณ ์ •๋œ๋‹ค๋ฉด, ์šฐ๋ฆฌ๋Š” ์ •์  ๊ฐ„์— โ€˜๋ถ€๋ชจโ€™ ์™€ โ€˜์ž์‹โ€™ ์˜ ๊ด€๊ณ„๋ฅผ ์ •์˜ํ•  ์ˆ˜๊ฐ€ ์žˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์œ„์˜ ํŠธ๋ฆฌ์—์„œ๋Š” 4๋ฒˆ ์ •์ ์˜ ๋ถ€๋ชจ๋Š” 5๋ฒˆ ์ •์ ์ด๋ฉฐ, 3๋ฒˆ ์ •์ ์€ 4๋ฒˆ ์ •์ ์˜ ์ž์‹์ด ๋œ๋‹ค. 5๋ฒˆ ์ •์ ์˜ ๋ถ€๋ชจ๋Š” ์—†์œผ๋ฉฐ, 4, 6๋ฒˆ ์ •์ ์„ ๋‘ ์ž์‹์œผ๋กœ ๊ฐ–๊ฒŒ ๋  ๊ฒƒ์ด๋‹ค. + +ํŠธ๋ฆฌ์—๋Š” ๋ช‡ ๊ฐ€์ง€ ์ค‘์š”ํ•œ ์„ฑ์งˆ์ด ์žˆ๋Š”๋ฐ, ๊ทธ ์ค‘ ๋‘ ๊ฐ€์ง€๋งŒ ์ถ”๋ ค๋ณด์ž๋ฉด ์•„๋ž˜์™€ ๊ฐ™๋‹ค. + + - ์ž„์˜์˜ ๋‘ ์ •์  U์™€ V์— ๋Œ€ํ•ด, U์—์„œ V๋กœ ๊ฐ€๋Š” ์ตœ๋‹จ๊ฒฝ๋กœ๋Š” ์œ ์ผํ•˜๋‹ค. + - ์•„๋ฌด ์ •์ ์ด๋‚˜ ์žก๊ณ  ๋ถ€๋ชจ์™€์˜ ์—ฐ๊ฒฐ์„ ๋Š์—ˆ์„ ๋•Œ, ํ•ด๋‹น ์ •์ ๊ณผ ๊ทธ ์ž์‹๋“ค, ๊ทธ ์ž์‹๋“ค์˜ ์ž์‹๋“คโ€ฆ ๋กœ ์ด๋ฃจ์–ด์ง„ ๋ถ€๋ถ„๊ทธ๋ž˜ํ”„๋Š” ํŠธ๋ฆฌ๊ฐ€ ๋œ๋‹ค. + +๋‘˜ ๋ชจ๋‘ ์ง๊ด€์ ์ด๋ฉฐ ์ž๋ช…ํ•œ ์‚ฌ์‹ค์ด๋ฏ€๋กœ ์ฆ๋ช…์€ ์ƒ๋žตํ•œ๋‹ค. ๋‘ ๋ฒˆ์งธ ์„ฑ์งˆ์—์„œ, ๋Š์–ด์ง„ ๋ถ€๋ถ„๊ทธ๋ž˜ํ”„๋กœ ๋งŒ๋“ค์–ด์ง„ ํŠธ๋ฆฌ๋ฅผ โ€˜์„œ๋ธŒํŠธ๋ฆฌโ€™ ๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค. + +๋งŒ์•ฝ ํŠธ๋ฆฌ์— ๋Œ€ํ•œ ๋ฌธ์ œ ํ•˜๋‚˜๊ฐ€ ์ถœ์ œ๋˜์—ˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด๋ณด์ž. ์ž…๋ ฅ์ด ์œ„์ฒ˜๋Ÿผ ๋ฃจํŠธ์™€ ๊ทธ ์ž์‹๋“ค๋กœ ์ด๋ฃจ์–ด์ง„๋‹ค๋ฉด ์ข‹์ง€๋งŒ, ๋ฃจํŠธ๊ฐ€ ์—†๋Š” ์ผ๋ฐ˜ ํŠธ๋ฆฌ์˜ ํ˜•ํƒœ(๋‘ ๋ฒˆ์งธ ๊ทธ๋ฆผ)์˜ ํ˜•ํƒœ๋กœ ์ž…๋ ฅ์ด ์ฃผ์–ด์งˆ ์ˆ˜๋„ ์žˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์ •์ ์˜ ๊ฐœ์ˆ˜์™€ ๊ฐ„์„ ์˜ ๋ชฉ๋ก๋งŒ์ด ์ฃผ์–ด์ง„๋‹ค๋ฉด, ์–ด๋–ป๊ฒŒ ํŠธ๋ฆฌ๋ฅผ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ์„๊นŒ? + +์˜ˆ๋ฅผ ๋“ค์–ด, ์œ„์˜ ํŠธ๋ฆฌ์— ๋Œ€ํ•ด ์ •์ ์˜ ๊ฐœ์ˆ˜์™€ ๊ฐ„์„ ์˜ ๋ชฉ๋ก์ด ์•„๋ž˜์™€ ๊ฐ™์ด ์ž…๋ ฅ๋œ๋‹ค๊ณ  ํ•˜์ž. + +``` +9 +1 3 +4 3 +5 4 +5 6 +6 7 +2 3 +9 6 +6 8 +``` + +์ฒซ ์ค„์˜ 9๋Š” ์ •์ ์˜ ๊ฐœ์ˆ˜์ด๋ฉฐ, ๋‚˜๋จธ์ง€ 8์Œ์˜ ๋‘ ์ •์ˆ˜๋Š” ๊ฐ„์„ ์˜ ์–‘ ๋์  ๋ฒˆํ˜ธ๋ฅผ ์˜๋ฏธํ•œ๋‹ค. ํŠธ๋ฆฌ์—์„œ์˜ ๊ฐ„์„ ์˜ ๊ฐœ์ˆ˜๋Š” ํ•ญ์ƒ ์ •์ ์˜ ์ˆ˜ - 1์ด๋ผ๋Š” ๊ฒƒ์€ ์ตํžˆ ์•Œ๋ ค์ง„ ์‚ฌ์‹ค์ด๋ฉฐ, ์ฆ๋ช… ๋˜ํ•œ ์–ด๋ ต์ง€ ์•Š์œผ๋ฏ€๋กœ ์„ค๋ช…์„ ์ƒ๋žตํ•œ๋‹ค. + +์œ„์™€ ๊ฐ™์€ ๋ฐ์ดํ„ฐ๋ฅผ ํŠธ๋ฆฌ๋กœ ๊ตฌ์„ฑํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š”, ์šฐ์„  ๋ฃจํŠธ ํ•˜๋‚˜๋ฅผ ์ž„์˜๋กœ ์ •์˜ํ•˜๋Š” ๊ฒƒ์ด ํŽธํ•˜๋‹ค. 5๋ฒˆ ์ •์ ์„ ๋ฃจํŠธ๋กœ ์ •ํ•ด๋ณด๋„๋ก ํ•˜์ž. + +ํŠธ๋ฆฌ์—๋Š” ๋ถ€๋ชจ์™€ ์ž์‹ ๊ด€๊ณ„๊ฐ€ ์žˆ์œผ๋ฏ€๋กœ, ๊ฐ ์ •์ ๋ณ„๋กœ ๋ถ€๋ชจ๊ฐ€ ๋ˆ„๊ตฌ์ธ์ง€, ์ž์‹๋“ค์˜ ๋ชฉ๋ก์€ ์–ด๋–ป๊ฒŒ ๋˜๋Š”์ง€๋ฅผ ์ €์žฅํ•ด ๋‘๋ฉด ์š”๊ธดํ•˜๊ฒŒ ์“ฐ์ผ ๊ฒƒ์ด๋‹ค. ์ด๋ฅผ ์•„๋ž˜์™€ ๊ฐ™์ด ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค. + +```python +def makeTree(currentNode, parent) : + for(Node in connect[currentNode]) : + if Node != parent: + add Node to currentNodeโ€™s child + set Nodeโ€™s parent to currentNode + makeTree(Node, currentNode) +``` +currentNode๋Š” ํ˜„์žฌ ํƒ์ƒ‰ ์ค‘์ธ ์ •์ ์ด๋ฉฐ, parent๋Š” ํ•ด๋‹น ์ •์ ์˜ ๋ถ€๋ชจ ์ •์ ์ด๋‹ค. + +ํŠธ๋ฆฌ์—์„œ๋Š” (๋ˆˆ์น˜์ฑ˜์„ ์ˆ˜๋„ ์žˆ์ง€๋งŒ) ์–ด๋–ค ์ •์ ์˜ ๋ถ€๋ชจ๋Š” ํ•˜๋‚˜์ด๊ฑฐ๋‚˜ ์—†๋‹ค. ๋”ฐ๋ผ์„œ, ์–ด๋–ค ์ •์ ์— ๋Œ€ํ•ด ์—ฐ๊ฒฐ๋œ ๋ชจ๋“  ์ •์ ์€ ์ตœ๋Œ€ ํ•œ ๊ฐœ์˜ ์ •์ ์„ ์ œ์™ธํ•˜๋ฉด ๋ชจ๋‘ ํ•ด๋‹น ์ •์ ์˜ ์ž์‹๋“ค์ด ๋  ๊ฒƒ์ด๋‹ค. ์ด์— ๋”ฐ๋ผ, ๋ถ€๋ชจ ์ •์ ์˜ ์ •๋ณด๋ฅผ ๊ฐ€์ ธ๊ฐ€๋ฉด์„œ, ๋ถ€๋ชจ ์ •์ ์ด ์•„๋‹ˆ๋ฉด์„œ ์ž์‹ ๊ณผ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๋Š” ๋ชจ๋“  ์ •์ ์„ ์ž์‹ ์˜ ์ž์‹์œผ๋กœ, ์ž์‹ ์˜ ์ž์‹์ด ๋  ์ •์ ๋“ค์˜ ๋ถ€๋ชจ ์ •์ ์„ ์ž์‹ ์œผ๋กœ ์—ฐ๊ฒฐํ•œ ๋’ค ์žฌ๊ท€์ ์œผ๋กœ ์ž์‹ ์ •์ ๋“ค์—๊ฒŒ ํŠธ๋ฆฌ ๊ตฌ์„ฑ์„ ์š”์ฒญํ•˜๋Š” ํ˜•ํƒœ์˜ ํ•จ์ˆ˜์ด๋‹ค. + +์œ„์™€ ๊ฐ™์ด ์ •์˜ํ•œ ๋’ค์—”, ๋ฉ”์ธ ํ•จ์ˆ˜์—์„œ ํ•œ ์ฐจ๋ก€ makeTree(5, -1) ์„ ํ˜ธ์ถœํ•  ๊ฒฝ์šฐ 5๋ฒˆ ์ •์ ์„ ๋ฃจํŠธ๋กœ ํ•˜๋Š” ํŠธ๋ฆฌ๋ฅผ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค. -1์€ ๋ถ€๋ชจ๊ฐ€ ์—†์Œ์„ ์˜๋ฏธํ•œ๋‹ค. + +๊ทธ๋ ‡๋‹ค๋ฉด, ์ผ๋ฐ˜์ ์ธ ํ˜•ํƒœ์˜ ํŠธ๋ฆฌ์—์„œ ๋ฃจํŠธ๊ฐ€ ์ฃผ์–ด์ง„ ๋’ค ์—ฌ๋Ÿฌ ์งˆ์˜๊ฐ€ ์ฃผ์–ด์ง€๋Š” ์ƒํ™ฉ์„ ์ƒ๊ฐํ•ด ๋ณด์ž. ์˜ˆ๋ฅผ ๋“ค์–ด, 5๋ฒˆ ์ •์ ์„ ๋ฃจํŠธ๋กœ ํ•˜๋Š” ํŠธ๋ฆฌ์— ๋Œ€ํ•ด, โ€˜์ •์  U๋ฅผ ๋ฃจํŠธ๋กœ ํ•˜๋Š” ์„œ๋ธŒํŠธ๋ฆฌ์˜ ์ •์ ์˜ ์ˆ˜๋Š” ์–ผ๋งˆ์ธ๊ฐ€?โ€™ ๋ผ๋Š” ์งˆ์˜๊ฐ€ ๋‹ค์ˆ˜ ์ฃผ์–ด์ง„๋‹ค๊ณ  ํ•ด ๋ณด์ž. U๋ฅผ ๋ฃจํŠธ๋กœ ํ•˜๋Š” ์„œ๋ธŒํŠธ๋ฆฌ๋ž€, ์œ„์—๋„ ์–ธ๊ธ‰ํ•˜์˜€์ง€๋งŒ ์ •์  U์™€ ๊ทธ ๋ถ€๋ชจ์˜ ์—ฐ๊ฒฐ์„ ๋Š๊ณ  ์ •์  U๋ฅผ ๊ธฐ์ค€์œผ๋กœ ๊ทธ ์ž์‹๋“ค, ์ž์‹๋“ค์˜ ์ž์‹๋“คโ€ฆ ๋กœ ๋งŒ๋“  ํŠธ๋ฆฌ๋ฅผ ๋งํ•œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, 5๋ฒˆ ์ •์ ์ด ๋ฃจํŠธ์ผ ๋•Œ 4๋ฒˆ ์ •์ ์„ ๋ฃจํŠธ๋กœ ํ•˜๋Š” ์„œ๋ธŒํŠธ๋ฆฌ์—์„œ์˜ ์ •์ ์˜ ์ˆ˜๋Š” 4๊ฐœ์ด๋ฉฐ, 8๋ฒˆ ์ •์ ์„ ๋ฃจํŠธ๋กœ ํ•˜๋Š” ์„œ๋ธŒํŠธ๋ฆฌ์—์„œ์˜ ์ •์ ์˜ ์ˆ˜๋Š” 1๊ฐœ๊ฐ€ ๋œ๋‹ค. + +๋ฌผ๋ก  ์ง์ ‘ ์—ฐ๊ฒฐ์„ ๋Š์€ ๋’ค ๋‹ค์‹œ ์ •์ ์˜ ์ˆ˜๋ฅผ ์„ธ๋Š” ๋ฐฉ๋ฒ•๋„ ๊ฐ€๋Šฅํ•˜๊ฒ ์ง€๋งŒ, ํŠธ๋ฆฌ์˜ ์ •์  ์ˆ˜๊ฐ€ ๋งŽ๊ณ , ์งˆ์˜ ๋˜ํ•œ ๋งŽ๋‹ค๋ฉด ํ”„๋กœ๊ทธ๋žจ์ด ์ œํ•œ์‹œ๊ฐ„ ๋‚ด์— ์ˆ˜ํ–‰๋  ์ˆ˜ ์—†์„ ํ™•๋ฅ ์ด ๋†’๋‹ค. ์•„๋งˆ ๋ฏธ๋ฆฌ ๋ชจ๋“  ์ •์ ์„ ๊ฐ๊ฐ ๋ฃจํŠธ๋กœ ํ•˜๋Š” ์„œ๋ธŒํŠธ๋ฆฌ์—์„œ์˜ ์ •์ ์˜ ์ˆ˜๋ฅผ ๋น ๋ฅด๊ฒŒ ๊ตฌํ•ด ๋‘˜ ๋ฐฉ๋ฒ•์ด ์žˆ๋‹ค๋ฉด ์ข‹์„ ๊ฒƒ์ด๋‹ค. + +์ด๋ฅผ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•ด, ํŠธ๋ฆฌ๋ฅผ ๊ตฌ์„ฑํ•˜๋˜ ์ฝ”๋“œ์˜ ๋™์ž‘ ๊ณผ์ •์„ ์‚ดํŽด๋ณด๋„๋ก ํ•˜์ž. ๋ฃจํŠธ์—์„œ ์ถœ๋ฐœํ•˜์—ฌ, ์ž์‹ ์ •์ ๋“ค์— ๋Œ€ํ•ด ํ•œ ๋ฒˆ์”ฉ ํŠธ๋ฆฌ ๊ตฌ์„ฑ์„ ์š”์ฒญํ•˜๊ฒŒ ๋œ๋‹ค. ์—ฌ๊ธฐ์—์„œ ์•Œ ์ˆ˜ ์žˆ๋Š” ์‚ฌ์‹ค์€, ์ž์‹ ์ •์ ๋“ค์— ๋Œ€ํ•œ makeTree๊ฐ€ ํ˜ธ์ถœ๋œ ๋’ค์—”, ํ•ด๋‹น ์ž์‹ ์ •์ ์„ ์„œ๋ธŒํŠธ๋ฆฌ๋กœ ํ•˜๋Š” ํŠธ๋ฆฌ๊ฐ€ ๊ตฌ์„ฑ์ด ์™„๋ฃŒ๋œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. ์ด์™€ ๊ฐ™์€ ์›๋ฆฌ๋กœ ๋ชจ๋“  ์ •์ ์— ๋Œ€ํ•ด ํ•ด๋‹น ์ •์ ์„ ๋ฃจํŠธ๋กœ ํ•˜๋Š” ์„œ๋ธŒํŠธ๋ฆฌ์— ์†ํ•œ ์ •์ ์˜ ์ˆ˜๋ฅผ ๊ณ„์‚ฐํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ค์–ด๋ณด๋„๋ก ํ•˜์ž. + +```python +def countSubtreeNodes(currentNode) : + size[currentNode] = 1 // ์ž์‹ ๋„ ์ž์‹ ์„ ๋ฃจํŠธ๋กœ ํ•˜๋Š” ์„œ๋ธŒํŠธ๋ฆฌ์— ํฌํ•จ๋˜๋ฏ€๋กœ 0์ด ์•„๋‹Œ 1์—์„œ ์‹œ์ž‘ํ•œ๋‹ค. + for Node in currentNodeโ€™s child: + countSubtreeNode(Node) + size[currentNode] += size[Node] +``` + +์ž์‹ ์ •์ ๋“ค์— ๋Œ€ํ•ด ๋ชจ๋‘ ์„œ๋ธŒํŠธ๋ฆฌ์— ์†ํ•œ ์ •์ ์˜ ์ˆ˜๋ฅผ ๊ณ„์‚ฐํ•˜๊ฒŒ ๋งŒ๋“  ๋’ค ๊ฐ๊ฐ์˜ ์ •์  ์ˆ˜๋ฅผ ๋”ํ•ด ์ž์‹ ์„ ๋ฃจํŠธ๋กœ ํ•˜๋Š” ์„œ๋ธŒํŠธ๋ฆฌ์— ์†ํ•œ ์ •์ ์˜ ์ˆ˜๋ฅผ ๋งŒ๋“ค๊ฒŒ ๋œ๋‹ค. ์ด์ œ ๋ฉ”์ธ ํ•จ์ˆ˜ ๋‚ด์—์„œ makeTree(5, -1)๊ณผ countSubtreeNodes(5) ๋ฅผ ์ฐจ๋ก€๋Œ€๋กœ ํ•œ ๋ฒˆ์”ฉ ํ˜ธ์ถœํ•  ๊ฒฝ์šฐ, 5๋ฒˆ์„ ๋ฃจํŠธ๋กœ ํ•˜๋Š” ํŠธ๋ฆฌ์—์„œ ๋ชจ๋“  ์ •์ ์— ๋Œ€ํ•ด ๊ฐ ์ •์ ์„ ๋ฃจํŠธ๋กœ ํ•˜๋Š” ์„œ๋ธŒํŠธ๋ฆฌ์— ์†ํ•œ ์ •์ ์˜ ์ˆ˜๋ฅผ ๊ณ„์‚ฐํ•ด๋‘˜ ์ˆ˜๊ฐ€ ์žˆ๋‹ค. ์ด๋ฅผ ์ด์šฉํ•˜๋ฉด, ๋ชจ๋“  ์งˆ์˜ U์— ๋Œ€ํ•ด size[U] ๋ฅผ ์ถœ๋ ฅํ•˜๊ธฐ๋งŒ ํ•˜๋ฉด ๋˜๋ฏ€๋กœ, ์ •์ ์ด 10๋งŒ ๊ฐœ, ์งˆ์˜๊ฐ€ 10๋งŒ ๊ฐœ์ธ ๋ฐ์ดํ„ฐ์—์„œ๋„ ์ถฉ๋ถ„ํžˆ ๋น ๋ฅธ ์‹œ๊ฐ„ ๋‚ด์— ๋ชจ๋“  ์งˆ์˜๋ฅผ ์ฒ˜๋ฆฌํ•  ์ˆ˜๊ฐ€ ์žˆ๊ฒŒ ๋  ๊ฒƒ์ด๋‹ค. + +
+
+ +--- + +## 2. ๋ฌธ์ œ ํ’€์ด +์ด ๋ฌธ์ œ๋Š” ๊ฐ ๋ฃจํŠธ๋งˆ๋‹ค ๊ทธ๋ž˜ํ”„๋ฅผ ๊ฐ ๋…๋ฆฝ์ ์œผ๋กœ ๋ณด๊ณ , ํ•˜์œ„ ๋…ธ๋“œ๋“ค์˜ ๊ฐœ์ˆ˜๋ฅผ ๋”ฐ๋กœ ํ‘œ๊ธฐํ•˜์—ฌ ์ตœ์ดˆ ํƒ์ƒ‰ ํ•œ ๋ฒˆ๋งŒ์œผ๋กœ ๊ฐ ๋…ธ๋“œ์˜ ๊ฐ„์„ ์˜ ๊ฐœ์ˆ˜๋ฅผ ๊ตฌํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค. + +`ArrayList`๋ฅผ ๊ฐ€์ง„ ๋ฐฐ์—ด์„ ํ†ตํ•ด ๊ฐ ๋…ธ๋“œ๋“ค์„ ์ถ”๊ฐ€ํ•˜๋ฉฐ ๋ฌด๋ฐฉํ–ฅ, ๋ฌด๊ฐ€์ค‘์น˜ ๊ทธ๋ž˜ํ”„ ๊ตฌ์กฐ๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค. + +``` +[0][1][2][3][4][5] ... + 1 3 0 5 4 + 0 +``` + +๊ทธ๋ฆฌ๊ณ  ๋ฃจํŠธ R์ด ์ •ํ•ด์กŒ์œผ๋ฏ€๋กœ ์ด๊ฒƒ์„ ๋“ค์–ด์˜ฌ๋ฆฐ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋ฉด ํŠธ๋ฆฌ๊ฐ€ ๋œ๋‹ค. +์ด ๋•Œ, ์ด์ง„ ํŠธ๋ฆฌ๊ฐ€ ์•„๋‹˜์—๋Š” ์ฃผ์˜ํ•˜์ž. + +๋งค ์ฟผ๋ฆฌ๋งˆ๋‹ค ๋…๋ฆฝ๋œ ํŠธ๋ฆฌ๋ฅผ ๋Œ๋ฉด ์‹œ๊ฐ„์ดˆ๊ณผ๊ฐ€ ๋‚  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค. +( 2 โ‰ค N โ‰ค 10^5 , 1 โ‰ค R โ‰ค N, 1 โ‰ค Q โ‰ค 10^5 ) +๋•Œ๋ฌธ์— ๋‚˜๋„ ์ฒ˜์Œ์— ์ƒ๊ฐ์—†์ด ๋งค ๋ฒˆ ๋Œ๋ฉด์„œ ํ™•์ธํ•˜๋„๋ก ๋งŒ๋“ค์–ด์„œ ์‹œ๊ฐ„ ์ดˆ๊ณผ๊ฐ€ ๋‚ฌ์—ˆ๋‹ค. + +List ๋ฐฐ์—ด๊ณผ ๋™์ผํ•˜๊ฒŒ integer ๋ฐฐ์—ด์„ ๋งŒ๋“ค์–ด์„œ ๊ฐ ํ•˜์œ„ ๋…ธ๋“œ๋“ค์˜ ๊ฐœ์ˆ˜๋ฅผ ์ €์žฅํ•ด๋‘ ์œผ๋กœ์จ ์ด๋ฅผ ํ•ด๊ฒฐํ•˜์˜€๋‹ค. + +์ด์ „์— ๋ฐฉ๋ฌธํ•œ ๋…ธ๋“œ๋Š” ์žฌ ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š๋„๋กํ•˜์—ฌ ํ•˜์œ„ ๋…ธ๋“œ์˜ ๊ฐœ์ˆ˜๋ฅผ ์ƒ์œ„ ๋…ธ๋“œ์˜ ๊ฐœ์ˆ˜์— ์ถ”๊ฐ€ํ•ด์ฃผ๋ฉด ๊ฐ ๋…ธ๋“œ์˜ ํ•˜์œ„ ๋…ธ๋“œ ๊ฐœ์ˆ˜๋ฅผ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ฆ‰, ๋•๋ถ„์— ๋งค ์ฟผ๋ฆฌ๋งˆ๋‹ค ํŠธ๋ฆฌ๋ฅผ ํƒ์ƒ‰ํ•  ํ•„์š”์—†์ด ๋ฐฐ์—ด์˜ ์ฟผ๋ฆฌ ์ธ๋ฑ์Šค๋งŒ ํ˜ธ์ถœํ•˜๋ฉด ํ•˜์œ„ ๋…ธ๋“œ์˜ ๊ฐœ์ˆ˜ ๊ฐ’์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค. + +๊ทธ๋Ÿผ ์ด๊ฒƒ์„ ํ™œ์šฉํ•˜์—ฌ ์ฝ”๋“œ๋กœ ํ‘œํ˜„ํ•ด๋ณด์ž. + +```java +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.util.ArrayList; +import java.util.StringTokenizer; + +public class TreenQuery_15681 { + static int N, R, Q; + static int[] arrq, cnt; + static ArrayList[] tree; + + public static void search(int x, int prevNode) { + cnt[x] = 1; // ํ˜„ ๋ฃจํŠธ ๋˜ํ•œ ๊ฐ„์„ ์˜ ๊ฐœ์ˆ˜๋กœ ํฌํ•จ + + for(int a : tree[x]) { + if(a == prevNode) continue; // ์ด์ „์— ๋ฐฉ๋ฌธํ•œ ๋…ธ๋“œ๋Š” ๋„˜์–ด๊ฐ„๋‹ค. + search(a, x); + cnt[x] += cnt[a]; // ํ•˜์œ„ ๋…ธ๋“œ์˜ ๊ฐ„์„  ๊ฐฏ์ˆ˜๋„ ๋”ํ•ด์ค€๋‹ค. + } + } + + public static void solution() { + search(R, -1); + + StringBuilder sb = new StringBuilder(); + for(int i : arrq) { + sb.append(cnt[i] + "\n"); + } + System.out.println(sb.toString()); + } + public static void main(String[] args) throws IOException { + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + StringTokenizer st = new StringTokenizer(br.readLine()); + + N = Integer.parseInt(st.nextToken()); + R = Integer.parseInt(st.nextToken()); + Q = Integer.parseInt(st.nextToken()); + + cnt = new int[N + 1]; + arrq = new int[Q]; + + tree = new ArrayList[N + 1]; + for(int i = 1; i <= N; i++) tree[i] = new ArrayList<>(); + + for(int i = 1; i < N; i++) { // ๊ฐ€์ค‘์น˜ ์—†๋Š” ๋ฌด๋ฐฉํ–ฅ ๊ทธ๋ž˜ํ”„ + if(!st.hasMoreTokens()) st = new StringTokenizer(br.readLine()); + int U = Integer.parseInt(st.nextToken()); + int V = Integer.parseInt(st.nextToken()); + tree[U].add(V); + tree[V].add(U); + } + + for(int i = 0; i < Q; i++) { + arrq[i] = Integer.parseInt(br.readLine()); + } + solution(); + } +} +``` diff --git a/src/content/blog/study/algorithmsolutions/2022-04-08-algo-baekjoon-1174.md b/src/content/blog/study/algorithmsolutions/2022-04-08-algo-baekjoon-1174.md new file mode 100644 index 0000000..a14ede1 --- /dev/null +++ b/src/content/blog/study/algorithmsolutions/2022-04-08-algo-baekjoon-1174.md @@ -0,0 +1,117 @@ +--- +title: Baekjoon online judge. 1174.์ค„์–ด๋“œ๋Š” ์ˆ˜ +date: 2022-04-08 +tags: algorithmsolutions, ๊ณต๋ถ€ +excerpt: 1174.์ค„์–ด๋“œ๋Š” ์ˆ˜ - ๋ฐฑ์ค€์˜จ๋ผ์ธ +--- +# 1174.์ค„์–ด๋“œ๋Š” ์ˆ˜ - ๋ฐฑ์ค€์˜จ๋ผ์ธ +ํ•ด๋‹น ๋ฌธ์ œ๋Š” ๋ฐฑํŠธ๋ž˜ํ‚น ๋ฐฉ์‹์œผ๋กœ ํ’€์–ด๋ณด์•˜์Šต๋‹ˆ๋‹ค. + +๋งํฌ : +[![image](/assets/img/algo_img/baekjoon_logo.png)](https://www.acmicpc.net/problem/1174) + +--- +## 1. ๋ฌธ์ œ +
+๋ฌธ์ œ ๋ณด๊ธฐ +
+ +|์‹œ๊ฐ„ ์ œํ•œ|๋ฉ”๋ชจ๋ฆฌ ์ œํ•œ| +|------|---| +|2 ์ดˆ|128 MB| + +์Œ์ด ์•„๋‹Œ ์ •์ˆ˜๋ฅผ ์‹ญ์ง„๋ฒ•์œผ๋กœ ํ‘œ๊ธฐํ–ˆ์„ ๋•Œ, ์™ผ์ชฝ์—์„œ๋ถ€ํ„ฐ ์ž๋ฆฌ์ˆ˜๊ฐ€ ๊ฐ์†Œํ•  ๋•Œ, ๊ทธ ์ˆ˜๋ฅผ ์ค„์–ด๋“œ๋Š” ์ˆ˜๋ผ๊ณ  ํ•œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, 321์™€ 950์€ ์ค„์–ด๋“œ๋Š” ์ˆ˜์ด๊ณ , 322์™€ 958์€ ์•„๋‹ˆ๋‹ค. + +N๋ฒˆ์งธ๋กœ ์ž‘์€ ์ค„์–ด๋“œ๋Š” ์ˆ˜๋ฅผ ์ถœ๋ ฅํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค. ๋งŒ์•ฝ ๊ทธ๋Ÿฌํ•œ ์ˆ˜๊ฐ€ ์—†์„ ๋•Œ๋Š” -1์„ ์ถœ๋ ฅํ•œ๋‹ค. ๊ฐ€์žฅ ์ž‘์€ ์ค„์–ด๋“œ๋Š” ์ˆ˜๊ฐ€ 1๋ฒˆ์งธ ์ž‘์€ ์ค„์–ด๋“œ๋Š” ์ˆ˜์ด๋‹ค. + + +### ์ž…๋ ฅ(Input) + +N์ด ์ฃผ์–ด์ง„๋‹ค. N์€ 1,000,000๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ ๊ฐ™์€ ์ž์—ฐ์ˆ˜์ด๋‹ค. + + +### ์ถœ๋ ฅ(Output) + +์ฒซ์งธ ์ค„์— N๋ฒˆ์งธ ์ž‘์€ ์ค„์–ด๋“œ๋Š” ์ˆ˜๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค. + +
+
+ +--- + +## 2. ๋ฌธ์ œ ํ’€์ด +์ด ๋ฌธ์ œ๋Š” ๋ฐฑํŠธ๋ž˜ํ‚น์„ ํ™œ์šฉํ•˜์—ฌ ํ’€์–ด๋ณด์•˜๋‹ค. + +์˜ค๋Š˜์€ ํฌ์ŠคํŠธ๋ฅผ ์ž‘์„ฑ ํ•  ์ˆ˜ ์—†์–ด์„œ ์ถ”ํ›„ ์—…๋ฐ์ดํŠธ ํ•˜๊ฒ ๋‹ค. + +### ๋ฐฑํŠธ๋ž˜ํ‚น ๋ฐฉ์‹ + + +### ๋น„ํŠธ๋งˆ์Šคํ‚น ๋ฐฉ์‹ + +๊ทธ๋Ÿผ ์ด๊ฒƒ์„ ํ™œ์šฉํ•˜์—ฌ ์ฝ”๋“œ๋กœ ํ‘œํ˜„ํ•ด๋ณด์ž. +๋˜ํ•œ ๋น„ํŠธ๋งˆ์Šคํ‚น์œผ๋กœ๋„ ํ’€์ด๊ฐ€ ๊ฐ€๋Šฅํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํ•จ๊ป˜ ์†Œ์Šค์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ด ๋ณธ๋‹ค. + +```java +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.util.ArrayList; +import java.util.Collections; + +public class Decreasenum_1174 { + public static int[] num = {9, 8, 7, 6, 5, 4, 3, 2, 1, 0}; + public static ArrayList al = new ArrayList(); + public static void solutionByBitmask(int n) { + ArrayList list = new ArrayList(); + // 2^10์˜ ๋ชจ๋“  ๊ฒฝ์šฐ์˜์ˆ˜๋ฅผ ๋งŒ๋“ ๋‹ค. + for(int i = 1; i < (1<<10); i++) { + long sum = 0; + // 10 ์ž๋ฆฌ๋งŒํผ ํƒ์ƒ‰ + for(int j = 0; j < 10; j++) { + // i๊ฐ€ 0^2, 1^2, 2^2, .. , j^2 ๋ณด๋‹ค ํฌ๋‹ค๋ฉด + // i์— ํ•ด๋‹นํ•˜๋Š” ๋น„ํŠธ๊ฐ€ ๊ฐ๊ฐ ์–ด๋А์œ„์น˜์— ๋น„ํŠธ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋Š”์ง€ ์ฒดํฌ + // if๋ฌธ์„ ๋งŒ์กฑํ•œ๋‹ค๋ฉด ํ•ด๋‹น ์ž๋ฆฟ์ˆ˜๊ฐ€ ๋งŒ์กฑํ•œ๋‹ค๋Š” ๊ฒƒ์ด๋ฏ€๋กœ sum*10 + num[j]๋ฅผ ์ถ”๊ฐ€. + if( (i & (1 << j)) > 0 ) { + sum = sum * 10 + num[j]; + } + } + list.add(sum); + } + + Collections.sort(list); + if(n > list.size()) { + System.out.println("-1"); + return; + } + System.out.println(list.get(n - 1)); + } + + public static void solutionByRecursive(long sum, int idx) { + if(!al.contains(sum)) { + al.add(sum); + } + if(idx >= 10) { + return; + } + solutionByRecursive( (sum * 10) + num[idx], idx + 1); + solutionByRecursive(sum, idx + 1); + } + public static void main(String[] args) throws NumberFormatException, IOException { + BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)); + int N = Integer.parseInt(reader.readLine()); + + int result = 0; + if(result == 0) { + solutionByBitmask(N); + } else { + solutionByRecursive(0, 0); + al.sort(null); + if(N > 1023) + System.out.println("-1"); + else + System.out.println(al.get(N - 1)); + } + } +} +``` diff --git a/src/content/blog/study/algorithmsolutions/2022-04-12-algo-samsungSW-21610.md b/src/content/blog/study/algorithmsolutions/2022-04-12-algo-samsungSW-21610.md new file mode 100644 index 0000000..05d4517 --- /dev/null +++ b/src/content/blog/study/algorithmsolutions/2022-04-12-algo-samsungSW-21610.md @@ -0,0 +1,219 @@ +--- +title: Samsung sorftware Algorithms. 21610.๋งˆ๋ฒ•์‚ฌ ์ƒ์–ด์™€ ๋น„๋ฐ”๋ผ๊ธฐ +date: 2022-04-12 +tags: algorithmsolutions, ๊ณต๋ถ€, ํƒ์ƒ‰ +excerpt: 21610.๋งˆ๋ฒ•์‚ฌ ์ƒ์–ด์™€ ๋น„๋ฐ”๋ผ๊ธฐ - ์‚ผ์„ฑ๊ธฐ์ถœ๋ฌธ์ œ (from.๋ฐฑ์ค€์•Œ๊ณ ๋ฆฌ์ฆ˜) +--- +# 21610.๋งˆ๋ฒ•์‚ฌ ์ƒ์–ด์™€ ๋น„๋ฐ”๋ผ๊ธฐ - ์‚ผ์„ฑ๊ธฐ์ถœ๋ฌธ์ œ (from.๋ฐฑ์ค€์•Œ๊ณ ๋ฆฌ์ฆ˜) + +ํ•ด๋‹น ๋ฌธ์ œ๋Š” ์‹œ๋ฎฌ๋ ˆ์ด์…˜ ๋ฌธ์ œ๋กœ ๋‹จ๊ณ„๋ณ„๋กœ ์ˆ˜ํ–‰ํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•˜์—ฌ ํ’€ ์ˆ˜ ์žˆ๋Š” ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค. + +๋งํฌ : +[![image](/assets/img/algo_img/baekjoon_logo.png)](https://www.acmicpc.net/problem/21610) + +--- + +## 1. ๋ฌธ์ œ + +
+๋ฌธ์ œ ๋ณด๊ธฐ +
+ +### 21610\. ๋งˆ๋ฒ•์‚ฌ ์ƒ์–ด์™€ ๋น„๋ฐ”๋ผ๊ธฐ + +|์‹œ๊ฐ„ ์ œํ•œ|๋ฉ”๋ชจ๋ฆฌ ์ œํ•œ| +|------|---| +|1 ์ดˆ (์ถ”๊ฐ€ ์‹œ๊ฐ„ ์—†์Œ)|1024 MB| + +๋งˆ๋ฒ•์‚ฌ ์ƒ์–ด๋Š” ํŒŒ์ด์–ด๋ณผ, ํ† ๋„ค์ด๋„, ํŒŒ์ด์–ด์Šคํ†ฐ, ๋ฌผ๋ณต์‚ฌ๋ฒ„๊ทธ ๋งˆ๋ฒ•์„ ํ•  ์ˆ˜ ์žˆ๋‹ค. ์˜ค๋Š˜ ์ƒˆ๋กœ ๋ฐฐ์šด ๋งˆ๋ฒ•์€ ๋น„๋ฐ”๋ผ๊ธฐ์ด๋‹ค. ๋น„๋ฐ”๋ผ๊ธฐ๋ฅผ ์‹œ์ „ํ•˜๋ฉด ํ•˜๋Š˜์— ๋น„๊ตฌ๋ฆ„์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค. ์˜ค๋Š˜์€ ๋น„๋ฐ”๋ผ๊ธฐ๋ฅผ ํฌ๊ธฐ๊ฐ€ Nร—N์ธ ๊ฒฉ์ž์—์„œ ์—ฐ์Šตํ•˜๋ ค๊ณ  ํ•œ๋‹ค. ๊ฒฉ์ž์˜ ๊ฐ ์นธ์—๋Š” ๋ฐ”๊ตฌ๋‹ˆ๊ฐ€ ํ•˜๋‚˜ ์žˆ๊ณ , ๋ฐ”๊ตฌ๋‹ˆ๋Š” ์นธ ์ „์ฒด๋ฅผ ์ฐจ์ง€ํ•œ๋‹ค. ๋ฐ”๊ตฌ๋‹ˆ์— ์ €์žฅํ•  ์ˆ˜ ์žˆ๋Š” ๋ฌผ์˜ ์–‘์—๋Š” ์ œํ•œ์ด ์—†๋‹ค. (r, c)๋Š” ๊ฒฉ์ž์˜ rํ–‰ c์—ด์— ์žˆ๋Š” ๋ฐ”๊ตฌ๋‹ˆ๋ฅผ ์˜๋ฏธํ•˜๊ณ , A[r][c]๋Š” (r, c)์— ์žˆ๋Š” ๋ฐ”๊ตฌ๋‹ˆ์— ์ €์žฅ๋˜์–ด ์žˆ๋Š” ๋ฌผ์˜ ์–‘์„ ์˜๋ฏธํ•œ๋‹ค. + +๊ฒฉ์ž์˜ ๊ฐ€์žฅ ์™ผ์ชฝ ์œ— ์นธ์€ (1, 1)์ด๊ณ , ๊ฐ€์žฅ ์˜ค๋ฅธ์ชฝ ์•„๋žซ ์นธ์€ (N, N)์ด๋‹ค. ๋งˆ๋ฒ•์‚ฌ ์ƒ์–ด๋Š” ์—ฐ์Šต์„ ์œ„ํ•ด 1๋ฒˆ ํ–‰๊ณผ N๋ฒˆ ํ–‰์„ ์—ฐ๊ฒฐํ–ˆ๊ณ , 1๋ฒˆ ์—ด๊ณผ N๋ฒˆ ์—ด๋„ ์—ฐ๊ฒฐํ–ˆ๋‹ค. ์ฆ‰, N๋ฒˆ ํ–‰์˜ ์•„๋ž˜์—๋Š” 1๋ฒˆ ํ–‰์ด, 1๋ฒˆ ํ–‰์˜ ์œ„์—๋Š” N๋ฒˆ ํ–‰์ด ์žˆ๊ณ , 1๋ฒˆ ์—ด์˜ ์™ผ์ชฝ์—๋Š” N๋ฒˆ ์—ด์ด, N๋ฒˆ ์—ด์˜ ์˜ค๋ฅธ์ชฝ์—๋Š” 1๋ฒˆ ์—ด์ด ์žˆ๋‹ค. + +๋น„๋ฐ”๋ผ๊ธฐ๋ฅผ ์‹œ์ „ํ•˜๋ฉด (N, 1), (N, 2), (N-1, 1), (N-1, 2)์— ๋น„๊ตฌ๋ฆ„์ด ์ƒ๊ธด๋‹ค. ๊ตฌ๋ฆ„์€ ์นธ ์ „์ฒด๋ฅผ ์ฐจ์ง€ํ•œ๋‹ค. ์ด์ œ ๊ตฌ๋ฆ„์— ์ด๋™์„ M๋ฒˆ ๋ช…๋ นํ•˜๋ ค๊ณ  ํ•œ๋‹ค. i๋ฒˆ์งธ ์ด๋™ ๋ช…๋ น์€ ๋ฐฉํ–ฅ di๊ณผ ๊ฑฐ๋ฆฌ si๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ๋‹ค. ๋ฐฉํ–ฅ์€ ์ด 8๊ฐœ์˜ ๋ฐฉํ–ฅ์ด ์žˆ์œผ๋ฉฐ, 8๊ฐœ์˜ ์ •์ˆ˜๋กœ ํ‘œํ˜„ํ•œ๋‹ค. 1๋ถ€ํ„ฐ ์ˆœ์„œ๋Œ€๋กœ โ†, โ†–, โ†‘, โ†—, โ†’, โ†˜, โ†“, โ†™ ์ด๋‹ค. ์ด๋™์„ ๋ช…๋ นํ•˜๋ฉด ๋‹ค์Œ์ด ์ˆœ์„œ๋Œ€๋กœ ์ง„ํ–‰๋œ๋‹ค. + +1. ๋ชจ๋“  ๊ตฌ๋ฆ„์ด di ๋ฐฉํ–ฅ์œผ๋กœ si์นธ ์ด๋™ํ•œ๋‹ค. +2. ๊ฐ ๊ตฌ๋ฆ„์—์„œ ๋น„๊ฐ€ ๋‚ด๋ ค ๊ตฌ๋ฆ„์ด ์žˆ๋Š” ์นธ์˜ ๋ฐ”๊ตฌ๋‹ˆ์— ์ €์žฅ๋œ ๋ฌผ์˜ ์–‘์ด 1 ์ฆ๊ฐ€ํ•œ๋‹ค. +3. ๊ตฌ๋ฆ„์ด ๋ชจ๋‘ ์‚ฌ๋ผ์ง„๋‹ค. +4. 2์—์„œ ๋ฌผ์ด ์ฆ๊ฐ€ํ•œ ์นธ (r, c)์— ๋ฌผ๋ณต์‚ฌ๋ฒ„๊ทธ ๋งˆ๋ฒ•์„ ์‹œ์ „ํ•œ๋‹ค. ๋ฌผ๋ณต์‚ฌ๋ฒ„๊ทธ ๋งˆ๋ฒ•์„ ์‚ฌ์šฉํ•˜๋ฉด, ๋Œ€๊ฐ์„  ๋ฐฉํ–ฅ์œผ๋กœ ๊ฑฐ๋ฆฌ๊ฐ€ 1์ธ ์นธ์— ๋ฌผ์ด ์žˆ๋Š” ๋ฐ”๊ตฌ๋‹ˆ์˜ ์ˆ˜๋งŒํผ (r, c)์— ์žˆ๋Š” ๋ฐ”๊ตฌ๋‹ˆ์˜ ๋ฌผ์ด ์–‘์ด ์ฆ๊ฐ€ํ•œ๋‹ค. + - ์ด๋•Œ๋Š” ์ด๋™๊ณผ ๋‹ค๋ฅด๊ฒŒ ๊ฒฝ๊ณ„๋ฅผ ๋„˜์–ด๊ฐ€๋Š” ์นธ์€ ๋Œ€๊ฐ์„  ๋ฐฉํ–ฅ์œผ๋กœ ๊ฑฐ๋ฆฌ๊ฐ€ 1์ธ ์นธ์ด ์•„๋‹ˆ๋‹ค. + - ์˜ˆ๋ฅผ ๋“ค์–ด, (N, 2)์—์„œ ์ธ์ ‘ํ•œ ๋Œ€๊ฐ์„  ์นธ์€ (N-1, 1), (N-1, 3)์ด๊ณ , (N, N)์—์„œ ์ธ์ ‘ํ•œ ๋Œ€๊ฐ์„  ์นธ์€ (N-1, N-1)๋ฟ์ด๋‹ค. +5. ๋ฐ”๊ตฌ๋‹ˆ์— ์ €์žฅ๋œ ๋ฌผ์˜ ์–‘์ด 2 ์ด์ƒ์ธ ๋ชจ๋“  ์นธ์— ๊ตฌ๋ฆ„์ด ์ƒ๊ธฐ๊ณ , ๋ฌผ์˜ ์–‘์ด 2 ์ค„์–ด๋“ ๋‹ค. ์ด๋•Œ ๊ตฌ๋ฆ„์ด ์ƒ๊ธฐ๋Š” ์นธ์€ 3์—์„œ ๊ตฌ๋ฆ„์ด ์‚ฌ๋ผ์ง„ ์นธ์ด ์•„๋‹ˆ์–ด์•ผ ํ•œ๋‹ค. + +M๋ฒˆ์˜ ์ด๋™์ด ๋ชจ๋‘ ๋๋‚œ ํ›„ ๋ฐ”๊ตฌ๋‹ˆ์— ๋“ค์–ด์žˆ๋Š” ๋ฌผ์˜ ์–‘์˜ ํ•ฉ์„ ๊ตฌํ•ด๋ณด์ž. + +### ์ž…๋ ฅ(Input) + +์ฒซ์งธ ์ค„์— N, M์ด ์ฃผ์–ด์ง„๋‹ค. + +๋‘˜์งธ ์ค„๋ถ€ํ„ฐ N๊ฐœ์˜ ์ค„์—๋Š” N๊ฐœ์˜ ์ •์ˆ˜๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. r๋ฒˆ์งธ ํ–‰์˜ c๋ฒˆ์งธ ์ •์ˆ˜๋Š” A[r][c]๋ฅผ ์˜๋ฏธํ•œ๋‹ค. + +๋‹ค์Œ M๊ฐœ์˜ ์ค„์—๋Š” ์ด๋™์˜ ์ •๋ณด di, si๊ฐ€ ์ˆœ์„œ๋Œ€๋กœ ํ•œ ์ค„์— ํ•˜๋‚˜์”ฉ ์ฃผ์–ด์ง„๋‹ค. + + +### ์ถœ๋ ฅ(Output) + +์ฒซ์งธ ์ค„์— M๋ฒˆ์˜ ์ด๋™์ด ๋ชจ๋‘ ๋๋‚œ ํ›„ ๋ฐ”๊ตฌ๋‹ˆ์— ๋“ค์–ด์žˆ๋Š” ๋ฌผ์˜ ์–‘์˜ ํ•ฉ์„ ์ถœ๋ ฅํ•œ๋‹ค. + +### ์ œํ•œ + + - 2 โ‰ค N โ‰ค 50 + - 1 โ‰ค M โ‰ค 100 + - 0 โ‰ค A[r][c] โ‰ค 100 + - 1 โ‰ค di โ‰ค 8 + - 1 โ‰ค si โ‰ค 50 + +
+
+ +--- + +## 2. ๋ฌธ์ œ ํ’€์ด + +์ด ๋ฌธ์ œ๋Š” ์‹œ๋ฎฌ๋ ˆ์ด์…˜ ๋ฌธ์ œ๋กœ, ๋‚˜์™€์žˆ๋Š” ์กฐ๊ฑด์„ ๊ทธ๋Œ€๋กœ ๊ตฌํ˜„ํ•˜๊ธฐ๋งŒ ํ•˜๋ฉด ๋œ๋‹ค. + +๋จผ์ € ๊ตฌ๋ฆ„์˜ ์œ„์น˜๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” Queue๋ฅผ ๋งŒ๋“ค์–ด์„œ ํ˜„์žฌ ์œ„์น˜ ๊ฐ’์„ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” Cloud ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค๊ณ  ํ์— ๋„ฃ๋Š”๋‹ค. + +๊ทธ๋ฆฌ๊ณ  ์ด ๊ตฌ๋ฆ„์„ ์ด๋™์‹œํ‚ค๋Š”๋ฐ, ์—ฌ๊ธฐ์„œ ์ค‘์š”ํ•œ๊ฒƒ์€ ์–‘ ์˜†์—์„œ ๋„˜์–ด๊ฐˆ ์ˆ˜ ์žˆ๋„๋ก ๋งŒ๋“ค์—ˆ๋‹ค๋Š”๊ฒƒ์ด๋‹ค. 1์—์„œ ์ค„์–ด๋“ค๋ฉด N์œผ๋กœ ๊ฐ€๋Š” ๋ฐฉ์‹์„ 2์ค‘, 3์ค‘ ๋” ๋„˜๋”๋ผ๋„ ์œ„์น˜๋ฅผ ์ •ํ™•ํ•˜๊ฒŒ ์ฐ์–ด์ค˜์•ผ ํ•œ๋‹ค๋Š”๊ฒƒ์ด๋‹ค. +๋•Œ๋ฌธ์— ์ด๋™ํ•˜๋Š” si๋ฅผ N์˜ ๋‚˜๋จธ์ง€ ๋ถ€๋ถ„์œผ๋กœ ๋ฐ”๊พธ์–ด์„œ ์ด๋™ํ•˜๊ฒŒ ํ–ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ด๋™ํ•œ ๊ตฌ๋ฆ„์˜ ์œ„์น˜์— ๋น„๊ฐ€ ๋‚ด๋ ค ์–‘๋™์ด์˜ ์–‘์„ 1 ์ฆ๊ฐ€์‹œํ‚จ๋‹ค. +์ด ๋•Œ ์ค‘์š”ํ•œ๊ฒƒ์€ ์ด๋ ‡๊ฒŒ ์ฆ๊ฐ€๋œ ๊ณณ์„ ์ฒดํฌํ•ด์ฃผ๊ณ  ์ดํ›„์— ์ƒˆ๋กœ ๊ตฌ๋ฆ„์ด ์ƒ์„ฑ๋  ๋•Œ, ๋น„๊ฐ€ ๋‚ด๋ฆฐ ๊ณณ์€ ์ƒ์„ฑ๋˜์ง€ ์•Š๋„๋ก ํ•œ๋‹ค. + +๊ทธ๋ฆฌ๊ณ  ๋ฌผ ๋ณต์‚ฌ ๋งˆ๋ฒ•์ด๋ผ๊ณ  (r,c) ๋ถ€๋ถ„์˜ ๋Œ€๊ฐ์„  4๋ถ€๋ถ„์„ ์ฒดํฌํ•ด์„œ ๋ฌผ์ด ์žˆ์œผ๋ฉด ๊ทธ ๋ฌผ์˜ ์ˆ˜๋งŒํผ (r,c)์— ์œ„์น˜ํ•œ ์–‘๋™์ด์˜ ๋ฌผ์ด ์ฆ๊ฐ€๋œ๋‹ค. +์ด ์•กํŠธ๋Š” ๊ฒฉ์ž์˜ ๋ฒ”์œ„๋ฅผ ๋„˜์–ด๊ฐ€๋ฉด ์นด์šดํŠธ์—์„œ ์ œ์™ธ์‹œํ‚จ๋‹ค. +์ด ๋•Œ ์ฃผ์˜ํ•ด์•ผ ํ•  ๋ถ€๋ถ„์ด ๊ธฐ์กด ๊ฒฉ์ž์—์„œ ์ฒดํฌํ•ด์„œ ์ฆ๊ฐ€์‹œํ‚ค๋ฉด 1์ด์—ˆ๋˜ ์–‘๋™์ด๊ฐ€ 2๊ฐ€๋˜์–ด์„œ ๋‹ค๋ฅธ ์–‘๋™์ด์— ์˜ํ–ฅ์„ ์ค„ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ฒฉ์ž๋ฅผ ๋ณต์‚ฌํ•ด์„œ ํ•ด๋‹น ์œ„์น˜์˜ ์–‘๋™์ด๋งŒ ์ฆ๊ฐ€๋  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์•ผ ํ•œ๋‹ค. + +์ด๊ฒƒ์„ ์ฝ”๋“œ๋กœ ํ‘œํ˜„ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. + +```java +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.util.LinkedList; +import java.util.Queue; +import java.util.StringTokenizer; + +public class MagicianShark_Windblows_21610 { + static int N, M; + static int[][] map; + static boolean[][] rain; + static int[][] dir = { // 0์€ ๋นˆ์นธ, ์ขŒ, ์ขŒ์ƒ, ์ƒ, ์šฐ์ƒ, ์šฐ, ์šฐํ•˜, ํ•˜, ์ขŒํ•˜ + {0, 0, -1, -1, -1, 0, 1, 1, 1}, + {0, -1, -1, 0, 1, 1, 1, 0, -1} + }; + static int[][] checkBucket = { + {-1, -1, 1, 1}, + {-1, 1, -1, 1} + }; + static int[][] command; + static Queue cloud; + public static void moveCloudnRain(int d, int s) { + int size = cloud.size(); + + rain = new boolean[N + 1][N + 1]; + while(size > 0) { + Cloud tmp = cloud.poll(); + int nr = tmp.r + (dir[0][d] * (s % N)); + int nc = tmp.c + (dir[1][d] * (s % N)); + + // ์ด์–ด๋ถ™์ธ ๊ณต๊ฐ„ ๋„˜์–ด๊ฐ€๊ธฐ + if(nr <= 0) nr = N + nr; + if(nc <= 0) nc = N + nc; + if(nr > N) nr = nr - N; + if(nc > N) nc = nc - N; + + cloud.add(new Cloud(nr, nc)); + map[nr][nc]++; + rain[nr][nc] = true; + size--; + } + } + public static void copywater() { + int[][] copyMap = new int[N + 1][N + 1]; + for(int i = 1; i <= N; i++) { + for(int j = 1; j <= N; j++) { + copyMap[i][j] = map[i][j]; + } + } + + while(!cloud.isEmpty()) { + Cloud tmp = cloud.poll(); + rain[tmp.r][tmp.c] = true; + + // ๋ฌผ ๋ณต์‚ฌ ๋งˆ๋ฒ• + int cnt = 0; + for(int i = 0; i < 4; i++) { + int nr = tmp.r + checkBucket[0][i]; + int nc = tmp.c + checkBucket[1][i]; + if(nr <= 0 || nc <= 0 || nr > N || nc > N) continue; + if(copyMap[nr][nc] > 0) cnt++; + } + map[tmp.r][tmp.c] += cnt; + } + } + public static void makeCloud() { + for(int i = 1; i <= N; i++) { + for(int j = 1; j <= N; j++) { + if(!rain[i][j] && map[i][j] >= 2) { + cloud.add(new Cloud(i, j)); + map[i][j] -= 2; + } + } + } + } + public static void solution() { + for(int i = 0; i < M; i++) { + moveCloudnRain(command[i][0], command[i][1]); + copywater(); + makeCloud(); + } + } + public static void main(String[] args) throws IOException { + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + StringTokenizer st = new StringTokenizer(br.readLine()); + + N = Integer.parseInt(st.nextToken()); + M = Integer.parseInt(st.nextToken()); + + map = new int[N + 1][N + 1]; + command = new int[M][2]; + + cloud = new LinkedList(); + + cloud.add(new Cloud(N, 1)); + cloud.add(new Cloud(N, 2)); + cloud.add(new Cloud(N - 1, 1)); + cloud.add(new Cloud(N - 1, 2)); + + for(int i = 1; i <= N; i++) { + if(!st.hasMoreTokens()) st = new StringTokenizer(br.readLine()); + for(int j = 1; j <= N; j++) { + map[i][j] = Integer.parseInt(st.nextToken()); + } + } + + for(int i = 0; i < M; i++) { + if(!st.hasMoreTokens()) st = new StringTokenizer(br.readLine()); + command[i][0] = Integer.parseInt(st.nextToken()); + command[i][1] = Integer.parseInt(st.nextToken()); + } + + solution(); + + int result = 0; + for(int i = 1; i <= N; i++) { + for(int j = 1; j <= N; j++) { + result += map[i][j]; + } + } + + System.out.println(result); + } +} + +class Cloud { + int r, c; // ์œ„์น˜ ์ •๋ณด ์ดˆ๊ธฐ (N, 1), (N, 2), (N-1, 1), (N-1, 2) + public Cloud(int r, int c) { + this.r = r; + this.c = c; + } +} +``` diff --git a/src/content/blog/study/algorithmsolutions/2022-04-13-algo-baekjoon-20182.md b/src/content/blog/study/algorithmsolutions/2022-04-13-algo-baekjoon-20182.md new file mode 100644 index 0000000..3d63369 --- /dev/null +++ b/src/content/blog/study/algorithmsolutions/2022-04-13-algo-baekjoon-20182.md @@ -0,0 +1,162 @@ +--- +title: Baekjoon online judge. 20182.๊ณจ๋ชฉ ๋Œ€์žฅ ํ˜ธ์„ - ํšจ์œจ์„ฑ1 +date: 2022-04-13 +tags: algorithmsolutions, ๊ณต๋ถ€ +excerpt: 20182.๊ณจ๋ชฉ ๋Œ€์žฅ ํ˜ธ์„ - ํšจ์œจ์„ฑ1 - ๋ฐฑ์ค€์˜จ๋ผ์ธ +--- +# 20182.๊ณจ๋ชฉ ๋Œ€์žฅ ํ˜ธ์„ - ํšจ์œจ์„ฑ1 - ๋ฐฑ์ค€์˜จ๋ผ์ธ +ํ•ด๋‹น ๋ฌธ์ œ๋Š” ๋‹ค์ต์ŠคํŠธ๋ผ ๋ฐฉ์‹์œผ๋กœ ํ’€์–ด๋ณด์•˜์Šต๋‹ˆ๋‹ค. + +๋งํฌ : +[![image](/assets/img/algo_img/baekjoon_logo.png)](https://www.acmicpc.net/problem/20182) + +--- +## 1. ๋ฌธ์ œ +
+๋ฌธ์ œ ๋ณด๊ธฐ +
+ +|์‹œ๊ฐ„ ์ œํ•œ|๋ฉ”๋ชจ๋ฆฌ ์ œํ•œ| +|------|---| +|3 ์ดˆ|512 MB| + +์†Œ์‹ฏ์  ํ˜ธ์„์ด๋Š” ๊ณจ๋ชฉ ๋Œ€์žฅ์˜ ์‚ถ์„ ์‚ด์•˜๋‹ค. ํ˜ธ์„์ด๊ฐ€ ์‚ด๋˜ ๋งˆ์„์€ N ๊ฐœ์˜ ๊ต์ฐจ๋กœ์™€ M ๊ฐœ์˜ ๊ณจ๋ชฉ์ด ์žˆ์—ˆ๋‹ค. ๊ต์ฐจ๋กœ์˜ ๋ฒˆํ˜ธ๋Š” 1๋ฒˆ๋ถ€ํ„ฐ N ๋ฒˆ๊นŒ์ง€๋กœ ํ‘œํ˜„ํ•œ๋‹ค. ๊ณจ๋ชฉ์€ ์„œ๋กœ ๋‹ค๋ฅธ ๋‘ ๊ต์ฐจ๋กœ๋ฅผ ์–‘๋ฐฉํ–ฅ์œผ๋กœ ์ด์–ด์ฃผ๋ฉฐ ์ž„์˜์˜ ๋‘ ๊ต์ฐจ๋กœ๋ฅผ ์ž‡๋Š” ๊ณจ๋ชฉ์€ ์ตœ๋Œ€ ํ•œ ๊ฐœ๋งŒ ์กด์žฌํ•œ๋‹ค. ๋ถ„์‹ ์ˆ ์„ ์“ฐ๋Š” ํ˜ธ์„์ด๋Š” ๋ชจ๋“  ๊ณจ๋ชฉ์— ์ž์‹ ์˜ ๋ถ„์‹ ์„ ๋‘์—ˆ๊ณ , ๊ณจ๋ชฉ๋งˆ๋‹ค ํ†ต๊ณผํ•˜๋Š” ์‚ฌ๋žŒ์—๊ฒŒ ์ˆ˜๊ธˆํ•  ๊ฒƒ์ด๋‹ค. ์ˆ˜๊ธˆํ•˜๋Š” ์š”๊ธˆ์€ ๊ณจ๋ชฉ๋งˆ๋‹ค ๋‹ค๋ฅผ ์ˆ˜ ์žˆ๋‹ค. + +๋‹น์‹ ์€ A ๋ฒˆ ๊ต์ฐจ๋กœ์—์„œ B ๋ฒˆ ๊ต์ฐจ๋กœ๊นŒ์ง€ C ์›์„ ๊ฐ€์ง€๊ณ  ๊ฐ€๋ ค๊ณ  ํ•œ๋‹ค. ํ˜ธ์„์ด์˜ ํšกํฌ๋ฅผ ๋ณด๋ฉฐ ์งœ์ฆ์€ ๋‚˜์ง€๋งŒ, ๋ถ„์‹ ์ˆ ์„ ์ด๊ฒจ๋‚ผ ๋ฐฉ๋ฒ•์ด ์—†์–ด์„œ ๋ˆ์„ ๋‚ด๊ณ  ๊ฐ€๋ ค๊ณ  ํ•œ๋‹ค. ํ•˜์ง€๋งŒ ์ด์™• ์ง€๋‚˜๊ฐˆ ๊ฑฐ๋ฉด, ์ตœ์†Œํ•œ์˜ ์ˆ˜์น˜์‹ฌ์„ ๋ฐ›๊ณ  ์‹ถ๋‹ค. ๋‹น์‹ ์ด ๋ฐ›๋Š” ์ˆ˜์น˜์‹ฌ์€ ๊ฒฝ๋กœ ์ƒ์—์„œ ๊ฐ€์žฅ ๋งŽ์ด ๋‚ธ ๋ˆ์— ๋น„๋ก€ํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ๊ฒฐ๊ตญ ๊ฐˆ ์ˆ˜ ์žˆ๋Š” ๋‹ค์–‘ํ•œ ๋ฐฉ๋ฒ•๋“ค ์ค‘์—์„œ ์ตœ์†Œํ•œ์˜ ์ˆ˜์น˜์‹ฌ์„ ๋ฐ›์œผ๋ ค๊ณ  ํ•œ๋‹ค. ์ฆ‰, ํ•œ ๊ณจ๋ชฉ์—์„œ ๋‚ด์•ผ ํ•˜๋Š” ์ตœ๋Œ€ ์š”๊ธˆ์„ ์ตœ์†Œํ™”ํ•˜๋Š” ๊ฒƒ์ด๋‹ค. + +![image](https://i.imgur.com/72X0NKv.png) + +์˜ˆ๋ฅผ ๋“ค์–ด, ์œ„์˜ ๊ทธ๋ฆผ๊ณผ ๊ฐ™์ด 5๊ฐœ์˜ ๊ต์ฐจ๋กœ์™€ 5๊ฐœ์˜ ๊ณจ๋ชฉ์ด ์žˆ์œผ๋ฉฐ, ๋‹น์‹ ์ด 1๋ฒˆ ๊ต์ฐจ๋กœ์—์„œ 3๋ฒˆ ๊ต์ฐจ๋กœ๋กœ ๊ฐ€๊ณ  ์‹ถ์€ ์ƒํ™ฉ์ด๋ผ๊ณ  ํ•˜์ž. ๋งŒ์•ฝ 10์›์„ ๋“ค๊ณ  ์ถœ๋ฐœํ•œ๋‹ค๋ฉด 2๊ฐ€์ง€ ๊ฒฝ๋กœ๋กœ ๊ฐˆ ์ˆ˜ ์žˆ๋‹ค. 1๋ฒˆ -> 2๋ฒˆ -> 3๋ฒˆ ๊ต์ฐจ๋กœ๋กœ ์ด๋™ํ•˜๊ฒŒ ๋˜๋ฉด ์ด 10์›์ด ํ•„์š”ํ•˜๊ณ  ์ด ๊ณผ์ •์—์„œ ์ตœ๋Œ€ ์ˆ˜๊ธˆ์•ก์„ 5์›์ด์—ˆ๊ณ , 1๋ฒˆ -> 4๋ฒˆ -> 5๋ฒˆ -> 3๋ฒˆ ๊ต์ฐจ๋กœ๋กœ ์ด๋™ํ•˜๊ฒŒ ๋˜๋ฉด ์ด 8์›์ด ํ•„์š”ํ•˜๋ฉฐ ์ตœ๋Œ€ ์ˆ˜๊ธˆ์•ก์€ 6์›์ด ๋œ๋‹ค. ์ตœ์†Œํ•œ์˜ ์ˆ˜์น˜์‹ฌ์„ ์–ป๋Š” ๊ฒฝ๋กœ๋Š” ์ตœ๋Œ€ ์ˆ˜๊ธˆ์•ก์ด 5์ธ ๊ฒฝ๋กœ์ด๋‹ค. ํ•˜์ง€๋งŒ ๋งŒ์•ฝ 8์›๋ฐ–์— ์—†๋‹ค๋ฉด, ์ „์ž์˜ ๊ฒฝ๋กœ๋Š” ๊ฐˆ ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— ์ตœ๋Œ€ ์ˆ˜๊ธˆ์•ก์ด 6์›์ธ ๊ฒฝ๋กœ๋กœ ๊ฐ€์•ผ ํ•˜๋Š” ๊ฒƒ์ด ์ตœ์„ ์ด๋‹ค. + +๋‹น์‹ ์€ ์•ž์„  ์˜ˆ์ œ๋ฅผ ํ†ตํ•ด์„œ, ์ˆ˜์น˜์‹ฌ์„ ์ค„์ด๊ณ  ์‹ถ์„ ์ˆ˜๋ก ๊ฐ™๊ฑฐ๋‚˜ ๋” ๋งŽ์€ ๋ˆ์ด ํ•„์š”ํ•˜๊ณ , ์ˆ˜์น˜์‹ฌ์„ ๋” ๋ฐ›๋Š” ๊ฒƒ์„ ๊ฐ์ˆ˜ํ•˜๋ฉด ๊ฐ™๊ฑฐ๋‚˜ ๋” ์ ์€ ๋ˆ์ด ํ•„์š”ํ•˜๊ฒŒ ๋œ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ฒŒ ๋˜์—ˆ๋‹ค. ๋งˆ์„์˜ ์ง€๋„์™€ ๊ณจ๋ชฉ๋งˆ๋‹ค ์กด์žฌํ•˜๋Š” ํ˜ธ์„์ด๊ฐ€ ์ˆ˜๊ธˆํ•˜๋Š” ๊ธˆ์•ก์„ ์•ˆ๋‹ค๋ฉด, ๋‹น์‹ ์ด ํ•œ ๊ณจ๋ชฉ์—์„œ ๋‚ด์•ผํ•˜๋Š” ์ตœ๋Œ€ ์š”๊ธˆ์˜ ์ตœ์†Ÿ๊ฐ’์„ ๊ณ„์‚ฐํ•˜์ž. ๋งŒ์•ฝ ์ง€๊ธˆ ๊ฐ€์ง„ ๋ˆ์œผ๋กœ๋Š” ์ ˆ๋Œ€๋กœ ๋ชฉํ‘œ ์ง€์ ์„ ๊ฐˆ ์ˆ˜ ์—†๋‹ค๋ฉด -1 ์„ ์ถœ๋ ฅํ•˜๋ผ. + +### ์ž…๋ ฅ(Input) + +์ฒซ ์ค„์— ๊ต์ฐจ๋กœ ๊ฐœ์ˆ˜ N, ๊ณจ๋ชฉ ๊ฐœ์ˆ˜ M, ์‹œ์ž‘ ๊ต์ฐจ๋กœ ๋ฒˆํ˜ธ A, ๋„์ฐฉ ๊ต์ฐจ๋กœ ๋ฒˆํ˜ธ B, ๊ฐ€์ง„ ๋ˆ C ๊ฐ€ ๊ณต๋ฐฑ์œผ๋กœ ๊ตฌ๋ถ„๋˜์–ด ์ฃผ์–ด์ง„๋‹ค. ์ด์–ด์„œ M ๊ฐœ์˜ ์ค„์— ๊ฑธ์ณ์„œ ๊ฐ ๊ณจ๋ชฉ์ด ์ž‡๋Š” ๊ต์ฐจ๋กœ 2๊ฐœ์˜ ๋ฒˆํ˜ธ์™€, ๊ณจ๋ชฉ์˜ ์ˆ˜๊ธˆ์•ก์ด ๊ณต๋ฐฑ์œผ๋กœ ๊ตฌ๋ถ„๋˜์–ด ์ฃผ์–ด์ง„๋‹ค. ๊ฐ™์€ ๊ต์ฐจ๋กœ๋ฅผ ์ž‡๋Š” ๊ณจ๋ชฉ์€ ์ตœ๋Œ€ ํ•œ ๋ฒˆ๋งŒ ์ฃผ์–ด์ง€๋ฉฐ, ๊ณจ๋ชฉ์€ ์–‘๋ฐฉํ–ฅ์ด๋‹ค. + + +### ์ถœ๋ ฅ(Output) + +ํ˜ธ์„์ด๊ฐ€ ์ง€ํ‚ค๊ณ  ์žˆ๋Š” ๊ณจ๋ชฉ๋“ค์„ ํ†ตํ•ด์„œ ์‹œ์ž‘ ๊ต์ฐจ๋กœ์—์„œ ๋„์ฐฉ ๊ต์ฐจ๋กœ๊นŒ์ง€ C ์› ์ดํ•˜๋กœ ๊ฐ€๋Š” ๊ฒฝ๋กœ๋“ค ์ค‘์—, ์ง€๋‚˜๋Š” ๊ณจ๋ชฉ์˜ ์š”๊ธˆ์˜ ์ตœ๋Œ“๊ฐ’์˜ ์ตœ์†Ÿ๊ฐ’์„ ์ถœ๋ ฅํ•˜๋ผ. ๋งŒ์•ฝ ๊ฐˆ ์ˆ˜ ์—†๋‹ค๋ฉด -1์„ ์ถœ๋ ฅํ•œ๋‹ค. + +### ์ œํ•œ + + - 1 โ‰ค N โ‰ค 100,000 + - 1 โ‰ค M โ‰ค 500,000 + - 1 โ‰ค C โ‰ค 2,000,000 + - 1 โ‰ค ๊ณจ๋ชฉ ๋ณ„ ์ˆ˜๊ธˆ์•ก โ‰ค 20 + - 1 โ‰ค A, B โ‰ค N, A โ‰  B + - ๊ณจ๋ชฉ์ด ์ž‡๋Š” ๊ต์ฐจ๋กœ์˜ ๋ฒˆํ˜ธ๋Š” ์„œ๋กœ ๋‹ค๋ฅด๋‹ค. + +
+
+ +--- + +## 2. ๋ฌธ์ œ ํ’€์ด +์ด ๋ฌธ์ œ๋Š” ๋‹ค์ต์ŠคํŠธ๋ผ๋ฅผ ํ™œ์šฉํ•˜์—ฌ ํ’€์–ด๋ณด์•˜๋‹ค. + +์˜ค๋Š˜์€ ํฌ์ŠคํŠธ๋ฅผ ์ž‘์„ฑ ํ•  ์ˆ˜ ์—†์–ด์„œ ์ถ”ํ›„ ์—…๋ฐ์ดํŠธ ํ•˜๊ฒ ๋‹ค. + + +๊ทธ๋Ÿผ ์ด๊ฒƒ์„ ํ™œ์šฉํ•˜์—ฌ ์ฝ”๋“œ๋กœ ํ‘œํ˜„ํ•ด๋ณด์ž. + +```java +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Comparator; +import java.util.List; +import java.util.PriorityQueue; +import java.util.StringTokenizer; + +public class AlleyBossHoseok_20182 { + static int N, M, A, B, C; + static List> map; + static int min[]; + static int solution() { + int answer = 0; + + PriorityQueue pq = new PriorityQueue<>(new Comparator(){ + @Override + public int compare(Pay o1, Pay o2) { + if(o1.p == o2.p) return o1.n - o2.n; + else return o1.p - o2.p; + } + }); + + boolean[] visited = new boolean[N + 1]; + + pq.add(new Pay(A, 0, Integer.MIN_VALUE)); + + while(!pq.isEmpty()) { + Pay cur = pq.poll(); + if(visited[cur.n] || cur.n == B) continue; + + visited[cur.n] = true; + + for(Pay next : map.get(cur.n)) { + int totalPay = cur.p + next.n; + if(visited[next.n] || totalPay > C) continue; + + int curMax = cur.max; + if(curMax < next.p) { + curMax = next.p; + } + if(min[next.n] > curMax) min[next.n] = curMax; + pq.add(new Pay(next.n, totalPay, curMax)); + } + } + + answer = min[B] != Integer.MAX_VALUE ? min[B] : -1; + return answer; + } + public static void main(String[] args) throws IOException { + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + StringTokenizer st = new StringTokenizer(br.readLine()); + + N = Integer.parseInt(st.nextToken()); + M = Integer.parseInt(st.nextToken()); + A = Integer.parseInt(st.nextToken()); + B = Integer.parseInt(st.nextToken()); + C = Integer.parseInt(st.nextToken()); + + map = new ArrayList<>(); + min = new int[N + 1]; + Arrays.fill(min, Integer.MIN_VALUE); + + for(int i = 0; i <= N; i++) map.add(new ArrayList<>()); + for(int i = 0; i < M; i++) { + if(!st.hasMoreTokens()) st = new StringTokenizer(br.readLine()); + int one = Integer.parseInt(st.nextToken()); + int two = Integer.parseInt(st.nextToken()); + int cost = Integer.parseInt(st.nextToken()); + + map.get(one).add(new Pay(two, cost)); + map.get(two).add(new Pay(one, cost)); + } + + System.out.println(solution()); + } +} + +class Pay { + int n; + int p; + int max; + + public Pay(int n, int p) { + this.n = n; + this.p = p; + } + + public Pay(int n, int p, int max) { + this.n = n; + this.p = p; + this.max = max; + } +} + +``` diff --git a/src/content/blog/study/algorithmsolutions/2022-04-18-algo-programmers-1835.md b/src/content/blog/study/algorithmsolutions/2022-04-18-algo-programmers-1835.md new file mode 100644 index 0000000..d9a4f7e --- /dev/null +++ b/src/content/blog/study/algorithmsolutions/2022-04-18-algo-programmers-1835.md @@ -0,0 +1,163 @@ +--- +title: Programmers. 1835.๋‹จ์ฒด์‚ฌ์ง„ ์ฐ๊ธฐ +date: 2022-04-18 +tags: algorithmsolutions, ๊ณต๋ถ€, ์ˆœ์—ด +excerpt: 1835.๋‹จ์ฒด์‚ฌ์ง„ ์ฐ๊ธฐ - ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค +--- +# 1835.๋‹จ์ฒด์‚ฌ์ง„ ์ฐ๊ธฐ - ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค +ํ•ด๋‹น ๋ฌธ์ œ๋Š” ์ˆœ์—ด๋กœ ์นด์นด์˜ค ์นœ๊ตฌ๋“ค์˜ ์ˆœ์„œ๋ฅผ ๋‚˜์—ดํ•˜๊ณ  ์กฐ๊ฑด์„ ๊ฑธ์–ด ํ’€์–ด๋ณด์•˜์Šต๋‹ˆ๋‹ค. + +๋งํฌ : +[![image](https://velog.velcdn.com/images/pyh8618/post/ad4f3b17-fb2b-4290-b7e1-8b953f554a6d/programmers.jpg)](https://programmers.co.kr/learn/courses/30/lessons/1835) + +--- +## 1. ๋ฌธ์ œ +
+๋ฌธ์ œ ๋ณด๊ธฐ +
+ +![image](https://t1.kakaocdn.net/codefestival/picture.png) + +๊ฐ€์„์„ ๋งž์•„ ์นด์นด์˜คํ”„๋ Œ์ฆˆ๋Š” ๋‹จ์ฒด๋กœ ์†Œํ’์„ ๋– ๋‚ฌ๋‹ค. ์ฆ๊ฑฐ์šด ์‹œ๊ฐ„์„ ๋ณด๋‚ด๊ณ  ๋งˆ์ง€๋ง‰์— ๋‹จ์ฒด์‚ฌ์ง„์„ ์ฐ๊ธฐ ์œ„ํ•ด ์นด๋ฉ”๋ผ ์•ž์— ์ผ๋ ฌ๋กœ ๋‚˜๋ž€ํžˆ ์„ฐ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ๊ฐ์ž๊ฐ€ ์›ํ•˜๋Š” ๋ฐฐ์น˜๊ฐ€ ๋ชจ๋‘ ๋‹ฌ๋ผ ์–ด๋–ค ์ˆœ์„œ๋กœ ์„ค์ง€ ์ •ํ•˜๋Š”๋ฐ ์‹œ๊ฐ„์ด ์˜ค๋ž˜ ๊ฑธ๋ ธ๋‹ค. ๋„ค์˜ค๋Š” ํ”„๋กœ๋„์™€ ๋‚˜๋ž€ํžˆ ์„œ๊ธฐ๋ฅผ ์›ํ–ˆ๊ณ , ํŠœ๋ธŒ๊ฐ€ ๋ฟœ์€ ๋ถˆ์„ ๋งž์€ ์ ์ด ์žˆ๋˜ ๋ผ์ด์–ธ์€ ํŠœ๋ธŒ์—๊ฒŒ์„œ ์ ์–ด๋„ ์„ธ ์นธ ์ด์ƒ ๋–จ์–ด์ ธ์„œ ์„œ๊ธฐ๋ฅผ ์›ํ–ˆ๋‹ค. ์‚ฌ์ง„์„ ์ฐ๊ณ  ๋‚˜์„œ ๋Œ์•„์˜ค๋Š” ๊ธธ์—, ๋ฌด์ง€๋Š” ๋ชจ๋‘๊ฐ€ ์›ํ•˜๋Š” ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋ฉด์„œ๋„ ๋‹ค๋ฅด๊ฒŒ ์„œ๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ์ง€ ์•Š์•˜์„๊นŒ ์ƒ๊ฐํ•ด๋ณด๊ฒŒ ๋˜์—ˆ๋‹ค. ๊ฐ ํ”„๋ Œ์ฆˆ๊ฐ€ ์›ํ•˜๋Š” ์กฐ๊ฑด์„ ์ž…๋ ฅ์œผ๋กœ ๋ฐ›์•˜์„ ๋•Œ ๋ชจ๋“  ์กฐ๊ฑด์„ ๋งŒ์กฑํ•  ์ˆ˜ ์žˆ๋„๋ก ์„œ๋Š” ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ๊ณ„์‚ฐํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•ด๋ณด์ž. + + +### ์ž…๋ ฅํ˜•์‹ + +์ž…๋ ฅ์€ ์กฐ๊ฑด์˜ ๊ฐœ์ˆ˜๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ์ •์ˆ˜ n๊ณผ n๊ฐœ์˜ ์›์†Œ๋กœ ๊ตฌ์„ฑ๋œ ๋ฌธ์ž์—ด ๋ฐฐ์—ด data๋กœ ์ฃผ์–ด์ง„๋‹ค. data์˜ ์›์†Œ๋Š” ๊ฐ ํ”„๋ Œ์ฆˆ๊ฐ€ ์›ํ•˜๋Š” ์กฐ๊ฑด์ด N~F=0๊ณผ ๊ฐ™์€ ํ˜•ํƒœ์˜ ๋ฌธ์ž์—ด๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ๋‹ค. ์ œํ•œ์กฐ๊ฑด์€ ์•„๋ž˜์™€ ๊ฐ™๋‹ค. + + - 1 <= n <= 100 + - data์˜ ์›์†Œ๋Š” ๋‹ค์„ฏ ๊ธ€์ž๋กœ ๊ตฌ์„ฑ๋œ ๋ฌธ์ž์—ด์ด๋‹ค. ๊ฐ ์›์†Œ์˜ ์กฐ๊ฑด์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค. + - ์ฒซ ๋ฒˆ์งธ ๊ธ€์ž์™€ ์„ธ ๋ฒˆ์งธ ๊ธ€์ž๋Š” ๋‹ค์Œ 8๊ฐœ ์ค‘ ํ•˜๋‚˜์ด๋‹ค. {A, C, F, J, M, N, R, T} ๊ฐ๊ฐ ์–ดํ”ผ์น˜, ์ฝ˜, ํ”„๋กœ๋„, ์ œ์ด์ง€, ๋ฌด์ง€, ๋„ค์˜ค, ๋ผ์ด์–ธ, ํŠœ๋ธŒ๋ฅผ ์˜๋ฏธํ•œ๋‹ค. ์ฒซ ๋ฒˆ์งธ ๊ธ€์ž๋Š” ์กฐ๊ฑด์„ ์ œ์‹œํ•œ ํ”„๋ Œ์ฆˆ, ์„ธ ๋ฒˆ์งธ ๊ธ€์ž๋Š” ์ƒ๋Œ€๋ฐฉ์ด๋‹ค. ์ฒซ ๋ฒˆ์งธ ๊ธ€์ž์™€ ์„ธ ๋ฒˆ์งธ ๊ธ€์ž๋Š” ํ•ญ์ƒ ๋‹ค๋ฅด๋‹ค. + - ๋‘ ๋ฒˆ์งธ ๊ธ€์ž๋Š” ํ•ญ์ƒ ~์ด๋‹ค. + - ๋„ค ๋ฒˆ์งธ ๊ธ€์ž๋Š” ๋‹ค์Œ 3๊ฐœ ์ค‘ ํ•˜๋‚˜์ด๋‹ค. {=, <, >} ๊ฐ๊ฐ ๊ฐ™์Œ, ๋ฏธ๋งŒ, ์ดˆ๊ณผ๋ฅผ ์˜๋ฏธํ•œ๋‹ค. + - ๋‹ค์„ฏ ๋ฒˆ์งธ ๊ธ€์ž๋Š” 0 ์ด์ƒ 6 ์ดํ•˜์˜ ์ •์ˆ˜์˜ ๋ฌธ์žํ˜•์ด๋ฉฐ, ์กฐ๊ฑด์— ์ œ์‹œ๋˜๋Š” ๊ฐ„๊ฒฉ์„ ์˜๋ฏธํ•œ๋‹ค. ์ด๋•Œ ๊ฐ„๊ฒฉ์€ ๋‘ ํ”„๋ Œ์ฆˆ ์‚ฌ์ด์— ์žˆ๋Š” ๋‹ค๋ฅธ ํ”„๋ Œ์ฆˆ์˜ ์ˆ˜์ด๋‹ค. + + +### ์ถœ๋ ฅ(Output) + +๋ชจ๋“  ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋Š” ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ๋ฆฌํ„ดํ•œ๋‹ค. + +### ์˜ˆ์ œ์ž…์ถœ๋ ฅ + +| n | data | answer | +| -- | ---- | ------ | +| 2 | ["N~F=0", "R~T>2"] | 3648 | +| 2 | ["M~C<2", "C~M>1"] | 0 | + +### ์˜ˆ์ œ์—๋Œ€ํ•œ ์„ค๋ช… + +์ฒซ ๋ฒˆ์งธ ์˜ˆ์ œ๋Š” ๋ฌธ์ œ์— ์„ค๋ช…๋œ ๋ฐ”์™€ ๊ฐ™์ด, ๋„ค์˜ค๋Š” ํ”„๋กœ๋„์™€์˜ ๊ฐ„๊ฒฉ์ด 0์ด๊ธฐ๋ฅผ ์›ํ•˜๊ณ  ๋ผ์ด์–ธ์€ ํŠœ๋ธŒ์™€์˜ ๊ฐ„๊ฒฉ์ด 2๋ณด๋‹ค ํฌ๊ธฐ๋ฅผ ์›ํ•˜๋Š” ์ƒํ™ฉ์ด๋‹ค. + +๋‘ ๋ฒˆ์งธ ์˜ˆ์ œ๋Š” ๋ฌด์ง€๊ฐ€ ์ฝ˜๊ณผ์˜ ๊ฐ„๊ฒฉ์ด 2๋ณด๋‹ค ์ž‘๊ธฐ๋ฅผ ์›ํ•˜๊ณ , ๋ฐ˜๋Œ€๋กœ ์ฝ˜์€ ๋ฌด์ง€์™€์˜ ๊ฐ„๊ฒฉ์ด 1๋ณด๋‹ค ํฌ๊ธฐ๋ฅผ ์›ํ•˜๋Š” ์ƒํ™ฉ์ด๋‹ค. ์ด๋Š” ๋™์‹œ์— ๋งŒ์กฑํ•  ์ˆ˜ ์—†๋Š” ์กฐ๊ฑด์ด๋ฏ€๋กœ ๊ฒฝ์šฐ์˜ ์ˆ˜๋Š” 0์ด๋‹ค. + +
+
+ +--- + +## 2. ๋ฌธ์ œ ํ’€์ด + +์นด์นด์˜ค ์นœ๊ตฌ๋“ค์˜ ์ผ๋ ฌ๋กœ ๋‚˜์—ด๋˜๋Š” ์ˆœ์—ด์˜ ๊ฒฝ์šฐ๋ฅผ ์šฐ์„ ์ ์œผ๋กœ ๊ตฌํ•ด๋ณด์•˜๋‹ค. + +์ˆœ์—ด ๋ฐฉ์‹์„ ์ด์šฉํ•ด์„œ ์šฐ์„ ์ ์œผ๋กœ ์นด์นด์˜ค ์นœ๊ตฌ๋“ค์˜ ์ˆœ์„œ๋ฅผ ๋‚˜์—ดํ•œ๋‹ค. + +nPr์„ ์•„๋ž˜์™€ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ์ •์˜ํ•  ์ˆ˜ ์žˆ๋‹ค. + +```java +public void permutation(char[] arr, int depth, int n, int r) { + if(depth == r) { + print(arr); + return; + } + + for(int i = depth; i < n; i++) { + swap(arr, depth, i); + permutation(arr, depth + 1, n, r); + swap(arr, depth, i); + } +} +``` + +์ด๋ ‡๊ฒŒ ๋ชจ๋“  ์นด์นด์˜ค์นœ๊ตฌ๋“ค์˜ ์ˆœ์—ด์„ ๊ตฌํ–ˆ๋‹ค๋ฉด, ์ž…๋ ฅ๋œ data ๋ฐฐ์—ด์˜ ๋ฐฉ์‹๋Œ€๋กœ ์กฐ๊ฑด์— ๋”ฐ๋ผ์„œ ์นด์šดํŒ…์„ ํ•  ๊ฒƒ์ธ์ง€ ๊ทธ๋ƒฅ return ํ•  ๊ฒƒ์ธ์ง€๋ฅผ ๊ตฌํ•ด์ค€๋‹ค. + +์ด๋•Œ, ์ฃผ์˜ํ•˜์—ฌ์•ผ ํ•  ๊ฒƒ์€ ๋‘ ์นœ๊ตฌ ์‚ฌ์ด์˜ ์กฐ๊ฑด์„ ๋‚˜ํƒ€๋‚ธ ๊ฒƒ ์ด๋ฏ€๋กœ ์‚ฌ์ด ์ˆซ์ž๋Š” `+1`์„ ์‹œ์ผœ์ฃผ์–ด์„œ ๋น„๊ตํ•ด์•ผ ํ•œ๋‹ค. + + +๊ทธ๋Ÿผ ์ด๊ฒƒ์„ ํ™œ์šฉํ•˜์—ฌ ์ฝ”๋“œ๋กœ ํ‘œํ˜„ํ•ด๋ณด์ž. + +```java +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.util.StringTokenizer; + +public class GroupPhoto_level2 { + // ์–ดํ”ผ์น˜, ์ฝ˜, ํ”„๋กœ๋„, ์ œ์ด์ง€, ๋ฌด์ง€, ๋„ค์˜ค, ๋ผ์ด์–ธ, ํŠœ๋ธŒ + static char[] kakaoFriends = {'A', 'C', 'F', 'J', 'M', 'N', 'R', 'T'}; + static int totalcnt; + + public static int findFriend(char[] kakao, char pick) { + for(int i = 0; i < kakao.length; i++) { + if(kakao[i] == pick) return i; + } + return -1; + } + + public static void checkOrder(char[] kakao, String[] data) { + int len = data.length; + for(int i = 0; i < len; i++) { + char[] tmp = data[i].toCharArray(); + int first = findFriend(kakao, tmp[0]); + int second = findFriend(kakao, tmp[2]); + int gap = tmp[4] - '0'; + if(tmp[3] == '=') { + if(Math.abs(first - second) != gap + 1) return; + } else if(tmp[3] == '<') { + if(Math.abs(first - second) >= gap + 1) return; + } else if(tmp[3] == '>') { + if(Math.abs(first - second) <= gap + 1) return; + } + } + + totalcnt++; + } + + public static void swap(char[] data, int depth, int i) { + char tmp = data[depth]; + data[depth] = data[i]; + data[i] = tmp; + } + + public static void permutation(char[] arr, int depth, int n, int r, String[] data) { + if(depth == r) { + checkOrder(arr, data); + return; + } + + for(int i = depth; i < n; i++) { + swap(arr, depth, i); + permutation(arr, depth + 1, n, r, data); + swap(arr, depth, i); + } + } + public static int solution(int n, String[] data) { + totalcnt = 0; + permutation(kakaoFriends, 0, 8, 8, data); + return totalcnt; + } + + public static void main(String[] args) throws IOException { + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + StringTokenizer st = new StringTokenizer(br.readLine()); + + int N = Integer.parseInt(st.nextToken()); + String[] data = new String[N]; + st = new StringTokenizer(br.readLine()); + for(int i = 0; i < N; i++) { + data[i] = st.nextToken(); + } + + System.out.println(solution(N, data)); + } +} +``` diff --git a/src/content/blog/study/aws/2024-05-15-start-aws.md b/src/content/blog/study/aws/2024-05-15-start-aws.md new file mode 100644 index 0000000..01b8fef --- /dev/null +++ b/src/content/blog/study/aws/2024-05-15-start-aws.md @@ -0,0 +1,70 @@ +--- +title: AWS ๊ณต๋ถ€ ๋‚ด์šฉ ์ •๋ฆฌ +date: 2024-05-15 +tags: aws, ๊ณต๋ถ€ +excerpt: AWS ๊ณต๋ถ€๋ฅผ ์‹œ์ž‘ํ•˜๋ฉด์„œ +--- +# AWS Certified Developer - Associate ์‹œํ—˜ ์‘์‹œ + +ํšŒ์‚ฌ์—์„œ AWS๋ฅผ ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜๋ฉด์„œ AWS-SDK for cpp๋ฅผ ๋‹ค๋ฃจ๊ฒŒ ๋˜์—ˆ๊ณ , ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ AWS์— ๋Œ€ํ•œ ๊ด€์‹ฌ์ด ์ƒ๊ฒผ๋‹ค. + +๋•Œ๋ฌธ์— ์˜ฌํ•ด๊ฐ€ ๊ฐ€๊ธฐ ์ „์— AWS ์ž๊ฒฉ์ฆ ๊ณต๋ถ€๋ฅผ ํ•œ๋ฒˆ ํ•ด๋ณด๊ณ  ์‹ถ๋‹ค๋Š” ์ƒ๊ฐ์„ ํ–ˆ์—ˆ๋‹ค. + +๊ทธ๋Ÿฐ๋ฐ ๊ฐ™์€ ์ƒ๊ฐ์„ ๊ฐ€์ง„ ๋™๋ฃŒ๋“ค์ด ์žˆ์—ˆ๊ณ , ์ด๋ฒˆ ๊ธฐํšŒ์— ๊ฐ™์ด ์‘์‹œ๋ฅผ ํ•ด๋ณด๋ ค๊ณ  ํ•œ๋‹ค. + +๋•Œ๋ฌธ์— ์ด ๊ธ€์€ ๊ทธ๋Ÿฐ ๊ณต๋ถ€์™€ ๊ด€๋ จ๋œ ๋‚ด์šฉ์„ ๊ธฐ๋กํ•˜๋Š” ๊ฒƒ์ด๋‹ค. + +์‹œํ—˜ ์‘์‹œ์ผ์€ 24๋…„ 06์›” 21์ผ (๊ธˆ)! ํ™”์ดํŒ…ํ•ด๋ณด์ž!! + +--- + +# Udemy ๊ฐ•์˜ ์ˆ˜๋ฃŒ ๋ชฉํ‘œ! + +## Stephane Maarek | Ultimate AWS Certified Developer Associate 2024 NEW DVA-C02 +๊ณต๋ถ€๋Š” ๊ธฐ๊ฐ„์„ 1๋‹ฌ๋กœ Udemy ๊ฐ•์˜๋ฅผ ๋น ๋ฅด๊ฒŒ ๋ณธ ๋’ค์— ๋ฐ”๋กœ ๋คํ”„ ๋ฌธ์ œํ’€์ด๋กœ ๋“ค์–ด๊ฐ€๋Š” ๊ฒƒ์ด ์ตœ์ดˆ ์ „๋žต์ด๋‹ค. + +๊ฐ•์˜๋Š” ๊ฐ€์žฅ ์œ ๋ช…ํ•œ [Stephane Maarek์˜ Ultimate AWS Certified Developer Associate 2024 NEW DVA-C02](https://www.udemy.com/course/aws-certified-developer-associate-dva-c01/) ๋กœ ์„ ํƒํ•˜์˜€๊ณ , ๊ฐ•์˜ ๊ธธ์ด๊ฐ€ 460ํšŒ๊ฐ€ ๋„˜๋‹ค๋ณด๋‹ˆ ํ•ธ์ฆˆ์˜จ์€ ์ƒ๋žตํ•˜๊ณ  ๊ฐœ๋… ์ค‘์‹ฌ์œผ๋กœ ๋“ค์„ ์ƒ๊ฐ์ด๋‹ค. + +๊ฐ•์˜์˜ ์ ˆ๋ฐ˜์„ ์ฐจ์ง€ํ•˜๋Š” ๊ธฐ๋ณธ ๊ฐœ๋…๋“ค์€ ๋‹จ๋… ๋ฌธ์ œ๋กœ ๊ฑฐ์˜ ์ถœ์ œ๋˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๋ง์ด ์žˆ๊ธฐ์— 2๋ถ€์— ํ•ด๋‹นํ•˜๋Š” Serverless ์ด์ „์˜ ๊ธฐ๋ณธ ๊ฐœ๋…๋“ค(EC2, S3, DB, Route53 ๋“ฑ)์€ ๊ฑฐ์˜ ๊ฐœ๋…๋งŒ ๋ณผ ๊ณ„ํš์ด๊ณ , DynamoDB, Lambda, CI/CD ์ค‘์‹ฌ์œผ๋กœ ๊ณต๋ถ€๋ฅผ ์ง„ํ–‰ํ•˜๋ ค๊ณ  ํ•œ๋‹ค. + +๋คํ”„๋Š” [examtopics](https://www.examtopics.com/exams/amazon/) ๋ฅผ ์ถ”์ฒœํ•˜๊ธธ๋ž˜ ๊ทธ ์œ„์ฃผ๋กœ ๋ฌธ์ œ๋ฅผ ํ’€์–ด๋ณผ ์ƒ๊ฐ์ด๊ณ , ์‹ค์ œ๋กœ discussion์„ ํ†ตํ•ด ์ •๋‹ต์— ๋Œ€ํ•œ ์‚ฌ๋žŒ๋“ค์˜ ์˜๊ฒฌ๋„ ๋ณผ ์ˆ˜ ์žˆ์–ด์„œ ์ •ํ™•ํ•˜๊ฒŒ ํŒŒ์•…ํ•˜๊ธฐ ์ข‹์„ ๊ฒƒ ๊ฐ™๋‹ค. + +--- + +## ๊ฐ•์˜ ์„น์…˜ ์ •๋ฆฌ + - Section 1 : Course Introduction - AWS Certified Developer Associate + - Section 2 : Code & Slides Download + - Section 3 : Getting started with AWS + - Section 4 : IAM & AWS CLI + - Section 5 : EC2 Fundamentals + - Section 6 : EC2 Instance Storage + - Section 7 : AWS Fundamentals: ELB + ASG + - Section 8 : AWS Fundamentals: RDS + Aurora + ElastiCache + - Section 9 : Route 53 + - Section 10 : VPC Fundamentals + - Section 11 : Amazon S3 Introduction + - Section 12 : AWS CLI, SDK, IAM Roles & Policies + - Section 13 : Advanced Amazon S3 + - Section 14 : Amazon S3 Security + - Section 15 : CloudFront + - Section 16 : ECS, ECR & Fargate - Docker in AWS + - Section 17 : AWS Elastic Beanstalk + - Section 18 : AWS CloudFormation + - Section 19 : AWS Integration & Messaging: SQS, SNS & Kinesis + - Section 20 : AWS Monitoring & Audit: CouldWatch, X-Ray and CloudTrail + - Section 21 : AWS Serverless: Lambda + - Section 22 : AWS Serverless: DynamoDB + - Section 23 : AWS Serverless: API Gateway + - Section 24 : AWS CICD: CodeCommit, CodePipeline, CodeBuild, CodeDeploy + - Section 25 : AWS Serverless: SAM - Serverless Application Model + - Section 26 : Could Development Kit (CDK) + - Section 27 : Cognito: Cognito User Pools, Cognito Identity Pools & Cognito Sync + - Section 28 : Other Serverless: Step Functions & AppSync + - Section 29 : Advanced Identity + - Section 30 : AWS Security & Encryption: KMS, Encryption SDK, SSM Parameter Store, IAM & STS + - Section 31 : AWS Other Serverless + - Section 32 : AWS Final Cleanup + - Section 33 : Preparing for the Exam - AWS Certified Developer Associate + - Section 34 : Congratulations - AWS Certified Developer Associate + +์ง•๊ทธ๋Ÿฝ๊ฒŒ ๋งŽ๋‹ค.. ํ™”์ดํŒ…! diff --git a/src/content/blog/study/aws/2024-05-15-start-aws2.md b/src/content/blog/study/aws/2024-05-15-start-aws2.md new file mode 100644 index 0000000..2030f01 --- /dev/null +++ b/src/content/blog/study/aws/2024-05-15-start-aws2.md @@ -0,0 +1,207 @@ +--- +title: AWS ๊ณต๋ถ€ ๋‚ด์šฉ ์ •๋ฆฌ +date: 2024-05-15 +tags: aws, ๊ณต๋ถ€ +excerpt: AWS ๊ฐ•์˜๋ฅผ ์‹œ์ž‘ +--- +# AWS ๊ฐ•์˜ ์‹œ์ž‘ + +์‹œ์ž‘๋ถ€ํ„ฐ ์‹œํ—˜์— ๋งž์ถฐ์ง„ ๊ฐ•์˜๋ผ๋Š” ๋А๋‚Œ์„ ๋ฐ›์•˜๋‹ค. + +์„น์…˜ 1 ~ 11 ๊นŒ์ง€ ๊ธฐ์ดˆ ๊ฐ•์˜๋กœ ๋˜์–ด ์žˆ๊ณ , 3, 4 & 5๋Š” ์Šคํ‚ตํ•ด๋„ ๋œ๋‹ค๊ณ  ๋˜์–ด ์žˆ์–ด์„œ ๋‹นํ™ฉ์Šค๋Ÿฝ๊ธด ํ•œ๋ฐ.. + +ํ•œ๋ฒˆ๋ณด๊ณ  ์•ˆ ๋ณผ๊บผ๋ฉด ์–ด๋–ป๊ฒŒ ๋ณด๋ผ๊ณ  ๊ฐ•์˜ ์ˆœ์„œ๊นŒ์ง€ ์ •๋ฆฌํ•ด๋‘๋„ค ๐Ÿ˜ƒ + +#### Please watch the following lectures: + + - Section 7 - AWS Fundamentals: ELB + ASG + - Auto Scaling Groups - Instance Refresh + - Section 8 - AWS Fundamentals: RDS + Aurora + ElastiCache + - ElastiCache Strategies + - Amazon MemoryDB for Redis + - Section 9 - Route 53 + - Routing Policy - Traffic Flow & Geoproximity Hands On + - Section 10 - VPC Fundamentals + - VPC Fundamentals - Section Introduction + - VPC, Subnets, IGW and NAT + - NACL, SG, VPC Flow Logs + - VPC Peering, Endpoints, VPN, DX + - VPC Cheat Sheet & Closing Comments + - Three Tier Architecture + - Section 12 - AWS CLI, SDK, IAM Roles & Policies + - AWS EC2 Instance Metadata + - AWS EC2 Instance Metadata - Hands On + - AWS CLI Profiles + - AWS CLI with MFA + - AWS SDK Overview + - Exponential Backoff & Service Limit Increase + - AWS Credentials Provider & Chain + - AWS Signature v4 Signing + - Section 15 - CloudFront + - CloudFront - Caching & Caching Policies + - CloudFront - Cache Behaviors + - CloudFront - Caching & Caching Invalidations - Hands On + - CloudFront - Signed URL / Cookies + - CloudFront - Signed URL - Key Groups + Hands On + - CloudFront - Advanced Concepts + - CloudFront - Real Time Logs + - Section 16 - ECS, ECR & Fargate - Docker in AWS + - Amazon ECS - Rolling Updates + - Amazon ECS Task Definitions - Deep Dive + - Amazon ECS Task Definitions - Hands On + - Amazon ECS - Task Placements + - Amazon ECR - Hands On + - And everything from Section 17 onwards + +์ด๊ฒƒ๋งŒ ๋“ค์–ด๋„ ๋˜๋Š”๊ฑด์ง€๋Š” ๋ชจ๋ฅด๊ฒ ๋‹ค. + +--- + +## AWS ๊ฐ€์ž… + +์ด์ „์— aws ์ฐ๋จนํ•ด๋ณด๊ฒ ๋‹ค๊ณ  ๊ฐ€์ž…ํ–ˆ์—ˆ๋Š”๋ฐ, 90์ผ ์ง€๋‚˜์„œ ๋น„ํ™œ์„ฑํ™”๊ฐ€ ๋˜์–ด ๋ฒ„๋ ธ๋„ค;; + +์ฐพ์•„๋ณด๋‹ˆ account+tag@mail.com ์ด๋Ÿฐ์‹์œผ๋กœ ํƒœ๊ทธ๋ฅผ ๋‹ฌ๋ฉด ์›๋ž˜ ์ด๋ฉ”์ผ ๊ณ„์ •์œผ๋กœ ์ธ์‹ํ•ด์„œ ์ฝ”๋“œ๋ฅผ ๋ณด๋‚ด์ฃผ๊ธธ๋ž˜ ๋‹ค์‹œ ๊ฐ€์ž…์„ ํ–ˆ๋‹ค. + +์‹œ์ž‘๋ถ€ํ„ฐ ๋‹นํ™ฉ์Šค๋Ÿฌ์› ์ง€๋งŒ ์–ด์ฉ” ์ˆ˜ ์—†์ง€. + +๊ด€๋ จํ•ด์„œ ๊ฐ•์˜์—์„œ๋„ ์ •๋ฆฌ๋ฅผ ํ•ด๋’€๋Š”๋ฐ ์ด๊ฑด ๋ชป๋ดค๋„ค ๐Ÿ˜‚ + +์•„๋ฌดํŠผ ์ƒ์„ฑ ์™„!! + +--- + +## AWS ์—ญ์‚ฌ์™€ Regions + +์ด๊ฑด ๋น ๋ฅด๊ฒŒ ๋ณด๊ณ  ์ง€๋‚˜๊ฐ€์ž + +--- + +## AWS Console + +Aws Console์— ๋Œ€ํ•œ ๋‚ด์šฉ์„ ๋‹ค๋ฃจ๋Š”๋ฐ ํ•˜๋‚˜์”ฉ ๋ณด๋ฉด์„œ ์นœ์ˆ™ํ•ด์ง€๋Š” ๋ฐฉ๋ฒ•์ด ์ข‹์„๊ฒƒ ๊ฐ™๋‹ค. + +์ด์ „์—๋„ EC2์™€ ๊ฐ™์€ ์„œ๋น„์Šค๋ฅผ ์ด์šฉํ•ด๋ณธ์  ์žˆ๋Š”๋ฐ, ๊ฝค ๋งŽ์ด ํ•œ๊ธ€ ์ตœ์ ํ™”๋„ ๋œ๊ฑฐ ๊ฐ™๊ณ  ์ฝ˜์†”์ด ์นœ์ˆ™ํ™”๊ฐ€ ์ง„ํ–‰๋œ๊ฑฐ ๊ฐ™๋‹ค. + +--- + +## IAM + +IAM ์ด๋ž€? +IAM = Identity and Access Management, Global service +๋กœ ID์™€ ์—‘์„ธ์Šค ๊ด€๋ฆฌ์˜ ์•ฝ์ž์ด๋‹ค. + +IAM์—์„œ๋Š” ์‚ฌ์šฉ์ž๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ๊ทธ๋ฃน์— ํ• ๋‹นํ•  ์ˆ˜ ์žˆ๋‹ค. + +์œ ์ €(Users)๋Š” ์กฐ์ง์—์„œ์˜ ์‚ฌ๋žŒ์„ ๋œปํ•˜๋ฉฐ ๊ทธ๋ฃน์œผ๋กœ ๋  ์ˆ˜ ์žˆ๋‹ค. + +๊ทธ๋ฃน(Groups)๋Š” ์˜ค์ง ์œ ์ €๋ฅผ ํฌํ•จํ•˜๊ณ  ์žˆ๊ณ  ๋‹ค๋ฅธ ๊ทธ๋ฃน์€ ํฌํ•จํ•  ์ˆ˜ ์—†๋‹ค.(์ค‘์š”) + +์–ด๋–ค ์œ ์ €๋Š” ๊ทธ๋ฃน์— ์†ํ•ด์žˆ์ง€ ์•Š์•„๋„ ๋œ๋‹ค. + +๋˜ํ•œ, ๊ฐ ๊ทธ๋ฃน ์‚ฌ์ด์— ๊ทธ๋ฃน์„ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค. + +### ์™œ ์‚ฌ์šฉ์ž์™€ ๊ทธ๋ฃน์„ ์ƒ์„ฑํ• ๊นŒ? + +AWS๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•œ Permissions ๋•Œ๋ฌธ์ด๋‹ค. + +์œ ์ €์™€ ๊ทธ๋ฃน์€ ์ •์ฑ…์ด๋ผ๊ณ  ๋ถˆ๋ฆฌ๋Š” JSON ๋ฌธ์„œ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•œ๋‹ค. + +์ด๋Ÿฌํ•œ ์ •์ฑ…์€ ์œ ์ €๋“ค์˜ ์‚ฌ์šฉ ๊ถŒํ•œ์„ ๊ฒฐ์ •ํ•œ๋‹ค. +AWS์—์„œ๋Š” ์ตœ์†Œํ•œ์˜ ์›์น™์„ ์ ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ์œ ์ €๊ฐ€ ํ•„์š”ํ•œ๊ฒƒ ๋ณด๋‹ค ๋” ๋งŽ์€ ๊ถŒํ•œ์„ ์ฃผ์ง€ ์•Š๋Š”๋‹ค. + +#### Tags + +Tags๋Š” AWS ์–ด๋””์—์„œ๋‚˜ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์„ ํƒ ์‚ฌํ•ญ์ด๋‹ค. ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋ฅผ ์—ฌ๋Ÿฌ ๋ฆฌ์†Œ์Šค์— ๋‚จ๊ธธ ์ˆ˜ ์žˆ๋‹ค๋Š” ์žฅ์ ์ด ์žˆ๋‹ค. + +#### AWS Account + +AWS Account ์—๋Š” ์‚ฌ์šฉ์ž ๊ณ„์ •์ด ๋“ค์–ด ์žˆ๊ณ , ๋กœ๊ทธ์ธ url๊ฐ€ ์žˆ๋‹ค. +ํ•ด๋‹น url๋Š” alias(๋ณ„์นญ)์„ ์ƒ์„ฑํ•ด์„œ ๊ฐ„๋‹จํ•˜๊ฒŒ ์ ‘๊ทผ ๊ฐ€๋Šฅํ•˜๋‹ค. (๋‹จ, unique ํ•ด์•ผ ํ•œ๋‹ค.) + +#### IAM ์œ ์ € ๋กœ๊ทธ์ธ + +ํ•ด๋‹น ๋กœ๊ทธ์ธ url๋ฅผ ํ†ตํ•ด์„œ ๊ด€๋ จ ๊ณ„์ •์œผ๋กœ ๋“ค์–ด๊ฐˆ ์ˆ˜ ์žˆ๊ณ , IAM ์œ ์ € ๋กœ๊ทธ์ธ ์ƒ์— alias๋ฅผ ํ†ตํ•ด์„œ ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•ด์ง„๋‹ค. +ํ•ญ์ƒ ์ฝ˜์†” ๋กœ๊ทธ์ธ์—์„œ ๋ฃจํŠธ๊ณ„์ •๊ณผ IAM๊ณ„์ •์˜ ์ ‘๊ทผ์ด ์ดํ•ด๊ฐ€ ์•ˆ๊ฐ”์—ˆ๋Š”๋ฐ, ์ด ๋ถ€๋ถ„์„ ํ™•์‹คํ•˜๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์—ˆ๋˜๊ฒƒ ๊ฐ™๋‹ค. + +### IAM Policies + +๊ทธ๋ฃน์— IAM Policies๋ฅผ ์ ์šฉํ•˜๊ฒŒ ๋˜๋ฉด ๊ทธ ๊ทธ๋ฃน ์•ˆ์— ์žˆ๋Š” ๋ชจ๋“  ์œ ์ €์—๊ฒŒ ์ ‘๊ทผ๋˜๊ณ  ์ƒ์†๋˜๊ฒŒ ๋œ๋‹ค. + +inline policy ๋ผ๋Š” ๋ฐฉ์‹์œผ๋กœ ํ•œ ์œ ์ €์—๊ฒŒ๋งŒ ์ง์ ‘์ ์œผ๋กœ ์ƒ์„ฑ ๊ฐ€๋Šฅํ•˜๋‹ค. + +### IAM Structure + + - Version : ์ •์ฑ… ์–ธ์–ด ๋ฒ„์ „, ์ผ๋ฐ˜์ ์œผ๋กœ ๋‚ ์งœ๋กœ ๋˜์–ด ์žˆ๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ๋‹ค. + - ID : ์ •์ฑ…์„ ํ™•์ธํ•˜๋Š” ๋ฐฉ๋ฒ•์ธ๋ฐ ์„ ํƒ์‚ฌํ•ญ์ด๋‹ค. + - Statement : ํ•˜๋‚˜ ์ด์ƒ์˜ ๊ตฌ๋ฌธ์„ ์ž‘์„ฑํ•ด์•ผ ํ•œ๋‹ค. + - Sid : ๊ตฌ๋ฌธ์˜ ์‹๋ณ„์ž๋กœ ์„ ํƒ์‚ฌํ•ญ์ด๋‹ค. + - Effect : ํ•ด๋‹น ๊ตฌ๋ฌธ์„ ํ—ˆ์šฉํ• ์ง€ ๊ฑฐ๋ถ€ํ• ์ง€์— ๋Œ€ํ•œ ๋‚ด์šฉ์ด๋‹ค. (Allow/Deny) + - Principal : ์–ด๋–ค ๊ณ„์ •, ์‚ฌ์šฉ์ž, ํ˜น์€ ์—ญํ• ์ด ์ด ์ •์ฑ…์— ์ ์šฉ๋ ์ง€๋ฅผ ๊ฒฐ์ •ํ•œ๋‹ค. + - Action : API ํ˜ธ์ถœ ๋ชฉ๋ก์ด๋‹ค. + - Resource : ์ž‘์—…์„ ์ ์šฉํ•  ๋ฆฌ์†Œ์Šค ๋ชฉ๋ก์ด๋‹ค. + - Condition : ์ด ์ •์ฑ…์„ ์ ์šฉํ•˜๊ธฐ ์œ„ํ•œ ์กฐ๊ฑด, ์„ ํƒ ์‚ฌํ•ญ์ด๋‹ค. +~~~ +{ + "Version": "2012-10-17", + "ID": "S3-Account-Permissions", + "Statement": [ + { + "Sid": "1", + "Effect": "Allow", + "Principal": { + "AWS": ["arn:aws:iam::123456789012:root"] + }, + "Action": [ + "s3:GetObject", + "s3:PutObject" + ], + "Resource": ["arn:aws:s3:::mybucket/*"] + }, + { + "Effect": "Allow", + "Action": "ec2:Describe*", + "Resource": "*" + }, + { + "Effect": "Allow", + "Action": "elasticloadbalancing:Describe*", + "Resource": "*" + }, + { + "Effect": "Allow", + "Action": [ + "cloudwatch:ListMetrics", + "cloudwatch:GetMetricStatistics", + "cloudwatch:Describe*" + ], + "Resource": "*" + } + ] +} +~~~ + +### IAM - Password Policy + +AWS์—๋Š” ํŒจ์Šค์›Œ๋“œ ์ •์ฑ…์ด ๋‹ค์–‘ํ•˜๋‹ค. + - ์ตœ์†Œํ•œ์˜ ๊ธธ์ด ์„ค์ • + - ํŠน๋ณ„ํ•œ ๋ฌธ์ž ์š”๊ตฌ + - ์Šค์Šค๋กœ ํŒจ์Šค์›Œ๋“œ ๋ณ€๊ฒฝ ํ—ˆ์šฉ + - password expiration ์„ค์ •ํ•˜์—ฌ 90์ผ ํ›„์— ๋ณ€๊ฒฝ์„ ์š”๊ตฌ + - ์žฌ์‚ฌ์šฉ ๋ฐฉ์ง€ + +### MFA + +MFA - Multi Factor Authentication +Root ๊ณ„์ •๊ณผ IAM ์œ ์ €๋ฅผ ๋ณดํ˜ธํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•œ๋‹ค. + +MFA = password you know + security device you own + +MFA devices options in AWS + - Virtual MFA device + - Google Authenticator + - Authy + - Universal 2nd Factor (U2F) Security Key + - 3rd party + - Hardware Key Fob MFA Device + - Hardware Key Fob MFA Device for AWS GovCloud (US) diff --git a/src/content/blog/study/cs/2022-12-13-byteOrdering.md b/src/content/blog/study/cs/2022-12-13-byteOrdering.md new file mode 100644 index 0000000..0928179 --- /dev/null +++ b/src/content/blog/study/cs/2022-12-13-byteOrdering.md @@ -0,0 +1,76 @@ +--- +title: ๋ฐ”์ดํŠธ์˜ค๋”๋ง ์ •๋ฆฌ +date: 2022-12-13 +tags: cs, ๊ณต๋ถ€ +excerpt: ๋ฐ”์ดํŠธ์˜ค๋”๋ง(Byte Ordering) +--- +## ๋ฐ”์ดํŠธ ์˜ค๋”๋ง ์ด๋ž€? + +๋ฐ”์ดํŠธ ์˜ค๋”๋ง(Byte Ordering)์€ ๋ฐ์ดํ„ฐ๊ฐ€ ๋ฐ”์ดํŠธ(Byte) ๋‹จ์œ„๋กœ ๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅ๋˜๋Š” ์ˆœ์„œ๋ฅผ ๋งํ•œ๋‹ค.
+ +ํฌ๊ฒŒ **Big-Endian** ๋ฐฉ์‹๊ณผ **Little-Endian** ๋ฐฉ์‹์ด ์กด์žฌํ•˜๋ฉฐ ๊ฐ CPU ๋ฒค๋”์— ์˜์กด์ ์ธ ํŠน์ง•์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.
+ +2 ๋ฐ”์ดํŠธ ์ด์ƒ์˜ ํฌ๊ธฐ๋ฅผ ๊ฐ€์ง„ ์ž๋ฃŒํ˜•์„ ์ €์žฅํ•  ๋•Œ๋ถ€ํ„ฐ ์ฐจ์ด๊ฐ€ ๋‚œ๋‹ค.
+ +``` +BYTE b = 0x12; + +WORD w = 0x1234; + +DWORD dw = 0x12345678; + +char str[] = "abcde"; + +``` + +| Type | Name | Size | Big-Endian | Little-Endian | +| --- | --- | --- | ----- | ----- | +| BYTE | b | 1 | [12] | [12] | +| WORD | w | 2 | [12][34] | [34][12] | +| DWORD | dw | 4 | [12][34][56][78] | [78][56][34][12] | +| char[] | str | 6 | [61][62][63][64][65][00] | [61][62][63][64][65][00] | + +## Big-Endian ๋ฐฉ์‹ + +> ์ƒ์œ„ ๋ฐ”์ดํŠธ์˜ ๊ฐ’์ด ๋ฉ”๋ชจ๋ฆฌ์— ๋จผ์ € ํ‘œ์‹œ๋˜๋Š” ๋ฐฉ๋ฒ• (๋ฒˆ์ง€์ˆ˜๊ฐ€ ์ž‘์€ ์œ„์น˜) + +์‚ฌ์šฉ๋˜๋Š” ๊ณ„์—ด : ๋Œ€ํ˜• UNIX ์„œ๋ฒ„์— ์‚ฌ์šฉ๋˜๋Š” RISC ๊ณ„์—ด์˜ CPU + +![Bit-Endian](https://1.bp.blogspot.com/-ytOXeypzCPQ/X2C2qWsL-AI/AAAAAAAADhQ/Nx4996U3jCIYZUA9UcNLaKA9iuLL0LjKACLcBGAsYHQ/s16000/Big-Endian%2B%25EB%25B0%25A9%25EC%258B%259D.png) + +๋„คํŠธ์›Œํฌ ๋ฐ์ดํ„ฐ ํ†ต์‹ ์—์„œ๋Š” ๋„คํŠธ์›Œํฌ ๋ฐ”์ดํŠธ ์ˆœ์„œ(Network Byte Order, ์ฆ‰ Big-Endian)๋ฅผ ๋”ฐ๋ฅด๋„๋ก ๋ฐ์ดํ„ฐ์˜ ๋ฐ”์ดํŠธ ์ˆœ์„œ๋ฅผ ๋ณ€๊ฒฝํ•ด์•ผ ํ•œ๋‹ค.
+(TCP/IP, XNS, SNA ๊ทœ์•ฝ์€ 16๋น„ํŠธ์™€ 32๋น„ํŠธ ์ •์ˆ˜์—์„œ Big-Endian ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•จ)
+ +๋”ฐ๋ผ์„œ ์‹œ์Šคํ…œ์ด Little-Endian ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ ๋„คํŠธ์›Œํฌ๋ฅผ ํ†ตํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ์ „์†กํ•˜๊ธฐ ์ „์— Big-Endian ๋ฐฉ์‹์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณ€๊ฒฝํ•ด์„œ ๋ณด๋‚ด์•ผ๋งŒ ํ•˜๊ณ  ๋ฐ›์„ ๋•Œ๋Š” Little-Endian ์‹œ์Šคํ…œ์€ ์ „์†ก๋˜์–ด ์˜ค๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์—ญ์ˆœ์œผ๋กœ ์กฐํ•ฉํ•ด์•ผ ํ•จ. + +## Little-Endian ๋ฐฉ์‹ + +> ํ•˜์œ„ ๋ฐ”์ดํŠธ์˜ ๊ฐ’์ด ๋ฉ”๋ชจ๋ฆฌ์ƒ์— ๋จผ์ € ํ‘œ์‹œ๋˜๋Š” ๋ฐฉ๋ฒ• (๋ฒˆ์ง€์ˆ˜๊ฐ€ ์ž‘์€ ์œ„์น˜) + +์‚ฌ์šฉ๋˜๋Š” ๊ณ„์—ด : Intel ๊ณ„์—ด์˜ CPU + +![Little-Endian](https://1.bp.blogspot.com/-fPp44c-lT9I/X2C2yA917RI/AAAAAAAADhU/zWrWf6SDTM0fG791PzYT9iBlNkiEPEB-ACLcBGAsYHQ/s0/Little-Endian%2B%25EB%25B0%25A9%25EC%258B%259D.png) + +## ๋‘ Endian ๋ฐฉ์‹์˜ ์žฅ๋‹จ์  + +Big-Endian ๋ฐฉ์‹์€ ์†Œํ”„ํŠธ์›จ์–ด์˜ ๋””๋ฒ„๊ทธ๋ฅผ ํŽธํ•˜๊ฒŒ ํ•ด ์ฃผ๋Š” ๊ฒฝํ–ฅ์ด ์žˆ๋‹ค.
+์‚ฌ๋žŒ์ด ์ˆซ์ž๋ฅผ ์ฝ๊ณ  ์“ฐ๋Š” ๋ฐฉ๋ฒ•๊ณผ ๊ฐ™๊ธฐ ๋•Œ๋ฌธ์— ๋””๋ฒ„๊น… ๊ณผ์ •์—์„œ ๋ฉ”๋ชจ๋ฆฌ์˜ ๊ฐ’์„ ๋ณด๊ธฐ ํŽธํ•˜๋‹ค.
+ +์˜ˆ๋ฅผ ๋“ค์–ด 0x59654148 ์€ ๋น… ์—”๋””์–ธ์œผ๋กœ 59 65 41 48 ๋กœ ํ‘œํ˜„ํ•œ๋‹ค.
+ +๋ฐ˜๋Œ€๋กœ Little-Endian ๋ฐฉ์‹ ์€ ๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅ๋œ ๊ฐ’์˜ ํ•˜์œ„ ๋ฐ”์ดํŠธ๋“ค๋งŒ ์‚ฌ์šฉํ•  ๋•Œ ๋ณ„๋„์˜ ๊ณ„์‚ฐ์ด ํ•„์š” ์—†๋‹ค๋Š” ์žฅ์ ์ด ์žˆ๋‹ค.
+ +์˜ˆ๋ฅผ ๋“ค์–ด 32๋น„ํŠธ ์ˆซ์ž์ธ 0x2A ๋Š” Little-Endian ๋ฐฉ์‹์œผ๋กœ ํ‘œํ˜„ํ•˜๋ฉด 2A 00 00 00 ์ด ๋˜๋Š”๋ฐ ์ด ํ‘œํ˜„์—์„œ ์•ž์˜ ๋‘ ๋ฐ”์ดํŠธ ๋˜๋Š” ํ•œ ๋ฐ”์ดํŠธ๋งŒ ๋–ผ์–ด ๋‚ด๋ฉด ํ•˜์œ„ 16 ๋น„ํŠธ ๋˜๋Š” 8 ๋น„ํŠธ๋ฅผ ๋ฐ”๋กœ ์–ป์„ ์ˆ˜ ์žˆ๋‹ค.
+ +๋ฐ˜๋ฉด 32bit Big-Endian ๋ฐฉ์‹ ํ™˜๊ฒฝ์—์„œ๋Š” ํ•˜์œ„ 16 ๋น„ํŠธ๋‚˜ 8 ๋น„ํŠธ ๊ฐ’์„ ์–ป๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋ณ€์ˆ˜ ์ฃผ์†Œ์— 2๋ฐ”์ดํŠธ ๋˜๋Š” 3๋ฐ”์ดํŠธ๋ฅผ ๋”ํ•ด์•ผ ํ•œ๋‹ค.
+ +๋ณดํ†ต ๋ณ€์ˆ˜์˜ ์ฒซ ๋ฐ”์ดํŠธ๋ฅผ ๊ทธ ๋ณ€์ˆ˜์˜ ์ฃผ์†Œ๋กœ ์‚ผ๊ธฐ ๋•Œ๋ฌธ์— ์ด๋Ÿฐ ์„ฑ์งˆ์€ ์ข…์ข… ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ํŽธํ•˜๊ฒŒ ํ•˜๋Š” ๋ฐ˜๋ฉด Little-Endian ๋ฐฉ์‹ ํ™˜๊ฒฝ์˜ ํ”„๋กœ๊ทธ๋ž˜๋จธ๊ฐ€ Big-Endian ๋ฐฉ์‹ ํ™˜๊ฒฝ์—์„œ ์ข…์ข… ์‹ค์ˆ˜๋ฅผ ์ผ์œผํ‚ค๋Š” ํ•œ ์ด์œ ์ด๊ธฐ๋„ ํ•˜๋‹ค.
+ +๋˜ํ•œ, ๊ฐ€์‚ฐ๊ธฐ๊ฐ€ ๋ง์…ˆ์„ ํ•˜๋Š” ๊ณผ์ •์€ LSB ๋กœ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜์—ฌ ์ž๋ฆฌ ์˜ฌ๋ฆผ์„ ๊ณ„์‚ฐํ•ด์•ผ ํ•˜๋ฏ€๋กœ ์ฒซ ๋ฒˆ์งธ ๋ฐ”์ดํŠธ๊ฐ€ LSB ์ธ Little-Endian ๋ฐฉ์‹์—์„œ๋Š” ๊ฐ€์‚ฐ๊ธฐ ์„ค๊ณ„๊ฐ€ ์กฐ๊ธˆ ๋” ๋‹จ์ˆœํ•ด์ง„๋‹ค.
+ +Big-Endian ๋ฐฉ์‹์—์„œ๋Š” ๊ฐ€์‚ฐ๊ธฐ๊ฐ€ ๋ง์…ˆ์„ ํ• ๋•Œ ๋งˆ์ง€๋ง‰ ๋ฐ”์ดํŠธ๋กœ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜์—ฌ ์ฒซ ๋ฒˆ์งธ ๋ฐ”์ดํŠธ๊นŒ์ง€ ์—ญ๋ฐฉํ–ฅ์œผ๋กœ ์ง„ํ–‰ํ•ด์•ผ ํ•œ๋‹ค.
+ +๊ทธ๋Ÿฌ๋‚˜ ์˜ค๋Š˜๋‚ ์˜ ํ”„๋กœ์„ธ์„œ๋Š” ์—ฌ๋Ÿฌ๊ฐœ์˜ ๋ฐ”์ดํŠธ๋ฅผ ๋™์‹œ์— ์ฝ์–ด๋“ค์—ฌ ๋™์‹œ์— ๋ง์…ˆ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ตฌ์กฐ๋ฅผ ๊ฐ–๊ณ  ์žˆ์–ด ๋‘ Endian ๋ฐฉ์‹ ์‚ฌ์ด์— ์‚ฌ์‹ค์ƒ ์ฐจ์ด๊ฐ€ ์—†๋‹ค.
+ +[์ฐธ๊ณ  ์‚ฌ์ดํŠธ] : +https://ko.wikipedia.org/wiki/%EC%97%94%EB%94%94%EC%96%B8 diff --git a/src/content/blog/study/cs/2022-12-13-multiProcess.md b/src/content/blog/study/cs/2022-12-13-multiProcess.md new file mode 100644 index 0000000..a6deb54 --- /dev/null +++ b/src/content/blog/study/cs/2022-12-13-multiProcess.md @@ -0,0 +1,289 @@ +--- +title: Multi Process & Thread ์ •๋ฆฌ +date: 2022-12-13 +tags: cs, ๊ณต๋ถ€ +excerpt: Multi Process & Thread +--- +# Multi Process & Thread +CS ์ง€์‹์—์„œ ์ œ์ผ ๋งŽ์ด ๋ฌผ์–ด๋ณด๋Š” ๋ถ€๋ถ„์ด Multi Process์™€ Thread๊ฐ€ ์•„๋‹๊นŒ ํ•œ๋‹ค. + +ํ•™๋ถ€์ƒ ์‹œ์ ˆ๋ถ€ํ„ฐ ์ •๋ฆฌํ–ˆ๋˜ ๋ถ€๋ถ„์ด์ง€๋งŒ ๋‹ค์‹œ ํ•œ ๋ฒˆ ๋” ์ •๋ฆฌํ•˜๊ณ  ์ •์˜ํ•˜๊ณ ์ž ํ•œ๋‹ค. + +## Process ๋ž€? +> Process๋ž€ ํ•˜๋‚˜ ํ˜น์€ ๊ทธ ์ด์ƒ์˜ Thread๋กœ ์‹คํ–‰๋˜๋Š” ์ปดํ“จํ„ฐ ํ”„๋กœ๊ทธ๋žจ์˜ instance์ด๋‹ค.
+> Process๋Š” Program Code์™€ Activity๋ฅผ ํฌํ•จํ•œ๋‹ค.
+> - Wikipedia + +> ํ”„๋กœ์„ธ์Šค๋Š” ๊ฐ€์ƒ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„, ์ฝ”๋“œ, ๋ฐ์ดํ„ฐ, ์‹œ์Šคํ…œ ์ž์›์˜ ์ง‘ํ•ฉ์ด๋‹ค.
+> - Microsoft + +ํ”„๋กœ์„ธ์Šค๋Š” ์šด์˜์ฒด์ œ๊ฐ€ ํ”„๋กœ๊ทธ๋žจ์„ ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•ด ํ•„์š”ํ•œ ๊ฐ€์žฅ ์ž‘์€ ๋‹จ์œ„์˜ ์“ฐ๋ ˆ๋“œ, ๋ฉ”๋ชจ๋ฆฌ, ์†Œ์Šค์ฝ”๋“œ๋“ค์˜ ์ง‘ํ•ฉ์ด๋ฉฐ ํ”„๋กœ๊ทธ๋žจ ๋™์ž‘ ๊ทธ ์ž์ฒด๋ฅผ ์˜๋ฏธํ•œ๋‹ค.
+์šด์˜์ฒด์ œ๋Š” ํ”„๋กœ์„ธ์Šค๋ฅผ ์ž‘์—…์˜ ๋‹จ์œ„๋กœ ๋ณด๊ณ  ์ž์›๋“ค์„ ํ”„๋กœ์„ธ์Šค๋“ค์— ์ ์ ˆํ•˜๊ฒŒ ๋ฐฐ๋ถ„ํ•œ๋‹ค.
+ +์‰ฝ๊ฒŒ ๋งํ•˜์ž๋ฉด ํ”„๋กœ์„ธ์Šค๋ž€ ์‹คํ–‰์ค‘์ธ ํ”„๋กœ๊ทธ๋žจ์ด๋ผ๊ณ  ๋ณผ ์ˆ˜๋„ ์žˆ๋‹ค. + +### Process์˜ ์ƒํƒœ (States) +![ProcessStates](https://iingang.github.io/assets/img/posts/process_state.png) +[์ถœ์ฒ˜](https://iingang.github.io/posts/OS-process/) + +์œ„ ๊ทธ๋ฆผ์„ ํ”„๋กœ์„ธ์Šค์˜ 5 ๊ฐ€์ง€ ์ƒํƒœ(Five States)๋ผ๊ณ  ํ•œ๋‹ค.
+9 ๊ฐ€์ง€ ์ƒํƒœ๋กœ ์ƒ์„ธํžˆ ํ‘œํ˜„ํ•˜๋Š” ๋ฐฉ์‹๋„ ์žˆ์ง€๋งŒ ์ด ๊ธ€์—์„œ๋Š” 5 ๊ฐ€์ง€ ์ƒํƒœ๋ฅผ ๋‹ค๋ฃฐ ๊ฒƒ์ด๋‹ค.
+ + - New : ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ƒ์„ฑ ๋˜์—ˆ์ง€๋งŒ, ์šด์˜์ฒด์ œ์— ์˜ํ•ด ์ˆ˜ํ–‰ ๊ฐ€๋Šฅํ•œ ํ”„๋กœ์„ธ์Šค ํ’€๋กœ์˜ ์ง„์ž…์ด ํ—ˆ์šฉ๋˜์ง€ ์•Š์€ ์ƒํƒœ + - Ready : ์ž์›์ด ํ• ๋‹น๋˜๋ฉด ์ˆ˜ํ–‰ํ•  ์ค€๋น„๊ฐ€ ๋˜์–ด ์žˆ๋Š” ์ƒํƒœ + - Running : ํ˜„์žฌ ์ˆ˜ํ–‰ ์ค‘์ธ ํ”„๋กœ์„ธ์Šค + - Blocked : ์ž…์ถœ๋ ฅ ์—ฐ์‚ฐ(I/O)์™€ ๊ฐ™์€ ์ž‘์—… ์ค‘ ์™„๋ฃŒ๊ฐ€ ๋  ๋•Œ๊นŒ์ง€ ์ˆ˜ํ–‰๋  ์ˆ˜ ์—†๋Š” ํ”„๋กœ์„ธ์Šค + - Exit(Terminated) : ํ”„๋กœ์„ธ์Šค ์ˆ˜ํ–‰์ด ์ค‘์ง€๋˜๊ฑฐ๋‚˜, ์–ด๋–ค ์ด์œ ๋กœ ์ค‘๋‹จ๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ํ”„๋กœ์„ธ์Šค ํ’€์—์„œ ๋ฐฉ์ถœ๋œ ํ”„๋กœ์„ธ์Šค, ์ข…๋ฃŒ๋œ ์ƒํƒœ + +#### Process ์ƒํƒœ ๋ณ€ํ™” ์š”์ธ +##### New -> Ready(Admitted) +New ์ƒํƒœ์—์„œ OS์˜ ์Šน์ธ์„ ๋ฐ›์•„์„œ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ƒ์„ฑ์ด ๋˜๋ฉด, ํ•ด๋‹น ํ”„๋กœ์„ธ์Šค์˜ PCB๊ฐ€ OS์ปค๋„—์˜ Ready Queue์— ์˜ฌ๋ผ์˜จ๋‹ค.
+##### Ready -> Running(Scheduler dispatch) +Ready Queue์— ์žˆ๋Š” ํ”„๋กœ์„ธ์Šค๋“ค ์ค‘์—์„œ ์Šค์ผ€์ค„๋ง ์•Œ๊ณ ๋ฆฌ์ฆ˜์— ์˜ํ•ด์„œ ์„ ํƒ๋œ ํ”„๋กœ์„ธ์Šค๊ฐ€ CPU๋ฅผ ํ• ๋‹น ๋ฐ›๋Š”๋‹ค.
+##### Running -> Blocked(Wait) +ํ˜„์žฌ CPU์˜ ๋ช…๋ น์„ ๋ฐ›์•„์„œ ๋ช…๋ น์–ด๋ฅผ ์ˆ˜ํ–‰์ค‘์ธ ํ”„๋กœ์„ธ์Šค๊ฐ€ I/O์™€ ๊ฐ™์€ ํŠน์ • ์ž‘์—…์„ ํ•ด์•ผํ•˜๋Š” ๊ฒฝ์šฐ CPU๋ฅผ ๋ฐ˜๋‚ฉํ•˜๊ณ  ํ•ด๋‹น ์žฅ์น˜ ํ์— ๋“ค์–ด๊ฐ€๊ฒŒ ๋œ๋‹ค.
+##### Blocked -> Ready(I/O Completion or interrupt) +์ž‘์—…์„ ์œ„ํ•ด ์žฅ์น˜ ํ์— ์žˆ๋˜ ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋””์Šคํฌ ์ปจํŠธ๋กค๋Ÿฌ์— ์˜ํ•ด ์„œ๋น„์Šค๋ฅผ ๋ฐ›์•„ ์ผ์„ ํ•˜๊ณ ,
+๋””์Šคํฌ ์ปจํŠธ๋กค๋Ÿฌ๊ฐ€ ์ธํ„ฐ๋ŸฝํŠธ๋ฅผ ๋ฐœ์ƒํ•˜์—ฌ ํ”„๋กœ์„ธ์Šค๊ฐ€ ํ•œ ์ผ์„(๋กœ์ปฌ ๋ฒ„ํผ์— ์ €์žฅ๋œ ๋ฐ์ดํ„ฐ) ๋ฉ”๋ชจ๋ฆฌ์— ์˜ฌ๋ ค๋†“๊ณ  ํ”„๋กœ์„ธ์Šค๋Š” ๋‹ค์‹œ Ready Queue์— ๋“ค์–ด๊ฐ€๊ฒŒ ๋œ๋‹ค.
+##### Running -> Exit +ํ”„๋กœ์„ธ์Šค ์‹คํ–‰์ด ์™„๋ฃŒ๋˜์–ด ์ž์›์„ ๋ฐ˜๋‚ฉํ•œ ์ƒํƒœ
+ +### Process ๋ฉ”๋ชจ๋ฆฌ +์šด์˜์ฒด์ œ๋Š” ํ”„๋กœ์„ธ์Šค ๋งˆ๋‹ค ๊ณ ์œ ์˜ ๊ฐ€์ƒ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์„ ์ œ๊ณตํ•œ๋‹ค. ์ด๋Ÿฌํ•œ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์€ Data, Text, Stack/Heap Section์œผ๋กœ ๋‚˜๋‰œ๋‹ค.
+ +![ProcessMemory](https://images.velog.io/images/curiosity806/post/200822c8-b98a-4c78-affa-999ae1d34e26/image.png) +[์ถœ์ฒ˜](https://velog.io/@curiosity806/%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4%EB%9E%80) + + - Stack : + - ๋งค๊ฐœ๋ณ€์ˆ˜, ์ง€์—ญ๋ณ€์ˆ˜, return ์ฃผ์†Œ ๋“ฑ๊ณผ ๊ฐ™์€ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๋Š” ์˜์—ญ์ด๋‹ค. + - ์ปดํŒŒ์ผ๋Ÿฌ์— ์˜ํ•ด Run Time ๋„์ค‘ ํฌ๊ธฐ๊ฐ€ ๊ฒฐ์ •๋˜๋ฉฐ, ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ&์ข…๋ฃŒ ๋˜๋Š” ์‹œ์ ์—์„œ ์ƒ์„ฑ&์ œ๊ฑฐ ๋œ๋‹ค. + - Heap : + - new, delete, malloc, free ๋“ฑ์„ ํ˜ธ์ถœํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅ, ๊ด€๋ฆฌํ•˜๋Š” ์˜์—ญ + - Run Time์— ํฌ๊ธฐ๊ฐ€ ๊ฒฐ์ • + - Data Section : + - ์‚ฌ์ „์— ์„ ์–ธ๋œ ๋ฐ์ดํ„ฐ๊ฐ€ ์ €์žฅ๋˜๋Š” ์˜์—ญ์ด๋‹ค. (global, staic, variables, etc) + - Compile Time์— ํฌ๊ธฐ๊ฐ€ ๊ฒฐ์ •๋œ๋‹ค. + - ๋‚ด๋ถ€์—์„œ DATA & BBS ์˜์—ญ์œผ๋กœ ๊ตฌ๋ถ„๋œ๋‹ค. + - DATA : ์ดˆ๊ธฐํ™”๋œ ์ „์—ญ๋ณ€์ˆ˜๊ฐ€ ์ €์žฅ๋˜๋Š” ์˜์—ญ์ด๋‹ค. (Initialized data section) + - BBS : ์ดˆ๊ธฐํ™”๋˜์ง€ ์•Š์€ ์ „์—ญ๋ณ€์ˆ˜๊ฐ€ ์ €์žฅ๋˜๋Š” ์˜์—ญ์ด๋‹ค. (Uninitialized data section) + - Instruction(Text Section) : + - ์ปดํŒŒ์ผ๋œ ๊ธฐ๊ณ„์–ด๊ฐ€ ์ €์žฅ๋˜๋Š” ์˜์—ญ์ด๋‹ค. + - Compile Time์— ํฌ๊ธฐ๊ฐ€ ๊ฒฐ์ •๋œ๋‹ค. + +### PCB(Process Controll Block) +Process ๋งˆ๋‹ค ํ˜„์žฌ ์ƒํƒœ๋ฅผ ํ•˜๋‚˜์˜ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ์— ์ €์žฅํ•˜์—ฌ ๊ด€๋ฆฌํ•˜๋Š”๋ฐ, ์ด๋ฅผ Process Controll Block์ด๋ผ๊ณ  ํ•œ๋‹ค.
+PCB๋Š” ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค๋“ค์ด ์‰ฝ๊ฒŒ ์ ‘๊ทผํ•  ์ˆ˜ ์—†๊ณ , Kernel ์˜์—ญ์— ์ €์žฅ๋œ๋‹ค.
+ +์šด์˜์ฒด์ œ๊ฐ€ ํ”„๋กœ์„ธ์Šค๋ฅผ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ํ•„์š”ํ•œ ์ •๋ณด๋ฅผ ๋‹ด๊ณ  ์žˆ๋Š” ์ž๋ฃŒ๊ตฌ์กฐ์ด๋ฉฐ,
+์ฃผ์š” ์—ญํ• ์€ ์ˆ˜ํ–‰ ํ”„๋กœ์„ธ์Šค๋ฅผ ์ธํ„ฐ๋ŸฝํŠธํ•œ ํ›„ ๋‚˜์ค‘์— ๊ทธ ์ธํ„ฐ๋ŸฝํŠธ๊ฐ€ ๋ฐœ์ƒ๋˜์ง€ ์•Š์€ ๊ฒƒ์ฒ˜๋Ÿผ ํ”„๋กœ์„ธ์Šค ์ˆ˜ํ–‰์„ ์žฌ๊ฐœํ•˜๋„๋ก ์ถฉ๋ถ„ํ•œ ์ •๋ณด๋ฅผ ์œ ์ง€ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.
+ +PCB๋Š” ํ”„๋กœ์„ธ์Šค ์‹๋ณ„์ž, ํ”„๋กœ์„ธ์„œ(CPU) ์ƒํƒœ ์ •๋ณด, ํ”„๋กœ์„ธ์Šค ์ œ์–ด ์ •๋ณด๋ฅผ ๋‹ด๊ณ  ์žˆ๋‹ค.
+![PCB](https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FtIPDr%2FbtqUnKRlmuB%2FDJIs4kFAwQE5ySaiJz25Kk%2Fimg.png) + +![PCB](https://velog.velcdn.com/images/curiosity806/post/06d141f2-ff5a-4855-a064-b90f218bc0e2/image.png) + +[์ถœ์ฒ˜](https://yoongrammer.tistory.com/52) + + - ํฌ์ธํ„ฐ : ํ”„๋กœ์„ธ์Šค์˜ ํ˜„์žฌ ์œ„์น˜๋ฅผ ์ €์žฅํ•˜๋Š” ํฌ์ธํ„ฐ ์ •๋ณด + - ํ”„๋กœ์„ธ์Šค ์ƒํƒœ : ํ”„๋กœ์„ธ์Šค์˜ ๊ฐ ์ƒํƒœ๋ฅผ ์ €์žฅ + - ํ”„๋กœ์„ธ์Šค ๋ฒˆํ˜ธ : ๋ชจ๋“  ํ”„๋กœ์„ธ์Šค์—๋Š” ํ”„๋กœ์„ธ์Šค ์‹๋ณ„์ž๋ฅผ ์ €์žฅํ•˜๋Š” ํ”„๋กœ์„ธ์Šค ID ๋˜๋Š” PID๋ผ๋Š” ๊ณ ์œ ํ•œ ID๊ฐ€ ํ• ๋‹น + - ํ”„๋กœ๊ทธ๋žจ ์นด์šดํ„ฐ : ํ”„๋กœ์„ธ์Šค๋ฅผ ์œ„ํ•ด ์‹คํ–‰๋  ๋‹ค์Œ ๋ช…๋ น์–ด์˜ ์ฃผ์†Œ๋ฅผ ํฌํ•จํ•˜๋Š” ์นด์šดํ„ฐ๋ฅผ ์ €์žฅ + - ๋ ˆ์ง€์Šคํ„ฐ : ๋ˆ„์‚ฐ๊ธฐ, ๋ฒ ์ด์Šค, ๋ ˆ์ง€์Šคํ„ฐ ๋ฐ ๋ฒ”์šฉ๋ ˆ์ง€์Šคํ„ฐ๋ฅผ ํฌํ•จํ•˜๋Š” CPU ๋ ˆ์ง€์Šคํ„ฐ์— ์žˆ๋Š” ์ •๋ณด + - ๋ฉ”๋ชจ๋ฆฌ ์ œํ•œ : ์šด์˜์ฒด์ œ์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ ์‹œ์Šคํ…œ์— ๋Œ€ํ•œ ์ •๋ณด + - ํŽ˜์ด์ง€ ํ…Œ์ด๋ธ” : ํŽ˜์ด์ง• ํ”„๋กœ์„ธ์Šค์˜ ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ๋ฅผ ๊ด€๋ฆฌํ•  ๋•Œ ํ”„๋กœ์„ธ์Šค์˜ ํŽ˜์ด์ง€ ์ •๋ณด๋ฅผ ์ €์žฅํ•˜๊ณ  ์žˆ๋Š” ํ…Œ์ด๋ธ” + - ์„ธ๊ทธ๋จผํŠธ ํ…Œ์ด๋ธ” : ํ”„๋กœ์„ธ์Šค๋ฅผ ๋…ผ๋ฆฌ์ ์œผ๋กœ ์ž˜๋ผ ๋ฉ”๋ชจ๋ฆฌ์— ๋ฐฐ์น˜ํ•˜๋Š” ๋ฐฉ์‹์„ ์„ธ๊ทธ๋ฉ˜ํ…Œ์ด์…˜์ด๋ผ๊ณ  ํ•œ๋‹ค. ์„ธ๊ทธ๋จผํŠธ ํ…Œ์ด๋ธ”์€ ์ด ์„ธ๊ทธ๋จผํŠธ๋“ค์˜ ์‹ค์ œ ๋ฌผ๋ฆฌ์  ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ์˜ ์ •๋ณด๋ฅผ ๋‹ด๊ณ  ์žˆ๋‹ค. + - ์—ด๋ฆฐ ํŒŒ์ผ ๋ชฉ๋ก : ํ”„๋กœ์„ธ์Šค๋ฅผ ์œ„ํ•ด ์—ด๋ฆฐ ํŒŒ์ผ ๋ชฉ๋ก + - Accountin ์ •๋ณด : Process๋ฅผ ์‹คํ–‰ํ•œ ์œ ์ € ์ •๋ณด + - I/O ์ƒํƒœ ์ •๋ณด : Process์— ํ• ๋‹น๋œ ๋ฌผ๋ฆฌ์  ์žฅ์น˜ ๋ฐ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ฝ๊ณ  ์žˆ๋Š” ํŒŒ์ผ์— ๊ด€ํ•œ ์ •๋ณด + +### Process ์ƒ์„ฑ +ํ”„๋กœ์„ธ์Šค ์ƒ์„ฑ์€ ๋ถ€๋ชจ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์—ฐ์‚ฐ์„ ํ†ตํ•ด ์ž์‹ ํ”„๋กœ์„ธ์Šค๋ฅผ ๋งŒ๋“ค์–ด๋‚ธ๋‹ค. ์ƒ์„ฑ๋œ ์ž์‹ ํ”„๋กœ์„ธ์Šค ๋˜ํ•œ ์ƒˆ๋กœ์šด ์ž์‹ ํ”„๋กœ์„ธ์Šค๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ด๋ฅผ ๊ตฌ๋ณ„ํ•˜๊ธฐ ์œ„ํ•ด ๋ชจ๋“  ํ”„๋กœ์„ธ์Šค๋Š” ๊ฐ์ž ๊ณ ์œ ์˜ PID๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.
+์ด๋ ‡๊ฒŒ ์ƒ์„ฑ๋œ ํ”„๋กœ์„ธ์Šค ๊ฐ„์˜ ๊ด€๊ณ„๋Š” ํ•˜๋‚˜์˜ ํฐ ํŠธ๋ฆฌ๊ตฌ์กฐ๊ฐ€ ๋œ๋‹ค.
+ +์ƒ์„ฑ๋œ ์ž์‹ ํ”„๋กœ์„ธ์Šค๋Š” ๊ฐ์ž ๊ณ ์œ ์˜ PID, ๋ฉ”๋ชจ๋ฆฌ, CPU ๋“ฑ ์ƒˆ PCB๊ฐ€ ํ• ๋‹น๋˜๋ฉฐ ๊ณ ์œ ์˜ ์ž์›์„ ํš๋“ํ•˜๊ฒŒ ๋œ๋‹ค.
+์ด๋กœ ์ธํ•˜์—ฌ ๋ถ€๋ชจ ํ”„๋กœ์„ธ์Šค์˜ ์ž์› ์ ‘๊ทผ์— ์ œํ•œ์ด ์ƒ๊ธฐ๋ฉฐ ํŠน์ˆ˜ํ•œ ๋ฐฉ๋ฒ•์„ ํ†ตํ•ด ๊ณต์œ ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค.
+ +ํ”„๋กœ์„ธ์Šค๋ฅผ ์ƒ์„ฑํ•œ ํ›„ ๋ถ€๋ชจ ํ”„๋กœ์„ธ์Šค๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด 2๊ฐ€์ง€ ํ–‰๋™์„ ํ•  ์ˆ˜ ์žˆ๋‹ค. + +> ์ž์‹ ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋๋‚  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฐ๋‹ค ( -> waiting queue )
+> ์ž์‹ ํ”„๋กœ์„ธ์Šค์™€ ํ•จ๊ป˜ ๋™์ž‘ (๋ฉ€ํ‹ฐ ํ”„๋กœ์„ธ์‹ฑ ํ™˜๊ฒฝ)
+ + +> ์ž์‹ ํ”„๋กœ์„ธ์Šค๋Š” ๋‹ค์Œ ์ค‘ ํ•˜๋‚˜์˜ ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋œ๋‹ค.
+> - ๋ถ€๋ชจ ํ”„๋กœ์„ธ์Šค์™€ ๋™์ผํ•œ ์ƒˆ๋กœ์šด ํ”„๋กœ์„ธ์Šค : ์ด ๊ฒฝ์šฐ ๋ถ€๋ชจ ํ”„๋กœ์„ธ์Šค์˜ ํ”„๋กœ๊ทธ๋žจ, ๋ฐ์ดํ„ฐ๊ฐ€ ์™„์ „ ๋ณต์‚ฌ +> - ์ƒˆ๋กœ์šด ํ”„๋กœ๊ทธ๋žจ ์‹คํ–‰ : ์ƒˆ๋กœ์šด ํ”„๋กœ๊ทธ๋žจ์„ ๋ฉ”๋ชจ๋ฆฌ์— load ํ•˜๊ณ  ์ด๋ฅผ ์‹คํ–‰ + +#### fork() +Linux/UNIX ํ™˜๊ฒฝ์—์„œ ์ƒˆ๋กœ์šด ํ”„๋กœ์„ธ์Šค๋ฅผ ๋งŒ๋“œ๋Š” ์‹œ์Šคํ…œ ์ฝœ ํ•จ์ˆ˜ + +์ƒ์„ฑ๋œ ์ž์‹ ํ”„๋กœ์„ธ์Šค๋Š” ๋ถ€๋ชจ ํ”„๋กœ์„ธ์Šค์˜ ๋ฐ์ดํ„ฐ์™€ ํ”„๋กœ๊ทธ๋žจ์ด ์™„์ „ ๋ณต์‚ฌ๊ฐ€ ๋˜์–ด ๋˜‘๊ฐ™์€ ํ”„๋กœ๊ทธ๋žจ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋œ๋‹ค.
+๋ฉ€ํ‹ฐ ํ”„๋กœ์„ธ์‹ฑ์„ ํ†ตํ•ด ๋ถ€๋ชจ, ์ž์‹ ํ”„๋กœ์„ธ์Šค๋Š” ํ•จ๊ป˜ ๋™์ž‘ํ•œ๋‹ค.
+fork() ํ•จ์ˆ˜๋Š” ๋ถ€๋ชจ ํ”„๋กœ์„ธ์Šค์—์„œ ์ž์‹์˜ PID๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ณ , ์ž์‹ ํ”„๋กœ์„ธ์Šค์—์„œ๋Š” 0์„ ๋ฐ˜ํ™˜ํ•˜์—ฌ ๊ตฌ๋ถ„ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์ค€๋‹ค.
+![fork](https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FezlnDL%2FbtqZP26N311%2FMSSflKfXCsHUtY8GNID4P0%2Fimg.png) + +#### exec() +Linux/UNIX ํ™˜๊ฒฝ์—์„œ ํ”„๋กœ์„ธ์Šค๋ฅผ ์ƒˆ๋กœ์šด ํ”„๋กœ๊ทธ๋žจ์„ ์‹คํ–‰ํ•˜๋Š” ํ”„๋กœ์„ธ์Šค๋กœ ๋Œ€์ฒดํ•˜๋Š” ์‹œ์Šคํ…œ ์ฝœ ํ•จ์ˆ˜ + +fork()์™€ ๋‹ค๋ฅด๊ฒŒ ์ž์‹ ์ž์‹ ํ”„๋กœ์„ธ์Šค๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹Œ ํ˜„์žฌ ํ”„๋กœ์„ธ์Šค์˜ ํ”„๋กœ๊ทธ๋žจ ์ฝ”๋“œ๋ฅผ ์ƒˆ๋กœ์šด ํ”„๋กœ๊ทธ๋žจ ์ฝ”๋“œ๋กœ ๋ฐ”๊ฟ”์ค€๋‹ค.
+์ด๋กœ ์ธํ•˜์—ฌ ํ”„๋กœ๊ทธ๋žจ ์ฝ”๋“œ, ๋ฉ”๋ชจ๋ฆฌ, ํŒŒ์ผ ๋“ฑ ํ”„๋กœ์„ธ์Šค ์ž์›์ด ์ƒˆ๋กœ ๋ฐ”๋€Œ๊ฒŒ ๋œ๋‹ค.
+exec() ํ•จ์ˆ˜๋Š” ํ˜„์žฌ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์™„์ „ํžˆ ์ƒˆ๋กœ์šด ํ”„๋กœ๊ทธ๋žจ์„ ์‹คํ–‰ํ•˜๋Š” ํ”„๋กœ์„ธ์Šค๋กœ ๋Œ€์ฒด๋˜๋ฏ€๋กœ ๋ฐ˜ํ™˜ ๊ฐ’์ด ์—†๋‹ค.
+![exec](https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Ft9CUW%2FbtqZP2scV43%2F7EkUh5kfj4ATB64Aknm451%2Fimg.png) + +๋ณดํ†ต ๋™์ž‘ํ•˜๋Š” ๋ฐฉ์‹์€ fork()๋ฅผ ํ†ตํ•ด ์ž์‹ ํ”„๋กœ์„ธ์Šค๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์ž์‹ ํ”„๋กœ์„ธ์Šค์—์„œ exec()๋ฅผ ํ†ตํ•ด ์ƒˆ๋กœ์šด ํ”„๋กœ๊ทธ๋žจ์„ ๋Œ๋ฆฌ๊ฒŒ ๋œ๋‹ค.
+์ด๋•Œ ๋ถ€๋กœ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ž์‹ ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋๋‚˜๊ธฐ๋ฅผ ๊ธฐ๋‹ค๋ ค์•ผ ํ•œ๋‹ค๋ฉด wait() ์‹œ์Šคํ…œ ์ฝœ ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•˜์—ฌ ๊ธฐ๋‹ค๋ฆด ์ˆ˜ ์žˆ๋‹ค.
+ +### Multi Process +๋‘๊ฐœ ์ด์ƒ, ๋‹ค์ˆ˜์˜ ํ”„๋กœ์„ธ์„œ(CPU)๊ฐ€ ํ˜‘๋ ฅ์ ์œผ๋กœ ํ•˜๋‚˜ ์ด์ƒ์˜ ์ž‘์—…(Task)์„ ๋™์‹œ์— ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒƒ์ด๋‹ค. (๋ณ‘๋ ฌ์ฒ˜๋ฆฌ)
+**๊ฐ ํ”„๋กœ์„ธ์Šค ๊ฐ„ ๋ฉ”๋ชจ๋ฆฌ ๊ตฌ๋ถ„์ด ํ•„์š”ํ•˜๊ฑฐ๋‚˜ ๋…๋ฆฝ๋œ ์ฃผ์†Œ ๊ณต๊ฐ„์„ ๊ฐ€์ ธ์•ผ ํ•  ๊ฒฝ์šฐ** ์‚ฌ์šฉํ•œ๋‹ค.
+ +#### ์žฅ์  + - ๋…๋ฆฝ๋œ ๊ตฌ์กฐ๋กœ ์•ˆ์ „์„ฑ์ด ๋†’์€ ์žฅ์ ์ด ์žˆ๋‹ค. + - ํ”„๋กœ์„ธ์Šค ์ค‘ ํ•˜๋‚˜์— ๋ฌธ์ œ๊ฐ€ ์ƒ๊ฒจ๋„ ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค์— ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š์•„, ์ž‘์—…์†๋„๊ฐ€ ๋А๋ ค์ง€๋Š” ์†ํ•ด์ •๋„๋Š” ์ƒ๊ธฐ์ง€๋งŒ ์ •์ง€๋˜๊ฑฐ๋‚˜ ํ•˜๋Š” ๋ฌธ์ œ๋Š” ๋ฐœ์ƒํ•˜์ง€ ์•Š๋Š”๋‹ค. + - ์—ฌ๋Ÿฌ๊ฐœ์˜ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ฒ˜๋ฆฌ๋˜์–ด์•ผ ํ•  ๋•Œ ๋™์ผํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ , ์ด๋Ÿฌํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ํ•˜๋‚˜์˜ ๋””์Šคํฌ์— ๋‘๊ณ  ๋ชจ๋“  ํ”„๋กœ์„ธ์„œ(CPU)๊ฐ€ ์ด๋ฅผ ๊ณต์œ ํ•˜๋ฉด ๋น„์šฉ์ ์œผ๋กœ ์ €๋ ดํ•˜๋‹ค. + +#### ๋ฌธ์ œ์  + - ๋…๋ฆฝ๋œ ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์ด๊ธฐ ๋•Œ๋ฌธ์— ์ž‘์—…๋Ÿ‰์ด ๋งŽ์„์ˆ˜๋ก( Context Switching์ด ์ž์ฃผ ์ผ์–ด๋‚˜์„œ ์ฃผ์†Œ ๊ณต๊ฐ„์˜ ๊ณต์œ ๊ฐ€ ์žฆ์„ ๊ฒฝ์šฐ) ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ๋ฐœ์ƒํ•˜์—ฌ ์„ฑ๋Šฅ์ €ํ•˜๊ฐ€ ๋ฐœ์ƒ ํ•  ์ˆ˜ ์žˆ๋‹ค. + - Context Switching ๊ณผ์ •์—์„œ ์บ์‹œ ๋ฉ”๋ชจ๋ฆฌ ์ดˆ๊ธฐํ™” ๋“ฑ ๋ฌด๊ฑฐ์šด ์ž‘์—…์ด ์ง„ํ–‰๋˜๊ณ  ์‹œ๊ฐ„์ด ์†Œ๋ชจ๋˜๋Š” ๋“ฑ ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค. + +#### Context Switching +CPU๋Š” ํ•œ๋ฒˆ์— ํ•˜๋‚˜์˜ ํ”„๋กœ์„ธ์Šค๋งŒ ์‹คํ–‰ ๊ฐ€๋Šฅํ•˜๋‹ค.
+๋•Œ๋ฌธ์— CPU์—์„œ ์—ฌ๋Ÿฌ ํ”„๋กœ์„ธ์Šค๋ฅผ ๋Œ์•„๊ฐ€๋ฉด์„œ ์ž‘์—…์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐ ์ด ๊ณผ์ •์„ Context Switching๋ผ ํ•œ๋‹ค.
+๊ตฌ์ฒด์ ์œผ๋กœ, ๋™์ž‘ ์ค‘์ธ ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋Œ€๊ธฐ๋ฅผ ํ•˜๋ฉด์„œ ํ•ด๋‹น ํ”„๋กœ์„ธ์Šค์˜ ์ƒํƒœ(Context)๋ฅผ ๋ณด๊ด€ํ•˜๊ณ , ๋Œ€๊ธฐํ•˜๊ณ  ์žˆ๋˜ ๋‹ค์Œ ์ˆœ์„œ์˜ ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋™์ž‘ํ•˜๋ฉด์„œ ์ด์ „์— ๋ณด๊ด€ํ–ˆ๋˜ ํ”„๋กœ์„ธ์Šค์˜ ์ƒํƒœ๋ฅผ ๋ณต๊ตฌํ•˜๋Š” ์ž‘์—…์„ ๋งํ•œ๋‹ค.
+ + +### Process๊ฐ„ ํ†ต์‹  ๋ฐฉ์‹ (IPC : Inter Process Communication) +ํ”„๋กœ์„ธ์Šค ๊ฐ„ ํ†ต์‹ ์ด๋ž€ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์„œ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ ๋ฐ›๋Š” ๋ฐฉ๋ฒ•, ๊ฒฝ๋กœ ๋“ฑ์„ ์˜๋ฏธํ•œ๋‹ค.
+์ปค๋„์˜ ๋””์ž์ธ์— ๋”ฐ๋ผ ๋งˆ์ดํฌ๋กœ ์ปค๋„, ๋‚˜๋…ธ ์ปค๋„ ๋“ฑ ํ†ต์‹ ์ด ๋งŽ์ด ์ผ์–ด๋‚˜๋Š” ๋””์ž์ธ์˜ ๊ฒฝ์šฐ IPC ๋ฐฉ์‹์ด ์„ฑ๋Šฅ์„ ํฌ๊ฒŒ ์ขŒ์ง€์šฐ์ง€ํ•  ์ˆ˜ ์žˆ๋‹ค.
+ +#### Shared memory +์šด์˜์ฒด์ œ์˜ ๋„์›€์„ ๋ฐ›์•„ ์ผ๋ถ€ ์˜์—ญ์˜ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์—ฌ๋Ÿฌ ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋™์‹œ์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋„๋ก ๊ถŒํ•œ์„ ๋ฐ›๋Š”๋‹ค.
+ํ”„๋กœ์„ธ์Šค๋Š” ๊ณต์œ  ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ฝ๊ณ  ์“ฐ๋ฉด์„œ ํ”„๋กœ์„ธ์Šค ๊ฐ„ ํ†ต์‹ ์„ ํ•˜๊ฒŒ ๋œ๋‹ค.
+๊ฐ™์€ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ํ™˜๊ฒฝ์—์„œ ์ž‘๋™ํ•˜๋ฏ€๋กœ ๋ฉ”๋ชจ๋ฆฌ์— ์ ‘๊ทผํ•˜์—ฌ ๊ฐ’์„ ๋ณ€๊ฒฝํ•˜๋ฉด ๊ทธ ์ฆ‰์‹œ ๋ณ€๊ฒฝ๋œ ๊ฐ’์ด ๋ฐ˜์˜๋˜์–ด ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค๋“ค์ด ์ ‘๊ทผ ์‹œ ๋ณ€๊ฒฝ๋œ ๊ฐ’์„ ์–ป์„ ์ˆ˜ ์žˆ๋‹ค.
+์ฒ˜์Œ ๋ฉ”๋ชจ๋ฆฌ์— ์—ฌ๋Ÿฌ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ ‘๊ทผ ๊ถŒํ•œ์„ ๋ถ€์—ฌํ•˜๋Š” ์ž‘์—…์—์„œ๋งŒ ์ปค๋„ ์ž‘์—…์ด ํ•„์š”ํ•˜๊ณ  ์ดํ›„์—” ์ปค๋„ ๋™์ž‘์ด ํ•„์š” ์—†๋‹ค.
+ +##### ๋™์ž‘ ๊ณผ์ • +๊ณต์œ  ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•  ํ”„๋กœ์„ธ์Šค๋“ค ์ค‘ ํ•˜๋‚˜์˜ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ž์‹ ์ด ๋ถ€์—ฌ๋ฐ›์€ ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ ์ค‘ ์ผ๋ถ€๋ถ„์„ ์„ ํƒ
+๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค ๋“ค์€ ๊ณต์œ ํ•  ๋ฉ”๋ชจ๋ฆฌ์˜ ์ฃผ์†Œ๋ฅผ ๋ฐ›์•„ ์ด๋ฅผ ์ž์‹ ์˜ ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์— ๋ถ™์ธ๋‹ค.
+์šด์˜์ฒด์ œ๊ฐ€ ํ•ด๋‹น ํ”„๋กœ์„ธ์Šค๋“ค ๊ฐ„์˜ ๋ฉ”๋ชจ๋ฆฌ ์ ‘๊ทผ ์ œํ•œ์„ ํ’€์–ด์ค€๋‹ค.
+์ดํ›„ ํ”„๋กœ์„ธ์Šค๋“ค์€ ๊ณต์œ  ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ†ตํ•ด ํ†ต์‹ 
+* ์šด์˜์ฒด์ œ๋Š” ๋” ์ด์ƒ ๊ด€์—ฌํ•  ํ•„์š” ์—†์œผ๋ฉฐ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ข…๋ฃŒ ์‹œ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋ฉด ๊ณต์œ  ๋ฉ”๋ชจ๋ฆฌ ๋˜ํ•œ ๊ฐ™์ด ๋ฐ˜ํ™˜ํ•˜๊ฒŒ ๋œ๋‹ค.
+ +#### Message Passing +๋ฐ์ดํ„ฐ๊ฐ€ ํ•˜๋‚˜์˜ ๋ฉ”์‹œ์ง€๊ฐ€ ๋˜์–ด ํ”„๋กœ์„ธ์Šค ๊ฐ„ ํ†ต์‹ ์„ ํ•˜๊ฒŒ ๋œ๋‹ค.
+์ถฉ๋Œ ์œ„ํ—˜์ด ์—†๊ธฐ ๋•Œ๋ฌธ์— ์†Œ๋Ÿ‰์˜ ๋ฐ์ดํ„ฐ ์ „์†ก์— ์œ ๋ฆฌ
+๋ช…๋ น๋งŒ์„ ์ฃผ๊ณ ๋ฐ›๋Š” ๋ถ„์‚ฐ ์‹œ์Šคํ…œ, ๋งˆ์ดํฌ๋กœ/๋‚˜๋…ธ ์ปค๋„ ๋ฐฉ์‹์— ์œ ๋ฆฌ
+๊ณต์œ  ๋ฉ”๋ชจ๋ฆฌ ๋ฐฉ์‹๊ณผ ๋‹ค๋ฅด๊ฒŒ ๊ฐ™์€ ํ™˜๊ฒฝ์— ์žˆ์ง€ ์•Š์•„๋„ ์ธํ„ฐ๋„ท์„ ํ†ตํ•ด์„œ ๋ฉ”์‹œ์ง€๋ฅผ ์ฃผ๊ณ ๋ฐ›์„ ์ˆ˜ ์žˆ๋‹ค. (์†Œ์ผ“)
+์ƒ์‚ฐ์ž-์†Œ๋น„์ž ๋ชจ๋ธ์˜ ๊ณต์œ  ๋ฉ”๋ชจ๋ฆฌ ๋ฐฉ์‹์„ ์ด์šฉํ•˜๋ฉด ๋™๊ธฐํ™” ์ž‘์—…์ด ํ•„์š” ์—†์ง€๋งŒ ๋ฉ”์‹œ์ง€ ์ „๋‹ฌ ๋ฐฉ์‹์€ ๋™๊ธฐํ™” ์ž‘์—…์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์Šต๋‹ˆ๋‹ค. ๋น„๋™๊ธฐ, ๋™๊ธฐ ๋ฐฉ์‹์— ๋”ฐ๋ผ ๊ฒฐ์ •ํ•œ๋‹ค.
+ +##### Send, Receive 2๊ฐ€์ง€ ๋ช…๋ น์— ์˜ํ•ด ๋™์ž‘ + - Direct communication : send, receive ๋™์ž‘์ด ํŠน์ • ํ”„๋กœ์„ธ์Šค๋ฅผ ์ง€์ •ํ•˜๋ฉฐ ๋ฉ”์‹œ์ง€๋ฅผ ์ง์ ‘ ์ฃผ๊ณ  ๋ฐ›๋Š”๋‹ค. + - Indirect communication : ํ”„๋กœ์„ธ์Šค๋“ค ๊ฐ€์šด๋ฐ ํ•˜๋‚˜์˜ ์‹œ์Šคํ…œ, ๋„คํŠธ์›Œํฌ ๋“ฑ์„ ๋‘๊ณ  ๋ฉ”์‹œ์ง€๋ฅผ ์ค‘์žฌํ•˜๋ฉฐ ๋™์ž‘ํ•œ๋‹ค. ์ง์ ‘ ์ „๋‹ฌ ๋ฐฉ์‹๋ณด๋‹ค ๋” ์œ ์—ฐํ•˜๊ฒŒ ๋™์ž‘ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ์ค‘์žฌ ์‹œ์Šคํ…œ์˜ ๊ตฌํ˜„์— ๋”ฐ๋ผ ๋ณด์•ˆ์„ฑ, ์„ฑ๋Šฅ ๋“ฑ ๋‹ค์–‘ํ•œ ์ฒ˜๋ฆฌ๊ฐ€ ๊ฐ€๋Šฅํ•ด์ง„๋‹ค. + +##### ๋™๊ธฐ, ๋น„๋™๊ธฐ +๋ฉ”์‹œ์ง€ ์ „๋‹ฌ ๋ฐฉ์‹์€ ๋™๊ธฐํ™” ์ž‘์—…์ด ํ•„์š”ํ•œ๋ฐ, ๋™๊ธฐ๋ฐฉ์‹๊ณผ ๋น„๋™๊ธฐ ๋ฐฉ์‹์ด ์žˆ๋‹ค.
+ +> ๋™๊ธฐ(Blocking, Synchronous)
+> ๋™๊ธฐ Send : ๋ฉ”์‹œ์ง€๋ฅผ ๋ณด๋‚ด๊ณ  ๋‚˜๋ฉด ๋ฐ›๋Š” ํ”„๋กœ์„ธ์Šค์—๊ฒŒ ๋ฉ”์‹œ์ง€๊ฐ€ ๋„์ฐฉํ•  ๋•Œ๊นŒ์ง€ ๋‹ค๋ฅธ ์ž‘์—…์„ ํ•  ์ˆ˜ ์—†๋‹ค.
+> ๋™๊ธฐ Receive : ๋ฉ”์‹œ์ง€๋ฅผ ๋ฐ›๊ธฐ ์ „๊นŒ์ง€ ํ•ด๋‹น ํ”„๋กœ์„ธ์Šค๋Š” ๋‹ค๋ฅธ ์ž‘์—…์„ ํ•˜์ง€ ์•Š๊ณ  ๋ฉˆ์ถฐ ์žˆ์–ด์•ผ ํ•œ๋‹ค.
+ + +> ๋น„๋™๊ธฐ(Nonblocking, Asynchronous)
+> ๋น„๋™๊ธฐ Send : ๋ฉ”์‹œ์ง€๋ฅผ ๋ณด๋‚ด๊ณ  ํ”„๋กœ์„ธ์Šค๋Š” ๋ฉˆ์ถ”์ง€ ์•Š๊ณ  ๋‹ค์Œ ์ž‘์—…์„ ์ง„ํ–‰ํ•œ๋‹ค.
+> ๋น„๋™๊ธฐ Receive : ๋ฉ”์‹œ์ง€๋ฅผ ๋ฐ›์œผ๋ฉด ํ•ด๋‹น ๋ฉ”์‹œ์ง€๊ฐ€ ์œ ํšจํ•œ ๋‚ด์šฉ์ธ์ง€ ๊ฒ€์‚ฌ๋ฅผ ํ•˜๊ณ  ์ฒ˜๋ฆฌ
+ +##### ๋ฒ„ํผ ํ˜•ํƒœ + - Unbounded buffer : ๋ฉ”๋ชจ๋ฆฌ ๋ฒ„ํผ์˜ ํฌ๊ธฐ์— ์ œํ•œ์ด ์—†์œผ๋ฉฐ ์†Œ๋น„์ž ํ”„๋กœ์„ธ์Šค๋Š” ์ƒˆ ์ž์›์ด ๋งŒ๋“ค์–ด์งˆ ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ ค์•ผ ํ•˜๋ฉฐ ์ƒ์‚ฐ์ž ํ”„๋กœ์„ธ์Šค๋Š” ํ•ญ์ƒ ์ƒˆ๋กœ์šด ์ž์›์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค. ์ด๋•Œ ์ƒ์‚ฐ์ž ์—ญํ• ์˜ ํ”„๋กœ์„ธ์Šค๋Š” ๊ณต์œ ํ•œ ๋ฉ”๋ชจ๋ฆฌ ์ž์›์˜ ํฌ๊ธฐ๋ฅผ ์ง€์ •ํ•˜์—ฌ ์ด๋ฅผ ํ•จ๊ป˜ ์†Œ๋น„์ž ํ”„๋กœ์„ธ์Šค์— ์•Œ๋ ค์ฃผ์–ด์•ผ ํ•œ๋‹ค. + - Bounded buffer : ๋ฉ”๋ชจ๋ฆฌ ๋ฒ„ํผ ํฌ๊ธฐ์— ์ œํ•œ์ด ์žˆ์œผ๋ฉฐ ์†Œ๋น„์ž ํ”„๋กœ์„ธ์Šค๋Š” ๋ฒ„ํผ๊ฐ€ ๋นˆ ์ƒํ™ฉ์ด๋ฉด ์ƒˆ๋กœ์šด ์ž์›์ด ์ฑ„์›Œ์งˆ ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฌ๋ฉฐ ์ƒ์‚ฐ์ž ํ”„๋กœ์„ธ์Šค๋Š” ๋ฒ„ํผ๊ฐ€ ๊ฝ‰ ์ฐจ ์žˆ์œผ๋ฉด ๊ณต๊ฐ„์ด ๋‚จ์„ ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ ค์•ผ ํ•œ๋‹ค. + +#### File ์‚ฌ์šฉ +ํ…์ŠคํŠธ ํŒŒ์ผtxt(ํ˜น์€ ๋‹ค๋ฅธ ํฌ๋ฉง์˜ ํŒŒ์ผ)์„ ํ†ตํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ  ๋ฐ›๋Š” ๊ฒƒ๋„ IPC ๊ธฐ๋ฒ• ์ค‘ ํ•˜๋‚˜์ด๋‹ค.
+ +๋ฌผ๋ก  ์ด ๋ฐฉ์‹์€ ๋ฌธ์ œ๊ฐ€ ๋งŽ๋‹ค. ์ด ๋ฐฉ์‹์€ ์‹ค์‹œ๊ฐ„์œผ๋กœ ์ง์ ‘ ์›ํ•˜๋Š” ํ”„๋กœ์„ธ์Šค์— ๋ฐ์ดํ„ฐ ์ „๋‹ฌํ•˜๋Š”๊ฒŒ ์–ด๋ ต๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
+๋””์Šคํฌ์—์„œ ๋ฐ์ดํ„ฐ ํŒŒ์ผ์„ ์ฝ๊ณ , ํ”„๋กœ์„ธ์Šค์— ์ ์žฌload๋˜๋Š” ๊ณผ์ •์—์„œ ์ปจํ…์ŠคํŠธ ์Šค์œ„์นญContext-switching, ์ธํ„ฐ๋ŸฝํŠธInterrupt ๋“ฑ ์—ฌ๋Ÿฌ ์ผ์„ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
+ +#### ํŒŒ์ดํ”„(Pipe) +๋‹จ๋ฐฉํ–ฅ ํ†ต์‹ , ์ฆ‰ ๋ถ€๋ชจ ํ”„๋กœ์„ธ์Šค โ†’ ์ž์‹ ํ”„๋กœ์„ธ์Šค์—๊ฒŒ ์ผ๋ฐฉ์ ์œผ๋กœ ํ†ต์‹ ํ•˜๋Š” ๊ธฐ๋ฒ•์œผ๋กœ, fork()๋ฅผ ํ†ตํ•ด ์ž์‹ ํ”„๋กœ์„ธ์Šค๋ฅผ ๋งŒ๋“ค๊ณ  ๋‚˜์„œ ๋ถ€๋ชจ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ž์‹์—๊ฒŒ ๋ณด๋‚ธ๋‹ค. +![pipe](https://velog.velcdn.com/images%2Fredgem92%2Fpost%2F3cadf7e9-cf1c-4800-bc5d-03d325e03654%2Fimage.png) + +#### ์†Œ์ผ“(Socket) +๋งŽ์ด ์“ฐ์ด๋Š” ๊ธฐ๋ฒ•์ด์ž, ๋ณธ๋ž˜ ๋ชฉ์ ์ด IPC๋กœ ํ™œ์šฉํ•˜๊ธฐ ์œ„ํ•œ ๊ฒƒ์€ ์•„๋‹ˆ์ง€๋งŒ, ์ถฉ๋ถ„ํžˆ ํ™œ์šฉ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.
+ +๋ณธ๋ž˜ ์†Œ์ผ“์€ ๋„คํŠธ์›Œํฌ ํ†ต์‹ ์„ ์œ„ํ•œ ๊ธฐ์ˆ ์ด๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„ ๋“ฑ ๋‘ ๊ฐœ์˜ ๋‹ค๋ฅธ ์ปดํ“จํ„ฐ ๊ฐ„์˜ ๋„คํŠธ์›Œํฌ ๊ธฐ๋ฐ˜ ํ†ต์‹ ์„ ์œ„ํ•œ ๊ธฐ์ˆ ๋กœ, ๋„คํŠธ์›Œํฌ ๋””๋ฐ”์ด์Šค๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์‹œ์Šคํ…œ ์ฝœ์ด๊ธฐ๋„ ํ•˜๋‹ค.
+์†Œ์ผ“์€ ์ด๋ ‡๊ฒŒ ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„ ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ, ํ•˜๋‚˜์˜ ์ปดํ“จํ„ฐ ์•ˆ์—์„œ ๋‘ ๊ฐœ์˜ ํ”„๋กœ์„ธ์Šค ๊ฐ„์˜ ํ†ต์‹  ๊ธฐ๋ฒ•์œผ๋กœ ํ™œ์šฉํ•˜๋Š” ๊ฒฝ์šฐ๋„ ๋”๋Ÿฌ ์žˆ๋‹ค.
+ +![ipcsocket](https://velog.velcdn.com/images%2Fredgem92%2Fpost%2F93b6e638-147a-4a25-b0b2-4fe01b1aef04%2Fimage.png) + +์†Œ์ผ“์„ ์‚ฌ์šฉํ•˜๋ฉด ๋กœ์ปฌ ์ปดํ“จํ„ฐ๊ฐ„์˜ ํ†ต์‹  ์‹œ ์ด๋ ‡๊ฒŒ ๊ณ„์ธต์„ ํƒ€๊ณ  ๋‚ด๋ ค๊ฐ€๋ฉด์„œ ์†ก์‹ ์„ ํ•˜๊ณ , ์•„๋ž˜ ๊ณ„์ธต๋ถ€ํ„ฐ ์œ„๋กœ ์˜ฌ๋ผ๊ฐ€์„œ ๋Œ€์ƒ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ˆ˜์‹ ์„ ํ•˜๋Š” ๋ฐฉ์‹์„ ์ทจํ•˜๊ฒŒ ๋œ๋‹ค.
+ +--- + +## Thread ๋ž€? +์‚ฌ์‹ค ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋‹จ์ผ์˜ ์‹คํ–‰ ์“ฐ๋ ˆ๋“œ๋ฅผ ์‹คํ–‰ํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์ด๋‹ค. ์ง„์งœ๋กœ ์ผํ•˜๋Š” ๊ฒƒ์€ ์“ฐ๋ ˆ๋“œ๋ผ๊ณ  ๋ณด๋ฉด ๋œ๋‹ค. + + +### Multi Thread +ํ•˜๋‚˜์˜ ํ”„๋กœ์„ธ์Šค์— ์—ฌ๋Ÿฌ ์Šค๋ ˆ๋“œ๋กœ ์ž์›์„ ๊ณต์œ ํ•˜๋ฉฐ ์ž‘์—…์„ ๋‚˜๋ˆ„์–ด ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.
+![multiThread](https://user-images.githubusercontent.com/58318041/91327464-82c7d600-e800-11ea-818e-faf42b7ff162.png) + +#### ์žฅ์  + - ์‹œ์Šคํ…œ ์ž์›์†Œ๋ชจ ๊ฐ์†Œ (์ž์›์˜ ํšจ์œจ์„ฑ ์ฆ๋Œ€) + - ํ”„๋กœ์„ธ์Šค๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ์ž์›์„ ํ• ๋‹นํ•˜๋Š” ์‹œ์Šคํ…œ ์ฝœ์ด ์ค„์–ด ์ž์›์„ ํšจ์œจ์ ์œผ๋กœ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค. + - ์‹œ์Šคํ…œ ์ฒ˜๋ฆฌ์œจ ํ–ฅ์ƒ (์ฒ˜๋ฆฌ๋น„์šฉ ๊ฐ์†Œ) + - ์Šค๋ ˆ๋“œ ๊ฐ„ ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ  ๋ฐ›๋Š” ๊ฒƒ์ด ๊ฐ„๋‹จํ•ด์ง€๊ณ  ์‹œ์Šคํ…œ ์ž์› ์†Œ๋ชจ๊ฐ€ ์ค„์–ด๋“ ๋‹ค. + - ์Šค๋ ˆ๋“œ ์‚ฌ์ด ์ž‘์—…๋Ÿ‰์ด ์ž‘์•„ Context Switching์ด ๋น ๋ฅด๋‹ค. (์บ์‹œ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋น„์šธ ํ•„์š”๊ฐ€ ์—†๋‹ค.) + - ๊ฐ„๋‹จํ•œ ํ†ต์‹  ๋ฐฉ๋ฒ•์œผ๋กœ ํ”„๋กœ๊ทธ๋žจ ์‘๋‹ต์‹œ๊ฐ„ ๋‹จ์ถ• + - ์Šค๋ ˆ๋“œ๋Š” ํ”„๋กœ์„ธ์Šค ๋‚ด ์Šคํƒ์˜์—ญ์„ ์ œ์™ธํ•œ ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์„ ๊ณต์œ ํ•˜๊ธฐ์— ํ†ต์‹  ๋น„์šฉ์ด ์ ๋‹ค. + - ํž™ ์˜์—ญ์„ ๊ณต์œ ํ•˜๋ฏ€๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ  ๋ฐ›์„ ์ˆ˜ ์žˆ๋‹ค. + +#### ๋ฌธ์ œ์  + - ์ž์›์„ ๊ณต์œ ํ•˜๊ธฐ์— ๋™๊ธฐํ™” ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค. (๋ณ‘๋ชฉํ˜„์ƒ, ๋ฐ๋“œ๋ฝ ๋“ฑ) + - ์ฃผ์˜ ๊นŠ์€ ์„ค๊ณ„๊ฐ€ ํ•„์š”ํ•˜๊ณ  ๋””๋ฒ„๊น…์ด ์–ด๋ ต๋‹ค. (๋ถˆํ•„์š” ๋ถ€๋ถ„๊นŒ์ง€ ๋™๊ธฐํ™”ํ•˜๋ฉด, ๋Œ€๊ธฐ์‹œ๊ฐ„์œผ๋กœ ์ธํ•ด ์„ฑ๋Šฅ์ €ํ•˜ ๋ฐœ์ƒ) + - ํ•˜๋‚˜์˜ ์Šค๋ ˆ๋“œ์— ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธฐ๋ฉด ์ „์ฒด ํ”„๋กœ์„ธ์Šค๊ฐ€ ์˜ํ–ฅ์„ ๋ฐ›๋Š”๋‹ค. + - ๋‹จ์ผ ํ”„๋กœ์„ธ์Šค ์‹œ์Šคํ…œ์˜ ๊ฒฝ์šฐ ํšจ๊ณผ๋ฅผ ๊ธฐ๋Œ€ํ•˜๊ธฐ ์–ด๋ ต๋‹ค. + +--- + +## Process์™€ Thread์˜ ์ฐจ์ด + - ํ”„๋กœ์„ธ์Šค๋Š” ํ˜„์žฌ ์‹คํ–‰๋˜๊ณ  ์žˆ๋Š” ํ”„๋กœ๊ทธ๋žจ์œผ๋กœ ๋ฉ”๋ชจ๋ฆฌ์— ์˜ฌ๋ผ์™€์„œ ๋…๋ฆฝ์ ์ธ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์„ ๊ฐ€์ง„๋‹ค. + - ์“ฐ๋ ˆ๋“œ๋Š” ํ”„๋กœ์„ธ์Šค ๋‚ด์—์„œ ์‹คํ–‰๋˜๋Š” ํ๋ฆ„์œผ๋กœ ํ”„๋กœ์„ธ์Šค ์ž์›์„ ๊ณต์œ ํ•œ๋‹ค. + +### ๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋“œ vs ๋ฉ€ํ‹ฐ ํ”„๋กœ์„ธ์Šค + - ๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋“œ๋Š” ๋ฉ€ํ‹ฐ ํ”„๋กœ์„ธ์Šค๋ณด๋‹ค ์ ์€ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์„ ์ฐจ์ง€ํ•˜๊ณ  Context Switching์ด ๋น ๋ฅธ ์žฅ์ ์ด ์žˆ์ง€๋งŒ, ๋™๊ธฐํ™” ๋ฌธ์ œ์™€ ํ•˜๋‚˜์˜ ์Šค๋ ˆ๋“œ ์žฅ์• ๋กœ ์ „์ฒด ์Šค๋ ˆ๋“œ๊ฐ€ ์ข…๋ฃŒ ๋  ์œ„ํ—˜์„ ๊ฐ–๊ณ  ์žˆ๋‹ค. + - ๋ฉ€ํ‹ฐ ํ”„๋กœ์„ธ์Šค๋Š” ํ•˜๋‚˜์˜ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ฃฝ๋”๋ผ๋„ ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค์— ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š์•„ ์•ˆ์ •์„ฑ์ด ๋†’์ง€๋งŒ, ๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋“œ๋ณด๋‹ค ๋งŽ์€ ๋ฉ”๋ชจ๋ฆฌ๊ณต๊ฐ„๊ณผ CPU ์‹œ๊ฐ„์„ ์ฐจ์ง€ํ•˜๋Š” ๋‹จ์ ์ด ์žˆ๋‹ค. + - ๋‘ ๋ฐฉ๋ฒ•์€ ๋™์‹œ์— ์—ฌ๋Ÿฌ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ์ ์—์„œ ๋™์ผํ•˜์ง€๋งŒ, ๊ฐ๊ฐ์˜ ์žฅ๋‹จ์ด ์žˆ์œผ๋ฏ€๋กœ ์ ์šฉํ•˜๋Š” ์‹œ์Šคํ…œ์— ๋”ฐ๋ผ ์ ํ•ฉํ•œ ๋™์ž‘ ๋ฐฉ์‹์„ ์„ ํƒํ•˜๊ณ  ์ ์šฉํ•ด์•ผ ํ•œ๋‹ค. + +### ์™œ ๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋“œ๋กœ ๋‚˜๋ˆ ๊ฐ€๋ฉฐ ํ• ๊นŒ? + - ์šด์˜์ฒด์ œ๊ฐ€ ์‹œ์Šคํ…œ ์ž์›์„ ํšจ์œจ์ ์œผ๋กœ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ์Šค๋ ˆ๋“œ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. + - ๋ฉ€ํ‹ฐ ํ”„๋กœ์„ธ์Šค๋กœ ์‹คํ–‰๋˜๋Š” ์ž‘์—…์„ ๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋“œ๋กœ ์‹คํ–‰ํ•  ๊ฒฝ์šฐ, ํ”„๋กœ์„ธ์Šค๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ์ž์›์„ ํ• ๋‹นํ•˜๋Š” ์‹œ์Šคํ…œ ์ฝœ์ด ์ค„์–ด๋“ค์–ด ์ž์›์„ ํšจ์œจ์ ์œผ๋กœ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค. + - ๋˜ํ•œ, ํ”„๋กœ์„ธ์Šค ๊ฐ„์˜ ํ†ต์‹ ๋ณด๋‹ค ์Šค๋ ˆ๋“œ ๊ฐ„์˜ ํ†ต์‹  ๋น„์šฉ์ด ์ ์œผ๋ฏ€๋กœ ์ž‘์—…๋“ค ๊ฐ„ ํ†ต์‹ ์˜ ๋ถ€๋‹ด์ด ์ค„์–ด๋“ ๋‹ค. (์ฒ˜๋ฆฌ๋น„์šฉ ๊ฐ์†Œ. ํ”„๋กœ์„ธ์Šค๋Š” ๋…๋ฆฝ๊ตฌ์กฐ์ด๊ธฐ ๋•Œ๋ฌธ) + +#### ๊ทธ๋ ‡๋‹ค๋ฉด ๋ฌด์กฐ๊ฑด ๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋“œ๊ฐ€ ์ข‹์€๊ฐ€? +์Šค๋ ˆ๋“œ๋ฅผ ํ™œ์šฉํ•˜๋ฉด ์ž์›์˜ ํšจ์œจ์„ฑ์ด ์ฆ๊ฐ€ํ•˜๊ธฐ๋„ ํ•˜์ง€๋งŒ, ์Šค๋ ˆ๋“œ ๊ฐ„์˜ ์ž์› ๊ณต์œ ๋Š” ์ „์—ญ ๋ณ€์ˆ˜๋ฅผ ์ด์šฉํ•˜๋ฏ€๋กœ ๋™๊ธฐํ™” ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒ ํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ํ”„๋กœ๊ทธ๋ž˜๋จธ์˜ ์ฃผ์˜๊ฐ€ ํ•„์š”ํ•˜๋‹ค.
+ +--- + +## ์ข€๋น„ & ๊ณ ์•„ ํ”„๋กœ์„ธ์Šค +### ์ข€๋น„ ํ”„๋กœ์„ธ์Šค +์ž์‹ ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋ถ€๋ชจ ํ”„๋กœ์„ธ์Šค๋ณด๋‹ค ๋จผ์ € ์ฃฝ๋Š” ๊ฒฝ์šฐ ๋ถ€๋ชจ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ข…๋ฃŒ ์ƒํƒœ๋ฅผ ํšŒ์ˆ˜ํ•˜๊ธฐ ์œ„ํ•ด ์ปค๋„์ด ์ž์‹ ํ”„๋กœ์„ธ์Šค์˜ ์ตœ์†Œํ•œ์˜ ์ •๋ณด(PID, ์ข…๋ฃŒ ์ƒํƒœ ๋“ฑ, ๋ฆฌ๋ˆ…์Šค์˜ ๊ฒฝ์šฐ ์ปค๋„์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๊ตฌ์กฐ์ฒด)๋ฅผ ๋‚จ๊ฒจ ๋‘”๋‹ค.
+๋ถ€๋ชจ ํ”„๋กœ์„ธ์Šค๋Š” wait ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ์ด ์ƒํƒœ๋ฅผ ํšŒ์ˆ˜ํ•˜๋ฉด ๋‚จ์€ ๋ชจ๋“  ์ •๋ณด๊ฐ€ ์ œ๊ฑฐ๋˜์–ด ์ž์‹ ํ”„๋กœ์„ธ์Šค๋Š” ์™„์ „ํžˆ ์†Œ๋ฉธํ•˜๊ฒŒ ๋œ๋‹ค.
+ +์œ„์™€ ๊ฐ™์€ ์ง„ํ–‰์ƒํ™ฉ์—์„œ ๋ถ€๋ชจ ํ”„๋กœ์„ธ์Šค๊ฐ€ wait ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜์ง€ ์•Š์•„ ์ตœ์†Œํ•œ์˜ ์ •๋ณด๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ์— ๋‚จ์•„ ์žˆ๋Š” ๊ฒฝ์šฐ๋ฅผ ์ข€๋น„ ํ”„๋กœ์„ธ์Šค๋ผ๊ณ  ํ•œ๋‹ค.
+์ข€๋น„ ํ”„๋กœ์„ธ์Šค๋Š” ์ตœ์†Œํ•œ์˜ ์ •๋ณด๋งŒ์„ ๊ฐ€์ง€๊ณ  ์žˆ์–ด ํฐ ์„ฑ๋Šฅ ์ €ํ•˜๋ฅผ ์•ผ๊ธฐํ•˜์ง€ ์•Š์ง€๋งŒ, ์šด์˜์ฒด์ œ๋Š” ํ•œ์ •๋œ PID๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฏ€๋กœ ์ข€๋น„ ํ”„๋กœ์„ธ์Šค๊ฐ€ PID๋ฅผ ์ฐจ์ง€ํ•˜๋ฉฐ ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค ์‹คํ–‰์„ ๋ฐฉํ•ดํ•˜๊ฒŒ ๋œ๋‹ค.
+๋”ฐ๋ผ์„œ ๋ถ€๋ชจ ํ”„๋กœ์„ธ์Šค๋Š” ์ข€๋น„ ํ”„๋กœ์„ธ์Šค ์ƒ์„ฑ์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด wait ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ์ƒํƒœ๋ฅผ ํšŒ์ˆ˜ํ•˜์—ฌ์•ผ ํ•œ๋‹ค.
+ +> ์ปค๋„ ์ž…์žฅ์—์„œ ์ข€๋น„ ํ”„๋กœ์„ธ์Šค๋Š” ์„ฑ๋Šฅ ์ €ํ•˜๋ฅผ ์ผ์œผํ‚จ๋‹ค๊ณ  ๋ณผ ์ˆ˜ ์žˆ๋‹ค.
+> ํ”„๋กœ์„ธ์Šค ์Šค์ผ€์ค„๋ง์— ์žˆ์–ด์„œ queue์— ๊ฑธ๋ ค์žˆ๋Š” ํ”„๋กœ์„ธ์Šค์˜ ์–‘์ด ์ฆ๊ฐ€ํ•˜๊ณ  ์ปค๋„ ๊ตฌ์กฐ์ฒด๋ฅผ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•œ ๋น„์šฉ ๋˜ํ•œ ๋ฌด์‹œํ•  ์ˆ˜ ์—†๋‹ค.
+ +์ข€๋น„ ํ”„๋กœ์„ธ์Šค๋ฅผ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ฐฉ๋ฒ•์œผ๋กœ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.
+ - wait : ๊ฐ„๋‹จํ•˜๊ฒŒ ๋ถ€๋ชจ ํ”„๋กœ์„ธ์Šค์—์„œ wait ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ์ข€๋น„ ํ”„๋กœ์„ธ์Šค๋ฅผ ์—†์•จ ์ˆ˜ ์žˆ๋‹ค. + - signal, wait : wait ํ•จ์ˆ˜๋Š” ๋ธ”๋ก ๋ชจ๋“œ๋กœ ๋™์ž‘ํ•˜๋Š” ํ•จ์ˆ˜์ด๋ฏ€๋กœ ๋ถ€๋ชจ ํ”„๋กœ์„ธ์Šค๋Š” waitํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•œ ์ฆ‰์‹œ ๋™์ž‘์„ ๋ฉˆ์ถ”๊ฒŒ ๋œ๋‹ค. ์ด๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ์‹œ๊ทธ๋„ ๋„๊ตฌ๋ฅผ ํ™œ์šฉํ•˜์—ฌ ์ž์‹ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ข…๋ฃŒ๋  ๊ฒฝ์šฐ ๋ฐœ์ƒํ•˜๋Š” SIGCHLD ์‹œ๊ทธ๋„์— ํ•ด๋‹นํ•˜๋Š” ํ•ธ๋“ค๋Ÿฌ๋ฅผ ๋งŒ๋“ค๊ณ  ํ•ด๋‹น ํ•ธ๋“ค๋Ÿฌ์—์„œ wait ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด ๋œ๋‹ค. + + +### ๊ณ ์•„ ํ”„๋กœ์„ธ์Šค(Orphan) +๋ถ€๋ชจ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ž์‹ ํ”„๋กœ์„ธ์Šค๋ณด๋‹ค ๋จผ์ € ์ข…๋ฃŒ๋˜๋Š” ๊ฒฝ์šฐ ๋ถ€๋ชจ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์—†๋Š” ์ž์‹ ํ”„๋กœ์„ธ์Šค๋ฅผ ๋งํ•œ๋‹ค.
+์šด์˜์ฒด์ œ๋Š” ์ด๋Ÿฌํ•œ ๊ณ ์•„ ํ”„๋กœ์„ธ์Šค๋ฅผ ํ—ˆ์šฉํ•˜์ง€ ์•Š์œผ๋ฉฐ ๋ถ€๋ชจ ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋จผ์ € ์ข…๋ฃŒ๋˜๋ฉด ์ž์‹ ํ”„๋กœ์„ธ์Šค์˜ ์ƒˆ๋กœ์šด ๋ถ€๋ชจ ํ”„๋กœ์„ธ์Šค๋กœ init(PID = 1)๊ฐ€ ์„ค์ •๋œ๋‹ค.
+ +init ํ”„๋กœ์„ธ์Šค๋Š” ์ž์‹ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ข…๋ฃŒ๋  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฐ ํ›„ wait ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ๊ณ ์•„ ํ”„๋กœ์„ธ์Šค์˜ ์ข…๋ฃŒ ์ƒํƒœ๋ฅผ ํšŒ์ˆ˜ํ•˜์—ฌ ์ข€๋น„ ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•œ๋‹ค.
+๊ณ ์•„ ํ”„๋กœ์„ธ์Šค๋Š” ํ”„๋กœ์„ธ์Šค ์ž์‹ ์ด ์‹œ์Šคํ…œ์˜ ์ž์›์„ ๋‚ญ๋น„ํ•  ์ˆ˜ ์žˆ๊ณ , ์‹œ์Šคํ…œ์ด ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ข…๋ฃŒ๋  ๋•Œ๊นŒ์ง€ ์ถ”์ ์„ ํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์„ฑ๋Šฅ ์ €ํ•˜์˜ ์›์ธ์ด ๋œ๋‹ค.
+ +๊ณ ์•„ ํ”„๋กœ์„ธ์Šค๋Š” init ํ”„๋กœ์„ธ์Šค๊ฐ€ ๊ด€๋ฆฌ๋ฅผ ํ•ด ์ฃผ์ง€๋งŒ ์„ฑ๋Šฅ ์ €ํ•˜๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ๋ถ€๋ชจ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ข…๋ฃŒ๋˜๊ธฐ ์ „์— ๋ชจ๋“  ์ž์‹ ํ”„๋กœ์„ธ์Šค๋ฅผ wait ํ•ด ์ฃผ๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.
diff --git a/src/content/blog/study/cs/2022-12-13-tcp-protocol.md b/src/content/blog/study/cs/2022-12-13-tcp-protocol.md new file mode 100644 index 0000000..d57a302 --- /dev/null +++ b/src/content/blog/study/cs/2022-12-13-tcp-protocol.md @@ -0,0 +1,51 @@ +--- +title: TCP/IP +date: 2022-12-13 +tags: cs, ๊ณต๋ถ€ +excerpt: TCP(Transmission Control Protocol) / IP(Internet Protocol) +--- +# TCP(Transmission Control Protocol) / IP(Internet Protocol) +TCP ํ”„๋กœํ† ์ฝœ์„ ์ž์ฃผ ์‚ฌ์šฉํ•˜๋ฉด์„œ๋„ CS ์ง€์‹์œผ๋กœ ์—ฐ๊ฒฐ๋˜๋Š” ๋ถ€๋ถ„์ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ •๋ฆฌํ•˜๊ณ ์ž ํ•œ๋‹ค.
+ +TCP/IP ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด์„œ ํ•ด๋‹น ์ง€์‹์„ ์ •ํ™•ํ•˜๊ฒŒ ์•Œ์ง€ ๋ชปํ•˜๋Š” ๊ฒƒ์€ ์–ด๋ถˆ์„ฑ์„ค์ด๋‹ค.
+๋”ฐ๋ผ์„œ ์ƒ์„ธํžˆ ์•Œ์•„๋ณด๊ณ  ์ •๋ฆฌํ•˜๊ณ ์ž ํ•œ๋‹ค.
+ +## TCP/IP ๋ž€? +์ „์†ก ์ œ์–ด ํ”„๋กœํ† ์ฝœ์˜ ์•ฝ์ž๋กœ, ์ธํ„ฐ๋„ท ํ”„๋กœํ† ์ฝœ ์Šค์œ„ํ”„ํŠธ(IP)์˜ ํ•ต์‹ฌ ํ”„๋กœํ† ์ฝœ ์ค‘ ํ•˜๋‚˜๋กœ, IP์™€ ํ•จ๊ป˜ TCP/IP๋ผ๋Š” ๋ช…์นญ์œผ๋กœ ๋ถˆ๋ฆฐ๋‹ค.
+ +TCP/IP ๋ฅผ ์‚ฌ์šฉํ•˜๊ฒ ๋‹ค๋Š” ๊ฒƒ์€ **IP** ์ฃผ์†Œ ์ฒด๊ณ„๋ฅผ ๋”ฐ๋ฅด๊ณ  IP Routing์„ ์ด์šฉํ•ด ๋ชฉ์ ์ง€์— ๋„๋‹ฌํ•˜๋ฉฐ **TCP** ์˜ ํŠน์„ฑ์„ ํ™œ์šฉํ•ด ์†ก์‹ ์ž์™€ ์ˆ˜์‹ ์ž์˜ ๋…ผ๋ฆฌ์  ์—ฐ๊ฒฐ์„ ์ƒ์„ฑํ•˜๊ณ  ์‹ ๋ขฐ์„ฑ์„ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๊ฒ ๋‹ค๋Š” ์˜๋ฏธ์ด๋‹ค. ์ฆ‰, TCP/IP๋ฅผ ๋งํ•œ๋‹ค๋Š” ๊ฒƒ์€ ์†ก์‹ ์ž๊ฐ€ ์ˆ˜์‹ ์ž์—๊ฒŒ IP ์ฃผ์†Œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌํ•˜๊ณ  ๊ทธ ๋ฐ์ดํ„ฐ๊ฐ€ ์ œ๋Œ€๋กœ ๋„๋‹ฌํ–ˆ๋Š”์ง€, ๋„ˆ๋ฌด ๋น ๋ฅด์ง„ ์•Š์•˜๋Š”์ง€, ๋ฐ›์•˜๋‹ค๋Š” ์‘๋‹ต์ด ์˜ค๋Š”์ง€์— ๋Œ€ํ•œ ์ด์•ผ๊ธฐ๋ฅผ ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.
+ +> Transport Layer(4 Layer) +>> ์†ก์‹ ์ž์™€ ์ˆ˜์‹ ์ž์˜ ๋…ผ๋ฆฌ์  ์—ฐ๊ฒฐ์„ ๋‹ด๋‹นํ•˜๋Š” ๋ถ€๋ถ„์œผ๋กœ, ์‹ ๋ขฐ์„ฑ ์žˆ๋Š” ์—ฐ๊ฒฐ์„ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ค๋‹ˆ๋‹ค. +>> ์ฆ‰ Endpoint(์‚ฌ์šฉ์ž) ๊ฐ„์˜ ์—ฐ๊ฒฐ์„ ์ƒ์„ฑํ•˜๊ณ  ๋ฐ์ดํ„ฐ๋ฅผ ์–ผ๋งˆ๋‚˜ ๋ณด๋ƒˆ๋Š”์ง€, ์–ผ๋งˆ๋‚˜ ๋ฐ›์•˜๋Š”์ง€, ์ œ๋Œ€๋กœ ๋ฐ›์•˜๋Š”์ง€ ๋“ฑ์„ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. +>> TCP์™€ UDP๊ฐ€ ๋Œ€ํ‘œ์ ์ž…๋‹ˆ๋‹ค. + +> Network Layer(3 Layer) +>> IP(Internet Protocol)์ด ํ™œ์šฉ๋˜๋Š” ๋ถ€๋ถ„์œผ๋กœ, ํ•œ Endpoint๊ฐ€ ๋‹ค๋ฅธ Endpoint๋กœ ๊ฐ€๊ณ ์ž ํ•˜๋Š” ๊ฒฝ์šฐ ๊ฒฝ๋กœ์™€ ๋ชฉ์ ์ง€๋ฅผ ์ฐพ์•„์ค๋‹ˆ๋‹ค. +>> ์ด๋ฅผ Routing์ด๋ผ๊ณ  ํ•˜๋ฉฐ ๋Œ€์—ญ์ด ๋‹ค๋ฅธ IP๋“ค์ด ๋ชฉ์ ์ง€๋ฅผ ํ–ฅํ•ด ์ œ๋Œ€๋กœ ์ฐพ์•„๊ฐˆ ์ˆ˜ ์žˆ๋„๋ก ๋•๋Š” ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค, + +> ์ถœ์ฒ˜ : OSI 7 Layer ์‰ฝ๊ฒŒ ์ดํ•ดํ•˜๊ธฐ +> [๋„คํŠธ์›Œํฌ ์—”์ง€๋‹ˆ์–ด ํ™˜์˜์˜ AWS ๊ธฐ์ˆ ๋ธ”๋กœ๊ทธ] + +์ธํ„ฐ๋„ท์—์„œ ๋ฌด์–ธ๊ฐ€๋ฅผ ๋‹ค์šด๋กœ๋“œํ•  ๋•Œ ์ค‘๊ฐ„์— ๋Š๊ธฐ๊ฑฐ๋‚˜ ๋น ์ง€๋Š” ๋ถ€๋ถ„ ์—†์ด ์™„๋ฒฝํ•˜๊ฒŒ ๋ฐ›์„ ์ˆ˜ ์žˆ๋Š” ์ด์œ ๋„ TCP์˜ ์ด๋Ÿฌํ•œ ํŠน์„ฑ ๋•๋ถ„์ด๋‹ค. +๊ทธ๋ ‡๊ฒŒ ๋•Œ๋ฌธ์— ์œ„์—์„œ ์–ธ๊ธ‰ํ•œ ๊ฒƒ์ฒ˜๋Ÿผ HTTP, HTTPS, FTP, SMTP ๋“ฑ๊ณผ ๊ฐ™์ด ๋ฐ์ดํ„ฐ๋ฅผ ์•ˆ์ •์ ์œผ๋กœ ๋ชจ๋‘ ๋ณด๋‚ด๋Š” ๊ฒƒ์„ ์ค‘์š”์‹œํ•˜๋Š” ํ”„๋กœํ† ์ฝœ๋“ค์˜ ๊ธฐ๋ฐ˜์ด ๋œ๋‹ค.
+TCP๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๋Š” ํ”„๋กœํ† ์ฝœ๋“ค์€ TCP์˜ `3-way handshake`๋ฅผ ๊ฑฐ์นœ ํ›„, ๊ฐ์ž ํ”„๋กœํ† ์ฝœ(Layer 7)์— ๊ธฐ๋ฐ˜ํ•œ ๊ตํ™˜ ๊ณผ์ •์„ ๊ฑฐ์นœ๋‹ค๋Š” ์˜๋ฏธ์ด๋‹ค.
+ +![SSL Handshake](https://cf-assets.www.cloudflare.com/slt3lc6tev37/5aYOr5erfyNBq20X5djTco/3c859532c91f25d961b2884bf521c1eb/tls-ssl-handshake.png) + +์œ„ ์ด๋ฏธ์ง€๋Š” TCP ๊ธฐ๋ฐ˜์˜ ํ”„๋กœํ† ์ฝœ์ธ HTTPS์˜ `SSL handshake`๋ฅผ ๋„์‹ํ™”ํ•œ ๊ฒƒ์ด๋‹ค.
+TCP๋Š” 4 Layer์ด๊ณ  HTTPS๋Š” 7 Layer ์ด๋‹ค.
+ +ํŒŒ๋ž€์ƒ‰ ๋ถ€๋ถ„์€ TCP์˜ `3-way handshake`์ด๊ณ , ๋…ธ๋ž€์ƒ‰ ๋ถ€๋ถ„์€ HTTPS์˜ `SSL handshake`์ด๋‹ค.
+HTTPS๋Š” TCP ๊ธฐ๋ฐ˜์ด๊ธฐ ๋•Œ๋ฌธ์— SSL handshake์— ์•ž์„œ 3-way handshake๋ฅผ ํ•˜๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.
+ +## TCP ๊ฐœ์š” +TCP๋Š” OSI 7 Layer ์ค‘์— 4 ๊ณ„์ธต์— ํ•ด๋‹นํ•œ๋‹ค. IP๊ฐ€ ๊ทธ์ € ๋ชฉ์ ์ง€๋ฅผ ์ œ๋Œ€๋กœ ์ฐพ์•„๊ฐ€๋Š” ๊ฒƒ์— ์ค‘์ ์„ ๋‘”๋‹ค๋ฉด, TCP๋Š” ํ†ต์‹ ํ•˜๊ณ ์ž ํ•˜๋Š” ์–‘์ชฝ ๋‹จ๋ง(Endpoint)์ด ํ†ต์‹ ํ•  ์ค€๋น„๊ฐ€ ๋˜์—ˆ๋Š”์ง€, ๋ฐ์ดํ„ฐ๊ฐ€ ์ œ๋Œ€๋กœ ์ „์†ก๋˜์—ˆ๋Š”์ง€, ๋ฐ์ดํ„ฐ๊ฐ€ ๊ฐ€๋Š” ๋„์ค‘ ๋ณ€์งˆ๋˜์ง€๋Š” ์•Š์•˜๋Š”์ง€, ์ˆ˜์‹ ์ž๊ฐ€ ์–ผ๋งˆ๋‚˜ ๋ฐ›์•˜๊ณ  ๋น ์ง„ ๋ถ€๋ถ„์€ ์—†์—ˆ๋Š” ๋“ฑ์„ ์ ๊ฒ€ํ•œ๋‹ค.
+์ด๋Ÿฐ ์ •๋ณด๋Š” TCP Header์— ๋‹ด๊ฒจ ์žˆ์œผ๋ฉฐ SYN, ACK, FIN, RST, Source Port, Destination Port, Sequence Number, Window Size, Checksum ๋“ฑ๊ณผ ๊ฐ™์€ ์‹ ๋ขฐ์„ฑ ๋ณด์žฅ๊ณผ ํ๋ฆ„ ์ œ์–ด, ํ˜ผ์žก ์ œ์–ด์— ๊ด€์—ฌํ•  ์ˆ˜ ์žˆ๋Š” ์š”์†Œ๋“ค์„ ํฌํ•จํ•˜๊ณ  ์žˆ๋‹ค.
+๋˜ํ•œ IP Header์™€ TCP Header๋ฅผ ์ œ์™ธํ•œ TCP๊ฐ€ ์‹ค์„ ์ˆ˜ ์žˆ๋Š” ๋ฐ์ดํ„ฐ์˜ ํฌ๊ธฐ๋ฅผ `์„ธ๊ทธ๋จผํŠธ(Segment)`๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค.
+ +![TCP Header](https://images.velog.io/images/inourbubble2/post/d48725bc-6060-4688-8f0e-70530a9c0250/image.png) + +
`TCP Header์˜ ๊ตฌ์กฐ(์ถœ์ฒ˜: Wikipedia)`
+ +TCP๋Š” IP์˜ ์ •๋ณด๋“ค๋ฟ๋งŒ ์•„๋‹ˆ๋ผ Port๋ฅผ ์ด์šฉํ•˜์—ฌ ์—ฐ๊ฒฐํ•œ๋‹ค. ํ•œ ์ชฝ ๋‹จ๋ง(Endpoint)์— ๋„์ฐฉํ•œ ๋ฐ์ดํ„ฐ๊ฐ€ ์–ด๋А ์ž…๊ตฌ(Port)๋กœ ๋“ค์–ด๊ฐ€์•ผ ํ•˜๋Š”์ง€ ์•Œ์•„์•ผ ์—ฐ๊ฒฐ์„ ์‹œ๋„ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
diff --git a/src/content/blog/study/java/2022-04-03-java-start.md b/src/content/blog/study/java/2022-04-03-java-start.md new file mode 100644 index 0000000..b71b011 --- /dev/null +++ b/src/content/blog/study/java/2022-04-03-java-start.md @@ -0,0 +1,17 @@ +--- +title: JAVA์— ์ •๋ฆฌ ์Šคํƒ€ํŠธ +date: 2022-04-03 +tags: java, ๊ณต๋ถ€ +excerpt: JAVA์— ๋Œ€ํ•œ ์ •๋ฆฌ์™€ ๊ณต๋ถ€ +--- +# JAVA์— ๋Œ€ํ•ด์„œ + - JAVA์— ๋Œ€ํ•œ ๊ธฐ๋ณธ ์ •๋ฆฌ์™€ ๊ณต๋ถ€ ๋‚ด์šฉ + +### ์ž‘์„ฑ๋˜๋Š” ๊ธ€ +์ด ๋””๋ ‰ํ† ๋ฆฌ์—๋Š” ์ž๋ฐ”์— ๋Œ€ํ•ด์„œ ๊ณต๋ถ€ํ•˜๊ณ  ๋‚ด์šฉ์„ ์ •๋ฆฌํ•˜๋ฉด์„œ ๋‚ด๊ฐ€ ์ดํ•ดํ•œ ๋‚ด์šฉ์„ ์ž‘์„ฑํ•˜๋Š” ์ €์žฅ์†Œ์ด๋‹ค. + +์ž๋ฐ”๋Š” ๋‚ด๊ฐ€ ํ•™๋ถ€ ์ƒํ™œ์„ ์‹œ์ž‘ํ•˜๋ฉด์„œ ์ง€๊ธˆ๊นŒ์ง€ ๊พธ์ค€ํžˆ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋Š” ์–ธ์–ด์ด๋‹ค. ๊ฐ์ฒด์ง€ํ–ฅ์ด๋ผ๋Š” ๊ฐœ๋…์„ ๋ฐฐ์šฐ๋ฉด์„œ๋ถ€ํ„ฐ ์ž๋ฐ”์˜ ๋งค๋ ฅ์— ๋น ์กŒ๊ณ , ์ด๊ฒƒ์„ ๋ฐฐ์šฐ๋ฉด์„œ ๊ณต๋ชจ์ „์—๋„ ๋‚˜๊ฐˆ ์ˆ˜ ์žˆ์„ ์ •๋„๋กœ ์‹ค๋ ฅ์„ ํ‚ค์›Œ๋ณด๊ธฐ๋„ํ•˜๊ณ  SPRING์„ ๋ฐฐ์šฐ๋ฉด์„œ ์ž๋ฐ”์˜ ๋‹ค๋ฅธ ๋งค๋ ฅ์— ๋Œ€ํ•ด์„œ๋„ ๊ณต๋ถ€ํ•ด๋ณธ ๊ฒฝํ—˜์ด ์žˆ๋‹ค. + +๋˜ํ•œ, ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ž๋ฐ”๋กœ ํ•˜๋ฉด์„œ ์ง€๊ธˆ๊นŒ์ง€ ๊ณต๋ถ€ํ–ˆ๋˜ ๋‚ด์šฉ์„ ์žŠ๊ธฐ ์ „์— ๋‹ค์‹œ ํ•œ ๋ฒˆ ์ •๋ฆฌํ•ด๋ณด์ž๊ณ  ์ƒ๊ฐ์ด ๋“ค์–ด์„œ ์ด ์นดํ…Œ๊ณ ๋ฆฌ๋ฅผ ๋งŒ๋“ค์—ˆ๋‹ค. + +์ •๋ฆฌํ•˜๋ฉด์„œ ์žŠ๊ณ  ์žˆ์—ˆ๋˜ ๋‚ด์šฉ์ด๋‚˜ ๋ถ€์กฑํ–ˆ๋˜ ์ง€์‹์— ๋Œ€ํ•ด์„œ ๊นจ๋‹ซ๊ณ  ๋ฐฐ์šฐ๋ฉฐ ๊ฝ‰ ์ฑ„์šธ ์ˆ˜ ์žˆ์—ˆ์œผ๋ฉด ํ•œ๋‹ค. diff --git a/src/content/blog/study/java/2022-04-04-java-memory.md b/src/content/blog/study/java/2022-04-04-java-memory.md new file mode 100644 index 0000000..a6d961d --- /dev/null +++ b/src/content/blog/study/java/2022-04-04-java-memory.md @@ -0,0 +1,66 @@ +--- +title: JAVA์˜ ๋ฉ”๋ชจ๋ฆฌ์— ๋Œ€ํ•ด์„œ +date: 2022-04-04 +tags: java, ๊ณต๋ถ€ +excerpt: JAVA์˜ ๋ฉ”๋ชจ๋ฆฌ ๊ตฌ์กฐ์— ๋Œ€ํ•œ ์ •๋ฆฌ +--- +# JAVA์˜ ๋ฉ”๋ชจ๋ฆฌ? JAVA์˜ ๋ฉ”๋ชจ๋ฆฌ ๊ตฌ์กฐ์— ๋Œ€ํ•œ ์ดํ•ด + - JAVA์˜ ๋ฉ”๋ชจ๋ฆฌ ๊ตฌ์กฐ์— ๋Œ€ํ•ด์„œ ์ดํ•ดํ•ด๋ณด๋Š” ์‹œ๊ฐ„์„ ๊ฐ€์ ธ๋ณธ๋‹ค. + +## JVM์ด๋ž€? +JAVA์˜ ๋ฉ”๋ชจ๋ฆฌ ๊ตฌ์กฐ์— ๋Œ€ํ•ด์„œ ์„ค๋ช…ํ•˜๊ธฐ ์ „์— JVM์ด ๋ฌด์—‡์ธ์ง€ ์•Œ์•„์•ผ ํ•œ๋‹ค. +JVM์€ Java Virtual Machine์˜ ์•ฝ์ž๋กœ, ์ž๋ฐ” ๊ฐ€์ƒ ๋จธ์‹ ์ด๋ผ๊ณ  ๋ถˆ๋ฆฐ๋‹ค. +์ž๋ฐ”์˜ ์šด์˜์ฒด์ œ ์‚ฌ์ด์—์„œ ์ค‘๊ฐœ์ž ์—ญํ• ์„ ์ˆ˜ํ–‰ํ•˜๋ฉฐ, ์ž๋ฐ”๊ฐ€ ์šด์˜์ฒด์ œ์— ๊ตฌ์•  ๋ฐ›์ง€ ์•Š๊ณ  ํ”„๋กœ๊ทธ๋žจ์„ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ฃผ๋Š” ์—ญํ• ์„ ์ˆ˜ํ–‰ํ•œ๋‹ค. +๋˜ํ•œ, GC(Garbage Collector)๋ฅผ ์‚ฌ์šฉํ•œ ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ๋„ ์ž๋™์œผ๋กœ ์ˆ˜ํ–‰ํ•˜๋ฉฐ ๋‹ค๋ฅธ ํ•˜๋“œ์›จ์–ด์™€ ๋‹ค๋ฅด๊ฒŒ ๋ ˆ์ง€์Šคํ„ฐ ๊ธฐ๋ฐ˜์ด ์•„๋‹Œ ์Šคํƒ ๊ธฐ๋ฐ˜์œผ๋กœ ๋™์ž‘ํ•œ๋‹ค. + +![image]() + +๋จผ์ €, ์ž๋ฐ” ์ปดํŒŒ์ผ๋Ÿฌ์— ์˜ํ•ด ์ž๋ฐ” ์†Œ์Šค ํŒŒ์ผ์€ ๋ฐ”์ดํŠธ ์ฝ”๋“œ๋กœ ๋ณ€ํ™˜๋œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ด๋Ÿฌํ•œ ๋ฐ”์ดํŠธ ์ฝ”๋“œ๋ฅผ JVM์—์„œ ์ฝ์–ด ๋“ค์ธ ๋‹ค์Œ์— ์ด๊ฒƒ์„ ๋ณต์žกํ•œ ๊ณผ์ •์„ ๊ฑฐ์ณ์„œ ์–ด๋–ค ์šด์˜์ฒด์ œ๋“ ๊ฐ„์— ํ”„๋กœ๊ทธ๋žจ์„ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋งŒ๋“ ๋‹ค. + +๋งŒ์•ฝ ์ž๋ฐ” ์†Œ์Šค ํŒŒ์ผ์€ ๋ฆฌ๋ˆ…์Šค์—์„œ ๋งŒ๋“ค์–ด์กŒ๊ณ , ์œˆ๋„์šฐ์—์„œ ์ด ํŒŒ์ผ์„ ์‹คํ–‰ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ์œˆ๋„์šฐ์šฉ JVM์„ ์„ค์น˜ํ•˜๊ธฐ๋งŒ ํ•˜๋ฉด ๋˜๋Š” ๊ฒƒ์ด๋‹ค! ์—ฌ๊ธฐ์„œ JVM์€ ์šด์˜์ฒด์ œ์— ์ข…์†ก์ ์ด๋ผ๋Š” ํŠน์ง•์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค. + +--- +## JVM ๋ฉ”๋ชจ๋ฆฌ ๊ตฌ์กฐ +์ด์ œ JVM์ด ๋ฌด์—‡์ธ์ง€, ์ž๋ฐ” ํ”„๋กœ๊ทธ๋žจ์˜ ์‹คํ–‰ ๋‹จ๊ณ„์— ๋Œ€ํ•ด์„œ ๊ฐ„๋žตํ•˜๊ฒŒ ์•Œ์•„๋ณด์•˜์œผ๋‹ˆ JVM์˜ ๊ตฌ์ฒด์ ์ธ ์ˆ˜ํ–‰ ๊ณผ์ •์— ๋Œ€ํ•ด์„œ ์ •ํ™•ํžˆ ์–ด๋–ค ๊ตฌ์กฐ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๊ณ  ์–ด๋–ป๊ฒŒ ๋™์ž‘์„ ํ•˜๋Š”์ง€ ์•Œ์•„๋ณด์ž. + +์•„๋ž˜๋Š” ์ž๋ฐ” ํ”„๋กœ๊ทธ๋žจ์˜ ์‹คํ–‰ ๋‹จ๊ณ„๋กœ, JVM์€ ํฌ๊ฒŒ 4๊ฐ€์ง€์˜ ๊ตฌ์กฐ๋กœ ๋‚˜๋ˆ„์–ด ๋ณผ ์ˆ˜ ์žˆ๋‹ค. + - Garbage Collector + - Execution Engine + - Class Loader + - Runtime Data Area + +![image]() + +๋‹ค์‹œ ํ•œ ๋ฒˆ ์–ธ๊ธ‰ํ•˜์ž๋ฉด, ์ž๋ฐ” ์†Œ์Šค ํŒŒ์ผ์€ ์ž๋ฐ” ์ปดํŒŒ์ผ๋Ÿฌ์— ์˜ํ•ด์„œ ๋ฐ”์ดํŠธ ์ฝ”๋“œ ํ˜•ํƒœ์ธ ํด๋ž˜์Šค ํŒŒ์ผ์ด ๋œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ด ํด๋ž˜์Šค ํŒŒ์ผ์€ ํด๋ž˜์Šค ๋กœ๋”๊ฐ€ ์ฝ์–ด๋“ค์ด๋ฉด์„œ JVM์ด ์ˆ˜ํ–‰๋œ๋‹ค. + +### Garbage Collector +Garbage Collector(GC)๋Š” ํž™(heap) ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์— ์ƒ์„ฑ๋œ ๊ฐ์ฒด๋“ค ์ค‘์—์„œ ์ฐธ์กฐ๋˜์ง€ ์•Š์€ ๊ฐ์ฒด๋“ค์„ ํƒ์ƒ‰ํ›„ ์ œ๊ฑฐํ•˜๋Š” ์—ญํ• ์„ ํ•œ๋‹ค. ์ด๋•Œ, GC๊ฐ€ ์—ญํ• ์„ ํ•˜๋Š” ์‹œ๊ฐ„์€ ์–ธ์ œ์ธ์ง€ ์ •ํ™•ํžˆ ์•Œ ์ˆ˜ ์—†๋‹ค. + +### Execution Engine +ํด๋ž˜์Šค ๋กœ๋”๋ฅผ ํ†ตํ•ด JVM ๋‚ด์˜ Runtime Data Area์— ๋ฐฐ์น˜๋œ ๋ฐ”์ดํŠธ ์ฝ”๋“œ๋“ค์„ ๋ช…๋ น์–ด ๋‹จ์œ„๋กœ ์ฝ์–ด์„œ ์‹คํ–‰ํ•œ๋‹ค. ์ตœ์ดˆ JVM์ด ๋‚˜์™”์„ ๋‹น์‹œ์—๋Š” ์ธํ„ฐํ”„๋ฆฌํ„ฐ ๋ฐฉ์‹์ด๋ผ๊ณ  ํ•˜๋Š”๋ฐ ์†๋„๊ฐ€ ๋А๋ฆฌ๋‹ค๋Š” ๋‹จ์ ์ด ์žˆ์—ˆ๊ธฐ ๋•Œ๋ฌธ์— JIT ์ปดํŒŒ์ผ๋Ÿฌ ๋ฐฉ์‹์„ ํ†ตํ•ด ์ด ์ ์ด ๋ณด์™„๋˜์—ˆ๋‹ค. +JIT๋Š” ๋ฐ”์ดํŠธ ์ฝ”๋“œ๋ฅผ ์–ด์…ˆ๋ธ”๋Ÿฌ ๊ฐ™์€ ๋„ค์ดํ‹ฐ๋ธŒ ์ฝ”๋“œ๋กœ ๋ฐ”๊ฟˆ์œผ๋กœ์จ ์‹คํ–‰์ด ๋น ๋ฅด์ง€๋งŒ ์—ญ์‹œ ๋ณ€ํ™˜ํ•˜๋Š”๋ฐ ๋น„์šฉ์ด ๋ฐœ์ƒํ–ˆ๋‹ค. ์ด ๊ฐ™์€ ์ด์œ ๋กœ JVM์€ ๋ชจ๋“  ์ฝ”๋“œ๋ฅผ JIT ์ปดํŒŒ์ผ๋Ÿฌ ๋ฐฉ์‹์œผ๋กœ ์‹คํ–‰ํ•˜์ง€ ์•Š๊ณ , ์ธํ„ฐํ”„๋ฆฌํ„ฐ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜๋‹ค๊ฐ€ ์ผ์ •ํ•œ ๊ธฐ์ค€์ด ๋„˜์–ด๊ฐ€๋ฉด JIT ์ปดํŒŒ์ผ๋Ÿฌ ๋ฐฉ์‹์œผ๋กœ ์‹คํ–‰ํ•œ๋‹ค. + +### Class Loader +JVM ๋‚ด๋กœ ํด๋ž˜์Šค ํŒŒ์ผ์„ ๋กœ๋“œํ•˜๊ณ , ๋งํฌ๋ฅผ ํ†ตํ•ด ๋ฐฐ์น˜ํ•˜๋Š” ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ชจ๋“ˆ์ด๋‹ค. ๋Ÿฐํƒ€์ž„ ์‹œ์— ๋™์ ์œผ๋กœ ํด๋ž˜์Šค๋ฅผ ๋กœ๋“œํ•œ๋‹ค. + +### Runtime Data Area +JVM์˜ ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์œผ๋กœ ์ž๋ฐ” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์‹คํ–‰ํ•  ๋•Œ ์‚ฌ์šฉ๋˜๋Š” ๋ฐ์ดํ„ฐ๋“ค์„ ์ ์žฌํ•˜๋Š” ์˜์—ญ์ด๋‹ค. +์ด ์˜์—ญ์€ ํฌ๊ฒŒ ์•„๋ž˜์™€ ๊ฐ™์ด ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ๋‹ค. + - Method Area + - ๋ชจ๋“  ์“ฐ๋ ˆ๋“œ๊ฐ€ ๊ณต์œ ํ•˜๋Š” ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ. ๋ฉ”์†Œ๋“œ ์˜์—ญ์€ ํด๋ž˜์Šค, ์ธํ„ฐํŽ˜์ด์Šค, ๋ฉ”์†Œ๋“œ, ํ•„๋“œ, Static ๋ณ€์ˆ˜ ๋“ฑ์˜ ๋ฐ”์ดํŠธ ์ฝ”๋“œ๋ฅผ ๋ณด๊ด€ํ•œ๋‹ค. + - Heap Area + - ๋ชจ๋“  ์“ฐ๋ ˆ๋“œ๊ฐ€ ๊ณต์œ ํ•˜๋ฉฐ, new ํ‚ค์›Œ๋“œ๋กœ ์ƒ์„ฑ๋œ ๊ฐ์ฒด์™€ ๋ฐฐ์—ด์ด ์ƒ์„ฑ๋˜๋Š” ์˜์—ญ์ด๋‹ค. + - ๋˜ํ•œ, ๋ฉ”์†Œ๋“œ ์˜์—ญ์— ๋กœ๋“œ๋œ ํด๋ž˜์Šค๋งŒ ์ƒ์„ฑ์ด ๊ฐ€๋Šฅํ•˜๊ณ  Garbage Collector๊ฐ€ ์ฐธ์กฐ๋˜์ง€ ์•Š๋Š” ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ™•์ธํ•˜๊ณ  ์ œ๊ฑฐํ•˜๋Š” ์˜์—ญ์ด๋‹ค. + - Stack Area + - ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ ์‹œ๋งˆ๋‹ค ๊ฐ๊ฐ์˜ ์Šคํƒ ํ”„๋ ˆ์ž„(๊ทธ ๋ฉ”์„œ๋“œ๋งŒ์„ ์œ„ํ•œ ๊ณต๊ฐ„)์„ ์ƒ์„ฑํ•œ๋‹ค. + - ๋ฉ”์„œ๋“œ ์•ˆ์—์„œ ์‚ฌ์šฉ๋˜๋Š” ๊ฐ’๋“ค์„ ์ €์žฅํ•˜๊ณ , ํ˜ธ์ถœ๋œ ๋ฉ”์„œ๋“œ์˜ ๋งค๊ฐœ๋ณ€์ˆ˜, ์ง€์—ญ๋ณ€์ˆ˜, ๋ฆฌํ„ด ๊ฐ’ ๋ฐ ์—ฐ์‚ฐ ์‹œ ์ผ์–ด๋‚˜๋Š” ๊ฐ’๋“ค์„ ์ž„์‹œ๋กœ ์ €์žฅํ•œ๋‹ค. + - ๋ฉ”์„œ๋“œ์˜ ์ˆ˜ํ–‰์ด ๋๋‚˜๋ฉด ํ”„๋ ˆ์ž„๋ณ„๋กœ ์‚ญ์ œํ•œ๋‹ค. + - PC Register + - ์“ฐ๋ ˆ๋“œ๊ฐ€ ์‹œ์ž‘๋  ๋•Œ ์ƒ์„ฑ๋˜๋ฉฐ, ์ƒ์„ฑ๋  ๋•Œ๋งˆ๋‹ค ์ƒ์„ฑ๋˜๋Š” ๊ณต๊ฐ„์œผ๋กœ ์“ฐ๋ ˆ๋“œ๋งˆ๋‹ค ํ•˜๋‚˜์”ฉ ์กด์žฌํ•œ๋‹ค. + - ์“ฐ๋ ˆ๋“œ๊ฐ€ ์–ด๋–ค ๋ถ€๋ถ„์„ ๋ฌด์Šจ ๋ช…๋ น์œผ๋กœ ์‹คํ–‰ํ•ด์•ผํ•  ์ง€์— ๋Œ€ํ•œ ๊ธฐ๋ก์„ ํ•˜๋Š” ๋ถ€๋ถ„์œผ๋กœ ํ˜„์žฌ ์ˆ˜ํ–‰์ค‘์ธ JVM ๋ช…๋ น์˜ ์ฃผ์†Œ๋ฅผ ๊ฐ–๋Š”๋‹ค. + - Native Method Stack + - ์ž๋ฐ” ์™ธ ์–ธ์–ด๋กœ ์ž‘์„ฑ๋œ ๋„ค์ดํ‹ฐ๋ธŒ ์ฝ”๋“œ๋ฅผ ์œ„ํ•œ ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์ด๋‹ค. + + +--- + diff --git a/src/content/blog/study/markdown/2022-04-05-markdown-emoji.md b/src/content/blog/study/markdown/2022-04-05-markdown-emoji.md new file mode 100644 index 0000000..5c376c0 --- /dev/null +++ b/src/content/blog/study/markdown/2022-04-05-markdown-emoji.md @@ -0,0 +1,339 @@ +--- +title: Markdown ์ด๋ชจ์ง€ +date: 2022-04-05 +tags: markdown, ๊ณต๋ถ€ +excerpt: Markdown ์ด๋ชจ์ง€ +--- +# Emoji ์ด๋ชจํ‹ฐ์ฝ˜ + - ๋งˆํฌ๋‹ค์šด์„ ์ด์šฉํ•ด ์ด๋ชจํ‹ฐ์ฝ˜์„ ํ‘œํ˜„ ๊ฐ€๋Šฅํ•˜๋‹ค. + - ๊นƒํ—ˆ๋ธŒ๋„ ๋ฌธ์ œ์—†์ด ์ ์šฉ ๊ฐ€๋Šฅํ•˜๋‹ค. + - ๋งˆํฌ๋‹ค์šด ๋ฌธ๋ฒ•์— :: ์‚ฌ์ด์— **์ด๋ชจํ‹ฐ์ฝ˜๋ช…**์„ ๋„ฃ์œผ๋ฉด ์ž๋™์œผ๋กœ ์ธ์‹๋œ๋‹ค. :rocket: + +```markdown +GitHub supports emoji! + +# :+1: + +## :sparkles: + +* :camel: + +1. :tada: + +:rocket: :metal: +``` + +--- + +# ๋งˆํฌ๋‹ค์šด ์ด๋ชจ์ง€ ์ข…๋ฅ˜ +## [People] + +| 1 | 2 | 3 | +| :---: | :---: | :---: | +| :bowtie: :bowtie: | ๐Ÿ˜„ :smile: | ๐Ÿ˜† :laughing: | +| ๐Ÿ˜Š :blush: | ๐Ÿ˜ƒ :smiley: | โ˜บ๏ธ :relaxed: | +| ๐Ÿ˜ :smirk: | ๐Ÿ˜ :heart_eyes: | ๐Ÿ˜˜ :kissing_heart: | +| ๐Ÿ˜š :kissing_closed_eyes: | ๐Ÿ˜ณ :flushed: | ๐Ÿ˜Œ :relieved: | +| ๐Ÿ˜† :satisfied: | ๐Ÿ˜ :grin: | ๐Ÿ˜‰ :wink: | +| ๐Ÿ˜œ :stuck_out_tongue_winking_eye: | ๐Ÿ˜ :stuck_out_tongue_closed_eyes: | ๐Ÿ˜€ :grinning: | +| ๐Ÿ˜— :kissing: | ๐Ÿ˜™ :kissing_smiling_eyes: | ๐Ÿ˜› :stuck_out_tongue: | +| ๐Ÿ˜ด :sleeping: | ๐Ÿ˜Ÿ :worried: | ๐Ÿ˜ฆ :frowning: | +| ๐Ÿ˜ง :anguished: | ๐Ÿ˜ฎ :open_mouth: | ๐Ÿ˜ฌ :grimacing: | +| ๐Ÿ˜• :confused: | ๐Ÿ˜ฏ :hushed: | ๐Ÿ˜‘ :expressionless: | +| ๐Ÿ˜’ :unamused: | ๐Ÿ˜… :sweat_smile: | ๐Ÿ˜“ :sweat: | +| ๐Ÿ˜ฅ :disappointed_relieved: | ๐Ÿ˜ฉ :weary: | ๐Ÿ˜” :pensive: | +| ๐Ÿ˜ž :disappointed: | ๐Ÿ˜– :confounded: | ๐Ÿ˜จ :fearful: | +| ๐Ÿ˜ฐ :cold_sweat: | ๐Ÿ˜ฃ :persevere: | ๐Ÿ˜ข :cry: | +| ๐Ÿ˜ญ :sob: | ๐Ÿ˜‚ :joy: | ๐Ÿ˜ฒ :astonished: | +| ๐Ÿ˜ฑ :scream: | :neckbeard: :neckbeard: | ๐Ÿ˜ซ :tired_face: | +| ๐Ÿ˜  :angry: | ๐Ÿ˜ก :rage: | ๐Ÿ˜ค :triumph: | +| ๐Ÿ˜ช :sleepy: | ๐Ÿ˜‹ :yum: | ๐Ÿ˜ท :mask: | +| ๐Ÿ˜Ž :sunglasses: | ๐Ÿ˜ต :dizzy_face: | ๐Ÿ‘ฟ :imp: | +| ๐Ÿ˜ˆ :smiling_imp: | ๐Ÿ˜ :neutral_face: | ๐Ÿ˜ถ :no_mouth: | +| ๐Ÿ˜‡ :innocent: | ๐Ÿ‘ฝ :alien: | ๐Ÿ’› :yellow_heart: | +| ๐Ÿ’™ :blue_heart: | ๐Ÿ’œ :purple_heart: | โค๏ธ :heart: | +| ๐Ÿ’š :green_heart: | ๐Ÿ’” :broken_heart: | ๐Ÿ’“ :heartbeat: | +| ๐Ÿ’— :heartpulse: | ๐Ÿ’• :two_hearts: | ๐Ÿ’ž :revolving_hearts: | +| ๐Ÿ’˜ :cupid: | ๐Ÿ’– :sparkling_heart: | โœจ :sparkles: | +| โญ๏ธ :star: | ๐ŸŒŸ :star2: | ๐Ÿ’ซ :dizzy: | +| ๐Ÿ’ฅ :boom: | ๐Ÿ’ฅ :collision: | ๐Ÿ’ข :anger: | +| โ—๏ธ :exclamation: | โ“ :question: | โ• :grey_exclamation: | +| โ” :grey_question: | ๐Ÿ’ค :zzz: | ๐Ÿ’จ :dash: | +| ๐Ÿ’ฆ :sweat_drops: | ๐ŸŽถ :notes: | ๐ŸŽต :musical_note: | +| ๐Ÿ”ฅ :fire: | ๐Ÿ’ฉ :hankey: | ๐Ÿ’ฉ :poop: | +| ๐Ÿ’ฉ :shit: | ๐Ÿ‘ :+1: | ๐Ÿ‘ :thumbsup: | +| ๐Ÿ‘Ž :-1: | ๐Ÿ‘Ž :thumbsdown: | ๐Ÿ‘Œ :ok_hand: | +| ๐Ÿ‘Š :punch: | ๐Ÿ‘Š :facepunch: | โœŠ :fist: | +| โœŒ๏ธ :v: | ๐Ÿ‘‹ :wave: | โœ‹ :hand: | +| โœ‹ :raised_hand: | ๐Ÿ‘ :open_hands: | โ˜๏ธ :point_up: | +| ๐Ÿ‘‡ :point_down: | ๐Ÿ‘ˆ :point_left: | ๐Ÿ‘‰ :point_right: | +| ๐Ÿ™Œ :raised_hands: | ๐Ÿ™ :pray: | ๐Ÿ‘† :point_up_2: | +| ๐Ÿ‘ :clap: | ๐Ÿ’ช :muscle: | ๐Ÿค˜ :metal: | +| ๐Ÿ–• :fu: | ๐Ÿšถ :walking: | ๐Ÿƒ :runner: | +| ๐Ÿƒ :running: | ๐Ÿ‘ซ :couple: | ๐Ÿ‘ช :family: | +| ๐Ÿ‘ฌ :two_men_holding_hands: | ๐Ÿ‘ญ :two_women_holding_hands: | ๐Ÿ’ƒ :dancer: | +| ๐Ÿ‘ฏ :dancers: | ๐Ÿ™† :ok_woman: | ๐Ÿ™… :no_good: | +| ๐Ÿ’ :information_desk_person: | ๐Ÿ™‹ :raising_hand: | ๐Ÿ‘ฐ :bride_with_veil: | +| ๐Ÿ™Ž :person_with_pouting_face: | ๐Ÿ™ :person_frowning: | ๐Ÿ™‡ :bow: | +| :couplekiss: :couplekiss: | ๐Ÿ’‘ :couple_with_heart: | ๐Ÿ’† :massage: | +| ๐Ÿ’‡ :haircut: | ๐Ÿ’… :nail_care: | ๐Ÿ‘ฆ :boy: | +| ๐Ÿ‘ง :girl: | ๐Ÿ‘ฉ :woman: | ๐Ÿ‘จ :man: | +| ๐Ÿ‘ถ :baby: | ๐Ÿ‘ต :older_woman: | ๐Ÿ‘ด :older_man: | +| ๐Ÿ‘ฑ :person_with_blond_hair: | ๐Ÿ‘ฒ :man_with_gua_pi_mao: | ๐Ÿ‘ณ :man_with_turban: | +| ๐Ÿ‘ท :construction_worker: | ๐Ÿ‘ฎ :cop: | ๐Ÿ‘ผ :angel: | +| ๐Ÿ‘ธ :princess: | ๐Ÿ˜บ :smiley_cat: | ๐Ÿ˜ธ :smile_cat: | +| ๐Ÿ˜ป :heart_eyes_cat: | ๐Ÿ˜ฝ :kissing_cat: | ๐Ÿ˜ผ :smirk_cat: | +| ๐Ÿ™€ :scream_cat: | ๐Ÿ˜ฟ :crying_cat_face: | ๐Ÿ˜น :joy_cat: | +| ๐Ÿ˜พ :pouting_cat: | ๐Ÿ‘น :japanese_ogre: | ๐Ÿ‘บ :japanese_goblin: | +| ๐Ÿ™ˆ :see_no_evil: | ๐Ÿ™‰ :hear_no_evil: | ๐Ÿ™Š :speak_no_evil: | +| ๐Ÿ’‚ :guardsman: | ๐Ÿ’€ :skull: | ๐Ÿพ :feet: | +| ๐Ÿ‘„ :lips: | ๐Ÿ’‹ :kiss: | ๐Ÿ’ง :droplet: | +| ๐Ÿ‘‚ :ear: | ๐Ÿ‘€ :eyes: | ๐Ÿ‘ƒ :nose: | +| ๐Ÿ‘… :tongue: | ๐Ÿ’Œ :love_letter: | ๐Ÿ‘ค :bust_in_silhouette: | +| ๐Ÿ‘ฅ :busts_in_silhouette: | ๐Ÿ’ฌ :speech_balloon: | ๐Ÿ’ญ :thought_balloon: | +| :feelsgood: :feelsgood: | :finnadie: :finnadie: | :goberserk: :goberserk: | +| :godmode: :godmode: | :hurtrealbad: :hurtrealbad: | :rage1: :rage1: | +| :rage2: :rage2: | :rage3: :rage3: | :rage4: :rage4: | +| :suspect: :suspect: | :trollface: :trollface: | + + +## [Nature] +โ˜€๏ธ :sunny: โ˜”๏ธ :umbrella: โ˜๏ธ :cloud: +โ„๏ธ :snowflake: โ›„๏ธ :snowman: โšก๏ธ :zap: +๐ŸŒ€ :cyclone: ๐ŸŒ :foggy: ๐ŸŒŠ :ocean: +๐Ÿฑ :cat: ๐Ÿถ :dog: ๐Ÿญ :mouse: +๐Ÿน :hamster: ๐Ÿฐ :rabbit: ๐Ÿบ :wolf: +๐Ÿธ :frog: ๐Ÿฏ :tiger: ๐Ÿจ :koala: +๐Ÿป :bear: ๐Ÿท :pig: ๐Ÿฝ :pig_nose: +๐Ÿฎ :cow: ๐Ÿ— :boar: ๐Ÿต :monkey_face: +๐Ÿ’ :monkey: ๐Ÿด :horse: ๐ŸŽ :racehorse: +๐Ÿซ :camel: ๐Ÿ‘ :sheep: ๐Ÿ˜ :elephant: +๐Ÿผ :panda_face: ๐Ÿ :snake: ๐Ÿฆ :bird: +๐Ÿค :baby_chick: ๐Ÿฅ :hatched_chick: ๐Ÿฃ :hatching_chick: +๐Ÿ” :chicken: ๐Ÿง :penguin: ๐Ÿข :turtle: +๐Ÿ› :bug: ๐Ÿ :honeybee: ๐Ÿœ :ant: +๐Ÿž :beetle: ๐ŸŒ :snail: ๐Ÿ™ :octopus: +๐Ÿ  :tropical_fish: ๐ŸŸ :fish: ๐Ÿณ :whale: +๐Ÿ‹ :whale2: ๐Ÿฌ :dolphin: ๐Ÿ„ :cow2: +๐Ÿ :ram: ๐Ÿ€ :rat: ๐Ÿƒ :water_buffalo: +๐Ÿ… :tiger2: ๐Ÿ‡ :rabbit2: ๐Ÿ‰ :dragon: +๐Ÿ :goat: ๐Ÿ“ :rooster: ๐Ÿ• :dog2: +๐Ÿ– :pig2: ๐Ÿ :mouse2: ๐Ÿ‚ :ox: +๐Ÿฒ :dragon_face: ๐Ÿก :blowfish: ๐ŸŠ :crocodile: +๐Ÿช :dromedary_camel: ๐Ÿ† :leopard: ๐Ÿˆ :cat2: +๐Ÿฉ :poodle: ๐Ÿพ :paw_prints: ๐Ÿ’ :bouquet: +๐ŸŒธ :cherry_blossom: ๐ŸŒท :tulip: ๐Ÿ€ :four_leaf_clover: +๐ŸŒน :rose: ๐ŸŒป :sunflower: ๐ŸŒบ :hibiscus: +๐Ÿ :maple_leaf: ๐Ÿƒ :leaves: ๐Ÿ‚ :fallen_leaf: +๐ŸŒฟ :herb: ๐Ÿ„ :mushroom: ๐ŸŒต :cactus: +๐ŸŒด :palm_tree: ๐ŸŒฒ :evergreen_tree: ๐ŸŒณ :deciduous_tree: +๐ŸŒฐ :chestnut: ๐ŸŒฑ :seedling: ๐ŸŒผ :blossom: +๐ŸŒพ :ear_of_rice: ๐Ÿš :shell: ๐ŸŒ :globe_with_meridians: +๐ŸŒž :sun_with_face: ๐ŸŒ :full_moon_with_face: ๐ŸŒš :new_moon_with_face: +๐ŸŒ‘ :new_moon: ๐ŸŒ’ :waxing_crescent_moon: ๐ŸŒ“ :first_quarter_moon: +๐ŸŒ” :waxing_gibbous_moon: ๐ŸŒ• :full_moon: ๐ŸŒ– :waning_gibbous_moon: +๐ŸŒ— :last_quarter_moon: ๐ŸŒ˜ :waning_crescent_moon: ๐ŸŒœ :last_quarter_moon_with_face: +๐ŸŒ› :first_quarter_moon_with_face: ๐ŸŒ” :moon: ๐ŸŒ :earth_africa: +๐ŸŒŽ :earth_americas: ๐ŸŒ :earth_asia: ๐ŸŒ‹ :volcano: +๐ŸŒŒ :milky_way: โ›…๏ธ :partly_sunny: :octocat: :octocat: +:shipit: :squirrel: + + +## [Objects] +๐ŸŽ :bamboo: ๐Ÿ’ :gift_heart: ๐ŸŽŽ :dolls: +๐ŸŽ’ :school_satchel: ๐ŸŽ“ :mortar_board: ๐ŸŽ :flags: +๐ŸŽ† :fireworks: ๐ŸŽ‡ :sparkler: ๐ŸŽ :wind_chime: +๐ŸŽ‘ :rice_scene: ๐ŸŽƒ :jack_o_lantern: ๐Ÿ‘ป :ghost: +๐ŸŽ… :santa: ๐ŸŽ„ :christmas_tree: ๐ŸŽ :gift: +๐Ÿ”” :bell: ๐Ÿ”• :no_bell: ๐ŸŽ‹ :tanabata_tree: +๐ŸŽ‰ :tada: ๐ŸŽŠ :confetti_ball: ๐ŸŽˆ :balloon: +๐Ÿ”ฎ :crystal_ball: ๐Ÿ’ฟ :cd: ๐Ÿ“€ :dvd: +๐Ÿ’พ :floppy_disk: ๐Ÿ“ท :camera: ๐Ÿ“น :video_camera: +๐ŸŽฅ :movie_camera: ๐Ÿ’ป :computer: ๐Ÿ“บ :tv: +๐Ÿ“ฑ :iphone: โ˜Ž๏ธ :phone: โ˜Ž๏ธ :telephone: +๐Ÿ“ž :telephone_receiver: ๐Ÿ“Ÿ :pager: ๐Ÿ“  :fax: +๐Ÿ’ฝ :minidisc: ๐Ÿ“ผ :vhs: ๐Ÿ”‰ :sound: +๐Ÿ”ˆ :speaker: ๐Ÿ”‡ :mute: ๐Ÿ“ข :loudspeaker: +๐Ÿ“ฃ :mega: โŒ›๏ธ :hourglass: โณ :hourglass_flowing_sand: +โฐ :alarm_clock: โŒš๏ธ :watch: ๐Ÿ“ป :radio: +๐Ÿ“ก :satellite: โžฟ :loop: ๐Ÿ” :mag: +๐Ÿ”Ž :mag_right: ๐Ÿ”“ :unlock: ๐Ÿ”’ :lock: +๐Ÿ” :lock_with_ink_pen: ๐Ÿ” :closed_lock_with_key: ๐Ÿ”‘ :key: +๐Ÿ’ก :bulb: ๐Ÿ”ฆ :flashlight: ๐Ÿ”† :high_brightness: +๐Ÿ”… :low_brightness: ๐Ÿ”Œ :electric_plug: ๐Ÿ”‹ :battery: +๐Ÿ“ฒ :calling: โœ‰๏ธ :email: ๐Ÿ“ซ :mailbox: +๐Ÿ“ฎ :postbox: ๐Ÿ›€ :bath: ๐Ÿ› :bathtub: +๐Ÿšฟ :shower: ๐Ÿšฝ :toilet: ๐Ÿ”ง :wrench: +๐Ÿ”ฉ :nut_and_bolt: ๐Ÿ”จ :hammer: ๐Ÿ’บ :seat: +๐Ÿ’ฐ :moneybag: ๐Ÿ’ด :yen: ๐Ÿ’ต :dollar: +๐Ÿ’ท :pound: ๐Ÿ’ถ :euro: ๐Ÿ’ณ :credit_card: +๐Ÿ’ธ :money_with_wings: ๐Ÿ“ง :e-mail: ๐Ÿ“ฅ :inbox_tray: +๐Ÿ“ค :outbox_tray: โœ‰๏ธ :envelope: ๐Ÿ“จ :incoming_envelope: +๐Ÿ“ฏ :postal_horn: ๐Ÿ“ช :mailbox_closed: ๐Ÿ“ฌ :mailbox_with_mail: +๐Ÿ“ญ :mailbox_with_no_mail: ๐Ÿšช :door: ๐Ÿšฌ :smoking: +๐Ÿ’ฃ :bomb: ๐Ÿ”ซ :gun: ๐Ÿ”ช :hocho: +๐Ÿ’Š :pill: ๐Ÿ’‰ :syringe: ๐Ÿ“„ :page_facing_up: +๐Ÿ“ƒ :page_with_curl: ๐Ÿ“‘ :bookmark_tabs: ๐Ÿ“Š :bar_chart: +๐Ÿ“ˆ :chart_with_upwards_trend: ๐Ÿ“‰ :chart_with_downwards_trend: ๐Ÿ“œ :scroll: +๐Ÿ“‹ :clipboard: ๐Ÿ“† :calendar: ๐Ÿ“… :date: +๐Ÿ“‡ :card_index: ๐Ÿ“ :file_folder: ๐Ÿ“‚ :open_file_folder: +โœ‚๏ธ :scissors: ๐Ÿ“Œ :pushpin: ๐Ÿ“Ž :paperclip: +โœ’๏ธ :black_nib: โœ๏ธ :pencil2: ๐Ÿ“ :straight_ruler: +๐Ÿ“ :triangular_ruler: ๐Ÿ“• :closed_book: ๐Ÿ“— :green_book: +๐Ÿ“˜ :blue_book: ๐Ÿ“™ :orange_book: ๐Ÿ““ :notebook: +๐Ÿ“” :notebook_with_decorative_cover: ๐Ÿ“’ :ledger: ๐Ÿ“š :books: +๐Ÿ”– :bookmark: ๐Ÿ“› :name_badge: ๐Ÿ”ฌ :microscope: +๐Ÿ”ญ :telescope: ๐Ÿ“ฐ :newspaper: ๐Ÿˆ :football: +๐Ÿ€ :basketball: โšฝ๏ธ :soccer: โšพ๏ธ :baseball: +๐ŸŽพ :tennis: ๐ŸŽฑ :8ball: ๐Ÿ‰ :rugby_football: +๐ŸŽณ :bowling: โ›ณ๏ธ :golf: ๐Ÿšต :mountain_bicyclist: +๐Ÿšด :bicyclist: ๐Ÿ‡ :horse_racing: ๐Ÿ‚ :snowboarder: +๐ŸŠ :swimmer: ๐Ÿ„ :surfer: ๐ŸŽฟ :ski: +โ™ ๏ธ :spades: โ™ฅ๏ธ :hearts: โ™ฃ๏ธ :clubs: +โ™ฆ๏ธ :diamonds: ๐Ÿ’Ž :gem: ๐Ÿ’ :ring: +๐Ÿ† :trophy: ๐ŸŽผ :musical_score: ๐ŸŽน :musical_keyboard: +๐ŸŽป :violin: ๐Ÿ‘พ :space_invader: ๐ŸŽฎ :video_game: +๐Ÿƒ :black_joker: ๐ŸŽด :flower_playing_cards: ๐ŸŽฒ :game_die: +๐ŸŽฏ :dart: ๐Ÿ€„๏ธ :mahjong: ๐ŸŽฌ :clapper: +๐Ÿ“ :memo: ๐Ÿ“ :pencil: ๐Ÿ“– :book: +๐ŸŽจ :art: ๐ŸŽค :microphone: ๐ŸŽง :headphones: +๐ŸŽบ :trumpet: ๐ŸŽท :saxophone: ๐ŸŽธ :guitar: +๐Ÿ‘ž :shoe: ๐Ÿ‘ก :sandal: ๐Ÿ‘  :high_heel: +๐Ÿ’„ :lipstick: ๐Ÿ‘ข :boot: ๐Ÿ‘• :shirt: +๐Ÿ‘• :tshirt: ๐Ÿ‘” :necktie: ๐Ÿ‘š :womans_clothes: +๐Ÿ‘— :dress: ๐ŸŽฝ :running_shirt_with_sash: ๐Ÿ‘– :jeans: +๐Ÿ‘˜ :kimono: ๐Ÿ‘™ :bikini: ๐ŸŽ€ :ribbon: +๐ŸŽฉ :tophat: ๐Ÿ‘‘ :crown: ๐Ÿ‘’ :womans_hat: +๐Ÿ‘ž :mans_shoe: ๐ŸŒ‚ :closed_umbrella: ๐Ÿ’ผ :briefcase: +๐Ÿ‘œ :handbag: ๐Ÿ‘ :pouch: ๐Ÿ‘› :purse: +๐Ÿ‘“ :eyeglasses: ๐ŸŽฃ :fishing_pole_and_fish: โ˜•๏ธ :coffee: +๐Ÿต :tea: ๐Ÿถ :sake: ๐Ÿผ :baby_bottle: +๐Ÿบ :beer: ๐Ÿป :beers: ๐Ÿธ :cocktail: +๐Ÿน :tropical_drink: ๐Ÿท :wine_glass: ๐Ÿด :fork_and_knife: +๐Ÿ• :pizza: ๐Ÿ” :hamburger: ๐ŸŸ :fries: +๐Ÿ— :poultry_leg: ๐Ÿ– :meat_on_bone: ๐Ÿ :spaghetti: +๐Ÿ› :curry: ๐Ÿค :fried_shrimp: ๐Ÿฑ :bento: +๐Ÿฃ :sushi: ๐Ÿฅ :fish_cake: ๐Ÿ™ :rice_ball: +๐Ÿ˜ :rice_cracker: ๐Ÿš :rice: ๐Ÿœ :ramen: +๐Ÿฒ :stew: ๐Ÿข :oden: ๐Ÿก :dango: +๐Ÿฅš :egg: ๐Ÿž :bread: ๐Ÿฉ :doughnut: +๐Ÿฎ :custard: ๐Ÿฆ :icecream: ๐Ÿจ :ice_cream: +๐Ÿง :shaved_ice: ๐ŸŽ‚ :birthday: ๐Ÿฐ :cake: +๐Ÿช :cookie: ๐Ÿซ :chocolate_bar: ๐Ÿฌ :candy: +๐Ÿญ :lollipop: ๐Ÿฏ :honey_pot: ๐ŸŽ :apple: +๐Ÿ :green_apple: ๐ŸŠ :tangerine: ๐Ÿ‹ :lemon: +๐Ÿ’ :cherries: ๐Ÿ‡ :grapes: ๐Ÿ‰ :watermelon: +๐Ÿ“ :strawberry: ๐Ÿ‘ :peach: ๐Ÿˆ :melon: +๐ŸŒ :banana: ๐Ÿ :pear: ๐Ÿ :pineapple: +๐Ÿ  :sweet_potato: ๐Ÿ† :eggplant: ๐Ÿ… :tomato: +๐ŸŒฝ :corn: + + +## [Places] +๐Ÿ  :house: ๐Ÿก :house_with_garden: ๐Ÿซ :school: +๐Ÿข :office: ๐Ÿฃ :post_office: ๐Ÿฅ :hospital: +๐Ÿฆ :bank: ๐Ÿช :convenience_store: ๐Ÿฉ :love_hotel: +๐Ÿจ :hotel: ๐Ÿ’’ :wedding: โ›ช๏ธ :church: +๐Ÿฌ :department_store: ๐Ÿค :european_post_office: ๐ŸŒ‡ :city_sunrise: +๐ŸŒ† :city_sunset: ๐Ÿฏ :japanese_castle: ๐Ÿฐ :european_castle: +โ›บ๏ธ :tent: ๐Ÿญ :factory: ๐Ÿ—ผ :tokyo_tower: +๐Ÿ—พ :japan: ๐Ÿ—ป :mount_fuji: ๐ŸŒ„ :sunrise_over_mountains: +๐ŸŒ… :sunrise: ๐ŸŒ  :stars: ๐Ÿ—ฝ :statue_of_liberty: +๐ŸŒ‰ :bridge_at_night: ๐ŸŽ  :carousel_horse: ๐ŸŒˆ :rainbow: +๐ŸŽก :ferris_wheel: โ›ฒ๏ธ :fountain: ๐ŸŽข :roller_coaster: +๐Ÿšข :ship: ๐Ÿšค :speedboat: โ›ต๏ธ :boat: +โ›ต๏ธ :sailboat: ๐Ÿšฃ :rowboat: โš“๏ธ :anchor: +๐Ÿš€ :rocket: โœˆ๏ธ :airplane: ๐Ÿš :helicopter: +๐Ÿš‚ :steam_locomotive: ๐ŸšŠ :tram: ๐Ÿšž :mountain_railway: +๐Ÿšฒ :bike: ๐Ÿšก :aerial_tramway: ๐ŸšŸ :suspension_railway: +๐Ÿš  :mountain_cableway: ๐Ÿšœ :tractor: ๐Ÿš™ :blue_car: +๐Ÿš˜ :oncoming_automobile: ๐Ÿš— :car: ๐Ÿš— :red_car: +๐Ÿš• :taxi: ๐Ÿš– :oncoming_taxi: ๐Ÿš› :articulated_lorry: +๐ŸšŒ :bus: ๐Ÿš :oncoming_bus: ๐Ÿšจ :rotating_light: +๐Ÿš“ :police_car: ๐Ÿš” :oncoming_police_car: ๐Ÿš’ :fire_engine: +๐Ÿš‘ :ambulance: ๐Ÿš :minibus: ๐Ÿšš :truck: +๐Ÿš‹ :train: ๐Ÿš‰ :station: ๐Ÿš† :train2: +๐Ÿš… :bullettrain_front: ๐Ÿš„ :bullettrain_side: ๐Ÿšˆ :light_rail: +๐Ÿš :monorail: ๐Ÿšƒ :railway_car: ๐ŸšŽ :trolleybus: +๐ŸŽซ :ticket: โ›ฝ๏ธ :fuelpump: ๐Ÿšฆ :vertical_traffic_light: +๐Ÿšฅ :traffic_light: โš ๏ธ :warning: ๐Ÿšง :construction: +๐Ÿ”ฐ :beginner: ๐Ÿง :atm: ๐ŸŽฐ :slot_machine: +๐Ÿš :busstop: ๐Ÿ’ˆ :barber: โ™จ๏ธ :hotsprings: +๐Ÿ :checkered_flag: ๐ŸŽŒ :crossed_flags: ๐Ÿฎ :izakaya_lantern: +๐Ÿ—ฟ :moyai: ๐ŸŽช :circus_tent: ๐ŸŽญ :performing_arts: +๐Ÿ“ :round_pushpin: ๐Ÿšฉ :triangular_flag_on_post: ๐Ÿ‡ฏ๐Ÿ‡ต :jp: +๐Ÿ‡ฐ๐Ÿ‡ท :kr: ๐Ÿ‡จ๐Ÿ‡ณ :cn: ๐Ÿ‡บ๐Ÿ‡ธ :us: +๐Ÿ‡ซ๐Ÿ‡ท :fr: ๐Ÿ‡ช๐Ÿ‡ธ :es: ๐Ÿ‡ฎ๐Ÿ‡น :it: +๐Ÿ‡ท๐Ÿ‡บ :ru: ๐Ÿ‡ฌ๐Ÿ‡ง :gb: ๐Ÿ‡ฌ๐Ÿ‡ง :uk: +๐Ÿ‡ฉ๐Ÿ‡ช :de: + + +## [Symbols] +1๏ธโƒฃ :one: 2๏ธโƒฃ :two: 3๏ธโƒฃ :three: +4๏ธโƒฃ :four: 5๏ธโƒฃ :five: 6๏ธโƒฃ :six: +7๏ธโƒฃ :seven: 8๏ธโƒฃ :eight: 9๏ธโƒฃ :nine: +๐Ÿ”Ÿ :keycap_ten: ๐Ÿ”ข :1234: 0๏ธโƒฃ :zero: +#๏ธโƒฃ :hash: ๐Ÿ”ฃ :symbols: โ—€๏ธ :arrow_backward: +โฌ‡๏ธ :arrow_down: โ–ถ๏ธ :arrow_forward: โฌ…๏ธ :arrow_left: +๐Ÿ”  :capital_abcd: ๐Ÿ”ก :abcd: ๐Ÿ”ค :abc: +โ†™๏ธ :arrow_lower_left: โ†˜๏ธ :arrow_lower_right: โžก๏ธ :arrow_right: +โฌ†๏ธ :arrow_up: โ†–๏ธ :arrow_upper_left: โ†—๏ธ :arrow_upper_right: +โฌ :arrow_double_down: โซ :arrow_double_up: ๐Ÿ”ฝ :arrow_down_small: +โคต๏ธ :arrow_heading_down: โคด๏ธ :arrow_heading_up: โ†ฉ๏ธ :leftwards_arrow_with_hook: +โ†ช๏ธ :arrow_right_hook: โ†”๏ธ :left_right_arrow: โ†•๏ธ :arrow_up_down: +๐Ÿ”ผ :arrow_up_small: ๐Ÿ”ƒ :arrows_clockwise: ๐Ÿ”„ :arrows_counterclockwise: +โช :rewind: โฉ :fast_forward: โ„น๏ธ :information_source: +๐Ÿ†— :ok: ๐Ÿ”€ :twisted_rightwards_arrows: ๐Ÿ” :repeat: +๐Ÿ”‚ :repeat_one: ๐Ÿ†• :new: ๐Ÿ” :top: +๐Ÿ†™ :up: ๐Ÿ†’ :cool: ๐Ÿ†“ :free: +๐Ÿ†– :ng: ๐ŸŽฆ :cinema: ๐Ÿˆ :koko: +๐Ÿ“ถ :signal_strength: ๐Ÿˆน :u5272: ๐Ÿˆด :u5408: +๐Ÿˆบ :u55b6: ๐Ÿˆฏ๏ธ :u6307: ๐Ÿˆท๏ธ :u6708: +๐Ÿˆถ :u6709: ๐Ÿˆต :u6e80: ๐Ÿˆš๏ธ :u7121: +๐Ÿˆธ :u7533: ๐Ÿˆณ :u7a7a: ๐Ÿˆฒ :u7981: +๐Ÿˆ‚๏ธ :sa: ๐Ÿšป :restroom: ๐Ÿšน :mens: +๐Ÿšบ :womens: ๐Ÿšผ :baby_symbol: ๐Ÿšญ :no_smoking: +๐Ÿ…ฟ๏ธ :parking: โ™ฟ๏ธ :wheelchair: ๐Ÿš‡ :metro: +๐Ÿ›„ :baggage_claim: ๐Ÿ‰‘ :accept: ๐Ÿšพ :wc: +๐Ÿšฐ :potable_water: ๐Ÿšฎ :put_litter_in_its_place: ใŠ™๏ธ :secret: +ใŠ—๏ธ :congratulations: โ“‚๏ธ :m: ๐Ÿ›‚ :passport_control: +๐Ÿ›… :left_luggage: ๐Ÿ›ƒ :customs: ๐Ÿ‰ :ideograph_advantage: +๐Ÿ†‘ :cl: ๐Ÿ†˜ :sos: ๐Ÿ†” :id: +๐Ÿšซ :no_entry_sign: ๐Ÿ”ž :underage: ๐Ÿ“ต :no_mobile_phones: +๐Ÿšฏ :do_not_litter: ๐Ÿšฑ :non-potable_water: ๐Ÿšณ :no_bicycles: +๐Ÿšท :no_pedestrians: ๐Ÿšธ :children_crossing: โ›”๏ธ :no_entry: +โœณ๏ธ :eight_spoked_asterisk: โœด๏ธ :eight_pointed_black_star: ๐Ÿ’Ÿ :heart_decoration: +๐Ÿ†š :vs: ๐Ÿ“ณ :vibration_mode: ๐Ÿ“ด :mobile_phone_off: +๐Ÿ’น :chart: ๐Ÿ’ฑ :currency_exchange: โ™ˆ๏ธ :aries: +โ™‰๏ธ :taurus: โ™Š๏ธ :gemini: โ™‹๏ธ :cancer: +โ™Œ๏ธ :leo: โ™๏ธ :virgo: โ™Ž๏ธ :libra: +โ™๏ธ :scorpius: โ™๏ธ :sagittarius: โ™‘๏ธ :capricorn: +โ™’๏ธ :aquarius: โ™“๏ธ :pisces: โ›Ž :ophiuchus: +๐Ÿ”ฏ :six_pointed_star: โŽ :negative_squared_cross_mark: ๐Ÿ…ฐ๏ธ :a: +๐Ÿ…ฑ๏ธ :b: ๐Ÿ†Ž :ab: ๐Ÿ…พ๏ธ :o2: +๐Ÿ’  :diamond_shape_with_a_dot_inside: โ™ป๏ธ :recycle: ๐Ÿ”š :end: +๐Ÿ”› :on: ๐Ÿ”œ :soon: ๐Ÿ• :clock1: +๐Ÿ•œ :clock130: ๐Ÿ•™ :clock10: ๐Ÿ•ฅ :clock1030: +๐Ÿ•š :clock11: ๐Ÿ•ฆ :clock1130: ๐Ÿ•› :clock12: +๐Ÿ•ง :clock1230: ๐Ÿ•‘ :clock2: ๐Ÿ• :clock230: +๐Ÿ•’ :clock3: ๐Ÿ•ž :clock330: ๐Ÿ•“ :clock4: +๐Ÿ•Ÿ :clock430: ๐Ÿ•” :clock5: ๐Ÿ•  :clock530: +๐Ÿ•• :clock6: ๐Ÿ•ก :clock630: ๐Ÿ•– :clock7: +๐Ÿ•ข :clock730: ๐Ÿ•— :clock8: ๐Ÿ•ฃ :clock830: +๐Ÿ•˜ :clock9: ๐Ÿ•ค :clock930: ๐Ÿ’ฒ :heavy_dollar_sign: +ยฉ๏ธ :copyright: ยฎ๏ธ :registered: โ„ข๏ธ :tm: +โŒ :x: โ—๏ธ :heavy_exclamation_mark: โ€ผ๏ธ :bangbang: +โ‰๏ธ :interrobang: โญ•๏ธ :o: โœ–๏ธ :heavy_multiplication_x: +โž• :heavy_plus_sign: โž– :heavy_minus_sign: โž— :heavy_division_sign: +๐Ÿ’ฎ :white_flower: ๐Ÿ’ฏ :100: โœ”๏ธ :heavy_check_mark: +โ˜‘๏ธ :ballot_box_with_check: ๐Ÿ”˜ :radio_button: ๐Ÿ”— :link: +โžฐ :curly_loop: ใ€ฐ๏ธ :wavy_dash: ใ€ฝ๏ธ :part_alternation_mark: +๐Ÿ”ฑ :trident: +โœ… :white_check_mark: ๐Ÿ”ฒ :black_square_button: ๐Ÿ”ณ :white_square_button: +โšซ๏ธ :black_circle: โšช๏ธ :white_circle: ๐Ÿ”ด :red_circle: +๐Ÿ”ต :large_blue_circle: ๐Ÿ”ท :large_blue_diamond: ๐Ÿ”ถ :large_orange_diamond: +๐Ÿ”น :small_blue_diamond: ๐Ÿ”ธ :small_orange_diamond: ๐Ÿ”บ :small_red_triangle: +๐Ÿ”ป :small_red_triangle_down: :shipit: :shipit: + + +์ถœ์ฒ˜: https://inpa.tistory.com/464 [๐Ÿ‘จโ€๐Ÿ’ป Dev Scroll] diff --git a/src/content/blog/study/markdown/2022-05-24-github-profile.md b/src/content/blog/study/markdown/2022-05-24-github-profile.md new file mode 100644 index 0000000..a35ff27 --- /dev/null +++ b/src/content/blog/study/markdown/2022-05-24-github-profile.md @@ -0,0 +1,153 @@ +--- +title: ๋ˆˆ์„๋„๋Š” Github Profile ๊พธ๋ฏธ๊ธฐ +date: 2022-05-24 +tags: markdown, ๊ณต๋ถ€ +excerpt: Github profile ๊พธ๋ฏธ๊ธฐ +--- +# Github profile ๊พธ๋ฏธ๊ธฐ + - ๊นƒํ—ˆ๋ธŒ์—์„œ ์ œ๊ณตํ•˜๋Š” ๋‚˜์˜ profile ๊พธ๋ฏธ๊ธฐ ๊ธฐ๋Šฅ์„ ์ด์šฉํ•ด ๋‚˜๋งŒ์˜ ๋…ํŠนํ•œ profile์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค. + - ์œ ๋‹ˆํฌํ•จ์„ ๋”ํ•ด์ฃผ๋Š” badge ๋“ฑ์„ ์ด์šฉํ•˜์—ฌ ๋ˆˆ์—๋„๋Š” profile์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค. + + ![gitprofile](/assets/img/dev/git-profile.png) + + --- + +# Git profile์„ ์œ„ํ•œ repository ๋งŒ๋“ค๊ธฐ + +![gitrepo](/assets/img/dev/create-gitrepo.png) + +์šฐ์„  ๊นƒํ—ˆ๋ธŒ ํ”„๋กœํ•„์„ ์„ค์ •ํ•˜๋ ค๋ฉด ๋ณธ์ธ์˜ ID์™€ ์ผ์น˜ํ•˜๋Š” ์ด๋ฆ„์œผ๋กœ ๋ ˆํผ์ง€ํ† ๋ฆฌ๋ฅผ ์ƒ์„ฑํ•ด์•ผ ํ•œ๋‹ค. + +๋‚˜์˜ ๊ฒฝ์šฐ github ID๊ฐ€ gahusb์ด๋‹ˆ gahusb์œผ๋กœ ๋ ˆํฌ์ง€ํ† ๋ฆฌ๋ฅผ ๋งŒ๋“ค์–ด์คฌ๋‹ค. + +์ผ๋ฐ˜์ ์ธ ๋ ˆํผ์ง€ํ† ๋ฆฌ ์ƒ์„ฑ๋•Œ์™€๋Š” ๋‹ค๋ฅด๊ฒŒ ์ƒ์„ฑํ™”๋ฉด์—์„œ ๊ณ ์–‘์ด๊ฐ€ ๋‚˜ํƒ€๋‚˜๋ฉฐ ๋ง์„ ๊ฑด๋‹ค. + +README.md ํŒŒ์ผ ์ƒ์„ฑํ•˜๋„๋ก ์ฒดํฌํ•˜๋ผ๋Š” ๋‚ด์šฉ์ด๋‹ค. ๋ฐ”๋กœ ์ฒดํฌํ•˜๊ณ  ๋ ˆํผ์ง€ํ† ๋ฆฌ๋ฅผ ์ƒ์„ฑํ•˜์ž! + +๋ฐ”๋กœ ์ด ๋ ˆํผ์ง€ํ† ๋ฆฌ์˜ README.md ํŒŒ์ผ์ด ๋‚ด ๊นƒํ—ˆ๋ธŒ ํ”„๋กœํ•„์— ์ถœ๋ ฅ๋˜๋Š” ๊ฒƒ์ž„์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค. + +# Read.me ๊พธ๋ฏธ๊ธฐ + +## ํ—ค๋” + +์šฐ์„  ๋งจ ์œ„์— **Hello World**๋ฅผ ๋ณด์—ฌ์ฃผ๋Š” ํ—ค๋” ๋ถ€๋ถ„์„ ์ถ”๊ฐ€ ํ•  ์ˆ˜ ์žˆ๋‹ค. + +์ด ๋ถ€๋ถ„์€ 'capsule-render'๋ผ๋Š” ์˜คํ”ˆAPI๋ฅผ ์‚ฌ์šฉํ•˜์˜€๋‹ค. + +[https://github.com/kyechan99/capsule-render](https://github.com/kyechan99/capsule-render) + +์ด ์˜คํ”ˆ ์†Œ์Šค๋Š” awesome ํ•˜๊ฒŒ๋„ ํฌ๊ธฐ, ๋ชจ์–‘, ๋ฌธ๊ตฌ ๋“ฑ์„ ์ž์‹ ์˜ ์ทจํ–ฅ์— ๋งž๊ฒŒ ์„ ํƒํ•˜์—ฌ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ณ , ๋‚˜์˜ ํ”„๋กœํ•„์„ ๋”์šฑ ๋ˆˆ์— ๋„๊ฒŒ ๋งŒ๋“ค์–ด์ค„ ์ˆ˜ ์žˆ๋‹ค. + +## ๋ฐฉ๋ฌธ์ž ์ˆ˜ + +ํ”„๋กœํ•„์ธ๋ž€๊ฒƒ์€ ๊ฒฐ๊ตญ์— ๋‚˜์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ๋‹ค๋ฅธ ์‚ฌ๋žŒ์—๊ฒŒ ๋ณด์—ฌ์ฃผ๊ธฐ ์œ„ํ•œ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•œ๋‹ค. + +๋•Œ๋ฌธ์— ์–ผ๋งˆ๋‚˜ ๋…ธ์ถœ๋˜์—ˆ๋Š”์ง€ ํŒ๋‹จํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ์ข‹๋‹ค๊ณ  ์ƒ๊ฐํ•œ๋‹ค. + +์ด๊ฒƒ์„ ๋‚˜ํƒ€๋‚ด์ฃผ๊ธฐ ์œ„ํ•ด์„œ Hit๋ผ๋Š” ์˜คํ”ˆ ์†Œ์Šค๋ฅผ ์‚ฌ์šฉํ–ˆ๋‹ค. + +[https://hits.seeyoufarm.com/](https://hits.seeyoufarm.com/) + +![Hit](/assets/img/dev/hit-badge.png) + +์œ„์˜ ์‚ฌ์ดํŠธ์—์„œ ๋‚˜์˜ github ์ฃผ์†Œ๋ฅผ ์ž…๋ ฅํ•˜๊ณ  OPTIONS๋ฅผ ํ†ตํ•ด ์ƒ‰์ƒ๊ณผ ๋์˜ ๋ผ์šด๋“œ ์ •๋„ ๋“ฑ์„ ์„ ํƒํ•˜๊ณ  + +์•„๋ž˜๋ถ€๋ถ„์— MARKDOWN์˜ ์ฃผ์†Œ๋ฅผ COPYํ•˜์—ฌ ๋‚ด read.me์˜ ์›ํ•˜๋Š” ์œ„์น˜์— ๋„ฃ์œผ๋ฉด ๋ฐฉ๋ฌธํ•˜๋Š” ์ˆ˜์— ๋”ฐ๋ผ์„œ ์นด์šดํŠธ๊ฐ€ ์ฆ๊ฐ€ํ•œ๋‹ค. + +## ๋‚˜์— ๋Œ€ํ•œ ์ƒ์„ธ ์„ค๋ช… + +์œ„์— ๊ฐ„๋‹จํ•œ ๋ฐฉ๋ฌธ ์ธ์‚ฌ๋ง๊ณ  ๋‚˜์— ๋Œ€ํ•ด์„œ ์ข€๋” ์žฌ๋ฏธ์žˆ๊ฒŒ ํ‘œํ˜„ํ•˜๊ธฐ ์œ„ํ•ด์„œ ์ฝ”๋“œ๋กœ ๋‚˜๋ฅผ ํ‘œํ˜„ํ•˜๋Š” ๋ถ€๋ถ„์„ ๋„ฃ์–ด ๋ณผ ์ˆ˜ ์žˆ๋‹ค. + +``` +(``` Grave + ์–ธ์–ด) +```javascript +const jaeoh = { + pronouns: "He" | "Him", + code: ["Java", "C", "C++", "Javascript", "Python"], + liveIn: Yeongdeungpo-gu, Seoul, Republic of Korea +}; +``` + +์œ„ ์ฝ”๋“œ์ฒ˜๋Ÿผ ๋‚ด๊ฐ€ ๋„ฃ์„ ์ฝ”๋“œ ์Šคํƒ€์ผ์„ ์„ ํƒํ•˜์—ฌ ๋‚˜์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ์ž…๋ ฅํ•ด์„œ ๋‚˜๋ฅผ ์†Œ๊ฐœํ•˜์˜€๋‹ค. + +## ์†Œ์…œ ์ •๋ณด & contact + +๋‚˜์—๊ฒŒ ์—ฐ๋ฝ ํ•  ์ˆ˜ ์žˆ๋Š” Email์ด๋‚˜ ์†Œ์…œ ์ •๋ณด๋ฅผ ๋„ฃ์–ด์ฃผ์—ˆ๋‹ค. + +``` +[![GitHub](icons/github.png)](https://github.com/gahusb) +[![LinkedIn](icons/linkedin.png)](https://www.linkedin.com/in/jaeoh-park-gahusb/) +[![Instagram](icons/instagram.png)](https://www.instagram.com/gahusb/) +``` + +์œ„์™€ ๊ฐ™์ด ๋‚˜์˜ ์ •๋ณด์™€ ๋ˆ„๊ฐ€๋ด๋„ ํ•ด๋‹น ์†Œ์…œ์— ํ•ด๋‹นํ•˜๋Š” ์•„์ด์ฝ˜์œผ๋กœ ํ‘œ์‹œํ•ด์ค„ ์ˆ˜ ์žˆ๋‹ค. + +์•„์ด์ฝ˜์€ [์—ฌ๊ธฐ](https://github.com/gahusb/gahusb/tree/main/icons)์„œ ๋‹ค์šด๋กœ๋“œ ๋ฐ›์•„์„œ ๋‚˜์˜ ๋ ˆํฌ์ง€ํ† ๋ฆฌ์— ๋„ฃ๊ณ  ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. + +## ๊ธฐ์ˆ  ์Šคํƒ + +๋ฑƒ์ง€(Badge)๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋‚˜์˜ ๊ธฐ์ˆ  ์Šคํƒ์„ ์ด์˜๊ฒŒ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค. + +[https://shields.io/](https://shields.io/) + +์œ„ shields๋ผ๋Š” ๊ณณ์—์„œ ๋‚ด๊ฐ€ ์›ํ•˜๋Š” ํ˜•ํƒœ๋กœ ๋ฑƒ์ง€๋ฅผ ๋งŒ๋“ค์–ด์„œ ์‚ฌ์šฉํ•  ์ˆ˜๋„ ์žˆ๊ณ , + +[https://simpleicons.org/](https://simpleicons.org/) + +์œ„ simpleicons๋ผ๋Š” ์‚ฌ์ดํŠธ์—์„œ ๋‚ด๊ฐ€ ์›ํ•˜๋Š” ๊ธฐ์ˆ  ์Šคํƒ์— ํ•ด๋‹นํ•˜๋Š” ์•„์ด์ฝ˜์„ ๋ฐ›์•„์„œ ๋ฑƒ์ง€๋กœ ๋งŒ๋“ค์–ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. + +``` +![Java](https://img.shields.io/badge/Java-orange?style=flat-square&logo=java) +``` + +์˜ˆ๋ฅผ ๋“ค์–ด JAVA์˜ ๊ฒฝ์šฐ ์œ„ **Java-orange**๋ผ๋Š” ๋ฑƒ์ง€์˜ ๋ชจ์–‘์— ๋‚ด๊ฐ€ ์›ํ•˜๋Š” ๋ฑƒ์ง€์˜ ์ด๋ฆ„์„ ์ž…๋ ฅํ•˜๊ณ , ์Šคํƒ€์ผ, ๋กœ๊ณ  ๋“ฑ์„ ์„ ํƒํ•˜์—ฌ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. + +์ด๋Ÿฐ ๋‚˜๋งŒ์˜ ๋ฑƒ์ง€๋ฅผ ๋งŒ๋“ค๊ธฐ ๊ท€์ฐฎ๋‹ค๋ฉด, + +[https://cocoon1787.tistory.com/689](https://cocoon1787.tistory.com/689) + +์ด๋Ÿฐ ๋ฑƒ์ง€๋“ค์„ ๋งŒ๋“ค์–ด์„œ ๊ณต์œ ํ•˜๋Š” ์˜คํ”ˆ ์†Œ์Šค๋ฅผ ๊ฐ€์ ธ๋‹ค๊ฐ€ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. + +๋‚˜๋งŒ์˜ ๊ธฐ์ˆ  ์Šคํƒ๋“ค์„ ์ข€ ๋” ์ž์œ ๋กญ๊ณ  ๋ˆˆ์— ๋„๊ฒŒ ๋ฐ”๊ฟ”๋ณด์ž + +## Github stat + +๋‚ด๊ฐ€ ์ง€๊ธˆ๊นŒ์ง€ commitํ•œ ํšŸ์ˆ˜๋‚˜ repositories์— ์žˆ๋Š” ์–ธ์–ด๋ฅผ ๋ถ„์„ํ•˜์—ฌ ์–ด๋–ค ์–ธ์–ด๋ฅผ ๊ฐ€์žฅ ๋งŽ์ด ์‚ฌ์šฉํ–ˆ๋Š”์ง€ ํ‘œ์‹œํ•  ์ˆ˜ ์žˆ๋‹ค. +์ผ์ข…์˜ My github analytics ์ด๋ผ๊ณ  ํ• ๊นŒ? + +์ž์‹ ์ด ๊นƒ์—์„œ ์–ด๋–ค ํ™œ๋™์„ ํ•˜๊ณ  ์žˆ๋Š”์ง€ ์ž์„ธํžˆ ๋ณด์—ฌ์ฃผ๋Š” ์ง€ํ‘œ์ด๋‹ค. + +```markdown +![์•„์ด๋””'s github stats](https://github-readme-stats.vercel.app/api?username=์•„์ด๋””&show_icons=true) +``` +**์•„์ด๋””**๋กœ ๋˜์–ด ์žˆ๋Š” ๋ถ€๋ถ„์— ๋‚˜์˜ github ID๋ฅผ ๋„ฃ์–ด์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. + +๋‚˜์˜ ๊ฒฝ์šฐ + +```html +

+ + + + + + +

+``` + +์œ„์— ์ฒ˜๋Ÿผ html ํƒœ๊ทธ์— url์„ ๋„ฃ์–ด์„œ ์ข€๋” ์˜ต์…˜์„ ์ œ์–ดํ•˜์—ฌ ์‚ฌ์šฉํ•˜์˜€๋‹ค. + +๋‚˜์˜ ID์ธ gahusb ๋ถ€๋ถ„์„ ์ง€์šฐ๊ณ  ์ž์‹ ์˜ github ID๋ฅผ ๋„ฃ์–ด์„œ ์‚ฌ์šฉํ•˜์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค. + +# ๋”ํ•˜๊ธฐ + +์ค‘๊ฐ„์ค‘๊ฐ„ markdown์— ๋‚˜ํƒ€๋‚˜๋Š” emoji์˜ ๊ฒฝ์šฐ ์•„๋ž˜ ๊ธ€์„ ์ฐธ๊ณ ํ•ด์„œ ์‚ฌ์šฉํ•˜์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค. + +[https://gahusb.github.io/devlog/markdown-emoji.html](https://gahusb.github.io/devlog/markdown-emoji.html) + +๋˜ํ•œ ๋” ๋‹ค์–‘ํ•œ ์‚ฌ๋žŒ๋“ค์˜ github profile์„ ์ฐธ๊ณ ํ•ด์„œ ๋‚˜๋งŒ์˜ ํ”„๋กœํ•„์„ ๊พธ๋ฏธ๊ณ  ์‹ถ๋‹ค๋ฉด + +[https://github.com/abhisheknaiidu/awesome-github-profile-readme](https://github.com/abhisheknaiidu/awesome-github-profile-readme +) + +์œ„์˜ ์‚ฌ์ดํŠธ์—์„œ ์—ฌ๋Ÿฌ ์‚ฌ๋žŒ๋“ค์˜ awesomeํ•œ read.me๋ฅผ ์ฐธ๊ณ ํ•˜์—ฌ ๋‚˜์˜ ํ”„๋กœํ•„์— ์ ์šฉํ•ด๋ณด์ž ๐Ÿ˜Š diff --git a/src/content/blog/study/react/2022-06-07-web-reactjs.md b/src/content/blog/study/react/2022-06-07-web-reactjs.md new file mode 100644 index 0000000..31bf707 --- /dev/null +++ b/src/content/blog/study/react/2022-06-07-web-reactjs.md @@ -0,0 +1,216 @@ +--- +title: ReactJS +date: 2022-06-07 +tags: react, ๊ณต๋ถ€, ๊ฐœ๋ฐœ +excerpt: ๋ฆฌ์•กํŠธ๋ฅผ ํ™œ์šฉ ๊ณต๋ถ€ +--- +# ๋ฆฌ์•กํŠธ๋ฅผ ํ™œ์šฉํ•˜์—ฌ ์˜ํ™” ์›น ์„œ๋น„์Šค ๊ฐœ๋ฐœ + +## What ReactJS ? + + +## ReacJS๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ  + - interactive(์ƒํ˜ธ์ž‘์šฉ์„ ์œ„ํ•ด) + + +## VanilliaJS vs ReactJS + +VaniliaJS +```html + + + + Total click: 0 + + + + +``` + +ReactJS +```html + + + +
+ + + + + +``` + +์œ„์—์„œ ๊ฐ„๋‹จํ•œ ๋ฒ„ํŠผ์„ ์‚ฝ์ž…ํ•˜์—ฌ ์นด์šดํŠธ๋ฅผ ์ฆ๊ฐ€ํ•˜๋Š” ์ž‘์—…์„ ํ•˜๋Š” ํŒŒ์ผ์„ ๋งŒ๋“ค์—ˆ๋‹ค.
+๊ฐ„๋‹จํžˆ ๋ณด๋”๋ผ๋„ bodyํƒœ๊ทธ ์•ˆ์— ๋ฐ์ดํ„ฐ๋ฅผ ๋„ฃ์„ ํƒœ๊ทธ๋ฅผ ์„ ์–ธํ•ด์ฃผ๊ณ  **querySelector**์—์„œ ํƒœ๊ทธ๋ฅผ ์ฐพ์•„์„œ ๋„ฃ๊ณ  Event Listener๋ฅผ ์„ ์–ธํ•ด์„œ ์—ฐ๊ฒฐํ•ด์ฃผ๊ณ ...
+ +์œ„์—์ฒ˜๋Ÿผ ๊ฐ„๋‹จํ•˜๊ฒŒ ๋งŒ๋“  ๋ฒ„ํŠผ ํด๋ฆญ ์‹œ, ์นด์šดํŠธ ์ฆ๊ฐ€ํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” ๋น„์Šทํ•ด๋ณด์ผ์ง€ ๋ชจ๋ฅด์ง€๋งŒ ์ €๋Ÿฐ ๊ธฐ๋Šฅ ํ•˜๋‚˜ํ•˜๋‚˜๊ฐ€ ๋ชจ์ธ๋‹ค๊ณ  ์ƒ๊ฐํ•ด๋ณด๋ฉด ๋ณด๊ธฐ๋งŒํ•ด๋„ ์–ด์งˆ์–ด์งˆํ•ด์ง„๋‹ค... + +๊ทธ๋ž˜์„œ ReactJS๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์ƒํ˜ธ์ž‘์šฉํ•ด์ฃผ๋Š” ๋ฉ‹์ง„ ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. + +## Introducing JSX ! +``` +Babel compiles JSX down to React.createElement() calls. +``` +์œ„ ๋ฌธ๊ตฌ์—์„œ ๋ณผ ์ˆ˜ ์žˆ๋“ฏ์ด **reactjs.org**์— ์†Œ๊ฐœ๋œ JSX์˜ ์ฒซ ์†Œ๊ฐœ ๋ฌธ๊ตฌ์ด๋‹ค.
+JSX๋Š” Javascript๋ฅผ ํ™•์žฅํ•œ ๋ฌธ๋ฒ•์œผ๋กœ, createElement()๋ฅผ ์„ ์–ธํ•˜์—ฌ ํƒœ๊ทธ์™€ ์†์„ฑ์„ ๊ฐ€์ ธ์˜ค๋Š” ๋ถ€๋ถ„์„ ๋” ์‹ฌํ”Œํ•˜๊ฒŒ ์ปดํŒŒ์ผํ•ด์ฃผ๋Š” Babel์˜ ๊ธฐ๋Šฅ์ด๋‹ค. + +```JSX +const element = ( +

+ Hello, world! +

+); +``` + +```javascript +const element = React.createElement( + 'hi', + {className: 'greeting'}, + 'Hello, world!' +); +``` + +์ฒซ ๋ฒˆ์งธ ์ฝ”๋“œ๊ฐ€ JSX๋ฅผ ์‚ฌ์šฉํ•œ ์ฝ”๋“œ์ด๊ณ , ์•„๋ž˜๊ฐ€ ๊ทธ๋ƒฅ JS์— createElement()๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์†์„ฑ์„ ์„ ์–ธํ•œ ์ฝ”๋“œ์ด๋‹ค. + +์ด๋ฅผ ๋ฐ˜์˜ํ•ด์„œ ์œ„์˜ ๊ฐ„๋‹จํ•œ ์นด์šดํŠธ ์ฝ”๋“œ๋ฅผ ๋ณ€๊ฒฝํ•ด๋ณด์•˜๋‹ค. + +```JSX + + + +
+ + + + + + +``` + +์œ„ ์ฝ”๋“œ์—์„œ์ฒ˜๋Ÿผ JSX๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” **Babel**์„ importํ•  ํ•„์š”๊ฐ€ ์žˆ๋‹ค.
+์™œ๋ƒํ•˜๋ฉด ๋ธŒ๋ผ์šฐ์ €๋Š” JSX๋ผ๋Š” ํ˜•ํƒœ๋ฅผ ์ธ์‹ํ•˜์ง€ ๋ชปํ•˜๊ธฐ ๋•Œ๋ฌธ์— JSX๋ฅผ ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์•Œ ์ˆ˜ ์žˆ๋Š” ์ฝ”๋“œ๋กœ ๋ณ€ํ˜•ํ•ด์ฃผ๊ธฐ ์œ„ํ•ด์„œ์ด๋‹ค. + +๊ทธ๋ฆฌ๊ณ ์„œ ์•ˆ์„ ๋ณด์ž๋ฉด ์ผ๋ฐ˜์ ์œผ๋กœ ์•Œ๊ณ  ์žˆ๋Š” HTML์˜ ํ˜•ํƒœ์™€ ์œ ์‚ฌํ•œ ์ฝ”๋“œ๋ฅผ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.
+๊ฐ ํƒœ๊ทธ๊ฐ€ ์žˆ๊ณ , ๊ทธ ํƒœ๊ทธ ์•ˆ์—๋Š” class, style๋“ฑ์˜ ์†์„ฑ์ด๋‚˜ event๊ฐ€ ๋“ค์–ด๊ฐˆ ์ˆ˜ ์žˆ๊ณ , ๋ชจ๋“  ์ •๋ณด๋“ค์„ ์•Œ์•„๋ณด๊ธฐ ๊ฐ„ํŽธํ•ด์กŒ๋‹ค!
+ + +## Understanding State +ReactJS์—์„œ State๋ž€ ๋ฌด์—‡์ธ๊ฐ€?
+State๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๋Š” ์žฅ์†Œ์ด๋‹ค. + +์•„๋ž˜ ์ฝ”๋“œ๋ฅผ ์‚ดํŽด๋ณด์ž + +```html +... + + +``` + +์œ„์˜ ์ฝ”๋“œ๋ฅผ ๋ณด๋ฉด ๋ฒ„ํŠผ์„ ํด๋ฆญํ•  ๋•Œ๋งˆ๋‹ค ๋‹ค์‹œ render() ํ•จ์ˆ˜๋ฅผ ๋ถˆ๋Ÿฌ์™€ ํ˜ธ์ถœํ•˜๋Š”๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.
+๊ทธ๋Ÿฌ๋‚˜ ์ € ๋ฐฉ์‹์€ ์ฝ”๋“œ๊ฐ€ ๋งŽ์•„์ง€๊ฑฐ๋‚˜ ์ปจํ…Œ์ด๋„ˆ์˜ ํฌํ•จ ๋ฒ”์œ„๊ฐ€ ๋งŽ์•„์ง€๊ฒŒ๋˜๋ฉด rerender๋ฅผ ์–ด๋А ์‹œ์ ์—์„œ ๋‹ค์‹œ ํ•ด์ค˜์•ผ ํ•˜๋Š”์ง€ ์„ค๊ณ„ํ•˜๊ธฐ๋„ ์–ด๋ ต๊ณ  ๋‚˜์ค‘์— ์œ ์ง€๋ณด์ˆ˜๋„ ํž˜๋“ค๊ฒŒ ๋œ๋‹ค. + +์ด๊ฒƒ์„ ์œ„ํ•ด useState()๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ์™€ ํ•ด๋‹น ๋ฐ์ดํ„ฐ์˜ ๋ณ€ํ™”๋ฅผ ๊ฐ์ง€ํ•˜์—ฌ ํ•ด๋‹น ๋ฐ์ดํ„ฐ ๋ถ€๋ถ„๋งŒ ๋ฆฌ๋ Œ๋”๋ง ํ•ด์ค„ ์ˆ˜ ์žˆ๋‹ค. + +์•„๋ž˜์˜ ์ฝ”๋“œ๋ฅผ ์‚ดํŽด๋ณด์ž + +```html +... + + +``` + +๊ฐ„๋‹จํ•˜๊ฒŒ useState()๋ฅผ ํ†ตํ•ด ์ดˆ๊ธฐ๊ฐ’ 0์„ ๊ฐ€์ง„ counter์™€ setCounter๋ผ๋Š” ๋ฐ์ดํ„ฐ์˜ ์ƒํƒœ๋ฅผ ๋ณ€ํ™”์‹œ์ผœ์ฃผ๋Š” ํ•จ์ˆ˜๋ฅผ ๊ฐ™์ด ์„ ์–ธํ•  ์ˆ˜ ์žˆ๋‹ค.
+๊ทธ๋ฆฌ๊ณ  ๋ฒ„ํŠผ์„ ํด๋ฆญํ• ๋•Œ๋งˆ๋‹ค counter๋ฅผ ์ฆ๊ฐ€์‹œ์ผœ์ฃผ๋„๋ก ํ•˜๋ฉด, ์œ„์—์„œ rerender๋ฅผ ์œ„ํ•ด ๋‹ค์‹œ ํ˜ธ์ถœํ•˜์—ฌ ๋ฆฌ๋ Œ๋”๋งํ•ด์ฃผ๋Š” ์ž‘์—…์„ ๋ณ„๋„๋กœ ์„ ์–ธํ•˜์ง€ ์•Š์•„๋„ ํ•ด๋‹น ๋ฐ์ดํ„ฐ ๋ถ€๋ถ„์— ๋ณ€ํ™”๊ฐ€ ์ƒ๊ธฐ๋ฉด ํ•ด๋‹น ๋ฐ์ดํ„ฐ ๋ถ€๋ถ„๋งŒ ๋ฆฌ๋ Œ๋”๋ง ๋œ๋‹ค!!
+์ •๋ง ๋ฉ‹์ง„ ๊ธฐ๋Šฅ์ด ์•„๋‹ ์ˆ˜ ์—†๋‹ค!
+ +์ด ๋™์ž‘์€ modifier๋ผ๊ณ  ํ•˜๋Š” setCounter๋ผ๊ณ  ๋ช…๋ช…ํ•œ ๋ถ€๋ถ„์ด ์‹คํ–‰์ด๋˜๋ฉด ํ•ด๋‹น ์ปดํฌ๋„ŒํŠธ(์—ฌ๊ธฐ์„  App)๋ฅผ ์žฌ์‹คํ–‰ํ•˜๊ฒŒ ๋œ๋‹ค.
+๊ทธ๋ž˜์„œ setCounter๊ฐ€ ์‹คํ–‰๋˜๋Š” ๋ถ€๋ถ„๋ถ€ํ„ฐ ์ˆœ์ฐจ์ ์œผ๋กœ ์•„๋ž˜๋กœ ์‹คํ–‰์ด๋˜๋ฉฐ, return()๋˜๋Š” ๋ถ€๋ถ„์ด ์žฌ์‹คํ–‰๋˜๊ณ , ๋ฆฌ๋ Œ๋”๋ง์ด ๋˜๋Š”๊ฒƒ์ด๋‹ค.
+ +๋ฐ”๋กœ ์ด ๋ถ€๋ถ„์ด ReactJS์˜ ๊ธฐ๋Šฅ์˜ ๊ฐ€์žฅ ์ค‘์ ์ด๋˜๋Š” ๋ถ€๋ถ„์ด๋‹ค. ๋ฐ์ดํ„ฐ๊ฐ€ ๋ฐ”๋€”๋•Œ๋งˆ๋‹ค ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ฆฌ๋ Œ๋”๋งํ•˜๊ณ  UI๋ฅผ refreshํ•ด์ค€๋‹ค.
+ +์ด๋Š” vanillaJS์ฒ˜๋Ÿผ HTML์˜ ์š”์†Œ๋ฅผ ์ฐพ์„ ํ•„์š”์—†๊ณ , ์ด๋ฒคํŠธ๋ฆฌ์Šค๋„ˆ๋ฅผ ๋”ํ•ด์ค„ ํ•„์š”๋„, UI๋ฅผ ์—…๋ฐ์ดํŠธํ•ด์ค„ ํ•„์š”๋„ ์—†๋„๋ก ํ•ด์ฃผ์—ˆ๋‹ค!
+JSX๋ฅผ ํ†ตํ•ด ๋ฐ”๋กœ HTML์„ ๋„ฃ๊ณ , ๊ณง๋ฐ”๋กœ ์ด๋ฒคํŠธ๋ฆฌ์Šค๋„ˆ๋ฅผ ๋”ํ•ด์ฃผ๊ณ , state๊ฐ€ ๋ณ€ํ™”ํ•˜๋ฉด ์ž๋™์œผ๋กœ ๋ฆฌ๋ Œ๋”๋ง ๋˜๋Š” ๊ฒƒ์ด๋‹ค!! So Cool โ—๏ธโ—๏ธ๐Ÿ˜† + + diff --git a/src/content/blog/study/spring/2022-11-01-jpa-lombok.md b/src/content/blog/study/spring/2022-11-01-jpa-lombok.md new file mode 100644 index 0000000..ff4a3b1 --- /dev/null +++ b/src/content/blog/study/spring/2022-11-01-jpa-lombok.md @@ -0,0 +1,286 @@ +--- +title: Spring ๊ฐœ๋… +date: 2022-11-01 +tags: spring, ๊ณต๋ถ€ +excerpt: Spring ๊ฐœ๋… ์ดํ•ด +--- +# ์Šคํ”„๋ง ํ”„๋กœ์ ํŠธ +## JPA, ์ž๋ฐ” ์ง€์†์„ฑ API(JAVA Persistence API) +์ž๋ฐ” ํ”Œ๋žซํผ SE์™€ EE๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์‘์šฉํ”„๋กœ๊ทธ๋ž˜๋ฉ”์„œ ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ๊ด€๋ฆฌ๋ฅผ ํ‘œํ˜„ํ•˜๋Š” Java API์ด๋‹ค. +์ด์ „์— SSAFY๋ฅผ ๋‹ค๋‹ˆ๋ฉฐ ๋ฐฐ์šด ๊ฒฝํ—˜์€ ์žˆ์ง€๋งŒ ๋‹ค์‹œ ํ•œ ๋ฒˆ ์‚ฌ์šฉํ•˜๋ฉด์„œ ์ •๋ฆฌํ•ด๋ณด๊ธฐ๋กœ ํ•œ๋‹ค. + +## lombok +getter, setter ๋“ฑ์˜ ๋ฐ˜๋ณต ๋ฉ”์„œ๋“œ๋ฅผ ์ž๋™์œผ๋กœ ์—ฐ๊ฒฐํ•˜๊ณ  ๋„๊ตฌ๋ฅผ ๋นŒ๋“œํ•˜์—ฌ Java๋ฅผ ํ–ฅ์ƒ์‹œํ‚ค๋Š” Java ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ด๋‹ค.
+[lombok](https://projectslombok.org/) + +## 1. Dependency ์ถ”๊ฐ€ (jpa, lombok, mariaDB) +> Maven์˜ ๊ฒฝ์šฐ pom.xml์— ์ถ”๊ฐ€ + +```xml + + + org.springframework.boot + spring-boot-starter-data-jpa + + + + + org.projectlombok + lombok + true + + + + + org.mariadb.jdbc + mariadb-java-client + +``` + +> gradle์˜ ๊ฒฝ์šฐ build.gradle์— ์ถ”๊ฐ€ + +```gradle +dependencies { + // JPA + implementation 'org.springframework.boot:spring-boot-starter-data-jpa' + // lombok + implementation 'org.projectlombok:lombok' + // mariaDB + implementation 'org.mariadb.jdbc:mariadb-java-client' +} +``` + +์—ฌ๊ธฐ์„œ ์˜๋ฌธ์ ์ด ์ข€ ๋“ค์—ˆ๋‹ค.
+Maven๊ณผ Gradle์˜ ์ฐจ์ด์ ์€ ๋ฌด์—‡์ผ๊นŒ? ๋ฐ”๋กœ ์•Œ์•„๋ณด์ž
+-> [Maven๊ณผ Gradle](https://gahusb.github.io/devlog/maven-gradle.html) + +## 2. ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์„ค์ • +> application.properties + +```java +spring.datasource.driverClassName=org.mariadb.jdbc.Driver +spring.datasource.url=jdbc:mariadb://IP:3306/databaseName +spring.datasource.username=user +spring.datasource.password=pwd +``` + +> aplication.yml + +```java +spring: + datasource: + driverClassName: org.mariadb.jdbc.Driver + url: jdbc:mariadb://IP:3306/databaseName + username: user + password: pwd +``` + +## 3. ์žฌ์‚ฌ์šฉ๋  ์ปฌ๋Ÿผ์„ ์ถ”์ƒ ํด๋ž˜์Šค๋กœ ์ž‘์„ฑ +> CommonVo.java + +```java +import java.time.LocalDateTime; +import javax.persistence.Column; +import javax.persistence.MappedSuperclass; +import org.hibernate.annotations.CreationTimestamp; +import lombok.Data; + +// Getter, Setter Auto Create +@Data +// ๊ณตํ†ต ๋งคํ•‘ ์ •๋ณด๊ฐ€ ํ•„์š”ํ•  ๋•Œ, ๋ถ€๋ชจ ํด๋ž˜์Šค์— ์„ ์–ธํ•˜๊ณ  ์†์„ฑ๋งŒ ์ƒ์† ๋ฐ›์•„์„œ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ์„ ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค. +@MappedSuperclass +public abstract class CommonVo { + + // register id + private String regId; + + // modify id + private String modId; + + // register Date time + @CreationTimestamp + /* + * ๋ณดํ†ต JPA๋Š” SAVE์‹œ์— ๋ชจ๋“  ์นผ๋Ÿผ์„ INSERTํ•œ๋‹ค. + * ๊ทธ๋Ÿด ๊ฒฝ์šฐ, NOT NULL๋กœ ์„ค์ •๋œ ์นผ๋Ÿผ์€ ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ ์‚ฝ์ž…๋˜๋Š” ๊ฒƒ์ด ์•„๋‹Œ NULL๋กœ ์‚ฝ์ž…์„ ์‹œ๋„ํ•œ๋‹ค. + * ์ด๋กœ ์ธํ•ด ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š”๋ฐ, ์ด๋Ÿด ๊ฒฝ์šฐ์— ์•„์˜ˆ ์ฟผ๋ฆฌ์—์„œ ๋นผ๋ฒ„๋ ค์„œ ์‹คํ–‰์ด ์•ˆ๋˜๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค. + * ์ฟผ๋ฆฌ์—์„œ ์ œ์™ธ๋œ ์นผ๋Ÿผ์€ DB์— ์ง€์ •๋œ default๊ฐ’์œผ๋กœ ์‚ฝ์ž…์ด ๋œ๋‹ค. + * ํŠน์ • ์นผ๋Ÿผ์„ ์ œ์™ธํ•˜๊ณ  saveํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค. + * insertable = false, updatable = false + */ + @Column(updatable = false) + private LocalDateTime regDtm; + + // modify Date time + @CreationTimestamp + private LocalDateTime modDtm; +} +``` + +## 4. CommonVo๋ฅผ ์ƒ์†๋ฐ›์€ MemberVo ์ž‘์„ฑ +> MemberVo.java + +```java +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import com.melon.boot.common.vo.CommonVo; +import lombok.Data; + +// Getter, Setter Auto Create +@Data +@Entity(name = "member") +public class MemberVo extends CommonVo { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long mbrSeq; + private String id; + private String pwd; + private String name; + private String addrLoad; +} +``` + +## 5. JpaRepository๋ฅผ ์ƒ์†๋ฐ›์€ interface ์ž‘์„ฑ +> MemberRepository.java + +```java +package com.melon.boot.member.service.repository; + +import org.springframework.data.jpa.repository.JpaRepository; +import com.melon.boot.member.vo.MemberVo; + +public interface MemberRepository extends JpaRepository { +} +``` + +## 6. Service Class ์ž‘์„ฑ +> MemberService.java + +```java +import java.util.List; +import java.util.Optional; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import com.melon.boot.member.service.repository.MemberRepository; +import com.melon.boot.member.vo.MemberVo; + +@Service +public class MemberService { + + @Autowired + private MemberRepository memberRepository; + + // INSERT + public MemberVo insert(MemberVo memberVo) throws Exception { + return memberRepository.save(memberVo); + } + + // SELECT LIST + public List findAll() throws Exception { + return memberRepository.findAll(); + } + + // SELECT BY ID + public Optional findById(Long mbrSeq) throws Exception { + return memberRepository.findById(mbrSeq); + } + + // UPDATE + public MemberVo updateById(MemberVo memberVo) throws Exception { + Optional e = memberRepository.findById(memberVo.getMbrSeq()); + + MemberVo resultMember = null; + if(e.isPresent()) { + resultMember = memberRepository.save(memberVo); + } + return resultMember; + } + + // DELETE + public void deleteById(Long mbrSeq) throws Exception { + memberRepository.deleteById(mbrSeq); + } +} +``` + +## 7. Controller Class ์ž‘์„ฑ +> MemberController.java + +```java +import java.time.LocalDateTime; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import com.melon.boot.member.service.MemberService; +import com.melon.boot.member.vo.MemberVo; + +@Controller +@RequestMapping("/member") +public class MemberController { + + @Autowired + MemberService memberService; + + @GetMapping("/insert") + public void insertMember() throws Exception { + try { + MemberVo memberVo = new MemberVo(); + + memberService.insert(memberVo); + } catch(Exception e) { + e.printStackTrace(); + } + } + + @GetMapping("/selectList") + public void selectMemberList() throws Exception { + try { + memberService.findAll(); + } catch(Exception e) { + e.printStackTrace(); + } + } + + @GetMapping("/select") + public void selectMember() throws Exception { + try { + memberService.findById((long) 1); + } catch(Exception e) { + e.printStackTrace(); + } + } + + @GetMapping("/update") + public void updateMember() throws Exception { + try { + MemberVo memberVo = new MemberVo(); + + memberService.updateById(memberVo); + } catch(Exception e) { + e.printStackTrace(); + } + } + + @GetMapping("/delete") + public void deleteMember(MemberVo memberVo) throws Exception { + try { + memberService.deleteById(memberVo.getMbrSeq); + } catch(Exception e) { + e.printStackTrace(); + } + } +} +``` + +## 8. ํ…Œ์ŠคํŠธ URL + - /member/insert + - /member/selectList + - /member/select + - /member/update + - /member/delete + + +์œ„์—์„œ์ฒ˜๋Ÿผ jpa, lombok, mariadb๋ฅผ ์‚ฌ์šฉํ•ด์„œ CRUD ํ†ต์‹ ํ•˜๋Š” ์„œ๋ฒ„๋ฅผ ๋งŒ๋“ค์–ด๋ณด์•˜๋‹ค.
+์ด์ œ ์ด๊ฒƒ์„ ๋ฐ”ํƒ•์œผ๋กœ GLotto์— ํ•ด๋‹นํ•˜๋Š” ๋ฐ์ดํ„ฐ ํ…Œ์ด๋ธ”์„ ๋งŒ๋“ค๊ณ  ๋ฐ์ดํ„ฐ๋ฅผ ๋„ฃ์€๋‹ค์Œ ๋Œ์•„๊ฐ€๋Š” ์„œ๋ฒ„๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๊ฒ ๋‹ค.
diff --git a/src/content/blog/study/spring/2022-11-01-maven-gradle.md b/src/content/blog/study/spring/2022-11-01-maven-gradle.md new file mode 100644 index 0000000..40a9f58 --- /dev/null +++ b/src/content/blog/study/spring/2022-11-01-maven-gradle.md @@ -0,0 +1,100 @@ +--- +title: Maven๊ณผ Gradle ์ฐจ์ด์  +date: 2022-11-01 +tags: spring, ๊ณต๋ถ€ +excerpt: Maven? Gradle? +--- +# Maven? Gradle? +Maven์˜ ๊ฒฝ์šฐ์—๋Š” ์Šคํ”„๋ง ํ”„๋กœ์ ํŠธ์—์„œ pom.xml์ด๋ž€ ์ด๋ฆ„์œผ๋กœ ๋‹ค๋ฃจ๊ณ  ์žˆ๋‹ค. + +Gradle์€ ์Šคํ”„๋ง๋ถ€ํŠธ, ์•ˆ๋“œ๋กœ์ด๋“œ์—์„œ ์“ฐ๋Š”๊ฑธ๋กœ ๊ธฐ์–ตํ•˜๊ณ  ์žˆ๋Š”๋ฐ, ์ด๊ฒƒ์ด ๋งž๋Š” ๊ฒƒ์ธ๊ฐ€?! ๋ฐ”๋กœ ์•Œ์•„๋ณด์ž
+ +## Maven ์ด๋ž€? +ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ํ•˜๊ฒŒ ๋˜๋ฉด ๋‹จ์ˆœํžˆ ์ž์‹ ์ด ์ž‘์„ฑํ•œ ์ฝ”๋“œ๋งŒ์œผ๋กœ ๊ฐœ๋ฐœํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ๋งŽ์€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋“ค์„ ํ™œ์šฉํ•ด์„œ ๊ฐœ๋ฐœ์„ ํ•˜๊ฒŒ ๋œ๋‹ค.
+์„ธ์ƒ์— ๋งŽ์€ ์ฒœ์žฌ๋“ค์ด ๊ฐœ๋ฐœํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ํ™œ์šฉํ•ด์„œ ๊ฐœ๋ฐœ์„ ํ•˜๊ฒŒ ๋˜๋ฉด ๊ฐœ๋ฐœ ์‹œ๊ฐ„๋„ ๋‹จ์ถ•๋ ๋ฟ ์•„๋‹ˆ๋ผ ์•ˆ์ •์„ฑ๋„ ๊ทธ๋งŒํผ ๋ณด์žฅ๋˜์ง€ ์•Š๊ฒ ๋Š”๊ฐ€! ์ ๊ทน ํ™œ์šฉํ•œ๋‹ค!๐Ÿ‘
+ +์ด ๋•Œ ์‚ฌ์šฉ๋˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋“ค์˜ ์ˆ˜๊ฐ€ ์ˆ˜์‹ญ๊ฐœ๊ฐ€ ํ›Œ์ฉ ๋„˜์–ด๊ฐ€๋ฒ„๋ฆฌ๋Š” ์ผ์ด ๋ฐœ์ƒํ•ด ์ด ๋งŽ์€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋“ค์„ ๊ด€๋ฆฌํ•˜๋Š” ๊ฒƒ์ด ํž˜๋“ค์–ด์ง€๋Š” ๊ฒฝ์šฐ๊ฐ€ ์ข…์ข… ๋ฐœ์ƒํ•˜๊ฒŒ ๋œ๋‹ค.
+**Maven**์€ ์ด๋Ÿฌํ•œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•ด ์ค„ ์ˆ˜ ์žˆ๋Š” ๋„๊ตฌ์ด๋‹ค.
+Maven์€ ๋‚ด๊ฐ€ ์‚ฌ์šฉํ•  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ํ•ด๋‹น ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์ž‘๋™ํ•˜๋Š”๋ฐ ํ•„์š”ํ•œ ๋‹ค๋ฅธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋“ค๊นŒ์ง€ ๊ด€๋ฆฌํ•˜์—ฌ ๋„คํŠธ์›Œํฌ๋ฅผ ํ†ตํ•ด ์ž๋™์œผ๋กœ ๋‹ค์šด ๋ฐ›์•„ ์ค€๋‹ค. + +Maven์€ ํ”„๋กœ์ ํŠธ์˜ ์ „์ฒด์ ์ธ ๋ผ์ดํ”„์‚ฌ์ดํด์„ ๊ด€๋ฆฌํ•˜๋Š” ๋„๊ตฌ์ด๋ฉฐ, ๋งŽ์€ ํŽธ๋ฆฌํ•จ๊ณผ ์ด์ ์ด ์žˆ์–ด ๋„๋ฆฌ ์‚ฌ์šฉ๋˜๊ณ  ์žˆ๋‹ค.
+Maven์€ JDK์„ค์น˜์™€ ๊ฐ™์ด ์„ค์น˜ํ•  ์ˆ˜ ์žˆ๋‹ค. ํ™˜๊ฒฝ๋ณ€์ˆ˜๋ฅผ ์žก์•„์ฃผ๋ฉด cmd์—์„œ **mvn -version**์„ ํ†ตํ•ด ๋ฒ„์ „์„ ์•Œ ์ˆ˜ ์žˆ๊ณ  ์„ค์น˜๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค.
+์„ค์น˜๋Š” [๋ฉ”์ด๋ธ ํ™ˆํŽ˜์ด์ง€](https://maven.apache.org/download.cgi)์—์„œ ํ•  ์ˆ˜ ์žˆ๋‹ค. + +### Maven์˜ Lifecycle +maven ์—์„œ๋Š” ๋ฏธ๋ฆฌ ์ •์˜ํ•˜๊ณ  ์žˆ๋Š” ๋นŒ๋“œ ์ˆœ์„œ๊ฐ€ ์žˆ์œผ๋ฉฐ ์ด ์ˆœ์„œ๋ฅผ ๋ผ์ดํ”„์‚ฌ์ดํด์ด๋ผ๊ณ  ํ•œ๋‹ค. ๋ผ์ดํ”„ ์‚ฌ์ดํด์˜ ๊ฐ ๋นŒ๋“œ ๋‹จ๊ณ„๋ฅผ Phase๋ผ๊ณ  ํ•˜๋Š”๋ฐ, ์ด๋Ÿฐ Phase๋“ค์€ ์˜์กด๊ด€๊ณ„๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.
+ + - Clean : ์ด์ „ ๋นŒ๋“œ์—์„œ ์ƒ์„ฑ๋œ ํŒŒ์ผ๋“ค์„ ์‚ญ์ œํ•˜๋Š” ๋‹จ๊ณ„ + - Validate : ํ”„๋กœ์ ํŠธ๊ฐ€ ์˜ฌ๋ฐ”๋ฅธ์ง€ ํ™•์ธํ•˜๊ณ  ํ•„์š”ํ•œ ๋ชจ๋“  ์ •๋ณด๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๋Š” ๋‹จ๊ณ„ + - Compile : ํ”„๋กœ์ ํŠธ์˜ ์†Œ์Šค์ฝ”๋“œ๋ฅผ ์ปดํŒŒ์ผํ•˜๋Š” ๋‹จ๊ณ„ + - Test : ๋‹จ์œ„ ํ…Œ์ŠคํŠธ๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ๋‹จ๊ณ„ + - ํ…Œ์ŠคํŠธ ์‹คํŒจ ์‹œ, ๋นŒ๋“œ ์‹คํŒจ๋กœ ์ฒ˜๋ฆฌ + - ์Šคํ‚ต ๊ฐ€๋Šฅ + - Package : ์‹ค์ œ ์ปดํŒŒ์ผ๋œ ์†Œ์Šค ์ฝ”๋“œ์™€ ๋ฆฌ์†Œ์Šค๋“ค์„ jar๋“ฑ์˜ ๋ฐฐํฌ๋ฅผ ์œ„ํ•œ ํŒจํ‚ค์ง€๋กœ ๋งŒ๋“œ๋Š” ๋‹จ๊ณ„ + - Verify : ํ†ตํ•ฉํ…Œ์ŠคํŠธ ๊ฒฐ๊ณผ์— ๋Œ€ํ•œ ๊ฒ€์‚ฌ๋ฅผ ์‹คํ–‰ํ•˜์—ฌ ํ’ˆ์งˆ ๊ธฐ์ค€์„ ์ถฉ์กฑํ•˜๋Š”์ง€ ํ™•์ธํ•˜๋Š” ๋‹จ๊ณ„ + - Install : ํŒจํ‚ค์ง€๋ฅผ ๋กœ์ปฌ ์ €์žฅ์†Œ์— ์„ค์น˜ํ•˜๋Š” ๋‹จ๊ณ„ + - Site : ํ”„๋กœ์ ํŠธ ๋ฌธ์„œ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋‹จ๊ณ„ + - Deploy : ๋งŒ๋“ค์–ด์ง„ Package๋ฅผ ์›๊ฒฉ ์ €์žฅ์†Œ์— releaseํ•˜๋Š” ๋‹จ๊ณ„ + +์œ„ 9๊ฐœ์˜ ๋ผ์ดํ”„ ์‚ฌ์ดํด ๋ง๊ณ ๋„ ๋” ๋งŽ์€ ์ข…๋ฅ˜๊ฐ€ ์กด์žฌํ•œ๋‹ค.
+์ด๋ฅผ ํฌ๊ฒŒ Clean, Build, Site ์„ธ ๊ฐ€์ง€๋กœ ๋‚˜๋ˆ„๊ณ  ์žˆ๋‹ค.
+๊ฐ ๋‹จ๊ณ„๋ฅผ ๋ชจ๋‘ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ์›ํ•˜๋Š” ๋‹จ๊ณ„๊นŒ์ง€๋งŒ ์ˆ˜ํ–‰ํ•  ์ˆ˜๋„ ์žˆ์œผ๋ฉฐ test๋‹จ๊ณ„๋Š” ํฐ ํ”„๋กœ์ ํŠธ์˜ ๊ฒฝ์šฐ์— ๋ช‡ ์‹œ๊ฐ„์ด ์†Œ์š”๋  ์ˆ˜ ์žˆ์œผ๋‹ˆ ์ˆ˜ํ–‰ํ•˜์ง€ ์•Š๋„๋ก ์Šคํ‚ต์ด ๊ฐ€๋Šฅํ•˜๋‹ค.
+ +#### Phase์™€ Goal +์œ„์—์„œ ์ž ๊น ์–ธ๊ธ‰ํ—€๋˜ Phase๋Š” Maven์˜ Build LifeCycle์˜ ๊ฐ๊ฐ์˜ ๋‹จ๊ณ„๋ฅผ ์˜๋ฏธํ•œ๋‹ค. ๊ฐ๊ฐ์˜ Phase๋Š” ์˜์กด๊ด€๊ณ„๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์–ด์„œ ํ•ด๋‹น Phase๊ฐ€ ์ˆ˜ํ–‰๋˜๋ ค๋ฉด ์„ ํ–‰ ๋‹จ๊ณ„์˜ Phase๊ฐ€ ๋ชจ๋‘ ์ˆ˜ํ–‰๋˜์–ด์•ผ ํ•œ๋‹ค.
+ +๋ฉ”์ด๋ธ์—์„œ ์ œ๊ณต๋˜๋Š” ๋ชจ๋“  ๊ธฐ๋Šฅ์€ ํ”Œ๋Ÿฌ๊ทธ์ธ ๊ธฐ๋ฐ˜์œผ๋กœ ๋™์ž‘ํ•˜๋Š”๋ฐ ๋ฉ”์ด๋ธ์€ ๋ผ์ดํ”„ ์‚ฌ์ดํด์— ํฌํ•จ ๋˜์–ด์žˆ๋Š” Phase๋งˆ์ €๋„ ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ํ†ตํ•ด ์‹ค์งˆ์ ์ธ ์ž‘์—…์ด ์ˆ˜ํ–‰๋œ๋‹ค. ์ฆ‰ ๊ฐ๊ฐ€์˜ Phase๋Š” ์–ด๋–ค ์ผ์„ ํ• ์ง€ ์ •์˜ํ•˜์ง€ ์•Š๊ณ  ์–ด๋–ค ํ”Œ๋Ÿฌ๊ทธ์ธ์˜ Goal์„ ์‹คํ–‰ํ• ์ง€ ์„ค์ •ํ•œ๋‹ค.
+ +๋ฉ”์ด๋ธ์—์„œ๋Š” ํ•˜๋‚˜์˜ ํ”Œ๋Ÿฌ๊ทธ์ธ์—์„œ ์—ฌ๋Ÿฌ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋„๋ก ์ง€์›ํ•˜๋ฉฐ, ํ”Œ๋Ÿฌ๊ทธ์ธ์—์„œ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ๊ฐ์˜ ๊ธฐ๋Šฅ์„ Goal์ด๋ผ๊ณ  ํ•œ๋‹ค.
+ํ”Œ๋Ÿฌ๊ทธ์ธ์˜ Goal์„ ์‹คํ–‰ํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.
+ - mvn groupId:artifactId:version:goal (์•„๋ž˜์™€ ๊ฐ™์ด ์ƒ๋žต ๊ฐ€๋Šฅ) + - mvn plugin:goal + +### POM(Project Object Model) +pom์€ ์ด๋ฆ„ ๊ทธ๋Œ€๋กœ Project Object Model์˜ ์ •๋ณด๋ฅผ ๋‹ด๊ณ  ์žˆ๋Š” ํŒŒ์ผ์ด๋‹ค. ์ด ํŒŒ์ผ์—์„œ ์ฃผ์š”ํ•˜๊ฒŒ ๋‹ค๋ฃจ๋Š” ๊ธฐ๋Šฅ๋“ค์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.
+ - ํ”„๋กœ์ ํŠธ ์ •๋ณด : ํ”„๋กœ์ ํŠธ์˜ ์ด๋ฆ„, ๊ฐœ๋ฐœ์ž ๋ชฉ๋ก, ๋ผ์ด์„ผ์Šค ๋“ฑ + - ๋นŒ๋“œ ์„ค์ • : ์†Œ์Šค, ๋ฆฌ์†Œ์Šค, ๋ผ์ดํ”„ ์‚ฌ์ดํด๋ณ„ ์‹คํ–‰ํ•œ ํ”Œ๋Ÿฌ๊ทธ์ธ(Goal)๋“ฑ ๋นŒ๋“œ์™€ ๊ด€๋ จ๋œ ์„ค์ • + - ๋นŒ๋“œ ํ™˜๊ฒฝ : ์‚ฌ์šฉ์ž ํ™˜์…ฉ ๋ณ„๋กœ ๋‹ฌ๋ผ์งˆ ์ˆ˜ ์žˆ๋Š” ํ”„๋กœํŒŒ์ผ ์ •๋ณด + - POM์—ฐ๊ด€ ์ •๋ณด : ์˜์กด ํ”„๋กœ์ ํŠธ(๋ชจ๋“ˆ), ์ƒ์œ„ ํ”„๋กœ์ ํŠธ, ํฌํ•จํ•˜๊ณ  ์žˆ๋Š” ํ•˜์œ„ ๋ชจ๋“ˆ ๋“ฑ + +POM์€ pom.xmlํŒŒ์ผ์„ ๋งํ•˜๋ฉฐ Maven์˜ ๊ธฐ๋Šฅ์„ ์ด์šฉํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋œ๋‹ค. + +--- + +## Gradle ์ด๋ž€? +Gradle์ด๋ž€ ๊ธฐ๋ณธ์ ์œผ๋กœ ๋นŒ๋“œ ๋ฐฐํฌ ๋„๊ตฌ(Build Tool)์ด๋‹ค.
+์•ˆ๋“œ๋กœ์ด๋“œ ์•ฑ์„ ๊ฐœ๋ฐœํ• ๋•Œ ํ•„์š”ํ•œ ๊ณต์‹ ๋นŒ๋“œ์‹œ์Šคํ…œ์ด๊ธฐ๋„ ํ•˜๋ฉฐ JAVA, C/C++, Python ๋“ฑ์„ ์ง€์›ํ•œ๋‹ค.
+ +๋นŒ๋“œํˆด์ธ Ant Builder์™€ ๊ทธ๋ฃจ๋น„ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๊ตฌ์ถ•๋˜์–ด ๊ธฐ์กด Ant์˜ ์—ญํ• ๊ณผ ๋ฐฐํฌ ์Šคํฌ๋ฆฝํŠธ์˜ ๊ธฐ๋Šฅ์„ ๋ชจ๋‘ ์‚ฌ์šฉ๊ฐ€๋Šฅํ•˜๋‹ค.
+ +Maven์˜ ๊ฒฝ์šฐ XML๋กœ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ •์˜ํ•˜๊ณ  ํ™œ์šฉํ•˜๋„๋ก ๋˜์–ด ์žˆ์œผ๋‚˜, Gradle์˜ ๊ฒฝ์šฐ ๋ณ„๋„์˜ ๋นŒ๋“œ์Šคํฌ๋ฆฝํŠธ๋ฅผ ํ†ตํ•˜์—ฌ ์‚ฌ์šฉํ•  ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ฒ„์ „, ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋“ฑ์˜ ํ•ญ๋ชฉ์„ ์„ค์ • ํ•  ์ˆ˜ ์žˆ๋‹ค.
+ +์žฅ์ ์œผ๋กœ๋Š” ์Šคํฌ๋ฆฝํŠธ ์–ธ์–ด๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— XML๊ณผ ๋‹ฌ๋ฆฌ ๋ณ€์ˆ˜์„ ์–ธ, if else for ๋“ฑ์˜ ๋กœ์ง์ด ๊ตฌํ˜„ ๊ฐ€๋Šฅํ•˜์—ฌ ๊ฐ„๊ฒฐํ•˜๊ฒŒ ๊ตฌ์„ฑ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.
+ + - ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๊ด€๋ฆฌ : Maven repository๋ฅผ ๋™์ผํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์–ด์„œ ์„ค์ •๋œ ์„œ๋ฒ„๋ฅผ ํ†ตํ•˜์—ฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋‹ค์šด๋กœ๋“œ ๋ฐ›์•„ ๋ชจ๋‘ ๋™์ผํ•œ ์˜์กด์„ฑ์„ ๊ฐ€์ง„ ํ™˜๊ฒฝ์„ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ๋‹ค. ๋˜ํ•œ ์ž์‹ ์ด ์ถ”๊ฐ€ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋„ repo ์„œ๋ฒ„์— ์˜ฌ๋ฆด ์ˆ˜ ์žˆ๋‹ค. + - ํ”„๋กœ์ ํŠธ ๊ด€๋ฆฌ : ๋ชจ๋“  ํ”„๋กœ์ ํŠธ๊ฐ€ ์ผ๊ด€๋œ ๋””๋ ‰ํ† ๋ฆฌ ๊ตฌ์กฐ๋ฅผ ๊ฐ€์ง€๊ณ  ๋นŒ๋“œ ํ”„๋กœ์„ธ์Šค๋ฅผ ์œ ์ง€ํ•˜๋„๋ก ๋„์™€์ค€๋‹ค. + - ๋‹จ์œ„ ํ…Œ์ŠคํŠธ ์‹œ ์˜์กด์„ฑ ๊ด€๋ฆฌ : junit ๋“ฑ์„ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ ๋ช…์‹œํ•œ๋‹ค. + +### Gradle ์žฅ์  +Maven์—๋Š” Gradle๊ณผ ๋น„๊ต๋ฌธ์„œ๊ฐ€ ์—†์ง€๋งŒ, Gradle์—๋Š” ๋น„๊ต๋ฌธ์„œ๊ฐ€ ์žˆ๋‹ค.
+๊ทธ๋งŒํผ Maven์˜ ๋ชจ๋“  ๊ธฐ๋Šฅ์„ ํฌํ•จํ•˜๊ณ  ์žˆ๊ณ , ๋” ๋›ฐ์–ด๋‚˜๋‹ค๊ณ  ํ‘œํ˜„ํ•˜๋Š”๊ฒƒ์ผ๊นŒ?
+Gradle์ด ์‹œ๊ธฐ์ ์œผ๋กœ ๋Šฆ๊ฒŒ ๋‚˜์˜จ๋งŒํผ ์‚ฌ์šฉ์„ฑ, ์„ฑ๋Šฅ ๋“ฑ ๋น„๊ต์  ๋›ฐ์–ด๋‚œ ์ŠคํŽ™์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค. + +### ๊ทธ๋ž˜์„œ Gradle์ด Maven๋ณด๋‹ค ์ข‹์€์ ์€? + - Build๋ผ๋Š” ๋™์ ์ธ ์š”์†Œ๋ฅผ XML๋กœ ์ •์˜ํ•˜๊ธฐ์—๋Š” ์–ด๋ ค์šด ๋ถ€๋ถ„์ด ๋งŽ๋‹ค. + - ์„ค์ • ๋‚ด์šฉ์ด ๊ธธ์–ด์ง€๊ณ  ๊ฐ€๋…์„ฑ์ด ๋–จ์–ด์ง + - ์˜์กด๊ด€๊ณ„๊ฐ€ ๋ณต์žกํ•œ ํ”„๋กœ์ ํŠธ ์„ค์ •ํ•˜๊ธฐ์—๋Š” ๋ถ€์ ์ ˆ + - ์ƒ์†๊ตฌ์กฐ๋ฅผ ์ด์šฉํ•œ ๋ฉ€ํ‹ฐ ๋ชจ๋“ˆ ๊ตฌํ˜„ + - ํŠน์ • ์„ค์ •์„ ์†Œ์ˆ˜์˜ ๋ชจ๋“ˆ์—์„œ ๊ณต์œ ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋ถ€๋ชจ ํ”„๋กœ์ ํŠธ๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ์ƒ์†ํ•˜๊ฒŒ ํ•ด์•ผํ•จ (์ƒ์†์˜ ๋‹จ์ ์ด ์ƒ๊น€) + - Gradle์€ ๊ทธ๋ฃจ๋น„๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ๋™์ ์ธ ๋นŒ๋“œ๋Š” Groovy ์Šคํฌ๋ฆฝํŠธ๋กœ ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ํ˜ธ์ถœํ•˜๊ฑฐ๋‚˜ ์ง์ ‘ ์ฝ”๋“œ๋ฅผ ์งœ๋ฉด ๋œ๋‹ค. + - Configuration Injection ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•ด์„œ ๊ณตํ†ต ๋ชจ๋“ˆ์„ ์ƒ์†ํ•ด์„œ ์‚ฌ์šฉํ•˜๋Š” ๋‹จ์ ์„ ์ปค๋ฒ„ํ–ˆ๋‹ค. + - ์„ค์ • ์ฃผ์ž…์‹œ ํ”„๋กœ์ ํŠธ์˜ ์กฐ๊ฑด์„ ์ฒดํฌํ•  ์ˆ˜ ์žˆ์–ด์„œ ํ”„๋กœ์ ํŠธ๋ณ„๋กœ ์ฃผ์ž…๋˜๋Š” ์„ค์ •์„ ๋‹ค๋ฅด๊ฒŒ ํ•  ์ˆ˜ ์žˆ๋‹ค. + +> Gradle์€ Maven๋ณด๋‹ค ์ตœ๋Œ€ 100๋ฐฐ ๋น ๋ฅด๋‹ค๊ณ  ํ•œ๋‹ค. + +--- + +## ๊ทธ๋ž˜์„œ ๊ฒฐ๋ก ์€? +Gradle์ด ์ถœ์‹œ๋˜์—ˆ์„ ๋•Œ๋Š” Maven์ด ์ง€์›ํ•˜๋Š” Scope๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š์•˜๊ณ  ์„ฑ๋Šฅ๋ฉด์—์„œ๋„ ์•ž์„ค๊ฒƒ์ด ์—†์—ˆ๋‹ค. Ant์˜ ์œ ์—ฐํ•œ ๊ตฌ์กฐ์  ์žฅ์ ๊ณผ Maven์˜ ํŽธ๋ฆฌํ•œ ์˜์กด์„ฑ ๊ด€๋ฆฌ ๊ธฐ๋Šฅ์„ ํ•ฉ์ณ๋†“์€ ๊ฒƒ๋งŒ์œผ๋กœ๋„ ๋งŽ์€ ์ธ๊ธฐ๋ฅผ ์–ป์—ˆ๋˜ Gradle์€ ๋ฒ„์ „์ด ์˜ฌ๋ผ๊ฐ€๋ฉฐ ์„ฑ๋Šฅ์ด๋ผ๋Š” ์žฅ์ ๊นŒ์ง€ ๋”ํ•ด์ง€๋ฉด์„œ ๋Œ€์„ธ๊ฐ€ ๋˜์—ˆ๋‹ค.
+ +๋ฆฌ๋“œ๋ฏธ์ปฌํ•˜๊ฒŒ ํ…Œ์ŠคํŠธ๋ฅผ ์ง„ํ–‰ํ•˜๊ณ  ๋ฏผ์ฒฉํ•œ ์ง€์†์  ๋ฐฐํฌ๋ฅผ ์ƒ๊ฐํ•˜๊ณ  ์žˆ๋‹ค๋ฉด ์ƒˆ๋กœ์šด ๋ฐฐ์›€์ด ํ•„์š”ํ•˜๋”๋ผ๋„ Gradle์„ ์‚ฌ์šฉํ•˜๋Š”๊ฒƒ์ด ์ข‹๋‹ค๊ณ  ์ƒ๊ฐํ•œ๋‹ค.
diff --git a/src/content/blog/study/webdev/2022-03-24-web-note.md b/src/content/blog/study/webdev/2022-03-24-web-note.md new file mode 100644 index 0000000..4291fa3 --- /dev/null +++ b/src/content/blog/study/webdev/2022-03-24-web-note.md @@ -0,0 +1,14 @@ +--- +title: Web ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์— ๋Œ€ํ•œ ์ •๋ฆฌ +date: 2022-03-24 +tags: webdev, ๊ณต๋ถ€ +excerpt: Web ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์— ๋Œ€ํ•œ ์ •๋ฆฌ +--- +# Web ํ”„๋ก ํŠธ์—”๋“œ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์— ๋Œ€ํ•œ ์ดํ•ด์™€ ์ •๋ฆฌ +์ด์ „์— webpack babel eslint ๋“ฑ ๊ธฐ๋ณธ ํ”„๋ก ํŠธ์—”๋“œ ๊ฐœ๋ฐœ์— ๋Œ€ํ•œ ๊ฐœ๋…์˜ ์ดํ•ด์™€ ์ •๋ฆฌ๋ฅผ ํ•œ ์ ์ด ์žˆ์—ˆ๋‹ค. + +๊ทธ๋Ÿฌ๋‚˜ ์˜ค๋ž˜๋˜๊ธฐ๋„ ํ–ˆ๊ณ , ์ •๋ฆฌํ•œ ๋‚ด์šฉ์ด ์—†์–ด์ ธ์„œ(์ด๊ฒƒ์ด ์ •๋ง ํฐ ๋ฌธ์ œ๋‹ค...) ๋‹ค์‹œ ๋ณต์Šต์„ ํ•˜๋ฉด์„œ ์ •๋ฆฌํ•˜๋Š” ์‹œ๊ฐ„์„ ๊ฐ€์ ธ๋ณด๋ ค๊ณ  ํ•œ๋‹ค. + +๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด์„œ ๊ทธ ๋„๊ตฌ์˜ ์‚ฌ์šฉ๋ฒ•์„ ์ •ํ™•ํžˆ ์•Œ์ง€ ๋ชปํ•˜๊ณ  ์‚ฌ์šฉํ•˜๋˜๋Œ€๋กœ๋งŒ ์‚ฌ์šฉํ•˜๋ฉด ๋‹ค๋ฅธ ์œ ํ˜•์˜ ์‚ฌ์šฉ๋ฒ•์ด ํ•„์š”ํ•  ๊ฒฝ์šฐ์—๋Š” ๋Œ€์ฒ˜ํ•˜์ง€ ๋ชปํ•œ๋‹ค๊ณ  ๊ฐœ์ธ์ ์œผ๋กœ ์ƒ๊ฐํ•œ๋‹ค. + +๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ํ™•์‹คํ•˜๊ฒŒ ๊ทธ ๋‚ด์šฉ์„ ์žก๊ณ  ์ •๋ฆฌํ•˜๋ฉด์„œ ๋‹ค์‹œ ํ•œ ๋ฒˆ ๋‚ด๊ฒƒ์œผ๋กœ ๋งŒ๋“ค๊ณ , ๋ชฉํ‘œ๋กœํ•˜๋Š” ์—ญ๋Ÿ‰์„ ํ‚ค์›Œ๋ณด๋„๋ก ํ•˜์ž. diff --git a/src/content/blog/study/webdev/2022-03-24-web-npm.md b/src/content/blog/study/webdev/2022-03-24-web-npm.md new file mode 100644 index 0000000..dba718c --- /dev/null +++ b/src/content/blog/study/webdev/2022-03-24-web-npm.md @@ -0,0 +1,273 @@ +--- +title: Web ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์— ๋Œ€ํ•œ ์ดํ•ด - NPM +date: 2022-03-24 +tags: webdev, ๊ณต๋ถ€ +excerpt: NPM ์ด๋ž€? +--- +# ํ”„๋ก ํŠธ์—”๋“œ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์˜ ์ดํ•ด : NPM +Node.js๋Š” ๋ฐฑ์—”๋“œ๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๊ธฐ์ˆ ์ด๋ผ๊ณ  ์ƒ๊ฐํ–ˆ๋˜ ๋•Œ๊ฐ€ ์žˆ์—ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์š”์ฆ˜์€ FE ๊ณต๊ณ ์—๋„ Node.js ๊ธฐ์ˆ ์ด ์šฐ๋Œ€์‚ฌํ•ญ์ด ๋˜๊ณ  ์žˆ๋Š”๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ์—ˆ๋‹ค. ์›น ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ฐœ๋ฐœํ•˜๋Š”๋ฐ ์žˆ์–ด์„œ ์ง์ ‘์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š”๊ฒƒ์€ ์•„๋‹ˆ์ง€๋งŒ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์„ ๊ตฌ์„ฑํ•˜๊ณ  ์ดํ•ดํ•˜๋Š”๋ฐ์—๋Š” Node.js๋ฅผ ๋ชจ๋ฅธ๋‹ค๋ฉด ์–ธ์  ๊ฐ€ ๋ง‰ํžˆ๋Š” ๋•Œ๊ฐ€ ์˜จ๋‹ค๊ณ  ํ•œ๋‹ค. + +--- + +## 1. ํ”„๋ก ํŠธ์—”๋“œ ๊ฐœ๋ฐœ์— Node.js๊ฐ€ ํ•„์š”ํ•œ ์ด์œ  +### ์ตœ์‹  ์ŠคํŽ™์œผ๋กœ ๊ฐœ๋ฐœ ํ•  ์ˆ˜ ์žˆ๋‹ค +์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์ŠคํŽ™์˜ ๋น ๋ฅธ ๋ฐœ์ „์— ๋น„ํ•ด ๋ธŒ๋ผ์šฐ์ ธ์˜ ์ง€์› ์†๋„๋Š” ํ•ญ์ƒ ๋’ค์ณ์ง„๋‹ค. ์•„๋ฌด๋ฆฌ ํŽธ๋ฆฌํ•œ ์ŠคํŽ™์ด ๋‚˜์˜ค๋”๋ผ๋„ ์ด๊ฒƒ์„ ๊ตฌํ˜„ํ•ด ์ฃผ๋Š” ์ค‘๊ฐ„๋‹ค๋ฆฌ์˜ ์—ญํ• , ์˜ˆ๋ฅผ ๋“ค์ž๋ฉด ๋ฐ”๋ฒจ๊ณผ ๊ฐ™์€ ๋„๊ตฌ์˜ ๋„์›€ ์—†์ด๋Š” ๋ถ€์กฑํ•˜๋‹ค. ๋”๋ถˆ์–ด ์›นํŒฉ, NPM ๊ฐ™์€ ๋…ธ๋“œ ๊ธฐ์ˆ ๋กœ ๋งŒ๋“ค์–ด์ง„ ํ™˜๊ฒฝ์—์„œ ์‚ฌ์šฉํ•  ๋•Œ ๋น„๋กœ์†Œ ์ž๋™ํ™”๋œ ํ”„๋ก ํŠธ์—”๋“œ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์„ ๊ฐ–์ถœ ์ˆ˜ ์žˆ๋‹ค. + +๋งˆ์ฐฌ๊ฐ€์ง€๋กœ Typescript, SASS ๊ฐ™์€ ๊ณ ์ˆ˜์ค€ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ์ „์šฉ **ํŠธ๋žœ์ŠคํŒŒ์ผ๋Ÿฌ**๊ฐ€ ํ•„์š”ํ•˜๋‹ค. ๋ฌผ๋ก  ์ด๊ฒƒ ์—ญ์‹œ Node.js ํ™˜๊ฒฝ์ด ๋’ท๋ฐ›์นจ ๋˜์–ด์•ผ ์šฐ๋ฆฌ๊ฐ€ ๋งํ•˜๋Š” ํ”„๋ก ํŠธ์—”๋“œ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค. + +### ๋นŒ๋“œ ์ž๋™ํ™” +๊ณผ๊ฑฐ์ฒ˜๋Ÿผ ์ฝ”๋”ฉ ๊ฒฐ๊ณผ๋ฌผ์„ ๋ธŒ๋ผ์šฐ์ ธ์— ๋ฐ”๋กœ ์˜ฌ๋ฆฌ๋Š” ๊ฒฝ์šฐ๋Š” ํ”์น˜ ์•Š๋‹ค๊ณ  ํ•œ๋‹ค.
+ํŒŒ์ผ์„ ์••์ถ•ํ•˜๊ณ , ์ฝ”๋“œ๋ฅผ ๋‚œ๋…ํ™”ํ•˜๊ณ , ํด๋ฆฌํ•„์„ ์ถ”๊ฐ€ํ•˜๋Š” ๋“ฑ ๊ฐœ๋ฐœ ์ด์™ธ์˜ ์ž‘์—…์„ ๊ฑฐ์นœ ํ›„์—์•ผ ๋ฐฐํฌ๋ฅผ ํ•˜๊ฒŒ ๋œ๋‹ค.
+Node.js๋Š” ์ด๋Ÿฌํ•œ ์ผ๋ จ์˜ ๋นŒ๋“œ ๊ณผ์ •์„ ์ดํ•ดํ•˜๋Š”๋ฐ ๋งŽ์€ ์—ญํ• ์„ ํ•˜๊ณ  ์žˆ๋‹ค. ๋˜ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์˜์กด์„ฑ์„ ํ•ด๊ฒฐํ•˜๊ณ , ๊ฐ์ข… ํ…Œ์ŠคํŠธ๋ฅผ ์ž๋™ํ™”ํ•˜๋Š”๋ฐ๋„ ์‚ฌ์šฉ๋œ๋‹ค. + +### ๊ฐœ๋ฐœ ํ™˜๊ฒฝ ์ปค์Šคํ„ฐ๋งˆ์ด์ง• +๊ฐ ํ”„๋ ˆ์ž„์›Œํฌ์—์„œ ์ œ๊ณตํ•˜๋Š” ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์†์‰ฝ๊ฒŒ ๊ฐœ๋ฐœํ™˜๊ฒฝ์„ ๊ฐ–์ถœ ์ˆ˜ ์žˆ๋„๋ก ์ง€์›ํ•˜๊ณ  ์žˆ๋‹ค.
+React.js์˜ CRA(create-react-app), Vuejs์˜ vue-cli๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด ์†์‰ฝ๊ฒŒ ๊ฐœ๋ฐœํ™˜๊ฒฝ์„ ๊ฐ–์ถœ ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด๋‹ค.
+๊ทธ๋Ÿฌ๋‚˜ ๊ฐœ๋ฐœ ํ”„๋กœ์ ํŠธ๋Š” ๊ฐ์ž์˜ ๋ชฉ์ ์ด๋‚˜ ์‚ฌ์šฉ๋ฐฉ๋ฒ•์— ์žˆ์–ด์„œ ํ˜•ํŽธ์ด๋ผ๋Š” ๊ฒƒ์ด ์žˆ์–ด์„œ ํˆด์„ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ๋„ ๋นˆ๋ฒˆํ•˜๋‹ค.
์–ด์ฉŒ๋ฉด ์ž๋™ํ™”๋œ ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋Š” ํ™˜๊ฒฝ์ด ๋‹ค๊ฐ€์˜ฌ์ˆ˜๋„ ์žˆ๋Š”๋ฐ, ๊ทธ ๋•Œ์— ์ง์ ‘ ํ™˜๊ฒฝ์„ ๊ตฌ์ถ•ํ•ด์•ผ ํ•  ์ˆ˜๋„ ์žˆ๋‹ค.
+์ปค์Šคํ„ฐ๋งˆ์ด์ง•์„ ํ•˜๋ ค๋ฉด ๋ฐ˜๋“œ์‹œ Node.js ์ง€์‹์ด ํ•„์š”ํ•˜๋‹ค.
+ + +์œ„์—์„œ ๋ฐฐ๊ฒฝํ•˜์— Node.js๋Š” ํ”„๋ก ํŠธ์—”๋“œ ๊ฐœ๋ฐœ์—์„œ ํ•„์ˆ˜ ๊ธฐ์ˆ ๋กœ ์ž๋ฆฌ๋งค๊น€ํ•˜๊ณ  ์žˆ๋‹ค.
+์ด๋ฒˆ์—๋Š” Node.js ๊ธฐ์ˆ ์„ ๋ฐ”ํƒ•์œผ๋กœ ํ”„๋ก ํŠธ์—”๋“œ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์„ ์ดํ•ดํ•˜๊ณ  ์ง์ ‘ ๊ตฌ์„ฑํ•ด๋ณด๋ฉด ์ข‹์„ ๊ฒƒ ๊ฐ™๋‹ค. + +-------- + +## 2. Node.js ์„ค์น˜ +๋…ธ๋“œ ์„ค์น˜๋Š” ๋ฌด์ฒ™ ๊ฐ„๋‹จํ•˜๋‹ค. ์ž์‹ ์˜ ์šด์˜์ฒด์ œ์— ๋งž๊ฒŒ ์„ค์น˜ํŒŒ์ผ์„ ๋‹ค์šด๋ฐ›์œผ๋ฉด ๋œ๋‹ค.
+[Nodejs.org](https://Nodejs.org) ์‚ฌ์ดํŠธ์—์„œ ๋…ธ๋“œ ์ตœ์‹  ๋ฒ„์ „์„ ๋‹ค์šด๋กœ๋“œ ๋ฐ›์•„ ๋ณด์ž.
+ +๋‘ ๊ฐ€์ง€ ๋ฒ„์ „์„ ์„ ํƒํ•˜์—ฌ ์„ค์น˜ํ•  ์ˆ˜ ์žˆ๋‹ค. ์™ผ์ชฝ ์ง์ˆ˜ ๋ฒ„์ „, ์˜ค๋ฅธ์ชฝ์ด ํ™€์ˆ˜ ๋ฒ„์ „์ด๋‹ค. ์•ˆ์ •์ ์ด๊ณ  ์žฅ๊ธฐ๊ฐ„ ์ง€์›ํ•˜๋Š” ๊ฒƒ์ด ์ง์ˆ˜ ๋ฒ„์ „์ด๊ณ , ๋ถˆ์•ˆ์ •ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์ตœ์‹  ๊ธฐ๋Šฅ์„ ์ง€์›ํ•˜๋Š” ๊ฒƒ์ด ํ™€์ˆ˜ ๋ฒ„์ „์ด๋‹ค. ๋ฆฌ๋ˆ…์Šค ๋ฐฐํฌ๋ฒ„์ „๊ณผ ๋น„์Šทํ•œ ๊ด€๋ก€๋ฅผ ๋”ฐ๋ฅธ๋‹ค๊ณ  ํ•œ๋‹ค.
+ +- ์ง์ˆ˜ ๋ฒ„์ „ : ์•ˆ์ •์ , ์‹ ๋ขฐ๋„ ๋†’์Œ (LTS) +- ํ™€์ˆ˜ ๋ฒ„์ „ : ์ตœ์‹  ๊ธฐ๋Šฅ + +์ด์™•์ด๋ฉด ์˜ค๋ฅธ์ชฝ์— ์žˆ๋Š” ์ตœ์‹  ๋ฒ„์ „์„ ์„ ํƒํ•ด์„œ ๋‹ค์šด๋กœ๋“œ ๋ฐ›์•„๋ณด์ž. ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์— ๋Œ€ํ•œ ์ดํ•ด๋‹ˆ๊นŒ! (๋งŒ์•ฝ Node.js๋กœ ์„œ๋ฒ„๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ๊ฒฝ์šฐ๋ผ๋ฉด ์–ด๋–ค ๋ฒ„์ „์„ ์‚ฌ์šฉํ• ์ง€ ์‹ ์ค‘ํ•˜๊ฒŒ ์„ ํƒํ•ด์•ผ ํ•œ๋‹ค.) + +![img](/assets/img/web_dev/nodejs.png) + +์„ค์น˜ํ™”๋ฉด์ด ๋‚˜์˜ค๊ณ  ๋ฒ„ํŠผ์„ ๋ช‡ ๋ฒˆ ํด๋ฆญํ•˜๋ฉด ์•„๋ž˜ ๊ฒฝ๋กœ๋กœ Node.js์™€ NPM์ด ์„ค์น˜๊ฐ€ ์™„๋ฃŒ๋œ๋‹ค.
+ + - Node.js : `\usr\local\bin\node` + - NPM : `\usr\local\bin\npm` + +์„ค์น˜๊ฐ€ ์™„๋ฃŒ๋œ ํ›„, ํ„ฐ๋ฏธ๋„์„ ์—ด์–ด์„œ ๋ช…๋ น์–ด๋ฅผ ํ†ตํ•ด ํ™•์ธํ•ด ๋ณผ ์ˆ˜ ์žˆ๋‹ค. +``` +$ node +> 1 + 2 +3 +``` + +`>` ํ”„๋กฌํ”„ํŠธ์™€ ํ•จ๊ป˜ ์ž…๋ ฅ ๋Œ€๊ธฐํ™”๋ฉด์ด ๋‚˜์˜จ๋‹ค. ์ •์ˆ˜ ๊ณ„์‚ฐ์ด๋‚˜ `console.log()` ๊ฐ™์€ ๋‚ด์šฉ๋„ ์‹คํ–‰ ํ•  ์ˆ˜ ์žˆ๋‹ค. + +์ด๊ฒƒ์„ ๋…ธ๋“œ REPL(read-eval-print loop)์ด๋ผ๊ณ  ๋ถ€๋ฅด๋Š”๋ฐ, ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์ฝ”๋“œ๋ฅผ ์ž…๋ ฅํ•˜๊ณ  ์ฆ‰์‹œ ๊ฒฐ๊ณผ๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋Š” ํ”„๋กœ๊ทธ๋žจ์ด๋‹ค. ํŒŒ์ด์ฌ์ด๋‚˜ PHP ๊ฐ™์€ ์–ธ์–ด๋„ ์ œ๊ณตํ•˜๋Š” ๊ธฐ๋Šฅ์ด๋‹ค. + +`.exit` ๋ช…๋ น์„ ์‹คํ–‰ํ•˜๊ฑฐ๋‚˜ `ctrl + c`๋ฅผ ์—ฐ์† ๋‘ ๋ฒˆ ์ž…๋ ฅํ•˜๋ฉด REPL ํ”„๋กœ๊ทธ๋žจ์—์„œ ๋น ์ ธ ๋‚˜์˜ฌ ์ˆ˜ ์žˆ๋‹ค.
+ +์ด๋ฒˆ์—๋Š” `--version` ์˜ต์…˜์„ ์ถ”๊ฐ€ํ•ด์„œ ์„ค์น˜๋œ ๋ฒ„์ „์„ ํ™•์ธํ•ด ๋ณธ๋‹ค. +``` +$ node --version +v17.3.1 +``` +NPM(Node Package Manage)๋„ ํ™•์ธ ํ•  ์ˆ˜ ์žˆ๋‹ค. +``` +$ npm +Usage: npm + +$ npm --version +8.3.0 +``` +์ด๋ ‡๊ฒŒ ๊ฐ Node.js์™€ NPM์„ ์„ค์น˜ํ•˜๊ณ  ๊ฐ ์„ค์น˜๋œ ๋ฒ„์ „์„ ํ™•์ธํ•ด ๋ณผ ์ˆ˜ ์žˆ๋‹ค. + +--- + +## 3. ํ”„๋กœ์ ํŠธ ์ดˆ๊ธฐํ™” +๊ฐœ๋ฐœ ํ”„๋กœ์ ํŠธ๋Š” ์™ธ๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋‹ค์šด๋กœ๋“œ ๋ฐ›๊ณ  ๋นŒ๋“œํ•˜๋Š” ๋“ฑ ์ผ๋ จ์˜ ๋ช…๋ น์–ด๋ฅผ ์ž๋™ํ™”ํ•˜์—ฌ ํ”„๋กœ์ ํŠธ๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ๋„๊ตฌ๊ฐ€ ์กด์žฌํ•œ๋‹ค. PHP์˜ ์ปดํฌ์ €(Composer)๋‚˜ ์ž๋ฐ”์˜ ๊ทธ๋ž˜๋“ค(Gradle) ๊ฐ™์€ ํˆด์ด ๊ทธ๋Ÿฌํ•œ ํ”„๋กœ๊ทธ๋žจ์ด๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ๋‹ค.
+NPM์€ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋ฐ˜ ํ”„๋กœ์ ํŠธ์˜ ๋นŒ๋“œ ๋„๊ตฌ์ธ ์…ˆ์ด๋‹ค. NPM์„ ์ด์šฉํ•ด ํ”„๋ก ํŠธ์—”๋“œ ๊ฐœ๋ฐœ ํ”„๋กœ์ ํŠธ๋ฅผ ์„ธํŒ…ํ•ด๋ณด์ž. + +### 3-1. INIT +NPM์€ ๋‹ค์–‘ํ•œ ํ•˜์œ„ ๋ช…๋ น์–ด๋ฅผ ์ œ๊ณตํ•˜๋Š”๋ฐ, ๊ทธ ์ค‘ `init` ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํ”„๋กœ์ ํŠธ๋ฅผ ์ƒ์„ฑ ํ•  ์ˆ˜ ์žˆ๋‹ค. +```shell +$ npm init + +package name: (npm sampple) +version: +description: +entry point: +test command: +git repository: +keywords: +author: +license: +``` + +์œ„์˜ ๋‚ด์šฉ์—์„œ ๋ณผ ์ˆ˜ ์žˆ๋“ฏ์ด ํŒจํ‚ค์ง€ ์ด๋ฆ„, ๋ฒ„์ „ ๋“ฑ ํ”„๋กœ์ ํŠธ์™€ ๊ด€๋ จ๋œ ์ •๋ณด๋“ค์„ ์–ป๊ธฐ ์œ„ํ•œ ๋ช‡ ๊ฐ€์ง€ ์งˆ๋ฌธ๋“ค์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.
+๋นˆ์นธ์œผ๋กœ ๋‚จ๊ฒจ ๋†“์œผ๋ฉด ๊ด„ํ˜ธ ์•ˆ์— ๊ธฐ๋ณธ ๊ฐ’์œผ๋กœ ์„ธํŒ…ํ•  ์ˆ˜ ์žˆ๋‹ค. ๋ชจ๋“  ์งˆ๋ฌธ์— ๋‹ตํ•˜๋ฉด ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•œ ํด๋”์— package.json ํŒŒ์ผ์ด ์ƒ์„ฑ๋œ๋‹ค.
+๋ชจ๋‘ ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ ์„ธํŒ…ํ•˜๋ ค๋ฉด `npm init -y` ๋ช…๋ น์–ด๋กœ ์งˆ๋ฌธ์„ ์Šคํ‚ตํ•˜๊ณ  package.json ํŒŒ์ผ์„ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.
+ +### 3-2. Package.json +Node.js๋Š” package.json ํŒŒ์ผ์— ํ”„๋กœ์ ํŠธ์˜ ๋ชจ๋“  ์ •๋ณด๋ฅผ ๊ธฐ๋กํ•œ๋‹ค. + + - name: ํ”„๋กœ์ ํŠธ ์ด๋ฆ„ + - version: ํ”„๋กœ์ ํŠธ ๋ฒ„์ „ ์ •๋ณด + - description: ํ”„๋กœ์ ํŠธ ์„ค๋ช… + - main: ๋…ธ๋“œ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์ผ ๊ฒฝ์šฐ ์ง„์ž…์  ๊ฒฝ๋กœ. ํ”„๋ก ํŠธ์—”๋“œ ํ”„๋กœ์ ํŠธ์ผ ๊ฒฝ์šฐ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค. + - scripts: ํ”„๋กœ์ ํŠธ ๋ช…๋ น์–ด๋ฅผ ๋“ฑ๋กํ•  ์ˆ˜ ์žˆ๋‹ค.์ดˆ๊ธฐํ™”์‹œ test ๋ช…๋ น์–ด๊ฐ€ ์ƒ˜ํ”Œ๋กœ ๋“ฑ๋ก๋˜์–ด ์žˆ๋‹ค + - author: ํ”„๋กœ๊ทธ๋žจ ์ž‘์„ฑ์ž + - license: ๋ผ์ด์„ผ์Šค + + ๊ฐ ํ•ญ๋ชฉ์˜ ์˜๋ฏธ๋Š” ์œ„์˜ ๋‚ด์šฉ๊ณผ ๊ฐ™๋‹ค. + +-------- + + ## 4. ํ”„๋กœ์ ํŠธ ๋ช…๋ น์–ด +์ƒ์„ฑํ•œ ํ”„๋กœ์ ํŠธ๋Š” package.json์— ๋“ฑ๋กํ•œ ์Šคํฌ๋ฆฝํŠธ(script)๋ฅผ ์ด์šฉํ•ด ์‹คํ–‰ํ•œ๋‹ค.
+์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋นŒ๋“œ, ํ…Œ์ŠคํŠธ, ๋ฐฐํฌ, ์‹คํ–‰ ๋“ฑ์˜ ๋ช…๋ น์–ด๋ฅผ ๋“ฑ๋กํ•˜์—ฌ ์‹คํ–‰ํ•˜๋Š”๋ฐ์—๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.
+ +```shell +$ npm test + +Error: no test specified +npm ERR! Test failed. See above for more details. +``` + +์—๋Ÿฌ ๋ฉ”์„ธ์ง€๋ฅผ ์ถœ๋ ฅํ•˜๊ณ  ๊ทธ ๋‹ค์Œ ์ค„์— npm ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค. ์ด๊ฒƒ์€ npm ์Šคํฌ๋ฆฝํŠธ์— ๋“ฑ๋ก๋œ ์‰˜ ์Šคํฌ๋ฆฝํŠธ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. + +package.json +```javascript +{ + "script": { + "test": "echo \"Error: no test specified\" && exit 1" + } +} +``` +echo ๋ช…๋ น์–ด๋กœ ๋ฉ”์„ธ์ง€ "Error: no test specified"๋ฅผ ์ถœ๋ ฅํ•œ๋’ค ์—๋Ÿฌ ์ฝ”๋“œ 1์„ ๋˜์ง€๋ฉด์„œ ์ข…๋ฃŒํ•˜๋Š” ๋™์ž‘์ด๋‹ค. ์—๋Ÿฌ ์ฝ”๋“œ 1์„ ํ™•์ธํ•˜๋ฉด ์—๋Ÿฌ("npm ERR!...")๋ฅผ ์ถœ๋ ฅํ•˜๊ฒŒ๋œ๋‹ค. + +NPM์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋ช…๋ น์–ด๋Š” ๋ช‡ ๊ฐ€์ง€๋‚˜ ๋ ๊นŒ? ํ™•์ธํ•ด๋ณด์ž๋ฉด ์•„๋ž˜๋ฅผ ์‚ดํŽด๋ณด์ž. +```shell +Usage: npm + +where is one of: + access, adduser, audit, bin, bugs, c, cache, ci, cit, + clean-install, clean-install-test, completion, config, + create, ddp, dedupe, deprecate, dist-tag, docs, doctor, + edit, explore, get, help, help-search, hook, i, init, + install, install-ci-test, install-test, it, link, list, ln, + login, logout, ls, org, outdated, owner, pack, ping, prefix, + profile, prune, publish, rb, rebuild, repo, restart, root, + run, run-script, s, se, search, set, shrinkwrap, star, + stars, start, stop, t, team, test, token, tst, un, + uninstall, unpublish, unstar, up, update, v, version, view, + whoami +``` +์—„์ฒญ๋‚˜๊ฒŒ ๋งŽ๋‹ค. ๋ณดํ†ต ์‚ฌ์šฉํ•˜๋Š” ๋ช…๋ น์–ด๋Š” start, test, install, uninstall์ด๋‹ค. + - start : ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ์‹คํ–‰ + - test : ํ…Œ์ŠคํŠธ + - install : ํŒจํ‚ค์ง€ ์„ค์น˜ + - uninsatll : ํŒจํ‚ค์ง€ ์‚ญ์ œ + +๋ช…๋ น์–ด๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜๋„ ์žˆ๋‹ค. ๋นŒ๋“œ๋ฅผ ์œ„ํ•œ 'build' ์Šคํฌ๋ฆฝํŠธ๋Š” package.json์˜ scripts์— build ํ‚ค๋ฅผ ๋“ฑ๋กํ•˜์—ฌ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. +```javascript +{ + "scripts": { + "build" : "์—ฌ๊ธฐ์— ๋นŒ๋“œ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ๋“ฑ๋กํ•œ๋‹ค." + } +} +``` + +์ปค์Šคํ…€์œผ๋กœ ๋“ฑ๋กํ•œ ์Šคํฌ๋ฆฝํŠธ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์‹คํ–‰ํ•œ๋‹ค. +```shell +$ npm run build +``` + +ํ”„๋ก ํŠธ์—”๋“œ ๊ฐœ๋ฐœ์„ ์œ„ํ•ด ๋“ฑ๋กํ•ด์•ผํ•  ์Šคํฌ๋ฆฝํŠธ๋Š” ๋‘ ๊ฐ€์ง€ ์ •๋„๊ฐ€ ์žˆ๊ฒ ๋‹ค. + - build : ์†Œ์Šค ๋นŒ๋“œ + - lint : ์†Œ์Šค ์ปจ๋ฒค์…˜ ๊ฒ€์‚ฌ + +--- + +## 5. ํŒจํ‚ค์ง€ ์„ค์น˜ +### 5-1. CDN์„ ์ด์šฉํ•œ ๋ฐฉ๋ฒ• +์™ธ๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๊ฐ€์ ธ๋‹ค ์“ฐ๋Š” ๊ฒƒ์€ ๋ฌด์ฒ™ ์ž์—ฐ์Šค๋Ÿฌ์šด ์ผ์ด๋‹ค. ๊ฐ„๋‹จํ•œ ๋ฐฉ๋ฒ•์€ CDN(Content Delivery Network)์œผ๋กœ ์ œ๊ณตํ•˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ง์ ‘ ๊ฐ€์ ธ ์˜ค๋Š” ๋ฐฉ์‹์ด๋‹ค. ๋ฆฌ์•กํŠธ์˜ ์ฃผ์†Œ๋ฅผ html์—์„œ ๋กœ๋”ฉํ•œ๋‹ค. +```javascript + +``` + +CDN์˜ ์„œ๋ฒ„ ์žฅ์• ๋กœ ์ธํ•ด ์™ธ๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค๋ฉด ์–ด๋–ป๊ฒŒ ๋ ๊นŒ??
+์•„๋ฌด๋ฆฌ ์šฐ๋ฆฌ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ์„œ๋ฒ„๊ฐ€ ์ •์ƒ์ด๋”๋ผ๋„ ํ•„์ˆ˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๊ฐ€์ ธ์˜ค์ง€ ๋ชปํ•œ๋‹ค๋ฉด ์›น ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ์ •์ƒ์ ์œผ๋กœ ๋™์ž‘ํ•˜์ง€ ์•Š์„ ๊ฒƒ์ด๋‹ค.
+ +### 5-2. ์ง์ ‘ ๋‹ค์šด๋กœ๋“œ ๋ฐ›๋Š” ๋ฐฉ๋ฒ• +๊ทธ๋ ‡๋‹ค๋ฉด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ฝ”๋“œ๋ฅผ ์šฐ๋ฆฌ ํ”„๋กœ์ ํŠธ ํด๋”์— ๋‹ค์šด๋ฐ›์•„ ๋†“๋Š”๊ฑด ์–ด๋–จ๊นŒ? CDN์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์žฅ์• ์™€ ๋…๋ฆฝ์ ์œผ๋กœ ์›น ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ ๊ฐ™๋‹ค.
+ +ํ•˜์ง€๋งŒ ์ด๋Ÿฐ ์ƒํ™ฉ๋„ ์žˆ๋‹ค. ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ๊ณ„์†ํ•ด์„œ ์—…๋ฐ์ดํŠธ ๋  ๊ฒƒ์ด๊ณ , ์šฐ๋ฆฌ ํ”„๋กœ์ ํŠธ์—์„œ๋„ ์ตœ์‹  ๋ฒ„์ „์œผ๋กœ ๊ต์ฒดํ•ด์•ผ ํ•œ๋‹ค. ๋งค๋ฒˆ ์ง์ ‘ ๋‹ค์šด๋กœ๋“œํ•˜๋Š” ๊ฒƒ์€ ๋งค์šฐ ๊ท€์ฐฎ์€ ์ผ์ด ๋  ๊ฒƒ์ด๋‹ค. ๋ฒ„์ „์— ๋”ฐ๋ผ ํ•˜์œ„ ํ˜ธํ™˜์„ฑ ์—ฌ๋ถ€๊นŒ์ง€ ํ™•์ธํ•˜๋ ค๋ฉด ์‹ค์ˆ˜ํ•  ์—ฌ์ง€๊ฐ€ ๋งŽ๋‹ค.
+ +๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์–ด๋А ํ•œ ๊ณณ์—์„œ ์—…๋ฐ์ดํŠธํ•˜๊ณ  ํ•˜์œ„ ํ˜ธํ™˜๋˜๋Š” ์•ˆ์ „ํ•œ ๋ฒ„์ „๋งŒ ๋‹ค์šด๋ฐ›์•„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ์–ด๋–จ๊นŒ?
+ +### 5-3. NPM์„ ์ด์šฉํ•œ ๋ฐฉ๋ฒ• +NPM์€ ์ด๋Ÿฐ ๋ฐฉ์‹์œผ๋กœ ํŒจํ‚ค์ง€๋ฅผ ๊ด€๋ฆฌํ•œ๋‹ค. `npm install` ๋ช…๋ น์–ด๋กœ ์™ธ๋ถ€ ํŒจํ‚ค์ง€๋ฅผ ์šฐ๋ฆฌ ํ”„๋กœ์ ํŠธ ํด๋”์— ๋‹ค์šด๋กœ๋“œ ํ•ด๋ณด์ž. +```shell +$ npm install react +``` +์ตœ์‹  ๋ฒ„์ „์˜ react๋ฅผ NPM ์ €์žฅ์†Œ์—์„œ ์ฐพ์•„ ์šฐ๋ฆฌ ํ”„๋กœ์ ํŠธ๋กœ ๋‹ค์šด๋กœ๋“œ ํ•˜๋Š” ๋ช…๋ น์–ด๋‹ค. package.json์—๋Š” ์„ค์น˜ํ•œ ํŒจํ‚ค์ง€ ์ •๋ณด๋ฅผ ๊ธฐ๋กํ•œ๋‹ค. +```javascript +{ + "dependencies": { + "react": "^16.12.0" + } +} +``` +๋ฒ„์ „ 16.12.0์„ ์„ค์น˜ํ–ˆ๋‹ค๋Š” ์˜๋ฏธ์ด๋‹ค. + +### 5-4. ์œ ์˜์  ๋ฒ„์ „ +"^16.12.0"์ด ์˜๋ฏธํ•˜๋Š” ๋ฐ”๋Š” ๋ฌด์—‡์ผ๊นŒ?
+ +์œ„ ์งˆ๋ฌธ์— ๋‹ตํ•˜๊ธฐ ์ „์— ๋ฒ„์ „ ๊ด€๋ฆฌ์— ๋Œ€ํ•ด์„œ ์ƒ๊ฐํ•ด ๋ณผ ํ•„์š”๊ฐ€ ์žˆ๋‹ค. ๋งŒ์•ฝ ํ”„๋กœ์ ํŠธ์—์„œ ์‚ฌ์šฉํ•˜๋Š” ํŒจํ‚ค์ง€์˜ ๋ฒ„์ „์„ ์—„๊ฒฉํ•˜๊ฒŒ ์ œํ•œํ•œ๋‹ค๋ฉด ์–ด๋–จ๊นŒ? ํ”„๋กœ์ ํŠธ๋ฅผ ๋ฒ„์ „์—… ํ•˜๋Š”๋ฐ ๊ฝค ํž˜๋“ค ์ˆ˜ ์žˆ๋‹ค. **์‚ฌ์šฉํ•˜๋Š” ํŒจํ‚ค์ง€๋ฅผ ์ „๋ถ€ ๋ฒ„์ „์—…ํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ**์ด๋‹ค. ์–ด์ฉŒ๋ฉด ์šฐ๋ฆฌ ํ”„๋กœ์ ํŠธ๋Š” ํ˜„์žฌ ๋ฒ„์ „์— ๊ฐ‡ํ˜€ ๋ฒ„๋ฆด์ง€๋„ ๋ชจ๋ฅธ๋‹ค. + +๊ทธ๋Ÿผ ํ”„๋กœ์ ํŠธ์—์„œ ์‚ฌ์šฉํ•˜๋Š” ํŒจํ‚ค์ง€ ๋ฒ„์ „์„ ๋А์Šจํ•˜๊ฒŒ ํ’€์–ด ๋†“์œผ๋ฉด ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋ ๊นŒ? ์˜คํžˆ๋ ค ์—ฌ๋Ÿฌ ๋ฒ„์ „๋ณ„๋กœ ์ฝ”๋“œ๋ฅผ ๊ด€๋ฆฌํ•ด์•ผํ•˜๋Š” ํ˜ผ๋ž€์Šค๋Ÿฌ์›€์„ ๊ฒช๊ฒŒ๋  ์ˆ˜ ์žˆ๋‹ค. + +๋ฒ„์ „ ๋ฒˆํ˜ธ๋ฅผ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ ๊ทœ์น™์ด ํ•„์š”ํ•œ๋ฐ ์ด ์ฒด๊ณ„๋ฅผ **"์œ ์˜์  ๋ฒ„์ „"**์ด๋ผ๊ณ  ํ•œ๋‹ค. NPM์€ ์ด ์œ ์˜์  ๋ฒ„์ „(Sementic Version)์„ ๋”ฐ๋ฅด๋Š” ์ „์ œ ์•„๋ž˜ ํŒจํ‚ค์ง€ ๋ฒ„์ „์„ ๊ด€๋ฆฌํ•œ๋‹ค. + +์œ ์˜์  ๋ฒ„์ „์€ ์ฃผ(Major), ๋ถ€(Minor), ์ˆ˜(Patch) ์„ธ ๊ฐ€์ง€ ์ˆซ์ž๋ฅผ ์กฐํ•ฉํ•ด์„œ ๋ฒ„์ „์„ ๊ด€๋ฆฌํ•œ๋‹ค. ์œ„์— ์„ค์น˜ํ•œ react์˜ ๋ฒ„์ „์€ v16.12.0์ธ๋ฐ ์ฃผ ๋ฒ„์ „์ด 16, ๋ถ€ ๋ฒ„์ „์ด 12, ์ˆ˜ ๋ฒ„์ „์ด 0์ธ ์…ˆ์ด๋‹ค. + + - ์ฃผ ๋ฒ„์ „(Major Version): ๊ธฐ์กด ๋ฒ„์ „๊ณผ ํ˜ธํ™˜๋˜์ง€ ์•Š๊ฒŒ ๋ณ€๊ฒฝํ•œ ๊ฒฝ์šฐ + - ๋ถ€ ๋ฒ„์ „(Minor version): ๊ธฐ์กด ๋ฒ„์ „๊ณผ ํ˜ธํ™˜๋˜๋ฉด์„œ ๊ธฐ๋Šฅ์ด ์ถ”๊ฐ€๋œ ๊ฒฝ์šฐ + - ์ˆ˜ ๋ฒ„์ „(Patch version): ๊ธฐ์กด ๋ฒ„์ „๊ณผ ํ˜ธํ™˜๋˜๋ฉด์„œ ๋ฒ„๊ทธ๋ฅผ ์ˆ˜์ •ํ•œ ๊ฒฝ์šฐ + +### 5-5. ๋ฒ„์ „์˜ ๋ฒ”์œ„ +NPM์ด ๋ฒ„์ „์„ ๊ด€๋ฆฌํ•˜๋Š” ๋ฐฉ์‹์€ ์œ ์˜์  ๋ฒ„์ „ ๋ช…์‹œ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๋ฒ„์ „์˜ ๋ฒ”์œ„๋ฅผ ์ž์‹ ๋งŒ์˜ ๊ทœ์น™์œผ๋กœ ๊ด€๋ฆฌํ•œ๋‹ค. ๊ฐ€์žฅ ๋‹จ์ˆœํ•œ ๊ฒƒ์ด ํŠน์ • ๋ฒ„์ „์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ๋‹ค. +``` +1.2.3 +``` + +ํŠน์ • ๋ฒ„์ „๋ณด๋‹ค ๋†’๊ฑฐ๋‚˜ ๋‚ฎ์€ ๋ฒ”์œ„๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๋ฐฉ๋ฒ•์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค. +``` +>1.2.3 +>=1.2.3 +<1.2.3 +<=1.2.3 +``` +๋งˆ์ง€๋ง‰์œผ๋กœ ํ‹ธ๋“œ(~)์™€ ์บ๋Ÿฟ(^)์„ ์ด์šฉํ•ด ๋ฒ”์œ„๋ฅผ ๋ช…์‹œํ•œ๋‹ค. +``` +~1.2.3 +^1.2.3 +``` + +ํ‹ธํŠธ(~)๋Š” ๋งˆ์ด๋„ˆ ๋ฒ„์ „์ด ๋ช…์‹œ๋˜์–ด ์žˆ์œผ๋ฉด ํŒจ์น˜๋ฒ„์ „๋งŒ ๋ณ€๊ฒฝํ•œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ~1.2.3 ํ‘œ๊ธฐ๋Š” 1.2.3 ๋ถ€ํ„ฐ 1.3.0 ๋ฏธ๋งŒ ๊นŒ์ง€๋ฅผ ํฌํ•จํ•œ๋‹ค. ๋งˆ์ด๋„ˆ ๋ฒ„์ „์ด ์—†์œผ๋ฉด ๋งˆ์ด๋„ˆ ๋ฒ„์ „์„ ๊ฐฑ์‹ ํ•œ๋‹ค. ~0 ํ‘œ๊ธฐ๋Š” 0.0.0๋ถ€ํ„ฐ 1.0.0 ๋ฏธ๋งŒ ๊นŒ์ง€๋ฅผ ํฌํ•จํ•œ๋‹ค. + +์บ๋Ÿฟ(^)์€ ์ •์‹๋ฒ„์ „์—์„œ ๋งˆ์ด๋„ˆ์™€ ํŒจ์น˜ ๋ฒ„์ „์„ ๋ณ€๊ฒฝํ•œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ^1.2.3 ํ‘œ๊ธฐ๋Š” 1.2.3๋ถ€ํ„ฐ 2.0.0 ๋ฏธ๋งŒ ๊นŒ์ง€๋ฅผ ํฌํ•จํ•œ๋‹ค. ์ •์‹๋ฒ„์ „ ๋ฏธ๋งŒ์ธ 0.x ๋ฒ„์ „์€ ํŒจ์น˜๋งŒ ๊ฐฑ์‹ ํ•œ๋‹ค. ^0 ํ‘œ๊ธฐ๋Š” 0.0.0๋ถ€ํ„ฐ 0.1.0 ๋ฏธ๋งŒ ๊นŒ์ง€๋ฅผ ํฌํ•จํ•œ๋‹ค. + +๋ณดํ†ต ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ •์‹ ๋ฆด๋ฆฌ์ฆˆ ์ „์—๋Š” ํŒจํ‚ค์ง€ ๋ฒ„์ „์ด ์ˆ˜์‹œ๋กœ ๋ณ€ํ•œ๋‹ค. 0.1์—์„œ 0.2๋กœ ๋ถ€๋ฒ„์ „์ด ๋ณ€ํ•˜๋”๋ผ๋„ ํ•˜์œ„ ํ˜ธํ™˜์„ฑ์„ ์ง€ํ‚ค์ง€ ์•Š๊ณ  ๋ฐฐํฌํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋นˆ๋ฒˆํ•˜๋‹ค. ~0๋กœ ๋ฒ„์ „ ๋ฒ”์œ„๋ฅผ ํ‘œ๊ธฐํ•œ๋‹ค๋ฉด 0.0.0๋ถ€ํ„ฐ 1.0.0๋ฏธ๋งŒ๊นŒ์ง€ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํ•˜์œ„ ํ˜ธ์™„์„ฑ์„ ์ง€ํ‚ค์ง€ ๋ชปํ•˜๋Š” 0.2๋กœ๋„ ์—…๋ฐ์ดํŠธ ๋˜์–ด๋ฒ„๋ฆฌ๋Š” ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธธ์ˆ˜ ์žˆ๋‹ค. + +๋ฐ˜๋ฉด ์บ๋Ÿฟ์„ ์‚ฌ์šฉํ•ด ^0.0์œผ๋กœ ํ‘œ๊ธฐํ•œ๋‹ค๋ฉด 0.0.0๋ถ€ํ„ฐ 0.1.0 ๋ฏธ๋งŒ ๋‚ด์—์„œ๋งŒ ๋ฒ„์ „์„ ์‚ฌ์šฉํ•˜๋„๋ก ์ œํ•œํ•œ๋‹ค. ๋”ฐ๋ผ์„œ ํ•˜์œ„ ํ˜ธ์™„์„ฑ์„ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ๋‹ค. (์ž์„ธํ•œ ๋‚ด์šฉ์€ [์—ฌ๊ธฐ](/_posts/devlog/webdev/2022-03-26-web-npmcarrot.md)๋ฅผ ์ฐธ๊ณ ) + +NPM์œผ๋กœ ํŒจํ‚ค์ง€๋ฅผ ์„ค์น˜ํ•˜๋ฉด package.json์— ์„ค์น˜ํ•œ ๋ฒ„์ „์„ ๊ธฐ๋กํ•˜๋Š”๋ฐ ์บ๋Ÿฟ ๋ฐฉ์‹์„ ์ด์šฉํ•œ๋‹ค. ์ดˆ๊ธฐ์—๋Š” ๋ฒ„์ „ ๋ฒ”์œ„์— ํ‹ธํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋‹ค๊ฐ€ ์บ๋Ÿฟ์„ ๋„์ž…ํ•ด์„œ ๊ธฐ๋ณธ ๋™์ž‘์œผ๋กœ ์‚ฌ์šฉํ–ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์šฐ๋ฆฌ๊ฐ€ ์„ค์น˜ํ•œ react๋Š” ^16.12.0 ํ‘œ๊ธฐ๋กœ ๋ฒ„์ „ ๋ฒ”์œ„๋ฅผ ๊ธฐ๋กํ•œ ๊ฒƒ์ด๋‹ค. + +--- + +## 6. ์ •๋ฆฌ +Node.js ๊ธฐ์ˆ ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๋Š” ํ”„๋กœํŠธ์—”๋“œ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ ๊ตฌ์ถ•์„ ์œ„ํ•ด Node.js์™€ NPM์„ ์„ค์น˜ํ–ˆ๋‹ค. + +npm init ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด package.json์— ์ •๋ณด๋ฅผ ๊ธฐ๋กํ•˜๊ณ  ํ”„๋กœ์ ํŠธ๋ฅผ ์ดˆ๊ธฐํ™” ํ•œ๋‹ค. + +NPM์ด ์ œ๊ณตํ•˜๋Š” ๊ธฐ๋ณธ ๋ช…๋ น์–ด์™€ ์ปค์Šคํ…€ ๋ช…๋ น์–ด ์ถ”๊ฐ€๋ฐฉ๋ฒ•์„ ์•Œ์•„๋ณด์•˜๋‹ค. + +npm install๋กœ ์™ธ๋ถ€ ํŒจํ‚ค์ง€๋ฅผ ๋‹ค์šด๋กœ๋“œ ํ•  ์ˆ˜ ์žˆ๊ณ , ๋ฒ„์ „์„ ๊ด€๋ฆฌํ•˜๋Š” ๋ฐฉ์‹์— ๋Œ€ํ•ด ์‚ดํŽด ๋ณด์•˜๋‹ค. diff --git a/src/content/blog/study/webdev/2022-03-25-web-seo.md b/src/content/blog/study/webdev/2022-03-25-web-seo.md new file mode 100644 index 0000000..b66138d --- /dev/null +++ b/src/content/blog/study/webdev/2022-03-25-web-seo.md @@ -0,0 +1,31 @@ +--- +title: SEO๋ž€ ๋ฌด์—‡์ธ๊ฐ€? +date: 2022-03-25 +tags: webdev, ๊ณต๋ถ€ +excerpt: SEO๋ž€? +--- +# SEO๋ž€? ๊ฒ€์ƒ‰์—”์ง„์ตœ์ ํ™”(Search Engine Optimization) ์ดํ•ด +์š”์ฆ˜ ์‚ฌ๋žŒ๋“ค์€ ๊ถ๊ธˆํ•œ ๊ฒƒ์— ๋Œ€ํ•œ ๋‹ต์„ ๋Œ€๋ถ€๋ถ„ Naver, Google ๋“ฑ์— ๊ฒ€์ƒ‰ํ•˜์—ฌ ๋‹ต์„ ์–ป๊ณค ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ๋‹น์—ฐํžˆ ๋ชจ๋“  ๋น„์ฆˆ๋‹ˆ์Šค ๋ฐ ์›น์‚ฌ์ดํŠธ ์†Œ์œ ์ฃผ๋“ค์€ Google์—์„œ ์ž์‹ ๋“ค์˜ ์ •๋ณด๋ฅผ ์‚ฌ๋žŒ๋“ค์ด ์ฐพ๊ธฐ ์‰ฝ๋„๋ก ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด์„œ๋ผ๋ฉด ํ•  ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“  ๊ฒƒ์„ ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ์—์„œ ์ƒ์œ„์— ๋…ธ์ถœ๋  ์ˆ˜ ์žˆ๋„๋ก ๋‚ด ์ฝ˜ํ…์ธ ๋ฅผ ์ตœ์ ํ™”ํ•˜๋Š” ๋ฐฉ์‹ ์ฆ‰, ์ด๊ฒƒ์ด ๋ฐ”๋กœ SEO์ž…๋‹ˆ๋‹ค. + +์„ฑ๊ณต์ ์ธ SEO๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์œ„ํ•œ ์ฒซ ๋ฒˆ์งธ ๋‹จ๊ณ„๋Š” ๊ฐ„ํŽธํ•œ ์‚ฌ์šฉ์ž ์ง€์ •๊ณผ ์ฝ˜ํ…์ธ  ์—…๋ฐ์ดํŠธ๋ฅผ ์ง€์›ํ•˜๊ณ , ์‚ฌ์ดํŠธ ์š”์†Œ๋ฅผ ์ตœ์ ํ™”ํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ๋„๊ตฌ๋ฅผ ์ œ๊ณตํ•˜๋Š” ํ”Œ๋žซํผ์„ ํ†ตํ•ด ์›น์‚ฌ์ดํŠธ๋ฅผ ์ œ์ž‘ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. Wix์™€ ๊ฐ™์€ ์›น์‚ฌ์ดํŠธ ์ œ์ž‘ ๋„๊ตฌ๋ฅผ ํ™œ์šฉํ•ด ๋ณด์„ธ์š”. ๊ฐ„ํŽธํ•˜๊ฒŒ ์‚ฌ์ดํŠธ๋ฅผ ์—…๋ฐ์ดํŠธ ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, SEO ๋„๊ตฌ๊ฐ€ ๋‚ด์žฅ๋˜์–ด ์žˆ์–ด ํŽธ๋ฆฌํ•ฉ๋‹ˆ๋‹ค. + +์‚ฌ์ดํŠธ์˜ ํ† ๋Œ€๊ฐ€ ์–ผ์ถ” ์ง€์–ด์กŒ๋‹ค๋ฉด ์ˆœ์œ„ ํ–ฅ์ƒ์— ๋„์›€์ด ๋˜๋Š” ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ, ๋งํฌ์™€ ๊ฐ™์€ ์„ธ๋ถ€ ์‚ฌํ•ญ์„ ์‹ ๊ฒฝ ์จ์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ง€๊ธˆ๋ถ€ํ„ฐ ์ด๋Ÿฌํ•œ ์„ธ๋ถ€ ์‚ฌํ•ญ์„ ์‹œํ–‰ํ•˜๊ธฐ ์œ„ํ•ด ๋ฌด์—‡์ด ํ•„์š”ํ•œ์ง€, ์„ธ๋ถ€์‚ฌํ•ญ๋“ค์ด SEO ํ‘œ์ค€์„ ์ถฉ์กฑํ•˜๋Š”์ง€ ์‚ดํŽด๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. + +## SEO ๋ž€? +SEO(๊ฒ€์ƒ‰ ์—”์ง„ ์ตœ์ ํ™”)๋Š” ์›น์‚ฌ์ดํŠธ๊ฐ€ ์œ ๊ธฐ์ ์ธ(๋ฌด๋ฃŒ) ๊ฒ€์ƒ‰ ๋ฐฉ์‹์„ ํ†ตํ•ด ๊ฒ€์ƒ‰ ์—”์ง„์—์„œ ์ƒ์œ„์— ๋…ธ์ถœ๋  ์ˆ˜ ์žˆ๋„๋ก ์ตœ์ ํ™”ํ•˜๋Š” ๊ณผ์ •์„ ๋งํ•ฉ๋‹ˆ๋‹ค. ๋น„์ฆˆ๋‹ˆ์Šค ์œ ํ˜•์ด ์–ด๋–ค ๊ฒƒ์ด๋“  SEO๋Š” ๊ฐ€์žฅ ์ค‘์š”ํ•œ ๋งˆ์ผ€ํŒ… ์œ ํ˜• ์ค‘ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค. + +์™œ๋ƒํ•˜๋ฉด Google์€ ๊ฒ€์ƒ‰ํ•˜๋Š” ์‚ฌ๋žŒ๋“ค์—๊ฒŒ ๊ธ์ •์ ์ธ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์„ ์„ ์‚ฌํ•˜๋Š” ๊ฒƒ์ด ๋ชฉํ‘œ์ด๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ€๋Šฅํ•œ ํ•œ ์ตœ๊ณ ์˜ ์ •๋ณด๋ฅผ ์ œ๊ณตํ•˜๊ธธ ์›ํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ, SEO ๋…ธ๋ ฅ์€ ๊ฒ€์ƒ‰ ์—”์ง„์ด ์—ฌ๋Ÿฌ๋ถ„์˜ ์ฝ˜ํ…์ธ ๋ฅผ ํŠน์ • ๊ฒ€์ƒ‰์–ด์— ๋Œ€ํ•œ ์›น ์ƒ์˜ ์ฃผ์š”ํ•œ ์ •๋ณด๋กœ ์ธ์‹ํ•˜๋„๋ก ํ•˜๋Š” ๊ณผ์ •์— ํฌ์ปค์Šค๋ฅผ ๋งž์ถ”์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. + +## SEO๋Š” ์–ด๋–ป๊ฒŒ ์ด๋ฃจ์–ด์ง€๋‚˜?! +๊ฒ€์ƒ‰ ์—”์ง„์€ ์›นํŽ˜์ด์ง€๊ฐ€ ์–ด๋–ค ์ฝ˜ํ…์ธ ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋Š”์ง€, ํ•ด๋‹น ํŽ˜์ด์ง€๊ฐ€ ๋ฌด์—‡์— ๋Œ€ํ•œ ๊ฒƒ์ธ์ง€ ํŒ๋‹จํ•˜๊ธฐ ์œ„ํ•ด ์ธํ„ฐ๋„ท์„ ํ†ตํ•˜์—ฌ ์›นํŽ˜์ด์ง€๋ฅผ ํฌ๋กค๋งํ•˜๋Š” ๋กœ๋ด‡์ธ ์›น ํฌ๋กค๋Ÿฌ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์›น ํฌ๋กค๋Ÿฌ๋Š” ์ฝ”๋“œ๋ฅผ ์Šค์บ”ํ•˜์—ฌ ์›นํŽ˜์ด์ง€์— ํ‘œ์‹œ๋˜๋Š” ํ…์ŠคํŠธ, ์ด๋ฏธ์ง€, ๋™์˜์ƒ์„ ๋“ฑ์„ ์ˆ˜์ง‘ํ•˜์—ฌ ๊ฐ€๋Šฅํ•œ ๋ชจ๋“  ์ •๋ณด๋ฅผ ์–ป์Šต๋‹ˆ๋‹ค. ์›น ํฌ๋กค๋Ÿฌ๊ฐ€ ๊ฐ ํŽ˜์ด์ง€์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์ •๋ณด ์œ ํ˜•์— ๋Œ€ํ•œ ์ถฉ๋ถ„ํ•œ ์ •๋ณด๋ฅผ ์ˆ˜์ง‘ํ•˜์—ฌ ํ•ด๋‹น ๋‚ด์šฉ์ด ๊ฒ€์ƒ‰์ž์—๊ฒŒ ์œ ์šฉํ•˜๋‹ค๊ณ  ํŒ๋‹จํ•˜๋ฉด ํ•ด๋‹น ํŽ˜์ด์ง€๋ฅผ ์ƒ‰์ธ์— ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ ๋งํ•˜๋Š” ์ƒ‰์ธ์€ ๋ณธ์งˆ์ ์œผ๋กœ ๊ฒ€์ƒ‰ ์—”์ง„์ด ์ž ์žฌ์ ์ธ ๊ฒ€์ƒ‰์ž์—๊ฒŒ ์ œ๊ณตํ•˜๊ธฐ ์œ„ํ•ด ์ €์žฅํ•œ ๋ชจ๋“  ๊ฐ€๋Šฅ์„ฑ ์žˆ๋Š” ์›น ๊ฒฐ๊ณผ์ž…๋‹ˆ๋‹ค. + +๊ฒ€์ƒ‰ ์—”์ง„์€ ๊ฒ€์ƒ‰์ž๋“ค์ด ์ฐพ๊ณ  ์žˆ๋Š” ๊ฒƒ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์˜จ๋ผ์ธ์— ์ด๋ฏธ ์กด์žฌํ•˜๋Š” ๋‹ค๋ฅธ ์ •๋ณด๋“ค์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์ตœ์ƒ์˜ ๊ฒฐ๊ณผ๊ฐ€ ๋ฌด์—‡์ธ์ง€ ํ‰๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. ๊ฒ€์ƒ‰์ž๊ฐ€ ๊ฒ€์ƒ‰์„ ํ•˜๋ฉด ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ๊ฒ€์ƒ‰์–ด๋ฅผ ์ƒ‰์ธ์˜ ๊ด€๋ จ ์ •๋ณด์™€ ์ผ์น˜์‹œ์ผœ ๊ฒ€์ƒ‰์ž๊ฐ€ ์ž…๋ ฅํ•œ ๊ฒ€์ƒ‰์–ด์— ๋Œ€ํ•œ ์ •ํ™•ํ•œ ๋‹ต๋ณ€์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๊ทธ ๋‹ค์Œ ํ”Œ๋žซํผ์€ ์ˆ˜๋ฐฑ ๊ฐœ์˜ ์‹ ํ˜ธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ ๊ฒ€์ƒ‰์ž์—๊ฒŒ ํ‘œ์‹œ๋  ์ฝ˜ํ…์ธ  ์ˆœ์„œ๋ฅผ ๊ฒฐ์ •ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  SEO ์ „๋ฌธ๊ฐ€๋“ค์€ ์ด๋Ÿฌํ•œ ์‹ ํ˜ธ๋“ค์„ ์™„๋ฒฝํ•˜๊ฒŒ ๋งˆ์Šคํ„ฐํ•˜๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. + +Google์€ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋‚˜ ํ”„๋กœ์„ธ์Šค์— ๋Œ€ํ•œ ์ž์„ธํ•œ ์‚ฌํ•ญ์„ ๊ณต๊ฐœํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์–ด๋–ค ์š”์†Œ๊ฐ€ ์ƒ‰์ธํ™”์™€ ์ˆœ์œ„์— ์˜ํ–ฅ์„ ๋ฏธ์น˜๋Š”์ง€ ์ •ํ™•ํ•˜๊ฒŒ ์•Œ ์ˆ˜ ์—†๋‹ค๋Š” ์ ์„ ์•„๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฏ€๋กœ SEO๋Š” ์ •ํ™•ํ•˜๊ฒŒ ๋งž์•„ ๋–จ์–ด์ง€๋Š” ๊ณผํ•™์ด ์•„๋‹ˆ๋ฉฐ, ์ตœ์ ํ™”๋ฅผ ์™„๋ฒฝํ•˜๊ฒŒ ๊ตฌํ˜„ํ•œ ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด๋”๋ผ๋„ ๊ทธ์— ๋Œ€ํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋ณด๊ธฐ ์œ„ํ•ด์„œ๋Š” ์ธ๋‚ด์‹ฌ์ด ํ•„์š”ํ•˜๊ณ , ์ง€์†์ ์œผ๋กœ ์กฐ์ •์„ ํ•ด์ฃผ์–ด์•ผ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. + +## ์˜จ-ํŽ˜์ด์ง€ SEO vs ์˜คํ”„-ํŽ˜์ด์ง€ SEO +๋ฌด์—‡์ด ๊ฒ€์ƒ‰ ์—”์ง„์˜ ์ˆœ์œ„์— ๊ฐ€์žฅ ํฐ ์˜ํ–ฅ์„ ๋ฏธ์น˜๋Š”์ง€ ์ •ํ™•ํžˆ ์•Œ ๋ฐฉ๋ฒ•์ด ์—†๊ธฐ ๋•Œ๋ฌธ์— ์ „๋ฌธ๊ฐ€๋“ค์€ SEO ์ „๋žต์—๋Š” ๋‹ค์–‘ํ•œ ์ „์ˆ ์„ ํฌํ•จํ•˜๋Š” ๊ฒƒ์„ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์ „์ˆ ์€ ํฌ๊ฒŒ On-page SEO์™€ Off-page SEO๋ผ๋Š” ๋‘ ๊ฐ€์ง€ ๋ฒ”์ฃผ๋กœ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. + +On-page SEO๋Š” ๋””์ž์ธ ๋ฐ ์ž‘์„ฑํ•œ ์ฝ˜ํ…์ธ ์—์„œ๋ถ€ํ„ฐ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ, ๋Œ€์ฒด ํ…์ŠคํŠธ ๋“ฑ์— ์ด๋ฅด๊ธฐ๊นŒ์ง€ ์›นํŽ˜์ด์ง€ ์ž์ฒด์— ๊ตฌํ˜„ํ•˜๋Š” ์ „๋žต์„ ๋งํ•ฉ๋‹ˆ๋‹ค. Off-page SEO๋Š” ํŽ˜์ด์ง€์˜ ์™ธ๋ถ€์—์„œ ์ˆ˜ํ–‰ํ•˜๋Š” ๋‹จ๊ณ„๋ฅผ ๋งํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—๋Š” ์™ธ๋ถ€ ๋งํฌ, SNS ๊ฒŒ์‹œ๋ฌผ, ๋‹ค๋ฅธ ์›น์‚ฌ์ดํŠธ ํ”„๋กœ๋ชจ์…˜ ๋ฐฉ์‹ ๋“ฑ์ด ํฌํ•จ๋ฉ๋‹ˆ๋‹ค. + +On-page SEO ๋ฐ Off-page SEO ๋ชจ๋‘ ๋‚ด ์‚ฌ์ดํŠธ๋กœ ํŠธ๋ž˜ํ”ฝ์„ ์œ ๋„ํ•˜๊ณ , ๊ถ๊ทน์ ์œผ๋กœ ๋‚ด ์‚ฌ์ดํŠธ๊ฐ€ ์ธํ„ฐ๋„ท์—์„œ ์ค‘์š”ํ•œ ์ฐธ๊ฐ€์ž๋ผ๋Š” ์‹ ํ˜ธ๋ฅผ Google์— ๋ณด๋‚ด๊ธฐ ์œ„ํ•ด ํ•„์ˆ˜์ ์ž…๋‹ˆ๋‹ค. ๋‚ด ํŽ˜์ด์ง€๋“ค์ด ์ค‘์š”ํ•˜๊ณ , ์‚ฌ๋žŒ๋“ค์ด ๋‚ด๊ฐ€ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ๋“ค์„ ์•„๋Š” ๊ฒƒ์— ๊ด€์‹ฌ์ด ์žˆ๋‹ค๋Š” ๊ฒƒ์„ Google์— ์•Œ๋ฆผ์œผ๋กœ์จ ๋‚ด ํŽ˜์ด์ง€๊ฐ€ ์ƒ์œ„์— ๋…ธ์ถœ๋˜๊ณ , ๋” ๋งŽ์€ ํŠธ๋ž˜ํ”ฝ์„ ์œ ๋„ํ•˜๋„๋ก ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. diff --git a/src/content/blog/study/webdev/2022-03-26-web-npmcarrot.md b/src/content/blog/study/webdev/2022-03-26-web-npmcarrot.md new file mode 100644 index 0000000..148ac8b --- /dev/null +++ b/src/content/blog/study/webdev/2022-03-26-web-npmcarrot.md @@ -0,0 +1,70 @@ +--- +title: npm package ํ‹ธํŠธ(~)๋ฅผ ๋Œ€์‹ ํ•ด์„œ ์บ๋Ÿฟ(^) ์‚ฌ์šฉ +date: 2022-03-26 +tags: webdev, ๊ณต๋ถ€ +excerpt: ํ‹ธํŠธ ๋Œ€์‹ ํ•ด์„œ ์บ๋Ÿฟ์„ ์‚ฌ์šฉํ•˜๊ธฐ +--- +## ํ‹ธํŠธ(~) +์ผ๋‹จ ํ‹ธํŠธ(`~`)์— ๋Œ€ํ•ด์„œ ์•Œ์•„๋ณด์ž.
+[NPM๋ฌธ์„œ](https://docs.npmjs.com/cli/v8/configuring-npm/package-json#dependencies)์— ๋”ฐ๋ฅด๋ฉด npm์„ ์‚ฌ์šฉํ•  ๋•Œ `package.json`์—์„œ ๋ฒ„์ „ ๋ช…์‹œ๋ฅผ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ•  ์ˆ˜ ์žˆ๋‹ค. + - `1.2.3` + - `>1.2.3` + - `>=1.2.3` + - `<1.2.3` + - `<=1.2.3` + - `~1.2.3` + +์—ฌ๊ธฐ์„œ ๊ฐ€์žฅ ๋งŽ์ด ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ์‹์ด ํ‹ธํŠธ(`~`) ๋ฐฉ์‹์ด๊ณ , ``npm install MODULE --save``๋‚˜ ``npm install MODULE --save-dev``๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ž๋™์œผ๋กœ ``package.json``์— ์˜์กด์„ฑ์„ ์ถ”๊ฐ€ ํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ, ์ด ๋•Œ ๊ธฐ๋ณธ์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ํ‹ธํŠธ(`~`) ๋ฐฉ์‹์ด๋‹ค.
+ํ‹ธํŠธ๋Š” ๊ฐ„๋‹จํžˆ ๋งํ•˜์ž๋ฉด ํ˜„์žฌ ์ง€์ •ํ•œ ๋ฒ„์ „์˜ ๋งˆ์ง€๋ง‰ ์ž๋ฆฌ ๋‚ด์˜ ๋ฒ”์œ„์—์„œ๋งŒ ์ž๋™์œผ๋กœ ์—…๋ฐ์ดํŠธ ํ•œ๋‹ค.
+ - `~0.0.1` : `>=0.0.1 <0.1.0` + - `~0.1.1` : `>=0.1.1 <0.2.0` + - `~0.1` : `>=0.1.0 <0.2.0` + - `~0` : `>=0.0 <0.1` + +๊ทธ๋ž˜์„œ ๋‹ค์–‘ํ•œ ๋ฐฉ์‹์œผ๋กœ ๋ฒ„์ „์„ ๋ช…์‹œํ–ˆ์„ ๋•Œ ์œ„์™€ ๊ฐ™์€ ๋ฒ”์œ„๋‚ด์—์„œ ์ž๋™์œผ๋กœ ์—…๋ฐ์ดํŠธ๋ฅผ ํ•œ๋‹ค. + +--- + +## ์บ๋Ÿฟ(^) +๊ทธ๋Ÿฌ๋ฉด ์บ๋Ÿฟ(`^`)์€ ํ‹ธํŠธ์™€ ์–ด๋–ป๊ฒŒ ๋‹ค๋ฅผ๊นŒ? + +์บ๋Ÿฟ์„ ์„ค๋ช…ํ•˜๊ธฐ ์ด์ „์— ๋จผ์ € [SemanticVersioning](https://semver.org/lang/ko/) (๋ณดํ†ต SemVer๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค)์— ๋Œ€ํ•ด์„œ ์•Œ์•„์•ผ ํ•˜๋Š”๋ฐ, Node.js๋„ ๊ทธ๋ ‡๊ณ  npm ๋ชจ๋“ˆ๋“ค์€ ๋ชจ๋‘ SemVer๋ฅผ ๋”ฐ๋ฅด๊ณ  ์žˆ๋‹ค. SemVer๋Š” ``MAJOR.MINOR.PATCH``์˜ ๋ฒ„์ €๋‹์„ ๋”ฐ๋ฅด๋Š”๋ฐ ๊ฐ ์˜๋ฏธ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค. + - ์ฃผ ๋ฒ„์ „(Major Version): ๊ธฐ์กด ๋ฒ„์ „๊ณผ ํ˜ธํ™˜๋˜์ง€ ์•Š๊ฒŒ ๋ณ€๊ฒฝํ•œ ๊ฒฝ์šฐ + - MAJOR version when you make incompatible API changes + - ๋ถ€ ๋ฒ„์ „(Minor version): ๊ธฐ์กด ๋ฒ„์ „๊ณผ ํ˜ธํ™˜๋˜๋ฉด์„œ ๊ธฐ๋Šฅ์ด ์ถ”๊ฐ€๋œ ๊ฒฝ์šฐ + - MINOR version when you add functionality in a backwards-compatible manner + - ์ˆ˜ ๋ฒ„์ „(Patch version): ๊ธฐ์กด ๋ฒ„์ „๊ณผ ํ˜ธํ™˜๋˜๋ฉด์„œ ๋ฒ„๊ทธ๋ฅผ ์ˆ˜์ •ํ•œ ๊ฒฝ์šฐ + - PATCH version when you make backwards-compatible bug fixes + +์ฆ‰, MAJOR ๋ฒ„์ „์€ API์˜ ํ˜ธํ™˜์„ฑ์ด ๊นจ์งˆ๋งŒํ•œ ๋ณ€๊ฒฝ์‚ฌํ•ญ์„ ์˜๋ฏธํ•˜๊ณ  MINOR ๋ฒ„์ „์€ ํ•˜์œ„ํ˜ธํ™˜์„ฑ์„ ์ง€ํ‚ค๋ฉด์„œ ๊ธฐ๋Šฅ์ด ์ถ”๊ฐ€๋œ ๊ฒƒ์„ ์˜๋ฏธํ•˜๊ณ  PATCH ๋ฒ„์ „์€ ํ•˜์œ„ํ˜ธํ™˜์„ฑ์„ ์ง€ํ‚ค๋Š” ๋ฒ”์œ„๋‚ด์—์„œ ๋ฒ„๊ทธ๊ฐ€ ์ˆ˜์ •๋œ ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค. + +**์บ๋Ÿฟ(^)์€ Node.js์˜ ๋ชจ๋“ˆ์ด ์ด SemVer์˜ ๊ทœ์•ฝ์„ ๋”ฐ๋ฅด๋Š” ๊ฒƒ์„ ์‹ ๋ขฐํ•œ๋‹ค๋Š” ๊ฐ€์ •ํ•˜์— ๋™์ž‘ํ•œ๋‹ค.**
+๊ทธ๋ž˜์„œ MINOR๋‚˜ PATCH๋ฒ„์ „์€ ํ•˜์œ„ํ˜ธํ™˜์„ฑ์ด ๋ณด์žฅ๋˜์–ด์•ผ ํ•˜๋ฏ€๋กœ ์—…๋ฐ์ดํŠธ๋ฅผ ํ•œ๋‹ค. + - `^1.0.2` : `>=1.0.2 <2.0` + - `^1.0` : `>=1.0.0 <2.0` + - `^1` : `>=1.0.0 <2.0` + +๊ทธ๋ž˜์„œ ์บ๋Ÿฟ์„ ์‚ฌ์šฉํ–ˆ์„ ๋•Œ์—๋Š” ์œ„์™€ ๊ฐ™์ด ๋™์ž‘ํ•œ๋‹ค.
+ํ‹ธํŠธ์™€ ๋น„๊ตํ•ด๋ณด๋ฉด ์ฐจ์ด์ ์ด ๋ช…ํ™•ํ•œ๋ฐ, `1.x.x` ๋‚ด์—์„œ๋Š” ํ•˜์œ„ํ˜ธํ™˜์„ฑ์ด ๋ณด์žฅ๋˜๋ฏ€๋กœ ๊ทธ ๋‚ด์—์„œ๋Š” ๋ชจ๋‘ ์—…๋ฐ์ดํŠธ ํ•˜๊ฒ ๋‹ค๋Š” ์˜๋ฏธ์ด๋‹ค. + +ํ•˜์ง€๋งŒ! ์—ฌ๊ธฐ์—๋Š” **์˜ˆ์™ธ์‚ฌํ•ญ**์ด ์žˆ๋‹ค. + - `^0.1.2` : `>=0.1.2 <0.2.0` + - `^0.1` : `>=0.1.0 <0.2.0` + - `^0` : `>=0.0.0 <1.0.0` + - `^0.0.1` : `==0.0.1` + +**๋ฒ„์ „์ด 1.0.0 ๋ฏธ๋งŒ์ธ ๊ฒฝ์šฐ์—๋Š” (SemVer์—์„œ๋Š” pre-releases๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค) ์ƒํ™ฉ์ด ๋‹ค๋ฅด๋‹ค.**
+์†Œํ”„ํŠธ์›จ์–ด ๋Œ€๋ถ€๋ถ„์—์„œ 1.0 ๋ฒ„์ „์„ ๋‚ด๋†“๊ธฐ ์ „์—๋Š” API ๋ณ€๊ฒฝ์ด ์ˆ˜์‹œ๋กœ ์ผ์–ด๋‚œ๋‹ค. ๊ทธ๋ž˜์„œ `0.1`์„ ์‚ฌ์šฉํ•˜๋‹ค๊ฐ€ `0.2`๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด API๊ฐ€ ๋ชจ๋‘ ๋‹ฌ๋ ค์กŒ์„ ์ˆ˜ ์žˆ๋‹ค. ๊ทธ๋ž˜์„œ ์บ๋Ÿฟ(`^`)์„ ์‚ฌ์šฉํ•  ๋•Œ, 0.x.x์—์„œ๋Š” ๋งˆ์น˜ ํ‹ธํŠธ์ฒ˜๋Ÿผ ๋™์ž‘ํ•ด์„œ ์ง€์ •ํ•œ ๋ฒ„์ „ ์ž๋ฆฟ์ˆ˜ ๋‚ด์—์„œ๋งŒ ์—…๋ฐ์ดํŠธํ•œ๋‹ค.
+๊ทธ๋ฆฌ๊ณ  `0.0.x`์ธ ๊ฒฝ์šฐ์—๋Š” ํ•˜์œ„ํ˜ธํ™˜์„ฑ์ด ๋ณด์žฅ๋˜์ง€ ์•Š์„ ๊ฐ€๋Šฅ์„ฑ์ด ๋†’์œผ๋ฏ€๋กœ ์œ„์˜ ๋งˆ์ง€๋ง‰ ์˜ˆ์‹œ์ฒ˜๋Ÿผ ์ง€์ •ํ•œ ๋ฒ„์ „๋งŒ์„ ์‚ฌ์šฉํ•œ๋‹ค. + +-------- + +## ์บ๋Ÿฟ์— ๋Œ€ํ•œ ์˜ค๋ฅ˜! +์บ๋Ÿฟ์€ ๋™์ž‘๋ฐฉ์‹์„ ์ดํ•ดํ•˜๋ฉด ์ˆ˜๊ธ ํ• ๋งŒํ•˜๋‹ค.(๋ฌผ๋ก  ๋ฐฐํฌ์šฉ์œผ๋กœ๋Š” ์–ด๋ ต์ง€๋งŒ ์ด๊ฑด ํ‹ธ๋“œ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€) ํ•˜์ง€๋งŒ ์•ฝ๊ฐ„ ๋ณต์žกํ•œ ๋ถ€๋ถ„์ด ์žˆ์–ด์„œ ๊ทธ๋ƒฅ ํ‹ธ๋“œ๋ฅผ ์“ฐ๊ณ ์ž ํ•  ์ˆ˜๋„ ์žˆ๋Š”๋ฐ ๊ทธ๋Ÿผ์—๋„ ์บ๋Ÿฟ์˜ ์กด์žฌ ์ •๋„๋Š” ์•Œ๊ณ  ์žˆ์–ด์•ผ ํ•œ๋‹ค. ์บ๋Ÿฟ์€ ๊ทผ๋ž˜์— ์ถ”๊ฐ€๋œ ๊ธฐ๋Šฅ์ด๋ฏ€๋กœ ๊ณผ๊ฑฐ ๋ฒ„์ „์˜ npm์€ ์บ๋Ÿฟ์„ ์ดํ•ดํ•˜์ง€ ๋ชปํ•œ๋‹ค.(์ •ํ™•ํžˆ ์–ด๋А ๋ฒ„์ „๋ถ€ํ„ฐ ์ถ”๊ฐ€๋˜์—ˆ๋Š”์ง€ ์ฐพ์ง€ ๋ชปํ—€๋‹ค) ๊ทธ๋ž˜์„œ ์บ๋Ÿฟ์ด ์—†๋Š” ๊ตฌ ๋ฒ„์ „์˜ npm์—์„œ ์บ๋Ÿฟ์„ ์‚ฌ์šฉํ•˜๋ฉด ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค. + +๊ตฌ๋ฌธ์„ ์ดํ•ดํ•˜์ง€ ๋ชปํ•˜๋ฏ€๋กœ ๋ฒ„์ „์„ ์ฐพ์ง€ ๋ชปํ•˜๊ณ  "Error: No compatible version found"์ด๋ผ๋Š” ์„ค์น˜ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค. ์ด๋Š” ``npm install -g`` npm์„ ํ†ตํ•ด์„œ npm์„ ์ตœ์‹  ๋ฒ„์ „์œผ๋กœ ์˜ฌ๋ฆฌ๋ฉด ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค. ์บ๋Ÿฟ์„ ๋ชจ๋ฅธ ์ƒํƒœ์—์„œ ์ € ์˜ค๋ฅ˜๋ฅผ ๋ณด๋ฉด ์ข€ ๋‹นํ™ฉ์Šค๋Ÿฌ์šธ์ˆ˜ ์žˆ๋‹ค. + +npm **v1.4.3**๋ถ€ํ„ฐ๋Š” ``npm install MODULE --save``๋‚˜ ``npm install MODULE --save-dev``๋ฅผ ์‚ฌ์šฉํ–ˆ์„ ๋•Œ ๊ธฐ๋ณธ๊ฐ’์ด ํ‹ธ๋“œ ๋Œ€์‹  ์บ๋Ÿฟ์ด ๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ํ‹ธ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ ์ž ํ•œ๋‹ค๋ฉด ๋งค๋ฒˆ ์ง์ ‘ ์ˆ˜์ •ํ•ด์•ผ ํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋ณธ์ธ์€ ํ‹ธ๋“œ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜๋”๋ผ๋„ ์ฐธ์กฐํ•œ ๋ชจ๋“ˆ์ด ๋‹ค๋ฅธ ๋ชจ๋“ˆ์„ ์ฐธ์กฐํ•  ๋•Œ ์บ๋Ÿฟ์„ ์‚ฌ์šฉํ•  ์ˆ˜๋„ ์žˆ์œผ๋ฏ€๋กœ npm์„ ์ตœ์‹  ๋ฒ„์ „์œผ๋กœ ์—…๋ฐ์ดํŠธํ•˜์ง€ ์•Š์œผ๋ฉด ๊ฒฐ๊ตญ ์˜ค๋ฅ˜๊ฐ€ ๋‚˜์„œ ์ œ๋Œ€๋กœ ์„ค์น˜๊ฐ€ ์•ˆ ๋  ๊ฒƒ์ด๋‹ค. + + +Reference : [npm package.json์—์„œ ํ‹ธ๋“œ(~) ๋Œ€์‹  ์บ๋Ÿฟ(^) ์‚ฌ์šฉํ•˜๊ธฐ](https://blog.outsider.ne.kr/1041) diff --git a/src/data/blog.js b/src/data/blog.js index eaa694e..9cce36b 100644 --- a/src/data/blog.js +++ b/src/data/blog.js @@ -6,12 +6,15 @@ const collectFrontmatter = (raw) => { if (lines[0]?.trim() === '---') { cursor = 1; for (; cursor < lines.length; cursor += 1) { - const line = lines[cursor].trim(); + const rawLine = lines[cursor]; + const line = rawLine.trim(); if (line === '---') { cursor += 1; break; } if (!line) continue; + if (/^\s+/.test(rawLine)) continue; + if (!line.includes(':')) continue; const [key, ...rest] = line.split(':'); meta[key.trim()] = rest.join(':').trim(); } @@ -38,10 +41,20 @@ const extractExcerpt = (body) => { const normalizeTags = (value) => { if (!value) return []; - return value + const mapped = value .split(',') .map((tag) => tag.trim()) - .filter(Boolean); + .filter(Boolean) + .map((tag) => { + const lower = tag.toLowerCase(); + if (lower === 'diary' || lower === 'dailylog') return '์ผ์ƒ'; + if (lower === 'dev' || lower === 'development') return '๊ฐœ๋ฐœ'; + if (lower === 'study') return '๊ณต๋ถ€'; + if (lower === 'idea' || lower === 'ideas') return '์•„์ด๋””์–ด'; + return tag; + }); + + return Array.from(new Set(mapped)); }; const normalizeTitle = (slug) => @@ -49,8 +62,24 @@ const normalizeTitle = (slug) => .replace(/-/g, ' ') .replace(/\b\w/g, (letter) => letter.toUpperCase()); +const inferTagFromPath = (path) => { + const match = path.match(/\/blog\/([^/]+)\//); + if (!match) return ''; + const folder = match[1]; + if (folder === 'daily') return '์ผ์ƒ'; + if (folder === 'dev') return '๊ฐœ๋ฐœ'; + if (folder === 'study') return '๊ณต๋ถ€'; + if (folder === 'ideas') return '์•„์ด๋””์–ด'; + return ''; +}; + +const inferDateFromSlug = (slug) => { + const match = slug.match(/\d{4}-\d{2}-\d{2}/); + return match ? match[0] : ''; +}; + export const getBlogPosts = () => { - const modules = import.meta.glob('/src/content/blog/*.md', { + const modules = import.meta.glob('/src/content/blog/**/*.md', { as: 'raw', eager: true, }); @@ -58,15 +87,25 @@ export const getBlogPosts = () => { const posts = Object.entries(modules).map(([path, raw]) => { const slug = path.split('/').pop().replace(/\.md$/, ''); const { meta, body } = collectFrontmatter(raw); + const inferredTag = inferTagFromPath(path); const title = meta.title || extractTitle(body) || normalizeTitle(slug); - const excerpt = meta.excerpt || extractExcerpt(body); - const date = meta.date || ''; + const excerpt = meta.excerpt || meta.description || extractExcerpt(body); + const date = meta.date || inferDateFromSlug(slug); + const baseTags = normalizeTags(meta.tags); + const categoryTags = normalizeTags(meta.category); + const tags = Array.from( + new Set([ + ...baseTags, + ...categoryTags, + ...(inferredTag ? [inferredTag] : []), + ]) + ); return { slug, title, excerpt, date, - tags: normalizeTags(meta.tags), + tags, body, }; });