<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>성장 중!</title>
    <link>https://zooyaam.tistory.com/</link>
    <description></description>
    <language>ko</language>
    <pubDate>Thu, 23 Jul 2026 03:33:49 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>zooyaa</managingEditor>
    <image>
      <title>성장 중!</title>
      <url>https://tistory1.daumcdn.net/tistory/7004678/attach/e4fb25e16dec4350a1d4b609df874e88</url>
      <link>https://zooyaam.tistory.com</link>
    </image>
    <item>
      <title>[Web] HTMLCollection vs NodeList</title>
      <link>https://zooyaam.tistory.com/18</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;HTMLCollection과 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;NodeList는&lt;/span&gt; 모두 웹 브라우저에서 DOM 요소들을 묶어서 다루는 유사 배열 객체이다.&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;h3 style=&quot;color: #000000;&quot; data-ke-size=&quot;size23&quot;&gt;HTMLCollection&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/API/HTMLCollection&quot;&gt;https://developer.mozilla.org/ko/docs/Web/API/HTMLCollection&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1760078949954&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;HTMLCollection - Web API | MDN&quot; data-og-description=&quot;HTMLCollection은 구성요소를 이름과 인덱스로 동시에 직접 노출합니다. HTML ID는 :와 .을 유효한 문자로 포함할 수 있으므로 속성 접근 시에는 괄호 표기법을 사용해야 합니다. HTMLCollection은 배열 스&quot; data-og-host=&quot;developer.mozilla.org&quot; data-og-source-url=&quot;https://developer.mozilla.org/ko/docs/Web/API/HTMLCollection&quot; data-og-url=&quot;https://developer.mozilla.org/ko/docs/Web/API/HTMLCollection&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/API/HTMLCollection&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://developer.mozilla.org/ko/docs/Web/API/HTMLCollection&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;HTMLCollection - Web API | MDN&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;HTMLCollection은 구성요소를 이름과 인덱스로 동시에 직접 노출합니다. HTML ID는 :와 .을 유효한 문자로 포함할 수 있으므로 속성 접근 시에는 괄호 표기법을 사용해야 합니다. HTMLCollection은 배열 스&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;developer.mozilla.org&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 data-ke-size=&quot;size16&quot;&gt;HTML 요소 노드만 포함하며, DOM에서 실시간으로 변화가 반영되는 Live 객체다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;document.getElementById() 와 같은 메서드로 생성된다. 즉, DOM에 새로운 요소가 추가∙삭제되거나 기존 값이 변경되면 이 컬렉션에 바로 반영된다.&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;
&lt;pre id=&quot;code_1760079134129&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;document.body.innerHTML = `&amp;lt;p class=&quot;text&quot;&amp;gt;text&amp;lt;/p&amp;gt;`;

const paragraphs = document.getElementsByTagName(&quot;p&quot;);
console.log(paragraphs[0].className); // &quot;text&quot;

paragraphs[0].className = &quot;changed&quot;;
console.log(paragraphs[0].className); // &quot;changed&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;HTMLCollection은 Live 객체이기 때문에, DOM이 변경되면 자동으로 반영되는 것을 확인할 수 있다.&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;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;NodeList&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/API/NodeList&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://developer.mozilla.org/en-US/docs/Web/API/NodeList&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1760078734158&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;NodeList - Web APIs | MDN&quot; data-og-description=&quot;Although they are both considered NodeList objects, there are 2 varieties of NodeList: live and static. In most cases, the NodeList is live, which means that changes in the DOM automatically update the collection. For example, Node.childNodes is live: cons&quot; data-og-host=&quot;developer.mozilla.org&quot; data-og-source-url=&quot;https://developer.mozilla.org/en-US/docs/Web/API/NodeList&quot; data-og-url=&quot;https://developer.mozilla.org/en-US/docs/Web/API/NodeList&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/API/NodeList&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://developer.mozilla.org/en-US/docs/Web/API/NodeList&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;NodeList - Web APIs | MDN&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Although they are both considered NodeList objects, there are 2 varieties of NodeList: live and static. In most cases, the NodeList is live, which means that changes in the DOM automatically update the collection. For example, Node.childNodes is live: cons&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;developer.mozilla.org&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 data-ke-size=&quot;size16&quot;&gt;NodeList는 HTML 요소 뿐만 아니라 텍스트 노드, 주석 등 다양한 노드를 포함할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;document.querySelectorAll() 과 같은 메서드로 생성되며,&amp;nbsp;HTMLCollection과 달리 DOM 변경 후에도 변하지 않는 static한 컬렉션이다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;단, childNodes가 만든 NodeList는 예외적으로 Live 컬렉션이다.&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;h4 data-ke-size=&quot;size20&quot;&gt;예제&lt;/h4&gt;
&lt;pre id=&quot;code_1760079224144&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;document.body.innerHTML = `&amp;lt;p class=&quot;text&quot;&amp;gt;text&amp;lt;/p&amp;gt;`;

const paragraphs = document.querySelectorAll(&quot;.text&quot;);
console.log(paragraphs.length); // 1

paragraphs[0].className = &quot;changed&quot;;
console.log(paragraphs.length); // 1

const updated = document.querySelectorAll(&quot;.text&quot;);
console.log(updated.length); // 0&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;paragraphs는 클래스명이 text인 정적 컬렉션이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;paragraphs의 첫 번째 요소 클래스명을 changed로 변경했지만, NodeList는 정적이므로 변경 후 길이도 1이 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다시 querySelectorAll로 조회하면 새로운 상태가 반영되어 길이가 0으로 반환된다.&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;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>Web</category>
      <category>DOM API</category>
      <category>HTMLCollection</category>
      <category>NodeList</category>
      <category>Web API</category>
      <author>zooyaa</author>
      <guid isPermaLink="true">https://zooyaam.tistory.com/18</guid>
      <comments>https://zooyaam.tistory.com/18#entry18comment</comments>
      <pubDate>Fri, 10 Oct 2025 16:25:05 +0900</pubDate>
    </item>
    <item>
      <title>[CS] 타입스크립트의 컴파일 과정</title>
      <link>https://zooyaam.tistory.com/17</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;타입스크립트는 브라우저가 바로 이해할 수 없기 때문에 JS로 변환하는 과정이 필요하다.&lt;br /&gt;이 과정에서 타입스크립트 컴파일러(tsc)가 어떻게 코드를 JS로 트랜스파일하고, 타입 검사 및 추론 과정이 어떻게 진행되는지 살펴본다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1. Scanner (Lexer)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;연속된 글자인 소스코드를 컴파일러가 이해할 수 있는 의미 단위로 토큰화하는 과정이다.&lt;/p&gt;
&lt;pre class=&quot;nix&quot;&gt;&lt;code&gt;let age: number = 25;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이를 토큰화하면 &lt;code&gt;let&lt;/code&gt; &lt;code&gt;identifier(age)&lt;/code&gt; &lt;code&gt;:&lt;/code&gt; &lt;code&gt;number&lt;/code&gt; &lt;code&gt;=&lt;/code&gt; &lt;code&gt;25&lt;/code&gt; &lt;code&gt;;&lt;/code&gt; 로 분리된다.&lt;br /&gt;토큰 단위로 쪼개면 파서가 구조를 이해하기 쉬워진다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2. Parser&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;토큰을 AST(추상 구문 트리)로 변환한다.&lt;br /&gt;코드 구조를 트리 형태로 표현해 컴파일러가 변수, 함수, 클래스, 표현식 등을 분석할 수 있게 한다.&lt;/p&gt;
&lt;pre class=&quot;yaml&quot;&gt;&lt;code&gt;VariableDeclaration
 ├─ name: age
 ├─ type: number
 └─ initializer: 25&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3. Binder&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Parser에서 완성된 AST를 읽어 타입 검사에 필요한 데이터를 수집하는 과정이다.&lt;br /&gt;AST를 기반으로 Symbol Table을 구성하고, Scope를 관리하는 단계이다. 즉, 타입체크를 하기 전에 이름과 위치, 선언 정보를 미리 정리하는 과정!&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Symbol: 변수, 함수, 클래스 등 이름과 관련된 메타 정보
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;ex. 변수 이름, 타입, 선언 위치, 스코프 정보 등등...&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Scope: 이름이 유효한 범위
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;ex. 전역, 함수 내부, 블록 내부 등등 ...&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Binder는 AST를 순회하며 각 선언 노드를 발견하면 심볼 테이블에 등록하고, 스코프 계층 구조를 생성한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4. Type Checker&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Binder와 AST 정보를 이용해 정적 타입 검증을 수행한다. (변수, 함수 호출, 연산 등의 타입 일치 여부를 확인한다.)&lt;br /&gt;타입이 맞지 않으면 컴파일러가 에러를 발생시킨다. TS는 런타임 시점이 아닌 개컴파일 단계에서 타입 오류를 체크하는데, 이 오류 탐지를 수행하는 단계이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;5. Transpiling (Emitter)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;타입체크 결과와 AST를 기반으로, TS 코드를 JS 코드로 변환한다.&lt;br /&gt;타입 정보를 제거하고, 화살표 함수를 일반 함수로 변환하는 둥의 TS 문법을 JS 표준 문법으로 변환한다.&lt;/p&gt;
&lt;pre class=&quot;ebnf&quot;&gt;&lt;code&gt;var age = 25;&lt;/code&gt;&lt;/pre&gt;</description>
      <category>CS</category>
      <category>typescript</category>
      <category>컴파일러</category>
      <author>zooyaa</author>
      <guid isPermaLink="true">https://zooyaam.tistory.com/17</guid>
      <comments>https://zooyaam.tistory.com/17#entry17comment</comments>
      <pubDate>Sun, 21 Sep 2025 20:16:39 +0900</pubDate>
    </item>
    <item>
      <title>[CS] 컴파일러와 인터프리터, JIT</title>
      <link>https://zooyaam.tistory.com/16</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;더보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;컴파일러와 인터프리터는 모두 프로그래밍 언어를 실행 가능한 기계어로 번역하는 프로그램이다.&lt;br /&gt;컴파일러는 전체 소스코드를 한 번에 미리 번역해 실행 시 프로그램의 속도가 빠르지만, 디버깅이 어렵다.&lt;br /&gt;반면 인터프리터는 소스코드를 한 줄씩 중간 코드로 모두 번역한 후 실행하여 디버깅이 용이하지만, 프로그램 실행 속도가 느려질 수 있다.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1515&quot; data-origin-height=&quot;1344&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cOdqcg/btsQIWFE2HS/HT5bY6Vo0TxpAeP25Xvwck/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cOdqcg/btsQIWFE2HS/HT5bY6Vo0TxpAeP25Xvwck/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cOdqcg/btsQIWFE2HS/HT5bY6Vo0TxpAeP25Xvwck/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcOdqcg%2FbtsQIWFE2HS%2FHT5bY6Vo0TxpAeP25Xvwck%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;1515&quot; height=&quot;1344&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1515&quot; data-origin-height=&quot;1344&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;h3 data-ke-size=&quot;size23&quot;&gt;컴파일러 (Compiler)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ex. C, C++&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;장점&lt;/h4&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;h4 data-ke-size=&quot;size20&quot;&gt;단점&lt;/h4&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;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;인터프리터 (Interpreter)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ex. Python, JavaScript&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;장점&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;시스템 간의 이식성이 뛰어나다.&lt;br /&gt;&amp;rarr; 실행환경만 있으면 소스코드를 수행하지 않고도 다양한 OS에서 실행할 수 있다.&lt;/li&gt;
&lt;li&gt;코드를 수정하면 필요한 부분만 다시 번역하므로 코드 수정에 용이하다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;단점&lt;/h4&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;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;JIT (Just In Time)&lt;/h3&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;h4 data-ke-size=&quot;size20&quot;&gt;동작흐름&lt;/h4&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;인터프리트 or VM이 중간 코드로 변환&lt;/li&gt;
&lt;li&gt;JIT 컴파일러가 런타임에 중간 코드를 기계어로 변환&lt;/li&gt;
&lt;li&gt;CPU가 빠르게 실행&lt;/li&gt;
&lt;/ol&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;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;인터프리터보다 빠르다&lt;br /&gt;인터프리터는 한 줄씩 읽고 해석하는 반면, JIT는 실행 중에 기계어로 번역해놓고 실행하므로 훨씬 빠르다.&lt;/li&gt;
&lt;li&gt;컴파일러보다 유연하다&lt;br /&gt;컴파일러: 실행 전에 전체를 번역하고, 실행 파일을 생성하므로 이식성이 떨어진다.&lt;br /&gt;JIT: 실행 중에 번역하므로 여전히 이식성이 유지된다.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;최적화가 가능하다&lt;br /&gt;JIT은 실행 시점에 코드를 보면서 자주 실행되는 부분을 최적화할 수 있다.&lt;/li&gt;
&lt;/ul&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;
&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;실행 환경에 JIT 컴파일러가 필요하다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>CS</category>
      <category>jit</category>
      <category>인터프리터</category>
      <category>컴파일러</category>
      <author>zooyaa</author>
      <guid isPermaLink="true">https://zooyaam.tistory.com/16</guid>
      <comments>https://zooyaam.tistory.com/16#entry16comment</comments>
      <pubDate>Sun, 21 Sep 2025 18:08:27 +0900</pubDate>
    </item>
    <item>
      <title>[네부캠] 부스트캠프 웹∙모바일 10기 - 챌린지 후기</title>
      <link>https://zooyaam.tistory.com/15</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷_2022-08-11_오후_3.42.31.jpeg&quot; data-origin-width=&quot;600&quot; data-origin-height=&quot;250&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/LXowz/btsPUTQViNH/UIK3kySGrUr1ZYtVL1YA81/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/LXowz/btsPUTQViNH/UIK3kySGrUr1ZYtVL1YA81/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/LXowz/btsPUTQViNH/UIK3kySGrUr1ZYtVL1YA81/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FLXowz%2FbtsPUTQViNH%2FUIK3kySGrUr1ZYtVL1YA81%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;600&quot; height=&quot;250&quot; data-filename=&quot;스크린샷_2022-08-11_오후_3.42.31.jpeg&quot; data-origin-width=&quot;600&quot; data-origin-height=&quot;250&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1. 챌린지 입과 전&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;☑️ 퇴사와 지원&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;작은 스타트업에서 프론트엔드 개발자로 일하고 있었지만, 항상 이 길이 나와 맞는지에 대한 의문이 있었다.&lt;br /&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;br /&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;/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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1170&quot; data-origin-height=&quot;564&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/byUcjR/btsPS8uQaus/5vKcfyq68AsVDESbsMYYHk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/byUcjR/btsPS8uQaus/5vKcfyq68AsVDESbsMYYHk/img.jpg&quot; data-alt=&quot;나의 첫 일주년 !&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/byUcjR/btsPS8uQaus/5vKcfyq68AsVDESbsMYYHk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbyUcjR%2FbtsPS8uQaus%2F5vKcfyq68AsVDESbsMYYHk%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;616&quot; height=&quot;297&quot; data-origin-width=&quot;1170&quot; data-origin-height=&quot;564&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;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;h4 data-ke-size=&quot;size20&quot;&gt;☑️ 베이직&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;베이직은 힘들었다!  ..&lt;br /&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;/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;br /&gt;앞서 말했듯, 나는 자신감이 정말정말 부족했다. 그래서 타인에게 내 코드를 보여주는 상황이 너무 싫었다. 하지만 싫다고 피하면 안될 일이라는 것도 잘 알고 있어서 최대한 노력했다.&lt;br /&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;h3 data-ke-size=&quot;size23&quot;&gt;2. 챌린지에서 얻어가는 것&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;챌린지는 힘들었다! 진짜 힘들었다!!&lt;br /&gt;그리고 너무너무 잘하고 싶었다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;☑️ 자신감&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;챌린지에서도 자신감을 쌓을 수 있었다!&lt;br /&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;br /&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;☑️ CS 지식과 학습의 재미&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;CS를 제대로 공부해본 경험이 없다. 사실 CS의 필요성도 깨닫지 못해서 자격증 취득을 위해 단순 암기만 했다. 그래서 얼마가지 않아 다 잊어버리곤 했다.&lt;br /&gt;하지만 챌린지는 CS 지식을 만들면서 배우게 된다. 러닝바이두잉! 러바두!&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;이전에는 CS를 접할 때마다 그래서 이걸 어떻게 적용한다는 건지.. 적용하면 뭐가 어떻다는 건지.. 의문만 가득하고 아무것도 와닿지 않았었다. 그런데 챌린지에서는 과제를 직접 해결하는 과정에서 직접 개념을 적용해볼 수 있었다.&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&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1778&quot; data-origin-height=&quot;448&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/XKw3t/btsPSOJ5h0W/oDFF22j9kv4bU2rX20W1pk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/XKw3t/btsPSOJ5h0W/oDFF22j9kv4bU2rX20W1pk/img.png&quot; data-alt=&quot;학습정리 중 재미를 느꼈던 기록&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/XKw3t/btsPSOJ5h0W/oDFF22j9kv4bU2rX20W1pk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FXKw3t%2FbtsPSOJ5h0W%2FoDFF22j9kv4bU2rX20W1pk%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;1778&quot; height=&quot;448&quot; data-origin-width=&quot;1778&quot; data-origin-height=&quot;448&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;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;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;☑️ 설계의 중요성&lt;/h4&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;그러던 중 다른 분의 gist에서 설계 과정을 구체적으로 기록해둔 문서를 보게 되었다. 그 문서를 통해 설계를 어떻게 받아들이고, 어떻게 진행했는지 흐름을 파악할 수 있었다.&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;/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;나는 초반에 세운 설계를 끝까지 고수해야 한다는 생각 때문에 오히려 더 어려움을 겪었다. 그런데 동료분의 문서를 보면서 처음 설계는 당연히 틀릴 수 있고, 틀렸다면 바꾸면 된다는 사실을 확실히 깨달았다.&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;/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;어쩌면 내가 어떤 개발을 시작할 때 더 어려움을 느꼈던 이유는 설계를 해보지 않았기 때문이 아닐까 ~!&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;h3 data-ke-size=&quot;size23&quot;&gt;3. 챌린지를 마무리하며 ~&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;호기롭게 퇴사를 결정했지만, 항상 마음 한 켠이 찝찝했었는데 완전히 없어졌다.&lt;br /&gt;네부캠을 할 때마다 내가 틀린 선택을 하지 않았다고 해주는 것 같아서 혼자 위로받곤 했다.&lt;/p&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;640&quot; data-origin-height=&quot;512&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rIw9V/btsPURZOGPx/PrsqXUgB0bVUGKibSlM2UK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rIw9V/btsPURZOGPx/PrsqXUgB0bVUGKibSlM2UK/img.jpg&quot; data-alt=&quot;내가 조와하는 박명수 아즈씨&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rIw9V/btsPURZOGPx/PrsqXUgB0bVUGKibSlM2UK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FrIw9V%2FbtsPURZOGPx%2FPrsqXUgB0bVUGKibSlM2UK%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;485&quot; height=&quot;388&quot; data-origin-width=&quot;640&quot; data-origin-height=&quot;512&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;p data-ke-size=&quot;size16&quot;&gt;멤버십에서도 내가 틀리지 않았다는 것을 보여주지 !!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;화이팅 ~ !!&lt;/p&gt;</description>
      <category>경험들</category>
      <category>네부캠</category>
      <category>회고</category>
      <author>zooyaa</author>
      <guid isPermaLink="true">https://zooyaam.tistory.com/15</guid>
      <comments>https://zooyaam.tistory.com/15#entry15comment</comments>
      <pubDate>Sun, 17 Aug 2025 23:07:18 +0900</pubDate>
    </item>
    <item>
      <title>[CS] Unix와 Linux</title>
      <link>https://zooyaam.tistory.com/11</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. Unix&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1.1 유닉스 탄생 배경 ( + C언어의 탄생 ! )&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://joone.net/2017/02/18/%ec%9c%a0%eb%8b%89%ec%8a%a4%ec%99%80-c%ec%96%b8%ec%96%b4/&quot;&gt;https://joone.net/2017/02/18/%ec%9c%a0%eb%8b%89%ec%8a%a4%ec%99%80-c%ec%96%b8%ec%96%b4/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1752946565338&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;8. 유닉스와 C언어&quot; data-og-description=&quot;1960년대 MIT에서 ITS(Incompatible Timesharing System)가 한창 개발되고 있는 동안, 미 동부의 다른 곳에서도 해커의 기운이 물씬 풍기는 곳이 있었는데, 바로 벨 연구소(AT&amp;amp;T Bell Laboratories)였다. 여기서 앞으&quot; data-og-host=&quot;joone.net&quot; data-og-source-url=&quot;https://joone.net/2017/02/18/%ec%9c%a0%eb%8b%89%ec%8a%a4%ec%99%80-c%ec%96%b8%ec%96%b4/&quot; data-og-url=&quot;https://joone.net/2017/02/18/%ec%9c%a0%eb%8b%89%ec%8a%a4%ec%99%80-c%ec%96%b8%ec%96%b4/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/rslbg/hyZnce3rXJ/I9JsFSYDicHwImgDjz2Nk1/img.png?width=1603&amp;amp;height=827&amp;amp;face=0_0_1603_827,https://scrap.kakaocdn.net/dn/zJc2a/hyZnfpiPMD/iAz9qIYf6DhkHAEi0Kb5K0/img.png?width=640&amp;amp;height=330&amp;amp;face=0_0_640_330,https://scrap.kakaocdn.net/dn/bxQ6eG/hyZnkc59im/BvUtmYvDcgIXVsDtWyziy0/img.png?width=1603&amp;amp;height=827&amp;amp;face=0_0_1603_827&quot;&gt;&lt;a href=&quot;https://joone.net/2017/02/18/%ec%9c%a0%eb%8b%89%ec%8a%a4%ec%99%80-c%ec%96%b8%ec%96%b4/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://joone.net/2017/02/18/%ec%9c%a0%eb%8b%89%ec%8a%a4%ec%99%80-c%ec%96%b8%ec%96%b4/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/rslbg/hyZnce3rXJ/I9JsFSYDicHwImgDjz2Nk1/img.png?width=1603&amp;amp;height=827&amp;amp;face=0_0_1603_827,https://scrap.kakaocdn.net/dn/zJc2a/hyZnfpiPMD/iAz9qIYf6DhkHAEi0Kb5K0/img.png?width=640&amp;amp;height=330&amp;amp;face=0_0_640_330,https://scrap.kakaocdn.net/dn/bxQ6eG/hyZnkc59im/BvUtmYvDcgIXVsDtWyziy0/img.png?width=1603&amp;amp;height=827&amp;amp;face=0_0_1603_827');&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;8. 유닉스와 C언어&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;1960년대 MIT에서 ITS(Incompatible Timesharing System)가 한창 개발되고 있는 동안, 미 동부의 다른 곳에서도 해커의 기운이 물씬 풍기는 곳이 있었는데, 바로 벨 연구소(AT&amp;amp;T Bell Laboratories)였다. 여기서 앞으&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;joone.net&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 data-ke-size=&quot;size16&quot;&gt;미국 AT&amp;amp;T 벨 연구소의 개발자들은 모든 컴퓨터에서 돌아가는 하나의 운영체제를 만들겠다는 Multics 프로젝트를 꿈꾸고 있었다.&lt;br /&gt;하지만 바램과 달리, 너무 많은 기능으로 코드가 복잡했고, 계속되는 일정 지연에 Multics를 포기하게 된다.&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;이 상황을 아쉬워한 개발자 켄 톰프슨은 Multics의 아이디어를 기반으로, 가볍도 단순한 운영체제를 만들기 위해 동료 데니스 리치와 작은 실험을 시작하게 된다.&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;/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;켄 톰프슨이 어셈블리어의 불편함을 느껴, 고급언어를 만들기로 결심하는데, 그렇게 만들어진게 B언어!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;허나, 그렇게 만들어진 B언어도 인터프리터 기반이라 속도가 느리고, 자료형이 부족해 시스템 개발에 한계가 있었다.&lt;br /&gt;그래서 그의 동료, 데니스 리치가 컴파일러 기반의 C언어를 탄생시킨다!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1.2 유닉스의 특징&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;초기의 유닉스는 하드웨어 자원이 부족했던 시절에 만들어졌기 때문에, 작고 효율적인 설계를 특징으로 한다.&lt;br /&gt;이후에도 유닉스 계열 운영체제들은 다음과 같은 특징들을 계승해왔다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;멀티태스킹 Multitasking&lt;br /&gt;여러 작업(프로세스)을 동시에 처리할 수 있다.&lt;/li&gt;
&lt;/ol&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; start=&quot;2&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;멀티유저 Multiuser&lt;br /&gt;하나의 컴퓨터를 여러 사용자가 동시에 사용할 수 있다.&lt;br /&gt;서버 환경에서 매우 중요한 개념이다.&lt;/li&gt;
&lt;/ol&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; start=&quot;3&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;계층적 파일 시스템&lt;br /&gt;디렉토리 구조가 트리 형태로 구성되어있다.&lt;br /&gt;루트(/)를 기준으로 정리된 구조는 현대 운영체제 파일 시스템의 기초가 되었다.&lt;/li&gt;
&lt;/ol&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; start=&quot;4&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;장치 독립성&lt;br /&gt;장치도 파일처럼 취급한다.&lt;br /&gt;하드디스크, 프린터, 터미널 등 모든 장치를 파일처럼 다룰 수 있어, 일관된 처리가 가능하다.&lt;/li&gt;
&lt;/ol&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; start=&quot;5&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;셸과 도구 기반 철학&lt;br /&gt;셸(Shell) 이라는 인터페이스를 통해 명령어로 시스템을 제어한다.&lt;br /&gt;하나의 도구는 하나의 일만 잘하라는 철학을 기반으로 한다.&lt;br /&gt;파이프를 사용해 여러 명령어를 조합할 수 있다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이러한 철학은 이후 Linux, macOS, 도커(Docker), 쿠버네티스(Kubernetes) 같은 현대 기술에도 영향을 미치게된다.&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;h2 data-ke-size=&quot;size26&quot;&gt;2. Linux&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2.1 리눅스 탄생 배경&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://joone.net/2018/09/27/26-%EB%A6%AC%EB%88%85%EC%8A%A4-%EC%9D%B4%EC%95%BC%EA%B8%B0-%EB%A6%AC%EB%88%84%EC%8A%A4-%ED%86%A0%EB%B0%9C%EC%A6%88%EC%9D%98-%EC%96%B4%EB%A6%B0%EC%8B%9C%EC%A0%88/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://joone.net/2018/09/27/26-%EB%A6%AC%EB%88%85%EC%8A%A4-%EC%9D%B4%EC%95%BC%EA%B8%B0-%EB%A6%AC%EB%88%84%EC%8A%A4-%ED%86%A0%EB%B0%9C%EC%A6%88%EC%9D%98-%EC%96%B4%EB%A6%B0%EC%8B%9C%EC%A0%88/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1752947325918&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;26. 리눅스 이야기: 리누스 토발즈의 어린시절&quot; data-og-description=&quot;오늘날 수 많은 컴퓨터와 여러 장치를 움직이는 리눅스는 1991년 핀란드에 사는 리누스 토발즈라는 대학생이 공개한 운영체제 커널 코드로 시작한다. 리누스의 어린 시절 리누스는 외할아버지 &quot; data-og-host=&quot;joone.net&quot; data-og-source-url=&quot;https://joone.net/2018/09/27/26-%EB%A6%AC%EB%88%85%EC%8A%A4-%EC%9D%B4%EC%95%BC%EA%B8%B0-%EB%A6%AC%EB%88%84%EC%8A%A4-%ED%86%A0%EB%B0%9C%EC%A6%88%EC%9D%98-%EC%96%B4%EB%A6%B0%EC%8B%9C%EC%A0%88/&quot; data-og-url=&quot;https://joone.net/2018/09/27/26-%eb%a6%ac%eb%88%85%ec%8a%a4-%ec%9d%b4%ec%95%bc%ea%b8%b0-%eb%a6%ac%eb%88%84%ec%8a%a4-%ed%86%a0%eb%b0%9c%ec%a6%88%ec%9d%98-%ec%96%b4%eb%a6%b0%ec%8b%9c%ec%a0%88/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/clZwiS/hyZnkEdHFY/tu8DRcHInSqqlIp5rS1Zu1/img.png?width=1474&amp;amp;height=1316&amp;amp;face=0_0_1474_1316,https://scrap.kakaocdn.net/dn/bokhGr/hyZntVidjx/vO3B3dHfsn32i6MjZu1ibk/img.png?width=1474&amp;amp;height=1316&amp;amp;face=0_0_1474_1316,https://scrap.kakaocdn.net/dn/eMYKL/hyZnbtJSmd/WrKqePifLc4V4k6AxILW6K/img.png?width=1542&amp;amp;height=1136&amp;amp;face=0_0_1542_1136&quot;&gt;&lt;a href=&quot;https://joone.net/2018/09/27/26-%EB%A6%AC%EB%88%85%EC%8A%A4-%EC%9D%B4%EC%95%BC%EA%B8%B0-%EB%A6%AC%EB%88%84%EC%8A%A4-%ED%86%A0%EB%B0%9C%EC%A6%88%EC%9D%98-%EC%96%B4%EB%A6%B0%EC%8B%9C%EC%A0%88/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://joone.net/2018/09/27/26-%EB%A6%AC%EB%88%85%EC%8A%A4-%EC%9D%B4%EC%95%BC%EA%B8%B0-%EB%A6%AC%EB%88%84%EC%8A%A4-%ED%86%A0%EB%B0%9C%EC%A6%88%EC%9D%98-%EC%96%B4%EB%A6%B0%EC%8B%9C%EC%A0%88/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/clZwiS/hyZnkEdHFY/tu8DRcHInSqqlIp5rS1Zu1/img.png?width=1474&amp;amp;height=1316&amp;amp;face=0_0_1474_1316,https://scrap.kakaocdn.net/dn/bokhGr/hyZntVidjx/vO3B3dHfsn32i6MjZu1ibk/img.png?width=1474&amp;amp;height=1316&amp;amp;face=0_0_1474_1316,https://scrap.kakaocdn.net/dn/eMYKL/hyZnbtJSmd/WrKqePifLc4V4k6AxILW6K/img.png?width=1542&amp;amp;height=1136&amp;amp;face=0_0_1542_1136');&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;26. 리눅스 이야기: 리누스 토발즈의 어린시절&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;오늘날 수 많은 컴퓨터와 여러 장치를 움직이는 리눅스는 1991년 핀란드에 사는 리누스 토발즈라는 대학생이 공개한 운영체제 커널 코드로 시작한다. 리누스의 어린 시절 리누스는 외할아버지&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;joone.net&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 data-ke-size=&quot;size16&quot;&gt;리누스 토르발즈는 개인용 컴퓨터에서 돌아가는 유닉스 같은 운영체제가 필요했다.&lt;br /&gt;당시 Minix라는 교육용 유닉스를 사용했지만, 운영체제 교육이 주 목적인 미닉스는 다소 불완전했다. 미닉스는 오픈소스가 아니었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&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;유닉스는 유료였기 때문에 많은 사람들이 유닉스같은 무료 운영체제를 만들고자 GNU 프로젝트에 참여했다.&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;이렇게 GNU 프로젝트가 만들어놓은 툴과 리눅스 커널이 합쳐지면서 완전한 운영체제로 성장했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2.2 리눅스의 특징&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;리눅스는 유닉스의 철학을 계승하면서도, 오픈소스 커뮤니티 중심으로 발전해왔다는 점에서 고유한 특징을 가진다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;오픈소스&lt;br /&gt;누구나 소스를 열람, 수정, 배포 가능하다.&lt;br /&gt;이 덕분에 전 세계 개발자들이 함께 개발에 참여할 수 있다.&lt;/li&gt;
&lt;/ol&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; start=&quot;2&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;유닉스 철학 계승&lt;br /&gt;작은 도구들을 조합해 더 큰 기능을 만들어라 : 작은 명령어들을 연결해 복잡한 작업 처리가 가능하다.&lt;br /&gt;텍스트 기반 인터페이스 : 입출력을 텍스트로 처리했다.&lt;br /&gt;bash 셸을 통해 강력한 명령어 조합이 가능하다.&lt;/li&gt;
&lt;/ol&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; start=&quot;3&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;다양한 배포판&lt;br /&gt;우분투(Ubuntu), 페도라(Fedora), 데비안(Debian), 아치(Arch), 칼리(Kali) 등등.. 수많은 변종이 존재한다.&lt;br /&gt;용도에 따라 서버용, 데스크탑용, 임베디드용 등이 존재한다.&lt;/li&gt;
&lt;/ol&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; start=&quot;4&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;뛰어난 안정성과 보안성&lt;br /&gt;서버 운영체제로 가장 많이 사용된다. (웹 서버, 클라우드, 슈퍼 컴퓨터 등)&lt;br /&gt;커널 수준에서 사용자 권한을 엄격히 관리한다.&lt;/li&gt;
&lt;/ol&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; start=&quot;5&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;하드웨어 독립성&lt;br /&gt;다양한 아키텍처에서 구동할 수 있다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2.3 유닉스와 리눅스의 차이점&lt;/h3&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;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style8&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 15.8914%;&quot;&gt;항목&lt;/td&gt;
&lt;td style=&quot;width: 40.3101%;&quot;&gt;Unix&lt;/td&gt;
&lt;td style=&quot;width: 43.7984%;&quot;&gt;Linux&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 15.8914%;&quot;&gt;개발 목적&lt;/td&gt;
&lt;td style=&quot;width: 40.3101%;&quot;&gt;대형 시스템 범용 OS&lt;/td&gt;
&lt;td style=&quot;width: 43.7984%;&quot;&gt;개인용 컴퓨터에서 사용하기 위한 무료 OS&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 15.8914%;&quot;&gt;라이선스&lt;/td&gt;
&lt;td style=&quot;width: 40.3101%;&quot;&gt;대부분 상업적, 유료&lt;/td&gt;
&lt;td style=&quot;width: 43.7984%;&quot;&gt;오픈소스, 무료&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 15.8914%;&quot;&gt;POSIX 호환성&lt;/td&gt;
&lt;td style=&quot;width: 40.3101%;&quot;&gt;원조이자 기준&lt;/td&gt;
&lt;td style=&quot;width: 43.7984%;&quot;&gt;대부분이 호환된다. (POSIX 준수)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&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;/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;2.3.1 POSIX?&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;POSIX는 Portable Operating System Interface의 약자로, 운영체제 간의 호환성을 보장하기 위해 만들어진 표준 인터페이스이다.&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;리눅스든, 유닉스든, POSIX 규칙을 지키면&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;소프트웨어가 큰 수정없이 여러 운영체제에서 돌아갈 수 있다!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  즉, 운영체제 세계의 공통 API 규칙집!&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;POSIX 규정&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;ls, cd, echo, find등 쉘 명령어의 기본 동작 방식&lt;/li&gt;
&lt;li&gt;fork(), exec(), read()등 프로그래밍 인터페이스&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;&amp;nbsp;&lt;/p&gt;</description>
      <category>CS</category>
      <category>Linux</category>
      <category>UNIX</category>
      <author>zooyaa</author>
      <guid isPermaLink="true">https://zooyaam.tistory.com/11</guid>
      <comments>https://zooyaam.tistory.com/11#entry11comment</comments>
      <pubDate>Sun, 20 Jul 2025 03:09:02 +0900</pubDate>
    </item>
    <item>
      <title>[CS] Git이란, (+ Gist)</title>
      <link>https://zooyaam.tistory.com/10</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;Git&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Git이란, 분산형 버전 관리 시스템(Distributed Version Control System, DVCS) 의 한 종류입니다.&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;
&lt;p data-ke-size=&quot;size16&quot;&gt;먼저, 버전 관리 시스템(Version Control System, VCS)은 &lt;b&gt;파일(코드)의 변경 이력을 저장하고, 이전 상태로 되돌리거나 변경 사항을 추적할 수 있도록 도와주는 도구&lt;/b&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;h4 data-ke-size=&quot;size20&quot;&gt;중앙형 vs 분산형&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이러한 버전 관리 시스템은 크게 중앙형(Centralized)과 분산형(Distributed)로 나뉩니다.&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 53px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 19px;&quot;&gt;중앙형&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 19px;&quot;&gt;분산형&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;SVN&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;Git&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;- 모든 작업 이력(버전 정보)은 서버에만 저장됨&lt;br /&gt;- 개발자는 서버에서 최신 버전만 내려받고 작업 함&lt;br /&gt;- 서버가 고장나면 전체 프로젝트에 영향을 줌&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;- 모든 개발자가 서버 + 로컬에 전체 이력을 복사해 가짐&lt;br /&gt;- 서버 없이도 혼자 작업, 커밋, 되돌리기 등 대부분이 가능함&lt;br /&gt;- 서버와 동기화하면 협업이 완료됨&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위로 알 수 있듯이, 중앙형 VCS과 달리 분산형 VCS는 서버가 고장나도 비교적 안전하며, 오프라인 작업이 더 수월합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만약 Git을 사용하는 팀에서 서버가 터졌다해도, 개발자들의 로컬 저장소에 전체 히스토리가 남아있기 때문에 복구가 가능합니다.&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;이러한 이유가 분산형 VCS인 Git이 선택받는 이유 중 하나입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1177&quot; data-origin-height=&quot;808&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bTL1ZL/btsPgZZLV78/Enc7HVkjFJEkNHtb9VIlM1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bTL1ZL/btsPgZZLV78/Enc7HVkjFJEkNHtb9VIlM1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bTL1ZL/btsPgZZLV78/Enc7HVkjFJEkNHtb9VIlM1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbTL1ZL%2FbtsPgZZLV78%2FEnc7HVkjFJEkNHtb9VIlM1%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;1177&quot; height=&quot;808&quot; data-origin-width=&quot;1177&quot; data-origin-height=&quot;808&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;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Gist&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Gist란 Github에서 제공하는 코드 공유 서비스입니다. 하나 또는 여러 개의 파일을 담을 수 있습니다. (폴더 X)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각각의 Gist는 자체 Git 저장소이기 때문에 git clone, commit, push, pull 같은 명령어들을 동일하게 사용 가능합니다.&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;GitHub vs Gist&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;깃허브 저장소도 코드 공유가 되는데, 굳이 Gist를 따로 사용하는 이유는?&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;깃허브는 폴더 구조를 잡고, 설정 파일을 생성하고, ... 등 절차가 무겁습니다. 반면 Gist는 제목, 공유할 부분만 코드 붙여넣기, 공개여부 선택이 끝이므로 '간단한 코드만 공유할 때'에 더 편리합니다.&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>CS</category>
      <category>GIST</category>
      <category>Git</category>
      <category>github</category>
      <author>zooyaa</author>
      <guid isPermaLink="true">https://zooyaam.tistory.com/10</guid>
      <comments>https://zooyaam.tistory.com/10#entry10comment</comments>
      <pubDate>Tue, 15 Jul 2025 01:33:49 +0900</pubDate>
    </item>
    <item>
      <title>[네부캠] 부스트캠프 웹∙모바일 10기 - 베이직 후기</title>
      <link>https://zooyaam.tistory.com/9</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1870&quot; data-origin-height=&quot;1106&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/vmWpS/btsPfHYHwtB/yl3Kwppzyni3n8pCd1dRQK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/vmWpS/btsPfHYHwtB/yl3Kwppzyni3n8pCd1dRQK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/vmWpS/btsPfHYHwtB/yl3Kwppzyni3n8pCd1dRQK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FvmWpS%2FbtsPfHYHwtB%2Fyl3Kwppzyni3n8pCd1dRQK%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;1870&quot; height=&quot;1106&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1870&quot; data-origin-height=&quot;1106&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;베이직 과정&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2800&quot; data-origin-height=&quot;1666&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bf8gog/btsPg0JBb0s/Rw0AK7ZewBsPfT78KyJMyk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bf8gog/btsPg0JBb0s/Rw0AK7ZewBsPfT78KyJMyk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bf8gog/btsPg0JBb0s/Rw0AK7ZewBsPfT78KyJMyk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbf8gog%2FbtsPg0JBb0s%2FRw0AK7ZewBsPfT78KyJMyk%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;2800&quot; height=&quot;1666&quot; data-origin-width=&quot;2800&quot; data-origin-height=&quot;1666&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;h4 data-ke-size=&quot;size20&quot;&gt;1주차&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;첫 날은 OT를 진행하고, 미션이 뒤늦게 공개되었다. 다들 첫 날이라 쉬운 미션이 나왔다고들 하시던데.. 첫 날부터 모든 것을 완벽하게 해야 합격한다는 생각이 강하게 잡혀있었던 나는 21시가 넘어서 미션을 제출했다. 제출하고 둘러보니 내가 너무 오바한 것 같았다 ㅎㅎ. ..  &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;미션 수행, 해결에 집중하면 결과물이 있다할지 몰라도 결국 스스로 많은 것을 얻었다고 할 수는 없을 것 같았다. 이걸 첫 날에 깨달은게 정말 정말 다행.. 배움에 초점을 맞추고 내가 왜 베이직 과정에 입과했는지를 떠올리는 연습을 자주 했다.&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;h4 data-ke-size=&quot;size20&quot;&gt;2주차&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1주차보다 2주차가 어렵고 그런 건 딱히 없었다. 오히려 2주차 미션이 더 수월했다고 생각하는데 아마도 1주차에서 여러모로 힘듦을 경험했기에 2주차가 좀 덜 힘들게 느껴진 것 아닌가싶다.&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;2주차에 들어서면 네부캠의 학습 방식이 익숙해지고, 왜 이렇게 진행하는지를 점점 깨닫게 된다. 미션을 수행하며 내가 지금 무엇을 모르는지, 그래서 어떤 자료를 찾아봐야하는지를 명확히 알 수 있었다. 내 코드를 남에게 설명하는 방법, 용기를 얻게 된다. 사실 이게 너무 소중한 경험이었다.. 내 코드를 남에게 보여주는 것이 너무 부끄러웠는데 이제 반응이 없으면 너무 속상하닫 !!  &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;h3 data-ke-size=&quot;size23&quot;&gt;문제해결력 테스트&lt;/h3&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;시간 : 14시 ~ 17시 (3시간)&lt;br /&gt;환경 : 프로그래머스&lt;br /&gt;언어 : Javascript - 웹 풀스택 / Kotlin - 안드로이드 / Swift - iOS&lt;br /&gt;구성 : CS 12문제 / 서술형 1문제 / 코드 구현 3문제 (총 16문제, 검색 불가)&lt;br /&gt;난도 : 프로그래머스 Lv1~2 / 백준 실버 ~ 골드&lt;/blockquote&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;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;정말 놀랍게도 .. !! 시간이 부족해 2.5솔을 했다.. 대박.. 이 때 시험을 치르면서 내가 베이직으로 성장했구나를 제일 실감나게 느꼈다.&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;피어 피드백 시간에 클래스형으로 작성하신 분들의 코드를 몇 번 읽고 따라해봤던게 도움이 된 것 같다.&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;/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;이전 기수의 많은 분들이 베이직 과정이 문제해결력 테스트에 도움이 된다고들 하셔서 베이직의 미션과 유사한 미션이 출제되는 줄 알았다.&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;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;베이직을 마치며, 챌린지 입과까지&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1046&quot; data-origin-height=&quot;628&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c4fXhR/btsPhEF0Y7F/MDNkOoZcvk5rCFjwcKgKrk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c4fXhR/btsPhEF0Y7F/MDNkOoZcvk5rCFjwcKgKrk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c4fXhR/btsPhEF0Y7F/MDNkOoZcvk5rCFjwcKgKrk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc4fXhR%2FbtsPhEF0Y7F%2FMDNkOoZcvk5rCFjwcKgKrk%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;1046&quot; height=&quot;628&quot; data-origin-width=&quot;1046&quot; data-origin-height=&quot;628&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;베이직 2주 동안 정말 매일같이 열심히 달렸다. 그 덕분에 챌린지 과정에 입과할 수 있었다. ^ㅎㅎ&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;/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;h4 data-ke-size=&quot;size20&quot;&gt;네부캠은 강의를 하지 않는다.&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;네부캠은 강의를 해주지 않는다.&lt;br /&gt;대신 미션을 주고, 그걸 스스로의 방식으로 해결해야 한다. 불친절한 것도 같지만, 아마 이게 내가 2주 만에 성장할 수 있었던 핵심 이유가 아닐까 싶다.&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;p data-end=&quot;594&quot; data-start=&quot;469&quot; data-ke-size=&quot;size16&quot;&gt;하루종일 혼자 미션을 붙잡고 있는 것 같다가도, 피어 피드백 시간에 다들 얼마나 치열하게 고민했는지를 볼 수 있어서 괜히 함께 하는 느낌이 들었다. 그래서 미션이 너무 어려운 날에도 포기하지 않고 끝까지 해낼 수 있었다.&lt;/p&gt;
&lt;p data-end=&quot;594&quot; data-start=&quot;469&quot; 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;h4 data-ke-size=&quot;size20&quot;&gt;지속 가능한 개발자&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;네부캠은 &quot;개발을 잘하게 해준다!&quot;는 느낌보다는 &quot;어떻게 하면 개발을 잘할 수 있을까?&quot;를 스스로 경험하게 해준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;계속해서 강조되는 &quot;지속 가능한 개발자&quot;라는 말이 조금씩 구체적인 모습으로 자리 잡아가고 있는 것을 느낀다.&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;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;251&quot; data-origin-height=&quot;201&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/uwbCk/btsPggGmy6V/6wcp37KnKlwknkahepArY1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/uwbCk/btsPggGmy6V/6wcp37KnKlwknkahepArY1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/uwbCk/btsPggGmy6V/6wcp37KnKlwknkahepArY1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FuwbCk%2FbtsPggGmy6V%2F6wcp37KnKlwknkahepArY1%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;251&quot; height=&quot;201&quot; data-origin-width=&quot;251&quot; data-origin-height=&quot;201&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-end=&quot;757&quot; data-start=&quot;695&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;757&quot; data-start=&quot;695&quot; data-ke-size=&quot;size16&quot;&gt;챌린지도 화이팅!!! 아좌좌&lt;/p&gt;</description>
      <category>경험들</category>
      <category>네부캠</category>
      <category>회고</category>
      <author>zooyaa</author>
      <guid isPermaLink="true">https://zooyaam.tistory.com/9</guid>
      <comments>https://zooyaam.tistory.com/9#entry9comment</comments>
      <pubDate>Mon, 14 Jul 2025 02:02:37 +0900</pubDate>
    </item>
    <item>
      <title>[CS] 스택(Stack), 큐(Queue), 덱(Deque)</title>
      <link>https://zooyaam.tistory.com/8</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;스택 Stack&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;814&quot; data-origin-height=&quot;482&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/eft36L/btsO91u8CjR/TrOmd8Lnn57onA5M8oL3m0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/eft36L/btsO91u8CjR/TrOmd8Lnn57onA5M8oL3m0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/eft36L/btsO91u8CjR/TrOmd8Lnn57onA5M8oL3m0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Feft36L%2FbtsO91u8CjR%2FTrOmd8Lnn57onA5M8oL3m0%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;814&quot; height=&quot;482&quot; data-origin-width=&quot;814&quot; data-origin-height=&quot;482&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;189&quot; data-start=&quot;118&quot;&gt;&lt;b&gt;LIFO (Last In First Out)&lt;/b&gt;, &lt;b&gt;후입선출&lt;/b&gt; 방식의 선형 자료구조이다.&lt;/li&gt;
&lt;li data-end=&quot;237&quot; data-start=&quot;190&quot;&gt;가장 &lt;b&gt;마지막에 삽입된 데이터가 가장 먼저 제거&lt;/b&gt;된다.&lt;/li&gt;
&lt;li data-end=&quot;371&quot; data-start=&quot;238&quot;&gt;&lt;b&gt;주요 연산&lt;/b&gt;:
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;371&quot; data-start=&quot;253&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;286&quot; data-start=&quot;253&quot;&gt;push(item) : 데이터를 스택의 맨 위에 삽입&lt;/li&gt;
&lt;li data-end=&quot;321&quot; data-start=&quot;289&quot;&gt;pop() : 스택의 맨 위 데이터를 제거 및 반환&lt;/li&gt;
&lt;li data-end=&quot;371&quot; data-start=&quot;324&quot;&gt;peek() / top() : 가장 위에 있는 데이터를 제거하지 않고 조회&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-end=&quot;417&quot; data-start=&quot;372&quot;&gt;&lt;b&gt;제한 사항&lt;/b&gt;: 중간에 있는 데이터를 &lt;b&gt;직접 접근, 수정, 삭제 불가&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;504&quot; data-start=&quot;418&quot;&gt;&lt;b&gt;사용 예시&lt;/b&gt;:
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;504&quot; data-start=&quot;433&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;468&quot; data-start=&quot;433&quot;&gt;웹 브라우저의 뒤로 가기 기능 (방문 기록이 스택처럼 쌓임)&lt;/li&gt;
&lt;li data-end=&quot;480&quot; data-start=&quot;471&quot;&gt;괄호 짝 검사&lt;/li&gt;
&lt;li data-end=&quot;504&quot; data-start=&quot;483&quot;&gt;재귀 호출 처리 (함수 호출 스택)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&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;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;큐 Queue&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;572&quot; data-origin-height=&quot;225&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/C8H1r/btsO979G6LB/1aIL6yXDcqkGiS20mldLUk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/C8H1r/btsO979G6LB/1aIL6yXDcqkGiS20mldLUk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/C8H1r/btsO979G6LB/1aIL6yXDcqkGiS20mldLUk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FC8H1r%2FbtsO979G6LB%2F1aIL6yXDcqkGiS20mldLUk%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;572&quot; height=&quot;225&quot; data-origin-width=&quot;572&quot; data-origin-height=&quot;225&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;599&quot; data-start=&quot;528&quot;&gt;&lt;b&gt;FIFO (First In First Out)&lt;/b&gt;, 즉 &lt;b&gt;선입선출&lt;/b&gt; 방식의 선형 자료구조이다.&lt;/li&gt;
&lt;li data-end=&quot;668&quot; data-start=&quot;600&quot;&gt;먼저 들어온 데이터가 먼저 나가며, &lt;b&gt;한쪽에서는 삽입만&lt;/b&gt;, 다른 한쪽에서는 삭제만 수행한다.&lt;/li&gt;
&lt;li data-end=&quot;822&quot; data-start=&quot;669&quot;&gt;&lt;b&gt;주요 연산&lt;/b&gt;:
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;822&quot; data-start=&quot;684&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;726&quot; data-start=&quot;684&quot;&gt;enqueue(item) : 데이터를 &lt;b&gt;rear (뒤)&lt;/b&gt; 에 삽입&lt;/li&gt;
&lt;li data-end=&quot;774&quot; data-start=&quot;729&quot;&gt;dequeue() : 데이터를 &lt;b&gt;front (앞)&lt;/b&gt; 에서 제거 및 반환&lt;/li&gt;
&lt;li data-end=&quot;822&quot; data-start=&quot;777&quot;&gt;peek() : 데이터를 제거하지 않고 조회&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-end=&quot;890&quot; data-start=&quot;823&quot;&gt;&lt;b&gt;사용 예시&lt;/b&gt;:
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;890&quot; data-start=&quot;838&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;846&quot; data-start=&quot;838&quot;&gt;인쇄 대기열&lt;/li&gt;
&lt;li data-end=&quot;870&quot; data-start=&quot;849&quot;&gt;BFS (너비 우선 탐색) 알고리즘&lt;/li&gt;
&lt;li data-end=&quot;890&quot; data-start=&quot;873&quot;&gt;운영체제의 프로세스 스케줄링&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&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;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;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;덱 Deque&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;410&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bOj7Xp/btsO8D9OUj7/3dFR1WLngkvk5RmAT2kyd1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bOj7Xp/btsO8D9OUj7/3dFR1WLngkvk5RmAT2kyd1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bOj7Xp/btsO8D9OUj7/3dFR1WLngkvk5RmAT2kyd1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbOj7Xp%2FbtsO8D9OUj7%2F3dFR1WLngkvk5RmAT2kyd1%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;1280&quot; height=&quot;410&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;410&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;997&quot; data-start=&quot;934&quot;&gt;&lt;b&gt;양쪽에서 삽입과 삭제가 모두 가능한&lt;/b&gt; 선형 자료구조. 스택과 큐의 특성을 모두 가진다.&lt;/li&gt;
&lt;li data-end=&quot;1052&quot; data-start=&quot;998&quot;&gt;앞(front)과 뒤(rear) 양쪽에서 삽입과 삭제가 가능&lt;/li&gt;
&lt;li data-end=&quot;1176&quot; data-start=&quot;1053&quot;&gt;&lt;b&gt;주요 연산&lt;/b&gt;:
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1176&quot; data-start=&quot;1068&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1108&quot; data-start=&quot;1068&quot;&gt;push_front(item) / push_back(item)&lt;/li&gt;
&lt;li data-end=&quot;1141&quot; data-start=&quot;1111&quot;&gt;pop_front() / pop_back()&lt;/li&gt;
&lt;li data-end=&quot;1176&quot; data-start=&quot;1144&quot;&gt;peek_front() / peek_back()&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-end=&quot;1282&quot; data-start=&quot;1177&quot;&gt;&lt;b&gt;사용 예시&lt;/b&gt;:
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1282&quot; data-start=&quot;1192&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1231&quot; data-start=&quot;1192&quot;&gt;슬라이딩 윈도우 최대/최소 문제 (투 포인터 알고리즘과 함께 사용)&lt;/li&gt;
&lt;li data-end=&quot;1253&quot; data-start=&quot;1234&quot;&gt;회전 큐 (예: 요세푸스 문제)&lt;/li&gt;
&lt;li data-end=&quot;1282&quot; data-start=&quot;1256&quot;&gt;양방향 탐색 (양끝 삽입/삭제가 필요할 때)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&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>CS</category>
      <category>deque</category>
      <category>Queue</category>
      <category>Stack</category>
      <category>자료구조</category>
      <author>zooyaa</author>
      <guid isPermaLink="true">https://zooyaam.tistory.com/8</guid>
      <comments>https://zooyaam.tistory.com/8#entry8comment</comments>
      <pubDate>Tue, 8 Jul 2025 15:51:25 +0900</pubDate>
    </item>
    <item>
      <title>[BOJ] 2346번: 풍선 터뜨리기 자바스크립트 풀이 (메모리 초과)</title>
      <link>https://zooyaam.tistory.com/7</link>
      <description>&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;1. 문제&lt;/h3&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/2346&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.acmicpc.net/problem/2346&lt;/a&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2106&quot; data-origin-height=&quot;1214&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cy9Hxs/btsPapvm5KP/QB2t2XEJOjSwYlBD1Wk6lK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cy9Hxs/btsPapvm5KP/QB2t2XEJOjSwYlBD1Wk6lK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cy9Hxs/btsPapvm5KP/QB2t2XEJOjSwYlBD1Wk6lK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcy9Hxs%2FbtsPapvm5KP%2FQB2t2XEJOjSwYlBD1Wk6lK%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;2106&quot; height=&quot;1214&quot; data-origin-width=&quot;2106&quot; data-origin-height=&quot;1214&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;2. 풀이과정&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1740&quot; data-origin-height=&quot;610&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bFOGzK/btsO9LlH7l7/KEtR5Ud5YZwvptqDUkEJ5k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bFOGzK/btsO9LlH7l7/KEtR5Ud5YZwvptqDUkEJ5k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bFOGzK/btsO9LlH7l7/KEtR5Ud5YZwvptqDUkEJ5k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbFOGzK%2FbtsO9LlH7l7%2FKEtR5Ud5YZwvptqDUkEJ5k%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;1740&quot; height=&quot;610&quot; data-origin-width=&quot;1740&quot; data-origin-height=&quot;610&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;의사코드&lt;/h4&gt;
&lt;blockquote style=&quot;background-color: #fcfcfc; color: #666666; text-align: left;&quot; data-ke-style=&quot;style3&quot;&gt;1. 1번 풍선을 삭제한 후, 3칸 뒤로 이동한다.&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;[1]&lt;br /&gt;2. 4번 풍선을 삭제한 후, 3칸 앞으로 이동한다.&amp;nbsp; &amp;nbsp;[1, 4]&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 1번이 없으므로 5번으로 이동된다.&lt;br /&gt;3. 5번 풍선을 삭제한 후, 1칸 앞으로 이동한다.&amp;nbsp; &amp;nbsp; [1, 4, 5]&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 4번이 없으므로 3번으로 이동된다.&lt;br /&gt;4. 3번 풍선을 삭제한 후, 1칸 뒤로 이동한다.&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;[1, 4, 5, 3]&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 4번이 없으므로 5번으로 이동된다.&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 5번이 없으므로 1번으로 이동된다.&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 1번이 없으므로 2번으로 이동된다.&lt;br /&gt;5. 2번 풍선을 삭제한다.&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;[1, 4, 5, 3, 2]&lt;/blockquote&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;리스트의 앞, 뒤에서 삽입 삭제가 이루어진다. 리스트는 점점 줄어들며 회전한다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;즉, 앞 뒤를 동시에 다뤄야하는 회전 구조로 덱을 사용하는 것이 적합하다 판단했다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;전체코드&lt;/h4&gt;
&lt;pre id=&quot;code_1751954098021&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const readline = require('readline');

(async () =&amp;gt; {
    const rl = readline.createInterface({ input: process.stdin });
    
    const input = [];
    for await (const line of rl) {
        input.push(line.trim());
        if (input.length === 2) rl.close();
    }
    
    class Deque {
        constructor() {
            this.items = {};
            this.front = 0;
            this.rear = 0;
        }
        
        push_front(item) {
            this.front--;
            this.items[this.front] = item;
        }
        push_rear(item) {
            this.items[this.rear] = item;
            this.rear++;
        }
        pop_front() {
            if (this.isEmpty()) return undefined;
            const item = this.items[this.front];
            delete this.items[this.front];
            this.front++;
            return item;
        }
        pop_rear() {
            if (this.isEmpty()) return undefined;
            this.rear--;
            const item = this.items[this.rear];
            delete this.items[this.rear];
            return item;
        }
        isEmpty() {
            return this.size() === 0;
        }
        size() {
            return this.rear - this.front;
        }
    }
    
    const N = Number(input[0]);
    const nums = input[1].split(' ').map(Number);
    
    const deque = new Deque();
    for (let i = 0; i &amp;lt; N; i++) {
        deque.push_rear([i + 1, nums[i]]);
    }
    
    const result = [];
    while (!deque.isEmpty()) {
        const [idx, move] = deque.pop_front();
        result.push(idx);
        
        if (deque.isEmpty()) break;
        
        if (move &amp;gt; 0) {
            for (let i = 0; i &amp;lt; move - 1; i++) {
                deque.push_rear(deque.pop_front());
            }
        } else {
            for (let i = 0; i &amp;lt; -move; i++) {
                deque.push_front(deque.pop_rear());
            }
        }
    }
    
    console.log(result.join(' '));
})();&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;메모리 초과&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1490&quot; data-origin-height=&quot;486&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Dpoom/btsO8HqQhCd/uT8zCtJV0blensqWDhlVsk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Dpoom/btsO8HqQhCd/uT8zCtJV0blensqWDhlVsk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Dpoom/btsO8HqQhCd/uT8zCtJV0blensqWDhlVsk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FDpoom%2FbtsO8HqQhCd%2FuT8zCtJV0blensqWDhlVsk%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;1490&quot; height=&quot;486&quot; data-origin-width=&quot;1490&quot; data-origin-height=&quot;486&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;백준에서 코드를 제출하면 메모리 초과가 발생한다 ㅜㅜ..&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;게시판 보면 node.js로 성공한 사람이 거의 없을 정도로 드뭄..&amp;nbsp; 언어별 메모리 사용이 다르다는데 node.js로 풀기엔 메모리가 너무 작은 것 같다 !!!  &lt;/p&gt;</description>
      <category>Algorithm</category>
      <category>deque</category>
      <category>백준</category>
      <category>알고리즘</category>
      <author>zooyaa</author>
      <guid isPermaLink="true">https://zooyaam.tistory.com/7</guid>
      <comments>https://zooyaam.tistory.com/7#entry7comment</comments>
      <pubDate>Tue, 8 Jul 2025 15:34:25 +0900</pubDate>
    </item>
    <item>
      <title>[BOJ] 22858번: 원상 복구 (small) 자바스크립트 풀이</title>
      <link>https://zooyaam.tistory.com/6</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;1. 문제&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/1913&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.acmicpc.net/problem/22858&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1536&quot; data-origin-height=&quot;1256&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/2mqnY/btsOKHLVbMS/ktBQpIdn9jkvuH2w4jpFx1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/2mqnY/btsOKHLVbMS/ktBQpIdn9jkvuH2w4jpFx1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/2mqnY/btsOKHLVbMS/ktBQpIdn9jkvuH2w4jpFx1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F2mqnY%2FbtsOKHLVbMS%2FktBQpIdn9jkvuH2w4jpFx1%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;1536&quot; height=&quot;1256&quot; data-origin-width=&quot;1536&quot; data-origin-height=&quot;1256&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1588&quot; data-origin-height=&quot;800&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/q1RZT/btsOMQtEmph/1w5HL9aAv1xmgeKN66WC2K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/q1RZT/btsOMQtEmph/1w5HL9aAv1xmgeKN66WC2K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/q1RZT/btsOMQtEmph/1w5HL9aAv1xmgeKN66WC2K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fq1RZT%2FbtsOMQtEmph%2F1w5HL9aAv1xmgeKN66WC2K%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;1588&quot; height=&quot;800&quot; data-origin-width=&quot;1588&quot; data-origin-height=&quot;800&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2. 풀이과정&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;의사코드&lt;/h4&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;i = 0, 1, 2, 3, 4&amp;nbsp;&lt;br /&gt;카드 초기 상태 P = [1, 4, 5, 3, 2] &lt;br /&gt;셔플 규칙 D = [4, 3, 1, 2, 5]&lt;br /&gt;셔플 결과 S&lt;br /&gt;&lt;br /&gt;[ 셔플 과정 ]&amp;nbsp;&lt;br /&gt;i = 0 -&amp;gt; D[i] = D[0] = 4.&lt;br /&gt;4번째 카드는 인덱스상 P[i - 1] = P[3]이므로, P[3] = 3을 i = 0번째로 이동시킨다.&lt;br /&gt;즉, 셔플 1번 후 S[i] = P[D[i] - 1]이 됨.&lt;br /&gt;&lt;br /&gt;셔플이 2번 일어날 때의 결과를 S2라고 한다면,&lt;br /&gt;S2[i] = S[D[i] - 1]이 됨.&lt;br /&gt;이 때, S[D[i] - 1] = P[D[D[i] - 1] - 1]이 됨.&lt;br /&gt;즉, 셔플이 K번 일어날 때마다 D[i] - 1이 중첩된다.&lt;br /&gt;&lt;br /&gt;&lt;/blockquote&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;
&lt;pre id=&quot;code_1750427944015&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const readline = require('readline');

(async () =&amp;gt; {
    const rl = readline.createInterface({ input: process.stdin });
    
    const input = [];
    for await (const line of rl) {
        input.push(line.trim());
        if (input.length === 3) rl.close();
    }
    
    const [N, K] = input[0].split(' ').map(Number);
    const S = input[1].split(' ').map(Number);
    const D = input[2].split(' ').map(Number);
    
    let P = Array(N).fill(0);
    for (let i = 0; i &amp;lt; N; i++) {
        let d = i;
        for (let k = 0; k &amp;lt; K; k++) {
          d = D[d] - 1;  
        };
        P[d] = S[i];
    }
    
    console.log(P.join(' '));
})();&lt;/code&gt;&lt;/pre&gt;</description>
      <category>Algorithm</category>
      <category>백준</category>
      <category>알고리즘</category>
      <author>zooyaa</author>
      <guid isPermaLink="true">https://zooyaam.tistory.com/6</guid>
      <comments>https://zooyaam.tistory.com/6#entry6comment</comments>
      <pubDate>Sun, 22 Jun 2025 17:19:26 +0900</pubDate>
    </item>
  </channel>
</rss>