<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>개발자 블로그 다른 곳보다 10원이라도 비싸면 100% 환불</title>
    <link>https://urakasumi.tistory.com/</link>
    <description>개발자 블로그 100군데 뒤져보고 정착한 곳</description>
    <language>ko</language>
    <pubDate>Thu, 9 Apr 2026 06:55:06 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>surimi </managingEditor>
    <item>
      <title>클로저 관련 정리</title>
      <link>https://urakasumi.tistory.com/345</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;Lexical Scope&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;변수의 유효 범위를 결정하는 규칙.&lt;br /&gt;코드가 실행될 때가 아니라 작성될 때 결정됨.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;Lexical = 문맥&lt;/blockquote&gt;
&lt;h5&gt;스코프 예시&lt;/h5&gt;
&lt;pre class=&quot;javascript&quot;&gt;&lt;code&gt;let globalVar = &quot;global&quot;; // 글로벌 스코프

function outerFunction() {
  let outerVar = &quot;outer&quot;; // outerFunction의 렉시컬 스코프

  function innerFunction() {
    let innerVar = &quot;inner&quot;; // innerFunction의 렉시컬 스코프
    console.log(globalVar); // &quot;global&quot;
    console.log(outerVar);  // &quot;outer&quot;
    console.log(innerVar);  // &quot;inner&quot;
  }

  innerFunction();
}

outerFunction();
&lt;/code&gt;&lt;/pre&gt;
&lt;h5&gt;렉시컬 스코프 예시&lt;/h5&gt;
&lt;pre class=&quot;javascript&quot;&gt;&lt;code&gt;var x = 1;

function bar() {
    console.log(x);
}

function foo() {
    var x = 10;
    bar();
}

foo(); // 1 -&amp;gt; 함수가 선언된 위치가 전역이기 때문에
bar(); // 1&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;함수를 어디서 호출했는지에 따라 바뀌는걸 dynamic scope라고 하는데, 대부분의 언어는 lexical scope(=static scope)를 따른다.&lt;/blockquote&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;함수 객체의 내부 슬롯 &lt;code&gt;[[Environment]]&lt;/code&gt;에는 상위 스코프의 참조값이 저장된다.&lt;/li&gt;
&lt;li&gt;전역에 선언된 함수에는 내부 슬롯 &lt;code&gt;[[Environment]]&lt;/code&gt;에 전역 스코프의 참조값이 저장됨.&lt;/li&gt;
&lt;li&gt;bar 함수의 내부 슬롯 &lt;code&gt;[[Environment]]&lt;/code&gt;에는 전역 스코프의 참조가 저장되어 x는 1의 값을 가지고 있음.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Lexical Environment&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실행 컨텍스트의 일부분으로, 변수를 저장하고 관리.&lt;br /&gt;각 함수가 호출되거나 블록 진입시&lt;code&gt;(=실행 컨텍스트가 생성될 때마다)&lt;/code&gt; 새로운 렉시컬 환경이 생성된다.&lt;/p&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;Environment Record: 현재 스코프의 모든 변수와 함수 저장.&lt;/li&gt;
&lt;li&gt;Outer Lexical Environment Reference (외부 렉시컬 환경 참조): 상위 스코프 참조.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Execution Context&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;JS 코드가 실행되는 환경.&lt;/p&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;Global
&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;전역 객체와 this 포함.&lt;/li&gt;
&lt;li&gt;JS 프로세스가 종료될 때까지 유지.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Function
&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;함수의 arguments, local variables, this를 포함.&lt;/li&gt;
&lt;li&gt;함수 실행이 완료되면 컨텍스트 스택에서 제거됨.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Eval
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;code&gt;eval&lt;/code&gt; 함수가 실행될 때 생성됨.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Module
&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;/ol&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;this = 현재 실행 컨텍스트에서 참조하는 객체&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실행된 순서대로 실행 컨텍스트 스택에 쌓인다.&lt;br /&gt;맨 밑바닥에는 Global EC가 프로세스 종료될 때까지 깔려있다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;First-class Object (일급 객체) &lt;code&gt;(=First-class Citizen)&lt;/code&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;다른 함수의 인자로 전달할 수 있다.&lt;/li&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;JS에서는 함수가 일급 객체이다.&lt;/li&gt;
&lt;li&gt;함수가 변수에 할당될 수 있고, 다른 함수의 인자로 전달되거나 반환값으로 사용될 수 있음.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Closure&lt;/h3&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&quot;A closure is the combination of a function and the lexical environment within which that function was declared.&quot;&lt;br /&gt;클로저는 함수와 그 함수가 선언된 렉시컬 환경과의 조합이다.&lt;/blockquote&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;여기서 말하는 렉시컬 환경은 함수가 정의된 스코프&lt;code&gt;(=상위 스코프, 실행 컨텍스트의 렉시컬 환경)&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;모든 함수는 상위 스코프를 기억하므로, 어디서 호출되든 상위 스코프의 식별자&lt;code&gt;(변수, 함수, 클래스 등)&lt;/code&gt;를 참조할 수 있다. (lexical scope)&lt;/li&gt;
&lt;li&gt;중첩 함수&lt;code&gt;(Inner 함수)&lt;/code&gt;이면서 상위 스코프의 식별자를 참조하지 않거나, 참조 하더라도 Outer 함수보다 먼저 소멸되면 클로저라고 하지 않는다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1735132737006&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;function foo() {
		const x = 1;
		const y = 2;
	
		// 클로저
		// 중첩 함수 bar는 외부 함수보다 더 오래 유지되며 상위 스코프의 식별자를 참조한다.
		function bar() {
			debugger;
			console.log(x);
		}
		return bar;
	}

	const bar = foo();
	bar();&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;1044&quot; data-origin-height=&quot;404&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/EWPIP/btsLyCFrHEr/lCQPxwUFAHHfn9SiGM6cV0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/EWPIP/btsLyCFrHEr/lCQPxwUFAHHfn9SiGM6cV0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/EWPIP/btsLyCFrHEr/lCQPxwUFAHHfn9SiGM6cV0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FEWPIP%2FbtsLyCFrHEr%2FlCQPxwUFAHHfn9SiGM6cV0%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;1044&quot; height=&quot;404&quot; data-origin-width=&quot;1044&quot; data-origin-height=&quot;404&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Closure 활용&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;정보 은닉&lt;br /&gt;소멸될 외부 함수에 변수를 선언하고 클로저 함수를 반환하게 해두면 반환된 클로저 함수로만 변수에 접근할 수있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;예시&lt;/h3&gt;
&lt;pre class=&quot;javascript&quot;&gt;&lt;code&gt;const inc = (function () {
  let counter = 0; // 외부에서 접근할 수 없음.

  // Closure
  return function () {
    return ++counter;
  };
})();

console.log(inc()); // 1
console.log(inc()); // 2
console.log(inc()); // 3&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;javascript&quot;&gt;&lt;code&gt;// 함수를 반환하는 고차 함수
// 이 함수는 카운트 상태를 유지하기 위한 자유 변수 counter를 기억하는 클로저를 반환한다.
const counter = (function() {
  // 카운트 상태를 유지하기 위한 자유 변수
  let counter = 0;
  // 함수를 인수로 전달받는 클로저를 반환
  return function(aux) {
    // 인수로 전달받은 보조 함수에 상태 변경을 위임한다.
    counter = aux(counter);
    return counter;
  };
}());

// 보조 함수
function increase(n) {
  return ++n;
}

// 보조 함수
function decrease(n) {
  return --n;
}

// 보조 함수를 전달하여 호출
console.log(counter(increase)); // 1
console.log(counter(increase)); // 2
// 자유 변수를 공유한다.
console.log(counter(decrease)); // 1
console.log(counter(decrease)); // 0&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;외부에서 접근 불가능한 변수의 값을 변경할 함수를 넣어줄 수 있다.&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>렉시컬</category>
      <category>실행 컨텍스트</category>
      <category>클로저</category>
      <author>surimi </author>
      <guid isPermaLink="true">https://urakasumi.tistory.com/345</guid>
      <comments>https://urakasumi.tistory.com/345#entry345comment</comments>
      <pubDate>Wed, 25 Dec 2024 22:14:56 +0900</pubDate>
    </item>
    <item>
      <title>직렬화 (Serialization)</title>
      <link>https://urakasumi.tistory.com/344</link>
      <description>&lt;p&gt;직렬화&lt;/p&gt;
&lt;p&gt;직렬화는 데이터를 저장하거나 전송할 수 있는 형식으로 변환하는 것. (주로 텍스트 또는 바이너리)&lt;/p&gt;
&lt;h3&gt;장점&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;데이터 전송 및 저장 용이&lt;/strong&gt;: 직렬화된 데이터는 네트워크를 통해 쉽게 전송하거나 파일에 저장할 수 있다. 예를 들어, 서버와 클라이언트 간에 객체를 전송하거나 디스크에 데이터를 저장할 때 유용하다.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;플랫폼 독립성&lt;/strong&gt;: 직렬화된 데이터는 다양한 운영체제나 시스템에서 동일한 형식으로 읽고 쓸 수 있다. 예를 들어, JSON 형식은 다양한 언어에서 처리할 수 있어, 서로 다른 시스템 간 데이터 교환이 가능하다.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;성능 최적화 (바이너리 형식)&lt;/strong&gt;: 바이너리 형식으로 직렬화하면 데이터 크기가 작아지고, 전송 속도가 빨라질 수 있다. 특히 대용량 데이터를 다룰 때 유리하다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;직렬화 단점&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;성능 저하 가능성&lt;/strong&gt;: 객체의 복잡도가 높거나, 큰 데이터 구조를 직렬화할 경우 처리 시간이 늘어나 성능이 저하될 수 있다. 텍스트 기반 직렬화는 이진 형식보다 느릴 수 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;직렬화 방식&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;JSON&lt;/strong&gt;: 객체를 JSON 형식으로 직렬화하여 텍스트 기반으로 저장하거나 전송할 수 있다. 다양한 언어에서 쉽게 사용할 수 있다. 주로 웹 애플리케이션에서 사용.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;XML&lt;/strong&gt;: 구문이 길다. 주로 데이터를 문서 형식으로 전송할 때 사용.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;바이너리&lt;/strong&gt;: 객체를 이진 데이터 형식으로 변환하여 저장하거나 전송한다. 성능이 중요한 시스템에서 사용된다. Java의 기본 직렬화가 여기에  속한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;역직렬화 (Deserialization)&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;직렬화 된 데이터를 원래 객체로 복원하는 과정.&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>Dev</category>
      <author>surimi </author>
      <guid isPermaLink="true">https://urakasumi.tistory.com/344</guid>
      <comments>https://urakasumi.tistory.com/344#entry344comment</comments>
      <pubDate>Tue, 24 Dec 2024 03:02:40 +0900</pubDate>
    </item>
    <item>
      <title>React Component가 리렌더링 되는 이유</title>
      <link>https://urakasumi.tistory.com/343</link>
      <description>&lt;p&gt;웹 플젝 하던 중 Context, 모달, 소켓 등이 짬뽕되자 원하지 않는 부분에서 자꾸 렌더링이 되는 문제가 있어서 알아본 내용.&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;Component가 리렌더링 되는 경우들&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;State가 변경될 때&lt;/strong&gt;: 컴포넌트의 &lt;code&gt;state&lt;/code&gt;가 변경되면 해당 컴포넌트와 그 하위 컴포넌트들이 리렌더링됩니다.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-jsx&quot;&gt; this.setState({ value: newValue });&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Props가 변경될 때&lt;/strong&gt;: 부모 컴포넌트에서 전달되는 &lt;code&gt;props&lt;/code&gt;가 변경되면 자식 컴포넌트가 리렌더링됩니다.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-jsx&quot;&gt; &amp;lt;ChildComponent propValue={this.state.value} /&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;부모 컴포넌트가 리렌더링될 때&lt;/strong&gt;: 부모 컴포넌트가 리렌더링되면 자식 컴포넌트들도 리렌더링됩니다.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;forceUpdate가 호출될 때&lt;/strong&gt;: &lt;code&gt;forceUpdate&lt;/code&gt; 메서드를 호출하면 강제로 컴포넌트가 리렌더링됩니다.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-jsx&quot;&gt; this.forceUpdate();&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Context가 변경될 때&lt;/strong&gt;: &lt;code&gt;React Context&lt;/code&gt;의 값이 변경되면 이를 구독하고 있는 모든 컴포넌트가 리렌더링됩니다.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-jsx&quot;&gt; &amp;lt;MyContext.Provider value={newValue}&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;훅의 의존성이 변경될 때:&lt;/strong&gt; useEffect, useMemo, useCallback 등의 의존성 배열에 있는 값이 변경되면 컴포넌트가 리렌더링 될 수 있다.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;리렌더링을 방지하는 방법&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;React.memo 사용&lt;/strong&gt;: 함수형 컴포넌트를 메모이제이션하여, &lt;code&gt;props&lt;/code&gt;가 변경되지 않으면 리렌더링을 방지할 수 있습니다.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-jsx&quot;&gt;  jsx
  Copy code
  import React from &amp;#39;react&amp;#39;;

  const MyComponent = React.memo(({ prop1, prop2 }) =&amp;gt; {
    // 컴포넌트 로직
  });
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;useMemo 사용&lt;/strong&gt;: 비용이 많이 드는 계산을 메모이제이션하여, 의존성 배열의 값이 변경되지 않으면 계산을 재사용할 수 있습니다.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-jsx&quot;&gt;  const memoizedValue = useMemo(() =&amp;gt; computeExpensiveValue(a, b), [a, b]);&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;useCallback 사용&lt;/strong&gt;: 함수의 메모이제이션을 통해 불필요한 함수 재생성을 방지하고, 의존성 배열의 값이 변경되지 않으면 같은 함수를 재사용할 수 있습니다.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-jsx&quot;&gt;  const memoizedCallback = useCallback(() =&amp;gt; {
    doSomething(a, b);
  }, [a, b]);&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;useRef 사용&lt;/strong&gt;: 컴포넌트 내에서 유지해야 하는 값이 있지만, 그 값의 변경이 리렌더링을 유발하지 않아야 하는 경우 사용합니다.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-jsx&quot;&gt;  const countRef = useRef(0);
  countRef.current++;&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;useEffect의 Cleanup 함수 사용&lt;/strong&gt;: 불필요한 리렌더링을 방지하기 위해, 컴포넌트가 언마운트될 때 또는 다음 이펙트 실행 전에 정리 작업을 수행합니다.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-jsx&quot;&gt;  jsx
  Copy code
  useEffect(() =&amp;gt; {
    const handle = setSomeResource();

    return () =&amp;gt; {
      clearSomeResource(handle);
    };
  }, [dependency]);
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;메모&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;state, props의 값 체크는 얕은 비교로 이루어 진다. ( 1단계 깊이만 비교 )&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2&gt;관련 내용&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://www.telerik.com/blogs/understand-how-rendering-works-react#:~:text=Rendering%20is%20React&amp;#39;s%20process%20of,the%20UI%20need%20an%20update&quot;&gt;https://www.telerik.com/blogs/understand-how-rendering-works-react#:~:text=Rendering%20is%20React&amp;#39;s%20process%20of,the%20UI%20need%20an%20update&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.reddit.com/r/reactjs/comments/1977xg1/react_state_and_rendering_process/&quot;&gt;https://www.reddit.com/r/reactjs/comments/1977xg1/react_state_and_rendering_process/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://dev.to/mateo_garcia/understanding-rendering-in-react-i5i&quot;&gt;https://dev.to/mateo_garcia/understanding-rendering-in-react-i5i&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://joong-sunny.github.io/react/react1/&quot;&gt;https://joong-sunny.github.io/react/react1/&lt;/a&gt;&lt;/p&gt;</description>
      <category>Dev/React</category>
      <author>surimi </author>
      <guid isPermaLink="true">https://urakasumi.tistory.com/343</guid>
      <comments>https://urakasumi.tistory.com/343#entry343comment</comments>
      <pubDate>Wed, 18 Dec 2024 21:16:48 +0900</pubDate>
    </item>
    <item>
      <title>Bing AI Copilot 사용 중 스크롤시 Search 검색창으로 넘어지지 않게 하는 방법</title>
      <link>https://urakasumi.tistory.com/342</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://chromewebstore.google.com/detail/copilot-prevent-scroll-do/cmdkmldlcddajdgcdbecjjkadmhgakhl&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://chromewebstore.google.com/detail/copilot-prevent-scroll-do/cmdkmldlcddajdgcdbecjjkadmhgakhl&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1706724558704&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;Copilot - Prevent scroll down to search page&quot; data-og-description=&quot;This extension prevents users from accidentally scrolling down to the search page while using Bing AI Copilot.&quot; data-og-host=&quot;chrome.google.com&quot; data-og-source-url=&quot;https://chromewebstore.google.com/detail/copilot-prevent-scroll-do/cmdkmldlcddajdgcdbecjjkadmhgakhl&quot; data-og-url=&quot;https://chrome.google.com/webstore/detail/copilot-prevent-scroll-do/cmdkmldlcddajdgcdbecjjkadmhgakhl&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/UerNL/hyVb3guUcQ/Oiw9J9VC6FsCRTIl1GAAZk/img.jpg?width=128&amp;amp;height=128&amp;amp;face=0_0_128_128&quot;&gt;&lt;a href=&quot;https://chromewebstore.google.com/detail/copilot-prevent-scroll-do/cmdkmldlcddajdgcdbecjjkadmhgakhl&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://chromewebstore.google.com/detail/copilot-prevent-scroll-do/cmdkmldlcddajdgcdbecjjkadmhgakhl&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/UerNL/hyVb3guUcQ/Oiw9J9VC6FsCRTIl1GAAZk/img.jpg?width=128&amp;amp;height=128&amp;amp;face=0_0_128_128');&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;Copilot - Prevent scroll down to search page&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;This extension prevents users from accidentally scrolling down to the search page while using Bing AI Copilot.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;chrome.google.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&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;285&quot; data-origin-height=&quot;82&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bhGs4z/btsEfrrqNB3/c9nIKmLtAkFGNFCyf8leGK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bhGs4z/btsEfrrqNB3/c9nIKmLtAkFGNFCyf8leGK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bhGs4z/btsEfrrqNB3/c9nIKmLtAkFGNFCyf8leGK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbhGs4z%2FbtsEfrrqNB3%2Fc9nIKmLtAkFGNFCyf8leGK%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;285&quot; height=&quot;82&quot; data-origin-width=&quot;285&quot; data-origin-height=&quot;82&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아이콘 클릭시 Copilot이 새 탭으로 켜진다.&lt;/p&gt;</description>
      <category>Dev</category>
      <category>chat</category>
      <category>Copilot</category>
      <category>disable</category>
      <category>GPT</category>
      <category>GPT4</category>
      <category>Microsoft</category>
      <category>Page</category>
      <category>prevent</category>
      <category>scroll</category>
      <category>search</category>
      <author>surimi </author>
      <guid isPermaLink="true">https://urakasumi.tistory.com/342</guid>
      <comments>https://urakasumi.tistory.com/342#entry342comment</comments>
      <pubDate>Thu, 1 Feb 2024 03:11:45 +0900</pubDate>
    </item>
    <item>
      <title>[BOJ 10026] 적록색약 C++</title>
      <link>https://urakasumi.tistory.com/340</link>
      <description>&lt;p&gt;난이도: Gold 5&lt;br&gt;번호: 10026&lt;br&gt;생성일: March 19, 2023 3:09 PM&lt;br&gt;알고리즘 분류: 그래프 이론, 그래프 탐색, 깊이 우선 탐색, 너비 우선 탐색&lt;br&gt;언어: C++&lt;/p&gt;
&lt;h2&gt;C++&lt;/h2&gt;
&lt;pre&gt;&lt;code class=&quot;language-cpp&quot;&gt;// BOJ 10026 적록색약
#include &amp;lt;iostream&amp;gt;
#include &amp;lt;queue&amp;gt;
using namespace std;

int N;
char map[102][102];
bool visit[102][102];

const int dx[] = {0, 0, 1, -1};
const int dy[] = {1, -1, 0, 0};

bool _strchr(string s, char c)
{
    for (char _c : s)
        if (c == _c)
            return (1);
    return (0);
}

int BFS(int i, int j, string colors)
{
    queue&amp;lt;pair&amp;lt;int, int&amp;gt;&amp;gt; Q;
    Q.push({i, j});
    visit[i][j] = true;

    while (!Q.empty())
    {
        auto cur = Q.front();
        Q.pop();

        for (int k = 0; k &amp;lt; 4; k++)
        {
            int x = dx[k] + cur.first;
            int y = dy[k] + cur.second;

            if (visit[x][y])
                continue;

            if (!_strchr(colors, map[x][y]))
                continue;

            Q.push({x, y});
            visit[x][y] = true;
        }
    }
    return (1);
}

int main(void)
{
    cin.tie(0)-&amp;gt;sync_with_stdio(0);
    cout.tie(0);

    // normal, color-weak
    int nm = 0, cw = 0;
    cin &amp;gt;&amp;gt; N;

    for (int i = 1; i &amp;lt;= N; i++)
        for (int j = 1; j &amp;lt;= N; j++)
            cin &amp;gt;&amp;gt; map[i][j];

    for (int i = 1; i &amp;lt;= N; i++)
        for (int j = 1; j &amp;lt;= N; j++)
        {
            if (visit[i][j])
                continue;
            if (map[i][j] == &amp;#39;R&amp;#39;)
                nm += BFS(i, j, &amp;quot;R&amp;quot;);
            else if (map[i][j] == &amp;#39;G&amp;#39;)
                nm += BFS(i, j, &amp;quot;G&amp;quot;);
            else if (map[i][j] == &amp;#39;B&amp;#39;)
                nm += BFS(i, j, &amp;quot;B&amp;quot;);
        }

    // reset visit
    for (int i = 1; i &amp;lt;= N; i++)
        for (int j = 1; j &amp;lt;= N; j++)
            visit[i][j] = false;

    for (int i = 1; i &amp;lt;= N; i++)
        for (int j = 1; j &amp;lt;= N; j++)
        {
            if (visit[i][j])
                continue;
            if (map[i][j] == &amp;#39;R&amp;#39; || map[i][j] == &amp;#39;G&amp;#39;)
                cw += BFS(i, j, &amp;quot;RG&amp;quot;);
            else if (map[i][j] == &amp;#39;B&amp;#39;)
                cw += BFS(i, j, &amp;quot;B&amp;quot;);
        }
    cout &amp;lt;&amp;lt; nm &amp;lt;&amp;lt; &amp;quot; &amp;quot; &amp;lt;&amp;lt; cw;
}&lt;/code&gt;&lt;/pre&gt;</description>
      <category>Algorithm/BOJ</category>
      <category>그래프 이론</category>
      <category>그래프 탐색</category>
      <category>깊이 우선 탐색</category>
      <category>너비 우선 탐색</category>
      <author>surimi </author>
      <guid isPermaLink="true">https://urakasumi.tistory.com/340</guid>
      <comments>https://urakasumi.tistory.com/340#entry340comment</comments>
      <pubDate>Sun, 19 Mar 2023 15:13:11 +0900</pubDate>
    </item>
    <item>
      <title>[BOJ 1303] 전쟁 - 전투 C++</title>
      <link>https://urakasumi.tistory.com/339</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;난이도: Silver 1&lt;br /&gt;번호: 1303&lt;br /&gt;생성일: March 19, 2023 12:31 AM&lt;br /&gt;알고리즘 분류: 그래프 이론, 그래프 탐색, 깊이 우선 탐색, 너비 우선 탐색&lt;br /&gt;언어: C++&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/1303&quot;&gt;1303번: 전쟁 - 전투&lt;/a&gt;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;C++&lt;/h2&gt;
&lt;pre class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;#include &amp;lt;iostream&amp;gt;
#include &amp;lt;queue&amp;gt;
using namespace std;

int N, M;
char map[102][102];
bool visit[102][102];

const int dx[] = {0, 0, 1, -1};
const int dy[] = {1, -1, 0, 0};

int BFS(int i, int j, char c)
{
    queue&amp;lt;pair&amp;lt;int, int&amp;gt;&amp;gt; Q;
    int cnt = 1;
    Q.push({i, j});
    visit[i][j] = true;

    while (!Q.empty())
    {
        auto cur = Q.front();
        Q.pop();

        for (int k = 0; k &amp;lt; 4; k++)
        {
            int x = dx[k] + cur.first;
            int y = dy[k] + cur.second;

            if (visit[x][y] || map[x][y] != c)
                continue;

            Q.push({x, y});
            visit[x][y] = true;
            cnt++;
        }
    }
    return cnt;
}

int main(void)
{
    cin.tie(0)-&amp;gt;sync_with_stdio(0);
    cout.tie(0);

    int B = 0, W = 0;
    // 세로 크기 M
    // 가로 크기 N
    cin &amp;gt;&amp;gt; M &amp;gt;&amp;gt; N;

    for (int i = 1; i &amp;lt;= N; i++)
        for (int j = 1; j &amp;lt;= M; j++)
            cin &amp;gt;&amp;gt; map[i][j];

    for (int i = 1; i &amp;lt;= N; i++)
        for (int j = 1; j &amp;lt;= M; j++)
        {
            int tmp;
            if (visit[i][j])
                continue;
            if (map[i][j] == 'W')
            {
                tmp = BFS(i, j, 'W');
                W += tmp * tmp;
            }
            else if (map[i][j] == 'B')
            {
                tmp = BFS(i, j, 'B');
                B += tmp * tmp;
            }
        }
    cout &amp;lt;&amp;lt; W &amp;lt;&amp;lt; &quot; &quot; &amp;lt;&amp;lt; B;
}&lt;/code&gt;&lt;/pre&gt;</description>
      <category>Algorithm/BOJ</category>
      <category>그래프 이론</category>
      <category>그래프 탐색</category>
      <category>깊이 우선 탐색</category>
      <category>너비 우선 탐색</category>
      <author>surimi </author>
      <guid isPermaLink="true">https://urakasumi.tistory.com/339</guid>
      <comments>https://urakasumi.tistory.com/339#entry339comment</comments>
      <pubDate>Sun, 19 Mar 2023 13:37:17 +0900</pubDate>
    </item>
    <item>
      <title>[BOJ 13549] 숨바꼭질 3 C++</title>
      <link>https://urakasumi.tistory.com/338</link>
      <description>&lt;p&gt;난이도: Gold 5&lt;br&gt;번호: 13549&lt;br&gt;생성일: March 12, 2023 9:33 PM&lt;br&gt;알고리즘 분류: 0-1 너비 우선 탐색, 그래프 이론, 그래프 탐색, 너비 우선 탐색, 데이크스트라&lt;br&gt;언어: C++&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/13549&quot;&gt;13549번: 숨바꼭질 3&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;C++&lt;/h2&gt;
&lt;pre&gt;&lt;code class=&quot;language-cpp&quot;&gt;#include &amp;lt;cstdio&amp;gt;
#include &amp;lt;deque&amp;gt;

using namespace std;

int N, K;
int visit[100001];

int BFS()
{
    deque&amp;lt;int&amp;gt; dq;
    dq.push_back(N);
    visit[N] = 1;

    while (!dq.empty())
    {
        int cur = dq.front();
        dq.pop_front();

        if (cur == K)
            return visit[cur] - 1;

        if (cur * 2 &amp;lt; 100001 &amp;amp;&amp;amp; !visit[cur * 2])
        {
            dq.push_front(cur * 2);
            visit[cur * 2] = visit[cur];
        }
        if (cur &amp;gt; 0 &amp;amp;&amp;amp; !visit[cur - 1])
        {
            dq.push_back(cur - 1);
            visit[cur - 1] = visit[cur] + 1;
        }
        if (cur + 1 &amp;lt; 100001 &amp;amp;&amp;amp; !visit[cur + 1])
        {
            dq.push_back(cur + 1);
            visit[cur + 1] = visit[cur] + 1;
        }
    }
    return -1;
}

int main(void)
{
    scanf(&amp;quot;%d %d&amp;quot;, &amp;amp;N, &amp;amp;K);
    printf(&amp;quot;%d&amp;quot;, BFS());
    return (0);
}&lt;/code&gt;&lt;/pre&gt;</description>
      <category>Algorithm/BOJ</category>
      <category>0-1 너비 우선 탐색</category>
      <category>그래프 이론</category>
      <category>그래프 탐색</category>
      <category>너비 우선 탐색</category>
      <category>데이크스트라</category>
      <author>surimi </author>
      <guid isPermaLink="true">https://urakasumi.tistory.com/338</guid>
      <comments>https://urakasumi.tistory.com/338#entry338comment</comments>
      <pubDate>Sun, 12 Mar 2023 21:35:23 +0900</pubDate>
    </item>
    <item>
      <title>[BOJ 14940] 쉬운 최단거리 C++</title>
      <link>https://urakasumi.tistory.com/337</link>
      <description>&lt;p&gt;난이도: Silver 1&lt;br&gt;번호: 14940&lt;br&gt;생성일: March 10, 2023 5:48 PM&lt;br&gt;알고리즘 분류: 그래프 이론, 그래프 탐색, 너비 우선 탐색&lt;br&gt;언어: C++&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/14940&quot;&gt;14940번: 쉬운 최단거리&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;C++&lt;/h2&gt;
&lt;pre&gt;&lt;code class=&quot;language-cpp&quot;&gt;#include &amp;lt;cstdio&amp;gt;
#include &amp;lt;queue&amp;gt;
#include &amp;lt;vector&amp;gt;

using namespace std;

int N, M;
struct Pos
{
    int x, y;
};
vector&amp;lt;vector&amp;lt;int&amp;gt;&amp;gt; map;
vector&amp;lt;vector&amp;lt;bool&amp;gt;&amp;gt; visit;
vector&amp;lt;vector&amp;lt;int&amp;gt;&amp;gt; distMap;

const int dX[] = {0, 0, -1, 1};
const int dY[] = {-1, 1, 0, 0};

void BFS(Pos dest)
{
    queue&amp;lt;Pos&amp;gt; Q;
    distMap[dest.x][dest.y] = 0;

    Q.push(dest);
    visit[dest.x][dest.y] = true;

    while (!Q.empty())
    {
        Pos cur = Q.front();
        Q.pop();

        for (int k = 0; k &amp;lt; 4; ++k)
        {
            int x = dX[k] + cur.x;
            int y = dY[k] + cur.y;

            if (x &amp;lt; 0 || y &amp;lt; 0 || x &amp;gt;= N || y &amp;gt;= M)
                continue;

            if (visit[x][y] || map[x][y] == 0)
                continue;

            distMap[x][y] = distMap[cur.x][cur.y] + 1;
            Q.push({x, y});
            visit[x][y] = true;
        }
    }
}

int main(void)
{
    Pos dest;

    scanf(&amp;quot;%d %d&amp;quot;, &amp;amp;N, &amp;amp;M);

    map.resize(N);
    visit.resize(N);
    distMap.resize(N);

    for (int i = 0; i &amp;lt; N; ++i)
    {
        map[i].resize(M);
        visit[i].resize(M);
        distMap[i].resize(M);
    }

    for (int i = 0; i &amp;lt; N; ++i)
        for (int j = 0; j &amp;lt; M; ++j)
        {
            scanf(&amp;quot;%d&amp;quot;, &amp;amp;map[i][j]);
            if (map[i][j] == 2)
            {
                dest.x = i;
                dest.y = j;
            }
        }
    BFS(dest);

    for (int i = 0; i &amp;lt; N; ++i)
    {
        for (int j = 0; j &amp;lt; M; ++j)
        {
            if (distMap[i][j] == 0 &amp;amp;&amp;amp; map[i][j] == 1)
                printf(&amp;quot;-1 &amp;quot;);
            else
                printf(&amp;quot;%d &amp;quot;, distMap[i][j]);
        }
        printf(&amp;quot;\n&amp;quot;);
    }

    return (0);
}&lt;/code&gt;&lt;/pre&gt;</description>
      <category>Algorithm/BOJ</category>
      <category>그래프 이론</category>
      <category>그래프 탐색</category>
      <category>너비 우선 탐색</category>
      <author>surimi </author>
      <guid isPermaLink="true">https://urakasumi.tistory.com/337</guid>
      <comments>https://urakasumi.tistory.com/337#entry337comment</comments>
      <pubDate>Fri, 10 Mar 2023 17:50:19 +0900</pubDate>
    </item>
    <item>
      <title>[BOJ 18232] 텔레포트 정거장 C++</title>
      <link>https://urakasumi.tistory.com/336</link>
      <description>&lt;p&gt;난이도: Silver 2&lt;br&gt;번호: 18232&lt;br&gt;생성일: March 10, 2023 1:33 AM&lt;br&gt;알고리즘 분류: 그래프 이론, 그래프 탐색, 너비 우선 탐색&lt;br&gt;언어: C++&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/18232&quot;&gt;18232번: 텔레포트 정거장&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;C++&lt;/h2&gt;
&lt;pre&gt;&lt;code class=&quot;language-cpp&quot;&gt;#include &amp;lt;cstdio&amp;gt;
#include &amp;lt;queue&amp;gt;
#include &amp;lt;vector&amp;gt;

using namespace std;

int N, M, S, E;
vector&amp;lt;vector&amp;lt;int&amp;gt;&amp;gt; map;
vector&amp;lt;bool&amp;gt; visit;

int BFS()
{
    queue&amp;lt;int&amp;gt; Q;
    Q.push(S);
    visit[S] = true;
    int depth = 0;

    while (!Q.empty())
    {
        int size = Q.size() + 1;

        while (--size)
        {
            int cur = Q.front();
            Q.pop();

            if (cur == E)
                return depth;

            for (int i : map[cur])
            {
                if (visit[i])
                    continue;

                Q.push(i);
                visit[i] = true;
            }
            if (cur &amp;gt; 1 &amp;amp;&amp;amp; !visit[cur - 1])
            {
                Q.push(cur - 1);
                visit[cur - 1] = true;
            }
            if (cur + 1 &amp;lt;= N &amp;amp;&amp;amp; !visit[cur + 1])
            {
                Q.push(cur + 1);
                visit[cur + 1] = true;
            }
        }
        ++depth;
    }
    return depth;
}

int main(void)
{
    scanf(&amp;quot;%d %d %d %d&amp;quot;, &amp;amp;N, &amp;amp;M, &amp;amp;S, &amp;amp;E);

    map.resize(N + 1);
    visit.resize(N + 1);

    for (int i = 0; i &amp;lt; M; i++)
    {
        int a, b;
        scanf(&amp;quot;%d %d&amp;quot;, &amp;amp;a, &amp;amp;b);
        map[a].push_back(b);
        map[b].push_back(a);
    }

    printf(&amp;quot;%d&amp;quot;, BFS());

    return (0);
}&lt;/code&gt;&lt;/pre&gt;</description>
      <category>Algorithm/BOJ</category>
      <category>그래프 이론</category>
      <category>그래프 탐색</category>
      <category>너비 우선 탐색</category>
      <author>surimi </author>
      <guid isPermaLink="true">https://urakasumi.tistory.com/336</guid>
      <comments>https://urakasumi.tistory.com/336#entry336comment</comments>
      <pubDate>Fri, 10 Mar 2023 01:35:03 +0900</pubDate>
    </item>
    <item>
      <title>[BOJ 25516] 거리가 k이하인 트리 노드에서 사과 수확하기 C++</title>
      <link>https://urakasumi.tistory.com/335</link>
      <description>&lt;p&gt;난이도: Silver 2&lt;br&gt;번호: 25516&lt;br&gt;생성일: March 9, 2023 2:39 PM&lt;br&gt;알고리즘 분류: 그래프 이론, 그래프 탐색, 깊이 우선 탐색, 너비 우선 탐색, 트리&lt;br&gt;언어: C++&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/25516&quot;&gt;25516번: 거리가 k이하인 트리 노드에서 사과 수확하기&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;C++&lt;/h2&gt;
&lt;pre&gt;&lt;code class=&quot;language-cpp&quot;&gt;#include &amp;lt;cstdio&amp;gt;
#include &amp;lt;queue&amp;gt;
#include &amp;lt;vector&amp;gt;

using namespace std;

int N, K;
vector&amp;lt;vector&amp;lt;int&amp;gt;&amp;gt; map;
vector&amp;lt;int&amp;gt; apple;
vector&amp;lt;bool&amp;gt; visit;

int BFS()
{
    queue&amp;lt;int&amp;gt; Q;
    Q.push(0);
    visit[0] = true;
    int depth = 0;
    int cnt = apple[0];

    while (!Q.empty() &amp;amp;&amp;amp; depth &amp;lt; K)
    {
        int size = Q.size();

        while (size--)
        {
            int cur = Q.front();
            Q.pop();

            for (int i : map[cur])
            {
                if (visit[i])
                    continue;

                Q.push(i);
                visit[i] = true;
                cnt += apple[i];
            }
        }
        depth++;
    }
    return cnt;
}

int main(void)
{
    scanf(&amp;quot;%d %d&amp;quot;, &amp;amp;N, &amp;amp;K);

    map.resize(N + 1);
    apple.resize(N + 1);
    visit.resize(N + 1);

    for (int i = 0; i &amp;lt; N - 1; i++)
    {
        int a, b;
        scanf(&amp;quot;%d %d&amp;quot;, &amp;amp;a, &amp;amp;b);
        map[a].push_back(b);
        map[b].push_back(a);
    }

    for (int i = 0; i &amp;lt; N; i++)
        scanf(&amp;quot;%d&amp;quot;, &amp;amp;apple[i]);

    printf(&amp;quot;%d&amp;quot;, BFS());

    return (0);
}&lt;/code&gt;&lt;/pre&gt;</description>
      <category>Algorithm/BOJ</category>
      <category>그래프 이론</category>
      <category>그래프 탐색</category>
      <category>깊이 우선 탐색</category>
      <category>너비 우선 탐색</category>
      <category>트리</category>
      <author>surimi </author>
      <guid isPermaLink="true">https://urakasumi.tistory.com/335</guid>
      <comments>https://urakasumi.tistory.com/335#entry335comment</comments>
      <pubDate>Thu, 9 Mar 2023 14:42:24 +0900</pubDate>
    </item>
  </channel>
</rss>