<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>CSS&amp;bull;BLOG</title>
    <link>https://ordinary-student-study-record.tistory.com/</link>
    <description>컴퓨터공학과 학생이 쓰는 기록용 블로그입니다.</description>
    <language>ko</language>
    <pubDate>Sun, 21 Jun 2026 13:17:59 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>JIWANSEO</managingEditor>
    <image>
      <title>CSS&amp;bull;BLOG</title>
      <url>https://tistory1.daumcdn.net/tistory/3982313/attach/0f49a104099f44fa924d05c89bf420c9</url>
      <link>https://ordinary-student-study-record.tistory.com</link>
    </image>
    <item>
      <title>[CMake 사용법] 2025.09.13</title>
      <link>https://ordinary-student-study-record.tistory.com/75</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;오늘은 CMake를 사용하는 방법을 배우고 숙달하는 과정을 기록한다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;먼저 CMake란?&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;복잡한 소프트웨어 프로젝트의 빌드 과정을 자동으로 관리해주는 크로스 플랫폼 빌드 시스템 생성기이다. 다양한 OS와 컴파일러 환경에서 일관된 방식으로 프로젝트를 컴파일하고 빌드할 수 있게 도와준다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;앞의 설명만 보면 한 번에 이해하기 어려울 수 있다. 터미널에서 .cpp 확장자의 파일을 빌드하여 실행파일로 만드는 과정으로 설명해보겠다.&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1757767431576&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// main.cpp
#include &amp;lt;iostream&amp;gt;
using namespace std;

int main(void)
{
	cout&amp;lt;&amp;lt;&quot;Test!&quot;;
    return 0;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위와 같은 main.cpp 파일을 빌드하려면 아래와 같은 명령어를 사용한다.&lt;/p&gt;
&lt;pre id=&quot;code_1757767505554&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;g++ -o main main.cpp&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그냥 단순히 저렇게만 실행하고, 생성된 main 파일을 실행하면 끝이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위에서 설명한 예는 하나의 파일만 빌드 후 실행하는 과정이라 굉장히 단순하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;하지만&lt;/b&gt; 프로젝트의 사이즈가 커지면, 여러 의존성도 많아지게 되고, 파일의 수도 많아지게 된다. 빌드하고, 링킹하고.. 이러한 과정을 수작업으로 할 수는 없다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 사용하는게 makefile인데, 이러한 makefile을 자동으로 작성할 수 있도록 돕는게 &lt;b&gt;CMake&lt;/b&gt;이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;CMake 사용하기&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;빌드에 필요한 파일들 작성하기&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;먼저 프로젝트 workspace를 만들고, workspace 하위에 build src include 라는 디렉터리를 만들 것이다. 추가적으로 main.cpp, myArray.cpp, myArray.hpp 그리고 CMakeLists.txt라는 파일을 생성한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;├──&amp;nbsp;build &lt;br /&gt;├──&amp;nbsp;CMakeLists.txt &lt;br /&gt;├──&amp;nbsp;include &lt;br /&gt;│&amp;nbsp;&amp;nbsp;&amp;nbsp;└──&amp;nbsp;myArray.hpp &lt;br /&gt;└──&amp;nbsp;src &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;├──&amp;nbsp;main.cpp &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;└──&amp;nbsp;myArray.cpp&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각 파일에 대해 설명하자면, myArray.cpp에는 배열의 포인터와 배열의 크기를 입력 받으면 배열의 요소를 출력하는 함수가 존재한다. myArray.hpp에는 이 함수의 정의가 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;main.cpp에서는 myArray.hpp를 헤더 파일로 포함하여 배열을 출력하는 함수를 실행하는 main 코드이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각 코드의 내용은 아래와 같다.&lt;/p&gt;
&lt;pre id=&quot;code_1757768097825&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// myArray.hpp
#include &amp;lt;iostream&amp;gt;

void each_for_array(int *arr, size_t size);

// myArray.cpp
#include &amp;lt;iostream&amp;gt;
#include &quot;myArray.hpp&quot;
using namespace std;

void each_for_array(int *arr, size_t size)
{
        cout&amp;lt;&amp;lt;&quot;===Print Array===\n&quot;;
        for(size_t i=0; i&amp;lt;size ; i++)
        {
                cout&amp;lt;&amp;lt;arr[i]&amp;lt;&amp;lt;&quot; &quot;;
        }
        cout&amp;lt;&amp;lt;&quot;\n===Print Array End===\n&quot;;
}

// main.cpp
#include &amp;lt;iostream&amp;gt;
#include &quot;myArray.hpp&quot;
using namespace std;

int main()
{
        int array[]={2, 4, 6, 7, 8};
        each_for_array(array, sizeof(array) / sizeof(array[0]));
        return 0;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위와 같이 코드를 모두 작성한 후, 빌드를 위한 CMakeLists.txt라는 파일의 내용을 채우는 단계를 거친다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;CMakeLists.txt 작성&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1757768247866&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# CMake의 최소 버전
cmake_minimum_required(VERSION 3.24)

# 프로젝트의 이름과 사용할 언어를 정의한다.
project(
        print_array
        CXX
        C
)

# C++ 표준을 C++17로 설정한다.
set(CMAKE_CXX_STANDARD 17)

# C++ 표준을 반드시 C++17로 설정한다.
set(CMAKE_CXX_STANDARD_REQUIRED True)

# print_array_app이라는 이름의 실행 파일을 생성하도록 CMake에 지시한다.
# 실행 파일을 빌드하기 위해 필요한 소스 파일 목록을 지정한다.
add_executable(
        print_array_app
        src/main.cpp
        src/myArray.cpp
)

# 특정 타겟(&quot;print_array_app&quot;)에 헤더 파일을 찾을 경로를 추가한다.
target_include_directories(
        print_array_app
        # PUBLIC 키워드는 이 타겟을 사용하는 다른 타겟도 이 경로를 상속받게 한다.
        PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/include
)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;CMakeLists.txt 파일의 내용은 각 주석으로 설명해두었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 모든 파일을 작성하면 빌드 준비가 된 것이다. 디렉터리와 파일들의 구조와 아래와 같이 되어 있어야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;. &lt;br /&gt;├──&amp;nbsp;build &lt;br /&gt;├──&amp;nbsp;CMakeLists.txt &lt;br /&gt;├──&amp;nbsp;include &lt;br /&gt;│&amp;nbsp;&amp;nbsp;&amp;nbsp;└──&amp;nbsp;myArray.hpp &lt;br /&gt;└──&amp;nbsp;src &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;├──&amp;nbsp;main.cpp &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;└──&amp;nbsp;myArray.cpp&lt;/p&gt;
&lt;pre id=&quot;code_1757768395533&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;cd build &amp;amp;&amp;amp; cmake ..&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 명령어를 수행 후 tree를 입력하면 아래와 같은 파일 구조로 바뀔 것이다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;656&quot; data-origin-height=&quot;898&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mqkhL/btsQwEMZYGp/k16Eson0sudKV1jivOv4k1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mqkhL/btsQwEMZYGp/k16Eson0sudKV1jivOv4k1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mqkhL/btsQwEMZYGp/k16Eson0sudKV1jivOv4k1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmqkhL%2FbtsQwEMZYGp%2Fk16Eson0sudKV1jivOv4k1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;656&quot; height=&quot;898&quot; data-origin-width=&quot;656&quot; data-origin-height=&quot;898&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;많은 파일들이 생성되었지만 핵심적으로 우리가 사용할 파일은 build/Makefile 이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위에서 말했듯이 cmake는 Makefile을 자동으로 작성할 수 있도록 돕는 도구라고 했다. Makefile의 내용을 한 번 살펴보도록 하고, 그 후에 Makefile과 같은 경로에서 아래와 같은 명령어를 수행한다.&lt;/p&gt;
&lt;pre id=&quot;code_1757768563328&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;make

# 수행 결과 예시
[ 33%] Building CXX object CMakeFiles/print_array_app.dir/src/main.cpp.o
[ 66%] Building CXX object CMakeFiles/print_array_app.dir/src/myArray.cpp.o
[100%] Linking CXX executable print_array_app
[100%] Built target print_array_app&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;print_array_app이 빌드되었다는 메시지를 확인할 수 있고, 실제로 파일들 목록을 출력해보면 실행 파일이 생성되어 있는 것을 확인할 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;553&quot; data-origin-height=&quot;174&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ZuA1U/btsQvNXXeJa/52rV24u6srYUeBWUuVsIFk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ZuA1U/btsQvNXXeJa/52rV24u6srYUeBWUuVsIFk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ZuA1U/btsQvNXXeJa/52rV24u6srYUeBWUuVsIFk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FZuA1U%2FbtsQvNXXeJa%2F52rV24u6srYUeBWUuVsIFk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;553&quot; height=&quot;174&quot; data-origin-width=&quot;553&quot; data-origin-height=&quot;174&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실행 파일을 실행하면 정상적으로 실행할 수 있는 것을 확인할 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;758&quot; data-origin-height=&quot;80&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/5uwwD/btsQx87VxIf/bHMyLFXEXMMicnkEgpn8hK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/5uwwD/btsQx87VxIf/bHMyLFXEXMMicnkEgpn8hK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/5uwwD/btsQx87VxIf/bHMyLFXEXMMicnkEgpn8hK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F5uwwD%2FbtsQx87VxIf%2FbHMyLFXEXMMicnkEgpn8hK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;758&quot; height=&quot;80&quot; data-origin-width=&quot;758&quot; data-origin-height=&quot;80&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이것으로 cmake 사용해보기 실습을 마친다.&lt;/p&gt;</description>
      <category>공부 일지 + 일상</category>
      <category>build</category>
      <category>CMAKE</category>
      <category>makefile</category>
      <author>JIWANSEO</author>
      <guid isPermaLink="true">https://ordinary-student-study-record.tistory.com/75</guid>
      <comments>https://ordinary-student-study-record.tistory.com/75#entry75comment</comments>
      <pubDate>Sat, 13 Sep 2025 22:05:19 +0900</pubDate>
    </item>
    <item>
      <title>git 관련 명령어 정리</title>
      <link>https://ordinary-student-study-record.tistory.com/74</link>
      <description>&lt;h1&gt;Git 핵심 명령어 정리&lt;/h1&gt;
&lt;h2&gt;1. Git 설치 및 초기 설정&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;git --version                        # Git 설치 확인
git config --global user.name &amp;quot;사용자 이름&amp;quot;
git config --global user.email &amp;quot;이메일@example.com&amp;quot;
git config --global init.defaultBranch main   # 기본 브랜치 main으로 설정
git config --global --list           # 설정 확인&lt;/code&gt;&lt;/pre&gt;&lt;hr&gt;
&lt;h2&gt;2. Git 저장소 초기화 또는 클론&lt;/h2&gt;
&lt;h3&gt;a. Git 초기화 (새 프로젝트 시작 시)&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;git init&lt;/code&gt;&lt;/pre&gt;&lt;h3&gt;b. 원격 저장소 복제&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;git clone &amp;lt;URL&amp;gt;
git clone --depth 200 &amp;lt;URL&amp;gt;    # 최근 200개의 커밋만 복제&lt;/code&gt;&lt;/pre&gt;&lt;hr&gt;
&lt;h2&gt;3. 원격 저장소 관리&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;git remote add origin &amp;lt;URL&amp;gt;   # 원격 저장소 추가
git remote -v                 # 원격 저장소 목록 확인&lt;/code&gt;&lt;/pre&gt;&lt;hr&gt;
&lt;h2&gt;4. 변경 내용 추적 (Add, Status)&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;git status          # 변경 내역 확인
git add &amp;lt;파일명&amp;gt;     # 특정 파일 스테이징
git add .           # 전체 파일 스테이징&lt;/code&gt;&lt;/pre&gt;&lt;hr&gt;
&lt;h2&gt;5. 커밋 (Commit)&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;git commit -m &amp;quot;메시지&amp;quot;        # 일반 커밋&lt;/code&gt;&lt;/pre&gt;&lt;hr&gt;
&lt;h2&gt;6. 브랜치 관리 (Branch &amp;amp; Switch)&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;git branch                    # 로컬 브랜치 확인
git branch -r                 # 원격 브랜치 확인
git branch -a                 # 전체 브랜치 확인

git branch &amp;lt;이름&amp;gt;             # 브랜치 생성
git checkout -b &amp;lt;이름&amp;gt;        # 브랜치 생성 + 이동
git switch -c &amp;lt;이름&amp;gt;          # (Git v2.23+)

git checkout &amp;lt;브랜치명&amp;gt;       # 브랜치 전환
git switch &amp;lt;브랜치명&amp;gt;         # (Git v2.23+)

git branch -D &amp;lt;브랜치명&amp;gt;      # 브랜치 삭제
git branch -m old new         # 브랜치 이름 변경
git branch --show-current     # 현재 브랜치 확인&lt;/code&gt;&lt;/pre&gt;&lt;hr&gt;
&lt;h2&gt;7. 로그 및 변경 이력 확인&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;git log                       # 전체 로그
git log --oneline             # 간단 로그
git log -p                    # 패치 포함 로그
git log -20 -p                # 최근 20개 로그 + 상세
git log --since=&amp;quot;6 hours&amp;quot;     # 최근 6시간 로그

git diff                      # 변경 사항 확인
git diff --cached             # 스테이징된 변경 확인

git blame &amp;lt;파일&amp;gt;              # 각 라인 변경자 확인&lt;/code&gt;&lt;/pre&gt;&lt;hr&gt;
&lt;h2&gt;8. 원격 저장소 동기화 (Fetch, Pull, Push)&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;git fetch                     # 원격 저장소 내용 가져오기 (병합X)
git pull origin main          # 원격 변경사항 가져오기 + 병합
git pull --rebase origin main # 리베이스 방식으로 가져오기

git push origin main          # 현재 브랜치 푸시
git push -u origin main       # 기본 upstream 지정
git push --all                # 모든 브랜치 푸시
git push --force origin main  # 강제 푸시 (주의)&lt;/code&gt;&lt;/pre&gt;&lt;hr&gt;
&lt;h2&gt;9. 전체 작업 흐름 요약&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;git init / git clone &amp;lt;URL&amp;gt;    # 초기화 또는 복제
cd &amp;lt;project&amp;gt;

git status                    # 변경사항 확인
git add .                     # 파일 스테이징
git commit -m &amp;quot;메시지&amp;quot;        # 커밋
git push origin main           # 원격 저장소로 푸시&lt;/code&gt;&lt;/pre&gt;&lt;h3&gt;원격에 변경사항이 있다면?&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;git pull origin main
git add .
git commit -m &amp;quot;메시지&amp;quot;
git push origin main&lt;/code&gt;&lt;/pre&gt;&lt;hr&gt;</description>
      <category>Git</category>
      <author>JIWANSEO</author>
      <guid isPermaLink="true">https://ordinary-student-study-record.tistory.com/74</guid>
      <comments>https://ordinary-student-study-record.tistory.com/74#entry74comment</comments>
      <pubDate>Wed, 27 Aug 2025 20:34:15 +0900</pubDate>
    </item>
    <item>
      <title>docker 관련 명령어 정리</title>
      <link>https://ordinary-student-study-record.tistory.com/73</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;docker basic command&lt;/b&gt;&lt;/h3&gt;
&lt;table id=&quot;25c1500e-02d9-8069-8743-f21c8f1ef956&quot; style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr id=&quot;25c1500e-02d9-80df-93f6-d8d55707a963&quot;&gt;
&lt;td id=&quot;FW\n&quot;&gt;명령어&lt;/td&gt;
&lt;td id=&quot;TMig&quot;&gt;설명&lt;/td&gt;
&lt;/tr&gt;
&lt;tr id=&quot;25c1500e-02d9-8077-8b53-e05812efad90&quot;&gt;
&lt;td id=&quot;FW\n&quot;&gt;docker pull&lt;/td&gt;
&lt;td id=&quot;TMig&quot;&gt;이미지 설치&lt;br /&gt;- docker pull &amp;lt;image&amp;gt;&lt;br /&gt;- docker pull &amp;lt;image:ver&amp;gt;&lt;br /&gt;- docker pull &amp;lt;image:latest&amp;gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr id=&quot;25c1500e-02d9-8037-a38d-d5cb966e3b10&quot;&gt;
&lt;td id=&quot;FW\n&quot;&gt;docker create&lt;/td&gt;
&lt;td id=&quot;TMig&quot;&gt;컨테이너 생성&lt;br /&gt;- docker create &amp;lt;image&amp;gt;&lt;br /&gt;- docker create &amp;mdash;name &amp;lt;container명&amp;gt; &amp;lt;image&amp;gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr id=&quot;25c1500e-02d9-8000-ab35-ebf8b4b21a9e&quot;&gt;
&lt;td id=&quot;FW\n&quot;&gt;docker run&lt;/td&gt;
&lt;td id=&quot;TMig&quot;&gt;pull + create + start를 수행&lt;br /&gt;- docker run &amp;lt;image&amp;gt;&lt;br /&gt;- docker run &amp;lt;image&amp;gt; &amp;lt;실행파일&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;options&lt;/b&gt;&lt;br /&gt;&amp;mdash;tty, -t: tty 모드를 사용. (가상 터미널 할당: 리눅스에 키보드로 표준 입력을 전달할 수 있게 한다.)&lt;br /&gt;&amp;mdash;detach, -d: 컨테이너를 생성하고 백그라운드에서 실행&lt;br /&gt;&amp;mdash;name &amp;lt;이름&amp;gt;: 컨테이너 이름 지정&lt;br /&gt;&amp;mdash;publish, -p &amp;lt;host_port&amp;gt;:&amp;lt;container_port&amp;gt;: host와 container의 port를 연결&lt;br /&gt;&lt;br /&gt;&lt;b&gt;example&lt;/b&gt;&lt;br /&gt;- docker run -dit &amp;mdash;name &amp;lt;container명&amp;gt; &amp;lt;image명&amp;gt; &amp;lt;실행파일&amp;gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr id=&quot;25c1500e-02d9-8045-8343-fd7b55ee2675&quot;&gt;
&lt;td id=&quot;FW\n&quot;&gt;docker start&lt;/td&gt;
&lt;td id=&quot;TMig&quot;&gt;컨테이너 실행&lt;br /&gt;docker start &amp;lt;cotainer id/name&amp;gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr id=&quot;25c1500e-02d9-8008-9185-d16ab8218b9f&quot;&gt;
&lt;td id=&quot;FW\n&quot;&gt;docker stop&lt;/td&gt;
&lt;td id=&quot;TMig&quot;&gt;실행중인 컨테이너 정지&lt;br /&gt;- 그동안 하던 작업들을 완료 후 컨테이너를 중지&lt;br /&gt;- docker stop &amp;lt;container id/name&amp;gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr id=&quot;25c1500e-02d9-8016-ae01-dbce0f4ad699&quot;&gt;
&lt;td id=&quot;FW\n&quot;&gt;docker kill&lt;/td&gt;
&lt;td id=&quot;TMig&quot;&gt;실행중인 컨테이너 정지&lt;br /&gt;- stop과 차이점은 어떠한 것도 기다리지 않고 &lt;b&gt;바로 컨테이너를 중지&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr id=&quot;25c1500e-02d9-80cd-b670-c5ab4fd48f58&quot;&gt;
&lt;td id=&quot;FW\n&quot;&gt;docker rm&lt;/td&gt;
&lt;td id=&quot;TMig&quot;&gt;컨테이너 삭제&lt;br /&gt;- 실행중인 컨테이너는 중지 후에 삭제가 가능&lt;br /&gt;- docker rm &amp;lt;container id/name&amp;gt;&lt;br /&gt;- docker rm -f $(docker ps -aq): 모든 컨테이너 삭제, power shell 이용&lt;/td&gt;
&lt;/tr&gt;
&lt;tr id=&quot;25c1500e-02d9-802c-a3fb-fac96d6bfe8d&quot;&gt;
&lt;td id=&quot;FW\n&quot;&gt;docker rmi&lt;/td&gt;
&lt;td id=&quot;TMig&quot;&gt;도커 이미지 삭제&lt;br /&gt;- docker rmi &amp;lt;image id&amp;gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr id=&quot;25c1500e-02d9-803d-a55e-d1a293aa525d&quot;&gt;
&lt;td id=&quot;FW\n&quot;&gt;docker rename&lt;/td&gt;
&lt;td id=&quot;TMig&quot;&gt;컨테이너명 변경&lt;br /&gt;- docker rename &amp;lt;기존 이름&amp;gt; &amp;lt;변경할 이름&amp;gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr id=&quot;25c1500e-02d9-809c-9a9e-e13565d2992a&quot;&gt;
&lt;td id=&quot;FW\n&quot;&gt;docker exec&lt;/td&gt;
&lt;td id=&quot;TMig&quot;&gt;실행 중인 컨테이너에 명령어 전달&lt;br /&gt;- 외부에서 실행 중인 컨테이너 안의 명령어를 실행&lt;br /&gt;- docker exec &amp;lt;컨테이너명&amp;gt; &amp;lt;명령&amp;gt; &amp;lt;매개변수&amp;gt;&lt;br /&gt;- docker exec -it &amp;lt;컨테이너명&amp;gt; &amp;lt;명령&amp;gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr id=&quot;25c1500e-02d9-8019-878c-ea4e9803df9d&quot;&gt;
&lt;td id=&quot;FW\n&quot;&gt;docker ps&lt;/td&gt;
&lt;td id=&quot;TMig&quot;&gt;실행 중인 컨테이너 확인&lt;br /&gt;- docker ps&lt;br /&gt;- docker ps -a: 모든 컨테이너 확인&lt;/td&gt;
&lt;/tr&gt;
&lt;tr id=&quot;25c1500e-02d9-80e8-9769-f8e8c03a883d&quot;&gt;
&lt;td id=&quot;FW\n&quot;&gt;docker system&lt;/td&gt;
&lt;td id=&quot;TMig&quot;&gt;도커 시스템 관련 명령어&lt;br /&gt;- docker version: 도커 버전&lt;br /&gt;- docker -v: 도커 버전&lt;br /&gt;- docker system df: 도커 시스템 정보 간단하게 출력&lt;br /&gt;- docker system df -v: 도커 시스템 정보 출력&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;출처: &lt;a href=&quot;https://m.blog.naver.com/hj_kim97/222870522243&quot;&gt;[Docker]도커 기본 개념 및 사용법 정리 : 네이버 블로그&lt;/a&gt;&lt;/p&gt;</description>
      <category>Computer Science</category>
      <category>Git</category>
      <author>JIWANSEO</author>
      <guid isPermaLink="true">https://ordinary-student-study-record.tistory.com/73</guid>
      <comments>https://ordinary-student-study-record.tistory.com/73#entry73comment</comments>
      <pubDate>Wed, 27 Aug 2025 13:07:23 +0900</pubDate>
    </item>
    <item>
      <title>[Linux Kernel] 시스템 콜 함수 등록 및 호출</title>
      <link>https://ordinary-student-study-record.tistory.com/72</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;오늘은 리눅스 커널에서 시스템 콜 함수를 등록하고 호출하는 실습을 진행할 것이다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;1. 시스템 콜 함수 작성&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래와 같은 간단한 시스템 콜 함수를 생성한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인자가 하나인 경우의 함수인데, SYSCALL_DEFINE$ &amp;lt;- $가 1이면, 인자가 1개라는 뜻이다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;670&quot; data-origin-height=&quot;256&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ATCYQ/btsPtka8qqg/GLHkXvk8rXnUNW70RKTEL0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ATCYQ/btsPtka8qqg/GLHkXvk8rXnUNW70RKTEL0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ATCYQ/btsPtka8qqg/GLHkXvk8rXnUNW70RKTEL0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FATCYQ%2FbtsPtka8qqg%2FGLHkXvk8rXnUNW70RKTEL0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;670&quot; height=&quot;256&quot; data-origin-width=&quot;670&quot; data-origin-height=&quot;256&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;시스템 콜 함수 코드를 저장할 위치는 다음과 같다.&lt;/p&gt;
&lt;pre id=&quot;code_1753183482182&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;/linux/kernel/시스템콜_코드.c&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;2. 시스템 콜 함수 추가 시 Makefile 수정 필요&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;파일이 추가된 디렉터리의 Makefile을 열어 아래와 같이 추가&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;475&quot; data-origin-height=&quot;566&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/3HdtY/btsPuEsVYe7/bnMJBTyUNoV8cYoWFUVOf1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/3HdtY/btsPuEsVYe7/bnMJBTyUNoV8cYoWFUVOf1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/3HdtY/btsPuEsVYe7/bnMJBTyUNoV8cYoWFUVOf1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F3HdtY%2FbtsPuEsVYe7%2FbnMJBTyUNoV8cYoWFUVOf1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;475&quot; height=&quot;566&quot; data-origin-width=&quot;475&quot; data-origin-height=&quot;566&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;obj-y 변수에 추가된 항목만 커널 바이너리에 포함되게 된다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;3. 시스템 콜 함수 매크로 등록&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;시스템 콜 함수를 정의하기 위한 매크로를 등록해주어야 한다.&lt;/p&gt;
&lt;pre id=&quot;code_1753183733289&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;/include/uapi/asm-generic/unistd.h&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 파일을 vim으로 열어서&amp;nbsp; __NR_syscalls 라인을 찾는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;새 시스템 콜 추가 시, __NR_syscalls 정의 앞에 하는 것이 일반적이다. __NR_syscalls는 시스템 콜의 개수를 가리키므로 1 증가시켜주어야 한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;470&quot; data-origin-height=&quot;485&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bbjD05/btsPt3NxdWn/rPdOJEEsCoNeT3wpwzmHGk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bbjD05/btsPt3NxdWn/rPdOJEEsCoNeT3wpwzmHGk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bbjD05/btsPt3NxdWn/rPdOJEEsCoNeT3wpwzmHGk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbbjD05%2FbtsPt3NxdWn%2FrPdOJEEsCoNeT3wpwzmHGk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;470&quot; height=&quot;485&quot; data-origin-width=&quot;470&quot; data-origin-height=&quot;485&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;원래 __NR_syscalls는 468이었지만, 새 시스템 콜을 추가함으로써 +1이 되어 469가 된 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 등록 후, 저장한다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;4. 시스템 콜 호출 코드&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 시스템 콜 함수를 등록할 유저 코드를 작성해주어야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 코드는 어디든 작성해도 관계없다.&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1753184018893&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;stdio.h&amp;gt;
#include &amp;lt;unistd.h&amp;gt;
#define __NR_new_syscall 468

int main(){
	int result = syscall(__NR_new_syscall, 10);
	printf(&quot;result: %d\n&quot;, result);
	return 0;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 이 코드를 일반 gcc가 아닌 툴체인을 사용하여 빌드하여야 한다.&lt;/p&gt;
&lt;pre id=&quot;code_1753184084764&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;툴체인 디렉터리&amp;gt;/bin/aarch64-none-linux-gnu-gcc -o hell hell.c&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;5. 커널 빌드&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;시스템 콜을 새로 추가하였으니 이를 커널에 반영해주어야 한다.&lt;/p&gt;
&lt;pre id=&quot;code_1753184146769&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 커널 소스 최상위로 이동
cd ~/workspace/kernel/linux

#(선택) 깨끗한 상태 확보
make mrproper

# 크로스 컴파일 환경 변수 설정
export ARCH=arm64
export CROSS_COMPILE=/home/jiwan/gcc-arm-10.3-2021.07-x86_64-aarch64-none-linux-gnu/bin/aarch64-none-linux-gnu-

# 기본 설정 생성(예: defconfig) 후 빌드
make defconfig
make -j$(nproc)        # 혹은 make -j8&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;6. 새 시스템 콜 실행&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;빌드한 프로그램을 rootfs의 /usr/bin에 복사해야 한다.&lt;/p&gt;
&lt;pre id=&quot;code_1753184296975&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo mount -o loop &amp;lt;빌드루트 디렉터리&amp;gt;/output/images/rootfs.ext4 /mnt

sudo cp hell /mnt/usr/bin/
sync
sudo umount /mnt&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 여기까지 완료되면 QEMU를 실행하면 된다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;7. QEMU로 빌드된 커널 실행&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;QEMU 실행은 shell script를 작성하여 딸깍하면 실행할 수 있게 설정해두었다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;720&quot; data-origin-height=&quot;113&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bAyjyE/btsPuJHFfTI/s6bbByItILos3lxFUCCnMK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bAyjyE/btsPuJHFfTI/s6bbByItILos3lxFUCCnMK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bAyjyE/btsPuJHFfTI/s6bbByItILos3lxFUCCnMK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbAyjyE%2FbtsPuJHFfTI%2Fs6bbByItILos3lxFUCCnMK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;720&quot; height=&quot;113&quot; data-origin-width=&quot;720&quot; data-origin-height=&quot;113&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이후 실행하게 되면 아래와 같이 나온다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만, hell을 실행하게 되면 아래와 같이 오류가 발생하게 된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Snipaste_2025-07-22_21-36-05.jpg&quot; data-origin-width=&quot;748&quot; data-origin-height=&quot;194&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bgWOsQ/btsPs2ojorg/GQihbAIlWTh8OPKUJWCCg1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bgWOsQ/btsPs2ojorg/GQihbAIlWTh8OPKUJWCCg1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bgWOsQ/btsPs2ojorg/GQihbAIlWTh8OPKUJWCCg1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbgWOsQ%2FbtsPs2ojorg%2FGQihbAIlWTh8OPKUJWCCg1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;748&quot; height=&quot;194&quot; data-filename=&quot;Snipaste_2025-07-22_21-36-05.jpg&quot; data-origin-width=&quot;748&quot; data-origin-height=&quot;194&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;8. 오류 해결&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;커널 버전 6.11 이상부터는 시스템 콜의 번호를 시스템 콜 테이블에 추가를 해주어야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;arch/arm64/tools/syscall_64.tbl 파일에 시스템콜을 추가하였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;새로 작성한 시스템 콜 번호를 시스템 콜 테이블에 추가 후, 커널 빌드를 다시 진행하여야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5번 과정을 다시 수행하면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;빌드 후 프로그램을 실행하게 되면 아래와 같이 수행된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;736&quot; data-origin-height=&quot;338&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mOwqO/btsPw0vPykG/lvUcAuxKyyjkexv98pULwk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mOwqO/btsPw0vPykG/lvUcAuxKyyjkexv98pULwk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mOwqO/btsPw0vPykG/lvUcAuxKyyjkexv98pULwk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmOwqO%2FbtsPw0vPykG%2FlvUcAuxKyyjkexv98pULwk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;736&quot; height=&quot;338&quot; data-origin-width=&quot;736&quot; data-origin-height=&quot;338&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;커널 버전에 따라 시스템 콜을 등록하는 방식이 다르니 참고하기 바란다.&lt;/p&gt;</description>
      <category>Linux kernel</category>
      <category>kernel</category>
      <category>리눅스</category>
      <category>시스템콜</category>
      <category>커널</category>
      <author>JIWANSEO</author>
      <guid isPermaLink="true">https://ordinary-student-study-record.tistory.com/72</guid>
      <comments>https://ordinary-student-study-record.tistory.com/72#entry72comment</comments>
      <pubDate>Tue, 22 Jul 2025 21:17:38 +0900</pubDate>
    </item>
    <item>
      <title>라즈베리파이 메모리 부족</title>
      <link>https://ordinary-student-study-record.tistory.com/71</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;필자는 라즈베리파이 3B 버전을 사용하고 있다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;학교에서 대여받은 라즈베리파이 4B 버전에서 opencv가 설치가 되지 않아서, 오랜만에 라즈베리파이 3B 버전에서 테스트해보려고 켜보았다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;pip로 opencv를 설치하려는 도중&amp;nbsp; 메모리가 부족하다는 현상을 마주치게 되었다.&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1738722024679&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;pi@raspberrypi:~/prac $ pip install opencv-python 
Looking in indexes: https://pypi.org/simple, https://www.piwheels.org/simple
Collecting opencv-python
  Downloading https://files.pythonhosted.org/packages/a1/d6/8422797e35f8814b1d9842530566a949d9b5850a466321a6c1d5a99055ee/opencv-python-4.3.0.38.tar.gz (88.0MB)
    99% |████████████████████████████████| 88.0MB 6.2MB/s eta 0:00:01Exception:
Traceback (most recent call last):
  File &quot;/usr/lib/python2.7/dist-packages/pip/_internal/cli/base_command.py&quot;, line 143, in main
    status = self.run(options, args)
...
  File &quot;/usr/lib/python2.7/json/__init__.py&quot;, line 251, in dumps
    sort_keys=sort_keys, **kw).encode(obj)
  File &quot;/usr/lib/python2.7/json/encoder.py&quot;, line 210, in encode
    return ''.join(chunks)
MemoryError&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;어떻게 해결할까 하다가 gpt를 통해 답을 얻게 되었다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;바로 스왑 메모리를 늘리는 방법이다. 아래에서 스왑 메모리를 늘리는 방법을 소개하겠다.&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1738722266672&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 스왑 파일 크기 확인 
free -m 

# 스왑 파일 크기 늘리기 
sudo dphys-swapfile swapoff # 기존 스왑 비활성화 
sudo vim /etc/dphys-swapfile # 설정 파일 편집 

CONF_SWAPSIZE=100 # 기존 값 
=&amp;gt; CONF_SWAPSIZE=1024 # 수정된 값 

# 설정 변경 후 저장 
sudo dphys-swapfile setup # 변경 사항 적용 
sudo dphys-swapfile swapon # 스왑 활성화 


# 메모리 부족 방지를 위해 Swap 우선 사용 
sudo sysctl vm.swapiness=10

# 메모리가 부족한 경우 작은 크기의 pip 패키지로 나누어 설치 
pip install --no-cache-dir opencv-python&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위와 같은 과정을 통해 메모리 부족 현상은 해결할 수 있게 되었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그러나.. 새로운 문제에 직면하게 된다.&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1738722374684&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Command &quot;/usr/bin/python -m pip install --ignore-installed \ 
--no-user --prefix /tmp/pip-build-env-NWlJMk --no-warn-script-location \ 
--no-binary :none: --only-binary :none: -i https://pypi.org/simple \
--extra-index-url https://www.piwheels.org/simple \
-- setuptools wheel scikit-build cmake pip \
&quot;numpy==1.11.3; python_version=='3.5'&quot; &quot;numpy==1.13.3; \
python_version=='3.6'&quot; &quot;numpy==1.14.5; python_version=='3.7'&quot; \
&quot;numpy==1.17.3; python_version&amp;gt;='3.8'&quot;&quot; failed with error code 2 in None \&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이러한 로그가 떴는데, 필자가 해석하기로는 단순한 파이썬과 모듈들의 버전 문제인거 같다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 필자가 사용하고 있는 Raspbian GNU/linux 10 (buster) 버전에서는 Python 3.7 버전이 최신 버전이라 단순하게 아래와 같이 실행해도 3.7이 설치가 된다.&lt;/p&gt;
&lt;pre id=&quot;code_1738722724661&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo apt install python3 -y&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 또 gpt 에게 물어보았다.&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1738722794250&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;curl https://pyenv.run | bash
exec $SHELL
pyenv install 3.9.9  # Example
pyenv global 3.9.9
python --version  # Should show Python 3.9.9&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 명령어를 사용해도 통하지 않아서 다른 방법을 사용해보았다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그냥 기존 pip에 3을 붙여서 pip3로 install을 시도했다.&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1738722964786&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;pip3 install opencv-python --no-cache-dir&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1738734733150&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ sudo ln -s /usr/share/pyshared/lsb_release.py /usr/local/lib/python3.9/site-packages/lsb_release.py
$ lsb_release -a
No LSB modules are available.
Distributor ID:	Raspbian
Description:	Raspbian GNU/Linux 10 (buster)
Release:	10
Codename:	buster&lt;/code&gt;&lt;/pre&gt;</description>
      <category>Computer Science</category>
      <author>JIWANSEO</author>
      <guid isPermaLink="true">https://ordinary-student-study-record.tistory.com/71</guid>
      <comments>https://ordinary-student-study-record.tistory.com/71#entry71comment</comments>
      <pubDate>Wed, 5 Feb 2025 11:36:35 +0900</pubDate>
    </item>
    <item>
      <title>라즈베리파이 OpenCV 설치 오류</title>
      <link>https://ordinary-student-study-record.tistory.com/70</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;필자는 라즈베리파이에 OpenCV를 설치하는데 아래와 같은 과정에서 무한 로딩이 걸렸다. 참고로 venv 환경에서 설치했다는 점 참고 바란다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;[실행 명령어]&lt;/p&gt;
&lt;pre id=&quot;code_1738641652373&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;pip install opencv-python --verbose&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;[결과]&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1738047589624&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt; -- Installing: /tmp/pip-install-7uox8u2t/opencv-python_3ce88f90b57a4aa8acdd9b7078005796/_skbuild/linux-aarch64-3.11/cmake-install/share/opencv4/lbpcascades/lbpcascade_silverware.xml
  Copying files from CMake output
  Traceback (most recent call last):
    File &quot;/home/gg065/Desktop/jiwanseo/cv_test/lib/python3.11/site-packages/pip/_vendor/pyproject_hooks/_in_process/_in_process.py&quot;, line 353, in &amp;lt;module&amp;gt;
      main()
    File &quot;/home/gg065/Desktop/jiwanseo/cv_test/lib/python3.11/site-packages/pip/_vendor/pyproject_hooks/_in_process/_in_process.py&quot;, line 335, in main
      json_out['return_val'] = hook(**hook_input['kwargs'])
                               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    File &quot;/home/gg065/Desktop/jiwanseo/cv_test/lib/python3.11/site-packages/pip/_vendor/pyproject_hooks/_in_process/_in_process.py&quot;, line 251, in build_wheel
      return _build_backend().build_wheel(wheel_directory, config_settings,
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    File &quot;/tmp/pip-build-env-hnhbs9gh/overlay/lib/python3.11/site-packages/setuptools/build_meta.py&quot;, line 230, in build_wheel
      return self._build_with_temp_dir(['bdist_wheel'], '.whl',
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    File &quot;/tmp/pip-build-env-hnhbs9gh/overlay/lib/python3.11/site-packages/setuptools/build_meta.py&quot;, line 215, in _build_with_temp_dir
      self.run_setup()
    File &quot;/tmp/pip-build-env-hnhbs9gh/overlay/lib/python3.11/site-packages/setuptools/build_meta.py&quot;, line 158, in run_setup
      exec(compile(code, __file__, 'exec'), locals())
    File &quot;setup.py&quot;, line 541, in &amp;lt;module&amp;gt;
      main()
    File &quot;setup.py&quot;, line 270, in main
      setup(
    File &quot;/tmp/pip-build-env-hnhbs9gh/overlay/lib/python3.11/site-packages/skbuild/setuptools_wrap.py&quot;, line 700, in setup
      _classify_installed_files(
    File &quot;setup.py&quot;, line 415, in _classify_installed_files_override
      with open(config_py, 'w') as opencv_init_config:
           ^^^^^^^^^^^^^^^^^^^^
  FileNotFoundError: [Errno 2] No such file or directory: '_skbuild/linux-aarch64-3.11/cmake-install/python/cv2/config-3.py'
  error: subprocess-exited-with-error
  
  &amp;times; Building wheel for opencv-python (pyproject.toml) did not run successfully.
  │ exit code: 1
  ╰─&amp;gt; See above for output.
  
  note: This error originates from a subprocess, and is likely not a problem with pip.
  full command: /home/gg065/Desktop/jiwanseo/cv_test/bin/python3 /home/gg065/Desktop/jiwanseo/cv_test/lib/python3.11/site-packages/pip/_vendor/pyproject_hooks/_in_process/_in_process.py build_wheel /tmp/tmp3246pkvq
  cwd: /tmp/pip-install-7uox8u2t/opencv-python_3ce88f90b57a4aa8acdd9b7078005796
  Building wheel for opencv-python (pyproject.toml) ... error
  ERROR: Failed building wheel for opencv-python
Failed to build opencv-python
ERROR: Could not build wheels for opencv-python, which is required to install pyproject.toml-based projects&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;위와 같은 결과가 나타나서 다른 해결 방법을 찾아보았다.&amp;nbsp;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;GUI가 없는 경량화된 모듈이 있다길래 설치를 시도해보았다.&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1738641747509&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;pip install opencv-python-headless --verbose&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;시도했으나 아래와 같은 오류가 발생했다.&lt;/p&gt;
&lt;pre id=&quot;code_1738632671009&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt; -- Installing: /tmp/pip-install-f3nls5wy/opencv-python-headless_006cbd12feb045719a9f691c8192e3a8/_skbuild/linux-aarch64-3.11/cmake-install/share/opencv4/lbpcascades/lbpcascade_silverware.xml
  Copying files from CMake output
  Traceback (most recent call last):
    File &quot;/home/gg065/Desktop/jiwanseo/venv/jiwan/lib/python3.11/site-packages/pip/_vendor/pyproject_hooks/_in_process/_in_process.py&quot;, line 389, in &amp;lt;module&amp;gt;
      main()
    File &quot;/home/gg065/Desktop/jiwanseo/venv/jiwan/lib/python3.11/site-packages/pip/_vendor/pyproject_hooks/_in_process/_in_process.py&quot;, line 373, in main
      json_out[&quot;return_val&quot;] = hook(**hook_input[&quot;kwargs&quot;])
                               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    File &quot;/home/gg065/Desktop/jiwanseo/venv/jiwan/lib/python3.11/site-packages/pip/_vendor/pyproject_hooks/_in_process/_in_process.py&quot;, line 280, in build_wheel
      return _build_backend().build_wheel(
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    File &quot;/tmp/pip-build-env-446px02n/overlay/lib/python3.11/site-packages/setuptools/build_meta.py&quot;, line 230, in build_wheel
      return self._build_with_temp_dir(['bdist_wheel'], '.whl',
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    File &quot;/tmp/pip-build-env-446px02n/overlay/lib/python3.11/site-packages/setuptools/build_meta.py&quot;, line 215, in _build_with_temp_dir
      self.run_setup()
    File &quot;/tmp/pip-build-env-446px02n/overlay/lib/python3.11/site-packages/setuptools/build_meta.py&quot;, line 158, in run_setup
      exec(compile(code, __file__, 'exec'), locals())
    File &quot;setup.py&quot;, line 541, in &amp;lt;module&amp;gt;
      main()
    File &quot;setup.py&quot;, line 270, in main
      setup(
    File &quot;/tmp/pip-build-env-446px02n/overlay/lib/python3.11/site-packages/skbuild/setuptools_wrap.py&quot;, line 700, in setup
      _classify_installed_files(
    File &quot;setup.py&quot;, line 415, in _classify_installed_files_override
      with open(config_py, 'w') as opencv_init_config:
           ^^^^^^^^^^^^^^^^^^^^
  FileNotFoundError: [Errno 2] No such file or directory: '_skbuild/linux-aarch64-3.11/cmake-install/python/cv2/config-3.py'
  error: subprocess-exited-with-error
  
  &amp;times; Building wheel for opencv-python-headless (pyproject.toml) did not run successfully.
  │ exit code: 1
  ╰─&amp;gt; See above for output.
  
  note: This error originates from a subprocess, and is likely not a problem with pip.
  full command: /home/gg065/Desktop/jiwanseo/venv/jiwan/bin/python /home/gg065/Desktop/jiwanseo/venv/jiwan/lib/python3.11/site-packages/pip/_vendor/pyproject_hooks/_in_process/_in_process.py build_wheel /tmp/tmpe8ookyam
  cwd: /tmp/pip-install-f3nls5wy/opencv-python-headless_006cbd12feb045719a9f691c8192e3a8
  Building wheel for opencv-python-headless (pyproject.toml) ... error
  ERROR: Failed building wheel for opencv-python-headless
Failed to build opencv-python-headless
ERROR: Failed to build installable wheels for some pyproject.toml based projects (opencv-python-headless)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결국 이 방법도 통하지 않길래, 다른 방법을 GPT에게 도움을 얻어 찾아보았다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그 결과 직접 Github에서 opencv 소스파일을 다운 받아, 직접 빌드하는 방법이었다.&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;직접 Github에서 소스파일을 받아 빌드하는 방법&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1738641926889&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# OpenCV 소스 코드 다운로드:
cd ~
git clone https://github.com/opencv/opencv.git
cd opencv
git checkout 4.x  # 또는 원하는 버전

# OpenCV 의존성 설치: 
sudo apt install cmake g++ wget unzip

# OpenCV 빌드:
mkdir build
cd build
cmake ..
make -j4
sudo make install

# Python 바인딩 설치: OpenCV를 Python에서 사용하려면 Python 바인딩을 추가로 설치해야 합니다:
cd ~
cd opencv
cd build
sudo make install&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;gt;&amp;gt;&amp;nbsp; OpenCV 빌드 도중 make -j4 명령어 실행 도중 라즈베리파이가 멈추는 오류가 발생하였습니다..&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;아래와 같은 명령어를 입력했을 때도 같은 오류가 발생하였다..&lt;/p&gt;
&lt;pre id=&quot;code_1738675243655&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;pip install opencv-contrib-python --verbose&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1738675224284&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;  -- Installing: /tmp/pip-install-izi675zu/opencv-contrib-python_2bd7e99e16864368b93778e569acb4be/_skbuild/linux-aarch64-3.11/cmake-install/share/opencv4/lbpcascades/lbpcascade_silverware.xml
  Copying files from CMake output
  Traceback (most recent call last):
    File &quot;/home/gg065/Desktop/jiwanseo/venv/jiwan/lib/python3.11/site-packages/pip/_vendor/pyproject_hooks/_in_process/_in_process.py&quot;, line 389, in &amp;lt;module&amp;gt;
      main()
    File &quot;/home/gg065/Desktop/jiwanseo/venv/jiwan/lib/python3.11/site-packages/pip/_vendor/pyproject_hooks/_in_process/_in_process.py&quot;, line 373, in main
      json_out[&quot;return_val&quot;] = hook(**hook_input[&quot;kwargs&quot;])
                               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    File &quot;/home/gg065/Desktop/jiwanseo/venv/jiwan/lib/python3.11/site-packages/pip/_vendor/pyproject_hooks/_in_process/_in_process.py&quot;, line 280, in build_wheel
      return _build_backend().build_wheel(
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    File &quot;/tmp/pip-build-env-1nbh2o6g/overlay/lib/python3.11/site-packages/setuptools/build_meta.py&quot;, line 230, in build_wheel
      return self._build_with_temp_dir(['bdist_wheel'], '.whl',
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    File &quot;/tmp/pip-build-env-1nbh2o6g/overlay/lib/python3.11/site-packages/setuptools/build_meta.py&quot;, line 215, in _build_with_temp_dir
      self.run_setup()
    File &quot;/tmp/pip-build-env-1nbh2o6g/overlay/lib/python3.11/site-packages/setuptools/build_meta.py&quot;, line 158, in run_setup
      exec(compile(code, __file__, 'exec'), locals())
    File &quot;setup.py&quot;, line 541, in &amp;lt;module&amp;gt;
      main()
    File &quot;setup.py&quot;, line 270, in main
      setup(
    File &quot;/tmp/pip-build-env-1nbh2o6g/overlay/lib/python3.11/site-packages/skbuild/setuptools_wrap.py&quot;, line 700, in setup
      _classify_installed_files(
    File &quot;setup.py&quot;, line 415, in _classify_installed_files_override
      with open(config_py, 'w') as opencv_init_config:
           ^^^^^^^^^^^^^^^^^^^^
  FileNotFoundError: [Errno 2] No such file or directory: '_skbuild/linux-aarch64-3.11/cmake-install/python/cv2/config-3.py'
  error: subprocess-exited-with-error
  
  횞 Building wheel for opencv-contrib-python (pyproject.toml) did not run successfully.
  ??exit code: 1
  ?겸?&amp;gt; See above for output.
  
  note: This error originates from a subprocess, and is likely not a problem with pip.
  full command: /home/gg065/Desktop/jiwanseo/venv/jiwan/bin/python /home/gg065/Desktop/jiwanseo/venv/jiwan/lib/python3.11/site-packages/pip/_vendor/pyproject_hooks/_in_process/_in_process.py build_wheel /tmp/tmp1rfgk__m
  cwd: /tmp/pip-install-izi675zu/opencv-contrib-python_2bd7e99e16864368b93778e569acb4be
  Building wheel for opencv-contrib-python (pyproject.toml) ... error
  ERROR: Failed building wheel for opencv-contrib-python
Failed to build opencv-contrib-python
ERROR: Failed to build installable wheels for some pyproject.toml based projects (opencv-contrib-python)&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;이 게시물은 필자가 opencv 설치를 완료할 때까지 계속 수정하도록 하겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;참고 사이트:&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://stackoverflow.com/questions/73698418/building-wheel-for-opencv-python-keeps-running-for-a-very-long-time&quot;&gt;https://stackoverflow.com/questions/73698418/building-wheel-for-opencv-python-keeps-running-for-a-very-long-time&lt;/a&gt; &lt;br /&gt;&lt;br /&gt;&lt;a style=&quot;letter-spacing: 0px;&quot; href=&quot;https://singleboardblog.com/install-python-opencv-on-raspberry-pi/&quot;&gt;OpenCV Python Installation for Raspberry Pi &amp;ndash; Single Board Blog&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.orionrobots.co.uk/2024/02/20/installing-opencv-and-numpy-learnrobotics.html&quot;&gt;Learn Robotics Programming 2nd Edition - update for installing OpenCV and Numpy | Orionrobots - Learn to build robots at home&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://hello-bryan.tistory.com/418&quot;&gt;opencv-python 설치 시 오류 (Could not build wheels for opencv-python which use PEP 517 and cannot be installed directly)&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.orionrobots.co.uk/2024/02/20/installing-opencv-and-numpy-learnrobotics.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.orionrobots.co.uk/2024/02/20/installing-opencv-and-numpy-learnrobotics.html&lt;/a&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://qengineering.eu/install-opencv-on-raspberry-pi.html&quot;&gt;Install OpenCV on Raspberry Pi - Q-engineering&lt;/a&gt;&lt;a href=&quot;https://qengineering.eu/install-opencv-on-raspberry-pi.html&quot;&gt; Install OpenCV on Raspberry Pi - Q-engineering&lt;/a&gt;&lt;/p&gt;</description>
      <category>Computer Science</category>
      <category>OpenCV</category>
      <author>JIWANSEO</author>
      <guid isPermaLink="true">https://ordinary-student-study-record.tistory.com/70</guid>
      <comments>https://ordinary-student-study-record.tistory.com/70#entry70comment</comments>
      <pubDate>Tue, 28 Jan 2025 14:24:23 +0900</pubDate>
    </item>
    <item>
      <title>[python] &amp;quot;telepot 모듈을 찾을 수 없음&amp;quot; 오류 기록</title>
      <link>https://ordinary-student-study-record.tistory.com/69</link>
      <description>&lt;pre id=&quot;code_1738584225699&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; %Run 27_1_main.py
Traceback (most recent call last):
  File &quot;/home/gg065/Desktop/jiwanseo/27_1_main.py&quot;, line 1, in &amp;lt;module&amp;gt;
    import telepot
ModuleNotFoundError: No module named 'telepot'&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;위와 같은 오류가 발생했다. 해결 방법을 검색해서 여러 방법을 찾아서 시도해보았다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. pip3 install&lt;/h2&gt;
&lt;pre id=&quot;code_1738584241207&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$: pip3 install telepot
error: externally-managed-environment

&amp;times; This environment is externally managed
╰─&amp;gt; To install Python packages system-wide, try apt install
    python3-xyz, where xyz is the package you are trying to
    install.
    
    If you wish to install a non-Debian-packaged Python package,
    create a virtual environment using python3 -m venv path/to/venv.
    Then use path/to/venv/bin/python and path/to/venv/bin/pip. Make
    sure you have python3-full installed.
    
    For more information visit http://rptl.io/venv

note: If you believe this is a mistake, please contact your Python installation or OS distribution provider. You can override this, at the risk of breaking your Python installation or OS, by passing --break-system-packages.
hint: See PEP 668 for the detailed specification.&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;| 가상환경에서 해보란다..&lt;/p&gt;
&lt;h2 style=&quot;text-align: left;&quot; data-ke-size=&quot;size26&quot;&gt;2. apt-get install telepot&lt;/h2&gt;
&lt;pre id=&quot;code_1738584250538&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$: sudo apt-get install telepot
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
E: Unable to locate package telepot&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;| 시도해보았지만 패키지를 찾을 수 없다고 한다.&lt;/p&gt;
&lt;h2 style=&quot;text-align: left;&quot; data-ke-size=&quot;size26&quot;&gt;3. 가상환경을 이용한 방법&lt;/h2&gt;
&lt;pre id=&quot;code_1738584264193&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$: python3 -m venv jiwan # 가상환경을 생성하는 명령어

$: source jiwan/bin/activate # 가상환경을 활성화하는 명령어
(jiwan) $:&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;** &lt;span style=&quot;background-color: #f89009;&quot;&gt;deactivate&lt;/span&gt; # 이를 입력하면 가상환경이 비활성화된다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;(jiwan) 이라는 가상 환경이 활성화된 것을 알 수 있다.&lt;/p&gt;
&lt;pre id=&quot;code_1738584281638&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;(jiwan) $: pip3 install telepot # telepot 모듈 설치&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;3번 과정을 통해 모듈을 성공적으로 설치할 수 있었다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Computer Science</category>
      <category>Python</category>
      <category>리눅스</category>
      <author>JIWANSEO</author>
      <guid isPermaLink="true">https://ordinary-student-study-record.tistory.com/69</guid>
      <comments>https://ordinary-student-study-record.tistory.com/69#entry69comment</comments>
      <pubDate>Tue, 28 Jan 2025 11:29:43 +0900</pubDate>
    </item>
    <item>
      <title>[ AWS AI &amp;amp; CLOUD 활용 과정 후기 ]</title>
      <link>https://ordinary-student-study-record.tistory.com/68</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;2024년 12월 26, 27일 2일간 진행된 AWS AI &amp;amp; CLOUD 활용 과정에 참여한 후기입니다.&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;AWS CLOUD를 한 번쯤 배워보고 싶었지만, 혼자 하기에는 어렵게 느껴져 시도조차 하기 힘들었습니다. 그러나 이번에 좋은 기회를 통해 AWS CLOUD를 활용하는 방법을 배우고, 이를 활용해 AI 서비스를 배포하는 것을 직접 경험할 수 있었습니다.&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;&amp;lt;1일 차&amp;gt;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;1일 차에는 AWS 클라우드 환경에서 MSA(마이크로서비스 아키텍처)와 서버리스 컴퓨팅 그리고 Bedrock을 활용해 실습했습니다. 강사님이 먼저 클라우드에 대한 이론적인 내용을 설명한 후, 실습에 활용할 AWS 서비스를 하나씩 소개하고 단계별로 지도해 주셔서 큰 어려움 없이 실습을 따라갈 수 있었습니다.&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;첫 번째 실습을 마친 후, 강사님은 학생들이 생성한 모든 버킷을 삭제하고 스스로 다시 연습해 보도록 지도하셨습니다. 혼자 실습하는 과정에서는 강사님과 함께 실습할 때보다 더 많은 오류가 발생하였지만, CloudWatch Logs를 확인하며 권한 문제, 환경 변수 문제 등을 해결할 수 있었습니다. 이를 통해 코드를 잘 작성하는 것도 중요하지만, 빌드와 배포 과정에서 발생하는 문제를 파악하고 해결하는 역량 또한 매우 중요하다는 것을 깨달았습니다.&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;aws_학습.png&quot; data-origin-width=&quot;1112&quot; data-origin-height=&quot;813&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/MqBLl/btsLBrjEP5A/rKaHcqcN1xSC2J42AlJBJ0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/MqBLl/btsLBrjEP5A/rKaHcqcN1xSC2J42AlJBJ0/img.png&quot; data-alt=&quot;1일 차에 배포한 학습 기록 바탕 추천 서비스&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/MqBLl/btsLBrjEP5A/rKaHcqcN1xSC2J42AlJBJ0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FMqBLl%2FbtsLBrjEP5A%2FrKaHcqcN1xSC2J42AlJBJ0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;591&quot; height=&quot;432&quot; data-filename=&quot;aws_학습.png&quot; data-origin-width=&quot;1112&quot; data-origin-height=&quot;813&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;1일 차에 배포한 학습 기록 바탕 추천 서비스&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;&amp;lt;2일 차&amp;gt;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;2일 차 오전에는 1일 차에 배운 내용들을 복습한 후, EC2 서버의 부하를 줄이는 방법으로 로드 밸런서를 활용하는 법을 배웠습니다. 강사님께서 간단한 아키텍처 그림을 통해 해당 서비스가 왜 필요한지 설명해 주셔서 내용을 쉽게 이해할 수 있었습니다. 이를 통해 그동안 이름만 들어봤던 로드 밸런서의 정확한 역할을 배울 수 있었습니다.&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;2일 차 오후에는 AWS의 EC2, S3 그리고 Lambda 함수를 활용해 Face-Swap 서비스를 제공하는 Canva 앱을 제작했습니다. 이전에 배운 AWS 서비스와 Canva 앱을 연결하는 실습이었는데, 중간에 하나라도 놓치면 원활히 작동하지 않아서 더욱 집중해서 교육에 임했습니다. 1일 차보다 따라가기가 조금 어려웠지만, 강사님과 조교님들의 도움 덕분에 실습을 무사히 마칠 수 있었습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;KakaoTalk_20241227_193329098.jpg&quot; data-origin-width=&quot;1440&quot; data-origin-height=&quot;1440&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/D3m39/btsLB0lwPX1/NWbeK6bTR6G1zTfghAvZu1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/D3m39/btsLB0lwPX1/NWbeK6bTR6G1zTfghAvZu1/img.jpg&quot; data-alt=&quot;2일 차에 만든 Face-Swap 서비스. 더 락과 인터넷의 유명한 짤을 Face-Swap한 결과물이다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/D3m39/btsLB0lwPX1/NWbeK6bTR6G1zTfghAvZu1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FD3m39%2FbtsLB0lwPX1%2FNWbeK6bTR6G1zTfghAvZu1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;466&quot; height=&quot;466&quot; data-filename=&quot;KakaoTalk_20241227_193329098.jpg&quot; data-origin-width=&quot;1440&quot; data-origin-height=&quot;1440&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;2일 차에 만든 Face-Swap 서비스. 더 락과 인터넷의 유명한 짤을 Face-Swap한 결과물이다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;&amp;lt;마치며&amp;gt;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;이틀 동안 AWS 서비스를 직접 활용하며 서비스 빌드 및 배포를 경험했습니다. 이번 교육 과정을 통해 클라우드 서비스를 활용하는 기초를 다질 수 있었습니다. 이를 통해 향후 개인 프로젝트에서도 AWS 서비스를 간단하게 활용해 보고, 이를 완전히 제 것으로 만들고 싶다는 생각이 들었습니다.&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;이번 교육 과정을 열심히 준비해 주신 모든 분께 정말 감사드립니다! 다음에도 이런 기회가 주어진다면, 참여하고 싶습니다! &lt;/span&gt;&lt;/p&gt;</description>
      <category>공부 일지 + 일상</category>
      <category>AWS</category>
      <category>Bedrock</category>
      <category>Canva</category>
      <category>DAU</category>
      <category>GenAI</category>
      <category>nxtcloud</category>
      <author>JIWANSEO</author>
      <guid isPermaLink="true">https://ordinary-student-study-record.tistory.com/68</guid>
      <comments>https://ordinary-student-study-record.tistory.com/68#entry68comment</comments>
      <pubDate>Sat, 28 Dec 2024 17:01:37 +0900</pubDate>
    </item>
    <item>
      <title>컴파일러 개요</title>
      <link>https://ordinary-student-study-record.tistory.com/67</link>
      <description>&lt;h2&gt;컴파일러의 정의와 역할&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;컴파일러: 고급 언어(C/C++, Pascal 등)로 작성된 프로그램을 기계어 코드로 번역.&lt;/li&gt;
&lt;li&gt;인터프리터: 실행할 때마다 원시 프로그램을 읽고 결과를 생성.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;주요 번역기 종류&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;전처리기(Preprocessor): 원시 프로그램을 확장.&lt;/li&gt;
&lt;li&gt;어셈블러: 어셈블리 코드를 기계어로 변환.&lt;/li&gt;
&lt;li&gt;로더/링커: 여러 기계어 코드를 하나로 결합.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;컴파일 프로세스 과정&lt;/h2&gt;
&lt;p&gt;프리프로세서 -&amp;gt; 컴파일러 -&amp;gt; 어셈블러 -&amp;gt; 로더 링커 -&amp;gt; 목적 프로그램&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;프리프로세서: 확장된 원시 프로그램 생성.&lt;/li&gt;
&lt;li&gt;어셈블러: 어셈블리어로 변환.&lt;/li&gt;
&lt;li&gt;로더/링커: 최종 기계어 코드 생성 및 재배치.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;컴파일러의 구조&lt;/h2&gt;
&lt;h3&gt;분석-통합 모델&lt;/h3&gt;
&lt;p&gt;소스 코드 -&amp;gt; 분석 -&amp;gt; 중간 코드 -&amp;gt; 통합 -&amp;gt; 목적 코드&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;분석(Front-End): 코드 분석, 오류 검출 및 중간 코드 생성.&lt;/li&gt;
&lt;li&gt;통합(Back-End): 중간 코드를 목적 코드로 변환 및 최적화.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&amp;quot; 원시 코드 -&amp;gt; 어휘 분석 -&amp;gt; 구문 분석 -&amp;gt; 의미 분석 -&amp;gt; 중간 코드 생성 -&amp;gt; 코드 최적화 -&amp;gt; 목적 코드 생성 &amp;quot;&lt;/p&gt;
&lt;h2&gt;어휘 분석(Lexical Analysis)&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;역할: 프로그램을 키워드, 식별자, 연산자 등으로 구분. (의미 있는 단위로 나눈다.)&lt;/li&gt;
&lt;li&gt;어휘 구조: 어휘의 형태 -&amp;gt; 정규 표현&lt;/li&gt;
&lt;li&gt;예: position := initial + rate * 60; → id1 := id2 + id3 * num60&lt;/li&gt;
&lt;li&gt;어휘 분석기: scanner&lt;/li&gt;
&lt;li&gt;어휘 분석기 생성기: lex, scangen&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;구문 분석(Syntax Analysis)&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;역할: 문법 구조를 확인하고 구문 오류를 검출.&lt;/li&gt;
&lt;li&gt;구조: 파스 트리(Parse Tree)나 유도 트리(Derivation tree), 구문 트리(AST) 생성.&lt;/li&gt;
&lt;li&gt;문법 구조: 올바른 구조란 어떤 것인가 -&amp;gt; 문맥 무관 문법&lt;/li&gt;
&lt;li&gt;구문 분석기: parser&lt;/li&gt;
&lt;li&gt;구문 분석기 생성기: yacc&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;오류 발생 위치&lt;/h2&gt;
&lt;h3&gt;어휘 분석 시&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;어휘 오류: 허용되지 않는 문자의 입력구문 분석 시&lt;/li&gt;
&lt;li&gt;구문 오류: 문법에 맞지 않는 문장실행 시&lt;/li&gt;
&lt;li&gt;논리 오류: 의도한 대로 계산되지 않음의미 분석 시&lt;/li&gt;
&lt;li&gt;정의되지 않는 연산&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;의미 분석(Semantic Analysis)&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;역할: 문법적으로 맞지만 의미가 정의되지 않은 문장 검출.&lt;/li&gt;
&lt;li&gt;예: 선언되지 않은 변수 사용, 자료형 불일치, 매개변수의 개수와 형의 불일치 등.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;중간 코드 생성 및 최적화&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;중간 코드: 목적 코드 생성 전의 중간 단계 코드. 전단부에서 파스트리를 순회하면서 생성함.&lt;/li&gt;
&lt;li&gt;예시&lt;/li&gt;
&lt;li&gt;&lt;code&gt;temp1 = inttoreal(60) temp2 = id3 * temp1 temp3 = id2 + temp2 id1 = temp3&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;최적화&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;정의: 효율적인 코드의 생성. 크기가 작고 빠르고 기억장소 요구량이 작은 코드.&lt;/li&gt;
&lt;li&gt;중요성: 컴파일은 한번, 컴파일된 목적 코드의 실행은 무한대. 컴파일 시 많은 시간이 소요되어도 무방.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;최적화 종류&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;지역 최적화: 공통 부분식 제거, 상수 계산 등.&lt;/li&gt;
&lt;li&gt;전역 최적화: 도달할 수 없는 코드 제거, 공통 부분식의 제거.&lt;/li&gt;
&lt;li&gt;루프 최적화: 루프 풀어 헤치기, 루프 붙이기 등.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;목적 코드 생성 및 최적화&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;목적 코드: 실행 가능한 최종 기계어 코드. 효율적인 레지스터 할당.&lt;/li&gt;
&lt;li&gt;목적 코드 생성 예시&lt;/li&gt;
&lt;li&gt;&lt;code&gt;MOVF id3, R2 MULF #60.0, R2 MOVF id2, R1 ADDF R2, R1 MOVF R1, id1&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>Computer Science/Compiler</category>
      <category>컴파일러</category>
      <author>JIWANSEO</author>
      <guid isPermaLink="true">https://ordinary-student-study-record.tistory.com/67</guid>
      <comments>https://ordinary-student-study-record.tistory.com/67#entry67comment</comments>
      <pubDate>Sun, 20 Oct 2024 14:48:29 +0900</pubDate>
    </item>
    <item>
      <title>[Windows 11 Camera 오류 해결] 0xA00F429E</title>
      <link>https://ordinary-student-study-record.tistory.com/66</link>
      <description>&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;노트북 내장 카메라를 사용하려는데, 아래와 같은 오류가 발생하였다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;camera_erro.png&quot; data-origin-width=&quot;851&quot; data-origin-height=&quot;542&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bNyJnG/btsJ90tMaPW/bw4PmyE4Ki2bmb8d3kh9VK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bNyJnG/btsJ90tMaPW/bw4PmyE4Ki2bmb8d3kh9VK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bNyJnG/btsJ90tMaPW/bw4PmyE4Ki2bmb8d3kh9VK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbNyJnG%2FbtsJ90tMaPW%2Fbw4PmyE4Ki2bmb8d3kh9VK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;851&quot; height=&quot;542&quot; data-filename=&quot;camera_erro.png&quot; data-origin-width=&quot;851&quot; data-origin-height=&quot;542&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;구글링하여 해결하려 했지만, 인터넷에 있는 모든 방법을 사용해도 통하지 않았다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1069&quot; data-origin-height=&quot;737&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/chpqrE/btsJ8XYM3Cy/CKiGYm3itLBIUAzfq7wiO1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/chpqrE/btsJ8XYM3Cy/CKiGYm3itLBIUAzfq7wiO1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/chpqrE/btsJ8XYM3Cy/CKiGYm3itLBIUAzfq7wiO1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FchpqrE%2FbtsJ8XYM3Cy%2FCKiGYm3itLBIUAzfq7wiO1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1069&quot; height=&quot;737&quot; data-origin-width=&quot;1069&quot; data-origin-height=&quot;737&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;마지막이다 생각하고, 장치 관리자에서 카메라 드라이버를 모두 제거하고 윈도우 재시작하였다.&lt;/p&gt;
&lt;h2 style=&quot;text-align: center;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;그 결과는?&amp;nbsp;&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;figure data-ke-type=&quot;image&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; data-ke-style=&quot;alignCenter&quot;&gt;
&lt;figcaption style=&quot;display: none;&quot;&gt;&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;869&quot; data-origin-height=&quot;556&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/beuS3P/btsJ9pHhSGn/BnEOAtzNkBxjxeJkkqaV31/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/beuS3P/btsJ9pHhSGn/BnEOAtzNkBxjxeJkkqaV31/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/beuS3P/btsJ9pHhSGn/BnEOAtzNkBxjxeJkkqaV31/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbeuS3P%2FbtsJ9pHhSGn%2FBnEOAtzNkBxjxeJkkqaV31%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;869&quot; height=&quot;556&quot; data-origin-width=&quot;869&quot; data-origin-height=&quot;556&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;정상적으로 작동하는 것을 볼 수 있다.&amp;nbsp;&lt;/p&gt;</description>
      <category>공부 일지 + 일상</category>
      <category>윈도우</category>
      <category>카메라</category>
      <author>JIWANSEO</author>
      <guid isPermaLink="true">https://ordinary-student-study-record.tistory.com/66</guid>
      <comments>https://ordinary-student-study-record.tistory.com/66#entry66comment</comments>
      <pubDate>Thu, 17 Oct 2024 10:04:27 +0900</pubDate>
    </item>
    <item>
      <title>[C++][BOJ][2042] 구간 합 구하기; 세그먼트 트리</title>
      <link>https://ordinary-student-study-record.tistory.com/65</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1052&quot; data-origin-height=&quot;1006&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cwFUZc/btsHobTwLAq/kgWP9s1xnRXWxPTlk2O6OK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cwFUZc/btsHobTwLAq/kgWP9s1xnRXWxPTlk2O6OK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cwFUZc/btsHobTwLAq/kgWP9s1xnRXWxPTlk2O6OK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcwFUZc%2FbtsHobTwLAq%2FkgWP9s1xnRXWxPTlk2O6OK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1052&quot; height=&quot;1006&quot; data-origin-width=&quot;1052&quot; data-origin-height=&quot;1006&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;717&quot; data-origin-height=&quot;424&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bk0nNd/btsHp1B4nOm/1m0gaj5lhsja0OVSeQL0uk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bk0nNd/btsHp1B4nOm/1m0gaj5lhsja0OVSeQL0uk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bk0nNd/btsHp1B4nOm/1m0gaj5lhsja0OVSeQL0uk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbk0nNd%2FbtsHp1B4nOm%2F1m0gaj5lhsja0OVSeQL0uk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;717&quot; height=&quot;424&quot; data-origin-width=&quot;717&quot; data-origin-height=&quot;424&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;세그먼트 트리는 여러 개의 데이터가 연속적으로 존재할 경우, 특정 범위의 데이터의 합을 구하는 방법이다.&amp;nbsp;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;세그먼트 트리에 필요한 함수는 세그먼트 트리를 초기화하는 함수, 업데이트하는 함수, 구간 합을 구하는 함수가 총 3개가 필요하다. 경우에 따라 이 함수들을 수정하여 문제에 맞게 변형을 시켜 적용하면 된다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;내가 선택한 이 문제는 가장 기본적인 세그먼트 트리 문제로 난이도는 그리 어렵지 않았다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;맨날 브론즈 실버 문제만 풀다가, 시작이 골드1인 세그먼트 트리 문제는 처음으로 풀었다. 예전에 알고리즘 잘하던 형이 알려주신다고 하셨는데, 그 당시에는 바빠서.. 배우지 못했었다. 시간이 지나고 학교 과제하다가 신박한 문제를 풀고 싶어서 세그먼트 트리에 대해 찾아보고, &quot;&lt;a href=&quot;https://m.blog.naver.com/ndb796/221282210534&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;안경잡이 개발자&lt;/a&gt;&quot; 님의 블로그를 보고 세그먼트 트리를 공부했다.&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;코드&amp;nbsp;&lt;/h2&gt;
&lt;pre id=&quot;code_1715649171052&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;iostream&amp;gt;
#define MAX 1000002

typedef long long ll;
using namespace std;

ll arr[MAX]; // 원 배열 
ll tree[MAX * 4]; // 100만과 가장 가까운 제곱 수 1000에 2를 곱함.

// 초기화
ll init(int start, int end, int node)
{
	if (start == end) return tree[node] = arr[start];
	ll mid = (start + end) / 2;
	return tree[node] = init(start, mid, node * 2)
		+ init(mid + 1, end, node * 2 + 1);
}

// 갱신 
void update(int start, int end, int node, int index, ll dif)
{
	// 범위 밖
	if (index&amp;lt;start || index&amp;gt;end) return;
	// 범위 안에 있으면 내려가면서 다른 원소도 갱신
	tree[node] += dif;
	if (start == end) return;
	ll mid = (start + end) / 2;
	update(start, mid, node * 2, index, dif);
	update(mid + 1, end, node * 2 + 1, index, dif);
}

// 합 
ll sum(int start, int end, int node, int left, int right)
{
	// 범위 밖
	if (left &amp;gt; end || right &amp;lt; start) return 0;
	// 범위 안 
	if (left &amp;lt;= start &amp;amp;&amp;amp; right &amp;gt;= end) return tree[node];
	ll mid = (start + end) / 2;
	return sum(start, mid, node * 2, left, right)
		+ sum(mid + 1, end, node * 2 + 1, left, right);
}

int main(void)
{
	ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0);

	int n, m, k, a, b;
	ll c;

	cin &amp;gt;&amp;gt; n &amp;gt;&amp;gt; m &amp;gt;&amp;gt; k;

	for (int i = 0, value; i &amp;lt; n; i++)
		cin &amp;gt;&amp;gt; arr[i];

	init(0, n - 1, 1);

	int iter = m + k;
	for (int i = 0; i &amp;lt; iter; i++)
	{
		cin &amp;gt;&amp;gt; a &amp;gt;&amp;gt; b &amp;gt;&amp;gt; c;

		// a가 1인 경우 b번째 수를 c로 변경
		if (a == 1)
		{
			ll tmp = c - arr[b - 1]; // tmp : 원값과 수정값의 차이 
			arr[b - 1] = c; // 값 수정 
			update(0, n - 1, 1, b - 1, tmp);
		}
		// a가 2인 경우 b번째 수 ~ c번째 수까지의 합을 출력
		if (a == 2)
		{
			cout &amp;lt;&amp;lt; sum(0, n - 1, 1, b - 1, c - 1) &amp;lt;&amp;lt; &quot;\n&quot;;
		}
	}
	return 0;
}

/*
	n : 수의 개수
	m : 수의 변경이 일어나는 횟수
	k : 구간의 합을 구하는 횟수

	둘째 줄부터 n+1 번째 줄까지 n개의 수가 주어진다.

	n+2번째 줄부터 n+m+k+1번째 줄까지 세 개의 정수 a b c가 주어진다.
	if( a == 1 ) b번째 수를 c로 변경
	if( a == 2 ) b번째 수부터 c번째 수까지의 합을 구하여 출력

*/&lt;/code&gt;&lt;/pre&gt;</description>
      <category>백준</category>
      <category>BOJ</category>
      <category>C++</category>
      <category>백준</category>
      <category>세그먼트 트리</category>
      <author>JIWANSEO</author>
      <guid isPermaLink="true">https://ordinary-student-study-record.tistory.com/65</guid>
      <comments>https://ordinary-student-study-record.tistory.com/65#entry65comment</comments>
      <pubDate>Tue, 14 May 2024 10:26:48 +0900</pubDate>
    </item>
    <item>
      <title>[C++][BOJ][31738] 매우 어려운 문제</title>
      <link>https://ordinary-student-study-record.tistory.com/64</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1043&quot; data-origin-height=&quot;862&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/CeXLz/btsGAzaum7c/9yPu4lBmemJjZTOUfMW8kk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/CeXLz/btsGAzaum7c/9yPu4lBmemJjZTOUfMW8kk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/CeXLz/btsGAzaum7c/9yPu4lBmemJjZTOUfMW8kk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FCeXLz%2FbtsGAzaum7c%2F9yPu4lBmemJjZTOUfMW8kk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1043&quot; height=&quot;862&quot; data-origin-width=&quot;1043&quot; data-origin-height=&quot;862&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;주의할 점&amp;nbsp;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일반적인 팩토리얼로 구현하게 되면, 수가 너무 커져서 int형으로는 커버가 되지 않기 때문에 long long 자료형을 쓰고, 팩토리얼 값을 계산할 때마다 나누어서 수가 매우 커지는 것을 방지한다.&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;설명&amp;nbsp;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일단 n이 m보다 클 때의 경우와 아닌 경우로 나누었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;n &amp;gt; m인 경우&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;n! 중 m으로 나누어 떨어지는 수가 있는 거는 하나라도 있을 것이니 0을 출력한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;n&amp;lt;=m인 경우 &lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;n=1인 경우에는 1을 출력하고 아니면, fact라는 변수에 1을 넣는다. &lt;br /&gt;그 후 for 반복문으로 팩토리얼을 계산할 때마다 m으로 나누어서 fact 변수에 저장한다. &lt;br /&gt;이를 반복 후 fact 변수의 값을 출력한다.&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;코드&amp;nbsp;&lt;/h2&gt;
&lt;pre id=&quot;code_1712979125839&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;iostream&amp;gt;
using namespace std;

int main(void)
{
	long long n, m; cin &amp;gt;&amp;gt; n &amp;gt;&amp;gt; m;
	
	if (n &amp;gt; m) cout &amp;lt;&amp;lt; 0;
	else {
		if (n == 1) cout &amp;lt;&amp;lt; 1;
		else
		{
			long long fact=1;
			for (long long i = 2; i &amp;lt;= n ; i++) fact = (fact*i) % m;
			cout &amp;lt;&amp;lt; fact;
		}
	}
	return 0;
}&lt;/code&gt;&lt;/pre&gt;</description>
      <category>백준</category>
      <category>BOJ</category>
      <category>C++</category>
      <category>백준</category>
      <author>JIWANSEO</author>
      <guid isPermaLink="true">https://ordinary-student-study-record.tistory.com/64</guid>
      <comments>https://ordinary-student-study-record.tistory.com/64#entry64comment</comments>
      <pubDate>Sat, 13 Apr 2024 12:33:48 +0900</pubDate>
    </item>
    <item>
      <title>교착 상태 해결 - 회피</title>
      <link>https://ordinary-student-study-record.tistory.com/63</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;이번에는 교착 상태를 해결하는 방법 중 회피에 대해 알아볼 것이다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;회피&lt;/b&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;목적 : 덜 엄격한 조건 요구하여 자원을 보다 효율적으로 활용&lt;/li&gt;
&lt;li&gt;교착 상태의 모든 발생 가능성을 미리 제거하는 게 아닌, 교착 상태 발생 가능성을 인정하고 (3가지 필요조건 허용), 교착 상태가 발생하려고 할 때, 적절히 회피하는 것&lt;/li&gt;
&lt;li&gt;예방보다 더 나은 병행성 허용&lt;/li&gt;
&lt;/ul&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;회피 방법1&lt;/b&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;프로세스의 시작 중단
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;프로세스의 요구가 교착 상태 발생 있다면 프로세스 시작 중단&lt;/li&gt;
&lt;li&gt;교착 상태 회피를 위해 자원을 언제 요청하는지 추가 정보 필요
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;각 프로세스마다 요청과 해제에서 정확한 순서를 파악하고 있다면, 요청에 따른 프로세스 대기 여부 결정 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;프로세스의 요청 수락 여부는 현재 사용 가능한 자원, 프로세스에 할당된 자원 등 각 프로세스에 대한 자원의 요청 및 해제를 미리 알고 있어야 결정 가능
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;가장 단순하고 유용한 알고리즘은 각 프로세스가 필요한 자원의 최대치를 선언하는 것&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;교착 상태 회피 알고리즘은 시스템이 순환 대기 조건이 발생하지 않도록 자원 할당 상태 검사
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;자원 할당 상태 : 사용 가능 자원 수, 할당 자원 수, 프로세스들의 최대 요청 수로 정의&lt;/li&gt;
&lt;li&gt;각 프로세스에 자원을 할당할 수 있고, 교착 상태를 예방할 수 있으면 안정 상태&lt;/li&gt;
&lt;li&gt;시스템에 안정 순서가 있으면 그 시스템은 안정 상태&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;시스템의 상태&lt;/b&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;안정 상태 / 불안정 상태로 구분&lt;/li&gt;
&lt;li&gt;교착 상태는 불안정 상태에서 발생&lt;/li&gt;
&lt;li&gt;모든 사용자가 일정 기간 안에 작업을 끝내도록 OS가 할 수 있으면 현재 시스템의 상태는 안정, 아니면 불안정&lt;/li&gt;
&lt;li&gt;교착 상태는 불안정 상태
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;그러나 모든 불안정 상태가 교착 상태인 것은 아님, 단지 불안정 상태는 교착 상태가 되기 쉬움&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;상태가 안정하다면 OS는 불안정 상태와 교착 상태를 예방 가능&lt;/li&gt;
&lt;li&gt;불안정 상태의 운영체제는 교착 상태를 발생시키는 프로세스의 자원 요청 방지 불가&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;안정 상태와 불안정 상태의 자원 예&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;875&quot; data-origin-height=&quot;530&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bcGes9/btsGCyncRaT/nLhm6zuA6LPk8SIXS82OK0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bcGes9/btsGCyncRaT/nLhm6zuA6LPk8SIXS82OK0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bcGes9/btsGCyncRaT/nLhm6zuA6LPk8SIXS82OK0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbcGes9%2FbtsGCyncRaT%2FnLhm6zuA6LPk8SIXS82OK0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;626&quot; height=&quot;379&quot; data-origin-width=&quot;875&quot; data-origin-height=&quot;530&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;table data-ke-align=&quot;alignCenter&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;프로세스&lt;/th&gt;
&lt;th&gt;현재사용량(t0 시간)&lt;/th&gt;
&lt;th&gt;최대 사용량&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;P0&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;2&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;7&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;P1&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;1&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;8&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;P2&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;2&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;4&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;P3&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;2&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;10&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;NULL&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;여분 자원 수&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;3&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;[안정 상태의 자원 예]&lt;/p&gt;
&lt;table style=&quot;height: 109px;&quot; data-ke-align=&quot;alignCenter&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;thead&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;th style=&quot;height: 21px;&quot;&gt;프로세스&lt;/th&gt;
&lt;th style=&quot;height: 21px;&quot;&gt;현재사용량(t0 시간)&lt;/th&gt;
&lt;th style=&quot;height: 21px;&quot;&gt;최대 사용량&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;height: 17px; text-align: center;&quot;&gt;P0&lt;/td&gt;
&lt;td style=&quot;height: 17px; text-align: center;&quot;&gt;5&lt;/td&gt;
&lt;td style=&quot;height: 17px; text-align: center;&quot;&gt;7&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;height: 17px; text-align: center;&quot;&gt;P1&lt;/td&gt;
&lt;td style=&quot;height: 17px; text-align: center;&quot;&gt;1&lt;/td&gt;
&lt;td style=&quot;height: 17px; text-align: center;&quot;&gt;8&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;height: 17px; text-align: center;&quot;&gt;P2&lt;/td&gt;
&lt;td style=&quot;height: 17px; text-align: center;&quot;&gt;2&lt;/td&gt;
&lt;td style=&quot;height: 17px; text-align: center;&quot;&gt;4&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;height: 17px; text-align: center;&quot;&gt;P3&lt;/td&gt;
&lt;td style=&quot;height: 17px; text-align: center;&quot;&gt;1&lt;/td&gt;
&lt;td style=&quot;height: 17px; text-align: center;&quot;&gt;7&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;height: 20px; text-align: center;&quot;&gt;NULL&lt;/td&gt;
&lt;td style=&quot;height: 20px; text-align: center;&quot;&gt;여분 자원 수&lt;/td&gt;
&lt;td style=&quot;height: 20px; text-align: center;&quot;&gt;1&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;[불안정 상태의 자원 예]&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;회피 방법2&lt;/b&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;자원 할당 거부 (Banker&amp;rsquo;s algorithm)
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;프로세스가 요청한 자원 할당했을 때, 교착 상태가 발생할 수 있다면 요청한 자원을 할당하지 않음&lt;/li&gt;
&lt;li&gt;다익스트라의 banker&amp;rsquo;s algorithm 이용
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;자원의 할당 허용 여부 결정 전에 미리 결정된 모든 자원의 최대 가능한 할당량을 시뮬레이션하여 안전 여부 검사&lt;/li&gt;
&lt;li&gt;그 후 대기 중인 다른 모든 활동의 교착 상태 가능성 조사하여 안정 상태 여부 검사확인&lt;/li&gt;
&lt;li&gt;프로세스가 자원 요청때마다 OS로 실행&lt;/li&gt;
&lt;li&gt;자원 요청 승낙이 불안정한 상태에서 시스템을 배치할 수 있다고 판단하면 이 요청을 연기, 거부하여 교착 상태 예방&lt;/li&gt;
&lt;li&gt;각 프로세스에 자원을 어떻게 할당(자원 할당 순서)할 것인지 정보 필요하므로 각 프로세스가 요청하는 자원 종류의 최대 수를 알아야 함
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;이 정보로 교착 상태 회피 알고리즘 정의 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;Banker&amp;rsquo;s alorithms 구현을 위한 자료구조&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Available : 각 형태별로 사용 가능한 자원 수 (사용 가능량)를 표시하는 길이가 m인 벡터
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Available[j]=k면, 자원을 k개 사용 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Max : 각 프로세스 자원의 최대 요청량 (최대 요구량)을 표시하나느 n X m 행렬
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Max[i, j] = k이면, 프로세스 P는 자원 R을 최대 k개까지 요청 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Allocation : 현재 각 프로세스에 할당되어 있는 각 형태의 자원 수(현재 할당량)을 정의하는 n X m 행렬
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Allocation[i,j]=k면, 프로세스 P는 자원이 R인 자원을 최대 k개 할당받고 있다는 의미&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Need : 각 프로세스에 남아있는 자원 요청(추가 요구량)을 표시하는 n X m 행렬
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Need[i,j]=k면, 프로세스 P는 자신의 작업을 종료하려고 자원 R을 k개 더 요청&lt;/li&gt;
&lt;/ul&gt;
&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;n : 프로세스 수, m : 자원 수&lt;br /&gt;Need[i, j]=Max[i, j]-Allocation[i, j]라는 식 성립&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;알고리즘 간단 구현을 위한 제약&lt;/b&gt;&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;시간에 따라 벡터의 크기와 값이 변함&lt;/li&gt;
&lt;li&gt;X와 Y는 길이가 n인 벡터&lt;/li&gt;
&lt;li&gt;X[i] &amp;le; Y[i]이고, i=1,2,&amp;hellip;,n일 때만 X&amp;le;Y&lt;/li&gt;
&lt;li&gt;X=(0,3,2,1), Y=(1,7,3,2)이면X&amp;le;Y&lt;/li&gt;
&lt;li&gt;X&amp;le;Y이고 X&amp;ne;Y면 X&amp;lt;Y다&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;프로세스 Pi가 자원 요청 시 일어나는 동작&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1단계 : Req_i &amp;le; Need_i이면 2단계로 이동하고, 그렇지 않으면 프로세스가 최대 요청치를 초과하기 때문에 오류 상태&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2단계 : Req_i &amp;le; Available이면 3단계로 이동, 그렇지 않으면 자원 부족으로 인해 Pi는 대기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3단계 : 시스템은 상태를 다음과 같이 수정하여 요청된 자원을 프로세스 Pi에 할당한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Available = Available - Req_i;&lt;br /&gt;Allocation_i = Allocation_i + Req_i;&lt;br /&gt;Need_i = Need_i - Req_i;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;안전 알고리즘의 시스템 상태 검사&lt;/b&gt;&lt;/h3&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;1단계 : work와 finish를 각각 길이가 m과 n인 벡터라고 하자. Work = Available, Finish[i]=false, i=1,2,&amp;hellip;,n이 되도록 초기화&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2단계 : 다음 조건을 만족하는 i 값을 찾는다. i 값이 없으면 4단계로 이동&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Finish[i] == false&lt;br /&gt;Need_i &amp;le; Work&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3단계 : 다음을 수행하고 2단계로 이동한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Work = Work + Allocation_i // 할당된 상태&lt;br /&gt;Finish[i] = true // 일을 끝냈으니 true&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4단계 : 모든 i에 대하여 Finish[i]==true이면 시스템은 안정 상태&lt;/p&gt;
&lt;h4 style=&quot;text-align: center;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;시간 t0일 때 시스템의 상태 (안정 상태)&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;table data-ke-align=&quot;alignCenter&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;프로세스&lt;/th&gt;
&lt;th&gt;Allocation&lt;/th&gt;
&lt;th&gt;Max&lt;/th&gt;
&lt;th&gt;Need&lt;/th&gt;
&lt;th&gt;Available&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;ABCD&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;ABCD&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;ABCD&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;ABCD&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;P0&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;2011&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;3214&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;1203&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;1222&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;P1&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;0121&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;0252&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;0131&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;P2&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;4003&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;5105&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;1102&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;P3&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;0210&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;1530&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;1320&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;P4&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;1030&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;3033&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;2003&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;할당량&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;7375&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;Banker&amp;rsquo;s algorithm 단점&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;할당 가능한 자원의 일정량 요청&lt;/li&gt;
&lt;li&gt;자원의 수시로 유지보수 필요, 일정하게 남아 있는 자원 수 파악 곤란&lt;/li&gt;
&lt;li&gt;사용자 수가 일정해야 하지만 다중 프로그래밍에서는 사용자 수가 항상 변함&lt;/li&gt;
&lt;li&gt;교착 상태 회피 알고리즘을 실행하면 시스템 과부하 증가&lt;/li&gt;
&lt;li&gt;프로세스는 자원을 보유한 상태로 끝낼 수 없음.&lt;/li&gt;
&lt;li&gt;사용자가 최대 필요량을 미리 요청하지만, 자원 할당 방법이 점점 동적으로 변하면서 사용자의 최대 필요량 파악 곤란&lt;/li&gt;
&lt;li&gt;항상 불안정 상태를 방지해야 하므로 자원 이용도 낮음&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>Computer Science/Operating System</category>
      <author>JIWANSEO</author>
      <guid isPermaLink="true">https://ordinary-student-study-record.tistory.com/63</guid>
      <comments>https://ordinary-student-study-record.tistory.com/63#entry63comment</comments>
      <pubDate>Fri, 12 Apr 2024 23:21:32 +0900</pubDate>
    </item>
    <item>
      <title>교착 상태 해결 - 예방</title>
      <link>https://ordinary-student-study-record.tistory.com/62</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;교착 상태를 해결하는 방법에는 대표적으로 3가지가 있다. 예방, 회피, 탐지 및 회복.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번에는 예방에 대해 알아볼 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[하벤더]&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;각 프로세스는 필요한 자원을 한 번에 모두 요청, 요청한 자원을 모두 제공받기 전까지 작업 불가&lt;/li&gt;
&lt;li&gt;어떤 자원을 점유하는 프로세스의 요청을 더 이상 허용하지 않으면, 점유 자원을 모두 반납하고, 필요 시 다시 자원 요청&lt;/li&gt;
&lt;li&gt;모든 프로세스에 자원을 순서대로 할당&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[보통 교착 상태 예방] 중요!!!&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;자원의 상호배제 조건 방지
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;상호배제는 자원의 비공유가 전제&lt;/li&gt;
&lt;li&gt;여러 개의 프로세스가 동시 공유자원 사용 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;점유와 대기 조건 방지
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;프로세스가 작업 수행 전, 필요 자원 모두 요청하고 획득해야 함&lt;/li&gt;
&lt;li&gt;대기 조건 성립 안됨 (최대 자원 할당)&lt;/li&gt;
&lt;/ul&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;자원 할당 시, 시스템 호출된 프로세스 하나를 실행하는 데 필요한 모든 자원을 먼저 할당, 실행 후 다른 시스템 호출에 자원 할당&lt;/li&gt;
&lt;li&gt;프로세스가 자원을 전혀 갖고 있지 않을 때만 자원을 요청하도록 허용. 프로세스가 자원을 더 요청하려면 자신에게 할당된 자원을 모두 해제해야 함&lt;/li&gt;
&lt;/ol&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;단점
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;자원 효율성 너무 낮음&lt;/li&gt;
&lt;li&gt;기아 상태 발생 가능 (대화식 시스템에서 사용 불가)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;비선점 조건 방지
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;전제 조건 : 이미 할당된 자원에 선점권이 없어야!!&lt;/li&gt;
&lt;li&gt;요청 자원을 즉시 할당 받을 수 없어 기다려야 한다면, 현재 가진 자원을 모두 해제해야 함&lt;/li&gt;
&lt;li&gt;프로세스가 작업을 시작할 때는 요청한 새로운 자원과 해제한 자원을 확보해야 함&lt;/li&gt;
&lt;li&gt;두 프로세스에 우선 순위를 부여하고, 높은 우선순위의 프로세스가 그보다 낮은 우선 순위의 프로세스가 점유한 자원을 선점하여 해결&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;순환 대기 조건 방지 (한 방향)
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;모든 자원에 일련의 순서 부여, 각 프로세스가 오름차순으로만 자원 요청할 수 있게 함&lt;/li&gt;
&lt;li&gt;순환 대기의 가능성을 제거하여 교착 상태 예방&lt;/li&gt;
&lt;li&gt;자원을 집합을 R = {R1, R2, &amp;hellip;, Rn}이라고 가정 (각 자원에 고유 숫자 부여에 의해 어느 자원의 순서가 빠른지 정의)
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;이것은 1:1 함수 F:R &amp;rarr; N으로 정의 (N: 자연수 집합)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;자원 R의 집합이 CD, 디스크, 프린터를 포함한다면 함수 F는 다음과 같이 정의&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;F(CD) = 2&lt;br /&gt;F(디스크) = 4&lt;br /&gt;F(프린터) = 7&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;교착 상태 예방 시 고려할 규칙
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;각 프로세스는 오름차순으로만 자원 요청 가능&lt;/li&gt;
&lt;li&gt;CD와 프린터를 동시에 사용해야 하는 프로세스는 CD 먼저 요청 후 프린터 요청&lt;/li&gt;
&lt;li&gt;또 다른 해결 방법으로 프로세스가 자원 Rj 요청 때마다 &lt;code&gt;F(Ri) &amp;ge; F(Rj)&lt;/code&gt;가 되도록 Ri의 모든 자원 해제 &amp;rArr; 순환 대기 조건 막을 수 있다.&lt;/li&gt;
&lt;li&gt;계층적 요청은 순환 대기 조건 가능성 제거하여 교착 상태 예방, 반드시 자원의 번호 순서로 요청해야 함
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;번호 부여 시 실제 자원 사용 순서를 반영해야 함&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>Computer Science/Operating System</category>
      <author>JIWANSEO</author>
      <guid isPermaLink="true">https://ordinary-student-study-record.tistory.com/62</guid>
      <comments>https://ordinary-student-study-record.tistory.com/62#entry62comment</comments>
      <pubDate>Fri, 12 Apr 2024 23:18:20 +0900</pubDate>
    </item>
    <item>
      <title>교착 상태란?</title>
      <link>https://ordinary-student-study-record.tistory.com/61</link>
      <description>&lt;h1&gt;교착 상태&lt;/h1&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;교착 상태의 개념&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;다중 프로그래밍에서 일어나지 않을 사건을 기다리는 상태&lt;/li&gt;
&lt;li&gt;작업 정지되어 명령 진행 불가한 상태&lt;/li&gt;
&lt;li&gt;해결 못할 경우 외부 종료 명령으로 해결해야 함&lt;/li&gt;
&lt;li&gt;하나 이상의 작업에 영향을 주어 무한 대기 , 기아 상태보다 더 심한 문제 야기&lt;/li&gt;
&lt;li&gt;자원 해제 요청이 받아들일 때까지 프로세스들 작업 진행 불가&lt;/li&gt;
&lt;li&gt;자원 해제 수신 때까지 현재 보유 자원 해제 불가&lt;/li&gt;
&lt;li&gt;두 프로세스가 비공유 자원을 서로 기다리고 있을 때 발생&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;967&quot; data-origin-height=&quot;545&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/t98qV/btsGCdjlax5/kjkE4LEJPZLZIanhLnmrT1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/t98qV/btsGCdjlax5/kjkE4LEJPZLZIanhLnmrT1/img.png&quot; data-alt=&quot;교착 상태의 예시&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/t98qV/btsGCdjlax5/kjkE4LEJPZLZIanhLnmrT1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Ft98qV%2FbtsGCdjlax5%2FkjkE4LEJPZLZIanhLnmrT1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;967&quot; height=&quot;545&quot; data-origin-width=&quot;967&quot; data-origin-height=&quot;545&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;교착 상태의 예시&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;프로세스의 자원 사용 순서&lt;/h2&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;자원 요청
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;프로세스가 필요 자원 요청&lt;/li&gt;
&lt;li&gt;해당 자원을 다른 프로세스가 사용 중이면 요청 수락 때까지 대기&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;자원 사용
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;프로세스가 요청한 자원을 획득하여 사용&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;자원 해제
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;프로세스가 자원 사용 마친 후 해당 자원 되돌려(해제) 줌&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;교착 상태의 예&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;스풀링 시스템에서 발생하는 교착 상태
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;쉽게 교착 상태에 빠짐&lt;/li&gt;
&lt;li&gt;스풀링 처리부에 공간 넉넉하면 교착 상태 발생률 감소하나 비용이 많이 듦&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;교착 상태 발생의 4가지 조건&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;상호배제&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;자원을 최소 하나 이상 비공유. 즉 한 번에 프로세스 하나만 해당 자원 사용 가능&lt;/li&gt;
&lt;li&gt;사용 중인 자원을 다른 프로세스가 사용하려면 요청 자원 해제될 때까지 대기&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;점유와 대기&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;자원을 최소한 하나 정도 보유. 다른 프로세스에 할당된 자원을 얻으려고 대기하는 프로세스가 있어야 함&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;비선점&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;자원 선점 불가. 즉 자원은 강제로 빼앗을 수 없고, 자원 점유하고 있는 프로세스가 끝나야 해제&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;순환(환형) 대기&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;예&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1015&quot; data-origin-height=&quot;513&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bK8t6o/btsGBg192v2/vtlfuxqLcrBF45SuA25ln0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bK8t6o/btsGBg192v2/vtlfuxqLcrBF45SuA25ln0/img.png&quot; data-alt=&quot;순환 대기&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bK8t6o/btsGBg192v2/vtlfuxqLcrBF45SuA25ln0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbK8t6o%2FbtsGBg192v2%2FvtlfuxqLcrBF45SuA25ln0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1015&quot; height=&quot;513&quot; data-origin-width=&quot;1015&quot; data-origin-height=&quot;513&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;순환 대기&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래프에 있는 사이클은 교착 상태 발생의 필요 조건이지, 충분조건 아님&lt;/p&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1081&quot; data-origin-height=&quot;1058&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c6gSX7/btsGBfCcNHx/SWxL2TkQ8eXXuMKvhBns11/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c6gSX7/btsGBfCcNHx/SWxL2TkQ8eXXuMKvhBns11/img.png&quot; data-alt=&quot;사이클이 있는 교착 상태의 그래프&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c6gSX7/btsGBfCcNHx/SWxL2TkQ8eXXuMKvhBns11/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc6gSX7%2FbtsGBfCcNHx%2FSWxL2TkQ8eXXuMKvhBns11%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1081&quot; height=&quot;1058&quot; data-origin-width=&quot;1081&quot; data-origin-height=&quot;1058&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;사이클이 있는 교착 상태의 그래프&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;932&quot; data-origin-height=&quot;803&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/F4poS/btsGARV8xNe/v7N5chh7pbb6gVna8S7xnK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/F4poS/btsGARV8xNe/v7N5chh7pbb6gVna8S7xnK/img.png&quot; data-alt=&quot;순환을 갖더라도 빠져나갈 수 있으면 교착 상태가 아니다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/F4poS/btsGARV8xNe/v7N5chh7pbb6gVna8S7xnK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FF4poS%2FbtsGARV8xNe%2Fv7N5chh7pbb6gVna8S7xnK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;932&quot; height=&quot;803&quot; data-origin-width=&quot;932&quot; data-origin-height=&quot;803&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;순환을 갖더라도 빠져나갈 수 있으면 교착 상태가 아니다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/blockquote&gt;</description>
      <category>Computer Science/Operating System</category>
      <author>JIWANSEO</author>
      <guid isPermaLink="true">https://ordinary-student-study-record.tistory.com/61</guid>
      <comments>https://ordinary-student-study-record.tistory.com/61#entry61comment</comments>
      <pubDate>Fri, 12 Apr 2024 23:04:44 +0900</pubDate>
    </item>
    <item>
      <title>[OpenGL 1.0] 실습환경 세팅하기 - 완벽 가이드</title>
      <link>https://ordinary-student-study-record.tistory.com/60</link>
      <description>&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;OpenGL 1.0 버전 실습환경 세팅을 해볼 것이다.&amp;nbsp;&lt;br /&gt;내가 세팅하는 방법은 환경 세팅을 적용한 프로젝트 내에서만 유효하기 때문에 다른 프로젝트에 영향을 주이 않는다는 장점을 가지고 있다.&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;단 아래 가이드를 똑같이 따라해야 실습 환경이 제대로 세팅되기 때문에 잘 따라와야 한다.&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;h4 style=&quot;text-align: left;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;1. 먼저 Visual studio에서 새로운 프로젝트를 생성 후 1회 실행해야 한다.&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1360&quot; data-origin-height=&quot;866&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/esKoGE/btsDnfSG1n6/HHhWtN4mNY7txYYnvQ1LYK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/esKoGE/btsDnfSG1n6/HHhWtN4mNY7txYYnvQ1LYK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/esKoGE/btsDnfSG1n6/HHhWtN4mNY7txYYnvQ1LYK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FesKoGE%2FbtsDnfSG1n6%2FHHhWtN4mNY7txYYnvQ1LYK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1360&quot; height=&quot;866&quot; data-origin-width=&quot;1360&quot; data-origin-height=&quot;866&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;2. 이제 OpenGL을 세팅할 때 필요한 파일을 다운 받을 것이다. 아래 사이트에 들어가서 파일을 다운받으면 된다.&amp;nbsp;&lt;/b&gt;&lt;/h4&gt;
&lt;figure id=&quot;og_1705027062713&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;freeglut Windows Development Libraries&quot; data-og-description=&quot;Introduction Whilst at the University of Essex, I took a module called &amp;ldquo;Interactive Computer Graphics&amp;rdquo; (or EE222 as we referred to it). Half of the course consisted of using POV-Ray to create images, and then putting them together to make a high qualit&quot; data-og-host=&quot;www.transmissionzero.co.uk&quot; data-og-source-url=&quot;https://www.transmissionzero.co.uk/software/freeglut-devel/&quot; data-og-url=&quot;https://www.transmissionzero.co.uk/software/freeglut-devel/&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://www.transmissionzero.co.uk/software/freeglut-devel/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.transmissionzero.co.uk/software/freeglut-devel/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;freeglut Windows Development Libraries&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Introduction Whilst at the University of Essex, I took a module called &amp;ldquo;Interactive Computer Graphics&amp;rdquo; (or EE222 as we referred to it). Half of the course consisted of using POV-Ray to create images, and then putting them together to make a high qualit&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.transmissionzero.co.uk&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1029&quot; data-origin-height=&quot;579&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/1f9xO/btsDkCuvx1t/D6v6VIUZNU95h3Voy2aU1k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/1f9xO/btsDkCuvx1t/D6v6VIUZNU95h3Voy2aU1k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/1f9xO/btsDkCuvx1t/D6v6VIUZNU95h3Voy2aU1k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F1f9xO%2FbtsDkCuvx1t%2FD6v6VIUZNU95h3Voy2aU1k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1029&quot; height=&quot;579&quot; data-origin-width=&quot;1029&quot; data-origin-height=&quot;579&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이런 화면이 나올건데, freeglut 3.0.0 MSVC Package 섹션에서 Download 버튼을 누른다. 이후 파일 다운이 완료되면 압축파일을 해제한다.&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;3. 압축 파일을 해제하면, 아래와 같은 freeglut 폴더가 생성되는데, 이 안에 들어가면 세 가지의 폴더가 나온다.&amp;nbsp;&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;647&quot; data-origin-height=&quot;293&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/UPjfM/btsDkGcARKI/qc23ZuqVZkMvS1fv7OSRi0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/UPjfM/btsDkGcARKI/qc23ZuqVZkMvS1fv7OSRi0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/UPjfM/btsDkGcARKI/qc23ZuqVZkMvS1fv7OSRi0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FUPjfM%2FbtsDkGcARKI%2Fqc23ZuqVZkMvS1fv7OSRi0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;647&quot; height=&quot;293&quot; data-origin-width=&quot;647&quot; data-origin-height=&quot;293&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;3.1. bin 폴더에 들어가면 x64폴더와 freeglut.dll 파일이 나오는데, 여기 있는 194KB의 파일은 무시하고 x64로 들어간다.&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;609&quot; data-origin-height=&quot;195&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/156hD/btsDkOInhcL/8Bn9YPHjGhSm6o0RMHAlDk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/156hD/btsDkOInhcL/8Bn9YPHjGhSm6o0RMHAlDk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/156hD/btsDkOInhcL/8Bn9YPHjGhSm6o0RMHAlDk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F156hD%2FbtsDkOInhcL%2F8Bn9YPHjGhSm6o0RMHAlDk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;609&quot; height=&quot;195&quot; data-origin-width=&quot;609&quot; data-origin-height=&quot;195&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;3.1.2 x64폴더에 들어가면 230KB의 freeglut.dll 파일이 나오는데 이 파일이 필요하다. 이 파일을 프로젝트의 폴더에 추가해줄 것이다.&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;611&quot; data-origin-height=&quot;162&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/6OwcB/btsDkSw7IdA/Y3VrzECkOr8d3cdoYcuV60/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/6OwcB/btsDkSw7IdA/Y3VrzECkOr8d3cdoYcuV60/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/6OwcB/btsDkSw7IdA/Y3VrzECkOr8d3cdoYcuV60/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F6OwcB%2FbtsDkSw7IdA%2FY3VrzECkOr8d3cdoYcuV60%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;611&quot; height=&quot;162&quot; data-origin-width=&quot;611&quot; data-origin-height=&quot;162&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1343&quot; data-origin-height=&quot;848&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/7ClBF/btsDkzq1B4r/yVocBU7w0ulz8EVZYkNjk1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/7ClBF/btsDkzq1B4r/yVocBU7w0ulz8EVZYkNjk1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/7ClBF/btsDkzq1B4r/yVocBU7w0ulz8EVZYkNjk1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F7ClBF%2FbtsDkzq1B4r%2FyVocBU7w0ulz8EVZYkNjk1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1343&quot; height=&quot;848&quot; data-origin-width=&quot;1343&quot; data-origin-height=&quot;848&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;3.1.3 위 화면에서 프로젝트를 우클릭 후 파일 탐색기에서 폴더 열기 버튼을 클릭한다.&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;638&quot; data-origin-height=&quot;282&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/4or7H/btsDkRZgHh1/M61zDdxpB2eS6UMNzhKk2k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/4or7H/btsDkRZgHh1/M61zDdxpB2eS6UMNzhKk2k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/4or7H/btsDkRZgHh1/M61zDdxpB2eS6UMNzhKk2k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F4or7H%2FbtsDkRZgHh1%2FM61zDdxpB2eS6UMNzhKk2k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;638&quot; height=&quot;282&quot; data-origin-width=&quot;638&quot; data-origin-height=&quot;282&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;위와 같은 폴더가 나올 것인데, 상위 폴더로 이동하면 아래와 같은 폴더를 볼 수 있다. 이 폴더에 include, bin, lib 라는 이름의 빈 폴더를 생성할 것이다.&amp;nbsp; &amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;645&quot; data-origin-height=&quot;223&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bdwAFK/btsDnuhVejw/L0nRoy5JCI54vU9JNOOI41/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bdwAFK/btsDnuhVejw/L0nRoy5JCI54vU9JNOOI41/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bdwAFK/btsDnuhVejw/L0nRoy5JCI54vU9JNOOI41/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbdwAFK%2FbtsDnuhVejw%2FL0nRoy5JCI54vU9JNOOI41%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;645&quot; height=&quot;223&quot; data-origin-width=&quot;645&quot; data-origin-height=&quot;223&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;602&quot; data-origin-height=&quot;279&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cLVw0Z/btsDlBCdScz/nwCfBTGv5fSHFOJ0uc9Zv0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cLVw0Z/btsDlBCdScz/nwCfBTGv5fSHFOJ0uc9Zv0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cLVw0Z/btsDlBCdScz/nwCfBTGv5fSHFOJ0uc9Zv0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcLVw0Z%2FbtsDlBCdScz%2FnwCfBTGv5fSHFOJ0uc9Zv0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;628&quot; height=&quot;291&quot; data-origin-width=&quot;602&quot; data-origin-height=&quot;279&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. 이제 다운 받았던 파일에서 파일을 복사해올 것이다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4.1.1 include &amp;gt; GL &amp;gt; freeglut.h, freeglut_ext.h, freeglut_std.h, glut.h 파일들을 복사해서 include 폴더에 붙여넣기를 한다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;623&quot; data-origin-height=&quot;289&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/5ZhVB/btsDnvaqblP/Cy68G6s7YvLEtCyVnznzg1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/5ZhVB/btsDnvaqblP/Cy68G6s7YvLEtCyVnznzg1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/5ZhVB/btsDnvaqblP/Cy68G6s7YvLEtCyVnznzg1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F5ZhVB%2FbtsDnvaqblP%2FCy68G6s7YvLEtCyVnznzg1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;623&quot; height=&quot;289&quot; data-origin-width=&quot;623&quot; data-origin-height=&quot;289&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4.1.2 lib &amp;gt; x64 &amp;gt; freeglut.lib 파일을 복사하여 lib 폴더에 붙여넣기를 한다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;610&quot; data-origin-height=&quot;148&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/GUC0p/btsDogqolgV/SVsPWy1h3mwfSpkgkBgs50/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/GUC0p/btsDogqolgV/SVsPWy1h3mwfSpkgkBgs50/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/GUC0p/btsDogqolgV/SVsPWy1h3mwfSpkgkBgs50/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FGUC0p%2FbtsDogqolgV%2FSVsPWy1h3mwfSpkgkBgs50%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;610&quot; height=&quot;148&quot; data-origin-width=&quot;610&quot; data-origin-height=&quot;148&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;621&quot; data-origin-height=&quot;150&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cbEaL8/btsDmTbBzsq/zCnKPo6Xyus1tguf3Stlf1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cbEaL8/btsDmTbBzsq/zCnKPo6Xyus1tguf3Stlf1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cbEaL8/btsDmTbBzsq/zCnKPo6Xyus1tguf3Stlf1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcbEaL8%2FbtsDmTbBzsq%2FzCnKPo6Xyus1tguf3Stlf1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;621&quot; height=&quot;150&quot; data-origin-width=&quot;621&quot; data-origin-height=&quot;150&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;4.1.3 bin &amp;gt; x64 &amp;gt; freeglut.dll 파일을 복사하여 프로젝트 폴더 &amp;gt; x64 &amp;gt;Debug 폴더에 붙여넣기를 한다.&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;616&quot; data-origin-height=&quot;142&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Uz3EP/btsDmVHf0o6/Zay49JZK6doiZW5ljEfbf1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Uz3EP/btsDmVHf0o6/Zay49JZK6doiZW5ljEfbf1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Uz3EP/btsDmVHf0o6/Zay49JZK6doiZW5ljEfbf1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FUz3EP%2FbtsDmVHf0o6%2FZay49JZK6doiZW5ljEfbf1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;616&quot; height=&quot;142&quot; data-origin-width=&quot;616&quot; data-origin-height=&quot;142&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;630&quot; data-origin-height=&quot;223&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bAs2Fn/btsDlpomGyB/vkaV0yNFIkpRt7QmXK2EkK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bAs2Fn/btsDlpomGyB/vkaV0yNFIkpRt7QmXK2EkK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bAs2Fn/btsDlpomGyB/vkaV0yNFIkpRt7QmXK2EkK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbAs2Fn%2FbtsDlpomGyB%2FvkaV0yNFIkpRt7QmXK2EkK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;630&quot; height=&quot;223&quot; data-origin-width=&quot;630&quot; data-origin-height=&quot;223&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;5. 위 과정이 끝났으면 폴더에 파일을 추가하는 작업이 끝났다! 이제 우클릭 후 속성을 클릭한다.&amp;nbsp;&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;466&quot; data-origin-height=&quot;826&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/GiH0M/btsDlnqIWa0/qLSNKiUFX4wVWXVleojdk0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/GiH0M/btsDlnqIWa0/qLSNKiUFX4wVWXVleojdk0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/GiH0M/btsDlnqIWa0/qLSNKiUFX4wVWXVleojdk0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FGiH0M%2FbtsDlnqIWa0%2FqLSNKiUFX4wVWXVleojdk0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;466&quot; height=&quot;826&quot; data-origin-width=&quot;466&quot; data-origin-height=&quot;826&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;5.1. C/C++ &amp;gt; 추가 포함 디렉터리를 편집&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;$(SolutionDir)/include&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;783&quot; data-origin-height=&quot;539&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dFCiQy/btsDqiHWEOc/Jt9AKMIJ9OVA3KNkYa0gHk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dFCiQy/btsDqiHWEOc/Jt9AKMIJ9OVA3KNkYa0gHk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dFCiQy/btsDqiHWEOc/Jt9AKMIJ9OVA3KNkYa0gHk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdFCiQy%2FbtsDqiHWEOc%2FJt9AKMIJ9OVA3KNkYa0gHk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;783&quot; height=&quot;539&quot; data-origin-width=&quot;783&quot; data-origin-height=&quot;539&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;546&quot; data-origin-height=&quot;405&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/7XcKq/btsDqbIZ925/muKlgjqib8Fy2kb0GjwqY1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/7XcKq/btsDqbIZ925/muKlgjqib8Fy2kb0GjwqY1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/7XcKq/btsDqbIZ925/muKlgjqib8Fy2kb0GjwqY1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F7XcKq%2FbtsDqbIZ925%2FmuKlgjqib8Fy2kb0GjwqY1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;781&quot; height=&quot;579&quot; data-origin-width=&quot;546&quot; data-origin-height=&quot;405&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;5.2. 링커 추가 라이브러리 디렉터리 편집&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$(SolutionDir)/lib&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;775&quot; data-origin-height=&quot;533&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/caIZcc/btsDnzRtbas/fHrge9mOHUIESPeh195iz1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/caIZcc/btsDnzRtbas/fHrge9mOHUIESPeh195iz1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/caIZcc/btsDnzRtbas/fHrge9mOHUIESPeh195iz1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcaIZcc%2FbtsDnzRtbas%2FfHrge9mOHUIESPeh195iz1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;775&quot; height=&quot;533&quot; data-origin-width=&quot;775&quot; data-origin-height=&quot;533&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;542&quot; data-origin-height=&quot;403&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b0l4Yv/btsDmUu1IKT/oFi8S1DJrM5L7HKnCAUVp1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b0l4Yv/btsDmUu1IKT/oFi8S1DJrM5L7HKnCAUVp1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b0l4Yv/btsDmUu1IKT/oFi8S1DJrM5L7HKnCAUVp1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb0l4Yv%2FbtsDmUu1IKT%2FoFi8S1DJrM5L7HKnCAUVp1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;542&quot; height=&quot;403&quot; data-origin-width=&quot;542&quot; data-origin-height=&quot;403&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;5.3. 입력 &amp;gt; 추가 종속성 편집&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;freeglut.lib&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;775&quot; data-origin-height=&quot;534&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/HwMhj/btsDmphwoQ5/RFXKsuB4oQKJmjMDG4ZK10/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/HwMhj/btsDmphwoQ5/RFXKsuB4oQKJmjMDG4ZK10/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/HwMhj/btsDmphwoQ5/RFXKsuB4oQKJmjMDG4ZK10/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FHwMhj%2FbtsDmphwoQ5%2FRFXKsuB4oQKJmjMDG4ZK10%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;775&quot; height=&quot;534&quot; data-origin-width=&quot;775&quot; data-origin-height=&quot;534&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;539&quot; data-origin-height=&quot;401&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/5NVYh/btsDny562HV/kGPHozKv1sZFkVdpMtKrkk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/5NVYh/btsDny562HV/kGPHozKv1sZFkVdpMtKrkk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/5NVYh/btsDny562HV/kGPHozKv1sZFkVdpMtKrkk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F5NVYh%2FbtsDny562HV%2FkGPHozKv1sZFkVdpMtKrkk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;539&quot; height=&quot;401&quot; data-origin-width=&quot;539&quot; data-origin-height=&quot;401&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;6. 예제 코드 실행&amp;nbsp;&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1705041438775&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;glut.h&amp;gt;
#include &amp;lt;GL/gl.h&amp;gt;
#include &amp;lt;GL/glu.h&amp;gt;

void MyDisplay()
{
	glClear(GL_COLOR_BUFFER_BIT);
	glutWireTeapot(0.5);
	glFlush();
}

int main(int argc, char* argv[])
{
	glutInit(&amp;amp;argc, argv);
	glutCreateWindow(&quot;OpenGLg Example&quot;);
	glutDisplayFunc(MyDisplay);
	glutMainLoop();
	return 0;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;300&quot; data-origin-height=&quot;329&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Tmg3h/btsDogRFhm7/bNLkvv31A8WX6B7ikIlVE0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Tmg3h/btsDogRFhm7/bNLkvv31A8WX6B7ikIlVE0/img.png&quot; data-alt=&quot;위와 같은 화면이 나오면 성공&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Tmg3h/btsDogRFhm7/bNLkvv31A8WX6B7ikIlVE0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FTmg3h%2FbtsDogRFhm7%2FbNLkvv31A8WX6B7ikIlVE0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;329&quot; data-origin-width=&quot;300&quot; data-origin-height=&quot;329&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;위와 같은 화면이 나오면 성공&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;수고했습니다.&lt;/h4&gt;</description>
      <category>Computer Science/LearnOpenGL</category>
      <category>opengl</category>
      <author>JIWANSEO</author>
      <guid isPermaLink="true">https://ordinary-student-study-record.tistory.com/60</guid>
      <comments>https://ordinary-student-study-record.tistory.com/60#entry60comment</comments>
      <pubDate>Fri, 12 Jan 2024 15:39:55 +0900</pubDate>
    </item>
    <item>
      <title>[LearnOpenGL] 6.Shader</title>
      <link>https://ordinary-student-study-record.tistory.com/59</link>
      <description>&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;shader는 GPU에 위치한 작은 프로그램이며, 그래픽 파이프라인의 각 특정 섹션에 대해 실행된다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;기본적으로 Input -&amp;gt; Output으로 변환하는 프로그램에 불과하다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;또한 서로 통신할 수 없는 매우 격리된 프로그램으로, 유일한 소통 수단이라면 Input과 Output밖에 없다.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/blockquote&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. GLSL&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&amp;nbsp;shader는 C와 유사한 언어인 &lt;span style=&quot;color: #ee2323;&quot;&gt;GLSL&lt;/span&gt;로 작성된다. GLSL은 그래픽과 함께 사용하기 만들어진 언어로,&amp;nbsp;&lt;br /&gt;&lt;u&gt;&lt;b&gt;벡터 및 행렬 조작에 특화된 유용한 기능을 포함&lt;/b&gt;&lt;/u&gt;한다.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;shader는 항상 버전 선언으로 시작하며, 입출력 변수, 유니폼 목록 그리고 주 함수가 따른다. 각 shader의 진입점은 main 함수이며, 여기에서 입력 변수를 처리하고 결과를 출력 변수에 저장한다.&lt;/li&gt;
&lt;li&gt;shader는 일반적으로 다음과 같은 구조를 가진다:&amp;nbsp;&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1699885973396&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#version version_number
in type in_variable_name;
in type in_variable_name;

out type out_variable_name;

uniform type uniform_name;

void main()
{
	// 입력을 처리하고 특정한 그래픽 작업을 수행
	//...
	// 처리된 내용을 출력 변수에 출력
	out_variable_name = weird_stuff_
}&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;vertex shader에서 각 입력 변수는 vertex attribute라고도 한다.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;하드웨어에 의해 제한되는 vertex attribute를 선언할 수 있는 최대값이 있다. OpenGL은 항상 적어도 16개의 구성 요소 vertex attribute를 사용할 수 있도록 보장하지만, 일부 하드웨어는 더 많은 속성을 사용할 수 있도록 GL_MAX_VERTEX_ATTRIBS를 쿼리하여 얻을 수 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1699886383078&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;int nrAttributes;
glGetIntegerv(GL_MAX_VERTEX_ATTRIBS, &amp;amp;nrAttributes);
cout &amp;lt;&amp;lt; &quot;MAximum nr of vertex attributes supported:&quot; &amp;lt;&amp;lt; nrAttributes &amp;lt;&amp;lt; &quot;\n&quot;;&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;이는 보통 16의 최솟값을 반환하며, 이는 대부분의 용도에 충분해야 한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2. Types&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;GLSL은 어떤 종류의 변수를 사용할지 지정하는 데이터 유형을 갖고 있다.&lt;/li&gt;
&lt;li&gt;GLSL에는&amp;nbsp; int, float, double, uint 및 bool 등의 기본 유형이 있다.&lt;/li&gt;
&lt;li&gt;GLSL에는 우리가 자주 사용할 두 가지 컨테이너 유형인 &lt;span style=&quot;color: #ee2323;&quot;&gt;벡터&lt;/span&gt;와 &lt;span style=&quot;color: #ee2323;&quot;&gt;행렬&lt;/span&gt;이 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2.1 Vectors&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;GLSL에서 벡터는 이전에 언급한 기본 유형 중 어떤 것이든 1, 2, 3, 구성 요소를 가진 컨테이너다. 다음 형식을 취할 수 있다. (n은 구성 요소 수를 나타냄) :
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;vecn&lt;/b&gt;: n개의 부동 소수점을 가진 기본 벡터&lt;/li&gt;
&lt;li&gt;&lt;b&gt;bvecn&lt;/b&gt;: n개의 부울 값을 가진 벡터&lt;/li&gt;
&lt;li&gt;&lt;b&gt;ivecn&lt;/b&gt;: n개의 정수 값을 가진 벡터&lt;/li&gt;
&lt;li&gt;&lt;b&gt;uvecn&lt;/b&gt;: n개의 부호 없는 정수 값을 가진 벡터&lt;/li&gt;
&lt;li&gt;&lt;b&gt;dvecn&lt;/b&gt;: n개의 더블 구성 요소를 가진 벡터
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;대부분의 경우 대부분의 목적에는 부동 소수점이 충분하기 때문에 기본 &lt;span style=&quot;color: #ee2323;&quot;&gt;vecn&lt;/span&gt;을 사용한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;벡터의 구성 요소는 vec.x와 같이 vec의 첫 번째 구성 요소를 통해 접근할 수 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;추후 수정 예정&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>Computer Science/LearnOpenGL</category>
      <author>JIWANSEO</author>
      <guid isPermaLink="true">https://ordinary-student-study-record.tistory.com/59</guid>
      <comments>https://ordinary-student-study-record.tistory.com/59#entry59comment</comments>
      <pubDate>Mon, 13 Nov 2023 23:49:22 +0900</pubDate>
    </item>
    <item>
      <title>[C++][BOJ][18870] 좌표압축</title>
      <link>https://ordinary-student-study-record.tistory.com/58</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;799&quot; data-origin-height=&quot;820&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/7dosf/btsAjS6HUa6/M9WfMaopMub6k3KsQFbIe1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/7dosf/btsAjS6HUa6/M9WfMaopMub6k3KsQFbIe1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/7dosf/btsAjS6HUa6/M9WfMaopMub6k3KsQFbIe1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F7dosf%2FbtsAjS6HUa6%2FM9WfMaopMub6k3KsQFbIe1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;799&quot; height=&quot;820&quot; data-origin-width=&quot;799&quot; data-origin-height=&quot;820&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;- 좌표 압축이란?&amp;nbsp;&amp;nbsp;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;수의 범위가 큰 상태에서 수의 값과 관계 없이 숫자들 간의 대소관계만 필요 시 이용하는 알고리즘이라고 한다.&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;- 필요 함수&amp;nbsp;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-ke-style=&quot;style2&quot;&gt;unique 함수 : 중복되지 않는 원소들을 앞에서부터 채워나가는 함수이다.&lt;/li&gt;
&lt;li&gt;earse 함수 :&amp;nbsp; vector 배열에서 특정 원소를 삭제하는 함수이다.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;lower_bound 함수 : 찾으려는 key 값보다 같거나 큰 숫자가 배열 몇 번째에서 첫 등장하는지 찾기 위함이다. (탐색을 진행할 배열 또는 벡터가 오름차순 정렬되어 있어야 한다)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;- 풀이&amp;nbsp;&lt;/h2&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&amp;nbsp;먼저 input 받을 배열을 동적 할당으로 선언한다.&lt;/li&gt;
&lt;li&gt;압축할 배열을 vector로 만들어 선언한다.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;두 배열에 모두 값을 입력 받아 넣는다.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;압축 배열을 오름차순 정렬한 후, erase와 unique함수를 사용하여 중복된 원소를 제거한다.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;lower_bound 함수를 사용하여 원본 배열의 원소보다 작은 값이 몇 개 있는지 출력한다.&amp;nbsp;&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;코드&amp;nbsp;&lt;/h2&gt;
&lt;pre id=&quot;code_1699879406182&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;iostream&amp;gt;
#include &amp;lt;algorithm&amp;gt;
#include &amp;lt;vector&amp;gt;
using namespace std;

vector&amp;lt;int&amp;gt; v; //압축 배열 

int main()
{
	ios_base::sync_with_stdio(false); cin.tie(NULL);
	int n; cin &amp;gt;&amp;gt; n;
	int* arr = new int[n];
	for (int i = 0, value; i &amp;lt; n; i++)
	{
		cin &amp;gt;&amp;gt; value;
		arr[i] = value; //원본 배열 
		v.push_back(value);
	}
	//오름차순 정렬 후 중복된 원소를 제거한다.
	sort(v.begin(), v.end());
	v.erase(unique(v.begin(), v.end()), v.end());
	//입력 배열의 요소값과 같은 압축 배열의 요소값을 탐색 
	for (int i = 0; i &amp;lt; n; i++)
	{
		int idx = lower_bound(v.begin(), v.end(), arr[i]) - v.begin();
		cout &amp;lt;&amp;lt; idx &amp;lt;&amp;lt; &quot; &quot;;
	}
	return 0;
}&lt;/code&gt;&lt;/pre&gt;</description>
      <category>백준</category>
      <category>BOJ</category>
      <category>C++</category>
      <author>JIWANSEO</author>
      <guid isPermaLink="true">https://ordinary-student-study-record.tistory.com/58</guid>
      <comments>https://ordinary-student-study-record.tistory.com/58#entry58comment</comments>
      <pubDate>Mon, 13 Nov 2023 21:43:48 +0900</pubDate>
    </item>
    <item>
      <title>[C++][BOJ][29018] クレヨンの並べ替え</title>
      <link>https://ordinary-student-study-record.tistory.com/57</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;804&quot; data-origin-height=&quot;684&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/czGw4M/btsz93HTJnM/SLi6zit1pEeyji5k7b5p80/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/czGw4M/btsz93HTJnM/SLi6zit1pEeyji5k7b5p80/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/czGw4M/btsz93HTJnM/SLi6zit1pEeyji5k7b5p80/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FczGw4M%2Fbtsz93HTJnM%2FSLi6zit1pEeyji5k7b5p80%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;804&quot; height=&quot;684&quot; data-origin-width=&quot;804&quot; data-origin-height=&quot;684&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;772&quot; data-origin-height=&quot;156&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cVTgoE/btsAc6cLizJ/rDnkyJmQHg3fgOqsd1jvG1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cVTgoE/btsAc6cLizJ/rDnkyJmQHg3fgOqsd1jvG1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cVTgoE/btsAc6cLizJ/rDnkyJmQHg3fgOqsd1jvG1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcVTgoE%2FbtsAc6cLizJ%2FrDnkyJmQHg3fgOqsd1jvG1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;772&quot; height=&quot;156&quot; data-origin-width=&quot;772&quot; data-origin-height=&quot;156&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일본어로 되어 있어서, 한국어로 번역해서 문제를 풀었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;입력에 공백없이 문자열이 들어오게 되면, 출력으로 알파벳 소문자, 대문자, 숫자 순으로 정렬하면 되는 간단한 문제이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;먼저 문자열을 정렬하게 되면, 숫자 , 대문자, 소문자 순으로 정렬이 된다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;알파벳 소문자인지 구분하기 위해 islower(), 대문자인지 구별하기 위해 isupper(), 숫자인지 구별하기 위해 isdigit()을 사용했다. 각각 판별한 후 소문자, 대문자, 숫자 string에 붙여넣었고, 탐색이 끝나면, arr에 string을 붙여서 출력하게 된다.&lt;/p&gt;
&lt;pre id=&quot;code_1699706880239&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;iostream&amp;gt;
#include &amp;lt;algorithm&amp;gt;
#define MAX 100002
using namespace std;


int main()
{
	ios_base::sync_with_stdio(false);
	cin.tie(NULL);
	char str1 = '#';
	while (1)
	{
		string lowercase;
		string uppercase;
		string num;

		string arr; cin &amp;gt;&amp;gt; arr;
		if (arr==&quot;#&quot;) break;
		sort(arr.begin(), arr.end());
		for (char ch : arr)
		{
			if (islower(ch))
			{
				lowercase+= ch;
			}
			else if (isupper(ch))
			{
				uppercase += ch;
			}
			else if (isdigit(ch))
			{
				num += ch;
			}
		}
		arr = lowercase + uppercase + num;
		cout &amp;lt;&amp;lt; arr &amp;lt;&amp;lt; endl;
	}
	return 0;
}&lt;/code&gt;&lt;/pre&gt;</description>
      <category>백준</category>
      <category>BOJ</category>
      <category>C++</category>
      <author>JIWANSEO</author>
      <guid isPermaLink="true">https://ordinary-student-study-record.tistory.com/57</guid>
      <comments>https://ordinary-student-study-record.tistory.com/57#entry57comment</comments>
      <pubDate>Sat, 11 Nov 2023 21:48:53 +0900</pubDate>
    </item>
    <item>
      <title>[C++][BOJ][11399]  ATM</title>
      <link>https://ordinary-student-study-record.tistory.com/56</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;932&quot; data-origin-height=&quot;806&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dqeMSp/btszUzNgAaI/ONQpXpJBPnNVL5Y2dNEdR0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dqeMSp/btszUzNgAaI/ONQpXpJBPnNVL5Y2dNEdR0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dqeMSp/btszUzNgAaI/ONQpXpJBPnNVL5Y2dNEdR0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdqeMSp%2FbtszUzNgAaI%2FONQpXpJBPnNVL5Y2dNEdR0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;932&quot; height=&quot;806&quot; data-origin-width=&quot;932&quot; data-origin-height=&quot;806&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 풀이&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;간단한 정렬 문제였지만, 나는 복잡하게 map까지 써서 좀 해맸다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다시 코드를 다 지우고, 코드를 재작성하니 결과가 나왔다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1699271667548&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;iostream&amp;gt;
#include &amp;lt;algorithm&amp;gt;
using namespace std;
#define MAX 1002 
int arr[MAX];

int main()
{
	ios_base::sync_with_stdio(false); cin.tie(NULL);
	int N; cin &amp;gt;&amp;gt; N;
	int sum=0, res=0;

	for (int i = 0; i &amp;lt; N; i++)
	{
		cin &amp;gt;&amp;gt; arr[i];
	}

	//sort 
	sort(arr, arr + N);

	for (int i = 0; i &amp;lt; N; i++)
	{
		sum += arr[i];
		res += sum;
	}
	cout &amp;lt;&amp;lt; res &amp;lt;&amp;lt; &quot;\n&quot;;
	return 0;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>백준</category>
      <category>C++</category>
      <author>JIWANSEO</author>
      <guid isPermaLink="true">https://ordinary-student-study-record.tistory.com/56</guid>
      <comments>https://ordinary-student-study-record.tistory.com/56#entry56comment</comments>
      <pubDate>Mon, 6 Nov 2023 20:55:11 +0900</pubDate>
    </item>
    <item>
      <title>[C++][BOJ][10773] 제로</title>
      <link>https://ordinary-student-study-record.tistory.com/55</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1034&quot; data-origin-height=&quot;1269&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/8BTWp/btsrBOTZTrT/Ypwo3PGd8128oiPTIkB4i0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/8BTWp/btsrBOTZTrT/Ypwo3PGd8128oiPTIkB4i0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/8BTWp/btsrBOTZTrT/Ypwo3PGd8128oiPTIkB4i0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F8BTWp%2FbtsrBOTZTrT%2FYpwo3PGd8128oiPTIkB4i0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1034&quot; height=&quot;1269&quot; data-origin-width=&quot;1034&quot; data-origin-height=&quot;1269&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;알게된 점&amp;nbsp;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스택을 활용할 수 있었다.&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;코드&amp;nbsp;&lt;/h2&gt;
&lt;pre id=&quot;code_1692522114376&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;iostream&amp;gt;
#include &amp;lt;stack&amp;gt;
using namespace std;

int main(int argc, char* argv[]) {
	ios_base::sync_with_stdio(false);
	cin.tie(0); cout.tie(0);
	stack&amp;lt;int&amp;gt; s;
	int k; cin &amp;gt;&amp;gt; k;
	for (int i = 0; i &amp;lt; k; i++) {
		int num; cin &amp;gt;&amp;gt; num;
		if (num == 0) s.pop();
		else s.push(num);
	}
	int result=0;
	int sz = s.size();
	for (int i = 0; i &amp;lt; sz; i++) {
		result += s.top();
		s.pop();
	}
	cout &amp;lt;&amp;lt; result;
	return 0;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>백준</category>
      <category>BOJ</category>
      <category>C++</category>
      <author>JIWANSEO</author>
      <guid isPermaLink="true">https://ordinary-student-study-record.tistory.com/55</guid>
      <comments>https://ordinary-student-study-record.tistory.com/55#entry55comment</comments>
      <pubDate>Sun, 20 Aug 2023 18:03:04 +0900</pubDate>
    </item>
    <item>
      <title>[C++][BOJ][1920] 수 찾기</title>
      <link>https://ordinary-student-study-record.tistory.com/54</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1045&quot; data-origin-height=&quot;959&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cBCltG/btsrBoufPrZ/l1xq4Q9zn2Dk5WbcoxqJm0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cBCltG/btsrBoufPrZ/l1xq4Q9zn2Dk5WbcoxqJm0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cBCltG/btsrBoufPrZ/l1xq4Q9zn2Dk5WbcoxqJm0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcBCltG%2FbtsrBoufPrZ%2Fl1xq4Q9zn2Dk5WbcoxqJm0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1045&quot; height=&quot;959&quot; data-origin-width=&quot;1045&quot; data-origin-height=&quot;959&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;알게된 점&amp;nbsp;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;시간 복잡도를 줄이기 위해, 퀵 정렬을 사용하여 해결하였다.&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;코드&amp;nbsp;&lt;/h2&gt;
&lt;pre id=&quot;code_1692520715820&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;iostream&amp;gt;
#include &amp;lt;algorithm&amp;gt;
using namespace std;

#define MAX 100002
int arr[MAX];
int n, m, num;

void search(int num) {
	int start = 0;
	int end = n - 1;
	int mid;

	while (start &amp;lt;= end) {
		mid = (start + end) / 2;

		if (arr[mid] == num) {
			cout &amp;lt;&amp;lt; 1 &amp;lt;&amp;lt; '\n';
			return;
		}
		else if (arr[mid] &amp;lt; num) {
			start = mid + 1;
		}
		else if (arr[mid] &amp;gt; num) {
			end = mid - 1;
		}
	}
	cout &amp;lt;&amp;lt; 0 &amp;lt;&amp;lt; '\n';
	return;
}

int main(int argc, char* arg[]) {
	ios_base::sync_with_stdio(false);
	cin.tie(0); cout.tie(0);

	bool flag = false;

	cin &amp;gt;&amp;gt; n;
	for (int i = 0; i &amp;lt; n; i++) {
		cin &amp;gt;&amp;gt; arr[i];
	}
	sort(arr, arr + n);

	cin &amp;gt;&amp;gt; m;
	for (int i = 0; i &amp;lt; m; i++) {
		cin &amp;gt;&amp;gt; num;
		search(num);
	}
	return 0;
}&lt;/code&gt;&lt;/pre&gt;</description>
      <category>백준</category>
      <category>BOJ#C++</category>
      <author>JIWANSEO</author>
      <guid isPermaLink="true">https://ordinary-student-study-record.tistory.com/54</guid>
      <comments>https://ordinary-student-study-record.tistory.com/54#entry54comment</comments>
      <pubDate>Sun, 20 Aug 2023 17:38:54 +0900</pubDate>
    </item>
    <item>
      <title>[C++][BOJ][2775]부녀회장이 될테야</title>
      <link>https://ordinary-student-study-record.tistory.com/53</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1052&quot; data-origin-height=&quot;1168&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mouI5/btsro8d96Uw/LCVOyuDx9KWMj9EkKoPJz1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mouI5/btsro8d96Uw/LCVOyuDx9KWMj9EkKoPJz1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mouI5/btsro8d96Uw/LCVOyuDx9KWMj9EkKoPJz1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmouI5%2Fbtsro8d96Uw%2FLCVOyuDx9KWMj9EkKoPJz1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1052&quot; height=&quot;1168&quot; data-origin-width=&quot;1052&quot; data-origin-height=&quot;1168&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;알게된 점&amp;nbsp;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;점화식을 끌어오는데 시간이 조금 걸렸다.&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;코드&amp;nbsp;&lt;/h2&gt;
&lt;pre id=&quot;code_1692258833387&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;iostream&amp;gt;
using namespace std;

#define m 14
#define n 14
int apart[m+1][n+1];
int t, x, y;

void res(){
    //0층 
    for (int i = 1; i &amp;lt;= m; i++){
        apart[0][i] = i;
    }
    // 1층~14층
    for (int j = 1; j &amp;lt;= m; j++){
        for (int i = 1; i &amp;lt;= n; i++){
            apart[j][i] = apart[j - 1][i] + apart[j][i - 1];
        }
    }
}

int main(int arg,char*argv[]){
    ios_base::sync_with_stdio(0);
    cin.tie(0); cout.tie(0);
    cin &amp;gt;&amp;gt; t;
    res();
    for (int i = 0; i &amp;lt; t; i++){
        cin &amp;gt;&amp;gt; x &amp;gt;&amp;gt; y;
        cout &amp;lt;&amp;lt; apart[x][y] &amp;lt;&amp;lt; endl;
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>백준</category>
      <category>BOJ#C++</category>
      <author>JIWANSEO</author>
      <guid isPermaLink="true">https://ordinary-student-study-record.tistory.com/53</guid>
      <comments>https://ordinary-student-study-record.tistory.com/53#entry53comment</comments>
      <pubDate>Thu, 17 Aug 2023 16:55:01 +0900</pubDate>
    </item>
    <item>
      <title>[C++][BOJ][1003] 피보나치 함수</title>
      <link>https://ordinary-student-study-record.tistory.com/52</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;925&quot; data-origin-height=&quot;1266&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dty0lL/btspOyYnxaz/uGBavI7cWyfwCTJiQrXBkK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dty0lL/btspOyYnxaz/uGBavI7cWyfwCTJiQrXBkK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dty0lL/btspOyYnxaz/uGBavI7cWyfwCTJiQrXBkK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdty0lL%2FbtspOyYnxaz%2FuGBavI7cWyfwCTJiQrXBkK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;925&quot; height=&quot;1266&quot; data-origin-width=&quot;925&quot; data-origin-height=&quot;1266&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;알게된 점&amp;nbsp;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;처음 시도할 때는 재귀 형식으로 제출했다. 재귀로 하니 시간 초과가 떠서, 다른 방법을 찾아야 했다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;dp 테이블을 따로 만들어서 시간 초과 없이 해결할 수 있었다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;코드&amp;nbsp;&lt;/h2&gt;
&lt;pre id=&quot;code_1690938889060&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;iostream&amp;gt;
using namespace std;

#define Max_N 41

int dp[Max_N][2],N;

int main(int argc, char* argv[])
{
	ios_base::sync_with_stdio(false);
	cin.tie(0); cout.tie(0);
	
	int t; cin &amp;gt;&amp;gt; t; //test case 
	
	dp[0][0] = 1; dp[0][1] = 0;
	dp[1][0] = 0; dp[1][1] = 1;

	for (int i = 2; i &amp;lt; Max_N; i++)
	{
		dp[i][0] = dp[i - 2][0] + dp[i - 1][0];
		dp[i][1] = dp[i - 2][1] + dp[i - 1][1];
	}

	while (t--) {
		cin &amp;gt;&amp;gt; N;
		cout &amp;lt;&amp;lt; dp[N][0] &amp;lt;&amp;lt; &quot; &quot; &amp;lt;&amp;lt; dp[N][1] &amp;lt;&amp;lt; &quot;\n&quot;;
	}
	return 0;
}&lt;/code&gt;&lt;/pre&gt;</description>
      <category>백준</category>
      <category>C++ #BOJ</category>
      <author>JIWANSEO</author>
      <guid isPermaLink="true">https://ordinary-student-study-record.tistory.com/52</guid>
      <comments>https://ordinary-student-study-record.tistory.com/52#entry52comment</comments>
      <pubDate>Wed, 2 Aug 2023 10:16:41 +0900</pubDate>
    </item>
    <item>
      <title>[C++][BOJ][2748]  피보나치 수 2</title>
      <link>https://ordinary-student-study-record.tistory.com/51</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1161&quot; data-origin-height=&quot;881&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b5dAzI/btspE4coPvr/jD0957A55UoISrMaFNZNsk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b5dAzI/btspE4coPvr/jD0957A55UoISrMaFNZNsk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b5dAzI/btspE4coPvr/jD0957A55UoISrMaFNZNsk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb5dAzI%2FbtspE4coPvr%2FjD0957A55UoISrMaFNZNsk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1161&quot; height=&quot;881&quot; data-origin-width=&quot;1161&quot; data-origin-height=&quot;881&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;알게된 점&amp;nbsp;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;int 형을 쓰면 시간 초과가 나기 때문에 long long 형으로 써야 한다.&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;코드&amp;nbsp;&lt;/h2&gt;
&lt;pre id=&quot;code_1690859768710&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;iostream&amp;gt;
using namespace std;

long long f[100] = { 0,1, };

long long fib(int n) {
        if (n == 1 || n == 2)
            return 1;
        else if(f[n]==0)
            f[n]= fib(n - 1) + fib(n - 2);
        return f[n];
}

int main(int argc, char* argv[])
{
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);

    int n; cin &amp;gt;&amp;gt; n;

    cout &amp;lt;&amp;lt; fib(n);
}&lt;/code&gt;&lt;/pre&gt;</description>
      <category>백준</category>
      <category>C++ #BOJ</category>
      <author>JIWANSEO</author>
      <guid isPermaLink="true">https://ordinary-student-study-record.tistory.com/51</guid>
      <comments>https://ordinary-student-study-record.tistory.com/51#entry51comment</comments>
      <pubDate>Tue, 1 Aug 2023 12:17:25 +0900</pubDate>
    </item>
    <item>
      <title>[C++][BOJ][24416] 알고리즘 수업 - 피보나치 수 1</title>
      <link>https://ordinary-student-study-record.tistory.com/50</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1050&quot; data-origin-height=&quot;1152&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/x4Ag8/btspxrePVlx/2DbpBV6Ud8HYYTKYkZCipk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/x4Ag8/btspxrePVlx/2DbpBV6Ud8HYYTKYkZCipk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/x4Ag8/btspxrePVlx/2DbpBV6Ud8HYYTKYkZCipk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fx4Ag8%2FbtspxrePVlx%2F2DbpBV6Ud8HYYTKYkZCipk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1050&quot; height=&quot;1152&quot; data-origin-width=&quot;1050&quot; data-origin-height=&quot;1152&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;알게된 점&amp;nbsp;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;코드&amp;nbsp;&lt;/h2&gt;
&lt;pre id=&quot;code_1690859015211&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;iostream&amp;gt;
using namespace std;

int f[42];
int cnt = 0;;

//code 1
int fib(int n) {
    if (n == 1 || n == 2)
        return 1;
    else
        cnt++;
        return (fib(n - 1) + fib(n - 2));
}

//code 2
int fibonacci(int n) {
    f[1] = f[2]=  1;
    cnt = 1;
    for (int i =  3; i &amp;lt; n; i++) {
        f[i] = f[i - 1] + f[i - 2];
        cnt++;
    }
    return cnt;
}

int main(int argc, char* argv[])
{
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);

    int n; cin &amp;gt;&amp;gt; n;

    cout &amp;lt;&amp;lt; fib(n) &amp;lt;&amp;lt; &quot; &quot; &amp;lt;&amp;lt; fibonacci(n);
}&lt;/code&gt;&lt;/pre&gt;</description>
      <category>백준</category>
      <category>C++ #BOJ</category>
      <author>JIWANSEO</author>
      <guid isPermaLink="true">https://ordinary-student-study-record.tistory.com/50</guid>
      <comments>https://ordinary-student-study-record.tistory.com/50#entry50comment</comments>
      <pubDate>Tue, 1 Aug 2023 12:03:45 +0900</pubDate>
    </item>
    <item>
      <title>[C++][BOJ][2839] 설탕 배달</title>
      <link>https://ordinary-student-study-record.tistory.com/49</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;855&quot; data-origin-height=&quot;885&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cdMPtM/btspmLk5bfS/zGJheaYv2mbAiplSSK4Vr0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cdMPtM/btspmLk5bfS/zGJheaYv2mbAiplSSK4Vr0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cdMPtM/btspmLk5bfS/zGJheaYv2mbAiplSSK4Vr0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcdMPtM%2FbtspmLk5bfS%2FzGJheaYv2mbAiplSSK4Vr0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;855&quot; height=&quot;885&quot; data-origin-width=&quot;855&quot; data-origin-height=&quot;885&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;알게된 점&amp;nbsp;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;코드&amp;nbsp;&lt;/h2&gt;
&lt;pre id=&quot;code_1690812899679&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;iostream&amp;gt;
using namespace std;

int main(int argc, char*argv[]) {
    int N, cnt = 0; cin &amp;gt;&amp;gt; N;
    
    while (1) {
        if (N % 5 == 0) {
            cnt += N / 5;
            break;
        }

        N -= 3;
        cnt++;
        if (N &amp;lt;= 0) break;
    }

    if (N &amp;lt; 0) cout &amp;lt;&amp;lt; -1;
    else cout &amp;lt;&amp;lt; cnt;
}&lt;/code&gt;&lt;/pre&gt;</description>
      <category>백준</category>
      <category>C++ #BOJ</category>
      <author>JIWANSEO</author>
      <guid isPermaLink="true">https://ordinary-student-study-record.tistory.com/49</guid>
      <comments>https://ordinary-student-study-record.tistory.com/49#entry49comment</comments>
      <pubDate>Mon, 31 Jul 2023 23:15:24 +0900</pubDate>
    </item>
    <item>
      <title>[C++][BOJ][2869] 달팽이는 올라가고 싶다</title>
      <link>https://ordinary-student-study-record.tistory.com/48</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;849&quot; data-origin-height=&quot;841&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/BDwsg/btsplp9YUDm/dPpMq9SwkctsSs8yLZHF3K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/BDwsg/btsplp9YUDm/dPpMq9SwkctsSs8yLZHF3K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/BDwsg/btsplp9YUDm/dPpMq9SwkctsSs8yLZHF3K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FBDwsg%2Fbtsplp9YUDm%2FdPpMq9SwkctsSs8yLZHF3K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;849&quot; height=&quot;841&quot; data-origin-width=&quot;849&quot; data-origin-height=&quot;841&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;알게된 점&amp;nbsp;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;규칙을 찾을 때 시간이 좀 걸렸다.&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;코드&lt;/h2&gt;
&lt;pre id=&quot;code_1690693061521&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;iostream&amp;gt;
using namespace std;

int main(int argc,char*argv[]) {
    int a, b, v; cin &amp;gt;&amp;gt; a &amp;gt;&amp;gt; b &amp;gt;&amp;gt; v;
    int day = 1;
    day += (v - a) / (a - b); // (v-a)/(a-b)만큼 이동
    
    if ((v - a) % (a - b) != 0) day++;
    
    if (a &amp;gt;= v) {
        cout &amp;lt;&amp;lt; &quot;1&quot;;
    }
    else {
        cout &amp;lt;&amp;lt; day;
    } 
    return 0;
}&lt;/code&gt;&lt;/pre&gt;</description>
      <category>백준</category>
      <category>BOJ #C++</category>
      <author>JIWANSEO</author>
      <guid isPermaLink="true">https://ordinary-student-study-record.tistory.com/48</guid>
      <comments>https://ordinary-student-study-record.tistory.com/48#entry48comment</comments>
      <pubDate>Sun, 30 Jul 2023 13:57:47 +0900</pubDate>
    </item>
    <item>
      <title>[C++][BOJ][9095] 1,2,3 더하기</title>
      <link>https://ordinary-student-study-record.tistory.com/47</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;768&quot; data-origin-height=&quot;838&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/pPDYD/btspnjHfEhh/kwMOccDxwxmnBVYvDKGCl0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/pPDYD/btspnjHfEhh/kwMOccDxwxmnBVYvDKGCl0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/pPDYD/btspnjHfEhh/kwMOccDxwxmnBVYvDKGCl0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FpPDYD%2FbtspnjHfEhh%2FkwMOccDxwxmnBVYvDKGCl0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;768&quot; height=&quot;838&quot; data-origin-width=&quot;768&quot; data-origin-height=&quot;838&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;알게된 점&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;오랜만에 dp 문제를 풀었다. 5까지 경우의 수를 구해보고, 6부터는 경우의 수를 구하기 너무 귀찮아서,&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;대충 5를 넣었을 때, 2, 3, 4의 경우를 다 더한 거라는 것을 알게 되었고, 예제에 나온 7과 10의 경우도 각각&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;7이 6 5 4의 경우를 더하고, 10을 9 8 7의 경우를 더했을 때 44, 274가 나온다면 맞는 규칙이기에 넣어봤다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;결론은 F(n)의 경우의 수는 F(N-1)+F(N-2)+F(N-3) 값이라는 알게 되어, 그에 맞는 함수를 만들어 풀었다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;코드&amp;nbsp;&lt;/h2&gt;
&lt;pre id=&quot;code_1690592020912&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;iostream&amp;gt;
using namespace std;

int result(int n) {
	if (n &amp;gt;= 4) {
		return result(n - 1) + result(n - 2) + result(n - 3);
	}
	else if (n == 3) {
		return 4;
	}
	else if (n == 2) {
		return 2;
	}
	else if (n == 1) {
		return 1;
	}
}
int main(int argc, char* argv[])
{
	ios_base::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	int num;
	int T; cin &amp;gt;&amp;gt; T;
	while (T &amp;gt; 0) {
		T--;
		cin &amp;gt;&amp;gt; num;
		cout &amp;lt;&amp;lt; result(num)&amp;lt;&amp;lt;'\n';
	}
}&lt;/code&gt;&lt;/pre&gt;</description>
      <category>백준</category>
      <category>BOJ #C++</category>
      <author>JIWANSEO</author>
      <guid isPermaLink="true">https://ordinary-student-study-record.tistory.com/47</guid>
      <comments>https://ordinary-student-study-record.tistory.com/47#entry47comment</comments>
      <pubDate>Sat, 29 Jul 2023 09:57:43 +0900</pubDate>
    </item>
    <item>
      <title>[C++][BOJ][10866] 덱</title>
      <link>https://ordinary-student-study-record.tistory.com/46</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;586&quot; data-origin-height=&quot;722&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/sIcB9/btspkKsBqiT/KOK3vWoP9P9UVYIhNMjKIK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/sIcB9/btspkKsBqiT/KOK3vWoP9P9UVYIhNMjKIK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/sIcB9/btspkKsBqiT/KOK3vWoP9P9UVYIhNMjKIK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FsIcB9%2FbtspkKsBqiT%2FKOK3vWoP9P9UVYIhNMjKIK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;586&quot; height=&quot;722&quot; data-origin-width=&quot;586&quot; data-origin-height=&quot;722&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;알게된 점&amp;nbsp;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;앞의 큐 코드를 베이스로 덱 풀이를 하였다.&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;코드&amp;nbsp;&lt;/h2&gt;
&lt;pre id=&quot;code_1690589959629&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;iostream&amp;gt;
#include &amp;lt;deque&amp;gt;
using namespace std;

int main(int argc, char* argv[])
{
	ios_base::sync_with_stdio(false);
	cin.tie(NULL);
	cout.tie(NULL);

	deque&amp;lt;int&amp;gt; dq; // deque 
	int N; cin &amp;gt;&amp;gt; N;
	string command; //명령어 
	int num; //push 연산 시, 큐에 넣을 정수 
	int result = 0; // 각 명령어의 결과 값 

	for (int i = 0; i &amp;lt; N; i++) {
		cin &amp;gt;&amp;gt; command;

		//push_front 
		if (command == &quot;push_front&quot;) {
			cin &amp;gt;&amp;gt; num;
			dq.push_front(num);
		}
		//push_front 
		else if (command == &quot;push_back&quot;) {
			cin &amp;gt;&amp;gt; num;
			dq.push_back(num);
		}
		//pop_front
		else if (command == &quot;pop_front&quot;) {
			if (dq.size() == 0) {
				result = -1;
				cout &amp;lt;&amp;lt; result &amp;lt;&amp;lt; '\n';
			}
			else {
				result = dq.front();
				dq.pop_front();
				cout &amp;lt;&amp;lt; result &amp;lt;&amp;lt; '\n';
			}
		}
		//pop_back
		else if (command == &quot;pop_back&quot;) {
			if (dq.size() == 0) {
				result = -1;
				cout &amp;lt;&amp;lt; result &amp;lt;&amp;lt; '\n';
			}
			else {
				result = dq.back();
				dq.pop_back();
				cout &amp;lt;&amp;lt; result &amp;lt;&amp;lt; '\n';
			}
		}
		//size
		else if (command == &quot;size&quot;) {
			if (dq.size() == 0) {
				result = 0;
				cout &amp;lt;&amp;lt; result &amp;lt;&amp;lt; '\n';
			}
			else {
				result = dq.size();
				cout &amp;lt;&amp;lt; result &amp;lt;&amp;lt; '\n';
			}
		}
		//empty
		else if (command == &quot;empty&quot;) {
			if (dq.size() == 0) {
				result = 1;
				cout &amp;lt;&amp;lt; result &amp;lt;&amp;lt; '\n';
			}
			else {
				result = 0;
				cout &amp;lt;&amp;lt; result &amp;lt;&amp;lt; '\n';
			}
		}
		//front
		else if (command == &quot;front&quot;) {
			if (dq.size() == 0) {
				result = -1;
				cout &amp;lt;&amp;lt; result &amp;lt;&amp;lt; '\n';
			}
			else {
				result = dq.front();
				cout &amp;lt;&amp;lt; result &amp;lt;&amp;lt; '\n';
			}
		}
		//back
		else if (command == &quot;back&quot;) {
			if (dq.size() == 0) {
				result = -1;
				cout &amp;lt;&amp;lt; result &amp;lt;&amp;lt; '\n';
			}
			else {
				result = dq.back();
				cout &amp;lt;&amp;lt; result &amp;lt;&amp;lt; '\n';
			}
		}

	}
}&lt;/code&gt;&lt;/pre&gt;</description>
      <category>백준</category>
      <category>BOJ#C++</category>
      <author>JIWANSEO</author>
      <guid isPermaLink="true">https://ordinary-student-study-record.tistory.com/46</guid>
      <comments>https://ordinary-student-study-record.tistory.com/46#entry46comment</comments>
      <pubDate>Sat, 29 Jul 2023 09:19:54 +0900</pubDate>
    </item>
    <item>
      <title>[C++][BOJ][10845] 큐</title>
      <link>https://ordinary-student-study-record.tistory.com/45</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;770&quot; data-origin-height=&quot;917&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/exh8k3/btspeIhyC7z/azFTy4yVLtbCT9UZQIXsC0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/exh8k3/btspeIhyC7z/azFTy4yVLtbCT9UZQIXsC0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/exh8k3/btspeIhyC7z/azFTy4yVLtbCT9UZQIXsC0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fexh8k3%2FbtspeIhyC7z%2FazFTy4yVLtbCT9UZQIXsC0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;770&quot; height=&quot;917&quot; data-origin-width=&quot;770&quot; data-origin-height=&quot;917&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;알게된 점&amp;nbsp;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;큐 라이브러리를 불러와, 사용할 수 있게 되었다.&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;코드&amp;nbsp;&lt;/h2&gt;
&lt;pre id=&quot;code_1690537580802&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;iostream&amp;gt;
#include &amp;lt;queue&amp;gt;
using namespace std;

int main(int argc, char* argv[])
{
	queue&amp;lt;int&amp;gt; q; // 큐 
	int N; cin &amp;gt;&amp;gt; N;
	string command; //명령어 
	int num; //push 연산 시, 큐에 넣을 정수 
	int result = 0; // 각 명령어의 결과 값 

	for (int i = 0; i &amp;lt; N; i++) {
		cin &amp;gt;&amp;gt; command;

		//push 
		if (command == &quot;push&quot;) {
			cin &amp;gt;&amp;gt; num;
			q.push(num);
		}
		//pop
		else if(command==&quot;pop&quot;){
			if (q.size() == 0) {
				result = -1;
				cout &amp;lt;&amp;lt; result &amp;lt;&amp;lt; '\n';
			}
			else {
				result = q.front();
				q.pop();
				cout &amp;lt;&amp;lt; result &amp;lt;&amp;lt; '\n';
			}
		}
		//size
		else if (command == &quot;size&quot;) {
			if (q.size() == 0) {
				result = 0;
				cout &amp;lt;&amp;lt; result &amp;lt;&amp;lt; '\n';
			}
			else {
				result = q.size();
				cout &amp;lt;&amp;lt; result &amp;lt;&amp;lt; '\n';
			}
		}
		//empty
		else if (command == &quot;empty&quot;) {
			if (q.size() == 0) {
				result = 1;
				cout &amp;lt;&amp;lt; result &amp;lt;&amp;lt; '\n';
			}
			else {
				result = 0;
				cout &amp;lt;&amp;lt; result &amp;lt;&amp;lt; '\n';
			}
		}
		//front
		else if (command == &quot;front&quot;) {
			if (q.size() == 0) {
				result = -1;
				cout &amp;lt;&amp;lt; result &amp;lt;&amp;lt; '\n';
			}
			else {
				result = q.front();
				cout &amp;lt;&amp;lt; result &amp;lt;&amp;lt; '\n';
			}
		}
		//back
		else if (command == &quot;back&quot;) {
			if (q.size() == 0) {
				result = -1;
				cout &amp;lt;&amp;lt; result &amp;lt;&amp;lt; '\n';
			}
			else {
				result = q.back();
				cout &amp;lt;&amp;lt; result &amp;lt;&amp;lt; '\n';
			}
		}

	}
}&lt;/code&gt;&lt;/pre&gt;</description>
      <category>백준</category>
      <category>BOJ #C++</category>
      <author>JIWANSEO</author>
      <guid isPermaLink="true">https://ordinary-student-study-record.tistory.com/45</guid>
      <comments>https://ordinary-student-study-record.tistory.com/45#entry45comment</comments>
      <pubDate>Fri, 28 Jul 2023 18:46:40 +0900</pubDate>
    </item>
    <item>
      <title>[C++][BOJ][4153] 직각 삼각형</title>
      <link>https://ordinary-student-study-record.tistory.com/44</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;777&quot; data-origin-height=&quot;810&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/d6xS99/btso6L5GANk/bqOmKhiLNuaM5yKjme2jN0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/d6xS99/btso6L5GANk/bqOmKhiLNuaM5yKjme2jN0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/d6xS99/btso6L5GANk/bqOmKhiLNuaM5yKjme2jN0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fd6xS99%2Fbtso6L5GANk%2FbqOmKhiLNuaM5yKjme2jN0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;777&quot; height=&quot;810&quot; data-origin-width=&quot;777&quot; data-origin-height=&quot;810&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;알게된 점&amp;nbsp;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;없음&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;코드&lt;/h2&gt;
&lt;pre id=&quot;code_1690383840556&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;iostream&amp;gt;
using namespace std;

int main(int argc, char* argv[])
{
	int a, b, c;
	while (1) {
		int temp = 0;
		cin &amp;gt;&amp;gt; a &amp;gt;&amp;gt; b &amp;gt;&amp;gt; c;
		if (a == 0 &amp;amp;&amp;amp; b == 0 &amp;amp;&amp;amp; c == 0)
			return 0;

		if (a &amp;gt; b) {
			temp = b;
			b = a;
			a = temp;
		}

		if (b &amp;gt; c) {
			temp = c;
			c = b;
			b = temp;
		}
		if (c * c == a * a + b * b)
			cout &amp;lt;&amp;lt; &quot;right\n&quot;;
		else
			cout &amp;lt;&amp;lt; &quot;wrong\n&quot;;
	}
}&lt;/code&gt;&lt;/pre&gt;</description>
      <category>백준</category>
      <category>C++#BOJ</category>
      <author>JIWANSEO</author>
      <guid isPermaLink="true">https://ordinary-student-study-record.tistory.com/44</guid>
      <comments>https://ordinary-student-study-record.tistory.com/44#entry44comment</comments>
      <pubDate>Thu, 27 Jul 2023 00:04:11 +0900</pubDate>
    </item>
    <item>
      <title>[C++][BOJ][1259] 펠린드롬 수</title>
      <link>https://ordinary-student-study-record.tistory.com/43</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;857&quot; data-origin-height=&quot;806&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bQycaN/btso7ia6rhx/qwPudrkFxrz1SLyY32ukpk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bQycaN/btso7ia6rhx/qwPudrkFxrz1SLyY32ukpk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bQycaN/btso7ia6rhx/qwPudrkFxrz1SLyY32ukpk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbQycaN%2Fbtso7ia6rhx%2FqwPudrkFxrz1SLyY32ukpk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;857&quot; height=&quot;806&quot; data-origin-width=&quot;857&quot; data-origin-height=&quot;806&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;알게된 점&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;algorithm 라이브러리 에서 reverse 함수를 쓸 수 있게 되었다.&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;코드&lt;/h2&gt;
&lt;pre id=&quot;code_1690381512347&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;iostream&amp;gt;
#include &amp;lt;string&amp;gt;
#include &amp;lt;algorithm&amp;gt; 
using namespace std;

int main() {
    
    string N;
    
    //0이 아니면 무한 반복
    while (N != &quot;0&quot;) {
        cin &amp;gt;&amp;gt; N;
        string input = N;
        reverse(N.begin(), N.end()); // 앞뒤 바꿈

        if (N == &quot;0&quot;) { // 즉시 탈출(왜냐하면 0도 reverse하면 0으로 같다.)
            break;
        }
        else if (N == input) { // 비교
            cout &amp;lt;&amp;lt; &quot;yes\n&quot;;
        }
        else {
            cout &amp;lt;&amp;lt; &quot;no\n&quot;;
        }
    }

}&lt;/code&gt;&lt;/pre&gt;</description>
      <category>백준</category>
      <category>C++#BOJ</category>
      <author>JIWANSEO</author>
      <guid isPermaLink="true">https://ordinary-student-study-record.tistory.com/43</guid>
      <comments>https://ordinary-student-study-record.tistory.com/43#entry43comment</comments>
      <pubDate>Wed, 26 Jul 2023 23:31:50 +0900</pubDate>
    </item>
    <item>
      <title>[C++][BOJ][11866] 요세푸스 0</title>
      <link>https://ordinary-student-study-record.tistory.com/42</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1154&quot; data-origin-height=&quot;854&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/pNjIJ/btsoyaS0i8X/75GNZ7Ly18A7tzS19GrhUk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/pNjIJ/btsoyaS0i8X/75GNZ7Ly18A7tzS19GrhUk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/pNjIJ/btsoyaS0i8X/75GNZ7Ly18A7tzS19GrhUk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FpNjIJ%2FbtsoyaS0i8X%2F75GNZ7Ly18A7tzS19GrhUk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1154&quot; height=&quot;854&quot; data-origin-width=&quot;1154&quot; data-origin-height=&quot;854&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;알게된 점&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;연결리스트를 직접 구조체와 클래스를 활용하여 구현하여 해결하였다.&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;코드&lt;/h2&gt;
&lt;pre id=&quot;code_1690031246419&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#pragma warning(disable:4996)
#include &amp;lt;iostream&amp;gt;
using namespace std;

typedef struct Node {
    int data;
    struct Node* next;
}Node;

class LL {
private:
    Node* head = nullptr;
public:
    void Push(int value) {
        Node* newNode = (Node*)malloc(sizeof(Node));
        newNode-&amp;gt;next = head;
        newNode-&amp;gt;data = value;

        //만약 head노드가 null이라면 
        if (head == nullptr) {
            head = newNode;
            head-&amp;gt;next = head;
        }
        else {
            Node* curr = head;
            while (curr-&amp;gt;next != head) curr = curr-&amp;gt;next;
            curr-&amp;gt;next = newNode;
            newNode-&amp;gt;next = head;
        }
        return;
    }

    int Pop(int K) {
        Node* prev = head;
        while (K--) {
            prev = head;
            head = head-&amp;gt;next;
        }

        int value = head-&amp;gt;data;
        prev-&amp;gt;next = head-&amp;gt;next;

        //free(head);
        head = prev-&amp;gt;next;
        return value;
    }
};

int main() {
    int N, K; cin &amp;gt;&amp;gt; N &amp;gt;&amp;gt; K;
    LL list;

    for (int i = 1; i &amp;lt;= N; i++) {
        list.Push(i);
    }
    cout&amp;lt;&amp;lt;&quot;&amp;lt;&quot;;

    for (int i = 1; i &amp;lt; N; i++) {
        cout &amp;lt;&amp;lt; list.Pop(K - 1)&amp;lt;&amp;lt;&quot;, &quot;;
    }
    cout &amp;lt;&amp;lt; list.Pop(N)&amp;lt;&amp;lt;&quot;&amp;gt;&quot;;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>백준</category>
      <category>C++#BOJ</category>
      <author>JIWANSEO</author>
      <guid isPermaLink="true">https://ordinary-student-study-record.tistory.com/42</guid>
      <comments>https://ordinary-student-study-record.tistory.com/42#entry42comment</comments>
      <pubDate>Sat, 22 Jul 2023 22:10:55 +0900</pubDate>
    </item>
    <item>
      <title>[C++][BOJ][10250] ACM 호텔</title>
      <link>https://ordinary-student-study-record.tistory.com/41</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;578&quot; data-origin-height=&quot;781&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cAUOh8/btsnGZyuPaP/chPYvbmByDWCerfIUMoW61/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cAUOh8/btsnGZyuPaP/chPYvbmByDWCerfIUMoW61/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cAUOh8/btsnGZyuPaP/chPYvbmByDWCerfIUMoW61/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcAUOh8%2FbtsnGZyuPaP%2FchPYvbmByDWCerfIUMoW61%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;578&quot; height=&quot;781&quot; data-origin-width=&quot;578&quot; data-origin-height=&quot;781&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;알게된 점&amp;nbsp;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;None&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;코드&amp;nbsp;&lt;/h2&gt;
&lt;pre id=&quot;code_1689569275960&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;iostream&amp;gt;
using namespace std;

int main() {
    int T;
    cin &amp;gt;&amp;gt; T;
    int H, W, N;
    for (int i = 0; i &amp;lt; T; i++) {

        cin &amp;gt;&amp;gt; H &amp;gt;&amp;gt; W &amp;gt;&amp;gt; N;
        int H1, W1;

        H1 = N % H;
        W1 = N / H;
        if (H1 &amp;gt; 0) {
            W1++;
        } 
        else {
            H1 = H;
        }
        cout &amp;lt;&amp;lt; H1 * 100 + W1 &amp;lt;&amp;lt; '\n';
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>백준</category>
      <category>C++#BOJ</category>
      <author>JIWANSEO</author>
      <guid isPermaLink="true">https://ordinary-student-study-record.tistory.com/41</guid>
      <comments>https://ordinary-student-study-record.tistory.com/41#entry41comment</comments>
      <pubDate>Mon, 17 Jul 2023 13:48:28 +0900</pubDate>
    </item>
    <item>
      <title>[C++][BOJ][2920] 음계</title>
      <link>https://ordinary-student-study-record.tistory.com/40</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;766&quot; data-origin-height=&quot;904&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cI4ROf/btsnOenud14/u9KH452KPlsZKC3kuZcKV0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cI4ROf/btsnOenud14/u9KH452KPlsZKC3kuZcKV0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cI4ROf/btsnOenud14/u9KH452KPlsZKC3kuZcKV0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcI4ROf%2FbtsnOenud14%2Fu9KH452KPlsZKC3kuZcKV0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;766&quot; height=&quot;904&quot; data-origin-width=&quot;766&quot; data-origin-height=&quot;904&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;알게된 점&amp;nbsp;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;None&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;코드&amp;nbsp;&lt;/h2&gt;
&lt;pre id=&quot;code_1689562019067&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;iostream&amp;gt;
using namespace std;

int main(int argc, char* argv[])
{
	int arr[8];
	int a;
	for (int i = 0; i &amp;lt; 8 ; i++)
	{
		cin &amp;gt;&amp;gt; a; arr[i] = a;
	}
	if (arr[0] == 1 &amp;amp;&amp;amp; arr[1] == 2 &amp;amp;&amp;amp; arr[2] == 3 &amp;amp;&amp;amp;
		arr[3] == 4 &amp;amp;&amp;amp; arr[4] == 5 &amp;amp;&amp;amp; arr[5] == 6 &amp;amp;&amp;amp;
		arr[6] == 7 &amp;amp;&amp;amp; arr[7] == 8)
	{
		cout &amp;lt;&amp;lt; &quot;ascending&quot;;
	}
	else if (arr[0] == 8 &amp;amp;&amp;amp; arr[1] == 7 &amp;amp;&amp;amp; arr[2] == 6 &amp;amp;&amp;amp;
		arr[3] == 5 &amp;amp;&amp;amp; arr[4] == 4 &amp;amp;&amp;amp; arr[5] == 3 &amp;amp;&amp;amp;
		arr[6] == 2 &amp;amp;&amp;amp; arr[7] == 1)
	{
		cout &amp;lt;&amp;lt; &quot;descending&quot;;
	}
	else {
		cout &amp;lt;&amp;lt; &quot;mixed&quot;;
	}
	return 0;
}&lt;/code&gt;&lt;/pre&gt;</description>
      <category>백준</category>
      <category>C++#BOJ</category>
      <author>JIWANSEO</author>
      <guid isPermaLink="true">https://ordinary-student-study-record.tistory.com/40</guid>
      <comments>https://ordinary-student-study-record.tistory.com/40#entry40comment</comments>
      <pubDate>Mon, 17 Jul 2023 11:47:35 +0900</pubDate>
    </item>
    <item>
      <title>[C++][BOJ][2577] 숫자의 개수</title>
      <link>https://ordinary-student-study-record.tistory.com/39</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;765&quot; data-origin-height=&quot;833&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cnVA45/btsnEjjGMXW/KK4KwLbugQu5B0UpqaywEk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cnVA45/btsnEjjGMXW/KK4KwLbugQu5B0UpqaywEk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cnVA45/btsnEjjGMXW/KK4KwLbugQu5B0UpqaywEk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcnVA45%2FbtsnEjjGMXW%2FKK4KwLbugQu5B0UpqaywEk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;765&quot; height=&quot;833&quot; data-origin-width=&quot;765&quot; data-origin-height=&quot;833&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;알게된 점&amp;nbsp;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;수를 string 타입으로 바꾸어 각 자리 수들을 꺼내는 법을 알게 됨.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;549&quot; data-origin-height=&quot;204&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Rur8U/btsnEjqtH4b/PngMH1YcXloftk5In7MH40/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Rur8U/btsnEjqtH4b/PngMH1YcXloftk5In7MH40/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Rur8U/btsnEjqtH4b/PngMH1YcXloftk5In7MH40/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FRur8U%2FbtsnEjqtH4b%2FPngMH1YcXloftk5In7MH40%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;380&quot; height=&quot;141&quot; data-origin-width=&quot;549&quot; data-origin-height=&quot;204&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;코드&amp;nbsp;&lt;/h2&gt;
&lt;pre id=&quot;code_1689479206318&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;iostream&amp;gt;
#include &amp;lt;string&amp;gt;
using namespace std;

int main(int argc, char* argv[])
{
	int a[3]; int result = 1;
	int arr[10]{0,};

	for (int i = 0; i &amp;lt; 3; i++)
	{
		cin &amp;gt;&amp;gt; a[i];
	}
	
	//세 수 곱 
	for (int i = 0; i &amp;lt; 3; i++)
	{
		result *= a[i];
	}
	//숫자 0은 문자로 아스키값 48. 
	//인덱스 숫자 0을 얻기 위해 48을 빼야함
	string s = to_string(result);

	for (char ch : s) { //문자열의 문자들을 하나씩 꺼냄 
		// 문자를 숫자로 변환한 값의 인덱스 1 증가 
		arr[ch - '0']++;
	}

	for (int i = 0; i &amp;lt; 10; i++)
	{
		cout &amp;lt;&amp;lt; arr[i] &amp;lt;&amp;lt; '\n';
	}
	return 0;
}&lt;/code&gt;&lt;/pre&gt;</description>
      <category>백준</category>
      <category>C++#BOJ</category>
      <author>JIWANSEO</author>
      <guid isPermaLink="true">https://ordinary-student-study-record.tistory.com/39</guid>
      <comments>https://ordinary-student-study-record.tistory.com/39#entry39comment</comments>
      <pubDate>Sun, 16 Jul 2023 12:47:16 +0900</pubDate>
    </item>
    <item>
      <title>[C++][BOJ][10814] 나이순 정렬</title>
      <link>https://ordinary-student-study-record.tistory.com/37</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;861&quot; data-origin-height=&quot;824&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/sdxBf/btsnFe9EL2Y/2MP8AfSC3EKpXNAnkxQFB1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/sdxBf/btsnFe9EL2Y/2MP8AfSC3EKpXNAnkxQFB1/img.png&quot; data-alt=&quot;10814&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/sdxBf/btsnFe9EL2Y/2MP8AfSC3EKpXNAnkxQFB1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FsdxBf%2FbtsnFe9EL2Y%2F2MP8AfSC3EKpXNAnkxQFB1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;861&quot; height=&quot;824&quot; data-origin-width=&quot;861&quot; data-origin-height=&quot;824&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;10814&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;알게된 점&amp;nbsp;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일단 튜플 사용 방법을 알게었다.&amp;nbsp; 첫 시도에는 벡터와 페어를 사용하여 해결하려고 시도했으나, 입력 받은 순대로 출력이 나오지 않아 다른 방법을 생각하게 되었다. 그 후 생각해낸 것이 페어에 3개의 데이터가 들어가나 했더니, 역시나 들어가지 않아, 구글링을 통해, 튜플을 사용하면 3개 이상으로도 데이터가 들어갈 수 있다는 사실을 알게되었다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 튜플과 벡터를 활용해, 입력번호와 나이, 그리고 이름을 튜플 하나에 입력 후 정렬한 다음 출력하였다.&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;코드&amp;nbsp;&lt;/h2&gt;
&lt;pre id=&quot;code_1689400588365&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;iostream&amp;gt;
#include &amp;lt;vector&amp;gt;
#include &amp;lt;algorithm&amp;gt;
#include &amp;lt;tuple&amp;gt;
using namespace std;

bool compare(tuple&amp;lt;int, int, string&amp;gt;a, tuple&amp;lt;int, int, string&amp;gt;b) {
	if (get&amp;lt;1&amp;gt;(a) == get&amp;lt;1&amp;gt;(b)) {
		return get&amp;lt;0&amp;gt;(a) &amp;lt; get&amp;lt;0&amp;gt;(b);
	}
	else {
		return get&amp;lt;1&amp;gt;(a) &amp;lt; get&amp;lt;1&amp;gt;(b);
	}
}

int main(int argc, char* argv[])
{
	int N; cin &amp;gt;&amp;gt; N;
	vector&amp;lt;tuple&amp;lt;int, int, string&amp;gt;&amp;gt; v;
	string s;
	int age;

	for (int i = 0; i &amp;lt; N; i++)
	{
		cin &amp;gt;&amp;gt; age &amp;gt;&amp;gt; s;
		v.push_back(make_tuple(i, age, s));
	}

	sort(v.begin(), v.end(), compare);

	for (int i = 0; i &amp;lt; N; i++)
	{
		cout &amp;lt;&amp;lt; get&amp;lt;1&amp;gt;(v[i]) &amp;lt;&amp;lt; ' ' &amp;lt;&amp;lt; get&amp;lt;2&amp;gt;(v[i]) &amp;lt;&amp;lt; '\n';
	}
	return 0;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>백준</category>
      <category>C++#BOJ</category>
      <author>JIWANSEO</author>
      <guid isPermaLink="true">https://ordinary-student-study-record.tistory.com/37</guid>
      <comments>https://ordinary-student-study-record.tistory.com/37#entry37comment</comments>
      <pubDate>Sat, 15 Jul 2023 15:00:21 +0900</pubDate>
    </item>
    <item>
      <title>[C++][BOJ][1181] 단어 정렬</title>
      <link>https://ordinary-student-study-record.tistory.com/36</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;771&quot; data-origin-height=&quot;801&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bsY5Ph/btsnDwXsEHN/Seu9BxdUiKTIgwal3eAj7k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bsY5Ph/btsnDwXsEHN/Seu9BxdUiKTIgwal3eAj7k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bsY5Ph/btsnDwXsEHN/Seu9BxdUiKTIgwal3eAj7k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbsY5Ph%2FbtsnDwXsEHN%2FSeu9BxdUiKTIgwal3eAj7k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;771&quot; height=&quot;801&quot; data-origin-width=&quot;771&quot; data-origin-height=&quot;801&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;알게된 점&amp;nbsp;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;auto&amp;nbsp;last&amp;nbsp;=&amp;nbsp;unique(v.begin(),&amp;nbsp;v.end()); &lt;br /&gt;v.erase(last, v.end()); //중복된 벡터를 제거하는 함수&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;//unique()의 return Value는 벡터의 시작 주소를 리턴한다.&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;코드&lt;/h2&gt;
&lt;pre id=&quot;code_1689328459581&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;iostream&amp;gt;
#include &amp;lt;algorithm&amp;gt;
#include &amp;lt;vector&amp;gt;
#include &amp;lt;string&amp;gt;
using namespace std;

bool compare(pair&amp;lt;string,int&amp;gt;x,pair&amp;lt;string,int&amp;gt;y) // 문자열의 길이순으로 비교, 문자열 길이 같으면 사전 순으로 비교 
{
	if (x.second == y.second) {
		return x.first &amp;lt; y.first;
	}
	else {
		return x.second &amp;lt; y.second;
	}
}

int main(int argc, char* argv[])
{
	int N; cin &amp;gt;&amp;gt; N;
	string a;
	vector&amp;lt;pair&amp;lt;string, int&amp;gt;&amp;gt; v;
	for (int i = 0; i &amp;lt; N; i++)
	{
		cin &amp;gt;&amp;gt; a;
		v.push_back({ a,size(a) });
	}

	sort(v.begin(), v.end(),compare);

	auto last = unique(v.begin(), v.end());
	v.erase(last, v.end());

	for (int i = 0; i &amp;lt; v.size(); i++)
	{
		cout &amp;lt;&amp;lt; v[i].first &amp;lt;&amp;lt; '\n';
	}
	return 0;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;코드에서 중요한 부분은 마지막 for 문에서 i&amp;lt;N이 아니다. &lt;br /&gt;&lt;b&gt;중복된 함수를 제거&lt;/b&gt; 했기 때문에&lt;b&gt; i&amp;lt;v.size()&lt;/b&gt;로 바꾸어야 정상적으로 출력한다.&amp;nbsp;&lt;/p&gt;</description>
      <category>백준</category>
      <category>C++#BOJ</category>
      <author>JIWANSEO</author>
      <guid isPermaLink="true">https://ordinary-student-study-record.tistory.com/36</guid>
      <comments>https://ordinary-student-study-record.tistory.com/36#entry36comment</comments>
      <pubDate>Fri, 14 Jul 2023 18:57:14 +0900</pubDate>
    </item>
    <item>
      <title>[C++][BOJ][11651]좌표 정렬하기 2</title>
      <link>https://ordinary-student-study-record.tistory.com/35</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1033&quot; data-origin-height=&quot;776&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ScRgE/btsnFFE7DnV/akXDcJZtgZGTBYQwkh70t0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ScRgE/btsnFFE7DnV/akXDcJZtgZGTBYQwkh70t0/img.png&quot; data-alt=&quot;11651 문제&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ScRgE/btsnFFE7DnV/akXDcJZtgZGTBYQwkh70t0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FScRgE%2FbtsnFFE7DnV%2FakXDcJZtgZGTBYQwkh70t0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1033&quot; height=&quot;776&quot; data-origin-width=&quot;1033&quot; data-origin-height=&quot;776&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;11651 문제&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;알게 된 것 :&amp;nbsp;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;pair&amp;lt;[type],[type]&amp;gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 2객의 각각 지정한 타입의 값 저장.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- pair는 다양한 용도로 사용 가능. ex) 좌표 저장, 날짜와 시간 저장&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #1b1b1b; color: #c4c7c5; text-align: start;&quot;&gt;sort(points.begin(), points.end(), [](const std::pair&amp;lt;int, int&amp;gt;&amp;amp; a, const std::pair&amp;lt;int, int&amp;gt;&amp;amp; b) { return a.first &amp;lt; b.first; });&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 위 코드는 x,y 좌표값이 들어왔을 때, x를 기준으로 오름차순 정렬하는 코드&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;코드&amp;nbsp;&lt;/h2&gt;
&lt;pre id=&quot;code_1689325275272&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;iostream&amp;gt;
#include &amp;lt;algorithm&amp;gt;
#include &amp;lt;vector&amp;gt;
using namespace std;

bool compare(pair&amp;lt;int, int&amp;gt;a, pair&amp;lt;int, int&amp;gt;b) {
	if (a.second == b.second) {
		return a.first &amp;lt; b.first;
	}
	else {
		return a.second &amp;lt; b.second;
	}
}

int main(int argc, char* argv[])
{
	vector&amp;lt;pair&amp;lt;int, int&amp;gt;&amp;gt; v;
	int N; cin &amp;gt;&amp;gt; N;
	int a, b;

	for (int i = 0; i &amp;lt; N; i++)
	{
		cin&amp;gt;&amp;gt;a&amp;gt;&amp;gt;b;
		v.push_back({ a,b });
	}

	sort(v.begin(), v.end(), compare);

	for (int i = 0; i &amp;lt; N; i++)
	{
		cout &amp;lt;&amp;lt; v[i].first&amp;lt;&amp;lt; ' ' &amp;lt;&amp;lt; v[i].second &amp;lt;&amp;lt; '\n';
	}
	return 0;
}&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;출력 결과&amp;nbsp;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;354&quot; data-origin-height=&quot;353&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/PmAdn/btsnD4FSf9i/3iKIrDkNFnKJrr54WIlc80/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/PmAdn/btsnD4FSf9i/3iKIrDkNFnKJrr54WIlc80/img.png&quot; data-alt=&quot;console&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/PmAdn/btsnD4FSf9i/3iKIrDkNFnKJrr54WIlc80/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FPmAdn%2FbtsnD4FSf9i%2F3iKIrDkNFnKJrr54WIlc80%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;354&quot; height=&quot;353&quot; data-origin-width=&quot;354&quot; data-origin-height=&quot;353&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;console&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>백준</category>
      <category>C++#BOJ</category>
      <author>JIWANSEO</author>
      <guid isPermaLink="true">https://ordinary-student-study-record.tistory.com/35</guid>
      <comments>https://ordinary-student-study-record.tistory.com/35#entry35comment</comments>
      <pubDate>Fri, 14 Jul 2023 18:01:46 +0900</pubDate>
    </item>
    <item>
      <title>객체 치환 및 객체 리턴</title>
      <link>https://ordinary-student-study-record.tistory.com/34</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;b&gt;객체 치환&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;객체 치환 시 객체의 모든 데이터가 비트 단위로 복사된다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1680881835190&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Circle c1(5);
Circle c2(30);
c1=c2; //c2 객체를 c1 객체에 비트 단위로 복사한다. c1의 반지름이 30이 된다. 
--c1과 c2는 내용물만 같을 뿐, 별개이다. 객체 치환은 동일한 클래스 타입에 대해서만 적용된다.--&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;b&gt;함수의 객체 리턴&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1680881979872&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Circle getCircle(){
	Circle tmp(30);
    return tmp; //객체 tmp 리턴
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;return 문이 실행되면 tmp의 복사본이 생기고 이 복사본이 getCircle()을 호출한 곳으로 전달. 그 후 tmp는 소멸.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래는 getCircle() 함수로부터 리턴 되는 객체를 받는 코드이다.&lt;/p&gt;
&lt;pre id=&quot;code_1680882089559&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Circle c; // c의 반지름은 1
c=getCircle(); // tmp 객체의 복사본이 c에 치환된다. c의 반지름이 30이 된다.&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;객체 리턴 코드&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1680882950917&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;iostream&amp;gt;
using namespace std;

class Circle{
    int radius;
public:
    Circle(){ radius=1;}
    Circle(int radius){this-&amp;gt;radius=radius;}
    void setRadius(int radius){this-&amp;gt;radius=radius;}
    double getArea(){return 3.14*radius*radius;}
};

Circle getCircle(){
    Circle tmp(30);
    return tmp; // 객체 tmp를 리턴한다.
}

int main(){
    Circle c; //객체가 생성된다. radius=1로 초기화된다.
    cout &amp;lt;&amp;lt; c.getArea()&amp;lt;&amp;lt;endl;
    
    c=getCircle();
    cout &amp;lt;&amp;lt; c.getArea() &amp;lt;&amp;lt; endl;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Programming Language/C++</category>
      <author>JIWANSEO</author>
      <guid isPermaLink="true">https://ordinary-student-study-record.tistory.com/34</guid>
      <comments>https://ordinary-student-study-record.tistory.com/34#entry34comment</comments>
      <pubDate>Sat, 8 Apr 2023 00:57:09 +0900</pubDate>
    </item>
    <item>
      <title>함수 호출 시 객체 전달</title>
      <link>https://ordinary-student-study-record.tistory.com/33</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;값에 의한 호출로 객체를 전달할 때 문제점&amp;nbsp;&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 실인자 객체의 크기가 크면 객체를 복사하는 시간이 커지는 단점이 있다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 객체가 함수에 전달되면, 함수의 매개 변수 객체가 생성되고, 함수가 종료하면 매개 변수 객체가 소멸된다. 매개 변수 객체의 생성자와 소멸자가 모두 실행되지 않는다. &lt;b&gt;객체를 매개 변수로 가지는 함수의 경우&lt;/b&gt;, C++ 컴파일러는 매개 변수 객체의 생성자는 실행되지 않고 소멸자만 실행되도록 컴파일 한다.&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;-왜 매개 변수 객체의 생성자가 실행되지 않도록 컴파일 되는가?&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;gt;다음 코드는 반지름이 30인 waffle 객체를 생성하고, increase() 함수를 호출하여 waffle 객체를 전달한다.&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1680879759617&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Circle waffle(30);
increase(waffle);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;increase() 함수의 매개 변수 c에 waffle 객체가 전달된 후, 만일 객체 c의 생성자 Circle()이 실행된다면, 객체 c의 반지름(radius 멤버 변수)이 1로 초기화되어, 전달 받은 원본의 상태를 잃어버리게 된다. 컴파일러는 이런 문제가 발생하지 않도록, 매개 변수 객체의 생성자가 실행되지 않도록 한다. 소멸자의 경우는 다르다. increase()가 리턴하면 c의 소멸자가 실행되고 c는 사라진다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;매개 변수 객체의 생성자가 실행되지 않고 소멸자만 실행되는 비대칭 구조&lt;/b&gt;는, 함수 호출 시 원본 객체의 상태를 그대로 매개 변수 객체에 전달되도록 하기 위한 것이지만, &lt;b&gt;중대한 문제를 동반&lt;/b&gt;한다. 이 문제점을 해결하기 위한 방법으로 &lt;b&gt;복사 생성자를 설명&lt;/b&gt;한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;복사 생성자&lt;/b&gt; &amp;gt; '값에 의한 호출' 시, 컴파일러는 매개 변수 객체의 생성자 대신 &lt;b&gt;복사 생성자가 호출되도록 컴파일&lt;/b&gt;하기 때문에, 생성자가 실행되지 않는 것이다. 컴파일러는 클래스에 복사 생성자가 작성되어 있지 않는 경우, 실인자 객체의 멤버 변수를 1:1로 매개 변수 객체에 복사하는 디폴트 복사 생성자를 자동으로 삽입한다.&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;주소에 의한 호출로 객체 전달&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-주소에 의한 호출 과정&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;함수 호출 시 객체의 주소만 전달하는 '주소에 의한 호출'이 이루어지도록 increase()함수와 함수 호출 코드를 수정한 사례로서, '주소에 의한 호출' 과정을 자세히 보여준다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;increase()함수는 '주소에 의한 호출'이 일어나도록 다음과 같이 선언&lt;/p&gt;
&lt;pre id=&quot;code_1680880941953&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void increase(Circle *p)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;main() 함수에서 다음과 같이 increase()를 호출하면,&lt;/p&gt;
&lt;pre id=&quot;code_1680880993421&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Circle waffle(30);
increase(&amp;amp;waffle); // waffle 객체의 주소를 전달한다.&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;waffle 객체의 주소가 포인터 p에 전달된다. p는 객체가 아니므로 생성자나 소멸자와 상관이 없다. 다음 코드가 실행되면, waffle 객체의 반지름이 1 증가된다.&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1680881118403&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;p-&amp;gt;setRadius(r+1);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-주소에 의한 호출의 특징&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;'값에 의한 호출'에 비해 원본 객체를 복사하는 시간 소모가 없으며, 매개 변수가 단순 포인터이므로, '값에 의한 호출' 시에 발생하는 생성자 소멸자의 비대칭 문제도 없다. 하지만, 매개 변수 포인터로 의도치 않게 원본 객체를 훼손할 가능성이 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Programming Language/C++</category>
      <author>JIWANSEO</author>
      <guid isPermaLink="true">https://ordinary-student-study-record.tistory.com/33</guid>
      <comments>https://ordinary-student-study-record.tistory.com/33#entry33comment</comments>
      <pubDate>Sat, 8 Apr 2023 00:33:36 +0900</pubDate>
    </item>
    <item>
      <title>함수의 인자 전달 방식</title>
      <link>https://ordinary-student-study-record.tistory.com/32</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;인자 전달 방식은 &lt;b&gt;값에 의한 호출&lt;/b&gt;과 &lt;b&gt;주소에 의한 호출&lt;/b&gt;로 나뉜다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;KakaoTalk_20230407_232839089.jpg&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;919&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bFhmob/btr8Mqo6E3j/P9Jfnqd0XzYiIGRwCeXm7k/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bFhmob/btr8Mqo6E3j/P9Jfnqd0XzYiIGRwCeXm7k/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bFhmob/btr8Mqo6E3j/P9Jfnqd0XzYiIGRwCeXm7k/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbFhmob%2Fbtr8Mqo6E3j%2FP9Jfnqd0XzYiIGRwCeXm7k%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1280&quot; height=&quot;919&quot; data-filename=&quot;KakaoTalk_20230407_232839089.jpg&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;919&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1680878242009&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;--값에 의한 호출--
#include&amp;lt;iostream&amp;gt;
using namespace std;

void swap(int a,int b){
	int tmp;
    
    tmp=a;
    a=b;
    b=tmp;
}

int main(){
	int m=2, n=9;
    swap(m,n);
    cout&amp;lt;&amp;lt;m&amp;lt;&amp;lt;' '&amp;lt;&amp;lt;n;
}

--주소에 의한 호출--
#include&amp;lt;iostream&amp;gt;
using namespace std;

void swap(int *a,int *b){
	int tmp;
    
    tmp=*a;
    *a=*b;
    *b=tmp;
}

int main(){
	int m=2, n=9;
    swap(&amp;amp;m,&amp;amp;n);
    cout&amp;lt;&amp;lt;m&amp;lt;&amp;lt;' '&amp;lt;&amp;lt;n;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;값에 의한 호출 : 실인자의 값을 복사하여 전달하므로, 함수 내에서 실인자를 손상시킬 수 없는 장점이 있다. 따라서 함수 호출에 따른 부작용은 없다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;주소에 의한 호출 : 실인자의 주소를 넘겨주어 의도적으로 함수 내에서 실인자의 값을 변경하고자 할 때 이용된다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;C++에서는 참조에 의한 호출도 추가되었는데, 후에 다룬다.&amp;nbsp;&lt;/p&gt;</description>
      <category>Programming Language/C++</category>
      <author>JIWANSEO</author>
      <guid isPermaLink="true">https://ordinary-student-study-record.tistory.com/32</guid>
      <comments>https://ordinary-student-study-record.tistory.com/32#entry32comment</comments>
      <pubDate>Fri, 7 Apr 2023 23:43:03 +0900</pubDate>
    </item>
    <item>
      <title>문자열 다루기</title>
      <link>https://ordinary-student-study-record.tistory.com/31</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;문자열 치환&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1680869800875&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;string a=&quot;Java&quot;, b=&quot;C++&quot;;
a=b;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;문자열 비교 &lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1680870131889&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;string name=&quot;KItty&quot;;
string alias=&quot;Kito&quot;;
int res=name.compare(alias); //name과 alias를 비교한다.(name이 alias보다 앞에 오면 음수)
if(res==0) cout &amp;lt;&amp;lt;&quot;두 문자열이 같다.&quot;; //name과 alias가 동일 
else if(res&amp;lt;0) cout&amp;lt;&amp;lt;name&amp;lt;&amp;lt;&quot; &amp;lt; &quot;&amp;lt;&amp;lt;alias&amp;lt;&amp;lt;endl; //name이 앞에 옴
else cout&amp;lt;&amp;lt;alias&amp;lt;&amp;lt;&quot;&amp;lt;&quot;&amp;lt;&amp;lt;name&amp;lt;&amp;lt;endl; //name이 뒤에 옴&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;문자열 연결 &lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1680870533427&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;string a(&quot;I&quot;);
a.append(&quot; love &quot;); //a=&quot;I love&quot;
--------------------------------
string a(&quot;I love C++&quot;);
string b(&quot;.&quot;);
string c;
c = a + b ; // c=&quot;I love C++.&quot;
c +=b // c에다가 b를 붙여 c로 만듦 / c=&quot;I love C++..&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;문자열&lt;/b&gt;&amp;nbsp;&lt;b&gt;삽입&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1680871249302&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;//insert() 사용 예
string a(&quot;I love C++&quot;);
a.insert(2,&quot;really &quot;); //a= &quot;I really love C++&quot;

//replace() 사용 예
string a(&quot;I love C++&quot;);
a.replace(2,11,&quot;study&quot;); // a=&quot;I study&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;문자열 길이&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;문자열 길이는 문자열에 포함된 문자 개수를 말하며, &lt;b&gt;length()&lt;/b&gt;와 &lt;b&gt;size() 함수&lt;/b&gt;는 &lt;b&gt;문자열의 길이를 리턴&lt;/b&gt;한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;string 객체의 내부 메모리 용량을 리턴&lt;/b&gt;하는 &lt;b&gt;capacity()&lt;/b&gt;도 있다. 용량은 &lt;b&gt;자동 조절&lt;/b&gt;되므로 신경 쓸 필요 없다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래는 문자열 길이와 용량을 리턴하는 코드 예이다.&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1680871540093&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;string a(&quot;I study C++&quot;);
int length=a.length();
int size=a.size();
int capacity=a.capacity(); //스트링 a의 현재 용량 capacity=31 변할 수 있다.&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;문자열 삭제&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1680871634481&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;string a(&quot;I love C++&quot;);
a.erase(0,7); //a의 0부터 7개의 문자 삭제. a=&quot;C++&quot;
a.clear(); // a=&quot;&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;서브스트링&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;substr() 함수&lt;/b&gt;를 사용하면 문자열에서 일부분을 발췌한 문자열(서브스트링)을 얻을 수 있다. substr() 실행 후 &lt;b&gt;b의 문자열은 변화가 없음&lt;/b&gt;에 유의하라.&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1680871807660&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;string b=&quot;I love C++&quot;;
string c=b.substr(2,4); //b의 인덱스에서 2부터 4개의 문자 리턴. c=&quot;love&quot;
string d=b.substr(2); //b의 인덱스에서 2부터 끝까지 문자 리턴. d=&quot;love C++&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;문자열 검색&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;문자열 내에 특정 문자열이 존재하는지 검색하는 기능은 많은 응용에서 사용된다. &lt;b&gt;find()&lt;/b&gt;는 &lt;b&gt;문자열에서 특정 문자나 문자열을 발견하면 첫 번째 인덱스를 리턴&lt;/b&gt;한다.&lt;b&gt; 발견하지 못하면 -1을 리턴&lt;/b&gt;한다.&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1680872263007&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;string e= &quot;I love love C++&quot;;
int index=e.find(&quot;love&quot;); // e에서 &quot;love&quot; 검색, 인덱스 2 리턴 
index=e.find(&quot;love&quot;,index+1); // love를 인덱스 3부터 검색, index=2이었고 find에서 6을 반환해서 7반환 
index= e.find(&quot;C#&quot;); // e에서 &quot;C#&quot;을 발견할 수 없음. -1 리턴
index=e.find('v',7); // e의 인덱스 7부터 'v'문자 검색. 인덱스 9 리턴&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;문자열의 각 문자 다루기&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;at() 함수&lt;/b&gt;와 &lt;b&gt;[] 연산자&lt;/b&gt;는 둘 다 &lt;b&gt;문자열의 특정 위치에 있는 문자를 리턴&lt;/b&gt;한다. at()과 달리 &lt;b&gt;[] 연산자를 이용&lt;/b&gt;하면 &lt;b&gt;특정 문자를 다른 문자로 수정 가능&lt;/b&gt;하다.&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1680872487742&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;string f(&quot;I love C++&quot;);
char ch1=f.at(7); // ch1='C'
char ch2=f[7]; // ch2='C'
f[7]='D'; // f는 &quot;I love D++&quot;
-----------------------------
문자열 f의 마지막 문자는 아래와 같이 얻을 수 있다. 
char ch3=f.at(f.length()-1); // ch3은 '+'&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;문자열의 숫자 변환, stoi()&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;문자열을 숫자로 변환하는 전역 함수 stoi()가 있다.&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1680872809997&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;string year=&quot;2014&quot;;
int n=stoi(year); // n은 정수 2014 값을 가진다.&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;문자 다루기&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;string은 문자열만 다루지 문자를 다루는 기능은 없다. &lt;b&gt;문자를 다루는 함수&lt;/b&gt;는 &amp;lt;locale&amp;gt; 헤더 파일에 존재한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음은 &lt;b&gt;&amp;lt;locale&amp;gt; 헤더 파일&lt;/b&gt;에 있는 &lt;b&gt;toupper(), isdigit(), isalpha()&lt;/b&gt; 함수를 사용하는 예이다.&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1680873390753&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;string a=&quot;hello&quot;;
for(int i=0;i&amp;lt;a.length();i++) a[i]=toupper(a[i]); //a가 &quot;HELLO&quot;로 변경 
cout &amp;lt;&amp;lt; a; 
if(isdigit(a[0])) cout &amp;lt;&amp;lt; &quot;숫자&quot;;
else if (isalpha(a.at(0))) cout &amp;lt;&amp;lt; &quot;문자&quot;; // a[0]은 문자 'H'&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;toupper(int ch) : 대문자로 바꾸는 함수. tolower()를 하면 소문자로 바꾼다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;isdigit(int r) : &lt;span style=&quot;background-color: #ffffff; color: #242729; text-align: left;&quot;&gt;인자로 int 타입의 문자 1개를 전달받고, &lt;b&gt;숫자&lt;/b&gt;라면 &lt;b&gt;0이 아닌 값을 리턴&lt;/b&gt;. &lt;b&gt;숫자가 아니라면 0을 리턴&lt;/b&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #242729; text-align: left;&quot;&gt;isalpha(int ch) : &lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;알파벳 대문자 'A-Z'는 1 반환. 알파벳 소문자&amp;nbsp;'a-z'는 2 반환. 알파벳이&amp;nbsp;아닌것은 0을 반환&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;아래 코드는 문자열을 입력 받고 회전시키는 코드이다. [&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;생능 출팔사 명품C++프로그래밍 p.199&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;]&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1680875369857&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;iostream&amp;gt;
#include &amp;lt;string&amp;gt;
using namespace std;

int main(){
    string s;

    cout &amp;lt;&amp;lt;&quot;문자열을 입력하세요. 빈칸 가능 (한글X)&quot;&amp;lt;&amp;lt;endl;
    getline(cin,s,'\n');
    int len=s.length();

    for(int i=0;i&amp;lt;len;i++){
        string first=s.substr(0,1); //first에 s에서 문자 1개를 문자열로 분리한 것을 넣는다. 
        string sub=s.substr(1,len-1); //나머지 문자들을 문자열로 분리 
        s=sub+first;
        cout &amp;lt;&amp;lt; s &amp;lt;&amp;lt; endl;
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Programming Language/C++</category>
      <author>JIWANSEO</author>
      <guid isPermaLink="true">https://ordinary-student-study-record.tistory.com/31</guid>
      <comments>https://ordinary-student-study-record.tistory.com/31#entry31comment</comments>
      <pubDate>Fri, 7 Apr 2023 22:53:39 +0900</pubDate>
    </item>
    <item>
      <title>string 클래스 개요</title>
      <link>https://ordinary-student-study-record.tistory.com/30</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;string 클래스 개요&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;string 클래스는 &lt;b&gt;문자열의 크기에 맞추어 스스로 메모리 크기를 조절&lt;/b&gt;하므로 사용하기 매우 편리하다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1680840007895&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;string.str=&quot;I love&quot;; // str은 'I', ' ', 'l','o','v','e',' ' 의 7개 문자로 구성
str.append(&quot;C++.&quot;); //str은 &quot;I love c++&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;string 객체 생성&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1680840455579&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;string str; 
string address(&quot;부산광역시 사하구 하단동&quot;);
string copyAddress(address);

char text[]={'L','o','v','e',' ','c','+','+','\0'}; //C스트링
string title(text); // &quot;Love C++&quot;을 가진 string 객체 생성&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;string 객체가 가진 문자열 출력&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1680840500761&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;cout &amp;lt;&amp;lt; address &amp;lt;&amp;lt; endl;
cout &amp;lt;&amp;lt; title &amp;lt;&amp;lt; endl;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;string 객체의 동적 생성&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1680840578715&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;string *p=new string(&quot;C++&quot;);
cout &amp;lt;&amp;lt;*p ; 
p - &amp;gt; append(&quot;Great!!&quot;);
cout &amp;lt;&amp;lt;*p;
delete p;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;string 클래스를 이용한 문자열 생성 및 출력&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1680840922974&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include&amp;lt;iostream&amp;gt;
#include&amp;lt;string&amp;gt;
using namespace std;

int main(){
	string a1;
    string address=(&quot;부산광역시 사하구 하단동&quot;);
    string copyAddress(address);
    
    char text[]={'a','b','c','d','e','f','g','h','j'};
    string title(text);
    
    cout &amp;lt;&amp;lt; a1 &amp;lt;&amp;lt; endl ;
    cout &amp;lt;&amp;lt; address &amp;lt;&amp;lt; endl ;
    cout &amp;lt;&amp;lt; copyAddress &amp;lt;&amp;lt; endl ;
    cout &amp;lt;&amp;lt; title &amp;lt;&amp;lt; endl ;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;string 객체에 문자열 입력&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1680864082855&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;string name;
cin &amp;gt;&amp;gt; name;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;- '&amp;gt;&amp;gt;' 연산자는 사용하기 쉽지만, 공백 문자가 입력되면 그 앞까지 하나의 문자열로 다루기 때문에 &lt;b&gt;공백 문자를 포함하는 문자열은 읽어 들일 수 없다&lt;/b&gt;. 이런 문제는 &amp;lt;string&amp;gt; 헤더 파일에 선언된 getline()전역 함수를 이용하면 된다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt; getline()으로 공백 문자가 낀 한 라인의 문자열을 입력받는 예&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1680864294291&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;string name;
getline(cin,name,'\n'); // '\n'을 만날 때까지 키보드(cin)로부터 문자열을 읽어 name에 저장&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;위의 getline()은 cin.getline()과 다르다. getline()라인의 첫 번째 인자에는 cin을 두 번째 인자에는 string 객체를, 세 번째 인자에는 문자열에는 마지막을 표시하는 구분 문자를 준다. 앞의 코드는 '\n'을 만날 때까지 입력된 문자들을 name 객체에 문자열로 저장하는 코드이다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;아래 코드는 string 배열과 문자열 키 입력을 응용한 코드이다.&amp;nbsp; [생능 출판사 명품C++프로그래밍 p.193]&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1680869546518&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;iostream&amp;gt;
#include &amp;lt;string&amp;gt;
using namespace std;

int main(){
    string array[5]; 

    for (int i=0;i&amp;lt;5;i++){
        cout &amp;lt;&amp;lt; &quot;이름&amp;gt;&amp;gt;&quot;;
        getline(cin,array[i],'\n');
    }
    string latter=array[0];
    for (int i=1;i&amp;lt;5;i++){
        if(latter&amp;lt;array[i])
            latter=array[i];
    }
    cout&amp;lt;&amp;lt;&quot;사전에서 가장 뒤에 나오는 문자열은&quot;&amp;lt;&amp;lt;latter&amp;lt;&amp;lt;endl;

}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;문자열 다루기&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Programming Language/C++</category>
      <author>JIWANSEO</author>
      <guid isPermaLink="true">https://ordinary-student-study-record.tistory.com/30</guid>
      <comments>https://ordinary-student-study-record.tistory.com/30#entry30comment</comments>
      <pubDate>Fri, 7 Apr 2023 21:15:45 +0900</pubDate>
    </item>
    <item>
      <title>this의 기본 개념</title>
      <link>https://ordinary-student-study-record.tistory.com/28</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;this는 객체 자신에 대한 포인터로서 클래스의 멤버 함수 내에서만 사용된다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;this는 객체의 멤버 함수가 호출될 때, 컴파일러에 의해 보이지 않게 전달되는 객체에 대한 주소이다.&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1680838101221&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class Circle{
	int radius;
   public:
   	Circle(){ this-&amp;gt;radius=1;}
   	Circle(int radius){ this-&amp;gt;radius=radius; }
    void setRadius(int radius){this-&amp;gt;radius=radius;}
   };&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;this와 객체&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;각 객체 속의 this&lt;/b&gt;는 다른 객체 속의 this와 &lt;b&gt;서로 다른 포인터&lt;/b&gt;이다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;this가 필요한 경우&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1680838275896&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Circle(){
	this-&amp;gt;radius=1; // this-&amp;gt;를 생략하고 radius=1;로 해도 무관함
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;첫째로 &lt;b&gt;멤버 변수의 이름과 동일한 이름으로 매개 변수 이름을 짓고자 하는 경우&lt;/b&gt;이다.&lt;/p&gt;
&lt;pre id=&quot;code_1680838364976&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Circle(int radius){
	this-&amp;gt;radius=radius;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만약 위의 코드에서 this를 생략하여 작성하면, radius는 모두 매개 변수를 지칭하게 되어, 멤버 변수에 값을 쓰는 목적이 왜곡된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;둘째로&amp;nbsp; &amp;nbsp;&lt;b&gt;객체의 멤버 함수에서 객체 자신의 주소를 리턴할 때가 있다&lt;/b&gt;. 이때 this는 반드시 필요하다.&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1680838537619&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class Sample{
public:
	Sample*f() {
    	...
        return this; // 현재 객체의 주소 리턴
    }
};&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;연산자 중복을 구현할 때, 이런 경우가 많이 발생하며, this 없이는 연산자를 중복할 수 없는 경우도 있다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;this의 제약 조건&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-this는 클래스의 멤버 함수에서만 사용할 수 있다. 멤버가 아닌 함수에서는 어떤 객체에도 속하지 않았기에 this를 사용할 수 없다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-멤버 함수라도 정적 멤버 함수는 this를 사용할 수 없다. 정적 멤버 함수는 객체가 생성되기 전에 호출될 수 있으며, 정적 멤버 함수가 실행되는 시점에서 '현재 객체'는 존재하지 않을 수 있기 때문이다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Programming Language/C++</category>
      <author>JIWANSEO</author>
      <guid isPermaLink="true">https://ordinary-student-study-record.tistory.com/28</guid>
      <comments>https://ordinary-student-study-record.tistory.com/28#entry28comment</comments>
      <pubDate>Fri, 7 Apr 2023 12:57:03 +0900</pubDate>
    </item>
    <item>
      <title>객체 배열의 동적 생성 및 반환</title>
      <link>https://ordinary-student-study-record.tistory.com/27</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #666666;&quot;&gt;-객체 배열의 동적 생성과 생성자&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1680790231093&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;클래스이름*포인터변수=new 클래스이름 [배열크기];&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음 코드는 4개의 Circle 객체로 구성된 배열을 동적 생성하는 예이다.&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1680790392091&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Circle*pArray = new Circle[3]; //3개의 Circle 객체 배열의 동적 생성&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-new를 이용하여 동적으로 배열을 생성할 때, 다음과 같이 매개 변수 있는 생성자를 직접 호출할 수는 없다.&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1680790503958&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Circle *pArray=new Circle[3](30); //구문 오류, 컴파일 오류
----------------------------------------------------------

아래와 같이 배열을 각 원소 객체로 초기화 할 수 있다. 
Circle *pArray= new Circle[3] {Circle(1),Circle(2),Circle(3)};&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #666666;&quot;&gt;-객체 배열의 사용&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;동적으로 생성된 객체 배열은 보통 객체 배열처럼 사용.&lt;/p&gt;
&lt;pre id=&quot;code_1680790766619&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Circle *pArray=new Circle[3];

pArray[0].setRadius(10); // 배열의 첫 번째 객체의 setRadius() 멤버 함수 호출 
pArray[1].setRadius(20); 
pArray[2].setRadius(30);
for(int i-0; i&amp;lt;3; i++)
	count &amp;lt;&amp;lt; pArray[i].getArea(); //배열이 i 번째 객체의 getArea() 멤버 함수 호출&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #666666;&quot;&gt;-배열의 반환과 소멸자&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;delete 연산자를 이용하여 동적으로 할당받은 배열을 반환하는 형식.&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1680790822533&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;delete [] 포인터변수; // 포인터변수가 가리키는 배열을 반환한다.&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Circle 배열의 동적 생성 및 반환&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1680791131981&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;iostream&amp;gt; 
using namespace std;

class Circle{
	int radius;
public:
	Circle();
	Circle(int r);
	~Circle();
	void setRadius(int r){radius=r;}
	double getArea(){return 3.14*radius*radius;}
};

Circle::Circle(){
	radius=1;
	cout&amp;lt;&amp;lt;&quot;생성자 실행 radius=&quot;&amp;lt;&amp;lt;radius&amp;lt;&amp;lt;endl;
}

Circle::Circle(int r){
	radius= r;
	cout &amp;lt;&amp;lt; &quot;생성자 실행 radius=&quot;&amp;lt;&amp;lt;radius&amp;lt;&amp;lt;endl;
}

Circle::~Circle(){
	cout &amp;lt;&amp;lt; &quot;소멸자 실행 radius=&quot;&amp;lt;&amp;lt;radius&amp;lt;&amp;lt;endl;
}

int main(){
	Circle *pArray= new Circle[3]; //객체 배열의 동적 생성 
	pArray-&amp;gt;setRadius(10); 
	(pArray+1)-&amp;gt;setRadius(20);
	(pArray+2)-&amp;gt;setRadius(30);
	
	for(int i=0;i&amp;lt;3;i++){
		cout &amp;lt;&amp;lt; pArray[i].getArea()&amp;lt;&amp;lt;endl;
	}
	Circle *p= pArray; //포인터 p에 배열의 주소값 설정 
	for(int i=0; i&amp;lt;3; i++){
		cout &amp;lt;&amp;lt; p-&amp;gt;getArea() &amp;lt;&amp;lt;endl;
		p++; // 다음 원소의 주소로 증가  
	} 
	delete [] pArray; //객체 배열 반환  
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;[생능 출판사, 명품 C++ 프로그래밍] p.182&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;동적으로 할당받은 메모리는 반드시 반환해야 하는가?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;힙은 프로그램이 실행 중에 new를 이용해 동적으로 할당받아 사용할 수 있는 메모리이다.&amp;nbsp;할당 받은 후 필요 없게 된 메모리를 힙에 반환하지 않거나, 코딩 잘못으로 메모리 누수가 생기면, 힙에 메모리가 부족하여 할당받을 수 없게 되니 주의가 필요하다 . 다행스럽게도 프로그램 종료 시, 힙 전체가 운영체제에 의해 반환되므로 누수 메모리에 대한 걱정은 하지 않아도 된다.&amp;nbsp;&lt;/p&gt;</description>
      <category>Programming Language/C++</category>
      <author>JIWANSEO</author>
      <guid isPermaLink="true">https://ordinary-student-study-record.tistory.com/27</guid>
      <comments>https://ordinary-student-study-record.tistory.com/27#entry27comment</comments>
      <pubDate>Thu, 6 Apr 2023 23:28:30 +0900</pubDate>
    </item>
    <item>
      <title>C++ 동적 메모리 할당 및 반환</title>
      <link>https://ordinary-student-study-record.tistory.com/25</link>
      <description>&lt;p data-ke-size=&quot;size18&quot;&gt;C++에서는 동적 메모리 할당 및 반환을 위해&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;new와 delete 연산자를 이용한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;new 연산자는 힙(heap)이라는 공간으로부터 메모리를 할당받고,&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;delete 연산자는 할당받은 메모리를 힙으로 반환한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;new와 delete의 기본 활용&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1680785218934&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;데이터타입 *포인터변수 = new 데이터타입;
delete 포인터변수;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;new 연산자&lt;/b&gt;는 '데이터타입'의 크기만큼 힙으로부터 메모리를 할당받고 주소를 리턴한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;그 결과 '포인터변수'는 할당받은 메모리의 주소를 가진다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;delete 연산자&lt;/b&gt;는 '포인터변수'가 가리키는 메모리를 힙으로 반환한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;'데이터타입'은 int,char,double 등 기본 타입뿐 아니라 &lt;b&gt;구조체,클래스도 포함&lt;/b&gt;한다.&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1680785743770&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;int *pInt=new int;
char *pChar=new char;
Circle *pCircle=new Circle();

delete pInt;
delete pChar;
delete pCircle;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;동적 할당 메모리 초기화 &lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;new를 이용하여 메모리를 할당받을 때, 아래와 같이 '초깃값을' 지정하여 초기화할 수 있다.&lt;/p&gt;
&lt;pre id=&quot;code_1680785892954&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;데이터타입*포인터변수=new 데이터타입(초깃값);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;다음은 동적 할당을 받으면서 20과 'a' 문자로 초기화하는 예이다.&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1680785965505&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;int *pInt=new int(20); // 20으로 초기화된 int 공간 할당
char *pChar=new char('a'); // 'a'로 초기화된 char 공간 할당&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;delete&lt;/b&gt; 사용 시 주의&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;delete로 메모리를 반환할 때 적절하지 못한 포인터를 사용하면, 실행 오류가 발생한다. 다음 코드는 동적으로 할당받지 않는 메모리를 반환하여 실행 오류가 발생한다. 또한 메모리를 한번 반환하면, 중복 반환은 불가능.&lt;/p&gt;
&lt;pre id=&quot;code_1680786060989&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;int n;
int *p=&amp;amp;n;
delete p; // 실행 오류, p 가 가리키는 메모리는 동적 할당받은 것이 아님&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;배열의 동적 할당 및 반환&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;new와 delete 연산자로 배열을 할당받고 반환할 수 있다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-배열의 동적 할당 반환의 기본 형식&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1680786374923&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;데이터타입*포인터변수= new 데이터타입 [배열의 크기]; // 배열의 동적 할당 
delete [] 포인터변수; // 배열 메모리 반환 

---------예시----------
int *p= new int [5];
if(!p)
	return; //메모리 할당 실패 
 
for(int i=0;i&amp;lt;5;i++)
	p[i]=i; // 배열에 순서대로 0, 1, 2, 3, 4를 기록한다. 

delete [] p; //배열 메모리 반환&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 배열을 초기화할 때 주의사항&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;new로 배열을 동적 할당받을 때 아래와 같이 생성자를 통해 직접 '초깃값'을 지정할 수 없다.&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1680787746126&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;int *pArray=new int [10](20); //구문 오류, 배열의 초기화는 불가 
int *pArray=new int(20)[10]; //구문 오류&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 다음과 같이 초깃값을 지정할 수 있다.&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1680788068821&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;int *pArray=new int[] {1,2,3,4} // 1,2,3,4로 초기화된 정수 배열 생성&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-배열을 delete할 때 주의사항&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1680788334856&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;int *p= new int [10];
delete p; // 비정상 반환, delete [] p;로 해야 한다.
int *q= new int;
delete [] q; // 비정상 반환, delete q;로 해야 한다.&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Programming Language/C++</category>
      <author>JIWANSEO</author>
      <guid isPermaLink="true">https://ordinary-student-study-record.tistory.com/25</guid>
      <comments>https://ordinary-student-study-record.tistory.com/25#entry25comment</comments>
      <pubDate>Thu, 6 Apr 2023 22:42:34 +0900</pubDate>
    </item>
    <item>
      <title>객체 배열</title>
      <link>https://ordinary-student-study-record.tistory.com/24</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;객체 배열 선언 및 활용&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;객체 배열은 원소가 객체라는 점을 빼고, int, char 등 기본 타입의 배열을 선언하고 활용하는 방법과 동일.&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1680781935432&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;iostream&amp;gt;
using namespace std;

class Circle{
	int radius;
public :
	Circle(){radius=1;}
	Circle(int r){radius=r;}
	void setRadius(int r){radius=r;}
	double getArea();
};

double Circle::getArea(){
	return 3.14*radius*radius;
}

int main(){
	Circle circleArray[3];

	circleArray[0].setRadius(10);
	circleArray[1].setRadius(20);
	circleArray[2].setRadius(30);
	
	for (int i=0;i&amp;lt;3;i++){
		cout &amp;lt;&amp;lt; &quot;Circle&quot;&amp;lt;&amp;lt;i&amp;lt;&amp;lt;&quot;의 면적은&quot;&amp;lt;&amp;lt;circleArray[i].getArea()&amp;lt;&amp;lt;endl;
	}
	
	Circle *p;
	p=circleArray;
	for(int i=0;i&amp;lt;3;i++){
		cout &amp;lt;&amp;lt; &quot;Circle&quot;&amp;lt;&amp;lt;i&amp;lt;&amp;lt;&quot;의 면적은&quot;&amp;lt;&amp;lt;p-&amp;gt;getArea()&amp;lt;&amp;lt;endl;
		p++;
	}
	
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;위 코드는 생능 출판사의 명품 C++ 프로그래밍 p.161의 코드입니다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #1b711d;&quot;&gt;-객체 배열 선언문은 기본 생성자를 호출한다.&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #1b711d;&quot;&gt;-객체 배열 사용&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;배열의 각 원소 객체는 [] 연산자로 구분 한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;-배열 소멸과 소멸자&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;함수가 종료하면 함수 내에 선언된 배열도 소멸된다. 배열이 소멸되면, 모든 원소 객체가 소멸되며 각 원소 객체마다 소멸자가 호출된다. main()함수가 종료하면 circleArray 배열이 소멸되며, 높은 인덱스에서부터 원소 객체가 소멸되고, 각 객체마다 ~Circle() 소멸자가 실행된다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;객체 배열 초기화&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;객체 배열을 생성할 때 생성자를 사용하여 원소 객체를 초기화 가능하다.&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1680783468350&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Circle circleArray[3]={Circle(10), Circle(20), Circle()};&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다차원 객체 배열&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 2차원, 3차원 등 다차원 객체 배열을 만들 수 있다.&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1680784018504&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Circle circles[2][3];

circles[0][0].setRadius(1);
circles[0][1].setRadius(2);
circles[0][2].setRadius(3);
circles[1][0].setRadius(4);
circles[1][1]setRadius(5);
circles[1][2].setRadius(6);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Programming Language/C++</category>
      <author>JIWANSEO</author>
      <guid isPermaLink="true">https://ordinary-student-study-record.tistory.com/24</guid>
      <comments>https://ordinary-student-study-record.tistory.com/24#entry24comment</comments>
      <pubDate>Thu, 6 Apr 2023 21:33:16 +0900</pubDate>
    </item>
    <item>
      <title>C++ 객체 포인터와 객체 배열, 객체의 동적 생성</title>
      <link>https://ordinary-student-study-record.tistory.com/23</link>
      <description>&lt;pre id=&quot;code_1680763906193&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Circle donut;
double d=donut.getArea();

Circle*p; //객체에 대한 포인터 선언 
p=&amp;amp;donut; // 포인터에 객체 주소 저장 
d=p-&amp;gt;getArea(); // 멤버 함수 호출&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;background-color: #dddddd;&quot;&gt;객체에 대한 포인터 변수 선언&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;Circle 타입의 객체에 대한 포인터 변수 p는 다음과 같이 선언한다.&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1680764018121&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Circle *p;&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;background-color: #dddddd;&quot;&gt;포인터 변수에 객체 주소 지정&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1680764229886&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;p=&amp;amp;donut; //p에 donut 객체의 주소 저장

Circle*p=&amp;amp;donut; //포인터 변수 선언 시 객체 주소로 초기화&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;background-color: #dddddd;&quot;&gt;포인터를 이용한 객체 멤버 접근&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1680764364255&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;d= p-&amp;gt;getArea(); //포인터로 객체 멤버 함수 호출 

d=(*p).getArea();&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;초기화되지 않은 객체 포인터를 이용하면 오류 발생&lt;/p&gt;
&lt;pre id=&quot;code_1680764120709&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Circle *p;
p-&amp;gt;getArea(); // 실행 오류 빌생&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Programming Language/C++</category>
      <author>JIWANSEO</author>
      <guid isPermaLink="true">https://ordinary-student-study-record.tistory.com/23</guid>
      <comments>https://ordinary-student-study-record.tistory.com/23#entry23comment</comments>
      <pubDate>Thu, 6 Apr 2023 16:16:47 +0900</pubDate>
    </item>
  </channel>
</rss>