diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml
deleted file mode 100644
index f22921b7049..00000000000
--- a/.github/FUNDING.yml
+++ /dev/null
@@ -1,2 +0,0 @@
-ko_fi: coteschung
-custom: https://sponsor.cotes.page
diff --git a/.github/workflows/pages-deploy.yml b/.github/workflows/pages-deploy.yml
new file mode 100644
index 00000000000..4f8346a64c3
--- /dev/null
+++ b/.github/workflows/pages-deploy.yml
@@ -0,0 +1,77 @@
+name: "Build and Deploy"
+on:
+ push:
+ branches:
+ - master
+ - main
+ paths-ignore:
+ - .gitignore
+ - README.md
+ - LICENSE
+
+ # Allows you to run this workflow manually from the Actions tab
+ workflow_dispatch:
+
+permissions:
+ contents: read
+ pages: write
+ id-token: write
+
+# Allow one concurrent deployment
+concurrency:
+ group: "pages"
+ cancel-in-progress: true
+
+jobs:
+ build:
+ runs-on: ubuntu-latest
+
+ steps:
+ - name: Checkout
+ uses: actions/checkout@v4
+ with:
+ fetch-depth: 0
+ # submodules: true
+ # If using the 'assets' git submodule from Chirpy Starter, uncomment above
+ # (See: https://github.com/cotes2020/chirpy-starter/tree/main/assets)
+
+ - name: Setup Pages
+ id: pages
+ uses: actions/configure-pages@v4
+
+ - name: Setup Ruby
+ uses: ruby/setup-ruby@v1
+ with:
+<<<<<<<< HEAD:.github/workflows/pages-deploy.yml
+ ruby-version: 2.7 # reads from a '.ruby-version' or '.tools-version' file if 'ruby-version' is omitted
+========
+ ruby-version: 3.3
+>>>>>>>> 54d4d59d22ac543a14bfbd9bb3d6fb6756056041:.github/workflows/starter/pages-deploy.yml
+ bundler-cache: true
+
+ - name: Build site
+ run: bundle exec jekyll b -d "_site${{ steps.pages.outputs.base_path }}"
+ env:
+ JEKYLL_ENV: "production"
+
+ - name: Test site
+ run: |
+ bundle exec htmlproofer _site \
+ \-\-disable-external \
+ \-\-ignore-urls "/^http:\/\/127.0.0.1/,/^http:\/\/0.0.0.0/,/^http:\/\/localhost/"
+
+ - name: Upload site artifact
+ uses: actions/upload-pages-artifact@v3
+ with:
+ path: "_site${{ steps.pages.outputs.base_path }}"
+
+ deploy:
+ environment:
+ name: github-pages
+ url: ${{ steps.deployment.outputs.page_url }}
+ runs-on: ubuntu-latest
+ needs: build
+ steps:
+ - name: Deploy to GitHub Pages
+ id: deployment
+ uses: actions/deploy-pages@v4
diff --git a/.github/workflows/starter/pages-deploy.yml b/.github/workflows/starter/pages-deploy.yml
index cc28f99fd25..4f8346a64c3 100644
--- a/.github/workflows/starter/pages-deploy.yml
+++ b/.github/workflows/starter/pages-deploy.yml
@@ -2,8 +2,8 @@ name: "Build and Deploy"
on:
push:
branches:
- - main
- master
+ - main
paths-ignore:
- .gitignore
- README.md
@@ -42,7 +42,11 @@ jobs:
- name: Setup Ruby
uses: ruby/setup-ruby@v1
with:
+<<<<<<<< HEAD:.github/workflows/pages-deploy.yml
+ ruby-version: 2.7 # reads from a '.ruby-version' or '.tools-version' file if 'ruby-version' is omitted
+========
ruby-version: 3.3
+>>>>>>>> 54d4d59d22ac543a14bfbd9bb3d6fb6756056041:.github/workflows/starter/pages-deploy.yml
bundler-cache: true
- name: Build site
diff --git a/README.md b/README.md
index 7e57b2a52e2..4cc2e4b937e 100644
--- a/README.md
+++ b/README.md
@@ -1,3 +1,10 @@
+<<<<<<< HEAD
+
+
+
+ 
+
+=======
@@ -16,10 +23,87 @@
[][demo]
+>>>>>>> 54d4d59d22ac543a14bfbd9bb3d6fb6756056041
-## Features
-
+
+
+
+ ## ๐ About Me
+ #### :fire: AI / Backend / DevOps ๊ฐ๋ฐ์๊ฐ ๋๊ธฐ ์ํด ๊ณต๋ถํ๊ณ ์์ต๋๋ค.
+ #### :mortar_board: ๊ฒฝ์๊ตญ๋ฆฝ๋ํ๊ต(GNU), ํญ๊ณต์ฐ์ฃผ๋ฐ์ํํธ์จ์ด๊ณตํ์ ๊ณต
+ #### :black_nib: [A Comparison of Pretrained Models for Classifying Issue Reports, IEEE Access](https://ieeexplore.ieee.org/document/10546475)
+ #### :pencil2: SSAFY 12๊ธฐ Data track (2024.07 - ํ์ฌ ์งํ์ค)
+
+<<<<<<< HEAD
+ ### BOJ Rating
+ [](https://solved.ac/qja1998)
+
+
+
+ ## ๐งฑ Tech Stack
+ ### Language
+
+

+
+

+
+
+ ### AI / Data
+
+

+
+

+
+

+
+

+
+
+ ### Infra
+
+

+
+

+
+ ### Backend
+
+

+
+
+
+ ### Tools
+
+

+
+

+
+

+
+

+
+
+
+ ## ๐ค Github Stats
+ 
+
+ 
+ 
+
+ 
+
+ ## Contact
+
+
+
+
+
+
+
+
+
+
+=======
- Dark Theme
- Localized UI language
- Pinned Posts on Home Page
@@ -82,3 +166,4 @@ This project is published under [MIT License][license].
[lib]: https://github.com/cotes2020/chirpy-static-assets
[vscode]: https://code.visualstudio.com/
[jetbrains]: https://www.jetbrains.com/?from=jekyll-theme-chirpy
+>>>>>>> 54d4d59d22ac543a14bfbd9bb3d6fb6756056041
diff --git a/_config.yml b/_config.yml
index d6f84c57815..421999070fb 100644
--- a/_config.yml
+++ b/_config.yml
@@ -8,25 +8,45 @@ theme: jekyll-theme-chirpy
# otherwise, the layout language will use the default value of 'en'.
lang: en
+<<<<<<< HEAD
+
+# Change to your timezone โบ http://www.timezoneconverter.com/cgi-bin/findzone/findzone
+timezone: Asia/Seoul
+=======
# Change to your timezone โบ https://kevinnovak.github.io/Time-Zone-Picker
timezone: Asia/Shanghai
+>>>>>>> 54d4d59d22ac543a14bfbd9bb3d6fb6756056041
# jekyll-seo-tag settings โบ https://github.com/jekyll/jekyll-seo-tag/blob/master/docs/usage.md
# โ --------------------------
+<<<<<<< HEAD
+title: Kwon # the main title
+
+tagline: Studying # it will display as the sub-title
+=======
title: Chirpy # the main title
tagline: A text-focused Jekyll theme # it will display as the subtitle
+>>>>>>> 54d4d59d22ac543a14bfbd9bb3d6fb6756056041
description: >- # used by seo meta and the atom feed
A minimal, responsive and feature-rich Jekyll theme for technical writing.
+<<<<<<< HEAD
+# fill in the protocol & hostname for your site, e.g., 'https://username.github.io'
+url: 'https://qja1998.github.io'
+
+github:
+ username: qja1998 # change to your github username
+=======
# Fill in the protocol & hostname for your site.
# E.g. 'https://username.github.io', note that it does not end with a '/'.
url: ""
github:
username: github_username # change to your GitHub username
+>>>>>>> 54d4d59d22ac543a14bfbd9bb3d6fb6756056041
twitter:
username: twitter_username # change to your Twitter username
@@ -34,12 +54,21 @@ twitter:
social:
# Change to your full name.
# It will be displayed as the default author of the posts and the copyright owner in the Footer
+<<<<<<< HEAD
+ name: GiBeom Kwon
+ email: qja1998@naver.com # change to your email address
+ links:
+ # The first element serves as the copyright owner's link
+ #- https://twitter.com/username # change to your twitter homepage
+ - https://github.com/qja1998 # change to your github homepage
+=======
name: your_full_name
email: example@domain.com # change to your email address
links:
# The first element serves as the copyright owner's link
- https://twitter.com/username # change to your Twitter homepage
- https://github.com/username # change to your GitHub homepage
+>>>>>>> 54d4d59d22ac543a14bfbd9bb3d6fb6756056041
# Uncomment below to add more social links
# - https://www.facebook.com/username
# - https://www.linkedin.com/in/username
@@ -88,17 +117,28 @@ pageviews:
# light โ Use the light color scheme
# dark โ Use the dark color scheme
#
+<<<<<<< HEAD
+theme_mode: light # [light|dark]
+=======
theme_mode: # [light | dark]
+>>>>>>> 54d4d59d22ac543a14bfbd9bb3d6fb6756056041
# The CDN endpoint for media resources.
# Notice that once it is assigned, the CDN url
# will be added to all media resources (site avatar, posts' images, audio and video files) paths starting with '/'
#
# e.g. 'https://cdn.com'
+<<<<<<< HEAD
+img_cdn: '/assets/img'
+
+# the avatar on sidebar, support local or CORS resources
+avatar: '/avatar/avatar.jpg'
+=======
cdn: "https://chirpy-img.netlify.app"
# the avatar on sidebar, support local or CORS resources
avatar: "/commons/avatar.jpg"
+>>>>>>> 54d4d59d22ac543a14bfbd9bb3d6fb6756056041
# The URL of the site-wide social preview image used in SEO `og:image` meta tag.
# It can be overridden by a customized `page.image` in front matter.
@@ -108,18 +148,31 @@ social_preview_image: # string, local or CORS resources
toc: true
comments:
+<<<<<<< HEAD
+ active: utterances # The global switch for posts comments, e.g., 'disqus'. Keep it empty means disable
+ # The active options are as follows:
+=======
# Global switch for the post-comment system. Keeping it empty means disabled.
provider: # [disqus | utterances | giscus]
# The provider options are as follows:
+>>>>>>> 54d4d59d22ac543a14bfbd9bb3d6fb6756056041
disqus:
shortname: # fill with the Disqus shortname. โบ https://help.disqus.com/en/articles/1717111-what-s-a-shortname
# utterances settings โบ https://utteranc.es/
utterances:
+<<<<<<< HEAD
+ repo: qja1998/qja1998.github.io #
/
+ issue_term: # < url | pathname | title | ...>
+ # Giscus options โบ https://giscus.app
+ giscus:
+ repo: # /
+=======
repo: # /
issue_term: # < url | pathname | title | ...>
# Giscus options โบ https://giscus.app
giscus:
repo: # /
+>>>>>>> 54d4d59d22ac543a14bfbd9bb3d6fb6756056041
repo_id:
category:
category_id:
diff --git a/_posts/2022-02-04-boj_10610.markdown b/_posts/2022-02-04-boj_10610.markdown
new file mode 100644
index 00000000000..6ab105150b8
--- /dev/null
+++ b/_posts/2022-02-04-boj_10610.markdown
@@ -0,0 +1,85 @@
+---
+title: "[BOJ] 30 - 10610 (S5)"
+author: kwon
+date: 2022-02-04T23:00:00 +0900
+categories: [boj, silver]
+tags: [math, string, greedy algorithm, sort, number theory]
+math: true
+mermaid: false
+---
+
+| ์๊ฐ ์ ํ | ๋ฉ๋ชจ๋ฆฌ ์ ํ |
+| --- | --- |
+| 1 ์ด | 256 MB |
+
+# ๋ฌธ์
+
+์ด๋ ๋ , ๋ฏธ๋ฅด์ฝ๋ ์ฐ์ฐํ ๊ธธ๊ฑฐ๋ฆฌ์์ ์์ N์ ๋ณด์๋ค. ๋ฏธ๋ฅด์ฝ๋ 30์ด๋ ์๋ฅผ ์กด๊ฒฝํ๊ธฐ ๋๋ฌธ์, ๊ทธ๋ ๊ธธ๊ฑฐ๋ฆฌ์์ ์ฐพ์ ์์ ํฌํจ๋ ์ซ์๋ค์ ์์ด 30์ ๋ฐฐ์๊ฐ ๋๋ ๊ฐ์ฅ ํฐ ์๋ฅผ ๋ง๋ค๊ณ ์ถ์ดํ๋ค.
+
+๋ฏธ๋ฅด์ฝ๋ฅผ ๋์ ๊ทธ๊ฐ ๋ง๋ค๊ณ ์ถ์ดํ๋ ์๋ฅผ ๊ณ์ฐํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ๋ผ.
+
+# ์
๋ ฅ
+
+N์ ์
๋ ฅ๋ฐ๋๋ค. N๋ ์ต๋ 105๊ฐ์ ์ซ์๋ก ๊ตฌ์ฑ๋์ด ์์ผ๋ฉฐ, 0์ผ๋ก ์์ํ์ง ์๋๋ค.
+
+# ์ถ๋ ฅ
+
+๋ฏธ๋ฅด์ฝ๊ฐ ๋ง๋ค๊ณ ์ถ์ดํ๋ ์๊ฐ ์กด์ฌํ๋ค๋ฉด ๊ทธ ์๋ฅผ ์ถ๋ ฅํ๋ผ. ๊ทธ ์๊ฐ ์กด์ฌํ์ง ์๋๋ค๋ฉด, -1์ ์ถ๋ ฅํ๋ผ.
+
+# ํ์ด
+
+## ์ฒซ ๋ฒ์งธ
+
+์
๋ ฅ ๋ฐ์ ์์ 0์ด ์๋ค๋ฉด 30์ ๋ฐฐ์๋ฅผ ์ ๋ ๋ง๋ค ์ ์์ผ๋ฏ๋ก ๋จผ์ ์ ์ธํ๋ค. 30์ ๋ฐฐ์์ธ์ง ํ๋ณํ๊ธฐ ์ํด 0์ ํ๋ ์ญ์ ํ ํ์ ๊ทธ ์๊ฐ 3์ ๋ฐฐ์์ธ์ง ํ์ธํด ๋ณธ๋ค.
+
+3์ผ๋ก ๋๋์ด ๋จ์ด์ง๋ฉด 3์ ๋ฐฐ์์ด๋ฏ๋ก(๋ชจ๋ ์๋ฆฌ์ ์์ ํฉ์ด 3์ ๋ฐฐ์์ด๋ฉด 3์ ๋ฐฐ์์ด๋ฏ๋ก ์์ ๋ฐฐ์ด์ด ์ด๋ป๊ฒ ๋๋ 3์ ๋ฐฐ์์ธ์ง ์๋์ง ์ ์ ์๋ค) ๋ด๋ฆผ์ฐจ์์ผ๋ก ์ ๋ ฌํ์ฌ ์ ์๋ก ๋ง๋ ๋ค. ์ฒ์์ 0์ ํ๋ ์ญ์ ํ์ผ๋ฏ๋ก ๋ค์ 10์ ๊ณฑํด์ค์ผ ํ๋ค.
+
+### ์ฝ๋
+
+```python
+nums = list(str(sys.stdin.readline().strip()))
+if '0' not in nums: print(-1)
+else:
+ nums.remove('0')
+ if int(''.join(nums)) % 3 == 0: print(int(''.join(sorted(nums, reverse=True))) * 10)
+ else: print(-1)
+```
+
+## ๋ ๋ฒ์งธ
+
+์
๋ ฅ ๋ฐ์ ์์ 0์ด ์์ ๊ฒฝ์ฐ ๊ฑฐ๋ฅด๋ ๊ฒ์ ๊ฐ๋ค. ๋ค๋ฅธ ์ ์ ๋ด๋ฆผ์ฐจ์์ผ๋ก ์ ๋ ฌํ ๋ค์ ๊ทธ ์๊ฐ 30์ ๋ฐฐ์์ธ์ง ํ์ธํ๋ค๋ ๊ฒ์ด๋ค.
+
+### ์ฝ๋
+
+```python
+nums = list(str(sys.stdin.readline().strip()))
+if '0' not in nums: print(-1)
+else:
+ num = int(''.join(sorted(nums, reverse=True)))
+ if num % 30 == 0: print(num)
+ else: print(-1)
+```
+
+## ์ธ ๋ฒ์งธ
+
+๊ฐ ์๋ฆฌ์ ๋ฒ์๋ 0~9 ์ฌ์ด์ ์ ์์ด๋ฏ๋ก counting sort๋ฅผ ์ด์ฉํ์ฌ ํ ์ ์๋ค. ๊ฐ ์๋ฆฌ ์๋ค์ index๋ก ํ์ฌ ๊ฐ์๋ฅผ ์ธ์ด ์ค ๋ค์, 0์ ์ ์ธํ ์๋ค์ ์ญ์์ผ๋ก ๊ฐ์์ ๋ง๊ฒ ๋ถ์ด๋ฉด์ ๋ง๋ค๋ฉด ๋ด๋ฆผ์ฐจ์์ผ๋ก ์ ๋ ฌ๋ ์๋ฅผ ๋ง๋ค ์ ์๋ค.
+
+์ด๋ฅผ 3์ ๋ฐฐ์์ธ์ง ํ์ธํ๊ณ 0์ ๊ฐ์ ๋งํผ์ 10์ ๊ฑฐ๋ญ์ ๊ณฑ์ ๊ณฑํด์ค๋ค.
+
+```python
+import sys
+nums = str(sys.stdin.readline().strip())
+if '0' not in nums:
+ print(-1)
+else:
+ l = [0] * (int(max(nums)) + 1)
+ s = ''
+ sum = 0
+ for i in nums:
+ l[int(i)] += 1
+ for i in range(len(l)-1, 0, -1):
+ s += str(i) * l[i]
+ sum += i * l[i]
+ if sum % 3 == 0: print(int(s) * (10 ** l[0]))
+ else: print(-1)
+```
\ No newline at end of file
diff --git a/_posts/2022-03-11-boj_1011.markdown b/_posts/2022-03-11-boj_1011.markdown
new file mode 100644
index 00000000000..9f9778200b6
--- /dev/null
+++ b/_posts/2022-03-11-boj_1011.markdown
@@ -0,0 +1,67 @@
+---
+title: "[BOJ] Fly me to the Alpha Centauri - 1011 (G5)"
+author: kwon
+date: 2022-03-11T23:00:00 +0900
+categories: [boj, gold]
+tags: [math]
+math: true
+mermaid: false
+---
+
+| ์๊ฐ ์ ํ | ๋ฉ๋ชจ๋ฆฌ ์ ํ |
+| --- | --- |
+| 2 ์ด | 512 MB |
+
+## ๋ฌธ์
+
+์ฐํ์ด๋ ์ด๋ฆฐ ์์ , ์ง๊ตฌ ์ธ์ ๋ค๋ฅธ ํ์ฑ์์๋ ์ธ๋ฅ๋ค์ด ์ด์๊ฐ ์ ์๋ ๋ฏธ๋๊ฐ ์ค๋ฆฌ๋ผ ๋ฏฟ์๋ค. ๊ทธ๋ฆฌ๊ณ ๊ทธ๊ฐ ์ง๊ตฌ๋ผ๋ ์ธ์์ ๋ฐ์ ๋ด๋ ค ๋์ ์ง 23๋
์ด ์ง๋ ์ง๊ธ, ์ธ๊ณ ์ต์ฐ์ ASNA ์ฐ์ฃผ ๋นํ์ฌ๊ฐ ๋์ด ์๋ก์ด ์ธ๊ณ์ ๋ฐ์ ๋ด๋ ค ๋๋ ์๊ด์ ์๊ฐ์ ๊ธฐ๋ค๋ฆฌ๊ณ ์๋ค.
+
+๊ทธ๊ฐ ํ์นํ๊ฒ ๋ ์ฐ์ฃผ์ ์ Alpha Centauri๋ผ๋ ์๋ก์ด ์ธ๋ฅ์ ๋ณด๊ธ์๋ฆฌ๋ฅผ ๊ฐ์ฒํ๊ธฐ ์ํ ๋๊ท๋ชจ ์ํ ์ ์ง ์์คํ
์ ํ์ฌํ๊ณ ์๊ธฐ ๋๋ฌธ์, ๊ทธ ํฌ๊ธฐ์ ์ง๋์ด ์์ฒญ๋ ์ด์ ๋ก ์ต์ ๊ธฐ์ ๋ ฅ์ ์ด ๋์ํ์ฌ ๊ฐ๋ฐํ ๊ณต๊ฐ์ด๋ ์ฅ์น๋ฅผ ํ์ฌํ์๋ค. ํ์ง๋ง ์ด ๊ณต๊ฐ์ด๋ ์ฅ์น๋ ์ด๋ ๊ฑฐ๋ฆฌ๋ฅผ ๊ธ๊ฒฉํ๊ฒ ๋๋ฆด ๊ฒฝ์ฐ ๊ธฐ๊ณ์ ์ฌ๊ฐํ ๊ฒฐํจ์ด ๋ฐ์ํ๋ ๋จ์ ์ด ์์ด์, ์ด์ ์๋์๊ธฐ์ k๊ด๋
์ ์ด๋ํ์์ ๋๋ k-1 , k ํน์ k+1 ๊ด๋
๋ง์ ๋ค์ ์ด๋ํ ์ ์๋ค. ์๋ฅผ ๋ค์ด, ์ด ์ฅ์น๋ฅผ ์ฒ์ ์๋์ํฌ ๊ฒฝ์ฐ -1 , 0 , 1 ๊ด๋
์ ์ด๋ก ์ ์ด๋ํ ์ ์์ผ๋ ์ฌ์ค์ ์์ ํน์ 0 ๊ฑฐ๋ฆฌ๋งํผ์ ์ด๋์ ์๋ฏธ๊ฐ ์์ผ๋ฏ๋ก 1 ๊ด๋
์ ์ด๋ํ ์ ์์ผ๋ฉฐ, ๊ทธ ๋ค์์๋ 0 , 1 , 2 ๊ด๋
์ ์ด๋ํ ์ ์๋ ๊ฒ์ด๋ค. ( ์ฌ๊ธฐ์ ๋ค์ 2๊ด๋
์ ์ด๋ํ๋ค๋ฉด ๋ค์ ์๊ธฐ์ 1, 2, 3 ๊ด๋
์ ์ด๋ํ ์ ์๋ค. )
+
+!https://www.acmicpc.net/upload/201003/rlaehdgur.JPG
+
+๊น์ฐํ์ ๊ณต๊ฐ์ด๋ ์ฅ์น ์๋์์ ์๋์ง ์๋ชจ๊ฐ ํฌ๋ค๋ ์ ์ ์ ์๊ณ ์๊ธฐ ๋๋ฌธ์ x์ง์ ์์ y์ง์ ์ ํฅํด ์ต์ํ์ ์๋ ํ์๋ก ์ด๋ํ๋ ค ํ๋ค. ํ์ง๋ง y์ง์ ์ ๋์ฐฉํด์๋ ๊ณต๊ฐ ์ด๋์ฅ์น์ ์์ ์ฑ์ ์ํ์ฌ y์ง์ ์ ๋์ฐฉํ๊ธฐ ๋ฐ๋ก ์ง์ ์ ์ด๋๊ฑฐ๋ฆฌ๋ ๋ฐ๋์ 1๊ด๋
์ผ๋ก ํ๋ ค ํ๋ค.
+
+๊น์ฐํ์ ์ํด x์ง์ ๋ถํฐ ์ ํํ y์ง์ ์ผ๋ก ์ด๋ํ๋๋ฐ ํ์ํ ๊ณต๊ฐ ์ด๋ ์ฅ์น ์๋ ํ์์ ์ต์๊ฐ์ ๊ตฌํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ๋ผ.
+
+## ์
๋ ฅ
+
+์
๋ ฅ์ ์ฒซ ์ค์๋ ํ
์คํธ์ผ์ด์ค์ ๊ฐ์ T๊ฐ ์ฃผ์ด์ง๋ค. ๊ฐ๊ฐ์ ํ
์คํธ ์ผ์ด์ค์ ๋ํด ํ์ฌ ์์น x ์ ๋ชฉํ ์์น y ๊ฐ ์ ์๋ก ์ฃผ์ด์ง๋ฉฐ, x๋ ํญ์ y๋ณด๋ค ์์ ๊ฐ์ ๊ฐ๋๋ค. $(0 โค x < y < 2^{31})$
+
+## ์ถ๋ ฅ
+
+๊ฐ ํ
์คํธ ์ผ์ด์ค์ ๋ํด x์ง์ ์ผ๋ก๋ถํฐ y์ง์ ๊น์ง ์ ํํ ๋๋ฌํ๋๋ฐ ํ์ํ ์ต์ํ์ ๊ณต๊ฐ์ด๋ ์ฅ์น ์๋ ํ์๋ฅผ ์ถ๋ ฅํ๋ค.
+
+## ํ์ด
+
+์ต์ ํ์๋ก ๋ชฉํ์ ๋๋ฌํ๋ ค๋ฉด ํญ์ ์ค๊ฐ ๋ถ๋ถ์์ ์ต๋ ๊ฑฐ๋ฆฌ๋ก ๊ณต๊ฐ์ด๋์ ํด์ผ ํ๋ค. ๊ทธ๋ฌ๋ฏ๋ก ์ค๊ฐ ์ง์ ๊น์ง๋ 1์ฉ ๋๋ ค๊ฐ๋ฉด์ ์ด๋ํ๋ค๊ฐ ์ค๊ฐ์ ์ง๋๋ ์๊ฐ๋ถํฐ 1์ฉ ์ค์ด๋ฉด์ ์ด๋ํ๋ฉด ๋๋ค. ํ์ง๋ง x์ y ์ฌ์ด์ ๊ฑฐ๋ฆฌ๊ฐ ์ต๋ $2^{31}$๊น์ง ๋์ด๋ ์ ์์ผ๋ฏ๋ก ์ด๋์ ๋ชจ๋ ํด๋ณด๋ ๊ฒ์ ๋ถ์ ํฉํ๋ค.
+
+๊ทธ๋์ ๋ฑ์ฐจ์์ด์ ํฉ์ ์ด์ฉํ๋ค. ์ค๊ฐ๊น์ง ์ด๋ํ๋ ํ์๋ฅผ $n$์ด๋ผ๊ณ ํ์ ๋ ์ด ์ด๋ ๊ฑฐ๋ฆฌ๋ ์์ํญ์ด 1, ๋ง์ง๋งํญ์ด $n+1$์ด๊ณ ๊ณต์ฐจ๊ฐ 1์ธ ๋ฑ์ฐจ์์ด์ ํฉ์ผ๋ก ์๊ฐํ ์ ์๋ค. ๊ทธ๋ฆฌ๊ณ ์ด ๋ ํฉ์ $n(n+1)/2$๋ก ๊ณ์ฐํ๋ฉด ๋๋ค. ์ด๊ฒ์ ์ผ๋์ ๋๊ณ ๊ฐ๋ฅํ ์ํฉ์ ์๊ฐํด๋ณด๋ฉด ๋ฌธ์ ๋ฅผ ํ ์ ์๋ค.
+
+์ฌ๋ฌ ์ํฉ์ ๊ฐ์ ํด๋ณด๊ธฐ ์ํด $n$์ ๊ฑฐ๋ฆฌ์ ์ ๊ณฑ๊ทผ์ ๋ฒ๋ฆผ์ ์ทจํ ์ ์๋ผ๊ณ ํ๊ณ ์๊ฐํด๋ณด์.
+
+๋จผ์ ์ค๊ฐ์ ๊ธฐ์ค์ผ๋ก ์ ์ชฝ์ ํ์๊ฐ ๊ฐ์ ๊ฒฝ์ฐ์๋ ์์ชฝ ๋ชจ๋๊ฐ $n(n+1)/2$๋ก ๊ณ์ฐ์ด ๋์ด์ผ ํ๋ฉฐ ์ด ๋ ์ด ํ์๋ $2n$์ด๊ณ , ๊ฑฐ๋ฆฌ๊ฐ ์ ํํ $n(n+1)$์ผ ๋ ๊ฐ๋ฅํ๋ค.
+
+๋ค์์ ํ ์ชฝ์ ํ์๊ฐ ํ๋ ๋ง์ ๊ฒฝ์ฐ์ด๋ค. ์ด ๊ฒฝ์ฐ ํ ์ชฝ์ $n(n+1)/2$์ด๊ณ ๋ฐ๋์ชฝ์ $n(n+2)/2$๋ก ๊ณ์ฐ์ด ๋์ด์ผ ํ๋ค. ์ด ๋ ์ด ํ์๋ $2n+1$์ด๊ณ , ๊ฑฐ๋ฆฌ๊ฐ $n(n+1)$๋ณด๋ค ํด ๋ ๊ฐ๋ฅํ๋ค.
+
+๋ง์ง๋ง์ผ๋ก๋ ํ ์ชฝ์ ํ์๊ฐ ํ๋ ์ ์ ๊ฒฝ์ฐ์ด๋ค. ์ด ๊ฒฝ์ฐ $n(n+1)/2$์ด๊ณ ๋ฐ๋์ชฝ์ $n(n-1)/2$๋ก ๊ณ์ฐ์ด ๋์ด์ผ ํ๋ค. ์ด ๋ ์ด ํ์๋ $2n-1$์ด๊ณ , ๊ฑฐ๋ฆฌ๊ฐ $n^2$์ผ ๋ ๊ฐ๋ฅํ๋ค.
+
+๋ง์ฝ ์ ๊ฒฝ์ฐ์ ํฌํจ๋์ง ์์ผ๋ฉด์ ๊ฑฐ๋ฆฌ๊ฐ $n(n+1)$๋ณด๋ค ํฌ๋ค๋ฉด $n$์ ํฌ๊ธฐ ์์ฒด๊ฐ ๋ถ์กฑํ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ ๊ณ ๋ คํ์ง ์๋๋ค.
+
+### ์ฝ๋
+```python
+import sys, math
+
+i = int(sys.stdin.readline())
+for _ in range(i):
+ n, m = map(int, sys.stdin.readline().split())
+ N = m - n
+ r_N = math.sqrt(N)
+ N_int = math.trunc(r_N)
+ if r_N == N_int: print(N_int * 2 - 1)
+ else:
+ if N > N_int * (N_int + 1):
+ print(N_int * 2 + 1)
+ else:
+ print(N_int * 2)
+```
\ No newline at end of file
diff --git a/_posts/2022-04-14-dlZeroToAll-PyTorch-1.markdown b/_posts/2022-04-14-dlZeroToAll-PyTorch-1.markdown
new file mode 100644
index 00000000000..b629df9d865
--- /dev/null
+++ b/_posts/2022-04-14-dlZeroToAll-PyTorch-1.markdown
@@ -0,0 +1,627 @@
+---
+title: "๋ชจ๋๋ฅผ ์ํ ๋ฅ๋ฌ๋ 2 - Lab1: Tensor Manipulation"
+author: Kwon
+date: 2022-04-14T16:50:00+0900
+categories: [pytorch, study]
+tags: [basic, tensor-manipulation]
+math: true
+mermaid: false
+---
+
+[๋ชจ๋๋ฅผ ์ํ ๋ฅ๋ฌ๋](https://deeplearningzerotoall.github.io/season2/lec_pytorch.html) Lab 1: Tensor Manipulation ๊ฐ์๋ฅผ ๋ณธ ํ ๊ณต๋ถ๋ฅผ ๋ชฉ์ ์ผ๋ก ์์ฑํ ๊ฒ์๋ฌผ์
๋๋ค.
+
+***
+## 1. Vector, Matrix and Tensor
+
+
+Vector, Matrix, Tensor์ ํํ์ ์ ๊ทธ๋ฆผ๊ณผ ๊ฐ์ด ๋ํ๋ผ ์ ์๋ค.
+
+๊ฐ ๊ตฌ์กฐ๋ค์ ํฌ๊ธฐ๋ ์ฐจ์๋ค์ ํฌ๊ธฐ์ ๊ณฑ์ผ๋ก ๊ตฌํ ์ ์๋๋ฐ
+
+
+
+Metrix์ Tonsor์ ํฌ๊ธฐ(t)๋ ์์ ๊ฐ์ด ๊ตฌํ ์ ์๋ค.
+
+๋ํ ์ ๊ทธ๋ฆผ์ ์ฐจ์์ ์์๋ ํ์ดํ ์น์์ ์ฐจ์์ ํํํ ๋์ ์์์ ๊ฐ๋ค.
+์ฆ, ์๋์ ๊ฐ์ ์์๋๋ก ํํํ๋ฉด ๋๋ค.
+
+
+
+ํฌ๊ธฐ๋ฅผ ๊ตฌํ ๋ ๋ดค๋ ์์๋ฅผ ๋ค์ ํ์ธํด ๋ณด๋ฉด Vector๋ (batch size, dim)์, Tensor๋ (batch size, length, dim)์์ผ๋ก ์ ๊ทธ๋ฆผ๊ณผ ๊ฐ์ ์์๋ก ํํํ ๊ฒ์ ๋ณผ ์ ์๋ค.
+
+
+***
+## Import
+{% highlight python %}
+import numpy as np
+import torch
+{% endhighlight %}
+
+## 2. Array with PyTorch
+#### 1D Array
+{% highlight python %}
+t = torch.FloatTensor([0., 1., 2., 3., 4., 5., 6.])
+print(t)
+
+''' output
+tensor([0., 1., 2., 3., 4., 5., 6.])
+'''
+{% endhighlight %}
+
+1์ฐจ์ ๋ฐฐ์ด์ ๊ฒฝ์ฐ ์์ ๊ฐ์ด FloatTensor๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐฐ์ด์ PyTorch์ 1์ฐจ์ ์ค์ํ tensor๋ก ๋ณํํ ์ ์๋ค.
+
+#### 2D Array
+{% highlight python %}
+t = torch.FloatTensor([[1., 2., 3.],
+ [4., 5., 6.],
+ [7., 8., 9.],
+ [10., 11., 12.]
+ ])
+print(t)
+
+''' output
+tensor([[ 1., 2., 3.],
+ [ 4., 5., 6.],
+ [ 7., 8., 9.],
+ [10., 11., 12.]])
+''''
+{% endhighlight %}
+
+2์ฐจ์ ๋ฐฐ์ด์ ๊ฒฝ์ฐ์๋ ๋ง์ฐฌ๊ฐ์ง๋ก FloatTensor๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐฐ์ด์ PyTorch์ 2์ฐจ์ ์ค์ํ tensor๋ก ๋ณํํ ์ ์๋ค.
+
+์ ์์ ๋ค์์๋ ์ค์ํ tensor๋ง์ ์๋ก ๋ค์์ง๋ง ๋ค๋ฅธ ์๋ฃํ๋ค์ ๊ฒฝ์ฐ๋ ๋ค์๊ณผ ๊ฐ์ด tensor ์์ฑ์ด ๊ฐ๋ฅํ๋ค.
+
+๊ฐ type๋ค์ ๋ํ tensor ์์ฑ ๋ฐฉ๋ฒ์ ๋ค์๊ณผ ๊ฐ๋ค.
+
+{% highlight python %}
+# dtype: torch.float32 or torch.float (32-bit floating point)
+torch.FloatTensor()
+
+# dtype: torch.float64 or torch.double (64-bit floating point)
+torch.FloatTensor()
+
+# dtype: torch.uint8 (8-bit integer (unsigned))
+torch.ByteTensor()
+
+# dtype: torch.int8 (8-bit integer (signed))
+torch.CharTensor()
+
+# dtype: torch.int16 (16-bit integer (signed))
+torch.ShortTensor()
+
+# dtype: torch.int32 (32-bit integer (signed))
+torch.IntTensor()
+
+# dtype: torch.int64 (64-bit integer (signed))
+torch.LongTensor()
+
+# dtype: torch.bool
+torch.BoolTensor()
+{% endhighlight %}
+
+์์ ๊ฐ์ด ํ์
์ ์ง์ ํ์ฌ tensor๋ฅผ ์์ฑํด๋ ๋์ง๋ง ๋ค์๊ณผ ๊ฐ์ด ์์ฑํ ์๋ ์๋ค.
+
+{% highlight python %}
+torch.tensor([[1., -1.], [1., -1.]])
+
+''' output
+tensor([[ 1.0000, -1.0000],
+ [ 1.0000, -1.0000]])
+'''
+{% endhighlight %}
+
+
+***
+## 3. Frequently Used Operations in PyTorch
+### Broadcasting
+์๋ก shape์ด ๋ค๋ฅธ tensor๊ฐ์ ์ฐ์ฐ์ ํ ๋ ์๋์ผ๋ก ๋ ์ค ๋ ์์ shape์ tensor๋ฅผ ๋ shape์ด ํฐ tensor์ shape์ผ๋ก ๋ง์ถฐ์ฃผ์ด(broadcast) ๊ณ์ฐํด ์ฃผ๋ ๊ฒ์ ๋งํ๋ค.
+
+##### Same shape
+{% highlight python %}
+m1 = torch.FloatTensor([[3, 3]])
+m2 = torch.FloatTensor([[2, 2]])
+print(m1 + m2)
+
+''' output
+tensor([[5., 5.]])
+'''
+{% endhighlight %}
+
+๊ฐ์ shape์ ๊ฐ์ง๋ tensor ๊ฐ์ ์ฐ์ฐ์ ์ ์ฝ๋์ ๊ฒฐ๊ณผ์ฒ๋ผ ๊ฐ์ ์๋ฆฌ์ ์์๋ผ๋ฆฌ ๊ณ์ฐํด ์ฃผ๋ฉด ๋๋ค.
+
+##### Vector + Scalar
+{% highlight python %}
+m1 = torch.FloatTensor([[1, 2]])
+m2 = torch.FloatTensor([3]) # 3 -> [[3, 3]]
+print(m1 + m2)
+
+''' output
+tensor([[4., 5.]])
+'''
+{% endhighlight %}
+
+์ด๋ฒ์๋ vector์ scalar์ ํฉ์ด๋ค. ์ด๋ด ๋ `[3]`์ด `[[3, 3]]`์ผ๋ก **boradcast** ๋์ด shape์ ๋์ผํ๊ฒ ๋ง๋ ํ ์ฐ์ฐ์ ์งํํ๊ฒ ๋๋ค. ๊ทธ๋์ `[[1, 2]] + [[3, 3]]`์ ๊ฒฐ๊ณผ์ธ `[[4, 5]]`๊ฐ ๋์จ๋ค.
+
+##### (2 x 1) Vector + (1 X 2) Vector
+{% highlight python %}
+m1 = torch.FloatTensor([[1, 2]]) # [[1, 2]] -> [[1, 2], [1, 2]]
+m2 = torch.FloatTensor([[3], [4]]) # [[3], [4]] -> [[3, 3], [4, 4]]
+print(m1 + m2)
+
+''' output
+tensor([[4., 5.],
+ [5., 6.]])
+'''
+{% endhighlight %}
+์๋ก shape์ด ๋ค๋ฅธ vector๊ฐ์ ์ฐ์ฐ์ ๊ฒฝ์ฐ์๋ ์์ ์ฐจ์์ ํฐ ์ฐจ์์ผ๋ก ๋ง์ถ ํ ์ฐ์ฐ์ ํ๋ค.
+
+์ ์ฝ๋์์๋ `[[1, 2]]`์ด `[[1, 2], [1, 2]]`๋ก `[[3], [4]]`๊ฐ `[[3, 3], [4, 4]]`๋ก ๊ฐ๊ฐ **broadcast**๋์ด ์ฐ์ฐ์ ์งํํ๊ธฐ ๋๋ฌธ์ ๊ทธ ๊ฒฐ๊ณผ๊ฐ์ `[[4, 5], [5, 6]]`์ด ๋์จ๋ค.
+
+
+### Mul vs. Matmul
+๋๋ค tensor์ ๊ณฑ์ฐ์ฐ์ ํด ์ฃผ๋ฉฐ, ์ฌ์ฉํ๋ ํ์๋ `m1.matmul(m2)`, `m1.mul(m2)`๋ก ๋์ผํ์ง๋ง ์ฐจ์ด์ ์ ์์ ์ธ๊ธํ broadcasting ์ฌ๋ถ์ ์๋ค.
+{% highlight python %}
+# Without broadcasting
+m1 = torch.FloatTensor([[1, 2], [3, 4]])
+m2 = torch.FloatTensor([[1], [2]])
+print('Shape of Matrix 1: ', m1.shape) # 2 x 2
+print('Shape of Matrix 2: ', m2.shape) # 2 x 1
+print(m1.matmul(m2)) # 2 x 1
+
+# With broadcasting
+m1 = torch.FloatTensor([[1, 2], [3, 4]])
+m2 = torch.FloatTensor([[1], [2]])
+print('Shape of Matrix 1: ', m1.shape) # 2 x 2
+print('Shape of Matrix 2: ', m2.shape) # 2 x 1 ([[1], [2]]) -> 2 x 2 ([[1, 1], [2, 2]])
+print(m1 * m2) # 2 x 2
+print(m1.mul(m2))
+
+''' output
+Shape of Matrix 1: torch.Size([2, 2])
+Shape of Matrix 2: torch.Size([2, 1])
+tensor([[ 5.],
+ [11.]])
+Shape of Matrix 1: torch.Size([2, 2])
+Shape of Matrix 2: torch.Size([2, 1])
+tensor([[1., 2.],
+ [6., 8.]])
+tensor([[1., 2.],
+ [6., 8.]])
+'''
+{% endhighlight %}
+
+`matmul`์ ๊ฒฝ์ฐ broadcasting ์์ด ํ๋ ฌ ๊ณฑ์
์ ํ๋ค. ๊ทธ๋ฌ๋ฏ๋ก ๊ฐ tonsor์ shape ๋ณํ ์์ด ๊ทธ๋๋ก ๊ณฑํ๋ค.
+
+๋ฐ๋ฉด `mul`์ broadcasting์ ํ๊ณ ํ๋ ฌ์ ๊ฐ ์์๋ค์ ๊ณฑํ๋ค. ์ด ๋๋ฌธ์ `m2`์ shape์ด 2 x 1์์ 2 x 2๋ก `m1`์ shape์ ๋ง์ถฐ์ง ํ์ ๊ฐ ์๋ฆฌ์ ์์๋ผ๋ฆฌ ๊ณฑ์
์ด ๊ณ์ฐ๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
+
+
+### Mean
+ํ๊ท ์ ๊ณ์ฐํด ์ค๋ค.
+{% highlight python %}
+t = torch.FloatTensor([[1, 2], [3, 4]])
+print(t)
+
+''' output
+tensor([[1., 2.],
+ [3., 4.]])
+'''
+
+print(t.mean())
+print(t.mean(dim=0)) # ์ฒซ ๋ฒ์งธ ์ฐจ์ ํ๊ท
+print(t.mean(dim=1)) # ๋ ๋ฒ์งธ ์ฐจ์ ํ๊ท
+print(t.mean(dim=-1)) # ๋ง์ง๋ง ์ฐจ์ ํ๊ท
+
+''' output
+tensor(2.5000)
+tensor([2., 3.])
+tensor([1.5000, 3.5000])
+tensor([1.5000, 3.5000])
+'''
+{% endhighlight %}
+
+๋งค๊ฐ๋ณ์๋ก `dim`์ ์
๋ ฅํ ์ ์๋ค. ์๋ฌด๊ฒ๋ ์
๋ ฅํ์ง ์์ ๊ฒฝ์ฐ์๋ tonsor์ ํฌํจ๋ ๊ฐ ์ ์ฒด๋ฅผ, ์ฐจ์์ ์ง์ ํด ์ค ๊ฒฝ์ฐ ๊ทธ ์ฐจ์์ ๊ฐ๋ค๋ก ํ๊ท ์ ๊ณ์ฐํ์ฌ tensor๋ฅผ ๋ฐํํ๋ค.
+
+`dim=0`์ด๋ฉด ์ฒซ ๋ฒ์งธ ์ฐจ์(์ธ๋ก)์ ๊ธฐ์ค์ผ๋ก ํ๊ท ์ ๊ณ์ฐํ๊ณ , `dim=1`์ด๋ฉด ๋ ๋ฒ์งธ ์ฐจ์(๊ฐ๋ก)์, `dim=-1`์ด๋ฉด ๋ง์ง๋ง ์ฐจ์(์ฌ๊ธฐ์ ๋ ๋ฒ์งธ ์ฐจ์)์ ๊ธฐ์ค์ผ๋ก ํ๊ท ์ ๊ณ์ฐํ๋ค.
+
+
+### Sum
+ํฉ์ ๊ณ์ฐํด ์ค๋ค. ํ๊ท ๊ณผ ๊ธฐ๋ณธ์ ์ผ๋ก ์ฌ์ฉ๋ฒ์ด ๊ฐ๋ค. ์ฐจ์ด์ ์ ๊ฒฐ๊ณผ๊ฐ์ผ๋ก ํฉ์ ๋ฐํํ๋ค๋ ๊ฒ.
+
+{% highlight python %}
+t = torch.FloatTensor([[1, 2], [3, 4]])
+print(t)
+
+''' output
+tensor([[1., 2.],
+ [3., 4.]])
+'''
+
+print(t.sum())
+print(t.sum(dim=0)) # ์ฒซ ๋ฒ์งธ ์ฐจ์ ํฉ
+print(t.sum(dim=1)) # ๋ ๋ฒ์งธ ์ฐจ์ ํฉ
+print(t.sum(dim=-1)) # ๋ง์ง๋ง ์ฐจ์ ํฉ
+
+''' output
+tensor(10.)
+tensor([4., 6.])
+tensor([3., 7.])
+tensor([3., 7.])
+'''
+{% endhighlight %}
+
+
+### Max and Argmax
+max๋ ์ต๋๊ฐ์ argmax๋ ์ต๋๊ฐ์ index๋ฅผ ์๋ฏธํ๋ค.
+
+{% highlight python %}
+t = torch.FloatTensor([[1, 2], [3, 4]])
+print(t)
+
+''' output
+tensor([[1., 2.],
+ [3., 4.]])
+'''
+
+print(t.max()) # Returns one value: max
+
+''' output
+tensor(4.)
+'''
+{% endhighlight %}
+
+๋งค๊ฐ๋ณ์๋ฅผ ๋ฃ์ง ์์ผ๋ฉด ์ ์ฒด์์ ์ต๋๊ฐ์ ์ฐพ์ ๊ทธ ๊ฐ์ ๋ฐํํ๋ค.
+
+
+{% highlight python %}
+print(t.max(dim=0)) # Returns two values: max and argmax (value amd index)
+print('Max: ', t.max(dim=0)[0])
+print('Argmax: ', t.max(dim=0)[1])
+
+''' output
+(tensor([3., 4.]), tensor([1, 1]))
+Max: tensor([3., 4.])
+Argmax: tensor([1, 1])
+'''
+
+print(t.max(dim=1))
+print(t.max(dim=-1))
+
+''' output
+(tensor([2., 4.]), tensor([1, 1]))
+(tensor([2., 4.]), tensor([1, 1]))
+'''
+{% endhighlight %}
+`dim`์ ์ง์ ํ๋ฉด ํด๋น ์ฐจ์์์์ ์ต๋๊ฐ๊ณผ ๊ทธ ์ฐจ์์์ ์ต๋๊ฐ์ ์์น๋ฅผ tuple ํํ๋ก ๋ฐํํ๋ค.
+
+์์ ๊ฒฝ์ฐ `dim=0`(์ฒซ ๋ฒ์งธ ์ฐจ์ - ์ด)์ ๊ธฐ์ค์ผ๋ก ์ต๋๊ฐ์ธ 3, 4์ ๊ทธ ๊ฐ๋ค์ index์ธ 1, 1์ด ๋ฐํ๋๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
+
+`dim=1`์ธ ๊ฒฝ์ฐ์๋ ๊ธฐ์ค์ด ๋๋ ์ฐจ์๋ง ๋ฌ๋ผ์ง๊ณ ๊ฐ์ ๋ฐฉ์์ผ๋ก `(max, argmax)`๋ฅผ ๋ฐํํ๋ค.
+
+๋ง์ฝ argmax ๊ฐ๋ง ํ์ํ๋ค๋ฉด ์๋์ ๊ฐ์ด `torch.argmax()`๋ฅผ ์ฌ์ฉํ์ฌ ๊ฐ์ ์ป์ ์ ์๋ค.
+{% highlight python %}
+print(t.argmax(dim=0))
+print(t.argmax(dim=1))
+print(t.argmax(dim=-1))
+
+''' output
+tensor([1, 1])
+tensor([1, 1])
+tensor([1, 1])
+'''
+{% endhighlight %}
+
+
+### View
+numpy์ reshape๊ณผ ๊ฐ์ ์ญํ ์ ํ๋ค.
+{% highlight python %}
+t = np.array([[[0, 1, 2],
+ [3, 4, 5]],
+
+ [[6, 7, 8],
+ [9, 10, 11]]])
+ft = torch.FloatTensor(t)
+print(ft.shape)
+
+''' output
+torch.Size([2, 2, 3])
+'''
+
+print(ft.view([-1, 3]))
+print(ft.view([-1, 3]).shape)
+
+''' output
+tensor([[ 0., 1., 2.],
+ [ 3., 4., 5.],
+ [ 6., 7., 8.],
+ [ 9., 10., 11.]])
+'''
+
+# -1์ ๋ณดํต ๊ฐ์ฅ ๋ณ๋์ด ์ฌํ batch size ๋ฑ(๊ณ์ฐ ์ค์๊ฐ ๋ง์ด ์ผ์ด๋ ๋งํ ๊ณณ)์ ์ฌ์ฉ
+# view(reshape) ํ๋ ค๋ ๊ฒฐ๊ณผ ์ฐจ์์ ๊ณฑ์ด ์ฒ์ ์ฐจ์๋ค์ ๊ณฑ๊ณผ ๊ฐ์์ผ ์ฌ์ฉ ๊ฐ๋ฅ
+print(ft.view([-1, 1, 3]))
+print(ft.view([-1, 1, 3]).shape)
+
+''' output
+tensor([[[ 0., 1., 2.]],
+
+ [[ 3., 4., 5.]],
+
+ [[ 6., 7., 8.]],
+
+ [[ 9., 10., 11.]]])
+'''
+{% endhighlight %}
+shape์ด `[2, 2, 3]`์ธ tensor๋ฅผ ๋ค๋ฅธ shape๋ค๋ก ๋ณ๊ฒฝํ๋ ์์ ์ด๋ค.
+
+์ด๋ ์ฃผ์ํ ์ ์ shape์ ๋ณ๊ฒฝํ ๋์๊ณผ ๋ณ๊ฒฝํ ํ์ shape์ ๊ฐ ์ฐจ์์ ๊ณฑ์ด ๊ฐ์์ผ ํ๋ค๋ ๊ฒ์ด๋ค. ์์ ๊ฐ์ด shape์ด `[2, 2, 3]`์ด๋ผ๋ฉด ๋ณ๊ฒฝ๋ ์ดํ์ ์ฐจ์๋ค์ ๊ณฑ๋ 2x2x3 = 12์ฌ์ผ ํ๋ค.
+
+๋ง์ ๊ฒฝ์ฐ ์์ ๊ฐ์ด ํ ์ฐจ์์ -1์ ๋ฃ์ด ์ฐจ์์ ์๋์ผ๋ก ๋ง์ถฐ์ฃผ๋๋ก ํ๋๋ฐ, ๋ณดํต ๋ณ๋์ด ๊ฐ์ฅ ์ฌํ batch size ๋ฑ์ -1์ ์ ์ฉํ์ฌ ์ฌ์ฉํ๋ค.
+
+์ด๋ ๊ฒ ์ฌ์ฉํ๋ ๊น๋ญ์ ๋ณ๋์ด ์ฌํ๊ฑฐ๋ ๊ฐ์ด ํฐ ๊ฒฝ์ฐ ๋งค๋ฒ ๊ณ์ฐํ๋ ๊ฒ์ด ๋ถํธํ๊ธฐ๋ ํ๊ณ ๊ณ์ฐํ๋ ๊ณผ์ ์์ ์ค์๊ฐ ๋ฐ์ํ ์๋ ์๊ธฐ ๋๋ฌธ์ด๋ค.
+
+
+### Squeeze
+๊ฑธ๋ ๋ฅผ ์ง์ ๋ฌผ์ ๋นผ๋ด๋ ๊ฒ๊ณผ ๊ฐ์ด ์ฐจ์์ด 1์ธ ๊ฒ์ ๋ชจ๋ ์ญ์ ํด ์ค๋ค.
+{% highlight python %}
+ft = torch.FloatTensor([[0], [1], [2]])
+print(ft)
+print(ft.shape)
+
+''' output
+tensor([[0.],
+ [1.],
+ [2.]])
+torch.Size([3, 1])
+'''
+
+# 1์ด ์๋ ์ฐจ์์ ์ญ์
+# dim=? ์ ๊ฐ์ ๋ฃ์ ๊ฒฝ์ฐ ํด๋น ์ฐจ์์ด 1์ด๋ฉด ์ญ์
+print(ft.squeeze())
+print(ft.squeeze().shape)
+
+''' output
+tensor([0., 1., 2.])
+torch.Size([3])
+'''
+{% endhighlight %}
+์์ ๊ฐ์ด ์ฐจ์์ด 1์๋ฉด ์ญ์ ํด ์ค๋ค. `dim=?`๋ ์ค์ ํด ์ค ์ ์๋๋ฐ, ์ด ๊ฒฝ์ฐ ํด๋น ์ฐจ์์ด 1์ด๋ฉด ์ญ์ ํ๋ค. ์์ ์ ๊ฐ์ tensor์ ๊ฒฝ์ฐ `dim=1`์ผ ๋ ๋์ผํ ๊ฒฐ๊ณผ๋ฅผ ๋ณด์ฌ์ค๋ค.
+
+### Unsqueeze
+`squeeze`์ ๋ฐ๋์ด๋ค. ์ฐจ์์ ๋ช
์ํ์ฌ ๊ทธ ์ฐจ์์ 1๋ก ๋ง๋ค์ด ์ค๋ค.
+{% highlight python %}
+ft = torch.Tensor([0, 1, 2])
+print(ft.shape)
+
+''' output
+torch.Size([3])
+'''
+# ์ฐจ์(dim)์ ๋ช
์ํ์ฌ ๊ทธ ์ฐจ์์ 1๋ก ๋ง๋ค์ด์ค
+print(ft.unsqueeze(0))
+print(ft.unsqueeze(0).shape)
+
+print(ft.unsqueeze(1))
+print(ft.unsqueeze(1).shape)
+
+''' output
+tensor([[0., 1., 2.]])
+torch.Size([1, 3])
+
+tensor([[0.],
+ [1.],
+ [2.]])
+torch.Size([3, 1])
+'''
+{% endhighlight %}
+์ง์ ํ ์ฐจ์์ 1๋ก ๋ง๋ค์ด ์ฃผ๋ ๊ฒ์ ๋ณผ ์ ์๋ค.
+{% highlight python %}
+print(ft.view(1, -1))
+print(ft.view(1, -1).shape)
+
+print(ft.view(-1, 1))
+print(ft.view(-1, 1).shape)
+
+''' output
+tensor([[0., 1., 2.]])
+torch.Size([1, 3])
+
+tensor([[0.],
+ [1.],
+ [2.]])
+torch.Size([3, 1])
+'''
+{% endhighlight %}
+view๋ฅผ ์ด์ฉํด์ ๊ฐ์ ๊ฒฐ๊ณผ๋ฅผ ๋ง๋ค ์๋ ์๋ค.
+
+
+### Casting
+tensor์ ํ์ ๋ณํ์์ผ์ฃผ๋ ๊ฒ์ ๋งํ๋ค.
+{% highlight python %}
+# ํ
์์ ํ๋ณํ
+t = torch.LongTensor([1, 2, 3, 4])
+print(lt)
+
+''' output
+tensor([1, 2, 3, 4])
+'''
+
+print(lt.float())
+
+''' output
+tensor([1., 2., 3., 4.])
+'''
+{% endhighlight %}
+
+์์ ๊ฐ์ด `tensor.float()`์ผ๋ก ์ค์ํ ๋ณํ์ ํ ์ ์๊ณ
+
+{% highlight python %}
+bt = torch.ByteTensor([True, False, False, True])
+print(bt)
+
+''' output
+tensor([1, 0, 0, 1], dtype=torch.uint8)
+'''
+
+print(bt.long())
+print(bt.float())
+
+''' output
+tensor([1, 0, 0, 1])
+tensor([1., 0., 0., 1.])
+'''
+{% endhighlight %}
+
+์ด์ฒ๋ผ torch์ ๋ค๋ฅธ ํ์
๋ค๋ก๋ ๋ณํ์ด ๊ฐ๋ฅํ๋ค.
+
+
+### Concatenation
+tensor๋ค์ ์ด์ด๋ถ์ธ๋ค.
+
+{% highlight python %}
+x = torch.FloatTensor([[1, 2], [3, 4]])
+y = torch.FloatTensor([[5, 6], [7, 8]])
+
+# ์ฃผ์ด์ง ์ฐจ์์ด ๋์ด๋จ (์ด์ด ๋ถ์)
+print(torch.cat([x, y], dim=0))
+print(torch.cat([x, y], dim=1))
+
+''' output
+tensor([[1., 2.],
+ [3., 4.],
+ [5., 6.],
+ [7., 8.]])
+tensor([[1., 2., 5., 6.],
+ [3., 4., 7., 8.]])
+'''
+{% endhighlight %}
+
+์ด ๋ ์ฐจ์์ ์ง์ ํด ์ฃผ๋ฉด ๊ทธ ์ฐจ์์ผ๋ก tensor๋ฅผ ์๋๋ค. default๋ `dim=0`
+
+
+### Stacking
+`cat`๊ณผ ๋น์ทํ์ง๋ง ๋ฐ์ดํฐ์ ์ฐจ์์ ์ ์งํ๋ฉด์ ์๋๋ค๋ ๊ฐ๋
์ด `cat`์ ์ด์ด๋ธฅ์ธ๋ค๋ ๊ฐ๋
๊ณผ๋ ์กฐ๊ธ ๋ค๋ฅด๋ค.
+
+{% highlight python %}
+x = torch.FloatTensor([1, 4])
+y = torch.FloatTensor([2, 5])
+z = torch.FloatTensor([3, 6])
+
+
+print(torch.stack([x, y, z]))
+print(torch.stack([x, y, z], dim=1))
+
+''' output
+tensor([[1., 4.],
+ [2., 5.],
+ [3., 6.]])
+tensor([[1., 2., 3.],
+ [4., 5., 6.]])
+'''
+{% endhighlight %}
+
+๋ง์ฐฌ๊ฐ์ง๋ก stackํ๋ ๋ฐฉํฅ์ `dim`์ผ๋ก ์กฐ์ ํด ์ค ์ ์๋ค.
+
+๋ํ, ์ด ๊ณผ์ ์ `unsqueeze`์ `cat`์ ์กฐํฉ์ผ๋ก ๋๊ฐ์ด ์งํํ ์ ์๋ค.
+
+{% highlight python %}
+# torch.cat([(1, 2), (1, 2), (1, 2)], dim=0) -> (3, 2) (stacking๊ณผ ๋์ผ)
+print(torch.cat([x.unsqueeze(0), y.unsqueeze(0), z.unsqueeze(0)], dim=0))
+
+''' output
+tensor([[1., 4.],
+ [2., 5.],
+ [3., 6.]])
+'''
+{% endhighlight %}
+
+#### cat vs. stack
+cat ๊ณผ stack์ด ์กฐ๊ธ ํท๊ฐ๋ ค์ ์ฐจ์ด์ ์ ์ ๋ฆฌํด๋ณผ๊น ํ๋ค.
+
+๊ฒฐ๊ณผ๊ฐ๋ค์ shape์ ๋น๊ตํด ๋ณด๋ฉด ์กฐ๊ธ ๋ ์ฐจ์ด์ ์ ์๊ธฐ ์ฝ๋ค.
+
+{% highlight python %}
+x = torch.FloatTensor([[1, 2], [3, 4]])
+y = torch.FloatTensor([[5, 6], [7, 8]])
+
+print(x.shape, y.shape)
+print(torch.cat([x, y], dim=0).shape)
+print(torch.cat([x, y], dim=1).shape)
+
+x = torch.FloatTensor([1, 4])
+y = torch.FloatTensor([2, 5])
+z = torch.FloatTensor([3, 6])
+
+print(x.shape, y.shape, z.shape)
+print(torch.stack([x, y, z]).shape)
+print(torch.stack([x, y, z], dim=1).shape)
+
+''' output
+torch.Size([2, 2]) torch.Size([2, 2])
+torch.Size([4, 2])
+torch.Size([2, 4]
+
+torch.Size([2]) torch.Size([2]), torch.Size([2]
+torch.Size([3, 2])
+torch.Size([2, 3])
+'''
+{% endhighlight %}
+
+
+
+์ฝ๋์ ๊ฒฐ๊ณผ์ ๊ทธ๋ฆผ์ ํจ๊ป ๋ณด์.
+
+concat์ ๊ฒฝ์ฐ ๋ง ๊ทธ๋๋ก ์ด์ด ๋ถ์ด๋ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ ์ง์ ํด ์ค ์ฐจ์์ ๊ธธ์ด๊ฐ ๊ฐ tensor์ ์ฐจ์ ๊ธธ์ด ๋งํผ ๋์ด๋ฌ๋ค. ํ์ง๋ง ์ฐจ์์ ๊ฐ์ ๋ณํ๋ ์๋ค.
+๋ฐ๋ฉด, stack์ ์๋ก์ด ์ฐจ์์ ๋ฐฉํฅ์ผ๋ก ์๋ ๊ณผ์ ์ด๊ธฐ ๋๋ฌธ์ tensor ๊ฐ์ shape์ด ๊ฐ์์ผ ํ๊ณ ์ฐจ์์ด ํ๋ ๋ ๋์ด๋๋ค. ๊ทธ๋ฆฌ๊ณ ๊ทธ ์ฐจ์์ ํฌ๊ธฐ๋ ์์ผ๋ ค๋ ํ
์์ ๊ฐ์์ ๊ฐ๋ค.
+
+๋ค์ ์ ๋ฆฌํด ๋ณด๋ฉด conact์ ๋ฐ์ดํฐ๋ฅผ ๊ทธ๋๋ก ์๋ ๊ฒ, stack์ ์๋ก์ด ์ฐจ์์ผ๋ก ์๋ ๊ฒ์ด๋ผ๋ ์ฐจ์ด์ ์ด ์๋ค.
+
+
+### Ones and Zeros Like
+ํด๋น tensor์ ๊ฐ์ shape์ 1 ๋๋ 0์ผ๋ก ์ฑ์์ง tensor๋ฅผ ๋ง๋ ๋ค.
+
+{% highlight python %}
+x = torch.FloatTensor([[0, 1, 2], [2, 1, 0]])
+print(x)
+
+''' output
+tensor([[0., 1., 2.],
+ [2., 1., 0.]])
+'''
+
+# device๋ ๊ฐ๊ฒ ์ ์ธ๋จ
+print(torch.ones_like(x))
+print(torch.zeros_like(x))
+
+''' output
+tensor([[1., 1., 1.],
+ [1., 1., 1.]])
+tensor([[0., 0., 0.],
+ [0., 0., 0.]])
+'''
+{% endhighlight %}
+
+์ด๋ ๊ฒ ์์ฑ๋ tensor๋ shape ๋ฟ๋ง ์๋๋ผ device๋ ๊ฐ๊ฒ ์์ฑ๋๋ค. ์ฆ, ๋ฐ๋ก ๊ธฐ์กด์ tensor์ ์ฐ์ฐ์ด ๊ฐ๋ฅํ๋ค.
+
+
+### In-place Operation
+์ ์ธ ์์ด ๋ฐ๋ก ๊ฒฐ๊ณผ๊ฐ์ผ๋ก ๋์ฒดํ๋ค. ์ฌ์ฉ๋ฒ์ ์ฐ์ฐ์์ `_`๋ฅผ ๋ถ์ด๋ฉด ๋๋ค.
+
+{% highlight python %}
+print(x.mul(2.))
+print(x)
+# ์ ์ธ ์์ด ๋ฐ๋ก ๋์ฒด
+print(x.mul_(2.))
+print(x)
+
+''' output
+tensor([[2., 4.],
+ [6., 8.]])
+tensor([[1., 2.],
+ [3., 4.]])
+tensor([[2., 4.],
+ [6., 8.]])
+tensor([[2., 4.],
+ [6., 8.]])
+'''
+{% endhighlight %}
+
+์ ์ธํ๋ ๊ณผ์ ์ ์๋ตํ ์ ์๋ค๋ ์ฅ์ ์ด ์์ง๋ง PyTorch์ gc๊ฐ ์ ์ค๊ณ๋์ด ์์ด์ ์๋๋ฉด์ ์ด์ ์ ํฌ๊ฒ ์์ ์๋ ์๋ค๊ณ ํ๋ค.
\ No newline at end of file
diff --git a/_posts/2022-04-17-dlZeroToAll-PyTorch-2.markdown b/_posts/2022-04-17-dlZeroToAll-PyTorch-2.markdown
new file mode 100644
index 00000000000..be171b19187
--- /dev/null
+++ b/_posts/2022-04-17-dlZeroToAll-PyTorch-2.markdown
@@ -0,0 +1,224 @@
+---
+title: "๋ชจ๋๋ฅผ ์ํ ๋ฅ๋ฌ๋ 2 - Lab2: Linear regression"
+author: Kwon
+date: 2022-04-17T16:00:00+0900
+categories: [pytorch, study]
+tags: [linear-regressoin]
+math: true
+mermaid: false
+---
+
+[๋ชจ๋๋ฅผ ์ํ ๋ฅ๋ฌ๋](https://deeplearningzerotoall.github.io/season2/lec_pytorch.html) Lab 2: Linear regression ๊ฐ์๋ฅผ ๋ณธ ํ ๊ณต๋ถ๋ฅผ ๋ชฉ์ ์ผ๋ก ์์ฑํ ๊ฒ์๋ฌผ์
๋๋ค.
+
+***
+## Theoretical Overview
+
+### Hypothesis (๊ฐ์ค)
+์ ํ ํ๊ท์์ ์ฌ์ฉํ๋ 1์ฐจ ๋ฐฉ์ ์์ ๋งํ๋ค. weight์ bias๋ฅผ ๊ณ์ ๋ฐ๊ฟ๊ฐ๋ฉด๊ฑฐ ๋ง์ง๋ง ํ์ต์ด ๋๋ ๋ค์ ์ต์ข
๊ฐ์ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ๋ฅผ ์์ธกํ๋ค. ์์์ ๋ค์๊ณผ ๊ฐ๋ค.
+
+\\[ H(x) = Wx + b \\]
+
+์ต์ข
๊ฒฐ๊ณผ๋ก ๋์จ ๊ฐ์ค์ model์ด๋ผ ํ๊ณ 'ํ์ต๋์๋ค'๊ณ ํ๋ค.
+
+### Cost
+model์ ์์ธก ๊ฐ์ด ์ค์ ๊ฐ๊ณผ ์ผ๋ง๋ ๋ค๋ฅธ ์ง๋ฅผ ์๋ ค์ค๋ค. (์์์๋ก ์ข์ ๋ชจ๋ธ์ด๋ค.)
+
+์ฌ๊ธฐ์๋ ์๋์ ๊ฐ์ MSE(Mean Square Error)๋ฅผ ์ฌ์ฉํ๋ค.
+
+\\[ MSE = cost(W, b) = \frac{1}{m} \sum^m_{i=1} \left( H(x^{(i)}) - y^{(i)} \right)^2 \\]
+
+***
+## Import
+{% highlight python %}
+import torch
+import torch.nn as nn
+import torch.nn.functional as F
+import torch.optim as optim
+{% endhighlight %}
+
+***
+## Data
+๋ฐ์ดํฐ๋ ๋ค์๊ณผ ๊ฐ์ด ๊ฐ๋จํ ๊ณต๋ถ ์๊ฐ - ์ฑ์ ๋ฐ์ดํฐ ์
์ ์ฌ์ฉํ๋ค.
+
+| ๊ณต๋ถ ์๊ฐ | ์ฑ์ |
+|:----:|:----:|
+|1|1|
+|2|2|
+|3|3|
+{:.inner-borders}
+
+{% highlight python %}
+x_train = torch.FloatTensor([[1], [2], [3]])
+y_train = torch.FloatTensor([[1], [2], [3]])
+{% endhighlight %}
+
+๊ณต๋ถ ์๊ฐ์ด ๊ฐ๊ฐ 1์๊ฐ์์ 3์๊ฐ์ผ ๋ ๊ทธ ์ ์๋ 1์๊ฐ์์ 3์๊ฐ์ธ ๋ฐ์ดํฐ ์
์ด๋ค.
+
+์ด๋ฐ ๋ฐ์ดํฐ์
์ผ ๋ ๊ฐ์ฅ ์ด์์ ์ธ ํ๊ท์ ์ ํ๋ฒ ์๊ฐํด ๋ณด์.
+
+
+
+์์ ๊ฐ์ $ y = x $ ๊ผด์ ์ง์ ์ด ๊ฐ์ฅ ์ด์์ ์ผ ๊ฒ์ด๋ค. ๊ทธ๋ฌ๋ฏ๋ก ์ดํ ํ์ต์ ์งํํ ๋ weight=1, bias=0์ ๊ฐ๊น์ ์ง๋์ง ํ์ธํ๋ฉด ํ์ต์ด ์ ์ด๋ฃจ์ด์ง๊ณ ์๋์ง ์ ์ ์์ ๊ฒ์ด๋ค.
+
+***
+## Weight Initialization
+
+{% highlight python %}
+W = torch.zeros(1, requires_grad=True)
+print(W)
+b = torch.zeros(1, requires_grad=True)
+print(b)
+
+''' output
+tensor([0.], requires_grad=True)
+tensor([0.], requires_grad=True)
+'''
+{% endhighlight %}
+
+ํ์ตํ weight์ bias๋ฅผ ๋ชจ๋ 0์ผ๋ก ์ด๊ธฐํ ํด ์ค๋ค.
+
+***
+## Hypothesis
+\\[ H(x) = Wx + b \\]
+
+์์ ๋ณด์๋ Hypothesis ์์ ๋ฐ๋ผ ์ด๊ธฐํํด ์ค๋ค.
+
+{% highlight python %}
+hypothesis = x_train * W + b
+print(hypothesis)
+
+''' output
+tensor([[0.],
+ [0.],
+ [0.]], grad_fn=)
+'''
+{% endhighlight %}
+
+์ด๊ธฐ weight์ bias๋ ๋ชจ๋ 0์ด๋ฏ๋ก ๋ชจ๋ ๊ฐ์ด 0์ผ๋ก ๋์จ ๊ฒ์ ๋ณผ ์ ์๋ค.
+
+***
+## Cost
+\\[ MSE = cost(W, b) = \frac{1}{m} \sum^m_{i=1} \left( H(x^{(i)}) - y^{(i)} \right)^2 \\]
+
+Cost๋ ๋ง์ฐฌ๊ฐ์ง๋ก ์์ ๋์จ ์์ ๋ง์ถฐ ์ ์ํด ์ค๋ค.
+
+{% highlight python %}
+cost = torch.mean((hypothesis - y_train) ** 2)
+print(cost)
+
+''' output
+tensor(4.6667, grad_fn=)
+'''
+{% endhighlight %}
+
+***
+## Gradient Descent
+`optim`์ ํตํด SGD optimer๋ฅผ ๋ถ๋ฌ ์ฌ์ฉํ๋ค. Gradient Descent์ ๋ํ ๋ด์ฉ์ ๋ค์ ํฌ์คํ
์์ ๋ ์์ธํ๊ฒ ์ดํด ๋ณผ ์์ ์ด๋ค.
+
+{% highlight python %}
+optimizer = optim.SGD([W, b], lr=0.01)
+{% endhighlight %}
+
+๊ทธ๋ฆฌ๊ณ PyTorch์์ ํ์ต์ ํ ๋ ํญ์ ๋ฌถ์ด ์ฐ๋ ์ฝ๋๋ค์ด ์๋ค.
+
+{% highlight python %}
+optimizer.zero_grad() # gradient ์ด๊ธฐํ
+cost.backward() # gradient ๊ณ์ฐ
+optimizer.step() # ๊ณ์ฐ๋ gradient๋ฅผ ๋ฐ๋ผ W, b๋ฅผ ๊ฐ์
+
+print(W)
+print(b)
+
+''' output
+tensor([0.0933], requires_grad=True)
+tensor([0.0400], requires_grad=True)
+'''
+{% endhighlight %}
+
+์ 3๊ฐ์ ์ฝ๋๋ gradient๋ฅผ ์ด๊ธฐํ ํ๊ณ , cost์ ๋ฐ๋ผ ๊ณ์ฐํ๊ณ , ๊ทธ ๊ฒฐ๊ณผ์ ๋ฐ๋ผ weight์ bias๋ฅผ ๊ฐ์ ํ๋ ๊ณผ์ ์ด๋ค. ํ์ตํ ๋ ํ์ํ ๋ถ๋ถ์ด๋ฏ๋ก ์ธ์๋์ด์ผ ํ๋ค.
+
+gradient๋ฅผ ๊ณ์ฐํ ๋ ๊ฐ ์ํ๋ง๋ค `optimizer.zero_grad()`๋ก gradient๋ฅผ ์ด๊ธฐํํ๋ ์ด์ ๋ `cost.backward()`๊ฐ ๊ณ์ฐ์ ํ๊ณ ๊ธฐ์กด gradient๋ฅผ ๋์ฒดํ๋ ๊ฒ์ด ์๋๋ผ ๋ํ๊ธฐ ๋๋ฌธ์ด๋ผ๊ณ ํ๋ค.(DNN์์์ backpropagation์ ํ ๋ ์ ์ฉํ๊ธฐ ๋๋ฌธ)
+๊ทธ๋์ `optimizer.zero_grad()`๋ฅผ ํตํด ์ด๊ธฐํํด ์ฃผ์ง ์์ผ๋ฉด ์ ์ํ์ gradient์ ํ์ฌ์ ๊ฒ์ด ๋์ ๋์ด ์๋ชป๋ ๋ฐฉํฅ์ผ๋ก ํ์ต๋๊ฒ ๋๋ค.
+
+์ ์ฝ๋๋ฅผ ํ ๋ฒ ์คํํ ๊ฒ์ด ํ ๋ฒ ํ์ตํ ๊ฒ๊ณผ ๊ฐ๋ค. ๊ทธ ๊ฒฐ๊ณผ์ ๋ฐ๋ผ weight์ bias์ ๊ฐ์ ์ด ์ด๋ฃจ์ด์ง ๊ฒ์ ๋ณผ ์ ์๋ค.
+
+๊ฐ์ ๋ weight์ bias๋ก ๋ค์ ์์ธก์ ํด ๋ณด๋ฉด, ๋ค์๊ณผ ๊ฐ์ ๊ฐ์ ์ป์ ์ ์๋ค.
+
+{% highlight python %}
+hypothesis = x_train * W + b
+print(hypothesis)
+
+cost = torch.mean((hypothesis - y_train) ** 2)
+print(cost)
+
+''' output
+tensor([[0.1333],
+ [0.2267],
+ [0.3200]], grad_fn=)
+
+tensor(3.6927, grad_fn=)
+'''
+{% endhighlight %}
+
+๊ธฐ์กด์ 0์ด์๋ ๊ฐ๋ค์ด ์ค์ ๊ฐ์ ๊ฐ๊น๊ฒ ๋ณํ๊ณ , cost๋ ์ค์ด๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
+
+***
+## Training with Full Code
+{% highlight python %}
+# ๋ฐ์ดํฐ
+x_train = torch.FloatTensor([[1], [2], [3]])
+y_train = torch.FloatTensor([[1], [2], [3]])
+# ๋ชจ๋ธ ์ด๊ธฐํ
+W = torch.zeros(1, requires_grad=True)
+b = torch.zeros(1, requires_grad=True)
+# optimizer ์ค์
+optimizer = optim.SGD([W, b], lr=0.01)
+
+nb_epochs = 1000
+for epoch in range(nb_epochs + 1):
+
+ # H(x) ๊ณ์ฐ
+ hypothesis = x_train * W + b
+
+ # cost ๊ณ์ฐ
+ cost = torch.mean((hypothesis - y_train) ** 2)
+
+ # cost๋ก H(x) ๊ฐ์
+ optimizer.zero_grad()
+ cost.backward()
+ optimizer.step()
+
+ # 100๋ฒ๋ง๋ค ๋ก๊ทธ ์ถ๋ ฅ
+ if epoch % 100 == 0:
+ print('Epoch {:4d}/{} W: {:.3f}, b: {:.3f} Cost: {:.6f}'.format(
+ epoch, nb_epochs, W.item(), b.item(), cost.item()
+ ))
+
+''' output
+Epoch 0/1000 W: 0.093, b: 0.040 Cost: 4.666667
+Epoch 100/1000 W: 0.873, b: 0.289 Cost: 0.012043
+Epoch 200/1000 W: 0.900, b: 0.227 Cost: 0.007442
+Epoch 300/1000 W: 0.921, b: 0.179 Cost: 0.004598
+Epoch 400/1000 W: 0.938, b: 0.140 Cost: 0.002842
+Epoch 500/1000 W: 0.951, b: 0.110 Cost: 0.001756
+Epoch 600/1000 W: 0.962, b: 0.087 Cost: 0.001085
+Epoch 700/1000 W: 0.970, b: 0.068 Cost: 0.000670
+Epoch 800/1000 W: 0.976, b: 0.054 Cost: 0.000414
+Epoch 900/1000 W: 0.981, b: 0.042 Cost: 0.000256
+Epoch 1000/1000 W: 0.985, b: 0.033 Cost: 0.000158
+'''
+{% endhighlight %}
+
+1000 Epoch ํ์ตํ๋ ์ ์ฒด ์ฝ๋์ด๋ค. ๋ก๊ทธ์์ ์ ์ ์๋ฏ์ด cost๋ ์ ์ ์ค์ด๋ค๊ณ weight์ bias๋ ์ฐ๋ฆฌ๊ฐ ์์ํ๋ ํ๊ท์ ์ ๊ฒ๊ณผ ๋น์ทํด์ก๋ค.
+
+{% highlight python %}
+x_train * W + b
+
+''' output
+tensor([[1.0186],
+ [2.0040],
+ [2.9894]], grad_fn=)
+'''
+{% endhighlight %}
+
+์ค์ ๋ก ํ์ต๋ ๋ชจ๋ธ๋ก ์์ธก์ ํด ๋ณด๋ฉด ์ค์ ๊ฐ๊ณผ ์์ฃผ ๋น์ทํ๊ฒ ๋์จ ๊ฒ์ ํ์ธํ ์ ์๋ค.
\ No newline at end of file
diff --git a/_posts/2022-04-18-dlZeroToAll-PyTorch-3.markdown b/_posts/2022-04-18-dlZeroToAll-PyTorch-3.markdown
new file mode 100644
index 00000000000..7db2293b28f
--- /dev/null
+++ b/_posts/2022-04-18-dlZeroToAll-PyTorch-3.markdown
@@ -0,0 +1,217 @@
+---
+title: "๋ชจ๋๋ฅผ ์ํ ๋ฅ๋ฌ๋ 2 - Lab3: Minimizing Cost"
+author: Kwon
+date: 2022-04-18T14:00:00+0900
+categories: [pytorch, study]
+tags: [linear-regressoin, cost, gradient-descent]
+math: true
+mermaid: false
+---
+
+[๋ชจ๋๋ฅผ ์ํ ๋ฅ๋ฌ๋](https://deeplearningzerotoall.github.io/season2/lec_pytorch.html) Lab 3: Minimizing Cost ๊ฐ์๋ฅผ ๋ณธ ํ ๊ณต๋ถ๋ฅผ ๋ชฉ์ ์ผ๋ก ์์ฑํ ๊ฒ์๋ฌผ์
๋๋ค.
+
+***
+## Theoretical Overview
+์ด๋ฒ์๋ Grdient descent์ ๋ํด ์กฐ๊ธ ๋ ์ง์ค์ ์ผ๋ก ์์๋ณด๊ธฐ ์ํด Hypothesis๋ฅผ ์กฐ๊ธ ๋ ๋จ์ํ๊ฒ $ H(x) = Wx $๋ก ๋ฐ๊พธ์ด ์ดํด๋ณด์.
+
+cost๋ ๋๊ฐ์ด MSE(Mean Square Error)๋ฅผ ์ฌ์ฉํ๊ณ ๋ฐ์ดํฐ๋ ์ด์ ๊ณผ ๊ฐ์ ๊ณต๋ถ ์๊ฐ - ์ฑ์ ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉํ๋ค. ([Lab2 ํฌ์คํ
์ฐธ์กฐ](/posts/dlZeroToAll-PyTorch-2/))
+
+\\[ MSE = cost(W) = \frac{1}{m} \sum^m_{i=1} \left( H(x^{(i)}) - y^{(i)} \right)^2 \\]
+
+***
+
+## Import
+{% highlight python %}
+import matplotlib.pyplot as plt
+import numpy as np
+import torch
+import torch.nn as nn
+import torch.nn.functional as F
+import torch.optim as optim
+{% endhighlight %}
+
+***
+## Cost by W
+W์ ๋ณํ์ ๋ฐ๋ฅธ cost ๊ทธ๋ํ๋ฅผ ๊ทธ๋ ค๋ณด๋ฉด ๋ค์๊ณผ ๊ฐ์ 2์ฐจ ๊ณก์ ์ด ๊ทธ๋ ค์ง๋ค. ๊ทธ๋ฌ๋ฏ๋ก cost๊ฐ ๊ฐ์ฅ ์์ ์ ์ ๊ธฐ์ธ๊ธฐ(๋ฏธ๋ถ๊ฐ)๊ฐ 0์ธ ๊ทน์์ ์ด๋ค.
+
+{% highlight python %}
+W_l = np.linspace(-5, 7, 1000)
+cost_l = []
+for W in W_l:
+ hypothesis = W * x_train
+ cost = torch.mean((hypothesis - y_train) ** 2)
+
+ cost_l.append(cost.item())
+
+plt.plot(W_l, cost_l)
+plt.xlabel('$W$')
+plt.ylabel('Cost')
+plt.show()
+{% endhighlight %}
+
+
+
+***
+## Gradient Descent by Hand
+cost๊ฐ ๊ฐ์ฅ ์์ ์ ์ ์ฐพ๋ ๊ฒ์ด ์ฐ๋ฆฌ์ ๋ชฉํ์ธ๋ฐ, ์ด๊ฒ์ cost์ ๋ฏธ๋ถ๊ฐ์ ์ด์ฉํ๋ ๋ฐฉ์์ผ๋ก ๋ฌ์ฑํ๋ ค๊ณ ํ๋ค.
+
+cost๋ ๋ค์๊ณผ ๊ฐ์ผ๋ฏ๋ก
+
+\\[ MSE = cost(W) = \frac{1}{m} \sum^m_{i=1} \left( H(x^{(i)}) - y^{(i)} \right)^2 \\]
+
+$W$์ ๋ํด ๋ฏธ๋ถํ๋ฉด ์๋์ ๊ฐ์ ๊ฒฐ๊ณผ๋ฅผ ์ป์ ์ ์๋ค.
+
+\\[ \nabla W = \frac{\partial cost}{\partial W} = \frac{2}{m} \sum^m_{i=1} \left( Wx^{(i)} - y^{(i)} \right)x^{(i)} \\]
+
+์ด๋ ๊ฒ ๊ตฌํ gradient๋ ๋ค์ ์๊ณผ ๊ฐ์ด ํ์ต์ ์ ์ฉํ๊ฒ ๋๋ค.
+
+\\[ W := W - \alpha \nabla W \,\,\left(\alpha = learning\,\,rate\right)\\]
+
+์ด๋ฐ ํํ๋ก ํ์ต์ ํ๋ ์ด์ ๋ฅผ ํ๋ฒ ์์๋ณด์.
+
+์๋์ ๋ gif๋ ๊ฐ๊ฐ ๊ทน์์ ์ ์ข์ฐ์์ ๊ทน์์ ์ ์ ๊ทผํ ๋ ์ ์ ์ ๋ณํ๋ฅผ ๋ํ๋ธ ๊ฒ์ด๋ค.
+
+
+
+๋จผ์ ์ผ์ชฝ์์ ์ ๊ทผํ๋ ๊ฒฝ์ฐ ๊ธฐ์ธ๊ธฐ(gradient)๊ฐ ์์์ด๊ณ ๊ทน์์ ์ผ๋ก ๋๋ฌํ๊ธฐ ์ํด์๋ $W$๊ฐ ์ปค์ ธ์ผ ํ๋ค. ๊ทธ๋ฌ๋ฏ๋ก ์์์ธ ๊ธฐ์ธ๊ธฐ๋ฅผ ๋นผ์ฃผ์ด ๊ทน์์ ์ ๊ฐ๊น๊ฒ ๋๋ฌํ ์ ์๋ค.
+
+
+
+๋ค์์ผ๋ก ์ค๋ฅธ์ชฝ์์ ์ ๊ทผํ๋ ๊ฒฝ์ฐ ๊ธฐ์ธ๊ธฐ๊ฐ ์์์ด๊ณ ๊ทน์์ ์ผ๋ก ๋๋ฌํ๊ธฐ ์ํด์๋ $W$๊ฐ ์์์ ธ์ผ ํ๋ค. ์ด ๋๋ ์์์ธ ๊ธฐ์ธ๊ธฐ๋ฅผ ๋นผ์ฃผ์ด ๊ทน์์ ์ ๊ฐ๊น๊ฒ ๋๋ฌํ ์ ์๋ค.
+
+๊ฒฐ๊ตญ ์ด ๋๋ค ๋นผ์ผํ๋ฏ๋ก ๋ชจ๋ ๋ง์กฑํ๋ ์์ด $ W := W - \alpha \nabla W $, ๊ธฐ์ธ๊ธฐ์ ๋บ์
์ผ๋ก ์ฃผ์ด์ง๋ ๊ฒ์ด๋ค. ์ด ๋ $learning\,\,rate$์ธ $\alpha$๋ ๋ง ๊ทธ๋๋ก ํ์ต๋ฅ (ํ ๋ฒ์ ํ์ต์ ์ผ๋ง๋ ํ ๊ฒ์ธ๊ฐ)์ ๋ํ๋ด๋ ๊ฒ์ด๋ฏ๋ก ์ํฉ์ ๋ง๊ฒ ์ต์ ํ ํ์ฌ ์ฌ์ฉํ๋ค.
+
+๋ค๋ง, ํ์ต๋ฅ ์ด ๋๋ฌด ์์ผ๋ฉด ์๋ ด์ด ๋ฆ์ด์ง๊ณ , ๋๋ฌด ํฌ๋ฉด ์ง๋ํ๋ฉด ๋ฐ์ฐํด ๋ฒ๋ฆฌ๊ธฐ ๋๋ฌธ์ ์ ์ ํ ๋ฒ์์ ๊ฐ์ ์ฌ์ฉํด์ผ ํ๋ค.
+
+
+
+์ด์ด์ ์์ ์๋ค์ ์ฝ๋๋ก ํํํ๋ฉด ๋ค์๊ณผ ๊ฐ๋ค.
+
+\\[ \nabla W = \frac{\partial cost}{\partial W} = \frac{2}{m} \sum^m_{i=1} \left( Wx^{(i)} - y^{(i)} \right)x^{(i)} \\]
+
+{% highlight python %}
+gradient = torch.sum((W * x_train - y_train) * x_train)
+print(gradient)
+
+''' output
+tensor(-14.)
+'''
+{% endhighlight %}
+
+\\[ W := W - \alpha \nabla W \,\,\left(\alpha = learning\,\,rate\right)\\]
+
+{% highlight python %}
+lr = 0.1
+W -= lr * gradient
+print(W)
+
+''' output
+tensor(1.4000)
+'''
+{% endhighlight %}
+
+***
+## Training
+์์ ๊ตฌํํ๋ ๊ฒ๋ค์ ํ์ฉํ์ฌ ์ค์ ๋ก ํ์ตํ๋ ์ฝ๋๋ฅผ ์์ฑํด ๋ณด๋ฉด ๋ค์๊ณผ ๊ฐ๋ค.
+
+{% highlight python %}
+# ๋ฐ์ดํฐ
+x_train = torch.FloatTensor([[1], [2], [3]])
+y_train = torch.FloatTensor([[1], [2], [3]])
+# ๋ชจ๋ธ ์ด๊ธฐํ
+W = torch.zeros(1)
+# learning rate ์ค์
+lr = 0.1
+
+nb_epochs = 10
+for epoch in range(nb_epochs + 1):
+
+ # H(x) ๊ณ์ฐ
+ hypothesis = x_train * W
+
+ # cost gradient ๊ณ์ฐ
+ cost = torch.mean((hypothesis - y_train) ** 2)
+ gradient = torch.sum((W * x_train - y_train) * x_train)
+
+ print('Epoch {:4d}/{} W: {:.3f}, Cost: {:.6f}'.format(
+ epoch, nb_epochs, W.item(), cost.item()
+ ))
+
+ # gradient๋ก H(x) ๊ฐ์
+ W -= lr * gradient
+
+''' output
+Epoch 0/10 W: 0.000, Cost: 4.666667
+Epoch 1/10 W: 1.400, Cost: 0.746666
+Epoch 2/10 W: 0.840, Cost: 0.119467
+Epoch 3/10 W: 1.064, Cost: 0.019115
+Epoch 4/10 W: 0.974, Cost: 0.003058
+Epoch 5/10 W: 1.010, Cost: 0.000489
+Epoch 6/10 W: 0.996, Cost: 0.000078
+Epoch 7/10 W: 1.002, Cost: 0.000013
+Epoch 8/10 W: 0.999, Cost: 0.000002
+Epoch 9/10 W: 1.000, Cost: 0.000000
+Epoch 10/10 W: 1.000, Cost: 0.000000
+'''
+{% endhighlight %}
+
+**Hypothesis output ๊ณ์ฐ -> cost์ gradient ๊ณ์ฐ -> gradient๋ก hypothesis(weight) ๊ฐ์ **
+
+์์ ๊ฐ์ ์์๋ก ์ด 10 epoch ํ์ตํ๋ ์ฝ๋์ด๋ค. ํ์ต์ ํ๋ฒ ํ ๋๋ง๋ค cost๊ฐ ์ค์ด๋ค๊ณ , ์ฐ๋ฆฌ๊ฐ ์๊ฐํ ์ด์์ ์ธ $W$์ธ 1์ ์ ์ ๊ฐ๊น์์ง๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
+
+***
+## Training with `optim`
+
+**Training**์์ ํ๋ ๊ฒ์ฒ๋ผ ์ฐ๋ฆฌ๊ฐ gradient๋ฅผ ๊ณ์ฐํ๋ ์ฝ๋๋ฅผ ์ง์ ์์ฑํ์ฌ ์ฌ์ฉํ ์๋ ์์ง๋ง PyTorch์์ ์ ๊ณตํ๋ `optim`์ ์ด์ฉํ์ฌ ๊ฐ๋จํ๊ฒ ๊ตฌํํ ์๋ ์๋ค.
+
+{% highlight python %}
+# ๋ฐ์ดํฐ
+x_train = torch.FloatTensor([[1], [2], [3]])
+y_train = torch.FloatTensor([[1], [2], [3]])
+# ๋ชจ๋ธ ์ด๊ธฐํ
+W = torch.zeros(1, requires_grad=True)
+# optimizer ์ค์
+optimizer = optim.SGD([W], lr=0.15)
+
+nb_epochs = 10
+for epoch in range(nb_epochs + 1):
+
+ # H(x) ๊ณ์ฐ
+ hypothesis = x_train * W
+
+ # cost ๊ณ์ฐ
+ cost = torch.mean((hypothesis - y_train) ** 2)
+
+ print('Epoch {:4d}/{} W: {:.3f} Cost: {:.6f}'.format(
+ epoch, nb_epochs, W.item(), cost.item()
+ ))
+
+ # cost๋ก H(x) ๊ฐ์
+ optimizer.zero_grad()
+ cost.backward()
+ optimizer.step()
+
+''' output
+Epoch 0/10 W: 0.000 Cost: 4.666667
+Epoch 1/10 W: 1.400 Cost: 0.746667
+Epoch 2/10 W: 0.840 Cost: 0.119467
+Epoch 3/10 W: 1.064 Cost: 0.019115
+Epoch 4/10 W: 0.974 Cost: 0.003058
+Epoch 5/10 W: 1.010 Cost: 0.000489
+Epoch 6/10 W: 0.996 Cost: 0.000078
+Epoch 7/10 W: 1.002 Cost: 0.000013
+Epoch 8/10 W: 0.999 Cost: 0.000002
+Epoch 9/10 W: 1.000 Cost: 0.000000
+Epoch 10/10 W: 1.000 Cost: 0.000000
+'''
+{% endhighlight %}
+
+`optim.SGD`๊ฐ ์ฐ๋ฆฌ๊ฐ ๋ง๋ค์ด์ ๊ตฌํํ๋ gradient์ ๋ํ ์ฒ๋ฆฌ๋ฅผ ํด์ฃผ๊ณ ์๋ ๊ฒ์ ๋ณผ ์ ์๋ค.
+{% highlight python %}
+optimizer.zero_grad() # gradient ์ด๊ธฐํ
+cost.backward() # gradient ๊ณ์ฐ
+optimizer.step() # ๊ณ์ฐ๋ gradient๋ฅผ ๋ฐ๋ผ W, b๋ฅผ ๊ฐ์
+{% endhighlight %}
+์ ๋ฒ ๊ฐ์์์๋ ๋ฑ์ฅํ๋ ์ 3๊ฐ์ ๋ฌถ์ ์ฝ๋๋ฅผ ํตํด gradient์ ๋ํ ๊ณ์ฐ๊ณผ ๊ทธ์ ๋ฐ๋ฅธ ํ์ต์ด ์ด๋ฃจ์ด์ง๊ณ ์๋ค.
+
+์ด ๋๋ ๋ง์ฐฌ๊ฐ์ง๋ก $W$์ cost๋ฅผ ๋ณด๋ฉด ์ ํ์ต์ด ๋๋ ๊ฒ์ ๋ณผ ์ ์๋ค.
\ No newline at end of file
diff --git a/_posts/2022-04-26-entropy.markdown b/_posts/2022-04-26-entropy.markdown
new file mode 100644
index 00000000000..ccafd71aa54
--- /dev/null
+++ b/_posts/2022-04-26-entropy.markdown
@@ -0,0 +1,60 @@
+---
+title: "Entropy(์ํธ๋กํผ)๋?"
+author: Kwon
+date: 2022-04-26T14:40:00+0900
+categories: [background]
+tags: [entropy]
+math: true
+mermaid: false
+---
+
+### Related Post
+
+1. **Entropy**
+2. [KL Divergence](/posts/KL-divergence/)
+3. [Cross Entropy](/posts/cross-entropy/)
+
+***
+์คํ ์ธ์ฝ๋์ ๋ํ ๊ณต๋ถ๋ฅผ ํ๋ค๊ฐ entropy, cross entropy, KL divergence ๋ฑ ๋ชจ๋ฅด๋ ์ฉ์ด๋ค์ด ์์ด์ ๋ ์ด์ ๋ฏธ๋ฃจ์ง ์๊ณ ๊ณต๋ถ๋ฅผ ํด ๋ณด๊ธฐ๋ก ํ๋ค.
+
+***
+## Entropy
+
+์ํธ๋กํผ์ ์ ์๋ ์ผ๋ฐ์ ์ธ ์ฉ์ด๋, ๊ณผํ ์ฉ์ด๋ ๋ฑ์ ๋ฐ๋ผ ๋ฌ๋ผ์ง ์ ์์ง๋ง ์ด๋ฒ์ ๋ค๋ค ๋ณผ ์ํธ๋กํผ๋ ์ ๋ณด ์ํธ๋กํผ์ด๋ค.
+
+์ ๋ณด์ด๋ก ์์์ ์ํธ๋กํผ๋ ๊ฐ ์ ๋ณด์ ํฌํจ๋ ๊ธฐ๋๊ฐ(ํ๊ท ์ ๋ณด๋), ์ ๋ณด์ ๋ถํ์ค๋๋ฑ์ผ๋ก ์ค๋ช
ํ ์ ์์ง๋ง ๋ด๊ฐ ์ฌ๋ฌ ์๋ฃ๋ค์ ์ฐพ์๋ณด๋ฉด์ ๋จธ์ ๋ฌ๋์ ๊ด์ ์์ ๊ฐ์ฅ ์๋ฟ์๋ ์๋ฏธ๋ **์์ธกํ๊ธฐ ์ด๋ ค์ด ์ ๋**์๋ค.
+
+๊ทธ๋ผ ์ํธ๋กํผ๊ฐ ๋ฌด์์ด๊ธธ๋ ์ด๋ ๊ฒ ๋ค์ํ ์๋ฏธ๋ก ํด์๋ ์ ์๋์ง, ๊ทธ๋ฆฌ๊ณ ๋ด๊ฐ ์ **์์ธกํ๊ธฐ ์ด๋ ค์ด ์ ๋**๋ฅผ ๊ฐ์ฅ ์๋ฟ๊ฒ ๋๋ ๊ฒ์ธ์ง ํ๋ฒ ์์๋ณด์.
+
+๋จผ์ ์ ๋ณด๋์ด๋ผ๋ ๊ฒ์ ์์์ผ ํ๋ค. ์ ๋ณด๋์ ์ ๋ณด๋ฅผ ์ ๋ํ ํ ๊ฒ์ผ๋ก ๊ทธ ์ ๋ณด์ ๋ํ ๊ฐ์น๋ฅผ ๋ํ๋ธ๋ค๊ณ ๋ณผ ์ ์๋ค.
+
+์๋ฅผ ๋ค์ด ์ฌ๊ธฐ ๋๊ฐ์ง์ ์ ๋ณด๊ฐ ์๋ค.
+
+> ๋ค์ด์๋ชฌ๋๋ ๋ฑ๋ฑํ๋ค.
+
+> ๋ค์ด์๋ชฌ๋๊ฐ ๊ฐ์ฅ ๋ง์ด ๋ฌปํ ์๋ ๊ด์ฐ์ ๋ฌ์์์ ์๋ค.
+
+์ ๋ ์ ๋ณด ์ค ์ด๋ ๊ฒ์ด ๋ ๊ฐ์น๊ฐ ๋์ ์ ๋ณด์ผ๊น ํ๋ฒ ์๊ฐํด๋ณด์. ๋ค์ด์๋ชฌ๋๊ฐ ๋ฑ๋ฑํ๋ค๋ ๊ฒ์ ๋๋ถ๋ถ์ ์ฌ๋์ด ์๊ณ ์๋ ์ฌ์ค์ด๋ฏ๋ก ์ ๋ณด๋ก์์ ๊ฐ์น๊ฐ ๋ฎ๋ค๊ณ ํ ์ ์๋ค. ํ์ง๋ง ๋ค์ด์๋ชฌ๋๊ฐ ๊ฐ์ฅ ๋ง์ด ๋ฌปํ ์๋ ๊ด์ฐ์ด ์ด๋์ ์๋์ง๋ ๋๋ถ๋ถ์ ์ฌ๋์ด ์๋ ์ ๋ณด๊ฐ ์๋๋ฏ๋ก ์๋์ ์ผ๋ก ๊ฐ์น๊ฐ ๋๋ค๊ณ ํ ์ ์๋ค.
+
+์ฆ, **์ ๋ณด๋**์
+* ๋น์ฐํ ์ฌ์ค์ผ์๋ก ๋ฎ๋ค.
+* ๊ทธ ์ ๋ณด๊ฐ ๋ถํ์คํ ์๋ก ๋๋ค.
+* ์์ ํ ์์ธก ๊ฐ๋ฅํ๋ฉด ๊ฐ์น๊ฐ ์๋ค.
+
+๊ฒฐ๊ตญ, ๋ฐ์ ํ๋ฅ ์ด ์ ์์๋ก ์ ๋ณด์ ๊ฐ์น๋ ์ฌ๋ผ๊ฐ๊ฒ ๋๋ค. ๊ทธ๋ฌ๋ฏ๋ก ์ ๋ณด๋์ ์ ์ํ ๋์๋ ํ๋ฅ ๊ณผ ๋ฐ๋น๋ก์ ๊ด๊ณ๋ฅผ ๊ฐ์ง๋๋ก ํ๋ ๊ฒ์ด ์ข์ ๊ฒ์ด๋ค.
+์ด๋ฌํ ์ด์ ๋ก ์ ๋ณด๋์ ๋ค์๊ณผ ๊ฐ์ด ์ ์๋๋ค.
+
+\\[ I\left(x\right) = -\log_b{ P\left( x\right ) } \\]
+
+์ด๋ค ์ฌ๊ฑด์ด ์ผ์ด๋ ํ๋ฅ ์ ์ญ์์ ๋ก๊ทธ๋ฅผ ์ทจํ ํํ์ด๋ค. ์ฌ๊ธฐ์ ๋ก๊ทธ๋ฅผ ์ทจํ ์ด์ ๋ ๋ ์ฌ๊ฑด์ ์ ๋ณด๋์ ํฉ์น ๊ฒ์ด ๊ฐ ์ฌ๊ฑด์ ์ ๋ณด๋์ ๋ํ ๊ฒ๊ณผ ๊ฐ์์ผ ํ๊ธฐ ๋๋ฌธ์ด๋ค (๋ก๊ทธ๋ ๊ณฑ์ ํฉ์ผ๋ก ๋ฐ๊ฟ ์ ์๋ค).
+์ด ๋ ๋ฐ $b$๋ ์ฌ์ฉ์ฒ์ ๋ฐ๋ผ 2, 10, $e$๋ฅผ ๋ง์ด ์ฌ์ฉํ๋ค.
+
+์ ๋ณด๋๊น์ง ์ ์๋ฅผ ํ์ผ๋ ์ํธ๋กํผ๋ฅผ ์ ์ํ ์ฐจ๋ก์ด๋ค. ์์ ์ํธ๋กํผ๋ ์ ๋ณด๋์ ๊ธฐ๋๊ฐ์ด๋ผ๊ณ ํ์๋ค. ์ฆ ๊ฐ ์ฌ๊ฑด์ ๋ํ ํ๋ฅ ๊ณผ ์ ๋ณด๋์ ๊ณฑ์ ๋ชจ๋ ํฉํ ๊ฒ์ผ๋ก ์ ์ํ ์ ์๋ค.
+
+\\[ H\left(x\right) = E\left( I\left ( x\right ) \right) = -\sum^n_{i=1} p\left( x_i \right) \log_b{ p\left( x_i\right ) } \\]
+
+์ํธ๋กํผ๋ ์ ๋ณด๋์ด ํด์๋ก ์ปค์ง๋ ์ฑ์ง์ ๊ฐ์ง๋ค. ๋ค๋ฅธ ์ ๋ณด์ด๋ก ์์๋ ๋ชจ๋ฅด๊ฒ ์ง๋ง ๋จธ์ ๋ฌ๋ ๋ถ์ผ์์๋ ์์ธก์ ํ๋ ๊ฒ์ด ๋ชฉ์ ์ด๋ฏ๋ก ์์ธก์ ๋ง์ถฐ ๋ค์ ๋ง์ ์ ๋ฆฌํ๋ฉด, **์์ธก์ด ํ๋ค์๋ก ๋ ํฌ๋ค**๋ ๊ฒ์ด ๋๋ค.
+
+์ด๊ฒ์ด ์์ **์์ธกํ๊ธฐ ์ด๋ ค์ด ์ ๋**๊ฐ ๊ฐ์ฅ ์๋ฟ์๋ค๊ณ ํ๋ ์ด์ ์๋ค.
+
+๋ค์ ํฌ์คํ
์์๋ ์ด ์ํธ๋กํผ๋ฅผ ์ด์ฉํ ๋ํ์ ์ธ loss์ธ cross entropy๋ฅผ ์์๋ณด๊ธฐ ์ํด KL divergence์ ๋ํด ๋จผ์ ์์๋ณด๋ ค ํ๋ค.
diff --git a/_posts/2022-04-27-KL-divergence.markdown b/_posts/2022-04-27-KL-divergence.markdown
new file mode 100644
index 00000000000..bd784438480
--- /dev/null
+++ b/_posts/2022-04-27-KL-divergence.markdown
@@ -0,0 +1,58 @@
+---
+title: "KL divergence(์ฟจ๋ฐฑ-๋ผ์ด๋ธ๋ฌ ๋ฐ์ฐ)"
+author: Kwon
+date: 2022-04-27T00:00:00+0900
+categories: [background]
+tags: [entropy, kl-divergence]
+math: true
+mermaid: false
+---
+
+### Related Post
+
+1. [Entropy](/posts/entropy/)
+2. **KL Divergence**
+3. [Cross Entropy](/posts/cross-entropy/)
+
+***
+
+์ด๋ฒ์๋ ์ํธ๋กํผ์ ์ด์ด ์ฟจ๋ฐฑ-๋ผ์ด๋ธ๋ฌ ๋ฐ์ฐ(Kullback-Leibler divergence)์ ๋ํด ์์๋ณด๋ ค ํ๋ค.
+
+***
+## Kullback-Leibler divergence, KLD
+
+์ฟจ๋ฐฑ-๋ผ์ด๋ธ๋ฌ ๋ฐ์ฐ์ ์ด๋ค ๋ ํ๋ฅ ๋ถํฌ์ ์ฐจ์ด๋ฅผ ๊ณ์ฐํ๊ธฐ ์ํ ํจ์๋ก, ๋ ํ๋ฅ ๋ถํฌ์ [์ ๋ณด ์ํธ๋กํผ](/posts/entropy/)์ ์ฐจ์ด๋ฅผ ๊ณ์ฐํ๋ค.
+
+์๋ฏธ์ ์ผ๋ก๋ ํ๋ฅ ๋ถํฌ $P$๊ฐ ์์ ๋ ๊ทธ ๋ถํฌ๋ฅผ ๊ทผ์ฌ์ ์ผ๋ก ํํํ๋ $Q$๋ฅผ $P$ ๋์ ์ด์ฉํ์ฌ ์ํ๋ง ํ ๊ฒฝ์ฐ ์ํธ๋กํผ์ ๋ณํ๋ฅผ ์๋ฏธํ๋ค.
+
+์๊ฐ์ ์ผ๋ก๋ ํ๋ฒ ํ์ธํด ๋ณด์.
+์ฌ๊ธฐ ํ๋ฅ ๋ถํฌ $P$(ํ๋์)์ $Q$(์ด๋ก์)๊ฐ ์๋ค. ๊ทธ๋ฆฌ๊ณ ๋ ํ๋ฅ ๋ถํฌ์ ๋ํ ์ํธ๋กํผ ์ฐจ์ด๋ฅผ ๊ณ์ฐํ์ฌ ํํํ ๊ณก์ (๋นจ๊ฐ์)์ ๋ณผ ์ ์๋ค.
+
+
+
+๊ทธ๋ํ์์ ํ์ธํ ์ ์๋ฏ์ด (๋น์ฐํ๊ฒ๋) ๋ถํฌ๊ฐ์ ์ฐจ์ด๊ฐ ํฐ ๊ณณ์์๋ ์ํธ๋กํผ์ ์ฐจ์ด๊ฐ ํฌ๊ณ ์ฐจ์ด๊ฐ ์ ์ ๊ณณ์์๋ ์ค์ด๋ ๋ค. ์ฌ์ง์ด ๋ ํ๋ฅ ๋ถํฌ์ ๊ต์ (์ ์ )์์๋ ๊ฐ์ด ๊ฐ๊ธฐ ๋๋ฌธ์ ์ํธ๋กํผ์ ์ฐจ์ด๋ 0์ด ๋๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
+
+์ด์ ์์์ผ๋ก๋ ํ๋ฒ ํํํด ๋ณด์.
+$P$์ ์ํธ๋กํผ๋ ๋ค์๊ณผ ๊ฐ๊ณ
+
+\\[ H\left( P \right)= -\sum^n_{i=1} p\left( x_i \right) \log{ p\left( x_i\right ) } \\]
+
+$P$๋์ $Q$๋ฅผ ์ฌ์ฉํ์ฌ ์ํ๋งํ ๊ฒฝ์ฐ ์ํธ๋กํผ๋ ๋ค์๊ณผ ๊ฐ์ด ์ ์๋๋ค. ($Q$์ ์ ๋ณด๋์ ๋ํ ๊ธฐ๋๊ฐ)
+
+\\[ H\left( P, Q \right)= -\sum^n_{i=1} p\left( x_i \right) \log{ q\left( x_i\right ) } \\]
+
+์ฟจ๋ฐฑ-๋ผ์ด๋ธ๋ฌ๋ ์ด๋ค์ ์ฐจ์ด๋ผ๊ณ ํ์ผ๋ฏ๋ก ๋ค์๊ณผ ๊ฐ์ด ์ ์ํ ์ ์๋ค.
+
+$ KL\left( P\|\|Q \right) = H\left( P, Q \right) - H\left( P \right) $
+$ = \left( -\sum^n_{i=1} p\left( x_i \right) \log{ q\left( x_i\right ) } \right) - \left( -\sum^n_{i=1} p\left( x_i \right) \log{ p\left( x_i\right ) } \right) $
+\\[ = -\sum^n_{i=1} p\left( x_i \right) \log{ \frac{ q\left( x_i\right )}{ p\left( x_i\right ) } } \\]
+
+์ด๋ ์ด์ฐํ๋ฅ ๋ถํฌ์ ์ฟจ๋ฐฑ-๋ผ์ด๋ธ๋ฌ ๋ฐ์ฐ์ ์์์ ํํํ ๊ฒ๊ณผ ๊ฐ์ด ์ด ํฉ์ผ๋ก ๋ํ๋ผ ์ ์์ผ๋ฉฐ ๋ค์๊ณผ ๊ฐ๊ณ
+
+\\[ KL\left( P\|\|Q \right) = \sum_i P\left( i \right) \log{ \frac{ P\left( i \right )}{ Q\left( i \right ) } } \\]
+
+์ฐ์ํ๋ฅ ๋ถํฌ์ ์ฟจ๋ฐฑ-๋ผ์ด๋ธ๋ฌ ๋ฐ์ฐ์ ์ ๋ถ ๊ฐ์ผ๋ก ์ฃผ์ด์ง๋ค. (์ด๋ $p, q$๋ ๊ฐ ํ๋ฅ ๋ถํฌ์ ํ๋ฅ ๋ฐ๋ ํจ์์ด๋ค.)
+
+\\[ KL\left( P\|\|Q \right) = \int^\infty_{-\infty} p\left( x \right) \log{ \frac{ p\left( x \right )}{ q\left( x \right ) } }dx \\]
+
+์ํธ๋กํผ์ ์ฟจ๋ฐฑ๋ผ์ด๋ธ๋ฌ ๋ฐ์ฐ์ ์์๋ดค์ผ๋ ์ด์ด์ ๋ค์ ํฌ์คํ
์ cross entropy ๋ด์ฉ์ ๋ํด ์์๋ณด๋๋ก ํ๊ฒ ๋ค.
\ No newline at end of file
diff --git a/_posts/2022-04-28-cross-entropy.markdown b/_posts/2022-04-28-cross-entropy.markdown
new file mode 100644
index 00000000000..523948d08e1
--- /dev/null
+++ b/_posts/2022-04-28-cross-entropy.markdown
@@ -0,0 +1,40 @@
+---
+title: "Cross Entropy(๊ต์ฐจ ์ํธ๋กํผ)"
+author: Kwon
+date: 2022-04-28T00:10:00+0900
+categories: [background, loss]
+tags: [entropy, kl-divergence, cross-entropy]
+math: true
+mermaid: false
+---
+
+### Related Post
+
+1. [Entropy](/posts/entropy/)
+2. [KL Divergence](/posts/KL-divergence/)
+3. **Cross Entropy**
+
+***
+## Cross Entropy
+
+๊ต์ฐจ ์ํธ๋กํผ์ ์๋ฏธ๋ ์ด๋ฆ์์ ์ฐพ์๋ณผ ์ ์๋ค. ๋จผ์ ๊ต์ฐจ ์ํธ๋กํผ์ ์์ ํ๋ฒ ๋ณด์.
+
+\\[ H\left( P, Q \right) = -\sum^n_{i=1} p\left( x_i \right) \log{ q\left( x_i\right ) } \\]
+
+์ํธ๋กํผ ์์ $P$์ $Q$์ ๋ฐ๋ํจ์๋ค์ด **๊ต์ฐจ**ํด์ ๋ค์ด๊ฐ ์๋ค. ๊ทธ๋ฐ ์๋ฏธ์์ ๊ต์ฐจ ์ํธ๋กํผ๋ผ๋ ์ด๋ฆ์ด ๋ถ์ ๊ฒ์ด๋ค.
+
+์ด ์์ ์๋ฏธ๋ [KL divergence ํฌ์คํ
](/posts/KL-divergence/)์์ ํ์ธํ ์ ์๋ฏ์ด ํ๋ฅ ๋ถํฌ $P$๋ฅผ ๊ทผ์ฌํ๋ $Q$๋ฅผ $P$ ๋์ ์ฌ์ฉํ์ฌ ์ํ๋งํ์ ๋์ ์ํธ๋กํผ๋ฅผ ๋งํ๋ค.
+
+๊ทธ๋ฐ๋ฐ ์ด๋ป๊ฒ ์ด๋ฐ ์๋ฏธ๋ฅผ ๊ฐ์ง๋ ๊ต์ฐจ ์ํธ๋กํผ๊ฐ ๊ทธ ์์ฒด๋ก loss์ ์ญํ ์ ํ ์ ์๋ ๊ฑธ๊น? ์ค์ ๋ก loss๋ฅผ ๊ตฌํ๊ธฐ ์ํด์๋ ์๋ ๋ถํฌ์ ์ํธ๋กํผ์์ ์ฐจ์ด๋ฅผ ๊ตฌํด์ผ ํ ๊ฒ์ด๋ค. ์ด๋ ์ฟจ๋ฐฑ-๋ผ์ด๋ธ๋ฌ ๋ฐ์ฐ์ ์๋ฏธ์ ๋์ผํ๋ค.
+์ฟจ๋ฐฑ-๋ผ์ด๋ธ๋ฌ ๋ฐ์ฐ์ ์์ ๋ค์๊ณผ ๊ฐ์๋ค.
+
+\\[ KL\left( P\|\|Q \right) = H\left( P, Q \right) - H\left( P \right) \\]
+
+๋ถ๋ช
๊ต์ฐจ ์ํธ๋กํผ ๋ง๊ณ ๋ ์๋ ํ๋ฅ ๋ถํฌ์ ์ํธ๋กํผ์ธ $ H\left( P \right) $ ํญ์ด ์กด์ฌํ๋ค. ํ์ง๋ง ์ฐ๋ฆฌ๊ฐ loss๋ฅผ ์ฌ์ฉํ๊ฒ ๋๋ ์ค์ classification problem์ ๋ํด์ ํ๋ฒ ์๊ฐํด ๋ณด์.
+
+classification problem์์ ์ฐ๋ฆฌ๋ ํ data์ ๋ํด ์ ๋ต์ด ์ฃผ์ด์ ธ ์๋ค๊ณ ๊ฐ์ ํ๋ค. ์ด ๋ง์ **์ด๋ฏธ ์ ํด์ ธ ์๋ ์ ๋ต์ ์ํ๋ ๊ฒ์ด ๋ถํ์คํ์ง ์๋ค**๋ ๋ง์ด๊ธฐ ๋๋ฌธ์ $P = 1$์ด๊ณ ๊ทธ์ ๋ฐ๋ผ $ H\left( P \right) = 0$์ด๋ค.
+๊ทธ๋ฌ๋ฏ๋ก $ H\left( P \right) $ ํญ์ ๋ฌด์ํ๊ณ ๋ค์๊ณผ ๊ฐ์ด ์ ์ ์ ์๋ค.
+
+\\[ KL\left( P\|\|Q \right) = H\left( P, Q \right) = -\sum^n_{i=1} p\left( x_i \right) \log{ q\left( x_i\right ) } \\]
+
+์ด๋ฐ ์ด์ ๋๋ฌธ์ ๊ต์ฐจ ์ํธ๋กํผ ์์ฒด๊ฐ loss๋ก ๊ธฐ๋ฅํ ์ ์๋ ๊ฒ์ด๋ค.
\ No newline at end of file
diff --git a/_posts/2022-04-29-dlZeroToAll-PyTorch-4_1.markdown b/_posts/2022-04-29-dlZeroToAll-PyTorch-4_1.markdown
new file mode 100644
index 00000000000..c4fed6ec508
--- /dev/null
+++ b/_posts/2022-04-29-dlZeroToAll-PyTorch-4_1.markdown
@@ -0,0 +1,274 @@
+---
+title: "๋ชจ๋๋ฅผ ์ํ ๋ฅ๋ฌ๋ 2 - Lab4_1: Multivariate Linear Regression"
+author: Kwon
+date: 2022-04-29T14:00:00+0900
+categories: [pytorch, study]
+tags: [multivariate-linear-regressoin]
+math: true
+mermaid: false
+---
+[๋ชจ๋๋ฅผ ์ํ ๋ฅ๋ฌ๋](https://deeplearningzerotoall.github.io/season2/lec_pytorch.html) Lab 4_1: Multivariate Linear Regression ๊ฐ์๋ฅผ ๋ณธ ํ ๊ณต๋ถ๋ฅผ ๋ชฉ์ ์ผ๋ก ์์ฑํ ๊ฒ์๋ฌผ์
๋๋ค.
+
+***
+## Theoretical Overview
+์ด์ ํฌ์คํ
๊น์ง์ regression์ ํ๋์ ๋ณ์๋ฅผ ํตํด ์์ธก์ ํ๋ ๊ฒ์ด์๋ค. ํ์ง๋ง ์ง๊ด์ ์ผ๋ก ์๊ฐํด ๋ณด๋๋ผ๋ ์ฌ๋ฌ ๋ณ์๋ฅผ ๊ฐ์ง๊ณ ๋ ๋ง์ ์ ๋ณด๋ฅผ ํตํด ์์ธกํ๋ฉด ๋ ์ข์ ๊ฒฐ๊ณผ๊ฐ ๋์ฌ ๊ฒ ๊ฐ๋ค.
+**Multivariate Linear Regression**์ ์ด์ฒ๋ผ ์ฌ๋ฌ ๋ณ์๋ฅผ input์ผ๋ก ์ฌ์ฉํ์ฌ ์์ธกํ๋ ๊ฒ์ ๋งํ๋ค.
+
+Hypothesis์ Cost๋ ์์์ ์ฌ์ฉํ๋ ๊ฒ๋ค์ ์ฌ์ฉํ๋ ๋ณ์๊ฐ ๋์ด๋ ๊ฒ์ ๋ง์ถฐ ์์ ํด์ผ ํ๋ค. ์์ ํด์ ๋์จ hypothesis์ cost๋ ๋ค์๊ณผ ๊ฐ๋ค.
+
+\\[ H(x_1, x_2, x_3) = x_1w_1 + x_2w_2 + x_3w_3 + b \\]
+\\[ cost(W, b) = \frac{1}{m} \sum^m_{i=1} \left( H(x^{(i)}) - y^{(i)} \right)^2 \\]
+
+๋ณ์์ ์์ ๋ฐ๋ผ hypothesis๊ฐ ๋ณํ ๊ฒ์ ํ์ธํ ์ ์๋ค. ์ด๋ ๊ฐ๊ฐ์ ๋ณ์์ ๋ํด $W$๊ฐ ๋ฐ๋ก ์ฃผ์ด์ง๋ค.
+
+***
+## Import
+{% highlight python %}
+import torch
+import torch.nn as nn
+import torch.nn.functional as F
+import torch.optim as optim
+{% endhighlight %}
+
+***
+## Data and Hypothesis
+### Data
+๋ฐ์ดํฐ๋ ๋ค์๊ณผ ๊ฐ์ด 3๊ฐ์ ํด์ฆ ์ ์(x)์ ์ต์ข
์ํ ์ ์(y)๋ฅผ ํฌํจํ๋ ์
์ ์ฌ์ฉํ ๊ฒ์ด๋ค.
+
+| Quiz 1 (x1) | Quiz 2 (x2) | Quiz 3 (x3) | Final (y) |
+|:-----------:|:-----------:|:-----------:|:---------:|
+| 73 | 80 | 75 | 152 |
+| 93 | 88 | 93 | 185 |
+| 89 | 91 | 80 | 180 |
+| 96 | 98 | 100 | 196 |
+| 73 | 66 | 70 | 142 |
+{:.inner-borders}
+
+{% highlight python %}
+x1_train = torch.FloatTnsor([[73], [93], [89], [96], [73]])
+x2_train = torch.FloatTensor([[80], [88], [91], [98], [66]])
+x3_train = torch.FloatTensor([[75], [93], [90], [100], [70]])
+
+y_train = torch.FloatTensor([[152], [185], [180], [196], [142]])
+{% endhighlight %}
+
+### Hypothesis Function
+์ ๋ฐ์ดํฐ์ ๋ํด hypothesis๋ฅผ ์ฝ๋๋ก ํํํ๋ฉด ๋ค์๊ณผ ๊ฐ์ด ํํํ ์ ์๋ค.
+
+{% highlight python %}
+hypothesis = x1_train * w1 + x2_train * w2 + x3_train * w3 + b
+{% endhighlight %}
+
+ํ์ง๋ง input ๋ณ์์ ๊ฐ์๊ฐ 100๊ฐ, 1000๊ฐ ์ผ ๋๋ ์์ ๊ฐ์ด hypothesis์ ๋ฐ์ดํฐ์
์ ์ ์ํ ์๋ ์๋ ๋
ธ๋ฆ์ด๋ค. ์ด๊ฑธ ๊ฐ๋จํ๊ฒ ๋ง๋ค๊ธฐ ์ํด $x_1w_1 + x_2w_2 + x_3w_3$๋ฅผ ํ๋ ฌ๊ณฑ์ผ๋ก ๋ฐ๊ฟ ์๊ฐํด ๋ณด์.
+
+๊ฐ ๋ณ์์ ๊ฐ์ค์น์ ๊ณฑ์ ์๋์ ๊ฐ์ ํ๋ ฌ ๊ณฑ๊ณผ ๊ฐ๋ค.
+
+\\[
+\begin{pmatrix}
+x_1 & x_2 & x_3
+\end{pmatrix}
+\cdot
+\begin{pmatrix}
+w_1 \\\\\\
+w_2 \\\\\\
+w_3 \\\\\\
+\end{pmatrix}
+=
+\begin{pmatrix}
+x_1w_1 + x_2w_2 + x_3w_3
+\end{pmatrix}
+\\]
+
+๊ทธ๋ฌ๋ฏ๋ก [lab1](/posts/dlZeroToAll-PyTorch-1/)์์ ๋์๋ `matmul()`์ ์ฌ์ฉํ์ฌ ๋ณ์์ ๊ฐ์ค์น์ ๊ณฑ์ ๊ฐ๋จํ๊ฒ ๊ตฌํ ์ ์๋ค.
+
+{% highlight python %}
+x_train = torch.FloatTensor([[73, 80, 75],
+ [93, 88, 93],
+ [89, 91, 90],
+ [96, 98, 100],
+ [73, 66, 70]])
+y_train = torch.FloatTensor([[152], [185], [180], [196], [142]])
+
+hypothesis = x_train.matmul(W) # W์ ์ฐจ์์ [๋ณ์์ ๊ฐ์, 1]๋ก ๋ง์ถฐ ์ค ๊ฒ
+{% endhighlight %}
+
+์ด๋ ์ฃผ์ํ ๊ฒ์ ํ๋ ฌ๊ณฑ ์ฐ์ฐ์ด ๊ฐ๋ฅํ๋๋ก `W`์ ์ฐจ์์ ๋ณ์์ ๊ฐ์์ ๋ฐ๋ผ ๋ง์ถฐ์ค์ผ ํ๋ค๋ ๊ฒ์ด๋ค.
+
+
+***
+## Train
+Multivariate Linear Regression์ hypothesis๊น์ง ๋ชจ๋ ์์๋ดค์ผ๋ ํ์ตํ๋ ์ ์ฒด์ ์ธ ์ฝ๋๋ฅผ ์์ฑํด ๋ณด์.
+
+[lab3](/posts/dlZeroToAll-PyTorch-3/)์ **Train with `optim`**์ ์ฝ๋์ ํฌ๊ฒ ๋ค๋ฅด์ง ์์ง๋ง
+`W = torch.zeros((3, 1), requires_grad=True)`์์ ๊ฐ์ค์น์ ์ฐจ์์ ๋ณ์์ ๊ฐ์์ ๋ฐ๋ผ ๋ง์ถฐ์ค ๊ฒ๋ง ์ฐจ์ด๊ฐ ๋๋ค.
+
+{% highlight python %}
+# ๋ชจ๋ธ ์ด๊ธฐํ
+W = torch.zeros((3, 1), requires_grad=True)
+b = torch.zeros(1, requires_grad=True)
+# optimizer ์ค์
+optimizer = optim.SGD([W, b], lr=1e-5)
+
+nb_epochs = 20
+for epoch in range(nb_epochs + 1):
+
+ # H(x) ๊ณ์ฐ
+ hypothesis = x_train.matmul(W) + b # or .mm or @
+
+ # cost ๊ณ์ฐ
+ cost = torch.mean((hypothesis - y_train) ** 2)
+
+ # cost๋ก H(x) ๊ฐ์
+ optimizer.zero_grad()
+ cost.backward()
+ optimizer.step()
+
+ # ๋ก๊ทธ ์ถ๋ ฅ
+ print('Epoch {:4d}/{} hypothesis: {} Cost: {:.6f}'.format(
+ epoch, nb_epochs, hypothesis.squeeze().detach(), cost.item()
+ ))
+
+'''output
+Epoch 0/20 hypothesis: tensor([0., 0., 0., 0., 0.]) Cost: 29661.800781
+Epoch 1/20 hypothesis: tensor([67.2578, 80.8397, 79.6523, 86.7394, 61.6605]) Cost: 9298.520508
+Epoch 2/20 hypothesis: tensor([104.9128, 126.0990, 124.2466, 135.3015, 96.1821]) Cost: 2915.712402
+Epoch 3/20 hypothesis: tensor([125.9942, 151.4381, 149.2133, 162.4896, 115.5097]) Cost: 915.040649
+Epoch 4/20 hypothesis: tensor([137.7967, 165.6247, 163.1911, 177.7112, 126.3307]) Cost: 287.936157
+Epoch 5/20 hypothesis: tensor([144.4044, 173.5674, 171.0168, 186.2332, 132.3891]) Cost: 91.371010
+Epoch 6/20 hypothesis: tensor([148.1035, 178.0143, 175.3980, 191.0042, 135.7812]) Cost: 29.758249
+Epoch 7/20 hypothesis: tensor([150.1744, 180.5042, 177.8509, 193.6753, 137.6805]) Cost: 10.445281
+Epoch 8/20 hypothesis: tensor([151.3336, 181.8983, 179.2240, 195.1707, 138.7440]) Cost: 4.391237
+Epoch 9/20 hypothesis: tensor([151.9824, 182.6789, 179.9928, 196.0079, 139.3396]) Cost: 2.493121
+Epoch 10/20 hypothesis: tensor([152.3454, 183.1161, 180.4231, 196.4765, 139.6732]) Cost: 1.897688
+Epoch 11/20 hypothesis: tensor([152.5485, 183.3609, 180.6640, 196.7389, 139.8602]) Cost: 1.710555
+Epoch 12/20 hypothesis: tensor([152.6620, 183.4982, 180.7988, 196.8857, 139.9651]) Cost: 1.651412
+Epoch 13/20 hypothesis: tensor([152.7253, 183.5752, 180.8742, 196.9678, 140.0240]) Cost: 1.632369
+Epoch 14/20 hypothesis: tensor([152.7606, 183.6184, 180.9164, 197.0138, 140.0571]) Cost: 1.625924
+Epoch 15/20 hypothesis: tensor([152.7802, 183.6427, 180.9399, 197.0395, 140.0759]) Cost: 1.623420
+Epoch 16/20 hypothesis: tensor([152.7909, 183.6565, 180.9530, 197.0538, 140.0865]) Cost: 1.622141
+Epoch 17/20 hypothesis: tensor([152.7968, 183.6643, 180.9603, 197.0618, 140.0927]) Cost: 1.621262
+Epoch 18/20 hypothesis: tensor([152.7999, 183.6688, 180.9644, 197.0661, 140.0963]) Cost: 1.620501
+Epoch 19/20 hypothesis: tensor([152.8014, 183.6715, 180.9665, 197.0686, 140.0985]) Cost: 1.619764
+Epoch 20/20 hypothesis: tensor([152.8020, 183.6731, 180.9677, 197.0699, 140.0999]) Cost: 1.619046
+'''
+{% endhighlight %}
+
+hypothesis์ ์ถ๋ ฅ๊ฐ๊ณผ cost๋ฅผ ๋ณด๋ฉด ์ ๋ต์ ์ ์ ๊ทผ์ ํ๋ ๊ฒ์ ํ์ธํ ์ ์๋ค. ์ด ๊ฒฝ์ฐ์๋ lab3์์ ์ธ๊ธํ ๊ฒ๊ณผ ๊ฐ์ด learning rate์ ๋ฐ๋ผ cost์ ๊ทน์์ ์ ์ง๋์ณ ๋ฐ์ฐํ ์๋ ์๋ค.
+
+***
+## High-level Implementation with `nn.Module`
+PyTorch์ `nn.Module`์ ์์ํ์ฌ ๋ชจ๋ธ์ ์์ฑํ๋ฉด hypothesis ์ ์, cost ๊ณ์ฐ ๋ฑ์ ํ์ต์ ํ์ํ ์ฌ๋ฌ ์์๋ค์ ํธํ๊ฒ ๋ง๋ค๊ณ ์ฌ์ฉํ ์ ์๋ค.
+
+### Model
+`nn.Module`์ ์ด์ฉํ์ฌ ๋ชจ๋ธ์ ์์คํ ๋๋ ๋ค์๊ณผ ๊ฐ์ ํ์์ ๋ฐ๋ผ์ผ ํ๋ค.
+
+1. `nn.Module`๋ฅผ ์์ํด์ผ ํ๋ค.
+2. `__init__`๊ณผ `forward()`๋ฅผ override ํด์ผํ๋ค.
+ * `__init__`: ๋ชจ๋ธ์ ์ฌ์ฉ๋ module์ ์ ์. `super().__init__()`์ผ๋ก `nn.Module`์ ์์ฑ์ผ๋ก ์ด๊ธฐํ
+ * `forward()`: **Hypothesis**๊ฐ ๋ค์ด๊ฐ ๊ณณ. (Hypothesis์ input์ ๋ฃ์ด predictํ๋ ๊ฒ์ forward ์ฐ์ฐ์ด๋ผ๊ณ ํจ)
+
+{% highlight python %}
+class LinearRegressionModel(nn.Module):
+ def __init__(self):
+ super().__init__()
+ self.linear = nn.Linear(1, 1)
+
+ def forward(self, x):
+ return self.linear(x)
+{% endhighlight %}
+
+์ด๋ ๊ฒ ๋ชจ๋ธ์ ์ ์ํ๋ฉด ์ฐ๋ฆฌ๊ฐ ์ง์ W, b๋ฅผ ๋ช
์ํ์ฌ hypothesis๋ฅผ ์ ์ํด ์ฃผ์ง ์์๋ ๋๋ค. gradient ๊ณ์ฐ์ธ `backward()`๋ PyTorch๊ฐ ์์์ ํด์ฃผ๊ธฐ ๋๋ฌธ์ ์ ๊ฒฝ์ฐ์ง ์์๋ ๋๋ค.
+
+{% highlight python %}
+# ๊ธฐ์กด์ ๋ชจ๋ธ ์ด๊ธฐํ
+W = torch.zeros((3, 1), requires_grad=True)
+b = torch.zeros(1, requires_grad=True)
+
+hypothesis = x_train.matmul(W) + b
+
+# nn.Module์ ํ์ฉํ ๋ชจ๋ธ ์ด๊ธฐํ
+class MultivariateLinearRegressionModel(nn.Module):
+ def __init__(self):
+ super().__init__()
+ self.linear = nn.Linear(3, 1)
+
+ def forward(self, x):
+ return self.linear(x)
+{% endhighlight %}
+
+Multivariate Linear Regression Model์ ์์ฑํ ๋๋ `nn.Linear()`์ ์ฐจ์์ ์กฐ์ ํด ์ฃผ๋ ๊ฒ์ผ๋ก ๊ฐ๋จํ ๋ชจ๋ธ์ ์์ฑํ ์ ์๋ค.
+์ด๋ ๊ฒ ๋ชจ๋ธ์ ์์ ์ด ์์ ๋ก์ด ๊ฒ์ `nn.Module`์ ํ์ฅ์ฑ์ ์ ๋ณด์ฌ์ฃผ๋ ๋ถ๋ถ์ด๋ผ๊ณ ์๊ฐํ๋ค.
+
+
+
+### Cost (`nn.functional`)
+cost๋ `torch.nn.functional`๋ฅผ ์ด์ฉํด์ ๊ฐ๋จํ ์ ์ํ ์ ์๋ค.
+
+{% highlight python %}
+cost = F.mse_loss(prediction, y_train)
+{% endhighlight %}
+
+๊ณ์ ์ฌ์ฉํ๋ MSE๋ฅผ ์์ ๊ฐ์ด ์ ์ํ๋ฉด ์ถํ์ ๋ค๋ฅธ loss๋ฅผ ์ฌ์ฉํ๋ ค๊ณ ํ ๋ loss ํจ์๋ง ๋ณ๊ฒฝํด ์ฃผ๋ฉด ๋๊ธฐ ๋๋ฌธ์ ํจ์ฌ ํธ๋ฆฌํ๋ค.
+
+
+
+### Training with `nn.Module`
+์์ ์๋กญ๊ฒ ์ ์ํ๋ ๋ชจ๋ธ๊ณผ cost๋ฅผ ์ด์ฉํ์ฌ ์ ์ฒด ํ์ต ์ฝ๋๋ฅผ ์์ฑํ๋ฉด ๋ค์๊ณผ ๊ฐ๋ค.
+๋๋จธ์ง ๋ถ๋ถ์ ํฌ๊ฒ ์ฐจ์ด๊ฐ ์๊ณ , hypothesis์ cost๋ฅผ ์ ์ํ๋ ๋ถ๋ถ์ด ๋ ๊ฐ๊ฒฐํด์ง ๋ชจ์ต์ ๋ณผ ์ ์๋ค.
+
+{% highlight python %}
+# ๋ฐ์ดํฐ
+x_train = torch.FloatTensor([[73, 80, 75],
+ [93, 88, 93],
+ [89, 91, 90],
+ [96, 98, 100],
+ [73, 66, 70]])
+y_train = torch.FloatTensor([[152], [185], [180], [196], [142]])
+# ๋ชจ๋ธ ์ด๊ธฐํ
+model = MultivariateLinearRegressionModel()
+# optimizer ์ค์
+optimizer = optim.SGD(model.parameters(), lr=1e-5)
+
+nb_epochs = 20
+for epoch in range(nb_epochs+1):
+
+ # H(x) ๊ณ์ฐ
+ prediction = model(x_train)
+
+ # cost ๊ณ์ฐ
+ cost = F.mse_loss(prediction, y_train)
+
+ # cost๋ก H(x) ๊ฐ์
+ optimizer.zero_grad()
+ cost.backward()
+ optimizer.step()
+
+ # ๋ก๊ทธ ์ถ๋ ฅ
+ print('Epoch {:4d}/{} Cost: {:.6f}'.format(
+ epoch, nb_epochs, cost.item()
+ ))
+
+'''output
+Epoch 0/20 Cost: 31667.599609
+Epoch 1/20 Cost: 9926.266602
+Epoch 2/20 Cost: 3111.514160
+Epoch 3/20 Cost: 975.451172
+Epoch 4/20 Cost: 305.908539
+Epoch 5/20 Cost: 96.042679
+Epoch 6/20 Cost: 30.260782
+Epoch 7/20 Cost: 9.641659
+Epoch 8/20 Cost: 3.178671
+Epoch 9/20 Cost: 1.152871
+Epoch 10/20 Cost: 0.517862
+Epoch 11/20 Cost: 0.318802
+Epoch 12/20 Cost: 0.256388
+Epoch 13/20 Cost: 0.236816
+Epoch 14/20 Cost: 0.230657
+Epoch 15/20 Cost: 0.228718
+Epoch 16/20 Cost: 0.228094
+Epoch 17/20 Cost: 0.227880
+Epoch 18/20 Cost: 0.227803
+Epoch 19/20 Cost: 0.227759
+Epoch 20/20 Cost: 0.227729
+'''
+{% endhighlight %}
diff --git a/_posts/2022-04-30-dlZeroToAll-PyTorch-4_2.markdown b/_posts/2022-04-30-dlZeroToAll-PyTorch-4_2.markdown
new file mode 100644
index 00000000000..f38f9e97eb3
--- /dev/null
+++ b/_posts/2022-04-30-dlZeroToAll-PyTorch-4_2.markdown
@@ -0,0 +1,188 @@
+---
+title: "๋ชจ๋๋ฅผ ์ํ ๋ฅ๋ฌ๋ 2 - Lab4_2: Loading Data"
+author: Kwon
+date: 2022-04-30T00:00:00 +0900
+categories: [pytorch, study]
+tags: [multivariate-linear-regressoin]
+math: true
+mermaid: false
+---
+
+[๋ชจ๋๋ฅผ ์ํ ๋ฅ๋ฌ๋](https://deeplearningzerotoall.github.io/season2/lec_pytorch.html) Lab 4_2: Loading Data ๊ฐ์๋ฅผ ๋ณธ ํ ๊ณต๋ถ๋ฅผ ๋ชฉ์ ์ผ๋ก ์์ฑํ ๊ฒ์๋ฌผ์
๋๋ค.
+
+***
+## Data in the Real World
+[lab4_1](/posts/dlZeroToAll-PyTorch-4_1/)์์ ๋ค๋ฃจ์๋ Multivariate Linear Regression์์๋ ํ์ต ๋ฐ์ดํฐ๋ก 3๊ฐ์ ์ฐจ์์ ๊ฐ์ง 5๊ฐ์ ์ํ์ ์ฌ์ฉํ์๋ค.
+ํ์ง๋ง ์ค์ ์ฐ๋ฆฌ๊ฐ ๋ค๋ฃจ๋ ค๊ณ ํ๋ ๋ฐ์ดํฐ๋ ๊ทธ ํฌ๊ธฐ๊ฐ ๊ทธ๋ฆฌ ๋ง๋งํ์ง ์๋ค. ๋ณธ ๊ฐ์์์ ์๋ฅผ ๋ค์๋ **ImageNet**์ ๊ฒฝ์ฐ 1400๋ง๊ฐ ์ด์์ ์ด๋ฏธ์ง ๋ฐ์ดํฐ ์
์ ํฌํจํ๊ณ ์์ผ๋ฉฐ ๊ทธ ์ฉ๋์ด 120GB ์ด์์ด๋ค.
+์ด ๋ฐ์ดํฐ๋ฅผ ํ๋ฒ์ ํ์ต์ ์งํํ๋ค๋ ๊ฒ์ ํ๋์จ์ด ์์ ์ฉ๋ ๋ฌธ์ ๋ ์๊ฒ ์ง๋ง, ํ๋์จ์ด์ ์ธ ๋ฌธ์ ๊ฐ ํด๊ฒฐ๋๋ค ํ๋๋ผ๋ ๋๋ฆฌ๊ณ Gradient Descent ์์ cost ์ฐ์ฐ์ ๋ํ computing power ๋ถ๋ด์ด ๋๋ฌด ํฌ๋ค.
+
+์ด๋ฐ ๋ฌธ์ ์ ์ ํด๊ฒฐํ๊ธฐ ์ํด ๋ฑ์ฅํ ๊ฒ์ด Minibatch์ด๋ค. ๋ฐ์ดํฐ๊ฐ ๋๋ฌด ํฌ๋๊น **'๋ฐ์ดํฐ์ ์ผ๋ถ๋ก ํ์ตํ๋ฉด ์ด๋จ๊น?'**๋ผ๋ ์๊ฐ์ ๋์จ ๊ฐ๋
์ด๋ค.
+
+***
+## Minibatch Gradient Descent
+์์์ ์ ๊ฐ ์ธ๊ธํ ๊ฒ์ฒ๋ผ, ๋์ฉ๋ ๋ฐ์ดํฐ๋ฅผ ๊ท ์ผํ๊ฒ ๋๋ gradient dscent๋ฅผ ํ๋ ๊ฒ์ Minibatch Gradient Descent๋ผ๊ณ ํ๋ค.
+์ด๋ ๊ฒ ํ์ต์ ํ๋ ๊ฒฝ์ฐ ์
๋ฐ์ดํธ๊ฐ ๋น ๋ฅด๊ณ ํ๋์จ์ด์ ์ธ ๋ถ๋ด๋ ๋ ์ ์๋ค.
+ํ์ง๋ง ์ด๋๊น์ง๋ ์ ์ฒด๊ฐ ์๋ ์ผ๋ถ ๋ฐ์ดํฐ๋ฅผ ์จ์ ํ์ตํ๋ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ ์๋ชป๋ ๋ฐฉํฅ์ผ๋ก ํ์ต์ด ๋ ์๋ ์๊ณ ,
+๊ฒฐ๊ณผ์ ์ผ๋ก ์ด๋์ ๋ ์๋ ดํ๋๋ผ๋ ๊ทธ ๊ณผ์ ์ด ์๋ ๊ทธ๋ฆผ๊ณผ ๊ฐ์ด ์ข ๊ฑฐ์น ๊ฒ Gradient descent ๋ ์๋ ์๋ค. (์๋ ๊ทธ๋ฆผ์ ์ดํด๋ฅผ ์ํ ์์์ ๊ทธ๋ํ์ด๋ฉฐ, ์ค์ loss์ ๊ทธ๋ํ๊ฐ ์๋๋๋ค.)
+
+
+
+
+
+***
+## Dataset
+### PyTorch Dataset
+`torch.utils.data.Dataset`์ ์์ํ์ฌ ์ฌ์ฉ์ ์ ์ ๋ฐ์ดํฐ ์
์ ๋ง๋ค์ด ์ฌ์ฉํ ์ ์๋ค. ์ด ๋ฐฉ์์ผ๋ก ๋ฐ์ดํฐ ์
์ ์ ์ํ ๊ฒฝ์ฐ ๋ค์๊ณผ ๊ฐ์ ํ์์ ๋ฐ๋ผ์ผ ํ๋ค.
+1. `torch.utils.data.Dataset`์ ์์ํด์ผ ํ๋ค.
+2. `__init__`, `__len__` ๊ทธ๋ฆฌ๊ณ `__getitem__`์ override ํด์ผ ํ๋ค.
+ * `__init__` : ๋ฐ์ดํฐ ์
์ ๋ง๋ค ๋(`Dataset`๊ฐ์ฒด๊ฐ ์์ฑ๋ ๋)๋ง ์คํ๋จ. ์ค์ ๋ ๋ฐ์ดํฐ๋ฅผ ์ ์ํ๋ ๊ณณ.
+ * `__len__` : ๋ฐ์ดํฐ ์
์ ์ด ๋ฐ์ดํฐ ์๋ฅผ ๋ฐํํจ.
+ * `__getitem__`: ์ฃผ์ด์ง ์ธ๋ฑ์ค(`idx`)์ ๋ฐ๋ผ ๊ทธ ์ธ๋ฑ์ค์ ๋ง๋ x, y ๋ฐ์ดํฐ๋ฅผ ๋ฐํํจ.
+
+lab4_1์์ ์ฌ์ฉํ๋ ๋ฐ์ดํฐ๋ก ๋ฐ์ดํฐ ์
์ ๋ง๋๋ ๊ณผ์ ์ ๋ค์๊ณผ ๊ฐ๋ค.
+
+```python
+from torch.utils.data import Dataset
+
+class CustomDataset(Dataset):
+ def __init__(self):
+ self.x_data = [[73, 80, 75],
+ [93, 88, 93],
+ [89, 91, 90],
+ [96, 98, 100],
+ [73, 66, 70]]
+ self.y_data = [[152], [185], [180], [196], [142]]
+
+ def __len__(self):
+ return len(self.x_data)
+
+ def __getitem__(self, idx):
+ return torch.FloatTensor(self.x_data[idx]), torch.FloatTensor(self.y_data[idx])
+
+dataset = CustomDataset()
+```
+
+์ํ๋ ๋ฐ์ดํฐ๋ฅผ ๋ฃ์ด ๋ฐ์ดํฐ ์
class๋ฅผ ๋ง๋ ํ ์ธ์คํด์ค๋ฅผ ์์ฑํด ์ค๋ค.
+
+### PyTorch DataLoader
+`torch.utils.data.DataLoader`๋ฅผ ์ฌ์ฉํ๋ฉด `Dataset` ๊ฐ์ฒด์ ๋ฐ์ดํฐ์ ๋ํด minibatch๋ฅผ ์๋์ผ๋ก ์ ๊ณตํ์ฌ batch์ ๋ํ ๋ฐ๋ณต์ ์ฝ๊ฒ ํ ์ ์๋๋ก ํด์ค๋ค.
+
+```python
+from torch.utils.data import DataLoader
+
+dataloader = DataLoader(
+ dataset,
+ batch_size=2,
+ shuffle=True
+)
+```
+
+์์ ๊ฐ์ด ์ค์ ํ๋ฉด ๊ฐ minibatch๋ค์ ํฌ๊ธฐ๋ฅผ 2๋ก ๋๋์ด ์ ๊ณตํ๋ค. `batch_size`๋ ํต์์ ์ผ๋ก 2์ ์ ๊ณฑ์(16, 32, 64, 128, 256...)๋ก ์ค์ ํ๋๋ฐ ์ด๋ GPU memory๊ฐ 2์ ๊ฑฐ๋ญ์ ๊ณฑ์ด๊ธฐ ๋๋ฌธ์ด๋ค.
+
+๊ฒฝ์ฐ์ ๋ฐ๋ผ 66๊ฐ์ batch๋ 120๊ฐ์ batch๋ (๋ ๋ค $2^6$๊ณผ $2^7$ ์ฌ์ด์ ๋ฒ์์ด๋ค. ์๋ฅผ ๋ค์๋ฉด ๊ทธ๋ ๋ค๋ ๊ฒ) ํ์ํ ์๊ฐ์ด ๋์ผํ ๊ฒฝ์ฐ๊ฐ ๋ฐ์ํ ์ ์๋ค. ๊ทธ๋ฌ๋ฏ๋ก ์ต๋์ ํจ์จ์ ์ํด GPU memory์ ํฌ๊ธฐ๋ฅผ ๋ง์ถฐ์ฃผ๋ ๊ฒ์ด๋ค. ๋ ํ๋ ์ผ๋ฐ์ ์ผ๋ก ์๋ ค์ง ๊ฒ์ผ๋ก๋ batch size๊ฐ ์์์๋ก ์๊ฐ์ ์ค๋ ๊ฑธ๋ฆฌ๊ณ , ํจ๊ณผ๊ฐ ์ข๋ค๋ ๊ฒ์ด๋ค.
+
+shuffle ์ต์
์ ๋ฐ์ดํฐ๋ฅผ epoch๋ง๋ค ์์ด์ ๋ชจ๋ธ์ด ๋ฐ์ดํฐ์ ์์๋ฅผ ์ธ์ฐ๋ ๊ฒ์ ๋ฐฉ์งํ ์ ์๋๋ก ํด ์ค๋ค. ๋๋ถ๋ถ์ ๊ฒฝ์ฐ ๋ฐ์ดํฐ์ ์์๋ฅผ ์ธ์ฐ์ง ๋ชปํ๋๋ก ํ์ตํ๋ ๊ฒ์ด ์ข์ผ๋ฏ๋ก Ture๋ก ํด ๋๋ ๊ฒ์ด ์ข๋ค.
+
+***
+## Full Code with `Dataset` and `DataLoader`
+`Dataset` ๊ณผ `DataLoader`๋ฅผ ์ด์ฉํ์ฌ ํ์ตํ๋ ์ฝ๋๋ฅผ ์์ฑํด๋ณด์.
+
+```python
+import torch
+import torch.nn as nn
+import torch.nn.functional as F
+import torch.optim as optim
+
+class MultivariateLinearRegressionModel(nn.Module):
+ def __init__(self):
+ super().__init__()
+ self.model = nn.Linear(3, 1)
+
+ def forward(self, x):
+ return self.model(x)
+
+# ๋ชจ๋ธ ์ด๊ธฐํ
+model = MultivariateLinearRegressionModel()
+# optimizer ์ค์
+optimizer = optim.SGD(model.parameters(), lr=1e-5)
+```
+
+๋ชจ๋ธ, optimizer๋ lab4_1๊ณผ ๋์ผํ๊ฒ ์ ์ํด์ฃผ๊ณ
+
+```python
+from torch.utils.data import Dataset
+from torch.utils.data import DataLoader
+
+class CustomDataset(Dataset):
+ def __init__(self):
+ self.x_data = [[73, 80, 75],
+ [93, 88, 93],
+ [89, 91, 90],
+ [96, 98, 100],
+ [73, 66, 70]]
+ self.y_data = [[152], [185], [180], [196], [142]]
+
+ def __len__(self):
+ return len(self.x_data)
+
+ def __getitem__(self, idx):
+ return torch.FloatTensor(self.x_data[idx]), torch.FloatTensor(self.y_data[idx])
+
+dataset = CustomDataset()
+
+dataloader = DataLoader(
+ dataset,
+ batch_size=2,
+ shuffle=True
+)
+```
+
+๋ฐ์ดํฐ ์
์ ์ค๋ ํฌ์คํ
์ ๋์จ ๋ฐฉ๋ฒ์ผ๋ก ์ ์๋ฅผ ํด์ค๋ค.
+
+์ด๋ค์ ๊ฐ์ง๊ณ ํ์ตํ๋ ์ฝ๋๋ ์ด๋ ๊ฒ ์์ฑํ ์ ์๋ค.
+
+```python
+epochs = 20
+for epoch in range(epochs + 1):
+ for batch_idx, smaples in enumerate(dataloader):
+ x_train, y_train = smaples
+
+ prediction = model(x_train)
+
+ cost = F.mse_loss(prediction, y_train)
+
+ optimizer.zero_grad()
+ cost.backward()
+ optimizer.step()
+
+ # 5 epoch ๋ง๋ค ๋ก๊ทธ ์ถ๋ ฅ
+ if epoch%5 == 0:
+ print('Epoch {:4d}/{} Batch {}/{} Cost {:6f}'.format(
+ epoch, epochs, batch_idx, len(dataloader), cost.item()
+ ))
+
+'''output
+Epoch 0/20 Batch 0/3 Cost 390.795288
+Epoch 0/20 Batch 1/3 Cost 55.004257
+Epoch 0/20 Batch 2/3 Cost 18.470478
+Epoch 5/20 Batch 0/3 Cost 8.500160
+Epoch 5/20 Batch 1/3 Cost 3.519112
+Epoch 5/20 Batch 2/3 Cost 2.370358
+Epoch 10/20 Batch 0/3 Cost 2.786815
+Epoch 10/20 Batch 1/3 Cost 4.166077
+Epoch 10/20 Batch 2/3 Cost 5.060166
+Epoch 15/20 Batch 0/3 Cost 4.609153
+Epoch 15/20 Batch 1/3 Cost 6.680350
+Epoch 15/20 Batch 2/3 Cost 4.476605
+Epoch 20/20 Batch 0/3 Cost 4.082047
+Epoch 20/20 Batch 1/3 Cost 2.758399
+Epoch 20/20 Batch 2/3 Cost 4.820268
+'''
+```
+
+ํ epoch ์์์ minibatch๋ก 3๋ฒ ํ์ตํ๋ ๊ฒ์ ํ์ธํ ์ ์๋ค. ๋ค๋ง ์์ batch size๊ฐ ์์์๋ก ์ค๋๊ฑธ๋ฆฌ๊ณ ํจ๊ณผ๋ ์ข๋ค๊ณ ํ๋๋ฐ ์ด๋ฒ์ ๊ฒฝ์ฐ์๋ ์ฑ๋ฅ์ด ๊ทธ๋ ๊ฒ ์ข์ ๋ณด์ด์ง ์๋๋ค(lab4_1์์์ ์ต์ข
cost๋ 0.227729).
+
+๊ทธ ์ด์ ๋ batch size๊ฐ ๋๋ฌด ์๊ธฐ ๋๋ฌธ์ด๋ค. ์ฐ๋ฆฌ๊ฐ minibatch๋ฅผ ์ฌ์ฉํ์ฌ ํ์ต์ ํ ์ ์๋ ์ด์ ๋ minibatch๊ฐ ์ ์ฒด ๋ฐ์ดํฐ ์
์ ๋ํํ ์ ์๋ค๊ณ ๊ฐ์ ํ๊ธฐ ๋๋ฌธ์ด๋ค. ํ์ง๋ง ์ด๋ฒ ์ํฉ์ ๋ณด๋ฉด batch size๊ฐ 2 ๋ฐ์ ๋์ง ์๋๋ค.
+์ด์ ๋ ํฌ๊ธฐ๋ก๋ ์๋ฌด๋ฆฌ ์๊ฐํด๋ ์ ์ฒด ๋ฐ์ดํฐ์ ๋ถํฌ๋ฅผ ๋ํํ๊ธฐ์๋ ๋ฌด๋ฆฌ๊ฐ ์์ด ๋ณด์ธ๋ค. ์ด๋ฐ ์ด์ ๋๋ฌธ์ ์ฑ๋ฅ์ด ๋จ์ด์ง ๊ฒ์ด๋ผ๊ณ ํ ์ ์๋ค.
+
+๊ทธ๋ฌ๋ฏ๋ก batch size๋ฅผ ์ค์ ํ ๋์๋ ์ถฉ๋ถํ ์ ์ฒด ๋ถํฌ๋ฅผ ๋ฐ์ํ ์ ์๋๋ก ์ค์ ํ๋ ์ฃผ์๋ฅผ ๊ธฐ์ธ์ฌ์ผ ํ๋ค.
diff --git a/_posts/2022-04-30-dlZeroToAll-PyTorch-5.markdown b/_posts/2022-04-30-dlZeroToAll-PyTorch-5.markdown
new file mode 100644
index 00000000000..eda3dcfe325
--- /dev/null
+++ b/_posts/2022-04-30-dlZeroToAll-PyTorch-5.markdown
@@ -0,0 +1,451 @@
+---
+title: "๋ชจ๋๋ฅผ ์ํ ๋ฅ๋ฌ๋ 2 - Lab5: Logistic Classification"
+author: Kwon
+date: 2022-04-30T00:00:00 +0900
+categories: [pytorch, study]
+tags: [logistic-classification, binary-cross-entropy]
+math: true
+mermaid: false
+---
+
+[๋ชจ๋๋ฅผ ์ํ ๋ฅ๋ฌ๋](https://deeplearningzerotoall.github.io/season2/lec_pytorch.html) Lab 5: Logistic Classification ๊ฐ์๋ฅผ ๋ณธ ํ ๊ณต๋ถ๋ฅผ ๋ชฉ์ ์ผ๋ก ์์ฑํ ๊ฒ์๋ฌผ์
๋๋ค.
+
+***
+## Logistic Regression(Binary Classification)
+Hypothesis๋ก sigmoid(logistic) ํจ์๋ฅผ ์ฌ์ฉํ๋ ํ๊ท ๋ฐฉ๋ฒ์ด๋ค. ํํ Binary classification ploblem์ ๋ง์ด ์ฌ์ฉํ๋๋ฐ, ์ด ๊ฒฝ์ฐ ์ ์ ํ ํ๊ท ๋์ ๋ก์ง์คํฑ ํ๊ท๋ฅผ ์ฌ์ฉํ๋์ง์ ๋ํด ๋จผ์ ์์๋ณด์
+
+### Hypothesis
+๊ณต๋ถ ์๊ฐ์ ๋ฐ๋ฅธ ์ํ ํฉ๊ฒฉ ์ฌ๋ถ ๋ฐ์ดํฐ ์
์ ์๊ฐํด ๋ณด์($y=1$: ํฉ๊ฒฉ, $y=0$: ๋ถํฉ๊ฒฉ).
+
+๋จผ์ ์ด ๋ฐ์ดํฐ ์
์ ์์ธก ๋ฌธ์ ๋ฅผ ์ ํ ํ๊ท๋ฅผ ํตํด ์ ๊ทผํด ๋ณผ ๊ฒ์ด๋ค. ๊ธฐ์กด์ ์ ํ ํ๊ท์์ hypothesis๋ $H(x_1, x_2, x_3) = xw + b$๋ก ์ฃผ์ด์ก์๋ค.
+ํ์ต ์ด๊ธฐ์๋ 2.5์๊ฐ(์ด๋ก์ ์ ์ )์ ๊ธฐ์ค์ผ๋ก ํฉ๊ฒฉ์ด ๊ฒฐ์ ๋์๋ค๊ณ ๊ฐ์ ํด ๋ณด์
+
+
+
+์์ ๊ฐ์ด ํ๊ท ํจ์๋ฅผ ํ์ตํ๋ฉด x(๊ณต๋ถ ์๊ฐ)๊ฐ ์ฃผ์ด์ก์ ๋ y๊ฐ 0.5๋ฅผ ๋์๋๊ฐ ์ฌ๋ถ์ ๋ฐ๋ผ ๋ถ๋ฅ๊ฐ ๊ฐ๋ฅํ ๊ฒ์ด๋ค(0.5๋ฅผ ๋์ผ๋ฉด ํฉ๊ฒฉ์ผ๋ก ์ฒ๋ฆฌํ๋ฉด ๋๋ค).
+
+ํ์ง๋ง ์ด ํ๊ท์์ ๋ฒ์๋ฅผ ๋์ด์๋ ๊ฐ ์ฆ, ํ์ต๋ hypothesis์ ๋ฃ์์ ๋ prediction์ด $[0, 1]$๋ฅผ ๋ฒ์ด๋๋ ๊ฐ์ด ์๋ค๋ฉด ๊ทธ์ ๋ง์ถฐ ํ๊ท์ ์ ๋ค์ ํ์ตํด์ผ ํ๋ค.
+
+
+
+์์ฒ๋ผ 9์๊ฐ(๋นจ๊ฐ O) ๊ณต๋ถํ ์ฌ๋์ ๋ง์ถฐ ํ์ต์ ๋ค์ ํ๋ฉด 2.5์๊ฐ์์ 5์๊ฐ ์ฌ์ด์ ๋ฒ์์ ์๋ ์ฌ๋๋ค์ ๋ชจ๋ธ์ด ๋ถํฉ๊ฒฉํ ๊ฒ์ผ๋ก ํ๋จํ๊ฒ ๋๋ค.
+
+์ด๋ฐ ์ํฉ๊ณผ ๊ฐ์ด ์ ์ ํ ๋ถ๋ฅ๋ฅผ ํ๊ธฐ ํ๋ ๊ฒฝ์ฐ๊ฐ ์ค์ ๋ฐ์ดํฐ์์๋ ๋ฌด์ํ ๋ง์ด ์กด์ฌํ ์ ์๊ณ , ํ์ต์ด ๋๋ ์ดํ ์์ธก์ ํ ๋ prediction์ ๋ฒ์๊ฐ $[0, 1]$์ ๋ฒ์ด๋ ์ ์๋ค๋ ๋ฌธ์ ๋ ์๋ค.
+์ด๋ฌํ ์ด์ ๋ค๋ก ์ ํ ํ๊ท๋ง์ผ๋ก ์ ๊ทผํ๋ ๊ฒ์ ๋ถ๋ฅ ๋ฌธ์ ์๋ ์ ํฉํ์ง ์๋ค๊ณ ํ ์ ์๋ค.
+
+์ด๋ฒ์๋ ๋ก์ง์คํฑ ํ๊ท๋ก ์ด ๋ฌธ์ ๋ฅผ ์ ๊ทผํด ๋ณด์. ๋จผ์ ์๊ทธ๋ชจ์ด๋ ํจ์(๋ก์ง์คํฑ ํจ์)๋ ๋ค์๊ณผ ๊ฐ์ด ์ ์๋๋ค.
+
+\\[ s(z) = \frac{1}{1+e^{-z}} \\]
+
+์ด๋ฅผ ๊ทธ๋ํ๋ก ๊ทธ๋ ค๋ณด๋ฉด ์๋์ ๊ฐ์ ํํ๋ฅผ ๋๋ค.
+
+{: height="60%"}
+
+๊ทธ๋ฆผ์ผ๋ก๋ ํ์ธํ ์ ์๋ ๊ฒ์ฒ๋ผ ์๊ทธ๋ชจ์ด๋ ํจ์๋ ํญ์ 0๊ณผ 1 ์ฌ์ด์ ๊ฐ์ด ์กด์ฌํ์ฌ ์์ ์ธ๊ธํ ์ ํ ํ๊ท์ ๋ฌธ์ ์ ์ ํด๊ฒฐํ ์ ์๋ค.
+์ ํ ํ๊ท์์ ์๊ทธ๋ชจ์ด๋ ํจ์์ ์ธํ์ผ๋ก ๋ฃ์ผ๋ฉด ์ ํ ํ๊ท์์์ ์ด๋ค ๊ฐ์ด ๋์ค๋ 0๊ณผ 1์ฌ์ด์ ๋ฒ์๋ฅผ ๋์ด ์๊ธฐ๋ ๋ฌธ์ ๊ฐ ์ผ์ด๋์ง ์์ ๊ฒ์ด๋ค.
+
+๊ทธ๋ฌ๋ฏ๋ก ๋ก์ง์คํฑ ํ๊ท์ hypothesis๋ ๋ก์ง์คํฑ ํจ์์ ์ ํ ํ๊ท์์ ๋ฃ๋ ๊ฒ์ผ๋ก ์ ์๋๋ค.
+
+\\[ H(X) = \frac{1}{1+e^{-W^T X}} \\]
+
+์ด hypothesis๋ฅผ ๋ฐ๋ฅธ๋ค๋ฉด ์๋ฌด๋ฆฌ ํฌ๊ฑฐ๋ ์์ ๊ฐ์ด ์ฃผ์ด์ง๋๋ผ๋ 0๊ณผ 1์ฌ์ด๋ฅผ ๋ฒ์ด๋์ง ์๊ธฐ ๋๋ฌธ์ ๊ธฐ์กด์ ํฉ๊ฒฉ์ด๋ผ๊ณ ๋ถ๋ฅ ๋ ๊ฐ์ด ๊ฐ์๊ธฐ ๋ถํฉ๊ฒฉ์ด ๋ ๊ฐ๋ฅ์ฑ์ด ๋งค์ฐ ์ค์ด๋ ๋ค.
+
+์ด์ฒ๋ผ binary classification์ ์ ํฉํ ๊ฐ์ผ๋ก ๋ง๋ค์ด ์ฃผ๋ ํน์ฑ ๋๋ฌธ์ ๋ก์ง์คํฑ ํ๊ท ๋ฟ๋ง ์๋๋ผ, neural network๋ฅผ ์ด์ฉํ binary classification์์ output ์ง์ ์ ๋ง์ง๋ง ๋ ์ด์ด๋ก๋ ์ฌ์ฉ๋๋ค. ์ด ๋๋ฌธ์ activation function(ํ์ฑํ ํจ์)์ค ํ๋์ด๊ธฐ๋ ํ๋ค.
+
+
+### Cost(Binary Cross Entropy)
+Hpothesis๋ ์ ์ํ์ผ๋ cost๋ฅผ ์ ์ํ ์ฐจ๋ก์ด๋ค. ์๊ทธ๋ชจ์ด๋ ํจ์์ ๊ฒฝ์ฐ ์ ํ ํ๊ท์์ ์ผ๋ MSE๋ฅผ ์ฌ์ฉํ๋ฉด local minimun์ด ์์ ์ ์๊ธฐ ๋๋ฌธ์ ์ ๋๋ก ๋ ํ์ต์ด ๋์ง ์์ ์ ์๋ค.
+
+๋ง๋ก ํ๊ธฐ๋ณด๋ค ๊ทธ๋ํ๋ก ํ๋ฒ ํ์ธํด ๋ณด์.
+```python
+import matplotlib.pyplot as plt
+import torch
+import numpy as np
+import os
+os.environ['KMP_DUPLICATE_LIB_OK']='True'
+
+x_data = [[1, 2], [2, 3], [3, 1], [4, 3], [5, 3], [6, 2]]
+y_data = [[0], [0], [0], [1], [1], [1]]
+W_l = np.linspace(-3, 3, 1000)
+cost_l = []
+for W in W_l:
+ hypothesis = 1 / (1 + torch.exp(-(W * x_train)))
+ cost = torch.mean((hypothesis - y_train) ** 2)
+
+ cost_l.append(cost.item())
+
+plt.plot(W_l, cost_l)
+plt.xlabel('$W$')
+plt.ylabel('Cost')
+plt.show()
+```
+
+
+
+์ฐ๋ฆฌ๊ฐ ์๊ฐํ๊ธฐ์ `W`๊ฐ 0 ๊ทผ์ฒ์ ๊ฐ์ผ๋ก ์๋ ดํ๋ ๊ฒ์ด ๋ง์ ๋ณด์ธ๋ค. ํ์ง๋ง gradient descent๋ฅผ ์์ํ๋ ์ ์ด -1 ๋ถ๊ทผ, ํน์ ๋ ์์ ๊ฐ์ด๋ผ๋ฉด ์ฐ๋ฆฌ๊ฐ ์ํ๋ ๋ฐฉํฅ๊ณผ ๋ฐ๋๋ก ๊ทน์์ ์ ์ฐพ์๊ฐ ๊ฒ์ด๋ค. ๊ทธ ๋ฐฉํฅ์๋ ๊ทน์์ ์ด ์์ ์ ์๊ฒ ์ง๋ง ๊ทธ๊ฑด ์ฐ๋ฆฌ๊ฐ ์ํ๋ global minimum์ด ์๋๋ค.
+
+์ ๊ทธ๋ํ๋ ์กฐ๊ธ ์ ๋งคํ๋ค๊ณ ๋๋ ์ ์๊ฒ ์ง๋ง ์ค์ ๋ก cost์ global minimum์ด ์๋ ์ฌ๋ฌ ๊ทน์์ ์ด ์๋ค๋ ๊ฒ์ ํ์คํ ํ์ต์ด ์ ๋์ง ์์ ๊ฒ์ด๋ผ๋ ๊ฑด ์ ์ ์๋ค.
+
+๊ทธ๋์ cost๋ก ๋ค์๊ณผ ๊ฐ์ ํจ์๋ฅผ ์ฌ์ฉํ๋ค.
+
+\\[ cost(W) = -\frac{1}{m} \sum y \log\left(H(x)\right) + (1-y) \left( \log(1-H(x) \right) \\]
+
+log๋ฅผ ์ฌ์ฉํ์ฌ ์ง์ํจ์๋ฅผ ๋ค๋ฃจ๊ธฐ ์ข์ ํํ๋ก ๋ง๋ค์ด ์ฃผ๊ณ , ์ ๋ต์ ๋ฐ๋ผ ์ ์ ํ cost๋ฅผ ์ฌ์ฉํ ์ ์๋๋ก ๋ง๋ค์๋๋ฐ ๊ทธ cost์ ํํ๋ ๋ค์๊ณผ ๊ฐ๋ค.
+
+{: height="50%" aligncenter}
+
+๋ต์ด 1์ธ ๊ฒฝ์ฐ(์ด๋ก์) 0์ ๊ฐ๊น์ธ ๋ cost๊ฐ ์ฌ๋ผ๊ฐ๊ณ 1์ผ ๋ 0์ด๋๋ก, ๋ต์ด 0์ธ ๊ฒฝ์ฐ ๊ทธ ๋ฐ๋๋ก ์๋ํ๊ฒ cost๋ฅผ ์ ์ํ์๋ค.
+๋๋ถ์ ์๊ทธ๋ชจ์ด๋๋ฅผ ์ด์ฉํด์ ํ์ตํ๊ธฐ์ ์ ์ ํ cost์ ํํ๊ฐ ๋์๋ค.
+
+์ด๋ฅผ ํตํ gradient descent๋ ์ ๊ณผ ๋์ผํ ํํ๋ก ์งํํ๋ค.
+
+\\[ W := W - \alpha \frac{\partial}{\partial W} cost(W) \\]
+
+***
+## Import
+```python
+import torch
+import torch.nn as nn
+import torch.nn.functional as F
+import torch.optim as optim
+
+# seed ๊ณ ์
+torch.manual_seed(1)
+```
+
+***
+## Training data
+```python
+x_data = [[1, 2], [2, 3], [3, 1], [4, 3], [5, 3], [6, 2]]
+y_data = [[0], [0], [0], [1], [1], [1]]
+
+x_train = torch.FloatTensor(x_data)
+y_train = torch.FloatTensor(y_data)
+
+print(x_train.shape)
+print(y_train.shape)
+
+'''output
+torch.Size([6, 2])
+torch.Size([6, 1])
+'''
+```
+
+***
+## Computing Hypothesis and Cost Function
+์ผ๋จ์ ์์ ๊ทธ๋๋ก ์ฝ๋๋ฅผ ์์ฑํด์ ์ฌ์ฉํด๋ณด์.
+
+### Hypothesis
+\\[ H(X) = \frac{1}{1+e^{-W^T X}} \\]
+
+```python
+W = torch.zeros((2, 1), requires_grad=True)
+b = torch.zeros(1, requires_grad=True)
+
+hothesis = 1 / (1 + torch.exp(-(x_train.matmul(W) + b)))
+
+print(hypothesis)
+print(hypothesis.shape)
+
+'''output
+tensor([[0.5000],
+ [0.5000],
+ [0.5000],
+ [0.5000],
+ [0.5000],
+ [0.5000]], grad_fn=)
+torch.Size([6, 1])
+'''
+```
+`torch.exp(x)`๋ก $e^x$์ฐ์ฐ์ ํ ์ ์๋ค.
+W์ b๊ฐ ๋ชจ๋ 0์ด๊ธฐ ๋๋ฌธ์ 0.5๊ฐ output์ผ๋ก ๋์จ ๊ฒ์ ํ์ธํ ์ ์๋ค.
+
+### Cost
+\\[ cost(W) = -\frac{1}{m} \sum y \log\left(H(x)\right) + (1-y) \left( \log(1-H(x) \right) \\]
+
+```python
+losses = -(y_train * torch.log(hypothesis) + (1 - y_train) * torch.log(1 - hypothesis))
+print(losses)
+
+'''output
+tensor([[0.6931],
+ [0.6931],
+ [0.6931],
+ [0.6931],
+ [0.6931],
+ [0.6931]], grad_fn=)
+'''
+```
+
+$log$ ์ฐ์ฐ๋ ๋ง์ฐฌ๊ฐ์ง๋ก `torch.log()`๋ฅผ ํตํด ํ ์ ์๋ค.
+loss๋ ์ ์ถ๋ ฅ๋๋ค.
+
+### Full code
+```python
+# ๋ชจ๋ธ ์ด๊ธฐํ
+W = torch.zeros((2, 1), requires_grad=True)
+b = torch.zeros(1, requires_grad=True)
+# optimizer ์ค์
+optimizer = optim.SGD([W, b], lr=1)
+
+nb_epochs = 1000
+for epoch in range(nb_epochs + 1):
+
+ # Cost ๊ณ์ฐ
+ hypothesis = torch.sigmoid(x_train.matmul(W) + b) # or .mm or @
+ cost = -(y_train * torch.log(hypothesis) +
+ (1 - y_train) * torch.log(1 - hypothesis)).mean()
+
+ # cost๋ก H(x) ๊ฐ์
+ optimizer.zero_grad()
+ cost.backward()
+ optimizer.step()
+
+ # 100๋ฒ๋ง๋ค ๋ก๊ทธ ์ถ๋ ฅ
+ if epoch % 100 == 0:
+ print('Epoch {:4d}/{} Cost: {:.6f}'.format(
+ epoch, nb_epochs, cost.item()
+ ))
+
+'''output
+Epoch 0/1000 Cost: 0.693147
+Epoch 100/1000 Cost: 0.134722
+Epoch 200/1000 Cost: 0.080643
+Epoch 300/1000 Cost: 0.057900
+Epoch 400/1000 Cost: 0.045300
+Epoch 500/1000 Cost: 0.037261
+Epoch 600/1000 Cost: 0.031673
+Epoch 700/1000 Cost: 0.027556
+Epoch 800/1000 Cost: 0.024394
+Epoch 900/1000 Cost: 0.021888
+Epoch 1000/1000 Cost: 0.019852
+'''
+```
+
+hypothesis์ cost๊ฐ ๋ฌ๋ฆฌ์ง ๊ฒ ์ธ์๋ ์ด์ ์ lab๋ค์์ ํ์ตํ๋ ์ฝ๋์ ๋ฌ๋ผ์ง ๊ฒ์ด ์๋ค.
+
+## Computing Hypothesis and Cost Function with `torch`
+์๊ทธ๋ชจ์ด๋ ํจ์์ binary cross entropy๋ PyTorch์์ ๊ธฐ๋ณธ์ ์ผ๋ก ์ ๊ณตํ๊ธฐ ๋๋ฌธ์ ๊ตณ์ด ์์ฒ๋ผ ๊ตฌํํ์ง ์๊ณ ์ฌ์ฉํ ์ ์๋ค
+
+```python
+hypothesis = torch.sigmoid(x_train.matmul(W) + b)
+
+print(hypothesis)
+print(hypothesis.shape)
+ptint(F.binary_cross_entropy(hypothesis, y_train))
+
+'''output
+tensor([[0.5000],
+ [0.5000],
+ [0.5000],
+ [0.5000],
+ [0.5000],
+ [0.5000]], grad_fn=)
+torch.Size([6, 1])
+tensor(0.6931, grad_fn=)
+'''
+```
+
+์์ ์์์ผ๋ก ๊ตฌํํ๋ ๊ฒ๊ณผ ๋์ผํ ๊ฒฐ๊ณผ๊ฐ ๋์จ๋ค.
+
+### Full Code
+```python
+# ๋ชจ๋ธ ์ด๊ธฐํ
+W = torch.zeros((2, 1), requires_grad=True)
+b = torch.zeros(1, requires_grad=True)
+# optimizer ์ค์
+optimizer = optim.SGD([W, b], lr=1)
+
+nb_epochs = 1000
+for epoch in range(nb_epochs + 1):
+
+ # Cost ๊ณ์ฐ
+ hypothesis = torch.sigmoid(x_train.matmul(W) + b) # or .mm or @
+ cost = F.binary_cross_entropy(hypothesis, y_train)
+
+ # cost๋ก H(x) ๊ฐ์
+ optimizer.zero_grad()
+ cost.backward()
+ optimizer.step()
+
+ # 100๋ฒ๋ง๋ค ๋ก๊ทธ ์ถ๋ ฅ
+ if epoch % 100 == 0:
+ print('Epoch {:4d}/{} Cost: {:.6f}'.format(
+ epoch, nb_epochs, cost.item()
+ ))
+'''output
+Epoch 0/1000 Cost: 0.693147
+Epoch 100/1000 Cost: 0.134722
+Epoch 200/1000 Cost: 0.080643
+Epoch 300/1000 Cost: 0.057900
+Epoch 400/1000 Cost: 0.045300
+Epoch 500/1000 Cost: 0.037261
+Epoch 600/1000 Cost: 0.031672
+Epoch 700/1000 Cost: 0.027556
+Epoch 800/1000 Cost: 0.024394
+Epoch 900/1000 Cost: 0.021888
+Epoch 1000/1000 Cost: 0.019852
+'''
+```
+
+๋ง์๊ฐ์ง๋ก hypothesis์ cost๋ง ๋ฌ๋ผ์ง๊ณ ๊ธฐ๋ณธ์ ์ธ ํ์ ๊ฐ๋ค. ํ์ต๋ ์ ๋๋ ๋ชจ์ต์ด๋ค.
+
+***
+## Evaluation
+์ฐ๋ฆฌ๊ฐ ๋ง๋ ๋ชจ๋ธ์ด ์ผ๋ง๋ ์ ํํ์ง ํ์ธํด๋ณด์
+
+์ค์ ์ฐ๋ฆฌ๊ฐ ๋ง๋ ๋ชจ๋ธ์ ์๊ทธ๋ชจ์ด๋ ํจ์์ ๊ฒฐ๊ณผ๊ฐ์ด๊ธฐ ๋๋ฌธ์ ๋ค์๊ณผ ๊ฐ์ด ์์์ ํํ๋ก ๋ํ๋๋ค.
+
+```python
+hypothesis = torch.sigmoid(x_train.matmul(W) + b)
+print(hypothesis[:5])
+
+'''output
+tensor([[0.4103],
+ [0.9242],
+ [0.2300],
+ [0.9411],
+ [0.1772]], grad_fn=)
+'''
+```
+
+์ค์ ๋ก๋ 0๋๋ 1์ ๊ฐ์ ๊ฐ์ง๊ธฐ ๋๋ฌธ์ ์ด๋ค ๊ธฐ์ค์ ํตํด ๊ฒฐ๊ณผ๊ฐ์ ๋ง์ถฐ ์ค ํ์๊ฐ ์์ด ๋ณด์ธ๋ค. ์ฌ๊ธฐ์๋ 0.5๋ฅผ ๊ธฐ์ค์ผ๋ก 0๊ณผ 1์ ๋๋๋ค๊ณ ์๊ฐํ๊ณ ์งํํ๋ค.
+
+```python
+prediction = hypothesis >= torch.FloatTensor([0.5])
+print(prediction[:5])
+
+'''output
+tensor([[0],
+ [1],
+ [0],
+ [1],
+ [0]], dtype=torch.uint8)
+'''
+```
+
+์ด๋ ๊ฒ ํ๋ฉด 0.5 ์ด์์ ๊ฐ์ 1๋ก, ๋ฏธ๋ง์ ๊ฐ๋ 0์ผ๋ก ๋งตํํ์ฌ `ByteTensor`์ ํํ๋ก ๋๋ ค์ค๋ค.
+
+์ค์ ๊ฐ๊ณผ ๋น๊ตํด ๋ณด๋ฉด ์ ์์ธกํ ๊ฒ์ ํ์ธํ ์ ์๋ค.
+
+```python
+print(prediction[:5])
+print(y_train[:5])
+
+correct_prediction = prediction.float() == y_train
+print(correct_prediction[:5])
+
+'''output
+tensor([[0],
+ [1],
+ [0],
+ [1],
+ [0]], dtype=torch.uint8)
+tensor([[0.],
+ [1.],
+ [0.],
+ [1.],
+ [0.]])
+
+tensor([[1],
+ [1],
+ [1],
+ [1],
+ [1]], dtype=torch.uint8)
+'''
+```
+
+๋ชจ๋ธ์ด ์์ธกํ ๊ฐ์ด ์ค์ ์ ๊ฐ์์ ๋ 1์ ๋ฐํํ๋๋ก ํ์ ๋ ๋ชจ๋ 1์ด ๋์์ผ๋ฏ๋ก ์ฃผ์ด์ง ๊ฐ๋จํ ๋ฐ์ดํฐ ์
์ ํํด์๋ ์ ํ์ต์ด ๋์๋ค๊ณ ํ ์ ์๋ค.
+
+***
+## Higher Implementation with Class
+Bynary Classification ๋ฌธ์ ์์ Sigmoid Reggression์ ์ฌ์ฉํ๋ ค๊ณ ํ ๋ [lab4_1](/posts/dlZeroToAll-PyTorch-4_1/)์์ ๋์๊ฑด ๊ฒ์ฒ๋ผ `Module`์ ์ฌ์ฉํ์ฌ calss๋ฅผ ๋ง๋ค์ด ์งํํ ์ ์๋ค.
+
+์ด๋ฒ์ ์ฌ์ฉํ ๋ฐ์ดํฐ ์
์ ๋ชจ๋๋ฅผ ์ํ ๋ฅ๋ฌ๋ ์ฝ๋์ ํจ๊ป ์ ๊ณต๋๋ ๋น๋จ๋ณ ๋ฐ์ดํฐ์
์ด๋ฉฐ 8๊ฐ ์ฐจ์์ ์ธํฟ๊ณผ ๋น๋จ๋ณ ์ฌ๋ถ์ ๋ฐ๋ฅธ 0, 1์ ๊ฐ์ผ๋ก ๋ฐ์ดํฐ๊ฐ ๊ตฌ์ฑ๋์ด ์๋ค.
+
+### Loading Real Data
+```python
+import numpy as np
+
+xy = np.loadtxt('data-03-diabetes.csv', delimiter=',', dtype=np.float32)
+x_data = xy[:, 0:-1]
+y_data = xy[:, [-1]]
+x_train = torch.FloatTensor(x_data)
+y_train = torch.FloatTensor(y_data)
+
+print(x_train[0:5])
+print(y_train[0:5])
+
+'''output
+tensor([[-0.2941, 0.4874, 0.1803, -0.2929, 0.0000, 0.0015, -0.5312, -0.0333],
+ [-0.8824, -0.1457, 0.0820, -0.4141, 0.0000, -0.2072, -0.7669, -0.6667],
+ [-0.0588, 0.8392, 0.0492, 0.0000, 0.0000, -0.3055, -0.4927, -0.6333],
+ [-0.8824, -0.1055, 0.0820, -0.5354, -0.7778, -0.1624, -0.9240, 0.0000],
+ [ 0.0000, 0.3769, -0.3443, -0.2929, -0.6028, 0.2846, 0.8873, -0.6000]])
+tensor([[0.],
+ [1.],
+ [0.],
+ [1.],
+ [0.]])
+'''
+```
+
+### Train with Class
+์ฐจ์์ ๋ง์ถฐ class๋ฅผ ์ ์ํด ์ค๋ค. ์ด๋ ๋ฐ๋ก ์๊ทธ๋ชจ์ด๋ ํจ์์ ๋ฃ๋ ๊ฒ์ด ์๋๋ผ linear function์ผ๋ก ๋ง๋ค์ด ์ค ํ์ ์ ์ฉํด์ผ ์ฐ๋ฆฌ๊ฐ ์ํ๋ hypothesis๊ฐ ๋ง๋ค์ด์ง๋ค.
+
+```python
+class BinaryClassifier(nn.Module):
+ def __init__(self):
+ super().__init__()
+ self.linear = nn.Linear(8, 1)
+ self.sigmoid = nn.Sigmoid()
+
+ def forward(self, x):
+ return self.sigmoid(self.linear(x))
+```
+
+```python
+model = BinaryClassifier()
+
+# optimizer ์ค์
+optimizer = optim.SGD(model.parameters(), lr=1)
+
+nb_epochs = 100
+for epoch in range(nb_epochs + 1):
+
+ # H(x) ๊ณ์ฐ
+ hypothesis = model(x_train)
+
+ # cost ๊ณ์ฐ
+ cost = F.binary_cross_entropy(hypothesis, y_train)
+
+ # cost๋ก H(x) ๊ฐ์
+ optimizer.zero_grad()
+ cost.backward()
+ optimizer.step()
+
+ # 20๋ฒ๋ง๋ค ๋ก๊ทธ ์ถ๋ ฅ
+ if epoch % 10 == 0:
+ prediction = hypothesis >= torch.FloatTensor([0.5])
+ correct_prediction = prediction.float() == y_train
+ accuracy = correct_prediction.sum().item() / len(correct_prediction)
+ print('Epoch {:4d}/{} Cost: {:.6f} Accuracy {:2.2f}%'.format(
+ epoch, nb_epochs, cost.item(), accuracy * 100,
+ ))
+
+'''output
+Epoch 0/100 Cost: 0.704829 Accuracy 45.72%
+Epoch 10/100 Cost: 0.572391 Accuracy 67.59%
+Epoch 20/100 Cost: 0.539563 Accuracy 73.25%
+Epoch 30/100 Cost: 0.520042 Accuracy 75.89%
+Epoch 40/100 Cost: 0.507561 Accuracy 76.15%
+Epoch 50/100 Cost: 0.499125 Accuracy 76.42%
+Epoch 60/100 Cost: 0.493177 Accuracy 77.21%
+Epoch 70/100 Cost: 0.488846 Accuracy 76.81%
+Epoch 80/100 Cost: 0.485612 Accuracy 76.28%
+Epoch 90/100 Cost: 0.483146 Accuracy 76.55%
+Epoch 100/100 Cost: 0.481234 Accuracy 76.81%
+'''
+```
+
+ํ์ต์ด ์ ์์ ์ผ๋ก ๋ ๊ฒ์ ํ์ธํ ์ ์๋ค. ์ด๋ accuracy๋ `correct_prediction`์ ๋ง์๋์ง ํ๋ ธ๋์ง๋ฅผ ์ ์ฅํด ํ๊ท ์ ๋ด์ด ๊ณ์ฐํ๋ค.
\ No newline at end of file
diff --git a/_posts/2022-05-01-dlZeroToAll-PyTorch-6.markdown b/_posts/2022-05-01-dlZeroToAll-PyTorch-6.markdown
new file mode 100644
index 00000000000..4f790a0142e
--- /dev/null
+++ b/_posts/2022-05-01-dlZeroToAll-PyTorch-6.markdown
@@ -0,0 +1,233 @@
+---
+title: "๋ชจ๋๋ฅผ ์ํ ๋ฅ๋ฌ๋ 2 - Lab6: Softmax Classification"
+author: Kwon
+date: 2022-05-01T23:00:00 +0900
+categories: [pytorch, study]
+tags: [softmax-classification, multinomial-classification, cross-entropy]
+math: true
+mermaid: false
+---
+
+[๋ชจ๋๋ฅผ ์ํ ๋ฅ๋ฌ๋](https://deeplearningzerotoall.github.io/season2/lec_pytorch.html) Lab 6: Softmax Classification ๊ฐ์๋ฅผ ๋ณธ ํ ๊ณต๋ถ๋ฅผ ๋ชฉ์ ์ผ๋ก ์์ฑํ ๊ฒ์๋ฌผ์
๋๋ค.
+
+***
+## Softmax Classification(Multinomial Classification)
+[์ด์ ํฌ์คํ
](/posts/dlZeroToAll-PyTorch-5/)์์๋ ์ด์ง ๋ถ๋ฅ ๋ฌธ์ ์ ๋ํด ์์๋ดค๋ค. ์ด๋ฒ์๋ ๋ถ๋ฅํด์ผ ํ ๋ฒ์ฃผ๊ฐ 2๊ฐ(0, 1)๊ฐ ์๋๋ผ ์ฌ๋ฌ๊ฐ์ธ ๋ค์ค ๋ถ๋ฅ์ ๋ํด ์์๋ณด๋ ค ํ๋ค.
+
+### Hypothesis
+์ด์ง ๋ถ๋ฅ๋ ๋ค์๊ณผ ๊ฐ์ด ๋ ์นดํ
๊ณ ๋ฆฌ์ ๊ฐ๋ค์ด ์ ๋๋ ์ง ์ ์๋ ์ ์ ๊ธ๋ ๊ฒ๊ณผ ๊ฐ๋ค.
+
+{: width="40%"}
+
+์ด์ฒ๋ผ ๋ค์ค ๋ถ๋ฅ๋ ์ฌ๋ฌ ์นดํ
๊ณ ๋ฆฌ์ ๊ฐ๋ค์ ์ ๋๋๋ ์ ๋ค์ ๊ธ๋๋ค๊ณ ์๊ฐํด ๋ณด์. ๊ทธ๋ฌ๋ฉด ๋ค์๊ณผ ๊ฐ์ ๊ทธ๋ฆผ์ด ๊ทธ๋ ค์ง ๊ฒ์ด๋ค.
+
+{: width="40%"}
+
+ํ๋์ ์ ์ **A or not**, ๋นจ๊ฐ์ ์ ์ **B or not** ๊ทธ๋ฆฌ๊ณ ์ด๋ก์ ์ ์ **C or not**์ผ๋ก ๊ตฌ๋ถํ๊ณ ์๋ค๊ณ ์๊ฐํ๋ฉด ๊ฐ ์นดํ
๊ณ ๋ฆฌ๋ง๋ค ํ๋์ ๋ถ๋ฅ ๋ฌธ์ ๋ก ๋ณผ ์ ์๋ค.
+
+์ด ๋ง์ ๊ฐ๊ฐ์ ์นดํ
๊ณ ๋ฆฌ๋ฅผ ๋ถ๋ฅํ๋ hypothesis๋ฅผ ์ ์ํ ์ ์๋ค๋ ๊ฒ์ธ๋ฐ, ์ด๋ฅผ ๋ค์๊ณผ ๊ฐ์ด ํ๋ ฌ์ ์ฐ์ฐ์ผ๋ก ๊น๋ํ๊ฒ ๋ํ๋ผ ์ ์๋ค.
+
+
+
+์ด๋ ๊ฒ ๋์จ ํ๋ฅ ์ ๊ฐ๊ฐ ์๊ทธ๋ชจ์ด๋๋ก ์ฒ๋ฆฌํ์ฌ ๊ฐ์ ๋ผ ์๋ ์๊ฒ ์ง๋ง, ์ด๋ ์กฐ๊ธ ๋ ํธํ๊ณ ์ต์ ํ๋ ํจ์๋ก softmax๋ฅผ ์ฌ์ฉํ๊ฒ ๋๋ฉฐ ๋ค์๊ณผ ๊ฐ์ด ์ ์๋๋ค.
+
+\\[ P(class=i) = \frac{e^i}{\sum e^i} \\]
+
+max๋ฅผ softํ๊ฒ ๋ฝ๋ ๊ฒ์ผ๋ก, ์ด ๊ฐ์ด ์ต๋์ธ๊ฐ, ์๋๊ฐ๋ก ๋จ์ ์ง์ด ์ถ๋ ฅํ๋ ๊ฒ์ด ์๋๋ผ ์ต๋์ผ ํ๋ฅ ์ ์ถ๋ ฅํ๋ ๊ฑฐ๋ผ๊ณ ์ดํดํ๋ฉด ๋ ๊ฒ ๊ฐ๋ค.
+
+์ด๋ ๊ฒ ๋ฝ์ ํ๋ฅ ๊ฐ์ผ๋ก ์-ํซ ์ธ์ฝ๋ฉํ์ฌ ์ต์ข
์ ์ผ๋ก ์ด๋ ์นดํ
๊ณ ๋ฆฌ์ ์ํ๋์ง ์ถ๋ ฅํ๊ฒ ๋๋ค. ์๋ ๊ทธ๋ฆผ์ A ์นดํ
๊ณ ๋ฆฌ์ ์ํ๋ค๊ณ ์๊ฐํ ๋์ ์ถ๋ ฅ์ ๋ณด์ธ ๊ฒ์ด๋ค.
+
+
+
+์ฝ๋๋ก๋ `torch`์์ ์ ๊ณตํ๋ ํจ์๋ฅผ ์ฌ์ฉํ๋ฉด ๋๋ค.
+
+```python
+import torch
+import torch.nn.functional as F
+
+z = torch.FloatTensor([1, 2, 3])
+hypothesis = F.softmax(z, dim=0)
+print(hypothesis)
+
+'''output
+tensor([0.0900, 0.2447, 0.6652])
+'''
+```
+
+๊ฐ์ฅ ํฐ ๊ฐ์ธ 3์ ํ๋ฅ ์ด ๊ฐ์ฅ ํฌ๊ฒ(softmax) ์ถ๋ ฅ๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
+
+
+
+### Cost(Cross Entropy)
+
+hHypothesis๊น์ง ๋ชจ๋ ์ ์ํ์ผ๋, ์ด์ ๊ทธ์ ๋ง๋ cost๋ฅผ ์ ์ํด์ผ ํ๋ค. ๋ค์ค ๋ถ๋ฅ์์๋ cross entropy๋ฅผ cost๋ก ์ฌ์ฉํ๋๋ฐ, ์ด๋ ๊ฐ๋จํ ๋งํด์ ์์ธกํ ํ๋ฅ ์ด ์ค์ ๋ถํฌ์ ํ๋ฅ ๊ณผ ์ผ๋ง๋ ์ฐจ์ด๊ฐ ๋๋์ง ๊ณ์ฐํ ๊ฐ์ด๋ค.
+
+์์ธํ ๋ด์ฉ์ ์ด๋ฏธ [cross entropy ํฌ์คํ
](/posts/cross-entropy/)์์ ๋ค๋ฃจ์๊ธฐ ๋๋ฌธ์ ์ฌ๊ธฐ๋ก ๋๋ฆฌ๊ณ ๋ฐ๋ก ์ฝ๋๋ก ๋์๊ฐ์. ์ค์ ๊ฐ์ ์ํซ ์ธ์ฝ๋ฉ ํ ๊ฒ์, softmax์ log๋ฅผ ์ทจํ ๊ฐ์ ์์๋ณ๋ก ๊ณฑํ ๋ค์, 0์ด ์๋ ๊ฐ๋ค์ ํ๊ท ๋ด์ด ์ ์ฒด์ ์ธ cross entropy๋ฅผ ๊ตฌํ ์ ์๋ค.
+
+```python
+z = torch.rand(3, 5, requires_grad=True)
+hypothesis = F.softmax(z, dim=1)
+print(hypothesis)
+
+y = torch.randint(5, (3,)).long()
+print(y)
+
+y_one_hot = torch.zeros_like(hypothesis)
+y_one_hot.scatter_(1, y.unsqueeze(1), 1)
+
+cost = (y_one_hot * -torch.log(hypothesis)).sum(dim=1).mean()
+print(cost)
+
+'''output
+tensor([[0.2645, 0.1639, 0.1855, 0.2585, 0.1277],
+ [0.2430, 0.1624, 0.2322, 0.1930, 0.1694],
+ [0.2226, 0.1986, 0.2326, 0.1594, 0.1868]], grad_fn=)
+
+tensor([0, 2, 1])
+
+tensor([[1., 0., 0., 0., 0.],
+ [0., 0., 1., 0., 0.],
+ [0., 1., 0., 0., 0.]])
+
+tensor(1.4689, grad_fn=)
+'''
+
+์๋๋ฉด softmax์ฒ๋ผ ๋ฏธ๋ฆฌ ๊ตฌํ๋์ด ์๋ ๊ฒ์ ์ฌ์ฉํด๋ ๋๋ค.
+
+```python
+# -log๋ฅผ ์ทจํด์ ํ๊ท ๋ด๋ ๊ฒ๊น์ง๋ง torch ํจ์ ์ฌ์ฉ (Negative Log Likelihood)
+F.nll_loss(F.log_softmax(z, dim=1), y)
+
+# NLL๊ณผ softmax๋ฅผ ๋ฌถ์ด torch ํจ์๋ก ์ฌ์ฉ
+F.cross_entropy(z, y)
+```
+
+***
+## Training data
+4์ฐจ์์ input, 3๊ฐ์ง์ class๋ฅผ ๋ต์ผ๋ก ๊ฐ์ง ๋ฐ์ดํฐ ์
์ด๋ค.
+
+```python
+x_train = [[1, 2, 1, 1],
+ [2, 1, 3, 2],
+ [3, 1, 3, 4],
+ [4, 1, 5, 5],
+ [1, 7, 5, 5],
+ [1, 2, 5, 6],
+ [1, 6, 6, 6],
+ [1, 7, 7, 7]]
+y_train = [2, 2, 2, 1, 1, 1, 0, 0]
+x_train = torch.FloatTensor(x_train)
+y_train = torch.LongTensor(y_train)
+```
+
+***
+## Train
+Hypothesis์ cost์ด์ธ์๋ ํฌ๊ฒ ๋ฌ๋ผ์ง ์ ์ ์๋ค. 3๊ฐ์ง ๋ฐฉ์์ ๊ตฌํ ์ฝ๋๋ง ํ๋ฒ ์ดํด๋ณด์
+
+
+
+### `F.softmax` + `torch.log`
+```python
+W = torch.zeros((4, 3), requires_grad=True)
+b = torch.zeros(1, requires_grad=True)
+
+optimizer = optim.SGD([W, b], lr=0.1)
+
+nb_epochs = 1000
+for epoch in range(nb_epochs + 1):
+
+ hypothesis = F.softmax(x_train.matmul(W) + b, dim=1)
+ y_one_hot = torch.zeros_like(hypothesis)
+ y_one_hot.scatter_(1, y_train.unsqueeze(1), 1)
+ cost = (y_one_hot * -torch.log(hypothesis)).sum(dim=1).mean()
+
+ optimizer.zero_grad()
+ cost.backward()
+ optimizer.step()
+
+ # 100๋ฒ๋ง๋ค ๋ก๊ทธ ์ถ๋ ฅ
+ if epoch % 100 == 0:
+ print('Epoch {:4d}/{} Cost: {:.6f}'.format(
+ epoch, nb_epochs, cost.item()
+ ))
+
+'''output
+Epoch 0/1000 Cost: 1.098612
+Epoch 100/1000 Cost: 0.761050
+Epoch 200/1000 Cost: 0.689991
+Epoch 300/1000 Cost: 0.643229
+Epoch 400/1000 Cost: 0.604117
+Epoch 500/1000 Cost: 0.568255
+Epoch 600/1000 Cost: 0.533922
+Epoch 700/1000 Cost: 0.500291
+Epoch 800/1000 Cost: 0.466908
+Epoch 900/1000 Cost: 0.433507
+Epoch 1000/1000 Cost: 0.399962
+'''
+```
+
+
+
+### `F.cross_entropy`
+softmax๊ฐ cross entropy์ ์ํด ์๊ธฐ ๋๋ฌธ์ hypothesis์๋ softmax๊ฐ ์๋ ๋ชจ์ต์ ๋ณผ ์ ์๋ค.
+
+```python
+W = torch.zeros((4, 3), requires_grad=True)
+b = torch.zeros(1, requires_grad=True)
+
+optimizer = optim.SGD([W, b], lr=0.1)
+
+nb_epochs = 1000
+for epoch in range(nb_epochs + 1):
+
+ z = x_train.matmul(W) + b
+ cost = F.cross_entropy(z, y_train)
+
+ optimizer.zero_grad()
+ cost.backward()
+ optimizer.step()
+
+ if epoch % 100 == 0:
+ print('Epoch {:4d}/{} Cost: {:.6f}'.format(
+ epoch, nb_epochs, cost.item()
+ ))
+```
+
+
+
+### `nn.Module`
+class๋ฅผ ์ ์ํ์ฌ ์ฌ์ฉํ ์๋ ์๋ค.
+
+```python
+class SoftmaxClassifierModel(nn.Module):
+ def __init__(self):
+ super().__init__()
+ self.linear = nn.Linear(4, 3) # Output์ด 3!
+
+ def forward(self, x):
+ return self.linear(x)
+```
+
+์ด๋๋ ๋ง์ฐฌ๊ฐ์ง๋ก softmax๊ฐ cross entropy์ ์ํด ์๊ธฐ ๋๋ฌธ์ class๋ฅผ ์ ์ํ ๋๋ ์ ํ ํจ์ ๋ถ๋ถ๋ง ์ ์ํด ์ค ๊ฒ์ ๋ณผ ์ ์๋ค.
+
+```python
+model = SoftmaxClassifierModel()
+
+optimizer = optim.SGD(model.parameters(), lr=0.1)
+
+nb_epochs = 1000
+for epoch in range(nb_epochs + 1):
+
+ prediction = model(x_train)
+
+ cost = F.cross_entropy(prediction, y_train)
+
+ optimizer.zero_grad()
+ cost.backward()
+ optimizer.step()
+
+ if epoch % 100 == 0:
+ print('Epoch {:4d}/{} Cost: {:.6f}'.format(
+ epoch, nb_epochs, cost.item()
+ ))
+```
\ No newline at end of file
diff --git a/_posts/2022-05-04-autoencoders-3.markdown b/_posts/2022-05-04-autoencoders-3.markdown
new file mode 100644
index 00000000000..65a41c4fd52
--- /dev/null
+++ b/_posts/2022-05-04-autoencoders-3.markdown
@@ -0,0 +1,103 @@
+---
+title: "์คํ ์ธ์ฝ๋์ ๋ชจ๋ ๊ฒ - 3. Autoencoders"
+author: Kwon
+date: 2022-05-04T00:00:00 +0900
+categories: [generative-model]
+tags: [autoencoder, dae, cae, scae]
+math: true
+mermaid: false
+---
+
+์ดํ์๋์ [์คํ ์ธ์ฝ๋์ ๋ชจ๋ ๊ฒ](https://www.youtube.com/watch?v=o_peo6U7IRM) ๊ฐ์๋ฅผ ๋ณธ ํ ๊ณต๋ถ ๋ฐ ์ ๋ฆฌ๋ฅผ ๋ชฉ์ ์ผ๋ก ์์ฑํ ๊ฒ์๋ฌผ์์ ์๋ ค๋๋ฆฝ๋๋ค.
+
+***
+## Introduction
+### Autoencoder
+์คํ ์ธ์ฝ๋๋ ์ธํฟ๊ณผ ์์ํ์ด ๊ฐ์ ๋คํธ์ํฌ๋ฅผ ์๋ฏธํ๋ค. Auto-associators, Diabolo nerworks, Sandglass-shaped net ๋ฑ์ ์ด๋ช
์ผ๋ก ๋ถ๋ฆฌ๊ธฐ๋ ํ๋ฉฐ ๊ฐ์ฅ ๋ง์ด ๋ถ๋ฆฌ๋ ์ด๋ฆ์ ์ญ์ **Autoencoder**์ด๋ค.
+
+
+
+์คํ ์ธ์ฝ๋๋ ๋ค์๊ณผ ๊ฐ์ด ์ค๊ฐ์ ์๋์ธต์ด ์๋กํ ๋ชจ์ต์ ๋คํธ์ํฌ์ธ๋ฐ, ์ด๋ ์ค๊ฐ ์๋์ธต์ $Z$๋ผ๊ณ ๋ถ๋ฅด๋ฉฐ Code, Latent Variable, Feature, Hidden representation ๋ฑ์ผ๋ก ๋ถ๋ฆฐ๋ค.
+๊ทธ๋์ $Z$๋ฅผ ์ด๋ป๊ฒ ์๊ฐํ๋์ ๋ฐ๋ผ ์คํ ์ธ์ฝ๋์์ ํ์ตํ๋ ๊ณผ์ ์ Representation Learning, Efficient Code Learning ๋ฑ์ผ๋ก ๋ถ๋ฅด๊ธฐ๋ ํ์ง๋ง, ๊ฒฐ๊ตญ ์ด๋ค์ ๋ชจ๋ $Z$ ๋
ธ๋๋ฅผ ๋ฐฐ์ฐ๋ ํ์ต์ ์ด๋ฅด๋ ๋ง๋ค์ด๋ค.
+
+
+
+์ฒ์ ์คํ ์ธ์ฝ๋๊ฐ ๊ฐ๊ด๋ฐ์ ์ด์ ๋ unsupervised learning ๋ฌธ์ ์ธ Demension Redection์ supervised learning์ผ๋ก ๋ฐ๊ฟ ํ ์ ์๋ค๋ ๊ฐ๋
๋๋ฌธ์ด์๋ค.
+์ต์ข
์ถ๋ ฅ๋ฌผ์ด ์๋์ ์
๋ ฅ๊ณผ ๊ฐ์ ๋ฌธ์ ๋ก ๋ณด๊ณ ํ์ต์ ํ ํ์, encoder ๋ถ๋ถ๋ง ๋ผ์ ์ฌ์ฉํ๋ฉด ์ฐจ์์ถ์๊ฐ ๊ฐ๋ฅํ ๋คํธ์ํฌ๋ฅผ ์ป์ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค.
+
+์ด ๊ฒฝ์ฐ ์๊ธฐ ์์ ์ ๋ํด ํ์ต(self learning)ํ๊ธฐ ๋๋ฌธ์ ์ ์ด๋ training DB์ ์๋ ๊ฒ๋ค์ ๋ํด์๋ ์์ถ์ ์ ํด์ค๋ค. ์ฆ, ์ต์ ์ฑ๋ฅ์ด ์ด๋์ ๋ ๋ณด์ฅ๋๋ค๋ ์ฅ์ ์ด ์๋ค.
+ํ์ง๋ง ๊ฐ์ ์ด์ ๋ก ์๋ก์ด ๊ฒ์ ์์ฑํ๋ ค ํด๋ ๊ธฐ์กด์ DB์ ๋น์ทํ ๊ฒฐ๊ณผ๊ฐ ๋ง์ด ๋์จ๋ค๋ ํ๊ฐ๋ฅผ ๋ฃ๊ธฐ๋ ํ์๋ค.
+
+#### General AE(AutoEncoder) and Linear AE
+General AE๋ฅผ ์กฐ๊ธ ๋ ์์ธํ ๋ณด์. ์์ ๋์๋ ๊ทธ๋ฆผ์ ์์ธํ ๋ํ๋ด๋ฉด ๋ค์๊ณผ ๊ฐ๋ค.
+
+
+
+์ต์ข
์ถ๋ ฅ $Y$๋ ์ธ์ฝ๋์ ์ถ๋ ฅ์ ๋์ฝ๋์ ์ธํ์ผ๋ก ๋ฃ์ด ๋์จ output์ผ๋ก ์ ์ํ ์ ์๊ณ , ์ด๊ฒ์ด ์ฒซ input $X$์ ๊ฐ๊ธฐ๋ฅผ ๋ฐ๋ผ๋ฏ๋ก ์ด๋ค๋ผ๋ฆฌ์ error๋ฅผ ๊ตฌํ๋ค.
+์ด๋๋ ๋ฐ์ดํฐ์ ๋ถํฌ ํํ์ ๋ฐ๋ผ MSE ๋๋ [cross-entropy](/posts/cross-entropy/)๋ฅผ ์ฌ์ฉํ๋ค.
+์ด๋ ๊ฒ ๊ตฌํ error๋ฅผ ์ฌ๊ตฌ์ถ(reconstruct) ํ ๊ฒ์ ๋ํ error๋ผ๋ ์๋ฏธ๋ก **Reconstruction Error**๋ผ๊ณ ํ๋ค.
+
+Linear AE๋ ๊ธฐ๋ณธ์ ์ธ ์คํ ์ธ์ฝ๋์ ๊ตฌ์กฐ์์ ์๋์ธต์ ํ์ฑํ ํจ์ ์์ด ์ ํ ํจ์๋ฅผ ๊ทธ๋๋ก ์ฌ์ฉํ ๊ฒ์ ๋งํ๋ค.
+PCA(Principle Component Analysis)์ baisis๋ ๋ค๋ฅด์ง๋ง ์ ํ์ ์ผ๋ก ์ฐจ์ ์ถ์๋ฅผ ์งํํ๊ธฐ ๋๋ฌธ์ ๊ฒฐ๊ณผ์ ์ผ๋ก PCA์ ๊ฐ์ mainifold๋ฅผ ํ์ตํ๋ค๋ ํน์ง์ด ์๋ค.
+
+***
+## Pretraining
+### Stacking AE
+ํ์ฌ์ CNN, DNN ๋ฐฉ๋ฒ๋ก ๋ค์ ๋นํด ์์ ์ ๋ฐฉ๋ฒ๋ก ๋ค์ ์ ์ ํ parameter ์ด๊ธฐํ๊ฐ ์ด๋ ค์ ๋ค. ์ด๋ ์คํ ์ธ์ฝ๋๋ก pretraining์ ํ๋ ์ฑ๋ฅ ๊ฐ์ ์ด ์ด๋ฃจ์ด์ก๋ค๊ณ ํด์ ์ฌ์ฉ๋๊ธฐ ์์ํ ๋ฐฉ์์ด๋ค.
+pretraining ๋ฐฉ์์ ๋ค์๊ณผ ๊ฐ๋ค.
+
+
+
+๋จผ์ ์ํ๋ ์ฐจ์์ผ๋ก ๋ณด๋ธ ํ, ์๋ ๋ ์ด์ด๋ก ๋์์์ ์ ๋๋ก ๋ณต๊ตฌ๊ฐ ๋๋์ง ํ์ธํ๋ค. ์ด ๊ณผ์ ์์ ์คํ ์ธ์ฝ๋ ๊ตฌ์กฐ๊ฐ ์ฌ์ฉ๋๋ค.
+์ ์ด๋ input layer์ ๊ฐ๋ค์ ๋ณต๊ตฌํ ์ ์๋ prameter๋ฅผ ์ฌ์ฉํ์๋ ๊ฒ์ด๋ค. ์ด ๊ณผ์ ์ ๋ชจ๋ ๋ ์ด์ด์ ๋ํด ์งํํ๋ฉด์ prameter๋ฅผ ๊ณ ์ ํ๋ค.
+
+ํ์ต์ด ๋ชจ๋ ๋๋ ๋ค์๋ random inintialization์ผ๋ก backpropagationํ๋ค.
+
+***
+## DAE(Denoising AE)
+์๋์ ์คํ ์ธ์ฝ๋ ๋ฐฉ์์ผ๋ก ํ์ต์ ํ๋ input ๋ฐ์ดํฐ์ noise๋ฅผ ์ถ๊ฐํ์ฌ ํ์ตํ๋ ๋ฐฉ์์ด๋ค. ์ด๋ ํต์ฌ์ noise๋ฅผ (์ด๋ฏธ์ง ๊ฐ์ ๊ฒ์) ์ฌ๋์ด ๋ดค์ ๋ ๋ค๋ฅด์ง ์์ ์ ๋๋ง ์ถ๊ฐํ๋ค๋ ๊ฒ์ด๋ค.
+
+์ด๋ฐ ์์ผ๋ก ํ์ต์ ํ๋ฉด ์ฌ๋์ด ๋ดค์ ๋ ๊ฐ์ ๊ฒ(manifold์ ๊ฑฐ์ ๊ฐ์ ๊ฒ)์ด ๋ฌด์์ธ์ง ํ์ตํ ์ ์๊ฒ ๋๋ค๋ concept์ด๋ค.
+
+์์ ํ์ธํ ์ ์๋ค.
+
+
+### Stochastic Contractive AE(SCAE)
+DAE์์ loss์ ์๋ฏธ๋ฅผ ํด์ํ์ฌ ๋ค๋ฅด๊ฒ ํํํ ๊ฒ์ด๋ค. DAE์ loss๋ฅผ ์๊ฐํด ๋ณด๋ฉด $g$, $h$์ค $h$๋ ํนํ ๋ฐ์ดํฐ๊ฐ ์กฐ๊ธ๋ง ๋ฐ๋1์ด๋ manifold ์์์ ๊ฐ์ smaple๋ก ๋งค์นญ์ด ๋๊ฒ ํ์ต์ ํด์ผ ํ๋ค๊ณ ๋ณผ ์ ์๋ค.
+์ด ์๋ฏธ๋ฅผ ์ฌ๊ตฌ์ฑ ํด๋ณด๋ฉด ๋ค์๊ณผ ๊ฐ์ด ์ ์ ์ ์๋ค.
+
+{: width="80%"}
+
+reconstruction error๋ฅผ ํตํด ์๋ ์คํ ์ธ์ฝ๋์ ํํ๋๋ก ์
์ถ๋ ฅ์ด ๋์ผํ๊ฒ ํ์ตํ๊ณ , **stochastic regularization**ํญ์ ํตํด manifold ์์์ ๊ฑฐ๋ฆฌ๊ฐ ๊ฐ๊ฒ ํ์ตํ๋๋ก loss๋ฅผ ๊ตฌ์ฑํ์๋ค.
+
+### CAE
+SCAE์ stochastic regularization ํญ์ ํ
์ผ๋ฌ ์ ๊ฐ๋ฅผ ํตํด ๊ทผ์ฌํ์ฌ, Frobenius norm ํํ๋ก ๋ง๋ค์ด, analytic regularization๋ก ์ ์ฉํ ๊ฒ์ด CAE์ด๋ค.
+ํ์ง๋ง 1์ฐจ ๋ฏธ๋ถ ํญ์์ ๋์ด ๊ทผ์ฌํ ๊ฒ์ด๋ฏ๋ก ํ ์ง์ ์ ๊ทผ์ฒ์์๋ง ์ ์๋ฏธํ ๊ทผ์ฌ๊ฐ ๋๋ค๊ณ ํ ์ ์๋ค.
+
+{: width="80%"}
+
+์ ์์ผ๋ก regularization ํญ์ ๋์ฒดํ์ฌ ๋ค์๊ณผ ๊ฐ์ด CAE loss๋ฅผ ์ ์ฉํ๋ค.
+
+{: width="80%"}
+
+#### DAE vs CAE
+๊ฒฐ๊ตญ DAE์ CAE์ concept ์์ฒด๋ mainfold ์์ ๊ฑฐ๋ฆฌ๋ฅผ ์ค์ธ๋ค๋ ๊ฒ์ผ๋ก ๊ฐ์ง๋ง, ๊ทธ๊ฒ์ ์ ์ฉํ๋ ๋ฐฉ์์ด ๋ฌ๋๋ค.
+
+DAE์ ๊ฒฝ์ฐ noise๊ฐ ์ฒจ๊ฐ๋ input์ผ๋ก ํ์ตํ์ฌ manifold ์์ ๊ฑฐ๋ฆฌ๋ฅผ ์ขํ๋ ค ํ๋ค๋ฉด, CAE๋ regularization์ ํตํด ์ด๋ฅผ ํด๊ฒฐํ๋ ค ํ๋ค.
+
+์ค์ ๋ก๋ CAE๋ณด๋ค DAE๊ฐ ๋ ๋ง์ด ์ฐ์ธ๋ค๊ณ ํ๋ค. ์ฐธ๊ณ ๋ก **AE, DAE, VAE(Variational AE)**๊ฐ ๋ง์ด ์ฐ์ด๋ ์คํ ์ธ์ฝ๋ ์ข
๋ฅ๋ผ๊ณ ํ๋ค.
\ No newline at end of file
diff --git a/_posts/2022-05-07-dlZeroToAll-PyTorch-7-1.markdown b/_posts/2022-05-07-dlZeroToAll-PyTorch-7-1.markdown
new file mode 100644
index 00000000000..ce8be0ce66b
--- /dev/null
+++ b/_posts/2022-05-07-dlZeroToAll-PyTorch-7-1.markdown
@@ -0,0 +1,334 @@
+---
+title: "๋ชจ๋๋ฅผ ์ํ ๋ฅ๋ฌ๋ 2 - Lab7-1: Tips"
+author: Kwon
+date: 2022-05-07T23:00:00 +0900
+categories: [pytorch, study]
+tags: [mle, overfitting, regularization, learning-rate]
+math: true
+mermaid: false
+---
+
+[๋ชจ๋๋ฅผ ์ํ ๋ฅ๋ฌ๋](https://deeplearningzerotoall.github.io/season2/lec_pytorch.html) Lab7-1: Tips ๊ฐ์๋ฅผ ๋ณธ ํ ๊ณต๋ถ๋ฅผ ๋ชฉ์ ์ผ๋ก ์์ฑํ ๊ฒ์๋ฌผ์
๋๋ค.
+
+***
+
+## Maximum Likelihood Estimate(MLE)
+
+### Probalility vs Likelihood
+
+Probalility(ํ๋ฅ )๋ ์ฐ๋ฆฌ๊ฐ ์ ์๊ณ ์๋ฏ์ด ์ด๋ค ๊ด์ธก๊ฐ์ด ๋ฐ์ํ ์ ๋๋ฅผ ๋ปํ๋๋ฐ, ์ด๋ ๋ค๋ฅด๊ฒ ๋งํ๋ฉด ํ ํ๋ฅ ๋ถํฌ์์ ํด๋น ๊ด์ธก๊ฐ ๋๋ ๊ด์ธก ๊ตฌ๊ฐ์ด ์ผ๋ง์ ํ๋ฅ ์ ๊ฐ์ง๋๊ฐ๋ฅผ ๋ปํ๋ค. ์ด์ ๋ฐํด Likelihood(์ฐ๋, ๊ฐ๋ฅ๋)๋ ์ด ๊ด์ธก๊ฐ์ด ์ฃผ์ด์ง ํ๋ฅ ๋ถํฌ์์ ํ๋ฅ ์ด ์ผ๋ง๋ ๋๋์ง๋ฅผ ๋งํ๋ค.
+
+์ค์ํ ์ฐจ์ด์ ์ **ํ๋ฅ **์ ์ด๋ฏธ ๋ฐฐ๊ฒฝ์ด ๋๋ ํ๋ฅ ๋ถํฌ๊ฐ **๊ณ ์ **๋์ด ์๊ณ , **์ฐ๋**๋ **๊ณ ์ ๋์ด ์์ง ์๋ค**๋ ๊ฒ์ด๋ค.
+
+### MLE
+
+์ด๋ฐ ์๋ฏธ๋ฅผ ๊ฐ์ง ์ฐ๋๋ฅผ ์ต๋ํ ํ๋ค๋ ๊ฒ์ ๊ด์ธก๋ ๊ฒฐ๊ณผ์ ๋ง๋ ํ๋ฅ ๋ถํฌ๋ฅผ ์ฐพ์๋ธ๋ค๋ ๊ฒ์ผ๋ก ์๊ฐํ ์ ์๋ค.
+
+๋ฒ ๋ฅด๋์ด ๋ถํฌ๋ฅผ ์๋ก ๋ค๋ฉด ํ๋ฅ ๋ถํฌ๋ฅผ ๊ฒฐ์ ํ๋ ์๋์ ๊ฐ์ ์ํฉ์์ $\theta$๋ฅผ ๋ณํ์ํค๋ฉด์ ์ฃผ์ด์ง ๊ฐ์ ๋ง์ถฐ ํ๋ฅ ๋ถํฌ๋ฅผ ์ต์ ํ ํ๋ ๊ฒ์ด๋ค.
+
+{: width="40%"}
+
+์ต์ ํ ํ๋ ๊ณผ์ ์ ๋ง์ฐฌ๊ฐ์ง๋ก gradient descent(ascent)๋ฅผ ํตํด ์งํํ๋ค.
+
+***
+
+## Overfitting
+
+์๋์ ๊ฐ์ด Train set์ ๋ํด ๊ณผํ๊ฒ ๋ง์ถฐ ํ์ตํ ๊ฒ์ ๋งํ๋ค. ์ด ๊ฒฝ์ฐ ํ์ตํ ๋ ์ฌ์ฉํ ๋ฐ์ดํฐ ์
์ด ์๋ ๋ฐ์ดํฐ๊ฐ ์ฃผ์ด์ก์ ๋์ ์์ธก ์ฑ๋ฅ์ด ๊ธ๊ฒฉํ๊ฒ ๋จ์ด์ง๊ฒ ๋๋ค.
+
+{: width="60%"}
+
+์ด๋ฌํ overfitting(๊ณผ์ ํฉ)์ ๋ง๊ธฐ ์ํด test set๊ณผ vaild set์ ์ฌ์ฉํ๊ฒ ๋๋ค. ํ์ต์ ํ ๋ ํ ๋ฒ๋ ๋ณด์ง ๋ชปํ๋ set์ ์ด์ฉํ์ฌ ๊ณผ์ ํฉ ์ฌ๋ถ๋ฅผ ํ์ธํ๋ ๊ฒ์ด๋ค.
+
+{: width="60%"}
+
+์์ ๊ฐ์ด train set์ ๋ํ loss๋ ๊ฐ์ํ์ง๋ง valid set์ ๋ํ loss๊ฐ ๊ฐ์ํ์ง ์์ ๋ ๊ณผ์ ํฉ์ด ๋ฐ์ํ๋ค๊ณ ํ๋จํ ์ ์๋ค.
+
+### Regularization
+
+๊ณผ์ ํฉ์ ๋ง๊ธฐ ์ํ ๋ฐฉ๋ฒ์๋ ๋ ๋ง์ ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉํ๋ค๊ฑฐ๋, ๋ ์ ์ feature๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ ๋ฑ ์ฌ๋ฌ ๋ฐฉ๋ฒ์ด ์๊ณ , ๊ทธ ์ค ํ๋๊ฐ regularization์ด๋ค.
+
+**Regularization**์๋ ๋ค์๊ณผ ๊ฐ์ ๋ฐฉ๋ฒ๋ค์ด ์๋ค.
+
+* Early Stoping: valid set์ loss๊ฐ ์ค์ด๋ค์ง ์์ ๋ ํ์ต์ ์ค์งํ๋ค.
+* Reducing Network Size
+* Weight Decay: weight๊ฐ ๋๋ฌด ์ปค์ง์ง ์๋๋ก wight๊ฐ ์ปค์ง์๋ก ํจ๊ป ์ปค์ง๋ penalty๋ฅผ ๋ถ์ฌํ๋ค.
+* Dropout: node์ ์ผ๋ถ๋ฅผ ๊บผ์ ํ์ตํ๋ node๋ฅผ ์ค์ธ๋ค.
+* Batch Normalization: ํ์ต ์ค์ ๋ฐฐ์น ๋จ์๋ก ์ ๊ทํ ํ๋ ๊ฒ
+
+***
+
+## with Code
+
+### Import
+```python
+import torch
+import torch.nn as nn
+import torch.nn.functional as F
+import torch.optim as optim
+
+# ์๋ ๊ณ ์
+ torch.manual_seed(1)
+```
+
+### Data
+
+3์ฐจ์์ input๊ณผ 3๊ฐ์ class๋ฅผ ๊ฐ์ง๊ณ ์๋ label๋ก ํ์ต์ ์งํํ๋ฉฐ, train set๊ณผ test set์ ๋น์จ์ 8:3์ด๋ค.
+
+```python
+# train set
+x_train = torch.FloatTensor([[1, 2, 1],
+ [1, 3, 2],
+ [1, 3, 4],
+ [1, 5, 5],
+ [1, 7, 5],
+ [1, 2, 5],
+ [1, 6, 6],
+ [1, 7, 7]
+ ])
+y_train = torch.LongTensor([2, 2, 2, 1, 1, 1, 0, 0])
+
+# test set
+x_test = torch.FloatTensor([[2, 1, 1], [3, 1, 2], [3, 3, 4]])
+y_test = torch.LongTensor([2, 2, 2])
+```
+
+### Model
+
+[lab6](/posts/dlZeroToAll-PyTorch-6/)์์ ๋ค๋ค๋ softamx model์ ์ฌ์ฉํ์ฌ ํ์ต์ ์งํํ๋ค.
+
+๋ฌผ๋ก ์
์ถ๋ ฅ ์ฐจ์์ ๋ง์ถฐ์ค์ผ ํ๊ธฐ ๋๋ฌธ์ `self.linear = nn.Linear(3, 3)`๋ก ์ ํ ๋ชจ๋ธ์ ์ ์ํ๋ ๋ถ๋ถ๋ง ๋ฌ๋ผ์ก๋ค.
+
+```python
+class SoftmaxClassifierModel(nn.Module):
+ def __init__(self):
+ super().__init__()
+ self.linear = nn.Linear(3, 3)
+ def forward(self, x):
+ return self.linear(x)
+
+model = SoftmaxClassifierModel()
+```
+
+### Train
+
+์ด ๋ถ๋ถ ์ญ์ ๊ธฐ์กด์ ํ์ ๋ฒ์ด๋์ง ์๋๋ค.
+
+```python
+# optimizer ์ค์
+optimizer = optim.SGD(model.parameters(), lr=0.1)
+
+def train(model, optimizer, x_train, y_train):
+ nb_epochs = 20
+ for epoch in range(nb_epochs):
+
+ # H(x) ๊ณ์ฐ
+ prediction = model(x_train)
+
+ # cost ๊ณ์ฐ
+ cost = F.cross_entropy(prediction, y_train)
+
+ # cost๋ก H(x) ๊ฐ์
+ optimizer.zero_grad()
+ cost.backward()
+ optimizer.step()
+
+ print('Epoch {:4d}/{} Cost: {:.6f}'.format(
+ epoch, nb_epochs, cost.item()
+ ))
+
+def test(model, optimizer, x_test, y_test):
+ prediction = model(x_test)
+ predicted_classes = prediction.max(1)[1]
+ correct_count = (predicted_classes == y_test).sum().item()
+ cost = F.cross_entropy(prediction, y_test)
+
+ print('Accuracy: {}% Cost: {:.6f}'.format(
+ correct_count / len(y_test) * 100, cost.item()
+ ))
+
+train(model, optimizer, x_train, y_train)
+
+test(model, optimizer, x_test, y_test)
+
+'''output
+Epoch 0/20 Cost: 2.203667
+Epoch 1/20 Cost: 1.199645
+Epoch 2/20 Cost: 1.142985
+Epoch 3/20 Cost: 1.117769
+Epoch 4/20 Cost: 1.100901
+Epoch 5/20 Cost: 1.089523
+Epoch 6/20 Cost: 1.079872
+Epoch 7/20 Cost: 1.071320
+Epoch 8/20 Cost: 1.063325
+Epoch 9/20 Cost: 1.055720
+Epoch 10/20 Cost: 1.048378
+Epoch 11/20 Cost: 1.041245
+Epoch 12/20 Cost: 1.034285
+Epoch 13/20 Cost: 1.027478
+Epoch 14/20 Cost: 1.020813
+Epoch 15/20 Cost: 1.014279
+Epoch 16/20 Cost: 1.007872
+Epoch 17/20 Cost: 1.001586
+Epoch 18/20 Cost: 0.995419
+Epoch 19/20 Cost: 0.989365
+
+Accuracy: 0.0% Cost: 1.425844
+'''
+```
+
+์์๋ก ๋ฃ์ ๊ฐ๋ค์ด๋ผ ์์ธก์ ์๋ฏธ๋ ํฌ๊ฒ ์์ด ๋ณด์ธ๋ค. ๋ชจ๋ธ์ ์ด๋ป๊ฒ ํ์ตํ๋์ง์ ๋ํ ์ฝ๋๋ง ์ฐธ๊ณ ํ๋ฉด ๋ ๊ฒ ๊ฐ๋ค.
+
+***
+
+## Learning Rate
+
+\\[ W := W - \alpha \nabla W \,\,\left(\alpha = learning\,\,rate\right)\\]
+
+์์ ๊ฐ์ gradient descent ์์์ $\alpha$๊ฐ learning rate(ํ์ต๋ฅ )์ด๋ค. ํ์ตํ๋ ๋น์จ์ด๋ผ๊ณ ๊ฐ๋จํ๊ฒ ์ธ๊ธํ๊ณ ๋์ด๊ฐ์๋๋ฐ, ์ด๋ฒ์๋ ์ด๋ค ์ํฅ์ ๋ฏธ์น๋์ง ํ์ธํด ๋ณด์.
+
+```python
+model = SoftmaxClassifierModel()
+optimizer = optim.SGD(model.parameters(), lr=1e5)
+train(model, optimizer, x_train, y_train)
+
+'''output
+Epoch 0/20 Cost: 1.280268
+Epoch 1/20 Cost: 976950.812500
+Epoch 2/20 Cost: 1279135.125000
+Epoch 3/20 Cost: 1198379.000000
+Epoch 4/20 Cost: 1098825.875000
+Epoch 5/20 Cost: 1968197.625000
+Epoch 6/20 Cost: 284763.250000
+Epoch 7/20 Cost: 1532260.125000
+Epoch 8/20 Cost: 1651504.000000
+Epoch 9/20 Cost: 521878.500000
+Epoch 10/20 Cost: 1397263.250000
+Epoch 11/20 Cost: 750986.250000
+Epoch 12/20 Cost: 918691.500000
+Epoch 13/20 Cost: 1487888.250000
+Epoch 14/20 Cost: 1582260.125000
+Epoch 15/20 Cost: 685818.062500
+Epoch 16/20 Cost: 1140048.750000
+Epoch 17/20 Cost: 940566.500000
+Epoch 18/20 Cost: 931638.250000
+Epoch 19/20 Cost: 1971322.625000
+'''
+```
+
+ํ์ต๋ฅ ์ด ๋๋ฌด ํฐ ๊ฒฝ์ฐ์ด๋ค. ํ์ต๋ฅ ์ด ํฌ๋ฉด ํ๋ฒ์ ํ์ตํ๋ ค๋ ์ ๋๊ฐ ์ปค์ง๋๋ฐ ์ด ์ ๋๊ฐ ๋๋ฌด ํฌ๊ฒ ๋๋ฉด, ์ ์ gradient๊ฐ ์ปค์ง๋ฉด์ ๋ฐ์ฐ(overshooting)ํ๊ฒ ๋๋ค.
+
+์ ์ฝ๋์ ๊ฒฐ๊ณผ๋ฅผ ๋ณด๋ฉด cost๊ฐ ํ์ตํ ์๋ก ์ปค์ง๊ณ ์๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
+
+```python
+model = SoftmaxClassifierModel()
+optimizer = optim.SGD(model.parameters(), lr=1e-10)
+train(model, optimizer, x_train, y_train)
+
+'''output
+Epoch 0/20 Cost: 3.187324
+Epoch 1/20 Cost: 3.187324
+Epoch 2/20 Cost: 3.187324
+Epoch 3/20 Cost: 3.187324
+Epoch 4/20 Cost: 3.187324
+Epoch 5/20 Cost: 3.187324
+Epoch 6/20 Cost: 3.187324
+Epoch 7/20 Cost: 3.187324
+Epoch 8/20 Cost: 3.187324
+Epoch 9/20 Cost: 3.187324
+Epoch 10/20 Cost: 3.187324
+Epoch 11/20 Cost: 3.187324
+Epoch 12/20 Cost: 3.187324
+Epoch 13/20 Cost: 3.187324
+Epoch 14/20 Cost: 3.187324
+Epoch 15/20 Cost: 3.187324
+Epoch 16/20 Cost: 3.187324
+Epoch 17/20 Cost: 3.187324
+Epoch 18/20 Cost: 3.187324
+Epoch 19/20 Cost: 3.187324
+'''
+```
+
+์ด๋ฒ์๋ ํ์ต๋ฅ ์ด ๋๋ฌด ์์ ๊ฒฝ์ฐ์ด๋ค. ์ด ๋๋ ๋ฐ์ฐํ ํ๋ฅ ์ ๊ฑฐ์ ์๊ฒ ์ง๋ง ํ์ต์ด ๋๋ฌด ๋๋ฆฌ๊ฑฐ๋ ์งํ์ด ๋์ง ์๋๋ค.
+
+์ ์ฝ๋์์ ๋ณด๋ฉด cost๊ฐ ๋ณํ์ง ์๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
+
+๊ทธ๋์ ์ ์ ํ ํ์ต๋ฅ ์ ์ฐพ๊ธฐ ์ํด์๋ ๋ฐ์ฐํ๋ฉด ์๊ฒ, cost๊ฐ ์ค์ด๋ค์ง ์์ผ๋ฉด ํฌ๊ฒ ์กฐ์ ํ๋ ๊ฒ์ด ๋ฐ๋์งํ๋ค.
+
+***
+
+## Data Preprocessing
+
+ํ์ต์ด ์ ๋ ์ ์๋๋ก data๋ฅผ ํ์ต ์ ์ ์ฒ๋ฆฌํด ์ฃผ๋ ๊ฒ์ Data Preprocessing(๋ฐ์ดํฐ ์ ์ฒ๋ฆฌ)์ด๋ผ๊ณ ํ๋ค.
+
+### Standardization
+
+์ด๋ฐ ์ ์ฒ๋ฆฌ ์ค ํ๋์ธ Standardization(์ ๊ทํ)์ ํ๋ฒ ์์๋ณด์. ์ ๊ทํ์ ์์ ๋ค์๊ณผ ๊ฐ์ด ์ฃผ์ด์ง๋ค.
+
+\\[ x'_j = \frac{x_j - \mu_j}{\sigma_j} \\]
+
+์ฌ๊ธฐ์ $\sigma$๋ ํ์ค ๋ถ์ฐ, $\mu$๋ ํ๊ท ์ ์๋ฏธํ๋ค. ์ด๋ค์ ์ฝ๋๋ก ํํํ๋ฉด ๋ค์๊ณผ ๊ฐ๋ค.
+
+```python
+mu = x_train.mean(dim=0)
+sigma = x_train.std(dim=0)
+norm_x_train = (x_train - mu) / sigma
+
+print(norm_x_train)
+
+'''output
+tensor([[-1.0674, -0.3758, -0.8398],
+ [ 0.7418, 0.2778, 0.5863],
+ [ 0.3799, 0.5229, 0.3486],
+ [ 1.0132, 1.0948, 1.1409],
+ [-1.0674, -1.5197, -1.2360]])
+'''
+```
+
+์ด๊ฑธ ์ด์ฉํด์ training์ ํ๋ ค๋ฉด ๋ค์๊ณผ ๊ฐ์ ๊ฒฐ๊ณผ๊ฐ ๋์จ๋ค.
+
+```
+train(model, optimizer, norm_x_train, y_train)
+
+'''output
+Epoch 0/20 Cost: 29785.091797
+Epoch 1/20 Cost: 18906.164062
+Epoch 2/20 Cost: 12054.674805
+Epoch 3/20 Cost: 7702.029297
+Epoch 4/20 Cost: 4925.733398
+Epoch 5/20 Cost: 3151.632568
+Epoch 6/20 Cost: 2016.996094
+Epoch 7/20 Cost: 1291.051270
+Epoch 8/20 Cost: 826.505310
+Epoch 9/20 Cost: 529.207336
+Epoch 10/20 Cost: 338.934204
+Epoch 11/20 Cost: 217.153549
+Epoch 12/20 Cost: 139.206741
+Epoch 13/20 Cost: 89.313782
+Epoch 14/20 Cost: 57.375462
+Epoch 15/20 Cost: 36.928429
+Epoch 16/20 Cost: 23.835772
+Epoch 17/20 Cost: 15.450428
+Epoch 18/20 Cost: 10.077808
+Epoch 19/20 Cost: 6.633700
+'''
+```
+
+์ ๊ทํ๊ฐ ํ๋ ค๋ ํ์ต์ ์ ๋ง ์ข์์ง๋ ํ์ตํ์ฌ ๊ฒฐ๊ณผ๋ฅผ ํ์ธํ๋ ๊ฒ์ด ๊ฐ์ฅ ์ข๊ฒ ์ง๋ง, ์ด๋ก ์ ์ผ๋ก ๋ถ์์ ํ๋ฉด data ์ฐจ์ ๊ฐ์ ๊ฐ์ ์ฐจ์ด๊ฐ ํฌ๋ค๊ฑฐ๋ ํ ๋ ์งํํ๋ฉด ์ข์ ํจ๊ณผ๋ฅผ ๋ณผ ์ ์๋ค.
+
+```python
+y = torch.FloatTensor([[0.0011, 2000, 1],
+ [0.001, 3000, 2],
+ [0.0001, 3000, 4],
+ [0.0021, 5000, 5],
+ [0.0131, 7000, 5],
+ [0.0211, 2000, 5],
+ [0.1211, 6000, 6],
+ [0.0001, 7000, 7]
+ ])
+```
+
+์๋ฅผ ๋ค์ด ์์ ๊ฐ์ target์ด ์๋ค. ์ด ๋ฐ์ดํฐ์ ๊ฐ์ ์ฐจ์๋ณ๋ก ๋น๊ตํด ๋ณด๋ฉด, ๊ทธ ์ฐจ์ด๊ฐ ๋๋ฌด ํฐ ๊ฒ์ ๋ณผ ์ ์๋ค.
+์ด๋ ๊ฒ ๋์ด๋ฒ๋ฆฌ๋ฉด 2๋ฒ์งธ ๊ฐ(1000 ๋จ์)์ ๋ํ loss๋ฅผ ์ต์ํ ํ๋ ๊ฒ์ด ํจ์ฌ ์ด๋์ด๋ผ๊ณ ์๊ฐํ์ฌ ๋ค๋ฅธ ๊ฐ๋ค์ ๋ํ ํ์ต์ด ์ ๋๋ก ๋์ง ์์ ์ ์๋ค.
+
+์ด๋ ์ ๊ทํ๋ฅผ ํตํด ์ ์ ํ ๋ฒ์๋ก ๊ฐ์ ์ก์์ฃผ๋ฉด ๋ชจ๋ ๋ฐ์ดํฐ๋ค์ด ๊ท ๋ฑํ๊ฒ ํ์ต์ด ๋ ์ ์๋ค.
\ No newline at end of file
diff --git a/_posts/2022-05-10-dlZeroToAll-PyTorch-7-2.markdown b/_posts/2022-05-10-dlZeroToAll-PyTorch-7-2.markdown
new file mode 100644
index 00000000000..dcd7ec02a41
--- /dev/null
+++ b/_posts/2022-05-10-dlZeroToAll-PyTorch-7-2.markdown
@@ -0,0 +1,162 @@
+---
+title: "๋ชจ๋๋ฅผ ์ํ ๋ฅ๋ฌ๋ 2 - Lab7-2: MNIST Intoduction"
+author: Kwon
+date: 2022-05-10T23:00:00 +0900
+categories: [pytorch, study]
+tags: [mnist]
+math: true
+mermaid: false
+---
+
+[๋ชจ๋๋ฅผ ์ํ ๋ฅ๋ฌ๋](https://deeplearningzerotoall.github.io/season2/lec_pytorch.html) Lab7-2: MNIST Intoduction ๊ฐ์๋ฅผ ๋ณธ ํ ๊ณต๋ถ๋ฅผ ๋ชฉ์ ์ผ๋ก ์์ฑํ ๊ฒ์๋ฌผ์
๋๋ค.
+
+***
+
+## MNIST dataset
+
+MNIST ๋ฐ์ดํฐ ์
์ ์ซ์ ์๊ธ์จ๋ฅผ ๋ชจ์๋์ ๋ฐ์ดํฐ ์
์ด๋ค. ์ฌ๋๋ค์ด ์ ์ ์ซ์๋ค์ ์ฐ์ฒด๊ตญ์์ ์๋์ผ๋ก ์ฒ๋ฆฌํ๊ธฐ ์ํด ๋ง๋ค์ด์ง ๊ฒ์ด ์ด ์
์ ์์์ ์ด๋ผ๊ณ ํ๋ค.
+
+MNIST๋ ๋ค์๊ณผ ๊ฐ์ด 28x28 ํฌ๊ธฐ์ ํฝ์
, 1๊ฐ์ gray channel ๊ทธ๋ฆฌ๊ณ 0 ~ 9์ ์ ์ label๋ก ์ด๋ฃจ์ด์ ธ ์๋ค.
+
+
+
+### torchvision
+
+minist๋ torchvision ๋ชจ๋์ ํตํด ๋ถ๋ฌ์จ๋ค. torchvision์ ์ฌ๋ฌ ๋ฐ์ดํฐ ์
์ด๋ ์ํคํ
์ฒ, ์ ์ฒ๋ฆฌ๋ฅผ ํ ์ ์๋ ๊ธฐ๋ฅ๋ค์ ๋ด์ฅํ๊ณ ์๋ ๋ชจ๋์ด๋ค.
+
+```python
+import torch
+import torchvision.datasets as dsets
+import torchvision.transforms as transforms
+import matplotlib.pyplot as plt
+
+# parameters
+training_epochs = 15
+batch_size = 100
+
+# MNIST dataset
+mnist_train = dsets.MNIST(root='MNIST_data/',
+ train=True, # train set
+ transform=transforms.ToTensor(),
+ download=True)
+
+mnist_test = dsets.MNIST(root='MNIST_data/',
+ train=False, # test set
+ transform=transforms.ToTensor(),
+ download=True)
+
+# minibatch
+data_loader - torch.utils.DataLoader(DataLoader=mnist_train, batch_size=batch_size, shuffle=True, drop_last=True)
+```
+
+mnist๋ 60000๊ฐ์ train set๊ณผ 10000๊ฐ์ test set์ผ๋ก ๊ตฌ์ฑ๋์ด ์๊ณ , train prameter์ boolean ๊ฐ์ ๋ฃ์ด ๊ฐ ์
์ ๋ถ๋ฌ์ฌ ์ ์๋ค.
+
+๋ค๋ฅธ ๋ฐ์ดํฐ ์
๋ค๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก `DataLoader`๋ฅผ ํตํด ๋ฏธ๋๋ฐฐ์น๋ฅผ ๋๋์ด ํ์ตํ ์ ์๋ค.
+
+### Model
+
+```python
+# MNIST data image of shape 28 * 28 = 784
+linear = torch.nn.Linear(784, 10, bias=True).to(device)
+
+# define cost/loss & optimizer
+criterion = torch.nn.CrossEntropyLoss().to(device)
+optimizer = torch.optim.SGD(linear.parameters(), lr=0.1)
+```
+
+๋ชจ๋ธ์ ์ ํ๋ชจ๋ธ์ ์ฌ์ฉํ๋ฉฐ ์ด๋ฏธ์ง์ ํฌ๊ธฐ๊ฐ 28x28์ด๋ฏ๋ก 28*28=784์ ์ฐจ์์ ๊ฐ์ง๋ ์
๋ ฅ์ ๋ฐ๋๋ก ์ ์ํ๋ค.
+
+### Train
+```python
+for epoch in range(training_epochs):
+ avg_cost = 0
+ total_batch = len(data_loader)
+
+ for X, Y in data_loader:
+ # reshape input image into [batch_size by 784]
+ # label is not one-hot encoded
+ X = X.view(-1, 28 * 28).to(device)
+ Y = Y.to(device)
+
+ hypothesis = linear(X)
+ cost = criterion(hypothesis, Y)
+
+ optimizer.zero_grad()
+ cost.backward()
+ optimizer.step()
+
+ avg_cost += cost / total_batch
+
+ print('Epoch:', '%04d' % (epoch + 1), 'cost =', '{:.9f}'.format(avg_cost))
+
+print('Learning finished')
+
+'''output
+Epoch: 0001 cost = 0.535468459
+Epoch: 0002 cost = 0.359274179
+Epoch: 0003 cost = 0.331187516
+Epoch: 0004 cost = 0.316578031
+Epoch: 0005 cost = 0.307158142
+Epoch: 0006 cost = 0.300180674
+Epoch: 0007 cost = 0.295130163
+Epoch: 0008 cost = 0.290851504
+Epoch: 0009 cost = 0.287417084
+Epoch: 0010 cost = 0.284379542
+Epoch: 0011 cost = 0.281825215
+Epoch: 0012 cost = 0.279800713
+Epoch: 0013 cost = 0.277809024
+Epoch: 0014 cost = 0.276154280
+Epoch: 0015 cost = 0.274440825
+Learning finished
+'''
+```
+
+[Lab4-2](/posts/dlZeroToAll-PyTorch-4_2/)์์ ํ์ตํ ๋ฐฉ์๊ณผ ๊ฐ์ด `data_loader`๋ฅผ for๋ฅผ ํตํด ๋ฐ๋ณตํ๋ฉฐ ์งํํ๋ค.
+
+์ด๋ ๊ธฐ์กด์ ์ด๋ฏธ์ง ๋ฐ์ดํฐ์ minibatch๋ `[batch_size, 1, 28, 28]`์ ํฌ๊ธฐ๋ฅผ ๊ฐ์ง๊ธฐ ๋๋ฌธ์, ๋ชจ๋ธ์ ์
๋ ฅ์ ๋ง๊ฒ `[batch_size, 28*28]`๋ก ๋ฐ๊ฟ์ฃผ๋ ๊ณผ์ ์ด ํ์ํ๋ค. ์ด ๊ณผ์ ์ ์ํด `X = X.view(-1, 28 * 28).to(device)`๋ก ๋ฐ์ดํฐ๋ฅผ ์ฌ๊ตฌ์ฑํ ๊ฒ์ ๋ณผ ์ ์๋ค.
+
+๋๋จธ์ง๋ ํ์ต์ ๊ธฐ์กด์ ํํ์ ๋์ผํ๋ค.
+
+### Test
+
+ํ
์คํธ๋ฅผ ์งํํ ๋์๋ ์ด๋ฏธ ํ์ต๋ ๋ชจ๋ธ์ ๋ํด ํ์ต์ด ์ ๋์๋์ง๋ฅผ ํ์ธํ๋ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ gradient descent๋ก ์ธํ ๊ฐ์ค์น ์
๋ฐ์ดํธ๊ฐ ๋๋ฉด ์๋๋ค.
+๊ทธ๋์ `with torch.no_grad()`{:.python} ์์์ ์
๋ฐ์ดํธ ๋๋ ๊ฒ์ ๋ง์ผ๋ฉด์ ํ
์คํธ๋ฅผ ์งํํ๋ค.
+
+```python
+# Test the model using test sets
+with torch.no_grad():
+ X_test = mnist_test.test_data.view(-1, 28 * 28).float().to(device)
+ Y_test = mnist_test.test_labels.to(device)
+
+ prediction = linear(X_test)
+ correct_prediction = torch.argmax(prediction, 1) == Y_test
+ accuracy = correct_prediction.float().mean()
+ print('Accuracy:', accuracy.item())
+
+ # Get one and predict
+ r = random.randint(0, len(mnist_test) - 1)
+ X_single_data = mnist_test.test_data[r:r + 1].view(-1, 28 * 28).float().to(device)
+ Y_single_data = mnist_test.test_labels[r:r + 1].to(device)
+
+ print('Label: ', Y_single_data.item())
+ single_prediction = linear(X_single_data)
+ print('Prediction: ', torch.argmax(single_prediction, 1).item())
+
+ plt.imshow(mnist_test.test_data[r:r + 1].view(28, 28), cmap='Greys', interpolation='nearest')
+ plt.show()
+
+'''output
+Accuracy: 0.8862999677658081
+Label: 8
+Prediction: 3
+'''
+```
+
+
+
+ํ์ตํ ๋ชจ๋ธ์ test ์
๋ ฅ์ ํต๊ณผ์์ผ ๋์จ ๊ฒฐ๊ณผ๋ฅผ `argmax`๋ฅผ ํตํด ๋ชจ๋ธ์ด ์์ธกํ label์ ๋ฝ์๋ผ ์ ์๋ค.
+์ดํ test์ ์ค์ label๊ณผ ๋น๊ตํ์ฌ ByteTensor๋ฅผ ์์ฑํ๊ณ , ๊ทธ ํ๊ท ์ ๊ตฌํด ์ ํ๋๋ฅผ ๊ณ์ฐํ ์ ์๋ค.
+
+ํ ๋ฐ์ดํฐ์ ๋ํ ์ถ๋ ฅ๊ฐ์ ์ถ๋ค๋ฉด test_data์ label์ ์ฌ๋ผ์ด์ฑ ํ์ฌ ๋ชจ๋ธ์ ๋ฃ์ด์ ๊ฒฐ๊ณผ๊ฐ์ ์ถ๋ ฅํ๋ ๊ฒ์ผ๋ก ํ์ธํ ์ ์๋ค.
+
+๊ทธ ๋ฐ์ดํฐ์ ๋ํ ์ด๋ฏธ์ง๋ `plt.imshow`๋ฅผ ํตํด ๋กน์ธํ ์ ์๋ค. cmap(color map)์ grey๋ก ์ค์ ํ๊ณ , interpolation(๋ณด๊ฐ)์ nearest๋ก ํ๋ฉด mnist ์ด๋ฏธ์ง๋ฅผ ์ป์ ์ ์๋ค.
\ No newline at end of file
diff --git a/_posts/2022-05-11-dlZeroToAll-PyTorch-8-1.markdown b/_posts/2022-05-11-dlZeroToAll-PyTorch-8-1.markdown
new file mode 100644
index 00000000000..a5cc3c3af69
--- /dev/null
+++ b/_posts/2022-05-11-dlZeroToAll-PyTorch-8-1.markdown
@@ -0,0 +1,120 @@
+---
+title: "๋ชจ๋๋ฅผ ์ํ ๋ฅ๋ฌ๋ 2 - Lab8-1: Perceptron"
+author: Kwon
+date: 2022-05-11T23:00:00 +0900
+categories: [pytorch, study]
+tags: [perceptron]
+math: true
+mermaid: false
+---
+
+[๋ชจ๋๋ฅผ ์ํ ๋ฅ๋ฌ๋](https://deeplearningzerotoall.github.io/season2/lec_pytorch.html) Lab8-1: Perceptron ๊ฐ์๋ฅผ ๋ณธ ํ ๊ณต๋ถ๋ฅผ ๋ชฉ์ ์ผ๋ก ์์ฑํ ๊ฒ์๋ฌผ์
๋๋ค.
+
+***
+
+## Neuron
+
+๋จผ์ ํผ์
ํธ๋ก ์ ์ปจ์
์ด ๋ ๋ด๋ฐ์ ๋ํด ์์๋ณด์. ๋ด๋ฐ์ ๋๋ฌผ์ ์ ๊ฒฝ๊ณ๋ฅผ ๊ตฌ์ฑํ๋ ์ธํฌ๋ก ๋ค์๊ณผ ๊ฐ์ ํํ์ด๋ค.
+
+
+
+๋ด๋ฐ์ ์๊ทน์ ์ ๊ธฐ ์ ํธ๋ฅผ ์ ๋ฌํ๋ ํต๋ก๋ผ๊ณ ํ ์ ์๋๋ฐ, ์ด๋ ๊ฐ๋๊ฐ ์ด๋ ์ ๋(threshold)๋ฅผ ๋์ด์๋ ์ ํธ๋ง์ ์ ๋ฌํ๋ค.
+
+***
+
+## Perceptron
+
+ํผ์
ํธ๋ก ์ ์ด๋ฐ ๋ด๋ฐ์ ์๋ ๋ฐฉ์์ ๋ฐ์ํ์ฌ ๋ง๋ ์ธ๊ณต์ ๊ฒฝ๋ง์ ํ ์ข
๋ฅ๋ก, ๋ค์์ ์
๋ ฅ์ ๋ฐ์ ํ๋์ ์ถ๋ ฅ์ ๋ด๋ณด๋ด๋ ๊ตฌ์กฐ์ด๋ค.
+
+
+
+์ฒ์ ํผ์
ํธ๋ก ์ด ๋ฑ์ฅํ์ ๋๋ AND, OR ๋ฌธ์ ๋ฅผ ์์ฃผ ์ ํด๊ฒฐํ์๋ค. ๋ค์ ๊ทธ๋ํ๋ฅผ ๋ณด๋ฉด AND, OR ๋ฌธ์ ๋ชจ๋ ์ ํ์ผ๋ก ์ ๋ถ๋ฆฌ๋๋ ๊ฒ์ ๋ณผ ์ ์๋ค.
+
+
+
+๊ทธ๋์ ๋ ๋ณต์กํ ๋ฌธ์ ๋ ํ์ด๋ผ ์ ์์ง ์์๊น ํ๋ฉฐ ๊ธฐ๋๋ฅผ ๋ฐ์์๋๋ฐ, XOR ๋ฌธ์ ๊ฐ ๋จ์ผ ํผ์
ํธ๋ก ์ผ๋ก ํด๊ฒฐํ ์ ์๋ค๋ ๊ฒ์ด ์ฆ๋ช
๋๋ฉด์ ํผ์
ํธ๋ก ์ฐ๊ตฌ์ ์ํ๊ธฐ๊ฐ ๋๋ํ๊ฒ ๋์๋ค.
+
+
+
+์ ๊ทธ๋ฆผ์ ๋ณด๋ฉด ์ด๋ค ์ง์ ์ ๊ทธ์ด๋ ํ๋์ ์ง์ ์ผ๋ก๋ XOR ๋ฌธ์ ๋ฅผ ๋ช
ํํ๊ฒ ๊ฐ๋ฅผ ์ ์๋ ๊ฒ์ ๋ณผ ์ ์๋ค.
+์ค์ ๋ก๋ ๊ทธ๋ฐ์ง ์ฝ๋๋ก ํ์ตํด ๋ณด๋ฉด์ ํ๋ฒ ํ์ธ ํด ๋ณด์.
+
+### XOR train code with single preceptron
+
+๋ชจ๋ธ์ ์ ํ์ ์๊ทธ๋ชจ์ด๋๋ฅผ ํ์ฑํ ํจ์๋ก ์ฌ์ฉํ๋๋ก ํ๊ณ , ์ด์ง๋ถ๋ฅ์ด๋ฏ๋ก ์์คํจ์๋ก `BECLoss`๋ฅผ ์ฌ์ฉํ๋ค.
+
+```python
+import torch
+
+device = 'cuda' if torch.cuda.is_available() else 'cpu'
+
+# ์๋ ๊ณ ์
+torch.manual_seed(777)
+if device == 'cuda':
+ torch.cuda.manual_seed_all(777)
+
+X = torch.FloatTensor([[0, 0], [0, 1], [1, 0], [1, 1]]).to(device)
+Y = torch.FloatTensor([[0], [1], [1], [0]]).to(device)
+```
+
+๋จผ์ XOR์ ๋ํ ๋ฐ์ดํฐ๋ฅผ ์ ์ํด ์ค๋ค.
+
+```python
+linear = torch.nn.Linear(2, 1, bias=True)
+sigmoid = torch.nn.Sigmoid()
+
+# Sequential๋ก ์ฌ๋ฌ ๋ชจ๋์ ๋ฌถ์ด ํ๋์ ๋ ์ด์ด๋ก ์ฌ์ฉ
+model = torch.nn.Sequential(linear, sigmoid).to(device)
+
+criterion = torch.nn.BCELoss().to(device)
+optimizer = torch.optim.SGD(model.parameters(), lr=1)
+
+'''output
+0 0.7273974418640137
+100 0.6931475400924683
+200 0.6931471824645996
+300 0.6931471824645996
+400 0.6931471824645996
+500 0.6931471824645996
+600 0.6931471824645996
+...
+9700 0.6931471824645996
+9800 0.6931471824645996
+9900 0.6931471824645996
+10000 0.6931471824645996
+'''
+```
+
+100epoch ๋ถํฐ loss๊ฐ ์ ๊ฐ์ํ์ง ์๋๋ 200๋ถํฐ๋ ์์ ๊ฐ์ํ์ง ์๋๋ค. ํ์คํ ํ์ธํด ๋ณด๊ธฐ ์ํด ์ ํ๋๋ฅผ ์ถ๋ ฅํด ๋ณด๋ฉด
+
+```python
+with torch.no_grad():
+ hypothesis = model(X)
+ predicted = (hypothesis > 0.5).float()
+ accuracy = (predicted == Y).float().mean()
+ print('\nHypothesis: ', hypothesis.detach().cpu().numpy(), '\nCorrect: ', predicted.detach().cpu().numpy(), '\nAccuracy: ', accuracy.item())
+
+'''output
+Hypothesis: [[0.5]
+ [0.5]
+ [0.5]
+ [0.5]]
+Correct: [[0.]
+ [0.]
+ [0.]
+ [0.]]
+Accuracy: 0.5
+'''
+```
+
+๋ชจ๋ hypothesis ๊ฒฐ๊ณผ๊ฐ 0.5๋ก ๋์ค๋ ๊ฒ์ ํ์ธํ ์ ์๋ค. ์ด์ฒ๋ผ ๋จ์ผ ํผ์
ํธ๋ก ์ผ๋ก๋ XOR์ ์ ๋๋ก ๋ถ๋ฅํ ์ ์๋ค.
+
+๋ค์ ํฌ์คํ
์์๋ XOR์ ํด๊ฒฐํ Multi Layer Percetron์ ๋ํด ์์๋ณด๊ฒ ๋ค.
+
+***
+
+#### Image source
+
+* Neuron: [https://commons.wikimedia.org/wiki/File:Neuron.svg](https://commons.wikimedia.org/wiki/File:Neuron.svg)
+
+* Perceptron: [https://commons.wikimedia.org/wiki/File:Rosenblattperceptron.png](https://commons.wikimedia.org/wiki/File:Rosenblattperceptron.png)
\ No newline at end of file
diff --git a/_posts/2022-05-12-dlZeroToAll-PyTorch-8-2.markdown b/_posts/2022-05-12-dlZeroToAll-PyTorch-8-2.markdown
new file mode 100644
index 00000000000..ffd102d8e12
--- /dev/null
+++ b/_posts/2022-05-12-dlZeroToAll-PyTorch-8-2.markdown
@@ -0,0 +1,163 @@
+---
+title: "๋ชจ๋๋ฅผ ์ํ ๋ฅ๋ฌ๋ 2 - Lab8-2: Multi Layer Perceptron"
+author: Kwon
+date: 2022-05-12T23:00:00 +0900
+categories: [pytorch, study]
+tags: [perceptron]
+math: true
+mermaid: false
+---
+
+[๋ชจ๋๋ฅผ ์ํ ๋ฅ๋ฌ๋](https://deeplearningzerotoall.github.io/season2/lec_pytorch.html) Lab8-2: Multi Layer Perceptron ๊ฐ์๋ฅผ ๋ณธ ํ ๊ณต๋ถ๋ฅผ ๋ชฉ์ ์ผ๋ก ์์ฑํ ๊ฒ์๋ฌผ์
๋๋ค.
+
+***
+
+## MLP(Multi Layer Perceptron)
+
+MLP๋ ๋จ์ผ ํผ์
ํธ๋ก ์ ์ฌ๋ฌ๊ฐ ์์ ๊ฒ์ผ๋ก ๋จ์ผ ํผ์
ํธ๋ก ์ผ๋ก ํด๊ฒฐํ์ง ๋ชปํ XOR๊ณผ ๊ฐ์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ์ ์๋ ๊ตฌ์กฐ์ด๋ค.
+
+
+
+์์ ๊ฐ์ด XOR ๋ฌธ์ ๋ ์ ์ 2๊ฐ ๊ทธ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์๋๋ฐ, ํ๋์ MLP๋ฅผ ํ์ค์ ์ผ๋ก ํ์ตํ ์ ์๋ ๋ฐฉ๋ฒ์ ์ฐพ์ง ๋ชปํ๋ค๊ฐ **backpropagation**์ด ๋ฑ์ฅํ๋ฉด์ ํ์ต์ด ๊ฐ๋ฅํด์ก๋ค.
+
+***
+
+## Data and Model
+
+```python
+import torch
+
+device = 'cuda' if torch.cuda.is_available() else 'cpu'
+
+# ์๋ ๊ณ ์
+torch.manual_seed(777)
+if device == 'cuda':
+ torch.cuda.manual_seed_all(777)
+
+X = torch.FloatTensor([[0, 0], [0, 1], [1, 0], [1, 1]]).to(device)
+Y = torch.FloatTensor([[0], [1], [1], [0]]).to(device)
+```
+
+์์ ๊ฐ์ด ๋ฐ์ดํฐ๋ฅผ XOR์ ๋ง๊ฒ ๋ง๋ค์ด ์ฃผ๊ณ , ๋ชจ๋ธ๋ ์์ฑํด ์ค๋ค. ์ด๋ฒ์๋ MLP๋ก ํ์ตํ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ ์ ํ ๋ ์ด์ด 2๊ฐ๋ฅผ ๋ง๋ค์ด `Sequential`๋ก ๋ฌถ์ด ์ค๋ค.
+loss๋ ๋ง์ฐฌ๊ฐ์ง๋ก ์ด์ง๋ถ๋ฅ์ด๋ฏ๋ก `BCELoss`๋ฅผ ์ฌ์ฉํ๋ค.
+
+```python
+linear1 = torch.nn.Linear(2, 2, bias=True)
+linear2 = torch.nn.Linear(2, 1, bias=True)
+sigmoid = torch.nn.Sigmoid()
+
+model = torch.nn.Sequential(linear1, sigmoid, linear2, sigmoid).to(device)
+
+criterion = torch.nn.BCELoss().to(device)
+optimizer = torch.optim.SGD(model.parameters(), lr=1)
+```
+
+***
+
+## Train
+
+ํ์ต ์ฝ๋์ ํํ๋ ๋์ผํ๋ค.
+
+```python
+for step in range(10001):
+ hypothesis = model(X)
+
+ # cost/loss function
+ cost = criterion(hypothesis, Y)
+
+ optimizer.zero_grad()
+ cost.backward()
+ optimizer.step()
+
+ if step % 100 == 0:
+ print(step, cost.item())
+
+'''output
+0 0.7434073090553284
+100 0.6931650638580322
+200 0.6931577920913696
+300 0.6931517124176025
+400 0.6931463479995728
+500 0.6931411027908325
+600 0.693135678768158
+700 0.6931295394897461
+800 0.693122148513794
+900 0.6931126713752747
+1000 0.6930999755859375
+...
+9700 0.001285637030377984
+9800 0.0012681199004873633
+9900 0.0012511102249845862
+10000 0.0012345188297331333
+'''
+```
+
+์กฐ๊ธ์ฉ์ด์ง๋ง ํ์คํ loss๊ฐ ์ค์ด๋๋ ๊ฒ์ ํ์ธํ ์ ์๋ค. ์ ํ๋๋ ํ๋ฒ ์ถ๋ ฅํด ๋ณด์.
+
+```python
+with torch.no_grad():
+ hypothesis = model(X)
+ predicted = (hypothesis > 0.5).float()
+ accuracy = (predicted == Y).float().mean()
+ print('\nHypothesis: ', hypothesis.detach().cpu().numpy(), '\nCorrect: ', predicted.detach().cpu().numpy(), '\nAccuracy: ', accuracy.item())
+
+'''output
+
+Hypothesis: [[0.00106364]
+ [0.99889404]
+ [0.99889404]
+ [0.00165861]]
+Correct: [[0.]
+ [1.]
+ [1.]
+ [0.]]
+Accuracy: 1.0
+'''
+```
+
+XOR์ ์์ฃผ ์ ๋ถ๋ฅํด ์ค๋ค. ์ด๋ฒ ํ์ต์์๋ 2๊ฐ์ ๋ ์ด์ด๋ง์ ์์์ง๋ง ์ฌ๋ฌ๊ฐ์ ๋ ์ด์ด, ๋๋ ๋ ๋
ธ๋๊ฐ ๋ง์ ๋ ์ด์ด๋ ๋ง๋ค ์ ์๋ค.
+
+### NN Wide Deep
+
+```python
+linear1 = torch.nn.Linear(2, 10, bias=True)
+linear2 = torch.nn.Linear(10, 10, bias=True)
+linear3 = torch.nn.Linear(10, 10, bias=True)
+linear4 = torch.nn.Linear(10, 1, bias=True)
+sigmoid = torch.nn.Sigmoid()
+
+model = torch.nn.Sequential(linear1, sigmoid, linear2, sigmoid, linear3, sigmoid, linear4, sigmoid).to(device)
+
+for step in range(10001):
+ optimizer.zero_grad()
+ hypothesis = model(X)
+
+ # cost/loss function
+ cost = criterion(hypothesis, Y)
+ cost.backward()
+ optimizer.step()
+
+ if step % 100 == 0:
+ print(step, cost.item())
+
+'''output
+0 0.6948983669281006
+100 0.6931558847427368
+200 0.6931535005569458
+300 0.6931513547897339
+400 0.6931493282318115
+500 0.6931473016738892
+600 0.6931453943252563
+700 0.6931434869766235
+800 0.6931416988372803
+900 0.6931397914886475
+1000 0.6931380033493042
+...
+9700 0.00016829342348501086
+9800 0.00016415018762927502
+9900 0.00016021561168599874
+10000 0.0001565046259202063
+'''
+```
+
+2๊ฐ์ ๋ ์ด์ด๋ฅผ ์์์ ๋(0.0012345188297331333)๋ณด๋ค loss๊ฐ ๋ ๋ฎ์์ง ๊ฒ์ ํ์ธํ ์ ์๋ค.
\ No newline at end of file
diff --git a/_posts/2022-05-13-backpropagation.markdown b/_posts/2022-05-13-backpropagation.markdown
new file mode 100644
index 00000000000..e4c263a4bb2
--- /dev/null
+++ b/_posts/2022-05-13-backpropagation.markdown
@@ -0,0 +1,54 @@
+---
+title: "Backpropagation"
+author: Kwon
+date: 2022-05-13T00:00:00 +0900
+categories: [background]
+tags: [backpropagation]
+math: true
+mermaid: false
+---
+
+***
+
+## Backpropagation
+
+๋ฐ์ดํฐ๋ฅผ ๋ ์ด์ด์ ๋
ธ๋๋ค์ ํต๊ณผ์ํค๋ฉด์ ์ค์ ๋ weight์ ๋ฐ๋ผ ์์ธก ๊ฒฐ๊ณผ๊ฐ์ ๊ณ์ฐํ๋ ๊ฒ์ **forward pass**๋ผ๊ณ ํ๋ค.
+
+
+
+MLP์ ๊ฒฐ๊ณผ๊ฐ์ ๋ง๋ค์ด ์ฃผ๋ ํ์์ ์ธ ๊ณผ์ ์ด์ง๋ง ์ด๊ฒ๋ง์ผ๋ก๋ weight๋ฅผ ๊ฐ์ ํ๋ฉด์ ํ์ต์ ์งํํ ์๊ฐ ์๋ค.
+
+์ด๊ฒ์ ๊ฐ๋ฅํ๊ฒ ํด์ค ๊ฒ์ด ๋ฐ๋ก backpropagation(์ค์ฐจ ์ญ์ ํ)์ด๋ค.
+
+์ญ์ ํ ์๊ณ ๋ฆฌ์ฆ์ chain rule์ ํตํด ๊ฐ ๋
ธ๋๋ค์ prediction๊ณผ target์ total error๋ฅผ ์ ๋ฌํ์ฌ $\nabla W$๋ฅผ ๊ณ์ฐํ ์ ์๊ฒ ํด ์ค๋ค.
+์ค์ฐจ ์ญ์ ํ๋ผ๋ ์ด๋ฆ์ด ๋ถ์ ๊ฒ๋ ์ด ๋๋ฌธ์ด๋ค.
+
+์ด๋ ๊ฒ ๊ณ์ฐํ $\nabla W$๋ฅผ ์ฌ์ฉํ์ฌ ๋ค์๊ณผ ๊ฐ์ด weight๋ฅผ ๊ฐ์ ํ๋ค.
+
+\\[W:=W-\alpha\nabla W\\]
+
+์์ธํ ๋ด์ฉ์ [๊ด๋ จ ํฌ์คํ
](/posts//dlZeroToAll-PyTorch-3/)์ ์ฐธ๊ณ ํ์
+
+์์์ ๋์๋ ๋คํธ์ํฌ์ ์ผ๋ถ๋ถ์ ๋ผ์ ์ญ์ ํ๊ฐ ์ด๋ป๊ฒ ์ ์ฉ๋๋์ง ํ์ธํด ๋ณด์.
+
+
+
+๋จผ์ ์ต์ข
output์ ๊ฐ์ฅ ๊ฐ๊น์ด $\nabla W_3$๋ถํฐ ๊ณ์ฐํ๋ค.
+
+\\[\nabla w_3=\frac{\partial cost}{\partial W_3}=\frac{\partial cost}{\partial o_1}\frac{\partial o_1}{\partial y_1}\frac{\partial y_1}{\partial W_3}\\]
+
+$\nabla W_3$๋ chain rule์ ํตํด ์์ ๊ฐ์ด ๋ฏธ๋ถ์ด ๋ฐ๋ก ๋๋ ํ์์ผ๋ก ํํํ ์ ์๋ค. ํ ๋ฒ ๋ ๊ฑฐ์ฌ๋ฌ ์ฌ๋ผ๊ฐ ๋ณด์.
+
+์ด๋ฒ์๋ $\nabla W_1$๊ณผ $\nabla W_2$๋ฅผ ๊ตฌํ ์ฐจ๋ก์ด๋ค. ๋จผ์ $\nabla X_1$์ ๊ตฌํด๋ณด์.
+
+\\[\frac{\partial cost}{\partial W_1}=\frac{\partial cost}{\partial y_1}\frac{\partial y_1}{\partial h_{z_2}}\frac{\partial h_{z_2}}{\partial z_2}\frac{\partial z_2}{\partial W_1}\\]
+
+๋ง์ฐฌ๊ฐ์ง๋ก chain rule์ ํตํด ๊ณ์ฐํ๋ค. $\frac{\partial cost}{\partial y_1}$์ $\nabla X_3$์ ๊ตฌํ ๋ ๊ตฌํ์๊ธฐ ๋๋ฌธ์ ๋ชจ๋ ํธ๋ฏธ๋ถ์ด ๊ณ์ฐ ๊ฐ๋ฅํ๋ค.
+
+$\nabla W_2$๋ ์ฌ๊ธฐ์ $W_1$์ $W_2๋ก ๋ฐ๊ฟ์ฃผ๊ธฐ๋ง ํ๋ฉด ๋๋ค.$
+
+\\[\frac{\partial cost}{\partial W_2}=\frac{\partial cost}{\partial y_1}\frac{\partial y_1}{\partial h_{z_2}}\frac{\partial h_{z_2}}{\partial z_2}\frac{\partial z_2}{\partial W_2}\\]
+
+์ต์ข
output์ด ์์ด๋ forward ๋์ค์ ๊ณ์ฐํ ์ ์๋ ํธ๋ฏธ๋ถ๋ค์ forward pass๋ฅผ ํ๋ฉด์ ๋ฏธ๋ฆฌ ๊ณ์ฐํ์ฌ ์ ์ฅํด ๋๊ณ ์ฌ์ฉํ๋ค.
+
+์ด๋ฒ ์์ ์์๋ ์์ฃผ ๊ฐ๋จํ ๋คํธ์ํฌ์ ๋ํด ๋ค๋ค์ง๋ง ๋ ๊น๊ณ ๋์ ๋คํธ์ํฌ์ ๋ํด์๋ ๋๊ฐ์ด ์ ์ฉํ ์ ์๋ค.
\ No newline at end of file
diff --git a/_posts/2022-05-14-dlZeroToAll-PyTorch-9-1.markdown b/_posts/2022-05-14-dlZeroToAll-PyTorch-9-1.markdown
new file mode 100644
index 00000000000..a8546f869f4
--- /dev/null
+++ b/_posts/2022-05-14-dlZeroToAll-PyTorch-9-1.markdown
@@ -0,0 +1,189 @@
+---
+title: "๋ชจ๋๋ฅผ ์ํ ๋ฅ๋ฌ๋ 2 - Lab9-1:ReLU"
+author: Kwon
+date: 2022-05-14T00:00:00 +0900
+categories: [pytorch, study]
+tags: [relu, activation, optimizer, gradient-vanishing]
+math: true
+mermaid: false
+---
+
+[๋ชจ๋๋ฅผ ์ํ ๋ฅ๋ฌ๋](https://deeplearningzerotoall.github.io/season2/lec_pytorch.html) Lab9-1: ReLU ๊ฐ์๋ฅผ ๋ณธ ํ ๊ณต๋ถ๋ฅผ ๋ชฉ์ ์ผ๋ก ์์ฑํ ๊ฒ์๋ฌผ์
๋๋ค.
+
+***
+
+## Problem of Sigmoid
+
+์๊ทธ๋ชจ์ด๋ ํจ์์ ๋ฌธ์ ๋ [backpropagation](/posts/backpropagation/)๊ณผ์ ์์ ๋ฐ์ํ๋ค.
+backpropagation์ ์ํํ ๋ activation์ ๋ฏธ๋ถ๊ฐ ๊ณฑํด๊ฐ๋ฉด์ ์ฌ์ฉํ๊ฒ ๋๋๋ฐ ์ด๋ ๊ธฐ์ธ๊ธฐ๊ฐ ์์ค๋๋ **gradient vanishing**๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ค. ๋ค์ ๊ทธ๋ฆผ์ ์๊ทธ๋ชจ์ด๋ ํจ์์ ๊ทธ ๋ฏธ๋ถ ํจ์์ ๊ทธ๋ํ์ด๋ค.
+
+
+
+$x$ ๊ฐ์ด 0์์ ๋ฉ์ด์ง์๋ก ๋ฏธ๋ถ๊ฐ์ด 0์ ์๋ ดํ๋ ๊ฒ์ ํ์ธํ ์ ์๋ค. ํ๋๋ฒ์ ๊ณฑ์ผ๋ก 0์ด ๋์ง๋ ์์์ง๋ผ๋ ์ฌ๋ฌ๋ฒ ๋ฐ๋ณตํ๋ฉด์ ์ํํ๊ฒ ๋๋ฉด ๊ณฑ์ด ์ฌ๋ฌ๋ฒ ์ค์ฒฉ๋์ด 0์ผ๋ก ์๋ ดํ๊ฒ ๋ ๊ฒ์ด๋ค.
+
+๊ทธ๋ ๊ฒ ๋๋ฉด ์ ์์ ์ธ ํ์ต์ด ๋ถ๊ฐ๋ฅํ๋ค. ์ด๋ฐ ์๊ทธ๋ชจ์ด๋์ ๋จ์ ์ ํด๊ฒฐํ๊ธฐ ์ํด ๋์จ ๊ฒ์ด **ReLU**์ด๋ค.
+
+***
+
+## ReLU
+
+ReLU์ ์๊ณผ ๋ชจ์ต์ ๋ค์๊ณผ ๊ฐ์ด ๊ฐ๋จํ ์ฃผ์ด์ง๋ค.
+
+\\[f(x)=max(0,x)\\]]
+
+
+
+์ด๋ ๊ฒ activation์ ๊ตฌ์ฑํ ๊ฒฝ์ฐ 0 ์ด์์ ๊ฐ๋ค์ ๋ํด์๋ ๋ฏธ๋ถ๊ฐ์ด 1์ด ๋์ ๊ธฐ์ธ๊ธฐ ์์ค์ ๋ง์ ์ ์๋ค.
+
+PyTorch๋ ์ด๋ฐ activation๋ค์ `torch.nn.ReLU` ๋ฑ์ผ๋ก ๋ถ๋ฌ ์ฌ์ฉํ ์ ์์ผ๋ฉฐ ๋ง์ด ์ฌ์ฉํ๋ ๊ฒ๋ค์ ์๋์ ๊ฐ๋ค.
+
+```python
+torch.nn.ReLU
+torch.nn.LeakyReLU
+torch.nn.Sigmoid
+torch.nn.Tanh
+```
+
+***
+
+## Optimizer
+
+์ด๋ฒ ๊ฐ์์์๋ ์ฌ๋ฌ optimizer์ ๋ํด์๋ ์๊ฐ๋ฅผ ํ๋๋ฐ, `torch.optim`์ผ๋ก ์ฌ์ฉํ ์ ์๋ optimizer๋ก๋ ์ฐ๋ฆฌ๊ฐ ๊ณ์ ์ฌ์ฉํ SGD ๋ง๊ณ ๋ ๋ค์๊ณผ ๊ฐ์ด ๋ง์ด ์กด์ฌํ๋ค.
+
+```python
+torch.optim.SGD
+torch.optim.Adadelta
+torch.optim.Adagrad
+torch.optim.Adam
+torch.optim.SparseAdam
+torch.optim.Adamax
+torch.optim.ASGD
+torch.optim.LBFGS
+torch.optim.RMSprop
+torch.optim.Rprop
+```
+
+optimizer์ ๋ํด์๋ ์ถํ์ ํ๋ฒ ์์ธํ ๊ณต๋ถํด ๋ณด๊ณ ๋ฐ๋ก ํฌ์คํ
ํ๋ ค๊ณ ํ๋ค.
+
+***
+
+## Train
+
+[Lab7-2](/posts/dlZeroToAll-PyTorch-7-2/)์์ ํ๋ mnist ํ์ต์ adam optimizer๋ก ํ ๋ฒ ํ์ตํด๋ณด๊ณ , ๋ค์ค ๋ ์ด์ด์ ReLU๋ฅผ ์ ์ฉํด์ ๋ ํ๋ฒ ํ์ตํด ๋ณด๊ฒ ๋ค.
+
+### Adam
+
+๋ฐ์ดํฐ๋ ๋ชจ๋ธ์ ์ ์ํ๋ ๊ฒ์ ๋ชจ๋ ์ด์ ๊ณผ ๋์ผํ๊ธฐ ๋๋ฌธ์ ๋ฌ๋ผ์ง ๋ถ๋ถ์ ์ด์ ์ ๋ง์ถฐ ์ฝ๋๋ฅผ ํ ๋ฒ ๋ณด๋๋ก ํ์.
+
+```python
+criterion = torch.nn.CrossEntropyLoss().to(device)
+optimizer = torch.optim.Adam(linear.parameters(), lr=learning_rate) # Adam optimizer
+
+total_batch = len(data_loader)
+for epoch in range(training_epochs):
+ avg_cost = 0
+
+ for X, Y in data_loader:
+ # reshape input image into [batch_size by 784]
+ # label is not one-hot encoded
+ X = X.view(-1, 28 * 28).to(device)
+ Y = Y.to(device)
+
+ optimizer.zero_grad()
+ hypothesis = linear(X)
+ cost = criterion(hypothesis, Y)
+ cost.backward()
+ optimizer.step()
+
+ avg_cost += cost / total_batch
+
+ print('Epoch:', '%04d' % (epoch + 1), 'cost =', '{:.9f}'.format(avg_cost))
+
+print('Learning finished')
+
+'''output
+Epoch: 0001 cost = 4.848181248
+Epoch: 0002 cost = 1.464641452
+Epoch: 0003 cost = 0.977406502
+Epoch: 0004 cost = 0.790303528
+Epoch: 0005 cost = 0.686833322
+Epoch: 0006 cost = 0.618483305
+Epoch: 0007 cost = 0.568978667
+Epoch: 0008 cost = 0.531290889
+Epoch: 0009 cost = 0.501056492
+Epoch: 0010 cost = 0.476258427
+Epoch: 0011 cost = 0.455025405
+Epoch: 0012 cost = 0.437031567
+Epoch: 0013 cost = 0.421489984
+Epoch: 0014 cost = 0.408599794
+Epoch: 0015 cost = 0.396514893
+Learning finished
+'''
+```
+
+๋ฌ๋ผ์ง ์ ์ `optimizer`๋ฅผ ์ ์ํ ๋ `torch.optim.Adam`์ ์ฌ์ฉํ์๋ค๋ ๊ฒ ๋ฟ์ด๋ค.
+
+### MLP with ReLU
+
+```python
+# nn layers
+linear1 = torch.nn.Linear(784, 256, bias=True)
+linear2 = torch.nn.Linear(256, 256, bias=True)
+linear3 = torch.nn.Linear(256, 10, bias=True)
+relu = torch.nn.ReLU()
+
+# Initialization
+torch.nn.init.normal_(linear1.weight)
+torch.nn.init.normal_(linear2.weight)
+torch.nn.init.normal_(linear3.weight)
+
+# model
+model = torch.nn.Sequential(linear1, relu, linear2, relu, linear3).to(device)
+```
+
+์ฌ๊ธฐ์ ๋ฌ๋ผ์ง ๊ฒ์ ๋ค์ค ๋ ์ด์ด๋ฅผ ์๊ณ , ํ์ฑํ ํจ์๋ก ReLU๋ฅผ ์ฌ์ฉํ์ฌ ๋ชจ๋ธ์ ๊ตฌ์ฑํ๋ค๋ ๊ฒ์ด๋ค.
+
+ํ์ต ๊ฒฐ๊ณผ๋ ๋ค์๊ณผ ๊ฐ๋ค.
+
+```python
+total_batch = len(data_loader)
+for epoch in range(training_epochs):
+ avg_cost = 0
+
+ for X, Y in data_loader:
+ # reshape input image into [batch_size by 784]
+ # label is not one-hot encoded
+ X = X.view(-1, 28 * 28).to(device)
+ Y = Y.to(device)
+
+ optimizer.zero_grad()
+ hypothesis = model(X)
+ cost = criterion(hypothesis, Y)
+ cost.backward()
+ optimizer.step()
+
+ avg_cost += cost / total_batch
+
+ print('Epoch:', '%04d' % (epoch + 1), 'cost =', '{:.9f}'.format(avg_cost))
+
+print('Learning finished')
+
+'''output
+Epoch: 0001 cost = 129.325607300
+Epoch: 0002 cost = 36.169139862
+Epoch: 0003 cost = 23.025590897
+Epoch: 0004 cost = 16.021036148
+Epoch: 0005 cost = 11.609578133
+Epoch: 0006 cost = 8.560424805
+Epoch: 0007 cost = 6.369730949
+Epoch: 0008 cost = 4.782918930
+Epoch: 0009 cost = 3.604729652
+Epoch: 0010 cost = 2.682321310
+Epoch: 0011 cost = 2.086567640
+Epoch: 0012 cost = 1.640438557
+Epoch: 0013 cost = 1.297079921
+Epoch: 0014 cost = 1.083126664
+Epoch: 0015 cost = 0.751341939
+Learning finished
+'''
+```
\ No newline at end of file
diff --git a/_posts/2022-05-14-dlZeroToAll-PyTorch-9-2.markdown b/_posts/2022-05-14-dlZeroToAll-PyTorch-9-2.markdown
new file mode 100644
index 00000000000..13363e3f2be
--- /dev/null
+++ b/_posts/2022-05-14-dlZeroToAll-PyTorch-9-2.markdown
@@ -0,0 +1,139 @@
+---
+title: "๋ชจ๋๋ฅผ ์ํ ๋ฅ๋ฌ๋ 2 - Lab9-2:Weight Initialization"
+author: Kwon
+date: 2022-05-14T01:00:00 +0900
+categories: [pytorch, study]
+tags: [weight-init, rbm, dbn, xavier, he-init]
+math: true
+mermaid: false
+---
+
+[๋ชจ๋๋ฅผ ์ํ ๋ฅ๋ฌ๋](https://deeplearningzerotoall.github.io/season2/lec_pytorch.html) Lab9-2:Weight Initialization ๊ฐ์๋ฅผ ๋ณธ ํ ๊ณต๋ถ๋ฅผ ๋ชฉ์ ์ผ๋ก ์์ฑํ ๊ฒ์๋ฌผ์
๋๋ค.
+
+***
+
+## Weight Initialization
+
+์ด๊ธฐ weight์ ์ค์ ์ ํฌ๊ฒ ์ค์ํ์ง ์์ ๋ณด์ด์ง๋ง ์ค์ ๋ก๋ ํฐ ์ํฅ์ ๋ฏธ์น๋ค.
+
+
+
+์ ๊ทธ๋ํ์์๋ ๋ณผ ์ ์๋ฏ์ด ์ ์ ํ ์ด๊ธฐํ ๊ธฐ๋ฒ์ผ๋ก ์ด๊ธฐํ๋ฅผ ํด์ค ๊ฒฝ์ฐ(N์ด ๋ถ์ด์๋ ๊ณก์ ) ์ค์ ๋ก ์ค์ฐจ๊ฐ ์ค์ด๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
+
+***
+
+## DBN(Deep Belief Network)
+
+### RBM(Restricted Boltzmann Machine)
+
+DBN์ ์๊ธฐ ์ ์ ๋จผ์ RBM์ ์๊ณ ๊ฐ์ผ ํ๋ค.
+
+ ๋ ์ด์ด๋ค์ ์ ์ฐ๊ฒฐ ๊ตฌ์กฐ์ด๋ค. ์ผ์ข
์ encode(์์ชฝ ๋ฐฉํฅ์ผ๋ก ์งํ), decode(์๋์ชฝ ๋ฐฉํฅ์ผ๋ก ์งํ)๋ฅผ ์ํํ๋ค๊ณ ๋ณผ ์๋ ์๋ค.
+
+### DBN
+
+DBN์ RBM์ ํตํด ์ ์ ํ weight๋ฅผ ์ฐพ์ ์ด๊ธฐํํ๋ค.
+
+
+
+์์ ๊ฐ์ด ๊ฐ ๋ ์ด์ด๋ง๋ค RBM์ ๊ตฌ์ฑํ์ฌ ๋ค์ ๋ ์ด์ด๋ก ํ ๋ฒ ๊ฐ๋ค๊ฐ ๋ค์ ๋์์ ๋ด์ ์ ๋ณต์์ด ๋๋ weight๋ฅผ ์ฐพ์ ๊ทธ๊ฒ์ผ๋ก ์ด๊ธฐํํ์ฌ ํ์ต์ ์ฌ์ฉํ๋ค.
+์ด์ ์ ํฌ์คํธ์์ ์์๋ดค๋ [Stacking Autoencoder](/posts/autoencoders-3/)๋ ์ด DBN์ ํ ์ข
๋ฅ์ด๋ค.
+
+ํ์ง๋ง ์์ฆ์ ๊ฑฐ์ ์ฌ์ฉํ์ง ์๋ ๋ฐฉ๋ฒ์ด๋ค.
+
+***
+
+## Xavier / He Initialization
+
+์ด ๋๊ฐ์ง ๋ฐฉ๋ฒ์ด ํ์ฌ ๋ง์ด ์ฌ์ฉ๋๋ ๋ฐฉ๋ฒ์ธ๋ฐ, ์ด ๋ฐฉ์๋ค์ DBN๊ณผ ๊ฐ์ด ๋ณต์กํ ํ์ต๋ค์ด ํ์ํ์ง ์๋ค๋ ๊ฒ์ด๋ค.
+
+๋จ์ํ ๋ถํฌ์ ๋ฐ๋ผ ์๋ ๊ณต์์ ์ ์ฉํ์ฌ in/out์ node ์๋ฅผ ํตํด ๊ณ์ฐํ ๊ฐ์ ์ด์ฉํ์ฌ ์ด๊ธฐํํ๋ค.
+
+
+
+```python
+def xavier_uniform_(tensor, gain=1):
+ fan_in, fan_out = _calculate_fan_in_and_fan_out(tensor)
+ std = gain * math.sqrt(2.0 / (fan_in + fan_out))
+ a = math.sqrt(3.0) * std # Calculate uniform bounds from standard deviation
+ with torch.no_grad():
+ return tensor.uniform_(-a, a)
+ ```
+
+ ์ค์ xavier์ ๊ตฌํ์ ๋ณด๋ฉด ์์ ๊ฐ์ด ๊ณต์ ๊ทธ๋๋ก ๊ณ์ฐํ์ฌ returnํด ์ฃผ๋ ๊ฒ์ ๋ณผ ์ ์๋ค.
+
+***
+
+## Train with Xavier
+
+Xavier๋ฅผ ํตํด ์์ ํ์ตํด๋ดค๋ MLP๋ฅผ ํ์ตํ๋ ค๋ฉด ๋ค์ ๋ถ๋ถ๋ง ๋ณ๊ฒฝํด ์ฃผ๋ฉด ๋๋ค.
+
+```python
+# nn layers
+linear1 = torch.nn.Linear(784, 256, bias=True)
+linear2 = torch.nn.Linear(256, 256, bias=True)
+linear3 = torch.nn.Linear(256, 10, bias=True)
+relu = torch.nn.ReLU()
+
+# xavier initialization
+torch.nn.init.xavier_uniform_(linear1.weight) # not torch.nn.init.normal_()
+torch.nn.init.xavier_uniform_(linear2.weight)
+torch.nn.init.xavier_uniform_(linear3.weight)
+
+'''output
+Parameter containing:
+tensor([[-0.0215, -0.0894, 0.0598, ..., 0.0200, 0.0203, 0.1212],
+ [ 0.0078, 0.1378, 0.0920, ..., 0.0975, 0.1458, -0.0302],
+ [ 0.1270, -0.1296, 0.1049, ..., 0.0124, 0.1173, -0.0901],
+ ...,
+ [ 0.0661, -0.1025, 0.1437, ..., 0.0784, 0.0977, -0.0396],
+ [ 0.0430, -0.1274, -0.0134, ..., -0.0582, 0.1201, 0.1479],
+ [-0.1433, 0.0200, -0.0568, ..., 0.0787, 0.0428, -0.0036]],
+ requires_grad=True)
+'''
+```
+
+`torch.nn.init.normal_()`๋์ `torch.nn.init.xavier_uniform_()`์ ์ฌ์ฉํ์ฌ ์ด๊ธฐํ๋ฅผ ์งํํ๋ค.
+
+### Deep
+
+๋ ๊น์ ๋คํธ์ํฌ๋ ๋ง์ฐฌ๊ฐ์ง๋ก ๋ ์ด์ด๋ง๋ค `torch.nn.init.xavier_uniform_()`์ ์ฌ์ฉํด ์ฃผ๋ฉด ๋๋ค.
+
+```python
+# nn layers
+linear1 = torch.nn.Linear(784, 512, bias=True)
+linear2 = torch.nn.Linear(512, 512, bias=True)
+linear3 = torch.nn.Linear(512, 512, bias=True)
+linear4 = torch.nn.Linear(512, 512, bias=True)
+linear5 = torch.nn.Linear(512, 10, bias=True)
+relu = torch.nn.ReLU()
+
+# xavier initialization
+torch.nn.init.xavier_uniform_(linear1.weight)
+torch.nn.init.xavier_uniform_(linear2.weight)
+torch.nn.init.xavier_uniform_(linear3.weight)
+torch.nn.init.xavier_uniform_(linear4.weight)
+torch.nn.init.xavier_uniform_(linear5.weight)
+
+'''output
+Parameter containing:
+tensor([[-0.0565, 0.0423, -0.0155, ..., 0.1012, 0.0459, -0.0191],
+ [ 0.0772, 0.0452, -0.0638, ..., 0.0476, -0.0638, 0.0528],
+ [ 0.0311, -0.1023, -0.0701, ..., 0.0412, -0.1004, 0.0738],
+ ...,
+ [ 0.0334, 0.0187, -0.1021, ..., 0.0280, -0.0583, -0.1018],
+ [-0.0506, -0.0939, -0.0467, ..., -0.0554, -0.0325, 0.0640],
+ [-0.0183, -0.0123, 0.1025, ..., -0.0214, 0.0220, -0.0741]],
+ requires_grad=True)
+'''
+```
+
+***
+
+#### Image Source
+
+* RBM: [https://en.wikipedia.org/wiki/File:Restricted-boltzmann-machine.svg](https://en.wikipedia.org/wiki/File:Restricted-boltzmann-machine.svg)
+
+* DBN: [http://www.dmi.usherb.ca/~larocheh/publications/deep-nets-icml-07.pdf](http://www.dmi.usherb.ca/~larocheh/publications/deep-nets-icml-07.pdf)
\ No newline at end of file
diff --git a/_posts/2022-05-15-dlZeroToAll-PyTorch-9-3.markdown b/_posts/2022-05-15-dlZeroToAll-PyTorch-9-3.markdown
new file mode 100644
index 00000000000..9632df16270
--- /dev/null
+++ b/_posts/2022-05-15-dlZeroToAll-PyTorch-9-3.markdown
@@ -0,0 +1,156 @@
+---
+title: "๋ชจ๋๋ฅผ ์ํ ๋ฅ๋ฌ๋ 2 - Lab9-3:Dropout"
+author: Kwon
+date: 2022-05-15T00:00:00 +0900
+categories: [pytorch, study]
+tags: [dropout, overfitting]
+math: true
+mermaid: false
+---
+
+[๋ชจ๋๋ฅผ ์ํ ๋ฅ๋ฌ๋](https://deeplearningzerotoall.github.io/season2/lec_pytorch.html) Lab9-3: Dropout ๊ฐ์๋ฅผ ๋ณธ ํ ๊ณต๋ถ๋ฅผ ๋ชฉ์ ์ผ๋ก ์์ฑํ ๊ฒ์๋ฌผ์
๋๋ค.
+
+***
+
+## Dropout
+
+[lab7-1](/posts/dlZeroToAll-PyTorch-7-1/)์์ ์์๋ณธ ๊ฒ์ฒ๋ผ ํ์ต์ ํ๋ค๋ณด๋ฉด train set์ ๋๋ฌด ๊ณผ์ ํฉ(overfitting)๋๋ ๊ฒฝ์ฐ๊ฐ ๋ฐ์ํ๋ค.
+
+์ด๋ ์ธ๊ธํ ๊ณผ์ ํฉ์ ๋์ด์ฃผ๊ธฐ ์ํ ๋ฐฉ๋ฒ์๋ ๋ค์๊ณผ ๊ฐ์ ๊ฒ๋ค์ด ์์๋ค.
+
+* Early Stoping: valid set์ loss๊ฐ ์ค์ด๋ค์ง ์์ ๋ ํ์ต์ ์ค์งํ๋ค.
+* Reducing Network Size
+* Weight Decay: weight๊ฐ ๋๋ฌด ์ปค์ง์ง ์๋๋ก wight๊ฐ ์ปค์ง์๋ก ํจ๊ป ์ปค์ง๋ penalty๋ฅผ ๋ถ์ฌํ๋ค.
+* Dropout: node์ ์ผ๋ถ๋ฅผ ๊บผ์ ํ์ตํ๋ node๋ฅผ ์ค์ธ๋ค.
+* Batch Normalization: ํ์ต ์ค์ ๋ฐฐ์น ๋จ์๋ก ์ ๊ทํ ํ๋ ๊ฒ
+
+์ค๋์ ์ด ์ค์์ dropout์ ๋ํด ์์๋ณด๋ ค ํ๋ค.
+
+dropout์ ์ผ์ ํ๋ฅ ์ ๋ฐ๋ผ ๋ ์ด์ด์ node๋ฅผ ๋๋ฉด์ ํ์ต์ ์งํํ๋ ๊ฒ์ ๋งํ๋ค.
+์ฆ, ๋ ์ด์ด์ ์ผ๋ถ node๋ฅผ ํ์ต์ ์ฌ์ฉํ์ง ์๋ ๊ฒ์ด๋ค.
+
+
+
+์ ๊ทธ๋ฆผ์ฒ๋ผ ๊ฐ ๋
ธ๋๋ค์ ์ผ์ ํ ํ๋ฅ ๋ก ๋นํ์ฑํ ํ๋ค. ์ด๋ฐ ์์ผ๋ก ํ์ต์ ํ๊ฒ ๋๋ฉด ๊ณผํ๊ฒ ํ์ต๋๋ ๊ฒ์ ๋ง์ ๊ณผ์ ํฉ ๋ชจ๋ธ์ด ๋ง๋ค์ด์ง๋ ๊ฒ์ ๋ง์ ์ ์์ ๋ฟ๋ง ์๋๋ผ.
+๊ฐ ์ํ๋ง๋ค ํ๋ฅ ์ ์ผ๋ก ๊บผ์ง๊ณ ์ผ์ง๋ node๊ฐ ๋ฌ๋ผ์ง๊ธฐ ๋๋ฌธ์ ๋ค์ํ ๋คํธ์ํฌ๋ก ํ์ตํ์ฌ ์์๋ธํ ํจ๊ณผ๋ ์ป์ ์ ์์ด ์ฑ๋ฅ์ ํฅ์์ผ๋ก๋ ์ด๋ฃจ์ด์ง ์ ์๋ค๊ณ ํ๋ค.
+
+***
+
+## Train with MNIST
+
+ํ์ตํ๋ ์ฝ๋๋ ๋ชจ๋ธ์ ๊ตฌ์ฑํ ๋ dropout์ด ์ถ๊ฐ๋ ๊ฒ ๋ง๊ณ ๋ ํฐ ๋ณํ๊ฐ ์์ง๋ง ์ฃผ์ํด์ผ ํ ์ ์ด ์๋ค. ๋จผ์ ์ฝ๋๋ฅผ ๋ณด์
+
+```python
+# nn layers
+linear1 = torch.nn.Linear(784, 512, bias=True)
+linear2 = torch.nn.Linear(512, 512, bias=True)
+linear3 = torch.nn.Linear(512, 512, bias=True)
+linear4 = torch.nn.Linear(512, 512, bias=True)
+linear5 = torch.nn.Linear(512, 10, bias=True)
+relu = torch.nn.ReLU()
+dropout = torch.nn.Dropout(p=drop_prob)
+
+# xavier initialization
+torch.nn.init.xavier_uniform_(linear1.weight)
+torch.nn.init.xavier_uniform_(linear2.weight)
+torch.nn.init.xavier_uniform_(linear3.weight)
+torch.nn.init.xavier_uniform_(linear4.weight)
+torch.nn.init.xavier_uniform_(linear5.weight)
+
+# model
+model = torch.nn.Sequential(linear1, relu, dropout,
+ linear2, relu, dropout,
+ linear3, relu, dropout,
+ linear4, relu, dropout,
+ linear5).to(device)
+```
+
+์ฌ๊ธฐ๊น์ง๋ `Sequential`ํตํด ๋ชจ๋ธ์ ๊ตฌ์ฑํ ๋ dropout์ ์ถ๊ฐํด ์ค ๊ฒ ๋ง๊ณ ๋ ๋ค๋ฅธ ๊ฒ์ด ์์ง๋ง ์๋๋ฅผ ๋ณด๋ฉด ํ์ตํ๊ธฐ ์ ์ `model.train()`์ด๋ผ๋ ์๋ก์ด ์ฝ๋๊ฐ ์ถ๊ฐ๋ ๊ฒ์ ๋ณผ ์ ์๋ค.
+
+```python
+total_batch = len(data_loader)
+model.train() # set the model to train mode (dropout=True)
+for epoch in range(training_epochs):
+ avg_cost = 0
+
+ for X, Y in data_loader:
+ # reshape input image into [batch_size by 784]
+ # label is not one-hot encoded
+ X = X.view(-1, 28 * 28).to(device)
+ Y = Y.to(device)
+
+ optimizer.zero_grad()
+ hypothesis = model(X)
+ cost = criterion(hypothesis, Y)
+ cost.backward()
+ optimizer.step()
+
+ avg_cost += cost / total_batch
+
+ print('Epoch:', '%04d' % (epoch + 1), 'cost =', '{:.9f}'.format(avg_cost))
+
+print('Learning finished')
+
+'''output
+Epoch: 0001 cost = 0.308392197
+Epoch: 0002 cost = 0.142623395
+Epoch: 0003 cost = 0.113427199
+Epoch: 0004 cost = 0.093490042
+Epoch: 0005 cost = 0.083772294
+Epoch: 0006 cost = 0.077040948
+Epoch: 0007 cost = 0.067025252
+Epoch: 0008 cost = 0.063156039
+Epoch: 0009 cost = 0.058766391
+Epoch: 0010 cost = 0.055902217
+Epoch: 0011 cost = 0.052059878
+Epoch: 0012 cost = 0.048243146
+Epoch: 0013 cost = 0.047231019
+Epoch: 0014 cost = 0.045120358
+Epoch: 0015 cost = 0.040942233
+Learning finished
+'''
+```
+
+์ด๊ฑด model์ train ์ฉ์ผ๋ก ์ฌ์ฉํ ๊ฒ์ธ์ง, eval ์ฉ์ผ๋ก ์ฌ์ฉํ ๊ฒ์ธ์ง์ ๋ฐ๋ผ mode๋ฅผ ๋ณ๊ฒฝ์์ผ์ฃผ๋ ์ฝ๋์ด๋ค. (์ดํ์ ๋์ฌ batch normalization ๋ฑ์์๋ ์ฌ์ฉ)
+
+์ด๋ ๊ฒ ๋ชจ๋๋ฅผ ๋๋ ์ฃผ๋ ์ด์ ๋ ํ์ตํ ๋์ ๋ฌ๋ฆฌ ๊ฒ์ฆํ ๋๋ dropout์ ์ฌ์ฉํ์ง ์๊ณ ๋ชจ๋ node๋ฅผ ์ฌ์ฉํด์ ์์ธก์ ์งํํ๊ธฐ ๋๋ฌธ์ด๋ค.
+
+๊ทธ๋ฌ๋ฏ๋ก ๊ฒ์ฆํ ๋๋ ๋ค์๊ณผ ๊ฐ์ด ์ฝ๋๋ฅผ ์์ฑํด์ผ ํ๋ค.
+
+```python
+# Test model and check accuracy
+with torch.no_grad():
+ model.eval() # set the model to evaluation mode (dropout=False)
+
+ # Test the model using test sets
+ X_test = mnist_test.test_data.view(-1, 28 * 28).float().to(device)
+ Y_test = mnist_test.test_labels.to(device)
+
+ prediction = model(X_test)
+ correct_prediction = torch.argmax(prediction, 1) == Y_test
+ accuracy = correct_prediction.float().mean()
+ print('Accuracy:', accuracy.item())
+
+ # Get one and predict
+ r = random.randint(0, len(mnist_test) - 1)
+ X_single_data = mnist_test.test_data[r:r + 1].view(-1, 28 * 28).float().to(device)
+ Y_single_data = mnist_test.test_labels[r:r + 1].to(device)
+
+ print('Label: ', Y_single_data.item())
+ single_prediction = model(X_single_data)
+ print('Prediction: ', torch.argmax(single_prediction, 1).item())
+
+'''output
+Accuracy: 0.9820999503135681
+Label: 8
+Prediction: 8
+'''
+```
+
+๋ค๋ฅธ ๋ถ๋ถ์ ๋ชจ๋ ๋์ผํ๊ฒ ์์ฑํ๊ณ `model.eval()`๋ง ์ถ๊ฐํ์ฌ model์ ๊ฒ์ฆํ๊ธฐ ์ํ mode๋ก ๋ฐ๊ฟ์ฃผ๋ ๊ฒ์ ๋ณผ ์ ์๋ค.
+
+***
+
+#### Image Source
+
+* Dropout: [http://jmlr.org/papers/volume15/srivastava14a.old/srivastava14a.pdf](http://jmlr.org/papers/volume15/srivastava14a.old/srivastava14a.pdf)
\ No newline at end of file
diff --git a/_posts/2022-05-15-dlZeroToAll-PyTorch-9-4.markdown b/_posts/2022-05-15-dlZeroToAll-PyTorch-9-4.markdown
new file mode 100644
index 00000000000..306a1d0a7cc
--- /dev/null
+++ b/_posts/2022-05-15-dlZeroToAll-PyTorch-9-4.markdown
@@ -0,0 +1,119 @@
+---
+title: "๋ชจ๋๋ฅผ ์ํ ๋ฅ๋ฌ๋ 2 - Lab9-4:Batch Normalization"
+author: Kwon
+date: 2022-05-15T01:00:00 +0900
+categories: [pytorch, study]
+tags: [batch-normalization, gradient-vanishing, gradient-exploding, internal-covariate-shift]
+math: true
+mermaid: false
+---
+[๋ชจ๋๋ฅผ ์ํ ๋ฅ๋ฌ๋](https://deeplearningzerotoall.github.io/season2/lec_pytorch.html) Lab9-4: Batch Normalization ๊ฐ์๋ฅผ ๋ณธ ํ ๊ณต๋ถ๋ฅผ ๋ชฉ์ ์ผ๋ก ์์ฑํ ๊ฒ์๋ฌผ์
๋๋ค.
+
+***
+
+## Gradient Vanishing / Gradient Exploding
+
+Gradient Vanishing(๊ธฐ์ธ๊ธฐ ์์ค)๊ณผ Gradient Exploding(๊ธฐ์ธ๊ธฐ ํญ์ฃผ)๋ ์ ์์ ์ธ ํ์ต์ ํ ์ ์๊ฒ ๋ง๋๋ ์์ธ๋ค์ด๋ค.
+
+๊ธฐ์ธ๊ธฐ ์์ค์ [์์](/posts/dlZeroToAll-PyTorch-9-1/) ์ดํด๋ณธ ๊ฒ์ฒ๋ผ ์ญ์ ํ๋ฅผ ์ํํ ๋ ์์ ๋ฏธ๋ถ๊ฐ์ chain rule์ ๋ฐ๋ผ ๊ณ์ ๊ณฑํ๋ค๊ฐ ๊ฒฐ๊ตญ 0์ผ๋ก ์๋ฉธํด๋ฒ๋ฆฌ๋ ๊ฒ์ด์๋ค.
+
+๋ฐ๋๋ก ๊ธฐ์ธ๊ธฐ ํญ์ฃผ๋ ๋๋ฌด ํฐ ๋ฏธ๋ถ๊ฐ์ ๊ณ์ ๊ณฑํ๋ค๊ฐ ์๋ ดํ์ง ๋ชปํ๊ณ ๋ฐ์ฐํด๋ฒ๋ฆฌ๋ ๊ฒ์ ์๋ฏธํ๋ค.
+
+์ด๋ค์ ๋ฐฉ์งํ๊ธฐ ์ํด ์๋ํด๋ณผ ์ ์๋ ๊ฒ์ ์๋์ ๊ฐ์ ๋ฐฉ๋ฒ๋ค์ด ์๋ค
+
+* Change activation function
+* Careful initialization
+* Small learning rate
+* Batch Normalization
+
+์ด ์ค์์ ์ด๋ฒ ๊ฐ์์์๋ Batch Normalization์ ๋ํ ๋ด์ฉ์ ๋ค๋ฃจ์๋ค.
+
+***
+
+Batch normalization์ ์ ์ํ ๋ ์ฃผ์ฅํ๋ ๊ธฐ์ธ๊ธฐ ์์ค๊ณผ ํญ์ฃผ์ ๋ํ ์ฃผ๋ ์ด์ ๊ฐ **Internal Covariate Shift**์๋๋ฐ ์ด์ ๋ํด ํ๋ฒ ์์๋ณด์.
+
+## Covariate Shift
+
+๋จผ์ Covariate Shift๋ ๊ณต๋ณ๋ ๋ณํ๋ผ๊ณ ๋ ํ๋๋ฐ ์
๋ ฅ ๋ฐ์ดํฐ์ ๋ถํฌ๊ฐ ํ์ตํ ๋์ ํ
์คํธํ ๋ ๋ค๋ฅด๊ฒ ๋ํ๋๋ ํ์์ ๋งํ๋ค.
+
+์๋ฅผ ๋ค์ด ์๊ธ์จ๋ฅผ ๋ถ๋ฅํ๋ ๋ชจ๋ธ์ ๋ง๋๋ ค๊ณ ํ ๋ ํ์ต ๋ฐ์ดํฐ๋ก ํ๊ธ ์๊ธ์จ๋ฅผ ์ฌ์ฉํด์ ํ์ตํ ํ ์์ด ์๊ธ์จ๋ฅผ ๋ถ๋ฅํ๋ ค๊ณ ํ๋ฉด ๋น์ฐํ ๋ถ๋ฅ๊ฐ ์ ๋๋ก ๋์ง ์์ ๊ฒ์ด๋ค.
+
+์ด๋ ๋ชจ๋ธ์ด ํ์ตํ ๋ถํฌ์ ํ
์คํธ ๋ฐ์ดํฐ์ ๋ถํฌ๊ฐ ๋ค๋ฅด๊ธฐ ๋๋ฌธ์ด๋ค.
+
+## Internal Covariate Shift
+
+์ด๋ฐ Covariate Shift๊ฐ ๋คํธ์ํฌ ๋ด๋ถ์์ ๋ฐ์ํ๋ ๊ฒ์ด Inteanal Covariate Shift์ด๋ค.
+
+์ด์ ๊น์ง๋ ๋ชจ๋ธ ๋จ์์ ๋ถํฌ ๋ฌธ์ ๋ผ๊ณ ์๊ฐํ๊ณ ์ฒซ ์
๋ ฅ์๋ง normalization์ ํ์ง๋ง, ์ค์ ๋ก๋ ์๋์ ๊ฐ์ด ์คํญ๋ง๋ค ๋ ์ด์ด ๋จ์๋ก Covariate Shift๊ฐ ๋ฐ์ํ๋ค๋ ๊ฒ์ด๋ค.
+
+
+
+๊ทธ๋ฌ๋ฏ๋ก ๊ฐ ๋ ์ด์ด ํ์ต๋ง๋ค ๊ฐ minibatch๋ฅผ normalization์ ํด์ผ ํ๋ฉฐ ์ด๋ฅผ Batch normalization์ด๋ผ๊ณ ํ๋ค.
+
+***
+
+## Batch Normalization
+
+Batch normalization์ ๋ค์๊ณผ ๊ฐ์ ์๊ณ ๋ฆฌ์ฆ์ผ๋ก ์งํ๋๋ค.
+
+
+
+$\mu_\mathcal{B}$์ $\sigma^2_\mathcal{B}$๋ minibatch๋ฅผ ํตํด ๊ฒ์ฐ๋ ํ๊ท ๊ณผ ๋ถ์ฐ์ด๋ฉฐ sample mean/variance๋ผ๊ณ ๋ ๋ถ๋ฆฐ๋ค. ์ด๋ค์ ์ด์ฉํด์ normalize ํ๊ฒ ๋๋๋ฐ ์ด๋ $\epsilon$์ 0์ผ๋ก ๋๋๋ ๊ฒ์ ๋ฐฉ์งํ๋ ์์ฃผ ์์ ๊ฐ์ด๋ค.
+
+์ด๋ ๊ฒ normalize๋ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ง๊ณ $\gamma$์ $\beta$๋ฅผ ํ์ตํ๋ฉด Batch normalization์ ํตํ ํ์ต์ด ํ ๋ฒ ๋๋๊ฒ ๋๋ค.
+
+### Evaluation
+
+๊ฒ์ฆํ ๋ Batch normalization์ ์ฌ์ฉํ๋ ๋ชจ๋ธ์ด ๊ฐ์ ์ผ๋ถ๊ฐ ๋ฐ๋ batch๋ฅผ ๋ฐ๋๋ค๋ฉด ๊ทธ batch์ $\mu_\mathcal{B}$์ $\sigma^2_\mathcal{B}$ ์ญ์ ๋ฐ๋๊ฒ ๋๋ค.
+์ด๋ ๊ฒ ๋๋ฉด $\hat{x}$๋ ๋ค๋ฅด๊ฒ ๊ณ์ฐ๋๋๋ฐ ์ด๋ด ๊ฒฝ์ฐ ๊ฐ์ ๊ฐ์ด๋ผ๋ batch์ ์ผ๋ถ๋ถ์ด ๋ฐ๋์๋ค๋ ์ฌ์ค ํ๋๋ง์ผ๋ก ๋ค๋ฅธ ๊ฒฐ๊ณผ๊ฐ ๋์ค๊ฒ ๋๋ค.
+
+๊ฒ์ฆ ๊ณผ์ ์์ ์ด๋ฌํ ์ผ์ผ ๋ฐ์ํ๋ ๊ฒ์ ๋ง๊ธฐ ์ํด ํ์ต ์์ ๊ฒ์ฐํ๋ $\mu_\mathcal{B}$์ $\sigma^2_\mathcal{B}$๋ฅผ ๋ฐ๋ก ์ ์ฅํด ๋๊ณ , testํ ๋๋ ์ด๋ฏธ ๊ณ์ฐ๋ $\mu_\mathcal{B}$์ $\sigma^2_\mathcal{B}$๋ฅผ ์ฌ์ฉํ๋ค.
+
+์ด๋ฐ ๋ฐฉ์์ผ๋ก ๊ฒฐ๊ณผ๊ฐ์ ๋์ถํ๋ฉด ๊ฐ์ ๊ฐ์ ๊ฐ์ ๊ฒฐ๊ณผ๋ฅผ ์ป์ ์ ์๋ค. ์ด๋ฐ ์ด์ ๋ก Batch normalization๋ [dropout](/posts/dlZeroToAll-PyTorch-9-3/)๊ณผ ๊ฐ์ด ๋ฐ๋ก eval mode๋ก ๋ฐ๊ฟ์ค์ผ ํ๋ค.
+
+***
+
+## Train
+
+Batch normalization์ ์ ์ฉํ๋ ค๋ฉด ๊ธฐ์กด ์ฝ๋์์ `torch.nn.BatchNorm1d`๋ฅผ ์ถ๊ฐํ์ฌ model์ ๊ตฌ์ฑํ๋ฉด ๋๋ค. ์์น๋ activation ์ง์ ์ ์ฌ์ฉํ๋ ๊ฒ์ด ์ผ๋ฐ์ ์ด๋ผ๊ณ ํ๋ค.
+
+```python
+# nn layers
+linear1 = torch.nn.Linear(784, 32, bias=True)
+linear2 = torch.nn.Linear(32, 32, bias=True)
+linear3 = torch.nn.Linear(32, 10, bias=True)
+relu = torch.nn.ReLU()
+bn1 = torch.nn.BatchNorm1d(32)
+bn2 = torch.nn.BatchNorm1d(32)
+
+nn_linear1 = torch.nn.Linear(784, 32, bias=True)
+nn_linear2 = torch.nn.Linear(32, 32, bias=True)
+nn_linear3 = torch.nn.Linear(32, 10, bias=True)
+
+# model with Batch normalization
+bn_model = torch.nn.Sequential(linear1, bn1, relu,
+ linear2, bn2, relu,
+ linear3).to(device)
+
+# model without Batch normalization
+nn_model = torch.nn.Sequential(nn_linear1, relu,
+ nn_linear2, relu,
+ nn_linear3).to(device)
+
+# define cost/loss & optimizer
+criterion = torch.nn.CrossEntropyLoss().to(device) # Softmax is internally computed.
+bn_optimizer = torch.optim.Adam(bn_model.parameters(), lr=learning_rate)
+nn_optimizer = torch.optim.Adam(nn_model.parameters(), lr=learning_rate)
+```
+
+model์ ์์์ ๋งํ ๊ฒ์ฒ๋ผ ์ด์๊ฐ์ด ๊ตฌํํ ์ ์๊ณ , ํ์ต์ dropout๊ณผ ๋์ผํ๊ฒ `model.train()`์ ๋จผ์ ํด ์ฃผ๊ณ ์งํํ๋ฉด ๋๋ค.
+
+
+
+์ค์ ๋ก Batch normalization์ ์ ์ฉํ ๊ฒฝ์ฐ๊ฐ ๋ ํ์ต์ด ์ ๋๊ฒ์ ํ์ธํ ์ ์๋ค.
+
+***
+
+#### Image Source
+
+* Batch Normalization: [https://arxiv.org/pdf/1502.03167.pdf](https://arxiv.org/pdf/1502.03167.pdf)
\ No newline at end of file
diff --git a/_posts/2022-05-22-dlZeroToAll-PyTorch-10-1.markdown b/_posts/2022-05-22-dlZeroToAll-PyTorch-10-1.markdown
new file mode 100644
index 00000000000..a07702dc668
--- /dev/null
+++ b/_posts/2022-05-22-dlZeroToAll-PyTorch-10-1.markdown
@@ -0,0 +1,228 @@
+---
+title: "๋ชจ๋๋ฅผ ์ํ ๋ฅ๋ฌ๋ 2 - Lab10-1: Convolution, Lab10-2: MNIST CNN"
+author: Kwon
+date: 2022-05-22T00:00:00 +0900
+categories: [pytorch, study]
+tags: [convolution, padding, pooling, cnn]
+math: true
+mermaid: false
+---
+[๋ชจ๋๋ฅผ ์ํ ๋ฅ๋ฌ๋](https://deeplearningzerotoall.github.io/season2/lec_pytorch.html) Lab10-1: Convolution, Lab10-2: MNIST CNN ๊ฐ์๋ฅผ ๋ณธ ํ ๊ณต๋ถ๋ฅผ ๋ชฉ์ ์ผ๋ก ์์ฑํ ๊ฒ์๋ฌผ์
๋๋ค.
+
+***
+
+## Convolution
+
+๊ฐ์ ์๋ฃ์์๋ **'์ด๋ฏธ์ง(2์ฐจ์ ๋งคํธ๋ฆญ์ค) ์์์ stride ๋งํผ filter(kernel)์ ์ด๋์ํค๋ฉด์ ๊ฒน์ณ์ง๋ ๋ถ๋ถ์ ๊ฐ ์์์ ๊ฐ์ ๊ณฑํด์ ๋ํ ๊ฐ์ ์ถ๋ ฅ์ผ๋ก ํ๋ ์ฐ์ฐ'**์ด๋ผ๊ณ ๋์์๋ค. ์์ธํ ์ด๋ค ๊ณผ์ ์ ์ฐ์ฐ์ธ์ง ํ์ธํด ๋ณด์.
+
+์๋์ ๊ฐ์ด ์ฐจ๋ก๋๋ก input, filter, output ํ๋ ฌ์ด ์๋ค๊ณ ํด๋ณด์.
+
+
+
+input, filter์ ์งํ ๋ถ๋ถ์ ๊ฐ ์๋ฆฌ๋ผ๋ฆฌ ๊ณฑํด์ ๋ํด์ฃผ๋ ๊ฒ์ผ๋ก output์ ์งํ ๋ถ๋ถ์ ๊ฒฐ๊ณผ๋ฅผ ๋ธ๋ค. ์ด ์์ ์ stride๋ 1์ด๊ธฐ ๋๋ฌธ์ ํ ์นธ์ฉ ์ปค๋์ ์ด๋ํ๋ฉด์ ์ด ๊ณผ์ ์ ์งํํ์ฌ ์ต์ข
์ ์ผ๋ก ์๋ก์ด 3x3 output์ ๋ง๋ค์ด๋ธ๋ค.
+
+์ฐ๋ฆฌ๊ฐ ์ํ๋ filter์ stride๋ฅผ ์ค์ ํ์ฌ ์ ๊ณผ์ ์ ํตํด ์๋ก์ด ๋งคํธ๋ฆญ์ค๋ฅผ ๋ง๋๋ ๊ฒ์ด **convolution**์ด๋ค.
+
+### Padding
+
+Convolution ์ฐ์ฐ์ ์ฐ์ด๋ ๋ฐ์ดํฐ์ **padding**์ด๋ผ๋ ์ฒ๋ฆฌ๋ฅผ ํ ์ ์๋๋ฐ, ์ด๊ฒ์ input๋ฅผ ์ผ์ ํ ์๋ก ๊ฐ์ผ๋ค๋ ๋ป์ผ๋ก 1์ zero-padding์ ํ๋ค๋ ๊ฒ์ ๋ค์๊ณผ ๊ฐ์ ์
๋ ฅ์ผ๋ก ์ฐ์ฐ์ ์งํํ๊ฒ ๋ค๋ ๋ป์ด๋ค.
+
+{: width="40%"}
+
+### Output Size
+
+Convolution output์ ํฌ๊ธฐ๋ ๋ค์๊ณผ ๊ฐ์ด ์ฃผ์ด์ง๋ค.
+
+\\[ Output \, size = \frac{input \, size - filter \, size + (2*padding)}{Stride} + 1 \\]
+
+์๋ฅผ ๋ค์ด input size = (32, 64), kernel = 5, stride = 1, padding = 0๋ก ์ฃผ์ด์ก์ ๋
+
+\\[ (\frac{(32-5)+(0\times2)}{1}+1 , \frac{(32-5)+(0\times2)}{1}+1) = (28, 60) \\]
+
+์์ฒ๋ผ ๊ณ์ฐํ ์ ์๋ค.
+
+### Input Type in PyTorch
+
+PyTorch์์ `torch.nn.Conv2d`์ ์ด์ฉํ์ฌ convolution์ ์ฐ์ฐํ ๋ input data์ type์ `torch.Tensor`, shape์ (N x C x H x W) = (batch_size, channel, height, width)์ผ๋ก ๋ง์ถฐ์ค์ผ ํ๋ค.
+
+์์์ size๋ฅผ ๊ฒ์ฐํ๋ ์์ ๋ฅผ ์ค์ ๋ก ์ฝ๋๋ก ์คํํ์ฌ ํ์ธํ๋ ค๋ฉด ๋ค์๊ณผ ๊ฐ์ด ์์ฑํ๋ฉด ๋๋ค.
+
+{: width="40%"}
+
+์ค์ ๋ก๋ ๊ณ์ฐ ๊ฒฐ๊ณผ์ ๊ฐ์ shape์ด ๋์ค๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
+
+### Convolution and Perceptron
+
+convolution์ ๋ค์๊ณผ ๊ฐ์ด perceptron์ผ๋ก ๋ํ๋ผ ์๋ ์๋ค.
+
+
+
+filter์ ๊ฐ์ weight๋ก ๊ฐ์ง๊ณ ์๋ perceptron์ stride๋งํผ ์์ง์ด๋ฉด์ ๋งคํธ๋ฆญ์ค๋ฅผ ํต๊ณผ์ํค๋ฉด output์ ๊ฐ ์๋ฆฌ ๊ฒฐ๊ณผ๊ฐ๋ค์ด ๊ณ์ฐ๋๋ค.
+
+***
+
+## Pooling
+
+Pooling์ ์ฃผ์ด์ง kernel size๋งํผ์ ๊ตฌ์ญ์ ๋ํํ๋ ๊ฐ๋ค์ ์ฐพ์์ ๊ทธ ๋ํ๊ฐ์ผ๋ก ์๋ก์ด ๋งคํธ๋ฆญ์ค๋ฅผ ๊ตฌ์ฑํ๋ ๊ฒ์ ๋งํ๋ค.
+
+
+
+์ ๊ทธ๋ฆผ์ kernel size๊ฐ 2์ธ max pooling๊ณผ average pooling์ ๋ํ๋ธ ๊ฒ์ด๋ค.
+
+max pooling์ ๊ทธ ๊ตฌ์ญ์ ์ต๋๊ฐ์ ์ ํํ๋ ๊ฒ์ด๊ณ , average pooling์ ํ๊ท ๊ฐ์ ์ ํํ์ฌ ์๋ก์ด ๋งคํธ๋ฆญ์ค๋ฅผ ๋ง๋๋ ๊ฒ์ด๋ค.
+
+***
+
+## Train CNN with MNIST
+
+### Import and Data
+
+seed๋ฅผ ๊ณ ์ ํ๊ณ mnist dataset์ ๋ถ๋ฌ์์ `DataLoader`๋ฅผ ์ ์ฉํ์ฌ minibatch๋ก ํ์ตํ ์ ์๋๋ก ๋ง๋ค์ด ์ค๋ค.
+
+```python
+import torch
+import torchvision.datasets as dsets
+import torchvision.transforms as transforms
+import torch.nn.init
+
+device = 'cuda' if torch.cuda.is_available() else 'cpu'
+
+# for reproducibility
+torch.manual_seed(777)
+if device == 'cuda':
+ torch.cuda.manual_seed_all(777)
+
+learning_rate = 0.001
+training_epochs = 15
+batch_size = 100
+
+# MNIST dataset
+mnist_train = dsets.MNIST(root='MNIST_data/',
+ train=True,
+ transform=transforms.ToTensor(),
+ download=True)
+
+mnist_test = dsets.MNIST(root='MNIST_data/',
+ train=False,
+ transform=transforms.ToTensor(),
+ download=True)
+
+# dataset loader
+data_loader = torch.utils.data.DataLoader(dataset=mnist_train,
+ batch_size=batch_size,
+ shuffle=True,
+ drop_last=True)
+```
+
+### Model and Loss/Optimizer
+
+์ด์ ๊ณผ ๋ค๋ฅด๊ฒ 3๊ฐ์ ํฐ layer๋ก ๋๋์ด model์ ์์ฑํ๋ค. 2๊ฐ์ convolution layer๋ฅผ ํต๊ณผํ๊ณ ํ๋์ fully connected layer๋ฅผ ํต๊ณผ์ํจ๋ค.
+๋จ, fully connected layer๋ก ๋ค์ด๊ฐ๊ธฐ ์ ์ linear layer์ ๋ค์ด๊ฐ ์ ์๋๋ก data๋ฅผ `view`๋ฅผ ์ด์ฉํ์ฌ flatํ๊ฒ ๋ง๋ ๋ค.
+
+```python
+class CNN(torch.nn.Module):
+
+ def __init__(self):
+ super(CNN, self).__init__()
+ # L1 ImgIn shape=(?, 1, 28, 28)
+ # Conv -> (?, 32, 28, 28)
+ # Pool -> (?, 32, 14, 14)
+ self.layer1 = torch.nn.Sequential(
+ torch.nn.Conv2d(1, 32, kernel_size=3, stride=1, padding=1),
+ torch.nn.ReLU(),
+ torch.nn.MaxPool2d(kernel_size=2, stride=2))
+ # L2 ImgIn shape=(?, 32, 14, 14)
+ # Conv ->(?, 64, 14, 14)
+ # Pool ->(?, 64, 7, 7)
+ self.layer2 = torch.nn.Sequential(
+ torch.nn.Conv2d(32, 64, kernel_size=3, stride=1, padding=1),
+ torch.nn.ReLU(),
+ torch.nn.MaxPool2d(kernel_size=2, stride=2))
+ # Final FC 7x7x64 inputs -> 10 outputs
+ self.fc = torch.nn.Linear(7 * 7 * 64, 10, bias=True)
+ torch.nn.init.xavier_uniform_(self.fc.weight)
+
+ def forward(self, x):
+ out = self.layer1(x)
+ out = self.layer2(out)
+ out = out.view(out.size(0), -1) # Flatten them for FC
+ out = self.fc(out)
+ return out
+
+model = CNN().to(device)
+```
+
+loss๋ cross entropy๋ฅผ ์ฌ์ฉํ๊ณ optimizer๋ Adam์ ์ฌ์ฉํ๋ค. loss๋ฅผ `to(device)`๋ก ํ์ต์ ์ฌ์ฉํ device์ ๋ถ์ฌ์ฃผ๊ณ , optimizer๋ฅผ ์์ฑํ ๋ `model.parameters()`๋ฅผ ๋ฃ์ด์ฃผ๋ ๊ฒ์ ์์ง ๋ง์
+
+```python
+criterion = torch.nn.CrossEntropyLoss().to(device)
+optimizer = torch.optim.Adam(model.parameters(), lr=learning_rate)
+```
+
+### Train
+
+๊ธฐ์กด์ minibatch๋ก ํ์ตํ๋ ์ฝ๋์ ํฌ๊ฒ ๋ค๋ฅผ ๊ฒ์ด ์๋ค.
+
+```python
+# train my model
+total_batch = len(data_loader)
+print('Learning started. It takes sometime.')
+for epoch in range(training_epochs):
+ avg_cost = 0
+
+ for X, Y in data_loader:
+ # image is already size of (28x28), no reshape
+ # label is not one-hot encoded
+ X = X.to(device)
+ Y = Y.to(device)
+
+ optimizer.zero_grad()
+ hypothesis = model(X)
+ cost = criterion(hypothesis, Y)
+ cost.backward()
+ optimizer.step()
+
+ avg_cost += cost / total_batch
+
+ print('[Epoch: {:>4}] cost = {:>.9}'.format(epoch + 1, avg_cost))
+
+print('Learning Finished!')
+
+'''output
+Learning started. It takes sometime.
+[Epoch: 1] cost = 0.223892078
+[Epoch: 2] cost = 0.0621332489
+[Epoch: 3] cost = 0.0448851325
+[Epoch: 4] cost = 0.0356322788
+[Epoch: 5] cost = 0.0289768185
+[Epoch: 6] cost = 0.0248806253
+[Epoch: 7] cost = 0.0209558196
+[Epoch: 8] cost = 0.0180539284
+[Epoch: 9] cost = 0.0153525099
+[Epoch: 10] cost = 0.0128902728
+[Epoch: 11] cost = 0.0104844831
+[Epoch: 12] cost = 0.0100922994
+[Epoch: 13] cost = 0.00803675782
+[Epoch: 14] cost = 0.00732926652
+[Epoch: 15] cost = 0.00600952888
+Learning Finished!
+'''
+```
+
+convolution layer๋ฅผ ์ด์ฉํ์ฌ model์ ๊ตฌ์ฑํด๋ ํ์ต์ด ์ ๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
+
+```python
+# Test model and check accuracy
+with torch.no_grad():
+ X_test = mnist_test.test_data.view(len(mnist_test), 1, 28, 28).float().to(device)
+ Y_test = mnist_test.test_labels.to(device)
+
+ prediction = model(X_test)
+ correct_prediction = torch.argmax(prediction, 1) == Y_test
+ accuracy = correct_prediction.float().mean()
+ print('Accuracy:', accuracy.item())
+
+'''output
+Accuracy: 0.9878999590873718
+'''
+```
\ No newline at end of file
diff --git a/_posts/2022-05-23-dlZeroToAll-PyTorch-10-3.markdown b/_posts/2022-05-23-dlZeroToAll-PyTorch-10-3.markdown
new file mode 100644
index 00000000000..3e1b960510e
--- /dev/null
+++ b/_posts/2022-05-23-dlZeroToAll-PyTorch-10-3.markdown
@@ -0,0 +1,217 @@
+---
+title: "๋ชจ๋๋ฅผ ์ํ ๋ฅ๋ฌ๋ 2 - Lab10-3: Visdom"
+author: Kwon
+date: 2022-05-23T00:00:00 +0900
+categories: [pytorch, study]
+tags: [visdom, visualization]
+math: true
+mermaid: false
+---
+[๋ชจ๋๋ฅผ ์ํ ๋ฅ๋ฌ๋](https://deeplearningzerotoall.github.io/season2/lec_pytorch.html) Lab10-3: Visdom ๊ฐ์๋ฅผ ๋ณธ ํ ๊ณต๋ถ๋ฅผ ๋ชฉ์ ์ผ๋ก ์์ฑํ ๊ฒ์๋ฌผ์
๋๋ค.
+
+***
+
+## Visdom
+
+Visdom์ Meta ์ฌ(facebook)์์ ์ ๊ณตํ๋ PyTorch์์ ์ฌ์ฉํ ์ ์๋ ์๊ฐํ ๋๊ตฌ์ด๋ค. ์ค์๊ฐ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ์๊ฐํํ๋ฉด์ ๋ฐ๋๋ ์ ์ ํ์ธํ ์ ์๋ค๋ ์ฅ์ ์ด ์๋ค.
+
+### Install
+
+ํฐ๋ฏธ๋์์ pip๋ฅผ ์ด์ฉํ์ฌ ์ค์นํ ์ ์๋ค. ์ค์น๊ฐ ์๋ฃ๋ ํ์๋ visdom server๋ฅผ ์คํํด ์ฃผ์ด์ผ ์ฌ์ฉ์ด ๊ฐ๋ฅํ๋ค.
+
+```python
+> pip isntall visdom
+> python -m visdom.server
+# You can navigate to http://localhost:PORT
+```
+
+์๋ฒ๋ฅผ ์คํํ ํ์ ๋์ค๋ localhost ์ฃผ์๋ฅผ ํตํด visdom ํ๋ฉด์ ํ์ธํ ์ ์๋ค.
+
+#### AttributeError
+
+ํ์์ ๊ฒฝ์ฐ `AttributeError: module 'brotli' has no attribute 'error'`๋ผ๋ ์๋ฌ๊ฐ ๋ฐ์ํด์ ์๋ ์ฝ๋๋ฅผ ํตํด `brotli` module์ ์ถ๊ฐ์ ์ค์นํ์ฌ ํด๊ฒฐํ์๋ค.
+
+```python
+conda install -c conda-forge brotlipy
+```
+
+### Text
+
+๋จผ์ ์ค์น์ ๋ฌธ์ ๊ฐ ์๋์ง ํ์ธํ๋ ๊ฒธ ๊ฐ๋จํ text๋ฅผ ์ถ๋ ฅํด๋ณด์. `vis.text()`์ฌ์ฉํ์ฌ ์ถ๋ ฅํ ์ ์๋ค.
+
+```python
+vis.text("Hello, world!",env="main")
+```
+
+
+
+์์๊ฐ์ด ์๋ก์ด ์ฐฝ์ Hello, world๊ฐ ์ถ๋ ฅ๋๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
+
+### Image
+
+์ด๋ฒ์๋ ์ด๋ฏธ์ง๋ฅผ ์ถ๋ ฅํด๋ณด์
+
+๋ฌด์์ ํฝ์
๋ก ์์ฑํ 200x200 ์ด๋ฏธ์ง์ 3๊ฐ์ 28x28 ์ด๋ฏธ์ง๋ฅผ ๋ง๋ค๊ณ ์ถ๋ ฅํด๋ณด๋ฉด ๋ค์๊ณผ ๊ฐ๋ค. ์ด ๋๋ ํ๋์ ์ด๋ฏธ์ง๋ `vis.image()`๋ฅผ, ์ฌ๋ฌ ์ด๋ฏธ์ง๋ `vis.images()`๋ฅผ ์ฌ์ฉํ๋ค.
+
+```python
+a=torch.randn(3,200,200)
+vis.image(a)
+vis.images(torch.Tensor(3,3,28,28))
+```
+
+
+
+๋ค์์ ์กฐ๊ธ ๋ ์ด๋ฏธ์ง ๋ค์ด ๋ฐ์ดํฐ์ธ mnist์ CIFAR10๋ฅผ ์ถ๋ ฅํ๋ ค ํ๋ค.
+
+```python
+MNIST = dsets.MNIST(root="./MNIST_data",train = True,transform=torchvision.transforms.ToTensor(), download=True)
+cifar10 = dsets.CIFAR10(root="./cifar10",train = True, transform=torchvision.transforms.ToTensor(),download=True)
+
+#CIFAR10
+data = cifar10.__getitem__(0)
+print(data[0].shape)
+vis.images(data[0],env="main")
+
+# MNIST
+data = MNIST.__getitem__(0)
+print(data[0].shape)
+vis.images(data[0],env="main")
+```
+
+
+
+๋๊บผ๋น(?)์ ์ซ์ 5๊ฐ ์ ๋์จ๋ค. ๋ํ ์ด๋ฐ ์ด๋ฏธ์ง๋ค๋ ๋น์ฐํ `vis.images()`๋ฅผ ํตํด ํ๋ฒ์ ๋ง์ ์ด๋ฏธ์ง๋ ์ถ๋ ฅํ ์ ์๋ค.
+
+```py
+data_loader = torch.utils.data.DataLoader(dataset = MNIST,
+ batch_size = 32,
+ shuffle = False)
+for num, value in enumerate(data_loader):
+ value = value[0]
+ print(value.shape)
+ vis.images(value)
+ break
+```
+
+
+
+๊ตณ์ด for๋ฌธ์ ์ฐ์ง ์๊ณ ๋ ๋ค์๊ณผ ๊ฐ์ด iter ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ์ฌ ์ถ๋ ฅํ ์๋ ์๋ค.
+
+```py
+img = next(iter(data_loader))[0]
+vis.images(img)
+```
+
+์ง๊ธ๊น์ง ๋์ด ์ฐฝ๋ค์ ๋ชจ๋ ๋๊ณ ์ถ์ผ๋ฉด ๋ค์ ์ฝ๋๋ฅผ ์คํํด์ ๋ ์ ์๋ค.
+
+```py
+vis.close(env="main")
+```
+
+์ด๋ ๊ฒ ํ๋ฉด main์ ๋์์ง ๊ฒ๋ค์ ๋ชจ๋ ๋ ์ ์๋ค.
+
+### Line Plot
+
+Lint Plot์ `vis.line()`์ X, Y ๋ฐ์ดํฐ๋ฅผ ๋ฃ์ด ์ ํ ๊ทธ๋ํ๋ฅผ ๊ทธ๋ฆด ์ ์๋ค.
+
+```py
+Y_data = torch.randn(5)
+plt = vis.line (Y=Y_data)
+
+X_data = torch.Tensor([1,2,3,4,5])
+plt = vis.line(Y=Y_data, X=X_data)
+```
+
+
+
+๊ฐ์ฅ ๊ฐ๋จํ ์์ ๋ก Y ๋ฐ์ดํฐ๋ง ์ค์ ํด ์ค ๊ฒ์ธ๋ฐ, ์ด ๊ฒฝ์ฐ์ X์ถ์ ๋ฌด์กฐ๊ฑด 0๊ณผ 1 ์ฌ์ด๋ฅผ ๋๋ point๋ฅผ ์์ฑํ๋ค.
+๋ง์ฝ X ๊ฐ๋ค์ ๋ค๋ฅด๊ฒ ๋ง๋ค์ด์ฃผ๊ณ ์ถ์ผ๋ฉด ์๋ก์ด tensor๋ฅผ ๋ง๋ค์ด ๋ฃ์ด์ฃผ๋ฉด ๋๋ค.
+
+๊ธฐ์กด์ plot์ point๋ฅผ ์ถ๊ฐํ ์๋ ์๋ค. `vis.line()`์ ์๋ก ๋ฃ์ ๋ฐ์ดํฐ์ ๊ทธ ๋ฐ์ดํฐ๋ฅผ ์ถ๊ฐํ plot์ ๋ฃ์ด์ฃผ๊ณ , `update='append'`๋ก ์ค์ ํ๋ค.
+
+```py
+Y_append = torch.randn(1)
+X_append = torch.Tensor([6])
+
+vis.line(Y=Y_append, X=X_append, win=plt, update='append')
+```
+
+
+๋๊ฐ์ ๋ค๋ฅธ ๊ทธ๋ํ๋ฅผ ๋น๊ตํ๊ธฐ ์ํด ๊ฒน์ณ ๊ทธ๋ฆฌ๊ณ ์ถ์ผ๋ฉด (n, 2) shape์ ๋ฐ์ดํฐ์ ๊ทธ์ ๋ง๋ X ๋ฐ์ดํฐ๋ฅผ ๋ฃ์ด์ฃผ๋ฉด ๋๋ค.
+
+```py
+num = torch.Tensor(list(range(0,10)))
+num = num.view(-1,1)
+num = torch.cat((num,num),dim=1)
+
+plt = vis.line(Y=torch.randn(10,2), X = num)
+```
+
+
+
+X๋ 0-9์ด 2์ค ์ ์ฅ๋์ด์๋ ๋ฐ์ดํฐ, Y๋ (10,2)์ ๋๋ค ๋ฐ์ดํฐ์ด๋ค.
+
+๊ทธ๋ํ์ ๋ํ ๋ฒ๋ก๋ `showlegend=True`๋ก ๋ณด์ด๊ฒ ํ ์ ์๊ณ , `legend = []`๋ฅผ ํตํด ์ง์ ์ง์ ํด ์ค ์ ์๋ค. defualt๋ ๊ทธ๋ญ ์ ์๋ก ๋์จ๋ค.
+
+```py
+plt = vis.line(Y=Y_data, X=X_data, opts = dict(title='Test', showlegend=True))
+plt = vis.line(Y=Y_data, X=X_data, opts = dict(title='Test', legend = ['1๋ฒ'],showlegend=True))
+plt = vis.line(Y=torch.randn(10,2), X = num, opts=dict(title='Test', legend=['1๋ฒ','2๋ฒ'],showlegend=True))
+```
+
+
+
+
+
+๋ง์ง๋ง์ผ๋ก, ๊ฐ์ฅ ์ฌ๋ฐ๊ฒ ๋ดค๋ ๊ธฐ๋ฅ์ธ๋ฐ ์๊น ๋์จ append ๊ธฐ๋ฅ์ ํตํด ์คํ์ด ๋ฐ๋ณต๋ ๋๋ง๋ค plot์ ์๋์ผ๋ก ์
๋ฐ์ดํธํ๋๋ก ์ฝ๋๋ฅผ ์์ฑํ ์ ์๋ค.
+
+```py
+def loss_tracker(loss_plot, loss_value, num):
+ '''num, loss_value, are Tensor'''
+ vis.line(X=num,
+ Y=loss_value,
+ win = loss_plot,
+ update='append'
+ )
+
+plt = vis.line(Y=torch.Tensor(1).zero_())
+
+for i in range(500):
+ loss = torch.randn(1) + i
+ loss_tracker(plt, loss, torch.Tensor([i]))
+```
+
+
+
+์ค์ ๋ก ํ์ตํ ๋ loss๋ฅผ ๋ฃ์ด ํ์ต์ ๋ชจ๋ํฐ๋งํ๋๋ฐ ์ ์ฉํ๊ฒ ์ธ ์ ์๋ค.
+
+[์ด์ ํฌ์คํ
](/posts/dlZeroToAll-PyTorch-10-3/)์์ ํ์ตํ ๋ ์ฌ์ฉํ๋ ์ฝ๋์์ `loss_tracker`๋ฅผ ์ถ๊ฐํ์ฌ ์คํํ๋ฉด ๋ค์๊ณผ ๊ฐ์ด ๋ชจ๋ํฐ๋ง์ด ๊ฐ๋ฅํ๋ค.
+
+```py
+total_batch = len(data_loader)
+
+for epoch in range(training_epochs):
+ avg_cost = 0
+
+ for X, Y in data_loader:
+ X = X.to(device)
+ Y = Y.to(device)
+
+ optimizer.zero_grad()
+ hypothesis = model(X)
+
+ cost = criterion(hypothesis, Y)
+ cost.backward()
+ optimizer.step()
+
+ avg_cost += cost / total_batch
+
+ print('[Epoch:{}] cost = {}'.format(epoch+1, avg_cost))
+ # tracking
+ loss_tracker(loss_plt, torch.Tensor([avg_cost]), torch.Tensor([epoch]))
+print('Learning Finished!')
+```
+
+
+
+loss๊ฐ ์ด๋ป๊ฒ ๋ณํ๊ณ ์๋์ง ํ์ธํ๋๋ฐ ๋งค์ฐ ์ ํฉํ ๊ธฐ๋ฅ์ธ๊ฒ ๊ฐ๋ค.
\ No newline at end of file
diff --git a/_posts/2022-05-23-dlZeroToAll-PyTorch-10-4.markdown b/_posts/2022-05-23-dlZeroToAll-PyTorch-10-4.markdown
new file mode 100644
index 00000000000..ddc35a6f2c6
--- /dev/null
+++ b/_posts/2022-05-23-dlZeroToAll-PyTorch-10-4.markdown
@@ -0,0 +1,258 @@
+---
+title: "๋ชจ๋๋ฅผ ์ํ ๋ฅ๋ฌ๋ 2 - Lab10-4: ImageFolder"
+author: Kwon
+date: 2022-05-23T01:00:00 +0900
+categories: [pytorch, study]
+tags: [imagefolder, cnn, transform]
+math: true
+mermaid: false
+---
+[๋ชจ๋๋ฅผ ์ํ ๋ฅ๋ฌ๋](https://deeplearningzerotoall.github.io/season2/lec_pytorch.html) Lab10-4: ImageFolder ๊ฐ์๋ฅผ ๋ณธ ํ ๊ณต๋ถ๋ฅผ ๋ชฉ์ ์ผ๋ก ์์ฑํ ๊ฒ์๋ฌผ์
๋๋ค.
+
+***
+
+## ImageFolder
+
+`torchvision.datasets`์ ์๋ ImageFolder๋ directory์ ๋ฐ๋ผ category๋ฅผ ์๋์ผ๋ก labeling ํ์ฌ ๋ฐ์ดํฐ๋ก ๋ง๋ค์ด ์ค๋ค. ์ฐ๋ฆฌ๊ฐ ์ฐ์ ์ฌ์ง์ ํ์ตํ๋๋ฐ ์ฌ์ฉํ ๋ ์์ฃผ ์ข์ ๊ธฐ๋ฅ์ด๋ค.
+
+์ด๋ฒ ๊ฐ์์์๋ ๋ฏธ๋ฆฌ ์ฐ์ด์ ์ ๊ณตํด ์ค ํ์, ๋นจ๊ฐ์ ์์ ์ฌ์ง ๋ถ๋ฅ๋ฅผ ํด๋ณผ ๊ฒ์ด๋ค.
+
+๋จผ์ category์ ๋ง๊ฒ directory๋ฅผ ์์ฑํด์ฃผ์ด์ผ ImageFolder๋ฅผ ์ฌ์ฉํ ์ ์์ผ๋ฏ๋ก, directory๋ ๋ค์๊ณผ ๊ฐ์ ๊ตฌ์กฐ์ฌ์ผ ํ๋ค.
+
+
+
+```py
+import torchvision
+from torchvision import transforms
+
+from torch.utils.data import DataLoader
+
+from matplotlib.pyplot import imshow
+%matplotlib inline
+
+trans = transforms.Compose([
+ transforms.Resize((64,128))
+])
+
+train_data = torchvision.datasets.ImageFolder(root='custom_data/origin_data', transform=trans)
+```
+
+์๋ณธ ๋ฐ์ดํฐ๊ฐ ์๋ ๊ณณ์ root๋ก ์ก๊ณ `Compose`๋ฅผ ํตํด ์ ์ฉํ `transforms`๋ค์ ๋ฌถ์ด ๋ฃ์ด์ค๋ค. ์๋ณธ ๋ฐ์ดํฐ๊ฐ 265x512๋ก ๋๋ฌด ์ปค์ 64x128๋ก ๋ฐ๊พธ์ด์ฃผ๋ ๊ณผ์ ์ ๊ฑฐ์น๋ค.
+์ฌ๊ธฐ์๋ ํ๋์ `transforms`์ ์ฌ์ฉํ์ง๋ง ์ด๋ฌ๊ฐ๋ฅผ ์ฌ์ฉํด์ผํ ๋ `Compose`๋ก ๋ฌถ์ด ์ฌ์ฉํ ์ ์๋ค.
+
+์ด๋ ๊ฒ ๋ถ๋ฌ์จ ๋ฐ์ดํฐ๋ค์ ์ ๋ฆฌํ์ฌ train data๋ก ๋ง๋ค์ด์ค๋ค. directory ์ gray๊ฐ ๋ ๋น ๋ฅด๋ฏ๋ก label 0, red๊ฐ label 1์ด๋ค.
+
+```py
+for num, value in enumerate(train_data):
+ data, label = value
+ print(num, data, label)
+
+ if(label == 0):
+ data.save('custom_data/train_data/gray/%d_%d.jpeg'%(num, label))
+ else:
+ data.save('custom_data/train_data/red/%d_%d.jpeg'%(num, label))
+```
+
+***
+
+## Train
+
+### Imports and Data
+
+```py
+import torch
+import torch.nn as nn
+import torch.nn.functional as F
+
+import torch.optim as optim
+from torch.utils.data import DataLoader
+
+import torchvision
+import torchvision.transforms as transforms
+
+device = 'cuda' if torch.cuda.is_available() else 'cpu'
+
+torch.manual_seed(777)
+if device =='cuda':
+ torch.cuda.manual_seed_all(777)
+
+trans = transforms.Compose([
+ transforms.ToTensor()
+])
+
+train_data = torchvision.datasets.ImageFolder(root='./custom_data/train_data', transform=trans)
+data_loader = DataLoader(dataset = train_data, batch_size = 8, shuffle = True, num_workers=2)
+```
+
+์์ ๋ง๋ค์ด๋์ train data๋ฅผ `ImageFolder`๋ก ๋ถ๋ฌ์์ ์ฌ์ฉํ๋ค. ๋ฌผ๋ก ์๋์ผ๋ก label์ ๋ถ์ฌ ๋ฐ์ดํฐ๋ฅผ ์์ฑํด์ค๋ค.
+
+### Model and Loss/Optimizer
+
+๋ ๋ฒ์ CNN layer๋ฅผ ๊ฑฐ์น๊ณ FC layer๋ฅผ ํ๋ ํต๊ณผ์ํค๋ [lab10-2](/posts/dlZeroToAll-PyTorch-10-3/)์์ ์ฌ์ฉํ ๊ฒ๊ณผ data shape๋ง๊ณ ๋ ๊ฑฐ์ ๊ฐ์ ๋ชจ๋ธ์ด๋ค.
+
+```py
+class CNN(nn.Module):
+ def __init__(self):
+ super(CNN, self).__init__()
+ self.layer1 = nn.Sequential(
+ nn.Conv2d(3,6,5),
+ nn.ReLU(),
+ nn.MaxPool2d(2),
+ )
+ self.layer2 = nn.Sequential(
+ nn.Conv2d(6,16,5),
+ nn.ReLU(),
+ nn.MaxPool2d(2),
+ )
+ self.layer3 = nn.Sequential(
+ nn.Linear(16*13*29, 120),
+ nn.ReLU(),
+ nn.Linear(120,2)
+ )
+
+ def forward(self, x):
+ out = self.layer1(x)
+ out = self.layer2(out)
+ out = out.view(out.shape[0], -1)
+ out = self.layer3(out)
+ return out
+```
+
+์ด๋ ๊ฒ ๋ง๋ model์ ๊ผญ ํ
์คํธ ํ๋ ๊ณผ์ ์ ๊ฑฐ์ณ์ผ ํ๋ค๊ณ ํ๋ค. ํ
์คํธ๋ ๋ฃ์ผ๋ ค๋ ๋ฐ์ดํฐ์ shape์ด ๊ฐ์ Tensor๋ฅผ ์์ฑํ์ฌ ํต๊ณผ์์ผ๋ณด๋ ๊ฒ์ ๋งํ๋ค.
+
+```py
+#testing
+net = CNN().to(device)
+test_input = (torch.Tensor(3,3,64,128)).to(device)
+test_out = net(test_input)
+```
+
+optimizer์ loss๋ ์ญ์ ๋์ผํ๋ค.
+
+```py
+optimizer = optim.Adam(net.parameters(), lr=0.00005)
+loss_func = nn.CrossEntropyLoss().to(device)
+```
+
+### Train model
+
+ํ์ต ์ญ์ ์ด์ ๊ณผ ๋ค๋ฅด์ง ์๊ฐ ์งํํ๋ค.
+
+```py
+total_batch = len(data_loader)
+
+epochs = 7
+for epoch in range(epochs):
+ avg_cost = 0.0
+ for num, data in enumerate(data_loader):
+ imgs, labels = data
+ imgs = imgs.to(device)
+ labels = labels.to(device)
+ optimizer.zero_grad()
+ out = net(imgs)
+ loss = loss_func(out, labels)
+ loss.backward()
+ optimizer.step()
+
+ avg_cost += loss / total_batch
+
+ print('[Epoch:{}] cost = {}'.format(epoch+1, avg_cost))
+print('Learning Finished!')
+
+'''output
+[Epoch:1] cost = 0.6341210007667542
+[Epoch:2] cost = 0.3761218190193176
+[Epoch:3] cost = 0.1116236224770546
+[Epoch:4] cost = 0.03525366261601448
+[Epoch:5] cost = 0.016341226175427437
+[Epoch:6] cost = 0.009176642633974552
+[Epoch:7] cost = 0.005688846111297607
+Learning Finished!
+'''
+```
+
+### Save model
+
+์ด๋ ๊ฒ ํ์ตํ ๋ชจ๋ธ์ ๋งค๋ฒ ๋ค์ ํ์ตํ๋ ๊ฒ์ ๋๋ฌด ๋นํจ์จ์ ์ด๋ค. ๊ทธ๋์ ๋ชจ๋ธ์ ์ ์ฅํด ์ค๋ค.
+
+```py
+torch.save(net.state_dict(), "./model/model.pth")
+```
+
+๋ถ๋ฌ์ค๋ ๊ฒ์ ๋ค์๊ณผ ๊ฐ์ด ์๋ก์ด CNN ๊ฐ์ฒด๋ฅผ ์์ฑํ์ฌ ๋ฃ์ด์ฃผ๋ฉด ๋๋ค.
+
+```py
+new_net = CNN().to(device)
+new_net.load_state_dict(torch.load('./model/model.pth'))
+```
+
+๊ธฐ์กด์ ๋ชจ๋ธ๊ณผ ๋์ผํ ๊ฒ์ ํ์ธํ ์ ์๋ค.
+
+```py
+print(net.layer1[0])
+print(new_net.layer1[0])
+
+print(net.layer1[0].weight[0][0][0])
+print(new_net.layer1[0].weight[0][0][0])
+
+net.layer1[0].weight[0] == new_net.layer1[0].weight[0]
+
+'''output
+Conv2d(3, 6, kernel_size=(5, 5), stride=(1, 1))
+Conv2d(3, 6, kernel_size=(5, 5), stride=(1, 1))
+tensor([-0.0914, 0.0032, -0.0170, -0.0211, 0.0933], device='cuda:0',
+ grad_fn=)
+tensor([-0.0914, 0.0032, -0.0170, -0.0211, 0.0933], device='cuda:0',
+ grad_fn=)
+tensor([[[True, True, True, True, True],
+ [True, True, True, True, True],
+ [True, True, True, True, True],
+ [True, True, True, True, True],
+ [True, True, True, True, True]],
+
+ [[True, True, True, True, True],
+ [True, True, True, True, True],
+ [True, True, True, True, True],
+ [True, True, True, True, True],
+ [True, True, True, True, True]],
+
+ [[True, True, True, True, True],
+ [True, True, True, True, True],
+ [True, True, True, True, True],
+ [True, True, True, True, True],
+ [True, True, True, True, True]]], device='cuda:0')
+'''
+```
+
+### Test
+
+testํ ๋๋ train data์ ๋๊ฐ์ด ์ฒ๋ฆฌํ์ฌ ์ฌ์ฉํ๋ฉด ๋๋ค.
+
+```py
+trans=torchvision.transforms.Compose([
+ transforms.Resize((64,128)),
+ transforms.ToTensor()
+])
+test_data = torchvision.datasets.ImageFolder(root='./custom_data/test_data', transform=trans)
+
+test_set = DataLoader(dataset = test_data, batch_size = len(test_data))
+```
+
+์ด๋ ๊ฒ ํ๋ฉด ์ญ์ label์ด ๋ถ์ ์ฑ๋ก data๊ฐ ์์ฑ๋๊ฒ ๋๋ค.
+
+test ๊ฒฐ๊ณผ๋ ๋ค์๊ณผ ๊ฐ๋ค.
+
+```py
+with torch.no_grad():
+ for num, data in enumerate(test_set):
+ imgs, label = data
+ imgs = imgs.to(device)
+ label = label.to(device)
+
+ prediction = net(imgs)
+
+ correct_prediction = torch.argmax(prediction, 1) == label
+
+ accuracy = correct_prediction.float().mean()
+ print('Accuracy:', accuracy.item())
+```
\ No newline at end of file
diff --git a/_posts/2022-05-26-dlZeroToAll-PyTorch-10-5.markdown b/_posts/2022-05-26-dlZeroToAll-PyTorch-10-5.markdown
new file mode 100644
index 00000000000..da2fe9851f2
--- /dev/null
+++ b/_posts/2022-05-26-dlZeroToAll-PyTorch-10-5.markdown
@@ -0,0 +1,456 @@
+---
+title: "๋ชจ๋๋ฅผ ์ํ ๋ฅ๋ฌ๋ 2 - Lab10-5: VGG"
+author: Kwon
+date: 2022-05-26T00:00:00 +0900
+categories: [pytorch, study]
+tags: [cnn, vgg]
+math: true
+mermaid: false
+---
+[๋ชจ๋๋ฅผ ์ํ ๋ฅ๋ฌ๋](https://deeplearningzerotoall.github.io/season2/lec_pytorch.html) Lab10-5: Advence CNN(VGG) ๊ฐ์๋ฅผ ๋ณธ ํ ๊ณต๋ถ๋ฅผ ๋ชฉ์ ์ผ๋ก ์์ฑํ ๊ฒ์๋ฌผ์
๋๋ค.
+
+***
+
+## VGG-net(Visual Geometry Group-network)
+
+VGG-net(์ดํ VGG)์ 14๋
๋ ILSVRC(Imagenet ์ด๋ฏธ์ง ์ธ์ ๋ํ)์ ๋์จ ๋คํธ์ํฌ๋ก ์ฅ์คํฌ๋์ Visual Geometry Group์์ ๋ง๋ ๋ชจ๋ธ์ด๋ค.
+
+๋จผ์ ๋
ผ๋ฌธ์์ ๋ฐํํ VGG๋ชจ๋ธ๋ค์ ๊ตฌ์กฐ๋ฅผ ๋ณด์.
+
+
+
+์ด 6๊ฐ์ ๊ตฌ์กฐ๋ฅผ ๋ง๋ค์ด ์ฑ๋ฅ์ ๋น๊ตํ์๋๋ฐ E๋ก ๊ฐ ์๋ก ๊น์ ๋ชจ๋ธ์ด๋ฉฐ ๋ชจ๋ธ์ด ๊น์ด์ง์๋ก ์ข์ ์ฑ๋ฅ์ ๋ณด์๋ค๊ณ ํ๋ค.
+
+VGG๋ ์ฌ๋ฌ ์ธต์ ๋ฐ๋ผ ์ด๋ฆ์ ๋ถ์ฌ์ฃผ๋๋ฐ ์๋ฅผ ๋ค๋ฉด E์ ๊ฒฝ์ฐ ์ด 19์ธต(16(conv) + 3(fc) = 19)์ด๋ฏ๋ก VGG19์ด๋ค.
+
+### VGG16 Architecture
+
+๋ค์ ํ์ต์์๋ ์ฌ์ฉํ VGG16์ ๊ตฌ์กฐ๋ฅผ ๋ํ์ ์ผ๋ก ํ์ธํด๋ณด์. Imagenet์ ์ด๋ฏธ์ง ํฌ๊ธฐ์ธ 224x224์ rgb 3์ฑ๋์ input์ ๋ฐ๋ ๋ชจ๋ธ์ ๊ตฌ์กฐ์ด๋ค.
+
+๊ตฌ์กฐ๋ฅผ ๋ณด๋ฉด 3x3 ์ปค๋๋ก ์ฌ๋ฌ๋ฒ์ conv๋ฅผ ์งํํ๋๋ฐ ๊ทธ ์ด์ ๋ ํ๋ จํด์ผํ ๊ฐ์ค์น๋ฅผ ์ค์ด๊ธฐ ์ํด์์ด๋ค.
+
+224x224 ํฌ๊ธฐ์ ํ๋ ฌ์ 3x3์ปค๋๋ก stride=1 ์ conv๋ฅผ 2๋ฒ ํ๋ฉด output size๋ 220x220์ด๊ณ ,
+
+\\[ Output \, size = \frac{input \, size - filter \, size + (2*padding)}{Stride} + 1 \\\\\\
+=((224 - 3) + 1)-3 + 1 = 220
+ \\]
+
+5x5 ์ปค๋๋ก stride=1 ์ conv๋ฅผ ํ๋ฉด output size๋ $224-5+1=220$๋ก output size๊ฐ ๊ฐ์ ๊ฒ์ ๋ณผ ์ ์๋ค. ์ฐธ๊ณ ๋ก 3๋ฒ์ 3x3 conv๋ฅผ ํ๋ฉด 7x7 conv ํ๋ฒ๊ณผ size๊ฐ ๊ฐ๋ค.
+
+๊ฐ์ output size์ง๋ง 3x3 conv๋ฅผ ์ฌ์ฉํ ๊ฒฝ์ฐ์๋ ํ์ตํด์ผํ ๊ฐ์ค์น๋ $2(3\times3)=18$์ด๊ณ , 5x5์ ๊ฒฝ์ฐ์๋ $5\times5=25$๋ก ํ์ตํด์ผํ ์์ด ๋ ๋ง๋ค. ๋ํ ์ฌ๋ฌ๊ฐ์ conv ์ธต์ ์ฌ์ฉํ ๊ฒฝ์ฐ ๋น์ ํ์ฑ์ด ๋ ๋์ด๋์ ๋ณด๋ค ๋ณต์กํ ๋ฐ์ดํฐ๋ฅผ ์ ํ์ตํ ์ ์๋ค๋ ์ฅ์ ๋ ์๋ค.
+
+๋ ๋ค๋ฅธ VGG์ ํน์ง์ผ๋ก๋ conv๋ง๋ค padding=1์ ํด์ค์ conv ์ ํ์ size๋ฅผ ๊ฐ๊ฒ ๋ง๋ค์ด์ค๋ค๋ ๊ฒ์ด๋ค. ์ด๋ฐ ํน์ฑ๋ค์ ํ์ธํ๊ณ VGG16์ ๊ตฌ์กฐ๋ฅผ ์ดํด๋ณด์.
+
+
+
+์์ ์ธ๊ธํ๋ฏ์ด 3x3 conv๋ฅผ padding=1๋ก 2~3๋ฒ ์ ์ฉํ๊ณ max plooing(kernel size=2, stride=2)์ ํ์ฌ ํฌ๊ธฐ๋ฅผ ์ค์ฌ ๋ค์ conv๋ก ๋๊ฒจ์ค๋ค. (์ด๋ activation์ ReLU)
+
+์ด๋ ๊ฒ conv + max pooling์ ํฐ layer๋ฅผ 5๋ฒ ํต๊ณผํ๊ณ ๋๋ฉด data๋ฅผ plattenํ๊ฒ ๋ง๋ค์ด์ fully connected layer๋ฅผ ํต๊ณผ์ํจ๋ค.
+์ด๋ fully connected layer๋ ๋ง์ง๋ง max pooling์ output size์ ๋ง์ถฐ $7\times7\times512$ ์ input์ ๋ฐ์ ์ ์๊ฒ ํ๋ค. ๋ง์ง๋ง layer์์๋ imagenet์ class ๊ฐ์์ธ 1000์ผ๋ก ๋ง์ถฐ์ฃผ๊ณ softmax๋ฅผ ์ ์ฉ์ํจ๋ค.
+
+์ด๋ฅผ ์ฝ๋๋ก ํ์ด ํํํ๋ฉด ๋ค์๊ณผ ๊ฐ๋ค.
+
+```py
+conv2d = nn.Conv2d(3, 64, kernel_size=3, padding=1)
+nn.ReLU(inplace=True)
+conv2d = nn.Conv2d(3, 64, kernel_size=3, padding=1)
+nn.ReLU(inplace=True)
+
+nn.MaxPool2d(kernel_size=2, stride=2)
+
+conv2d = nn.Conv2d(64, 128, kernel_size=3, padding=1)
+nn.ReLU(inplace=True)
+conv2d = nn.Conv2d(128, 128, kernel_size=3, padding=1)
+nn.ReLU(inplace=True)
+
+nn.MaxPool2d(kernel_size-2, stride=2)
+
+conv2d = nn.Conv2d(128, 256, kernel_size=3, padding=1)
+nn.ReLU(inplace=True)
+conv2d = nn.Conv2d(256, 256, kernel_size=3, padding=1)
+nn.ReLU(inplace=True)
+conv2d = nn.Conv2d(256, 256, kernel_size=3, padding=1)
+nn.ReLU(inplace=True)
+
+nn.MaxPool2d(kernel_size=2, stride=2)
+
+conv2d = nn.Conv2d(256, 512, kernel_size=3, padding=1)
+nn.ReLU(inplace=True)
+conv2d = nn.Conv2d(512, 512, kernel_size=3, padding=1)
+nn.ReLU(inplace=True)
+conv2d = nn.Conv2d(512, 512, kernel_size=3, padding=1)
+nn.ReLU(inplace=True)
+
+nn.MaxPool2d(kernel_size=2, stride=2)
+
+conv2d = nn.Conv2d(512, 512, kernel_size=3, padding=1)
+nn.ReLU(inplace=True)
+conv2d = nn.Conv2d(512, 512, kernel_size=3, padding=1)
+nn.ReLU(inplace=True)
+conv2d = nn.Conv2d(512, 512, kernel_size=3, padding=1)
+nn.ReLU(inplace=True)
+
+nn.MaxPool2d(kernel_size=2, stride=2)
+
+x = x.view(x.size(0), -1) # flatten
+
+nn.Linear(512 * 7 * 7, 4096),
+nn.ReLU(True),
+nn.Dropout(),
+nn.Linear(4096, 4096),
+nn.ReLU(True),
+nn.Dropout(),
+nn.Linear(4096, 1000),
+```
+
+***
+
+## Code with VGG
+
+PyTorch์ ๊ตฌํ๋ VGG๋ฅผ ํ๋ฒ ๋ฏ์ด๋ณด์. ๋จผ์ conv layer๋ฅผ ๋ง๋๋ ๊ณผ์ ์ด๋ค.
+
+```py
+cfg = {
+ 'A': [64, 'M', 128, 'M', 256, 256, 'M', 512, 512, 'M', 512, 512, 'M'], #8(conv) + 3(fc) =11 == vgg11
+ 'B': [64, 64, 'M', 128, 128, 'M', 256, 256, 'M', 512, 512, 'M', 512, 512, 'M'], # 10 + 3 = vgg 13
+ 'D': [64, 64, 'M', 128, 128, 'M', 256, 256, 256, 'M', 512, 512, 512, 'M', 512, 512, 512, 'M'], #13 + 3 = vgg 16
+ 'E': [64, 64, 'M', 128, 128, 'M', 256, 256, 256, 256, 'M', 512, 512, 512, 512, 'M', 512, 512, 512, 512, 'M'], # 16 +3 =vgg 19
+ 'custom' : [64,64,64,'M',128,128,128,'M',256,256,256,'M']
+}
+
+def make_layers(cfg, batch_norm=False):
+ layers = []
+ in_channels = 3
+
+ for v in cfg:
+ if v == 'M':
+ layers += [nn.MaxPool2d(kernel_size=2, stride=2)]
+ else:
+ conv2d = nn.Conv2d(in_channels, v, kernel_size=3, padding=1)
+
+ if batch_norm:
+ layers += [conv2d, nn.BatchNorm2d(v), nn.ReLU(inplace=True)]
+ else:
+ layers += [conv2d, nn.ReLU(inplace=True)]
+ in_channels = v
+ return nn.Sequential(*layers)
+```
+
+`cfg`๋ก ์ ์๋ dictionary์์ ๋ชจ๋ธ์ ๊ณจ๋ผ ๋ฃ์ด์ฃผ๋ฉด ๋๋ค. ์ฐ๋ฆฌ๊ฐ ๋ง๋ค๊ณ ์ถ์ ๊ฒ์ VGG16์ด๋๊น `cfg['D']`๋ฅผ `make_layers`์ ๋ฃ์ด์ฃผ๋ฉด ํจ์๊ฐ ์ง์ ํ ๋ชจ๋ธ ์ฝ๋(D)์ list์ ๋ฐ๋ผ `nn.Sequential`๋ก ๋ฌถ์ธ ๋ชจ๋ธ์ ๋ฐํํด์ค๋ค.
+
+conv layer ๋ถ๋ถ์ ๋ชจ๋ ๋ง๋ค์์ผ๋ ์ด์ fc layer๋ฅผ ์ด์ด์ VGG๋ฅผ ์์ฑํ๋ฉด ๋๋ค.
+
+```py
+class VGG(nn.Module):
+ def __init__(self, features, num_classes=1000, init_weights=True):
+ super(VGG, self).__init__()
+
+ self.features = features #convolution
+
+ self.avgpool = nn.AdaptiveAvgPool2d((7, 7))
+
+ self.classifier = nn.Sequential(
+ nn.Linear(512 * 7 * 7, 4096),
+ nn.ReLU(True),
+ nn.Dropout(),
+ nn.Linear(4096, 4096),
+ nn.ReLU(True),
+ nn.Dropout(),
+ nn.Linear(4096, num_classes),
+ )#FC layer
+
+ if init_weights:
+ self._initialize_weights()
+
+ def forward(self, x):
+ x = self.features(x) #Convolution
+ x = self.avgpool(x) # avgpool
+ x = x.view(x.size(0), -1) #flatten
+ x = self.classifier(x) #FC layer
+ return x
+
+ def _initialize_weights(self):
+ for m in self.modules():
+ if isinstance(m, nn.Conv2d):
+ nn.init.kaiming_normal_(m.weight, mode='fan_out', nonlinearity='relu')
+ if m.bias is not None:
+ nn.init.constant_(m.bias, 0)
+ elif isinstance(m, nn.BatchNorm2d):
+ nn.init.constant_(m.weight, 1)
+ nn.init.constant_(m.bias, 0)
+ elif isinstance(m, nn.Linear):
+ nn.init.normal_(m.weight, 0, 0.01)
+ nn.init.constant_(m.bias, 0)
+```
+
+์์ ๋ง๋ค์๋ CNN์ `features`์ ์ ๋ฌ๋๊ณ 7x7๋ก ๋ฐ๊ฟ์ฃผ๊ธฐ ์ํ pooling layer์ ๊ณ ์ ์ ์ผ๋ก ์ฌ์ฉ๋๋ linear layer๋ฅผ ์ ์ํด์ค๋ค.
+
+์ด๋ ๋ชจ๋ธ๋ค์ ๊ฐ์ค์น ์ด๊ธฐํ๋ `_initialize_weights`์ ์ํด ์ด๋ฃจ์ด์ง๋๋ฐ conv layer๋ `kaiming_normal_`์ ์ฌ์ฉํด์, batch norm layer๋ weight๋ฅผ 1๋ก bias๋ฅผ 0์ผ๋ก, linear layer๋ normal distribution์ bais๋ 0์ผ๋ก ์ด๊ธฐํํ๋ค.
+
+`forward`์์๋ ๊ฐ layer๋ฅผ ํต๊ณผ์ํค๋ฉด์ ํ์ต์ ํ๋ค. ๋ค๋ง linear layer๋ก ๋ค์ด๊ฐ๊ธฐ ์ ์ `view`๋ฅผ ํตํด flatํ๊ฒ ๋ง๋ค์ด์ฃผ๋ ๊ณผ์ ์ด ์ถ๊ฐ๋์ด์ผ ํ๋ค.
+
+***
+
+## Train
+
+VGG๋ฅผ ํตํ ํ์ต๋ ํ๋ฒ ํด๋ณด์.
+
+### Import and Setting
+
+```py
+import torch
+import torch.nn as nn
+
+import torch.optim as optim
+
+import torchvision
+import torchvision.transforms as transforms
+
+import visdom
+
+vis = visdom.Visdom()
+vis.close(env="main")
+
+def loss_tracker(loss_plot, loss_value, num):
+ '''num, loss_value, are Tensor'''
+ vis.line(X=num,
+ Y=loss_value,
+ win = loss_plot,
+ update='append'
+ )
+
+device = 'cuda' if torch.cuda.is_available() else 'cpu'
+
+torch.manual_seed(777)
+if device =='cuda':
+ torch.cuda.manual_seed_all(777)
+```
+
+์ ๋ฒ์ ๋ค๋ค์๋ [visdom](/posts/dlZeroToAll-PyTorch-10-3/)์ ์ด์ฉํ์ฌ ์๊ฐํ๋ฅผ ํ๋ฉด์ ํ์ต์ ์งํํ๋ค.
+
+### Data
+
+๋ฐ์ดํฐ๋ CIFAR10๋ฅผ ์ด์ฉํ์ฌ ํ์ต์ ์งํํ๋ค.
+
+```py
+transform = transforms.Compose(
+ [transforms.ToTensor(),
+ transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))])
+
+trainset = torchvision.datasets.CIFAR10(root='./cifar10', train=True,
+ download=True, transform=transform)
+trainloader = torch.utils.data.DataLoader(trainset, batch_size=512,
+ shuffle=True, num_workers=0)
+
+testset = torchvision.datasets.CIFAR10(root='./cifar10', train=False,
+ download=True, transform=transform)
+
+testloader = torch.utils.data.DataLoader(testset, batch_size=4,
+ shuffle=False, num_workers=0)
+
+classes = ('plane', 'car', 'bird', 'cat',
+ 'deer', 'dog', 'frog', 'horse', 'ship', 'truck')
+```
+
+๋ฐ์ดํฐ์
๋ค์ ๋ถ๋ฌ `DataLoader`๋ฅผ ํตํด ํ์ตํ๊ธฐ ์ฉ์ดํ๊ฒ ๋ง๋ค์ด์ค๋ค.
+
+```py
+import matplotlib.pyplot as plt
+import numpy as np
+
+# get some random training images
+dataiter = iter(trainloader)
+images, labels = dataiter.next()
+vis.images(images/2 + 0.5)
+
+# print labels
+print(' '.join('%5s' % classes[labels[j]] for j in range(4)))
+
+'''output
+truck dog horse truck
+'''
+```
+
+
+
+class์ ์ด๋ฏธ์ง๊ฐ ์ ๋ฐ์์ง ๊ฒ์ ํ์ธํ ์ ์๋ค.
+
+### Model
+
+```py
+import torchvision.models.vgg as vgg
+
+cfg = [32,32,'M', 64,64,128,128,128,'M',256,256,256,512,512,512,'M'] #13 + 3 =vgg16
+
+class VGG(nn.Module):
+
+ def __init__(self, features, num_classes=1000, init_weights=True):
+ super(VGG, self).__init__()
+ self.features = features
+ #self.avgpool = nn.AdaptiveAvgPool2d((7, 7)) -> ๊ตณ์ด ์ธ ํ์๊ฐ ์์
+ self.classifier = nn.Sequential(
+ nn.Linear(512 * 4 * 4, 4096),
+ nn.ReLU(True),
+ nn.Dropout(),
+ nn.Linear(4096, 4096),
+ nn.ReLU(True),
+ nn.Dropout(),
+ nn.Linear(4096, num_classes),
+ )
+ if init_weights:
+ self._initialize_weights()
+
+ def forward(self, x):
+ x = self.features(x)
+ #x = self.avgpool(x)
+ x = x.view(x.size(0), -1)
+ x = self.classifier(x)
+ return x
+
+ def _initialize_weights(self):
+ for m in self.modules():
+ if isinstance(m, nn.Conv2d):
+ nn.init.kaiming_normal_(m.weight, mode='fan_out', nonlinearity='relu')
+ if m.bias is not None:
+ nn.init.constant_(m.bias, 0)
+ elif isinstance(m, nn.BatchNorm2d):
+ nn.init.constant_(m.weight, 1)
+ nn.init.constant_(m.bias, 0)
+ elif isinstance(m, nn.Linear):
+ nn.init.normal_(m.weight, 0, 0.01)
+ nn.init.constant_(m.bias, 0)
+
+vgg16= VGG(vgg.make_layers(cfg),10,True).to(device)
+```
+
+์์ ์ ์ํ๋ VGG16์ `'D': [64, 64, 'M', 128, 128, 'M', 256, 256, 256, 'M', 512, 512, 512, 'M', 512, 512, 512, 'M']`์ ํํ์๋๋ฐ ์์ ๋ชจ๋ธ์ ์กฐ๊ธ ๋ฌ๋ผ๋ณด์ธ๋ค.
+์ด๊ฑด CIFAR10์ ์ด๋ฏธ์ง๊ฐ 32x32๋ก imgagenet์ ๊ฒ๋ณด๋ค ์๊ธฐ ๋๋ฌธ์ด๋ค. ๊ธฐ์กด๋๋ก pooling์ ๋ชจ๋ ์งํํ๋ฉด ๋ฐ์ดํฐ์ ํฌ๊ธฐ๊ฐ ๋๋ฌด ์์์ง๋ฏ๋ก ๊ทธ๊ฒ์ ๋ฐฉ์งํ๊ธฐ ์ํจ์ด๋ค.
+
+๊ฐ์ ์ด์ ๋ก `avgpool` layer๋ ๋น ์ก๋๋ฐ ๊ธฐ์กด์ max pooling๋ง ํด๋ ์ด๋ฏธ 7x7๋ณด๋ค ํฌ๊ธฐ๊ฐ ์๊ธฐ ๋๋ฌธ์ด๋ค.
+
+๋๋จธ์ง๋ ๋ชจ๋ ๊ฐ์ ๋ฐฉ์์ผ๋ก ์์ฑ๋์๋ค.
+
+```py
+a=torch.Tensor(1,3,32,32).to(device)
+out = vgg16(a)
+print(out)
+
+'''output
+tensor([[ 0.0125, -0.0020, -0.0270, 0.0210, 0.0100, 0.0126, -0.0009, 0.0242,
+ -0.0099, 0.0185]], device='cuda:0', grad_fn=)
+'''
+```
+
+testํ์ ๋๋ ๋ฌธ์ ๊ฐ ์์ผ๋ฏ๋ก ์ฌ์ฉํ ์ค๋น๊ฐ ๋ชจ๋ ๋์๋ค.
+
+### Optimizer and Loss
+
+```py
+criterion = nn.CrossEntropyLoss().to(device)
+optimizer = torch.optim.SGD(vgg16.parameters(), lr = 0.005,momentum=0.9)
+
+# ํ์ต์ด ์งํ๋จ์ ๋ฐ๋ผ lr ์กฐ์
+lr_sche = optim.lr_scheduler.StepLR(optimizer, step_size=5, gamma=0.9) # optimizer์ step์ด 5๋ฒ ์งํ๋ ๋๋ง๋ค gamma๋งํผ ๊ณฑํจ
+```
+
+๊ธฐ์กด๊ณผ ๋ค๋ฅธ ์ ์ ํ์ต๋ ์ ๋์ ๋ฐ๋ผ learning rate๋ฅผ ์ค์ด๋ ์ฝ๋๊ฐ ์ถ๊ฐ๋์๋ค๋ ๊ฒ์ด๋ค.
+
+### Train
+
+```py
+print(len(trainloader))
+epochs = 50
+
+for epoch in range(epochs): # loop over the dataset multiple times
+ running_loss = 0.0
+ lr_sche.step()
+ for i, data in enumerate(trainloader, 0):
+ # get the inputs
+ inputs, labels = data
+ inputs = inputs.to(device)
+ labels = labels.to(device)
+
+ # zero the parameter gradients
+ optimizer.zero_grad()
+
+ # forward + backward + optimize
+ outputs = vgg16(inputs)
+ loss = criterion(outputs, labels)
+ loss.backward()
+ optimizer.step()
+
+ # print statistics
+ running_loss += loss.item()
+ if i % 30 == 29: # print every 30 mini-batches
+ loss_tracker(loss_plt, torch.Tensor([running_loss/30]), torch.Tensor([i + epoch*len(trainloader) ]))
+ print('[%d, %5d] loss: %.3f' %
+ (epoch + 1, i + 1, running_loss / 30))
+ running_loss = 0.0
+
+
+print('Finished Training')
+
+'''output
+98
+[1, 30] loss: 2.302
+[1, 60] loss: 2.299
+[1, 90] loss: 2.284
+[2, 30] loss: 2.208
+[2, 60] loss: 2.128
+[2, 90] loss: 2.068
+[3, 30] loss: 1.974
+[3, 60] loss: 1.856
+[3, 90] loss: 1.793
+[4, 30] loss: 1.727
+[4, 60] loss: 1.678
+[4, 90] loss: 1.626
+[5, 30] loss: 1.571
+[5, 60] loss: 1.529
+[5, 90] loss: 1.513
+[6, 30] loss: 1.487
+[6, 60] loss: 1.452
+[6, 90] loss: 1.429
+[7, 30] loss: 1.387
+[7, 60] loss: 1.363
+[7, 90] loss: 1.333
+[8, 30] loss: 1.314
+[8, 60] loss: 1.284
+[8, 90] loss: 1.248
+...
+[50, 30] loss: 0.034
+[50, 60] loss: 0.030
+[50, 90] loss: 0.030
+Finished Training
+'''
+```
+
+
+
+`lr_sche.step()`์ด ์ถ๊ฐ๋ ๊ฒ ๋ง๊ณ ํฌ๊ฒ ๋ค๋ฅธ ์ ์ ์๋ค.
+
+### Test
+
+```py
+correct = 0
+total = 0
+
+with torch.no_grad():
+ for data in testloader:
+ images, labels = data
+ images = images.to(device)
+ labels = labels.to(device)
+ outputs = vgg16(images)
+
+ _, predicted = torch.max(outputs.data, 1)
+
+ total += labels.size(0)
+
+ correct += (predicted == labels).sum().item()
+
+print('Accuracy of the network on the 10000 test images: %d %%' % (
+ 100 * correct / total))
+
+Accuracy of the network on the 10000 test images: 75 %
+```
+
+์ ํ๋๋ 75%๋ก ๋์๋ค.
\ No newline at end of file
diff --git a/_posts/2022-05-27-dlZeroToAll-PyTorch-10-6.markdown b/_posts/2022-05-27-dlZeroToAll-PyTorch-10-6.markdown
new file mode 100644
index 00000000000..d87bb0f1b5c
--- /dev/null
+++ b/_posts/2022-05-27-dlZeroToAll-PyTorch-10-6.markdown
@@ -0,0 +1,520 @@
+---
+title: "๋ชจ๋๋ฅผ ์ํ ๋ฅ๋ฌ๋ 2 - Lab10-6: ResNet"
+author: Kwon
+date: 2022-05-27T00:00:00 +0900
+categories: [pytorch, study]
+tags: [cnn, resnet, skip-connection]
+math: true
+mermaid: false
+---
+[๋ชจ๋๋ฅผ ์ํ ๋ฅ๋ฌ๋](https://deeplearningzerotoall.github.io/season2/lec_pytorch.html) Lab10-6: Advence CNN(ResNet) ๊ฐ์๋ฅผ ๋ณธ ํ ๊ณต๋ถ๋ฅผ ๋ชฉ์ ์ผ๋ก ์์ฑํ ๊ฒ์๋ฌผ์
๋๋ค.
+
+***
+
+## Plain Network
+
+Plain network๋ skip connection์ ์ฌ์ฉํ์ง ์์ ์ผ๋ฐ์ ์ธ CNN ์ ๊ฒฝ๋ง์ ์๋ฏธํ๋ค.
+์ด๋ฌํ plain net์ด ๊น์ด์ง๋ฉด ๊น์ด์ง์๋ก backpropagation์ ํ ๋ ๊ธฐ์ธ๊ธฐ ์์ค์ด๋ ํญ๋ฐ์ด ๋ฐ์ํ ํ๋ฅ ์ด ๋์์ง๋ค.
+
+
+
+์ ๊ทธ๋ํ์์๋ ํ์ธํ ์ ์๋ฏ์ด plain network๋ฅผ ๊น๊ฒ ์์ ๊ฒ์ด ์คํ๋ ค ํ์ต์ด ์ ์ ๋ ๊ฒ์ ๋ณผ ์ ์๋ค.
+์ด๋ ๋๋ฌด ๊น์ plain network์์ ๊ธฐ์ธ๊ธฐ ์์ค ํน์ ํญ๋ฐ์ด ๋ฐ์ํ์ฌ ์๋ ์ํ๋ ๋ฐฉํฅ์ผ๋ก ํ์ต์ด ์๋์๊ธฐ ๋๋ฌธ์ด๋ค.
+
+***
+
+## Identity Mapping
+
+Classification problem์์ ๋ชจ๋ธ์ด ์๋ฒฝํ๊ฒ ํ์ตํ์๋ค๋ฉด input($x$)๊ณผ output(y)์ ์๋ฏธ๋ ๊ฐ์์ผ ํ๋ค. (๊ฐ์์ง ์ด๋ฏธ์ง๋ฉด ๊ฐ์์ง categry)
+์ด ๋ง์ $H(x)$๊ฐ $x$๊ฐ ๋๋๋ก ํ์ตํ๋ฉด ๋๋ค๋ ๊ฒ์ด๋ค. ์ฆ, $H(x)=x$๊ฐ ๋๋๋ก ํ์ต์ ํ๋ค๋ ๊ฒ์ด๋ฉฐ ์ด๋ ์ผ์ข
์ **ํญ๋ฑํจ์(identity function)**์ด๋ฏ๋ก,
+Classification problem์ model์ ์ต์ ํ ํ๋ค๋ ๊ฒ์ identity mapping์ ํ์ตํ๋ ๊ฒ๊ณผ ๊ฐ์์ง๋ค.
+
+***
+
+## ResNet
+
+ResNet์ skip connection์ ์ ์ฉํ network๋ก ๊ธฐ์ธ๊ธฐ ์์ค์ ํด๊ฒฐํ๋ฉด์ layer๋ฅผ ๋ ๊น๊ฒ ์์ ์ฑ๋ฅ์ด ์ข์ ๋ชจ๋ธ์ ๊ตฌ์ฑํ ์ ์๋ค.
+
+### Skip(Shortcut) Connection
+
+๊ธฐ์กด์ network์์๋ input ($x$)๋ฅผ target ($y$)๋ก mapping(identity mapping)ํ๋ $H(x)$๋ฅผ ์ป๋ ๊ฒ์ด ๋ชฉ์ ์ด์๋ค.
+ํ์ง๋ง identity mapping์ ํตํด ํ์ต์ ์งํํด๋ layer๊ฐ ์์ผ์๋ก ๊ธฐ์ธ๊ธฐ ์์ค์ด ๋ฐ์ํ๋ ๊ฒ์ ์ด์ฉ ์ ์๋ค.
+
+์ด๋ฅผ ํด๊ฒฐํ๊ธฐ์ํด ์ ์ํ ๋ฐฉ๋ฒ๋ก ์ด Residual learning์ด๋ค. ์ด๋ $H(x)$๋ฅผ ์ง์ ํ์ตํ๋ ๊ฒ์ด ์๋ **์์ฐจ(residual)**, $F(x) = H(x)-x$๋ฅผ ์ต์ํํ๋ ๊ฒ์ ๋ชฉํ๋ก ํ๋ ๋ฐฉ๋ฒ์ด๋ค.
+์ด ์์ฐจ $F(x)$๋ฅผ ์ต์ํ ํ๋ฉด $H(x) = x$์ ๊ฐ๊น์ด ์ด์์ ์ธ ๋ชจ๋ธ์ ์ฐพ์ ์ ์๋ค๋ ๋ฐ์์ด๋ค.
+
+์ด ๋ฐฉ๋ฒ๋ก ์ด ์ ์๋ ์ ์ ๋ **residual mapping์ด ๊ทธ๋ฅ identity mappingํ๋ ๋ฐฉ์๋ณด๋ค ์ต์ ํํ๊ธฐ ์ฝ๋ค**์ด๋ค.
+์ฆ, ์ง์ $H(x)=x$๋ฅผ ๋ชฉ์ ์ผ๋ก ํ์ตํ๋ ๊ฒ ๋ณด๋ค๋ ํ์ฌ block์ input(์ด์ block์ output)์ ์ ๋ณด($x$, identity)๋ฅผ ์ง๋ ์ฑ ์ถ๊ฐ์ ์ผ๋ก ํ์ตํ๋ ๊ฒ์ด ๋ ์ฌ์ด ํ์ต์ด ๋๋ค๋ ๊ฒ์ด๋ค.
+
+๋ํ, output์ $x$๋ฅผ ๋ํด์ฃผ๊ฒ ๋๋ฉด ๋ฏธ๋ถ์ ํด๋ $x$์ ๋ฏธ๋ถ๊ฐ์ 1์ด๊ธฐ ๋๋ฌธ์ ๊ฐ layer๋ค์ ์ต์ 1์ ๋ฏธ๋ถ๊ฐ์ ์ง๋๊ฒ ๋์ด ์์ ๋ฌธ์ ์๋ ๊ธฐ์ธ๊ธฐ ์์ค ๋ฌธ์ ๊ฐ ํด๊ฒฐ๋๋ค.
+
+์ด๋ฐ network๋ฅผ ๊ตฌ์ฑํ๊ธฐ ์ํด ์๋์ ๊ตฌ์กฐ์ ๊ฐ์ด ์ฌ๋ฌ layer๋ฅผ ๊ฑด๋๋ฐ์ด(skip) ํ layer์ output์ ๋ค์ layer์ input์ ๋ํด์ฃผ๋ ๊ตฌ์กฐ๋ฅผ ๋ง๋ค์๋ค.
+identity๊ฐ ๋ค์ output์ผ๋ก ๊ฐ๋ ์ง๋ฆ๊ธธ(shortcut)์ ๋ง๋ค์ด ์ฃผ์๋ค๊ณ ํด์ **shortcut connection**์ด๋ผ๊ณ ๋ ํ๋ค.
+
+
+
+์ด๋ ๊ฒ skip connection์ด ์ ์ฉ๋ ๋ถ๋ถ์ **residual block**์ด๋ผ๊ณ ํ๋ค.
+
+### Bottleneck Block
+
+Residual block์ ์ ์ค๊ฐ layer๋ฅผ 1x1 -> 3x3 -> 1x1 ์ bottleneck ๊ตฌ์กฐ๋ฅผ ๋ง๋ค์ด demension redeuction์ ํตํด ์ฐ์ฐ ์๊ฐ์ ์ค์ธ ๊ตฌ์กฐ์ด๋ค.
+
+
+
+๊ณ ์ ๋ layer๋ค์ ์ ์ธํ๋ฉด ํฌ๊ฒ 4๊ฐ์ layer๊ฐ ์๋ ๊ฒ์ ๋ณผ ์ ์๋๋ฐ, VGG์ ๋น์ทํ๊ฒ 3x3 conv์ padding 1์ ์ ์ฉํ์ฌ ํ๋์ ํฐ layer์์์๋ ourput size๊ฐ ๊ณ ์ ๋๋ ๊ฒ์ ๋ณผ ์ ์๋ค.
+
+
+
+๊ทธ๋ฆผ์ผ๋ก ๋ณด๋ฉด ์์ ๊ฐ์ ๊ตฌ์กฐ๋ฅผ ์ง๋๊ณ ์๋ค. VGG ๊ตฌ์กฐ๋ณด๋ค ํ์คํ ๊น์ ๊ตฌ์กฐ์ธ ๊ฒ์ ํ์ธํ ์ ์๋ค.
+
+***
+
+## Code with ResNet
+
+PyTorch์ Resnet์ ๋ฏ์ด๋ณด์.
+
+### BasicBlock
+
+๋จผ์ residual block์ด๋ค.
+
+```py
+class BasicBlock(nn.Module):
+ expansion = 1
+
+ def __init__(self, inplanes, planes, stride=1, downsample=None):
+ super(BasicBlock, self).__init__()
+ self.conv1 = conv3x3(inplanes, planes, stride)
+ self.bn1 = nn.BatchNorm2d(planes)
+ self.relu = nn.ReLU(inplace=True)
+ self.conv2 = conv3x3(planes, planes)
+ self.bn2 = nn.BatchNorm2d(planes)
+ self.downsample = downsample
+ self.stride = stride
+
+ def forward(self, x):
+ # x.shape = 3, 64, 64
+ identity = x
+ # identity = 3, 64, 64
+ out = self.conv1(x) # 3x3 stride = stride = 2
+ out = self.bn1(out)
+ out = self.relu(out)
+ # out.shape = 3, 32, 32
+ out = self.conv2(out) # 3x3 stride = 1
+ # out.shape = 3, 32, 32
+ out = self.bn2(out)
+ # out.shape = 3, 32, 32
+ # identity = 3, 64, 64 -> ๋ง์
๋ถ๊ฐ
+ if self.downsample is not None:
+ identity = self.downsample(x)
+
+ out += identity
+ out = self.relu(out)
+
+ return out
+```
+
+์์ ์ดํด๋ดค๋ residual block์ ๊ตฌ์กฐ์ ๋ค๋ฅด์ง ์์ ๋ชจ์ต์ด๋ค. 2๊ฐ์ 3x3 conv layer๋ฅผ ํต๊ณผํ๊ณ ๋ง์ง๋ง์ ์
๋ ฅ์ธ identity๋ฅผ ๋ํด์ค ํ output์ ๋ด์ด์ฃผ๋ ํํ์ด๋ค.
+
+๋ค๋ง ๋ค๋ฅธ ์ ์ด ์๋ค๋ฉด downsample์ด ์๋ ๊ฒ์ธ๋ฐ, ์ด๋ ์ฃผ์์ผ๋ก ์ฒ๋ฆฌ๋ ์์๋ก ์ค๋ช
์ด ๋๋ค. ๋ง์ฝ 3x64x64์ ์
๋ ฅ์ด ๋ค์ด์ค๊ณ `conv1`์ stride๋ฅผ 2๋ก ํ๋ค๋ฉด identity๋ฅผ ๋ํ๊ธฐ ์ ์ `out.shape`์ด 3x32x32๋ก ๊ธฐ์กด๊ณผ ๋ฌ๋ผ์ง๊ฒ ๋์ด identity์์ ๋ง์
์ด ๋ถ๊ฐ๋ฅํด์ง๋ค.
+์ด ๊ฒฝ์ฐ identity๋ฅผ downsampleํ์ฌ shape์ ๋ง์ถฐ์ค๋ค. ๊ทธ๋์ ๋ง์ฝ stride์ ๋ฐ๋ผ out์ shape์ด ๋ฌ๋ผ์ง๊ฒ ๋๋ ๊ฒฝ์ฐ downsample ์ต์
์ ์ฃผ์ด shape์ ๋ง์ถฐ์ผ ํ๋ค.
+
+### Bottleneck
+
+```py
+def conv3x3(in_planes, out_planes, stride=1):
+ """3x3 convolution with padding"""
+ return nn.Conv2d(in_planes, out_planes, kernel_size=3, stride=stride,
+ padding=1, bias=False)
+
+
+def conv1x1(in_planes, out_planes, stride=1):
+ """1x1 convolution"""
+ return nn.Conv2d(in_planes, out_planes, kernel_size=1, stride=stride, bias=False)
+
+class Bottleneck(nn.Module):
+ expansion = 4
+
+ def __init__(self, inplanes, planes, stride=1, downsample=None):
+ super(Bottleneck, self).__init__()
+ self.conv1 = conv1x1(inplanes, planes)
+ self.bn1 = nn.BatchNorm2d(planes)
+ self.conv2 = conv3x3(planes, planes, stride)
+ self.bn2 = nn.BatchNorm2d(planes)
+ self.conv3 = conv1x1(planes, planes * self.expansion)
+ self.bn3 = nn.BatchNorm2d(planes * self.expansion)
+ self.relu = nn.ReLU(inplace=True)
+ self.downsample = downsample
+ self.stride = stride
+
+ def forward(self, x):
+ identity = x
+
+ out = self.conv1(x) # 1x1 stride = 1
+ out = self.bn1(out)
+ out = self.relu(out)
+
+ out = self.conv2(out) # 3x3 stride = stride
+ out = self.bn2(out)
+ out = self.relu(out)
+
+ out = self.conv3(out) # 1x1 stride = 1
+ out = self.bn3(out)
+
+ if self.downsample is not None:
+ identity = self.downsample(x)
+
+ out += identity
+ out = self.relu(out)
+
+ return out
+```
+
+3x3 / 1x1 conv๋ฅผ ๋ฐ๋ก ์ ์ํ์ฌ ๋ชจ๋ธ์ ์ฌ์ฉํ๊ณ ์๋ ๋ชจ์ต์ด๋ค. ์ด ๋๋ ๊ฐ์ ์ด์ ๋ก downsample ์ต์
์ด ์๋ค.
+
+### ResNet
+
+์์ block class๋ค์ ์ด์ฉํด network๋ฅผ ๊ตฌ์ฑํ ์ฐจ๋ก์ด๋ค.
+
+#### _make_layer
+
+๋จผ์ layer๋ฅผ ๋ง๋ค์ด์ฃผ๋ ํจ์๋ถํฐ ๋ณด์.
+
+```py
+ # self.inplanes = 64
+ # self.layer1 = self._make_layer(block=Bottleneck, 64, layers[0]=3)
+ def _make_layer(self, block, planes, blocks, stride=1):
+
+ downsample = None
+
+ # identity ๊ฐ์ ๋ฎ์ถฐ์ shape์ ๋ง์ถฐ์ฃผ๊ธฐ ์ํจ. channel๋ ๋ง์ถฐ์ฃผ๊ธฐ.
+ if stride != 1 or self.inplanes != planes * block.expansion: # 64 != 64 * 4
+
+ downsample = nn.Sequential(
+ conv1x1(self.inplanes, planes * block.expansion, stride), #conv1x1(256, 512, 2) #conv1x1(64, 256, 2)
+ nn.BatchNorm2d(planes * block.expansion), #batchnrom2d(512) #batchnrom2d(256)
+ )
+
+ layers = []
+ layers.append(block(self.inplanes, planes, stride, downsample))
+ # layers.append(Bottleneck(64, 64, 1, downsample))
+
+ self.inplanes = planes * block.expansion #self.inplanes = 128 * 4
+
+ for _ in range(1, blocks):
+ layers.append(block(self.inplanes, planes)) # * 3
+
+ return nn.Sequential(*layers)
+```
+
+stride๊ฐ 1์ด ์๋๊ฑฐ๋ input๊ณผ output์ shape์ด ๋ง์ง ์์ ๊ฒฝ์ฐ downsample์ `conv1x1`์ ์ด์ฉํ์ฌ shape์ ๋ง์ถ ์ ์๊ฒ ์ค์ ํด์ค๋ค.
+
+๋ค์๋ถํฐ๋ layer์ ํฌ๊ธฐ์ ๋ง๊ฒ layer๋ฅผ block ๊ฐ์ ๋งํผ ๋ง๋ค์ด ์์ ํ์ ๋ฐํํ๋ค. ์ฃผ์์ ์
๋ ฅ ์์๋ฅผ ํตํด ๋ฐ๋ผ๊ฐ ๋ณด๋ฉด ์ดํด์ ์กฐ๊ธ ๋์์ด ๋ ๊ฒ ๊ฐ๋ค.
+
+### __init__
+
+```py
+ # model = ResNet(Bottleneck, [3, 4, 6, 3], **kwargs) => resnet 50
+ def __init__(self, block, layers, num_classes=1000, zero_init_residual=False):
+ super(ResNet, self).__init__()
+
+ self.inplanes = 64
+
+ self.conv1 = nn.Conv2d(3, 64, kernel_size=7, stride=2, padding=3, bias=False)
+
+ # outputs = self.conv1(inputs)
+ # outputs.shape = 64, 112, 112
+
+ self.bn1 = nn.BatchNorm2d(64)
+ self.relu = nn.ReLU(inplace=True)
+
+ # inputs = 64, 112, 112
+ self.maxpool = nn.MaxPool2d(kernel_size=3, stride=2, padding=1)
+ # output = 64, 56, 56
+
+ self.layer1 = self._make_layer(block, 64, layers[0]'''3''')
+ self.layer2 = self._make_layer(block, 128, layers[1]'''4''', stride=2)
+ self.layer3 = self._make_layer(block, 256, layers[2]'''6''', stride=2)
+ self.layer4 = self._make_layer(block, 512, layers[3]'''3''', stride=2)
+
+ self.avgpool = nn.AdaptiveAvgPool2d((1, 1))
+ self.fc = nn.Linear(512 * block.expansion, num_classes)
+
+ for m in self.modules(): # weight init
+ if isinstance(m, nn.Conv2d):
+ nn.init.kaiming_normal_(m.weight, mode='fan_out', nonlinearity='relu')
+ elif isinstance(m, nn.BatchNorm2d):
+ nn.init.constant_(m.weight, 1)
+ nn.init.constant_(m.bias, 0)
+
+ # Zero-initialize the last BN in each residual branch,
+ # so that the residual branch starts with zeros, and each residual block behaves like an identity.
+ # This improves the model by 0.2~0.3% according to https://arxiv.org/abs/1706.02677
+ if zero_init_residual:
+ for m in self.modules():
+ if isinstance(m, Bottleneck):
+ nn.init.constant_(m.bn3.weight, 0)
+ elif isinstance(m, BasicBlock):
+ nn.init.constant_(m.bn2.weight, 0)
+```
+
+์ด์ ์ ๋ง๋ค์๋ ํจ์๋ค์ ๋ชจ๋ ์ฌ์ฉํ์ฌ network๋ฅผ ๋ง๋ ๋ค. ๋จผ์ ๊ณ ์ ์ ์ผ๋ก ๋ค์ด๊ฐ 7x7 conv์ maxpooling layer๋ฅผ ๋ง๋ค์ด์ค๋ค.
+
+๋ค์์ผ๋ก๋ `_make_layer`๋ฅผ ํตํด ์
๋ ฅํ layer ๊ฐ์์ ๋ง๊ฒ layer๋ฅผ ์์ฑํ๋ค. ๋ง์ง๋ง์ผ๋ก 1x1๋ก average pooling์ ํ๊ณ class ๊ฐ์์ ๋ง์ถฐ fc layer๋ฅผ ํต๊ณผ์ํค๋ฉด ๋ชจ๋ ํ์ต์ด ๋๋๊ฒ ๋๋ค.
+
+๊ฐ์ค์น์ ์ด๊ธฐํ๋ conv์ ๊ฒฝ์ฐ `'fan_out'` mode์ `kaiming_normal_`๋ฅผ ์ฌ์ฉํ๊ณ , bn(batch normalize)์ ๊ฒฝ์ฐ wieght๋ฅผ 1, bias๋ฅผ 0์ผ๋ก ์ด๊ธฐํํ๋ค.
+`zero_init_residual`์ต์
์ ์ฃผ๋ฉด ํน์ layer์ wieght๋ฅผ 0์ผ๋ก ์ด๊ธฐํํ๋๋ฐ ์ด๋ ํด๋น ๋
ผ๋ฌธ์์ ์ด ์ํ์ ์ ์ฉํ์๋๋ ์ฑ๋ฅ์ด 0.2~0.3% ์ฌ๋๋ค๊ณ ํด์ ๋ค์ด๊ฐ ์๋ ์ต์
์ด๋ผ๊ณ ํ๋ค.
+
+### forward
+
+```py
+ def forward(self, x):
+ x = self.conv1(x)
+ x = self.bn1(x)
+ x = self.relu(x)
+ x = self.maxpool(x)
+
+ x = self.layer1(x)
+ x = self.layer2(x)
+ x = self.layer3(x)
+ x = self.layer4(x)
+
+ x = self.avgpool(x)
+ x = x.view(x.size(0), -1)
+ x = self.fc(x)
+
+ return x
+```
+
+`forward`์์๋ ์ง๊ธ๊น์ง ๋ง๋ค์๋ ๋ชจ๋ธ๋ค์ ์์๋๋ก ์ด์ด์ ํ์ต๋๋๋ก ํ๋ค.
+
+### ResNet Models
+
+```py
+def resnet18(pretrained=False, **kwargs):
+ model = ResNet(BasicBlock, [2, 2, 2, 2], **kwargs) #=> 2*(2+2+2+2) +1(conv1) +1(fc) = 16 +2 =resnet 18
+ return model
+
+def resnet50(pretrained=False, **kwargs):
+ model = ResNet(Bottleneck, [3, 4, 6, 3], **kwargs) #=> 3*(3+4+6+3) +(conv1) +1(fc) = 48 +2 = 50
+ return model
+
+def resnet152(pretrained=False, **kwargs):
+ model = ResNet(Bottleneck, [3, 8, 36, 3], **kwargs) # 3*(3+8+36+3) +2 = 150+2 = resnet152
+ return mode
+```
+
+์์ ๊ฐ์ ๋ฐฉ๋ฒ์ผ๋ก ์ฌ๋ฌ resnet์ ๋ง๋ค์ด ์ฌ์ฉํ ์ ์๋ค.
+
+ํ์ง๋ง ์ด๋ฏธ module๋ก ๋ค ๋ง๋ค์ด์ ธ ์๊ธฐ ๋๋ฌธ์ ์๋์ ๊ฐ์ด ๋ง๋ค์ด์ง ๊ฒ์ ์ฌ์ฉํด์ model์ ์์ฑํด๋ ์ ์์ ์ผ๋ก ์์ฑ๋๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
+
+```py
+import torchvision.models.resnet as resnet
+
+res = resnet.resnet50()
+res
+
+'''ourput
+ResNet(
+ (conv1): Conv2d(3, 64, kernel_size=(7, 7), stride=(2, 2), padding=(3, 3), bias=False)
+ (bn1): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
+ (relu): ReLU(inplace=True)
+ (maxpool): MaxPool2d(kernel_size=3, stride=2, padding=1, dilation=1, ceil_mode=False)
+ (layer1): Sequential(
+ (0): Bottleneck(
+ (conv1): Conv2d(64, 64, kernel_size=(1, 1), stride=(1, 1), bias=False)
+ (bn1): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
+ (conv2): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)
+ (bn2): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
+ (conv3): Conv2d(64, 256, kernel_size=(1, 1), stride=(1, 1), bias=False)
+ (bn3): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
+ (relu): ReLU(inplace=True)
+ (downsample): Sequential(
+ (0): Conv2d(64, 256, kernel_size=(1, 1), stride=(1, 1), bias=False)
+ (1): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
+ )
+ )
+ (1): Bottleneck(
+ (conv1): Conv2d(256, 64, kernel_size=(1, 1), stride=(1, 1), bias=False)
+ (bn1): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
+ (conv2): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)
+ (bn2): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
+ (conv3): Conv2d(64, 256, kernel_size=(1, 1), stride=(1, 1), bias=False)
+...
+ )
+ )
+ (avgpool): AdaptiveAvgPool2d(output_size=(1, 1))
+ (fc): Linear(in_features=2048, out_features=1000, bias=True)
+)
+'''
+```
+
+***
+
+## Train with ResNet
+
+[VGG](/posts/dlZeroToAll-PyTorch-10-5/)๋ฅผ ํตํด ํ์ตํ์ ๋์ ๋ง์ฐฌ๊ฐ์ง๋ก CIFAR10 data๋ฅผ ์ฌ์ฉํ์ฌ ํ์ต์ ์งํํ๋ค.
+
+### Data
+
+๋๋ถ๋ถ VGG ํ์ตํ ๋์ ๊ฐ๋ค. ๋ค๋ง ๋ค๋ฅธ ๋ถ๋ถ์ ์ค์ data์ ํ๊ท ๊ณผ ๋ถ์ฐ์ ๊ตฌํด์ normalize๋ฅผ ์งํํ๋ค.
+
+```py
+transform = transforms.Compose([
+ transforms.ToTensor()
+])
+
+trainset = torchvision.datasets.CIFAR10(root='./cifar10', train=True, download=True, transform=transform)
+
+print(trainset.data.shape)
+
+# ๊ฐ ์ถ๋ง๋ค ๊ตฌํด์ normalization
+train_data_mean = trainset.data.mean( axis=(0,1,2) )
+train_data_std = trainset.data.std( axis=(0,1,2) )
+
+
+print(train_data_mean)
+print(train_data_std)
+
+train_data_mean = train_data_mean / 255
+train_data_std = train_data_std / 255
+
+print(train_data_mean)
+print(train_data_std)
+
+transform_train = transforms.Compose([
+ transforms.RandomCrop(32, padding=4),
+ transforms.ToTensor(),
+ transforms.Normalize(train_data_mean, train_data_std)
+])
+
+transform_test = transforms.Compose([
+ transforms.ToTensor(),
+ transforms.Normalize(train_data_mean, train_data_std)
+])
+
+trainset = torchvision.datasets.CIFAR10(root='./cifar10', train=True,
+ download=True, transform=transform_train)
+trainloader = torch.utils.data.DataLoader(trainset, batch_size=256,
+ shuffle=True, num_workers=0)
+
+testset = torchvision.datasets.CIFAR10(root='./cifar10', train=False,
+ download=True, transform=transform_test)
+
+testloader = torch.utils.data.DataLoader(testset, batch_size=256,
+ shuffle=False, num_workers=0)
+
+classes = ('plane', 'car', 'bird', 'cat',
+ 'deer', 'dog', 'frog', 'horse', 'ship', 'truck')
+```
+
+### Model
+
+์ด๋ฒ ๊ฐ์์์๋ pyTorch์ ResNet์ ์ฌ์ฉํ์ง ์๊ณ ์์์ ์ ์ํ class๋ฅผ ์ฌ์ฉํ์ฌ ํ์ต์ ์งํํ๋ค.
+์์์ ๋ง๋ class์ ํจ์๋ค์ resnet.py์ ์ ์ฅํด์ฃผ๊ณ importํ์ฌ ์ฌ์ฉํ๋ค.
+
+```py
+import resnet/
+
+conv1x1=resnet.conv1x1
+Bottleneck = resnet.Bottleneck
+BasicBlock= resnet.BasicBlock
+```
+
+๊ฐ ๋ธ๋ก๋ค์ ๋จผ์ ์ ์ํด์ค๋ค.
+
+```py
+class ResNet(nn.Module):
+
+ def __init__(self, block, layers, num_classes=1000, zero_init_residual=False):
+ super(ResNet, self).__init__()
+ self.inplanes = 16
+ self.conv1 = nn.Conv2d(3, 16, kernel_size=3, stride=1, padding=1,
+ bias=False)
+ self.bn1 = nn.BatchNorm2d(16)
+ self.relu = nn.ReLU(inplace=True)
+ #self.maxpool = nn.MaxPool2d(kernel_size=3, stride=2, padding=1) => ์ฌ์ด์ฆ ์์์ ํ์ ์์
+
+ self.layer1 = self._make_layer(block, 16, layers[0], stride=1)
+ self.layer2 = self._make_layer(block, 32, layers[1], stride=1)
+ self.layer3 = self._make_layer(block, 64, layers[2], stride=2)
+ self.layer4 = self._make_layer(block, 128, layers[3], stride=2)
+
+ self.avgpool = nn.AdaptiveAvgPool2d((1, 1))
+ self.fc = nn.Linear(128 * block.expansion, num_classes)
+
+ for m in self.modules():
+ if isinstance(m, nn.Conv2d):
+ nn.init.kaiming_normal_(m.weight, mode='fan_out', nonlinearity='relu')
+ elif isinstance(m, nn.BatchNorm2d):
+ nn.init.constant_(m.weight, 1)
+ nn.init.constant_(m.bias, 0)
+
+ # Zero-initialize the last BN in each residual branch,
+ # so that the residual branch starts with zeros, and each residual block behaves like an identity.
+ # This improves the model by 0.2~0.3% according to https://arxiv.org/abs/1706.02677
+ if zero_init_residual:
+ for m in self.modules():
+ if isinstance(m, Bottleneck):
+ nn.init.constant_(m.bn3.weight, 0)
+ elif isinstance(m, BasicBlock):
+ nn.init.constant_(m.bn2.weight, 0)
+
+ def _make_layer(self, block, planes, blocks, stride=1):
+ downsample = None
+ if stride != 1 or self.inplanes != planes * block.expansion:
+ downsample = nn.Sequential(
+ conv1x1(self.inplanes, planes * block.expansion, stride),
+ nn.BatchNorm2d(planes * block.expansion),
+ )
+
+ layers = []
+ layers.append(block(self.inplanes, planes, stride, downsample))
+ self.inplanes = planes * block.expansion
+ for _ in range(1, blocks):
+ layers.append(block(self.inplanes, planes))
+
+ return nn.Sequential(*layers)
+
+ def forward(self, x):
+ x = self.conv1(x)
+ #x.shape =[1, 16, 32,32]
+ x = self.bn1(x)
+ x = self.relu(x)
+ #x = self.maxpool(x)
+
+ x = self.layer1(x)
+ #x.shape =[1, 128, 32,32]
+ x = self.layer2(x)
+ #x.shape =[1, 256, 32,32]
+ x = self.layer3(x)
+ #x.shape =[1, 512, 16,16]
+ x = self.layer4(x)
+ #x.shape =[1, 1024, 8,8]
+
+ x = self.avgpool(x)
+ x = x.view(x.size(0), -1)
+ x = self.fc(x)
+
+ return x
+```
+
+์ ์ํ ๋ธ๋ก๋ค์ ์ฌ์ฉํ์ฌ ์์ ๊ตฌํํ๋ ๊ฒ๊ณผ ๊ฐ์ด network๋ฅผ ๊ตฌ์ฑํ๋ค.
+๋ค๋ง CIFAR10์ ์ด๋ฏธ์ง ์ฌ์ด์ฆ๊ฐ imagenet๋ณด๋ค ์๊ธฐ ๋๋ฌธ์ ๊ทธ์ ๋ง๊ฒ ์ฒซ conv์ kernel size๋ฅผ 3์ผ๋ก ์กฐ์ ํด์ฃผ๊ณ , pooling์ ์์ ๋ฉฐ,
+layer์ `inplanes`๋ (64, 128, 256, 512)์์ (16, 32, 64, 128)๋ก ๋ฐ๊ฟ์ค๋ค.
+
+์ดํ๋ก ๋ค๋ฅธ ์ ์ ํฌ๊ฒ ์์ด visdom์ ํตํ ๊ฒฐ๊ณผ๋ง ํ ๋ฒ ํ์ธํด ๋ณด๋ฉด ๋ค์๊ณผ ๊ฐ์ด 80%์ ์ ํ๋๊น์ง ํ์ต์ด ๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.(20 epoch ์งํ)
+
+
+
+#### Image Source
+
+* 20-layer vs. 56-layer plain network, Residual Block, ResNet Models Table, Resnet-34 Architecture: [https://arxiv.org/pdf/1512.03385.pdf](https://arxiv.org/pdf/1512.03385.pdf)
+* Bottleneck Bock: [http://icml.cc/2016/tutorials/icml2016_tutorial_deep_residual_networks_kaiminghe.pdf](http://icml.cc/2016/tutorials/icml2016_tutorial_deep_residual_networks_kaiminghe.pdf)
\ No newline at end of file
diff --git a/_posts/2022-06-04-dlZeroToAll-PyTorch-11-0.markdown b/_posts/2022-06-04-dlZeroToAll-PyTorch-11-0.markdown
new file mode 100644
index 00000000000..9b7d0aeaa82
--- /dev/null
+++ b/_posts/2022-06-04-dlZeroToAll-PyTorch-11-0.markdown
@@ -0,0 +1,58 @@
+---
+title: "๋ชจ๋๋ฅผ ์ํ ๋ฅ๋ฌ๋ 2 - Lab11-0: RNN intro"
+author: Kwon
+date: 2022-06-04T00:00:00 +0900
+categories: [pytorch, study]
+tags: [rnn]
+math: true
+mermaid: false
+---
+
+[๋ชจ๋๋ฅผ ์ํ ๋ฅ๋ฌ๋](https://deeplearningzerotoall.github.io/season2/lec_pytorch.html) Lab11-0: RNN intro ๊ฐ์๋ฅผ ๋ณธ ํ ๊ณต๋ถ๋ฅผ ๋ชฉ์ ์ผ๋ก ์์ฑํ ๊ฒ์๋ฌผ์
๋๋ค.
+
+***
+
+## RNN(Recurrent Neural Network)
+
+RNN์ sequential data๋ฅผ ์ ํ์ตํ๊ธฐ ์ํด ๊ณ ์๋ ๋ชจ๋ธ์ด๋ค. Sequential data๋ ๋จ์ด, ๋ฌธ์ฅ์ด๋ ์๊ฒ์ด ๋ฐ์ดํฐ์ ๊ฐ์ด ๋ฐ์ดํฐ์ ์์๋ ๋ฐ์ดํฐ์ ์ผ๋ถ์ธ ๋ฐ์ดํฐ๋ค์ ๋งํ๋ค.
+์ด๋ฐ ๋ฐ์ดํฐ๋ ์ด์ ์์์ ๋ฐ์ดํฐ๋ค์ ์๊ฐํ์ฌ ํ์ต์ ํ๋ ๊ฒ์ด ๋ํจ๊ณผ์ ์ผ ๊ฒ์ด๋ค.
+์ด๋ ๊ฒ ํ์ตํ๊ธฐ ์ํด RNN์ ๋ค์๊ณผ ๊ฐ์ ๊ตฌ์กฐ๋ก ๊ตฌ์ฑ๋์ด ์๋ค.
+
+
+
+ํ ๋ชจ๋ธ๋ก ๊ณ์ ํ์ตํ์ง๋ง ์ด์ ์ output์ด ๋ค์์ input๊ณผ ํจ๊ป ๋ค์ด๊ฐ๋ ๊ตฌ์กฐ์ด๋ค. ์ด๋ ๊ฒ output์ ๋ค์ input์ผ๋ก ๋ณด๋ผ ๋ ์ด ๊ฐ์ hidden state๋ผ๊ณ ํ๋ฉฐ, ์ด๋ฐ ์์ผ๋ก ๋ชจ๋ธ์ ๊ตฌ์ฑํ๋ฉด ๊ณผ๊ฑฐ์ ๋ฐ์ดํฐ๋ฅผ ๋ฐ์ํ์ฌ ํ์ตํ ์ ์๊ฒ ๋๋ค.
+
+์ด๋ RNN ๋ด๋ถ์ actiavtion์ tanh๋ sigmoid function์ ์ฌ์ฉํ๋ค. ์ง๊ธ๊น์ง ๋ด์๋ network๋ค์ ๊ธฐ์ธ๊ธฐ ์์ค ๋ฌธ์ ๋๋ฌธ์ ReLU๋ฅผ ์ฌ์ฉํด์ผ ์ฑ๋ฅ์ด ๋ ์ข์์ง๋ค๊ณ ํ๋ ๊ฒ ๊ฐ์๋ฐ RNN์ ๋ด๋ถ์์๋ ์ ์ฌ์ฉํ์ง ์๋ ๊ฑธ๊น.
+๊ทธ ์ด์ ๋ RNN์ ๊ตฌ์กฐ ๋๋ฌธ์ธ๋ฐ, RNN์ ๊ฐ์ layer๋ฅผ ์ฌ๋ฌ๋ฒ ๋ฐ๋ณตํ์ฌ ํ์ตํ๋ ๊ตฌ์กฐ๋ฅผ ๊ฐ์ง๋ค. ์ด๋ ReLU์ ๊ฐ์ activation์ ์ฌ์ฉํ๋ฉด 1๋ณด๋ค ํฐ ์๊ฐ ๋ฐ๋ณตํ์ฌ ๊ณฑํด์ง๊ธฐ ๋๋ฌธ์ **๊ธฐ์ธ๊ธฐ ํญ๋ฐ**์ด ๋ฐ์ํ ๊ฐ๋ฅ์ฑ์ด ๋งค์ฐ ๋๋ค.
+๊ทธ๋์ RNN์ ๋ด๋ถ์์ ๋งํผ์ ์ ๋๊ฐ์ด 1์ ๋์ง ์์ tanh๋ sigmoid๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด๋ค.
+
+Acivation์ ํํํ์ฌ ์กฐ๊ธ ๋ ์์ธํ ๋ชจ๋ธ์ ๋ํ๋ด๋ฉด ๋ค์๊ณผ ๊ฐ์ ๊ตฌ์กฐ๋ฅผ ํ์ธํ ์ ์๋ค.
+
+
+
+์ผ๋ฐํํ์ฌ ์์์ผ๋ก ๋ํ๋ด๋ฉด ๋ค์๊ณผ ๊ฐ๊ณ
+
+\\[h_t=f(h_{t-1}, x_t)\\]
+
+activation๊ณผ weight๋ฅผ ๋ช
์ํ์ฌ ํํํ๋ฉด ๋ค์๊ณผ ๊ฐ๋ค.
+
+\\[h_t=tanh(W_h h_{t-1}, W_x x_t)\\]
+
+***
+
+## Usages of RNN
+
+์ด๋ฐ RNN์ ๊ตฌ์กฐ๋ฅผ ์์ฉํ์ฌ ๋ค์๊ณผ ๊ฐ์ ๊ตฌ์กฐ๋ค๋ก ์ฌ์ฉํ ์ ์๋ค.
+
+
+
+* **one to many**
+: ํ๋์ ์
๋ ฅ์ ๋ฐ์ ์ฌ๋ฌ ์ถ๋ ฅ์ ๋ด๋ ๊ตฌ์กฐ์ด๋ค. ํ๋์ ์ด๋ฏธ์ง๋ฅผ ๋ฐ์ ๊ทธ์ ๋ํ ์ค๋ช
์ ๋ฌธ์ฅ(์ฌ๋ฌ๊ฐ์ ๋จ์ด)์ผ๋ก ์ถ๋ ฅํ๋ ๊ฒ์ ์๋ก ๋ค ์ ์๋ค.
+
+* **many to one**
+: ์ฌ๋ฌ ์
๋ ฅ์ ๋ฐ์ ํ๋์ ์ถ๋ญ์ ๋ด๋ ๊ตฌ์กฐ์ด๋ค. ๋ฌธ์ฅ์ ์
๋ ฅ๋ฐ์ ๊ทธ ๋ฌธ์ฅ์ด ๋ํ๋ด๋ ๊ฐ์ ์ label์ ์ถ๋ ฅํ๋ ๊ฒ์ ์๋ก ๋ค ์ ์๋ค.
+
+* **many to many**
+: 2๊ฐ์ง์ ๊ตฌ์กฐ๊ฐ ์๋ ๊ฒ์ ๋ณผ ์ ์๋ค.
+ - ์
๋ ฅ์ด ๋ค ๋๋๋ ์ง์ ๋ถํฐ ์ฌ๋ฌ ์ถ๋ ฅ์ ๋ด๋ ๊ตฌ์กฐ๋ก, ๋ฌธ์ฅ์ ์
๋ ฅ๋ฐ์ ๋ฒ์ญํ๋ ๋ชจ๋ธ์ ์๋ก ๋ค ์ ์๋ค. ์ด ๊ฒฝ์ฐ ๋ฌธ์ฅ์ ์ค๊ฐ์ ๋ฒ์ญ์ ์งํํ๋ฉด ๋ค ๋๋๊ณ ๋์ ๋ฌธ์ฅ์ ์๋ฏธ๊ฐ ๋ฌ๋ผ์ง ์ ์๊ธฐ ๋๋ฌธ์ ๋จผ์ ์
๋ ฅ ๋ฌธ์ฅ์ ๋ค ๋ฃ๊ณ ๋ฒ์ญ์ ์งํํ๊ฒ ๋๋ค.
+ - ์
๋ ฅ ํ๋ํ๋๋ฅผ ๋ฐ์ผ๋ฉด์ ๊ทธ๋๋ง๋ค ๋ชจ๋ธ์ ์ถ๋ ฅ์ ๋ด๋ ๊ตฌ์กฐ์ด๋ค. ์์์ ์ฒ๋ฆฌํ ๋ frame ๋จ์์ ์ด๋ฏธ์ง๋ก ๋๋ ์
๋ ฅ์ ๋ฐ์ ํ ๊ฐ frame์ ์
๋ ฅ ๋ฐ์ ๋๋ง๋ค ์ฒ๋ฆฌํ๋ ๊ฒ์ ์๋ก ๋ค ์ ์๋ค.
\ No newline at end of file
diff --git a/_posts/2022-06-06-dlZeroToAll-PyTorch-11-1.markdown b/_posts/2022-06-06-dlZeroToAll-PyTorch-11-1.markdown
new file mode 100644
index 00000000000..80fec07b48f
--- /dev/null
+++ b/_posts/2022-06-06-dlZeroToAll-PyTorch-11-1.markdown
@@ -0,0 +1,95 @@
+---
+title: "๋ชจ๋๋ฅผ ์ํ ๋ฅ๋ฌ๋ 2 - Lab11-1: RNN Baisics"
+author: Kwon
+date: 2022-06-06T00:00:00 +0900
+categories: [pytorch, study]
+tags: [rnn]
+math: true
+mermaid: false
+---
+
+[๋ชจ๋๋ฅผ ์ํ ๋ฅ๋ฌ๋](https://deeplearningzerotoall.github.io/season2/lec_pytorch.html) Lab11-1: RNN Baisics ๊ฐ์๋ฅผ ๋ณธ ํ ๊ณต๋ถ๋ฅผ ๋ชฉ์ ์ผ๋ก ์์ฑํ ๊ฒ์๋ฌผ์
๋๋ค.
+
+***
+
+## with PyTorch
+
+PyTorch์์ RNN์ in/output size๋ง ์ ๋ง์ถฐ์ฃผ๋ฉด ๋ฐ๋ก ์ฌ์ฉ์ด ๊ฐ๋ฅํ๋ค.
+**"h, e, l, o"** 4๊ฐ์ ์ํ๋ฒณ์ผ๋ก ์ด๋ฃจ์ด์ง ๋ฐ์ดํฐ์
์ ํตํด 2์ฐจ์์ output(class๊ฐ 2๊ฐ)์ ๋ด๋ RNN์ ๋ง๋ค์ด๋ณผ ๊ฒ์ด๋ค.
+
+```py
+import torch
+import numpy as np
+
+torch.manual_seed(0)
+
+input_size = 4
+hidden_size = 2
+
+# one-hot encoding
+h = [1, 0, 0, 0]
+e = [0, 1, 0, 0]
+l = [0, 0, 1, 0]
+o = [0, 0, 0, 1]
+input_data_np = np.array([[h, e, l, l, o], [e, o, l, l, l], [l, l, e, e, l]], dtype=np.float32)
+
+# transform as torch tensor
+input_data = torch.Tensor(input_data_np)
+```
+
+์์ ๊ฐ์ด one-hot encodingํ์ฌ ๋ฐ์ดํฐ๋ฅผ ๋ง๋ค๋ค๊ณ Tensor๋ก ๋ฐ๊ฟ์ค๋ค.
+์ํ๋ฒณ์ ๊ทธ๋ฅ ์ซ์(index)๋ฅผ ๋ถ์ฌ ์ฌ์ฉํ์ง ์๊ณ ๊ตณ์ด one-hot encoding์ ํ๋ ์ด์ ๋ ์ซ์ ํฌ๊ธฐ์ ๋ฐ๋ผ network๊ฐ ์๋ฏธ๋ฅผ ๋ถ์ฌํ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค.
+์ค์ ๋ก๋ ๊ทธ์ ์ํ๋ฒณ์ผ ๋ฟ์ด์ง๋ง ๋ ํฐ ์ซ์๋ฅผ ํ ๋น ๋ฐ์ ์ํ๋ฒณ์ ๋ ์ค์ํ๊ฒ ์๊ฐํ๋ฉด์ ํ์ตํ ์ ์๋ค๋ ๊ฒ์ด๋ค.
+
+๋ค์ ๋์์ค๋ฉด ์ํ๋ฒณ์ ์ข
๋ฅ๊ฐ 4๊ฐ์ง์ด๊ธฐ ๋๋ฌธ์ input data์ ํ ์ฐจ์์ 4๋ก shape์ด `(-, -, 4)`๊ฐ ๋๊ณ ,
+๋จ์ด์ ๊ธธ์ด(**sequence length**)๊ฐ 5์ด๋ฏ๋ก shape์ `(-, 5, 4),`
+๋ง์ง๋ง์ผ๋ก data์ ๊ฐ์๊ฐ 3๊ฐ(**batch size**)์ด๊ธฐ ๋๋ฌธ์ shape์ด `(3, 5, 4)`๊ฐ ๋๋ค.
+
+๋ค์์ผ๋ก RNN layer๋ฅผ ๋ง๋ค ์ฐจ๋ก์ด๋ค. `torch.nn.RNN`์ ํตํด RNN layer๋ฅผ ๋ง๋ค ์ ์์ผ๋ฉฐ ์ด๋ in/output size๋ฅผ ์ง์ ํด์ฃผ์ด์ผ ํ๋ค.
+input size์ ์ํ๋ฒณ์ ์ข
๋ฅ(4)๊ฐ ๋๊ณ output size๋ ์ฐ๋ฆฌ๊ฐ ์ํ๋ class์ ๊ฐ์(2)๊ฐ ๋๋ค.
+sequence length์ abtch size๋ input๊ณผ ๋์ผํ๋ฉฐ, data๋ง ์ ๋ง๋ค์ด์ ๋ฃ์ด์คฌ๋ค๋ฉด PyTorch์์ ์์์ ์ฒ๋ฆฌํด์ฃผ๊ธฐ ๋๋ฌธ์ ๋ฐ๋ก ์
๋ ฅํ ํ์๊ฐ ์๋ค.
+
+```py
+rnn = torch.nn.RNN(input_size, hidden_size)
+
+outputs, _status = rnn(input_data)
+print(outputs)
+print(outputs.size())
+
+'''output
+tensor([[[-0.7497, -0.6135],
+ [-0.5282, -0.2473],
+ [-0.9136, -0.4269],
+ [-0.9136, -0.4269],
+ [-0.9028, 0.1180]],
+
+ [[-0.5753, -0.0070],
+ [-0.9052, 0.2597],
+ [-0.9173, -0.1989],
+ [-0.9173, -0.1989],
+ [-0.8996, -0.2725]],
+
+ [[-0.9077, -0.3205],
+ [-0.8944, -0.2902],
+ [-0.5134, -0.0288],
+ [-0.5134, -0.0288],
+ [-0.9127, -0.2222]]], grad_fn=)
+torch.Size([3, 5, 2])
+'''
+```
+
+ํ ๊ฐ์ง ์ด์ํ๋ค๊ณ ์๊ฐํ ์ ์๋ ๋ถ๋ถ์ด ์๋ค. ๋ถ๋ช
output size์ ์
๋ ฅํ๋ค๊ณ ํ๋๋ฐ `hidden_size`๋ผ๊ณ ์ ์ํ์ฌ ๋ฃ์๋ค.
+์ด๋ RNN์ ๋ด๋ถ ๊ตฌ์กฐ๋ฅผ ๋ณด๋ฉด ์ ์ ์๋ค.
+
+
+
+๋นจ๊ฐ ๋ฐ์ค ๋ถ๋ถ์ ๋ณด๋ฉด hidden์ผ๋ก ๋์ด๊ฐ๋ ๋ถ๋ถ๊ณผ output์ผ๋ก ๋๊ฐ๋ data๊ฐ ๊ฒฐ๊ตญ ๊ฐ์ data์์ ๋๋ ์ง๋ ๊ฒ์ ๋ณผ ์ ์๋ค.
+๊ทธ๋ฌ๋ฏ๋ก hidden size์ output size๋ ๊ฐ๋ค. ์ด ๋๋ฌธ์ `hidden_size`๋ผ๊ณ ์ ์ํ์ฌ ๋ฃ์ ๊ฒ์ด๋ค.
+
+### Data shape in RNN
+
+์์ ๋์จ shape์ ์ ๋ฆฌํด ๋ณด๋ฉด ๋ค์๊ณผ ๊ฐ๋ค.
+
+
+
+(batch_size, sequence_length, dimension) ์์ผ๋ก ๋ฐ์ดํฐ๊ฐ ๊ตฌ์ฑ๋๋ฉฐ, ์์ ์ธ๊ธํ ๋๋ก in/output size๋ง ์ ๋ฃ์ด์ฃผ๋ฉด ๋๋จธ์ง๋ PyTorch๊ฐ ๋ฐ์ดํฐ์ ๋ง๊ฒ ์ฒ๋ฆฌํด์ค๋ค.
\ No newline at end of file
diff --git a/_posts/2022-06-06-dlZeroToAll-PyTorch-11-2.markdown b/_posts/2022-06-06-dlZeroToAll-PyTorch-11-2.markdown
new file mode 100644
index 00000000000..4faba9bdd34
--- /dev/null
+++ b/_posts/2022-06-06-dlZeroToAll-PyTorch-11-2.markdown
@@ -0,0 +1,167 @@
+---
+title: "๋ชจ๋๋ฅผ ์ํ ๋ฅ๋ฌ๋ 2 - Lab11-2: RNN - hihello / charseq"
+author: Kwon
+date: 2022-06-06T01:00:00 +0900
+categories: [pytorch, study]
+tags: [rnn]
+math: true
+mermaid: false
+---
+
+[๋ชจ๋๋ฅผ ์ํ ๋ฅ๋ฌ๋](https://deeplearningzerotoall.github.io/season2/lec_pytorch.html) Lab11-2: RNN - hihello / charseq ๊ฐ์๋ฅผ ๋ณธ ํ ๊ณต๋ถ๋ฅผ ๋ชฉ์ ์ผ๋ก ์์ฑํ ๊ฒ์๋ฌผ์
๋๋ค.
+
+***
+
+## 'hihello' problem
+
+hihello ๋ฌธ์ ๋ ๊ฐ์ ๋ฌธ์๋ค์ด ๋ค์ ๋ฌธ์๊ฐ ๋ค๋ฅธ ๊ฒฝ์ฐ ์ด๋ฅผ ์์ธกํ๋ ๋ฌธ์ ๋ฅผ ๋งํ๋ค.
+hihello์์ 'h'์ 'l'์ 2๋ฒ์ฉ ๋ฑ์ฅํ์ง๋ง ์ด๋์ ๋ฌธ์๊ฐ ์์นํ๋๋์ ๋ฐ๋ผ ๋ค์์ ์ฌ ๋ฌธ์๊ฐ ๋ฌ๋ผ์ง๋ค.
+์ด๋ฐ ๊ฒฝ์ฐ๊ฐ RNN์ **hidden state**๊ฐ ๋น์ ๋ฐํํ๋ ๊ฒฝ์ฐ์ด๋ค. ์ํ๋ฒณ ๋ง์ผ๋ก ํ๋ณํ ์ ์์ง๋ง ์์๋ฅผ ๊ธฐ์ตํ์ฌ ๋ท ๋ฌธ์๋ฅผ ์์ธกํ๋๋ฐ ๋์์ด ๋๊ธฐ ๋๋ฌธ์ด๋ค.
+
+### with Code
+
+[lab11-1](/posts/dlZeroToAll-PyTorch-11-1/)์ ์ฝ๋๋ฅผ ํ์ฅํ์ฌ ์ผ๋ฐํํ ๊ฒ์ด๋ค.
+์ ์ฒด์ ์ธ ๊ตฌ์กฐ๋ ๊ฑฐ์ ๋์ผํ๊ธฐ ๋๋ฌธ์ ์ถ๊ฐ๋ ๋ถ๋ถ์ ์ด์ ์ ๋ง์ถฐ ์ดํด๋ณด๋ ค ํ๋ค.
+
+```py
+char_set = ['h', 'i', 'e', 'l', 'o']
+
+# hyper parameters
+input_size = len(char_set)
+hidden_size = len(char_set)
+learning_rate = 0.1
+
+# data setting
+x_data = [[0, 1, 0, 2, 3, 3]]
+x_one_hot = [[[1, 0, 0, 0, 0],
+ [0, 1, 0, 0, 0],
+ [1, 0, 0, 0, 0],
+ [0, 0, 1, 0, 0],
+ [0, 0, 0, 1, 0],
+ [0, 0, 0, 1, 0]]]
+y_data = [[1, 0, 2, 3, 3, 4]]
+
+X = torch.FloatTensor(x_one_hot)
+Y = torch.LongTensor(y_data)
+```
+
+๋ง์ฐฌ๊ฐ์ง๋ก one-hot encodingํ์ฌ Tensor๋ก ๋ฐ๊พผ๋ค. ๋ค๋ง ๊ฐ ์ํ๋ฒณ ๋ณ์์ ๋ฐฐ์ด์ ์ ์ฅํ๋ ๋ฐฉ์์ด ์๋๋ผ `char_set`์ ์ ์ฅ๋ ์ํ๋ฒณ์ `x_data`์ ๊ฐ์ ์ธ๋ฑ์ค๋ก ๋ถ๋ฌ์ค๋ ๋ฐฉ์์ด๋ค.
+one-hot encoding์ `x_data`์ ์ ์ฉํ์ฌ ํ์ตํ๋ค.
+
+๋ฐ์ดํฐ๋ฅผ ์์ธํ ๋ณด๋ฉด input(x)์ ๋ง์ง๋ง ๋ฌธ์๊ฐ ์๊ณ target(y)์ ์ฒซ ๋ฌธ์๊ฐ ์๋ ๊ฒ์ ๋ณผ ์ ์๋๋ฐ,
+์ด๊ฑด ๊ฐ ์ฐจ์์ RNN์ด ๋ค์ ๋ฌธ์๋ฅผ ์ถ๋ ฅํ๊ธฐ ๋๋ฌธ์ด๋ค. input์
+
+๋ค์์ ๋ชจ๋ธ๊ณผ loss, optimizer๋ฅผ ๋ง๋ค์ด์ค๋ค. ๋ง์ฐฌ๊ฐ์ง๋ก `torch.nn.RNN`๋ฅผ ์ฌ์ฉํ์ฌ ์ ์ํ๋ค.
+
+```py
+rnn = torch.nn.RNN(input_size, hidden_size, batch_first=True) # batch_first guarantees the order of output = (B, S, F)
+
+# loss & optimizer setting
+criterion = torch.nn.CrossEntropyLoss()
+optimizer = optim.Adam(rnn.parameters(), learning_rate)
+```
+
+```py
+# start training
+for i in range(100):
+ optimizer.zero_grad()
+ outputs, _status = rnn(X)
+ loss = criterion(outputs.view(-1, input_size), Y.view(-1))
+ loss.backward()
+ optimizer.step()
+
+ result = outputs.data.numpy().argmax(axis=2)
+ result_str = ''.join([char_set[c] for c in np.squeeze(result)])
+ print(i, "loss: ", loss.item(), "prediction: ", result, "true Y: ", y_data, "prediction str: ", result_str)
+
+'''output
+0 loss: 1.7802648544311523 prediction: [[1 1 1 1 1 1]] true Y: [[1, 0, 2, 3, 3, 4]] prediction str: iiiiii
+1 loss: 1.4931954145431519 prediction: [[1 4 1 1 4 4]] true Y: [[1, 0, 2, 3, 3, 4]] prediction str: ioiioo
+2 loss: 1.3337129354476929 prediction: [[1 3 2 3 1 4]] true Y: [[1, 0, 2, 3, 3, 4]] prediction str: ilelio
+3 loss: 1.215295433998108 prediction: [[2 3 2 3 3 3]] true Y: [[1, 0, 2, 3, 3, 4]] prediction str: elelll
+4 loss: 1.1131411790847778 prediction: [[2 3 2 3 3 3]] true Y: [[1, 0, 2, 3, 3, 4]] prediction str: elelll
+5 loss: 1.0241888761520386 prediction: [[2 3 2 3 3 4]] true Y: [[1, 0, 2, 3, 3, 4]] prediction str: elello
+6 loss: 0.9573155045509338 prediction: [[2 3 2 3 3 4]] true Y: [[1, 0, 2, 3, 3, 4]] prediction str: elello
+7 loss: 0.9102011322975159 prediction: [[2 0 2 3 3 4]] true Y: [[1, 0, 2, 3, 3, 4]] prediction str: ehello
+...
+96 loss: 0.5322802066802979 prediction: [[1 3 2 3 3 4]] true Y: [[1, 0, 2, 3, 3, 4]] prediction str: ilello
+97 loss: 0.5321123003959656 prediction: [[1 3 2 3 3 4]] true Y: [[1, 0, 2, 3, 3, 4]] prediction str: ilello
+98 loss: 0.5319531559944153 prediction: [[1 3 2 3 3 4]] true Y: [[1, 0, 2, 3, 3, 4]] prediction str: ilello
+99 loss: 0.5317898392677307 prediction: [[1 3 2 3 3 4]] true Y: [[1, 0, 2, 3, 3, 4]] prediction str: ilello
+```
+
+ํ์ต์ ์งํํ๋ ๊ฒ์ ํฌ๊ฒ ํน์ดํ ์ ์ ์๊ณ ๊ฒฐ๊ณผ๋ฅผ ๋ผ๋ `argmax`๋ฅผ ํตํด one-hot vector๋ฅผ index ๊ฐ์ผ๋ก ๋ฐ๊ฟ์ค์ผ ํ๋ค. ์ด๋ ๊ฒ ๋ฐ๊พผ output์ `''.join([char_set[c] for c in np.squeeze(result)])`๋ฅผ ํตํด ์ค์ ๋จ์ด๋ก ๋ฐ๊ฟ ์ถ๋ ฅํ ์ ์๋ค.
+
+๊ฒฐ๊ณผ๋ฅผ ๋ณด๋ฉด ์ฒ์์๋ ์ด์ํ ๋จ์ด๋ค์ด ๋์ค๋ค๊ฐ ๋ง์ง๋ง์ ๋ค์์๋ ์ฒซ ๋ฌธ์๋ฅผ ์ ์ธํ 'ilello'๊ฐ ์ ๋๋ก ๋์จ ๊ฒ์ ํ์ธํ ์ ์๋ค.
+
+***
+
+## Charseq
+
+์ง๊ธ๊น์ง ํ๋ ๊ฒ์ ๋ค์ ํ๋ฒ ์ผ๋ฐํ ์์ผ ์์์ ๋ฌธ์ฅ๋ ํ์ตํ ์ ์๋๋ก ํ๋ค.
+
+### Data
+
+```py
+sample = " if you want you"
+
+# make dictionary
+char_set = list(set(sample))
+char_dic = {c: i for i, c in enumerate(char_set)}
+print(char_dic)
+
+'''output
+
+{'o': 0, 'n': 1, 'a': 2, ' ': 3, 'w': 4, 'i': 5, 'y': 6, 't': 7, 'u': 8, 'f': 9}
+'''
+```
+
+set์ ํตํด ์ค๋ณต๋ ๋ฌธ์๋ฅผ ์ ๊ฑฐํ๊ณ , ๋ฌธ์์ ๋ฌธ์์ index๋ฅผ ๋ด๋ dictionary๋ฅผ ๋ง๋ค์ด ์ฌ์ฉํ๋ค.
+
+```py
+# hyper parameters
+dic_size = len(char_dic)
+hidden_size = len(char_dic)
+learning_rate = 0.1
+
+# data setting
+sample_idx = [char_dic[c] for c in sample]
+x_data = [sample_idx[:-1]]
+x_one_hot = [np.eye(dic_size)[x] for x in x_data]
+y_data = [sample_idx[1:]]
+
+# transform as torch tensor variable
+X = torch.FloatTensor(x_one_hot)
+Y = torch.LongTensor(y_data)
+```
+
+one-hot encodeng์ identity matrix(๋จ์ํ๋ ฌ)๋ฅผ ํตํด ์งํํ๋ค. `np.eye(size)`๋ฅผ ํตํด ๋ง๋ค ์ ์๋ ๋จ์ํ๋ ฌ์ ์ฃผ๋๊ฐ์ (์ข์์ฐํ)์ ์์๊ฐ ๋ชจ๋ 1์ด๊ณ ๋๋จธ์ง๋ ๋ชจ๋ 0์ธ ์ ์ฌ๊ฐ ํ๋ ฌ์ด๋ค.
+์์ ๋ฝ์๋๋ ๋ฌธ์๋ค์ index๋ฅผ ์ฌ์ฉํ์ฌ ๋จ์ํ๋ ฌ์ ํ ์ค์ ๋ฝ์๋ด๋ฉด ๊ทธ๊ฒ์ด ๊ณง ํด๋น ๋ฌธ์์ one-hot vetor๊ฐ ๋๊ธฐ ๋๋ฌธ์ ์์ฝ๊ฒ one-hot encodeng์ ํ ์ ์๋ค.
+
+์ดํ ๋ฐ์ดํฐ์ ๊ธธ์ด์ ๋ง์ถฐ ๊ฐ size๋ฅผ ์ ์ํ๊ณ x์์๋ ๋งจ ๋ค ๋ฌธ์, y์์๋ ๋งจ ์ ๋ฌธ์๋ฅผ ๋นผ์ ํ์ตํ ์ ์๋๋ก ํ๋ค.
+๊ทธ๋ฆฌ๊ณ ๋ง๋ค์ด์ง ๋ฐ์ดํฐ๋ฅผ Tensor๋ก ๋ฐ๊ฟ์ค๋ค.
+
+### Train Result
+
+๋ชจ๋ธ๊ณผ ํ์ต์ ๋ค๋ฅด์ง ์์ผ๋ฏ๋ก ๊ฒฐ๊ณผ๋ง ํ๋ฒ ์ดํด๋ณด์
+
+```py
+'''output
+0 loss: 2.4069371223449707 prediction: [[7 7 0 7 8 5 8 7 8 7 8 0 7 8 5]] true Y: [[5, 9, 3, 6, 0, 8, 3, 4, 2, 1, 7, 3, 6, 0, 8]] prediction str: ttotuiututuotui
+1 loss: 2.1236345767974854 prediction: [[1 0 0 1 0 8 0 1 8 8 8 1 1 0 8]] true Y: [[5, 9, 3, 6, 0, 8, 3, 4, 2, 1, 7, 3, 6, 0, 8]] prediction str: noonouonuuunnou
+2 loss: 1.8809428215026855 prediction: [[6 0 3 6 0 8 3 6 0 8 7 3 6 0 8]] true Y: [[5, 9, 3, 6, 0, 8, 3, 4, 2, 1, 7, 3, 6, 0, 8]] prediction str: yo you yout you
+3 loss: 1.71848464012146 prediction: [[6 0 3 6 0 8 3 6 4 5 7 3 6 0 8]] true Y: [[5, 9, 3, 6, 0, 8, 3, 4, 2, 1, 7, 3, 6, 0, 8]] prediction str: yo you ywit you
+4 loss: 1.5743740797042847 prediction: [[6 0 3 6 0 8 3 6 2 5 7 3 6 0 8]] true Y: [[5, 9, 3, 6, 0, 8, 3, 4, 2, 1, 7, 3, 6, 0, 8]] prediction str: yo you yait you
+5 loss: 1.4554158449172974 prediction: [[6 9 3 6 0 8 3 6 8 5 7 3 6 0 8]] true Y: [[5, 9, 3, 6, 0, 8, 3, 4, 2, 1, 7, 3, 6, 0, 8]] prediction str: yf you yuit you
+6 loss: 1.3661972284317017 prediction: [[5 9 3 6 0 8 3 6 2 5 7 3 6 2 8]] true Y: [[5, 9, 3, 6, 0, 8, 3, 4, 2, 1, 7, 3, 6, 0, 8]] prediction str: if you yait yau
+7 loss: 1.2864983081817627 prediction: [[5 9 3 6 2 8 3 6 2 1 7 3 6 2 8]] true Y: [[5, 9, 3, 6, 0, 8, 3, 4, 2, 1, 7, 3, 6, 0, 8]] prediction str: if yau yant yau
+8 loss: 1.2224119901657104 prediction: [[5 9 3 6 2 8 3 6 2 1 7 3 6 2 8]] true Y: [[5, 9, 3, 6, 0, 8, 3, 4, 2, 1, 7, 3, 6, 0, 8]] prediction str: if yau yant yau
+...
+46 loss: 0.8302408456802368 prediction: [[5 9 3 6 0 8 3 4 2 1 7 3 6 0 8]] true Y: [[5, 9, 3, 6, 0, 8, 3, 4, 2, 1, 7, 3, 6, 0, 8]] prediction str: if you want you
+47 loss: 0.8290660381317139 prediction: [[5 9 3 6 0 8 3 4 2 1 7 3 6 0 8]] true Y: [[5, 9, 3, 6, 0, 8, 3, 4, 2, 1, 7, 3, 6, 0, 8]] prediction str: if you want you
+48 loss: 0.8275652527809143 prediction: [[5 9 3 6 0 8 3 4 2 1 7 3 6 0 8]] true Y: [[5, 9, 3, 6, 0, 8, 3, 4, 2, 1, 7, 3, 6, 0, 8]] prediction str: if you want you
+49 loss: 0.8264601230621338 prediction: [[5 9 3 6 0 8 3 4 2 1 7 3 6 0 8]] true Y: [[5, 9, 3, 6, 0, 8, 3, 4, 2, 1, 7, 3, 6, 0, 8]] prediction str: if you want you
+'''
+```
+
+๋ง์ฐฌ๊ฐ์ง๋ก ํ์ต์ ๋ง๋ฐ์ง๋ก ๊ฐ์๋ก ํ์ตํ๋ ๋ฌธ์ฅ์ด ์ ๋์ค๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
\ No newline at end of file
diff --git a/_posts/2022-06-07-dlZeroToAll-PyTorch-11-3.markdown b/_posts/2022-06-07-dlZeroToAll-PyTorch-11-3.markdown
new file mode 100644
index 00000000000..62b6f389bd7
--- /dev/null
+++ b/_posts/2022-06-07-dlZeroToAll-PyTorch-11-3.markdown
@@ -0,0 +1,201 @@
+---
+title: "๋ชจ๋๋ฅผ ์ํ ๋ฅ๋ฌ๋ 2 - Lab11-3: RNN - longseq"
+author: Kwon
+date: 2022-06-07T00:00:00 +0900
+categories: [pytorch, study]
+tags: [rnn]
+math: true
+mermaid: false
+---
+
+[๋ชจ๋๋ฅผ ์ํ ๋ฅ๋ฌ๋](https://deeplearningzerotoall.github.io/season2/lec_pytorch.html) Lab11-3: RNN - hihello / charseq ๊ฐ์๋ฅผ ๋ณธ ํ ๊ณต๋ถ๋ฅผ ๋ชฉ์ ์ผ๋ก ์์ฑํ ๊ฒ์๋ฌผ์
๋๋ค.
+
+***
+
+## Longseq
+
+์์ ์ดํด๋ณด์๋ RNN ์์ ๋ค์ ๋ชจ๋ ํ ๋จ์ด๋ ์งง์ ๋ฌธ์ฅ์ ๋ํด RNN์ ํ์ต์ํค๋ ๋ด์ฉ๋ค์ด์๋ค.
+ํ์ง๋ง ์ฐ๋ฆฌ๊ฐ ๋ค๋ฃจ๊ณ ์ถ์ ๋ฐ์ดํฐ๋ ๋ ๊ธด ๋ฌธ์ฅ์ด๊ฑฐ๋ ๋ด์ฉ์ ๊ฐ์ง ๊ฐ๋ฅ์ฑ์ด ๋๋ค.
+์ด๋ฐ ์ํฉ์์๋ ๊ทธ ๋ฐ์ดํฐ ์ ์ฒด๋ฅผ ๋ฃ์ด RNN์ ํ์ต์ํค๊ธฐ์๋ ๋ค์ด๊ฐ๋ ๋ฐ์ดํฐ์ ๊ธธ์ด๋ ๋งค๋ฒ ๋ค๋ฅผ ๋ฟ๋๋ฌ ๊ทธ ํฌ๊ธฐ๊ฐ ๋๋ฌด ์ปค์ ํ์ต์ด ๋ถ๊ฐ๋ฅํ ์๋ ์๋ค.
+๊ทธ๋์ ์ผ์ ํ ํฌ๊ธฐ์ window๋ฅผ ์ฌ์ฉํ์ฌ RNN์ ์๋ผ์ ๋ฃ์ด์ค๋ค.
+
+์๋ ๋ฌธ์ฅ์ ๋ณด์.
+
+```py
+sentence = ("if you want to build a ship, don't drum up people together to ")
+```
+
+์ด ๋ฌธ์ฅ์ ๋ง์ง๋ง ๋ฌธ์๋ง ์๋ผ์ ๋ฐ๋ก ๋ฃ๊ธฐ ๋ณด๋ค๋ ํฌ๊ธฐ 10์ window๋ก ์๋ผ ๋ฃ์ผ๋ ค๊ณ ํ๋ค.
+์ด๋ window๋ฅผ ์ค๋ฅธ์ชฝ์ผ๋ก ํ์นธ์ฉ ๋ฐ์ด๊ฐ๋ฉด์ data๋ฅผ ๋ง๋ ๋ค. ์ ๋ฌธ์ฅ์ ์๋ฅด๋ฉด ๋ค์๊ณผ ๊ฐ๋ค.
+
+```
+ x_data -> y_data
+
+"if you wan" -> "f you want"
+"f you want" -> " you want "
+" you want " -> "you want t"
+"you want t" -> "ou want to"
+"ou want to" -> "u want to "
+```
+
+์ด๋ ๊ฒ ํ๋ฉด ์ผ์ ํ ํฌ๊ธฐ๋ก ๋ฐ์ดํฐ๋ฅผ ์๋ผ ํ์ต์ ํ ์ ์๋ค. (x_data๋ก y_data๋ฅผ ํ์ตํ์ฌ ์์ธก)
+
+***
+
+## with Code
+
+### Imports
+
+```py
+import torch
+import torch.optim as optim
+import numpy as np
+
+torch.manual_seed(0)
+```
+
+### Data
+
+์์ ๋ณธ ๋ฌธ์ฅ๊ณผ ๋๋ถ์ด ์ด 3๊ฐ์ ๋ฌธ์ฅ์ ํ์ต์ ์ฌ์ฉํด ๋ณธ๋ค.
+
+```py
+sentence = ("if you want to build a ship, don't drum up people together to "
+ "collect wood and don't assign them tasks and work, but rather "
+ "teach them to long for the endless immensity of the sea.")
+```
+
+[lab11-2](/posts/dlZeroToAll-PyTorch-11-2/)์ charseq ์์ ์์ ๋ดค๋ ๊ฒ๊ณผ ๊ฐ์ ๋ฐฉ๋ฒ์ผ๋ก one-hot encoding์ ์ฌ์ฉํ dictionary๋ฅผ ์์ฑํ๋ค.
+
+```py
+# make dictionary
+char_set = list(set(sentence))
+char_dic = {c: i for i, c in enumerate(char_set)}
+
+# hyper parameters
+dic_size = len(char_dic)
+hidden_size = len(char_dic)
+sequence_length = 10 # Any arbitrary number
+learning_rate = 0.1
+```
+
+์ดํ window๋ฅผ ์ด์ฉํ์ฌ ์๋ฅด๋ ๋ฐฉ์์ผ๋ก data๋ฅผ ๋ง๋ค๊ณ one-hot encoding ํ๋ค.
+
+```py
+# data setting
+x_data = []
+y_data = []
+
+# window๋ฅผ ์ค๋ฅธ์ชฝ์ผ๋ก ์์ง์ด๋ฉด์ ์๋ฆ
+for i in range(0, len(sentence) - sequence_length):
+ x_str = sentence[i:i + sequence_length]
+ y_str = sentence[i + 1: i + sequence_length + 1]
+ print(i, x_str, '->', y_str)
+
+ x_data.append([char_dic[c] for c in x_str]) # x str to index (dict ์ฌ์ฉ)
+ y_data.append([char_dic[c] for c in y_str]) # y str to index
+
+x_one_hot = [np.eye(dic_size)[x] for x in x_data]
+
+X = torch.FloatTensor(x_one_hot)
+Y = torch.LongTensor(y_data)
+
+'''output
+0 if you wan -> f you want
+1 f you want -> you want
+2 you want -> you want t
+3 you want t -> ou want to
+4 ou want to -> u want to
+...
+166 ty of the -> y of the s
+167 y of the s -> of the se
+168 of the se -> of the sea
+169 of the sea -> f the sea.
+'''
+```
+
+### Model
+
+๋ฌธ์ฅ์ด ๋ ๊ธธ๊ณ ๋ณต์กํ๊ธฐ ๋๋ฌธ์ ๊ธฐ์กด ํ ์ธต์ RNN์ผ๋ก๋ ํ์ต์ด ์ ์ ๋ ์ ์๋ค. ๊ทธ๋์ RNN ์ธต์ ๋ ์๊ณ ๋ง์ง๋ง์ fully connected layer๋ฅผ ์ฐ๊ฒฐํ์ฌ ๋ ๋ณต์กํ ๋ชจ๋ธ์ ๋ง๋ค์ด ์ฌ์ฉํด ๋ณผ ๊ฒ์ด๋ค.
+
+
+
+```py
+# declare RNN + FC
+class Net(torch.nn.Module):
+ def __init__(self, input_dim, hidden_dim, layers):
+ super(Net, self).__init__()
+ self.rnn = torch.nn.RNN(input_dim, hidden_dim, num_layers=layers, batch_first=True)
+ self.fc = torch.nn.Linear(hidden_dim, hidden_dim, bias=True)
+
+ def forward(self, x):
+ x, _status = self.rnn(x)
+ x = self.fc(x)
+ return x
+
+net = Net(dic_size, hidden_size, 2)
+```
+
+`torch.nn.RNN`์ ์ด์ฉํ์ฌ RNN์ ์์ฑํ ๋ `num_layers`๋ฅผ layer ์๋งํผ ์ค์ ํด ์ฃผ๋ ๊ฒ์ผ๋ก ์ํ๋ ์ธต์ RNN์ ์์ฑํ ์ ์๋ค.
+RNN๊ณผ FC๋ฅผ ์ ์ํ๊ณ foward์์ ์ฐ๊ฒฐ์์ผ์ฃผ๋ ๋ชจ์ต์ด๋ค.
+
+### Train
+
+```py
+criterion = torch.nn.CrossEntropyLoss()
+optimizer = optim.Adam(net.parameters(), learning_rate)
+
+# start training
+for i in range(100):
+ optimizer.zero_grad()
+ outputs = net(X)
+ loss = criterion(outputs.view(-1, dic_size), Y.view(-1))
+ loss.backward()
+ optimizer.step()
+
+ results = outputs.argmax(dim=2)
+ predict_str = ""
+ for j, result in enumerate(results):
+ # print(i, j, ''.join([char_set[t] for t in result]), loss.item())
+ if j == 0:
+ predict_str += ''.join([char_set[t] for t in result])
+ else:
+ predict_str += char_set[result[-1]]
+
+ print(predict_str)
+
+'''output
+hswmsshsmmmwsisshsmmhwwshhhhwmsssswmhmshhsmshismhhsismshmhmsismisshhswhissmwmmmmhssswwishhhwshmhhsmshsmwwmmhismhmsssmhmshmhmshmhhmshmhhsissimmhsismshmwwmmmhsshhhshmwsmmuismshmwwmm
+
+ t t ttt ttt t ttt t ttt t t t t t t t ttt t t t t t tt t ttt tt t ttt t t tt t t tt t t t t ttt ttt t ttt t tt t tt t tt t t ttt tt t t t t t t t t t ttt
+ b.o b. o o o o o o o o o o o
+e ae as a a aa a a a a a a ata aa aa aa a a a aa a aa aa a a aa a a a aa a aa
+e tl ee teeeettlteeetl tleeeee eeeee eleet etteeetleeteeeeeeletleeeeeeeeeeeeteeoeestee eletteeeeeletteeeeteeeeeeeetelteeetleseteleteleeeetteteeoeteeee eeeeleeee eeeeeeteeeeeell e
+e to ot oo oot tooo ot ouoto o ootoo ouoou ooootto oootu ootootoo oo ooo ooo ouoo ooo ooooo oouoto otoo uoouo ooo uoooo oto oootoo oooo utoo oo ttot ooo oto ooo ooo oooooouo o
+e t o ott ttttt u tu ttt ot utt tt t t tttttt ttt t ut ut tt u u t t tt t t t ot tt u t t ut ut o u o o t t
+ t t t t t t tttt t tt t t ttt et t t tt t t tt t e t tt t t tt t t t t t tt t tt tt t t t t t t t
+ t tt t tt t t t t t t t tt t t t e t
+ t o t t o tt o t ot t t o t t
+e o t oh o o o o oo oot to o oo o o oooo o o to o h too oo oo oto o oo oo to oo o o ooto o o t o o to o oto oh o o o ooo o ot tooo o
+e o t t th o o t oeto too t to t tot o o oo o h o o o h too to th toto tt oeoto oo to o oo ooto oot oo to e to to tto th o o o ohoo toto t to etht
+theo lt thth te lo t oete tollthto t tetto e otte taet to o t too too th ttoto it tt teeto ee to e eo eott e t tet t o to e lo to tto tth o o e thee tetoath totetht
+thto tt to to to te t to cettoelthto to toe tteto e ae t to te to te th ttoto e tehe to tet to eoto th t tht este e lo to eto tto eto eo e neeeaoh toe thes
+thto t t to lt t t to t to t to totto to t lo to t t th ttot tt t to t to oto th d th toe to t to tto to s o n tt tot th s
+t to t o to to to ttto to to t to t totto oto t o t to eo to to th ttoto tttt to o to too oto th d t o to to to to tto tod o to t tt to th
+thto th t to to t t o to to t to t totto to t to wo tot th thto t tt to to too to t t o to to to uo tth to o to to t to th
+thto th t to to t t to to t to totto to m to to wo tot th thto t tth to to to to t th o to to to to uth to to to t to th
+thto ethet to to to tht to to dthto totto to em tonto e wo tot th thto d tth to to to to t th o toe to to e to ethi to eto n t o to th
+thto eth t to lo 'o tht eto to 'thto tttt kl eth em thnto e to tot th thto t tthe to to to to th n ethe p toe to to e to thi ett e n th t toe the
+tuto eto t to tt 'e tht epo to 'ththt tmtt kl eth n th to e e to tot th toto t tthe totho tot to l etot to oe ethe t toi to to e to thi d tt e thta toe the
+tuto lao t todto 'e thtoeco tos't tos totto kl to en to to ee d to tod to toto d 't em totoo tot to p tosoto nipetoe p toio to lo t to toio od o to e t tou toemtoe
+tuto to t to tp e tos to to 't to tootoo l eto en to to ee o wo tot to toao t tthem tosoo tod to so t so noth np toe to to deso ltoemtod sm to t eaa toem oe
+'utos to t to los e tot epo to 't tosl to tn le tos en to lo h n wo tot to toaon t dt er tos tot tor , wod tos enotossa toe to lo sod tosm d sm tn e theoa toe to
+...
+g you want to build a ship, don't drum up people together to collect wood and don't assign them tasks and work, but rather teach them to long for the sndless immensity of the sea.
+f you want to build a ship, don't drum up people together to collect wood and don't assign them tasks and work, but rather teach them to long for the sndless immensity of the sea.
+f you want to build a ship, don't drum up people together to collect wood and don't assign them tasks and work, but rather teach them to long for the sndless immensity of the sea.
+f you want to build a ship, don't drum up people together to collect wood and don't assign them tasks and work, but rather teach them to long for the sndless immensity of the sea.
+'''
+```
+
+loss์ optimizer๋ฅผ ์ ์ํ๊ณ ํ์ต์ ์งํํ๋ค.
+์ฒ์์๋ ์๋นํ ์ด์ํ ๋ฌธ์ฅ๋ค์ด ์ถ๋ ฅ๋๋ค. ํ์ง๋ง ํ์ต์ด ์งํ๋จ์ ๋ฐ๋ผ ์๋์ ๋ฌธ์ฅ์ ๊ฐ๊น๊ฒ ๋ฌธ์ฅ๋ค์ด ์ถ๋ ฅ๋๋ ๊ฒ์ ํ์ธํ ์ ์์ผ๋ฉฐ, ์ด๋ ํ์ต์ด ์ ๋์๋ค๊ณ ๋ณผ ์ ์๋ค.
\ No newline at end of file
diff --git a/_posts/2022-06-10-dlZeroToAll-PyTorch-11-4.markdown b/_posts/2022-06-10-dlZeroToAll-PyTorch-11-4.markdown
new file mode 100644
index 00000000000..6e073aaaeb0
--- /dev/null
+++ b/_posts/2022-06-10-dlZeroToAll-PyTorch-11-4.markdown
@@ -0,0 +1,193 @@
+---
+title: "๋ชจ๋๋ฅผ ์ํ ๋ฅ๋ฌ๋ 2 - Lab11-4: Timeseries"
+author: Kwon
+date: 2022-06-10T00:00:00 +0900
+categories: [pytorch, study]
+tags: [rnn, timeseries]
+math: true
+mermaid: false
+---
+
+[๋ชจ๋๋ฅผ ์ํ ๋ฅ๋ฌ๋](https://deeplearningzerotoall.github.io/season2/lec_pytorch.html) Lab11-4: Timeseries ๊ฐ์๋ฅผ ๋ณธ ํ ๊ณต๋ถ๋ฅผ ๋ชฉ์ ์ผ๋ก ์์ฑํ ๊ฒ์๋ฌผ์
๋๋ค.
+
+***
+
+## Timeseries
+
+timeseries(์๊ฒ์ด) data๋ ์ผ์ ์๊ฐ ๊ฐ๊ฒฉ์ผ๋ก ๋ฐฐ์น๋ data๋ฅผ ๋งํ๋ค.
+๋งค์ฅ์ ์๊ฐ๋ณ ๋งค์ถ, ์์ผ๋ณ ์ฃผ์ ์๊ฐ/์ข
๊ฐ ๋ฑ์ด ์ฌ๊ธฐ์ ์ํ ์ ์๋ค.
+์ด๋ค๋ ์์๊ฐ ๋ฐ์ดํฐ์ ํฌํจ๋ ๊ฒฝ์ฐ์ด๋ฏ๋ก RNN์ ์ด์ฉํ์ฌ ๊ณผ๊ฑฐ์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ง๊ณ ์์ธก์ ํ๋ ๊ฒ์ด ์ข์ ๋ฐฉ๋ฒ์ผ ์ ์๋ค. (์์๋ฅผ ํฌํจํ ๋ฐ์ดํฐ๋ผ๊ณ RNN์ด ๋ง๋ฅ์ด๋ผ๋ ๊ฒ์ ์๋๋ค.)
+
+์ด๋ฒ ์ค์ต์์๋ ์์ผ๋ณ ์ฃผ์ ์ ๋ณด๋ค์ ์ด์ฉํ์ฌ ํ์ต์ ์งํํ์๋ค.
+
+
+
+์์ ๊ฐ์ด ์ผ๋ณ ์์๊ฐ, ๊ณ ๊ฐ, ์ ๊ฐ, ๊ฑฐ๋๋, ์ข
๊ฐ๊ฐ ํฌํจ๋ ๋ฐ์ดํฐ์ด๋ค.
+
+์ด ๋ฐ์ดํฐ๋ฅผ ๊ทธ๋ฅ ํ์ต์ํฌ์๋ ์์ง๋ง ๊ฐ ๋ฐ์ดํฐ๋ค์ scale์ ๋ง์ถ๊ณ ํ๋ ๊ฒ์ด ๋ ์ข๋ค.
+๊ฑฐ๋๋์ ์ ์ธํ ๊ฐ๊ฒฉ ์ ๋ณด๋ค์ 800 ์ ๋์ ๊ฐ์ ์์ง๋ง ๊ฑฐ๋๋์ 100๋ง ๋จ์์ด๋ค.
+๋ง์ฝ ์ด๋๋ก ๋ฐ๋ก ํ์ตํ๋ค๋ฉด ๊ฑฐ๋๋์ ์น์ฐ์ณ์ ํ์ต์ ํ๊ฑฐ๋ scale์ ๋ง์ถ๊ธฐ ์ํ ํ์ต์ model์ด ์ถ๊ฐ์ ์ผ๋ก ํด์ผ ํ๋ฏ๋ก ํ์์๋ ๋ถ๋ด์ด ๋ฐ์ํ ์ ์๋ค.
+๊ทธ๋์ ๋ค์ ๋์ฌ ์ฝ๋์์๋ scaling์ ํ๊ณ ํ์ต์ ์งํํ ๊ฒ์ด๋ค.
+
+***
+
+## with Code
+
+### Imports
+
+```py
+import torch
+import torch.optim as optim
+import numpy as np
+import matplotlib.pyplot as plt
+
+torch.manual_seed(0)
+
+# hyper parameters
+seq_length = 7
+data_dim = 5
+hidden_dim = 10
+output_dim = 1
+learning_rate = 0.01
+iterations = 500
+```
+
+### Data
+
+๋ฐ์ดํฐ๋ฅผ ๋ถ๋ฌ์ค๊ณ 70%์ ๋ฐ์ดํฐ๋ฅผ train data๋ก ๋ง๋ค์ด์ค๋ค.
+
+```py
+# load data
+xy = np.loadtxt("data-02-stock_daily.csv", delimiter=",")
+xy = xy[::-1] # reverse order
+
+# split train-test set
+train_size = int(len(xy) * 0.7)
+train_set = xy[0:train_size]
+test_set = xy[train_size - seq_length:]
+```
+
+์์ ์ธ๊ธํ๋๋ก scaling์ ํ๊ณ ํ์ตํ๊ธฐ ์ข์ ํํ๋ก data๋ฅผ ๊ฐ๊ณตํด์ผ ํ๋ค.
+
+```py
+def minmax_scaler(data):
+ numerator = data - np.min(data, 0)
+ denominator = np.max(data, 0) - np.min(data, 0)
+ return numerator / (denominator + 1e-7)
+
+train_set = minmax_scaler(train_set)
+test_set = minmax_scaler(test_set)
+```
+
+์ด๋ฒ ์์ ์์๋ min-max scaling์ ์ ์ฉํ ๊ฒ์ด๋ค. min-max scaling์ ์๋ ์์ ํตํด ์งํ๋๋ scaling์ผ๋ก ์ต์, ์ต๋๊ฐ์ ์ฌ์ฉํ์ฌ 0๊ณผ 1์ฌ์ด์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ด ์ค๋ค.
+
+\\[x_{scaled}=\frac{x-x_{min}}{x_{max}-x_{min}}\\]
+
+์ด๋ฒ์๋ ๋ฐ์ดํฐ์ ๊ธธ์ด๊ฐ ๊ธธ๊ธฐ ๋๋ฌธ์ RNN model์ ๋ฃ์ด์ค ๋งํผ ์๋ผ์ ๋ฐ์ดํฐ๋ฅผ ๋ง๋ค์ด์ค๋ค.
+
+```py
+def build_dataset(time_series, seq_length):
+ dataX = []
+ dataY = []
+ for i in range(0, len(time_series) - seq_length):
+ _x = time_series[i:i + seq_length, :]
+ _y = time_series[i + seq_length, [-1]] # Next close price
+ print(_x, "->", _y)
+ dataX.append(_x)
+ dataY.append(_y)
+ return np.array(dataX), np.array(dataY)
+
+trainX, trainY = build_dataset(train_set, seq_length)
+testX, testY = build_dataset(test_set, seq_length)
+
+'''output
+[[2.53065030e-01 2.45070970e-01 2.33983036e-01 4.66075110e-04
+ 2.32039560e-01]
+ [2.29604366e-01 2.39728936e-01 2.54567513e-01 2.98467330e-03
+ 2.37426028e-01]
+ [2.49235510e-01 2.41668371e-01 2.48338489e-01 2.59926504e-04
+ 2.26793794e-01]
+ [2.21013495e-01 2.46602231e-01 2.54710584e-01 0.00000000e+00
+ 2.62668239e-01]
+ [3.63433786e-01 3.70389871e-01 2.67168847e-01 1.24764722e-02
+ 2.62105010e-01]
+ [2.59447633e-01 3.10673724e-01 2.74113889e-01 4.56323384e-01
+ 2.71751265e-01]
+ [2.76008150e-01 2.78314566e-01 1.98470380e-01 5.70171193e-01
+ 1.78104644e-01]] -> [0.16053716]
+...
+ [0.88723699 0.88829938 0.92518158 0.08714288 0.90908564]
+ [0.88939504 0.88829938 0.94014512 0.13380794 0.90030461]
+ [0.89281215 0.89655181 0.94323484 0.12965206 0.93124657]
+ [0.91133638 0.91818448 0.95944078 0.1885611 0.95460261]] -> [0.97604677]
+'''
+```
+
+7์ผ๊ฐ์ ์ฃผ์ ๋ฐ์ดํฐ(x)๋ค์ ํตํด ๊ทธ ๋ค์๋ ์ ์ข
๊ฐ(y)๋ฅผ ์์ธกํ๋๋ก ๋ฐ์ดํฐ๋ฅผ ๋ง๋ ๋ค. window์ ํฌ๊ธฐ๋ฅผ 7๋ก ํด์ ์๋๋ค๊ณ ์๊ฐํ๋ฉด ๋ ๊ฒ ๊ฐ๋ค.
+
+### Model
+
+์ด๋ฒ์๋ RNN์ ํ ์ข
๋ฅ์ธ LSTM์ ์ฌ์ฉํ๋ฉฐ ๋ง์ง๋ง์ fully connected layer๋ฅผ ์ฐ๊ฒฐํ์ฌ ์ถ๋ ฅ์ ๋ธ๋ค.
+
+
+
+์ด๋ฐ ์์ผ๋ก ๋ง์ง๋ง์ fc ์ธต์ ์ถ๊ฐํ๋ ์ด์ ๊ฐ ๋ช๊ฐ์ง ์๋ค.
+
+๋จผ์ , data๋ฅผ ์ ๋ฌํ๋ ๋ถ๋ถ๊ณผ label์ ์ต์ข
์ ์ผ๋ก ๋ง์ถ๋ ๋ถ๋ถ์ ๋ถ๋ฆฌํ์ฌ network์ ๊ฐํด์ง๋ ๋ถ๋ด์ ๋ถ์ฐํ ์ ์๋ค.
+๊ทธ๋ฆฌ๊ณ RNN ์ธต์ ๋ฐ๋ก ์ถ๋ ฅ์ ์ฐ๊ฒฐํ ๊ฒฝ์ฐ ๊ณผ๊ฑฐ์ ์ ๋ณด๋ฅผ ์ ๋ฌํ๋ hidden state๋ ์ต์ข
์ถ๋ ฅ์ ์ฐจ์๊ณผ ๋ง์ถฐ์ฃผ์ด์ผ ํ๋ค.
+์ด๋ฒ ๊ฒฝ์ฐ๋ฅผ ๋ณด๋ฉด ์ต์ข
์ ์ผ๋ก 1์ฐจ์์ ์ถ๋ ฅ์ ๋ด์ด์ผ ํ๋๋ฐ ์ด๋ ์ ๋ณด๋ฅผ ์ ๋ฌํ๋ hidden state๋ ์ฐจ์์ด 1์ด์ด์ผ ํ๋ค๋ ๋ป์ด๋ค.
+์ด๋ฐ ์ํฉ์์๋ model์ด ํ์ต ๋ฟ๋ง ์๋๋ผ ์ ๋ณด ์ ๋ฌ์ ์ํ ์์ถ๋ ํด์ผํ๋ ๋ถ๋ด์ ๊ฐ์ง๊ฒ ๋์ด ํ์ต์ ์
์ํฅ์ ๋ผ์น ์ ์๋ค.
+๊ทธ๋์ ์ผ๋ฐ์ ์ผ๋ก hidden state์ ์ฐจ์์ ์ถฉ๋ถํ ๋ณด์ฅํด์ฃผ๊ณ ๋ง์ง๋ง์ fc layer๋ฅผ ์ฐ๊ฒฐํ์ฌ ์ถ๋ ฅ์ ์์ฑํ๋ ๋ฐฉ์์ ์ฌ์ฉํ๋ค.
+
+```py
+class Net(torch.nn.Module):
+ def __init__(self, input_dim, hidden_dim, output_dim, layers):
+ super(Net, self).__init__()
+ self.rnn = torch.nn.LSTM(input_dim, hidden_dim, num_layers=layers, batch_first=True)
+ self.fc = torch.nn.Linear(hidden_dim, output_dim, bias=True)
+
+ def forward(self, x):
+ x, _status = self.rnn(x)
+ x = self.fc(x[:, -1])
+ return x
+
+
+net = Net(data_dim, hidden_dim, output_dim, 1)
+```
+
+### Train
+
+loss์ optimizer๋ฅผ ์ ์ํ๊ณ ํ์ตํ๋ค.
+
+```py
+criterion = torch.nn.MSELoss()
+optimizer = optim.Adam(net.parameters(), lr=learning_rate)
+
+for i in range(iterations):
+
+ optimizer.zero_grad()
+ outputs = net(trainX_tensor)
+ loss = criterion(outputs, trainY_tensor)
+ loss.backward()
+ optimizer.step()
+ print(i, loss.item())
+```
+
+์์ธกํ ๊ฒ๋ค์ ํฌ๋ํ๋ก ๊ทธ๋ ค๋ณด๋ฉด ๋ค์๊ณผ ๊ฐ๋ค
+
+```py
+plt.plot(testY)
+plt.plot(net(testX_tensor).data.numpy())
+plt.legend(['original', 'prediction'])
+plt.show()
+```
+
+
+
+์์ธก์ด ์์ฃผ ์ ๋๊ฒ ๊ฐ์ ๋ณด์ด์ง๋ง ์ค์ ๋ก๋ ์๋๋ค.
+
+
+
+์ ๊ทธ๋ฆผ์ ๊ทธ๋ํ ์ค ์ผ๋ถ๋ฅผ ๊ฐ์ ธ์จ ๊ฒ์ธ๋ฐ, ์ ๋ณด๋ฉด ์์ธก์ด ์ค๋ฅธ์ชฝ์ผ๋ก ํ ์นธ์ฉ ๋ฐ๋ฆฐ ๊ฒ์ฒ๋ผ ๋ณด์ธ๋ค.
+์ด๋ ๋
ธ์ด์ฆ๊ฐ ์ฌํ ๊ธ์ต ์๊ณ์ด ๋ฐ์ดํฐ์์ lstm model์ ๊ณ ์ง์ ์ธ ๋ฌธ์ ๋ก ์ง์ ๊ฐ์ ์์ธก ๊ฐ์ผ๋ก ์ถ๋ ฅํ๋ ๊ฒฝ์ฐ๊ฐ ์ฆ๋ค๊ณ ํ๋ค. (์ด์ ์ ๊ฐ์ ์์ธก ๊ฐ์ผ๋ก ๋ด๋ ๊ฒ์ด ๊ฐ์ฅ ์ด๋์ด๋ผ๊ณ ํ๋จํ๊ธฐ ๋๋ฌธ)
+์ค์ ๋ก ์ฌ์ฉํ ๋์๋ ์ด๋ฐ ๊ฒฝ์ฐ์ ์ ๋ง๋ก ์์ธก์ ์ ํ ๊ฒ์ธ์ง ์๋๋ฉด ์์ ๊ฐ์ด ๋ฐ๋ ค์ ์ ๋์ด ๋ณด์ด๋ ๊ฑด์ง ํ์ธํด ๋ณผ ํ์๊ฐ ์์ ๊ฒ ๊ฐ๋ค.
\ No newline at end of file
diff --git a/_posts/2022-06-10-dlZeroToAll-PyTorch-11-5.markdown b/_posts/2022-06-10-dlZeroToAll-PyTorch-11-5.markdown
new file mode 100644
index 00000000000..65bc1fc943d
--- /dev/null
+++ b/_posts/2022-06-10-dlZeroToAll-PyTorch-11-5.markdown
@@ -0,0 +1,354 @@
+---
+title: "๋ชจ๋๋ฅผ ์ํ ๋ฅ๋ฌ๋ 2 - Lab11-5: Seq2Seq"
+author: Kwon
+date: 2022-06-10T01:00:00 +0900
+categories: [pytorch, study]
+tags: [rnn]
+math: true
+mermaid: false
+---
+[๋ชจ๋๋ฅผ ์ํ ๋ฅ๋ฌ๋](https://deeplearningzerotoall.github.io/season2/lec_pytorch.html) Lab11-5: Seq2Seq ๊ฐ์๋ฅผ ๋ณธ ํ ๊ณต๋ถ๋ฅผ ๋ชฉ์ ์ผ๋ก ์์ฑํ ๊ฒ์๋ฌผ์
๋๋ค.
+
+***
+
+## Seq2Seq Model
+
+Seq2Seq model์ ์๋์ ๊ฐ์ ๊ตฌ์กฐ๋ฅผ ๊ฐ์ง๊ณ ์๋ค.
+
+
+
+์ผ์ข
์ Encoder-Decoder ๊ตฌ์กฐ๋ผ๊ณ ๋ ํ ์ ์๋๋ฐ ๋ชจ๋ ์
๋ ฅ์ ๋ค ๋ฐ์ ํ์ ์ถ๋ ฅ์ ์์ฑํ๋ ๊ตฌ์กฐ์ด๋ค.
+
+์ผ์ชฝ(ํ๋์)์์๋ ์
๋ ฅ ๋ฐ์ ์ ๋ณด๋ค์ ์์ฐจ์ ์ผ๋ก ํ์ตํ์ฌ ์ ๋ณด๋ฅผ vector๋ก ์์ถํ๋ ์ญํ ์ ํ๊ณ ,
+์ค๋ฅธ์ชฝ(์ฃผํฉ์)์์๋ ์์ถํ ์ ๋ณด๋ฅผ ์ ๋ฌ๋ฐ์ start flag(Start Of Sentence, SOS)์ ํจ๊ป ๋ค์์ ๋ฑ์ฅํ ๋ฐ์ดํฐ๋ฅผ ์์ธกํ๋ฉด์ ์์ฐจ์ ์ผ๋ก output์ ๋ด๊ณ ๋ง์ง๋ง์๋ end flag(Etart Of Sentence, EOS)๋ฅผ ์ถ๋ ฅํ์ฌ ๋ฐ์ดํฐ์ ๋์ด๋ผ๋ ๊ฒ์ ์๋ ค์ค๋ค.
+
+๊ฐ๋จํ ๋ฌธ์ฅ์ ๋ํ ๋๋ต์ ์๋ก ๋ค๋ฉด ๋ค์๊ณผ ๊ฐ๋ค. ๋ด๋ถ layer๋ LSTM๋ GRU๋ฅผ ์ฌ์ฉํ๋ค.
+
+
+
+์ด๋ฅผ ์ฌ์ฉํ๋ ์๋ก๋ chatbot์ด ์์ ์ ์๋๋ฐ chatbot์ ์ฌ์ฉ์์ ์
๋ ฅ(๋ฌธ์ฅ)์ ๋ค ๋ฃ๊ธฐ ์ ์ ๋ต๋ณ์ ๋ง๋ค ๊ฒฝ์ฐ ์ค์ ๋ฌธ์ฅ๊ณผ ์๊ด์๋ ๋ต๋ณ์ ์์ฑํ ์๋ ์๋ค.
+์ด๋ฐ ๊ฒฝ์ฐ ์ฒ๋ผ input sequence์ ์ ์ฒด๋ฅผ ๋ค ํ์ธํ๊ณ ์ถ๋ ฅ์ด ์์ด์ผ ํ๋ ๊ฒฝ์ฐ์ Seq2Seq model์ ์ฌ์ฉํ๊ฒ ๋๋ค.
+
+***
+
+## with Code
+
+๊ฐ๋จํ ๋ฒ์ญ์ ํ ์ ์๋ model์ ํ์ต์ํค๋ ์ค์ต์ด๋ค.
+
+### Imports
+
+```py
+import random
+import torch
+import torch.nn as nn
+from torch import optim
+
+torch.manual_seed(0)
+device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
+```
+
+### Data
+
+์๋ data๋ฅผ ์ฒ๋ฆฌํ์ฌ ์ฌ์ฉํ ๊ฒ์ด๋ค. data๋ ๊ฐ์ ๋ป์ ์์ด์ ํ๊ตญ์ด๋ก ๊ตฌ์ฑ๋์ด ์๊ณ ๊ฐ ์์ด์ ํ๋์ด๋ tab์ผ๋ก ๊ตฌ๋ถ๋์ด ์๋ค.
+
+```py
+raw = ["I feel hungry. ๋๋ ๋ฐฐ๊ฐ ๊ณ ํ๋ค.",
+ "Pytorch is very easy. ํ์ดํ ์น๋ ๋งค์ฐ ์ฝ๋ค.",
+ "Pytorch is a framework for deep learning. ํ์ดํ ์น๋ ๋ฅ๋ฌ๋์ ์ํ ํ๋ ์์ํฌ์ด๋ค.",
+ "Pytorch is very clear to use. ํ์ดํ ์น๋ ์ฌ์ฉํ๊ธฐ ๋งค์ฐ ์ง๊ด์ ์ด๋ค."]
+```
+
+data๋ฅผ ์ ์ฒ๋ฆฌํ๋ ํจ์๋ฅผ ๋ง๋ค์ด ์ฌ์ฉํ๋ค.
+
+```py
+# fix token for "start of sentence" and "end of sentence"
+SOS_token = 0
+EOS_token = 1
+
+class Vocab:
+ def __init__(self):
+ self.vocab2index = {"": SOS_token, "": EOS_token}
+ self.index2vocab = {SOS_token: "", EOS_token: ""}
+ self.vocab_count = {}
+ self.n_vocab = len(self.vocab2index)
+
+ def add_vocab(self, sentence):
+ for word in sentence.split(" "):
+ if word not in self.vocab2index:
+ self.vocab2index[word] = self.n_vocab
+ self.vocab_count[word] = 1
+ self.index2vocab[self.n_vocab] = word
+ self.n_vocab += 1
+ else:
+ self.vocab_count[word] += 1
+
+def filter_pair(pair, source_max_length, target_max_length):
+ return len(pair[0].split(" ")) < source_max_length and len(pair[1].split(" ")) < target_max_length
+
+def preprocess(corpus, source_max_length, target_max_length):
+ print("reading corpus...")
+ pairs = []
+ for line in corpus:
+ pairs.append([s for s in line.strip().lower().split("\t")])
+ print("Read {} sentence pairs".format(len(pairs)))
+
+ pairs = [pair for pair in pairs if filter_pair(pair, source_max_length, target_max_length)]
+ print("Trimmed to {} sentence pairs".format(len(pairs)))
+
+ source_vocab = Vocab()
+ target_vocab = Vocab()
+
+ print("Counting words...")
+ for pair in pairs:
+ source_vocab.add_vocab(pair[0])
+ target_vocab.add_vocab(pair[1])
+ print("source vocab size =", source_vocab.n_vocab)
+ print("target vocab size =", target_vocab.n_vocab)
+
+ return pairs, source_vocab, target_vocab
+```
+
+๋จผ์ `\t`(tab)์ผ๋ก ๋๋ ์ pairs์ ๋ฃ์ด์ฃผ๊ณ `filter_pair`๋ก ๊ฐ ๋ฌธ์ฅ์ ๋จ์ด ๊ฐ์๊ฐ `source_max_length`์ `target_max_length`๋ฅผ ๋์ง ์๋ ๊ฒฝ์ฐ๋ง ํํฐ๋งํ๋ค.
+์ ์ ๋ ๋ฐ์ดํฐ๋ค์ ๋ฐ๋ก ์ ์ํ `Vocab` instance๋ฅผ ํตํด ๋จ์ด์ ์ข
๋ฅ์ ๊ทธ ๊ฐ์๋ก ์ด๋ฃจ์ด์ง dictionary data๋ก ๋ง๋ค์ด์ค๋ค.
+
+```py
+SOURCE_MAX_LENGTH = 10
+TARGET_MAX_LENGTH = 12
+
+load_pairs, load_source_vocab, load_target_vocab = preprocess(raw, SOURCE_MAX_LENGTH, TARGET_MAX_LENGTH)
+print(random.choice(load_pairs))
+
+'''output
+reading corpus...
+Read 4 sentence pairs
+Trimmed to 4 sentence pairs
+Counting words...
+source vocab size = 17
+target vocab size = 13
+['pytorch is very clear to use.', 'ํ์ดํ ์น๋ ์ฌ์ฉํ๊ธฐ ๋งค์ฐ ์ง๊ด์ ์ด๋ค.']
+'''
+```
+
+4๊ฐ์ ๋ฌธ์ฅ์ด ๋ชจ๋ ์ ๋ณํ์ด ๋์๊ณ
+๋ฌด์์๋ก ํ๋๋ฅผ ๊ณจ๋ผ ์ถ๋ ฅํด๋ณด๋ฉด ์์ ๊ฐ์ด ์์ด ์ ๋์ค๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
+
+### Model
+
+Model์ ์์์ ์ธ๊ธํ ๊ฒ๊ณผ ๊ฐ์ด encoder์ decoder๋ก ์ด๋ฃจ์ด์ ธ ์๋ค.
+
+```py
+class Encoder(nn.Module):
+ def __init__(self, input_size, hidden_size):
+ super(Encoder, self).__init__()
+ self.hidden_size = hidden_size
+ self.embedding = nn.Embedding(input_size, hidden_size)
+ self.gru = nn.GRU(hidden_size, hidden_size)
+
+ def forward(self, x, hidden):
+ x = self.embedding(x).view(1, 1, -1)
+ x, hidden = self.gru(x, hidden)
+ return x, hidden
+
+class Decoder(nn.Module):
+ def __init__(self, hidden_size, output_size):
+ super(Decoder, self).__init__()
+ self.hidden_size = hidden_size
+ self.embedding = nn.Embedding(output_size, hidden_size)
+ self.gru = nn.GRU(hidden_size, hidden_size)
+ self.out = nn.Linear(hidden_size, output_size)
+ self.softmax = nn.LogSoftmax(dim=1)
+
+ def forward(self, x, hidden):
+ x = self.embedding(x).view(1, 1, -1)
+ x, hidden = self.gru(x, hidden)
+ x = self.softmax(self.out(x[0]))
+ return x, hidden
+```
+
+์ด๋ฒ model์ ๋ด๋ถ๋ GRU๋ก ๊ตฌ์ฑํ๋ค. ๋ค๋ฅธ ๊ฒ๋ค์ ํฌ๊ฒ ๋ค๋ฅธ ์ ์ ์์ง๋ง ์กฐ๊ธ ๋ค๋ฅธ ๊ฒ์ embedding ๋ถ๋ถ์ด๋ค.
+source์ oen-hot vector๋ ๋จ์ด ๊ฐ์ ๋งํผ input size๊ฐ ์ปค์ง๊ฒ ๋๋๋ฐ ์ด๋์ ์ฐจ์์ ๊ทธ๋ฅ ํ์ตํ๊ธฐ์ ๋๋ฌด ํด ์ ์๋ค.
+๊ทธ๋์ `nn.Embedding`์ ํตํด ์ฐจ์์ ์ค์ฌ ๋ฐ์ง๋๊ฒ ๋ฐ๊ฟ ์ฌ์ฉํ ์ ์๋ค.
+
+Decoder์์๋ model์ ํตํด ๋ง๋ ๊ฒ๋ค์ softmax๋ฅผ ํตํด ๋จ์ด๋ค์ด ๋์ฌ ํ๋ฅ ๋ก ๋ด๋ณด๋ธ๋ค.
+
+### Train
+
+ํ์ตํ๋ ์ฝ๋๋ ์กฐ๊ธ ๊ธธ๊ธฐ ๋๋ฌธ์ ์๋ผ์ ๋ณด์.
+
+๋จผ์ `trian` ์์์ ์ฌ์ฉํ `tensorize` ํจ์๋ค.
+
+```py
+# convert sentence to the index tensor with vocab
+def tensorize(vocab, sentence):
+ indexes = [vocab.vocab2index[word] for word in sentence.split(" ")]
+ indexes.append(vocab.vocab2index[""])
+ return torch.Tensor(indexes).long().to(device).view(-1, 1)
+```
+
+์ ์ฒ๋ฆฌ ํ ๋ `Vocab`์ ์ ์ฅํ๋ ๋ฌธ์ฅ๋ค์ ํ์ตํ ์ ์๋๋ก Tensor๋ก ๋ฐ๊ฟ์ฃผ๋ ํจ์์ด๋ค.
+
+๋ค์์ `train`์ ์๋ถ๋ถ์ด๋ค. ๋ฌด์์๋ก `n_iter`๋งํผ ๋ฝ์์ batch data๋ฅผ ๋ง๋ค์ด์ฃผ๊ณ , ์์ ์ ์ํ `tensorize`๋ฅผ ์์ฉํ์ฌ data๋ค์ ๋ชจ๋ Tensor๋ก ๋ฐ๊ฟ์ฃผ๊ณ encoder/decoder์ optimizer์ loss๋ฅผ ์ ์ํด์ค๋ค.
+
+```py
+# training seq2seq
+def train(pairs, source_vocab, target_vocab, encoder, decoder, n_iter, print_every=1000, learning_rate=0.01):
+ loss_total = 0
+
+ encoder_optimizer = optim.SGD(encoder.parameters(), lr=learning_rate)
+ decoder_optimizer = optim.SGD(decoder.parameters(), lr=learning_rate)
+
+ training_batch = [random.choice(pairs) for _ in range(n_iter)]
+ training_source = [tensorize(source_vocab, pair[0]) for pair in training_batch]
+ training_target = [tensorize(target_vocab, pair[1]) for pair in training_batch]
+
+ criterion = nn.NLLLoss()
+
+ ...
+```
+
+์์์ ์ฒ๋ฆฌํ๊ณ ์ ์ํ ๊ฒ๋ค์ ๊ธฐ๋ฐ์ผ๋ก encoder๋ฅผ ํ์ตํ๋ ๋ถ๋ถ์ด๋ค.
+
+```py
+# training seq2seq
+def train(pairs, source_vocab, target_vocab, encoder, decoder, n_iter, print_every=1000, learning_rate=0.01):
+
+ ...
+
+ for i in range(1, n_iter + 1):
+ source_tensor = training_source[i - 1]
+ target_tensor = training_target[i - 1]
+
+ encoder_hidden = torch.zeros([1, 1, encoder.hidden_size]).to(device)
+
+ encoder_optimizer.zero_grad()
+ decoder_optimizer.zero_grad()
+
+ source_length = source_tensor.size(0)
+ target_length = target_tensor.size(0)
+
+ loss = 0
+
+ for enc_input in range(source_length):
+ _, encoder_hidden = encoder(source_tensor[enc_input], encoder_hidden)
+
+ ...
+```
+
+๋ฌธ์ฅ์ ํ๋์ฉ ๊ฐ์ ธ์์ ๋ฌธ์ฅ์ ๋จ์ด๋ฅผ ํ๋์ฉ ์์ฐจ์ ์ผ๋ก ๋ฃ์ด๊ฐ๋ฉด์ encoder์ ์ถ๋ ฅ์ ๋ง๋ ๋ค. ์ด๋ ๊ฐ ํ์ต์ ๋งจ ์ฒ์ `encoder_hidden`์ 0์ผ๋ก ์ฑ์ด Tensor๋ฅผ ์ฌ์ฉํ๋ค.
+
+๋ค์์ decoder์ ํ์ต์ด๋ค.
+
+```py
+# training seq2seq
+def train(pairs, source_vocab, target_vocab, encoder, decoder, n_iter, print_every=1000, learning_rate=0.01):
+
+ ...
+
+ for i in range(1, n_iter + 1):
+ ...
+
+ decoder_input = torch.Tensor([[SOS_token]]).long().to(device)
+ decoder_hidden = encoder_hidden # connect encoder output to decoder input
+
+ for di in range(target_length):
+ decoder_output, decoder_hidden = decoder(decoder_input, decoder_hidden)
+ loss += criterion(decoder_output, target_tensor[di])
+ decoder_input = target_tensor[di] # teacher forcing
+
+ loss.backward()
+
+ encoder_optimizer.step()
+ decoder_optimizer.step()
+
+ loss_iter = loss.item() / target_length
+ loss_total += loss_iter
+
+ if i % print_every == 0:
+ loss_avg = loss_total / print_every
+ loss_total = 0
+ print("[{} - {}%] loss = {:05.4f}".format(i, i / n_iter * 100, loss_avg))
+```
+
+decoder์ ์ฒซ input์ SOS๋ก, hidden state๋ encoder์ ์ต์ข
hidden state๋ก ๋ฃ์ด์ค๋ค.
+for๋ฌธ์ ๋๋ฉด์ decoder๋ฅผ ํต๊ณผ์ํค๋ ๋ถ๋ถ์ ๋ณด๋ฉด decoder์์ ๋์จ output์ ๋ค์ input์ผ๋ก ์ฌ์ฉํ๋ ๊ฒ์ด ์๋๋ผ ์ค์ label์ ๋ค์ cell์ ๋ฃ์ด์ฃผ๋ ๊ฒ์ ๋ณผ ์ ์๋ค.
+์ด๊ฑด **Teacher Forcing**์ด๋ผ๋ ๋ฐฉ๋ฒ์ผ๋ก ์ด์ cell์ output์ ์ฌ์ฉํ๋ ๊ฒ๋ณด๋ค ํ์ต์ด ๋น ๋ฅด์ง๋ง ๋ถ์์ ํ๋ค๋ ํน์ง์ ๊ฐ์ง๊ณ ์๋ค.
+
+์ด์ ๊น์ง ์งํํ๋ ๊ณผ์ ๋ค์ ๋ฐํ์ผ๋ก `step`์ ํตํด ํ์ต์ ์งํํ๊ณ `n_iter`๋งํผ ๋ฐ๋ณตํ๋ค.
+
+```py
+train(load_pairs, load_source_vocab, load_target_vocab, enc, dec, 5000, print_every=1000)
+
+'''output
+[1000 - 20.0%] loss = 0.0285
+[2000 - 40.0%] loss = 0.0168
+[3000 - 60.0%] loss = 0.0119
+[4000 - 80.0%] loss = 0.0091
+[5000 - 100.0%] loss = 0.0074
+'''
+```
+
+์ค์ ๋ก ํ์ตํ๋ฉด์ ํ์ธํ ๊ฒฐ๊ณผ loss๊ฐ ์ ๊ฐ์ํ์๋ค.
+
+### Evaluate
+
+๋ง์ง๋ง์ผ๋ก ํ๊ฐ๋ฅผ ์ํ ํจ์๋ก, ์ค์ pair๋ฅผ ์ถ๋ ฅํ๊ณ ๊ทธ์ ๋ํ ์์ธก๋ ํจ๊ป ์ถ๋ ฅํ์ฌ ์ ํ์ต๋์๋์ง ํ์ธํ ์ ์๋ ํจ์์ด๋ค.
+
+```py
+def evaluate(pairs, source_vocab, target_vocab, encoder, decoder, target_max_length):
+ for pair in pairs:
+ print(">", pair[0])
+ print("=", pair[1])
+ source_tensor = tensorize(source_vocab, pair[0])
+ source_length = source_tensor.size()[0]
+ encoder_hidden = torch.zeros([1, 1, encoder.hidden_size]).to(device)
+
+ for ei in range(source_length):
+ _, encoder_hidden = encoder(source_tensor[ei], encoder_hidden)
+
+ decoder_input = torch.Tensor([[SOS_token]]).long().to(device) # ์์ ํด์ผ ์๋
+ decoder_hidden = encoder_hidden
+ decoded_words = []
+
+ for di in range(target_max_length):
+ decoder_output, decoder_hidden = decoder(decoder_input, decoder_hidden)
+ _, top_index = decoder_output.data.topk(1) # 1๊ฐ์ ๊ฐ์ฅ ํฐ ์์๋ฅผ ๋ฐํ
+ if top_index.item() == EOS_token:
+ decoded_words.append("")
+ break
+ else:
+ decoded_words.append(target_vocab.index2vocab[top_index.item()])
+
+ decoder_input = top_index.squeeze().detach()
+
+ predict_words = decoded_words
+ predict_sentence = " ".join(predict_words)
+ print("<", predict_sentence)
+ print("")
+```
+
+data๋ฅผ tensor๋ก ๋ง๋ค์ด์ฃผ๊ณ ํ์ตํ๋ encoder์ decoder๋ฅผ ํต๊ณผ์์ผ model์ด ์์ธกํ ๋ฌธ์ฅ์ ์ถ๋ ฅํ๋ค.
+์ด๋ decoder์ ์ค์ ์ถ๋ ฅ์ softmax๋ฅผ ํตํด ๋์จ ํ๋ฅ ๋ค์ด๊ธฐ ๋๋ฌธ์ `topk(1)`๋ก ๊ฐ์ฅ ํฐ ๊ฐ์ index๋ฅผ ๋ฐ์ `Vocab`์ ๋จ์ด๋ก ๋ฐ๊ฟ์ค๋ค.
+
+```py
+evaluate(load_pairs, load_source_vocab, load_target_vocab, enc, dec, TARGET_MAX_LENGTH)
+
+'''output
+> i feel hungry.
+= ๋๋ ๋ฐฐ๊ฐ ๊ณ ํ๋ค.
+< ๋๋ ๋ฐฐ๊ฐ ๊ณ ํ๋ค.
+
+> pytorch is very easy.
+= ํ์ดํ ์น๋ ๋งค์ฐ ์ฝ๋ค.
+< ํ์ดํ ์น๋ ๋งค์ฐ ์ฝ๋ค.
+
+> pytorch is a framework for deep learning.
+= ํ์ดํ ์น๋ ๋ฅ๋ฌ๋์ ์ํ ํ๋ ์์ํฌ์ด๋ค.
+< ํ์ดํ ์น๋ ๋ฅ๋ฌ๋์ ์ํ ํ๋ ์์ํฌ์ด๋ค.
+
+> pytorch is very clear to use.
+= ํ์ดํ ์น๋ ์ฌ์ฉํ๊ธฐ ๋งค์ฐ ์ง๊ด์ ์ด๋ค.
+< ํ์ดํ ์น๋ ์ฌ์ฉํ๊ธฐ ๋งค์ฐ ์ง๊ด์ ์ด๋ค.
+'''
+```
+
+์ถ๋ ฅ ๊ฒฐ๊ณผ ๊ธฐ์กด์ ๋ฌธ์ฅ๋ค์ ๋ํด ํ์ต์ ์ ํ ๊ฒ์ ํ์ธํ ์ ์๋ค.
\ No newline at end of file
diff --git a/_posts/2022-06-13-boj_1009.markdown b/_posts/2022-06-13-boj_1009.markdown
new file mode 100644
index 00000000000..b5a55fe84a9
--- /dev/null
+++ b/_posts/2022-06-13-boj_1009.markdown
@@ -0,0 +1,107 @@
+---
+title: "[BOJ] ๋ถ์ฐ ์ฒ๋ฆฌ - 1009 (B2)"
+author: kwon
+date: 2022-06-13T23:00:00 +0900
+categories: [boj, bronze]
+tags: [math, implementation]
+math: true
+mermaid: false
+---
+
+| ์๊ฐ ์ ํ | ๋ฉ๋ชจ๋ฆฌ ์ ํ |
+| --- | --- |
+| 1 ์ด | 128 MB |
+
+# ๋ฌธ์
+
+์ฌ์ฉ์ด๋ ์ต์ ์ปดํจํฐ 10๋๋ฅผ ๊ฐ์ง๊ณ ์๋ค. ์ด๋ ๋ ์ฌ์ฉ์ด๋ ๋ง์ ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํด์ผ ๋ ์ผ์ด ์๊ฒจ์ ๊ฐ ์ปดํจํฐ์ 1๋ฒ๋ถํฐ 10๋ฒ๊น์ง์ ๋ฒํธ๋ฅผ ๋ถ์ฌํ๊ณ , 10๋์ ์ปดํจํฐ๊ฐ ๋ค์๊ณผ ๊ฐ์ย ๋ฐฉ๋ฒ์ผ๋ก ๋ฐ์ดํฐ๋ค์ ์ฒ๋ฆฌํ๊ธฐ๋ก ํ์๋ค.
+
+1๋ฒ ๋ฐ์ดํฐ๋ 1๋ฒ ์ปดํจํฐ, 2๋ฒ ๋ฐ์ดํฐ๋ 2๋ฒ ์ปดํจํฐ, 3๋ฒ ๋ฐ์ดํฐ๋ 3๋ฒ ์ปดํจํฐ, ... ,
+
+10๋ฒ ๋ฐ์ดํฐ๋ 10๋ฒ ์ปดํจํฐ, 11๋ฒ ๋ฐ์ดํฐ๋ 1๋ฒ ์ปดํจํฐ, 12๋ฒ ๋ฐ์ดํฐ๋ 2๋ฒ ์ปดํจํฐ, ...
+
+์ด ๋ฐ์ดํฐ์ ๊ฐ์๋ ํญ์ $a^b$๊ฐ์ ํํ๋ก ์ฃผ์ด์ง๋ค. ์ฌ์ฉ์ด๋ ๋ฌธ๋ ๋ง์ง๋ง ๋ฐ์ดํฐ๊ฐ ์ฒ๋ฆฌ๋ ย ์ปดํจํฐ์ ๋ฒํธ๊ฐ ๊ถ๊ธํด์ก๋ค. ์ด๋ฅผ ์ํํด์ฃผ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ๋ผ.
+
+# ์
๋ ฅ
+
+์
๋ ฅ์ ์ฒซ ์ค์๋ ํ
์คํธ ์ผ์ด์ค์ ๊ฐ์ T๊ฐ ์ฃผ์ด์ง๋ค. ๊ทธ ๋ค์ ์ค๋ถํฐ ๊ฐ๊ฐ์ ํ
์คํธ ์ผ์ด์ค์ ๋ํด ์ ์ a์ b๊ฐ ์ฃผ์ด์ง๋ค. (1 โค a < 100, 1 โค b < 1,000,000)
+
+# ์ถ๋ ฅ
+
+๊ฐ ํ
์คํธ ์ผ์ด์ค์ ๋ํด ๋ง์ง๋ง ๋ฐ์ดํฐ๊ฐ ์ฒ๋ฆฌ๋๋ ์ปดํจํฐ์ ๋ฒํธ๋ฅผ ์ถ๋ ฅํ๋ค.
+
+# ํ์ด
+
+์ฃผ์ด์ง ์ซ์๋ ์ ๊ณฑ์ ํํ๋ก ์ฃผ์ด์ง๋ฉฐ ์ต๋ $1000000^{100}$์ด ๋ ์ ์๊ธฐ ๋๋ฌธ์ ์ปดํจํฐ๋ก ์ฒ๋ฆฌํ๋ ๊ฒ์ ๋ชจ๋ ์๋ฎฌ๋ ์ด์
ํ๋ ๊ฒ์ผ๋ก๋ ์๊ฐ ์ ํ์ ๋ง์ถ ์ ์๋ค. ๋ชจ๋ ํ์ธํ์ง ์๊ณ ์ด๋ค ์ปดํจํฐ๊ฐ ์ฒ๋ฆฌํ๋์ง ์ ์ ์๋ ๋ฐฉ๋ฒ์ ์ฃผ์ด์ง ์ซ์์ 1์ ์๋ฆฌ๋ฅผ ํ์ฉํ๋ ๊ฒ์ด๋ค. ์ด๋ค 1์ ์๋ฆฌ์ ์๋ฅผ n๋ฒ ๊ณฑํ๋ฉด ๊ณ์ฐ๋ ์์ 1์ ์๋ฆฌ๊ฐ ์ฃผ๊ธฐ์ ์ผ๋ก ๋ฐ๋ณต๋๋ ๊ฒ์ ์ ์ ์๊ณ ๊ทธ ์๋ ์๋์ ๊ฐ์ด ๋ํ๋ผ ์ ์๋ค.
+
+```python
+nums = {1 : [1],
+ 2 : [2, 4, 8, 6],
+ 3 : [3, 9, 7, 1],
+ 4 : [4, 6],
+ 5 : [5],
+ 6 : [6],
+ 7 : [7, 9, 3, 1],
+ 8 : [8, 4, 2, 6],
+ 9 : [9, 1]}
+```
+
+ํ์ง๋ง ๋ฌดํฑ๋๊ณ $a^b$๋ฅผ ๊ณ์ฐํด์ 1์ ์๋ฆฌ๋ฅผ ๊ตฌํ๋ค๊ณ ํด๋ ์ค๋ณต๋๋ ๊ฐ๋ค์ด ์๊ธฐ ๋๋ฌธ์ ์ ํํ ์ด๋ค ์์ ์ ๊ณฑ์ธ์ง ์ ์ ์๋ค. ๊ทธ๋์ ๋จผ์ a๋ฅผ nums์ ํค๋ก ๋ฃ์ด ์ ๊ณฑ ํ์ ๋ 1์ ์๋ฆฌ์ ๋์ฌ ๊ฐ๋ค์ ์ถ๋ ค๋ด๊ณ ๊ทธ ์ค b๋ฒ์งธ ๊ฐ์ ๋ต์ผ๋ก ์ถ๋ ฅํ๋ค. b๋ฒ์งธ ๊ฐ์ด ๋ต์ด ๋ ์ ์๋ ์ด์ ๋ a๋ฅผ b๋ฒ ๊ณฑํ๋ ๋์์ 1์ ์๋ฆฌ์ ๊ฐ๋ b๋ฒ ๋ฐ๋ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ด๋ค.
+
+์๋ฅผ ๋ค์ด a๊ฐ 124, b๊ฐ 16์ด๋ผ๊ณ ํ๋ฉด ๋ค์๊ณผ ๊ฐ์ ๊ณผ์ ์ ๊ฑฐ์น๊ฒ ๋๋ค.
+
+```python
+n = int(input())
+
+nums = {1 : [1],
+ 2 : [2, 4, 8, 6],
+ 3 : [3, 9, 7, 1],
+ 4 : [4, 6],
+ 5 : [5],
+ 6 : [6],
+ 7 : [7, 9, 3, 1],
+ 8 : [8, 4, 2, 6],
+ 9 : [9, 1]}
+
+for _ in range(n):
+ a, b = map(int, input().split())
+ # a์ 1์ ์๋ฆฌ์๋ฅผ ๊ตฌํ๋ค -> 4
+ one = a % 10
+
+ # 1์ ์๋ฆฌ์ ๋์ฌ ์ ์๋ ๊ฐ๋ค์ ๊ฐ์ ธ์จ๋ค -> nums[4] -> [4, 6]
+ # ์ด ์ค์์ b๋ฒ์งธ ๊ฐ์ ์ทจํ๋ค. 4, 6, 4, 6, 4, 6 -> 6
+ print(nums[one][(b - 1) % len(nums[one])])
+```
+
+๋จ a์ 1์ ์๋ฆฌ๊ฐ 0์ผ ๊ฒฝ์ฐ ๋ฌด์กฐ๊ฑด ์ ๊ณฑํ ์์ 1์ ์๋ฆฌ๋ 0์ด๋ฏ๋ก 10๋ฒ ์ปดํจํฐ๊ฐ ์ฒ๋ฆฌํ๊ฒ ๋๋ค.
+
+```python
+a, b = map(int, input().split())
+one = a % 10
+if not one:
+ print(10)
+```
+
+## ์ฝ๋
+
+```python
+n = int(input())
+
+nums = {1 : [1],
+ 2 : [2, 4, 8, 6],
+ 3 : [3, 9, 7, 1],
+ 4 : [4, 6],
+ 5 : [5],
+ 6 : [6],
+ 7 : [7, 9, 3, 1],
+ 8 : [8, 4, 2, 6],
+ 9 : [9, 1]}
+
+for _ in range(n):
+ a, b = map(int, input().split())
+ one = a % 10
+ if not one:
+ print(10)
+ else:
+ print(nums[one][(b - 1) % len(nums[one])])
+```
\ No newline at end of file
diff --git a/_posts/2022-09-06-boj_1406.markdown b/_posts/2022-09-06-boj_1406.markdown
new file mode 100644
index 00000000000..2438b7f8ca9
--- /dev/null
+++ b/_posts/2022-09-06-boj_1406.markdown
@@ -0,0 +1,86 @@
+---
+title: "[BOJ] ์๋ํฐ - 1406 (S2)
+)"
+author: kwon
+date: 2022-9-6T14:00:00 +0900
+categories: [boj, silver]
+tags: [data structure, stack, linked list]
+math: true
+mermaid: false
+---
+
+| ์๊ฐ ์ ํ | ๋ฉ๋ชจ๋ฆฌ ์ ํ |
+| --- | --- |
+| 0.3 | 512 |
+
+# ๋ฌธ์
+
+ํ ์ค๋ก ๋ ๊ฐ๋จํ ์๋ํฐ๋ฅผ ๊ตฌํํ๋ ค๊ณ ํ๋ค. ์ด ํธ์ง๊ธฐ๋ ์์ด ์๋ฌธ์๋ง์ ๊ธฐ๋กํ ์ ์๋ ํธ์ง๊ธฐ๋ก, ์ต๋ 600,000๊ธ์๊น์ง ์
๋ ฅํ ์ ์๋ค.
+
+์ด ํธ์ง๊ธฐ์๋ '์ปค์'๋ผ๋ ๊ฒ์ด ์๋๋ฐ, ์ปค์๋ ๋ฌธ์ฅ์ ๋งจ ์(์ฒซ ๋ฒ์งธ ๋ฌธ์์ ์ผ์ชฝ), ๋ฌธ์ฅ์ ๋งจ ๋ค(๋ง์ง๋ง ๋ฌธ์์ ์ค๋ฅธ์ชฝ), ๋๋ ๋ฌธ์ฅ ์ค๊ฐ ์์์ ๊ณณ(๋ชจ๋ ์ฐ์๋ ๋ ๋ฌธ์ ์ฌ์ด)์ ์์นํ ์ ์๋ค. ์ฆ ๊ธธ์ด๊ฐ L์ธ ๋ฌธ์์ด์ด ํ์ฌ ํธ์ง๊ธฐ์ ์
๋ ฅ๋์ด ์์ผ๋ฉด, ์ปค์๊ฐ ์์นํ ์ ์๋ ๊ณณ์ L+1๊ฐ์ง ๊ฒฝ์ฐ๊ฐ ์๋ค.
+
+์ด ํธ์ง๊ธฐ๊ฐ ์ง์ํ๋ ๋ช
๋ น์ด๋ ๋ค์๊ณผ ๊ฐ๋ค.
+
+| L | ์ปค์๋ฅผ ์ผ์ชฝ์ผ๋ก ํ ์นธ ์ฎ๊น (์ปค์๊ฐ ๋ฌธ์ฅ์ ๋งจ ์์ด๋ฉด ๋ฌด์๋จ) |
+| --- | --- |
+| D | ์ปค์๋ฅผ ์ค๋ฅธ์ชฝ์ผ๋ก ํ ์นธ ์ฎ๊น (์ปค์๊ฐ ๋ฌธ์ฅ์ ๋งจ ๋ค์ด๋ฉด ๋ฌด์๋จ) |
+| B | ์ปค์ ์ผ์ชฝ์ ์๋ ๋ฌธ์๋ฅผ ์ญ์ ํจ (์ปค์๊ฐ ๋ฌธ์ฅ์ ๋งจ ์์ด๋ฉด ๋ฌด์๋จ)์ญ์ ๋ก ์ธํด ์ปค์๋ ํ ์นธ ์ผ์ชฝ์ผ๋ก ์ด๋ํ ๊ฒ์ฒ๋ผ ๋ํ๋์ง๋ง, ์ค์ ๋ก ์ปค์์ ์ค๋ฅธ์ชฝ์ ์๋ ๋ฌธ์๋ ๊ทธ๋๋ก์ |
+| Pย $ | $๋ผ๋ ๋ฌธ์๋ฅผ ์ปค์ ์ผ์ชฝ์ ์ถ๊ฐํจ |
+
+์ด๊ธฐ์ ํธ์ง๊ธฐ์ ์
๋ ฅ๋์ด ์๋ ๋ฌธ์์ด์ด ์ฃผ์ด์ง๊ณ , ๊ทธ ์ดํ ์
๋ ฅํ ๋ช
๋ น์ด๊ฐ ์ฐจ๋ก๋ก ์ฃผ์ด์ก์ ๋, ๋ชจ๋ ๋ช
๋ น์ด๋ฅผ ์ํํ๊ณ ๋ ํ ํธ์ง๊ธฐ์ ์
๋ ฅ๋์ด ์๋ ๋ฌธ์์ด์ ๊ตฌํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค. ๋จ, ๋ช
๋ น์ด๊ฐ ์ํ๋๊ธฐ ์ ์ ์ปค์๋ ๋ฌธ์ฅ์ ๋งจ ๋ค์ ์์นํ๊ณ ์๋ค๊ณ ํ๋ค.
+
+# ์
๋ ฅ
+
+์ฒซ์งธ ์ค์๋ ์ด๊ธฐ์ ํธ์ง๊ธฐ์ ์
๋ ฅ๋์ด ์๋ ๋ฌธ์์ด์ด ์ฃผ์ด์ง๋ค. ์ด ๋ฌธ์์ด์ ๊ธธ์ด๊ฐ N์ด๊ณ , ์์ด ์๋ฌธ์๋ก๋ง ์ด๋ฃจ์ด์ ธ ์์ผ๋ฉฐ, ๊ธธ์ด๋ 100,000์ ๋์ง ์๋๋ค. ๋์งธ ์ค์๋ ์
๋ ฅํ ๋ช
๋ น์ด์ ๊ฐ์๋ฅผ ๋ํ๋ด๋ ์ ์ M(1 โค Mย โค 500,000)์ด ์ฃผ์ด์ง๋ค. ์
์งธ ์ค๋ถํฐ M๊ฐ์ ์ค์ ๊ฑธ์ณ ์
๋ ฅํ ๋ช
๋ น์ด๊ฐ ์์๋๋ก ์ฃผ์ด์ง๋ค. ๋ช
๋ น์ด๋ ์์ ๋ค ๊ฐ์ง ์ค ํ๋์ ํํ๋ก๋ง ์ฃผ์ด์ง๋ค.
+
+# ์ถ๋ ฅ
+
+์ฒซ์งธ ์ค์ ๋ชจ๋ ๋ช
๋ น์ด๋ฅผ ์ํํ๊ณ ๋ ํ ํธ์ง๊ธฐ์ ์
๋ ฅ๋์ด ์๋ ๋ฌธ์์ด์ ์ถ๋ ฅํ๋ค.
+
+# ํ์ด
+
+์ปค์๋ฅผ ์์ง์ด๊ฑฐ๋ ๊ธฐ์ค์ผ๋ก ๋ฌธ์๋ฅผ ์ญ์ /์ถ๊ฐํ๋ ๋ช
๋ น์ ์ํํด์ผ ํ๋ค. ์ด๋ฅผ ์ํด ์ปค์๋ฅผ ์ธ๋ฑ์ค ๊ฐ์ผ๋ก ๋๊ณ ๊ตฌํํ ์๋ ์๊ฒ ์ง๋ง stack์ ๊ด์ ์ผ๋ก ๋ณธ๋ค๋ฉด ์กฐ๊ธ ๋ ํธํ๊ฒ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์๋ค.
+
+
+
+์ ๊ทธ๋ฆผ๊ณผ ๊ฐ์ด ์ปค์๋ฅผ ์ค์ฌ์ผ๋ก ์ ์ชฝ์ ๋ฌธ์์ด๋ค์ ์คํ์ผ๋ก ์๊ฐํ๋ฉด ๋ฌธ์ ์์ ์ฃผ์ด์ง 4 ๊ฐ์ ๋ช
๋ น์ด๋ฅผ ์ํํ๊ธฐ ํธํด์ง๋ค. ๋จ, ์ฌ๊ธฐ์ ์คํ์ ๊ฐ์ฅ ์๋ฅผ ์ปค์๊ฐ ์๋ ๋ฐฉํฅ์ผ๋ก ์๊ฐํ๋ค. ์ฆ, ์ผ์ชฝ ์คํ์ ์ค๋ฅธ์ชฝ์ด ์คํ์ ์์ชฝ์ด๋ฉฐ ์ค๋ฅธ์ชฝ ์คํ์ ์ผ์ชฝ์ด ์คํ์ ์์ชฝ์ด ๋๋ค.
+
+๋จผ์ , ์ปค์๋ฅผ ์ฎ๊ธฐ๋ ๊ฒฝ์ฐ์๋ ํ ์ชฝ์ ์คํ์ ๊ฐ์ฅ ์์ ์๋ ๋ฌธ์์ด์ ๋ฐ๋์ชฝ ์คํ์ผ๋ก ๋ฃ์ด์ฃผ๋ฉด ๋๋ค.
+
+
+
+์๋ฅผ ๋ค์ด **D** ๋ช
๋ น์ ํตํด ์ปค์๋ฅผ ์ค๋ฅธ์ชฝ์ผ๋ก ์ฎ๊ธธ ๋ ์ ๊ทธ๋ฆผ์ฒ๋ผ ์ค๋ฅธ์ชฝ ์คํ์ ๊ฐ์ฅ ์์ ์๋ f๋ฅผ ๋นผ์ ์ผ์ชฝ ์คํ์ผ๋ก ๋ฃ์ด์ฃผ๋ฉด ์ปค์๋ฅผ ์ค๋ฅธ์ชฝ์ผ๋ก ์์ง์ด๋ ๊ฒ๊ณผ ๊ฐ์ ํจ๊ณผ๋ฅผ ๋ณผ ์ ์๋ค.
+
+์ญ์ ๋ช
๋ น์ ์ปค์๊ฐ ๋งจ ์์ ์๋ ๊ฒฝ์ฐ๋ฅผ ์ ์ธํ๋ฉด ํญ์ ์ผ์ชฝ ์คํ์ ๋ฌธ์๋ฅผ ํ๋์ฉ ์ญ์ ํ๋ฉด ๋๋ฉฐ, ์ฝ์
๋ช
๋ น์ ํญ์ ์ผ์ชฝ ์คํ์ ์ฝ์
ํ๋ ค๋ ๋ฌธ์๋ฅผ ๋ฃ์ด์ฃผ๋ฉด ๋๋ค.
+
+## ์ฝ๋
+
+```python
+import sys
+
+input = sys.stdin.readline
+
+left = list(input().rstrip())
+right = []
+
+for _ in range(int(input())):
+ com = (list(input().split()))
+ if com[0] == 'L':
+ if left:
+ right.append(left.pop())
+
+ elif com[0] == 'D':
+ if right:
+ left.append(right.pop())
+
+ elif com[0] == 'B':
+ if left:
+ left.pop()
+
+ elif com[0] == 'P':
+ left.append(com[1])
+
+print(''.join(left+right[::-1]))
+```
+
+python์์๋ list์ `pop()` ํจ์๋ก ์คํ์์ ๊บผ๋ด๊ณ , `append()` ํจ์๋ก ์คํ์ ๊ฐ์ ๋ฃ๋ ๊ฒ์ผ๋ก stack์ ๊ฐ๋จํ๊ฒ ๊ตฌํํ ์ ์๋ค.
\ No newline at end of file
diff --git a/_posts/2022-09-13-boj_24060.markdown b/_posts/2022-09-13-boj_24060.markdown
new file mode 100644
index 00000000000..951c689ad4f
--- /dev/null
+++ b/_posts/2022-09-13-boj_24060.markdown
@@ -0,0 +1,157 @@
+---
+title: "[BOJ] ๋ณํฉ ์ ๋ ฌ 1 - 24060 (S3)"
+author: kwon
+date: 2022-09-13T23:00:00 +0900
+categories: [boj, silver]
+tags: [implementation, sort, recursion]
+math: true
+mermaid: false
+---
+
+| ์๊ฐ ์ ํ | ๋ฉ๋ชจ๋ฆฌ ์ ํ |
+| --- | --- |
+| 1 ์ด | 512 MB |
+
+## ๋ฌธ์
+
+์ค๋๋ ์์ค์ด๋ ๋ณํฉ ์ ๋ ฌย ์์
์กฐ๊ต๋ฅผ ํ๊ณ ์๋ค.ย ์๋น ๊ฐ ์์
ํย ๋ด์ฉ์ ํ์๋ค์ด ์ ์ดํดํ๋์ง ๋ฌธ์ ๋ฅผ ํตํด์ ํ์ธํด๋ณด์.
+
+*N*๊ฐ์ ์๋ก ๋ค๋ฅธ ์์ย ์ ์๊ฐ ์ ์ฅ๋ย ๋ฐฐ์ด A๊ฐ ์๋ค. ๋ณํฉ ์ ๋ ฌ๋ก ๋ฐฐ์ด A๋ฅผ ์ค๋ฆ์ฐจ์ ์ ๋ ฌํ ๊ฒฝ์ฐ ๋ฐฐ์ด A์ย *K*ย ๋ฒ์งธ ์ ์ฅ๋๋ย ์๋ฅผ ๊ตฌํด์ ์ฐ๋ฆฌ ์์ค์ด๋ฅผ ๋์์ฃผ์.
+
+ํฌ๊ธฐ๊ฐย *N*์ธ ๋ฐฐ์ด์ ๋ํย ๋ณํฉ ์ ๋ ฌย ์์ฌ ์ฝ๋๋ย ๋ค์๊ณผ ๊ฐ๋ค.
+
+```
+merge_sort(A[p..r]) { # A[p..r]์ ์ค๋ฆ์ฐจ์ ์ ๋ ฌํ๋ค.
+ if (p < r) then {
+ q <- โ(p + r) / 2โ; # q๋ p, r์ ์ค๊ฐ ์ง์
+ย merge_sort(A, p, q); # ์ ๋ฐ๋ถ ์ ๋ ฌ
+ย merge_sort(A, q + 1, r); # ํ๋ฐ๋ถ ์ ๋ ฌ
+ย merge(A, p, q, r); # ๋ณํฉ
+ย }
+}
+
+# A[p..q]์ A[q+1..r]์ ๋ณํฉํ์ฌ A[p..r]์ ์ค๋ฆ์ฐจ์ ์ ๋ ฌ๋ ์ํ๋ก ๋ง๋ ๋ค.
+# A[p..q]์ A[q+1..r]์ ์ด๋ฏธ ์ค๋ฆ์ฐจ์์ผ๋ก ์ ๋ ฌ๋์ด ์๋ค.
+merge(A[], p, q, r) {
+ i <- p; j <- q + 1; t <- 1;
+ while (i โค q and j โค r) {
+ if (A[i] โค A[j])
+ย then tmp[t++] <- A[i++]; # tmp[t] <- A[i]; t++; i++;
+ย else tmp[t++] <- A[j++]; # tmp[t] <- A[j]; t++; j++;
+ย }
+ while (i โค q) # ์ผ์ชฝ ๋ฐฐ์ด ๋ถ๋ถ์ด ๋จ์ ๊ฒฝ์ฐ
+ย tmp[t++] <- A[i++];
+ย while (j โค r) # ์ค๋ฅธ์ชฝ ๋ฐฐ์ด ๋ถ๋ถ์ด ๋จ์ ๊ฒฝ์ฐ
+ย tmp[t++] <- A[j++];
+ย i <- p; t <- 1;
+ย while (i โค r) # ๊ฒฐ๊ณผ๋ฅผ A[p..r]์ ์ ์ฅ
+ย A[i++] <- tmp[t++];
+}
+```
+
+## ์
๋ ฅ
+
+์ฒซ์งธ ์ค์ ๋ฐฐ์ด A์ ํฌ๊ธฐย *N*(5ย โคย *N*ย โค 500,000), ์ ์ฅ ํ์ย *K*(1 โคย *K*ย โค 108)๊ฐย ์ฃผ์ด์ง๋ค.
+
+๋ค์ย ์ค์ ์๋ก ๋ค๋ฅธ ๋ฐฐ์ด A์ ์์ A1, A2, ..., AN์ด ์ฃผ์ด์ง๋ค.ย (1ย โค Aiย โค 109)
+
+## ์ถ๋ ฅ
+
+๋ฐฐ์ด A์ย *K*ย ๋ฒ์งธ ์ ์ฅ ๋๋ย ์๋ฅผ ์ถ๋ ฅํ๋ค. ์ ์ฅ ํ์๊ฐย *K*ย ๋ณด๋ค ์์ผ๋ฉด -1์ ์ถ๋ ฅํ๋ค.
+
+# ํ์ด
+
+๋ฌธ์ ์ ์์ฑ๋ ์์ฌ ์ฝ๋๋ฅผ ๋ฐ๋ผ ๋ณํฉ ์ ๋ ฌ ์ฝ๋๋ฅผ ์์ฑํ์ฌ ์ ๋ ฌ๋ ๋ฐฐ์ด A์ K๋ฒ์งธ ์ ์ฅ๋ ์๋ฅผ ์ถ๋ ฅํ๋ ๋ฌธ์ ์ด๋ค.
+
+## ๋ณํฉ ์ ๋ ฌ
+
+๋ณํฉ ์ ๋ ฌ์ ์ฃผ์ด์ง ๋ฐฐ์ด์ ์ ๋ฐ์ผ๋ก ๋๋๋ ๊ณผ์ ๊ณผ ์ด๋ฅผ ๋ค์ ํฉ์น๋ ๋ณํฉ ๊ณผ์ ์ผ๋ก ์งํ๋๋ค.
+
+๋จผ์ ๋ถ๋ถ ๋ฐฐ์ด(๋๋์ด์ง ๋ฐฐ์ด)์ ์์๊ฐ ํ๋๋ง ๋จ๊ฑฐ๋ ๋ถ๋ถ ๋ฐฐ์ด์ด ๋น ๋๊น์ง ๋ฐฐ์ด์ ์ ๋ฐ์ผ๋ก ๋๋์ด ์ค๋ค. ์ด๋ ์ฌ๊ท๋ฅผ ์ด์ฉํ์ฌ ๋ค์๊ณผ ๊ฐ์ด ๊ตฌํํ ์ ์๋ค.
+
+```python
+def merge_sort(a, p, r):
+ global result
+ if result != -1:
+ return
+ if p < r:
+ q = (p + r) // 2
+ merge_sort(a, p, q)
+ merge_sort(a, q+1, r)
+ ...
+```
+
+๋ชจ๋ ๋ค ๋๋ด์ผ๋ฉด ์ด์ ๋ณํฉํ๋ฉฐ ์ ๋ ฌ๋ ๋ฐฐ์ด์ ์์ฑํ๋ค.
+
+๋ณํฉํ ๋ ๋ฐฐ์ด์ ์์๋ค์ ํ์ธํ๋ฉฐ ์์ ์์ผ๋ก ๋ฐฐ์ด์ ๋ฃ์ด์ค๋ค. ํ์ง๋ง ๋ ๋ฐฐ์ด์ ๊ธธ์ด๊ฐ ํญ์ ๊ฐ์ง๋ ์์ผ๋ฏ๋ก ๋จ์ ๋ฐฐ์ด์ ์์๋ค๋ ์ฐจ๋ก๋๋ก ๋ฃ์ด์ค๋ค. ์ด ๋ ๊ฐ ๋ถ๋ถ ๋ฐฐ์ด๋ค์ ์ด์ ์ ๋ณํฉ์์ ์ด๋ฏธ ์ ๋ ฌ๋ ์ํ์ด๋ฏ๋ก ๊ทธ๋ฅ ์์๋๋ก ๋ฃ์ด์ฃผ๋ฉด ๋๋ค.
+
+์ ๋ฐฉ์๋๋ก ๋ชจ๋ ๋ณํฉ์ ์๋ฃํ๋ฉด ์ ๋ ฌ์ด ์๋ฃ๋๋ค.
+
+ํ์ง๋ง ์ฐ๋ฆฌ๊ฐ ์ํ๋ ๊ฒ์ ํน์ ๋ฒ์งธ์ ์ ์ฅ๋ ์๋ฅผ ์ฐพ๋ ๊ฒ์ด๋ฏ๋ก ์ ๋ ฌํ ๊ฐ์ ์์๋ก ์ ์ฅํ ๋์
๋๋ฆฌ `tmp`์ ๊ฐ์ ๋ฐฐ์ด `a`์ ์ฎ๊ฒจ์ฃผ๋ฉด์ ์ํ๋ ๋ฒ์งธ์ `a`์ ์ ์ฅ๋ ๊ฐ์ ์ฐพ์๋ธ๋ค.
+
+```python
+ ...
+ while i <= r:
+ a[i] = tmp[t]
+ cnt += 1
+ if cnt == k:
+ cnt = -float('inf')
+ result = tmp[t]
+ return
+ t += 1
+ i += 1
+ ...
+```
+
+## ์ฝ๋
+
+```python
+a, k = map(int, input().split())
+nums = list(map(int, input().split()))
+cnt = 0
+result = -1
+def merge_sort(a, p, r):
+ global result
+ if result != -1:
+ return
+ if p < r:
+ q = (p + r) // 2
+ merge_sort(a, p, q)
+ merge_sort(a, q+1, r)
+ merge(a, p, q, r)
+
+def merge(a, p, q, r):
+ global cnt, result
+ i, j, t = p, q + 1, 0
+ tmp = {}
+ while i <= q and j <= r:
+ if a[i] <= a[j]:
+ tmp[t] = a[i]
+ t += 1
+ i += 1
+ else:
+ tmp[t] = a[j]
+ t += 1
+ j += 1
+ while i <= q:
+ tmp[t] = a[i]
+ t += 1
+ i += 1
+ while j <= r:
+ tmp[t] = a[j]
+ t += 1
+ j += 1
+ i, t = p, 0
+ while i <= r:
+ a[i] = tmp[t]
+ cnt += 1
+ if cnt == k:
+ cnt = -float('inf')
+ result = tmp[t]
+ return
+ t += 1
+ i += 1
+
+merge_sort(nums, 0, a-1)
+print(result)
+```
\ No newline at end of file
diff --git a/_posts/2022-09-26-boj_7568.markdown b/_posts/2022-09-26-boj_7568.markdown
new file mode 100644
index 00000000000..dd48028a258
--- /dev/null
+++ b/_posts/2022-09-26-boj_7568.markdown
@@ -0,0 +1,60 @@
+---
+title: "[BOJ] ๋ฉ์น - 7568 (S5)"
+author: kwon
+date: 2022-09-26T23:00:00 +0900
+categories: [boj, silver]
+tags: [implementation, brute-force]
+math: true
+mermaid: false
+---
+
+| ์๊ฐ ์ ํ | ๋ฉ๋ชจ๋ฆฌ ์ ํ |
+| --- | --- |
+| 1์ด | 128 MB |
+
+# ๋ฌธ์
+
+์ฐ๋ฆฌ๋ ์ฌ๋์ ๋ฉ์น๋ฅผ ํค์ ๋ชธ๋ฌด๊ฒ, ์ด ๋ ๊ฐ์ ๊ฐ์ผ๋ก ํํํ์ฌ ๊ทธ ๋ฑ์๋ฅผ ๋งค๊ฒจ๋ณด๋ ค๊ณ ํ๋ค. ์ด๋ค ์ฌ๋์ ๋ชธ๋ฌด๊ฒ๊ฐ x kg์ด๊ณ ํค๊ฐ y cm๋ผ๋ฉด ์ด ์ฌ๋์ ๋ฉ์น๋ (x, y)๋ก ํ์๋๋ค. ๋ ์ฌ๋ A ์ B์ ๋ฉ์น๊ฐ ๊ฐ๊ฐ (x, y), (p, q)๋ผ๊ณ ํ ๋ x > p ๊ทธ๋ฆฌ๊ณ y > q ์ด๋ผ๋ฉด ์ฐ๋ฆฌ๋ A์ ๋ฉ์น๊ฐ B์ ๋ฉ์น๋ณด๋ค "๋ ํฌ๋ค"๊ณ ๋งํ๋ค. ์๋ฅผ ๋ค์ด ์ด๋ค A, B ๋ ์ฌ๋์ ๋ฉ์น๊ฐ ๊ฐ๊ฐ (56, 177), (45, 165) ๋ผ๊ณ ํ๋ค๋ฉด A์ ๋ฉ์น๊ฐ B๋ณด๋ค ํฐ ์
์ด ๋๋ค. ๊ทธ๋ฐ๋ฐ ์๋ก ๋ค๋ฅธ ๋ฉ์น๋ผ๋ฆฌ ํฌ๊ธฐ๋ฅผ ์ ํ ์ ์๋ ๊ฒฝ์ฐ๋ ์๋ค. ์๋ฅผ ๋ค์ด ๋ ์ฌ๋ C์ D์ ๋ฉ์น๊ฐ ๊ฐ๊ฐ (45, 181), (55, 173)์ด๋ผ๋ฉด ๋ชธ๋ฌด๊ฒ๋ D๊ฐ C๋ณด๋ค ๋ ๋ฌด๊ฒ๊ณ , ํค๋ C๊ฐ ๋ ํฌ๋ฏ๋ก, "๋ฉ์น"๋ก๋ง ๋ณผ ๋ C์ D๋ ๋๊ตฌ๋ ์๋๋ฐฉ๋ณด๋ค ๋ ํฌ๋ค๊ณ ๋งํ ์ ์๋ค.
+
+N๋ช
์ ์ง๋จ์์ ๊ฐ ์ฌ๋์ ๋ฉ์น ๋ฑ์๋ ์์ ๋ณด๋ค ๋ "ํฐ ๋ฉ์น"์ ์ฌ๋์ ์๋ก ์ ํด์ง๋ค. ๋ง์ผ ์์ ๋ณด๋ค ๋ ํฐ ๋ฉ์น์ ์ฌ๋์ด k๋ช
์ด๋ผ๋ฉด ๊ทธ ์ฌ๋์ ๋ฉ์น ๋ฑ์๋ k+1์ด ๋๋ค. ์ด๋ ๊ฒ ๋ฑ์๋ฅผ ๊ฒฐ์ ํ๋ฉด ๊ฐ์ ๋ฉ์น ๋ฑ์๋ฅผ ๊ฐ์ง ์ฌ๋์ ์ฌ๋ฌ ๋ช
๋ ๊ฐ๋ฅํ๋ค. ์๋๋ 5๋ช
์ผ๋ก ์ด๋ฃจ์ด์ง ์ง๋จ์์ ๊ฐ ์ฌ๋์ ๋ฉ์น์ ๊ทธ ๋ฑ์๊ฐ ํ์๋ ํ์ด๋ค.
+
+| ์ด๋ฆ | (๋ชธ๋ฌด๊ฒ, ํค) | ๋ฉ์น ๋ฑ์ |
+| --- | --- | --- |
+| A | (55, 185) | 2 |
+| B | (58, 183) | 2 |
+| C | (88, 186) | 1 |
+| D | (60, 175) | 2 |
+| E | (46, 155) | 5 |
+
+์ ํ์์ C๋ณด๋ค ๋ ํฐ ๋ฉ์น์ ์ฌ๋์ด ์์ผ๋ฏ๋ก C๋ 1๋ฑ์ด ๋๋ค. ๊ทธ๋ฆฌ๊ณ A, B, D ๊ฐ๊ฐ์ ๋ฉ์น๋ณด๋ค ํฐ ์ฌ๋์ C๋ฟ์ด๋ฏ๋ก ์ด๋ค์ ๋ชจ๋ 2๋ฑ์ด ๋๋ค. ๊ทธ๋ฆฌ๊ณ E๋ณด๋ค ํฐ ๋ฉ์น๋ A, B, C, D ์ด๋ ๊ฒ 4๋ช
์ด๋ฏ๋ก E์ ๋ฉ์น๋ 5๋ฑ์ด ๋๋ค. ์ ๊ฒฝ์ฐ์ 3๋ฑ๊ณผ 4๋ฑ์ ์กด์ฌํ์ง ์๋๋ค. ์ฌ๋ฌ๋ถ์ ํ์ N๋ช
์ ๋ชธ๋ฌด๊ฒ์ ํค๊ฐ ๋ด๊ธด ์
๋ ฅ์ ์ฝ์ด์ ๊ฐ ์ฌ๋์ ๋ฉ์น ๋ฑ์๋ฅผ ๊ณ์ฐํ์ฌ ์ถ๋ ฅํด์ผ ํ๋ค.
+
+# ์
๋ ฅ
+
+์ฒซ ์ค์๋ ์ ์ฒด ์ฌ๋์ ์ N์ด ์ฃผ์ด์ง๋ค. ๊ทธ๋ฆฌ๊ณ ์ด์ด์ง๋ N๊ฐ์ ์ค์๋ ๊ฐ ์ฌ๋์ ๋ชธ๋ฌด๊ฒ์ ํค๋ฅผ ๋ํ๋ด๋ ์์ ์ ์ x์ y๊ฐ ํ๋์ ๊ณต๋ฐฑ์ ๋๊ณ ๊ฐ๊ฐ ๋ํ๋๋ค.
+
+# ์ถ๋ ฅ
+
+์ฌ๋ฌ๋ถ์ ์
๋ ฅ์ ๋์ด๋ ์ฌ๋์ ๋ฉ์น ๋ฑ์๋ฅผ ๊ตฌํด์ ๊ทธ ์์๋๋ก ์ฒซ ์ค์ ์ถ๋ ฅํด์ผ ํ๋ค. ๋จ, ๊ฐ ๋ฉ์น ๋ฑ์๋ ๊ณต๋ฐฑ๋ฌธ์๋ก ๋ถ๋ฆฌ๋์ด์ผ ํ๋ค.
+
+# ํ์ด
+
+๋ชจ๋ ์ฌ๋๋ค์ ๋น๊ตํ๋ฉด์ ํค์ ๋ชธ๋ฌด๊ฒ๊ฐ ๋ ๋ค ์์ ๊ฒฝ์ฐ ํด๋น ์ฌ๋์ ์ธ๋ฑ์ค์ ์นด์ดํธ๋ฅผ ํ๋ ์ฌ๋ฆฐ๋ค (๋ฑ์๋ฅผ ํ๋ ๋ด๋ฆผ). ๋ง์ง๋ง์ ์นด์ดํธํ ๋ฐฐ์ด์ ์ถ๋ ฅํ๋ค. ๋ฑ์๋ 1๋ฑ๋ถํฐ ์์ํ๊ธฐ ๋๋ฌธ์ ๋ฑ์(์นด์ดํธ)๋ฅผ ์ ์ฅํ๋ ๋ฐฐ์ด์ ๊ฐ์ 1๋ก ์ ์ํ๊ณ ์์ํ๋ค.
+
+## ์ฝ๋
+
+```python
+n = int(input())
+l = []
+cnt = [1] * n
+for _ in range(n):
+ l.append(tuple(map(int, input().split())))
+
+for i in range(n):
+ for j in range(i+1, n):
+ p1, p2 = l[i], l[j]
+ if p1[0] > p2[0] and p1[1] > p2[1]:
+ cnt[j] += 1
+ elif p1[0] < p2[0] and p1[1] < p2[1]:
+ cnt[i] += 1
+print(' '.join(map(str, cnt)))
+```
\ No newline at end of file
diff --git a/_posts/2022-10-04-boj_1269.markdown b/_posts/2022-10-04-boj_1269.markdown
new file mode 100644
index 00000000000..9c064dba57a
--- /dev/null
+++ b/_posts/2022-10-04-boj_1269.markdown
@@ -0,0 +1,42 @@
+---
+title: "[BOJ] ๋์นญ ์ฐจ์งํฉ - 1269 (S4)"
+author: kwon
+date: 2022-10-4T14:00:00 +0900
+categories: [boj, silver]
+tags: [data structure, set / map by hashing, set / map by tree]
+math: true
+mermaid: false
+---
+
+22/10/4
+
+| ์๊ฐ ์ ํ | ๋ฉ๋ชจ๋ฆฌ ์ ํ |
+| --- | --- |
+| 2 ์ด | 256 MB |
+
+# ๋ฌธ์
+
+์์ฐ์๋ฅผ ์์๋ก ๊ฐ๋ ๊ณต์งํฉ์ด ์๋ ๋ ์งํฉ A์ B๊ฐ ์๋ค. ์ด๋, ๋ ์งํฉ์ ๋์นญ ์ฐจ์งํฉ์ ์์์ ๊ฐ์๋ฅผ ์ถ๋ ฅํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค. ๋ ์งํฉ A์ B๊ฐ ์์ ๋, (A-B)์ (B-A)์ ํฉ์งํฉ์ A์ B์ ๋์นญ ์ฐจ์งํฉ์ด๋ผ๊ณ ํ๋ค.
+
+์๋ฅผ ๋ค์ด, A = { 1, 2, 4 } ์ด๊ณ , B = { 2, 3, 4, 5, 6 } ๋ผ๊ณ ํ ๋,ย A-B = { 1 } ์ด๊ณ , B-A = { 3, 5, 6 } ์ด๋ฏ๋ก, ๋์นญ ์ฐจ์งํฉ์ ์์์ ๊ฐ์๋ 1 + 3 = 4๊ฐ์ด๋ค.
+
+# ์
๋ ฅ
+
+์ฒซ์งธ ์ค์ ์งํฉ A์ ์์์ ๊ฐ์์ ์งํฉ B์ ์์์ ๊ฐ์๊ฐ ๋น ์นธ์ ์ฌ์ด์ ๋๊ณ ์ฃผ์ด์ง๋ค. ๋์งธ ์ค์๋ ์งํฉ A์ ๋ชจ๋ ์์๊ฐ, ์
์งธ ์ค์๋ ์งํฉ B์ ๋ชจ๋ ์์๊ฐ ๋น ์นธ์ ์ฌ์ด์ ๋๊ณ ๊ฐ๊ฐ ์ฃผ์ด์ง๋ค. ๊ฐ ์งํฉ์ ์์์ ๊ฐ์๋ 200,000์ ๋์ง ์์ผ๋ฉฐ, ๋ชจ๋ ์์์ ๊ฐ์ 100,000,000์ ๋์ง ์๋๋ค.
+
+# ์ถ๋ ฅ
+
+์ฒซ์งธ ์ค์ ๋์นญ ์ฐจ์งํฉ์ ์์์ ๊ฐ์๋ฅผ ์ถ๋ ฅํ๋ค.
+
+# ํ์ด
+
+๋์นญ ์ฐจ์งํฉ์ ์ ์์ ๋ฐ๋ผ ๊ทธ๋๋ก ์ฝ๋๋ก ์์ฑํ๋ฉด ๋๋ ๋ฌธ์ ๋ค. ๋์นญ ์ฐจ์งํฉ์ ๊ฐ ์ฐจ์งํฉ (A-B)์ (B-A)๋ ๊ต์งํฉ์ด ๋ฌด์กฐ๊ฑด ๊ณต์งํฉ์ด๋ฏ๋ก ๊ฐ ์ฐจ์งํฉ์ ์์ ๊ฐ์๋ฅผ ๋ํ๋ ๊ฒ์ผ๋ก ๋์นญ ์ฐจ์งํฉ์ ์์ ๊ฐ์๋ฅผ ๊ตฌํ ์ ์๋ค.
+
+## ์ฝ๋
+
+```python
+input()
+a = set(map(int, input().split()))
+b = set(map(int, input().split()))
+print(len(a - b) + len(b - a))
+```
\ No newline at end of file
diff --git a/_posts/2022-10-11-boj_10989.markdown b/_posts/2022-10-11-boj_10989.markdown
new file mode 100644
index 00000000000..25c8643bda4
--- /dev/null
+++ b/_posts/2022-10-11-boj_10989.markdown
@@ -0,0 +1,49 @@
+---
+title: "[BOJ] ์ ์ ๋ ฌํ๊ธฐ 3 - 10989 (B1)"
+author: kwon
+date: 2022-10-11T23:00:00 +0900
+categories: [boj, bronze]
+tags: [sort]
+math: true
+mermaid: false
+---
+
+| ์๊ฐ ์ ํ | ๋ฉ๋ชจ๋ฆฌ ์ ํ |
+| --- | --- |
+| 2 ์ด | 512 MB |
+
+# ๋ฌธ์
+
+N๊ฐ์ ์๊ฐ ์ฃผ์ด์ก์ ๋, ์ด๋ฅผย ์ค๋ฆ์ฐจ์์ผ๋ก ์ ๋ ฌํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
+
+# ์
๋ ฅ
+
+์ฒซ์งธ ์ค์ ์์ ๊ฐ์ N(1 โคย N โค 10,000,000)์ด ์ฃผ์ด์ง๋ค. ๋์งธ ์ค๋ถํฐ N๊ฐ์ ์ค์๋ ์๊ฐ ์ฃผ์ด์ง๋ค. ์ด ์๋ย 10,000๋ณด๋ค ์๊ฑฐ๋ ๊ฐ์ ์์ฐ์์ด๋ค.
+
+# ์ถ๋ ฅ
+
+์ฒซ์งธ ์ค๋ถํฐ N๊ฐ์ ์ค์ ์ค๋ฆ์ฐจ์์ผ๋ก ์ ๋ ฌํ ๊ฒฐ๊ณผ๋ฅผ ํ ์ค์ ํ๋์ฉ ์ถ๋ ฅํ๋ค.
+
+# ํ์ด
+
+์ค๋ณต๋ ์๋ฅผ ์ฌ๋ฌ๋ฒ ์ ๋ ฌํ๋ ๊ฒ์ ํผํ๊ธฐ ์ํด ๋์
๋๋ฆฌ์ ์ซ์ : ๊ฐ์ ํํ๋ก ์ ์ฅํ ๋ค์ key๋ฅผ ์ ๋ ฌํ์ฌ ์์ ๊ฐ์๋งํผ ๊ทธ ์(key)๋ฅผ ์ถ๋ ฅํด์ค๋ค.
+
+## ์ฝ๋
+
+```python
+import sys
+from collections import defaultdict
+input = sys.stdin.readline
+print = sys.stdout.write
+
+n = int(input())
+nums = []
+d = defaultdict(int)
+
+for _ in range(n):
+ d[int(input())] += 1
+
+for num in sorted(d):
+ for _ in range(d[num]):
+ print(f'{str(num)}\n')
+```
\ No newline at end of file
diff --git a/_posts/2022-10-13-boj_11650-11651.markdown b/_posts/2022-10-13-boj_11650-11651.markdown
new file mode 100644
index 00000000000..3128389e92a
--- /dev/null
+++ b/_posts/2022-10-13-boj_11650-11651.markdown
@@ -0,0 +1,83 @@
+---
+title: "[BOJ] ์ขํ ์ ๋ ฌ 1, 2 - 11650, 11651 (S5)"
+author: kwon
+date: 2022-10-13T23:00:00 +0900
+categories: [boj, silver]
+tags: [sort]
+math: true
+mermaid: false
+---
+
+| ์๊ฐ ์ ํ | ๋ฉ๋ชจ๋ฆฌ ์ ํ |
+| --- | --- |
+| 2 ์ด | 256 MB |
+
+# ๋ฌธ์
+
+์ขํ ์ ๋ ฌํ๊ธฐ 1: 2์ฐจ์ ํ๋ฉด ์์ ์ N๊ฐ๊ฐ ์ฃผ์ด์ง๋ค. ์ขํ๋ฅผ x์ขํ๊ฐ ์ฆ๊ฐํ๋ ์์ผ๋ก, x์ขํ๊ฐ ๊ฐ์ผ๋ฉด y์ขํ๊ฐ ์ฆ๊ฐํ๋ ์์๋ก ์ ๋ ฌํ ๋ค์ ์ถ๋ ฅํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
+
+์ขํ ์ ๋ ฌํ๊ธฐ 2: 2์ฐจ์ ํ๋ฉด ์์ ์ N๊ฐ๊ฐ ์ฃผ์ด์ง๋ค. ์ขํ๋ฅผ y์ขํ๊ฐ ์ฆ๊ฐํ๋ ์์ผ๋ก, y์ขํ๊ฐ ๊ฐ์ผ๋ฉด x์ขํ๊ฐ ์ฆ๊ฐํ๋ ์์๋ก ์ ๋ ฌํ ๋ค์ ์ถ๋ ฅํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
+
+# ์
๋ ฅ
+
+์ฒซ์งธ ์ค์ ์ ์ ๊ฐ์ N (1 โค N โค 100,000)์ด ์ฃผ์ด์ง๋ค. ๋์งธ ์ค๋ถํฐ N๊ฐ์ ์ค์๋ i๋ฒ์ ์ ์์น xi์ yi๊ฐ ์ฃผ์ด์ง๋ค. (-100,000 โค xi, yiย โค 100,000) ์ขํ๋ ํญ์ ์ ์์ด๊ณ , ์์น๊ฐ ๊ฐ์ ๋ ์ ์ ์๋ค.
+
+# ์ถ๋ ฅ
+
+์ฒซ์งธ ์ค๋ถํฐ N๊ฐ์ ์ค์ ์ ์ ์ ๋ ฌํย ๊ฒฐ๊ณผ๋ฅผ ์ถ๋ ฅํ๋ค.
+
+# ํ์ด
+
+1, 2 ๋ชจ๋ ์ฃผ์ด์ง ์ขํ๋ฅผ ์ ๋ ฌํ๋ ๋ฌธ์ ์ด๋ค. ๋ค๋ฅธ ์ ์ 1์ x์ขํ๋ฅผ ์ฐ์ ์ผ๋ก, 2๋ y์ขํ๋ฅผ ์ฐ์ ์ผ๋ก ์ ๋ ฌํ๋ค๋ ๊ฒ์ด๋ค. ์ฃผ์ด์ง ์
๋ ฅ์ x, y ๊ฐ์ ๋ฒ์๊ฐ (-100,000 โค xi, yiย โค 100,000)๋ก ์ ํ์ ์ด๊ณ ์ ์์ด๊ธฐ ๋๋ฌธ์ Counting Sort๋ฅผ ์ฌ์ฉํ๊ธฐ์ ์ ํฉํ๋ค.
+
+์์ ๊ฐ์๋ฅผ ์ธ์ด์ค ๋ฐฐ์ด์ ํฌ๊ธฐ๋ฅผ x, y์ ๋ฒ์์ ๋ง๊ฒ 200,002๋ก ์ก์์ค๋ค. 200,001๋ก ํฌ๊ธฐ๋ฅผ ์ก์ง ์์ ์ด์ ๋ ๊น๋ํ๊ฒ 100,000์ ๋ํด์ ์ธ๋ฑ์ค๊ฐ ํท๊ฐ๋ฆฌ์ง ์๊ฒ ์ฝ๋๋ฅผ ์์ฑํ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค.
+
+๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ ๊ฒ ์จ์ ๊ณต๊ฐ๋ณต์ก๋๋ฅผ ์ค์ด๋ ๊ฒ๋ ์ค์ํ์ง๋ง, ์ด ๋ฌธ์ ์ ๊ฐ์ด ์ถฉ๋ถํ ๋ฉ๋ชจ๋ฆฌ๊ฐ ์ฃผ์ด์ง ์ํฉ์์๋ ๋ฐฐ์ด ํ ์๋ฆฌ์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ค์ด๋ ๊ฒ๋ณด๋ค ํท๊ฐ๋ฆฌ๋ ๋ถ๋ถ์ ์์ ๋ฒ๋ฆฌ๊ณ ๊ฐ๋
์ฑ์ ๋์ฌ ๊ฑฐ๊ธฐ์ ๋ฐ์ํ ์ ์๋ ์ค์๋ฅผ ์ค์ด๋ ๊ฒ์ด ์ด๋์ด๋ผ๊ณ ํ๋จํ๋ค.
+
+ํ๋์ ์์ด์ ์ ๋ ฌํ๋ ๊ฒฝ์ฐ์๋ ์ฃผ์ด์ง ์์ ๊ฐ์๋ง ์ ์ฅํ๋ฉด ๋๊ฒ ์ง๋ง ์ขํ๋ฅผ ์ ๋ ฌํ๋ ๊ฒฝ์ฐ์๋ ์ฐ์ ์์๊ฐ ์๋ ์๋ค(1๋ฒ ๋ฌธ์ ์ ๊ฒฝ์ฐ y์ขํ)๋ ์ ๊ฒฝ์จ์ผํ๊ธฐ ๋๋ฌธ์ ํด๋นํ๋ x์ขํ์ y์ขํ์ ๋ฐฐ์ด์ ์ ์ฅํด์ฃผ์๋ค.
+
+์ด๋ ๊ฒ ๋ฐฐ์ด์ ๋ง๋ค๊ฒ ๋๋ฉด x์ขํ์ ํฌ๊ธฐ์ ๋ฐ๋ผ y์ขํ์ ๋ฐฐ์ด๋ค์ด ์ ์ฅ๋๋ฏ๋ก y์ขํ๊ฐ ์ ์ฅ๋ ๊ฒฝ์ฐ์๋ง ์ ๋ ฌํ์ฌ ์ขํ๋ฅผ ์ถ๋ ฅํ๋ฉด ๋๋ค.
+
+## ์ฝ๋
+
+```python
+import sys
+input = sys.stdin.readline
+print = sys.stdout.write
+
+n = int(input())
+cnt_list = [[] for i in range(200002)]
+for _ in range(n):
+ x, y = map(int, input().split())
+ cnt_list[x + 100000].append(y)
+
+for x, ys in enumerate(cnt_list):
+ if ys:
+ if len(ys) == 1:
+ print(f"{x - 100000} {ys[0]}\n")
+ else:
+ for y in sorted(ys):
+ print(f"{x - 100000} {y}\n")
+```
+
+2๋ฒ ๋ฌธ์ ๋ ๋ง์ฐฌ๊ฐ์ง๋ก ์งํํ๋ y๋ฅผ ๊ธฐ์ค์ผ๋ก ๋ฐฐ์ด์ ๋ง๋ค์ด x์ขํ๋ฅผ appendํด์ค๋ค.
+
+```python
+import sys
+input = sys.stdin.readline
+print = sys.stdout.write
+
+n = int(input())
+cnt_list = [[] for i in range(200002)]
+for _ in range(n):
+ x, y = map(int, input().split())
+ cnt_list[y + 100000].append(x)
+
+for y, xs in enumerate(cnt_list):
+ if xs:
+ if len(xs) == 1:
+ print(f"{xs[0]} {y - 100000}\n")
+ else:
+ for x in sorted(xs):
+ print(f"{x} {y - 100000}\n")
+```
\ No newline at end of file
diff --git a/_posts/2022-10-13-boj_1181.markdown b/_posts/2022-10-13-boj_1181.markdown
new file mode 100644
index 00000000000..3c963dc4b00
--- /dev/null
+++ b/_posts/2022-10-13-boj_1181.markdown
@@ -0,0 +1,56 @@
+---
+title: "[BOJ] ๋จ์ด ์ ๋ ฌ - 1181 (S5)"
+author: kwon
+date: 2022-10-13T23:00:00 +0900
+categories: [boj, silver]
+tags: [string, sort]
+math: true
+mermaid: false
+---
+
+| ์๊ฐ ์ ํ | ๋ฉ๋ชจ๋ฆฌ ์ ํ |
+| --- | --- |
+| 2 ์ด | 256 MB |
+
+# ๋ฌธ์
+
+์ํ๋ฒณ ์๋ฌธ์๋ก ์ด๋ฃจ์ด์ง N๊ฐ์ ๋จ์ด๊ฐ ๋ค์ด์ค๋ฉด ์๋์ ๊ฐ์ ์กฐ๊ฑด์ ๋ฐ๋ผ ์ ๋ ฌํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
+
+1. ๊ธธ์ด๊ฐ ์งง์ ๊ฒ๋ถํฐ
+2. ๊ธธ์ด๊ฐ ๊ฐ์ผ๋ฉด ์ฌ์ ์์ผ๋ก
+
+# ์
๋ ฅ
+
+์ฒซ์งธ ์ค์ ๋จ์ด์ ๊ฐ์ N์ด ์ฃผ์ด์ง๋ค. (1 โค N โค 20,000) ๋์งธ ์ค๋ถํฐ N๊ฐ์ ์ค์ ๊ฑธ์ณ ์ํ๋ฒณ ์๋ฌธ์๋ก ์ด๋ฃจ์ด์ง ๋จ์ด๊ฐ ํ ์ค์ ํ๋์ฉ ์ฃผ์ด์ง๋ค. ์ฃผ์ด์ง๋ ๋ฌธ์์ด์ ๊ธธ์ด๋ 50์ ๋์ง ์๋๋ค.
+
+# ์ถ๋ ฅ
+
+์กฐ๊ฑด์ ๋ฐ๋ผ ์ ๋ ฌํ์ฌ ๋จ์ด๋ค์ ์ถ๋ ฅํ๋ค. ๋จ, ๊ฐ์ ๋จ์ด๊ฐ ์ฌ๋ฌ ๋ฒ ์
๋ ฅ๋ ๊ฒฝ์ฐ์๋ ํ ๋ฒ์ฉ๋ง ์ถ๋ ฅํ๋ค.
+
+# ํ์ด
+
+์
๋ ฅ๋ ๋จ์ด์ ๊ธธ์ด๋ฅผ index๋ก ํด๋น ๊ธธ์ด์ ๋จ์ด ๋ฌถ์์ ์์๋ก ํ๋ ๋ฆฌ์คํธ๋ฅผ ๋ง๋ค์ด ์ค๋ค. ์ด ๋ ๋จ์ด๋ ์ค๋ณต์ ํ์ฉํ์ง ์๊ธฐ ๋๋ฌธ์ ๋ฌถ์์ ์งํฉ์ผ๋ก ๋ง๋ค์ด ์ค๋ค.
+
+์ดํ ๋ฆฌ์คํธ๋ฅผ ๋ฐ๋ณตํ๋ฉด์ ๋จ์ด๊ฐ ์กด์ฌํ๋ ๊ฒฝ์ฐ ๋จ์ด๋ค์ ์ถ๋ ฅํด ์ค๋ค. ๋จ์ด๊ฐ ์ฌ๋ฌ ๊ฐ๋ฉด list๋ก ๋ฐ๊ฟ(set์ ์์๊ฐ ์๋ค) ์ ๋ ฌํ ๊ฒ์ ์ฐจ๋ก๋๋ก ์ถ๋ ฅํด ์ค๋ค.
+
+## ์ฝ๋
+
+```python
+import sys
+input = sys.stdin.readline
+print = sys.stdout.write
+
+n = int(input())
+len_cnt = [set() for i in range(51)]
+for _ in range(n):
+ word = input().strip()
+ len_cnt[len(word)].add(word)
+
+for words in len_cnt:
+ if words:
+ if len(words) == 1:
+ print(f"{list(words)[0]}\n")
+ else:
+ for w in sorted(list(words)):
+ print(f"{w}\n")
+```
\ No newline at end of file
diff --git a/_posts/2022-10-13-boj_1427.markdown b/_posts/2022-10-13-boj_1427.markdown
new file mode 100644
index 00000000000..c23d387ec30
--- /dev/null
+++ b/_posts/2022-10-13-boj_1427.markdown
@@ -0,0 +1,49 @@
+---
+title: "[BOJ] ์ํธ ์ธ์ฌ์ด๋ - 1427 (S5)"
+author: kwon
+date: 2022-10-13T14:00:00 +0900
+categories: [boj, silver]
+tags: [string, sort]
+math: true
+mermaid: false
+---
+
+| ์๊ฐ ์ ํ | ๋ฉ๋ชจ๋ฆฌ ์ ํ |
+| --- | --- |
+| 2 ์ด | 128 MB |
+
+# ๋ฌธ์
+
+๋ฐฐ์ด์ ์ ๋ ฌํ๋ ๊ฒ์ ์ฝ๋ค. ์๊ฐ ์ฃผ์ด์ง๋ฉด, ๊ทธ ์์ ๊ฐ ์๋ฆฌ์๋ฅผ ๋ด๋ฆผ์ฐจ์์ผ๋ก ์ ๋ ฌํด๋ณด์.
+
+# ์
๋ ฅ
+
+์ฒซ์งธ ์ค์ ์ ๋ ฌํ๋ ค๊ณ ํ๋ ์ N์ด ์ฃผ์ด์ง๋ค. N์ 1,000,000,000๋ณด๋ค ์๊ฑฐ๋ ๊ฐ์ ์์ฐ์์ด๋ค.
+
+# ์ถ๋ ฅ
+
+์ฒซ์งธ ์ค์ ์๋ฆฌ์๋ฅผ ๋ด๋ฆผ์ฐจ์์ผ๋ก ์ ๋ ฌํ ์๋ฅผ ์ถ๋ ฅํ๋ค.
+
+# ํ์ด
+
+์ฃผ์ด์ง ์๋ฅผ ๋ด๋ฆผ์ฐจ์ ์ ๋ ฌํ๋ ๊ฐ๋จํ ๋ฌธ์ ์ด๋ค. ์ ์๋ก ์์ด์ด ์ด๋ฃจ์ด์ ธ ์๊ธฐ ๋๋ฌธ์ counting sort๋ฅผ ์ฌ์ฉํ์ฌ ํ์๋ค.
+
+## ์ฝ๋
+
+```python
+import sys
+input = sys.stdin.readline
+
+num = input().strip()
+cnt_dict = {str(n):0 for n in range(9, -1, -1)}
+for i in num:
+ cnt_dict[i] += 1
+ans = ''
+for i in cnt_dict:
+ for _ in range(cnt_dict[i]):
+ ans += i
+
+print(ans)
+```
+
+9~0๊น์ง์ ์๋ฅผ key๋ก ๊ฐ์ง๊ณ value๊ฐ 0์ธ dictionary๋ฅผ ๋ง๋ค๊ณ ์๊ฐ ์ผ๋ง๋ ๋์๋์ง count ํ๋ค. ์ดํ dictionary์ key ์์๋๋ก(๋ด๋ฆผ์ฐจ์) count ๋ ์๋งํผ ๋ฌธ์๋ฅผ ๋ถ์ฌ๊ฐ๋ฉฐ ๋ต์ ์์ฑํ๋ค.
\ No newline at end of file
diff --git a/_posts/2022-11-15-boj_1004.markdown b/_posts/2022-11-15-boj_1004.markdown
new file mode 100644
index 00000000000..c700437db3c
--- /dev/null
+++ b/_posts/2022-11-15-boj_1004.markdown
@@ -0,0 +1,66 @@
+---
+title: "[BOJ] ์ด๋ฆฐ ์์ - 1004 (S3)"
+author: kwon
+date: 2022-11-15T23:00:00 +0900
+categories: [boj, silver]
+tags: [math, geometry]
+math: true
+mermaid: false
+---
+
+| ์๊ฐ ์ ํ | ๋ฉ๋ชจ๋ฆฌ ์ ํ |
+| --- | --- |
+| 2 ์ด | 128 MB |
+
+# ๋ฌธ์
+
+์ด๋ฆฐ ์์๋ ์ํน์ฑ B-664์์ ์์ ์ด ์ฌ๋ํ๋ ํ ์ก์ด ์ฅ๋ฏธ๋ฅผ ์ํด ์ด์๊ฐ๋ค. ์ด๋ ๋ ์ฅ๋ฏธ๊ฐ ์ํ์ ๋น ์ง๊ฒ ๋ ๊ฒ์ ์๊ฒ ๋ ์ด๋ฆฐ ์์๋, ์ฅ๋ฏธ๋ฅผ ๊ตฌํ๊ธฐ ์ํด ์ํ์๋ฅผ ๋ฐ๋ผ ๊ธด ์ฌํ์ ํ๊ธฐ ์์ํ๋ค. ํ์ง๋ง ์ด๋ฆฐ ์์์ ์ฐ์ฃผ์ ์ ๊ทธ๋ ๊ฒ ์ข์ง ์์์ ํ์ฑ๊ณ ๊ฐ์ ์ด๋์ ์ต๋ํ ํผํด์ ์ฌํํด์ผ ํ๋ค. ์๋์ ๊ทธ๋ฆผ์ ์ด๋ฆฐ ์์๊ฐ ํผ์ณ๋ณธ ์ํ์ ์ง๋์ ์ผ๋ถ์ด๋ค.
+
+!https://onlinejudgeimages.s3-ap-northeast-1.amazonaws.com/upload/201003/dfcmhrjj_113gw6bcng2_b.gif
+
+๋นจ๊ฐ ์ค์ ์ ์ด๋ฆฐ ์์๊ฐ ์ถ๋ฐ์ ์์ ๋์ฐฉ์ ๊น์ง ๋๋ฌํ๋๋ฐ ์์ด์ ํ์ํ ํ์ฑ๊ณ ์ง์
/์ดํ ํ์๋ฅผ ์ต์ํํ๋ ๊ฒฝ๋ก์ด๋ฉฐ, ์์ ํ์ฑ๊ณ์ ๊ฒฝ๊ณ๋ฅผ ์๋ฏธํ๋ค. ์ด๋ฌํ ๊ฒฝ๋ก๋ ์ฌ๋ฌ ๊ฐ ์กด์ฌํ ์ ์์ง๋ง ์ ์ด๋ 3๋ฒ์ ํ์ฑ๊ณ ์ง์
/์ดํ์ด ํ์ํ๋ค๋ ๊ฒ์ ์ ์ ์๋ค.
+
+์์ ๊ฐ์ ์ํ์ ์ง๋, ์ถ๋ฐ์ , ๋์ฐฉ์ ์ด ์ฃผ์ด์ก์ ๋ ์ด๋ฆฐ ์์์๊ฒ ํ์ํ ์ต์์ ํ์ฑ๊ณ ์ง์
/์ดํ ํ์๋ฅผ ๊ตฌํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํด ๋ณด์. ํ์ฑ๊ณ์ ๊ฒฝ๊ณ๊ฐ ๋ง๋ฟ๊ฑฐ๋ ์๋ก ๊ต์ฐจํ๋ ๊ฒฝ์ฐ๋ ์๋ค. ๋ํ, ์ถ๋ฐ์ ์ด๋ ๋์ฐฉ์ ์ด ํ์ฑ๊ณ ๊ฒฝ๊ณ์ ๊ฑธ์ณ์ง ๊ฒฝ์ฐ ์ญ์ ์
๋ ฅ์ผ๋ก ์ฃผ์ด์ง์ง ์๋๋ค.
+
+# ์
๋ ฅ
+
+์
๋ ฅ์ ์ฒซ ์ค์๋ ํ
์คํธ ์ผ์ด์ค์ ๊ฐ์ T๊ฐ ์ฃผ์ด์ง๋ค. ๊ทธ ๋ค์ ์ค๋ถํฐ ๊ฐ๊ฐ์ ํ
์คํธ์ผ์ด์ค์ ๋ํด ์ฒซ์งธ ์ค์ ์ถ๋ฐ์ $(x_1, y_1)$๊ณผ ๋์ฐฉ์ $(x_2, y_2)$์ด ์ฃผ์ด์ง๋ค. ๋ ๋ฒ์งธ ์ค์๋ ํ์ฑ๊ณ์ ๊ฐ์ n์ด ์ฃผ์ด์ง๋ฉฐ, ์ธ ๋ฒ์งธ ์ค๋ถํฐ n์ค์ ๊ฑธ์ณ ํ์ฑ๊ณ์ ์ค์ ๊ณผ ๋ฐ์ง๋ฆ $(c_x, c_y, r)$์ด ์ฃผ์ด์ง๋ค.
+
+# ์ถ๋ ฅ
+
+๊ฐ ํ
์คํธ ์ผ์ด์ค์ ๋ํด ์ด๋ฆฐ ์์๊ฐ ๊ฑฐ์ณ์ผ ํ ์ต์์ ํ์ฑ๊ณ ์ง์
/์ดํ ํ์๋ฅผ ์ถ๋ ฅํ๋ค.
+
+# ์ ํ
+
+- $1000 โค x_1, y_1, x_2, y_2, c_y, c_xย โค 1000$
+- $1 โค r โค 1000$
+- $1 โค n โค 50$
+- ์ขํ์ ๋ฐ์ง๋ฆ์ ๋ชจ๋ ์ ์
+
+# ํ์ด
+
+ํ์ฑ๊ณ๋ฅผ ๊ผญ ํต๊ณผํด์ผ ํ๋ ์กฐ๊ฑด์ ๋จผ์ ์ฐพ๋. ์ถ๋ฐ์ ์ด๋ ๋์ฐฉ์ ์ด ํ์ฑ๊ณ ์์ ์์ ๊ฒฝ์ฐ ๋ฌด์กฐ๊ฑด ๊ทธ ํญ์ฑ๊ณ๋ฅผ ํต๊ณผํด์ผ ํ๋ค. ์ถ๋ฐ์ ์ด๋ ๋์ฐฉ์ ์ ํฌํจํ์ง ์๊ณ ์๋ ํ์ฑ๊ณ๋ ์ด๋ป๊ฒ๋ ํผํด๊ฐ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค.
+
+ํ ์ ์ด ์ ์์ ํฌํจ๋์ด์๋์ง ํ์ธํ๋ ค๋ฉด, ์์ ๋ฐ์ง๋ฆ๊ณผ ์์ ์ค์ฌ๊ณผ ๊ทธ ์ ์ฌ์ด์ ๊ฑฐ๋ฆฌ๋ฅผ ๋น๊ตํ๋ฉด ๋๋ค. ์์ ๋ฐ์ง๋ฆ์ด ๋ ํฌ๋ค๋ฉด ๊ทธ ์ ์ ๋ฌด์กฐ๊ฑด ์ ์์ ์์นํ๊ฒ ๋๊ณ , ์์ ์ค์ฌ๊ณผ ๊ทธ ์ ์ฌ์ด์ ๊ฑฐ๋ฆฌ๋ฅผ ๋น๊ตํ๋ฉด ๊ทธ ์ ์ ์ ๋ฐ์ ์์นํ๊ฒ ๋๋ค.
+
+## ์ฝ๋
+
+```python
+t = int(input())
+for _ in range(t):
+ cnt = 0
+ x1, y1, x2, y2 = map(int, input().split())
+ n = int(input())
+ for _ in range(n):
+ c_x, c_y, r = map(int, input().split())
+ r = r ** 2
+ dis1 = (c_x - x1) ** 2 + (c_y - y1) ** 2
+ dis2 = (c_x - x2) ** 2 + (c_y - y2) ** 2
+ if (dis1 < r and dis2 < r) or (dis1 > r and dis2 > r):
+ continue
+ else:
+ cnt += 1
+ print(cnt)
+```
+
+๋ ์ ์ฌ์ด์ ๊ฑฐ๋ฆฌ๋ x, y ์ขํ ๊ฐ์ ์ฐจ์ด์ ์ ๊ณฑ์ ํฉ์ ์ ๊ณฑ๊ทผ์ ์ทจํด ๊ตฌํ ์ ์๋ค. ์ ์ฝ๋์์๋ ์ฐ์ฐ์ ์กฐ๊ธ ์ค์ด๊ธฐ ์ํด ์ ๊ณฑ์ธ ์ํ์์ ํฌ๊ธฐ๋ฅผ ๋น๊ตํ๋ค. ์ด ๋ฐฉ๋ฒ์ผ๋ก ์ถ๋ฐ์ ๊ณผ ๋์ฐฉ์ ์ ํฌํจํ๋ ์๋ค์ ๊ฐ์๋ฅผ ๊ตฌํด์ ์ถ๋ ฅํ๋ค.
\ No newline at end of file
diff --git a/_posts/2022-11-15-boj_1037.markdown b/_posts/2022-11-15-boj_1037.markdown
new file mode 100644
index 00000000000..2d4de94d030
--- /dev/null
+++ b/_posts/2022-11-15-boj_1037.markdown
@@ -0,0 +1,43 @@
+---
+title: "[BOJ] ์ฝ์ - 1037 (B1)"
+author: kwon
+date: 2022-11-15T23:00:00 +0900
+categories: [boj, bronze]
+tags: [math, number theory]
+math: true
+mermaid: false
+---
+
+| ์๊ฐ ์ ํ | ๋ฉ๋ชจ๋ฆฌ ์ ํ |
+| --- | --- |
+| 2 ์ด | 512 MB |
+
+# ๋ฌธ์
+
+์์ A๊ฐ N์ ์ง์ง ์ฝ์๊ฐ ๋๋ ค๋ฉด, N์ด A์ ๋ฐฐ์์ด๊ณ , A๊ฐ 1๊ณผ N์ด ์๋์ด์ผ ํ๋ค.ย ์ด๋ค ์ N์ ์ง์ง ์ฝ์๊ฐ ๋ชจ๋ ์ฃผ์ด์ง ๋, N์ ๊ตฌํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
+
+# ์
๋ ฅ
+
+์ฒซ์งธ ์ค์ N์ ์ง์ง ์ฝ์์ ๊ฐ์๊ฐ ์ฃผ์ด์ง๋ค. ์ด ๊ฐ์๋ 50๋ณด๋ค ์๊ฑฐ๋ ๊ฐ์ ์์ฐ์์ด๋ค. ๋์งธ ์ค์๋ N์ ์ง์ง ์ฝ์๊ฐ ์ฃผ์ด์ง๋ค. 1,000,000๋ณด๋ค ์๊ฑฐ๋ ๊ฐ๊ณ , 2๋ณด๋ค ํฌ๊ฑฐ๋ ๊ฐ์ ์์ฐ์์ด๊ณ , ์ค๋ณต๋์ง ์๋๋ค.
+
+# ์ถ๋ ฅ
+
+์ฒซ์งธ ์ค์ N์ ์ถ๋ ฅํ๋ค. N์ ํญ์ 32๋นํธ ๋ถํธ์๋ ์ ์๋ก ํํํ ์ ์๋ค.sใด
+
+# ํ์ด
+
+์ฃผ์ด์ง๋ A๊ฐ ์ฝ์์ด๋ฏ๋ก ์ด๋ค์ ๋ชจ๋๋ฅผ ์ฝ์๋ก ๊ฐ์ง๋ ์ N๋ฅผ ๊ตฌํ๊ธฐ ์ํด์ ๊ตณ์ด ๋ชจ๋ A๋ฅผ ํ์ธํ๋ฉฐ ๊ณ์ฐํ ํ์๋ ์๋ค. ๊ณฑํ์ ๋ N์ด ๋๋๋ก ํ๋ ์ฝ์๋ค์ ์์ ์ฐพ์๋ด๊ธฐ๋ง ํ๋ฉด ๋๊ธฐ ๋๋ฌธ์ด๋ค.
+
+๋ด๊ฐ ์๊ฐํ์ ๋ ๊ฐ์ฅ ์ฌ์ด ๋ฐฉ๋ฒ์ ์ฃผ์ด์ง ์ฝ์๋ค ์ค ์ต์๊ฐ๊ณผ ์ต๋๊ฐ์ ์ฐพ์ ๊ณฑํ๋ ๊ฒ์ด๋ค. ๋ชจ๋ ์ฝ์๋ค ์ค์์ ์ต์์ ์ต๋๋ก ๋ง๋ ์์ ๊ณฑํ์ ๋ ํญ์ ์ด ์ฝ์๋ค์ ํฌํจํ๋ ์๊ฐ ๋๋ค.
+
+## ์ฝ๋
+
+```python
+n = int(input())
+div = list(map(int, input().split()))
+min, max = float('inf'), float('-inf')
+for d in div:
+ if min > d : min = d
+ if max < d : max = d
+print(min * max)
+```
\ No newline at end of file
diff --git a/_posts/2022-11-22-boj_1010.markdown b/_posts/2022-11-22-boj_1010.markdown
new file mode 100644
index 00000000000..d9955dbb9f9
--- /dev/null
+++ b/_posts/2022-11-22-boj_1010.markdown
@@ -0,0 +1,71 @@
+---
+title: "[BOJ] ๋ค๋ฆฌ ๋๊ธฐ - 1010 (S5)"
+author: kwon
+date: 2022-11-22T23:00:00 +0900
+categories: [boj, silver]
+tags: [math, dynamic programing, combinatorics]
+math: true
+mermaid: false
+---
+
+| ์๊ฐ ์ ํ | ๋ฉ๋ชจ๋ฆฌ ์ ํ |
+| --- | --- |
+| 0.5 ์ด (์ถ๊ฐ ์๊ฐ ์์) | 128 MB |
+
+# ๋ฌธ์
+
+์ฌ์์ด๋ ํ ๋์์ ์์ฅ์ด ๋์๋ค. ์ด ๋์์๋ย ๋์๋ฅผ ๋์ชฝ๊ณผ ์์ชฝ์ผ๋ก ๋๋๋ ํฐ ์ผ์ง์ ๋ชจ์์ ๊ฐ์ด ํ๋ฅด๊ณ ์๋ค.ย ํ์ง๋ง ์ฌ์์ด๋ ๋ค๋ฆฌ๊ฐ ์์ด์ ์๋ฏผ๋ค์ด ๊ฐ์ ๊ฑด๋๋๋ฐ ํฐ ๋ถํธ์ ๊ฒช๊ณ ์์์ ์๊ณ ๋ค๋ฆฌ๋ฅผ ์ง๊ธฐ๋ก ๊ฒฐ์ฌํ์๋ค. ๊ฐ ์ฃผ๋ณ์์ ๋ค๋ฆฌ๋ฅผ ์ง๊ธฐ์ ์ ํฉํ ๊ณณ์ ์ฌ์ดํธ๋ผ๊ณ ํ๋ค. ์ฌ์์ด๋ ๊ฐ ์ฃผ๋ณ์ ๋ฉด๋ฐํ ์กฐ์ฌํด ๋ณธ ๊ฒฐ๊ณผ ๊ฐ์ ์์ชฝ์๋ N๊ฐ์ ์ฌ์ดํธ๊ฐ ์๊ณ ๋์ชฝ์๋ M๊ฐ์ ์ฌ์ดํธ๊ฐ ์๋ค๋ ๊ฒ์ ์์๋ค. (N โค M)
+
+์ฌ์์ด๋ ์์ชฝ์ ์ฌ์ดํธ์ ๋์ชฝ์ ์ฌ์ดํธ๋ฅผ ๋ค๋ฆฌ๋ก ์ฐ๊ฒฐํ๋ ค๊ณ ํ๋ค. (์ด๋ ํ ์ฌ์ดํธ์๋ ์ต๋ ํ ๊ฐ์ ๋ค๋ฆฌ๋ง ์ฐ๊ฒฐ๋ ์ ์๋ค.) ์ฌ์์ด๋ ๋ค๋ฆฌ๋ฅผ ์ต๋ํ ๋ง์ด ์ง์ผ๋ ค๊ณ ํ๊ธฐ ๋๋ฌธ์ ์์ชฝ์ ์ฌ์ดํธ ๊ฐ์๋งํผ (N๊ฐ) ๋ค๋ฆฌ๋ฅผ ์ง์ผ๋ ค๊ณ ํ๋ค. ๋ค๋ฆฌ๋ผ๋ฆฌ๋ ์๋ก ๊ฒน์ณ์ง ์ ์๋ค๊ณ ํ ๋ ๋ค๋ฆฌ๋ฅผ ์ง์ ์ ์๋ ๊ฒฝ์ฐ์ ์๋ฅผ ๊ตฌํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ๋ผ.
+
+
+
+# ์
๋ ฅ
+
+์
๋ ฅ์ ์ฒซ ์ค์๋ ํ
์คํธ ์ผ์ด์ค์ ๊ฐ์ T๊ฐ ์ฃผ์ด์ง๋ค. ๊ทธ ๋ค์ ์ค๋ถํฐ ๊ฐ๊ฐ์ ํ
์คํธ ์ผ์ด์ค์ ๋ํด ๊ฐ์ ์์ชฝ๊ณผ ๋์ชฝ์ ์๋ ์ฌ์ดํธ์ ๊ฐ์ ์ ์ N, M (0 < N โค M < 30)์ด ์ฃผ์ด์ง๋ค.
+
+# ์ถ๋ ฅ
+
+๊ฐ ํ
์คํธ ์ผ์ด์ค์ ๋ํด ์ฃผ์ด์ง ์กฐ๊ฑด ํ์ ๋ค๋ฆฌ๋ฅผ ์ง์ ์ ์๋ ๊ฒฝ์ฐ์ ์๋ฅผ ์ถ๋ ฅํ๋ค.
+
+# ํ์ด
+
+## ์กฐํฉ
+
+์์ชฝ์ ๋ค๋ฆฌ์ ๊ฐ์๋งํผ ๋์ชฝ์ ๋ค๋ฆฌ๋ฅผ ๊ณ ๋ฅด๋ ๋ฌธ์ ๋ก ์๊ฐํ ์ ์๋ค. ํ์ง๋ง ์ฃผ์ํ ์ ์ ๋ค๋ฆฌ๊ฐ ๊ต์ฐจ๋๋ฉด ์๋๋ค๋ ๊ฒ์ด๋ค. ๋๋ฌธ์ ์์๋ฅผ ์๊ฐํ์ง ์๊ณ ์์ชฝ์ ๋ค๋ฆฌ๋ฅผ ๋์ชฝ ๋ค๋ฆฌ ๊ฐ์๋งํผ ๊ณจ๋ผ์ผ ํ๋ค.
+
+์์ ์์ด M๊ฐ๋ฅผ ๊ณ ๋ฅธ ํ ์์ชฝ ๋ค๋ฆฌ์ ์๋ถํฐ, ๊ณ ๋ฅธ ๋ค๋ฆฌ์ ์๋ถํฐ ๋ด๋ ค๊ฐ๋ฉด์ ์ด์ด์ค๋ค. ์๋ถํฐ ์ฐจ๋ก๋๋ก ์ด์ด์ฃผ๋ฉด ๋ค๋ฆฌ๊ฐ ๊ต์ฐจ๋๋ ์ผ์ด ์๊ณ ์์๋ ๋ฑ ํ ๊ฐ์ง๋ง ์ฃผ์ด์ง๋ค.
+
+๊ทธ๋ฌ๋ฏ๋ก ์์ ์์ด ๊ณ ๋ฅด๋ ์กฐํฉ${m}\choose{n}$์ ์ด์ฉํ๋ฉด ๋๋ค.
+
+## ๋์ ํ๋ก๊ทธ๋๋ฐ
+
+๋ค๋ฆฌ๋ฅผ ์ด์ ์ ์๋ ์์ ์ฌ๊ท๋ก ๋ฐ๋ณตํ๋ฉด์ ๊ฐ์๋ฅผ ์ฐพ๋๋ค. `b1`, `b2`๋ ๊ฐ๊ฐ ์-๋์ชฝ์ ์ฌ์ดํธ ๋ฒํธ์ด๋ฉฐ `b1`์ด N์ด ๋์ ๋ ๋ชจ๋ ๋ค๋ฆฌ๊ฐ ์ด์ด์ง ๊ฒ์ด๋ฏ๋ก ๋ค๋ฆฌ๋ฅผ ์๋ ๊ฒฝ์ฐ๋ฅผ ํ๋ ์ฐพ์๋ค๋ ์๋ฏธ๋ก 1์ returnํ๋ค.
+
+ํ์์ ์๋ถํฐ ์์ํ๋ฉฐ ๊ฐ ํ์์ ๋ฒ์๋ ์ง์ ์ ์ฐ๊ฒฐํ๋ ์ฌ์ดํธ์ ๋ค์(`b2+ 1`)๋ถํฐ ๋จ์ ์์ชฝ ์ฌ์ดํธ ๊ฐ์๋งํผ ๋จ์ ๋๊น์ง(`(b2 + 1) + m - n`)์ด๋ค. ๋๋๋ ๋ฒ์๊ฐ ์์ ์์ผ๋ก ๊ณ์ฐ๋๋ ์ด์ ๋ ๋จ์์๋ ์์ชฝ ์ฌ์ดํธ๊ฐ ์ฐ๊ฒฐ๋ ์ ์๋ ๋์ชฝ ์ฌ์ดํธ๊ฐ ๋จ์ ์์ด์ผ ํ๊ธฐ ๋๋ฌธ์ด๋ค.
+
+์๋ฅผ ๋ค์ด n, m์ด ๊ฐ๊ฐ 4, 7์ด๊ณ ํ์ฌ ์ฐ๊ฒฐํ๋ ค๋ ์ฌ์ดํธ๋ฅผ ํฌํจํ์ฌ ๋จ์์๋ ์์ชฝ ์ฌ์ดํธ๊ฐ 3๊ฐ, ๋์ชฝ ์ฌ์ดํธ๋ 5 ๊ฐ๋ผ๊ณ ํ๋ค๋ฉด, ํ์ฌ ์ฌ์ดํธ๋ฅผ ์ฐ๊ฒฐํ๊ณ ๋จ์์๋ ๋์ชฝ ์ฌ์ดํธ๊ฐ ์ต์ 2 ๊ฐ๋ ๋์ด์ผ ํ๊ธฐ ๋๋ฌธ์ 1 + (7 - 4) + 1 = 5๋ก ๋์ชฝ์ 5๋ฒ์งธ ์ฌ์ดํธ๊น์ง๋ง ์ฐ๊ฒฐ์ด ๊ฐ๋ฅํ๋ค.
+
+### ์ฝ๋
+
+```python
+def dp(b1, b2, n, m):
+ global memo
+ if b1 == n:
+ return 1
+ cnt = 0
+ for i in range(b2 + 1, min(m, b2 + m - n + 1) + 1):
+ if (b1 + 1, i) in memo:
+ cnt += memo[(b1 + 1, i)]
+ else:
+ tmp = dp(b1 + 1, i, n, m)
+ cnt += tmp
+ memo[(b1 + 1, i)] = tmp
+ return cnt
+
+t = int(input())
+for _ in range(t):
+ memo = {}
+ n, m = map(int, input().split())
+ print(dp(0, 0, n, m))
+```
\ No newline at end of file
diff --git a/_posts/2022-11-22-boj_3036.markdown b/_posts/2022-11-22-boj_3036.markdown
new file mode 100644
index 00000000000..56ab60b63a7
--- /dev/null
+++ b/_posts/2022-11-22-boj_3036.markdown
@@ -0,0 +1,79 @@
+---
+title: "[BOJ] ๋ง - 3036 (S4)"
+author: kwon
+date: 2022-11-22T23:00:00 +0900
+categories: [boj, silver]
+tags: [math, number theory, Euclidean algorithm]
+math: true
+mermaid: false
+---
+
+| ์๊ฐ ์ ํ | ๋ฉ๋ชจ๋ฆฌ ์ ํ |
+| --- | --- |
+| 1 ์ด | 128 MB |
+
+# ๋ฌธ์
+
+์๊ทผ์ด๋ ์ฐฝ๊ณ ์์ ๋ง N๊ฐ๋ฅผ ๋ฐ๊ฒฌํ๋ค. ์๊ทผ์ด๋ ๊ฐ๊ฐ์ ๋ง์ด ์์ ์๋ ๋ง๊ณผ ๋ค์ ์๋ ๋ง๊ณผ ์ ํ๋๋ก ๋ฐ๋ฅ์ ๋ด๋ ค๋์๋ค.
+
+
+
+์๊ทผ์ด๋ ์ฒซ ๋ฒ์งธ ๋ง์ ๋๋ฆฌ๊ธฐ ์์ํ๊ณ , ๋๋จธ์ง ๋ง๋ ๊ฐ์ด ๋์๊ฐ๋ค๋ ์ฌ์ค์ ๋ฐ๊ฒฌํ๋ค. ๋๋จธ์ง ๋ง์ ์ฒซ ๋ฒ์งธ ๋ง ๋ณด๋ค ๋น ๋ฅด๊ฒ ๋์๊ฐ๊ธฐ๋ ํ๊ณ , ๋๋ฆฌ๊ฒ ๋์๊ฐ๊ธฐ๋ ํ๋ค. ์ด๋ ๊ฒ ๋ง์ ๋๋ฆฌ๋ค ๋ณด๋ ์ฒซ ๋ฒ์งธ ๋ง์ ํ ๋ฐํด ๋๋ฆฌ๋ฉด, ๋๋จธ์ง ๋ง์ ๋ช ๋ฐํด ๋๋์ง ๊ถ๊ธํด์ก๋ค.
+
+๋ง์ ๋ฐ์ง๋ฆ์ด ์ฃผ์ด์ง๋ค. ์ด๋, ์ฒซ ๋ฒ์งธ ๋ง์ ํ ๋ฐํด ๋๋ฆฌ๋ฉด, ๋๋จธ์ง ๋ง์ ๋ช ๋ฐํด ๋์๊ฐ๋์ง ๊ตฌํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
+
+# ์
๋ ฅ
+
+์ฒซ์งธ ์ค์ ๋ง์ ๊ฐ์ N์ด ์ฃผ์ด์ง๋ค. (3 โค N โค 100)
+
+๋ค์ ์ค์๋ ๋ง์ ๋ฐ์ง๋ฆ์ด ์๊ทผ์ด๊ฐ ๋ฐ๋ฅ์ ๋์ ์์๋๋ก ์ฃผ์ด์ง๋ค. ๋ฐ์ง๋ฆ์ 1๊ณผ 1000๋ฅผ ํฌํจํ๋ ์ฌ์ด์ ์์ฐ์์ด๋ค.
+
+# ์ถ๋ ฅ
+
+์ถ๋ ฅ์ ์ด N-1์ค์ ํด์ผ ํ๋ค. ์ฒซ ๋ฒ์งธ ๋ง์ ์ ์ธํ ๊ฐ๊ฐ์ ๋ง์ ๋ํด์, ์ฒซ ๋ฒ์งธ ๋ง์ ํ ๋ฐํด ๋๋ฆฌ๋ฉด ๊ทธ ๋ง์ ๋ช ๋ฐํด ๋๋์ง ๊ธฐ์ฝ ๋ถ์ ํํ A/B๋ก ์ถ๋ ฅํ๋ค.
+
+# ํ์ด
+
+ํฌ๊ฒ 3๊ฐ์ง ๊ฒฝ์ฐ๊ฐ ์กด์ฌํ๋ฉฐ ๊ทธ์ ๋ํ ์ถ๋ ฅ์ ๋ค์๊ณผ ๊ฐ๋ค.
+
+1. ์ฒซ ๋ฒ์งธ ๋ง์ ํฌ๊ธฐ๋ฅผ ๋ง ํ๋์ ํฌ๊ธฐ๋ก ๋๋์์ ๋ ๋๋์ด ๋จ์ด์ง๋ ๊ฒฝ์ฐ.
+
+ `print(f"{first // r}/1")`
+
+ ์ฒซ ๋ฒ์งธ ๋ง์ ํฌ๊ธฐ๊ฐ ๋ ํฌ๋ฉฐ ๋ฐฐ์ - ์ฝ์์ ๊ด๊ณ์ด๋ฏ๋ก ์ฒซ ๋ฒ์งธ ๋ง์ ํ์ฌ ํ์ธํ๊ณ ์๋ ๋ง์ ํฌ๊ธฐ๋ก ๋๋ ๋ชซ์ ๋ถ์๋ก, 1์ ๋ถ๋ชจ๋ก ํ์ฌ ์ถ๋ ฅํ๋ค.
+
+2. ๋ง ํ๋์ ํฌ๊ธฐ๋ฅผ ์ฒซ ๋ฒ์งธ ๋ง์ ํฌ๊ธฐ๋ก ๋๋์์ ๋ ๋๋์ด ๋จ์ด์ง๋ ๊ฒฝ์ฐ.
+
+ `print(f"1/{r // first}")`
+
+ ํ์ฌ ๋ง์ ํฌ๊ธฐ๊ฐ ๋ ํฌ๋ฉฐ ๋ฐฐ์ - ์ฝ์์ ๊ด๊ณ์ด๋ฏ๋ก ํ์ฌ ๋ง์ ํฌ๊ธฐ๋ฅผ ์ฒซ ๋ฒ์งธ ๋ง์ ํฌ๊ธฐ๋ก ๋๋ ๋ชซ์ ๋ถ๋ชจ๋ก, 1์ ๋ถ์๋ก ํ์ฌ ์ถ๋ ฅํ๋ค.
+
+3. ๋ ๋ค ๋๋์ด ๋จ์ด์ง์ง ์๋ ๊ฒฝ์ฐ
+
+ ์ด ๊ฒฝ์ฐ ํ ์ชฝ์ ๊ฐ์ผ๋ก ๋๋์ด ๋จ์ด์ง์ง ์๊ธฐ ๋๋ฌธ์ ๋ถ์์ ๋ถ๋ชจ๋ฅผ ์ฝ๋ถํด์ผ ํ๋ค. ์ฝ๋ถ์ ๊ฐ ์๋ฅผ ์ต๋๊ณต์ฝ์๋ก ๋๋๋ฉด ๊ตฌํ ์ ์๋ค.
+
+ ์ต๋ ๊ณต์ฝ์๋ [์ ํด๋ฆฌ๋ ํธ์ ๋ฒ](/posts/euclidean_algorithm/)์ผ๋ก ๊ตฌํ ์ ์๋ค.
+
+
+## ์ฝ๋
+
+```python
+n = int(input())
+ring = list(map(int, input().split()))
+first = ring[0]
+rings = ring[1:]
+def gcd(a, b):
+ while a % b != 0:
+ r = a % b
+ a, b = b, r
+ return b
+
+for r in rings:
+ if first % r == 0:
+ print(f"{first // r}/1")
+ elif r % first == 0:
+ print(f"1/{r // first}")
+ else:
+ g = gcd(first, r)
+ print(f"{first // g}/{r // g}")
+```
\ No newline at end of file
diff --git a/_posts/2022-11-22-euclidean_algorithm.markdown b/_posts/2022-11-22-euclidean_algorithm.markdown
new file mode 100644
index 00000000000..e0511260413
--- /dev/null
+++ b/_posts/2022-11-22-euclidean_algorithm.markdown
@@ -0,0 +1,31 @@
+---
+title: "์ ํด๋ฆฌ๋ ํธ์ ๋ฒ (Euclidean algorithm)"
+author: kwon
+date: 2022-11-22T23:00:00 +0900
+categories: [background, math]
+tags: [math, number theory, Euclidean algorithm]
+math: true
+mermaid: false
+---
+
+์ ํด๋ฆฌ๋ ํธ์ ๋ฒ์ 2๊ฐ์ ์์ฐ์์ ๋ํด ์ต๋๊ณต์ฝ์๋ฅผ ๊ตฌํ๋ ์๊ณ ๋ฆฌ์ฆ์ด๋ฉฐ ๋ค์๊ณผ ๊ฐ์ ์ฑ์ง์ ํตํด ์๊ณ ๋ฆฌ์ฆ์ ์งํํ๋ค.
+
+> $a, b \in \mathbb{Z}$์ด๊ณ $a$๋ฅผ $b$๋ก ๋๋ ๋๋จธ์ง๋ฅผ $r$์ด๋ผ ํ์. ($b \leq a, 0 \leq r \leq b$)
+>
+>
+> $a, b$์ ์ต๋ ๊ณต์ฝ์๋ฅผ $(a, b)$๋ผ๊ณ ํ๋ฉด, ๋ค์์ด ์ฑ๋ฆฝํ๋ค.
+>
+> $(a, b)=(b, r)$
+>
+
+์ถ์ฒ: wikipidia
+
+$r$์ด 0์ด ๋ ๋ ์๊ณ ๋ฆฌ์ฆ์ ๋ฉ์ถ๋ฉฐ, ์ด ๋์ $b$๊ฐ ์ต๋๊ณต์ฝ์๊ฐ ๋๋ค.
+
+์๋ฅผ ๋ค์ด 1460๊ณผ 1037์ ๋ํด ์๊ณ ๋ฆฌ์ฆ์ ์งํํด๋ณด๋ฉด ๋ค์๊ณผ ๊ฐ๋ค.
+
+$$\begin{flalign*}
+(1460, 1037)\\=(1037, 323)\\=(323, 68)\\=(68, 52)\\=(52, 16)\\=(16, 4)\\=(4,0)
+\end{flalign*}$$
+
+$r$์ด 0์ผ๋ $b$๊ฐ 4์ด๋ฏ๋ก 1460๊ณผ 1037์ ์ต๋๊ณต์ฝ์๋ 4์ด๋ค.
\ No newline at end of file
diff --git a/_posts/2022-12-12-boj_1541.markdown b/_posts/2022-12-12-boj_1541.markdown
new file mode 100644
index 00000000000..e81f3a7816c
--- /dev/null
+++ b/_posts/2022-12-12-boj_1541.markdown
@@ -0,0 +1,76 @@
+---
+title: "[BOJ] ์์ด๋ฒ๋ฆฐ ๊ดํธ - 1541 (S2)"
+author: kwon
+date: 2022-12-12T23:00:00 +0900
+categories: [boj, silver]
+tags: [math, string, greedy algorithm, parsing]
+math: true
+mermaid: false
+---
+| ์๊ฐ ์ ํ | ๋ฉ๋ชจ๋ฆฌ ์ ํ |
+| --- | --- |
+| 2์ด | 128 MB |
+
+## ๋ฌธ์
+
+์ธ์ค์ด๋ ์์์ +, -, ๊ทธ๋ฆฌ๊ณ ๊ดํธ๋ฅผ ๊ฐ์ง๊ณ ์์ ๋ง๋ค์๋ค. ๊ทธ๋ฆฌ๊ณ ๋์ ์ธ์ค์ด๋ ๊ดํธ๋ฅผ ๋ชจ๋ ์ง์ ๋ค.
+
+๊ทธ๋ฆฌ๊ณ ๋์ ์ธ์ค์ด๋ ๊ดํธ๋ฅผ ์ ์ ํ ์ณ์ ์ด ์์ ๊ฐ์ ์ต์๋ก ๋ง๋ค๋ ค๊ณ ํ๋ค.
+
+๊ดํธ๋ฅผ ์ ์ ํ ์ณ์ ์ด ์์ ๊ฐ์ ์ต์๋ก ๋ง๋๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
+
+## ์
๋ ฅ
+
+์ฒซ์งธ ์ค์ ์์ด ์ฃผ์ด์ง๋ค. ์์ โ0โ~โ9โ, โ+โ, ๊ทธ๋ฆฌ๊ณ โ-โ๋ง์ผ๋ก ์ด๋ฃจ์ด์ ธ ์๊ณ , ๊ฐ์ฅ ์ฒ์๊ณผ ๋ง์ง๋ง ๋ฌธ์๋ ์ซ์์ด๋ค. ๊ทธ๋ฆฌ๊ณ ์ฐ์ํด์ ๋ ๊ฐ ์ด์์ ์ฐ์ฐ์๊ฐ ๋ํ๋์ง ์๊ณ , 5์๋ฆฌ๋ณด๋ค ๋ง์ด ์ฐ์๋๋ ์ซ์๋ ์๋ค. ์๋ 0์ผ๋ก ์์ํ ์ ์๋ค. ์
๋ ฅ์ผ๋ก ์ฃผ์ด์ง๋ ์์ ๊ธธ์ด๋ 50๋ณด๋ค ์๊ฑฐ๋ ๊ฐ๋ค.
+
+## ์ถ๋ ฅ
+
+์ฒซ์งธ ์ค์ ์ ๋ต์ ์ถ๋ ฅํ๋ค.
+
+## ํ์ด
+
+์
๋ ฅ๋๋ ๋ถํธ๋ โ+โ, โ-โ ๋ฟ์ด๊ธฐ ๋๋ฌธ์, ์ต์๋ฅผ ๋ง๋ค ์ ์๋ ๋ฐฉ๋ฒ์ ๊ฐ๋จํ๊ฒ ๊ตฌํ ์ ์๋ค.
+
+โ-โ๊ฐ ๋ฑ์ฅํ์ง ์์ผ๋ฉด ๋ฌด์กฐ๊ฑด ๋ํ ์ ๋ฐ์ ์๋ค.
+
+ํ์ง๋ง โ-โ๊ฐ ๋ฑ์ฅํ๋ ์๊ฐ๋ถํฐ๋ ๊ดํธ๋ฅผ ์ด์ฉํ์ฌ ๋ฌด์กฐ๊ฑด ํ์ ๋์ค๋ ์๋ฅผ ๋บ์
์ผ๋ก ๋ง๋ค ์ ์๋ค.
+
+์๋ฅผ ๋ค๋ฉด 55-50+40+90-100+10-11 ์ด๋ผ๋ ์์์ด ์
๋ ฅ๋์ ๋ 55-(50+40+90)-(100+10)-11 = 55-50-40-90-100-10-11 ๋ก ๋ง๋ค ์ ์๋ค.
+
+### ์ฝ๋
+
+```python
+st = input().strip()+ '+'
+total = 0
+minus = False
+num = ''
+for c in st:
+ if c.isdigit():
+ num += c
+ else:
+ if minus:
+ total -= int(num)
+ else:
+ total += int(num)
+ if c == '-':
+ minus = True
+
+ num = ''
+print(total)
+```
+
+์
๋ ฅ์ ์ซ์์ ๋ถํธ๊ฐ ์์ธ ๋ฌธ์์ด๋ก ์ฃผ์ด์ง๊ธฐ ๋๋ฌธ์ ๊ทธ ๋ฌธ์์ด์ ํ์ธํ๋ฉด์ ๋ฌธ์๊ฐ ์ซ์์ธ์ง ๋ถํธ์ธ์ง์ ๋๋ผ ๋ค๋ฅด๊ฒ ์ฒ๋ฆฌ๋ฅผ ํด์ฃผ์ด์ผ ํ๋ค.
+
+1. ์ซ์
+
+ ๋ถํธ๊ฐ ๋ค์ด์ค๊ธฐ ์ ๊น์ง ํ๋์ ์ซ์์ด๊ธฐ ๋๋ฌธ์ ๋ฌธ์์ด๋ก ๊ณ์ ์ด์ด์ค๋ค.
+
+2. +
+
+ ๋ง์ฝ โ-โ ๋ถํธ๊ฐ ํ ๋ฒ๋ ๋์ค์ง ์์๋ค๋ฉด ๋ํ ์ ๋ฐ์ ์์ผ๋ฏ๋ก ๊ฒฐ๊ณผ๊ฐ ์ ์ฅ๋ `total`์ ์ ์๋ก ์ด์ ๊น์ง ๋ง๋ค์ด ๋์ ๋ฌธ์์ด์ ์ ์๋ก ๋ฐ๊ฟ ๋ํ๋ค.
+
+3. -
+
+ โ-โ๊ฐ ๋ฑ์ฅํ ์๊ฐ๋ถํฐ๋ ๋ฌด์กฐ๊ฑด ๋นผ๋ฉด ๋๊ธฐ ๋๋ฌธ์ `minus` ๋ณ์๋ฅผ `True`๋ก ๋ฐ๊ฟ์ค๋ค.
+
+ ์ดํ์ ์ฐ์ฐ์ `minus`๊ฐ `True`์ด๊ธฐ ๋๋ฌธ์ ์ด์ ๊น์ง ๋ง๋ค์ด ๋์ ๋ฌธ์์ด์ ์ ์๋ก ๋ฐ๊ฟ ๋บ๋ค.
\ No newline at end of file
diff --git a/_posts/2022-12-12-boj_1931.markdown b/_posts/2022-12-12-boj_1931.markdown
new file mode 100644
index 00000000000..d9c71761cf8
--- /dev/null
+++ b/_posts/2022-12-12-boj_1931.markdown
@@ -0,0 +1,48 @@
+---
+title: "[BOJ] ํ์์ค ๋ฐฐ์ - 1931 (S1)"
+author: kwon
+date: 2022-12-12T23:00:00 +0900
+categories: [boj, silver]
+tags: [greedy algorithm, sort]
+math: true
+mermaid: false
+---
+| ์๊ฐ ์ ํ | ๋ฉ๋ชจ๋ฆฌ ์ ํ |
+| --- | --- |
+| 2์ด | 128 MB |
+
+# ๋ฌธ์
+ํ ๊ฐ์ ํ์์ค์ด ์๋๋ฐ ์ด๋ฅผ ์ฌ์ฉํ๊ณ ์ ํ๋ N๊ฐ์ ํ์์ ๋ํ์ฌ ํ์์ค ์ฌ์ฉํ๋ฅผ ๋ง๋ค๋ ค๊ณ ํ๋ค. ๊ฐ ํ์ I์ ๋ํด ์์์๊ฐ๊ณผ ๋๋๋ ์๊ฐ์ด ์ฃผ์ด์ ธ ์๊ณ , ๊ฐ ํ์๊ฐ ๊ฒน์น์ง ์๊ฒ ํ๋ฉด์ ํ์์ค์ ์ฌ์ฉํ ์ ์๋ ํ์์ ์ต๋ ๊ฐ์๋ฅผ ์ฐพ์๋ณด์. ๋จ, ํ์๋ ํ๋ฒ ์์ํ๋ฉด ์ค๊ฐ์ ์ค๋จ๋ ์ ์์ผ๋ฉฐ ํ ํ์๊ฐ ๋๋๋ ๊ฒ๊ณผ ๋์์ ๋ค์ ํ์๊ฐ ์์๋ ์ ์๋ค. ํ์์ ์์์๊ฐ๊ณผ ๋๋๋ ์๊ฐ์ด ๊ฐ์ ์๋ ์๋ค. ์ด ๊ฒฝ์ฐ์๋ ์์ํ์๋ง์ ๋๋๋ ๊ฒ์ผ๋ก ์๊ฐํ๋ฉด ๋๋ค.
+
+# ์
๋ ฅ
+์ฒซ์งธ ์ค์ ํ์์ ์ N(1 โค N โค 100,000)์ด ์ฃผ์ด์ง๋ค. ๋์งธ ์ค๋ถํฐ N+1 ์ค๊น์ง ๊ฐ ํ์์ ์ ๋ณด๊ฐ ์ฃผ์ด์ง๋๋ฐ ์ด๊ฒ์ ๊ณต๋ฐฑ์ ์ฌ์ด์ ๋๊ณ ํ์์ ์์์๊ฐ๊ณผ ๋๋๋ ์๊ฐ์ด ์ฃผ์ด์ง๋ค. ์์ ์๊ฐ๊ณผ ๋๋๋ ์๊ฐ์ $2^31-1$๋ณด๋ค ์๊ฑฐ๋ ๊ฐ์ ์์ฐ์ ๋๋ 0์ด๋ค.
+
+# ์ถ๋ ฅ
+์ฒซ์งธ ์ค์ ์ต๋ ์ฌ์ฉํ ์ ์๋ ํ์์ ์ต๋ ๊ฐ์๋ฅผ ์ถ๋ ฅํ๋ค.
+
+**๋๋๋ ์๊ฐ์ ๊ธฐ์ค์ผ๋ก ๋จผ์ ์ ๋ ฌ**ํ๊ณ ๊ฐ์ผ๋ฉด ์์ํ๋ ์๊ฐ์ ๊ธฐ์ค์ผ๋ก ์ ๋ ฌํ๋ ๊ฒ์ด ํต์ฌ์ด๋ค.
+
+์ด๋ ๊ฒ ์ ๋ ฌ์ ํ๊ฒ ๋๋ฉด ํญ์ ๊ทธ ์๊ฐ์ ์์ํ๋ ํ์ ์ค ๊ฐ์ฅ ๋นจ๋ฆฌ ๋๋๋ ํ์๋ฅผ ์ ํํ ์ ์์ผ๋ฉฐ, ๋๋๋ ์๊ฐ ์ดํ์ ์์ํ๋ ํ์ ์ค ๊ฐ์ฅ ๋นจ๋ฆฌ ๋๋๋ ํ์๋ ๋ฐ๋ก ์ ํํ ์ ์๋ค.
+
+## ์ฝ๋
+
+```python
+n = int(input())
+meetings = []
+
+for _ in range(n):
+ s, f = map(int, input().split())
+ meetings.append((s, f))
+
+meetings.sort(key=lambda x: (x[1], x[0]))
+
+cur = 0
+cnt = 0
+for s, f in meetings:
+ if cur <= s:
+ cur = f
+ cnt += 1
+print(cnt)
+```
+
+์์ ๋งํ ๊ธฐ์ค์ ๋ง๊ฒ ์ ๋ ฌ์ ํ๊ณ ํ์ฌ ์ ํํ ํ์๊ฐ ๋๋๋ ์๊ฐ๋ณด๋ค ๋ ๋ฆ๊ฒ ์์ํ๋ ์ฒซ ํ์๋ฅผ ์ ํํ๋ฉด ํญ์ ์ต์ ์ ์ ํ์ ํ ์ ์๋ค.
\ No newline at end of file
diff --git a/_posts/2022-12-13-boj_1946.markdown b/_posts/2022-12-13-boj_1946.markdown
new file mode 100644
index 00000000000..ed087ac6860
--- /dev/null
+++ b/_posts/2022-12-13-boj_1946.markdown
@@ -0,0 +1,125 @@
+---
+title: "[BOJ] ์ ์
์ฌ์ - 1946 (S1)"
+author: kwon
+date: 2022-12-13T23:00:00 +0900
+categories: [boj, silver]
+tags: [greedy algorithm, sort]
+math: true
+mermaid: false
+---
+
+| ์๊ฐ ์ ํ | ๋ฉ๋ชจ๋ฆฌ ์ ํ |
+| --- | --- |
+| 2์ด | 256 MB |
+
+## ๋ฌธ์
+
+์ธ์ ๋ ์ต๊ณ ๋ง์ ์งํฅํ๋ ๊ตด์ง์ ๋๊ธฐ์
์ง์ ์ฃผ์ํ์ฌ๊ฐ ์ ๊ท ์ฌ์ ์ฑ์ฉ์ ์ค์ํ๋ค. ์ธ์ฌ ์ ๋ฐ ์ํ์ 1์ฐจ ์๋ฅ์ฌ์ฌ์ 2์ฐจ ๋ฉด์ ์ํ์ผ๋ก ์ด๋ฃจ์ด์ง๋ค. ์ต๊ณ ๋ง์ ์งํฅํ๋ค๋ ๊ธฐ์
์ ์ด๋
์ ๋ฐ๋ผ ๊ทธ๋ค์ ์ต๊ณ ์ ์ธ์ฌ๋ค๋ง์ ์ฌ์์ผ๋ก ์ ๋ฐํ๊ณ ์ถ์ด ํ๋ค.
+
+๊ทธ๋์ ์ง์ ์ฃผ์ํ์ฌ๋, ๋ค๋ฅธ ๋ชจ๋ ์ง์์์ ๋น๊ตํ์ ๋ ์๋ฅ์ฌ์ฌ ์ฑ์ ๊ณผ ๋ฉด์ ์ํ ์ฑ์ ์ค ์ ์ด๋ ํ๋๊ฐ ๋ค๋ฅธ ์ง์์๋ณด๋ค ๋จ์ด์ง์ง ์๋ ์๋ง ์ ๋ฐํ๋ค๋ ์์น์ ์ธ์ ๋ค. ์ฆ, ์ด๋ค ์ง์์ A์ ์ฑ์ ์ด ๋ค๋ฅธ ์ด๋ค ์ง์์ B์ ์ฑ์ ์ ๋นํด ์๋ฅ ์ฌ์ฌ ๊ฒฐ๊ณผ์ ๋ฉด์ ์ฑ์ ์ด ๋ชจ๋ ๋จ์ด์ง๋ค๋ฉด A๋ ๊ฒฐ์ฝ ์ ๋ฐ๋์ง ์๋๋ค.
+
+์ด๋ฌํ ์กฐ๊ฑด์ ๋ง์กฑ์ํค๋ฉด์, ์ง์ ์ฃผ์ํ์ฌ๊ฐ ์ด๋ฒ ์ ๊ท ์ฌ์ ์ฑ์ฉ์์ ์ ๋ฐํ ์ ์๋ ์ ์
์ฌ์์ ์ต๋ ์ธ์์๋ฅผ ๊ตฌํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
+
+## ์
๋ ฅ
+
+์ฒซ์งธ ์ค์๋ ํ
์คํธ ์ผ์ด์ค์ ๊ฐ์ T(1 โค T โค 20)๊ฐ ์ฃผ์ด์ง๋ค. ๊ฐ ํ
์คํธ ์ผ์ด์ค์ ์ฒซ์งธ ์ค์ ์ง์์์ ์ซ์ N(1 โค N โค 100,000)์ด ์ฃผ์ด์ง๋ค. ๋์งธ ์ค๋ถํฐ N๊ฐ ์ค์๋ ๊ฐ๊ฐ์ ์ง์์์ ์๋ฅ์ฌ์ฌ ์ฑ์ , ๋ฉด์ ์ฑ์ ์ ์์๊ฐ ๊ณต๋ฐฑ์ ์ฌ์ด์ ๋๊ณ ํ ์ค์ ์ฃผ์ด์ง๋ค. ๋ ์ฑ์ ์์๋ ๋ชจ๋ 1์๋ถํฐ N์๊น์ง ๋์์ฐจ ์์ด ๊ฒฐ์ ๋๋ค๊ณ ๊ฐ์ ํ๋ค.
+
+## ์ถ๋ ฅ
+
+๊ฐ ํ
์คํธ ์ผ์ด์ค์ ๋ํด์ ์ง์ ์ฃผ์ํ์ฌ๊ฐ ์ ๋ฐํ ์ ์๋ ์ ์
์ฌ์์ ์ต๋ ์ธ์์๋ฅผ ํ ์ค์ ํ๋์ฉ ์ถ๋ ฅํ๋ค.
+
+## ํ์ด
+
+### ์ฒซ ์๋
+
+๋ฒ์๊ฐ ์ ํด์ ธ ์๋ ์ ์ ๋ฐ์ดํฐ์ด๊ธฐ ๋๋ฌธ์ conting sort๋ฅผ ๋ณํํ์ฌ ์ ๋ ฌ์ ํ์๊ณ , ์ ๋ ฌ๋ ๋ฐฐ์ด์ ๊ธฐ๋ฐ์ผ๋ก ์ฌ๋ผ์ด์ฑ์ ํ์ฌ set์ ๋ง๋ค์ด์ ํ์ด๋ฅผ ์๋ํ๋ค.
+
+```python
+import sys
+input = sys.stdin.readline
+t = int(input())
+
+for _ in range(t):
+ n = int(input())
+ p_cnt = [0] * (n + 1)
+ p_cnt2 = [0] * (n + 1)
+ for _ in range(n):
+ s1, s2 = map(int, input().split())
+ p_cnt[s1] = (s1, s2)
+ p_cnt2[s2] = (s1, s2)
+ top1 = p_cnt[1][1]
+ top2 = p_cnt2[1][0]
+
+ if p_cnt[1][1] == 1:
+ print(1)
+ else:
+ cnt = 0
+ set1 = set(p_cnt[1:top2 + 1])
+ set2 = set(p_cnt2[1:top1 + 1])
+ print(len(set1 & set2))
+```
+
+| 3 | 6 |
+| 7 | 3 |
+| 4 | 2 |
+| 1 | 4 |
+| 5 | 7 |
+| 2 | 5 |
+| 6 | 1 |
+
+์์ ๊ฐ์ ์์ ๊ฐ ์๋ค๊ณ ์๊ฐํด๋ณด์. ๋จผ์ ์ด๋ฅผ ์ฑ์ ๊ณผ ๋ฉด์ ์์ผ๋ก ์ ๋ ฌํ ๋ฆฌ์คํธ๋ฅผ ๊ฐ๊ฐ ๋ง๋ ๋ค.
+
+| 1 | 4 | | 6 | 1 |
+| 2 | 5 | | 4 | 2 |
+| 3 | 6 | | 7 | 3 |
+| 4 | 2 | | 1 | 4 |
+| 5 | 7 | | 2 | 5 |
+| 6 | 1 | | 3 | 6 |
+| 7 | 3 | | 5 | 7 |
+
+์ฌ๊ธฐ์ ์ฒซ ๋ฒ์งธ ๋ฆฌ์คํธ(์ฑ์ ์)๋ ๋ฉด์ ์์๊ฐ ๊ฐ์ฅ ๋์ ์ฌ๋์ด ๋์ฌ ๋๊น์ง ์ฌ๋ผ์ด์ฑ์ ํ์ฌ set์ผ๋ก ๋ง๋ค์ด ์ค๋ค. set(p_cnt[1:top2 + 1])
+
+๋ฐ๋๋ก ๋ ๋ฒ์งธ ๋ฆฌ์คํธ(๋ฉด์ ์)๋ ์ฑ์ ์์๊ฐ ๊ฐ์ฅ ๋์ ์ฌ๋์ด ๋์ฌ ๋๊น์ง ์ฌ๋ผ์ด์ฑ์ ํ์ฌ set์ผ๋ก ๋ง๋ค์ด ์ค๋ค. set2 = set(p_cnt2[1:top1 + 1])
+
+์ด๋ ๊ฒ ๋ง๋ค๋ฉด ๊ฐ set์ ํ ๋ถ์ผ์ 1 ์์์ธ ์ฌ๋๋ณด๋ค ๋ค๋ฅธ ๋ถ์ผ์ ์์๊ฐ ๋์ ์ฌ๋๋ค์ ๊ฑธ๋ฌ๋ผ ์ ์๊ณ , ์ด ๋์ ๊ต์งํฉ์ ์ด์ฉํ๋ฉด ๋ ๋ถ์ผ์ 1 ์์์ธ ์ฌ๋๋ค๋ณด๋ค ์ ์ด๋ ํ๋์ ๋ถ์ผ์ ์์๊ฐ ๋์ ์ฌ๋๋ค์ ์ถ๋ ค๋ผ ์ ์์ด์ ์ ๋ต์ ๊ตฌํ ์ ์๋ค๊ณ ์๊ฐํ๋ค.
+
+์ค์ ๋ก๋ ์ ์์ ๋ก ์คํํ ๊ฒฐ๊ณผ๋ 3์ผ๋ก ์ ์์ ์ผ๋ก ํต๊ณผํ๋ค.
+
+ํ์ง๋ง ์๋์ ์์ ์ ๊ฐ์ ๊ฒฝ์ฐ์๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ค.
+
+| 1 | 4 |
+| 2 | 2 |
+| 3 | 3 |
+| 4 | 1 |
+
+์ด ๊ฒฝ์ฐ์๋ ์์ ๊ฐ์ ๋ฐฉ๋ฒ์ผ๋ก ํ๊ฒ ๋๋ฉด 4๋ช
๋ชจ๋ set์ ๋ค์ด๊ฐ๊ฒ ๋๋ฏ๋ก ์ถ๋ ฅ์ด 4๊ฐ ๋์ค๊ฒ ๋๋ค.
+
+ํ์ง๋ง ์ค์ ์ ๋ต์ (3, 3)์ด (2, 2)์ ๋งํ๊ฒ ๋์ด 3 ์ด ๋์์ผ ํ๋ค.
+
+### ์์ ํ ์ฝ๋
+
+```python
+import sys
+input = sys.stdin.readline
+
+t = int(input())
+
+for _ in range(t):
+ n = int(input())
+ p_cnt = [0] * (n + 1)
+ for _ in range(n):
+ s1, s2 = map(int, input().split())
+ p_cnt[s1] = (s1, s2)
+
+ cnt = 1
+ best_s1, best_s2 = p_cnt[1]
+ for s1, s2 in p_cnt[2:]:
+ if best_s2 > s2:
+ cnt += 1
+ best_s2 = s2
+ print(cnt)
+```
+
+์ฑ์ ์์ผ๋ก ์ ๋ ฌํ ๋ฆฌ์คํธ ํ๋๋ง ์ฌ์ฉํ๋ค. ์ด ๋ฆฌ์คํธ๋ฅผ ๋๋ฉด์ ํ์ฌ ์ ์ฅ๋์ด ์๋ ๋ฉด์ ์์๋ณด๋ค ๋์ ์ฌ๋์ ๋ฐ๊ฒฌํ ๊ฒฝ์ฐ ์นด์ดํธ๋ฅผ ํ๋ ๋๋ฆฌ๊ณ ๊ทธ ์ฌ๋์ ์์๋ฅผ ์ ์ฅํ์ฌ ๋ฐ๋ณต๋ฌธ์ ๊ณ์ ์งํํ๋ค. (์ด๊ธฐ ๊ฐ์ ์ฑ์ 1์์ ์ฌ๋)
+
+์ด๋ ๊ฒ ํ๋ฉด ์ฑ๊ณต์ ์ผ๋ก ์ด๋ค ์ฌ๋๋ณด๋ค ๋ ์์๊ฐ ๋ชจ๋ ๋ฎ์ ์ฌ๋์ ๊ฑธ๋ฌ๋ผ ์ ์๋ค.
\ No newline at end of file
diff --git a/_posts/2022-12-14-boj_1715.markdown b/_posts/2022-12-14-boj_1715.markdown
new file mode 100644
index 00000000000..a155680d06a
--- /dev/null
+++ b/_posts/2022-12-14-boj_1715.markdown
@@ -0,0 +1,62 @@
+---
+title: "[BOJ] ์นด๋ ์ ๋ ฌํ๊ธฐ - 1715 (G4)"
+author: kwon
+date: 2022-12-13T23:00:00 +0900
+categories: [boj, gold]
+tags: [data structure, greedy algorithm, priority queue]
+math: true
+mermaid: false
+---
+
+| ์๊ฐ ์ ํ | ๋ฉ๋ชจ๋ฆฌ ์ ํ |
+| --- | --- |
+| 2์ด | 128 MB |
+
+## ๋ฌธ์
+
+์ ๋ ฌ๋ ๋ ๋ฌถ์์ ์ซ์ ์นด๋๊ฐ ์๋ค๊ณ ํ์. ๊ฐ ๋ฌถ์์ ์นด๋์ ์๋ฅผ A, B๋ผ ํ๋ฉด ๋ณดํต ๋ ๋ฌถ์์ ํฉ์ณ์ ํ๋๋ก ๋ง๋๋ ๋ฐ์๋ A+B ๋ฒ์ ๋น๊ต๋ฅผ ํด์ผ ํ๋ค. ์ด๋ฅผํ
๋ฉด, 20์ฅ์ ์ซ์ ์นด๋ ๋ฌถ์๊ณผ 30์ฅ์ ์ซ์ ์นด๋ ๋ฌถ์์ ํฉ์น๋ ค๋ฉด 50๋ฒ์ ๋น๊ต๊ฐ ํ์ํ๋ค.
+
+๋งค์ฐ ๋ง์ ์ซ์ ์นด๋ ๋ฌถ์์ด ์ฑ
์ ์์ ๋์ฌ ์๋ค. ์ด๋ค์ ๋ ๋ฌถ์์ฉ ๊ณจ๋ผ ์๋ก ํฉ์ณ๋๊ฐ๋ค๋ฉด, ๊ณ ๋ฅด๋ ์์์ ๋ฐ๋ผ์ ๋น๊ต ํ์๊ฐ ๋งค์ฐ ๋ฌ๋ผ์ง๋ค. ์๋ฅผ ๋ค์ด 10์ฅ, 20์ฅ, 40์ฅ์ ๋ฌถ์์ด ์๋ค๋ฉด 10์ฅ๊ณผ 20์ฅ์ ํฉ์น ๋ค, ํฉ์น 30์ฅ ๋ฌถ์๊ณผ 40์ฅ์ ํฉ์น๋ค๋ฉด (10 + 20) + (30 + 40) = 100๋ฒ์ ๋น๊ต๊ฐ ํ์ํ๋ค. ๊ทธ๋ฌ๋ 10์ฅ๊ณผ 40์ฅ์ ํฉ์น ๋ค, ํฉ์น 50์ฅ ๋ฌถ์๊ณผ 20์ฅ์ ํฉ์น๋ค๋ฉด (10 + 40) + (50 + 20) = 120 ๋ฒ์ ๋น๊ต๊ฐ ํ์ํ๋ฏ๋ก ๋ ํจ์จ์ ์ธ ๋ฐฉ๋ฒ์ด๋ค.
+
+N๊ฐ์ ์ซ์ ์นด๋ ๋ฌถ์์ ๊ฐ๊ฐ์ ํฌ๊ธฐ๊ฐ ์ฃผ์ด์ง ๋, ์ต์ํ ๋ช ๋ฒ์ ๋น๊ต๊ฐ ํ์ํ์ง๋ฅผ ๊ตฌํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
+
+## ์
๋ ฅ
+
+์ฒซ์งธ ์ค์ N์ด ์ฃผ์ด์ง๋ค. (1 โค N โค 100,000) ์ด์ด์ N๊ฐ์ ์ค์ ๊ฑธ์ณ ์ซ์ ์นด๋ ๋ฌถ์์ ๊ฐ๊ฐ์ ํฌ๊ธฐ๊ฐ ์ฃผ์ด์ง๋ค. ์ซ์ ์นด๋ ๋ฌถ์์ ํฌ๊ธฐ๋ 1,000๋ณด๋ค ์๊ฑฐ๋ ๊ฐ์ ์์ ์ ์์ด๋ค.
+
+## ์ถ๋ ฅ
+
+์ฒซ์งธ ์ค์ ์ต์ ๋น๊ต ํ์๋ฅผ ์ถ๋ ฅํ๋ค.
+
+## ํ์ด
+
+๊ฐ์ฅ ์์ ์นด๋ ๋ญ์น๋ฅผ ์์์ผ๋ก ๋งค๋ฒ ๊ฐ์ฅ ์์ ์นด๋ ๋ญ์น๋ฅผ ํฉ์น๋ฉด ์ต์๋ก ๋น๊ตํ๋ฉด์ ๋ชจ๋ ์นด๋๋ฅผ ํฉ์น ์ ์๋ค. ์๋ํ๋ฉด ์ด๋ ๊ฒ ํด์ผ๋ง ํฉ์ณ์ง ์นด๋ ๋ญ์น์ ํฌ๊ธฐ๊ฐ ์ต์์ด๊ณ , ๋งค๋ฒ ํฉ์ณ์ง ์นด๋ ๋ญ์น๊ฐ ์ต์์ฌ์ผ ๋น๊ตํ๋ ํ์๋ ์ต์์ด๊ธฐ ๋๋ฌธ์ด๋ค.
+
+๋งค๋ฒ ์ ๋ ฌ๋ ์์ด์ด ํ์ํ๊ธฐ ๋๋ฌธ์ ์ฝ์
์์ ์ ๋ ฌ์ ํด์น์ง ์๋ ์ฐ์ ์์ ํ๋ฅผ ์ด์ฉํ์ฌ ํ์๋ค.
+
+```python
+from queue import PriorityQueue
+
+n = int(input())
+pq = PriorityQueue()
+
+for _ in range(n):
+ num = int(input())
+ pq.put(num)
+
+result = 0
+
+while pq.qsize() > 1:
+ tmp = pq.get()
+ num = pq.get()
+ result += tmp + num
+ pq.put(tmp + num)
+
+print(result)
+```
+
+์ฐ์ ์์ ํ์ ์
๋ ฅ์ผ๋ก ๋ค์ด์จ ์นด๋ ๋ญ์น์ ํฌ๊ธฐ๋ฅผ ์ฝ์
ํ๊ณ ๋ฐ๋ณต๋ฌธ์ ์์ํ๋ค.
+
+์ฐ์ ์์ ํ์ ์ฒซ ๋ฒ์งธ, ๋ ๋ฒ์งธ ์์๋ฅผ ๋นผ๋ด์ ๋ํด์ค๋ค (์นด๋ ๋ญ์น๋ฅผ ํฉ์นจ). ๊ทธ๋ฆฌ๊ณ ์ด๋ฅผ ๊ฒฐ๊ณผ๊ฐ ์ ์ฅ๋ result ํจ์์ ์ ์ฅํด์ค๋ค (ํฉ์น ๋ ๋น๊ตํ ํ์๋ฅผ ๋ฐ์). ๋ง์ง๋ง์ผ๋ก ์ฒซ ๋ฒ์งธ์ ๋ ๋ฒ์งธ ์์์ ํฉ์ ๋ค์ ์ฐ์ ์์ ํ์ ๋ฃ์ด์ค๋ค. ๋ค์ ๋ฃ์ด์ฃผ๋ฉด ํฉ์ณ์ง ์นด๋ ๋ญ์น๋ฅผ ์์ฐ์ค๋ฝ๊ฒ ๋ค์ ํฉ์น ์ ์๋ค.
+
+์ด๋ฅผ ์ฐ์ ์์ ํ์ ๊ธธ์ด๊ฐ 1๋ณด๋ค ์์์ง ๋๊น์ง ๋ฐ๋ณตํ๋ค. ํ๋๋ง ๋จ์๋ค๋ ๊ฒ์ด ๋ง์ง๋ง ๋ง์
์ด ๋๋ฌ๋ค๋ ๋ป์ด๊ธฐ ๋๋ฌธ์ ํ๊ฐ ๋ชจ๋ ๋น ๋๊น์ง ๋ฐ๋ณตํ ํ์ ์๋ค.
\ No newline at end of file
diff --git a/_posts/2022-12-16-boj_2217.markdown b/_posts/2022-12-16-boj_2217.markdown
new file mode 100644
index 00000000000..4cd8b2b4357
--- /dev/null
+++ b/_posts/2022-12-16-boj_2217.markdown
@@ -0,0 +1,52 @@
+---
+title: "[BOJ] ๋กํ - 2217 (S4)"
+author: kwon
+date: 2022-12-16T23:00:00 +0900
+categories: [boj, silver]
+tags: [math, greedy algorithm, sort]
+math: true
+mermaid: false
+---
+
+| ์๊ฐ ์ ํ | ๋ฉ๋ชจ๋ฆฌ ์ ํ |
+| --- | --- |
+| 2์ด | 192 MB |
+
+## ๋ฌธ์
+
+N(1 โค N โค 100,000)๊ฐ์ ๋กํ๊ฐ ์๋ค. ์ด ๋กํ๋ฅผ ์ด์ฉํ์ฌ ์ด๋ฐ ์ ๋ฐ ๋ฌผ์ฒด๋ฅผ ๋ค์ด์ฌ๋ฆด ์ ์๋ค. ๊ฐ๊ฐ์ ๋กํ๋ ๊ทธ ๊ตต๊ธฐ๋ ๊ธธ์ด๊ฐ ๋ค๋ฅด๊ธฐ ๋๋ฌธ์ ๋ค ์ ์๋ ๋ฌผ์ฒด์ ์ค๋์ด ์๋ก ๋ค๋ฅผ ์๋ ์๋ค.
+
+ํ์ง๋ง ์ฌ๋ฌ ๊ฐ์ ๋กํ๋ฅผ ๋ณ๋ ฌ๋ก ์ฐ๊ฒฐํ๋ฉด ๊ฐ๊ฐ์ ๋กํ์ ๊ฑธ๋ฆฌ๋ ์ค๋์ ๋๋ ์ ์๋ค. k๊ฐ์ ๋กํ๋ฅผ ์ฌ์ฉํ์ฌ ์ค๋์ด w์ธ ๋ฌผ์ฒด๋ฅผ ๋ค์ด์ฌ๋ฆด ๋, ๊ฐ๊ฐ์ ๋กํ์๋ ๋ชจ๋ ๊ณ ๋ฅด๊ฒ w/k ๋งํผ์ ์ค๋์ด ๊ฑธ๋ฆฌ๊ฒ ๋๋ค.
+
+๊ฐ ๋กํ๋ค์ ๋ํ ์ ๋ณด๊ฐ ์ฃผ์ด์ก์ ๋, ์ด ๋กํ๋ค์ ์ด์ฉํ์ฌ ๋ค์ด์ฌ๋ฆด ์ ์๋ ๋ฌผ์ฒด์ ์ต๋ ์ค๋์ ๊ตฌํด๋ด๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค. ๋ชจ๋ ๋กํ๋ฅผ ์ฌ์ฉํด์ผ ํ ํ์๋ ์์ผ๋ฉฐ, ์์๋ก ๋ช ๊ฐ์ ๋กํ๋ฅผ ๊ณจ๋ผ์ ์ฌ์ฉํด๋ ๋๋ค.
+
+## ์
๋ ฅ
+
+์ฒซ์งธ ์ค์ ์ ์ N์ด ์ฃผ์ด์ง๋ค. ๋ค์ N๊ฐ์ ์ค์๋ ๊ฐ ๋กํ๊ฐ ๋ฒํธ ์ ์๋ ์ต๋ ์ค๋์ด ์ฃผ์ด์ง๋ค. ์ด ๊ฐ์ 10,000์ ๋์ง ์๋ ์์ฐ์์ด๋ค.
+
+## ์ถ๋ ฅ
+
+์ฒซ์งธ ์ค์ ๋ต์ ์ถ๋ ฅํ๋ค.
+
+## ํ์ด
+
+๋ด๋ฆผ์ฐจ์์ผ๋ก ์ ๋ ฌํ ๋ค์ ์์๋๋ก ๋ค ์ ์๋ ๋ฌด๊ฒ๋ฅผ ๋น๊ตํ๋ค.
+
+```python
+n = int(input())
+result = 0
+cnt = 0
+rope = []
+for i in range(0, n):
+ rope.append(int(input()))
+
+rope.sort(reverse=True)
+max_w = 0
+for cnt, r in enumerate(rope):
+ if max_w <= r * (cnt + 1):
+ max_w = r * (cnt + 1)
+
+print(max_w)
+```
+
+๋ฐ๋ณต๋ฌธ์ ๋๋ฉด์ (๋กํ์ ๊ฐ์) * (์ง๊ธ ํ์ธํ ๋กํ์ ๋ฌด๊ฒ)์ ๊ฐ์ด ์ ์ฅํด ๋จ๋ ๋ฌด๊ฒ `max_w` ๋ณด๋ค ํฌ๋ฉด `max_w`๋ฅผ ๋ฐ๊ฟ์ค๋ค.
\ No newline at end of file
diff --git a/_posts/2022-12-3-boj_1016.markdown b/_posts/2022-12-3-boj_1016.markdown
new file mode 100644
index 00000000000..7511ba79bc9
--- /dev/null
+++ b/_posts/2022-12-3-boj_1016.markdown
@@ -0,0 +1,79 @@
+---
+title: "[BOJ] ์ ๊ณฑ ใดใด์ - 1016 (G1)"
+author: Kwon
+date: 2022-12-03T23:00:00 +0900
+categories: [boj, gold]
+tags: [prime number, sieve of Eratosthenes]
+math: true
+mermaid: false
+---
+
+| ์๊ฐ ์ ํ | ๋ฉ๋ชจ๋ฆฌ ์ ํ |
+|:-----------:|:-----------:|
+| 2์ด | 512 MB |
+
+## ๋ฌธ์
+์ด๋ค ์ ์ X๊ฐ 1๋ณด๋ค ํฐ ์ ๊ณฑ์๋ก ๋๋์ด ๋จ์ด์ง์ง ์์ ๋, ๊ทธ ์๋ฅผ ์ ๊ณฑใดใด์๋ผ๊ณ ํ๋ค. ์ ๊ณฑ์๋ ์ ์์ ์ ๊ณฑ์ด๋ค. min๊ณผ max๊ฐ ์ฃผ์ด์ง๋ฉด, min๋ณด๋ค ํฌ๊ฑฐ๋ ๊ฐ๊ณ , max๋ณด๋ค ์๊ฑฐ๋ ๊ฐ์ ์ ๊ณฑใดใด์๊ฐ ๋ช ๊ฐ ์๋์ง ์ถ๋ ฅํ๋ค.
+
+## ์
๋ ฅ
+์ฒซ์งธ ์ค์ ๋ ์ ์ min๊ณผ max๊ฐ ์ฃผ์ด์ง๋ค.
+
+## ์ถ๋ ฅ
+์ฒซ์งธ ์ค์ ๋ ์ ์ min๊ณผ max๊ฐ ์ฃผ์ด์ง๋ค.
+
+## ์ ํ
+* 1 โค min โค 1,000,000,000,000
+* min โค max โค min + 1,000,000
+
+## ํ์ด
+2๋ถํฐ ์ฆ๊ฐํ๋ฉด์ ์ ๊ณฑ ์์ ๋ฐฐ์๋ค์ ๋นผ์ฃผ๋ ์์ผ๋ก ์ ๊ณฑ ใดใด ์๋ฅผ ์ฐพ์๊ฐ๋ ๋ฐฉ์์ผ๋ก ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ค ๋ค์๊ณผ ๊ฐ์ด ์๋ํ์๋ค.
+
+### ์ฒซ ์๋์ ๋ฌธ์ ์
+```python
+n, m = map(int, input().split())
+sqr = [False] * (m - n + 1)
+cnt = 0
+for i in range(2, int(m ** 0.5) + 1):
+ j = 1
+ sqr_num = i ** 2
+ while sqr_num * j <= m:
+ if sqr_num * j < n: pass
+ elif not sqr[sqr_num * j - n]:
+ sqr[sqr_num * j - n] = True
+ cnt += 1
+ j += 1
+print((m - n + 1) - cnt)
+```
+
+์์์ ๋ฐฐ์๋ฅผ ๋นผ๋ฉฐ ์์๋ฅผ ์ฐพ์๊ฐ๋ ์๋ผํ ์คํ
๋ค์ค์ ์ฒด(sieve of Eratosthenes) ์๊ณ ๋ฆฌ์ฆ์ ์ ๊ณฑ ใดใด ์์ ๋ง๊ฒ ๋ณํํ์ฌ ์ฌ์ฉํ์๋ค.
+
+ํ์ง๋ง ์ ์ฝ๋๋ ์ฒด์ถ์ ์๊ฐ ์ด๊ณผ๊ฐ ๋ฐ์ํ๋ค. ๋ฌธ์ ์์ ์ฃผ์ด์ง ์์ ๋ฒ์๋ฅผ ๋ณด๋ฉด ์ต์๊ฐ 1,000,001,000,000(= 1,000,000,000,000 + 1,000,000)๊น์ง ์ฃผ์ด์ง ์ ์๊ธฐ ๋๋ฌธ์ `j`๊ฐ 1๋ถํฐ ์์ํ๋ฉด ์์ฒญ๋ ์๊ฐ ๋ญ๋น๊ฐ ๋ฐ์ํ๋ค.
+
+n์ด๋ผ๋ ์ต์๊ฐ์ด ์กด์ฌํ๊ธฐ ๋๋ฌธ์ `sqr_num * j`๊ฐ `n`๋ถํฐ ๋ฐ๋ก ์์ํ ์ ์๋๋ก ํด์ฃผ๋ฉด ์ธ๋ชจ์๋ ์ฐ์ฐ์ ๋ญ๋น๋ฅผ ์ค์ผ ์ ์๋ค.
+
+```python
+# ์คํจ
+j = 1
+
+# ์ฑ๊ณต
+j = n // sqr
+```
+
+๊ทธ๋์ ์์ ๊ฐ์ด `j`๋ฅผ `n // sqr`๋ถํฐ ์์ํ๋๋ก ํ์ฌ ์ฝ๋๋ฅผ ์์ ํ์๋ค.
+
+### ์์ ํ ์ฝ๋
+```python
+n, m = map(int, input().split())
+cnt = 0
+prime = [1] * (m - n + 1)
+i = 2
+while i ** 2 <= m:
+ sqr = i ** 2
+ j = n // sqr
+ while sqr * j <= m:
+ if sqr * j >= n and prime[sqr * j - n] == 1:
+ prime[sqr * j - n] = 0
+ j += 1
+ i += 1
+print(sum(prime))
+```
\ No newline at end of file
diff --git a/_posts/2022-12-9-boj_13460.markdown b/_posts/2022-12-9-boj_13460.markdown
new file mode 100644
index 00000000000..08d1031a04a
--- /dev/null
+++ b/_posts/2022-12-9-boj_13460.markdown
@@ -0,0 +1,281 @@
+---
+title: "[BOJ] ๊ตฌ์ฌ ํ์ถ 2 - 13460 (G1)"
+author: kwon
+date: 2022-12-9T23:00:00 +0900
+categories: [boj, gold]
+tags: [implementation, graph, bfs, simulation]
+math: true
+mermaid: false
+---
+
+| ์๊ฐ ์ ํ | ๋ฉ๋ชจ๋ฆฌ ์ ํ |
+|:-----------:|:-----------:|
+| 2์ด | 512 MB |
+
+## ๋ฌธ์
+์คํํธ๋งํฌ์์ ํ๋งคํ๋ ์ด๋ฆฐ์ด์ฉ ์ฅ๋๊ฐ ์ค์์ ๊ฐ์ฅ ์ธ๊ธฐ๊ฐ ๋ง์ ์ ํ์ ๊ตฌ์ฌ ํ์ถ์ด๋ค. ๊ตฌ์ฌ ํ์ถ์ ์ง์ฌ๊ฐํ ๋ณด๋์ ๋นจ๊ฐ ๊ตฌ์ฌ๊ณผ ํ๋ ๊ตฌ์ฌ์ ํ๋์ฉ ๋ฃ์ ๋ค์, ๋นจ๊ฐ ๊ตฌ์ฌ์ ๊ตฌ๋ฉ์ ํตํด ๋นผ๋ด๋ ๊ฒ์์ด๋ค.
+
+๋ณด๋์ ์ธ๋ก ํฌ๊ธฐ๋ N, ๊ฐ๋ก ํฌ๊ธฐ๋ M์ด๊ณ , ํธ์์ 1ร1ํฌ๊ธฐ์ ์นธ์ผ๋ก ๋๋์ด์ ธ ์๋ค. ๊ฐ์ฅ ๋ฐ๊นฅ ํ๊ณผ ์ด์ ๋ชจ๋ ๋งํ์ ธ ์๊ณ , ๋ณด๋์๋ ๊ตฌ๋ฉ์ด ํ๋ ์๋ค. ๋นจ๊ฐ ๊ตฌ์ฌ๊ณผ ํ๋ ๊ตฌ์ฌ์ ํฌ๊ธฐ๋ ๋ณด๋์์ 1ร1ํฌ๊ธฐ์ ์นธ์ ๊ฐ๋ ์ฑ์ฐ๋ ์ฌ์ด์ฆ์ด๊ณ , ๊ฐ๊ฐ ํ๋์ฉ ๋ค์ด๊ฐ ์๋ค. ๊ฒ์์ ๋ชฉํ๋ ๋นจ๊ฐ ๊ตฌ์ฌ์ ๊ตฌ๋ฉ์ ํตํด์ ๋นผ๋ด๋ ๊ฒ์ด๋ค. ์ด๋, **ํ๋ ๊ตฌ์ฌ์ด ๊ตฌ๋ฉ์ ๋ค์ด๊ฐ๋ฉด ์ ๋๋ค**.
+
+์ด๋, ๊ตฌ์ฌ์ ์์ผ๋ก ๊ฑด๋๋ฆด ์๋ ์๊ณ , ์ค๋ ฅ์ ์ด์ฉํด์ ์ด๋ฆฌ ์ ๋ฆฌ ๊ตด๋ ค์ผ ํ๋ค. ์ผ์ชฝ์ผ๋ก ๊ธฐ์ธ์ด๊ธฐ, ์ค๋ฅธ์ชฝ์ผ๋ก ๊ธฐ์ธ์ด๊ธฐ, ์์ชฝ์ผ๋ก ๊ธฐ์ธ์ด๊ธฐ, ์๋์ชฝ์ผ๋ก ๊ธฐ์ธ์ด๊ธฐ์ ๊ฐ์ ๋ค ๊ฐ์ง ๋์์ด ๊ฐ๋ฅํ๋ค.
+
+๊ฐ๊ฐ์ ๋์์์ ๊ณต์ ๋์์ ์์ง์ธ๋ค. ๋นจ๊ฐ ๊ตฌ์ฌ์ด ๊ตฌ๋ฉ์ ๋น ์ง๋ฉด ์ฑ๊ณต์ด์ง๋ง, ํ๋ ๊ตฌ์ฌ์ด ๊ตฌ๋ฉ์ ๋น ์ง๋ฉด ์คํจ์ด๋ค. **๋นจ๊ฐ ๊ตฌ์ฌ๊ณผ ํ๋ ๊ตฌ์ฌ์ด ๋์์ ๊ตฌ๋ฉ์ ๋น ์ ธ๋ ์คํจ์ด๋ค**. ๋นจ๊ฐ ๊ตฌ์ฌ๊ณผ ํ๋ ๊ตฌ์ฌ์ ๋์์ ๊ฐ์ ์นธ์ ์์ ์ ์๋ค. ๋, ๋นจ๊ฐ ๊ตฌ์ฌ๊ณผ ํ๋ ๊ตฌ์ฌ์ ํฌ๊ธฐ๋ ํ ์นธ์ ๋ชจ๋ ์ฐจ์งํ๋ค. ๊ธฐ์ธ์ด๋ ๋์์ ๊ทธ๋งํ๋ ๊ฒ์ ๋ ์ด์ ๊ตฌ์ฌ์ด ์์ง์ด์ง ์์ ๋ ๊น์ง์ด๋ค.
+
+๋ณด๋์ ์ํ๊ฐ ์ฃผ์ด์ก์ ๋, ์ต์ ๋ช ๋ฒ ๋ง์ ๋นจ๊ฐ ๊ตฌ์ฌ์ ๊ตฌ๋ฉ์ ํตํด ๋นผ๋ผ ์ ์๋์ง ๊ตฌํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
+
+## ์
๋ ฅ
+์ฒซ ๋ฒ์งธ ์ค์๋ ๋ณด๋์ ์ธ๋ก, ๊ฐ๋ก ํฌ๊ธฐ๋ฅผ ์๋ฏธํ๋ ๋ ์ ์ N, M (3 โค N, M โค 10)์ด ์ฃผ์ด์ง๋ค. ๋ค์ N๊ฐ์ ์ค์ ๋ณด๋์ ๋ชจ์์ ๋ํ๋ด๋ ๊ธธ์ด M์ ๋ฌธ์์ด์ด ์ฃผ์ด์ง๋ค. ์ด ๋ฌธ์์ด์ '.', '#', 'O', 'R', 'B' ๋ก ์ด๋ฃจ์ด์ ธ ์๋ค. '.'์ ๋น ์นธ์ ์๋ฏธํ๊ณ , '#'์ ๊ณต์ด ์ด๋ํ ์ ์๋ ์ฅ์ ๋ฌผ ๋๋ ๋ฒฝ์ ์๋ฏธํ๋ฉฐ, 'O'๋ ๊ตฌ๋ฉ์ ์์น๋ฅผ ์๋ฏธํ๋ค. 'R'์ ๋นจ๊ฐ ๊ตฌ์ฌ์ ์์น, 'B'๋ ํ๋ ๊ตฌ์ฌ์ ์์น์ด๋ค.
+
+์
๋ ฅ๋๋ ๋ชจ๋ ๋ณด๋์ ๊ฐ์ฅ์๋ฆฌ์๋ ๋ชจ๋ '#'์ด ์๋ค. ๊ตฌ๋ฉ์ ๊ฐ์๋ ํ ๊ฐ ์ด๋ฉฐ, ๋นจ๊ฐ ๊ตฌ์ฌ๊ณผ ํ๋ ๊ตฌ์ฌ์ ํญ์ 1๊ฐ๊ฐ ์ฃผ์ด์ง๋ค.
+
+## ์ถ๋ ฅ
+์ต์ ๋ช ๋ฒ ๋ง์ ๋นจ๊ฐ ๊ตฌ์ฌ์ ๊ตฌ๋ฉ์ ํตํด ๋นผ๋ผ ์ ์๋์ง ์ถ๋ ฅํ๋ค. ๋ง์ฝ, 10๋ฒ ์ดํ๋ก ์์ง์ฌ์ ๋นจ๊ฐ ๊ตฌ์ฌ์ ๊ตฌ๋ฉ์ ํตํด ๋นผ๋ผ ์ ์์ผ๋ฉด -1์ ์ถ๋ ฅํ๋ค.
+
+## ํ์ด
+
+๋งต์ BFS๋ก ํ์ํ๋ฉด์ ์๋ฎฌ๋ ์ด์
ํ๋ ๋ฌธ์ ์ด๋ค.
+
+์ฒ์ ์๋ํ ๋ฐฉ์์ ์ ๋ง ๋จ์ํ๊ฒ ๋ชจ๋ ๋ค ๊ตฌํํ๋ ๊ฒ์ผ๋ก ๋งต ๋ฆฌ์คํธ ์์ฒด์์ ๊ตฌ์ฌ๋ค์ ์ค์ ๋ก ์์ง์ด๋ ๊ฒ๊น์ง ๊ตฌํํ์๋ค.
+
+```python
+# ํ
๋๋ฆฌ์ '#'์ ํ์์์ ๊ฒ์ด๋ผ ํ๋จํ๊ณ ๋นผ๊ณ ์
๋ ฅ ๋ฐ์
+n, m = map(int, input().split())
+o, r, b = (-1, ), (-1, ), (-1, )
+input()
+map_list = []
+for i in range(n - 2):
+ row = input()[1:-1]
+ if o[0] == -1:
+ o = (row.find('O'), i)
+ if r[0] == -1:
+ r = (row.find('R'), i)
+ if b[0] == -1:
+ b = (row.find('B'), i)
+
+ map_list.append(list(row))
+input()
+
+# ๊ธฐ์ธ์์ ๋ ๊ตฌ์ฌ์ ์์ง์ด๋ ํจ์
+def tilt(map_list, dir, r, b):
+ rx, ry = r
+ bx, by = b
+ dir_x, dir_y = dir
+
+ next_rx, next_ry = rx + dir_x, ry + dir_y # ํ ์นธ ์ด๋
+ next_bx, next_by = bx + dir_x, by + dir_y
+ move_r = 0 <= next_ry < n - 2 and 0 <= next_rx < m - 2
+ move_b = 0 <= next_by < n - 2 and 0 <= next_bx < m - 2
+
+ while move_r or move_b:
+
+ if move_r:
+ next_r = map_list[next_ry][next_rx]
+ if next_r != '#' and not ((next_rx, next_ry) == (bx, by) and not move_b) and (rx, ry) != o:
+ rx = next_rx
+ ry = next_ry
+ elif (rx, ry) != o:
+ move_r = False
+ elif move_r:
+ move_r = False
+
+ if move_r:
+ next_rx, next_ry = rx + dir_x, ry + dir_y # ํ ์นธ ์ด๋
+ move_r = 0 <= next_ry < n - 2 and 0 <= next_rx < m - 2
+
+ if move_b:
+ next_b = map_list[next_by][next_bx]
+ if next_b != '#' and not((next_bx, next_by) == (rx, ry) and not move_r):
+ if next_b == 'O':
+ return -1, -1, -1, -1
+ bx = next_bx
+ by = next_by
+ else:
+ move_b = False
+ elif move_b:
+ move_b = False
+
+ if move_b:
+ next_bx, next_by = bx + dir_x, by + dir_y
+ move_b = 0 <= next_by < n - 2 and 0 <= next_bx < m - 2
+
+ return rx, ry, bx, by
+
+# ์์ง์ธ ์ขํ๋ฅผ ๋ฐํ์ผ๋ก ์ค์ ๋งต ๋ฆฌ์คํธ์ ๊ตฌ์ฌ์ ํ์ํ๋ ํจ์
+def move(dir, r, b):
+ m_rx, m_ry, m_bx, m_by = tilt(map_list, dir, r, b)
+ if m_rx == -1: return (-1, -1) #
+ elif (m_rx, m_ry) == o: return (True, True)
+ else:
+ map_list[r[1]][r[0]], map_list[m_ry][m_rx] = map_list[m_ry][m_rx], map_list[r[1]][r[0]]
+ map_list[b[1]][b[0]], map_list[m_by][m_bx] = map_list[m_by][m_bx], map_list[b[1]][b[0]]
+ r, b = (m_rx, m_ry), (m_bx, m_by)
+ return r, b
+
+visited = [[0] * (m - 2) for _ in range(n - 2)]
+
+# bfs๋ฅผ ํตํด ์๋ฎฌ๋ ์ด์
ํ๋ ํจ์
+def sim(r, b):
+ q = []
+ x, y = r
+ visited[y][x] = 1
+ q.append((r, None))
+
+ while q:
+ cur = q.pop(0)
+ dirs = [(1, 0),(-1, 0),(0, 1),(0, -1)]
+ pre_d = cur[1]
+ cur = cur[0]
+ pre_cnt = visited[cur[1]][cur[0]]
+ if pre_d:
+ dirs.remove((-pre_d[0], -pre_d[1]))
+ for d in dirs:
+ if not(0 < r[1] + d[1] < n -2 or 0 < r[0] + d[0] < m - 2): continue
+ r_tmp, b_tmp = move(d, cur, b)
+ if (r_tmp, b_tmp) == (-1, -1): continue
+ if r_tmp == True:
+ return pre_cnt
+ elif pre_cnt >= 10:
+ return -1
+ elif visited[r_tmp[1]][r_tmp[0]] == 0:
+ r, b = r_tmp, b_tmp
+ q.append((r, d))
+ visited[r[1]][r[0]] = pre_cnt + 1
+ return -1
+
+print(sim(r, b))
+```
+
+### ์ฒซ ์๋์ ๋ฌธ์ ์
+
+1. **map_list์ ์ค์ ๋ก ๊ตฌ์ฌ์ ์์น๋ฅผ ๋ฐ์ํ ํ์๊ฐ ์๋ค.**
+ 1. ๊ตฌ์ฌ ๋ ๊ฐ์ ์ขํ๋ง ํ์คํ ์๊ณ ์๋ค๋ฉด ๋ชจ๋ ์ํธ์์ฉ์ ํํํ ์ ์๋ค.
+ 2. ํ๋์ ๋ฆฌ์คํธ์ ์ค์ ๋ก ๊ตฌ์ฌ์ ์์น๋ฅผ ๋ฐ์ํ๊ฒ ๋๋ฉด bfs๋ฅผ ํตํด ์๋ฎฌ๋ ์ด์
์ ํ๋ ๋ฐ์ ๋ฌธ์ ๊ฐ ์๊ธด๋ค.
+ * ์ด์ ๊น์ง ์์ง์ธ ํ์๊ฐ ๊ฐ์ (= ํ์ ์งํ ํ์๊ฐ ๊ฐ์) ๋ค๋ฅธ ์๋๋ฅผ ํ ๋ ์ด์ ์ํ์ด ์ด๋ฏธ ์งํ๋ ๋งต์ด๊ธฐ ๋๋ฌธ์ ์ ์์ ์ธ ์ํ์ด ์งํ๋ ์ ์๋ค.
+
+2. **visited ๋ฆฌ์คํธ์ ์ฐจ์์ด ๋นจ๊ฐ ๊ตฌ์ฌ์ ์ขํ๋ง ์ฒดํฌํ๋ค.**
+ 1. ๋นจ๊ฐ ๊ตฌ์ฌ์ ์ขํ๊ฐ ๊ฐ์๋ ํ๋ ๊ตฌ์ฌ์ ์์น๊ฐ ๋ฌ๋ผ ๋ค๋ฅธ ์ํฉ์ผ ์ ์๋ค.
+
+3. **์ด์ธ ๋ค๋ฅธ ๋ฌธ์ ์ **
+ 1. ๊ณต์ด ๋ค๋ฅธ ๊ณต์ ๋ฟ์ ๋ฉ์ถ๋ ๊ฒฝ์ฐ๋ฅผ ์งํํ๋ ๋์ค์ ๊ณต์ ๋ง๋๊ณ ๊ทธ ๊ณต์ด ์ด์ ์ ์์ง์ด์ง ์์์ ๊ฒฝ์ฐ๋ฅผ ๊ธฐ์ค์ผ๋ก ํ๋จํ๋ ค ํ์ง๋ง ์ด๊ฒ์ด ๋ชจ๋ ๊ฒฝ์ฐ๋ฅผ ๋ค ์ปค๋ฒํ ์ ์๋์ง๋ ์๋ฌธ์ด๋ค.
+ 2. ์
๋ ฅ์ ๋ฐ์ ๋ ํ
๋๋ฆฌ๋ฅผ ์ ๊ฑฐํด๋ฒ๋ฆฌ๋ ๊ณต๋ค์ด ๋ฉ์ถ๋ ์กฐ๊ฑด์ด ์ถ๊ฐ๋์ด์ผ ํ๋ค.
+ * ํ
๋๋ฆฌ๋ฅผ ๋จ๊ฒจ๋๋ค๋ฉด ๋ฒฝ๊ณผ ๊ฐ์ ๋ฐฉ์์ผ๋ก ์ฒ๋ฆฌํ ์ ์์ด ์ฝ๋ ์์ฑ์ ํธ๋ฆฌ
+ * ํ
๋๋ฆฌ๋ (m-2) * (n-2) ๊ฐ์ ์์๋ง์ด ์ถ๊ฐ๋๋ฉฐ n, m โค 10์ด๋ฏ๋ก ๊ณต๊ฐ ๋ณต์ก๋์ ํฐ ์ํฅ์ ๋ฏธ์น์ง ์์ ๊ฒ์ด๋ผ ํ๋จํ์์.
+
+์ ์ฝ๋๋ ๊ฒฐ๊ณผ์ ์ผ๋ก ์๊ฐ ์ด๊ณผ๋ก ํ๋จ๋์์ง๋ง ์ฑ์ ์ด ๊ณ์ ์งํ๋์์ด๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ๊ฐ๋ฅ์ฑ์ด ์ถฉ๋ถํ ์์ด ๋ณด์๋ค
+
+### ์์ ํ ์ฝ๋
+
+```python
+# ํ
๋๋ฆฌ ํฌํจํ์ฌ ์
๋ ฅ ๋ฐ์
+n, m = map(int, input().split())
+o, r, b = (-1, ), (-1, ), (-1, )
+map_list = []
+for i in range(n):
+ row = input()
+ if o[0] == -1:
+ o = (row.find('O'), i)
+ if r[0] == -1:
+ r = (row.find('R'), i)
+ if b[0] == -1:
+ b = (row.find('B'), i)
+
+ map_list.append(list(row))
+
+# ์
๋ ฅ์ด ๋ฐ๋์ ๋ฐ๋ผ ๊ณต์ด ๋ฉ์ถ๋ ์กฐ๊ฑด์ด ๋ ๊ฐ๋จํด์ง
+# ๊ณต์ด ๊ณต์ ๋ฟ์ ๋ฉ์ถ๋ ๊ฒฝ์ฐ๋ ๋ค๋ฅธ ๋ฐฉ์์ผ๋ก ์ฒ๋ฆฌ
+def tilt(map_list, dir, r, b):
+ rx, ry = r
+ bx, by = b
+ dir_x, dir_y = dir
+ if dir_x != 0:
+ if dir_x * rx > dir_x * bx: late = 'b'
+ else: late = 'r'
+ else:
+ if dir_y * ry > dir_y * by: late = 'b'
+ else: late = 'r'
+
+ cur_r = map_list[ry][rx]
+ cur_b = map_list[by][bx]
+
+ next_r, next_b = '.', '.'
+
+ while (next_r != '#' and cur_r != 'O') or (next_b != '#'):
+ next_r = map_list[ry + dir_y][rx + dir_x]
+ next_b = map_list[by + dir_y][bx + dir_x]
+ if next_r != '#' and cur_r != 'O':
+ cur_r = next_r
+ rx += dir_x
+ ry += dir_y
+ if next_b != '#':
+ cur_b = next_b
+ bx += dir_x
+ by += dir_y
+ if cur_b == 'O':
+ return -1, -1, -1, -1
+
+ if (rx, ry) == (bx, by):
+ if late == 'b':
+ bx -= dir_x
+ by -= dir_y
+ else:
+ rx -= dir_x
+ ry -= dir_y
+
+ return rx, ry, bx, by
+
+def move(dir, r, b):
+ m_rx, m_ry, m_bx, m_by = tilt(map_list, dir, r, b)
+ if m_rx == -1: return (-1, -1)
+ elif (m_rx, m_ry) == o: return (True, True)
+ else:
+ r, b = (m_rx, m_ry), (m_bx, m_by)
+ return r, b
+
+# visited๊ฐ ๋นจ๊ฐ ๊ณต๊ณผ ํ๋ ๊ณต์ ์ขํ๋ฅผ ๋ชจ๋ ์ ์ฅํ ์ ์๊ฒ ์์
+visited = [[[[0] * m for _ in range(n)] for _ in range(m)] for _ in range(n)]
+
+def sim(r, b):
+ q = []
+ q.append((r, b, None))
+
+ while q:
+ cur_r, cur_b, pre_d = q.pop(0)
+ dirs = [(1, 0),(-1, 0),(0, 1),(0, -1)]
+ pre_cnt = visited[cur_r[1]][cur_r[0]][cur_b[1]][cur_b[0]]
+
+ if pre_d:
+ dirs.remove(pre_d)
+ dirs.remove((-pre_d[0], -pre_d[1]))
+
+ for d in dirs:
+ r_tmp, b_tmp = move(d, cur_r, cur_b)
+ if r_tmp == -1:
+ continue
+ elif r_tmp == True:
+ return pre_cnt + 1
+ elif pre_cnt >= 10:
+ return -1
+ elif not visited[r_tmp[1]][r_tmp[0]][b_tmp[1]][b_tmp[0]]: # ๋ฐฉ๋ฌธ ์ํจ
+ q.append((r_tmp, b_tmp, d))
+ visited[r_tmp[1]][r_tmp[0]][b_tmp[1]][b_tmp[0]] = pre_cnt + 1
+
+ return -1
+
+print(sim(r, b))
+```
+
+1. **map_list์ ์ค์ ๋ก ๊ตฌ์ฌ์ ์์น๋ฅผ ๋ฐ์ํ ํ์๊ฐ ์๋ค.**
+ โ ์ค์ ๋ก ๋ฐ์ํ๋ ์ฝ๋๋ฅผ ์ญ์ ํ๊ณ ์ขํ๋ง ๋ฐ๊พธ๋ ์์ผ๋ก ํจ์๋ฅผ ์์
+
+2. **visited ๋ฆฌ์คํธ์ ์ฐจ์์ด ๋นจ๊ฐ ๊ตฌ์ฌ์ ์ขํ๋ง ์ฒดํฌํ๋ค.**
+ โ 2์ฐจ์ ๋ฆฌ์คํธ๋ฅผ 4์ฐจ์ ๋ฆฌ์คํธ๋ก ๋ฐ๊ฟ์ ๋ ๋ค ์ฒดํฌํ ์ ์๋๋ก ์์
+
+3. **์ด์ธ ๋ค๋ฅธ ๋ฌธ์ ์ **
+ 1. ๊ณต์ด ๋ค๋ฅธ ๊ณต์ ๋ฟ์ ๋ฉ์ถ๋ ๊ฒฝ์ฐ๋ฅผ ์งํํ๋ ๋์ค์ ๊ณต์ ๋ง๋๊ณ ๊ทธ ๊ณต์ด ์ด์ ์ ์์ง์ด์ง ์์์ ๊ฒฝ์ฐ๋ฅผ ๊ธฐ์ค์ผ๋ก ํ๋จํ๋ ค ํ๋ค.
+ โ ํจ์์ ์
๋ ฅ์ผ๋ก ๋ฐ์ ๋งค๊ฐ๋ณ์๋ค์ ๊ธฐ๋ฐ์ผ๋ก ๋ ๊ตฌ์ฌ์ ์ต์ข
์ขํ๊ฐ ๊ฒน์น ๊ฒฝ์ฐ ๋์ค์ ๋์ฐฉํ ๊ตฌ์ฌ์ ์ขํ๋ฅผ ํ ์นธ ์ ์ผ๋ก ๋๋ฆฌ๋ ๋ฐฉ์์ผ๋ก ์์
+
+ 2. ์
๋ ฅ์ ๋ฐ์ ๋ ํ
๋๋ฆฌ๋ฅผ ์ ๊ฑฐํด๋ฒ๋ฆฌ๋ ๊ณต๋ค์ด ๋ฉ์ถ๋ ์กฐ๊ฑด์ด ์ถ๊ฐ๋์ด์ผ ํ๋ค.
+ โ ๊ทธ๋ฅ ํ
๋๋ฆฌ๊น์ง ๋ค ๋ฐ์๋ค.
+
+
+์ฒ์๋ถํฐ ๋๋ฌด ๊ณต๊ฐ ๋ณต์ก๋๋ฅผ ์ค์ด๋ ค๊ณ ํด์ ํธ๋๋ฐ ๋ ์ค๋ ๊ฑธ๋ฆฐ ๊ฒ ๊ฐ๋ค. ๋ฌด์์ ๊ณต๊ฐ ๋ณต์ก๋๋ฅผ ์ค์ด๋ ค๊ณ ํ์ง ๋ง๊ณ ์
๋ ฅ์ ํฌ๊ธฐ์ ์ฃผ์ด์ง ๋ฌธ์ ์ ๋ฉ๋ชจ๋ฆฌ ์ ํ์ ์ ํ์ธํ๊ณ ์ ์ ํ ์ ์ ์ฐพ์์ ํ๋ ์ต๊ด์ด ํ์ํด ๋ณด์ธ๋ค.
\ No newline at end of file
diff --git a/_posts/2023-01-03-boj_25378.markdown b/_posts/2023-01-03-boj_25378.markdown
new file mode 100644
index 00000000000..b486bd118a8
--- /dev/null
+++ b/_posts/2023-01-03-boj_25378.markdown
@@ -0,0 +1,173 @@
+---
+title: "[BOJ][KOI] ์กฐ์ฝ๋ - 25378 (G1)"
+author: kwon
+date: 2022-12-16T23:00:00 +0900
+categories: [boj, gold]
+tags: [math, greedy algorithm, sort]
+math: true
+mermaid: false
+---
+
+| ์๊ฐ ์ ํ | ๋ฉ๋ชจ๋ฆฌ ์ ํ |
+| --- | --- |
+| 0.5 ์ด | 1024 MB |
+
+# ๋ฌธ์
+
+์ข์ฐ ํ ์ค๋ก ์๋ N๊ฐ์ ์ฅ์ ๊ฐ๊ฐ์ ์กฐ์ฝ๋์ด ๋ช ๊ฐ์ฉ ๋์ฌ ์๋ค.
+
+์ฒ ์๊ฐ ํ ์ ์๋ ์์
์ ์ข
๋ฅ๋ ์๋ ๋ ๊ฐ์ง์ด๋ค.
+
+1. ์ธ์ ํ ๋ ์ฅ์์์ย **์์์ ๋์ผํ ๊ฐ์**์ ์กฐ์ฝ๋์ ๊ฐ์ ธ๊ฐ๊ธฐ
+2. ํ ์ฅ์์์ย **์์์ ๊ฐ์**์ ์กฐ์ฝ๋์ ๊ฐ์ ธ๊ฐ๊ธฐ
+
+์ด๋ค ์ฅ์์ ์กฐ์ฝ๋์ด ๋ ์ด์ ์๋ ๊ฒฝ์ฐ์๋ ๊ทธ ์ฅ์๋ ๊ทธ๋๋ก ๋จ์ ์์ด์, ์ด๊ธฐ์ ์ธ์ ํ์ง ์์๋ ๋ ์ฅ์๊ฐ ์ธ์ ํ ๊ฒ์ผ๋ก ๋ฐ๋์ง ์๋๋ค.
+
+์ฒ ์๋ ์์ ๋ ์์
์ค ํ๋๋ฅผ ๊ณจ๋ผ์ ์คํํ๋ ๊ฒ์ ๋ฐ๋ณตํ์ฌ ๋ชจ๋ ์กฐ์ฝ๋์ ๊ฐ์ ธ๊ฐ๋ ค๊ณ ํ๋ค.
+
+์ด๊ธฐ์ ๊ฐ ์ฅ์์ ์๋ ์กฐ์ฝ๋๋ค์ ๊ฐ์๋ฅผ ์
๋ ฅ๋ฐ์, ์ฒ ์๊ฐ ํ ์ ์๋ ์ต์์ ์์
ํ์๋ฅผ ๊ณ์ฐํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ๋ผ.
+
+# ์
๋ ฅ
+
+์ฒซ ๋ฒ์งธ ์ค์ ์ฅ์์ ๊ฐ์ N์ด ์ฃผ์ด์ง๋ค.
+
+๋ ๋ฒ์งธ ์ค์ N๊ฐ์ ์ฅ์ ๊ฐ๊ฐ์ ์๋ ์กฐ์ฝ๋ ๊ฐ์๊ฐ ์ผ์ชฝ ์ฅ์์ ํด๋นํ๋ ๊ฒ๋ถํฐ ์์๋๋ก ๊ณต๋ฐฑ ํ๋์ฉ์ ์ฌ์ด๋ก ๋๊ณ ์ฃผ์ด์ง๋ค.
+
+# ์ถ๋ ฅ
+
+์ฒซ ๋ฒ์งธ ์ค์ ๋ต์ ์ถ๋ ฅํ๋ค.
+
+# ์ ํ
+
+- 2 โค N โค 2 500
+- ๊ฐ ์ฅ์์ ์ด๊ธฐ ์กฐ์ฝ๋ ๊ฐ์๋ $1$ ์ด์ $10^8$ย ์ดํ์ด๋ค.
+
+
+# ์๋ธํ์คํฌ
+
+| ๋ฒํธ | ๋ฐฐ์ | ์ ํ |
+| --- | --- | --- |
+| 1 | 6 | N = 3. |
+| 2 | 11 | N โค 15. |
+| 3 | 19 | N โค 300. |
+| 4 | 27 | ๊ฐ ์ฅ์์ ์ด๊ธฐ ์กฐ์ฝ๋ ๊ฐ์๊ฐ 2 500 ์ดํ์ด๋ค. |
+| 5 | 37 | ์ถ๊ฐ ์ ์ฝ ์กฐ๊ฑด ์์. |
+
+# ํ์ด
+
+dynamic programing์ผ๋ก ์ ๊ทผํด ๋ณด๋ฉด ์กฐ์ฝ๋์ ์ค๋ฅธ์ชฝ์์ ์์
์ ์์ํ์ฌ ๊ฐ ์๋ฆฌ๋ง๋ค ๊ทธ ๋์ ์ต์ ์์
ํ์๋ฅผ ์ ์ฅํ์ฌ memoizationํ ์ ์๋ค.
+
+ํ์ง๋ง ๋จ์ํ ์ด์ ๊น์ง์ ์ต์ ์์
ํ์์ ํ์ฌ ์๋ฆฌ์ ์ต์ ์์
์ ๋ํ๋ค๊ณ ์ต์ข
์ ์ธ ์ต์ ์์
ํ์๊ฐ ๋ ์๋ ์๋ค. ์๋์ ๊ฐ์ ์๋ฅผ ๋ณด์.
+
+> **1 3 2**
+
+์กฐ์ฝ๋์ ๊ฐ์๊ฐ ์์ ๊ฐ์ด ์ฃผ์ด์ก์ ๊ฒฝ์ฐ ๋ ๋ฒ์งธ ์๋ฆฌ๊น์ง ์ต์ ํ์๋ 2์ด๋ค. ์ด๋ฅผ ์ ์ฅํ๊ณ ๋ค์์ผ๋ก ๋์ด๊ฐ์ ๋ง์ง๋ง ์๋ฆฌ์ธ ๋ ๊ฐ์ ์กฐ์ฝ๋์ ๋นผ๋ด๋ ํ์ 1์ ๋จ์ํ ๋ํ๋ฉด ์ด ํ์๋ 3ํ์ด๋ค.
+
+ํ์ง๋ง ์ฒ์๋ถํฐ 1๋ฒ ์์
์ผ๋ก ๋ชจ๋ ์งํํ๊ฒ ๋๋ฉด ๋ ๋ฒ ๋ง์ ๋๋ผ ์ ์๋ค.
+
+๊ทธ๋ฌ๋ฏ๋ก ๋จ์ํ ์ด์ ๊น์ง ์ต์ ํ์์ ํ์ฌ์ ์ต์ ํ์๋ฅผ ๋ํ๋ฉด ์๋๋ค.
+
+1๋ฒ ์์
๊ณผ 2๋ฒ ์์
๊ฐ์ ์์
ํ์ ์ฐจ์ด๋ฅผ ์กฐ๊ธ ๋ ์์ธํ ์์๋ณด์.
+
+**1๋ฒ ์์
**
+
+- r ๋ฒ์งธ์์ l ๋ฒ์งธ๊น์ง 1๋ฒ ์์
๋ง์ผ๋ก ๋ชจ๋ ์๋ฆฌ์ ๋์ ๊ฐ์๋ฅผ 0์ผ๋ก ๋ง๋ค ์ ์๋ค๊ณ ํ์ ๋ ์์
ํ์๋ (l - r) ๋ฒ์ด๋ค. (r, r + 1), (r + 1, r + 2), โฆ , (l - 2, l - 1), (l - 1, l) ์ด์ ๊ฐ์ ์์ผ๋ก ์์
์ด ์งํ๋๋ฏ๋ก (l -r)๋ฒ ๋ง์ ์์
์ ๋๋ผ ์ ์๋ค.
+
+**2๋ฒ ์์
**
+
+- ์ด ๊ฒฝ์ฐ๋ ํด๋น ๋ฒ์์ ๋ชจ๋ ์๋ฆฌ์ ์กฐ์ฝ๋์ ํ ๋ฒ์ฉ ๊ฐ์ ธ๊ฐ๋ ๊ฒ์ด๋ฏ๋ก ๋ฒ์ ๋ด์ ์๋ฆฌ ๊ฐ์์ธ (l - r + 1)๊ณผ ๊ฐ์ ํ์๋งํผ ์์
์ ํด์ผ ํ๋ค.
+
+์๋ฆฌ์ ๋ฒ์์ ๋ฐ๋ผ 1๋ฒ ์์
์ผ๋ก๋ง ์กฐ์ฝ๋์ ๋ชจ๋ ๋น์ธ ์ ์๋์ง ์ฌ๋ถ๊ฐ ์์ ํ ๋ฌ๋ผ์ง๊ธฐ ๋๋ฌธ์ ์ด ์ ๋ณด๋ฅผ ์ฌ์ฉํ ์ ์๋๋ก ๋ฏธ๋ฆฌ ๋ชจ๋ ๋ฒ์์ ๋ํด 1๋ฒ ์์
์ผ๋ก๋ง ๊ฐ๋ฅํ์ง ์ฒดํฌํด๋๋ค.
+
+์์์ ๋ณผ ์ ์๋ฏ์ด 1๋ฒ ์์
์ ์ต์ ์ผ๋ก ์ด์ฉํ๋ ๋ฐฉ๋ฒ์ ์ฐพ๋ ๊ฒ์ด ์ด ๋ฌธ์ ๋ฅผ ํธ๋๋ฐ ์ค์ํ๋ค๋ ๊ฒ์ ์ ์ ์๋ค.
+
+์ฒดํฌํ๊ธฐ ๊ฐ์ฅ ์ฌ์ด ๋ฐฉ๋ฒ์ ๋งค๋ฒ ์ธ์ ํ ๋ ์กฐ์ฝ๋์ ๋ํด 1๋ฒ ์์
์ ํ๋ฉด์ ๋งค๋ฒ ํด๋น ๋ฒ์์ ์กฐ์ฝ๋ ์์ ํฉ์ ๊ตฌํด ํฉ์ด 0์ด ๋์๋์ง ํ์ธํด๋ณด๋ ๊ฒ์ด์ง๋ง, ์ด ๊ฒฝ์ฐ $O(n^3)$์ ์๊ฐ๋ณต์ก๋๋ฅผ ๊ฐ์ง๊ธฐ ๋๋ฌธ์, ์ด ๋ฌธ์ ์ ๋ชจ๋ ์๋ธํ์คํฌ๋ฅผ ๋ง์กฑํ๊ธฐ์ ๋ถ์ ํฉํ๋ค.
+
+๊ทธ๋์ ์๋์ ๊ฐ์ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ๋ค.
+
+```python
+check = [[0] * n for _ in range(n)]
+
+for l in range(n - 1):
+ tmp = nums[l]
+
+ for r in range(l + 1, n):
+ if tmp == nums[r]:
+ check[l][r] = 1
+ elif tmp > nums[r]:
+ break
+ tmp = abs(tmp - nums[r])
+```
+
+์์ ๋ณ์(`tmp`)์ 1๋ฒ ์์
์ ํ๊ณ ๋จ์ ์ด์ ์กฐ์ฝ๋์ ๊ฐ์๋ฅผ ์ ์ฅํ๋ค. ์์ ๋ณ์์ ํ์ฌ ํ์ธํ๊ณ ์๋ ์๋ฆฌ์ ์กฐ์ฝ๋ ๊ฐ์(`nums[r]`)๊ฐ ๊ฐ์ผ๋ฉด 1๋ฒ ์์
๋ง์ผ๋ก ํด๋น ๋ฒ์์ ์๋ฆฌ๋ฅผ ๋ชจ๋ ๋น์ธ ์ ์๋ค๋ ๊ฒ์ด๋ฏ๋ก ์ฒดํฌํด์ค๋ค.
+
+๊ฐ์ง ์์ ๊ฒฝ์ฐ ๊ทธ๋๋ก ๋๋๋ฉด ๋์ง๋ง ๋ง์ฝ ์์ ๋ณ์๊ฐ ํ์ฌ ์กฐ์ฝ๋ ๊ฐ์๋ณด๋ค ํฌ๋ค๋ฉด ์ด๋ป๊ฒ ํด๋ 1๋ฒ ์์
๋ง ํด์ ๋ชจ๋ ๋ค ๋น์ธ ์ ์๊ธฐ ๋๋ฌธ์ ๋ฐ๋ก ๋ฐ๋ณต๋ฌธ์ ์ข
๋ฃํ๋ค.
+
+์ ๊ฒฝ์ฐ์๋ ํด๋น๋์ง ์์์ผ๋ฉด ์์ง 1๋ฒ ์์
๋ง์ผ๋ก ์กฐ์ฝ๋์ ๋ค ๋น์ธ ์ ์๋ ๊ฐ๋ฅ์ฑ์ด ๋จ์์๊ธฐ ๋๋ฌธ์ ์์ ๋ณ์์ ์์ ๋ณ์์ ํ์ฌ ์กฐ์ฝ๋ ๊ฐ์์ ์ฐจ์ด๋ก ์์ ๋ณ์์ ๊ฐ์ ๋ฐ๊ฟ์ค๋ค. ๊ณ์ํด์ ๋ ๊ฐ์ ์ฐจ๋ก ๊ฐ์ ๋ฐ๊ฟ์ค์ผ 1๋ฒ ์์
์ ํ๊ณ ๋จ์ ์ด์ ์กฐ์ฝ๋์ ๊ฐ์๊ฐ ๋๋ค.
+
+์ด์ ์์์ ์ฒดํฌํ ๊ฒ์ ์ด์ฉํ์ฌ ์ต์ ์ํ์ ์ฐพ์์ผ ํ๋ค. ์ต์ ํ์์ ํ๋ณด๊ฐ ๋ ์ ์๋ ๊ฐ์ ํฌ๊ฒ ๋ ๊ฐ์ง๊ฐ ์๋ค.
+
+$memo[i]$๋ $i$๊น์ง ์์
์ ์ํํ์ ๋์ ์ต์ ํ์, $2\leq i\leq N$ ๋ฒ์์์ ๋ฐ๋ณตํ๋ฉฐ ํ์ธํ ๊ฒ์ด๋ฏ๋ก $memo[1]=1$๋ก ์ด๊ธฐํํ๋ค๊ณ ํ์. ์ด๋ ์ต์ ํ์์ ํ๋ณด๋ ๋ค์๊ณผ ๊ฐ๋ค.
+
+1. $memo[i-1] + 1$
+
+ : ์ด์ ๊น์ง ์ต์ ํ์์ ์ด๋ฒ ์๋ฆฌ์ ์กฐ์ฝ๋์ 2๋ฒ ์์
์ผ๋ก ๋นผ๋ด๋ ํ์(1)๋ฅผ ๋ํ ๊ฒ
+
+2. $\min_{1\leq j < i, check[j][i]=1}(memo[j - 1]+i-j)$ $(2\leq i\leq N)$
+
+ : ๋ฒ์๊ฐ ๋ฐ๋์์ผ๋ ์๋กญ๊ฒ 1๋ฒ ์์
๋ง์ผ๋ก ๋น์ฐ๊ธฐ๊ฐ ๊ฐ๋ฅํ ๋ฒ์(์ฒดํฌ๋ ๋ฒ์)๊ฐ ์๋์ง ์ฐพ์๋ณด๋ ๊ณผ์ ์ด๋ค. $1\leq j < i$๋ฅผ ๋ง์กฑํ๋ $j$๋ถํฐ ์์ํด์ ์๋ก์ด ๋ฒ์์ ๋($i$)๊น์ง ํ์ธํ๋ฉด์ ์ฒดํฌํ ๋ฒ์๊ฐ ์๋์ง ํ์ธํ๊ณ ์ฒดํฌ๋ ๊ฒ์ด ํ์ธ๋๋ฉด ($check[j][i]=1$) ํ์๋ฅผ ๊ณ์ฐํ๋ค.
+
+ ์๋กญ๊ฒ ์ฐพ์ ๋ฒ์๊ฐ ์์ํ๊ธฐ ์ ๊น์ง์ ์ต์ ํ์($memo[j - 1]$)์ ์๋ก์ด ๋ฒ์์์ 1๋ฒ ์์
์ ํ ํ์($i-j$)๋ฅผ ๋ํด์ฃผ๋ฉด ์ ์ฒด ํ์๋ฅผ ๊ณ์ฐํ ์ ์๋ค.
+
+
+์ ๊ณผ์ ์ผ๋ก ๊ตฌํ ๋ ๊ฐ ์ค ์์ ๊ฒ์ ํด๋น ์์น์์์ ์ต์ ํ์๋ก ์ทจํ๋ฉด ๋๋ค. ์ ์ฒด ์ ํ์์ ๋ค์๊ณผ ๊ฐ์ด ํํํ ์ ์๋ค.
+
+$$memo[i]=\min\{memo[i-1]+1, \min_{1\leq j < i, check[j][i]=1}(memo[j - 1]+i-j)\}$$
+
+```python
+memo = [0] * (n + 1)
+memo[1] = 1
+
+for i in range(2, n + 1):
+ new_min = float('inf')
+ for j in range(1, i):
+ if check[j - 1][i - 1] == 1:
+ new = memo[j - 1] + i - j
+ if new_min > new:
+ new_min = new
+
+ memo[i] = min(memo[i - 1] + 1, new_min)
+print(memo[-1])
+```
+
+## ์ ์ฒด ์ฝ๋
+
+```python
+n = int(input())
+nums = list(map(int, input().split()))
+
+check = [[0] * n for _ in range(n)]
+memo = [0] * (n + 1)
+memo[1] = 1
+
+for l in range(n - 1):
+ tmp = nums[l]
+
+ for r in range(l + 1, n):
+ if tmp == nums[r]:
+ check[l][r] = 1
+ elif tmp > nums[r]:
+ break
+ tmp = abs(tmp - nums[r])
+
+for i in range(2, n + 1):
+ new_min = float('inf')
+ for j in range(1, i):
+ if check[j - 1][i - 1] == 1:
+ new = memo[j - 1] + i - j
+ if new_min > new:
+ new_min = new
+
+ memo[i] = min(memo[i - 1] + 1, new_min)
+print(memo[-1])
+```
\ No newline at end of file
diff --git a/_posts/2023-02-02-boj_1003.markdown b/_posts/2023-02-02-boj_1003.markdown
new file mode 100644
index 00000000000..1c5648002c9
--- /dev/null
+++ b/_posts/2023-02-02-boj_1003.markdown
@@ -0,0 +1,90 @@
+---
+title: "[BOJ]ํผ๋ณด๋์น ํจ์- 1003 (S3)"
+author: kwon
+date: 2023-02-02T23:00:00 +0900
+categories: [boj, silver]
+tags: [dynamic programing]
+math: true
+mermaid: false
+---
+
+| ์๊ฐ ์ ํ | ๋ฉ๋ชจ๋ฆฌ ์ ํ |
+| --- | --- |
+| 0.25 ์ด (์ถ๊ฐ ์๊ฐ ์์) | 128 MB |
+
+# ๋ฌธ์
+
+๋ค์ ์์ค๋ N๋ฒ์งธ ํผ๋ณด๋์น ์๋ฅผ ๊ตฌํ๋ C++ ํจ์์ด๋ค.
+
+```
+int fibonacci(int n) {
+ if (n == 0) {
+ printf("0");
+ return 0;
+ } else if (n == 1) {
+ printf("1");
+ return 1;
+ } else {
+ return fibonacci(nโ1) + fibonacci(nโ2);
+ }
+}
+
+```
+
+`fibonacci(3)`์ ํธ์ถํ๋ฉด ๋ค์๊ณผ ๊ฐ์ ์ผ์ด ์ผ์ด๋๋ค.
+
+- `fibonacci(3)`์ย `fibonacci(2)`์ย `fibonacci(1)`ย (์ฒซ ๋ฒ์งธ ํธ์ถ)์ ํธ์ถํ๋ค.
+- `fibonacci(2)`๋ย `fibonacci(1)`ย (๋ ๋ฒ์งธ ํธ์ถ)๊ณผย `fibonacci(0)`์ ํธ์ถํ๋ค.
+- ๋ ๋ฒ์งธ ํธ์ถํย `fibonacci(1)`์ 1์ ์ถ๋ ฅํ๊ณ 1์ ๋ฆฌํดํ๋ค.
+- `fibonacci(0)`์ 0์ ์ถ๋ ฅํ๊ณ , 0์ ๋ฆฌํดํ๋ค.
+- `fibonacci(2)`๋ย `fibonacci(1)`๊ณผย `fibonacci(0)`์ ๊ฒฐ๊ณผ๋ฅผ ์ป๊ณ , 1์ ๋ฆฌํดํ๋ค.
+- ์ฒซ ๋ฒ์งธ ํธ์ถํย `fibonacci(1)`์ 1์ ์ถ๋ ฅํ๊ณ , 1์ ๋ฆฌํดํ๋ค.
+- `fibonacci(3)`์ย `fibonacci(2)`์ย `fibonacci(1)`์ ๊ฒฐ๊ณผ๋ฅผ ์ป๊ณ , 2๋ฅผ ๋ฆฌํดํ๋ค.
+
+1์ 2๋ฒ ์ถ๋ ฅ๋๊ณ , 0์ 1๋ฒ ์ถ๋ ฅ๋๋ค. N์ด ์ฃผ์ด์ก์ ๋,ย `fibonacci(N)`์ ํธ์ถํ์ ๋, 0๊ณผ 1์ด ๊ฐ๊ฐ ๋ช ๋ฒ ์ถ๋ ฅ๋๋์ง ๊ตฌํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
+
+# ์
๋ ฅ
+
+์ฒซ์งธ ์ค์ ํ
์คํธ ์ผ์ด์ค์ ๊ฐ์ T๊ฐ ์ฃผ์ด์ง๋ค.
+
+๊ฐ ํ
์คํธ ์ผ์ด์ค๋ ํ ์ค๋ก ์ด๋ฃจ์ด์ ธ ์๊ณ , N์ด ์ฃผ์ด์ง๋ค. N์ 40๋ณด๋ค ์๊ฑฐ๋ ๊ฐ์ ์์ฐ์ ๋๋ 0์ด๋ค.
+
+# ์ถ๋ ฅ
+
+๊ฐ ํ
์คํธ ์ผ์ด์ค๋ง๋ค 0์ด ์ถ๋ ฅ๋๋ ํ์์ 1์ด ์ถ๋ ฅ๋๋ ํ์๋ฅผ ๊ณต๋ฐฑ์ผ๋ก ๊ตฌ๋ถํด์ ์ถ๋ ฅํ๋ค.
+
+# ํ์ด
+
+๊ฐ ์๋ฅผ ํตํด ํผ๋ณด๋์น ํจ์๋ฅผ ํธ์ถํ์ ๋ 0๊ณผ 1์ด ์ถ๋ ฅ ๋๋ ํ์๋ฅผ ๊ฐ ๋์
๋๋ฆฌ์ memoizationํ์ฌ 0๊ณผ 1์ ์ถ๋ ฅ ํ์๋ฅผ ๊ตฌํ๋ค. ๋จ์ํ ํผ๋ณด๋์น ์๋ฅผ ๊ตฌํ๋ ๊ฒ์ด ์๋๋ผ ๊ฐ์๋ฅผ ๊ตฌํ๋ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ (0์ ํ์, 1์ ํ์)๋ฅผ returnํ๋๋ก ํจ์๋ฅผ ์์ฑํ๋ค.
+
+## ์ฝ๋
+
+```python
+n = int(input())
+
+memo1 = {}
+memo2 = {}
+
+def fib(n):
+ if n == 0:
+ return 1, 0
+ elif n == 1:
+ return 0, 1
+
+ if n in memo1:
+ zero = memo1[n]
+ if n in memo2:
+ one = memo2[n]
+ else:
+ zero1, one1 = fib(n - 1)
+ zero2, one2 = fib(n - 2)
+ zero = zero1 + zero2
+ one = one1 + one2
+ memo1[n] = zero
+ memo2[n] = one
+ return zero, one
+
+for _ in range(n):
+ num = int(input())
+ print(*fib(num), sep=' ')
+```
\ No newline at end of file
diff --git a/_posts/2023-02-04-boj_1005.markdown b/_posts/2023-02-04-boj_1005.markdown
new file mode 100644
index 00000000000..451a73416b8
--- /dev/null
+++ b/_posts/2023-02-04-boj_1005.markdown
@@ -0,0 +1,293 @@
+---
+title: "[BOJ]ACM Craft - 1005 (G3)"
+author: kwon
+date: 2023-02-04T14:00:00 +0900
+categories: [boj, gold]
+tags: [dynamic programing, graph theory, topological sort]
+math: true
+mermaid: false
+---
+
+| ์๊ฐ ์ ํ | ๋ฉ๋ชจ๋ฆฌ ์ ํ |
+| --- | --- |
+| 1 ์ด | 512 MB |
+
+# ๋ฌธ์
+
+์๊ธฐ 2012๋
! ๋๋์ด 2๋
๊ฐ ์๋ง์ ๊ตญ๋ฏผ๋ค์ ๊ธฐ๋ค๋ฆฌ๊ฒย ํ ๊ฒ์ ACM Craft (Association of Construction Manager Craft)๊ฐ ๋ฐ๋งค๋์๋ค.
+
+์ด ๊ฒ์์ ์ง๊ธ๊น์ง ๋์จ ๊ฒ์๋ค๊ณผ๋ ๋ค๋ฅด๊ฒ ACMํฌ๋ํํธ๋ ๋ค์ด๋๋ฏนํ ๊ฒ์ ์งํ์ ์ํด ๊ฑด๋ฌผ์ ์ง๋ ์์๊ฐ ์ ํด์ ธ ์์ง ์๋ค. ์ฆ, ์ฒซ ๋ฒ์งธ ๊ฒ์๊ณผ ๋ ๋ฒ์งธ ๊ฒ์์ด ๊ฑด๋ฌผ์ ์ง๋ ์์๊ฐ ๋ค๋ฅผ ์๋ ์๋ค. ๋งค ๊ฒ์์์ ์ ๊ฑด๋ฌผ์ ์ง๋ ์์๊ฐ ์ฃผ์ด์ง๋ค. ๋ํ ๋ชจ๋ ๊ฑด๋ฌผ์ ๊ฐ๊ฐ ๊ฑด์ค์ ์์ํ์ฌ ์์ฑ์ด ๋ ๋๊น์ง Delay๊ฐ ์กด์ฌํ๋ค.
+
+
+
+์์ ์์๋ฅผ ๋ณด์.
+
+์ด๋ฒ ๊ฒ์์์๋ ๋ค์๊ณผ ๊ฐ์ด ๊ฑด์ค ์์ ๊ท์น์ด ์ฃผ์ด์ก๋ค.ย 1๋ฒ ๊ฑด๋ฌผ์ ๊ฑด์ค์ด ์๋ฃ๋๋ค๋ฉด 2๋ฒ๊ณผ 3๋ฒ์ ๊ฑด์ค์ ์์ํ ์ ์๋ค. (๋์์ ์งํ์ด ๊ฐ๋ฅํ๋ค)ย ๊ทธ๋ฆฌ๊ณ 4๋ฒ ๊ฑด๋ฌผ์ ์ง๊ธฐ ์ํด์๋ 2๋ฒ๊ณผ 3๋ฒ ๊ฑด๋ฌผ์ด ๋ชจ๋ ๊ฑด์ค ์๋ฃ๋์ด์ผ์ง๋ง 4๋ฒ๊ฑด๋ฌผ์ ๊ฑด์ค์ ์์ํ ์ ์๋ค.
+
+๋ฐ๋ผ์ 4๋ฒ๊ฑด๋ฌผ์ ๊ฑด์ค์ ์๋ฃํ๊ธฐ ์ํด์๋ ์ฐ์ ์ฒ์ 1๋ฒ ๊ฑด๋ฌผ์ ๊ฑด์คํ๋๋ฐ 10์ด๊ฐ ์์๋๋ค. ๊ทธ๋ฆฌ๊ณ 2๋ฒ ๊ฑด๋ฌผ๊ณผ 3๋ฒ ๊ฑด๋ฌผ์ ๋์์ ๊ฑด์คํ๊ธฐ ์์ํ๋ฉด 2๋ฒ์ 1์ด๋ค์ ๊ฑด์ค์ด ์๋ฃ๋์ง๋ง ์์ง 3๋ฒ ๊ฑด๋ฌผ์ด ์๋ฃ๋์ง ์์์ผ๋ฏ๋ก 4๋ฒ ๊ฑด๋ฌผ์ ๊ฑด์คํ ์ ์๋ค. 3๋ฒ ๊ฑด๋ฌผ์ด ์์ฑ๋๊ณ ๋๋ฉด ๊ทธ๋ 4๋ฒ ๊ฑด๋ฌผ์ ์ง์์ ์์ผ๋ฏ๋ก 4๋ฒ ๊ฑด๋ฌผ์ด ์์ฑ๋๊ธฐ๊น์ง๋ ์ด 120์ด๊ฐ ์์๋๋ค.
+
+ํ๋ก๊ฒ์ด๋จธ ์ต๋ฐฑ์ค์ ์ ์ธ๊ณผ์ ๋ฐ์ดํธ ๋น์ฉ์ ๋ง๋ จํ๊ธฐ ์ํด ์๊ฐ๋ํ๊ต๋ฐฐ ACMํฌ๋ํํธ ๋ํ์ ์ฐธ๊ฐํ๋ค! ์ต๋ฐฑ์ค์ ํ๋ คํ ์ปจํธ๋กค ์ค๋ ฅ์ ๊ฐ์ง๊ณ ์๊ธฐ ๋๋ฌธ์ ๋ชจ๋ ๊ฒฝ๊ธฐ์์ ํน์ ๊ฑด๋ฌผ๋ง ์ง๋๋ค๋ฉด ๋ฌด์กฐ๊ฑด ๊ฒ์์์ ์ด๊ธธ ์ ์๋ค.ย ๊ทธ๋ฌ๋ ๋งค ๊ฒ์๋ง๋ค ํน์ ๊ฑด๋ฌผ์ ์ง๊ธฐ ์ํ ์์๊ฐ ๋ฌ๋ผ์ง๋ฏ๋ก ์ต๋ฐฑ์ค์ ์ข์ ํ๊ณ ์์๋ค.ย ๋ฐฑ์ค์ด๋ฅผ ์ํด ํน์ ๊ฑด๋ฌผ์ ๊ฐ์ฅ ๋นจ๋ฆฌ ์ง์ ๋๊น์ง ๊ฑธ๋ฆฌ๋ ์ต์์๊ฐ์ ์์๋ด๋ ํ๋ก๊ทธ๋จ์ ์์ฑํด์ฃผ์.
+
+# ์
๋ ฅ
+
+์ฒซ์งธ ์ค์๋ ํ
์คํธ์ผ์ด์ค์ ๊ฐ์ T๊ฐ ์ฃผ์ด์ง๋ค. ๊ฐ ํ
์คํธ ์ผ์ด์ค๋ ๋ค์๊ณผ ๊ฐ์ด ์ฃผ์ด์ง๋ค.ย ์ฒซ์งธ ์ค์ ๊ฑด๋ฌผ์ ๊ฐ์ N๊ณผ ๊ฑด๋ฌผ๊ฐ์ ๊ฑด์ค์์ ๊ท์น์ ์ด ๊ฐ์ K์ด ์ฃผ์ด์ง๋ค.ย (๊ฑด๋ฌผ์ ๋ฒํธ๋ 1๋ฒ๋ถํฐ N๋ฒ๊น์ง ์กด์ฌํ๋ค)
+
+๋์งธ ์ค์๋ ๊ฐ ๊ฑด๋ฌผ๋น ๊ฑด์ค์ ๊ฑธ๋ฆฌ๋ ์๊ฐ D1, D2, ..., DN์ด ๊ณต๋ฐฑ์ ์ฌ์ด๋ก ์ฃผ์ด์ง๋ค.ย ์
์งธ ์ค๋ถํฐ K+2์ค๊น์ง ๊ฑด์ค์์ X Y๊ฐ ์ฃผ์ด์ง๋ค.ย (์ด๋ ๊ฑด๋ฌผ X๋ฅผ ์ง์ ๋ค์์ ๊ฑด๋ฌผ Y๋ฅผ ์ง๋ ๊ฒ์ด ๊ฐ๋ฅํ๋ค๋ ์๋ฏธ์ด๋ค)
+
+๋ง์ง๋ง ์ค์๋ ๋ฐฑ์ค์ด๊ฐ ์น๋ฆฌํ๊ธฐ ์ํด ๊ฑด์คํด์ผย ํ ๊ฑด๋ฌผ์ ๋ฒํธ W๊ฐ ์ฃผ์ด์ง๋ค.
+
+# ์ถ๋ ฅ
+
+๊ฑด๋ฌผ W๋ฅผ ๊ฑด์ค์๋ฃ ํ๋๋ฐ ๋๋ ์ต์ ์๊ฐ์ ์ถ๋ ฅํ๋ค.ย ํธ์์ ๊ฑด๋ฌผ์ ์ง๋ ๋ช
๋ น์ ๋ด๋ฆฌ๋ ๋ฐ๋ ์๊ฐ์ด ์์๋์ง ์๋๋ค๊ณ ๊ฐ์ ํ๋ค.
+
+๊ฑด์ค์์๋ ๋ชจ๋ ๊ฑด๋ฌผ์ด ๊ฑด์ค ๊ฐ๋ฅํ๋๋ก ์ฃผ์ด์ง๋ค.
+
+# ํ์ด
+
+## ์ฒซ ์ ๊ทผ
+
+์ฒ์ ๋ฌธ์ ๋ฅผ ๋ดค์ ๋๋ ๊ทธ๋ํ ๊ตฌ์กฐ ๋ฌธ์ ์ด๊ณ , BFS๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์ ๊ทผํด์ผ๊ฒ ๋ค๊ณ ์๊ฐํ๋ค. DFS๋ก ์ ๊ทผํ๋ฉด ๋ชฉํํ ๊ฑด๋ฌผ์ด ์๋ ๊ธธ์ด ๋๋ฌด ๊น๋ค๋ฉด ์๊ฐ ๋ณต์ก๋๊ฐ ๋๋ฌด ์ฆ๊ฐํ ๊ฒ์ด๋ผ๊ณ ์๊ฐํ๋ค. ๋ํ ํ ๊ฑด๋ฌผ๋ก ๊ฐ๋ ๊ธธ์ด ์ฌ๋ฌ ๊ฐ์ด๋ฉฐ, ๋ชฉํ ๊ฑด๋ฌผ์ ๋๋ฌํ๋ ๊ธธ์ ๋ชจ๋ ํ์ํ์ผ๋ฉด ๋ ๊น๊ฒ ํ์ํ ํ์๊ฐ ์๊ธฐ ๋๋ฌธ์ DFS๋ ๋งค์ฐ ๋ถ๋ฆฌํ ๊ฒ์ด๋ผ ์๊ฐํ๋ค.
+
+๋ฌธ์ ์์๋ ์ด๋ค ๊ฑด๋ฌผ๋ก ๊ฑด์ถ์ ์์ํด์ผ ํ๋์ง ์ ํํ ๋ช
์ํ์ง ์๊ณ ์๋ค. ๊ทธ๋์ ์ฝ๋ ๋ด์์ ์ด๋ฅผ ํด๊ฒฐํด ์ฃผ์ด์ผ ํ๋ค. ์ด๋ค ๊ฑด๋ฌผ์ด ์ฒ์์ผ๋ก ์ง์ด์ง ์ ์๋ค๋ ๊ฒ์ ๊ทธ ๊ฑด๋ฌผ์ ์ง๊ธฐ ์ ์ ๋ค๋ฅธ ๊ฑด๋ฌผ๋ค์ ์ง์ ํ์๊ฐ ์๋ค๋ ๋ป์ด๋ฉฐ ์ด๋ ๊ฑด์ค ์์๋ฅผ ์
๋ ฅ ๋ฐ์ ๋ Y๋ก ์
๋ ฅ๋์ง ์์๋ ๊ฐ์ด๋ค. Y๋ก ํ ๋ฒ์ด๋ผ๋ ์
๋ ฅ๋ ๊ฐ์ ์ ์ด๋ ํ๋ ์ด์์ ๊ฑด๋ฌผ์ ์ง์ด์ผ ๊ทธ ๊ฑด๋ฌผ์ ์ง์ ์ ์๋ค๋ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ด๋ค. ์ฒ์ ์์ํ๋ ๊ฑด๋ฌผ๋ค์ ๋ค์๊ณผ ๊ฐ์ด ์ฐพ์๋ผ ์ ์๋ค.
+
+```python
+ ...
+ first_val = list(range(1, n + 1))
+ for i in range(k):
+ x, y = map(int, input().split())
+ xy_dict[x].append(y)
+ ...
+ try: first_val.remove(y)
+ except: pass
+ ...
+```
+
+๋ชจ๋ ๊ฑด๋ฌผ ๋ฒํธ๊ฐ ๋ค์ด๊ฐ ์๋ ๋ฐฐ์ด์์ Y๋ก ์
๋ ฅ๋ ๊ฐ๋ค๋ง ์ญ์ ํ๋ค. ์ดํ ํ์ํ๋ฉด์ `time`๋์
๋๋ฆฌ์ ๊ฑด๋ฌผ ๋ฒํธ : ์ง๋๋ฐ ๊ฑธ๋ฆฌ๋ ์๊ฐ์ key : vlaue๋ก ์ ์ฅํด์ค๋ค. ์๊ฐ์ ์ ์ฅํ ๋๋ ์ฌ๋ฌ ๊ฑด๋ฌผ์ ๋์์ ์ง์ ์ ์๊ธฐ ๋๋ฌธ์ ํ์ํ๋ฉด์ ๊ณ์ฐํ ์๊ฐ๋ค ์ค์ ๊ฐ์ฅ ํฐ ๊ฒ๋ง ์ ์ฅํ๋ฉด ๋๋ค. ์ฝ๋๋ ๋ค์๊ณผ ๊ฐ๋ค.
+
+```python
+ ...
+ for k in keys:
+ tmp = []
+ for v in xy_dict[k]:
+ ...
+ if v not in times:
+ times[v] = times[k] + d_list[v - 1]
+ else:
+ times[v] = max(times[k] + d_list[v - 1], times[v])
+ ...
+```
+
+ํ์ํ๋ฉด์ ๋์จ ๊ฑด๋ฌผ๋ค(`v`)์ ๋ค์ queue์ ๋ฃ์ด์ฃผ๋ฉด์ BFS๋ฅผ ์งํํ๋ค.
+
+๋ค๋ง, ๋ชฉํ ๊ฑด๋ฌผ์ด Y๋ก ํ ๋ฒ๋ ๋ฑ์ฅํ์ง ์์๋ค๋ฉด ํ์ ๊ฑด๋ฌผ์ด ์๋ค๋ ๊ฒ์ด๋ฏ๋ก ๋ฐ๋ก ๋ชฉํ ๊ฑด๋ฌผ์ ๊ฑด์ถ ์๊ฐ์ ์ถ๋ ฅํ๋ค.
+
+```python
+ ...
+ if counts[target] != 0:
+ print(bfs(xy_dict, d_list, first_val, target, counts[target]))
+ else:
+ print(d_list[target - 1])
+```
+
+ํ์ง๋ง ์ด๋ ๊ฒ ์ฒ๋ฆฌ๋ฅผ ํ๊ณ BFS ๊ธฐ๋ฐ์ผ๋ก๋ง ํ์ด๋๊ฐ๋ฉด ๋ชจ๋ ๊ฒฝ์ฐ๋ค์ ์ฒ๋ฆฌํ๊ธฐ ์ฝ์ง ์๋ค. ๋ค์ ์์ ๋ฅผ ๋ณด์.
+
+```
+1
+5 10
+100000 99999 99997 99994 99990
+4 5
+3 5
+3 4
+2 5
+2 4
+2 3
+1 5
+1 4
+1 3
+1 2
+4
+```
+
+์
๋ ฅ๋๋ ์์๋ฅผ ๋ณ๊ฒฝํ์ง ์๊ณ ๋จ์ํ๊ฒ ํ์์ ์งํํ๋ฉด 2, 3 ๋ฒ ๊ฑด๋ฌผ์ ํ์์ด ๋๋๊ธฐ ์ ์ 4๋ฒ์ ํ์์ด ์๋ฃ๋์ด ๋ฒ๋ ค ์ค๋ต์ด ์ถ๋ ฅ ๋๋ค.
+
+### ์ฒซ ์ ๊ทผ ์ ์ฒด ์ฝ๋
+
+```python
+import sys
+from collections import defaultdict
+input = sys.stdin.readline
+
+def bfs(xy_dict, d_list, first_val, target, target_num):
+ first_idx = 0
+ q = []
+ times = {}
+ times[first_val[0]] = d_list[first_val[0] - 1]
+ keys = [first_val[0]]
+ while True:
+ if q:
+ keys = q.pop(0)
+ for k in keys:
+ tmp = []
+ for v in xy_dict[k]:
+ if target == v: target_num -= 1
+ tmp.append(v)
+ if v not in times:
+ times[v] = times[k] + d_list[v - 1]
+ else:
+ times[v] = max(times[k] + d_list[v - 1], times[v])
+ q.append(tmp)
+ if target_num == 0:
+ return times[target]
+ if not q:
+ first_idx += 1
+ next = first_val[first_idx]
+ times[next] = d_list[next - 1]
+ keys = [next]
+
+t = int(input())
+for _ in range(t):
+ n, k = map(int, input().split())
+ xy_dict = defaultdict(list)
+ d_list = list(map(int, input().split()))
+
+ counts = {i:0 for i in range(1, n + 1)}
+ first_val = list(range(1, n + 1))
+ for i in range(k):
+ x, y = map(int, input().split())
+ xy_dict[x].append(y)
+ counts[y] += 1
+ try: first_val.remove(y)
+ except: pass
+ target = int(input())
+ for x in xy_dict:
+ xy_dict[x].sort(key=lambda x: counts[x])
+ if counts[target] != 0:
+ print(bfs(xy_dict, d_list, first_val, target, counts[target]))
+ else:
+ print(d_list[target - 1])
+```
+
+## ๋ค๋ฅธ ์ ๊ทผ
+
+๋ค๋ฅธ ๋ฐฉ์์ ์ ๊ทผ์ด ํ์ํ๋ค ์๊ฐํ์ฌ ์์๋ฅผ ์ ํ๋ ์ฃผ์ํ ์์ธ์ด ๋ฌด์์ผ๊น ์๊ฐํด ๋ดค๋ค. ์ ๋ฐฉ์์์ ๋ฌธ์ ๊ฐ ๋๋ ๊ฒ์ ๋จผ์ ์ง์ด์ ธ์ผ ํ ๊ฑด๋ฌผ์ ํ์์ด ๋๋๊ธฐ ์ ์ ๋ค์ ๋จ๊ณ์ ๊ฑด๋ฌผ์ ํ์ํ๊ธฐ ์์ํ๋ค๋ ๊ฒ์ด๋ค. ์ด๋ ๊ฑด๋ฌผ๋ค์ ์์๋ ํด๋น ๊ฑด๋ฌผ์ ์ง๊ธฐ ์ํด ๋จผ์ ์ง์ด์ผ ํ๋ ๊ฑด๋ฌผ๋ค์ ๊ฐ์๋ก ์ ์ํ ์ ์๋ค.
+
+```
+1
+5 10
+100000 99999 99997 99994 99990
+4 5
+3 5
+3 4
+2 5
+2 4
+2 3
+1 5
+1 4
+1 3
+1 2
+4
+```
+
+์์์ ๋ดค๋ ์์ ๋ฅผ ๋ค์ ๋ณด๋ฉด์ ์๊ฐํด๋ณด์.
+
+๊ฐ ๊ฑด๋ฌผ๋ค์ ์ง๊ธฐ ์ํด ํ์ํ ๊ฑด๋ฌผ๋ค์ ๊ฐ์๋ฅผ ๋ํ๋ด๋ณด๋ฉด ๋ค์๊ณผ ๊ฐ๋ค.
+
+| ๊ฑด๋ฌผ ๋ฒํธ | 1 | 2 | 3 | 4 | 5 |
+| --- | --- | --- | --- | --- | --- |
+| ํ์ ๊ฑด๋ฌผ | 0 | 1 | 2 | 3 | 4 |
+
+ํ์ ๊ฑด๋ฌผ์ด ๋ง์์๋ก ๋ค์ ํ์ํ๋ฉด ์์์ ๋งํ๋ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์๋ค.
+
+ํ์์ ํ ๊ฑด๋ฌผ์ ํญ์ ํ์ ๊ฑด๋ฌผ์ด 0์ธ ๊ฒ๋ค๋ก๋ง ๊ตฌ์ฑํ ๊ฒ์ด๋ค. ์ด๋ฅผ ์ด๋ป๊ฒ ํ๋์ง ํ์ ๊ณผ์ ์ ์ธ์ธํ๊ฒ ํ์ธํด ๋ณด์. ํ์ฌ ๊ฑด๋ฌผ๋ค์ ๊ด๊ณ๋ฅผ ๊ทธ๋ํ๋ก ๋ํ๋ด๋ฉด ๋ค์๊ณผ ๊ฐ๋ค.
+
+
+
+| ๊ฑด๋ฌผ ๋ฒํธ | 1 | 2 | 3 | 4 | 5 |
+| --- | --- | --- | --- | --- | --- |
+| ํ์ ๊ฑด๋ฌผ | 0 | 1 | 2 | 3 | 4 |
+
+queue: 1
+
+ํ์ ์๋ฃ:
+
+์ฒ์์๋ ํ์ ๊ฑด๋ฌผ์ด 0์ธ ๊ฒฝ์ฐ๊ฐ 1 ๋ฐ์ ์์ผ๋ฏ๋ก queue์ 1์ ๋ฃ์ด์ค๋ค.
+
+| ๊ฑด๋ฌผ ๋ฒํธ | 1 | 2 | 3 | 4 | 5 |
+| --- | --- | --- | --- | --- | --- |
+| ํ์ ๊ฑด๋ฌผ | 0 | 0 | 1 | 2 | 3 |
+
+queue: 2
+
+ํ์ ์๋ฃ: 1
+
+1์ 2, 3, 4, 5์ ์ฐ๊ฒฐ๋์ด ์์ผ๋ฏ๋ก 1์ ํ์์ด ๋๋๋ฉด(๋ค ์ง์ด์ง๋ฉด) 2, 3, 4, 5์ ํ์ ๊ฑด๋ฌผ์ ํ๋์ฉ ์ค์ผ ์ ์๋ค. ํ์ ๊ฑด๋ฌผ์ ์ค์ธ ํ์ ํ์์ด ๊ฐ๋ฅํ ๊ฑด๋ฌผ์ 2๋ฒ์ด๋ค(ํ์ ๊ฑด๋ฌผ์ด 0์ด ๋์๊ธฐ ๋๋ฌธ). ์ด๋ฐ ๋ฐฉ์์ผ๋ก ๊ณ์ ํ์ํ๋ค.
+
+| ๊ฑด๋ฌผ ๋ฒํธ | 1 | 2 | 3 | 4 | 5 |
+| --- | --- | --- | --- | --- | --- |
+| ํ์ ๊ฑด๋ฌผ | 0 | 0 | 0 | 1 | 2 |
+
+queue: 3
+
+ํ์ ์๋ฃ: 1, 2
+
+| ๊ฑด๋ฌผ ๋ฒํธ | 1 | 2 | 3 | 4 | 5 |
+| --- | --- | --- | --- | --- | --- |
+| ํ์ ๊ฑด๋ฌผ | 0 | 0 | 0 | 0 | 1 |
+
+queue: 4
+
+ํ์ ์๋ฃ: 1, 2, 3
+
+์ด๋ ๊ฒ ๋ชฉํ ๊ฑด๋ฌผ์ด 4๋ฒ์ด queue์ ๋ค์ด์ ํ์์ ๋ง์น๋ฉด 4๋ฒ ๊ฑด๋ฌผ์ ์ง์๋ค๋ ๊ฒ์ด๋ฏ๋ก ํ์์ ๋ฉ์ถ๊ณ ์ ์ฅํด๋์๋ ์๊ฐ์ ์ถ๋ ฅํ๋ฉด ๋๋ค.
+
+์ด ๋ฌธ์ ์ ์
๋ ฅ์ผ๋ก ์ฃผ์ด์ง๋ ๊ฑด๋ฌผ๋ค๋ก ๋ง๋ค์ด์ง ๊ทธ๋ํ๋ ํญ์ ๋ฐฉํฅ์ฑ์ ๊ฐ์ง๋ฉฐ, ํญ์ ๋ชจ๋ ๊ฑด๋ฌผ์ด ๊ฑด์ถ ๊ฐ๋ฅํ๋๋ก ์ฃผ์ด์ง๋ค๊ณ ํ๊ธฐ ๋๋ฌธ์ acyclic์ด๋ค. ์ฆ ์ด ๋ฌธ์ ์ ๊ทธ๋ํ๋ DAG(Directed Acyclic Graph)์ด๋ค. DAG์์ ์ด๋ค ๋
ธ๋๋ก ๋ค์ด์ค๋ ๊ฐ์ ์ ๊ฐ์๋ฅผ indegree๋ผ๊ณ ํ๋๋ฐ ์ด indegree์ ๊ฐ์์ ๋ฐ๋ผ ์ ๋ ฌํ๋ ๊ฒ์ ์์ ์ ๋ ฌ(topologicla sort)์ด๋ผ๊ณ ํ๋ค.
+
+๋ฐ๋ผ์ ์ฐ๋ฆฌ๊ฐ ์์์ ํ์ ๊ฑด๋ฌผ(indegree)์ ๋ฐ๋ผ ์ ๋ ฌํ์ฌ ์๊ฐ์ ๊ณ์ฐํ ๊ฒ์ ์์ ์ ๋ ฌ์ ์ด์ฉํ ์๊ณ ๋ฆฌ์ฆ์ธ ๊ฒ์ด๋ค.
+
+### ์ต์ข
์ ์ฒด ์ฝ๋
+
+```python
+import sys
+from collections import defaultdict
+input = sys.stdin.readline
+
+def topological_sort(xy_dict, d_list, first_val, counts, target):
+ times = {val:d_list[val - 1] for val in first_val}
+ q = first_val
+
+ while q:
+ cur = q.pop(0)
+ if cur == target: return times[target]
+ for next in xy_dict[cur]:
+ if next not in times:
+ times[next] = times[cur] + d_list[next - 1]
+ else:
+ times[next] = max(times[cur] + d_list[next - 1], times[next])
+ counts[next] -= 1
+ tmp = list(counts.keys())[:]
+ for i in tmp:
+ if counts[i] == 0:
+ q.append(i)
+ del counts[i]
+
+t = int(input())
+for _ in range(t):
+ n, k = map(int, input().split())
+ xy_dict = defaultdict(list)
+ d_list = list(map(int, input().split()))
+
+ counts = defaultdict(int)
+ first_val = list(range(1, n + 1))
+ for i in range(k):
+ x, y = map(int, input().split())
+ xy_dict[x].append(y)
+ counts[y] += 1
+ try: first_val.remove(y)
+ except: pass
+ target = int(input())
+
+ if target in counts:
+ print(topological_sort(xy_dict, d_list, first_val, counts, target))
+ else:
+ print(d_list[target - 1])
+```
\ No newline at end of file
diff --git a/_posts/2023-02-04-boj_1074.markdown b/_posts/2023-02-04-boj_1074.markdown
new file mode 100644
index 00000000000..fe99691b7e3
--- /dev/null
+++ b/_posts/2023-02-04-boj_1074.markdown
@@ -0,0 +1,111 @@
+---
+title: "[BOJ]Z - 1074 (S1)"
+author: kwon
+date: 2022-03-10T14:00:00 +0900
+categories: [boj, silver]
+tags: [divide and conquer, recursion]
+math: true
+mermaid: false
+---
+
+| ์๊ฐ ์ ํ | ๋ฉ๋ชจ๋ฆฌ ์ ํ |
+| --- | --- |
+| 0.5 ์ด | 512 MB |
+
+tag: divide and conquer, recursion
+
+# ๋ฌธ์
+
+ํ์๋ ํฌ๊ธฐ๊ฐ $2^Nร2^N$์ธ 2์ฐจ์ ๋ฐฐ์ด์ Z๋ชจ์์ผ๋ก ํ์ํ๋ ค๊ณ ํ๋ค. ์๋ฅผ ๋ค์ด, 2ร2๋ฐฐ์ด์ ์ผ์ชฝ ์์นธ, ์ค๋ฅธ์ชฝ ์์นธ, ์ผ์ชฝ ์๋์นธ, ์ค๋ฅธ์ชฝ ์๋์นธ ์์๋๋ก ๋ฐฉ๋ฌธํ๋ฉด Z๋ชจ์์ด๋ค.
+
+
+
+N > 1์ธ ๊ฒฝ์ฐ, ๋ฐฐ์ด์ ํฌ๊ธฐ๊ฐ $2^{N-1}ร2^{N-1}$๋ก 4๋ฑ๋ถ ํ ํ์ ์ฌ๊ท์ ์ผ๋ก ์์๋๋ก ๋ฐฉ๋ฌธํ๋ค.
+
+๋ค์ ์๋ 22ย ร 2ย ํฌ๊ธฐ์ ๋ฐฐ์ด์ ๋ฐฉ๋ฌธํ ์์์ด๋ค.
+
+
+
+N์ด ์ฃผ์ด์ก์ ๋, rํ c์ด์ ๋ช ๋ฒ์งธ๋ก ๋ฐฉ๋ฌธํ๋์ง ์ถ๋ ฅํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
+
+๋ค์์ N=3์ผ ๋์ ์์ด๋ค.
+
+
+
+# ์
๋ ฅ
+
+์ฒซ์งธ ์ค์ ์ ์ N, r, c๊ฐ ์ฃผ์ด์ง๋ค.
+
+# ์ถ๋ ฅ
+
+rํ c์ด์ ๋ช ๋ฒ์งธ๋ก ๋ฐฉ๋ฌธํ๋์ง ์ถ๋ ฅํ๋ค.
+
+# ์ ํ
+
+- $1โคNโค15$
+- $0โคr,c<2^N$
+
+# ํ์ด
+
+์์ ํฌ๊ธฐ ์ ํ์ด $2^{15}$์ธ ๋งํผ ๋ชจ๋ ์ฌ๊ท๋ก ํ์ํ๋ ๊ฒ์ ์ ํ ์๊ฐ์ ๋ง์ถ์ง ๋ชปํ๋ค. ๋ณดํต 1์ด์ ์ฝ $10^8$๋ฒ์ ์ฐ์ฐ์ ํ๋ค๊ณ ์๊ฐํ๋ฏ๋ก O(N)์ผ๋ก๋ ํด๊ฒฐํ ์ ์์ด์ง๋ค.
+
+๊ทธ๋ฌ๋ฏ๋ก ์ฃผ์ด์ง x, y๊ฐ ์๋ ์์ญ์ผ๋ก ๋น ๋ฅด๊ฒ ๋ค๊ฐ๊ฐ ์ ์๋ ๋ค๋ฅธ ๋ฐฉ๋ฒ์ ์ฐพ์์ผ ํ๋ค. ํ๋์ ํฐ Z๋ ์ด๋ฅผ ์ฌ๋ฑ๋ถํ์ฌ ์์ Z๋ฅผ ๋ง๋ค ์ ์๋ค. ์ด๋ฅผ ํ์ฉํ์ฌ ์ฃผ์ด์ง x, y๊ฐ ํด๋น ์์ญ์ ๊ฐ ๋ณ์ ์ง๊ฐ ์ด๋ฑ๋ถ ํ๋ ์ง์ ์ ๊ธฐ์ค์ผ๋ก ํฐ์ง ์์์ง ํ์ธํ๋ฉด 4๊ฐ์ ์์ ์์ญ ์ค์ ์ด๋ ์ํด์๋์ง ์ ์ ์๋ค. 2์ฐจ์์์ ์งํํ๋ ์ผ์ข
์ ์ด๋ถ ํ์์ด๋ผ๊ณ ํ ์๋ ์๊ฒ ๋ค.
+
+x, y๊ฐ ์ด๋ ์์ญ์ ์ํ๋์ง ํ์ธํ๋ ์ฝ๋๋ ๋ค์๊ณผ ๊ฐ์ด ์์ฑํ์๋ค. ๋ค์ ๋ฐ๋ผ์ค๋ ๊ทธ๋ฆผ๊ณผ ํจ๊ป ๋ณด์.
+
+```python
+...
+ num = 2 ** (N - 1)
+ # ์ข์๋จ
+ if x <= num and y <= num:
+ position(N-1, x, y, base)
+
+ # ์ฐ์๋จ
+ elif x > num and y <= num:
+ position(N-1, x - num, y, 4 ** (N - 1) + base)
+
+ # ์ขํ๋จ
+ elif x <= num and y > num:
+ position(N-1, x, y - num, 2 * 4 ** (N - 1) + base)
+
+ # ์ฐํ๋จ
+ elif x > num and y > num:
+ position(N-1, x - num, y - num, 3 * 4 ** (N - 1) + base)
+```
+
+
+
+์์ ๊ฐ์ด ํ ๋ณ์ด $2^n$์ธ ์์ญ์ด ์ฃผ์ด์ก์ ๋ ๊ฐ ๋ณ์ ์ง๊ฐ ์ด๋ฑ๋ถ ํ๋ ์ ์ ๊ฐ์ฅ ์ข์๋จ์ ๊ผญ์ง์ ์์ $2^n/2(=2^{n-1})$ ๋งํผ ๋จ์ด์ ธ ์๋ ๊ฒ์ ํ์ธํ ์ ์๋ค. ๊ทธ๋ฌ๋ฏ๋ก x, y๊ฐ $2^{n-1}$๋ณด๋ค ํฐ์ง ์์์ง ํ์ธํ๋ฉด ๋ค ๊ฐ์ ์์ญ ์ค ์ด๋์ ์ํด์๋์ง ์ ์ ์๋ค. ๋จ ์ฌ๊ธฐ์ x๋ ์ปค์ง์๋ก ์ค๋ฅธ์ชฝ, y๋ ์ปค์ง์๋ก ์๋๋ก ์งํํ๋ค๊ณ ์๊ฐํด์ผ ํ๋ค.
+
+base๋ ๋ง ๊ทธ๋๋ก ์ง๊ธ ํ์ธํ๋ ค ํ๋ ์์ญ์ ๊ธฐ์ค ์นธ์ ๋ปํ๋ ๊ฒ์ผ๋ก ๊ฐ์ฅ ์ข์๋จ์ ์์นํ๋ ์นธ์ ๋ปํ๋ค. ๊ทธ๋ฆฌ๊ณ ์ด base๋ ์ํ๋ ์ ์ด ์ด๋ ์์ญ์ ์ํ๋ ์ง์ ๋ฐ๋ผ ๊ณ์ ๋ฐ๋์ด์ผ ํ๋ค. ์ฆ, ๊ฐ ์์ญ์ ๋ฐ๋ผ ๋
ธ๋์์ผ๋ก ์น ํ ์นธ์ด ๋ค์ ์์ญ์ base๊ฐ ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ด base๋ Z ์์์ ๋ฐ๋ผ $base+0,base+(4^{n-1}),base+(2\times4^{n-1}),base+(3\times4^{n-1})$๋ก ๊ณ์ฐํ ์ ์๋ค. ์ด๋ ์์ ์์ญ์ ์ํ ์นธ์ ๊ฐ์๊ฐ $2^{n-1}\times2^{n-1}(=4^{n-1})$์ด๊ธฐ ๋๋ฌธ์ด๋ค.
+
+## ์ฝ๋
+
+```python
+import sys
+N, y, x = map(int, sys.stdin.readline().split())
+
+def position(N, x, y, base=0):
+ if N == 0 or (x <= 1 and y <= 1):
+ print(base)
+ return base
+
+ num = 2 ** (N - 1)
+ if x <= num and y <= num:
+ position(N-1, x, y, base)
+
+ elif x > num and y <= num:
+ position(N-1, x - num, y, 4 ** (N - 1) + base)
+
+ elif x <= num and y > num:
+ position(N-1, x, y - num, 2 * 4 ** (N - 1) + base)
+
+ elif x > num and y > num:
+ position(N-1, x - num, y - num, 3 * 4 ** (N - 1) + base)
+
+position(N, x + 1, y + 1)
+```
+
+์์์ ์ค๋ช
ํ ์๊ณ ๋ฆฌ์ฆ์ ๋ฐ๋ผ ๊ณ์ ์งํํ๋ค. ๋ค๋ง, ์ค๋ช
ํ ๋๋ x, y๊ฐ์ด ๋ณํ์ง ์๋ ๊ฒ์ผ๋ก ์๊ฐํ๊ณ ์งํํ์ง๋ง ํธ์๋ฅผ ์ํด x, y ์ค ๋ณํ๋ ์ขํ์ $2^{n-1}$๋ฅผ ๋นผ๋ฉฐ ์งํํ์๋ค. ํ์ ์๋ ์์ญ์ ์๋ผ๋ด๋ฉด์ ์งํํ๋ค๊ณ ์๊ฐํ๋ฉด ๋๋ค. x, y์ ๊ฐ์ด ์ค์ ์ ๋ฌ๋ผ์ ธ๋ base์ ๊ฐ๋ง ์๋ง๊ฒ ๊ณ์ฐํ๋ฉด ์ ๋ต์ ์ฐพ์๋ผ ์ ์๋ค.
+
+N์ด 0์ด ๋๊ฑฐ๋ x, y๊ฐ ๋ชจ๋ 1 ์ดํ์ด๋ฉด ์ฐพ์ผ๋ ค๋ ์นธ์ ๋๋ฌํ๋ค๋ ๋ป์ด๋ฏ๋ก ๋ต์ ์ถ๋ ฅํ๊ณ ์ค์งํ๋ค.
\ No newline at end of file
diff --git a/_posts/2023-12-05-boj_1157.markdown b/_posts/2023-12-05-boj_1157.markdown
new file mode 100644
index 00000000000..e016d05641c
--- /dev/null
+++ b/_posts/2023-12-05-boj_1157.markdown
@@ -0,0 +1,58 @@
+---
+title: "[BOJ]๋จ์ด ๊ณต๋ถ - 1157 (B1)"
+author: kwon
+date: 2023-12-05T14:00:00 +0900
+categories: [boj, bronze]
+tags: [implementation, string]
+math: true
+mermaid: false
+---
+
+| ์๊ฐ ์ ํ | ๋ฉ๋ชจ๋ฆฌ ์ ํ |
+| --- | --- |
+| 2 ์ด | 128 MB |
+
+# ๋ฌธ์
+
+์ํ๋ฒณ ๋์๋ฌธ์๋ก ๋ ๋จ์ด๊ฐ ์ฃผ์ด์ง๋ฉด, ์ด ๋จ์ด์์ ๊ฐ์ฅ ๋ง์ด ์ฌ์ฉ๋ ์ํ๋ฒณ์ด ๋ฌด์์ธ์ง ์์๋ด๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค. ๋จ, ๋๋ฌธ์์ ์๋ฌธ์๋ฅผ ๊ตฌ๋ถํ์ง ์๋๋ค.
+
+# ์
๋ ฅ
+
+์ฒซ์งธ ์ค์ ์ํ๋ฒณ ๋์๋ฌธ์๋ก ์ด๋ฃจ์ด์ง ๋จ์ด๊ฐ ์ฃผ์ด์ง๋ค. ์ฃผ์ด์ง๋ ๋จ์ด์ ๊ธธ์ด๋ 1,000,000์ ๋์ง ์๋๋ค.
+
+# ์ถ๋ ฅ
+
+์ฒซ์งธ ์ค์ ์ด ๋จ์ด์์ ๊ฐ์ฅ ๋ง์ด ์ฌ์ฉ๋ ์ํ๋ฒณ์ ๋๋ฌธ์๋ก ์ถ๋ ฅํ๋ค. ๋จ, ๊ฐ์ฅ ๋ง์ด ์ฌ์ฉ๋ ์ํ๋ฒณ์ด ์ฌ๋ฌ ๊ฐ ์กด์ฌํ๋ ๊ฒฝ์ฐ์๋ ?๋ฅผ ์ถ๋ ฅํ๋ค.
+
+# ํ์ด
+
+dictionary๋ฅผ ์ฌ์ฉํ์ฌ ๋ฑ์ฅํ๋ ์ํ๋ฒณ์ ๊ฐ์๋ฅผ ์ธ์ด์ค๋ค. ๊ทธ๋ฆฌ๊ณ ํด๋น ์ํ๋ฒณ์ ๊ฐ์๊ฐ ์ ์ฅ๋ ์ต๋ ๊ฐ์๋ณด๋ค ๋ง์ผ๋ฉด ๊ทธ ์ํ๋ฒณ๊ณผ ๊ทธ ๊ฐ์๋ฅผ ์ ์ฅํ๋ค. ๋ง์ฝ ์ํ๋ฒณ์ ๊ฐ์๊ฐ ์ ์ฅ๋ ์ต๋ ๊ฐ์์ ์ ํํ ๊ฐ๋ค๋ฉด ๊ฐ์ฅ ๋ง์ด ์ฌ์ฉ๋ ์ํ๋ฒณ์ด ๊ทธ ์๊ฐ์ ์ฌ๋ฌ ๊ฐ ์กด์ฌํ๋ค๋ ๊ฒ์ด๋ฏ๋ก ๋ณ์(`same_chk`)๋ฅผ ํตํด ์ฒดํฌํด์ค๋ค.
+
+๋ง์ฝ ์ฒดํฌ ๋์ด ์๋ค๋ฉด โ?โ๋ฅผ, ์๋๋ฉด ์ ์ฅ๋์ด ์๋ ์ต๋ ๊ฐ์์ ์ํ๋ฒณ์ ์ถ๋ ฅํ๋ค.
+
+## ์ฝ๋
+
+```python
+from collections import defaultdict
+word = input().upper()
+
+counter = defaultdict(int)
+
+max_cnt = 0
+max_alpha = ''
+same_chk = False
+
+for a in word:
+ counter[a] += 1
+ if counter[a] > max_cnt:
+ max_cnt = counter[a]
+ max_alpha = a
+ same_chk = False
+ elif counter[a] == max_cnt:
+ same_chk = True
+
+if same_chk:
+ print('?')
+else:
+ print(max_alpha)
+```
\ No newline at end of file
diff --git a/_posts/2024-07-31-swea_5215.markdown b/_posts/2024-07-31-swea_5215.markdown
new file mode 100644
index 00000000000..2eaf5f91124
--- /dev/null
+++ b/_posts/2024-07-31-swea_5215.markdown
@@ -0,0 +1,198 @@
+---
+title: "[SWEA]ํ๋ฒ๊ฑฐ ๋ค์ด์ดํธ - 5215 (D3)"
+author: kwon
+date: 2024-07-31T14:00:00 +0900
+categories: [swea, d3]
+tags: [dfs, greedy algorithm]
+math: true
+mermaid: false
+---
+
+| ์๊ฐ ์ ํ | ๋ฉ๋ชจ๋ฆฌ ์ ํ |
+| --- | --- |
+| 16 ์ด | ํ ์ ์ ๋ฉ๋ชจ๋ฆฌ: 256 MB / ์คํ ๋ฉ๋ชจ๋ฆฌ 1MB |
+
+# ๋ฌธ์
+
+
+ํ์ ํ๋ฒ๊ฑฐ๋ฅผ ์ข์ํ๋ ๋ฏผ๊ธฐ๋ ์ต๊ทผ ๋ถ์ฉ ๋์ด๋ ์ด ๋๋ฌธ์ ๊ฑฑ์ ์ด ๋ง๋ค.
+
+๊ทธ๋ ๋ค๊ณ ํ๋ฒ๊ฑฐ๋ฅผ ํฌ๊ธฐํ ์ ์์๋ ๋ฏผ๊ธฐ๋ ํ๋ฒ๊ฑฐ์ ๋ง์ ์ต๋ํ ์ ์งํ๋ฉด์ ์ ํด์ง ์นผ๋ก๋ฆฌ๋ฅผ ๋์ง ์๋ ํ๋ฒ๊ฑฐ๋ฅผ ์ฃผ๋ฌธํ์ฌ ๋จน์ผ๋ ค๊ณ ํ๋ค.
+
+
+๋ฏผ๊ธฐ๊ฐ ์ฃผ๋ก ์ด์ฉํ๋ ํ๋ฒ๊ฑฐ ๊ฐ๊ฒ์์๋ ๊ณ ๊ฐ์ด ์ํ๋ ์กฐํฉ์ผ๋ก ํ๋ฒ๊ฑฐ๋ฅผ ๋ง๋ค์ด์ ์ค๋ค.
+
+ํ์ง๋ง ์ฌ๋ฃ๋ ๋ฏธ๋ฆฌ ๋ง๋ค์ด์ ์ค๋นํด๋๊ธฐ ๋๋ฌธ์ ์กฐํฉ์ ๋ค์ด๊ฐ๋ ์ฌ๋ฃ๋ฅผ ์๋ผ์ ์กฐํฉํด์ฃผ์ง๋ ์๊ณ , ์ฌ๋ฃ๋ฅผ ์ ํํ๋ฉด ์ค๋นํด๋์ ์ฌ๋ฃ๋ฅผ ๊ทธ๋๋ก ์ฌ์ฉํ์ฌ ์กฐํฉํด์ค๋ค.
+
+๋ฏผ๊ธฐ๋ ์ด ๊ฐ๊ฒ์์ ์์ ์ด ๋จน์๋ ํ๋ฒ๊ฑฐ์ ์ฌ๋ฃ์ ๋ํ ๋ง์ ์์ ์ ์ค๋ ๊ฒฝํ์ ํตํด ์ ์๋ฅผ ๋งค๊ฒจ๋์๋ค.
+
+๋ฏผ๊ธฐ์ ํ๋ฒ๊ฑฐ ์ฌ๋ฃ์ ๋ํ ์ ์์ ๊ฐ๊ฒ์์ ์ ๊ณตํ๋ ์ฌ๋ฃ์ ๋ํ ์นผ๋ก๋ฆฌ๊ฐ ์ฃผ์ด์ก์ ๋,
+
+๋ฏผ๊ธฐ๊ฐ ์ข์ํ๋ ํ๋ฒ๊ฑฐ๋ฅผ ๋จน์ผ๋ฉด์๋ ๋ค์ด์ดํธ์ ์ฑ๊ณตํ ์ ์๋๋ก ์ ํด์ง ์นผ๋ก๋ฆฌ ์ดํ์ ์กฐํฉ ์ค์์ ๋ฏผ๊ธฐ๊ฐ ๊ฐ์ฅ ์ ํธํ๋ ํ๋ฒ๊ฑฐ๋ฅผ ์กฐํฉํด์ฃผ๋ ํ๋ก๊ทธ๋จ์ ๋ง๋ค์ด๋ณด์.
+
+(๋จ ์ฌ๋ฌ ์ฌ๋ฃ๋ฅผ ์กฐํฉํ์์ ํ๋ฒ๊ฑฐ์ ์ ํธ๋๋ ์กฐํฉ๋ ์ฌ๋ฃ๋ค์ ๋ง์ ๋ํ ์ ์์ ํฉ์ผ๋ก ๊ฒฐ์ ๋๊ณ , ๊ฐ์ ์ฌ๋ฃ๋ฅผ ์ฌ๋ฌ ๋ฒ ์ฌ์ฉํ ์ ์์ผ๋ฉฐ, ํ๋ฒ๊ฑฐ์ ์กฐํฉ์ ์ ํ์ ์นผ๋ก๋ฆฌ๋ฅผ ์ ์ธํ๊ณ ๋ ์๋ค.)
+
+# ์
๋ ฅ
+
+์ฒซ ๋ฒ์งธ ์ค์ ํ
์คํธ ์ผ์ด์ค์ ์ T๊ฐ ์ฃผ์ด์ง๋ค.
+
+
+๊ฐ ํ
์คํธ ์ผ์ด์ค์ ์ฒซ ๋ฒ์งธ ์ค์๋ ์ฌ๋ฃ์ ์, ์ ํ ์นผ๋ก๋ฆฌ๋ฅผ ๋ํ๋ด๋ N, L(1 โค N โค 20, 1 โค L โค 104)๊ฐ ๊ณต๋ฐฑ์ผ๋ก ๊ตฌ๋ถ๋์ด ์ฃผ์ด์ง๋ค.
+
+
+๋ค์ N๊ฐ์ ์ค์๋ ์ฌ๋ฃ์ ๋ํ ๋ฏผ๊ธฐ์ ๋ง์ ๋ํ ์ ์์ ์นผ๋ก๋ฆฌ๋ฅผ ๋ํ๋ด๋ Ti, Ki(1 โค $T_i$ โค 103, 1 โค Ki โค 103)๊ฐ ๊ณต๋ฐฑ์ผ๋ก ๊ตฌ๋ถ๋์ด ์ฃผ์ด์ง๋ค.
+
+# ์ถ๋ ฅ
+
+๊ฐ ์ค๋ง๋ค "#T" (T๋ ํ
์คํธ ์ผ์ด์ค ๋ฒํธ)๋ฅผ ์ถ๋ ฅํ ๋ค, ์ฃผ์ด์ง ์ ํ ์นผ๋ก๋ฆฌ ์ดํ์ ์กฐํฉ์ค์์ ๊ฐ์ฅ ๋ง์ ๋ํ ์ ์๊ฐ ๋์ ํ๋ฒ๊ฑฐ์ ์ ์๋ฅผ ์ถ๋ ฅํ๋ค.
+
+# ํ์ด
+
+## DFS๋ฅผ ํ์ฉํ ํ์ด
+
+๊ฐ์ฅ ๋จผ์ ๋ ์ค๋ฅธ ๋ฐฉ์์ DFS๋ฅผ ํ์ฉํ ๋ฐฉ์์ด๋ค.
+ํ๋ฒ๊ฑฐ ์ฌ๋ฃ๋ฅผ ํ๋์ฉ ์ฌ์ฉํ๋ฉฐ(์ฌ๋ฃ ์๋ฅผ ํ๋์ฉ ์ค์ฌ๊ฐ๋ฉฐ) ์ฌ๊ท๋ฅผ ๋ฐ๋ณตํ๋ค.
+์ฌ์ฉํ ์ฌ๋ฃ์ ๋ง๊ฒ ์นผ๋ก๋ฆฌ์ ์ ์๋ฅผ ๋ํด์ ๋ค์ ์ฌ๊ท์ ๋งค๊ฐ๋ณ์๋ก ๋๊ฒจ์ค๋ค.
+๊ทธ๋ฆฌ๊ณ ๋งค ์ํ๋ง๋ค ์ ์๊ฐ ์ต๋์ธ์ง ํ์ธํ๊ณ ๊ธฐ๋กํด์ค๋ค.
+
+ํ์ง๋ง ํ์ฌ ์ฌ๋ฃ๊น์ง์ ์นผ๋ก๋ฆฌ ํฉ์ด ์ ํ ์นผ๋ก๋ฆฌ๋ณด๋ค ๋๋ค๋ฉด ๋ ์ด์ ํ์ํ ํ์๊ฐ ์์ผ๋ฏ๋ก ๋์ด๊ฐ๋ค.
+
+### ์ฝ๋
+
+```py
+test_case = int(input())
+
+
+# ์ ํ ์นผ๋ก๋ฆฌ ๋ด์์ ์ต๋์ ๋ง
+def search_best(hamburgers, sum_cal=0, sum_score=0):
+ global max_score
+ max_score = max(max_score, sum_score)
+
+ for i, (score, cal) in enumerate(hamburgers):
+ if sum_cal + cal > l:
+ continue
+ search_best(hamburgers[i + 1:], sum_cal + cal, sum_score + score)
+
+
+for t in range(test_case):
+ n, l = map(int, input().split())
+
+ hamburgers = [list(map(int, input().split())) for _ in range(n)]
+
+ max_score = 0
+
+ search_best(hamburgers)
+
+ print(f"#{t + 1} {max_score}")
+```
+
+## DP๋ฅผ ํ์ฉํ ํ์ด
+
+์ด ๋ฌธ์ ๋ฅผ ๋ค์ ์๊ฐํด๋ณด๋ฉด ์ฌ๋ฃ๋ฅผ ๊ณ ๋ฅด๊ฑฐ๋(1) ์๊ณ ๋ฅด๋ฉด์(0) ์ฃผ์ด์ง ์นผ๋ก๋ฆฌ(์ฉ๋) ๋ด์์ ์ต๋์ ์ ์(์ด๋)์ ์ป๋ ๊ฒ์ด ๋ชฉ์ ์ด๋ฏ๋ก, 0-1 ๋ฐฐ๋ญ ๋ฌธ์ ์ ๋์ผํ๋ค.
+
+์ด์ ์ด์ ๊น์ง์ ๋ง ์ ์์ ์ต๋์น๋ฅผ ํ์ฉํ์ฌ, ์นผ๋ก๋ฆฌ ์ ํ `l`์์ ๋ด๋ ค๊ฐ๋ฉฐ ๊ฐ์ฅ ๋์ ์ ์๋ฅผ ๊ณ์ฐํ๋ค.
+๋ง๋ก ํ๋ ์ด๋ ค์ฐ๋ ์๋ ์์๋ฅผ ๋ณด์.
+
+DP๋ฅผ ์ํ ์ ํ์์ ๋ค์๊ณผ ๊ฐ๋.
+```py
+dp = [0] * (l + 1)
+...
+dp[j] = max(dp[j], dp[j - cal] + score)
+```
+์ด ์ ํ์์ ์๋ ์์ ์
๋ ฅ์ผ๋ก ์ฐ์ฐ์ ์งํํด๋ณด์.
+
+```bash
+1
+5 1000
+100 200
+300 500
+250 300
+500 1000
+400 400
+```
+
+์ฒซ ์
๋ ฅ์ ์ ์ 100, ์นผ๋ก๋ฆฌ 200์ ์ฌ๋ฃ์ด๋ค. (ํธ์์ 100 ๋จ์๋ก ์ธ๋ฑ์ค๋ฅผ ํ์ํ์ง๋ง ์ค์ ๋ก๋ 1๋จ์์ด๋ค.)
+
+
+|score|cal|
+|---|---|
+|100|200|
+
+|**$j$** |1000|900|800|700|600|500|400|300|200|100|0|
+|:---------:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|
+|$j-cal$ |800|700|600|500|400|300|200|100|0|-|-|
+|$DP_{before}$|0|0|0|0|0|0|0|0|0|0|0|
+|$DP_{next}$|100|100|100|100|100|100|100|100|100|0|0|
+
+์ ํ์์ ๋ฐ๋ผ ํ์ฌ ์ธ๋ฑ์ค์ (dp ๋ฐฐ์ด ๊ฐ)๊ณผ (`j - cal` ์ธ๋ฑ์ค ๊ฐ + ํ์ฌ `score` ๊ฐ) ์ค ํฐ ๊ฐ์ ์ทจํ๋ค.
+
+์ฆ, ์ง๊ธ๊น์ง ์ ์ฅํ ํ์ฌ ์์น์ ์นผ๋ก๋ฆฌ `j`์ (`score` + `j-cal`) ์นผ๋ก๋ฆฌ๋ก ๋ง๋ค ์ ์๋ ๋ง ์ ์๋ฅผ ๋น๊ตํ๋ ๊ฒ์ด๋ค.
+
+ํ ์คํญ ๋ ์งํํด๋ณด์.
+
+|score|cal|
+|---|---|
+|300|500|
+
+|**$j$** |1000|900|800|700|600|500|400|300|200|100|0|
+|:---------:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|
+|$j-cal$ |500|400|300|200|100|0|-|-|-|-|-|
+|$DP_{before}$|100|100|100|100|100|100|100|100|100|0|0|
+|$DP_{next}$|400|400|400|400|300|300|100|100|100|0|0|
+
+`j`๊ฐ 1000 ~ 700์ผ ๋๊น์ง๋ ๊ธฐ์กด DP ๋ฐฐ์ด์ ์ธ๋ฑ์ค 500 ~ 200๊น์ง์ ๊ฐ๊ณผ ํฉํ์ฌ ๊ธฐ์กด ๊ฐ๊ณผ ๋น๊ตํ๋ค. ๋น๊ต ๊ฒฐ๊ณผ ์๋ก์ด ๊ฐ์ด ๋ ํฌ๊ธฐ ๋๋ฌธ์ 400(100 + 300)์ผ๋ก ๊ฐฑ์ ํ๋ค. `j`๊ฐ 600 ~ 500์ผ ๋๋ ๋ง์ฐฌ๊ฐ์ง๋ก ์งํํ์ง๋ง ๊ธฐ์กด ๊ฐ์ด 0์ด๊ธฐ ๋๋ฌธ์ 300(0 + 300)์ผ๋ก ๊ฐฑ์ ํ๋ค.
+
+์ดํ์๋ ๊ฐ์ ๊ณผ์ ์ผ๋ก ์งํํ๋ค.
+
+|score|cal|
+|---|---|
+|250|300|
+
+|**$j$** |1000|900|800|700|600|500|400|300|200|100|0|
+|:---------:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|
+|$j-cal$ |700|600|500|400|300|200|100|0|-|-|-|
+|$DP_{before}$|400|400|400|400|300|300|100|100|100|0|0|
+|$DP_{next}$|650|550|550|400|350|350|250|250|100|0|0|
+
+|score|cal|
+|---|---|
+|500|1000|
+
+|**$j$** |1000|900|800|700|600|500|400|300|200|100|0|
+|:---------:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|
+|$j-cal$ |0|-|-|-|-|-|-|-|-|-|-|
+|$DP_{before}$|650|550|550|400|350|350|250|250|100|0|0|
+|$DP_{next}$|650|550|550|400|350|350|250|250|100|0|0|
+
+|score|cal|
+|---|---|
+|400|400|
+
+|**$j$** |1000|900|800|700|600|500|400|300|200|100|0|
+|:---------:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|
+|$j-cal$ |600|500|400|300|200|100|0|-|-|-|-|
+|$DP_{before}$|650|550|550|400|350|350|250|250|100|0|0|
+|$DP_{next}$|750|750|650|650|500|400|400|250|100|0|0|
+
+๋ง์ง๋ง ์ํ์ด ๋๋ ํ DP ๋ฐฐ์ด์์ ์ต๋๊ฐ์ ์ถ๋ ฅํ๋ค.
+
+### ์ฝ๋
+
+```python
+test_case = int(input())
+
+for t in range(test_case):
+ n, l = map(int, input().split())
+
+ hamburgers = [list(map(int, input().split())) for _ in range(n)]
+
+ dp = [0] * (l + 1)
+
+ for score, cal in hamburgers:
+ for j in range(l, cal - 1, -1):
+ dp[j] = max(dp[j], dp[j - cal] + score)
+
+ max_score = max(dp)
+
+ print(f"#{t + 1} {max_score}")
+```
\ No newline at end of file
diff --git a/_posts/2024-08-06-swea_4012.markdown b/_posts/2024-08-06-swea_4012.markdown
new file mode 100644
index 00000000000..9da40631e21
--- /dev/null
+++ b/_posts/2024-08-06-swea_4012.markdown
@@ -0,0 +1,144 @@
+---
+title: "[SWEA]์๋ฆฌ์ฌ - 4012 (๋ชจ์ ์ญ๋ ํ
์คํธ)"
+author: kwon
+date: 2024-08-06T14:00:00 +0900
+categories: [swea, ๋ชจ์์ญ๋]
+tags: [combinatorics, backtracking]
+math: true
+mermaid: false
+---
+
+| ์๊ฐ ์ ํ | ๋ฉ๋ชจ๋ฆฌ ์ ํ |
+| --- | --- |
+| 10 ์ด | ํ ์ ์ ๋ฉ๋ชจ๋ฆฌ: 256 MB / ์คํ ๋ฉ๋ชจ๋ฆฌ 1MB |
+
+# ๋ฌธ์
+
+
+๋ ๋ช
์ ์๋์๊ฒ ์์์ ์ ๊ณตํ๋ ค๊ณ ํ๋ค.
+
+๋ ๋ช
์ ์๋์ ์์ฑ์ด ๋น์ทํ๊ธฐ ๋๋ฌธ์, ์ต๋ํ ๋น์ทํ ๋ง์ ์์์ ๋ง๋ค์ด ๋ด์ผ ํ๋ค.
+
+N๊ฐ์ ์์ฌ๋ฃ๊ฐ ์๋ค.
+
+์์ฌ๋ฃ๋ค์ ๊ฐ๊ฐ N / 2๊ฐ์ฉ ๋๋์ด ๋ ๊ฐ์ ์๋ฆฌ๋ฅผ ํ๋ ค๊ณ ํ๋ค. (N์ ์ง์์ด๋ค.)
+
+์ด๋, ๊ฐ๊ฐ์ ์์์ A์์, B์์์ด๋ผ๊ณ ํ์.
+
+๋น์ทํ ๋ง์ ์์์ ๋ง๋ค๊ธฐ ์ํด์๋ A์์๊ณผ B์์์ ๋ง์ ์ฐจ์ด๊ฐ ์ต์๊ฐ ๋๋๋ก ์ฌ๋ฃ๋ฅผ ๋ฐฐ๋ถํด์ผ ํ๋ค.
+
+์์์ ๋ง์ ์์์ ๊ตฌ์ฑํ๋ ์์ฌ๋ฃ๋ค์ ์กฐํฉ์ ๋ฐ๋ผ ๋ค๋ฅด๊ฒ ๋๋ค.
+
+
+
+์์ฌ๋ฃ i๋ ์์ฌ๋ฃ j์ ๊ฐ์ด ์๋ฆฌํ๊ฒ ๋๋ฉด ๊ถํฉ์ด ์ ๋ง์ ์๋์ง Sij๊ฐ ๋ฐ์ํ๋ค. (1 โค i โค N, 1 โค j โค N, i โ j)
+
+๊ฐ ์์์ ๋ง์ ์์์ ๊ตฌ์ฑํ๋ ์์ฌ๋ฃ๋ค๋ก๋ถํฐ ๋ฐ์ํ๋ ์๋์ง Sij๋ค์ ํฉ์ด๋ค.
+
+
+
+์์ฌ๋ฃ i๋ฅผ ์์ฌ๋ฃ j์ ๊ฐ์ด ์๋ฆฌํ๊ฒ ๋๋ฉด ๋ฐ์ํ๋ ์๋์ง Sij์ ์ ๋ณด๊ฐ ์ฃผ์ด์ง๊ณ , ๊ฐ์ง๊ณ ์๋ ์์ฌ๋ฃ๋ฅผ ์ด์ฉํด A์์๊ณผ B์์์ ๋ง๋ค ๋, ๋ ์์ ๊ฐ์ ๋ง์ ์ฐจ์ด๊ฐ ์ต์๊ฐ ๋๋ ๊ฒฝ์ฐ๋ฅผ ์ฐพ๊ณ ๊ทธ ์ต์๊ฐ์ ์ ๋ต์ผ๋ก ์ถ๋ ฅํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ๋ผ.
+
+
+์์ธํ ์์๋ [์ฌ๊ธฐ๋ก](https://swexpertacademy.com/main/talk/solvingClub/problemView.do?solveclubId=AZC_w6Z6yygDFAQW&contestProbId=AWIeUtVakTMDFAVH&probBoxId=AZDJUP6q-fgDFAVs&type=PROBLEM&problemBoxTitle=2d_recommend&problemBoxCnt=2&&&&&&).
+
+## ์ ์ฝ ์ฌํญ
+
+1. ์๊ฐ ์ ํ : ์ต๋ 50๊ฐ ํ
์คํธ ์ผ์ด์ค๋ฅผ ๋ชจ๋ ํต๊ณผํ๋ ๋ฐ C / C++ / Java ๋ชจ๋ 3์ด
+
+2. ์์ฌ๋ฃ์ ์ N์ 4์ด์ 16์ดํ์ ์ง์์ด๋ค. $(4 โค N โค 16)$
+
+3. ์๋์ง Sij๋ 1์ด์ 20,000์ดํ์ ์ ์์ด๋ค. $(1 โค Sij โค 20,000, i โ j)$
+
+4. i์ j๊ฐ ์๋ก ๊ฐ์ ๊ฒฝ์ฐ์ Sij๊ฐ์ ์ ์๋์ง ์๋๋ค. ์
๋ ฅ์์๋ 0์ผ๋ก ์ฃผ์ด์ง๋ค.
+
+# ์
๋ ฅ
+
+์
๋ ฅ์ ๋งจ ์ฒซ ์ค์๋ ์ด ํ
์คํธ ์ผ์ด์ค์ ๊ฐ์ T๊ฐ ์ฃผ์ด์ง๊ณ ,
+
+๊ทธ ๋ค์ ์ค๋ถํฐ T๊ฐ์ ํ
์คํธ ์ผ์ด์ค๊ฐ ์ฃผ์ด์ง๋ค.
+
+๊ฐ ํ
์คํธ ์ผ์ด์ค์ ์ฒซ ๋ฒ์งธ ์ค์๋ ์์ฌ๋ฃ์ ์ N์ด ์ฃผ์ด์ง๋ค.
+
+๋ค์ N๊ฐ์ ์ค์๋ N * N๊ฐ์ ์๋์ง Sij๊ฐ๋ค์ด ์ฃผ์ด์ง๋ค. i์ j๊ฐ ์๋ก ๊ฐ์ ๊ฒฝ์ฐ๋ 0์ผ๋ก ์ฃผ์ด์ง๋ค.
+
+# ์ถ๋ ฅ
+
+ํ
์คํธ ์ผ์ด์ค ๊ฐ์๋งํผ T๊ฐ์ ์ค์ ๊ฐ๊ฐ์ ํ
์คํธ ์ผ์ด์ค์ ๋ํ ๋ต์ ์ถ๋ ฅํ๋ค.
+
+๊ฐ ์ค์ "#t"๋ก ์์ํ๊ณ ๊ณต๋ฐฑ์ ํ๋ ๋ ๋ค์ ์ ๋ต์ ์ถ๋ ฅํ๋ค. (t ๋ 1๋ถํฐ ์์ํ๋ ํ
์คํธ ์ผ์ด์ค์ ๋ฒํธ์ด๋ค.)
+
+์ ๋ต์ ๋ ์์ ๊ฐ์ ๋ง์ ์ฐจ์ด๊ฐ ์ต์๊ฐ ๋๋๋ก A์์๊ณผ B์์์ ๋ง๋ค์์ ๋ ๊ทธ ์ฐจ์ด ๊ฐ์ด๋ค.
+
+# ํ์ด
+
+์ฃผ์ด์ง ์ฌ๋ฃ์ ์ ๋ฐ์ฉ ์ฌ์ฉํ์ฌ ์๋ฆฌ๋ฅผ ๋ง๋ค์ด ๋ ์๋ฆฌ์ ๋ง ์ฐจ์ด๊ฐ ์ต์๋ก ๋๋๋ก ํ๋ ๋ฌธ์ ์ด๋ค.
+
+์ด ๋ธ ์ฌ๋ฃ์ ์ ๋ฐ์ ์ฌ์ฉํ๋ ๊ฒ์ ๋ค์๊ณผ ๊ฐ์ ์กฐํฉ์ผ๋ก ๋ํ๋ผ ์ ์๋ค.
+
+$$
+{N}\choose{N//2}
+$$
+
+๋ ์๋ฆฌ์ ๋ํ ์ฌ๋ฃ๋ฅผ ๋ชจ๋ ๊ตฌํด์ผ ํ๋? ํ๊ณ ์๊ฐํ ์ ์์ง๋ง, ํ ์๋ฆฌ์ ์ฌ๋ฃ๊ฐ ๊ฒฐ์ ๋๋ฉด ๋๋จธ์ง ํ๋์ ์ฌ๋ฃ๋ ๊ฒฐ์ ๋๊ธฐ ๋๋ฌธ์ ๊ตณ์ด ๊ตฌํ ํ์๋ ์๋ค.
+
+๊ทธ๋์ `range(1, n)`์ ๋ํด `n // 2` ๊ฐ์ ์์๋ฅผ ๊ฐ์ง๋ ์กฐํฉ์ ๊ตฌํ๋๋ก `search_recipe`๋ฅผ ์์ฑํ์๋ค. ์ดํ ์ ์ฒด ์งํฉ์ ๋ํด ์ฐจ์งํฉํ์ฌ ๋ฐ๋์ชฝ ์กฐํฉ์ ๊ตฌํ๋ค.
+
+```py
+...
+ comb2 = list(index_set - set(comb))
+...
+```
+
+๊ตฌํด์ง ์กฐํฉ์ผ๋ก ๋ง์ ๊ณ์ฐํ๊ณ ์ฐจ์ด์ ์ต์๊ฐ์ ๊ตฌํ๋ฉด ๋๋ค.
+
+```py
+...
+ for i_idx, (i1, i2) in enumerate(zip(comb, comb2)):
+ for j1, j2 in zip(comb[i_idx + 1:], comb2[i_idx + 1:]):
+ food1 += recipe[i1][j1] + recipe[j1][i1]
+ food2 += recipe[i2][j2] + recipe[j2][i2]
+ min_diff = min(min_diff, abs(food1 - food2))
+...
+```
+
+๋ง๋ค์ด์ค ์กฐํฉ ๋ฐฐ์ด์ ๋งจ ์์ `[0]`์ ๋ถ์ฌ์ฃผ๋ ์ด์ ๋ ์ฃผ์ด์ง ์ฌ๋ฃ์ ๋ฒํธ๊ฐ 1๋ถํฐ ์์ํ๊ธฐ ๋๋ฌธ์ ์ธ๋ฑ์ค์ ๋ง์ถฐ์ฃผ๊ธฐ ์ํจ์ด๋ค.
+
+## ์ฝ๋
+
+```py
+test_case = int(input())
+
+def search_recipe(index_list, n):
+ if n == 1 :
+ return [[i] for i in index_list]
+ result = []
+ for i in range(len(index_list) - 1):
+ for j in search_recipe(index_list[i+1:], n - 1):
+ result.append([index_list[i]] + j)
+
+ return result
+
+
+for t in range(test_case):
+ n = int(input())
+ min_diff = float('inf')
+
+ recipe = [list(map(int, input().split())) for _ in range(n)]
+
+ index_set = set(range(n))
+
+ comb_list = [[0] + c for c in search_recipe(list(range(1, n)), n // 2 - 1)]
+
+ for comb in comb_list:
+ comb2 = list(index_set - set(comb))
+ food1, food2 = 0, 0
+
+ for i_idx, (i1, i2) in enumerate(zip(comb, comb2)):
+ for j1, j2 in zip(comb[i_idx + 1:], comb2[i_idx + 1:]):
+ food1 += recipe[i1][j1] + recipe[j1][i1]
+ food2 += recipe[i2][j2] + recipe[j2][i2]
+ min_diff = min(min_diff, abs(food1 - food2))
+
+ print(f"#{t + 1} {min_diff}")
+```
\ No newline at end of file
diff --git a/_posts/2024-08-09-swea_4008.markdown b/_posts/2024-08-09-swea_4008.markdown
new file mode 100644
index 00000000000..cae75760042
--- /dev/null
+++ b/_posts/2024-08-09-swea_4008.markdown
@@ -0,0 +1,136 @@
+---
+title: "[SWEA]์ซ์ ๋ง๋ค๊ธฐ - 4008 (๋ชจ์ ์ญ๋ ํ
์คํธ)"
+author: kwon
+date: 2024-08-09T14:00:00 +0900
+categories: [swea, ๋ชจ์์ญ๋]
+tags: [dfs]
+math: true
+mermaid: false
+---
+
+| ์๊ฐ ์ ํ | ๋ฉ๋ชจ๋ฆฌ ์ ํ |
+| --- | --- |
+| 10 ์ด | ํ ์ ์ ๋ฉ๋ชจ๋ฆฌ: 256 MB / ์คํ ๋ฉ๋ชจ๋ฆฌ 1MB |
+
+# ๋ฌธ์
+
+
+์ ํ๋ ๊ฒ์์ ํตํด ์ฌ์น ์ฐ์ฐ์ ๊ณต๋ถํ๊ณ ์๋ค.
+
+N๊ฐ์ ์ซ์๊ฐ ์ ํ ์๋ ๊ฒ์ ํ์ด ์๊ณ , +, -, x, / ์ ์ฐ์ฐ์ ์นด๋๋ฅผ ์ซ์ ์ฌ์ด์ ๋ผ์ ๋ฃ์ด ๋ค์ํ ๊ฒฐ๊ณผ ๊ฐ์ ๊ตฌํด๋ณด๊ธฐ๋ก ํ๋ค.
+
+์์์ ๊ณ์ฐํ ๋ ์ฐ์ฐ์์ ์ฐ์ ์์๋ ๊ณ ๋ คํ์ง ์๊ณ ์ผ์ชฝ์์ ์ค๋ฅธ์ชฝ์ผ๋ก ์ฐจ๋ก๋๋ก ๊ณ์ฐํ๋ค.
+
+์๋ฅผ ๋ค์ด 1, 2, 3 ์ด ์ ํ ๊ฒ์ ํ์ +์ x๋ฅผ ๋ฃ์ด 1 + 2 * 3์ ๋ง๋ค๋ฉด 1 + 2๋ฅผ ๋จผ์ ๊ณ์ฐํ๊ณ ๊ทธ ๋ค์ * ๋ฅผ ๊ณ์ฐํ๋ค.
+
+์ฆ 1+2*3์ ๊ฒฐ๊ณผ๋ 9์ด๋ค.
+
+
+์ฃผ์ด์ง ์ฐ์ฐ์ ์นด๋๋ฅผ ์ฌ์ฉํ์ฌ ์์์ ๊ณ์ฐํ์ ๋ ๊ทธ ๊ฒฐ๊ณผ๊ฐ ์ต๋๊ฐ ๋๋ ์์๊ณผ ์ต์๊ฐ ๋๋ ์์์ ์ฐพ๊ณ , ๋ ๊ฐ์ ์ฐจ์ด๋ฅผ ์ถ๋ ฅํ์์ค.
+
+
+์์ธํ ์์๋ [์ฌ๊ธฐ๋ก](https://swexpertacademy.com/main/talk/solvingClub/problemView.do?solveclubId=AZC_w6Z6yygDFAQW&contestProbId=AWIeRZV6kBUDFAVH&probBoxId=AZC_w6Z6yykDFAQW&type=PROBLEM&problemBoxTitle=1w_homework&problemBoxCnt=5)
+
+## ์ ์ฝ ์ฌํญ
+
+1. ์๊ฐ ์ ํ : ์ต๋ 50 ๊ฐ ํ
์คํธ ์ผ์ด์ค๋ฅผ ๋ชจ๋ ํต๊ณผํ๋ ๋ฐ C / C++ / Java ๋ชจ๋ 3 ์ด
+
+2. ๊ฒ์ ํ์ ์ ํ ์ซ์์ ๊ฐ์ N ์ 3 ์ด์ 12 ์ดํ์ ์ ์์ด๋ค. ( 3 โค N โค 12 )
+
+3. ์ฐ์ฐ์ ์นด๋ ๊ฐ์์ ์ด ํฉ์ ํญ์ N - 1 ์ด๋ค.
+
+4. ๊ฒ์ ํ์ ์ ํ ์ซ์๋ 1 ์ด์ 9 ์ดํ์ ์ ์์ด๋ค.
+
+5. ์์์ ์์ฑํ ๋ ๊ฐ ์ฐ์ฐ์ ์นด๋๋ฅผ ๋ชจ๋ ์ฌ์ฉํด์ผ ํ๋ค..
+
+6. ์ซ์์ ์ซ์ ์ฌ์ด์๋ ์ฐ์ฐ์๊ฐ 1 ๊ฐ๋ง ๋ค์ด๊ฐ์ผ ํ๋ค.
+
+7. ์์ฑ๋ ์์์ ๊ณ์ฐํ ๋ ์ฐ์ฐ์์ ์ฐ์ ์์๋ ๊ณ ๋ คํ์ง ์๊ณ , ์ผ์ชฝ์์ ์ค๋ฅธ์ชฝ์ผ๋ก ์ฐจ๋ก๋๋ก ๊ณ์ฐํ๋ค.
+
+8. ๋๋์
์ ๊ณ์ฐ ํ ๋ ์์์ ์ดํ๋ ๋ฒ๋ฆฐ๋ค.
+
+9. ์
๋ ฅ์ผ๋ก ์ฃผ์ด์ง๋ ์ซ์์ ์์๋ ๋ณ๊ฒฝํ ์ ์๋ค.
+
+10. ์ฐ์ฐ ์ค์ ๊ฐ์ -100,000,000 ์ด์ 100,000,000 ์ดํ์์ด ๋ณด์ฅ๋๋ค.
+
+# ์
๋ ฅ
+
+์
๋ ฅ์ ๋งจ ์ฒซ ์ค์๋ ์ด ํ
์คํธ ์ผ์ด์ค์ ๊ฐ์ T ๊ฐ ์ฃผ์ด์ง๊ณ ,
+
+๊ทธ ๋ค์ ์ค๋ถํฐ T ๊ฐ์ ํ
์คํธ ์ผ์ด์ค๊ฐ ์ฃผ์ด์ง๋ค.
+
+๊ฐ ํ
์คํธ ์ผ์ด์ค์ ์ฒซ ๋ฒ์งธ ์ค์๋ ์ซ์์ ๊ฐ์ N ์ด ์ฃผ์ด์ง๋ค.
+
+๋ค์ ์ค์๋ '+', '-', '*', '/' ์์๋๋ก ์ฐ์ฐ์ ์นด๋์ ๊ฐ์๊ฐ ๊ณต๋ฐฑ์ ์ฌ์ด์ ๋๊ณ ์ฃผ์ด์ง๋ค.
+
+๋ค์ ์ค์๋ ์์์ ๋ค์ด๊ฐ๋ N ๊ฐ์ ์ซ์๊ฐ ์์๋๋ก ๊ณต๋ฐฑ์ ์ฌ์ด์ ๋๊ณ ์ฃผ์ด์ง๋ค.
+
+# ์ถ๋ ฅ
+
+ํ
์คํธ ์ผ์ด์ค ๊ฐ์๋งํผ T ๊ฐ์ ์ค์ ๊ฐ๊ฐ์ ํ
์คํธ ์ผ์ด์ค์ ๋ํ ๋ต์ ์ถ๋ ฅํ๋ค.
+
+๊ฐ ์ค์ "#t" ๋ก ์์ํ๊ณ ๊ณต๋ฐฑ์ ํ๋ ๋ ๋ค์ ์ ๋ต์ ์ถ๋ ฅํ๋ค. ( t ๋ 1 ๋ถํฐ ์์ํ๋ ํ
์คํธ ์ผ์ด์ค์ ๋ฒํธ์ด๋ค. )
+
+์ ๋ต์ ์ฐ์ฐ์ ์นด๋๋ฅผ ์ฌ์ฉํ์ฌ ๋ง๋ค ์ ์๋ ์์์ผ๋ก ์ป์ ๊ฒฐ๊ณผ๊ฐ ์ค ์ต๋๊ฐ๊ณผ ์ต์๊ฐ์ ์ฐจ์ด์ด๋ค.
+
+# ํ์ด
+
+์ฃผ์ด์ง ์ซ์ ์ฌ์ด์ ์ฃผ์ด์ง ์ฐ์ฐ์๋ฅผ ๋ฃ์ด ์๋ฅผ ๊ณ์ฐํ๊ณ , ๊ทธ ์์ ์ต๋์ ์ต์์ ์ฐจ์ด๋ฅผ ์ถ๋ ฅํ๋ ๋ฌธ์ ์ด๋ค.
+
+๋ฌด์ฌ์ฝ ํ์ด๋ฅผ ์๊ฐํ๋ฉด ๋ฐ์ ์ฐ์ฐ์๋ฅผ ๋ชจ๋ ์์น์ ๋ฃ์ด๊ฐ๋ฉด์ ๊ณ์ฐํ๋ฉด ๋๋ ๊ฒ์ด ์๋๊ฐ ํ ์ ์์ง๋ง, ์ด ๊ฒฝ์ฐ ์ค๋ณต ๊ณ์ฐ์ด ๋น๋ฒํ๊ฒ ๋ฐ์ํ ์ ์๋ค.
+
+์๋ฅผ ๋ค์ด + + + ๋ก ์ฐ์ฐ์๊ฐ ์ฃผ์ด์ง๋ค๋ฉด ์ด๋ค ๊ฒฝ์ฐ์ด๋ ๊ฐ์ ๊ฐ์ด ๋์ฌ ๊ฒ์ด๋ค. ํ์ง๋ง ์ฐ์ฐ์๋ฅผ ๋ชจ๋ ์์น์ ๋ฃ์ด๊ฐ๋ฉด์ ๊ณ์ฐํ ๊ฒฝ์ฐ $3 * 2 * 1 = 6$ ๋ฒ์ ์ค๋ณต ๊ณ์ฐ์ ํ๊ฒ ๋๋ค.
+
+์ด๋ฐ ๊ฒฝ์ฐ๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํด ์ฐ์ฐ์์ ์๋ฅผ ์ธ๋ ๋์
๋๋ฆฌ๋ฅผ ๋ง๋ค๊ณ , ๋ช ๋ฒ ์ฌ์ฉํ๋์ง ํ์ธํ์๋ค. ์ด๋ ๊ฒ ํ๋ฉด ๊ฐ ์ฐ์ฐ์๋ง๋ค ๋ค๋ฅธ ๊ฒ์ผ๋ก ์๊ฐํ์ง ์๊ธฐ ๋๋ฌธ์ ์์์ ์ธ๊ธํ ์ค๋ณต ์ฐ์ฐ์ ์์จ ์ ์๋ค.
+
+## ์ฝ๋
+
+```py
+# ๊ณ์ฐ
+
+def calculate(num1, num2, operator):
+
+ if operator == '+':
+ num1 += num2
+ elif operator == '-':
+ num1 -= num2
+ elif operator == '*':
+ num1 *= num2
+ elif operator == '/':
+ num1 = int(num1 / num2)
+ return num1
+
+# ์์ ์์ฑ
+def search_expression(i, result):
+ if i == n:
+ global max_num, min_num
+ max_num = max(max_num, result)
+ min_num = min(min_num, result)
+ return
+
+ for operator in operators:
+ if operator_dict[operator] > 0:
+ operator_dict[operator] -= 1
+ search_expression(i + 1, calculate(result, nums[i+1], operator))
+ operator_dict[operator] += 1
+
+
+
+test_case = int(input())
+
+for t in range(test_case):
+ n = int(input()) - 1
+ operators = ['+', '-', '*', '/']
+ operator_dict = {operator: cnt for operator, cnt in zip(operators, map(int, input().split()))}
+
+ nums = list(map(int, input().split()))
+
+ max_num = float('-inf')
+ min_num = float('inf')
+ result_dict = {}
+ visited = []
+
+ search_expression(0, nums[0])
+
+ print(f"#{t + 1} {max_num - min_num}")
+```
\ No newline at end of file
diff --git a/_posts/2024-08-10-swea_2115.markdown b/_posts/2024-08-10-swea_2115.markdown
new file mode 100644
index 00000000000..b2a66a7d8d7
--- /dev/null
+++ b/_posts/2024-08-10-swea_2115.markdown
@@ -0,0 +1,189 @@
+---
+title: "[SWEA]๋ฒ๊ฟ ์ฑ์ทจ - 2115 (๋ชจ์ ์ญ๋ ํ
์คํธ)"
+author: kwon
+date: 2024-08-10T14:00:00 +0900
+categories: [swea, ๋ชจ์์ญ๋]
+tags: [dfs, subset, dynamic programing]
+math: true
+mermaid: false
+---
+
+| ์๊ฐ ์ ํ | ๋ฉ๋ชจ๋ฆฌ ์ ํ |
+| --- | --- |
+| 6 ์ด | ํ ์ ์ ๋ฉ๋ชจ๋ฆฌ: 256 MB / ์คํ ๋ฉ๋ชจ๋ฆฌ 1MB |
+
+# ๋ฌธ์
+
+
+N*N ๊ฐ์ ๋ฒํต์ด ์ ์ฌ๊ฐํ ๋ชจ์์ผ๋ก ๋ฐฐ์น๋์ด ์๋ค.
+
+๊ฐ ์นธ์ ์ซ์๋ ๊ฐ๊ฐ์ ๋ฒํต์ ์๋ ๊ฟ์ ์์ ๋ํ๋ด๋ฉฐ, ๊ฟ์ ์์ ์๋ก ๋ค๋ฅผ ์ ์๋ค.
+
+๊ฐ ๋ฒํต์ ์๋ ๊ฟ์ ์์ด ์ฃผ์ด์ก์ ๋, ๋ค์๊ณผ ๊ฐ์ ๊ณผ์ ์ผ๋ก ๋ฒ๊ฟ์ ์ฑ์ทจํ์ฌ ์ต๋ํ ๋ง์ ์์ต์ ์ป์ผ๋ ค๊ณ ํ๋ค.
+
+1. ๋ ๋ช
์ ์ผ๊พผ์ด ์๋ค. ๊ฟ์ ์ฑ์ทจํ ์ ์๋ ๋ฒํต์ ์ M์ด ์ฃผ์ด์ง ๋,
+ ๊ฐ๊ฐ์ ์ผ๊พผ์ ๊ฐ๋ก๋ก ์ฐ์๋๋๋ก M๊ฐ์ ๋ฒํต์ ์ ํํ๊ณ , ์ ํํ ๋ฒํต์์ ๊ฟ์ ์ฑ์ทจํ ์ ์๋ค.
+ ๋จ, ๋ ๋ช
์ ์ผ๊พผ์ด ์ ํํ ๋ฒํต์ ์๋ก ๊ฒน์น๋ฉด ์ ๋๋ค.
+
+2. ๋ ๋ช
์ ์ผ๊พผ์ ์ ํํ ๋ฒํต์์ ๊ฟ์ ์ฑ์ทจํ์ฌ ์ฉ๊ธฐ์ ๋ด์์ผ ํ๋ค.
+ ๋จ, ์๋ก ๋ค๋ฅธ ๋ฒํต์์ ์ฑ์ทจํ ๊ฟ์ด ์์ด๊ฒ ๋๋ฉด ์ํ๊ฐ์น๊ฐ ๋จ์ด์ง๊ฒ ๋๋ฏ๋ก, ํ๋์ ๋ฒํต์์ ์ฑ์ทจํ ๊ฟ์ ํ๋์ ์ฉ๊ธฐ์ ๋ด์์ผ ํ๋ค.
+ ํ๋์ ๋ฒํต์์ ๊ฟ์ ์ฑ์ทจํ ๋, ์ผ๋ถ๋ถ๋ง ์ฑ์ทจํ ์ ์๊ณ ๋ฒํต์ ์๋ ๋ชจ๋ ๊ฟ์ ํ๋ฒ์ ์ฑ์ทจํด์ผ ํ๋ค.
+ ๋ ์ผ๊พผ์ด ์ฑ์ทจํ ์ ์๋ ๊ฟ์ ์ต๋ ์์ C ์ด๋ค.
+
+3. ์ฑ์ทจํ ๊ฟ์ ์์ฅ์์ ํ๋ฆฌ๊ฒ ๋๋ค. ์ด๋ ํ๋์ ์ฉ๊ธฐ์ ์๋ ๊ฟ์ ์์ด ๋ง์์๋ก ์ํ๊ฐ์น๊ฐ ๋์, ๊ฐ ์ฉ๊ธฐ์ ์๋ ๊ฟ์ ์์ ์ ๊ณฑ๋งํผ์ ์์ต์ด ์๊ธด๋ค.
+
+
+๋ฒํต๋ค์ ํฌ๊ธฐ N๊ณผ ๋ฒํต์ ์๋ ๊ฟ์ ์์ ๋ํ ์ ๋ณด, ์ ํํ ์ ์๋ ๋ฒํต์ ๊ฐ์ M, ๊ฟ์ ์ฑ์ทจํ ์ ์๋ ์ต๋ ์ C๊ฐ ์ฃผ์ด์ง๋ค.
+
+์ด๋ ๋ ์ผ๊พผ์ด ๊ฟ์ ์ฑ์ทจํ์ฌ ์ป์ ์ ์๋ ์์ต์ ํฉ์ด ์ต๋๊ฐ ๋๋ ๊ฒฝ์ฐ๋ฅผ ์ฐพ๊ณ , ๊ทธ ๋์ ์ต๋ ์์ต์ ์ถ๋ ฅํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ๋ผ.
+
+## ์ ์ฝ ์ฌํญ
+
+1. ์๊ฐ์ ํ : ์ต๋ 50๊ฐ ํ
์คํธ ์ผ์ด์ค๋ฅผ ๋ชจ๋ ํต๊ณผํ๋๋ฐ, C/C++/Java ๋ชจ๋ 3์ด.
+
+2. ๋ฒํต๋ค์ ํฌ๊ธฐ N์ 3 ์ด์ 10 ์ดํ์ ์ ์์ด๋ค. (3 โค N โค 10)
+
+3. ์ ํํ ์ ์๋ ๋ฒํต์ ๊ฐ์ M์ 1 ์ด์ 5 ์ดํ์ ์ ์์ด๋ค. (1 โค M โค 5)
+
+4. ์ ํํ ์ ์๋ ๋ฒํต์ ๊ฐ์ M์ ๋ฐ๋์ N ์ดํ๋ก๋ง ์ฃผ์ด์ง๋ค.
+
+5. ๊ฟ์ ์ฑ์ทจํ ์ ์๋ ์ต๋ ์ C๋ 10 ์ด์ 30 ์ดํ์ ์ ์์ด๋ค. (10 โค C โค 30)
+
+6. ํ๋์ ๋ฒํต์์ ์ฑ์ทจํ ์ ์๋ ๊ฟ์ ์์ 1 ์ด์ 9 ์ดํ์ ์ ์์ด๋ค.
+
+7. ํ๋์ ๋ฒํต์์ ์ผ๋ถ๋ถ์ ๊ฟ๋ง ์ฑ์ทจํ ์ ์๊ณ , ๋ฒํต์ ์๋ ๋ชจ๋ ๊ฟ์ ํ๋ฒ์ ์ฑ์ทจํด์ผ ํ๋ค.
+
+# ์
๋ ฅ
+
+์
๋ ฅ์ ๋งจ ์ฒซ ์ค์๋ ์ด ํ
์คํธ ์ผ์ด์ค์ ๊ฐ์ T๊ฐ ์ฃผ์ด์ง๊ณ , ๊ทธ ๋ค์ ์ค๋ถํฐ T๊ฐ์ ํ
์คํธ ์ผ์ด์ค๊ฐ ์ฃผ์ด์ง๋ค.
+
+๊ฐ ํ
์คํธ ์ผ์ด์ค์ ์ฒซ ๋ฒ์งธ ์ค์๋ ๋ฒํต๋ค์ ํฌ๊ธฐ N, ์ ํํ ์ ์๋ ๋ฒํต์ ๊ฐ์ M, ๊ฟ์ ์ฑ์ทจํ ์ ์๋ ์ต๋ ์ C๊ฐ ์ฐจ๋ก๋ก ์ฃผ์ด์ง๋ค.
+
+๊ทธ ๋ค์ ์ค๋ถํฐ N*N ๊ฐ์ ๋ฒํต์์ ์ฑ์ทจํ ์ ์๋ ๊ฟ์ ์์ ๋ํ ์ ๋ณด๊ฐ ์ฃผ์ด์ง๋ค.
+
+# ์ถ๋ ฅ
+
+ํ
์คํธ ์ผ์ด์ค์ ๊ฐ์๋งํผ T์ค์ T๊ฐ์ ํ
์คํธ ์ผ์ด์ค ๊ฐ๊ฐ์ ๋ํ ๋ต์ ์ถ๋ ฅํ๋ค.
+
+๊ฐ ์ค์ "#x"๋ก ์์ํ๊ณ ๊ณต๋ฐฑ์ ํ๋ ๋ ๋ค์ ์ ๋ต์ ์ถ๋ ฅํ๋ค. (x๋ 1๋ถํฐ ์์ํ๋ ํ
์คํธ ์ผ์ด์ค์ ๋ฒํธ์ด๋ค)
+
+์ถ๋ ฅํด์ผ ํ ์ ๋ต์ ๋ ์ผ๊พผ์ด ๊ฟ์ ์ฑ์ทจํ์ฌ ์ป์ ์ ์๋ ์ต๋ ์์ต์ด๋ค.
+
+# ํ์ด
+
+์ผ์ข
์ ์์ ํ์์ ๊ธฐ๋ฐ์ผ๋ก ๊ฐ์ง์น๊ธฐ๋ฅผ ํด์ผ ํ๋ค๊ณ ์๊ฐํ๋ค.
+
+๋ ์ฌ๋์ด ๋ฒํต์ ์ ํํ ์ ์๋ ๋ฐฉ๋ฒ์ ๋ชจ๋ ํ์ํ๋ ๊ฒ์ ๊ธฐ๋ฐ์ผ๋ก ์งํํ๋ค. ํ์ํ๋ฉด์ ๊ณ ๋ฅธ ๋ฒํต์ ๋ํด ๋ถ๋ถ์งํฉ์ ๋ง๋ค์ด ์ ๊ณฑ์ ํฉ์ด ์ต๋๊ฐ ๋๋ ๊ฒฝ์ฐ๋ฅผ ์ฐพ๋๋ค. ์ต๋๊ฐ ๋๋ ์ ๊ณฑ์ ํฉ์ด ๋ฐ๋ก ๊ณ ๋ฅธ ๋ฒํต๋ค์์ ๋์ฌ ์ ์๋ ์ต๋ ์์ต์ด ๋๋ค.
+
+์ด ๋ ๊ฟ์ ์์ด `c`๋ฅผ ๋๋ ๊ฒฝ์ฐ๋ ๋ ์ด์ ๋ถ๋ถ ์งํฉ์ ๋ง๋ค ํ์๊ฐ ์๊ธฐ ๋๋ฌธ์ ์ฐ์ฐํ์ง ์๋๋ค.
+
+## ์ฌ๊ท๋ฅผ ํตํ ํ์ด
+
+์ฒซ ๋ฒ์งธ๋ก ์๊ฐํ ๋ฐฉ๋ฒ์ ์ฌ๊ท๋ก ๋ถ๋ถ ์งํฉ์ ๊ทธ๋๋ก ๊ตฌํด์ ๊ณ์ฐํ๋ ๊ฒ์ด๋ค. ๋จ, ์์ ๋งํ ๊ฐ์ง์น๊ธฐ๋ฅผ ํ๊ธฐ ์ํด `c`๋ฅผ ๋๋ ๊ฒฝ์ฐ๋ ๋์ด๊ฐ๋๋ก ์์ฑํ์๋ค.
+
+### ์ฝ๋
+
+```py
+test_case = int(input())
+
+def make_subset(arr, depth, honey_num = 0, selected = []):
+ if depth == -1:
+ subsets.append(selected)
+ return
+ for i in range(2):
+ if i == 0:
+ make_subset(arr, depth - 1, honey_num, selected)
+ else:
+ if honey_num + arr[depth] > c:
+ continue
+ make_subset(arr, depth - 1, honey_num + arr[depth], selected + [arr[depth]])
+
+def calcul_max_cost(subsets):
+ max_cost = 0
+ for subset in subsets:
+ cost = 0
+ for ele in subset:
+ cost += ele ** 2
+
+ max_cost = max(max_cost, cost)
+
+ return max_cost
+
+for t in range(test_case):
+ n, m, c = map(int, input().split())
+ honey_map = [list(map(int, input().split())) for _ in range(n)]
+ total_max = 0
+
+ for fst_i in range(n):
+ for fst_j in range(n - m + 1):
+
+ subsets = []
+ make_subset(honey_map[fst_i][fst_j:fst_j + m], m - 1)
+ fst_max = calcul_max_cost(subsets)
+
+ for snd_i in range(n):
+ start = 0
+ if snd_i == fst_i:
+ start = fst_j + m
+ for snd_j in range(start, n - m + 1):
+ subsets = []
+ make_subset(honey_map[snd_i][snd_j:snd_j + m], m - 1)
+ snd_max = calcul_max_cost(subsets)
+
+ total_max = max(total_max, fst_max + snd_max)
+
+ print(f"#{t + 1} {total_max}")
+```
+
+## DP๋ฅผ ํตํ ํ์ด
+
+์ด ๋ฌธ์ ๋ฅผ ๋ค์ ์ ์๊ฐํด๋ณด๋ฉด ์ ํํ ๊ฟํต ๋ด์์ ๊ฟํต์ ๊ณ ๋ฅด๊ฑฐ๋(1) ์๊ณ ๋ฅด๋ฉด์(0) ์ฃผ์ด์ง `c`(์ฉ๋) ๋ด์์ ์ต๋์ ์์ต(์ด๋)์ ์ป๋ ๊ฒ์ด ๋ชฉ์ ์ด๋ค. ์ฆ, ์ด ๋ฌธ์ ๋ 0-1 ๋ฐฐ๋ญ ๋ฌธ์ ์ ์ ์ฌํ๋ฏ๋ก DP๋ก๋ ํ์ดํ ์ ์๋ค.
+
+์ด์ ์ ํผ [ํ๋ฒ๊ฑฐ ๋ค์ด์ดํธ](/posts/swea_5215/)์์ ์ฌ์ฉํ DP์ ์งํ ๋ฐฉ์๊ณผ ์ ์ฌํ๊ฒ ์์ต์ ์ฐพ๋ ํ์ด์ด๋ค.
+
+๋ค๋ฅธ ์ ์ ๊ฟ ์์ ํฉ์ด `c`๋ฅผ ๋์ ๊ฒฝ์ฐ DP์ ๋ฐ์ํ์ง ์๋๋ค๋ ๊ฒ๊ณผ, ์ ๊ณฑ์ ํฉ์ด ํฐ ๊ฒ์ ๊ธฐ์ค์ผ๋ก PD์ ์
๋ฐ์ดํธํ๋ค๋ ๊ฒ์ด๋ค.
+
+๋ถ๋ถ ์งํฉ์ ๋ง๋ค์ด ์์ต์ ๊ณ์ฐํ๋ ๋ถ๋ถ์ด DP๋ก ๋ฐ๋ ๊ฒ๋ง ์ ์ธํ๋ฉด ์ฌ๊ท๋ฅผ ํตํ ํ์ด์ ์์ ํ ๋์ผํ๋ค.
+
+```py
+def max_subset_sum(arr):
+ dp = [[0, 0] for _ in range(c + 1)]
+
+ for num in arr:
+ for j in range(c, num - 1, -1):
+ if dp[j - num][0] + num > c:
+ continue
+ next_sq_value = dp[j - num][1] + num ** 2
+ if next_sq_value > dp[j][1]:
+ dp[j][0] = dp[j - num][0] + num
+ dp[j][1] = next_sq_value
+ _, max_sum = max(dp, key=lambda x: x[1])
+ return max_sum
+
+test_case = int(input())
+
+for t in range(test_case):
+ n, m, c = map(int, input().split())
+ honey_map = [list(map(int, input().split())) for _ in range(n)]
+ total_max = 0
+
+ for fst_i in range(n):
+ for fst_j in range(n - m + 1):
+
+ fst_max = max_subset_sum(honey_map[fst_i][fst_j:fst_j + m])
+
+ for snd_i in range(n):
+ start = 0
+ if snd_i == fst_i:
+ start = fst_j + m
+ for snd_j in range(start, n - m + 1):
+ snd_max = max_subset_sum(honey_map[snd_i][snd_j:snd_j + m])
+
+ total_max = max(total_max, fst_max + snd_max)
+
+ print(f"#{t + 1} {total_max}")
+```
+
+๊ทผ๋ฐ ์๊ฐ๋ณด๋ค ์คํ ์๊ฐ์ด **Dynamic**ํ๊ฒ ์ค์ด๋ค์ง ์์ ์ด์ง ๊น์๋ค.
+
+
\ No newline at end of file
diff --git a/_posts/2024-08-14-swea_2112.markdown b/_posts/2024-08-14-swea_2112.markdown
new file mode 100644
index 00000000000..f16f7722269
--- /dev/null
+++ b/_posts/2024-08-14-swea_2112.markdown
@@ -0,0 +1,177 @@
+---
+title: "[SWEA]๋ณดํธ ํ๋ฆ - 2112 (๋ชจ์ ์ญ๋ ํ
์คํธ)"
+author: kwon
+date: 2024-08-14T14:00:00 +0900
+categories: [swea, ๋ชจ์์ญ๋]
+tags: [dfs, backtracking]
+math: true
+mermaid: false
+---
+
+| ์๊ฐ ์ ํ | ๋ฉ๋ชจ๋ฆฌ ์ ํ |
+| --- | --- |
+| 15 ์ด | ํ ์ ์ ๋ฉ๋ชจ๋ฆฌ: 256 MB / ์คํ ๋ฉ๋ชจ๋ฆฌ 1MB |
+
+# ๋ฌธ์
+
+์ฑ๋ฅ์ด ์ฐ์ํ ๋ณดํธ ํ๋ฆ์ ์ ์ํ๋ ค๊ณ ํ๋ค.
+
+๋ณดํธ ํ๋ฆ์ ์ท์ ํฌ๋ช
ํ ๋ง์ D์ฅ ์์์ ์ ์๋๋ค.
+
+๋ง์ ๋์ผํ ํฌ๊ธฐ๋ฅผ ๊ฐ์ง ๋ฐ(bar) ๋ชจ์์ ์
๋ค์ด ๊ฐ๋ก ๋ฐฉํฅ์ผ๋ก W๊ฐ ๋ถ์ฌ์ ๋ง๋ค์ด์ง๋ค.
+
+์ด๋ ๊ฒ ์ ์๋ ํ๋ฆ์ ๋๊ป D, ๊ฐ๋ก ํฌ๊ธฐ W์ ๋ณดํธ ํ๋ฆ์ด๋ผ๊ณ ํ๋ค.
+
+
+
+๊ฐ ์
๋ค์ ํน์ฑ A ๋๋ ํน์ฑ B๋ฅผ ๊ฐ์ง๊ณ ์๋ค. ๋ณดํธ ํ๋ฆ์ ์ฑ๋ฅ์ ์
๋ค์ ํน์ฑ์ด ์ด๋ป๊ฒ ๋ฐฐ์น๋จ์ ๋ฐ๋ผ ๊ฒฐ์ ๋๋ค.
+
+
+๋ณดํธ ํ๋ฆ์ ์ฑ๋ฅ์ ๊ฒ์ฌํ๊ธฐ ์ํด ํฉ๊ฒฉ๊ธฐ์ค K๋ผ๋ ๊ฐ์ ์ฌ์ฉํ๋ค.
+
+์ถฉ๊ฒฉ์ ๋ณดํธ ํ๋ฆ ๋จ๋ฉด์ ์ธ๋ก ๋ฐฉํฅ์ผ๋ก ๊ฐํด์ง๋ฏ๋ก, ์ธ๋ก ๋ฐฉํฅ ์
๋ค์ ํน์ฑ์ด ์ค์ํ๋ค.
+
+๋จ๋ฉด์ ๋ชจ๋ ์ธ๋ก๋ฐฉํฅ์ ๋ํด์ ๋์ผํ ํน์ฑ์ ์
๋ค์ด K๊ฐ ์ด์ ์ฐ์์ ์ผ๋ก ์๋ ๊ฒฝ์ฐ์๋ง ์ฑ๋ฅ๊ฒ์ฌ๋ฅผ ํต๊ณผํ๊ฒ ๋๋ค.
+
+
+์ฑ๋ฅ๊ฒ์ฌ์ ํต๊ณผํ๊ธฐ ์ํด์ ์ฝํ์ ์ฌ์ฉํ์ฌ์ผ ํ๋ค.
+
+์ฝํ์ ๋ง ๋ณ๋ก ํฌ์
ํ ์ ์์ผ๋ฉฐ ์ด ๊ฒฝ์ฐ ํฌ์
ํ๋ ๋ง์ ๋ชจ๋ ์
๋ค์ ํ๋์ ํน์ฑ์ผ๋ก ๋ณ๊ฒฝ๋๋ค.
+
+ํน์ ๋ง์ ์ฝํ A๋ฅผ ํฌ์
ํ๋ฉด ๋ง ๋ด์ ๋ชจ๋ ์
๋ค์ด ํน์ฑ A๋ก ๋ณ๊ฒฝ๋๋ฉฐ, ์ฝํ B๋ฅผ ๋ฃ๊ฒ ๋๋ฉด ํน์ฑ์ด ๋ชจ๋ ํน์ฑ B๋ก ๋ณ๊ฒฝ๋๋ค.
+
+
+๋๊ป D, ๊ฐ๋กํฌ๊ธฐ W์ธ ๋ณดํธ ํ๋ฆ ๋จ๋ฉด์ ์ ๋ณด์ ํฉ๊ฒฉ๊ธฐ์ค K๊ฐ ์ฃผ์ด์ก์ ๋, ์ฝํ ํฌ์
ํ์๋ฅผ ์ต์๋ก ํ์ฌ ์ฑ๋ฅ๊ฒ์ฌ๋ฅผ ํต๊ณผํ ์ ์๋ ๋ฐฉ๋ฒ์ ์ฐพ๊ณ ,
+
+์ด๋์ ์ฝํ ํฌ์
ํ์๋ฅผ ์ถ๋ ฅํ๋ผ.
+
+์ฝํ์ ํฌ์
ํ์ง ์๊ณ ๋ ์ฑ๋ฅ๊ฒ์ฌ๋ฅผ ํต๊ณผํ๋ ๊ฒฝ์ฐ์๋ 0์ ์ถ๋ ฅํ๋ค.
+
+
+## ์ ์ฝ์ฌํญ
+
+1. ์๊ฐ์ ํ : ์ต๋ 50๊ฐ ํ
์คํธ ์ผ์ด์ค๋ฅผ ๋ชจ๋ ํต๊ณผํ๋๋ฐ, C/C++/Java ๋ชจ๋ 5์ด
+
+2. ๋ณดํธ ํ๋ฆ์ ๋๊ป D๋ 3์ด์ 13์ดํ์ ์ ์์ด๋ค. (3โคDโค13)
+
+3. ๋ณดํธ ํ๋ฆ์ ๊ฐ๋กํฌ๊ธฐ W๋ 1์ด์ 20์ดํ์ ์ ์์ด๋ค. (1โคWโค20)
+
+4. ํฉ๊ฒฉ๊ธฐ์ค K๋ 1์ด์ D์ดํ์ ์ ์์ด๋ค. (1โคKโคD)
+
+5. ์
์ด ๊ฐ์ง ์ ์๋ ํน์ฑ์ A, B ๋ ๊ฐ๋ง ์กด์ฌํ๋ค.
+
+
+# ์
๋ ฅ
+
+์ฒซ ์ค์ ์ด ํ
์คํธ ์ผ์ด์ค์ ๊ฐ์ T๊ฐ ์ฃผ์ด์ง๋ค.
+
+๋ ๋ฒ์งธ ์ค๋ถํฐ T๊ฐ์ ํ
์คํธ ์ผ์ด์ค๊ฐ ์ฐจ๋ก๋๋ก ์ฃผ์ด์ง๋ค.
+
+๊ฐ ํ
์คํธ ์ผ์ด์ค์ ์ฒซ ์ค์๋ ๋ณดํธ ํ๋ฆ์ ๋๊ป D, ๊ฐ๋กํฌ๊ธฐ W, ํฉ๊ฒฉ๊ธฐ์ค K๊ฐ ์ฐจ๋ก๋ก ์ฃผ์ด์ง๋ค.
+
+๊ทธ ๋ค์ D์ค์ ๋ณดํธ ํ๋ฆ ๋จ๋ฉด์ ์ ๋ณด๊ฐ ์ฃผ์ด์ง๋ค. ๊ฐ ์ค์๋ ์
๋ค์ ํน์ฑ W๊ฐ๊ฐ ์ฃผ์ด์ง๋ค. (ํน์ฑA๋ 0, ํน์ฑB๋ 1๋ก ํ์๋๋ค.)
+
+
+# ์ถ๋ ฅ
+
+ํ
์คํธ ์ผ์ด์ค์ ๊ฐ์๋งํผ T์ค์ T๊ฐ์ ํ
์คํธ ์ผ์ด์ค ๊ฐ๊ฐ์ ๋ํ ๋ต์ ์ถ๋ ฅํ๋ค.
+
+๊ฐ ์ค์ โ#xโ๋ก ์์ํ๊ณ ๊ณต๋ฐฑ์ ํ๋ ๋ ๋ค์ ์ ๋ต์ ์ถ๋ ฅํ๋ค. (x๋ 1๋ถํฐ ์์ํ๋ ํ
์คํธ ์ผ์ด์ค์ ๋ฒํธ์ด๋ค)
+
+์ถ๋ ฅํด์ผ ํ ์ ๋ต์ ์ฑ๋ฅ๊ฒ์ฌ๋ฅผ ํต๊ณผํ ์ ์๋ ์ฝํ์ ์ต์ ํฌ์
ํ์์ด๋ค. ์ฝํ์ ํฌ์
ํ์ง ์๊ณ ๋ ์ฑ๋ฅ๊ฒ์ฌ๋ฅผ ํต๊ณผํ๋ ๊ฒฝ์ฐ์๋ 0์ ์ถ๋ ฅํ๋ค.
+
+# ํ์ด
+
+DFS๋ฅผ ํตํด ๊ฐ ์ธต ๋ง๋ค ์ฝํ A ํน์ B๋ฅผ ํฌ์
ํ๊ฑฐ๋, ํฌ์
ํ์ง ์๋ ๊ฒฝ์ฐ๋ฅผ ํ์ํ๋ค.
+
+๊ทธ๋ฆฌ๊ณ ๊ฐ ํ์๋ง๋ค ํ
์คํธ๋ฅผ ํต๊ณผํ ์ ์๋์ง ํ์ธํ์ฌ, ํต๊ณผํ ์ ์๋ค๋ฉด ์ต์ ์ฃผ์
ํ์๋ฅผ ๊ฐฑ์ ํ๊ณ ํ์์ ์ค๋จํ๋ค.
+
+## `test_film()`
+
+๋ณดํธ ํ๋ฆ ํ
์คํธ๋ ์ธ๋ก๋ก ์ฐ์ํ๋ ํน์ฑ์ ์ฐพ์ํ ํ๋ค.
+
+```py
+def chk_test():
+ chk_a_list = [0] * k
+ chk_b_list = [1] * k
+
+ for w_i in range(w):
+ is_success = False
+
+ for d_i in range(d - k + 1):
+ cur_chk = [film[tmp_i][w_i] for tmp_i in range(d_i, d_i + k)]
+ if cur_chk == chk_a_list or cur_chk == chk_b_list:
+ is_success = True
+ break
+ if not is_success:
+ return False
+ return True
+```
+
+๊ทธ๋์ ์์ ๊ฐ์ด `k`๋งํผ ์ธ๋ก๋ก ๋ฐฐ์ด์ ๋ง๋ค์ด ๊ฐ์ ๊ฐ์ผ๋ก ์ฐ์ํ๋ ์ง ํ์ธํ๋ค. (`[film[tmp_i][w_i] for tmp_i in range(d_i, d_i + k)]`)
+
+## ์ฝ๋
+
+```py
+test_case = int(input())
+
+def chk_test():
+ chk_a_list = [0] * k
+ chk_b_list = [1] * k
+
+ for w_i in range(w):
+ is_success = False
+
+ for d_i in range(d - k + 1):
+ cur_chk = [film[tmp_i][w_i] for tmp_i in range(d_i, d_i + k)]
+ if cur_chk == chk_a_list or cur_chk == chk_b_list:
+ is_success = True
+ break
+ if not is_success:
+ return False
+ return True
+
+
+def test_film(film, depth=0, cnt_inject=0, chk_list=[]):
+ global min_inject
+
+ if cnt_inject >= min_inject:
+ return
+
+ if chk_test():
+ min_inject = min(min_inject, cnt_inject)
+ return
+
+ if depth >= d:
+ return
+
+ origin_membrane = film[depth][:]
+
+ # ํ์ฌ ์ธต์ ๊ทธ๋๋ก
+ test_film(film, depth + 1, cnt_inject)
+
+ # ํ์ฌ ์ธต์ a๋ก
+ film[depth] = inject_a
+ test_film(film, depth + 1, cnt_inject + 1)
+ film[depth] = origin_membrane
+
+ # ํ์ฌ ์ธต์ b๋ก
+ film[depth] = inject_b
+ test_film(film, depth + 1, cnt_inject + 1)
+ film[depth] = origin_membrane
+
+for t in range(test_case):
+ d, w, k = map(int, input().split())
+
+ film = [list(map(int, input().split())) for _ in range(d)]
+
+ inject_a = [0] * w
+ inject_b = [1] * w
+
+ min_inject = float('inf')
+
+ test_film(film)
+ print(f"#{t + 1} {min_inject}")
+```
+
+DFS๋ฅผ ์งํํ๋ฉด์ ์ง๊ธ์ ํ๋ฆ(`film`), ๊น์ด(`depth`), ํฌ์
ํ ํ์(`cnt_inject`)๋ฅผ ๋๊ฒจ์ค๋ค. ์ด ๋ ์ฝ๋ฌผ์ ํฌ์
ํ๋ค๋ฉด, ์ฌ๊ท๊ฐ ๋๋ ํ ์๋ ์ํ๋ก ๋๋ ค์ค๋ค.
\ No newline at end of file
diff --git a/_posts/2024-09-09-boj_14712.markdown b/_posts/2024-09-09-boj_14712.markdown
new file mode 100644
index 00000000000..2d3d514ebd3
--- /dev/null
+++ b/_posts/2024-09-09-boj_14712.markdown
@@ -0,0 +1,89 @@
+---
+title: "[BOJ]๋ด๋ชจ๋ด๋ชจ (Easy) - 14712 (G5)"
+author: kwon
+date: 2024-09-09T14:00:00 +0900
+categories: [boj, gold]
+tags: [brute-force, backtracking]
+math: true
+mermaid: false
+---
+
+| ์๊ฐ ์ ํ | ๋ฉ๋ชจ๋ฆฌ ์ ํ |
+| --- | --- |
+| 1 ์ด | 512 MB |
+
+# ๋ฌธ์
+
+๋ค๋ชจ๋ ๋ฟรรร ๊ฒ์์ ๊น์ ๊ฐ๋ช
์ ๋ฐ์, ์ง์ฌ๊ฐํ ๋ชจ์์ ๊ฒฉ์ํ๊ณผ "๋ด๋ชจ"๋ผ๋ ์์๊ป๋ผ์ ์๋ฌผ์ ์ด์ฉํ๋ "๋ด๋ชจ"๋ชจโ๋ผ๋ ๊ฒ์์ ๋ง๋ค์๋ค. ์ด ๊ฒ์์ ๊ท์น์ ์์ฃผ ๊ฐ๋จํ๋ค. ๊ฒฉ์ํ์ ๋น์ด ์๋ ์นธ์ ์์๋ก ๊ณจ๋ผ "๋ด๋ชจ"๋ฅผ ํ๋ ์ฌ๋ ค๋๊ฑฐ๋, "๋ด๋ชจ"๊ฐ ์ฌ๋ผ๊ฐ ์นธ ๋ค ๊ฐ๊ฐ 2 ร 2 ์ฌ๊ฐํ์ ์ด๋ฃจ๋ ๋ถ๋ถ์ ์ฐพ์ ๊ทธ ์์ ์๋ "๋ด๋ชจ"๋ค์ ๋ชจ๋ ์์ ๋ ๊ฒ์ ์ง๋ฆด ๋๊น์ง ๋ฐ๋ณตํ๋ฉด ๋๋ค.
+
+ํ์ง๋ง ์ํ๊น๊ฒ๋ ๊ฒ์์ ์ ๋ง ์ฌ๋ฏธ๊ฐ ์์๊ณ , ๋ค๋ชจ๋ ์์ฃผ ๋นจ๋ฆฌ ์ง๋ ค ๋ฒ๋ฆฌ๊ณ ๋ง์๋ค. ์ค๋งํ ๋ค๋ชจ๋ ๊ฒ์์ ์ ๋นํ ํ๋ ์ดํ๋ค๊ฐ, "๋ด๋ชจ"๋ฅผ ์์ ๊ณ ์ถ์๋ฐ ๊ฒฉ์ํ ์์ ์์จ ์ ์๋ "๋ด๋ชจ"๊ฐ ์์ผ๋ฉด ๊ฒ์์ ๊ทธ๋ง๋๊ธฐ๋ก ํ๋ค. ๋ค๋ชจ๊ฐ ๊ฒ์์ ๊ทธ๋ง๋์์ ๋ ๋์ฌ ์ ์๋ "๋ด๋ชจ"์ ๋ฐฐ์น์ ๊ฐ์ง์๋ฅผ ๊ตฌํ์ฌ๋ผ.
+
+# ์
๋ ฅ
+
+์ฒซ ๋ฒ์งธ ์ค์ ๊ฒฉ์ํ์ ํ์ ๊ฐ์ N, ์ด์ ๊ฐ์ M(1 โค N, M โค 25, 1 โค N ร M โค 25)์ด ๊ณต๋ฐฑ์ผ๋ก ๊ตฌ๋ถ๋์ด ์ฃผ์ด์ง๋ค.
+
+# ์ถ๋ ฅ
+
+์ฒซ ๋ฒ์งธ ์ค์ ์ฃผ์ด์ง ๊ฒฉ์ํ์์ ๋์ฌ ์ ์๋, "๋ด๋ชจ"๋ค์ด ์ฌ๋ผ๊ฐ ์นธ์ด 2 ร 2 ์ฌ๊ฐํ์ ์ด๋ฃจ์ง ์๋ ๋ชจ๋ ๋ฐฐ์น์ ๊ฐ์ง์๋ฅผ ์ถ๋ ฅํ๋ค.
+
+# ํํธ
+
+2ร2 ๊ฒฉ์ํ์ 2ร2 ์ฌ๊ฐํ์ ์ด๋ฃจ์ง ์๋๋ก "๋ด๋ชจ"๋ค์ ๋ฐฐ์นํ๋ ๋ฐฉ๋ฒ์ ๋ชจ๋ ๊ฒฝ์ฐ(24 = 16) ์ค ๋ค ์นธ ๋ชจ๋์ "๋ด๋ชจ"๊ฐ ์ฌ๋ผ๊ฐ ์๋ ๊ฒฝ์ฐ๋ฅผ ์ ์ธํ 15๊ฐ์ง๊ฐ ์๋ค.
+
+# ํ์ด
+
+DFS ๊ธฐ๋ฐ์ ๋ฐฑํธ๋ํน์ผ๋ก ํ์๋ค.
+๊ธฐ๋ณธ์ ์ธ DFS ์ํ์ x์ถ ๋ฐฉํฅ์ผ๋ก ์งํํ๋ฉด์ ๋ด๋ชจ๋ฅผ ๋๊ฑฐ๋ ๋์ง ์๋ ๋ฐฉ์์ผ๋ก ์งํํ๋ค.
+
+ํ์ง๋ง ๊ตณ์ด ์ฌ๊ฐํ์ด ์์ฑ๋๋ ๊ฒฝ์ฐ๊น์ง ๋ด๋ชจ๋ฅผ ๋์ ํ์๋ ์์ผ๋ฏ๋ก ๊ทธ๋ฐ ๊ฒฝ์ฐ๋ ์ ์ธํ๊ณ ํ์ํ๋ค.
+
+์ฌ๊ฐํ์ด ์์ฑ๋๋ ๊ฒ์ ํ์ฌ ์์น์์ **์ข์, ์ข, ์ฐ**์ ์๋ ์นธ์ ํ์ธํ๋ฉด ์ ์ ์๋ค.
+๋ง์ฝ ๋ค์ ๊ทธ๋ฆผ๊ณผ ๊ฐ์ด ์ฐํ, ์ฐ, ํ์ ์๋ ์นธ์ ํ์ธํ๋ฉด ๋ค์์ ๋์ ๋ด๋ชจ๋ฅผ ๋ฏธ๋ฆฌ ์ ์ ์์ด ์ฌ๊ฐํ์ด ์์ฑ๋๋์ง ํ์ธํ๊ธฐ ๊ณค๋ํ๋ค.
+
+{: width="40%"}
+
+๊ทธ๋์ ์๋์ ๊ฐ์ด **์ข์, ์ข, ์ฐ**๋ฅผ ํ์ธํ๋ฉด์ x์ถ ๋ฐฉํฅ์ผ๋ก ๋ด๋ชจ๋ฅผ ๋๊ฑฐ๋ ๋์ง ์๊ฒ ํ์์ ์งํํ๋ค.
+
+{: width="40%"}
+
+## ์ฌ๋ฐฉ ํ์์ด ํ๋ ์ด์
+
+๊ทธ๋ฅ ์ฐ๋ฆฌ ๋ง์ด ํ๋ ๊ฒ์ฒ๋ผ ์ฌ๋ฐฉ ํ์์ผ๋ก ํด๋ฒ๋ฆฌ๋ฉด ์๋๋, ํ ์ ์๋ค.
+ํ์ง๋ง x์ถ ๋ฐฉํฅ์ผ๋ก ์ฐจ๋ก๋๋ก ์งํํ์ง ์์ผ๋ฉด, ์์์ ์ธ๊ธํ ์ฐํ, ์ฐ, ํ๋ก ์ฌ๊ฐํ์ ํ์ธํ ๋์ ๊ฐ์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ค.
+
+์์ง ํ์ํ์ง ๋ชปํ(๋ด๋ชจ๋ฅผ ๋๊ฑฐ๋ ๋์ง ๋ชปํ) ์นธ์ ๋ํด ์ฐ๋ฆฌ๊ฐ ์ฌ๊ฐํ์ธ์ง ํ๋ณํ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค. ๊ทธ๋์ x์ถ ๋ฐฉํฅ(๊ธ ์ฐ๋ ๋ฐฉํฅ)์ผ๋ก ํ์ํ๋ฉด์ ์ด๋ฏธ ํ์์ด ๋๋ ์นธ์ ๋ํด์๋ง ์ฌ๊ฐํ์ ํ๋ณํ๋๋ก ๋ง๋ค๊ณ , ๋ชจ๋ ๊ฒฝ์ฐ์ ๋ํด ์ ๋๋ก ๋ด๋ชจ๋ฅผ ๋์ ์ ์๊ฒ ๋๋ค.
+
+## ์ฝ๋
+
+```python
+def fill_nemo(d=0):
+ global cnt
+ if N*M == d:
+ cnt += 1
+ return
+
+ y = d // M + 1
+ x = d % M + 1
+
+ # ์ฌ๊ฐํ์ด ์์ฑ ์๋๋ ๊ฒฝ์ฐ(๋ด๋ชจ๋ฅผ ๋์ ์ ์๋ ๊ฒฝ์ฐ)
+ if matrix[y-1][x] == 0 or matrix[y-1][x-1] == 0 or matrix[y][x-1] == 0:
+ # ๋ค์ ์์น์ ๋ค๋ชจ ์์ฑ
+ matrix[y][x] = 1
+ fill_nemo(d+1)
+ matrix[y][x] = 0
+
+ # ๋ค์ ์์น์ ๋ค๋ชจ ์์ฑ X
+ fill_nemo(d+1)
+
+
+N, M = map(int, input().split())
+
+matrix = [[0]*(M+1) for _ in range(N+1)]
+
+cnt = 0
+fill_nemo()
+
+print(cnt)
+```
+
+**์ข์, ์ข, ์ฐ**๋ฅผ ํ์ธํ๋๋ฐ ํธ๋ฆฌํ๊ธฐ ์ํด `[[0]*(M+1) for _ in range(N+1)]`๋ก ํ ์ค์ padding์ ์ถ๊ฐํ๋ค. ์ด์ ๋ง์ถฐ `x`, `y`๋ ์๋ ๊ฐ๋ณด๋ค +1 ํ์ฌ ์ฌ์ฉํ์๋ค.
\ No newline at end of file
diff --git a/_posts/2024-11-06-dockerCH1.markdown b/_posts/2024-11-06-dockerCH1.markdown
new file mode 100644
index 00000000000..fa5374e902a
--- /dev/null
+++ b/_posts/2024-11-06-dockerCH1.markdown
@@ -0,0 +1,105 @@
+---
+title: "CH1. ๋์ปค๋ ๋ฌด์์ธ๊ฐ? [๊ทธ๋ฆผ์ผ๋ก ๋ฐฐ์ฐ๋ ๋์ปค & ์ฟ ๋ฒ๋คํฐ์ค]"
+author: kwon
+date: 2024-11-06T14:00:00 +0900
+categories: [๋์ปค]
+tags: [docker]
+math: true
+mermaid: false
+---
+
+# SECTION 1. ๋์ปค๋ ๋ฌด์์ธ๊ฐ?
+---
+## 1. ๋์ปค์ ๊ธฐ๋ฅ
+
+> ๋์ปค๋ '๋ฐ์ดํฐ ๋๋ ํ๋ก๊ทธ๋จ์ ๊ฒฉ๋ฆฌ์ํค๋ ๊ธฐ๋ฅ'์ ์ ๊ณตํ๋ ์ํํธ์จ์ด๋ค.
+
+์ฃผ๋ก ์๋ฒ์ ์ฌ์ฉ๋๋ฉฐ, ๋ค์ํ ํ๋ก๊ทธ๋จ๊ณผ ๋ฐ์ดํฐ๋ฅผ ๊ฐ๊ฐ ๋
๋ฆฝ๋ ํ๊ฒฝ์ ๊ฒฉ๋ฆฌํ๋ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ค. ์ด์์ฒด์ (๋น์ทํ ๊ฒ) ํต์งธ๋ก ๊ฒฉ๋ฆฌํ๋ ๊ธฐ๋ฅ์ด๋ค.
+
+
+## 2. ์ปจํ
์ด๋์ ๋์ปค ์์ง
+
+### 2-1. ์ปจํ
์ด๋
+
+> ์ปดํจํฐ(์๋ฒ) ์์ ํ๊ฒฝ์ ์๊ฒ ๋ถํ ํ ๊ณต๊ฐ
+
+์ด๋ ๊ฒ ๋๋์ด์ง ์ปจํ
์ด๋์ ๋ฐ์ดํฐ๋ ํ๋ก๊ทธ๋จ์ ๋์ด ๊ฒฉ๋ฆฌํ๋ค. ์ด๋ฅผ ๊ฒฉ๋ฆฌํ๋ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ ์ํํธ์จ์ด๊ฐ ๋์ปค๋ค.
+๋์ปค๋ ๋์ปค ์ํํธ์จ์ด ๋ณธ์ฒด์ธ **๋์ปค ์์ง**์ ์ค์นํด ์ฌ์ฉํ๋ค. ์ด **๋์ปค ์์ง**์ ์ฌ์ฉํ์ฌ ์ปจํ
์ด๋๋ฅผ ์์ฑํ๊ณ ๊ตฌ๋ํ ์ ์๋ค.
+
+#### ์ด๋ฏธ์ง
+
+์ปจํ
์ด๋๋ฅผ ๋ง๋๋ ๋ฐ์๋ ๋์ปค ์์ง ์ธ์๋ **์ด๋ฏธ์ง**๊ฐ ํ์ํ๋ค
+
+> ์ด๋ฏธ์ง๋ ์ปจํ
์ด๋์ ๋นตํ๊ณผ๋ ๊ฐ์ ์ญํ ์ ํ๋ ๊ฒ
+
+์ด๋ฏธ์ง์๋ ๋ง์ ์ข
๋ฅ๊ฐ ์๋ค. ์ํ์น ์ปจํ
์ด๋๋ฅผ ๋ง๋ค๋ ค๋ฉด ์ํ์น ์ด๋ฏธ์ง๋ฅผ ์ฌ์ฉํ๊ณ , MySQL ์ปจํ
์ด๋๋ฅผ ๋ง๋ค๋ ค๋ฉด MySQL ์ด๋ฏธ์ง๋ฅผ ์ฌ์ฉํ๋ค.
+
+์ฉ๋์ด ํ๋ฝํ๋ ํ, ํ๋์ ๋์ปค์์ ์ฌ๋ฌ ๊ฐ์ ์ปจํ
์ด๋๋ฅผ ๋ง๋ค ์ ์๋ค.
+
+### 2-2. ๋์ปค์ ์๋
+> ๋์ปค๋ ๋ฆฌ๋
์ค ์์์ ๋์ํ๋ค.
+
+Windows๋ MacOS์์๋ ๋์ํ์ง๋ง ๊ฒฐ๊ตญ ๋ด๋ถ์ ์ผ๋ก ๋ฆฌ๋
์ค๊ฐ ๊ฐ์
ํ๋ค. ๋ํ, ์ปจํ
์ด๋์์ ๋์์ํจ ํ๋ก๊ทธ๋จ๋ ๋ฆฌ๋
์ค์ฉ ํ๋ก๊ทธ๋จ์ด๋ค.
+
+
+## 3. ๋์ปค์ ํ์์ฑ
+
+### 3-1. ๊ฒฉ๋ฆฌ์ ํ์์ฑ
+
+> ํ๋ก๊ทธ๋จ์ ๋จ๋
์ผ๋ก ๋์ํ์ง ์๋๋ค.
+
+๋๋ถ๋ถ์ ํ๋ก๊ทธ๋จ์ ์ด๋ค ์คํ ํ๊ฒฝ์ด๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ, ๋ค๋ฅธ ํ๋ก๊ทธ๋จ์ ์ด์ฉํด ๋์ํ๋ค.
+์๋ฅผ ๋ค์ด PHP๋ก ์์ฑ๋ ํ๋ก๊ทธ๋จ์ ์คํํ๋ ๋ฐ๋ PHP ์คํ ํ๊ฒฝ์ด ํ์ํ ๊ฒ์ด๊ณ , python์ผ๋ก ์์ฑ๋ ํ๋ก๊ทธ๋จ์ ๋ค๋ฅธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ๊ฐ ๋ง๋ค.
+
+์ํํธ์จ์ด๋ ๋ง์ฐฌ๊ฐ์ง๋ก ์ฌ๋ฌ ๊ฐ์ ํ๋ก๊ทธ๋จ์ผ๋ก ๊ตฌ์ฑ๋ ๊ฒฝ์ฐ๊ฐ ๋ง๋ค. ์๋ฅผ ๋ค์ด WordPress๋ MySQL ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ๋ฐ๋ก ๊ฐ์ถ์ง ์์ผ๋ฉด ์ฌ์ฉํ ์ ์๋ค.
+๋ค๋ฅธ ๊ฒฝ์ฐ๋ก๋ ํ๋ก๊ทธ๋จ๋ค์ด ํน์ ํ directory๋ฅผ ๊ณต์ ํ๊ฑฐ๋ ๊ฐ์ ๊ฒฝ๋ก์ ์ฑ์ ์ ์ ์ฅํ๊ธฐ๋ ํ๋ค.
+
+์ด ๋๋ฌธ์ ํ๋์ ํ๋ก๊ทธ๋จ ์
๋ฐ์ดํธ๊ฐ ๋ค๋ฅธ ํ๋ก๊ทธ๋จ๋ค์ ์ํฅ์ ๋ฏธ์น๊ฒ ๋๋ ๊ฒฝ์ฐ๊ฐ ๋ฐ์ํ๋ค.
+๋๋, ์๋ฒ๋ฅผ ๊ตฌ์ถํ ๋ ์ด๋ฐ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์๋ค. ์๋ฒ์์๋ ์ฌ๋ฌ ํ๋ก๊ทธ๋จ์ด ํจ๊ป ๋์ํ๊ฒ ๋๋ค. ์ด ๋ ์ค๊ณ ๋จ๊ณ์์ ๋ํ๋์ง ์์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๊ธฐ๋ ํ๋ค. ์ด ๊ฒฝ์ฐ ๋๋ถ๋ถ ํ๋ก๊ทธ๋จ ๊ฐ์ ๊ณต์ ๋๋ฌธ์ ๋ฐ์ํ๋ค.
+
+### 3-2. ํ๋ก๊ทธ๋จ์ ๊ฒฉ๋ฆฌ
+
+๋์ปค ์ปจํ
์ด๋๋ ์์ ํ ๋
๋ฆฝ๋ ํ๊ฒฝ์ด๋ฏ๋ก ์ฌ๋ฌ ์ปจํ
์ด๋์์ ๊ฐ์ ํ๋ก๊ทธ๋จ์ ์คํํ ์ ์๋ค. ์ผ๋ฐ์ ์ผ๋ก ํ ์ปดํจํฐ์ ํ ๋ฒ์ ์ํํธ์จ์ด๋ง์ ์ค์นํ ์ ์๋ค. ํ์ง๋ง ๊ฒฉ๋ฆฌ๋ฅผ ํตํด ๋ค์ํ(ํน์ ๊ฐ์) ๋ฒ์ ์ ์ํํธ์จ์ด๋ฅผ ์ค์นํ ์ ์๋ค.
+
+---
+
+# SECTION 2. ์๋ฒ์ ๋์ปค
+---
+## 1. ์๋ฒ
+
+### 1-1. ๋ ๊ฐ์ง ์๋ฏธ์ ์๋ฒ
+
+๊ธฐ๋ฅ์ ์๋ฏธ์ ์๋ฒ๋ **์ด๋ค ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ ์๋ฏธ**์ด๋ค. ์ฆ, ์ฐ๋ฒ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ ์๋ฒ๋ '์น ์๋ฒ'์ด๊ณ , ๋ฉ์ผ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ ์๋ฒ๋ '๋ฉ์ผ ์๋ฒ'๊ฐ ๋๋ค.
+
+๋ฌผ๋ฆฌ์ ์ปดํจํฐ๋ก์ ์๋ฒ๋ ๋ฐ์คํฌํฑ ์ปดํจํฐ์ ๋ง์ฐฌ๊ฐ์ง๋ก ์ด๋๊ฐ์ **๋ฌผ๋ฆฌ์ ์ผ๋ก ์กด์ฌํ๋ ์ปดํจํฐ**์ด๋ค.
+
+๊ฐ์ธ์ฉ ์ปดํจํฐ๋ ๊ฐ์ธ์ด ์ฌ์ฉํ์ง๋ง ์๋ฒ๋ ์ฌ๋ฌ ์ฌ๋์ ์๊ฒฉ์ผ๋ก ์ ๊ทผํด ์ฌ์ฉํ๋ค.
+
+### 1-2. ์๋ฒ์ ๊ธฐ๋ฅ
+
+> ์๋ฒ์ ๊ธฐ๋ฅ์ ์ํํธ์จ์ด๊ฐ ์ ๊ณตํ๋ค.
+
+์ํ์น ๊ฐ์ ์น ์๋ฒ ์ํํธ์จ์ด๋ฅผ ์ค์นํ๋ฉด ์น ์๋ฒ ๊ธฐ๋ฅ์ ๊ฐ์ถ๋ฉฐ, Sendmail ๊ฐ์ ๋ฉ์ผ ์๋ฒ ์ํํธ์จ์ด๋ฅผ ์ค์นํ๋ฉด ๋ฉ์ธ ์๋ฒ๊ฐ ๋๋ค.
+๊ทธ๋ฆฌ๊ณ ๊ธฐ๋ฅ์ด ์ํํธ์จ์ด์์ ๋์จ๋ค๋ ๋ง์ "**์ฌ๋ฌ๊ฐ์ง ์ํํธ์จ์ด๋ฅผ ํ ์ปดํจํฐ์ ์ค์นํ ์ ์๋ค**"๋ ๋ง์ด๋ค. ๊ทธ๋ฌ๋ฏ๋ก ์ฌ๋ฌ ๊ธฐ๋ฅ์ ์๋ฏธ์ ์๋ฒ๊ฐ ํ๋์ ๋ฌผ๋ฆฌ์ ์ปดํจํฐ์ ํจ๊ป ์กด์ฌํ ์ ์๋ค.
+
+### 1-3. ์์ ๋ก์ด ์ฎ๊ธธ ์ ์๋ ์ปจํ
์ด๋
+
+> ๋์ปค๋ฅผ ์ด์ฉํ๋ฉด ๋ฌผ๋ฆฌ์ ํ๊ฒฝ์ ์ฐจ์ด, ์๋ฒ ๊ตฌ์ฑ์ ์ฐจ์ด๋ฅผ ๋ฌด์ํ ์ ์๋ค.
+
+์ปจํ
์ด๋๋ ์์ ๋กญ๊ฒ ์ฎ๊ธธ ์ ์๋ค. ์ค์ ์ปจํ
์ด๋ ์์ฒด๋ฅผ ์ฎ๊ธด๋ค๊ธฐ ๋ณด๋ค๋ ์ปจํ
์ด๋์ ์ ๋ณด๋ฅผ ๋ด๋ณด๋ด๊ธฐํ ๋ค์, ๋ค๋ฅธ ๋์ปค ์์ง์์ ๋ณต์ํ๋ ํํ์ด๋ค.
+
+์ด๋ฐ ํน์ฑ์ ํตํด ๋๊ฐ์ ์ํ๋ก ํ๋ํ ์ปจํ
์ด๋๋ฅผ ํ์ ์ ์์๊ฒ ๋ฐฐํฌํด ๋ชจ๋๊ฐ ๋์ผํ ๊ฐ๋ฐํ๊ฒฝ์ ์ฌ์ฉํ ์ ์๋ค.
+
+## ๋์ปค VS. ๊ฐ์ํ
+
+### ๊ฐ์ํ ๊ธฐ์
+
+๋ฉ์ธ๋ณด๋, CPU, RAM ๋ฑ์ ๋ฌผ๋ฆฌ์ ์ธ ๋ถํ์ ์ํํธ์จ์ด๋ก ๊ตฌํํ์ฌ ๋์ฒดํ๋ ๊ฒ.
+์ค์ง์ ์ผ๋ก ๋ฌผ๋ฆฌ ์๋ฒ์ ๋๋ฑํ ๊ฒ์ด๋ฏ๋ก ์ด์์ฒด์ ๋ ์๋ฌด ๊ฒ์ด๋ ์ค์นํ ์ ์๊ณ , ๊ทธ ์์ ์ด๋ค ์ํํธ์จ์ด๋ฅผ ๊ตฌ๋ํด๋ ๋ฌด๋ฐฉํ๋ค.
+
+### ๋์ปค
+
+์ปจํ
์ด๋์์ ๋ฆฌ๋
์ค๊ฐ ๋์ํ๋ ๊ฒ์ฒ๋ผ ๋ณด์ด์ง๋ง ์ค์ ๋ฆฌ๋
์ค๊ฐ ๋์ํ๋ ๊ฒ์ ์๋๋ค. ์ด์์ฒด์ ์ ๊ธฐ๋ฅ ์ค ์ผ๋ถ๋ฅผ ํธ์คํธ ์ญํ ์ ํ๋ ๋ฌผ๋ฆฌ ์๋ฒ์ ๋งก๊ฒจ ๋ถ๋ด์ ๋์ด ๋ ํํ์ด๋ค.
+์ฆ, ์ปจํ
์ด๋๋ ์ด์์ฒด์ ์ ์ผ๋ถ ๊ธฐ๋ฅ์ ํธ์คํธ ์ปดํจํฐ์ ์์กดํ๊ธฐ ๋๋ฌธ์ ๋ฌผ๋ฆฌ ์๋ฒ์๋ ๋ฆฌ๋
์ค ๊ธฐ๋ฅ์ด ํ์ํ๋ฉฐ, ์ปจํ
์ด๋์ ๋ด์ฉ๋ ๋ฆฌ๋
์ค ์ด์์ฒด์ ๊ฐ ๋ ์ ๋ฐ์ ์๋ค.
+
+
\ No newline at end of file
diff --git a/_posts/2024-11-07-dockerCH2.markdown b/_posts/2024-11-07-dockerCH2.markdown
new file mode 100644
index 00000000000..295e3bdfcbd
--- /dev/null
+++ b/_posts/2024-11-07-dockerCH2.markdown
@@ -0,0 +1,164 @@
+---
+title: "CH2. ๋์ปค์ ๋์ ์๋ฆฌ [๊ทธ๋ฆผ์ผ๋ก ๋ฐฐ์ฐ๋ ๋์ปค & ์ฟ ๋ฒ๋คํฐ์ค]"
+author: kwon
+date: 2024-11-07T14:00:00 +0900
+categories: [๋์ปค]
+tags: [docker]
+math: true
+mermaid: false
+---
+
+# SECTION 1. ๋์ปค์ ๋์ ์๋ฆฌ
+---
+## 2. ๋์ปค์ ๊ตฌ์กฐ
+
+{: width="80%"}
+
+์ ๊ทธ๋ฆผ์ ๋์ปค์ ๊ฐ๋จํ ๊ตฌ์กฐ๋ฅผ ๋ํ๋ธ ๊ฒ์ด๋ค. ๋ฌผ๋ฆฌ ์๋ฒ๊ฐ ์๊ณ , ์ฌ๊ธฐ์ ๋์ํ๋ ๋ฆฌ๋
์ค ์ด์์ฒด์ ๊ฐ ์๋ค.
+
+์ผ๋ฐ์ ์ธ ์๋ฒ๋ผ๋ฉด ์ด ์ํฉ์์ ์ด์์ฒด์ ์์ ํ๋ก๊ทธ๋จ์ด๋ ๋ฐ์ดํฐ๊ฐ ์ง์ ์ฌ๋ผ๊ฐ๊ฒ ์ง๋ง ๋์ปค๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ์๋ **OS ์์ ๋์ปค ์์ง์ด ๋์ํ๊ณ ๊ทธ ์์์ ์ปจํ
์ด๋๊ฐ ๋์**ํ๋ค.
+
+### 2-1. OS๋ ๋ญ ํ๋๊ฐ?
+
+> ์ํํธ์จ์ด๋ ํ๋ก๊ทธ๋จ์ ๋ช
๋ น์ ํ๋์จ์ด์ ์ ๋ฌํ๋ ์ญํ ์ ํ๋ค.
+
+ํ๋์จ์ด๋ ์์ ์ ํ๋จ์ผ๋ก ์ฌ๋ฌ ์๋ฏธ ์ค ์ ์ ํ ๊ฒ์ ๊ณ ๋ฅด๊ฑฐ๋ ์ ๋นํ ์ผ์ ํ ์ ์๊ณ , ์ง์๋ฐ์ ๋๋ก๋ง ์ํํ ์ ์์ผ๋ฏ๋ก ๋์ ํ๋ํ๋๋ฅผ ์ง์ ํด ์ฃผ์ง ์์ผ๋ฉด ์ ๋๋ค.
+
+OS๋ ์ด๋ฐ ์ผ๋ค์ ํ๋์จ์ด๊ฐ ์์๋ค์ ์ ์๊ฒ ๋ฒ์ญํ์ฌ ์ ๋ฌํ๊ฒ ๋๋ค.
+
+### 2-2. ๋์ปค์ ๋ฆฌ๋
์ค OS ๋น์ทํ ๊ฒ
+
+๋ณธ๋ OS๋ '์ปค๋'์ด๋ผ๋ ๋ถ๋ถ๊ณผ '๊ทธ ์ด์ธ์ ์ฃผ๋ณ ๋ถ๋ถ'์ผ๋ก ๊ตฌ์ฑ๋๋ค. ์ฃผ๋ณ ๋ถ๋ถ์ด ํ๋ก๊ทธ๋จ์ ์ฐ๋ฝ ๋ด์ฉ์ ์ปค๋์ ์ ๋ฌํ๊ณ ์ปค๋์ด ํ๋์จ์ด๋ฅผ ๋ค๋ฃฌ๋ค.
+
+์ฌ๊ธฐ์ ๋์ปค์ ์ปจํ
์ด๋๋ ์ด์์ฒด์ ์ ์ฃผ๋ณ ๋ถ๋ถ์ ๊ฐ์ง๊ณ ์๋ค. ์ด๋ฅผ ํตํด ํ๋ก๊ทธ๋จ์ ๋ช
๋ น์ ์ ๋ฌ๋ฐ๊ณ , ์ด๋ฅผ ๋ฐ๋ฐํ์ด ๋๋ ์ปค๋์ ์ ๋ฌํ๋ ๊ตฌ์กฐ๋ก ๋์ด ์๋ค.
+
+์ด ๋๋ถ์ OS ์ ์ฒด๋ฅผ ์ปจํ
์ด๋์ ๋ฃ์ง ์์ ์ ์์ด, ๋์ปค๋ ๊ฐ์ฅ ํฐ ํน์ง์ธ '๊ฐ๋ฒผ์'์ ์ป์ ์ ์๋ค.
+
+### 2-3. ๋์ปค๋ ๊ธฐ๋ณธ์ ์ผ๋ก Linux ์ฉ์ด๋ค.
+
+> ๋์ปค๋ ๋ฆฌ๋
์ค ์ด์์ฒด์ ๊ฐ ๋์ํ๋ ๊ฒ์ ์ ์ ๋ก ํ๋ ๊ตฌ์กฐ๋ก ๋์ด ์๊ธฐ ๋๋ฌธ์ ๋ฆฌ๋
์ค ์ด์์ฒด์ ์์๋ง ๋์ํ ์ ์๋ค.
+
+๊ทธ๋ฌ๋ฏ๋ก ์ปจํ
์ด๋ ์์ ๋ค์ด ์๋ ์ฃผ๋ณ ๋ถ๋ถ๋ ์ด์ ๋ง์ถฐ ๋ฆฌ๋
์ค ์ด์์ฒด์ ์ ์ฃผ๋ณ ๋ถ๋ถ์ด์ด์ผ ํ๋ค.
+
+๋์ปค์ ๋ํ ์ด์ผ๊ธฐ๋ ๋ณดํต ์๋ฒ ํ๊ฒฝ์ ์ ์ ๋ก ํ ๊ฒ์ด ๋ง์๋ฐ, ๋ฆฌ๋
์ค ์ด์์ฒด์ ๊ฐ ์๋ฒ์์ ์ฌ์ฉ๋๋ ๊ฒฝ์ฐ๊ฐ ๋ง๊ณ , ๋ฆฌ๋
์ค์ฉ SW๋ ์๋ฒ์ฉ SW๊ฐ ๋ง๊ธฐ ๋๋ฌธ์ด๋ค.
+
+#### ์๋์ฐ์ macOS์์ ๋์ปค ๊ตฌ๋ํ๊ธฐ
+
+VirtualBox๋ VMware์ ๊ฐ์ ๊ฐ์ ํ๊ฒฝ ์์ ๋ฆฌ๋
์ค ์ด์์ฒด์ ๋ฅผ ์ค์นํ๊ณ ๊ทธ ์์์ ๋์ปค๋ฅผ ์คํํ๊ฑฐ๋$^{1)}$, '์๋์ฐ / macOS ์ฉ ๋์ปค ๋ฐ์คํฌํฑ'์ฒ๋ผ ๋์ปค๋ฅผ ์คํํ๋ ๋ฐ ํ์ํ ๋ฆฌ๋
์ค ์ด์์ฒด์ ๋ฅผ ํฌํจํ๋ ํจํค์ง๋ฅผ ์ค์น$^{2)}$ํด ์ฌ์ฉํ๋ค.
+
+์ฆ, ๋์ปค๋ฅผ ์ฌ์ฉํ๋ ค๋ฉด **์ด๋ค ํํ๋ก๋ ๋ฆฌ๋
์ค ์ด์์ฒด์ ๋ฅผ ๊ฐ์ถฐ์ผ ํ๋ค**.
+
+---
+
+# SECTION 2. ๋์ปค ํ๋ธ์ ์ด๋ฏธ์ง, ๊ทธ๋ฆฌ๊ณ ์ปจํ
์ด๋
+---
+## 1. ์ด๋ฏธ์ง
+
+> ์ด๋ฏธ์ง๋ ์ปจํ
์ด๋๋ฅผ ๋ง๋๋ ๋ฐ ์ฌ์ฉํ๋ ๊ธํ๊ณผ ๊ฐ๋ค.
+
+์ด๋ฏธ์ง๋ ๊ธํ๊ณผ ๊ฐ์ ์ญํ ์ ํ๋ ๊ฒ์ผ๋ก, ํ๋๋ง ์์ผ๋ฉด ๋๊ฐ์ ๊ฒ์ ์ฌ๋ฌ ๊ฐ ๋ง๋ค ์ ์๋ค.
+๋๋ถ์ ๋์ผํ ์ปจํ
์ด๋๋ฅผ ์ฌ๋ฌ ๊ฐ ๋ฐฐ์น๋ผ๊ธฐ ํธ๋ฆฌํ๋ค.
+
+์ด๋ฏธ์ง๋ก๋ง ์ปจํ
์ด๋๋ฅผ ๋ง๋ค ์ ์๋ ๊ฒ์ด ์๋๋ผ ์ปจํ
์ด๋๋ก๋ ์ด๋ฏธ์ง๋ฅผ ๋ง๋ค ์ ์๋ค.
+์
๋ฐ์ดํธ๋ฅผ ํ ์ปจํ
์ด๋์ ์ด๋ฏธ์ง๋ฅผ ๋ง๋ค์ด ํด๋น ํํ์ ์ปจํ
์ด๋๋ฅผ ๋ฐ๋ก ๋ง๋ค ์ ์๊ฒ ๋๋ค.
+
+์ด๋ฐ ํน์ฑ ๋๋ถ์ ๋์ผํ ์ปจํ
์ด๋๋ฅผ ์ฌ๋ฌ ๊ฐ ๋ง๋ค์ง ์์๋ ์ปจํ
์ด๋๋ฅผ ์ด๋์ํฌ ์ ์๋ค.
+์ปจํ
์ด๋๋ ๋์ปค ์์ง๋ง ์ค์น๋์ด ์์ผ๋ฉด ๊ตฌ๋์ด ๊ฐ๋ฅํ๋ฏ๋ก, ๋ค๋ฅธ ์๋ฒ๋ ์ปดํจํฐ์ ๋์ปค ์์ง์ ์ค์นํ๊ณ ์๋ก์ด ๋์ปค ์์ง์ ์ด๋ฏธ์ง๋ฅผ ์ด์ฉํด ๋ํฑ์ ์ปจํ
์ด๋๋ฅผ ์์ฑํ ์ ์๋ค.
+
+### 1-1. ๋์ปค ํ๋ธ
+
+๋์ปค ํ๋ธ๋ ๊ณต๊ฐ๋ ์ปจํ
์ด๋ ์ด๋ฏธ์ง๊ฐ ๋ชจ์ฌ ์๋ ๊ณณ์ด๋ค.
+๋์ปค ํ๋ธ์๋ ์ด์์ฒด์ ์ฃผ๋ณ๋ถ๋ง ๋ค์ด ์๋ ์ด๋ฏธ์ง๋ถํฐ ์ฌ๋ฌ ์ํํธ์จ์ด๊ฐ ํฌํจ๋ ์ด๋ฏธ์ง๊น์ง ๋ค์ํ ๊ฒ๋ค์ด ์กด์ฌํ๋ค.
+
+๋ํ, ๋ฆฌ๋
์ค์๋ ๋ค์ํ ๋ฐฐํฌํ์ด ์๋๋ฐ ์ด๋ค์ ์ด๋ฏธ์ง๋ ๋ชจ๋ ์ ๊ณต๋๋ค.
+
+#### ์์ ํ ์ปจํ
์ด๋ ์ด๋ฏธ์ง๋ฅผ ๊ณ ๋ฅด๋ ๋ฐฉ๋ฒ
+
+1. ๊ณต์ ์ด๋ฏธ์ง๋ฅผ ์ฌ์ฉํ๋ค
+
+๋์ปค์์ ์ง์ ๋ฐฐํฌํ๊ฑฐ๋ ํด๋น ์ํํธ์จ์ด๋ฅผ ๊ฐ๋ฐ ๋ฐ ๊ด๋ฆฌํ๋ ๊ธฐ์
์ด๋ ์กฐ์ง์์ ์ ๊ณตํ๋ ๊ฒ์ด ์๋ค.
+์ด๋ฐ ๊ณต์ ์ด๋ฏธ์ง๋ฅผ ์ฌ์ฉํ๋ฉด ์ด๋ฏธ์ง ์ ํ๋ ์ฝ๊ณ ๋ณด์๋ ์ฑ๊ธธ ์ ์๋ค.
+
+๋ค๋ง ์ปจํ
์ด๋๊ฐ ํน์ ์ด์์ฒด์ ๋ฐ ๋ฒ์ ์ผ๋ก ํ์ ๋๋ ๊ฒฝ์ฐ๊ฐ ์์ด, ๊ผญ ํน์ ์ด์์ฒด์ ๋ฐ ๋ฒ์ ์ ์ฌ์ฉํด์ผ ํ๋ ๊ฒฝ์ฐ ์ฃผ์ํด์ผ ํ๋ค.
+
+2. ์ปค์คํ
์ด๋ฏธ์ง
+
+ํ์ํ ์ต์์ ์์๊ฐ ๋ด๊ธด ์ด๋ฏธ์ง์ ํ์ํ ์ํํธ์จ์ด๋ฅผ ์ถ๊ฐ๋ก ์ค์นํด ์ปค์คํ
์ด๋ฏธ์ง๋ฅผ ๋ง๋ ๋ค.
+
+์ปจํ
์ด๋๋ ๋ค์ํ ์กฐํฉ์ ๊ณ ๋ คํด์ผ ํ๋ค. ๋์ปค๋ฅผ ์ฌ์ฉํ ๋์ ์์น ์ค ํ๋๋ก "ํ ์ปจํ
์ด๋์ ํ ํ๋ก๊ทธ๋จ"์ด๋ผ๋ ๊ฒ์ด ์๋ค. ์ด๋ ๊ฒ ๊ด๋ฆฌํ๋ ๊ฒ์ด ๋ณด์ ๋ฐ ์ ์ง ๊ด๋ฆฌ ์ธก๋ฉด์์ ์ ๋ฆฌํ๊ธฐ ๋๋ฌธ์ ๋ง์ด ์ฐ์ด๋ ์ ์ฑ
์ด๋ค.
+
+## ์ด์์ฒด์ ์ฃผ๋ณ๋ถ๋ฅผ ํ ์ข
๋ฅ๋ก ํต์ผํด์ผ ํ ๊น?
+
+์ปจํ
์ด๋ ๊ฐ์ ์์ ํ ๊ฒฉ๋ฆฌ๋์ด ์์ผ๋ฏ๋ก ์๋ก ๋ค๋ฅธ ๋ฐฐํฌํ์ ์ฌ์ฉํ ์ ์์ผ๋ฉฐ, ์ด๋ ๋์ปค์ ๋งค๋ ฅ ์ค ํ๋์ด๋ค.
+
+ํ์ง๋ง ์ปจํ
์ด๋์ ๋ก๊ทธ์ธ์ ํ ํ์๊ฐ ์๊ฑฐ๋ ํน์ DBMS๋ฅผ ์ฌ์ฉํ ๋๋ ์ด์์ฒด์ ์ข
๋ฅ์ ๋ฐ๋ผ ๋ฌธ์ ๋ฅผ ์ผ์ผํฌ ์ ์์ผ๋ฏ๋ก ๋ฐฐํฌํ์ ์ ํํ ์ ํํด์ผ ํ๋ค.
+
+---
+
+# SECTION 3. ๋์ปค ์ปจํ
์ด๋์ ์์ ์ฃผ๊ธฐ์ ๋ฐ์ดํฐ ์ ์ฅ
+---
+> ์ปจํ
์ด๋๋ '์ค๋ซ๋์ ์๊ปด ์ฐ๋ ๋ฌผ๊ฑด'์ด ์๋๋ผ '๊ทธ๋ ๊ทธ๋ ์ฐ๊ณ ๋ฒ๋ฆฌ๋ ์ผํ์ฉํ'์ ๊ฐ๊น๋ค.
+
+## 1. ์ปจํ
์ด๋์ ์์ ์ฃผ๊ธฐ
+
+์ปจํ
์ด๋๋ ์ฝ๊ฒ ๋ง๋ค ์ ์๊ธฐ ๋๋ฌธ์, ํ๋๋ฅผ ์
๋ฐ์ดํธํ๋ฉด์ ๊ณ์ ์ฌ์ฉํ๊ธฐ๋ณด๋ค๋ ์
๋ฐ์ดํธ๋ ์ํํธ์จ์ด๊ฐ ๋ค์ด์๋ ์๋ก์ด ์ปจํ
์ด๋๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข๋ค.
+
+๊ธฐ๋ณธ์ ์ผ๋ก ์ปจํ
์ด๋๋ ์ฌ๋ฌ ๊ฐ๋ฅผ ๋์์ ๊ฐ๋ํ๋ ์ํฉ์ ์ ์ ๋ก ํ๋๋ฐ ์ด๋ฅผ ๋ชจ๋ ์
๋ฐ์ดํธํ๋ ค๋ฉด ๋ง์ ์๊ณ ๊ฐ ๋ ๋ค. ์ด๋ ์ปจํ
์ด๋์ ์ฅ์ ์ด ํด์๋๋ ๊ฒ์ด๋ค.
+
+๊ทธ๋ฌ๋ฏ๋ก ์ค๋๋ ์ปจํ
์ด๋๋ฅผ ๋ฒ๋ฆฌ๊ณ ์๋ก์ด ์ด๋ฏธ์ง๋ก๋ถํฐ ์๋ก์ด ์ปจํ
์ด๋๋ฅผ ๋ง๋ค์ด ๊ฐ์ํ๋ ๋ฐฉ์์ ์ฌ์ฉํ๋ค.
+์ด์ฒ๋ผ ์ปจํ
์ด๋๋ฅผ '๋ง๋ค๊ณ ', '์คํํ๊ณ ', '์ข
๋ฃํ๊ณ ', 'ํ๊ธฐ'ํ ๋ค์ ๋ค์ ์ปจํ
์ด๋๋ฅผ '๋ง๋๋' ์ผ๋ จ์ ๊ณผ์ ์ **์ปจํ
์ด๋์ ์์ ์ฃผ๊ธฐ**๋ผ๊ณ ํ๋ค.
+
+### 1-1. ๋ฐ์ดํฐ ์ ์ฅ
+
+์ปจํ
์ด๋๋ฅผ ํ๊ธฐํ ๋ ๋ฐ์ดํฐ๋ฅผ ๋ณด์กดํ๊ธฐ ์ํด **๋์ปค๊ฐ ์ค์น๋ ๋ฌผ๋ฆฌ์ ์๋ฒ(ํธ์คํธ)์ ๋์คํฌ๋ฅผ ๋ง์ดํธํด** ์ด ๋์คํฌ์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๋ค.
+
+์ฌ๊ธฐ์ ๋ง์ดํธ๋ "๋์คํฌ๋ฅผ ์ฐ๊ฒฐํด ๋ฐ์ดํฐ๋ฅผ ๊ธฐ๋กํ ์ ์๋๋ก ํ ์ํ"๋ฅผ ์๋ฏธํ๋ค. ์ด๋ฐ ๋ฐฉ๋ฒ์ผ๋ก ์ปจํ
์ด๋ ์ธ๋ถ์ ๋ฐ์ดํฐ๋ฅผ ์์ ํ๊ฒ ์ ์ฅํ๋ค.
+
+์ด์์ฒด์ ๋ ์ํํธ์จ์ด ๋ถ๋ถ์ ์ปจํ
์ด๋ ํํ๋ก ๋ง๋ค์ด ์ฐ๊ณ ๋ฒ๋ฆฌ๋ ๊ฒ์ ๋ฐ๋ณตํ๊ณ , ๋ฐ์ดํฐ๋ ๋ค๋ฅธ ๊ณณ์ ์ ์ฅํด ๊ณ์ ์ฌ์ฉํ๋ค. ์ด๋ ์ค์ ํ์ผ๋ ๋ง์ฐฌ๊ฐ์ง๋ก ํ์ผ์ ์์ ํ๋ค๋ฉด ์ญ์ ๋์ง ์์ ๊ณณ์ ์ ์ฅํ๋ค.
+
+๊ทธ๋ฌ๋ ํ๋ก๊ทธ๋จ์ ๊ฐ๋ฐ ํ ๋๋ ๋ค๋ฅธ ์ ์ฅ์์ ์ ์ฅํ์ง ์๋ ๊ฒฝ์ฐ๋ ์์ผ๋ฏ๋ก ์ปจํ
์ด๋๋ฅผ ํ๊ธฐํ๊ธฐ ์ ์ค์ํ ๋ฐ์ดํฐ๊ฐ ์ปจํ
์ด๋์ ํฌํจ๋์ด ์๋์ง ํ์ธํด์ผ ํ๋ค.
+
+---
+
+# SECTION 4. ๋์ปค์ ์ฅ์ ๊ณผ ๋จ์
+---
+
+## 1. ๋์ปค์ ๊ตฌ์กฐ์ ์ฑ์ง ๋ฐ ๊ทธ ์ฅ๋จ์
+
+### 1-1. ํ๊ฒฝ์ ๊ฒฉ๋ฆฌํ ์ ์๋ค.
+
+#### ๋
๋ฆฝ๋ ํ๊ฒฝ
+
+๋
๋ฆฝ๋ ํ๊ฒฝ ๋๋ถ์ ์ฌ๋ฌ ๊ฐ์ ์ปจํ
์ด๋๋ฅผ ๋์ธ ์ ์์ผ๋ฉฐ, ๋๊ฐ์ ์ ํ๋ฆฌ์ผ์ด์
๋ ์ฌ๋ฌ ๊ฐ ๋์ธ ์ ์๋ค.
+
+#### ์ด๋ฏธ์ง๋ฅผ ๋ง๋ค ์ ์๋ค.
+
+์ด๋ฏธ์ง๋ฅผ ๋ง๋ค๊ณ ๋ฐฐํฌํ ์ ์์ผ๋ฏ๋ก, ๋ชจ๋ ์ด๋ฏธ์ง๋ฅผ ์ฒ์๋ถํฐ ๋ง๋ค์ง ์์๋ ์ด๋ฏธ์ง๋ฅผ ๋ด๋ ค๋ฐ์ ํธํ๊ฒ ์ฌ์ฉํ ์ ์๋ค.
+
+๋ํ ๊ตฌ์ถ ์์
์ด ๊ฐ๋จํด์ ธ์ ๊ต์ฒด๊ฐ ์ฝ๊ณ , ์
๋ฐ์ดํธ๊ฐ ์ฝ๋ค. ์ด๋ ์ด๋์ฑ์ด ์ข๋ค๋ ํน์ฑ์ผ๋ก๋ ์ด์ด์ง๋ค. ๋๊ฐ์ ์ปจํ
์ด๋๋ฅผ ์ฝ๊ฒ ๋ง๋ค ์ ์์ผ๋ฏ๋ก, ํ๊ฒฝ ์ด๋์ด๋ ๊ฐ๋ฐํ๊ฒฝ์ ๊ตฌ์ถํ๊ธฐ๋ ์ฝ๋ค.
+
+#### ์ปจํ
์ด๋์ ์ปค๋์ ํฌํจํ ํ์๊ฐ ์๋ค
+
+์ปจํ
์ด๋์๋ ์ปค๋์ด ์์ด๋ ๋์ด ๊ฐ๋ณ๋ค.
+
+### 1-2. ๋์ปค์ ์ฅ๋จ์
+
+#### ์ฅ์
+
+- ํ ๋์ ๋ฌผ๋ฆฌ ์๋ฒ์ ์ฌ๋ฌ ๋์ ์๋ฒ๋ฅผ ๋์ธ ์ ์๋ค.
+- ์๋ฒ ๊ด๋ฆฌ๊ฐ ์ฉ์ดํ๋ค.
+- ์๋ฒ ๊ณ ์๊ฐ ์๋์ด๋ ๋ค๋ฃจ๊ธฐ ์ฝ๋ค.
+
+#### ๋จ์
+
+- ๋ฆฌ๋
์ค์ฉ ์ํํธ์จ์ด๋ง ์ง์ํ๋ค.
+- ํธ์คํธ ์๋ฒ์ ๋ฌธ์ ๊ฐ ์๊ธฐ๋ฉด ๋ชจ๋ ์ปจํ
์ด๋์ ์ํฅ์ด ๋ฏธ์น๋ค.
+
+### 1-3. ๋์ปค์ ์ฃผ ์ฉ๋
+
+- ํ์ ๋ชจ๋์๊ฒ ๋์ผํ ๊ฐ๋ฐํ๊ฒฝ ์ ๊ณต
+ - ๋์ผํ ํ๊ฒฝ์ ์ฌ๋ฌ ๊ฐ ๋ง๋ค๊ธฐ
+- ์๋ก์ด ๋ฒ์ ์ ํ
์คํธ
+ - ๊ฒฉ๋ฆฌ๋ ํ๊ฒฝ์ ์ด์ฉ
+- ๋์ผํ ์๋ฒ๊ฐ ์ฌ๋ฌ ๋ ํ์ํ ๊ฒฝ์ฐ
+ - ์ปจํ
์ด๋ ๋ฐ๊ณผ ๋
๋ฆฝ๋ ์ฑ์ง์ ์ด์ฉ
\ No newline at end of file
diff --git a/_posts/2024-11-17-dockerCH4.markdown b/_posts/2024-11-17-dockerCH4.markdown
new file mode 100644
index 00000000000..775f12887a3
--- /dev/null
+++ b/_posts/2024-11-17-dockerCH4.markdown
@@ -0,0 +1,612 @@
+---
+title: "CH4. ์ปจํ
์ด๋๋ฅผ ์คํํด ๋ณด์ [๊ทธ๋ฆผ์ผ๋ก ๋ฐฐ์ฐ๋ ๋์ปค & ์ฟ ๋ฒ๋คํฐ์ค]"
+author: kwon
+date: 2024-11-17T14:00:00 +0900
+categories: [๋์ปค]
+tags: [docker]
+math: true
+mermaid: false
+---
+
+# SECTION 1. ๋์ปค ์์ง ์์ํ๊ธฐ/์ข
๋ฃํ๊ธฐ
+---
+## ๋ฆฌ๋
์ค์์ ์์ํ๊ธฐ
+```bash
+# ๋์ปค ์์ง ์์
+sudo systemtl start docker
+# ๋์ปค ์์ง ์ข
๋ฃ
+sudo systemtl stop docker
+# ์๋ ์คํ ์ค์
+sudo systemtl enable docker
+```
+
+---
+
+# SECTION 2. ์ปจํ
์ด๋์ ๊ธฐ๋ณธ์ ์ธ ์ฌ์ฉ๋ฐฉ๋ฒ
+> ์ปจํ
์ด๋๋ฅผ ๋ค๋ฃจ๋ ๋ชจ๋ ๋ช
๋ น์ `docker` ๋ช
๋ น์ด๋ก ์์ํ๋ค
+```bash
+docker ~
+```
+
+## ๋ช
๋ น์ด์ ๋์
+
+`docker` ๋ช
๋ น์ด ๋ค์ '๋ฌด์์', '์ด๋ป๊ฒ', '๋์' ์์ผ๋ก ์ง์ ํ์ฌ ๋ช
๋ น์ด๋ฅผ ์์ฑํ๋ค.
+
+
+
+'๋ฌด์์', ์ด๋ป๊ฒ ๋ถ๋ถ์ ์ปค๋งจ๋๋ผ๊ณ ํ๊ณ , ์์ ์ปค๋งจ๋๊ฐ '๋ฌด์์', ํ์ ์ปค๋งจ๋๊ฐ '์ด๋ป๊ฒ'์ ํด๋นํ๋ ๋ด์ฉ์ ์ง์ ํ๋ค.
+
+์์ ์ปค๋งจ๋์ ๋ค์ด๊ฐ๋ **๋์์ ์ข
๋ฅ**๋ 12์ข
๋ฅ์ด๋ค. ๊ฐ์ธ์ ์ผ๋ก๋ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์์์ type๊ณผ ๊ฐ์ ๊ฒ์ด๋ผ๊ณ ์ดํดํ๋ค.
+
+```bash
+docker image pull penguin
+docker container start penguin
+...
+```
+
+## ์ต์
๊ณผ ์ธ์
+
+ํ์์ ๋ฐ๋ผ '์ต์
'์ด๋ '์ธ์'๋ฅผ ๋ถ์ฌ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ๋ ์๋ค
+
+
+
+์ ๋ช
๋ น์ด๋ penguin container๋ฅผ ๋ฐฑ๊ทธ๋ผ์ด๋๋ก(`-d`), mode 1๋ก(`--mode=1`) ์คํํ๋ผ๋ ์๋ฏธ์ด๋ค.
+
+๋ชจ๋ ๋ช
๋ น์ด์ ์ต์
์ด๋ ์ธ์๊ฐ ๋ถ๋ ๊ฒ์ ์๋๋ฉฐ, ์ฌ๋ฌ๊ฐ ๋ถ์ ์ ์๋ ๋ช
๋ น์ด๋ผ๋ ์์ฃผ ์ฐ์ด๋ ๊ฒ์ ํ์ ๋์ด ์์ผ๋ฏ๋ก ๊ธฐ์ตํด๋๋ ๊ฒ์ด ์ข๋ค.
+
+## ๊ธฐ๋ณธ์ ์ธ ๋ช
๋ น์ด
+
+### ์ปจํ
์ด๋ ์กฐ์ ๊ด๋ จ ์ปค๋งจ๋(`container`)
+
+| ํ์ ์ปค๋งจ๋ | ๋ด์ฉ | ์๋ต ๊ฐ๋ฅ ์ฌ๋ถ | ์ฃผ์ ์ต์
|
+| :---------: | :------------------------------------------------------------------------------------------------------------------------ | :------------: | :------------------------------------: |
+| `start` | ์ปจํ
์ด๋ ์คํ | O | `-i` |
+| `stop` | ์ปจํ
์ด๋ ์ ์ง | O | ๊ฑฐ์ ์ฌ์ฉํ์ง ์์ |
+| `create` | ๋์ปค ์ด๋ฏธ์ง๋ก๋ถํฐ ์ปจํ
์ด๋๋ฅผ ์์ฑ | O | `--name` `-e` `-p` `-v` |
+| `run` | ๋์ปค ์ด๋ฏธ์ง๋ฅผ ๋ด๋ ค๋ฐ๊ณ ์ปจํ
์ด๋๋ฅผ ์์ฑํด ์คํ(`docker image pull` + `docker container create` + `docker container start`) | O | `--name` `-e` `-p` `-v` `-d` `-i` `-t` |
+| `rm` | ์ ์ง ์ํ์ ์ปจํ
์ด๋ ์ญ์ | O | `-f` `-v` |
+| `exec` | ์คํ ์ค์ธ ์ปจํ
์ด๋ ์์์ ํ๋ก๊ทธ๋จ์ ์คํ | O | `-i` `-t` |
+| `ls` | ์ปจํ
์ด๋ ๋ชฉ๋ก ์ถ๋ ฅ | `docker ps` | `-a` |
+| `cp` | ๋์ปค ์ปจํ
์ด๋์ ๋์ปค ํธ์คํธ ๊ฐ์ ํ์ผ ๋ณต์ฌ | O | ๊ฑฐ์ ์ฌ์ฉํ์ง ์์ |
+| `commit` | ๋์ปค ์ปจํ
์ด๋๋ฅผ ์ด๋ฏธ์ง๋ก ๋ณํ | O | ๊ฑฐ์ ์ฌ์ฉํ์ง ์์ |
+
+
+### ์ด๋ฏธ์ง ์กฐ์ ๊ด๋ จ ์ปค๋งจ๋(`image`)
+
+| ํ์ ์ปค๋งจ๋ | ๋ด์ฉ | ์๋ต ๊ฐ๋ฅ ์ฌ๋ถ | ์ฃผ์ ์ต์
|
+| :---------: | :---------------------------------------------- | :------------: | :----------------: |
+| `pull` | ๋์ปค ํ๋ธ ๋ฑ์ repository์์ ์ด๋ฏธ์ง๋ฅผ ๋ด๋ ค๋ฐ์ | O | ๊ฑฐ์ ์ฌ์ฉํ์ง ์์ |
+| `rm` | ๋์ปค ์ด๋ฏธ์ง ์ญ์ | `docker rmi` | ๊ฑฐ์ ์ฌ์ฉํ์ง ์์ |
+| `ls` | ๋ด๋ ค๋ฐ์ ์ด๋ฏธ์ง ๋ชฉ๋ก | X | ๊ฑฐ์ ์ฌ์ฉํ์ง ์์ |
+| `build` | ๋์ปค ์ด๋ฏธ์ง๋ฅผ ์์ฑ | O | `-t` |
+
+### ๋ณผ๋ฅจ ์กฐ์ ๊ด๋ จ ์ปค๋งจ๋(`volume`)
+
+| ํ์ ์ปค๋งจ๋ | ๋ด์ฉ | ์๋ต ๊ฐ๋ฅ ์ฌ๋ถ | ์ฃผ์ ์ต์
|
+| :---------: | :----------------------------- | :------------: | :----------------: |
+| `create` | ๋ณผ๋ฅจ ์์ฑ | X | `--name` |
+| `inspect` | ๋ณผ๋ฅจ์ ์์ธ ์ ๋ณด ์ถ๋ ฅ | X | ๊ฑฐ์ ์ฌ์ฉํ์ง ์์ |
+| `ls` | ๋ณผ๋ฅจ ๋ชฉ๋ก | X | `-a` |
+| `prune` | ๋ง์ดํธ๋์ง ์์ ๋ณผ๋ฅจ ๋ชจ๋ ์ญ์ | X | ๊ฑฐ์ ์ฌ์ฉํ์ง ์์ |
+| `rm` | ์ง์ ํ ๋ณผ๋ฅจ ์ญ์ | X | ๊ฑฐ์ ์ฌ์ฉํ์ง ์์ |
+
+### ๋คํธ์ํฌ ์กฐ์ ๊ด๋ จ ์ปค๋งจ๋(`network`)
+
+๋์ปค ๋คํธ์ํฌ๋ ๋์ปค ์์ ๊ฐ์ ํค์ ์ ์ฌ์ฉํ๋ ๊ฐ์ฅ ๋คํธ์ํฌ์ด๋ค.
+
+| ํ์ ์ปค๋งจ๋ | ๋ด์ฉ | ์๋ต ๊ฐ๋ฅ ์ฌ๋ถ | ์ฃผ์ ์ต์
|
+| :----------: | :------------------------------------- | :------------: | :----------------: |
+| `connect` | ์ปจํ
์ด๋๋ฅผ ๋์ปค ๋คํธ์ํฌ์ ์ฐ๊ฒฐ | X | ๊ฑฐ์ ์ฌ์ฉํ์ง ์์ |
+| `disconnect` | ์ปจํ
์ด๋๋ฅผ ๋์ปค ๋คํธ์ํฌ ์ฐ๊ฒฐ ํด์ | X | ๊ฑฐ์ ์ฌ์ฉํ์ง ์์ |
+| `create` | ๋์ปค ๋คํธ์ํฌ ์์ฑ | X | ๊ฑฐ์ ์ฌ์ฉํ์ง ์์ |
+| `inspect` | ๋์ปค ๋คํธ์ํฌ ์์ธ ์ ๋ณด ์ถ๋ ฅ | X | ๊ฑฐ์ ์ฌ์ฉํ์ง ์์ |
+| `ls` | ๋์ปค ๋คํธ์ํฌ ๋ชฉ๋ก | X | ๊ฑฐ์ ์ฌ์ฉํ์ง ์์ |
+| `prune` | ์ปจํ
์ด๋๊ฐ ์ ์ํ์ง ์์ ๋คํธ์ํฌ ์ญ์ | X | ๊ฑฐ์ ์ฌ์ฉํ์ง ์์ |
+| `rm` | ์ง์ ํ ๋คํธ์ํฌ ์ญ์ | X | ๊ฑฐ์ ์ฌ์ฉํ์ง ์์ |
+
+### ๋จ๋
์ผ๋ก ์ฐ์ด๋ ์ปค๋งจ๋
+
+๋์ปค ํ๋ธ์ ๊ฒ์์ด๋ ๋ก๊ทธ์ธ์ ์ฌ์ฉ๋๋ ์ปค๋งจ๋
+
+| ์ปค๋งจ๋ | ๋ด์ฉ | ์ฃผ์ ์ต์
|
+| :---------: | :----------------------------------- | :----------------: |
+| `login` | ๋์ปค ๋ ์ง์คํธ๋ฆฌ์ ๋ก๊ทธ์ธ | -u -p |
+| `logout` | ๋์ปค ๋ ์ง์คํธ๋ฆฌ์ ๋ก๊ทธ์์ | ๊ฑฐ์ ์ฌ์ฉํ์ง ์์ |
+| `search` | ๋์ปค ๋ ์ง์คํธ๋ฆฌ๋ฅผ ๊ฒ์ | ๊ฑฐ์ ์ฌ์ฉํ์ง ์์ |
+| `version` | ๋์ปค ์์ง ๋ฐ ๋ช
๋ นํ ๋๊ตฌ์ ๋ฒ์ ์ถ๋ ฅ | ๊ฑฐ์ ์ฌ์ฉํ์ง ์์ |
+
+
+# SECTION 3. ์ปจํ
์ด๋์ ์์ฑ๊ณผ ์ญ์ , ์คํ, ์ ์ง
+
+๋์ปค ์ปค๋งจ๋์๋ ์ปจํ
์ด๋๋ฅผ ์์ฑํ๋ `docke (container) create`, ์คํํ๋ `docker (container) start`, ์ด๋ฏธ์ง๋ฅผ ๋ด๋ ค๋ฐ๋ `docker (container) pull` ์ด ๋ฐ๋ก ์กด์ฌํ์ง๋ง ์ด๋ฅผ ํ ๋ฒ์ ์ํํ ์ ์๋ `docker (container) run`์ ์ฌ์ฉํ๋ ๊ฒ์ด ์ผ๋ฐ์ ์ด๋ค.
+
+
+
+2์ฅ์์ ๋์๋ ์์ ์ฃผ๊ธฐ์ ๋ฐ๋ผ ์ปจํ
์ด๋๋ ์ฐ๊ณ ๋ฒ๋ฆฌ๋ ๋ฐฉ์์ผ๋ก ์ฌ์ฉํ๋ค. ๋์ ์ค์ธ ์ปจํ
์ด๋๋ฅผ ๊ทธ๋๋ก ์ญ์ ํ ์ ์์ผ๋ฏ๋ก ์ ์งํ๋ ๋ฐฉ๋ฒ๊ณผ ์ญ์ ํ๋ ๋ฐฉ๋ฒ์ ํจ๊ป ์์์ผ ํ๋ค.
+
+## `docker (container) run`
+
+์ปจํ
์ด๋๋ฅผ ์์ฑํด ์คํํ๋ค. ํด๋น ์ด๋ฏธ์ง๋ฅด ๋ด๋ ค๋ฐ์ผ ์ํ๊ฐ ์๋๋ผ๋ฉด ๋จผ์ ์ด๋ฏธ์ง๋ฅผ ๋ด๋ ค๋ฐ๋๋ค. '๋์'์ผ๋ก๋ ์ด๋ฏธ์ง์ ์ด๋ฆ์ ์ง์ ํ๋ค.
+
+| ์ต์
ํ์ | ๋ด์ฉ | Full name |
+| :-------------------------------: | :---------------------------------------------------------------------------------------------- | :-------------: |
+| `--name` | ์ปจํ
์ด๋ ์ด๋ฆ ์ง์ | - |
+| `-p {host_port}:{container_port}` | ํฌํธ ๋ฒํธ ์ง์ | `--publish` |
+| `-v {host_disk}:{container_dir}` | ๋ณผ๋ฅจ ๋ง์ดํธ | `--volume` |
+| `--net={natwork_name}` | ์ปจํ
์ด๋๋ฅผ ๋คํธ์ํฌ์ ์ฐ๊ฒฐ | `-env` |
+| `-e {env-var_name}={vlaue}` | ํ๊ฒฝ ๋ณ์๋ฅผ ์ค์ | - |
+| `-d` | ๋ฐฑ๊ทธ๋ผ์ด๋๋ก ์คํ | `--detach` |
+| `-i` | ์ปจํ
์ด๋์์ ํฐ๋ฏธ๋(ํค๋ณด๋) ์ฐ๊ฒฐ (ํ์ค ์
๋ ฅ์ผ๋ก ์ปจํ
์ด๋ ์์ฑ) | `--interactive` |
+| `-t` | ํน์ ํค๋ฅผ ์ฌ์ฉ ๊ฐ๋ฅํ๋๋ก ํจ (ํฐ๋ฏธ๋ ๋๋ผ์ด๋ฒ๋ฅผ ์ถ๊ฐํ์ฌ ํฐ๋ฏธ๋์ ์ด์ฉํ์ฌ ์ฐ๊ฒฐํ ์ ์๋๋ก ํจ) | `--tty` |
+| `-help` | ์ฌ์ฉ ๋ฐฉ๋ฒ ์๋ด ๋ฉ์ธ์ง | - |
+
+## `docker (container) stop`
+
+```bash
+docker stop {container_name}
+```
+
+## `docker (container) rm`
+
+```bash
+docker rm {container_name}
+```
+
+### ํ ๋ฒ๋ง ์คํ๋๋ ์ปจํ
์ด๋์ ๋ฐ๋ชฌ ํํ๋ก ๋์ํ๋ ์ปจํ
์ด๋
+
+`-d`๋ฅผ ๋ถ์ด์ง ์๊ณ ์ปจํ
์ด๋๋ฅผ ์ฑํํ๋ฉด ์คํ๋ ์ปจํ
์ด๋๊ฐ ํ๋ก๊ทธ๋จ์ ์คํ์ ๋ง์น ๋๊น์ง ํฐ๋ฏธ๋์ ์ ์ด๋ฅผ ์ฐจ์งํ๋ฏ๋ก ๋ค์ ๋ช
๋ น์ ์
๋ ฅํ ์ ์๋ค.
+`-it`๋ฅผ ๋ถ์ด์ง ์์ผ๋ฉด ์ปจํ
์ด๋ ์์ ํ์ผ ์์คํ
์ด ์ ๊ทผํ ์ ์๋ค.
+
+ํ ๋ฒ๋ง ์คํ๋๋ ์ปจํ
์ด๋๋ ์คํํ์๋ง์ ์ข
๋ฃ๋๋ฏ๋ก ์ปจํ
์ด๋๊ฐ ํฐ๋ฏธ๋์ ์ ์ด๋ฅผ ์ฐจ์งํด๋ ์ผ์์ ์ด๋ฏ๋ก ๋ฌธ์ ๊ฐ ๋์ง ์๋๋ค.
+ํ์ง๋ง ๋ฐ๋ชฌ์ฒ๋ผ ์ง์์ ์ผ๋ก ์คํ๋๋ ๊ฒฝ์ฐ ์ ์ ๋ก ์ข
๋ฃ๋์ง ์์ผ๋ฏ๋ก ํ ๋ฒ ํฐ๋ฏธ๋ ์ ์ด๋ฅผ ๋์ง๋ฉด ์ด๋ฅผ ๋์ฐพ์์ค๊ธฐ ๋ฒ๊ฑฐ๋กญ๋ค.
+
+๋ํ ๋ฐ๋ก ์ข
๋ฃ๋๋ ์ปจํ
์ด๋์ ๊ฒฝ์ฐ ์ปจํ
์ด๋ ์ ํ์ผ ์์คํ
์ ์ ๊ทผํ ํ์์ฌ ์์ผ๋ฏ๋ก `-it`๊ฐ ํ์์๋ ์ต์
์ด ๋๋ค.
+
+## `docker ps (docker container ls)`
+
+```bash
+# ์คํ ์ค์ธ ์ปจํ
์ด๋ ํ์ธ
+docker ps
+
+# ์กด์ฌํ๋ ์ปจํ
์ด๋ ํ์ธ (์ ์ง๋ ์ปจํ
์ด๋ ํฌํจ)
+docker ps -a
+```
+
+> `ps`๋ **pocess status**๋ฅผ ์๋ฏธํ๋ค
+
+### ์ปจํ
์ด๋ ๋ชฉ๋ก ์ ๋ณด
+
+๋ชฉ๋ก์ ์ถ๋ ฅํ๋ฉด ๋ค์๊ณผ ๊ฐ์ ์ ๋ณด๋ค์ด ์ถ๋ ฅ๋๋ค.
+```
+CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
+```
+
+์์ธํ ๋ด์ฉ์ ๋ค์๊ณผ ๊ฐ๋ค.
+
+| ํญ๋ชฉ | ๋ด์ฉ |
+| :------------: | :---------------------------------------------------------------------------------------------------------- |
+| `CONTAINER ID` | ์ปจํ
์ด๋ ์๋ณ์, ๋ฌด์์ ๋ฌธ์์ด์ด ํ ๋น๋๋ค. (SHA256 ํด์ ์๊ณ ๋ฆฌ์ฆ) |
+| `IMAGE` | ์ปจํ
์ด๋๋ฅผ ๋ง๋ค ๋ ์ฌ์ฉํ ์ด๋ฏธ์ง์ ์ด๋ฆ |
+| `COMMAND` | ์ปจํ
์ด๋ ์คํ ์์ ์คํ๋๋๋ก ์ค์ ํ ํ๋ก๊ทธ๋จ ์ด๋ฆ |
+| `CREATED` | ์ปจํ
์ด๋ ์์ฑ ํ ๊ฒฝ๊ณผ๋ ์๊ฐ |
+| `STATUS` | ์ปจํ
์ด๋์ ํ์ฌ ์ํ. ์คํ ์ค์ด๋ฉด 'Up', ์ข
๋ฃ ์ํ์ด๋ฉด 'Exited' |
+| `PORTS` | ์ปจํ
์ด๋์ ํ ๋น๋ ํฌํธ ๋ฒํธ 'host_port -> container_port'ํ์์ผ๋ก ์ถ๋ ฅ. ํฌํธ ๋ฒํธ๊ฐ ๋์ผํ ๊ฒฝ์ฐ ํ๋๋ง ์ถ๋ ฅ |
+| `NAMES` | ์ปจํ
์ด๋ ์ด๋ฆ |
+
+
+#### SHA256
+
+docker์์์ ์
๋ ฅ๊ฐ
+
+- ์ด๋ฏธ์ง:
+ - ์ด๋ฏธ์ง ๋ ์ด์ด ์ ๋ณด
+ - ํ์ผ ๋ฐ ๋๋ ํฐ๋ฆฌ์ ํด์ ๊ฐ
+ - Dockerfile ๋ช
๋ น๊ณผ ๋น๋ ์ต์
+- ์ปจํ
์ด๋:
+ - ๋๋ค ๋ฐ์ดํฐ(๋๋ค ์๋, ์๊ฐ, ํธ์คํธ ์ ๋ณด ๋ฑ)
+ - ์์ฑ ์ ์ต์
๊ณผ ํ๊ฒฝ ๋ณ์
+
+
+SHA-256์ **SHA-2(Secure Hash Algorithm 2)** ๊ณ์ด์ ์ํธํ์ ํด์ ํจ์๋ก, ์
๋ ฅ ๋ฐ์ดํฐ๋ฅผ ๊ณ ์ ๋ 256๋นํธ(32๋ฐ์ดํธ) ํด์ ๊ฐ์ผ๋ก ๋ณํํฉ๋๋ค. ๋ฐ์ดํฐ ๋ฌด๊ฒฐ์ฑ ๊ฒ์ฆ ๋ฐ ๊ณ ์ ์๋ณ์ ์์ฑ ๋ฑ์ ๋๋ฆฌ ์ฌ์ฉ๋ฉ๋๋ค.
+
+---
+
+##### **ํน์ง**
+1. **์
๋ ฅ ํฌ๊ธฐ ์ ํ ์์**:
+ - ์ด๋ค ํฌ๊ธฐ์ ๋ฐ์ดํฐ๋ ์
๋ ฅ์ผ๋ก ์ฒ๋ฆฌ ๊ฐ๋ฅ.
+
+2. **์ถ๋ ฅ ํฌ๊ธฐ ๊ณ ์ **:
+ - ํญ์ **256๋นํธ(64์๋ฆฌ 16์ง์)** ๊ธธ์ด์ ํด์ ๊ฐ์ ์์ฑ.
+
+3. **๊ฒฐ์ ๋ก ์ **:
+ - ๋์ผํ ์
๋ ฅ์ ํญ์ ๋์ผํ ํด์ ๊ฐ์ ์์ฑ.
+
+4. **์ถฉ๋ ์ ํญ์ฑ**:
+ - ์๋ก ๋ค๋ฅธ ์
๋ ฅ์ด ๋์ผํ ํด์ ๊ฐ์ ๊ฐ์ง ํ๋ฅ ์ด ๊ทนํ ๋ฎ์.
+
+5. **๋น๊ฐ์ญ์ฑ**:
+ - ํด์ ๊ฐ์ผ๋ก ์๋ณธ ๋ฐ์ดํฐ๋ฅผ ๋ณต์ ๋ถ๊ฐ.
+
+6. **๋น ๋ฅธ ๊ณ์ฐ**:
+ - ์
๋ ฅ ๋ฐ์ดํฐ ํฌ๊ธฐ์ ๊ด๊ณ์์ด ๋น ๋ฅด๊ฒ ๊ณ์ฐ ๊ฐ๋ฅ.
+
+---
+
+##### **์ฃผ์ ์ฌ์ฉ ์ฌ๋ก**
+1. **๋ฐ์ดํฐ ๋ฌด๊ฒฐ์ฑ ๊ฒ์ฆ**:
+ - ํ์ผ์ด ์ ์ก ์ค ๋ณ๊ฒฝ๋์ง ์์๋์ง ํ์ธ.
+ - ์: ์ํํธ์จ์ด ๋ฐฐํฌ ์ ํ์ผ์ SHA-256 ํด์ ์ ๊ณต.
+
+2. **์ํธํ**:
+ - ๋์งํธ ์๋ช
, ์ธ์ฆ์, ์ ์ ์๋ช
๋ฑ์ ํ์ฉ.
+
+3. **๋น๋ฐ๋ฒํธ ์ ์ฅ**:
+ - ๋น๋ฐ๋ฒํธ๋ฅผ ํด์ ๊ฐ์ผ๋ก ๋ณํํ์ฌ ์์ ํ๊ฒ ์ ์ฅ.
+ -
+4. **๋ธ๋ก์ฒด์ธ**:
+ - Bitcoin ๋ฑ ๋ธ๋ก์ฒด์ธ ๊ธฐ์ ์์ ํธ๋์ญ์
๋ฐ ๋ธ๋ก ํด์์ ์ฌ์ฉ.
+
+5. **๊ณ ์ ์๋ณ์ ์์ฑ**:
+ - ํ์ผ, ๋ฐ์ดํฐ, ์ด๋ฏธ์ง ๋ฑ์์ ๊ณ ์ ID ์์ฑ.
+
+---
+
+##### **SHA-256์ ๋์ ์๋ฆฌ**
+1. **ํจ๋ฉ(Padding)**:
+ - ์
๋ ฅ ๋ฐ์ดํฐ๋ฅผ 512๋นํธ์ ๋ฐฐ์๋ก ์ฑ์. ๋ง์ง๋ง 64๋นํธ๋ ์๋ ๋ฐ์ดํฐ ๊ธธ์ด ์ ๋ณด ํฌํจ.
+
+2. **์ด๊ธฐ ํด์ ๊ฐ ์ค์ **:
+ - 256๋นํธ ํฌ๊ธฐ์ ์ด๊ธฐ ํด์ ๊ฐ(8๊ฐ์ 32๋นํธ ๋จ์ด)์ ์ ์.
+
+3. **๋ฉ์์ง ๋ถํ **:
+ - ์
๋ ฅ ๋ฐ์ดํฐ๋ฅผ 512๋นํธ ๋ธ๋ก์ผ๋ก ๋ถํ .
+
+4. **์์ถ ํจ์(Compression Function)**:
+ - ๊ฐ ๋ธ๋ก์ ๋ํด ๋นํธ ์ฐ์ฐ์ ๋ฐ๋ณตํ์ฌ ํด์ ๊ฐ ๊ฐฑ์ .
+
+5. **์ต์ข
ํด์ ๊ฐ ์ถ๋ ฅ**:
+ - ๋ชจ๋ ๋ธ๋ก ์ฒ๋ฆฌ ํ, 256๋นํธ ์ต์ข
ํด์ ๊ฐ ๋ฐํ.
+
+---
+
+##### **Python์ ์ฌ์ฉํ SHA-256 ํด์ ์์ฑ ์์ **
+```python
+import hashlib
+
+data = "hello"
+sha256_hash = hashlib.sha256(data.encode()).hexdigest()
+print("SHA-256 Hash:", sha256_hash)
+
+# SHA-256 Hash: 2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824
+```
+---
+
+
+## [์ค์ต] ์ปจํ
์ด๋ ์์ฑ, ์คํ ์ํํ์ธ, ์ข
๋ฃ, ์ญ์
+
+```bash
+PS C:\Users\Kwon> docker ps
+CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
+
+# docker image pull + docker container create + docker container start
+PS C:\Users\Kwon> docker run --name apa000ex1 -d httpd
+latest: Pulling from library/httpd
+334a67c7f78b: Download complete
+3ed0d9182dde: Download complete
+d675ed392a91: Download complete
+0062038102c9: Download complete
+4f4fb700ef54: Download complete
+2d429b9e73a6: Download complete
+Digest: sha256:6bdbdf5ac16ac3d6ef543a693fd5dfafae2428b4b0cdc52a480166603a069136
+Status: Downloaded newer image for httpd:latest
+174a5c39573f4df13fad5620c4899bcde5828ff7b983e4456de688227e0ccecd
+
+# ์คํ๋ container ํ์ธ
+PS C:\Users\Kwon> docker ps
+CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
+174a5c39573f httpd "httpd-foreground" 12 seconds ago Up 11 seconds 80/tcp apa000ex1
+
+# container ์ ์ง
+PS C:\Users\Kwon> docker stop apa000ex1
+apa000ex1
+
+CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
+# ์ ์ง๋์์ผ๋ฏ๋ก ps -a๋ก ํ์ธํ ์ ์์ (STATUS: Exited)
+PS C:\Users\Kwon> docker ps
+CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
+
+PS C:\Users\Kwon> docker ps -a
+CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
+174a5c39573f httpd "httpd-foreground" 3 minutes ago Exited (0) 12 seconds ago apa000ex1
+
+# container ์ญ์
+PS C:\Users\Kwon> docker rm apa000ex1
+apa000ex1
+
+PS C:\Users\Kwon> docker ps -a
+CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
+```
+
+# SECTION 4. ์ปจํ
์ด๋์ ํต์
+
+## ์ํ์น
+
+> ์ํ์น๋ ์น ์๋ฒ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ ์ํํธ์จ์ด์ด๋ค.
+
+์น ๋ธ๋ผ์ฐ์ ๋ฅผ ํตํด ๋ค์ด์จ ์์ฒญ์ ๋ฐ๋ผ ์ํ์น ์๋ฒ๊ฐ ์น ์ฌ์ดํธ์ ๋ด์ฉ์ ๋ฐํํด์ค๋ค.
+
+## ์ปจํ
์ด๋์์ ํต์
+
+์น ๋ธ๋ผ์ฐ์ ๋ฅผ ํตํด ์ปจํ
์ด๋์ ์ ๊ทผํ๋ ค๋ฉด ์ธ๋ถ์ ์ ์ํ๊ธฐ ์ํ ์ค์ ์ด ํ์ํ๋ค. ์ด๋ฅผ ์ํด ํฌํธ๋ฅผ ์ค์ ํ๋ค.
+
+> **port**๋ ํต์ ๋ด์ฉ์ด ๋๋๋๋ ํต๋ก์ด๋ค.
+
+docker์์๋ `-p` ์ต์
์ผ๋ก ์ค์ ํ ์ ์๋ค.
+
+์ปจํ
์ด๋๋ฅผ ์ฌ์ฉํ๋ฉด ์ฌ๋ฌ ๊ฐ์ ์น ์๋ฒ๋ฅผ ํจ๊ป ์คํํ ์๋ ์๋ค. ์ด๋ฌํ ๊ฒฝ์ฐ ์ปจํ
์ด๋์ ์ฐ๊ฒฐํ๋ ํธ์คํธ์ ํฌํธ ๋ฒํธ๋ฅผ ๊ฒน์น์ง ์๊ฒ ์ฑ์ ํด์ผ ํ๋ค.
+
+### Reverse Proxy
+
+#### Forard Proxy
+
+client๊ฐ ์ง์ server์ ์์ฒญํ๋ ๊ฒ์ด ์๋๋ผ proxy server(์ค๊ณ ์๋ฒ)๋ฅผ ๊ฑฐ์ณ ์์ฒญํ๋ ๊ฒ.
+์ด๋ ๊ฒ ๋๋ฉด ์ฌ์ค์ proxy server๊ฐ ์์ฒญํ๋ ๊ฒ์ผ๋ก ๋๊ธฐ ๋๋ฌธ์ client๊ฐ ๋๊ตฐ์ง server๋ ์ ์ ์๋ค.
+
+#### Reverse Proxy
+
+reverse proxy๋ server๊ฐ ๋ฐํํด์ฃผ๋ data๋ฅผ proxy server๊ฐ ๋์ ํด์ฃผ๋ ๊ฒ์ด๋ค. ๊ทธ๋ฌ๋ฏ๋ก client๋ server์ ์ ๋ณด๋ฅผ ์ ์ ์๋ค.
+๋ณด์์ ์ด์ ์ด ์์ผ๋ฉฐ, ์๋ฒ ๋ถ๋ด์ ๋ถ์ฐํ ์ ์๋ค.
+
+
+
+reverse proxy๋ฅผ ํ์ฉํ๋ฉด ์ฌ๋ฌ ๋์ ์๋ฒ์ proxy๊ฐ ์์ฒญ์ ์ ๋ฌ ํ๊ฒ ํ ์ ์๋ค. ๊ทธ๋ฌ๋ฏ๋ก ๊ฐ์ ํฌํธ๋ก ์์ฒญ์ด ๋ค์ด์์ ๋ proxy๊ฐ ์๋ฒ๋ฅผ ๊ตฌ๋ถํ๋ ๋ฐฉ์์ผ๋ก ์๋ง์ ์ปจํ
์ด๋์ ์์ฒญ์ ๋ณด๋ผ ์ ์๋ค.
+
+## [์ค์ต]
+
+```bash
+# host: 8080, container: 80์ผ๋ก ์ํ์น ์๋ฒ container๋ฅผ ์คํ
+PS C:\Users\Kwon> docker run --name apa000ex2 -d -p 8080:80 httpd
+4ea55871346bea8332fdd1aee1c23620aff366895fbc573144b5cf4bd246d710
+PS C:\Users\Kwon> docker ps
+CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
+4ea55871346b httpd "httpd-foreground" 20 seconds ago Up 19 seconds 0.0.0.0:8080->80/tcp apa000ex2
+
+# ์ ์ง ๋ฐ ์ญ์
+PS C:\Users\Kwon> docker stop apa000ex2
+apa000ex2
+PS C:\Users\Kwon> docker rm apa000ex2
+apa000ex2
+PS C:\Users\Kwon> docker ps -a
+CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
+PS C:\Users\Kwon>
+```
+
+
+
+์์ ๊ฐ์ ์คํ ํ๋ฉด์ ์ป์ ์ ์๋ค.
+
+---
+
+# SECTION 5. ์ปจํ
์ด๋ ์์ฑ์ ์ต์ํด์ง๊ธฐ
+
+## ๋ฆฌ๋
์ค ์ด์์ฒด์ ๊ฐ ๋ด๊ธด ์ปจํ
์ด๋
+
+๋ฆฌ๋
์ค ์ด์์ฒด์ ์ปจ๋ฐ์ด๋๋ ์ปจํ
์ด๋ ์ ํ์ผ ์์คํ
์ ๋ค๋ฃจ๋ ๊ฒ์ ์ ์ ๋ก ํ๋ฏ๋ก ์ธ์๋ก '์
๋ช
๋ น์ด'๋ฅผ ์ง์ ํ๋ค.
+
+์ฆ `-d` ์์ด `-it` ์ต์
๋ง ์ฌ์ฉํ๋ค. ์ธ์๋ก๋ `/bin/bash` ๋ฑ ์
๋ช
๋ น์ด๋ฅผ ์ง์ ํ๋ค.
+
+| ์ด๋ฏธ์ง ์ด๋ฆ | ์ปจํ
์ด๋์ ๋ด์ฉ |
+| :---------: | :-------------: |
+| ubuntu | ์ฐ๋ถํฌ |
+| centos | CentOS |
+| edbian | ๋ฐ๋น์ |
+| fedora | ํ๋๋ผ |
+| busybox | BizyBox |
+| alpine | ์ํ์ธ ๋ฆฌ๋
์ค |
+
+## ์น ์๋ฒ/๋ฐ์ดํฐ๋ฒ ์ด์ค ์๋ฒ์ฉ ์ปจํ
์ด๋
+
+์น ์๋ฒ๋ ํต์ ์ด ์ ์ ๊ฐ ๋๋ฏ๋ก ์ต์
์ ํตํด ํฌํธ ๋ฒํธ๋ฅผ ์ง์ ํด์ผ ํ๋ค.
+
+๋ฐ์ดํฐ๋ฒ ์ด์ค ๊ด๋ฆฌ ์ํํธ์จ์ด๋ ๊ธฐ๋ณธ์ ์ผ๋ก **๋ฃจํธ ํจ์ค์๋**๋ฅผ ๋ฐ๋์ ์ง์ ํด์ผ ํ๋ค.
+
+| ์ด๋ฏธ์ง ์ด๋ฆ | ์ปจํ
์ด๋์ ๋ด์ฉ | ์ปจํ
์ด๋ ์คํ์ ์ฃผ๋ก ์ฌ์ฉ๋๋ ์ต์
๋ฐ ์ธ์|
+| :---------: | :-------------: |:---:|
+| httpd | ์ฐ๋ถํฌ |`-d` `-p`|
+| nginx | CentOS |`-d` `-p`|
+| mysql | ๋ฐ๋น์ |`-d` `-e MYSQL_ROOT_PASSWORD`|
+| postgres | Postgre |`-d` `-e POSTGRES_ROOT_PASSWORD`|
+| mariadb | MariaDB |`-d` `-e MYSQL_ROOT_PASSWORD`|
+
+## ํ๋ก๊ทธ๋จ ์คํ์ ์ํ ๋ฐํ์๊ณผ ๊ทธ ์ธ ์ํํธ์จ์ด
+
+ํ๋ก๊ทธ๋จ์ ์คํํ๋ ค๋ฉด ํด๋น ์ธ์ด์ ์คํ ํ๊ฒฝ์ธ **๋ฐํ์**์ด ํ์ํ๋ค. ์ด ๋ํ ์ปจํ
์ด๋ ํํ๋ก ์ ๊ณต๋๋ค.
+
+| ์ด๋ฏธ์ง ์ด๋ฆ | ์ปจํ
์ด๋์ ๋ด์ฉ | ์ปจํ
์ด๋ ์คํ์ ์ฃผ๋ก ์ฌ์ฉ๋๋ ์ต์
๋ฐ ์ธ์|
+| :---------: | :-------------: |:---:|
+| openjdk | java ๋ฐํ์ |`-d`๋ฅผ ์ฌ์ฉํ์ง ์๊ณ ์ธ์๋ก java ๋ช
๋ น ๋ฑ์ ์ง์ ํด ๋๊ตฌ ํํ๋ก ์ฌ์ฉํ๋ค.|
+| python | python ๋ฐํ์ |`-d`๋ฅผ ์ฌ์ฉํ์ง ์๊ณ ์ธ์๋ก python ๋ช
๋ น ๋ฑ์ ์ง์ ํด ๋๊ตฌ ํํ๋ก ์ฌ์ฉํ๋ค.|
+| php | PHP ๋ฐํ์ |์น ์๋ฒ๊ฐ ํฌํจ๋ ๊ฒ๊ณผ ์คํ ๋ช
๋ น๋ง ํฌํจ๋ ๊ฒ์ผ๋ก ๋์์ด ์ ๊ณต๋๋ค.|
+| ruby | ruby ๋ฐํ์ |์น ์๋ฒ๊ฐ ํฌํจ๋ ๊ฒ๊ณผ ์คํ ๋ช
๋ น๋ง ํฌํจ๋ ๊ฒ์ผ๋ก ๋์์ด ์ ๊ณต๋๋ค.|
+| perl | perl ๋ฐํ์ |`-d`๋ฅผ ์ฌ์ฉํ์ง ์๊ณ ์ธ์๋ก perl ๋ช
๋ น ๋ฑ์ ์ง์ ํด ๋๊ตฌ ํํ๋ก ์ฌ์ฉํ๋ค|
+| gcc | C/C++ ์ปดํ์ผ๋ฌ |`-d`๋ฅผ ์ฌ์ฉํ์ง ์๊ณ ์ธ์๋ก gcc ๋ช
๋ น ๋ฑ์ ์ง์ ํด ๋๊ตฌ ํํ๋ก ์ฌ์ฉํ๋ค|
+| node | Node.js |`-d`๋ฅผ ์ฌ์ฉํ์ง ์๊ณ ์ธ์๋ก app ๋ช
๋ น ๋ฑ์ ์ง์ ํด ๋๊ตฌ ํํ๋ก ์ฌ์ฉํ๋ค|
+| registry | ๋์ปค ๋ ์ง์คํธ๋ฆฌ |`-d`์ต์
์ ์ฌ์ฉํด ๋ฐฑ๊ทธ๋ผ์ด๋๋ก ์คํํ๋ค. `-p` ์ต์
์ผ๋ก ํฌํธ ๋ฒํธ๋ฅผ ์ง์ ํ๋ค.|
+| wordpress | WordPress |`-d`์ต์
์ ์ฌ์ฉํด ๋ฐฑ๊ทธ๋ผ์ด๋๋ก ์คํํ๋ค. `-p` ์ต์
์ผ๋ก ํฌํธ ๋ฒํธ๋ฅผ ์ง์ ํ๋ค. MySQL ๋๋ MariaDB๊ฐ ํ์ํ๋ค. ์ ์์ ํ์ํ ํจ์ค์๋๋ `-e` ์ต์
์ผ๋ก ์ง์ ํ๋ค.|
+| nextcloud | NextCloud |`-d`์ต์
์ ์ฌ์ฉํด ๋ฐฑ๊ทธ๋ผ์ด๋๋ก ์คํํ๋ค. `-p` ์ต์
์ผ๋ก ํฌํธ ๋ฒํธ๋ฅผ ์ง์ ํ๋ค.|
+| redmine | Redmine |`-d`์ต์
์ ์ฌ์ฉํด ๋ฐฑ๊ทธ๋ผ์ด๋๋ก ์คํํ๋ค. `-p` ์ต์
์ผ๋ก ํฌํธ ๋ฒํธ๋ฅผ ์ง์ ํ๋ค. PostgreSQL ๋๋ MySQL์ด ํ์ํ๋ค|
+
+## [์ค์ต] ์ํ์น ์ปจํ
์ด๋๋ฅผ ์ฌ๋ฌ ๊ฐ ์คํํ๊ธฐ
+
+```bash
+# ์ฌ๋ฌ ๊ฐ์ ์ํ์น container ์คํ
+PS C:\Users\Kwon> docker run --name apa000ex3 -d -p 8081:80 httpd
+e21699803316c50412fefe15c8083f002b13f6a77a3fe44425f64df804622b0e
+PS C:\Users\Kwon> docker run --name apa000ex4 -d -p 8082:80 httpd
+fcfaac356cc40277c0855211b0394593db58bbae4c5e70bfb4cf60f10a47fdcb
+PS C:\Users\Kwon> docker run --name apa000ex5 -d -p 8083:80 httpd
+d656af9f2f9bc5c7326efe9c765888586c3564022b13ab14cd8348c8187c5460
+
+PS C:\Users\Kwon> docker ps
+CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
+d656af9f2f9b httpd "httpd-foreground" 10 seconds ago Up 10 seconds 0.0.0.0:8083->80/tcp apa000ex5
+fcfaac356cc4 httpd "httpd-foreground" 16 seconds ago Up 16 seconds 0.0.0.0:8082->80/tcp apa000ex4
+e21699803316 httpd "httpd-foreground" 22 seconds ago Up 22 seconds 0.0.0.0:8081->80/tcp apa000ex3
+
+# container ์ค์ง
+PS C:\Users\Kwon> docker stop apa000ex3
+apa000ex3
+PS C:\Users\Kwon> docker stop apa000ex4
+apa000ex4
+PS C:\Users\Kwon> docker stop apa000ex5
+apa000ex5
+
+PS C:\Users\Kwon> docker ps -a
+CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
+d656af9f2f9b httpd "httpd-foreground" 56 seconds ago Exited (0) 10 seconds ago apa000ex5
+fcfaac356cc4 httpd "httpd-foreground" About a minute ago Exited (0) 13 seconds ago apa000ex4
+e21699803316 httpd "httpd-foreground" About a minute ago Exited (0) 17 seconds ago apa000ex3
+
+# cooontainer ์ญ์
+PS C:\Users\Kwon> docker rm apa000ex3
+apa000ex3
+PS C:\Users\Kwon> docker rm apa000ex4
+apa000ex4
+PS C:\Users\Kwon> docker rm apa000ex5
+apa000ex5
+
+PS C:\Users\Kwon> docker ps -a
+CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
+```
+
+## [์ค์ต] Nginx ์ปจํ
์ด๋ ์คํ
+
+```bash
+# Nginx container ์คํ
+PS C:\Users\Kwon> docker run --name nginx000ex6 -d -p 8084:80 nginx
+Unable to find image 'nginx:latest' locally
+latest: Pulling from library/nginx
+171eebbdf235: Download complete
+9ad567d3b8a2: Download complete
+9b1039c85176: Download complete
+773c63cd62e4: Download complete
+4b0adc47c460: Download complete
+1d2712910bdf: Download complete
+Digest: sha256:bc5eac5eafc581aeda3008b4b1f07ebba230de2f27d47767129a6a905c84f470
+Status: Downloaded newer image for nginx:latest
+eb1e2ba350487505a13e5eda7c72690ca7e999d97d811635d5045c0495e6223f
+
+PS C:\Users\Kwon> docker ps
+CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
+eb1e2ba35048 nginx "/docker-entrypoint.โฆ" 11 seconds ago Up 9 seconds 0.0.0.0:8084->80/tcp nginx000ex6
+
+# container ์ค์ง/์ญ์
+PS C:\Users\Kwon> docker stop nginx000ex6
+nginx000ex6
+
+PS C:\Users\Kwon> docker ps -a
+CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
+eb1e2ba35048 nginx "/docker-entrypoint.โฆ" 33 seconds ago Exited (0) 5 seconds ago nginx000ex6
+
+PS C:\Users\Kwon> docker rm nginx000ex6
+nginx000ex6
+```
+
+## [์ค์ต] MySQL ์ปจํ
์ด๋ ์คํ
+
+```bash
+# MySQL container ์คํ
+PS C:\Users\Kwon> docker run --name mysql000ex7 -dit -e MYSQL_ROOT_PASSWORD=1234 mysql
+Unable to find image 'mysql:latest' locally
+latest: Pulling from library/mysql
+7030c241d9b8: Pulling fs layer
+f1a9f94fc2db: Download complete
+c0fb96d14e5b: Download complete
+f98254a2b688: Download complete
+5f31e56c9bea: Download complete
+d57074c62694: Download complete
+6ad83e89f981: Download complete
+a42d733ea779: Download complete
+6fd1af2601dd: Download complete
+0233a63dc5cd: Download complete
+Digest: sha256:2be51594eba5983f47e67ff5cb87d666a223e309c6c64450f30b5c59a788ea40
+Status: Downloaded newer image for mysql:latest
+58f387c6520598518264e9f0a70ac6e6d9830bf381157aa96063f9eccfc867e6
+
+PS C:\Users\Kwon> docker ps
+CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
+58f387c65205 mysql "docker-entrypoint.sโฆ" 20 minutes ago Up 20 minutes 3306/tcp, 33060/tcp mysql000ex7
+
+# container ์ค์ง/์ญ์
+PS C:\Users\Kwon> docker stop mysql000ex7
+mysql000ex7
+PS C:\Users\Kwon> docker rm mysql000ex7
+mysql000ex7
+```
+
+# SECTION 6. ์ด๋ฏธ์ง ์ญ์
+
+container๋ฅผ ์ฌ๋ฌ ๋ฒ ๋ง๋ค๋ค ๋ณด๋ฉด image๋ ๊ทธ๋๋ก ๋จ์์๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ค.
+ํด๋น ์ด๋ฏธ์ง๋ก ์คํํ container๊ฐ ๋จ์ ์์ผ๋ฉด image๋ฅผ ์ญ์ ํ ์ ์์ผ๋ฏ๋ก ์ฌ์ ์ container๋ฅผ ์ค์ง ๋ฐ ์ญ์ ํ๋ค.
+
+## `docker image rm`
+
+์ฌ๋ฌ ๊ฐ๋ฅผ ํ ๋ฒ์ ์ญ์ ํ ์๋ ์๋ค.
+
+```bash
+docker image rm image1 image2 image3
+```
+
+## `docker image ls`
+
+image๋ฅผ ์ญ์ ํ๋ ค๋ฉด imgae ์ด๋ฆ ๋๋ id๋ฅผ ์์์ผ ํ๋ค.
+
+coantainer ๋ชฉ๋ก์ ๋ถ๋ฌ์ค๋ `docker ps`์ ๊ฐ์ด `docker container ls`๋ก image ๋ชฉ๋ก์ ๋ถ๋ฌ์ฌ ์ ์๋ค.
+์ถ์ฝํ์ `docker ls`์ด๋ค.
+
+```sh
+PS C:\Users\Kwon> docker image ls
+REPOSITORY TAG IMAGE ID CREATED SIZE
+mysql latest 2be51594eba5 4 weeks ago 825MB
+nginx latest bc5eac5eafc5 6 weeks ago 279MB
+httpd latest 6bdbdf5ac16a 4 months ago 221MB
+```
+
+### image version
+
+`image_name:version`์ผ๋ก ์ด๋ฏธ์ง์ ๋ฒ์ ์ ์ง์ ํ ์ ์๋ค.
+
+```sh
+# ์ํ์น 2.2 ๋ฒ์ ์ ์ง์ ํด ์คํ
+docker run --name apa000ex2 -d -p 8080:80 httpd:2.2
+```
+
+## [์ค์ต] ์ด๋ฏธ์ง ์ญ์
+
+```sh
+PS C:\Users\Kwon> docker image ls
+REPOSITORY TAG IMAGE ID CREATED SIZE
+mysql latest 2be51594eba5 4 weeks ago 825MB
+nginx latest bc5eac5eafc5 6 weeks ago 279MB
+httpd latest 6bdbdf5ac16a 4 months ago 221MB
+
+# ์ถ์ฝํ
+PS C:\Users\Kwon> docker rmi httpd
+Untagged: httpd:latest
+Deleted: sha256:6bdbdf5ac16ac3d6ef543a693fd5dfafae2428b4b0cdc52a480166603a069136
+
+PS C:\Users\Kwon> docker image ls
+REPOSITORY TAG IMAGE ID CREATED SIZE
+mysql latest 2be51594eba5 4 weeks ago 825MB
+nginx latest bc5eac5eafc5 6 weeks ago 279MB
+
+# image rm์ผ๋ก ์ญ์
+PS C:\Users\Kwon> docker image rm nginx mysql
+Untagged: nginx:latest
+Deleted: sha256:bc5eac5eafc581aeda3008b4b1f07ebba230de2f27d47767129a6a905c84f470
+Untagged: mysql:latest
+Deleted: sha256:2be51594eba5983f47e67ff5cb87d666a223e309c6c64450f30b5c59a788ea40
+
+PS C:\Users\Kwon> docker image ls
+REPOSITORY TAG IMAGE ID CREATED SIZE
+```
\ No newline at end of file
diff --git a/_posts/2024-12-09-dockerCH5.markdown b/_posts/2024-12-09-dockerCH5.markdown
new file mode 100644
index 00000000000..899e6ec8c02
--- /dev/null
+++ b/_posts/2024-12-09-dockerCH5.markdown
@@ -0,0 +1,158 @@
+---
+title: "CH5. ์ฌ๋ฌ ๊ฐ์ ์ปจํ
์ด๋๋ฅผ ์ฐ๋ํด ์คํํด๋ณด์ [๊ทธ๋ฆผ์ผ๋ก ๋ฐฐ์ฐ๋ ๋์ปค & ์ฟ ๋ฒ๋คํฐ์ค]"
+author: kwon
+date: 2024-12-09T14:00:00 +0900
+categories: [๋์ปค]
+tags: [docker]
+math: true
+mermaid: false
+---
+
+# SECTION 1. ์๋ํ๋ ์ค ๊ตฌ์ถ
+
+## ์๋ํ๋ ์ค ๊ตฌ์ถ
+
+์๋ํ๋ ์ค๋ ์น ์ฌ์ดํธ๋ฅผ ๋ง๋ค๊ธฐ ์ํ ์ํํธ์จ์ด๋ก, ์ํ์น๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค, PHP ๋ฐํ์ ๋ฑ์ ํ์๋ก ํ๊ธฐ ๋๋ฌธ์ ๊ตฌ์ถ์ ์ํ ์ฐ์ต ์์ฌ๋ก ์ข๋ค.
+
+์๋ํ๋ ์ค๋ ์๋ํ๋ ์ค ์ปจํ
์ด๋์ MySQL ์ปจํ
์ด๋๋ก ๊ตฌ์ฑ๋๋ค.
+์๋ํ๋ ์ค๋ ๋ธ๋ก๊ทธ ์์ฑ ๋๊ตฌ์ ๊ฐ์ ๊ฒ์ด๋ฏ๋ก, ํ๋ก๊ทธ๋จ์ด MySQL์ ์ ์ฅ๋ ๋ฐ์ดํฐ๋ฅผ ์ฝ๊ณ ์ธ ์ ์์ด์ผ ํ๋ค.
+๋๋ฌธ์ ๋ ์ปจํ
์ด๋๊ฐ ์ฐ๊ฒฐ๋ผ ์์ด์ผ ํ๋ค.
+
+๋ ์ปจํ
์ด๋๋ฅผ ์ฐ๊ฒฐํ๊ธฐ ์ํด์๋ ๊ฐ์ ๋คํธ์ํฌ๋ฅผ ๋ง๋ค์ด ๋ ๊ฐ์ ์ปจํ
์ด๋๋ฅผ ์์์์ผ ์ฐ๊ฒฐํ๋ค.
+๋คํธ์ํฌ์ ๋ํ ๊ธฐ๋ณธ ๋ช
๋ น์ด๋ ๋ค์๊ณผ ๊ฐ๋ค.
+```sh
+# ์์ฑ
+docker network create
+# ์ญ์
+docker network rm
+# ์กฐํ
+docker network ls
+# ์ ์
+docker network connect
+# ์ ์ ๋๊ธฐ
+docker network disconnect
+# ์์ธ ์ ๋ณด
+docker network isnpect
+# ์๋ฌด๋ ์ ์ํ์ง ์์ ๋คํธ์ํฌ ์ญ์
+docker network prune
+```
+
+### MySQL ์คํ ์ ํ์ํ ์ต์
๊ณผ ์ธ์
+
+```sh
+docker run --name -dit --net= -e MYSQL_ROOT_PASSWORD= MYSQL_DATABASE= -e MYSQL_USER= -e MYSQL_PASSWORD= mysql --charactoer-set-server=<๋ฌธ์์ธ์ฝ๋ฉ> --collation-server=<์ ๋ ฌ์์> --default-authentication-plugin=<์ธ์ฆ๋ฐฉ์>
+```
+
+๋ญ๊ฐ ์์ฒญ ๋ง์ ๋ณด์ด์ง๋ง ๋ชจ๋ ๊ฑฐ์ ํ๊ฒฝ๋ณ์ ์ค์ ์ด๋ค.
+#### ์ต์
+
+| ํญ๋ชฉ | ์ต์
|
+| :----------------------- | :----------------------- |
+| ๋คํธ์ํฌ ์ด๋ฆ | `--net` |
+| ์ปจํ
์ด๋ ์ด๋ฆ | `--name` |
+| MySQL ๋ฃจํธ ํจ์ค์๋ | `-e MYSQL_ROOT_PASSWORD` |
+| MySQL ๋ฐ์ดํฐ ๋ฒ ์ด์ค ์ด๋ฆ | `-e MYSQL_DATABASE` |
+| MySQL ์ฌ์ฉ์ ์ด๋ฆ | `-e MYSQL_USER` |
+| MySQL ํจ์ค์๋ | `-e MYSQL_PASSWORD` |
+
+#### ์ธ์
+
+| ํญ๋ชฉ | ๊ฐ |
+| :--------- | :------------------------------- |
+| ๋ฌธ์ ์ธ์ฝ๋ฉ | `--charactoer-set-server` |
+| ์ ๋ ฌ ์์ | `--collation-server` |
+| ์ธ์ฆ ๋ฐฉ์ | `--default-authentication-plugin` |
+
+
+### ์๋ํ๋ ์ค ์ปจํ
์ด๋ ์คํ ์ ํ์ํ ์ต์
๊ณผ ์ธ์
+
+```sh
+docker run --name -dit --net= -p -e ... wordpress
+```
+
+#### ์ต์
+
+์ฌ๊ธฐ๋ ์ฌ์ฉํ ์ ์๋ ์ต์
์ด ๋ง๋ค.
+
+| ํญ๋ชฉ | ๊ฐ |
+| :-------------------------- | :-------------------------- |
+| ๋ฐ์ดํฐ ๋ฒ ์ด์ค ์ปจํ
์ด๋ ์ด๋ฆ | `-e WORDPRESS_DB_HOST` |
+| ๋ฐ์ดํฐ ๋ฒ ์ด์ค ์ด๋ฆ | `-e WORDPRESS_DB_NAME` |
+| ๋ฐ์ดํฐ ๋ฒ ์ด์ค ์ฌ์ฉ์ ์ด๋ฆ | `-e WORDPRESS_DB_USER` |
+| ๋ฐ์ดํฐ ๋ฒ ์ด์ค ๋น๋ฐ๋ฒํธ | `-e WORDPRESS_DB_PASSSWORD` |
+
+---
+# SECTION 2. ์๋ํ๋ ์ค ๋ฐ MySQL ์ปจํ
์ด๋ ์์ฑ๊ณผ ์ฐ๋
+
+```sh
+C:\Users\Kwon>docker run --name mysql000ex11 -dit --net=wp -e MYSQL_ROOT_PASSWORD=1234 -e MYSQL_DATABASE=wordpress---db -e MYSQL_USER=wordpress000user -e MYSQL_PASSWORD=1234 mysql --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci --default-authentication-plugin=mysql_native_password
+853dd040ade1fef5532d8429504d7a1b2ab3f0b3cb6f8ed635918d4df773b1b6
+
+C:\Users\Kwon>docker run --name wordpress000ex12 -dit --net=wp -p 8085:80 -e WORDPRESSS_DB_HOST=mysql000ex11 -e WORDPRES
+S_DB_NAME=wordpress000db -e WORDPRESS_DB_USER=wordpress000user -e WORDPRESS_DB_PASSWORD=1234 wordpress
+aef41f135fbdba00fe389a0f882e52aaa05f24f638fbf7ce3277dfc964ea5e79
+
+C:\Users\Kwon>docker ps
+CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
+aef41f135fbd wordpress "docker-entrypoint.sโฆ" 24 seconds ago Up 21 seconds 0.0.0.0:8085->80/tcp wordpress000ex12
+```
+
+์ฑ
๊ณผ ๋๊ฐ์ด ์์ฑํ๋๋ฐ๋ mysql์ด ์คํ์ด ์ ์์ ์ผ๋ก ๋์ง ์์ log๋ฅผ ํ์ธํด๋ดค๋ค.
+
+```sh
+C:\Users\Kwon>docker logs mysql000ex11
+2024-12-09 06:59:03+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 9.1.0-1.el9 started.
+2024-12-09 06:59:03+00:00 [Note] [Entrypoint]: Switching to dedicated user 'mysql'
+2024-12-09 06:59:03+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 9.1.0-1.el9 started.
+2024-12-09 06:59:03+00:00 [Note] [Entrypoint]: Initializing database files
+2024-12-09T06:59:03.712828Z 0 [System] [MY-015017] [Server] MySQL Server Initialization - start.
+2024-12-09T06:59:03.715059Z 0 [System] [MY-013169] [Server] /usr/sbin/mysqld (mysqld 9.1.0) initializing of server in progress as process 80
+2024-12-09T06:59:03.733272Z 1 [System] [MY-013576] [InnoDB] InnoDB initialization has started.
+2024-12-09T06:59:04.187540Z 1 [System] [MY-013577] [InnoDB] InnoDB initialization has ended.
+2024-12-09T06:59:05.435282Z 0 [ERROR] [MY-000067] [Server] unknown variable 'default-authentication-plugin=mysql_native_password'.
+2024-12-09T06:59:05.435689Z 0 [ERROR] [MY-013236] [Server] The designated data directory /var/lib/mysql/ is unusable. You can remove all files that the server added to it.
+2024-12-09T06:59:05.435725Z 0 [ERROR] [MY-010119] [Server] Aborting
+2024-12-09T06:59:06.816914Z 0 [System] [MY-015018] [Server] MySQL Server Initialization - end.
+```
+
+~~`default-authentication-plugin`์ด ์๋จ๋ค. ์ฌ๊ธฐ์ ๊ธฐ ์ฐพ์๋ดค์ง๋ง ์์ง ๋ต์ ์ฐพ์ง ๋ชปํด ์ผ๋จ ์ ๊ฑฐํ๊ณ ์งํํ๋ค.~~
+
+```sh
+C:\Users\Kwon>docker run --name mysql000ex11 -dit --net=wp -e MYSQL_ROOT_PASSWORD=1234 -e MYSQL_DATABASE=wordpress---db
+-e MYSQL_USER=wordpress000user -e MYSQL_PASSWORD=1234 mysql:8 --character-set-server=utf8mb4 --collation-server=utf8mb4_
+unicode_ci --default-authentication-plugin=mysql_native_password
+686dada7cdad34fca5dbf41bd22e4f870a449293a9bccdcaf56f883f22ce2775
+
+C:\Users\Kwon>docker ps
+CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
+686dada7cdad mysql:8 "docker-entrypoint.sโฆ" 8 seconds ago Up 5 seconds 3306/tcp, 33060/tcp mysql000ex11
+```
+์ฑ
๊ณผ ๋ฒ์ ์ ๋ง์ถฐ์ฃผ๋ ๋๋ค. mysql 8 ๋ฒ์ ์ผ๋ก ์งํํด์ผ ํ๋ค.
+
+```sh
+C:\Users\Kwon>docker run --name mysql000ex11 -dit --net=wp -e MYSQL_ROOT_PASSWORD=1234 -e MYSQL_DATABASE=wordpress---db -e MYSQL_USER=wordpress000user -e MYSQL_PASSWORD=1234 mysql --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
+bd36ad18cacf2d5cb868c6007b3b73272477a5dc39e9b52e374fdd84cb1cd51b
+
+C:\Users\Kwon>docker ps
+CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
+bd36ad18cacf mysql "docker-entrypoint.sโฆ" 11 seconds ago Up 11 seconds 3306/tcp, 33060/tcp mysql000ex11
+aef41f135fbd wordpress "docker-entrypoint.sโฆ" 41 minutes ago Up 41 minutes 0.0.0.0:8085->80/tcp wordpress000ex12
+```
+
+์ ์์ ์ผ๋ก ์คํ๋๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
+---
+
+# SECTION 3. ๋ช
๋ น์ด๋ฅผ ์ง์ ์์ฑํ์
+
+## SW์ DB์ ๊ด๊ณ
+
+์๋ํ๋ ์ค๋ฅผ ์ฌ์ฉํ๋ ค๋ฉด ์๋ํ๋ ์ค ํ๋ก๊ทธ๋จ ์ธ์๋ ์ํ์น์ PHP ๋ฐํ์, MySQL์ด ํ์ํ๋ค.
+์๋ํ์์ค ์ธ์๋ ์ด๋ฌํ ํ์์ผ๋ก ๊ตฌ์ฑ๋๋ ์น ์์คํ
์ด ๋ง๋ค.
+
+ํนํ ์ํ์น, PHP, MySQL์ ๋ฆฌ๋
์ค๋ฅผ ํฉ์น ์กฐํฉ์ **LAMP ์คํ**์ด๋ผ๊ณ ๋ถ๋ฅธ๋ค.
+SW๊ฐ ๋ฐ์ ํ๋ฉด์ ์ํ์น๊ฐ nginx๋ก ๋ฐ๋๊ธฐ๋ ํ๊ณ , MySQL์ด MariaDB๋ PosetgreSQL๋ก ๋ฐ๋ ์กฐํฉ๋ ๋ํ๋ฌ์ง๋ง
+'**๋ฆฌ๋
์ค + ์น์๋ฒ + ํ๋ก๊ทธ๋๋ฐ ์ธ์ด ๋ฐํ์ + ๋ฐ์ดํฐ๋ฒ ์ด์ค**'์ ์กฐํฉ์์ ๋ณํจ์ด ์๋ค.
+
+๋ฐ๋ผ์ ์ปจํ
์ด๋๋ 'ํ๋ก๊ทธ๋จ ๋ณธ์ฒด + ํ๋ก๊ทธ๋จ ๋ฐํ์ + ์น ์๋ฒ' ์ปจํ
์ด๋์ '๋ฐ์ดํฐ๋ฒ ์ด์ค' ์ปจํ
์ด๋๋ก ๊ตฌ์ฑํด ์ด๋ นํ๋ ์ฌ๋ก๋ฅผ ํํ ๋ณผ ์ ์๋ค.
+
+๊ธ์ด ๊ธธ์ด์ง์ ๋ฐ๋ผ ํฌ์คํ
์์๋ ์ค์ต์ ์ ์ธํ๋๋ก ํ๋ค. ์๋ํ๋ ์ค - MySQL๊ณผ ๊ฑฐ์ ๋น์ทํ ๊ณผ์ ์ผ๋ก ์งํ๋๋ค.
\ No newline at end of file
diff --git a/_posts/2024-12-12-dockerCH6.markdown b/_posts/2024-12-12-dockerCH6.markdown
new file mode 100644
index 00000000000..4dd37bc60e4
--- /dev/null
+++ b/_posts/2024-12-12-dockerCH6.markdown
@@ -0,0 +1,272 @@
+---
+title: "CH6. ์ปจํ
์ด๋์ ํธ์คํธ ๊ฐ์ ํ์ผ ๋ณต์ฌํ๊ธฐ [๊ทธ๋ฆผ์ผ๋ก ๋ฐฐ์ฐ๋ ๋์ปค & ์ฟ ๋ฒ๋คํฐ์ค]"
+author: kwon
+date: 2024-12-12T14:00:00 +0900
+categories: [๋์ปค]
+tags: [docker]
+math: true
+mermaid: false
+---
+
+# SECTION 2. ์ปจํ
์ด๋์ ํธ์คํธ ๊ฐ์ ํ์ผ ๋ณต์ฌํ๊ธฐ
+
+## ํ์ผ ๋ณต์ฌ
+
+> ํ๋ก๊ทธ๋จ๋ง์ผ๋ก ๊ตฌ์ฑ๋ ์์คํ
์ ๊ทธ๋ฆฌ ๋ง์ง ์๋ค.
+
+5์ฅ์์๋ ๋์๋ฏ์ด ํ๋ก๊ทธ๋จ ์ธ์๋ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์ ๋ฐํ์์ด๋ ์น ์๋ฒ, ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ฑ์ด ํจ๊ป ์์คํ
์ ๊ตฌ์ฑํ๋ค.
+
+์ด๋ค์ ์์คํ
์ด ๋์ํ๋ ๋ฐ ํ์ํ์ง๋ง, ๊ทธ ์ธ์๋ ํ๋ฉด์ ๊ตฌ์ฑํ๋ ์ด๋ฏธ์ง, ์
๋ ฅ๋ฐ์๋ฐ์ดํฐ ๋ณธ์ฒด ๋ฑ์ด ์์ ์ ์๋ค.
+์ด๋ฌํ ํ์ผ์ ์๋ฒ์ ์ ์ฅ๋๊ธฐ๋ ํ์ง๋ง ๋๋ก๋ SW์ ๊ฐ์
์์ด ์๋ฒ์ ๋ก์ปฌ ์ปดํจํฐ ๊ฐ์ ํ์ผ์ ์ฃผ๊ณ ๋ฐฉ์์ผ ํ ๋๊ฐ ์๋ค.
+์ด๋ด ๋๋ฅผ ์ํด ํ์ผ ๋ณต์ฌํ๋ ๋ฐฉ๋ฒ์ ์์๋ฌ์ผ ํ๋ค.
+
+### `docker cp(container cp)`
+
+```sh
+docker cp ํธ์คํธ_๊ฒฝ๋ก ์ปจํ
์ด๋_์ด๋ฆ:์ปจํ
์ด๋_๊ฒฝ๋ก
+docker cp ์ปจํ
์ด๋_์ด๋ฆ:์ปจํ
์ด๋_๊ฒฝ๋ก ํธ์คํธ_๊ฒฝ๋ก
+
+docker cp ์๋ณธ_๊ฒฝ๋ก ๋ณต์ฌํ _๊ฒฝ๋ก
+```
+
+### ์ค์ต
+
+```html
+
+
+
+ ์๋
ํ์ธ์!
+
+
+```
+
+```sh
+C:\Users\Kwon>docker run --name apa000ex19 -d -p 8089:80 httpd
+4c037b31d34ea7c0b500b3f84b53b67e04eb1d466ebb0be26dfa6c655b0df72b
+
+C:\Users\Kwon>docker cp C:\Users\Kwon\Desktop\repositories\SSAFY-Docker-Study\members\kwon\index.html apa000ex19:/usr/local/apache2/htdocs/
+Successfully copied 2.05kB to apa000ex19:/usr/local/apache2/htdocs/
+```
+
+์ html ํ์ผ์ ๋ณต์ฌํด์ localhost์ ์ ์ํด๋ณด๋ฉด ์๋์ ๊ฐ์ด ํ๋ฉด์ด ๋์ค๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
+
+{: width="70%"}
+
+์ธ์ฝ๋ฉ์ด ๋ฌธ์ ๊ฐ ์๊ฒผ๋๋ฐ... ์ผ๋จ html์ ๋ํด ๋ค๋ฃจ๋ ๊ฒ์ด ๋ชฉ์ ์ด ์๋๋ฏ๋ก ๋์ด๊ฐ๋๋ก ํ์.
+
+
+# SECTION 3. ๋ณผ๋ฅจ ๋ง์ดํธ
+
+> ๋ณผ๋ฅจ์ด๋ **์คํ ๋ฆฌ์ง์ ํ ์์ญ์ ๋ถํ ํ ๊ฒ**
+
+๋ณผ๋ฅจ ๋ง์ดํธ๋ ์ด๋ฐ ๋ณผ๋ฅจ์ ์ฐ๊ฒฐํ์ฌ ์ด๋ น์ฒด์ ๋๋ ์ํํธ์จ์ด์ ๊ด๋ฆฌํ๊ฒ ๋๋ ์ผ์ ๋งํ๋ค.
+
+์ปจํ
์ด๋๋ ์ฐ๊ณ ๋ฒ๋ฆฌ๋ ๊ฒ์ด๋ผ ์ด ๋ด๋ถ์ ๋ฐ์ดํฐ๊ฐ ์๋ค๋ฉด, ์ธ์ ๊ฐ๋ ์ญ์ ๋๊ธฐ ๋ง๋ จ์ด๋ค.
+๋ฐ์ดํฐ๊ฐ ์ด๋ ๊ฒ ์ฌ๋ผ์ง๋ ๊ฒ์ ๋ง๊ธฐ ์ํด ๋ง์ดํธ๋ฅผ ํด์ ์ธ๋ถ์ ๋ฐ์ดํฐ๋ฅผ ์์ ํ๊ฒ ๋ณด๊ดํ๋ค. (Data persistency)
+
+### Data Persist
+> "Data Persist"๋ ๋ฐ์ดํฐ๋ฅผ "์๊ตฌ์ ์ผ๋ก ์ ์ฅํ๊ฑฐ๋ ์ ์ง"ํ๋ ๊ฒ์ ์๋ฏธํ๋ค.
+>
+> ์ด๋ ์ฃผ๋ก ํ๋ฐ์ฑ ๋ฐ์ดํฐ(์: ๋ฉ๋ชจ๋ฆฌ์๋ง ์กด์ฌํ๋ ๋ฐ์ดํฐ)์ ๋ฐ๋๋๋ ๊ฐ๋
์ผ๋ก ์๊ตฌ์ ์ธ ์ ์ฅ์(์:ํ๋์จ์ด)์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ์ฌ ์์คํ
์ด ์ฌ์์ํ๊ฑฐ๋ ์ ์ ์ข
๋ฃ ์ดํ์๋ ๋ฐ์ดํฐ๊ฐ ์ฌ๋ผ์ง์ง ์๋ ๊ฒ์ ๋ปํ๋ค.
+
+
+## Storage Mount
+
+๋์ปค์์ ์คํ ๋ฆฌ์ง ๋ง์ดํธ๋ ๋ ๊ฐ์ง ์ข
๋ฅ๊ฐ ์๋ค.
+
+### Volmune Mount
+
+๋ณผ๋ฅจ ๋ง์ดํธ๋ ๋์ปค ์์ง์ด ๊ด๋ฆฌํ๋ ์๋ ฅ ๋ด์ ๋ง๋ค์ด์ง ๋ณผ๋ฅจ์ ์ปจํ
์ด๋์ ๋์คํฌ ํํ๋ก ๋ง์ดํธํ๋ค.
+
+์ด๋ฆ๋ง์ผ๋ก ๊ด๋ฆฌ๊ฐ ๊ฐ๋ฅํ๋ฏ๋ก ๋ค๋ฃจ๊ธฐ ์ฝ์ง๋ง ๋ณผ๋ฅจ์ ๋นํด **์ง์ ์กฐ์ํ๊ธฐ ์ด๋ ค์ฐ๋ฏ๋ก** '์์ ๋ชฉ์ ์ ์ฌ์ฉ'์ด๋
+'์์ฃผ ์ฐ์ง๋ ์์ง๋ง ์ง์ฐ๋ฉด ์ ๋๋ ํ์ผ'์ ๋ชฉ์ ์ผ๋ก ๋ง์ด ์ฌ์ฉํ๋ค.
+
+### Bind Mount
+
+๋ฐ์ธ๋ ๋ง์ดํธ๋ ๋์ปค๊ฐ ์ค์น๋ ์ปดํจํฐ์ ๋ฌธ์ ํด๋ ๋ฑ์ ๋์ปค ์์ง์์ ๊ด๋ฆฌํ์ง ์๋ ์์ญ์ ๊ธฐ์กด ๋๋ ํฐ๋ฆฌ๋ฅผ ์ปจํ
์ด๋์ ๋ง์ดํธ ํ๋ ๋ฐฉ์์ด๋ค.
+ํ์ผ ๋จ์ ๋ง์ดํธ๋ ๊ฐ๋ฅํ๋ค.
+
+ํด๋ ์์ ํ์ผ์ ์ง์ ๋ฃ์ด๋๊ฑฐ๋ ์ด์ด ๋ณผ ์ ์๊ธฐ ๋๋ฌธ์ **์์ฃผ ์ฌ์ฉํ๋ ํ์ผ**์ ๋๋ ๋ฐ ์ฌ์ฉํ๋ค.
+
+| ํญ๋ชฉ | ๋ณผ๋ฅจ ๋ง์ดํธ | ๋ฐ์ธํธ ๋ง์ดํธ |
+| :------------ | :---------------------- | :--------------------------- |
+| ์คํ ๋ฆฌ์ง ์์ญ | ๋ณผ๋ฅจ | ๋๋ ํฐ๋ฆฌ ๋๋ ํ์ผ |
+| ๋ฌผ๋ฆฌ์ ์์น | ๋์ปค ์์ง์ ๊ด๋ฆฌ ์์ญ | ์ด๋๋ ์ง ๊ฐ๋ฅ |
+| ๋ง์ดํธ ์ ์ฐจ | ๋ณผ๋ฅจ์ ์์ฑํ ํ ๋ง์ดํธ | ๊ธฐ์กด ํ์ผ ๋๋ ํด๋๋ฅผ ๋ง์ดํธ |
+| ๋ด์ฉ ํธ์ง | ๋์ปค ์ปจํ
์ด๋๋ฅผ ํตํด | ์ผ๋ฐ์ ์ธ ํ์ผ๊ณผ ๊ฐ์ด |
+| ๋ฐฑ์
| ์ ์ฐจ๊ฐ ๋ณต์กํจ | ์ผ๋ฐ์ ์ธ ํ์ผ๊ณผ ๊ฐ์ด |
+
+ํ์ผ์ ์ง์ ํธ์งํด์ผ ํ ์ผ์ด ๋ง๋ค๋ฉด ๋ฐ์ธ๋ ๋ง์ดํธ๋ฅผ, ๊ทธ๋ ์ง ์๋ค๋ฉด ๋ณผ๋ฅจ ๋ง์ดํธ๋ฅผ ์ฌ์ฉํ๋ฉด ๋๋ค.
+
+### ์คํ ๋ฆฌ์ง ์์ญ์ ๋ง์ดํธํ๋ ์ปค๋งจ๋
+
+run ์ปค๋งจ๋์ ์ต์
ํํ๋ก ์ง์ ํ๋ค.
+
+๋ง์ดํธ ์ด์ ์ volume์ ๋จผ์ ๋ง๋ค์ด์ผ ํ๋ค.
+
+```sh
+# ์์ฑ
+docker volume create volume_name
+# ์ญ์
+docker volume rm volume_name
+# ์์ธ์ ๋ณด
+docker volume inspect volume_name
+# ๋ชฉ๋ก
+docker volume ls
+# ๋ง์ดํธ๋์ง ์์ ๋ณผ๋ฅจ ๋ชจ๋ ์ญ์
+docker volume prune
+```
+
+์ดํ ์คํ ๋ฆฌ์ง๋ฅผ ๋ง์ดํธํ๋ค
+
+```sh
+# ๋ฐ์ธ๋ ๋ง์ดํธ
+-v ์คํ ๋ฆฌ์ง_์ค์ _๊ฒฝ๋ก:์ปจํ
์ด๋_๋ง์ดํธ_๊ฒฝ๋ก
+# ๋ณผ๋ฅจ ๋ง์ดํธ
+-v ๋ณผ๋ฅจ_์ด๋ฆ:์ปจํ
์ด๋_๋ง์ดํธ_๊ฒฝ๋ก
+```
+---
+
+# SECTION 4. ์ปจํ
์ด๋๋ก ์ด๋ฏธ์ง ๋ง๋ค๊ธฐ
+
+## ์ด๋ฏธ์ง ๋ง๋ค๊ธฐ
+### commit ์ปค๋งจ๋๋ก ์ปจํ
์ด๋๋ฅผ ์ด๋ฏธ์ง๋ก ๋ณํ
+
+```sh
+docker commit container_name new_image_name
+```
+
+### Dockerfile ์คํฌ๋ฆฝํธ๋ก ์ด๋ฏธ์ง ๋ง๋ค๊ธฐ
+
+Dockerfile ์คํฌ๋ฆฝํธ์๋ ํ ๋๊ฐ ๋ ์ด๋ฏธ์ง๋ ์คํํ ๋ช
๋ น์ด ๋ฑ์ ๊ธฐ์ ํ๋ค.
+
+์ด ํ์ผ์ ํธ์คํธ ์ปดํจํฐ์ ์ด๋ฏธ์ง ์ฌ๋ฃ๊ฐ ๋ค์ด์๋ ํด๋์ ๋ฃ๋๋ค. ์ฌ๋ฃ ํด๋์๋ ๊ทธ ์ธ ์ปจํ
์ด๋์ ๋ฃ์ ํ์ผ์ ํจ๊ป๋๋ค.
+
+```sh
+docker build -t new_image_name ์ฌ๋ฃ_ํด๋_๊ฒฝ๋ก
+```
+
+```Dockerfile
+FROM ์ด๋ฏธ์ง_์ด๋ฆ
+COPY ์๋ณธ_๊ฒฝ๋ก ๋์_๊ฒฝ๋ก
+RUN ๋ฆฌ๋
์ค_๋ช
๋ น์ด
+...
+```
+
+| ์ธ์คํธ๋ญ์
| ๋ด์ฉ |
+| :------------ | :--- |
+| `FROM` |ํ ๋๊ฐ ๋๋ ์ด๋ฏธ์ง๋ฅผ ์ง์ |
+| `ADD` |์ด๋ฏธ์ง์ ํ์ผ์ด๋ ํด๋๋ฅผ ์ถ๊ฐ|
+| `COPY` |์ด๋ฏธ์ง์ ํ์ผ์ด๋ ํด๋๋ฅผ ๋ณต์ฌ|
+| `RUN` |์ด๋ฏธ์ง๋ฅผ ๋น๋ํ ๋ ์คํํ ๋ช
๋ น์ด ์ง์ |
+| `CMD` |์ปจํ
์ด๋๋ฅผ ์คํํ ๋ ์คํํ ๋ช
๋ น์ด ์ง์ |
+| `ENTRYPOINT` |์ปจํ
์ด๋๋ฅผ ์คํํ ๋ ์คํํ ๋ช
๋ น์ด ๊ฐ์ ์ง์ |
+| `ONBUILD` |์ด ์ด๋ฏธ์ง๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๋ค๋ฅธ ์ด๋ฏธ์ง๋ฅผ ๋น๋ํ ๋ ์คํํ ๋ช
๋ น์ด๋ฅผ ์ง์ |
+| `EXPOSE` |์ด๋ฏธ์ง๊ฐ ํต์ ์ ์ฌ์ฉํ ํฌํธ๋ฅผ ๋ช
์์ ์ผ๋ก ์ง์ |
+| `VOLUME` |persistency data๋ฅผ ์ ์ฅํ ๊ฒฝ๋ก๋ฅผ ๋ช
์์ ์ผ๋ก ์ง์ |
+| `ENV` |ํ๊ฒฝ๋ณ์ ์ ์|
+| `WORKDIR` |`RUN`, `CMD`, `ENTRYPOINT`, `ADD`, `COPY`์ ์ ์๋ ๋ช
๋ น์ด๋ฅผ ์คํํ๋ ์์
๋๋ ํฐ๋ฆฌ๋ฅผ ์ง์ |
+| `SHELL` |๋น๋ ์ ์ฌ์ฉํ shell์ ๋ณ๊ฒฝ|
+| `LABEL` |์ด๋ฆ์ด๋ ๋ฒ์ , ์ ์์ ์ ๋ณด๋ฅผ ์ค์ |
+| `USER` |`RUN`, `CMD`, `ENTRYPOINT`์ ์ ์๋ ๋ช
๋ น์ด๋ฅผ ์คํํ๋ ์ฌ์ฉ์ ๋๋ ๊ทธ๋ฃน์ ์ง์ |
+| `ARG` |`docker build` ์ปค๋งจ๋๋ฅผ ์ฌ์ฉํ ๋ ์
๋ ฅ๋ฐ์ ์ ์๋ ์ธ์๋ฅผ ์ ์ธ|
+| `STOPSIGNAL` |`docker build` ์ปค๋งจ๋๋ฅผ ์ฌ์ฉํ ๋ ์ปจํ
์ด๋ ์์์ ์คํ ์ค์ธ ํ๋ก๊ทธ๋จ์ ์ ๋ฌ๋๋ ์๊ทธ๋์ ๋ณ๊ฒฝ|
+| `HEALTHCHECK` |์ปจํ
์ด๋ health check ๋ฐฉ๋ฒ์ ์ปค์คํฐ๋ง์ด์ง|
+
+
+## ์ด๋ฏธ์ง ์ฎ๊ธฐ๊ธฐ
+
+์ปจํ
์ด๋๋ ๋จผ์ ์ด๋ฏธ์ง๋ก ๋ณํํ์ง ์์ผ๋ฉด ์ฎ๊ธฐ๊ฑฐ๋ ๋ณต์ฌํ ์ ์๋ค. ํ์ง๋ง ์ด๋ฏธ์ง ์ญ์ ์ด๋ฏธ์ง ์ํ ๊ทธ๋๋ก๋ ์ฎ๊ธฐ๊ฑฐ๋ ๋ณต์ฌํ ์ ์์ผ๋ฏ๋ก ๋์ปค ๋ ์ง์คํธ๋ฆฌ๋ฅผ ํตํ๊ฑฐ๋
+`save` ์ปค๋งจ๋๋ฅผ ์ฌ์ฉํด tar ํฌ๋งท์ผ๋ก ๋์ปค ์์ง์ ๊ด๋ฆฌ ์์ญ ๋ฐ์ผ๋ก ๋ด๋ณด๋ด์ผ ํ๋ค. ํ์ผ์ ํธ์คํธ ์ปดํจํฐ์ ํ์ผ ์์คํ
์ ์์ฑ๋๋ค.
+ํ์ผ์ ๋ค์ ๋์ปค ์์ง์ ๊ฐ์ ธ ์ค๋ ค๋ฉด `load` ์ปค๋งจ๋๋ฅผ ์ฌ์ฉํ๋ค.
+```sh
+docker save -o file_name.tar image_name
+```
+---
+
+# SECTION 5. ์ปจํ
์ด๋ ๊ฐ์กฐ
+
+๋์ปค๋ฅผ ์ค์ ์ด์ฉํ๋ ํ์ฅ์์๋ ์ฌ๋ด์์ ๊ฐ๋ฐํ ์์คํ
์ ์ด์ํ๋ ๊ฒฝ์ฐ๊ฐ ๋ง๋ค.
+์ฌ๋ด ๊ฐ๋ฐ ์์คํ
์ด ์๋๋๋ผ๋ ๊ณต์ ๋ฐฐํฌ๋๋ SW ์ญ์ ์์ ํด์ผ ํ ํ์๊ฐ ์ข
์ข
์๋ค.
+
+์ปจํ
์ด๋๋ฅผ ๊ฐ์กฐํ๋ ๋ฐฉ๋ฒ์๋ ๋ ๊ฐ์ง ๋ฐฉ๋ฒ์ด ์์ผ๋ฉฐ, ๋๋ถ๋ถ ์ด๋ฅผ ํผ์ฉํ์ฌ ์ฌ์ฉํ๋ค.
+
+1. ํ์ผ ๋ณต์ฌ์ ๋ง์ดํธ๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ
+2. ์ปจํ
์ด๋์์ ๋ฆฌ๋
์ค ๋ช
๋ น์ด๋ฅผ ์คํํ๋ ๋ฐฉ๋ฒ
+
+### container์์ ๋ช
๋ น์ด ์คํ
+
+container์ bash์ ์ ๊ทผํด ๋ช
๋ น์ ์คํํ๊ธฐ ์ํด์๋ `/bin/bash` ์ธ์๋ฅผ ์ฌ์ฉํ๋ค.
+
+```sh
+docker exec (options) container_name /bin/bash
+docker run (options) image_name /bin/bash
+```
+
+container๊ฐ ์ด๋ฏธ ์คํ ์ค์ด๋ผ๋ฉด `exec`๋ฅผ ์ฌ์ฉํด์ ์ ๊ทผํ๊ณ , ์๋ก ์์ํ๋ ๊ฒฝ์ฐ run์ผ๋ก ์คํํ๋ค.
+
+ํ์ง๋ง `run`์ ์ธ์๋ฅผ ๋ถ์ฌ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ์ปจํ
์ด๋์ ๋ค์ด์๋ SW(์ํ์น ๊ฐ์)๋ฅผ ์คํํ๋ ๋์ bash๊ฐ ์คํ๋๋ค.
+๊ทธ๋์ container๋ ์คํ ์ค์ธ๋ฐ SW๋ ์คํ ์ค์ด ์๋ ์ํ๊ฐ ๋๋ค. ์ฆ, bash ์กฐ์์ด ๋๋๊ณ **๋ค์ `docker start`๋ก ์ฌ์์**ํด์ผ ํ๋ค.
+
+```sh
+docker exec -it apa000ex23 /bin/bash
+
+# ์ํ์น ์คํ ์๋จ
+docker run --name apa000ex23 -it -p 8089:80 httpd /bin/bash
+
+# ๋๊ฐ๊ธฐ
+exit
+```
+
+์ด๋ฐ ์์ผ๋ก ์ฌ์ฉํ ์ ์๋ค. ์ด๋ ๊ฒ bash์ ์ ๊ทผํ๋ฉด container์ ์ง์ ๋ช
๋ น์ ๋ด๋ฆด ์ ์๊ฒ ๋๋ค.
+
+### ๋์ปค ์์ง์ ํตํ ๋ช
๋ น๊ณผ ์ปจํ
์ด๋ ๋ด๋ถ์์ ์คํํ๋ ๋ช
๋ น
+
+| ๋์ปค ์์ง | ์ปจํ
์ด๋ ๋ด๋ถ |
+| :-------------------------: | :------------: |
+| ๋์ปค ์์ง์ ์์ / ์ข
๋ฃ | SW ์ค์น |
+| ์ปจํ
์ด๋์ ์์ / ์ข
๋ฃ | SW ์คํ / ์ข
๋ฃ |
+| ์ปจํ
์ด๋ ์ํ์ ํ์ผ์ ๋ณต์ฌ | SW ์ค์ ๋ณ๊ฒฝ |
+| | ํ์ผ ์์
|
+---
+
+
+# SECTION 6. ๋์ปค ํ๋ธ ๋ก๊ทธ์ธ
+
+> ์ง์ ๋ง๋ ์ด๋ฏธ์ง๋ ๋์ปค ํ๋ธ์ ์ฌ๋ฆด ์ ์์ผ๋ฉฐ, ๋น๊ณต๊ฐ๋ก ์ฌ์ฉํ๋ ๋์ปค ํ๋ธ ๊ฐ์ ์ฅ์๋ ๋ง๋ค ์ ์๋ค.
+
+## ๋์ปค ํ๋ธ์ ๋ ์ง์คํธ๋ฆฌ
+
+์ด๋ฏธ์ง๋ฅผ ๋ฐฐํฌํ๋ ์ฅ์๋ฅผ **๋์ปค ๋ ์ง์คํธ๋ฆฌ**๋ผ๊ณ ํ๋ค.
+์ผ๋ฐ์ ๊ณต๊ฐ๋์ด ์๋ ๋ง๋ ์๊ด์์ด ์ด๋ฏธ์ง๊ฐ ๋ฐฐํฌ๋๋ ๊ณณ์ ๋ชจ๋ ๋์ปค ๋ ์ง์คํธ๋ฆฌ์ด๋ค.
+
+๋์ปค ํ๋ธ๋ ๋์ปค ์ ์์ฌ์์ ์ด์ํ๋ ๊ณต์ ๋์ปค ๋ ์ง์คํธ๋ฆฌ๋ฅผ ๋งํ๋ค.
+์ฐ๋ฆฌ๊ฐ `run` ์ปค๋งจ๋๋ฅผ ์ฌ์ฉํ ๋ ๋ด๋ ค๋ฐ๋ ์ด๋ฏธ์ง๋ ์ด๋ ๊ฒ ์ ๊ณต๋๋ค.
+
+### ๋ ์ง์คํธ๋ฆฌ์ ๋ฆฌํฌ์งํ ๋ฆฌ
+
+๋ ์ง์คํธ๋ฆฌ๋ ์ด๋ฏธ์ง๋ฅผ ๋ฐฐํฌํ๋ ์ฅ์์ด๊ณ , ๋ฆฌํฌ์งํ ๋ฆฌ๋ ๋ ์ง์คํธ๋ฆฌ๋ฅผ ๊ตฌ์ฑํ๋ ๋จ์์ด๋ค.
+
+์ฆ ๋ ์ง์คํธ๋ฆฌ๋ ํ์ฌ๋ ๋ถ์ ๋จ์๋ก ๋ง๋ค์ง๋ง, ๋ฆฌํฌ์งํ ๋ฆฌ๋ SW๋ฅผ ๋จ์๋ก ํ๋ค.
+
+---
+
+## ํ๊ทธ์ ์ด๋ฏธ์ง ์
๋ก๋
+
+ํ๊ทธ๋ ๋ค์๊ณผ ๊ฐ์ ํํ๋ฅผ ๋๋ค
+
+```sh
+resistry_addr(docker_hub_id)/reporitory_name:ver
+```
+
+ํ๊ทธ ๋ถ์ฌ๋ ๋ค์๊ณผ ๊ฐ์ด ํ๋ค.
+
+```sh
+docker tag ์๋_์ด๋ฏธ์ง_์ด๋ฆ ๋ ์ง์คํธ๋ฆฌ_์ฃผ์/๋ฆฌํฌ์งํ ๋ฆฌ_์ด๋ฆ:๋ฒ์
+```
+
+์ด๋ฏธ์ง๋ฅผ ์
๋ก๋ ํ ๋๋ `push`๋ฅผ ์ฌ์ฉํ๋ค.
+
+```sh
+docker push ๋ ์ง์คํธ๋ฆฌ_์ฃผ์/๋ฆฌํฌ์งํ ๋ฆฌ_์ด๋ฆ:๋ฒ์
+```
\ No newline at end of file
diff --git a/_posts/2024-12-12-dockerCH7.markdown b/_posts/2024-12-12-dockerCH7.markdown
new file mode 100644
index 00000000000..c8a5c105b32
--- /dev/null
+++ b/_posts/2024-12-12-dockerCH7.markdown
@@ -0,0 +1,300 @@
+---
+title: "CH7. ๋์ปค ์ปดํฌ์ฆ๋ฅผ ์ตํ์ [๊ทธ๋ฆผ์ผ๋ก ๋ฐฐ์ฐ๋ ๋์ปค & ์ฟ ๋ฒ๋คํฐ์ค]"
+author: kwon
+date: 2024-12-12T14:00:00 +0900
+categories: [๋์ปค]
+tags: [docker]
+math: true
+mermaid: false
+---
+
+# SECTION 1. ๋์ปค ์ปดํฌ์ฆ๋?
+
+## ๋์ปค ์ปดํฌ์ฆ
+
+์์คํ
๊ตฌ์ถ๊ณผ ๊ด๋ จ๋ ๋ช
๋ น์ด๋ฅผ ํ๋์ ํ
์คํธ ํ์ผ(์ ์ ํ์ผ)์ ๊ธฐ์ฌํด
+๋ช
๋ น์ด ํ๋ฒ์ ์์คํ
์ ์ฒด๋ฅผ ์คํํ๊ณ ์ข
๋ฃ์ ํ๊ธฐ๊น์ง ํ๋ฒ์ ํ๋๋ก ๋์์ฃผ๋ ๋๊ตฌ์ด๋ค.
+
+
+
+### ๊ตฌ์กฐ
+
+docker compose๋ ์์คํ
๊ตฌ์ถ์ ํ์ํ ์ค์ ์ YAML(YAML Ain't Markup Language) ํฌ๋ฉง์ผ๋ก ๊ธฐ์ฌํ ์ ์ ํ์ผ์ ์ด์ฉํด ์ ์ฒด ์์คํ
์ ์ผ๊ด ์คํ(`run`) ๋๋ ์ผ๊ด ์ข
๋ฃ ๋ฐ ์ญ์ (`down`)ํ ์ ์๋ ๋๊ตฌ๋ค.
+
+์ ์ ํ์ผ์๋ ์ปจํ
์ด๋๋ ๋ณผ๋ฅจ์ ์ด๋ค ์ค์ ์ผ๋ก ๋ง๋ค์ง์ ๋ํ ํญ๋ชฉ์ด ๊ธฐ์ฌ๋์ด ์๋ค.
+์์ฑ ๋ด์ฉ์ ๋์ปค ๋ช
๋ น์ด๋กธ ๋น์ทํ์ง๋ง ๋์ปค ๋ช
๋ น์ด๊ฐ ์๋๋ค.
+
+#### `up`
+`docker run`๊ณผ ๋น์ทํ๋ค, ์ ์ ํ์ผ์ ๊ธฐ์ฌ๋ ๋ด์ฉ๋๋ก ์ด๋ฏธ์ง๋ฅผ ๋ด๋ ค๋ฐ๊ณ ์ปจํ
์ด๋๋ฅผ ์์ฑ ๋ฐ ์คํํ๋ค.
+์ ์ ํ์ผ์๋ ๋คํธ์ํฌ๋ ๋ณผ๋ฅจ์ ๋ํ ์ ์๋ ๊ธฐ์ฌํ ์ ์์ด์ ์ฃผ๋ณ ํ๊ฒฝ์ ํ๊บผ๋ฒ์ ์์ฑํ ์ ์๋ค.
+
+#### `down`
+์ปจํ
์ด๋์ ๋คํธ์ํฌ๋ฅผ ์ ์ง ๋ฐ ์ญ์ ํ๋ค.
+**๋ณผ๋ฅจ๊ณผ ์ด๋ฏธ์ง๋ ์ญ์ ํ์ง ์๋๋ค**. ์ปจํ
์ด๋์ ๋คํธ์ํฌ ์ญ์ ์์ด ์ข
๋ฃ๋ง ํ๊ณ ์ถ๋ค๋ฉด stop ์ปค๋งจ๋๋ฅผ ์ด์ฉํ๋ค.
+
+docker compose๊ฐ Dockerfile ์คํฌ๋ฆฝํธ์ ๋น์ทํ๊ฒ ๋๊ปด์ง ์ ์๋ค.
+ํ์ง๋ง Dockerfile์ ์ด๋ฏธ์ง๋ฅผ ๋ง๋ค๊ธฐ ์ํ ๊ฒ์ผ๋ก **๋คํธ์ํฌ๋ ๋ณผ๋ฅจ์ ๋ง๋ค ์ ์๋ค.**
+๋ฐ๋ฉด, docker compose๋ docker run ๋ช
๋ น์ด๋ฅผ ์ฌ๋ฌ ๊ฐ ๋ชจ์๋์ ๊ฒ๊ณผ ๊ฐ์ ๊ฒ์ผ๋ก,
+**๋คํธ์ํฌ์ ๋ณผ๋ฅจ๊น์ง ํจ๊ป ๋ง๋ค ์ ์๋ค.**
+
+---
+
+# SECTION 2. ๋์ปค ์ปดํฌ์ฆ์ ์ค์น์ ์ฌ์ฉ๋ฒ
+
+## docker compose์ ์ค์น
+๋์ปค ์ปดํฌ์ฆ๋ ํ ์ปค ์์ง๊ณผ ๋ณ๊ฐ์ SW์ด๋ฏ๋ก ์ค์น๋ฅผ ๋ฐ๋ก ํด์ค์ผ ํ๋ค.
+์๋์ฐ๋ mac OS์์ ์ฌ์ฉํ๋ docker desktop์ docker compose๊ฐ ํจ๊ป ์ค์น๋๋ฏ๋ก ์ ๊ฒฝ ์ธ ํ์ ์๋ค.
+๋ฆฌ๋
์ค์ ๊ฒฝ์ฐ ์๋์ ๋ช
๋ น์ด์ ๋ฐ๋ผ ์ค์น๋ฅผ ์งํํ๋ค.
+
+```sh
+sudo apt install -y python3 python3-pip
+sudo pip3 install docker-compose
+```
+
+## docker compose์ ์ฌ์ฉ๋ฒ
+
+docker compose๋ฅผ ์ฌ์ฉํ๋ ค๋ฉด Dockerfile ์คํฌ๋ฆฝํธ๋ก ์ด๋ฏธ์ง๋ฅผ ๋น๋ํ ๋์ฒ๋ผ ํธ์คํฌ ์ปดํจํฐ์ ํด๋๋ฅผ ๋ง๋ค๊ณ ์ด ํด๋์ ์ ์ ํ์ผ(YAML)์ ๋ฐฐ์นํ๋ค.
+
+์ ์ ํ์ผ์ docker-compose.yml์ด๋ผ๋ ์ด๋ฆ์ผ๋ก ๋ง๋ค์ด์ผ ํ๋ค.
+ํ์ผ์ ํธ์คํธ ์ปดํจํฐ์ ๋ฐฐ์น๋์ง๋ง ๋ช
๋ น์ด๋ ๋๊ฐ์ด ๋์ปค ์์ง์ ์ ๋ฌ๋๋ฉฐ, ๋ง๋ค์ด์ง ์ปจํ
์ด๋๋ ๋์ผํ๊ฒ ๋์ปค ์์ง ์์์ ๋์ํ๋ค.
+์ฆ, ์ฌ๋์ด ์
๋ ฅํด๋ ๋ช
๋ น์ด๋ค์ docker compose๊ฐ ๋์ ์
๋ ฅํด์ฃผ๋ ๊ตฌ์กฐ๋ค.
+
+์ ์ ํ์ผ์ ํ ํด๋์ ํ๋๋ง ์์ ์ ์๋ค.
+๊ทธ๋์ ์ฌ๋ฌ ๊ฐ์ ์ ์ ํ์ผ์ ์ฌ์ฉํ๋ ค๋ฉด ๊ทธ ๊ฐ์๋งํผ ํด๋๋ฅผ ๋ง๋ค์ด์ผ ํ๋ค.
+์ปจํ
์ด๋ ์์ฑ์ ํ์ํ ์ด๋ฏธ์ง ํ์ผ๊ณผ ๊ฐ์ ๋ถ๊ฐ์ ์ธ ํ์ผ๋ compose๊ฐ ์ฌ์ฉํ ํด๋์ ํจ๊ป ๋๋ค.
+
+---
+
+# SECTION 3. ๋์ปค ์ปดํฌ์ฆ ํ์ผ์ ์์ฑํ๋ ๋ฒ
+
+## docker compose์ ๋ด์ฉ
+
+```yml
+version: "3"
+
+sevices:
+ apa000ex2:
+ image: httpd
+ ports:
+ - 8080:80
+ restart: always
+```
+
+์ด docker compose ํ์ผ์ ์๋ ๋ช
๋ น์ด์ ๊ฐ์ ๋ด์ฉ์ ๋ด๊ณ ์๋ค.
+
+```sh
+docker run --name apa000ex2 -d -p 8080:80 httpd
+```
+
+์ ์ฒด์ ์ธ ๊ตฌ์กฐ๋ ๋ค์๊ณผ ๊ฐ๋ค.
+
+```yml
+version: "3"
+
+sevices:
+ container_name1:
+ image: image_name
+ networks:
+ - network_name
+ ports:
+ - port_setting
+ container_name2:
+
+networks:
+ network_name1:
+volumes:
+ volume_name1:
+ volume_name2:
+```
+
+### compose ํ์ผ ์์ฑ ์๋ น ์ ๋ฆฌ
+
+- ์ฒซ ์ค์ docker compose version์ ๊ธฐ์ฌ
+- ์ฃผ ํญ๋ชฉ services, networks, volumes ์๋์ ์ค์ ๋ด์ฉ์ ๊ธฐ์ฌ
+- ํญ๋ชฉ ๊ฐ์ ์ํ ๊ด๊ณ๋ ๊ณต๋ฐฑ์ ์ฌ์ฉํ ๋ค์ฌ์ฐ๊ธฐ๋ก
+- ๋ค์ฌ์ฐ์ง๋ ๊ฐ์ ์์ ๋ฐฐ์๋งํผ์ ๊ณต๋ฐฑ์ ์ฌ์ฉ
+- ์ด๋ฆ์ ์ฃผ ํญ๋ชฉ ์๋์ ๋ค์ฌ์ฐ๊ธฐ ํ ๋ค์ ๊ธฐ์ฌ
+- ์ฌ๋ฌ ํญ๋ชฉ์ ๊ธฐ์ฌํ๋ ค๋ฉด ์ถ ์์ '-'์ ๋ถ์
+- ์ด๋ฆ ๋ค์๋ ':'์ ๋ถ์
+- ์ฝ๋ก ๋ค์๋ ๋ฐ๋์ ๊ณต๋ฐฑ์ด ์์ผ ํจ
+- \# ๋ค์ ๋ด์ฉ์ ์ฃผ์์ผ๋ก ๊ฐ์ฃผ
+- ๋ฌธ์์ด์ ์์/ํฐ๋ฐ์ดํ๋ก ๊ฐ์ธ ์์ฑ
+
+### compose ํ์ผ์ ํญ๋ชฉ
+
+#### ์ฃผ ํญ๋ชฉ
+
+| ํญ๋ชฉ | ๋ด์ฉ |
+| :------- | :------------ |
+| services | ์ปจํ
์ด๋ ์ ์ |
+| networks | ๋คํธ์ํฌ ์ ์ |
+| volumes | ๋ณผ๋ฅจ ์ ์ |
+
+#### ์์ฃผ ๋์ค๋ ์ ์ ๋ด์ฉ
+
+| ํญ๋ชฉ | `docker run`์์์ ์ต์
/ ์ธ์ | ๋ด์ฉ |
+| :---------- | :----------------------------- | :---------------------------------- |
+| image | ์ด๋ฏธ์ง ์ธ์ | ์ฌ์ฉํ ์ด๋ฏธ์ง ์ง์ |
+| networks | `--net` | ์ ์ํ ๋คํธ์ํฌ ์ค์ |
+| volumes | `-v`, `--mount` | ์คํ ๋ฆฌ์ง ๋ง์ดํธ ์ฑ์ |
+| environment | `-e` | ํ๊ฒฝ๋ณ์ ์ค์ |
+| depends_on | - | ๋ค๋ฅธ ์๋น์ค์ ๋ํ ์์กด๊ด๊ณ๋ฅผ ์ ์ |
+| restart | - | ์ปจํ
์ด๋ ์ข
๋ฃ ์ ์ฌ์์ ์ฌ๋ถ๋ฅผ ์ค์ |
+
+#### restart ์ค์ ๊ฐ
+
+| ์ค์ ๊ฐ | ๋ด์ฉ |
+| :------------- | :----------------------------------------- |
+| no | ์ฌ์์ ์ํจ |
+| always | ํญ์ ์ฌ์์ |
+| on-failure | ํ๋ก์ธ์ค๊ฐ 0 ์ด์ธ์ ์ํ๋ก ์ข
๋ฃ๋๋ฉด ์ฌ์์ |
+| unless-stopped | ์ข
๋ฃ ์ ์ฌ์์ํ์ง ์์. ์ด์ธ์๋ ์ฌ์์ |
+
+## ์ค์ต
+
+### docker-compose.yml
+```yml
+version: "3.8"
+services:
+ postgres:
+ build:
+ context: .
+ dockerfile: Dockerfile.postgres # postgres์ฉ Dockerfile
+ container_name: backend
+ environment:
+ POSTGRES_DB: rag
+ POSTGRES_USER: user
+ POSTGRES_PASSWORD: password
+ working_dir: /home
+ volumes:
+ - postgres_data:/var/lib/postgresql/data
+ - .:/home/app
+ ports:
+ - "5430:5432"
+ stdin_open: true
+ tty: true
+ command: tail -f /dev/null
+ # restart: unless-stopped
+
+ vue:
+ build:
+ context: .
+ dockerfile: Dockerfile.vue # vue์ฉ Dockerfile
+ container_name: frontend
+ network_mode: host
+ working_dir: /app
+ volumes:
+ - .:/app # ๋ก์ปฌ ๋๋ ํ ๋ฆฌ๋ฅผ ์ปจํ
์ด๋์ ๋ง์ดํธ
+ ports:
+ - "5173:5173"
+ stdin_open: true
+ tty: true
+
+volumes:
+ postgres_data:
+```
+
+### Dockerfile.postgres
+```Dockerfile
+# ๋ฒ ์ด์ค ์ด๋ฏธ์ง ์ ํ
+FROM kwon0528/postgres_backend:0.5
+
+# ํ์ํ ํจํค์ง ์ค์น (bash ์ค์น)
+RUN apt-get update && apt-get install -y bash
+
+# ์์
๋๋ ํ ๋ฆฌ ์ค์
+WORKDIR /home
+
+# back.sh ํ์ผ ๋ณต์ฌ
+COPY back.sh /home/back.sh
+
+# ์คํ ๊ถํ ๋ถ์ฌ
+RUN chmod +x /home/back.sh
+
+# ์คํ
+CMD ["bash", "/home/back.sh"]
+```
+
+
+### Dockerfile.vue
+```Dockerfile
+# ๋ฒ ์ด์ค ์ด๋ฏธ์ง ์ ํ
+FROM kwon0528/vue_frontend:0.3.2
+
+# ์์
๋๋ ํ ๋ฆฌ ์ค์
+WORKDIR /app
+
+# # front.sh ํ์ผ ๋ณต์ฌ
+# COPY front.sh /app/chuibot/front.sh
+
+# # ์คํ ๊ถํ ๋ถ์ฌ
+# RUN chmod +x /app/chuibot/front.sh
+
+# # ์คํ
+# CMD ["sh", "/app/front.sh"]
+# CMD cd ~/chuibot && git pull
+```
+
+์ค์ postgresql๊ณผ vue๋ฅผ ์ฌ์ฉํ ํ๋ก์ ํธ์์ ํ๊ฒฝ ์ค์ ์ ์ํด ๊ตฌ์ฑํ๋ docker compose์ด๋ค.
+์์์ ์์๋ณธ ๊ฒ๊ณผ ๋ค๋ฅธ ์ ์ image๋ฅผ ๋ฐ๋ก ๋ช
์ํ์ง ์๊ณ Dockerfile์ ๊ธฐ๋ฐ์ผ๋ก build๋ฅผ ๊ตฌ์ฑํ๋ค๋ ๊ฒ์ด๋ค.
+
+์ด์ฒ๋ผ docker compose ์์์๋ Dockerfile์ ์ฌ์ฉํ์ฌ ๊ตฌ์ฑํ ์๋ ์๋ค.
+
+---
+
+# ๋์ปค ์ปดํฌ์ฆ ์คํ
+
+## docker compose command
+
+### `docker-compose up`
+
+```sh
+docker-compose -f compose_file_path up
+```
+
+compose ํ์ผ์ ๋ด์ฉ์ ๋ฐ๋ผ ์ปจํ
์ด๋์ ๋ณผ๋ฅจ, ๋คํธ์ํฌ๋ฅผ ์์ฑํ๊ณ ์คํํ๋ค.
+
+#### ์ต์
ํญ๋ชฉ
+
+| ์ต์
| ๋ด์ฉ |
+| --------------------------- | ---------------------------------------------------- |
+| `-d` | ๋ฐฑ๊ทธ๋ผ์ด๋๋ก ์คํ |
+| `--no-color` | ํ๋ฉด ์ถ๋ ฅ ๋ด์ฉ์ ํ๋ฐฑ์ผ๋ก ํจ |
+| `--no-deps` | ๋งํฌ๋ ์๋น์ค๋ฅผ ์ฑํํ์ง ์์ |
+| `--force-recreate` | ์ค์ ๋๋ ์ด๋ฏธ์ง๊ฐ ๋ณ๊ฒฝ๋์ง ์์๋ ์ปจํ
์ด๋ ์ฌ์์ฑ |
+| `--no-create` | ์ปจํ
์ด๋๊ฐ ์ด๋ฏธ ์กด์ฌํ ๊ฒฝ์ฐ ๋ค์ ์์ฑํ์ง ์์ |
+| `--no-build` | ์ด๋ฏธ์ง๊ฐ ์์ด๋ ์ด๋ฏธ์ง๋ฅผ ๋น๋ํ์ง ์์ |
+| `--build` | ์ปจํ
์ด๋๋ฅผ ์คํํ๊ธฐ ์ ์ ์ด๋ฏธ์ง๋ฅผ ๋น๋ |
+| `--abort-on-container-exit` | ์ปจํ
์ด๋๊ฐ ํ๋๋ผ๋ ์ข
๋ฃ๋๋ฉด ๋ชจ๋ ์ปจํ
์ด๋๋ฅผ ์ข
๋ฃ |
+| `-t`, `--timeout` | ์ปจํ
์ด๋๋ฅผ ์กธ์ํ ๋์ ํ์์์ ์ค์ . ๊ธฐ๋ณธ์ 10์ด |
+| `--remove-orphans` | ์ปดํฌ์ฆ ํ์ผ์ ์ฒ์๋์ง ์์ ์๋น์ค์ ์ปจํ
์ด๋๋ฅผ ์ญ์ |
+| `--scale` | ์ปจํ
์ด๋ ์ ๋ณ๊ฒฝ |
+
+### `docker-compose down`
+
+```sh
+docker-compose -f compose_file_path down
+```
+
+compose ํ์ผ์ ๋ด์ฉ์ ๋ฐ๋ผ ์ปจํ
์ด๋์ ๋คํธ์ํฌ๋ฅผ ์ข
๋ฃ ๋ฐ ์ญ์ ํ๋ค. ๋ณผ๋ฅจ๊ณผ ์ด๋ฏธ์ง๋ ์ญ์ ๋์ง ์๋๋ค.
+
+#### ์ต์
ํญ๋ชฉ
+
+| ์ต์
| ๋ด์ฉ |
+| ------------------ | ----------------------------------------------------------------------------------------------------------------------------------------- |
+| `-rmi` ์ข
๋ฅ | ์ญ์ ์์ ์ด๋ฏธ์ง๋ ์ญ์ ํ๋ค. ์ข
๋ฅ๋ฅผ all๋ก ์ง์ ํ๋ฉด ์ฌ์ฉํ๋ ๋ชจ๋ ์ด๋ฏธ์ง๊ฐ ์ญ์ ๋๋ค. local๋ก ์ง์ ํ๋ฉด ์ปค์คํ
ํ๊ทธ๊ฐ ์๋ ์ด๋ฏธ์ง๋ง ์ญ์ ๋๋ค |
+| `-v`, `--volume` | volumes ํญ๋ชฉ์ ๊ธฐ์ฌ๋ ๋ณผ๋ฅจ์ ์ญ์ ํ๋ค. ๋จ, external๋ก ์ง์ ๋ ๋ณผ๋ฅจ์ ์ญ์ ๋์ง ์๋๋ค. |
+| `--remove-orphans` | ์ปดํฌ์ฆ ํ์ผ์ ์ ์๋์ง ์์ ์๋น์ค์ ์ปจํ
์ด๋๋ ์ญ์ ํ๋ค. |
+
+### `docker-compose stop`
+
+```sh
+docker-compose -f compose_file_path stop