<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>함함ː</title>
    <link>https://intheham.tistory.com/</link>
    <description>개발함</description>
    <language>ko</language>
    <pubDate>Mon, 3 Aug 2026 14:14:54 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>함s</managingEditor>
    <image>
      <title>함함ː</title>
      <url>https://tistory1.daumcdn.net/tistory/4720003/attach/b5b1cfbda47f4afb8aa613c326fad80d</url>
      <link>https://intheham.tistory.com</link>
    </image>
    <item>
      <title>[JavaScript] Promise</title>
      <link>https://intheham.tistory.com/238</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;A promise is an object that may produce a single value sometime in the future.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;It is either a resolved value or a rejected one, with a reason for rejection.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;And a promise may be in one of three possible states.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;It can be fulfilled, rejected, or pending.&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;[1]&amp;nbsp; new Promise&lt;/h2&gt;
&lt;pre id=&quot;code_1749312945669&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const promise = new Promise((resolve, reject) =&amp;gt; {
  setTimeout(() =&amp;gt; {
    resolve(&quot;success&quot;);
  }, 4000)
});

promise.then(console.log)
// or
promise.then(resp =&amp;gt; console.log(resp))&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1749311283276&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const promise = new Promise((resolve, reject) =&amp;gt; {
	if (true) {
    	resolve('Stuff Worked');
    } else {
    	reject('Error, it broke');
    }
});

promise
	.then(result =&amp;gt; result + '!')
    .then(result2 =&amp;gt; result2 + '?')
    .catch(() =&amp;gt; console.log('error!!')
    .then(result3 =&amp;gt; {
    	//throw Error;
        console.log(result3 + + '!');
    })
    
    
// Stuff Worked!?!&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;catch 는 시작점부터 catch 전까지의 오류만 잡을 수 있다.&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;h2 data-ke-size=&quot;size26&quot;&gt;[3] Promise.resolve() / Promise.reject()&lt;/h2&gt;
&lt;pre id=&quot;code_1749313040167&quot; style=&quot;background-color: #f8f8f8; color: #383a42; text-align: start;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;javascript&quot;&gt;&lt;code&gt;const promise2 = Promise.resolve(
  setTimeout(() =&amp;gt; {
    console.log(&quot;success&quot;);
  }, 4000)
);

Promise.reject('failed')
  .catch(console.log('Ooops something went wrong'))&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;[3] Promise.all()&lt;/h2&gt;
&lt;pre id=&quot;code_1749311634290&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const promise = new Promise((resolve, reject) =&amp;gt; {
	if (true) {
    	resolve('Stuff Worked');
    } else {
    	reject('Error, it broke');
    }
});

cosnt promise2 = new Promise((resolve, reject) =&amp;gt; {
	setTimeout(resolve, 100, 'after 0.1 second')
});

cosnt promise3 = new Promise((resolve, reject) =&amp;gt; {
	setTimeout(resolve, 1000, 'after 1 second')
});

cosnt promise4 = new Promise((resolve, reject) =&amp;gt; {
	setTimeout(resolve, 5000, 'after 5 seconds')
});

Promise.all([promise, promise2, promise3, promise4])
	.then(values =&amp;gt; {
    	console.log(values);
    }
    
// 5초 뒤에
// [&quot;Stuff Worked&quot;, &quot;after 0.1 second&quot;, &quot;after 1 second&quot;, &quot;after 5 seconds&quot;]&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만약 promise 변수 선언과 Promise.all 호출이 시간차를 두고 진행된다면,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Promise.all 이 호출되기 이전에 변수에 promise 값이 할당되기 때문에&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5초 라는 시간 차이 없이 바로 Promise.all 이 실행된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1749311822667&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const url = [
	'https://jsonplaceholder.typicode.com/users',
    'https://jsonplaceholder.typicode.com/posts',
    'https://jsonplaceholder.typicode.com/albums'
]

Promise.all(urls.map(url =&amp;gt;
    fetch(url).then(people =&amp;gt; people.json())
))
  .then(array =&amp;gt; {
    console.log('1', array[0])
    console.log('2', array[1])
    console.log('3', array[2])
    console.log('4', array[3])
  })
  .catch(err =&amp;gt; console.log('ughhhh fix it!', err));&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&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>Front/JavaScript</category>
      <author>함s</author>
      <guid isPermaLink="true">https://intheham.tistory.com/238</guid>
      <comments>https://intheham.tistory.com/238#entry238comment</comments>
      <pubDate>Sun, 8 Jun 2025 01:18:14 +0900</pubDate>
    </item>
    <item>
      <title>[React] 클래스 컴포넌트 vs 함수형 컴포넌트</title>
      <link>https://intheham.tistory.com/235</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;0. 컴포넌트&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;React는 UI를 작고 이해하기 쉬운 &lt;b&gt;컴포넌트 단위&lt;/b&gt;로 나눠 프로젝트를 구조화한다 (Structure).&lt;/p&gt;
&lt;p data-end=&quot;370&quot; data-start=&quot;262&quot; data-ke-size=&quot;size16&quot;&gt;기능별로 나눈 컴포넌트는 &lt;b&gt;재사용성(Reusability)&lt;/b&gt;이 높고,&lt;br /&gt;복잡한 로직이 있더라도 외부에서는 단순한 이름으로 사용할 수 있어 &lt;b&gt;추상화(Abstraction)&lt;/b&gt;에 유리하다.&lt;/p&gt;
&lt;p data-end=&quot;474&quot; data-start=&quot;372&quot; data-ke-size=&quot;size16&quot;&gt;이로 인해 개발자는 전체 흐름에 집중할 수 있고,&lt;br /&gt;UI가 변경될 경우 해당 컴포넌트만 수정하면 되므로 &lt;b&gt;유지보수(Maintainability)&lt;/b&gt;가 쉬워지고 안정성도 높아진다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;React 에는 두 가지 종류의 컴포넌트가 있다. 클래스 컴포넌트와 함수형 컴포넌트이다.&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;pre id=&quot;code_1746578878715&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import React from 'react';
import { createRoot } from &quot;react-dom/client&quot;;
import './index.css';
import Hello from './Hello';
import 'tachyons';

const root = createRoot(document.getElementById('root'));
const element = &amp;lt;Hello greeting=&quot;Hello React King&quot; /&amp;gt;;	// props 전달
root.render(element);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. 클래스 컴포넌트&lt;/h2&gt;
&lt;pre id=&quot;code_1746578917814&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import React, { Component } from 'react';
import './Hello.css'

class Hello extends Component {
    render() {
        return (
            &amp;lt;div className='f1 tc'&amp;gt;
                &amp;lt;h1&amp;gt;Hello World&amp;lt;/h1&amp;gt;
                &amp;lt;p&amp;gt;{this.props.greeting}&amp;lt;/p&amp;gt;
            &amp;lt;/div&amp;gt;
        )
    }
}

export default Hello;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;클래스 컴포넌트는 주로 래거시 프로젝트에서 볼 수 있는 방식이다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;클래스 컴포넌트는 생명주기(Lifecycle) 메서드를 지원하지만,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;복잡하고 직관적이지 않으며 안전하지 않아서 향후 React 버전에서 지원되지 않을 예정이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또한, 일반적으로 Hooks 를 사용할 수 없다.&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. 함수형 컴포넌트&lt;/h2&gt;
&lt;pre id=&quot;code_1746578931029&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import React from 'react';
import './Hello.css'

const Hello = (props) =&amp;gt; {
    return (
        &amp;lt;div className='f1 tc'&amp;gt;
            &amp;lt;h1&amp;gt;Hello World&amp;lt;/h1&amp;gt;
            &amp;lt;p&amp;gt;{props.greeting}&amp;lt;/p&amp;gt;
        &amp;lt;/div&amp;gt;
    )
}

export default Hello;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;함수형 컴포넌트는 현재 가장 많이 사용되는 방식이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;문법이 간단하고 작성하기 쉬워서 빠르게 개발할 수 있으며,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;useState, useEffect, useContext 등의 Hooks 를 사용할 수 있는 유일한 방식이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;함수형 컴포넌트 + Hooks 조합이 현재 React 개발의 표준이라고 볼 수 있다.&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>Front/React.js</category>
      <author>함s</author>
      <guid isPermaLink="true">https://intheham.tistory.com/235</guid>
      <comments>https://intheham.tistory.com/235#entry235comment</comments>
      <pubDate>Wed, 7 May 2025 10:20:48 +0900</pubDate>
    </item>
    <item>
      <title>[Mac] 터미널 꾸미기</title>
      <link>https://intheham.tistory.com/234</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2025-05-04 at 3.36.22 AM.png&quot; data-origin-width=&quot;1346&quot; data-origin-height=&quot;1030&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cWQ7Pb/btsNLrhgovR/jZYfeJeziTBi6ARK0Qokok/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cWQ7Pb/btsNLrhgovR/jZYfeJeziTBi6ARK0Qokok/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cWQ7Pb/btsNLrhgovR/jZYfeJeziTBi6ARK0Qokok/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcWQ7Pb%2FbtsNLrhgovR%2FjZYfeJeziTBi6ARK0Qokok%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;1346&quot; height=&quot;1030&quot; data-filename=&quot;Screenshot 2025-05-04 at 3.36.22 AM.png&quot; data-origin-width=&quot;1346&quot; data-origin-height=&quot;1030&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;h2 data-ke-size=&quot;size26&quot;&gt;iTerm2 설치&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Mac 에 깔린 기본 터미널 말고 iTerm2 를 쓰자.&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;a href=&quot;https://iterm2.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://iterm2.com/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1746297785233&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;iTerm2 - macOS Terminal Replacement&quot; data-og-description=&quot;iTerm2 by George Nachman. Website by Matthew Freeman, George Nachman, and James A. Rosen. Website updated and optimized by HexBrain&quot; data-og-host=&quot;iterm2.com&quot; data-og-source-url=&quot;https://iterm2.com/&quot; data-og-url=&quot;https://iterm2.com/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/IVpLZ/hyYM3pWQq3/QdPVHGM5Taok54WnHre6Hk/img.jpg?width=1600&amp;amp;height=624&amp;amp;face=0_0_1600_624&quot;&gt;&lt;a href=&quot;https://iterm2.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://iterm2.com/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/IVpLZ/hyYM3pWQq3/QdPVHGM5Taok54WnHre6Hk/img.jpg?width=1600&amp;amp;height=624&amp;amp;face=0_0_1600_624');&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;iTerm2 - macOS Terminal Replacement&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;iTerm2 by George Nachman. Website by Matthew Freeman, George Nachman, and James A. Rosen. Website updated and optimized by HexBrain&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;iterm2.com&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;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;oh my zsh 설치&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- zsh 쉘 프레임워크&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 터미널 외관 및 플러그인(자동완성, 구문강조, Git 통합 등 다양한 기능 제공) 추가 가능&lt;/p&gt;
&lt;pre id=&quot;code_1746286729750&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sh -c &quot;$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2025-05-04 at 12.43.22 AM.png&quot; data-origin-width=&quot;1552&quot; data-origin-height=&quot;750&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/d8C6jX/btsNJ2wbNQo/IVUR2pJRwxJhK9FHenB1J0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/d8C6jX/btsNJ2wbNQo/IVUR2pJRwxJhK9FHenB1J0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/d8C6jX/btsNJ2wbNQo/IVUR2pJRwxJhK9FHenB1J0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fd8C6jX%2FbtsNJ2wbNQo%2FIVUR2pJRwxJhK9FHenB1J0%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;1552&quot; height=&quot;750&quot; data-filename=&quot;Screenshot 2025-05-04 at 12.43.22 AM.png&quot; data-origin-width=&quot;1552&quot; data-origin-height=&quot;750&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;h2 data-ke-size=&quot;size26&quot;&gt;oh-my-zsh 플러그인 설치&lt;/h2&gt;
&lt;pre id=&quot;code_1746288466318&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# zsh-syntax-highlighting
git clone https://github.com/zsh-users/zsh-syntax-highlighting.git ${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-syntax-highlighting

# zsh-autosuggestions
git clone https://github.com/zsh-users/zsh-autosuggestions ${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-autosuggestions

# fzf (fuzzy file finding)
git clone --depth 1 https://github.com/junegunn/fzf.git ~/.fzf
~/.fzf/install

# zsh-z 디렉터리 자동 이동
git clone https://github.com/agkozak/zsh-z ${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-z&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;▼ 자세한 내용은 아래 깃헙 링크 참조&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ef6f53;&quot;&gt;&lt;a style=&quot;color: #ef6f53;&quot; title=&quot;zsh-syntax-highlighting&quot; href=&quot;https://github.com/zsh-users/zsh-syntax-highlighting/blob/master/INSTALL.md&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;zsh-syntax-highlighting&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ef6f53;&quot;&gt;&lt;a style=&quot;color: #ef6f53; text-align: start;&quot; title=&quot;zsh-autosuggestions&quot; href=&quot;https://github.com/zsh-users/zsh-autosuggestions/blob/master/INSTALL.md#oh-my-zsh&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;zsh-autosuggestions&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ef6f53;&quot;&gt;&lt;a style=&quot;color: #ef6f53; text-align: start;&quot; title=&quot;fzf&quot; href=&quot;https://github.com/junegunn/fzf&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;fzf&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ef6f53;&quot;&gt;&lt;a style=&quot;color: #ef6f53; text-align: start;&quot; title=&quot;zsh-z&quot; href=&quot;https://github.com/agkozak/zsh-z&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;zsh-z&lt;/a&gt;&lt;/span&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;h2 data-ke-size=&quot;size26&quot;&gt;.zshrc 파일 수정&lt;/h2&gt;
&lt;pre id=&quot;code_1746288529383&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;vi ~/.zshrc

# insert
i

# finish
[esc 버튼 누르기]

# 나가기
:wq

# 설정내역 반영
source ~/.zshrc&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1746288694676&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;plugins=(
  git
  zsh-syntax-highlighting
  zsh-autosuggestions
  fzf
  zsh-z
)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;gt;&amp;gt; 이렇게 zshrc 문서를 수정했는데도 계속 적용이 안되어서 한참을 헤맸는데,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;zshrc 중간에 plugins=( git )&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;맨 마지막에 넣지 말고 중간에 정의된 부분을 수정하니까 잘 된다~~ 유후~~&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;h2 data-ke-size=&quot;size26&quot;&gt;font 및 theme 바꾸기&lt;/h2&gt;
&lt;pre id=&quot;code_1746289072122&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# font
brew install --cask font-hack-nerd-font

# theme
brew install starship&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;font 는&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;iTerm2 &amp;gt; Settings &amp;gt; Profiles &amp;gt; Text 에서 수정&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;theme 은&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;.zshrc 맨 아래에 하단 코드 추가&lt;/p&gt;
&lt;pre id=&quot;code_1746289182932&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;eval &quot;$(starship init zsh)&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&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;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;figure id=&quot;og_1746288727389&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;개발자 터미널 세팅하기&quot; data-og-description=&quot;  5 mins read 처음 개발을 시작했을 때 한 번쯤 터미널을 메인 작업 도구로 하는 것에 대한 로망이 다들 있(었)지 않을까요. 저도 약 2년에 한 번꼴로 개인이든 회사든 맥북을 새로 세팅할 일이 생&quot; data-og-host=&quot;naubull2.tistory.com&quot; data-og-source-url=&quot;https://naubull2.tistory.com/167&quot; data-og-url=&quot;https://naubull2.tistory.com/167&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/eBPeS/hyYM1r7UlB/KOKg5LEqq4O9aHWZU6yWA1/img.png?width=800&amp;amp;height=454&amp;amp;face=0_0_800_454,https://scrap.kakaocdn.net/dn/PkIjm/hyYMRpwrnB/f26cuP3eZGuyUcNujeADIk/img.png?width=800&amp;amp;height=454&amp;amp;face=0_0_800_454,https://scrap.kakaocdn.net/dn/sBPkG/hyYM3DtR1G/jEthgLkzzisBN1iqhzFKcK/img.png?width=2190&amp;amp;height=1084&amp;amp;face=0_0_2190_1084&quot;&gt;&lt;a href=&quot;https://naubull2.tistory.com/167&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://naubull2.tistory.com/167&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/eBPeS/hyYM1r7UlB/KOKg5LEqq4O9aHWZU6yWA1/img.png?width=800&amp;amp;height=454&amp;amp;face=0_0_800_454,https://scrap.kakaocdn.net/dn/PkIjm/hyYMRpwrnB/f26cuP3eZGuyUcNujeADIk/img.png?width=800&amp;amp;height=454&amp;amp;face=0_0_800_454,https://scrap.kakaocdn.net/dn/sBPkG/hyYM3DtR1G/jEthgLkzzisBN1iqhzFKcK/img.png?width=2190&amp;amp;height=1084&amp;amp;face=0_0_2190_1084');&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;개발자 터미널 세팅하기&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;  5 mins read 처음 개발을 시작했을 때 한 번쯤 터미널을 메인 작업 도구로 하는 것에 대한 로망이 다들 있(었)지 않을까요. 저도 약 2년에 한 번꼴로 개인이든 회사든 맥북을 새로 세팅할 일이 생&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;naubull2.tistory.com&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;figure id=&quot;og_1746288732305&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;[Mac] iTerm2, oh my zsh 설치 및 삭제, agnoster테마 설정&quot; data-og-description=&quot;저도 이곳을 참고해서 설치했습니다~ 우리는 agnoster 테마를 설치하기 위해 아래 작업들을 해줄겁니다.agnoster 테마를 쓰면 터미널에서 git을 쓸때 매우 편리해진다고 합니다. 그전에 앞서일단 iterm&quot; data-og-host=&quot;chokotingchock.tistory.com&quot; data-og-source-url=&quot;https://chokotingchock.tistory.com/entry/%EA%B0%9C%EB%B0%9C-%ED%99%98%EA%B2%BD-%EC%84%B8%ED%8C%85-iTerm2-oh-my-zsh-%EC%84%A4%EC%B9%98&quot; data-og-url=&quot;https://chokotingchock.tistory.com/entry/%EA%B0%9C%EB%B0%9C-%ED%99%98%EA%B2%BD-%EC%84%B8%ED%8C%85-iTerm2-oh-my-zsh-%EC%84%A4%EC%B9%98&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/UJtDl/hyYMPZw6MJ/hHhdnHRQHeDC1mq2HW9st0/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/Z2IxG/hyYMZOCvsi/Hg4s8YRi7vnZPj47x7lzoK/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/NHyrV/hyYMRpwrtA/q0YSnRClnkL7x8kW95lAL0/img.png?width=2110&amp;amp;height=1186&amp;amp;face=0_0_2110_1186&quot;&gt;&lt;a href=&quot;https://chokotingchock.tistory.com/entry/%EA%B0%9C%EB%B0%9C-%ED%99%98%EA%B2%BD-%EC%84%B8%ED%8C%85-iTerm2-oh-my-zsh-%EC%84%A4%EC%B9%98&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://chokotingchock.tistory.com/entry/%EA%B0%9C%EB%B0%9C-%ED%99%98%EA%B2%BD-%EC%84%B8%ED%8C%85-iTerm2-oh-my-zsh-%EC%84%A4%EC%B9%98&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/UJtDl/hyYMPZw6MJ/hHhdnHRQHeDC1mq2HW9st0/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/Z2IxG/hyYMZOCvsi/Hg4s8YRi7vnZPj47x7lzoK/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/NHyrV/hyYMRpwrtA/q0YSnRClnkL7x8kW95lAL0/img.png?width=2110&amp;amp;height=1186&amp;amp;face=0_0_2110_1186');&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;[Mac] iTerm2, oh my zsh 설치 및 삭제, agnoster테마 설정&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;저도 이곳을 참고해서 설치했습니다~ 우리는 agnoster 테마를 설치하기 위해 아래 작업들을 해줄겁니다.agnoster 테마를 쓰면 터미널에서 git을 쓸때 매우 편리해진다고 합니다. 그전에 앞서일단 iterm&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;chokotingchock.tistory.com&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;figure id=&quot;og_1746288980836&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;터미널 꾸미기: Oh-my-zsh + iTerm2&quot; data-og-description=&quot;이번 시간에는 맥북을 처음 세팅할 때 터미널 환경을 커스텀하게 설정하는 방법에 대해서 정리합니다. iTerm2 설치 MacOS 에서 기본으로 제공하는 터미널은 다소 아쉬운 부분이 있어 보통 iTerm2 어&quot; data-og-host=&quot;kdohyeon.tistory.com&quot; data-og-source-url=&quot;https://kdohyeon.tistory.com/122&quot; data-og-url=&quot;https://kdohyeon.tistory.com/122&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/qxL5C/hyYMSWgzo6/YgdTipK6VnAsEYExkyj3a0/img.png?width=800&amp;amp;height=579&amp;amp;face=0_0_800_579,https://scrap.kakaocdn.net/dn/cXbwRZ/hyYMeeGBSZ/EyEm05m24ecGV3JnTrH1Kk/img.png?width=800&amp;amp;height=579&amp;amp;face=0_0_800_579,https://scrap.kakaocdn.net/dn/bfcrHt/hyYMUNiHv8/Z1xIUBRfsy1dkoBTmV9kJ1/img.png?width=1454&amp;amp;height=572&amp;amp;face=0_0_1454_572&quot;&gt;&lt;a href=&quot;https://kdohyeon.tistory.com/122&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://kdohyeon.tistory.com/122&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/qxL5C/hyYMSWgzo6/YgdTipK6VnAsEYExkyj3a0/img.png?width=800&amp;amp;height=579&amp;amp;face=0_0_800_579,https://scrap.kakaocdn.net/dn/cXbwRZ/hyYMeeGBSZ/EyEm05m24ecGV3JnTrH1Kk/img.png?width=800&amp;amp;height=579&amp;amp;face=0_0_800_579,https://scrap.kakaocdn.net/dn/bfcrHt/hyYMUNiHv8/Z1xIUBRfsy1dkoBTmV9kJ1/img.png?width=1454&amp;amp;height=572&amp;amp;face=0_0_1454_572');&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;터미널 꾸미기: Oh-my-zsh + iTerm2&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;이번 시간에는 맥북을 처음 세팅할 때 터미널 환경을 커스텀하게 설정하는 방법에 대해서 정리합니다. iTerm2 설치 MacOS 에서 기본으로 제공하는 터미널은 다소 아쉬운 부분이 있어 보통 iTerm2 어&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;kdohyeon.tistory.com&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;&amp;nbsp;&lt;/p&gt;
&lt;figure id=&quot;og_1746290481989&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;[Terminal] 맥북 터미널 호스트네임 변경 (터미널 상단 바 이름 변경)&quot; data-og-description=&quot;맥 터미널이나 iTerm2을 사용할 때 상단 바에 [내계정이름]@[어쩌고저쩌고]:~/[어디어디]로 뜨는 게 보일 것이다.여기서 [어쩌고저쩌고]는 HostName인데 이것을 바꿔보자.참고로 호스트 이름은 컴퓨터&quot; data-og-host=&quot;dykm.tistory.com&quot; data-og-source-url=&quot;https://dykm.tistory.com/68&quot; data-og-url=&quot;https://dykm.tistory.com/68&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/dxQixY/hyYMRXlzOI/VfvFMbDMG4BwUtL1ZPunrK/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/yO605/hyYMTHC0y7/zu5ks18uO5eJ2mLkFqQJSk/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/db1bCY/hyYMS2OgEu/UupYT7iIsxgThFh2bxqT7k/img.png?width=750&amp;amp;height=750&amp;amp;face=0_0_750_750&quot;&gt;&lt;a href=&quot;https://dykm.tistory.com/68&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://dykm.tistory.com/68&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/dxQixY/hyYMRXlzOI/VfvFMbDMG4BwUtL1ZPunrK/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/yO605/hyYMTHC0y7/zu5ks18uO5eJ2mLkFqQJSk/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/db1bCY/hyYMS2OgEu/UupYT7iIsxgThFh2bxqT7k/img.png?width=750&amp;amp;height=750&amp;amp;face=0_0_750_750');&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;[Terminal] 맥북 터미널 호스트네임 변경 (터미널 상단 바 이름 변경)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;맥 터미널이나 iTerm2을 사용할 때 상단 바에 [내계정이름]@[어쩌고저쩌고]:~/[어디어디]로 뜨는 게 보일 것이다.여기서 [어쩌고저쩌고]는 HostName인데 이것을 바꿔보자.참고로 호스트 이름은 컴퓨터&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;dykm.tistory.com&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;figure id=&quot;og_1746296025277&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;[Mac] 관리자 계정 추가, 맥북 계정 이름 및 홈 폴더 이름 변경하기&quot; data-og-description=&quot;Linux에 대하여 공부한 내용을 블로그에 올리려고 하니까 터미널에서 경로 등 내 정보가 나타나는 게 싫어서 계정 이름이랑 디렉토리 이름을 변경하기로 하였다.. *** 작업 전 백업 필수 *** 맥북의&quot; data-og-host=&quot;wonkang.tistory.com&quot; data-og-source-url=&quot;https://wonkang.tistory.com/20&quot; data-og-url=&quot;https://wonkang.tistory.com/20&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/boEY4o/hyYMcVsL4Z/QBGe7hkNDuxjPEKtAab9z1/img.png?width=446&amp;amp;height=570&amp;amp;face=0_0_446_570,https://scrap.kakaocdn.net/dn/fU4gN/hyYMQRGxJU/6BqYhdfhAEIWZh5QHHjyCk/img.png?width=446&amp;amp;height=570&amp;amp;face=0_0_446_570,https://scrap.kakaocdn.net/dn/sKAed/hyYPg2XMN3/aKmJ3gm99otBk9eJacRueK/img.png?width=1560&amp;amp;height=1360&amp;amp;face=180_258_270_357&quot;&gt;&lt;a href=&quot;https://wonkang.tistory.com/20&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://wonkang.tistory.com/20&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/boEY4o/hyYMcVsL4Z/QBGe7hkNDuxjPEKtAab9z1/img.png?width=446&amp;amp;height=570&amp;amp;face=0_0_446_570,https://scrap.kakaocdn.net/dn/fU4gN/hyYMQRGxJU/6BqYhdfhAEIWZh5QHHjyCk/img.png?width=446&amp;amp;height=570&amp;amp;face=0_0_446_570,https://scrap.kakaocdn.net/dn/sKAed/hyYPg2XMN3/aKmJ3gm99otBk9eJacRueK/img.png?width=1560&amp;amp;height=1360&amp;amp;face=180_258_270_357');&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;[Mac] 관리자 계정 추가, 맥북 계정 이름 및 홈 폴더 이름 변경하기&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Linux에 대하여 공부한 내용을 블로그에 올리려고 하니까 터미널에서 경로 등 내 정보가 나타나는 게 싫어서 계정 이름이랑 디렉토리 이름을 변경하기로 하였다.. *** 작업 전 백업 필수 *** 맥북의&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;wonkang.tistory.com&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;</description>
      <category>Mac</category>
      <category>iterm2</category>
      <category>oh my zsh</category>
      <category>맥 터미널 꾸미기</category>
      <category>터미널 깃 브렌치</category>
      <author>함s</author>
      <guid isPermaLink="true">https://intheham.tistory.com/234</guid>
      <comments>https://intheham.tistory.com/234#entry234comment</comments>
      <pubDate>Sun, 4 May 2025 03:45:33 +0900</pubDate>
    </item>
    <item>
      <title>[Git] 명령어 및 플로우 정리</title>
      <link>https://intheham.tistory.com/233</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;git clone&lt;/h2&gt;
&lt;pre id=&quot;code_1745682887602&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;cd 원하는경로
git clone 리포지토리주소&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 리포지토리 생성 후 url 복사&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;3. clone으로 리포지토리 파일 내려받기&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;git config&lt;/h2&gt;
&lt;pre id=&quot;code_1745682988747&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;git config --global user.name 깃아이디
git config --global user.password 토큰&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이때,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;fatal: Authentication failed for '리포지토리주소'&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;에러가 뜰 경우, 깃 설정에서 토큰 발급 후&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;로컬 컴퓨터에 깃 정보 등록&lt;/span&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;figure id=&quot;og_1745683050420&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;Github 에러 해결법: Authentication failed for ~ use a personal access token instead&quot; data-og-description=&quot;Github 을 사용하다 보면 2021년 8월 이후로 git pull 을 하려 할때에 아래와 같운 에러가 발생할 때가 있다. remote: Support for password authentication was removed on August 13, 2021. Please use a personal access token instead. &quot; data-og-host=&quot;wotres.tistory.com&quot; data-og-source-url=&quot;https://wotres.tistory.com/entry/Github-%EC%97%90%EB%9F%AC-%ED%95%B4%EA%B2%B0%EB%B2%95-Authentication-failed-for-use-a-personal-access-token-instead&quot; data-og-url=&quot;https://wotres.tistory.com/entry/Github-%EC%97%90%EB%9F%AC-%ED%95%B4%EA%B2%B0%EB%B2%95-Authentication-failed-for-use-a-personal-access-token-instead&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/VsOtY/hyYM0exPVg/8s0zSORcYKkBmzKK2d5Ku1/img.png?width=195&amp;amp;height=527&amp;amp;face=0_0_195_527,https://scrap.kakaocdn.net/dn/1LCC3/hyYJsqAeil/dwvrmRz3ktmSmask33aRLK/img.png?width=195&amp;amp;height=527&amp;amp;face=0_0_195_527,https://scrap.kakaocdn.net/dn/bIOYTe/hyYJxFqniy/iu39iK1Pdpj6Dxgf0lhF7K/img.png?width=989&amp;amp;height=749&amp;amp;face=0_0_989_749&quot;&gt;&lt;a href=&quot;https://wotres.tistory.com/entry/Github-%EC%97%90%EB%9F%AC-%ED%95%B4%EA%B2%B0%EB%B2%95-Authentication-failed-for-use-a-personal-access-token-instead&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://wotres.tistory.com/entry/Github-%EC%97%90%EB%9F%AC-%ED%95%B4%EA%B2%B0%EB%B2%95-Authentication-failed-for-use-a-personal-access-token-instead&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/VsOtY/hyYM0exPVg/8s0zSORcYKkBmzKK2d5Ku1/img.png?width=195&amp;amp;height=527&amp;amp;face=0_0_195_527,https://scrap.kakaocdn.net/dn/1LCC3/hyYJsqAeil/dwvrmRz3ktmSmask33aRLK/img.png?width=195&amp;amp;height=527&amp;amp;face=0_0_195_527,https://scrap.kakaocdn.net/dn/bIOYTe/hyYJxFqniy/iu39iK1Pdpj6Dxgf0lhF7K/img.png?width=989&amp;amp;height=749&amp;amp;face=0_0_989_749');&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;Github 에러 해결법: Authentication failed for ~ use a personal access token instead&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Github 을 사용하다 보면 2021년 8월 이후로 git pull 을 하려 할때에 아래와 같운 에러가 발생할 때가 있다. remote: Support for password authentication was removed on August 13, 2021. Please use a personal access token instead.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;wotres.tistory.com&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;4-1. 클론받은 파일에 바로 프로젝트를 생성해도 되고&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;4-2. 기존에 생성한 프로젝트가 있다면 이 파일로 옮김&lt;/span&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;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span&gt;git status&lt;/span&gt;&lt;/h2&gt;
&lt;pre id=&quot;code_1745683196350&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;git status

On branch master
Your branch is up to date with 'origin/master'.

Untracked files:
  (use &quot;git add &amp;lt;file&amp;gt;...&quot; to include in what will be committed)
	JS/&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;git status&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;명령어를 입력하면, 현재 자신의 브랜치와 변경점이 있는 파일을 보여줌&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Untracked files: &amp;lt;- 깃에 등록되지 않은 파일들&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;git add&lt;/h2&gt;
&lt;pre id=&quot;code_1745683273305&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;git add .
git add 파일/폴더 이름&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5. 깃에 등록하지 않은 파일/폴더 를 깃에 추가&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;제대로 작동하면 파일의 상태가 변함 Untracked files -&amp;gt; new files&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;git commit&lt;/h2&gt;
&lt;pre id=&quot;code_1745683643492&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;git commit -m &quot;커밋메시지&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;6. 등록한 파일들을 커밋함.&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;h2 data-ke-size=&quot;size26&quot;&gt;git push&lt;/h2&gt;
&lt;pre id=&quot;code_1745683771235&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;git push&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;7.-1 커밋한 파일을 본인 브랜치의 깃 서버로 전송&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1745685354477&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;git push origin master
git push origin main&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;7-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-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;git branch&lt;/h2&gt;
&lt;pre id=&quot;code_1745684342554&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;git branch

* master&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;git branch 를 하면 현재 있는 브랜치의 리스트를 보여줌&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1745684382158&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;git branch 새로운브랜치이름&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;새로운 브랜치 생성&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1745684969429&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;git branch -m 기존이름 바꿀이름&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;브랜치 이름 바꾸기&lt;/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;&lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;!! 브랜치 이름을 바꾸면 깃의 모든 공유자는 업데이트를 받아야 함&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1745685064758&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;git branch -m 기존이름 새이름
git fetch origin
git branch -u origin/새이름 새이름
git remote set-head origin -a&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;※ master -&amp;gt; main&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;깃의 기본 브랜치는 master 이지만, master 는 과거의 부정적인 역사(노예제도 등)와 연결될 수 있어서&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;더 포용적이고 중립적인 main 을 쓰기로 결정함.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기능이나 역할은 같고 이름만 바뀜.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;20년도 이후 버전은 main 으로 프로젝트가 생성된다고 함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(난 master 로 만들어졌는데...... &amp;lt;- 그렇다면 main 으로 바꾸길 권장)&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;&lt;a href=&quot;https://github.com/github/renaming?tab=readme-ov-file&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://github.com/github/renaming?tab=readme-ov-file&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1745685667351&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;object&quot; data-og-title=&quot;GitHub - github/renaming: Guidance for changing the default branch name for GitHub repositories&quot; data-og-description=&quot;Guidance for changing the default branch name for GitHub repositories - github/renaming&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/github/renaming?tab=readme-ov-file&quot; data-og-url=&quot;https://github.com/github/renaming&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bcN2zW/hyYFzpQUFR/nSkfO99SAUKKBdmKsRxhL0/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600,https://scrap.kakaocdn.net/dn/bkEleh/hyYJv1Twdb/Bb4yqhiK6YIKQtz2Xcu6dk/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600&quot;&gt;&lt;a href=&quot;https://github.com/github/renaming?tab=readme-ov-file&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://github.com/github/renaming?tab=readme-ov-file&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bcN2zW/hyYFzpQUFR/nSkfO99SAUKKBdmKsRxhL0/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600,https://scrap.kakaocdn.net/dn/bkEleh/hyYJv1Twdb/Bb4yqhiK6YIKQtz2Xcu6dk/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600');&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;GitHub - github/renaming: Guidance for changing the default branch name for GitHub repositories&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Guidance for changing the default branch name for GitHub repositories - github/renaming&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;github.com&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;&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;git checkout&lt;/h2&gt;
&lt;pre id=&quot;code_1745685007371&quot; style=&quot;background-color: #f8f8f8; color: #383a42; text-align: start;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;javascript&quot;&gt;&lt;code&gt;git checkout 변경할브랜치이름&lt;/code&gt;&lt;/pre&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 data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;git merge&lt;/h2&gt;
&lt;pre id=&quot;code_1745684587636&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;git merge 브랜치이름

git merge main&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;브랜치에서 작업한 내용을 메인 브랜치로 병합&lt;/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;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://docs.github.com/ko/repositories/configuring-branches-and-merges-in-your-repository/managing-branches-in-your-repository/renaming-a-branch&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://docs.github.com/ko/repositories/configuring-branches-and-merges-in-your-repository/managing-branches-in-your-repository/renaming-a-branch&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1745685104554&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;분기 이름 바꾸기 - GitHub Docs&quot; data-og-description=&quot;리포지토리에서 분기의 이름을 변경할 수 있습니다.&quot; data-og-host=&quot;docs.github.com&quot; data-og-source-url=&quot;https://docs.github.com/ko/repositories/configuring-branches-and-merges-in-your-repository/managing-branches-in-your-repository/renaming-a-branch&quot; data-og-url=&quot;https://docs-internal.github.com/ko/repositories/configuring-branches-and-merges-in-your-repository/managing-branches-in-your-repository/renaming-a-branch&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cXkcKK/hyYL8Kw0Re/1dnBHpT9k3mqwKzt50eZz1/img.png?width=1200&amp;amp;height=628&amp;amp;face=0_0_1200_628,https://scrap.kakaocdn.net/dn/2Osvo/hyYMUMaeBW/MFrTwkjKUEAZy6PTK6Epf1/img.png?width=1200&amp;amp;height=628&amp;amp;face=0_0_1200_628,https://scrap.kakaocdn.net/dn/PRTcL/hyYIigDaMN/kDfXy4mAUEv5o3zpMdSQpK/img.png?width=752&amp;amp;height=570&amp;amp;face=0_0_752_570&quot;&gt;&lt;a href=&quot;https://docs.github.com/ko/repositories/configuring-branches-and-merges-in-your-repository/managing-branches-in-your-repository/renaming-a-branch&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://docs.github.com/ko/repositories/configuring-branches-and-merges-in-your-repository/managing-branches-in-your-repository/renaming-a-branch&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cXkcKK/hyYL8Kw0Re/1dnBHpT9k3mqwKzt50eZz1/img.png?width=1200&amp;amp;height=628&amp;amp;face=0_0_1200_628,https://scrap.kakaocdn.net/dn/2Osvo/hyYMUMaeBW/MFrTwkjKUEAZy6PTK6Epf1/img.png?width=1200&amp;amp;height=628&amp;amp;face=0_0_1200_628,https://scrap.kakaocdn.net/dn/PRTcL/hyYIigDaMN/kDfXy4mAUEv5o3zpMdSQpK/img.png?width=752&amp;amp;height=570&amp;amp;face=0_0_752_570');&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;분기 이름 바꾸기 - GitHub Docs&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;리포지토리에서 분기의 이름을 변경할 수 있습니다.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;docs.github.com&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;</description>
      <category>Git</category>
      <author>함s</author>
      <guid isPermaLink="true">https://intheham.tistory.com/233</guid>
      <comments>https://intheham.tistory.com/233#entry233comment</comments>
      <pubDate>Sun, 27 Apr 2025 01:44:41 +0900</pubDate>
    </item>
    <item>
      <title>[JavaScript] findLast, toSorted, toReversed, toSpliced, with (ES2023)</title>
      <link>https://intheham.tistory.com/232</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. findLast / findLastIndex&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;find() 는 앞에서부터 조건을 만족하는 첫 요소를 찾고,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;findLast() 는 뒤에서부터 찾는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1744291778752&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const numbers = [1, 2, 3, 4, 5, 6];

console.log(numbers.find(n =&amp;gt; n % 2 === 0));      	  // 2
console.log(numbers.findLast(n =&amp;gt; n % 2 === 0));      // 6
console.log(numbers.findLastIndex(n =&amp;gt; n % 2 === 0)); // 5&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2. toSorted / toReversed / toSpliced / with&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;원본 배열은 변경하지 않고, 새로운 배열을 반환한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;React 같이 불변성 유지가 중요한 프레임워크에서 유용히 쓰임.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1744291843517&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const arr = [3, 1, 4];

// toSorted
console.log(arr.toSorted()); // [1, 3, 4]

// toReversed
console.log(arr.toReversed()); // [4, 1, 3]

// toSpliced(1, 1) &amp;rarr; 1번 인덱스에서 1개 삭제
console.log(arr.toSpliced(1, 1)); // [3, 4]

// with(1, 8) &amp;rarr; 1번 인덱스의 값을 8로 변경
console.log(arr.with(1, 8));	// [3, 8, 4]

console.log(arr); // [3, 1, 4] &amp;larr; 원본 그대로!&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;arr.toSorted()&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;h4 data-ke-size=&quot;size20&quot;&gt;arr.toReversed()&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;h4 data-ke-size=&quot;size20&quot;&gt;arr.toSpliced(start, deleteCount)&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;: splice() 처럼 작동하지만 원본 유지&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;arr.with(index, value)&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;: 특정 인덱스 값을 교체한 새 배열 반환&lt;/p&gt;</description>
      <category>Front/JavaScript</category>
      <author>함s</author>
      <guid isPermaLink="true">https://intheham.tistory.com/232</guid>
      <comments>https://intheham.tistory.com/232#entry232comment</comments>
      <pubDate>Thu, 10 Apr 2025 22:39:42 +0900</pubDate>
    </item>
    <item>
      <title>[JavaScript] replaceAll (ES2021), at (ES2022)</title>
      <link>https://intheham.tistory.com/231</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. replaceAll&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;replace 는 첫번째 키워드만 바꿀 수 있지만&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;replaceAll 은 문자열의 모든 키워드를 바꿀 수 있다.&lt;/p&gt;
&lt;pre id=&quot;code_1744290291256&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const str = &quot;You are the best of the best&quot;;

const str_1 = str.replaceAll('best', 'worst');
// &quot;You are the worst of the worst&quot;

const str_2 = str.replace('best', 'worst');
// &quot;You are the worst of the best&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;문자열은 불변(immutable) 타입&lt;/b&gt;이기 떄문에 &lt;b&gt;문자열 자체를 바꿀 수 없다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;대신, replace() 같은 메서드로 원본을 직접 수정하지 않고, 새로운 문자열을 반환해 사용한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이때, let 으로 선언한 문자열은 재할당이 가능해서 같은 변수에 새 문자열을 할당할 수 있지만,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;const 로 선언한 문자열은 재할당이 불가능해서 새로운 변수를 선언해야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1744290673875&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const str = &quot;hello&quot;;
const newStr = str.replace(&quot;h&quot;, &quot;y&quot;);

console.log(str);     // &quot;hello&quot; &amp;rarr; 원본 안 바뀜!
console.log(newStr);  // &quot;yello&quot;


let greeting = &quot;hi there&quot;;
greeting = greeting.replace(&quot;hi&quot;, &quot;hello&quot;);

console.log(greeting); // &quot;hello there&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그러면 여기서 궁금한 점이 생긴다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;let 변수는 새로운 문자열을 덮어써서 변수 값을 바꾸는 방식으로 작동한다.&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;span style=&quot;color: #ee2323;&quot;&gt;그렇다면, 덮어씌워진 원본 문자열은 어디로 갈까??&lt;/span&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;위의 예시에서 greeting 변수는&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;hi there&quot; 를 가리키던 참조(reference)를 잃고,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;hello there&quot; 라는 새로운 문자열을 가리키게 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이때 잃어버린 &quot;hi there&quot; 의 참조는 &lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;가비지 컬렉터 (Garbage Collector)&lt;/b&gt;&lt;/span&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;blockquote data-ke-style=&quot;style3&quot;&gt;1. &quot;hi there&quot; &amp;rarr; 메모리에 저장됨&lt;br /&gt;2. greeting.replace(...) 실행 &amp;rarr; &quot;hello there&quot;라는 새로운 문자열이 만들어짐&lt;br /&gt;3. greeting은 이제 &quot;hello there&quot;를 가리킴&lt;br /&gt;4. 더 이상 &quot;hi there&quot;를 가리키는 변수가 없으면, JavaScript가 메모리에서 치워버림  &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;h2 data-ke-size=&quot;size26&quot;&gt;2. at&lt;/h2&gt;
&lt;pre id=&quot;code_1744291456302&quot; class=&quot;ada&quot; style=&quot;background-color: #f8f8f8; color: #383a42; text-align: start;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;javascript&quot;&gt;&lt;code&gt;array.at(index)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;배열이나 문자열에서 특정 위치의 값을 가져온다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;음수 인덱스를 지원한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1744291488877&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const last1 = arr[arr.length - 1];	// 기존 문법
const last2 = arr.at(-1);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&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;pre id=&quot;code_1744291409096&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 배열
const numbers = [10, 20, 30, 40, 50];

console.log(numbers.at(0));   // 10  (첫 번째 요소)
console.log(numbers.at(-1));  // 50  (마지막 요소)
console.log(numbers.at(-2));  // 40  (뒤에서 두 번째 요소)

// 문자열
const greeting = &quot;hello&quot;;

console.log(greeting.at(1));   // 'e'
console.log(greeting.at(-1));  // 'o'&lt;/code&gt;&lt;/pre&gt;</description>
      <category>Front/JavaScript</category>
      <author>함s</author>
      <guid isPermaLink="true">https://intheham.tistory.com/231</guid>
      <comments>https://intheham.tistory.com/231#entry231comment</comments>
      <pubDate>Thu, 10 Apr 2025 22:26:08 +0900</pubDate>
    </item>
    <item>
      <title>[JavaScript] ES20 - '?.' 와 '??'</title>
      <link>https://intheham.tistory.com/230</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. Optional Chaining:&lt;span style=&quot;background-color: #ffc1c8;&quot;&gt; ?.&amp;nbsp;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;: 값이 있을 수도 있고 없을 수도 있는 상황에서 주로 사용한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;중첩 객체의 특정 속성에 접근하기 위해서 기존에는 일일이 And 로 연결해 속성의 존재 여부를 확인해야 했다.&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;조건문 속 속성이 없을 경우 TypeError 에러가 뜰 수 있다.&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;옵셔널 체이닝 (A ?. B) 은&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;A가 undefined 나 null 이면 바로 undefined 를 반환하고 에러 없이 멈춘다.&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;null 체크를 매번 하지 않아도 돼서 실수가 줄어든다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1743952461934&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;let will_pokemon = {
    pikachu: {
        friend: { 
            charizard: {
                species: 'Dragon Pokemon',
                height: 1.7,
                weight: 90.5,
                power: 'fire'
            }
        }
    }
}


// And 연산자
if (will_pokemon 
	&amp;amp;&amp;amp; will_pokemon.pikachu 
	&amp;amp;&amp;amp; will_pokemon.pikachu.friend 
	&amp;amp;&amp;amp; will_pokemon.pikachu.friend.charizard) { 
    console.log('fight!')
} else {
    console.log('walk away...')
}

// 옵셔널 체이닝
if (will_pokemon?.pikachu?.friend?.charizard) {
    console.log('fight!')
} else {
    console.log('walk away...')
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;단, 옵셔널 체이닝은 존재하지 않아도 괜찮은 대상에만 사용하는 것이 좋다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 예시에서, will_pokemon 에 pikachu 가 반드시 있어야 한다면,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;u&gt;will_pokemon.pikachu&lt;/u&gt;?.friend?.charizard 처럼 사용해야&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;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2. Nullish Coalescing Operator: ??&lt;/h2&gt;
&lt;pre id=&quot;code_1743953354561&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;x = (a !== null &amp;amp;&amp;amp; a !== undefined) ? a : b;
x = a ?? b&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #ffc1c8;&quot;&gt;&amp;nbsp;A ?? B&amp;nbsp;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;: A 가 null 또는 undefined 일 경우에만 B를 사용한다.&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;: ?? 연산자의 우선순위는 5 로, 대부분의 연산자보다 나중에 평가된다.&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;pre id=&quot;code_1743954087233&quot; style=&quot;background-color: #f8f8f8; color: #383a42; text-align: start;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;javascript&quot;&gt;&lt;code&gt;let height = null;
let width = null;

// 괄호를 추가!
let area = (height ?? 100) * (width ?? 50);&lt;/code&gt;&lt;/pre&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 data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2-1. || (Or 연산자) 와 ?? 의 차이&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;?? 는 null 과 undefined 만 체크하지만,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;|| 는 0, '', false 등도 같이 체크한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1743953732074&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const title = &quot;&quot;;

// OR 연산자
console.log(title || &quot;Untitled&quot;); // &quot;Untitled&quot; ❗
// Null 병합
console.log(title ?? &quot;Untitled&quot;); // &quot;&quot; (빈 문자열 유지됨!) ✅&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3. ?. 와 ?? 같이 사용하기&lt;/h2&gt;
&lt;pre id=&quot;code_1743953786602&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const city = user.address?.city ?? &quot;No City&quot;;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;user 객체에 address 는 꼭 있어야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;user.address 에 city 가 있나?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;있다면, null 이나 undefined 인가?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그렇다 -&amp;gt; &quot;No City&quot;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아니다 -&amp;gt; user.address.city 반환&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;(+) 응용&lt;/p&gt;
&lt;pre id=&quot;code_1743954159759&quot; style=&quot;background-color: #f8f8f8; color: #383a42; text-align: start;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;javascript&quot;&gt;&lt;code&gt;const theme = null;
const finalTheme = (theme ?? 'light') === 'dark' ? ' ' : '☀️';

console.log(finalTheme); // '☀️'&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&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;&lt;a href=&quot;https://ko.javascript.info/optional-chaining&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://ko.javascript.info/optional-chaining&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1743952163335&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;옵셔널 체이닝 '?.'&quot; data-og-description=&quot;&quot; data-og-host=&quot;ko.javascript.info&quot; data-og-source-url=&quot;https://ko.javascript.info/optional-chaining&quot; data-og-url=&quot;https://ko.javascript.info/optional-chaining&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/uuTEl/hyYBcHqFB3/kdQffkPFCNbKmnl7Ysns0k/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/tbryq/hyYCaWphVG/9YSclcsF3DQctTs2UvUsZ0/img.png?width=512&amp;amp;height=512&amp;amp;face=0_0_512_512&quot;&gt;&lt;a href=&quot;https://ko.javascript.info/optional-chaining&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://ko.javascript.info/optional-chaining&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/uuTEl/hyYBcHqFB3/kdQffkPFCNbKmnl7Ysns0k/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/tbryq/hyYCaWphVG/9YSclcsF3DQctTs2UvUsZ0/img.png?width=512&amp;amp;height=512&amp;amp;face=0_0_512_512');&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;옵셔널 체이닝 '?.'&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;ko.javascript.info&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://ko.javascript.info/nullish-coalescing-operator&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://ko.javascript.info/nullish-coalescing-operator&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1743952168455&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;nullish 병합 연산자 '??'&quot; data-og-description=&quot;&quot; data-og-host=&quot;ko.javascript.info&quot; data-og-source-url=&quot;https://ko.javascript.info/nullish-coalescing-operator&quot; data-og-url=&quot;https://ko.javascript.info/nullish-coalescing-operator&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bebRaG/hyYClDntCr/Rcrg0nc5VdXj3XeMAB1EEK/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/mA6I3/hyYBerIgAj/xBZjp786CJwtavhuK50S60/img.png?width=512&amp;amp;height=512&amp;amp;face=0_0_512_512&quot;&gt;&lt;a href=&quot;https://ko.javascript.info/nullish-coalescing-operator&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://ko.javascript.info/nullish-coalescing-operator&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bebRaG/hyYClDntCr/Rcrg0nc5VdXj3XeMAB1EEK/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/mA6I3/hyYBerIgAj/xBZjp786CJwtavhuK50S60/img.png?width=512&amp;amp;height=512&amp;amp;face=0_0_512_512');&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;nullish 병합 연산자 '??'&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;ko.javascript.info&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;</description>
      <category>Front/JavaScript</category>
      <author>함s</author>
      <guid isPermaLink="true">https://intheham.tistory.com/230</guid>
      <comments>https://intheham.tistory.com/230#entry230comment</comments>
      <pubDate>Mon, 7 Apr 2025 00:43:01 +0900</pubDate>
    </item>
    <item>
      <title>[JavaScript] array (2) - map</title>
      <link>https://intheham.tistory.com/229</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;0. map 이란&lt;/h2&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;: 콜백 함수를 인자로 받고, 원본 배열의 &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;※ reduce() 는 배열을 순회하며 하나의 최종 값을 반환할 때 쓰인다. (합계, 평균, 객체 변환 등)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;※ forEach() 는 배열을 단순히 순회하고 작업을 수행할 뿐, 반환값은 없다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1743601291386&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const newArray = oldArray.map((element, index, array) =&amp;gt; {
  return 변환된_값;
});&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;element - 현재 배열 요소&lt;br /&gt;index - 현재 요소의 인덱스 (선택사항)&lt;br /&gt;array - map()을 호출한 원본 배열 (선택사항)&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;h3 data-ke-size=&quot;size23&quot;&gt;예시 1) 모든 숫자 2배로 만들기&lt;/h3&gt;
&lt;pre id=&quot;code_1743601396238&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const numbers = [1, 2, 3, 4, 5];

const squaredNumbers = numbers.map(num =&amp;gt; num ** 2);

console.log(squaredNumbers);	// [1, 4, 9, 16, 25]  (각 요소를 제곱한 새 배열)
console.log(numbers);  			// [1, 2, 3, 4, 5]  (원본 배열은 그대로 유지됨)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;예시 2) 문자열을 대문자로 변환하기&lt;/h3&gt;
&lt;pre id=&quot;code_1743601638037&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const words = ['hell0', 'world', 'javascript'];
const upperCaseWords = words.map(word =&amp;gt; word.toUpperCase());

console.log(upperCaseWords);	// ['HELLO', 'WORLD', 'JAVASCRIPT']&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;예시 3) 객체 배열에서 특정 속성 값만 추출하기&lt;/h3&gt;
&lt;pre id=&quot;code_1743601729114&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const users = [
  { name: 'Alice', age: 25 },
  { name: 'Bob', age: 30 },
  { name: 'Charlie', age: 35 }
];

const names = users.map(user =&amp;gt; user.name);

console.log(names);		// ['Alice', 'Bob', 'Charlie']&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;예시 4) 배열 요소를 특정 형식의 문자열로 변환&lt;/h3&gt;
&lt;pre id=&quot;code_1743601773580&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const products = [
  { name: 'Laptop', price: 1000 },
  { name: 'Phone', price: 500 },
  { name: 'Tablet', price: 700 }
];

const productDescriptions = products.map(product =&amp;gt; `${product.name} costs $${product.price}`);

console.log(productDescriptions);  
// ['Laptop costs $1000', 'Phone costs $500', 'Tablet costs $700']&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;예시 5) index 활용&lt;/h3&gt;
&lt;pre id=&quot;code_1743602005669&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const fruits = ['apple', 'banana', 'cherry'];

const numberedFruits = fruits.map((fruit, index) =&amp;gt; {
  return `${index + 1}. ${fruit}`;
});

console.log(numberedFruits);	// ['1. apple', '2. banana', '3. cherry']&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;예시 6) array 활용해서 상대 평가하기&lt;/h3&gt;
&lt;pre id=&quot;code_1743602102336&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const scores = [90, 85, 78, 92, 88];

const relativeScores = scores.map((score, _, array) =&amp;gt; {
  const highest = Math.max(...array); // 배열에서 가장 높은 점수 찾기
  return `Score: ${score} (${((score / highest) * 100).toFixed(2)}%)`;
});

console.log(relativeScores);
/*
[
  'Score: 90 (97.83%)',
  'Score: 85 (92.39%)',
  'Score: 78 (84.78%)',
  'Score: 92 (100.00%)',
  'Score: 88 (95.65%)'
]
*/&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;예시 7) 이중 map() - 내부 배열 (배열&amp;nbsp; &amp;gt; 객체 &amp;gt; 배열) 변형&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;객체를 변경할 때는 원본을 유지하기 위해 { ...user } 처럼 복사하는 게 좋다.&lt;/p&gt;
&lt;pre id=&quot;code_1743602331734&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const users = [
  {
    name: &quot;Alice&quot;,
    items: [&quot;apple&quot;, &quot;banana&quot;]
  },
  {
    name: &quot;Bob&quot;,
    items: [&quot;pen&quot;, &quot;notebook&quot;]
  }
];

const updatedUsers = users.map(user =&amp;gt; {
  return {
    ...user, // 기존 객체를 유지하면서
    items: user.items.map(item =&amp;gt; item + &quot;!&quot;) // 각 아이템에 &quot;!&quot; 추가
  };
});

console.log(updatedUsers);
/*
[
  { name: 'Alice', items: ['apple!', 'banana!'] },
  { name: 'Bob', items: ['pen!', 'notebook!'] }
]
*/&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&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;예시 8) 이중 map() - 다차원 배열 (행렬) 변형&lt;/h3&gt;
&lt;pre id=&quot;code_1743602487501&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const matrix = [
  [1, 2, 3],
  [4, 5, 6]
];

const doubledMatrix = matrix.map(row =&amp;gt; 
  row.map(num =&amp;gt; num * 2) // 각 요소를 2배로 변환
);

console.log(doubledMatrix);
/*
[
  [2, 4, 6],
  [8, 10, 12]
]
*/&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Front/JavaScript</category>
      <category>JavaScript map</category>
      <category>map</category>
      <category>다차원배열</category>
      <author>함s</author>
      <guid isPermaLink="true">https://intheham.tistory.com/229</guid>
      <comments>https://intheham.tistory.com/229#entry229comment</comments>
      <pubDate>Wed, 2 Apr 2025 23:01:54 +0900</pubDate>
    </item>
    <item>
      <title>[JavaScript] ES10 - flat/flatMap, Object.fromEntries, trimStart/trimEnd</title>
      <link>https://intheham.tistory.com/228</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. flat / flatMap&lt;/h2&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Array.prototype.flat(n)&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;: 중첩된 배열을 펼쳐서 1차원 배열로 만든다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- n이 빈값이면 기본적으로 1단계만 펼침&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- n단계까지 펼치고,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 특정 숫자를 지정하기 어려울 때 Intinity 를 넣으면 배열의 depth 와 관계없이 1차원 배열로 만든다.&lt;/p&gt;
&lt;pre id=&quot;code_1743600047325&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const array = [[1],[2],[3],[[[4]]],[[[5]]]]
console.log(array.flat(2))	// [1,2,3,[4],[5]]

const trapped = [[[[[[[[[[[[[[[[[[[[[[[[[[3]]]]]]]]]]]]]]]]]]]]]]]]]];
console.log(trapped.flat(Infinity))		// [3]&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Array.prototype.flatMap()&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;: map()을 적용한 후, 결과를 flat() 한다.&lt;/p&gt;
&lt;pre id=&quot;code_1743600063145&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const greeting = [[&quot;Hello&quot;, &quot;young&quot;, &quot;grasshopper!&quot;], [&quot;you&quot;, &quot;are&quot;], [&quot;learning&quot;, &quot;fast!&quot;]];

// [ 'Hello young grasshopper!', 'you are', 'learning fast!' ]
console.log(greeting.flatMap(x =&amp;gt; x.join(' ')))	

// 'Hello young grasshopper you are learning fast!'
console.log(greeting.flatMap(x =&amp;gt; x.join(' ')).join(' '))&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1743600309192&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const arr = [1, 2, 3];

// [1, 2, 2, 4, 3, 6]  (각 요소를 2배로 늘리고 펼침)
console.log(arr.flatMap(num =&amp;gt; [num, num * 2]));&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2. Object.fromEntries&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;: 배열을 객체로 변환한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;: Object.entries() 의 반대역할.&lt;/p&gt;
&lt;pre id=&quot;code_1743600492453&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const users = { user1: 18273, user2: 92833, user3: 90315 }

// 객체-&amp;gt;배열 [ [ 'user1', 18273 ], [ 'user2', 92833 ], [ 'user3', 90315 ] ]
const usersArray = Object.entries(users)

// [ [ 'user1', 36546 ], [ 'user2', 185666 ], [ 'user3', 180630 ] ]
updatedUsersArray = usersArray.map((user) =&amp;gt; [user[0], user[1] * 2])

// 배열-&amp;gt;객체 { user1: 36546, user2: 185666, user3: 180630 }
const updatedUsers = Object.fromEntries(updatedUsersArray)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3. trimStart / trimEnd&lt;/h2&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;String.prototype.trimStart()&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;String.prototype.trimEnd()&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;: 앞뒤 공백을 제거하는 trim()의 확장&lt;/p&gt;
&lt;pre id=&quot;code_1743600619787&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const userEmail3 = '     HELLO   '

console.log(userEmail3.trim())		// 앞뒤 공백 제거	'HELLO'
console.log(userEmail3.trimStart())	// 앞 공백 제거	'HELLO   '
console.log(userEmail3.trimEnd())	// 뒤 공백 제거	'     HELLO'&lt;/code&gt;&lt;/pre&gt;</description>
      <category>Front/JavaScript</category>
      <author>함s</author>
      <guid isPermaLink="true">https://intheham.tistory.com/228</guid>
      <comments>https://intheham.tistory.com/228#entry228comment</comments>
      <pubDate>Wed, 2 Apr 2025 22:34:06 +0900</pubDate>
    </item>
    <item>
      <title>[JavaScript] 반복문 -- for-of / for-in (Iterating vs. Enumerating)</title>
      <link>https://intheham.tistory.com/227</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;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1743341435243&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const basket = ['apples', 'oranges', 'grapes']

// for
for ( let i = 0; i &amp;lt; basket.length; i++ ) {
	console.log(basket[i]);
}

// forEach
basket.forEach( item =&amp;gt; {
	console.log(item);
}

// while
let i = 0;
while (i &amp;lt; basket.length) {
	console.log(basket[i]);
}

// do-while
let j = 0;
do {
	console.log(basket[j]);
    j++;
} while (j &amp;lt; basket.length);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자바스크립트에는 크게 &lt;b&gt;기본 반복문(Traditional Loops)&lt;/b&gt;와 &lt;b&gt;고급 반복문 (Modern Loops)&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;for 문, while 문, do...while문 이 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;고급 반복문은 기본 반복문보다 더 직관적이고 선언적인 방식으로 사용되며,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;forEach, for...of, for...in 이 있다.&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;그 중에서 가장 헷갈리는 for...of 와 for...in 에 대해 이해하는 시간을 가져보자.&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;1. for...of (Iterating)&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Iterating 이란, 반복(iteration)하면서 값(value)을 가져오는 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;배열, 문자열, Set, Map 등 반복 가능한(iterable) 요소를 순회하며, 순서를 보장한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1743342235357&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const basket = ['apples', 'oranges', 'grapes']

for (item of basket) {
	console.log(item); // apples, oranges, grapes
}

for (char of 'basket') {
	console.log(char); // b, a, s, k, e, t
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2. for...in (Enumerating)&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;객체(Object)의 속성(property)을 열거(하나씩 나열)할 때 사용한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;객체의 키(key)를 가져오며, 순서를 보장하지 않는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1743342484724&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const detailedBasket = {
	apples : 5,
    oranges : 10,
    grapes : 50
}

for (item in detailedBasket) {
	console.log(item);
}

// apples
// oranges
// grapes&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;for...in 과 Object.keys() 차이점&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;b&gt;for...in&lt;/b&gt; 은 &lt;b&gt;상속된 속성까지 포함&lt;/b&gt;할 수 있으며, &lt;b&gt;문자열&lt;/b&gt;을 리턴한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Object.keys()&lt;/b&gt; 는 상속을 제외하고 &lt;b&gt;자신의 속성만&lt;/b&gt; 가져오며, &lt;b&gt;배열&lt;/b&gt;을 리턴한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1743343497028&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const parent = { inherited: &quot;I'm inherited!&quot; };
const obj = Object.create(parent); // obj의 프로토타입에 parent를 추가
obj.name = &quot;James&quot;;
obj.age = 25;


for (let key in obj) {
  console.log(key); // name, age, inherited (프로토타입 상속된 속성도 포함!)
}

for (let key in obj) {
  if (obj.hasOwnProperty(key)) {
    console.log(key); // name, age (inherited는 제외됨)
  }
}

console.log(Object.keys(obj)); // [&quot;name&quot;, &quot;age&quot;]&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Front/JavaScript</category>
      <category>for in</category>
      <category>for of</category>
      <category>Object.keys</category>
      <author>함s</author>
      <guid isPermaLink="true">https://intheham.tistory.com/227</guid>
      <comments>https://intheham.tistory.com/227#entry227comment</comments>
      <pubDate>Sun, 30 Mar 2025 23:07:30 +0900</pubDate>
    </item>
    <item>
      <title>[JavaScript] array (1) - reduce</title>
      <link>https://intheham.tistory.com/226</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;0. reduce 란?&lt;/h2&gt;
&lt;pre id=&quot;code_1743173319043&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;array.reduce((accumulator, currentValue) =&amp;gt; {
  // 콜백 함수 내용
}, initialValue);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;reduce() 는 배열의 모든 요소를 하나로 축소하는 데 사용하는 메서드이다.&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;blockquote data-ke-style=&quot;style3&quot;&gt;accumulator (누적값): 배열의 요소들을 하나씩 처리하면서 누적되는 값. 처음에는 initialValue로 시작해.&lt;br /&gt;currentValue (현재값): 배열에서 순차적으로 처리되는 각 요소.&lt;br /&gt;initialValue(초기값): 누적값이 시작하는 초기값 (옵션, 생략 가능).&lt;br /&gt;결과값: 배열을 모두 처리한 후 최종적으로 하나의 값이 반환됨.&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;첫번째 요소부터 마지막 요소까지 차례대로 순회하며 accumulator 값을 갱신한다.&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;1. 초기값을 설정하지 않으면,  자동으로 초기값은 배열의 첫 번째 요소가 되고, 두 번째 요소부터 시작한다.&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;예시1) 배열의 합 구하기&lt;/h3&gt;
&lt;pre id=&quot;code_1743173044782&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const numbers = [1, 2, 3, 4];

const sum = numbers.reduce((acc, value) =&amp;gt; acc + value, 0);

console.log(sum); // 출력: 10&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;예시2) 배열에서 가장 큰 숫자 찾기&lt;/h3&gt;
&lt;pre id=&quot;code_1743173179299&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const numbers = [1, 5, 3, 9, 2];

const max = numbers.reduce((acc, value) =&amp;gt; 
  return currentValue &amp;gt; acc ? value : acc;
}, numbers[0]);

console.log(max); // 출력: 9&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;예시3) 배열에서 가장 긴 단어 찾기&lt;/h3&gt;
&lt;pre id=&quot;code_1743173203931&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const words = [&quot;apple&quot;, &quot;banana&quot;, &quot;kiwi&quot;];

const longestWord = words.reduce((a, b) =&amp;gt; (a.length &amp;gt; b.length ? a : b));

console.log(longestWord); // 출력: &quot;banana&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;예시4) 배열의 평균 구하기&lt;/h3&gt;
&lt;pre id=&quot;code_1743173413068&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const numbers = [1, 2, 3, 4, 5];

const average = numbers.reduce((acc, currentValue, index, array) =&amp;gt; {
  acc += currentValue;
  if (index === array.length - 1) {
    return acc / array.length;
  }
  return acc;
}, 0);

console.log(average); // 출력: 3&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;index : 현재 요소의 인덱스&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;array : 원본 배열&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Front/JavaScript</category>
      <category>reduce</category>
      <author>함s</author>
      <guid isPermaLink="true">https://intheham.tistory.com/226</guid>
      <comments>https://intheham.tistory.com/226#entry226comment</comments>
      <pubDate>Fri, 28 Mar 2025 23:55:31 +0900</pubDate>
    </item>
    <item>
      <title>[JavaScript] ES8 (1) - Object.values, Object.entries, padStart, padEnd</title>
      <link>https://intheham.tistory.com/225</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;ES8 문법을 소개하기 앞서,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ES7 문법도 간략하게 짚고 넘어가기.&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;ES7&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;.includes()&lt;/h3&gt;
&lt;pre id=&quot;code_1743171869308&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const dragons = ['Tim', 'Johnathan', 'Sandy', 'Sarah'];

dragons.includes('John') // false
dragons.filter(name =&amp;gt; name.includes('John')) // ['Johnathan']&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;거듭제곱 연산자 (Exponential Operator)&lt;/h3&gt;
&lt;pre id=&quot;code_1743171966876&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const square1 = (x) =&amp;gt; Math.pow(x, 2);	// ES6
const square2 = (x) =&amp;gt; x ** 2;	// ES7

square2(2);	// 4&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;ES8&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;.padStart() &amp;amp; .padEnd()&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;String 의 앞/뒤에 ()자릿수만큼 공백 넣기&lt;/p&gt;
&lt;pre id=&quot;code_1743172183808&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const startLine = '     ||&amp;lt;- Start line';
let turtle = ' ';
let rabbit = ' ';

turtle = turtle.padStart(8);
rabbit = rabbit.padStart(8);

'     ||&amp;lt;- Start line'
'        '
'        '

turtle = turtle.trim().padEnd(9, '=');

'     ||&amp;lt;- Start line'
' ======='
'        '&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Object.values()&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Object.entries()&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기존에는 Object.key() 만 있었음.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ES8 에 객체의 값만 꺼내오거나 키-값 을 쌍으로 꺼낼 수 있는 메서드가 생김.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1743172715011&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const scores = { math: 90, english: 85, science: 95 };

// 270
const totalScore = Object.values(scores).reduce((acc, val) =&amp;gt; acc + val, 0);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1743172606169&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;let obj = {
  my: 'name',
  is: 'Rudolf',
  the: 'raindeer'
}

// 'my name is Rudolf the raindeer'
const result = Object.entries(obj).map(value =&amp;gt; value.join(&quot; &quot;)).join(' ')&lt;/code&gt;&lt;/pre&gt;</description>
      <category>Front/JavaScript</category>
      <category>es8</category>
      <category>javascript 객체 값만</category>
      <category>javascript 객체 키값</category>
      <category>Object.entries</category>
      <author>함s</author>
      <guid isPermaLink="true">https://intheham.tistory.com/225</guid>
      <comments>https://intheham.tistory.com/225#entry225comment</comments>
      <pubDate>Fri, 28 Mar 2025 23:40:16 +0900</pubDate>
    </item>
    <item>
      <title>[JavaScript] Pass By Value vs Pass By Reference (얕은복사, 깊은복사)</title>
      <link>https://intheham.tistory.com/224</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;자바스크립트에서 변수를 함수에 전달할 때 두가지 방식이 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. Pass By Value (값에 의한 전달)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. Pass By Reference (참조에 의한 전달)&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;1. Pass By Value&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;: 원시 타입 (Primitive Types) 을 함수에 전달할 때 값이 복사됨.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;: 적용 타입 - Number, String, Boolean, Null, Undefined, Symbol, BigInt&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;: 원시 타입은 값 자체를 복사해서 전달하기 떄문에 원본 데이터에 영향을 주지 않음!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1742655655383&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;var a = 5;
var b = a;

b++;

console.log(a);	// 5
console.log(b);	// 6&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2. Pass By Reference&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;: 객체 타입 (Object) 을 함수에 전달할 때, 참조 (Reference) 가 전달됨&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;: 적용 타입 - Object, Array, Function&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;gt; 원본 객체의 의도치 않은 변경을 막으려면 &lt;b&gt;객체를 복사(Cloning)&lt;/b&gt;해서 사용하면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1742655978045&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;let obj1 = {name: 'Yao', password: '123'}
let obj2 = obj1;

obj2.password = 'easypeasy'

console.log(obj1);	// {name: 'Yao', password: 'easypeasy'}
console.log(obj2);	// {name: 'Yao', password: 'easypeasy'}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3. Cloning&lt;/h2&gt;
&lt;pre id=&quot;code_1742656265529&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;var c = [1, 2, 3];
var d = [].concat(c);

d.push(4);

console.log(c);		// [1, 2, 3]
console.log(d);		// [1, 2, 3, 4]&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3-1. Shallow Cloning&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;pre id=&quot;code_1742656436137&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;let obj = {a: 'a', b: 'b'};
let clone = Object.assign({}, obj);
let clone2 = {...obj};

obj.b = 5;

console.log(obj);		// {a: 'a', b: 5}
console.log(clone);		// {a: 'a', b: 'b'}
console.log(clone2);	// {a: 'a', b: 'b'}&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1742656873118&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;let obj = {
	a: 'a', 
    b: {
    	deep: 'try and copy me'
    } 
};
let clone = Object.assign({}, obj);
let clone2 = {...obj};

obj.b.deep = 'hahaha';

console.log(obj);		// {a: 'a', b: {deep: 'hahaha'}}
console.log(clone);		// {a: 'a', b: {deep: 'hahaha'}}
console.log(clone2);	// {a: 'a', b: {deep: 'hahaha'}}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;내부 객체는 여전히 참조값으로 복사되기 떄문에, 값을 변경할 경우 모든 클론 객체의 내부객체가 다 변경됨.&lt;/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;3-2. Deep Cloning&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;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;1) JSON.parse(JSON.stringify(obj))&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 간단하고 빠르지만&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- undefined, function, Symbol, BigInt 같은 데이터는 복사되지 않음.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 순환참조(자기 자신을 참조하는 객체)가 있으면 무한 루프 발생 가능&lt;/p&gt;
&lt;pre id=&quot;code_1742657149765&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;let obj = {
	a: 'a', 
    b: {
    	deep: 'try and copy me'
    } 
};
let clone = {...obj};
let superClone = JSON.parse(JSON.stringify(obj));

obj.b.deep = 'hahaha';

console.log(obj);			// {a: 'a', b: {deep: 'hahaha'}}
console.log(clone);			// {a: 'a', b: {deep: 'hahaha'}}
console.log(superClone);	// {a: 'a', b: {deep: 'try and copy me'}}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;2) structuredClone(obj)&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- function, undefined 도 복사 가능하지만, 최신문법이라 오래된 브라우저에서는 지원 안 됨.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 순환 참조 문제 해결 가능&lt;/p&gt;
&lt;pre id=&quot;code_1742657524513&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;let obj2 = structuredClone(obj1);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;3) lodash 라이브러리&lt;/h4&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;pre id=&quot;code_1742657629168&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;let obj2 = _.cloneDeep(obj1);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&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;figure id=&quot;og_1742657592517&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;[개발상식] lodash 알고 쓰자.&quot; data-og-description=&quot;안녕하세요. 김용성입니다. 오늘은 lodash에 대해 포스팅해보도록 하겠습니다.&quot; data-og-host=&quot;velog.io&quot; data-og-source-url=&quot;https://velog.io/@kysung95/%EC%A7%A4%EB%A7%89%EA%B8%80-lodash-%EC%95%8C%EA%B3%A0-%EC%93%B0%EC%9E%90&quot; data-og-url=&quot;https://velog.io/@kysung95/짤막글-lodash-알고-쓰자&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/boRxeI/hyYrPT3Vp6/2D2P5bB4E1aY0xelQZRgKK/img.png?width=1280&amp;amp;height=720&amp;amp;face=0_0_1280_720,https://scrap.kakaocdn.net/dn/wIXbV/hyYuoahHOV/jQbjkAUVMtdnU2fcIhDbYk/img.png?width=1280&amp;amp;height=720&amp;amp;face=0_0_1280_720,https://scrap.kakaocdn.net/dn/HncM7/hyYvfwS53Z/wXDQUdvKwCpCX5vIyYEDbk/img.png?width=1280&amp;amp;height=720&amp;amp;face=0_0_1280_720&quot;&gt;&lt;a href=&quot;https://velog.io/@kysung95/%EC%A7%A4%EB%A7%89%EA%B8%80-lodash-%EC%95%8C%EA%B3%A0-%EC%93%B0%EC%9E%90&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://velog.io/@kysung95/%EC%A7%A4%EB%A7%89%EA%B8%80-lodash-%EC%95%8C%EA%B3%A0-%EC%93%B0%EC%9E%90&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/boRxeI/hyYrPT3Vp6/2D2P5bB4E1aY0xelQZRgKK/img.png?width=1280&amp;amp;height=720&amp;amp;face=0_0_1280_720,https://scrap.kakaocdn.net/dn/wIXbV/hyYuoahHOV/jQbjkAUVMtdnU2fcIhDbYk/img.png?width=1280&amp;amp;height=720&amp;amp;face=0_0_1280_720,https://scrap.kakaocdn.net/dn/HncM7/hyYvfwS53Z/wXDQUdvKwCpCX5vIyYEDbk/img.png?width=1280&amp;amp;height=720&amp;amp;face=0_0_1280_720');&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;[개발상식] lodash 알고 쓰자.&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;안녕하세요. 김용성입니다. 오늘은 lodash에 대해 포스팅해보도록 하겠습니다.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;velog.io&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;</description>
      <category>Front/JavaScript</category>
      <author>함s</author>
      <guid isPermaLink="true">https://intheham.tistory.com/224</guid>
      <comments>https://intheham.tistory.com/224#entry224comment</comments>
      <pubDate>Sun, 23 Mar 2025 00:37:39 +0900</pubDate>
    </item>
    <item>
      <title>[JavaScript] 인스턴스화 (Instantation)</title>
      <link>https://intheham.tistory.com/223</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;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1742654576264&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class Player {
	constructor(name, type) {
    	console.log(this);	// Wizard{}
    	this.name = name;
        this.type = type;
    }
    introduce() {
    	console.log(`Hi I am ${this.name}, I'm a ${this.type}`);
    }
}

class Wizard extends Player {
	constructor(name, type) {
    	super(name, type);		// Player 의 constructor 실행
        console.log('wizard', this);	// Wizard {name:&quot;Shelly&quot;, type:&quot;Healer&quot;}
    }
    play() {
    	console.log(`WEEEE I'm a ${this.type}`);
    }
}

const wizard1 = new Wizard('Shelly', 'Healer');
const wizard2 = new Wizard('Shawn', 'Dark Magic');

wizard1.play();			// WEEEE I'm a Healer
wizard1.introduce();	// Hi I am Shelly, I'm a Healer (부모객체의 메서드 접근)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&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;</description>
      <category>Front/JavaScript</category>
      <category>instantation</category>
      <author>함s</author>
      <guid isPermaLink="true">https://intheham.tistory.com/223</guid>
      <comments>https://intheham.tistory.com/223#entry223comment</comments>
      <pubDate>Sat, 22 Mar 2025 23:53:08 +0900</pubDate>
    </item>
    <item>
      <title>[JavaScript] 클로저, 커링, 함수 조합</title>
      <link>https://intheham.tistory.com/222</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. 함수형 프로그래밍&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;함수형 프로그래밍(Function Programming)은 &lt;b&gt;작은 문제를 해결할 수 있는 순수 함수(Pure Function)들을 조합&lt;/b&gt;하여 &lt;b&gt;재사용성&lt;/b&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;1. Deterministic&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;: 동일한 입력이 주어지면 항상 동일한 결과를 반환한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. No Side Effects&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;: 프로그램의 실행 과정에서 &lt;b&gt;전역 변수, 데이터베이스, 파일 시스템, UI, 네트워크 요청&lt;/b&gt; 등의 외부 상태를 변경하거나 의존하지 않아야 한다.&lt;/p&gt;
&lt;pre id=&quot;code_1742131206080&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;/* Side Effects가 있는 함수 (Impure Function) */
let total = 0;
function addToTotal(value) {
    total += value; // 외부 변수 total을 변경함 (Side Effect 발생)
    return total;
}

/* Side Effects가 없는 함수 (Pure Function) */
function add(a, b) {
    return a + b;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1742045691734&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const multiply = (a, b) =&amp;gt; a * b;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그렇다면, 이 순수 함수를 더 유연하게 재사용이 가능하도록 만들려면 어떻게 해야 할까?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2. Closure &amp;amp; Currying&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자바스크립트는 함수도 value 로 여긴다. 즉, 함수의 리턴값을 함수로 하거나 함수의 인자값으로 함수를 받을 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;고차 함수(Higher-order Function)&lt;/b&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 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;pre id=&quot;code_1742132951549&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;//Closure
const addTo = x =&amp;gt; y =&amp;gt; x + y
var addToTen = addTo(10)
addToTen(3) 		// 13 -- 10을 기억했다가 추가인자 3과 덧셈 진행

//Currying
const sum = (a, b) =&amp;gt; a + b
const curriedSum = (a) =&amp;gt; (b) =&amp;gt; a + b	// 다중인자를 단일인자로 변환

curriedSum(30)(1) 	// 31

const add5 = curriedSum(5)
add5(12) 			// 17&lt;/code&gt;&lt;/pre&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 86px;&quot; border=&quot;1&quot; data-end=&quot;1320&quot; data-start=&quot;943&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 10.5814%;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;td style=&quot;width: 42.093%;&quot;&gt;&lt;b&gt;Closure (클로저)&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 44.6512%;&quot;&gt;&lt;b&gt;Currying (커링)&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot; data-end=&quot;1103&quot; data-start=&quot;1037&quot;&gt;
&lt;td style=&quot;height: 19px; width: 10.5814%;&quot;&gt;&lt;b&gt;목적&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;height: 19px; width: 42.093%;&quot;&gt;내부 함수가 외부 함수의 변수를 기억하고 사용&lt;/td&gt;
&lt;td style=&quot;height: 19px; width: 44.6512%;&quot;&gt;여러 개의 인수를 하나씩 받는 함수로 변환&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot; data-end=&quot;1172&quot; data-start=&quot;1104&quot;&gt;
&lt;td style=&quot;height: 19px; width: 10.5814%;&quot;&gt;&lt;b&gt;핵심 개념&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;height: 19px; width: 42.093%;&quot;&gt;함수가 선언될 때 외부 변수 값을 기억함&lt;/td&gt;
&lt;td style=&quot;height: 19px; width: 44.6512%;&quot;&gt;함수를 계속 리턴하여 한 번에 하나의 인수만 받음&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot; data-end=&quot;1265&quot; data-start=&quot;1173&quot;&gt;
&lt;td style=&quot;height: 19px; width: 10.5814%;&quot;&gt;&lt;b&gt;예제 코드&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;height: 19px; width: 42.093%;&quot;&gt;const addTo = x =&amp;gt; y =&amp;gt; x + y;&lt;/td&gt;
&lt;td style=&quot;height: 19px; width: 44.6512%;&quot;&gt;const curriedSum = (a) =&amp;gt; (b) =&amp;gt; a + b;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot; data-end=&quot;1320&quot; data-start=&quot;1266&quot;&gt;
&lt;td style=&quot;height: 19px; width: 10.5814%;&quot;&gt;&lt;b&gt;사용 사례&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;height: 19px; width: 42.093%;&quot;&gt;비공개 변수 유지, 데이터 캡슐화&lt;/td&gt;
&lt;td style=&quot;height: 19px; width: 44.6512%;&quot;&gt;재사용성 증가, 부분 적용 가능&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-end=&quot;1336&quot; data-start=&quot;1322&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;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;클로저&lt;/b&gt;: 외부 함수의 변수에 접근할 수 있는 &lt;b&gt;내부 함수&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;커링&lt;/b&gt;: 다중 인수를 받는 함수를 &lt;b&gt;하나의 인수만 받는 여러 개의 함수&lt;/b&gt;로 변환하는 기법.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;커링은 함수를 여러 단계로 나누어, &lt;b&gt;각 단계에서 새로운 함수를 반환하는 방식&lt;/b&gt;인데, 이 과정에서 &lt;b&gt;클로저가 활용된다.&lt;/b&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 data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3. 함수 조합(Function Composition)&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;고차 함수(Higher-order Function)는 함수를 인자로 받거나 반환하는 함수라고 했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;함수가 value 면, 함수의 인자로 함수를 넣을 수도 있지 않을까?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;함수 조합(Composing)은 이런 특징을 활용해&amp;nbsp;&lt;b&gt;여러 개의 작은 함수를 결합하여 더 복잡한 함수를 만드는 기법&lt;/b&gt;이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉, 여러 개의 함수를 순차적으로 실행하여 하나의 새로운 함수를 만드는 것이다.&lt;/p&gt;
&lt;pre id=&quot;code_1742046155351&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;//Composing
const compose = (f, g) =&amp;gt; (a) =&amp;gt; f(g(a));
const add1 = (num) =&amp;gt; num + 1;
const add5 = (num) =&amp;gt; num + 5;
compose(add1, add5)(10) // 16&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&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;막상 접하고 나니 이런식으로 생각해본 적이 없어서 새로운 세상을 엿본 것 같다.&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;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;figure id=&quot;og_1742133549151&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;7.3. 함수형 프로그래밍 활용&quot; data-og-description=&quot;함수형 프로그래밍은 단순히 순수 함수, 불변성, 그리고 일급/고차 함수의 개념에 그치지 않고, 실제 문제 해결 및 시스템 설계에 응용될 수 있는 다양한 기법들을 제공합니다. 이 &amp;hellip;&quot; data-og-host=&quot;wikidocs.net&quot; data-og-source-url=&quot;https://wikidocs.net/274950&quot; data-og-url=&quot;https://wikidocs.net/274950&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bzmVcU/hyYrXp9BTU/K4noklTHPgMkelVkHTjrt1/img.gif?width=99&amp;amp;height=130&amp;amp;face=0_0_99_130&quot;&gt;&lt;a href=&quot;https://wikidocs.net/274950&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://wikidocs.net/274950&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bzmVcU/hyYrXp9BTU/K4noklTHPgMkelVkHTjrt1/img.gif?width=99&amp;amp;height=130&amp;amp;face=0_0_99_130');&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;7.3. 함수형 프로그래밍 활용&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;함수형 프로그래밍은 단순히 순수 함수, 불변성, 그리고 일급/고차 함수의 개념에 그치지 않고, 실제 문제 해결 및 시스템 설계에 응용될 수 있는 다양한 기법들을 제공합니다. 이 &amp;hellip;&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;wikidocs.net&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;figure id=&quot;og_1742131902394&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;클로저와 함께 알아보는 curring 함수&quot; data-og-description=&quot;JavaScript의 클로저를 통해 currying 함수를 알아보자.&quot; data-og-host=&quot;pozafly.github.io&quot; data-og-source-url=&quot;https://pozafly.github.io/javascript/closure-with-currying/&quot; data-og-url=&quot;https://pozafly.github.io/javascript/closure-with-currying/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/dVIUKe/hyYqQ59Rc6/y1ac0Z5uvNE1ZINGwc62X0/img.jpg?width=1170&amp;amp;height=658&amp;amp;face=0_0_1170_658&quot;&gt;&lt;a href=&quot;https://pozafly.github.io/javascript/closure-with-currying/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://pozafly.github.io/javascript/closure-with-currying/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/dVIUKe/hyYqQ59Rc6/y1ac0Z5uvNE1ZINGwc62X0/img.jpg?width=1170&amp;amp;height=658&amp;amp;face=0_0_1170_658');&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;클로저와 함께 알아보는 curring 함수&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;JavaScript의 클로저를 통해 currying 함수를 알아보자.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;pozafly.github.io&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;</description>
      <category>Front/JavaScript</category>
      <category>closure</category>
      <category>composing</category>
      <category>Currying</category>
      <category>커링</category>
      <category>클로저</category>
      <category>함수조합</category>
      <author>함s</author>
      <guid isPermaLink="true">https://intheham.tistory.com/222</guid>
      <comments>https://intheham.tistory.com/222#entry222comment</comments>
      <pubDate>Sun, 16 Mar 2025 23:00:17 +0900</pubDate>
    </item>
    <item>
      <title>[JavaScript] ES6 문법 정리</title>
      <link>https://intheham.tistory.com/221</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. let, const&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;var 과 let 은 뭐가 다른가?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자바스크립트를 쓰면서 항상 궁금했는데, 이번에 그 궁금증이 풀렸다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1741785314600&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const num = 100;
var flag = false;

if (num &amp;gt; 90) {
	var flag = true;	// 재할당
}

console.log(flag)	// true&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1741785335587&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const num = 100;
let flag = false;

if (num &amp;gt; 90) {
	let flag = true;	// 존재범위 {}
}

console.log(flag)	// true&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. let, const 는 변수를 재선언 할 수 없다. -&amp;gt; 변수명의 중복을 막을 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- var 은 같은 이름으로 재선언을 자유롭게 할 수 있다. 그러면 나중에 뭐가 뭔지 헷갈리겟져?&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. var 변수의 존재 범위는 function 단위이고, let, const 의 범위는 {} 단위이다.&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;3. const 는 값을 재할당 할 수 없다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 하지만, const 로 선언한 obj 의 내부 값은 변경할 수 있다.&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;즉, let 은 var 보다 최근에 나왔으며, 존재범위가 좁고 중복선언이 제한되어 있기 때문에&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;let 으로 변수를 선언해 사용하는 것이 변수사용의 명확도를 높일 수 있다. let 추천~&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1741785891654&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const a = 1;	
a = 100;		// 재할당 불가능

const human = { name : &quot;mimi&quot; }
human.name = &quot;mickey&quot;;		// 재할당 가능

Object.freeze(human)
human.name = &quot;park&quot;;		// 재할당 불가능&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&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. Destructing&lt;/h2&gt;
&lt;pre id=&quot;code_1741786312977&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const person = {
    firstName : &quot;John&quot;,
    lastName  : &quot;Doe&quot;,
    age       : 50,
    eyeColor  : &quot;blue&quot;
};

const { firstName, lastName, age, eyeColor } = person

console.log(firstName);		// &quot;John&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;var firstName = person.firstName;&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;반대로, obj 에 담으려는 값의 변수명이 키값과 같으면 생략해서 적을 수 있다.&lt;/p&gt;
&lt;pre id=&quot;code_1741786438281&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;let a = 'test';
let b = true;
const c = 789;

// var okObj = {
//   a: a,
//   b: b,
//   c: c
// };

const okObj = { a, b, c }&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3. =&amp;gt; arrow&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;function 대신 변수선언 형태로 간단하게 함수를 선언할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만약 파라메터값에 빈값이 들어올 경우 디폴트 값을 선언할 수 있다.&lt;/p&gt;
&lt;pre id=&quot;code_1741786790794&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const whereAmI = (username, location) =&amp;gt; {
    if (username &amp;amp;&amp;amp; location) {
        return &quot;I am not lost&quot;;
    }
    return -1
}

whereAmI(&quot;Jennie&quot;, &quot;Seoul&quot;);	// &quot;I am not lost&quot;


const isValidAge = (age = 10) =&amp;gt; age;
isValidAge();	// 10
isValidAge(20); // 20&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;4. `` backtick&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이건 익숙한거.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;hi&quot; + name + &quot;!&quot;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;`hi ${name} !`&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게, 귀찮은 +를 쓰지 않을 수 있다.&lt;/p&gt;
&lt;pre id=&quot;code_1741786946241&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const sendMessate = (firstName = '', city = 'Seoul') =&amp;gt; {
    return `Hello ${firstName}! Have I met you before? I think we met in ${city} last summer no???`;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;5. Symbol&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Number, String, Boolean, Undefined, Null, Object 다음으로&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ES6 에서 처음 도입된 타입이다.&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;언제 쓰일지는 모르겠지만, 이런게 있다는 사실을 알고 넘어가자!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1741787347705&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const symbol = Symbol('kakaotalk')

const Direction = {
    EAST: Symbol('east'),
    WEST: Symbol('west'),
    SOUTH: Symbol('south'),
    NORTH: Symbol('north')
};&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure id=&quot;og_1741787074617&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;자바스크립트 symbol은 언제 사용하면 좋을까?&quot; data-og-description=&quot;의문이 든 이유 자바스크립트 symbol은 ECMAScript6(2015)에 도입된 7번째 타입이라고 들어는 봤지만, 그다지 깊게 파본적이 없었던 것 같아서 깊게 공부하는 중이다. 생각해 보니 (몰라서 그랬을 수도 &quot; data-og-host=&quot;dev-ellachoi.tistory.com&quot; data-og-source-url=&quot;https://dev-ellachoi.tistory.com/105&quot; data-og-url=&quot;https://dev-ellachoi.tistory.com/105&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/c3vvnF/hyYqTVhj6b/w9JEJkGYHnGI3VV4cb6J9K/img.jpg?width=800&amp;amp;height=800&amp;amp;face=258_328_310_385,https://scrap.kakaocdn.net/dn/FAbEY/hyYqWEtZvP/T9pDAuTDGrXaZ8OWKa7KLk/img.jpg?width=800&amp;amp;height=800&amp;amp;face=258_328_310_385&quot;&gt;&lt;a href=&quot;https://dev-ellachoi.tistory.com/105&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://dev-ellachoi.tistory.com/105&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/c3vvnF/hyYqTVhj6b/w9JEJkGYHnGI3VV4cb6J9K/img.jpg?width=800&amp;amp;height=800&amp;amp;face=258_328_310_385,https://scrap.kakaocdn.net/dn/FAbEY/hyYqWEtZvP/T9pDAuTDGrXaZ8OWKa7KLk/img.jpg?width=800&amp;amp;height=800&amp;amp;face=258_328_310_385');&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;자바스크립트 symbol은 언제 사용하면 좋을까?&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;의문이 든 이유 자바스크립트 symbol은 ECMAScript6(2015)에 도입된 7번째 타입이라고 들어는 봤지만, 그다지 깊게 파본적이 없었던 것 같아서 깊게 공부하는 중이다. 생각해 보니 (몰라서 그랬을 수도&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;dev-ellachoi.tistory.com&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;figure id=&quot;og_1741787216011&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;변수 신문법 총정리 1. var let const와 선언,할당,범위 - 코딩애플 온라인 강좌&quot; data-og-description=&quot;0:00 var let const로 변수만들어 쓰는 법 1:30 선언이라는 특징&amp;nbsp; 2:48&amp;nbsp;할당이라는 특징 4:25 재할당 불가능한 불변의 Object를 만들려면&amp;nbsp; 6:52&amp;nbsp;존재범위라는 특징&amp;nbsp; 10:10 변수나 함수 선언의 Hoisting 현상 &quot; data-og-host=&quot;codingapple.com&quot; data-og-source-url=&quot;https://codingapple.com/unit/es6-4-var-let-const-hoisting/?gad_source=1&amp;amp;gclid=Cj0KCQjw4cS-BhDGARIsABg4_J3VbaUT8gmFN08fAnRo-lhnXHxRwPEA6bE4tpfwgzepvk3rNC1hpsIaAsUVEALw_wcB&quot; data-og-url=&quot;https://codingapple.com/unit/es6-4-var-let-const-hoisting/?gad_source=1&amp;amp;gclid=Cj0KCQjw4cS-BhDGARIsABg4_J3VbaUT8gmFN08fAnRo-lhnXHxRwPEA6bE4tpfwgzepvk3rNC1hpsIaAsUVEALw_wcB&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://codingapple.com/unit/es6-4-var-let-const-hoisting/?gad_source=1&amp;amp;gclid=Cj0KCQjw4cS-BhDGARIsABg4_J3VbaUT8gmFN08fAnRo-lhnXHxRwPEA6bE4tpfwgzepvk3rNC1hpsIaAsUVEALw_wcB&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://codingapple.com/unit/es6-4-var-let-const-hoisting/?gad_source=1&amp;amp;gclid=Cj0KCQjw4cS-BhDGARIsABg4_J3VbaUT8gmFN08fAnRo-lhnXHxRwPEA6bE4tpfwgzepvk3rNC1hpsIaAsUVEALw_wcB&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;변수 신문법 총정리 1. var let const와 선언,할당,범위 - 코딩애플 온라인 강좌&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;0:00 var let const로 변수만들어 쓰는 법 1:30 선언이라는 특징&amp;nbsp; 2:48&amp;nbsp;할당이라는 특징 4:25 재할당 불가능한 불변의 Object를 만들려면&amp;nbsp; 6:52&amp;nbsp;존재범위라는 특징&amp;nbsp; 10:10 변수나 함수 선언의 Hoisting 현상&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;codingapple.com&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;</description>
      <category>Front/JavaScript</category>
      <category>=&amp;gt;</category>
      <category>Arrow</category>
      <category>backtick</category>
      <category>ES6</category>
      <category>let var</category>
      <category>symbol</category>
      <category>백틱</category>
      <author>함s</author>
      <guid isPermaLink="true">https://intheham.tistory.com/221</guid>
      <comments>https://intheham.tistory.com/221#entry221comment</comments>
      <pubDate>Wed, 12 Mar 2025 22:51:37 +0900</pubDate>
    </item>
    <item>
      <title>[Python] 입력값 빠르고 간단하게 받기 -- sys.stdin.readline() 과 lambda</title>
      <link>https://intheham.tistory.com/220</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;[1] input() V.S. sys.stdin.readline()&lt;/h2&gt;
&lt;pre id=&quot;code_1736521033942&quot; style=&quot;background-color: #f8f8f8; color: #383a42; text-align: start;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;python&quot;&gt;&lt;code&gt;S, E = map(int, input().split())

import sys
S, E = map(int, sys.stdin.readline.strip().split())&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;(1) input()&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 입력을 한 줄씩 받아 문자열로 처리.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 기본적으로 개행문자(\n) 제거함&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;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) sys.stdin.readline()&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 한 줄 입력을 받아 문자열로 처리.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 개행문자(\n) 포함. -&amp;gt; .strip() 로 제거해야 함!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 대량 입력 받을 때 빠름. for 나 while 문에서 반복 입력 받을 때 유리.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 그렇지만 코드가 구구절절함 -&amp;gt; alias나 lambda 로 미리 선언해서 간결하게 쓰기!&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] sys.stdin.readline()에 strip() 을 써야 하는 이유&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 입력값 시작이나 끝에 포함된 개행 문자(\n)는 문자열 조작시 문제를 일으킬 수 있어서 지우는 게 좋음!&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;gt; 즉, 이상한 인풋을 정상적으로 만들 수 있으니 strip() 를 꼭 쓰지 않아도 되는 상황에서도 쓰도록 습관을 들이자~~&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;h2 data-ke-size=&quot;size26&quot;&gt;[3] sys.stdin.readline() 함수를 간결하게 호출하는 법&lt;/h2&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) 기존 함수에 별명(alias)를 붙여서 참조하기&lt;/h3&gt;
&lt;pre id=&quot;code_1736519545345&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import sys
input = sys.stdin.readline  # Alias 사용

N = int(input().strip())  # 개행 문자 제거
S, E = map(int, input().strip().split())&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;파이썬에서 함수도 일종의 객체이기 때문에 이름을 붙여줄 수 있다.&lt;/p&gt;
&lt;p 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;단, 이 경우에는 strip() 을 매번 적어주어야 한다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;input = sys.stdin.readline.strip 은 왜 안되는 걸까???&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 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;1. sys.stdin.readline 자체가 함수 객체이고&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;2. strip 은 sys에 속하지 않은 문자열 메서드이기 때문에&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;=&amp;gt; 하나의 객체가 될 수 없어 alias 로 퉁칠 수 없다!&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 style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;그래서 input.strip() 으로 쓰면 안되고 input().strip() 으로 써야 한다.&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;input()으로 호출해 반환값을 받고 그 다음 strip() 을 해주어야 하기 때문이다!&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 style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;그러면 strip 까지 써서 최대한 간단하게 하려면 어떻게 해야 하냐?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;darr;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;darr;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;(2) lambda 로 새로운 함수로 정의&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;lambda 는 익명 함수를 정의하는 방법이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;익명함수란, 이름이 없는 작은 함수를 선언할 때 사용한다.&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1736520122785&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;lambda [parameters]: [expression]&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1736520155386&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;def my_function():
    return sys.stdin.readline().strip()
input = my_function


input = lambda: sys.stdin.readline().strip()

N = int(input())
S, E = map(int, input().split())&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;def 로 정의할 수 있지만 한 줄 함수는 lambda 가 훨씬 간결하다!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 새로운 함수를 정의하기 때문에 .strip 같은 문자열 메서드도 함께 추가할 수 있어서&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;</description>
      <category>TIL</category>
      <category>python input</category>
      <category>python readline</category>
      <category>python strip</category>
      <category>strip split</category>
      <category>sys.stdin.readline</category>
      <author>함s</author>
      <guid isPermaLink="true">https://intheham.tistory.com/220</guid>
      <comments>https://intheham.tistory.com/220#entry220comment</comments>
      <pubDate>Fri, 10 Jan 2025 23:58:39 +0900</pubDate>
    </item>
    <item>
      <title>[Backjoon] 2664 - 촌수계산 (BFS)</title>
      <link>https://intheham.tistory.com/219</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;0. 문제&lt;/h2&gt;
&lt;pre id=&quot;code_1736518144300&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;'''
부모와 자식 사이를 1촌으로 정의하고 이로부터 사람들 간의 촌수를 계산한다.
예를 들면 나와 아버지, 아버지와 할아버지는 각각 1촌으로
나와 할아버지는 2촌이 되고,
아버지 형제들과 할아버지는 1촌,
나와 아버지 형제들과는 3촌이 된다.
여러 사람들에 대한 부모 자식들 간의 관계가 주어졌을 때, 주어진 두 사람의 촌수를 계산하는 프로그램을 작성하시오.

사람들은 1, 2, 3, &amp;hellip;, n (1 &amp;le; n &amp;le; 100)의 연속된 번호로 각각 표시된다.
입력 파일의 첫째 줄에는 전체 사람의 수 n이 주어지고,
둘째 줄에는 촌수를 계산해야 하는 서로 다른 두 사람의 번호가 주어진다.
그리고 셋째 줄에는 부모 자식들 간의 관계의 개수 m이 주어진다.
넷째 줄부터는 부모 자식간의 관계를 나타내는 두 번호 x,y가 각 줄에 나온다.
이때 앞에 나오는 번호 x는 뒤에 나오는 정수 y의 부모 번호를 나타낸다.
각 사람의 부모는 최대 한 명만 주어진다.

입력에서 요구한 두 사람의 촌수를 나타내는 정수를 출력한다.
어떤 경우에는 두 사람의 친척 관계가 전혀 없어 촌수를 계산할 수 없을 때가 있다. 이때에는 -1을 출력해야 한다.
'''
'''
9
7 3
7
1 2
1 3
2 7
2 8
2 9
4 5
4 6

# 3

9
8 6
7
1 2
1 3
2 7
2 8
2 9
4 5
4 6

# -1
'''&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. 제출한 답&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1736518164149&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import sys
from collections import deque
input = lambda: sys.stdin.readline().strip()

#sys.stdin = open(&quot;input.txt&quot;, &quot;r&quot;)

N = int(input())                    # 전체 사람 수
S, E = map(int, input().split())    # 촌수 계산 필요한 가족 구성원 2 (시작점-끝점)
M = int(input())                    # 총 관계 수

adj = [[] for _ in range(N + 1)]    # 부모 자식 쌍
for _ in range(M):
    x, y = map(int, input().split())
    # 부모자식 순이어도 어쨌거나 연결되어 있으니까 양방향 연결을 해야함!
    adj[x].append(y)
    adj[y].append(x)

# 한 번에 한 칸 씩 건너가서 최단거리 계산
def BFS(s, e):
    # 초기화 및 방문처리
    queue = deque([s])
    v = [0] * (N + 1)
    v[s] = 1

    while queue:
        c = queue.popleft()

        # 목적지에 도착하면 방문처리 뺀 촌수만 리턴
        if c == e:
            return v[e] - 1

        # c와 연결된 모든 노드 탐방
        for n in adj[c]:
            # 방문하지 않았다면 방문하기 (not v[e])
            if v[n] == 0:
                queue.append(n)
                # 방문처리 겸 촌수 계산
                v[n] = v[c] + 1

    return -1   # 연결된 가족이 없을 경우 -1 리턴

print(BFS(S, E))&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2025-01-10 at 11.08.28 PM.png&quot; data-origin-width=&quot;1658&quot; data-origin-height=&quot;160&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cxiIvt/btsLJjAqOUa/gCpYFgpZqV9osnifpH6KKK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cxiIvt/btsLJjAqOUa/gCpYFgpZqV9osnifpH6KKK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cxiIvt/btsLJjAqOUa/gCpYFgpZqV9osnifpH6KKK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcxiIvt%2FbtsLJjAqOUa%2FgCpYFgpZqV9osnifpH6KKK%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;1658&quot; height=&quot;160&quot; data-filename=&quot;Screenshot 2025-01-10 at 11.08.28 PM.png&quot; data-origin-width=&quot;1658&quot; data-origin-height=&quot;160&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;로직 잘 짜고 계속 안 돼서 코드 수정하다가 결국 틀리고 답 봤는데&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;GPT 까지 감탄한 지니어스적 면모;;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;담에 비슷한 문제 나오면 꼭 써본다;;&lt;/p&gt;</description>
      <category>Algorithm/DFS BFS</category>
      <category>python bfs</category>
      <category>백준 bfs</category>
      <category>백준2644</category>
      <author>함s</author>
      <guid isPermaLink="true">https://intheham.tistory.com/219</guid>
      <comments>https://intheham.tistory.com/219#entry219comment</comments>
      <pubDate>Fri, 10 Jan 2025 23:12:09 +0900</pubDate>
    </item>
    <item>
      <title>[Backjoon] 2667 - 단지번호붙이기 (BFS)</title>
      <link>https://intheham.tistory.com/218</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;0. 문제&lt;/h2&gt;
&lt;pre id=&quot;code_1736422408726&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;'''
정사각형 모양의 지도가 있다.
1은 집이 있는 곳을, 0은 집이 없는 곳을 나타낸다.
철수는 이 지도를 가지고 연결된 집의 모임인 단지를 정의하고, 단지에 번호를 붙이려 한다.
여기서 연결되었다는 것은 어떤 집이 좌우, 혹은 아래위로 다른 집이 있는 경우를 말한다.
대각선상에 집이 있는 경우는 연결된 것이 아니다.
지도를 입력하여 단지수를 출력하고, 각 단지에 속하는 집의 수를 오름차순으로 정렬하여 출력하는 프로그램을 작성하시오.

첫 번째 줄에는 지도의 크기 N(정사각형이므로 가로와 세로의 크기는 같으며 5&amp;le;N&amp;le;25)이 입력되고,
그 다음 N줄에는 각각 N개의 자료(0혹은 1)가 입력된다.

첫 번째 줄에는 총 단지수를 출력하시오.
그리고 각 단지내 집의 수를 오름차순으로 정렬하여 한 줄에 하나씩 출력하시오.
'''
'''
7
0110100
0110101
1110101
0000111
0100000
0111110
0111000

#
3
7
8
9
'''&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. 제출한 답&lt;/h2&gt;
&lt;pre id=&quot;code_1736422215750&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import sys
from collections import deque

# sys.stdin = open(&quot;input.txt&quot;, &quot;r&quot;)

# DFS 로 풀어도 됨! 다만, 맵이 커질 수록 반복 횟수가 커져서
# BFS 는 코드는 다소 길지만 효율적이어서 추천
def BFS(x, y):
    queue = deque([(x, y)]) # 큐 선언 및 초기데이터 삽입
    v[x][y] = 1             # 방문처리
    cnt = 1                 # 정답처리 관련 작업 -&amp;gt; 집 카운트

    d = [(-1, 0), (0, 1), (1, 0), (0, -1)]  # 4 방향 선언
    while queue:
        cx, cy = queue.popleft()
        for dx, dy in d:
            nx, ny = cx + dx, cy + dy
            # 4 방향, 범위 내, 미방문, 1이면 큐 삽입
            if 0 &amp;lt;= nx &amp;lt; N and 0 &amp;lt;= ny &amp;lt; N and v[nx][ny] == 0 and adj[nx][ny] == 1:
                queue.append((nx, ny))  # 방문할 수 있는 집을 queue 에 넣기
                v[nx][ny] = 1           # 방문처리
                cnt += 1                # 단지 수 카운트
    return cnt

# 지도의 크기, 지도 정보 입력 받기
N = int(sys.stdin.readline())
adj = [list(map(int, sys.stdin.readline().strip())) for _ in range(N)]

# 방문 여부 리스트, 카운트 담을 정답 리스트 초기화
v = [[0] * N for _ in range(N)]
ans = []

# 지도에서 집 탐방
for i in range(N):
    for j in range(N):
        # 집이 있고 방문하지 않았으면 BFS 시작
        if adj[i][j] == 1 and v[i][j] == 0:
            ans.append(BFS(i, j))

# 오름차순 정렬
ans.sort()

# 총 단지 수, 각 단지내 집의 수 출력
print(len(ans), *ans, sep=&quot;\n&quot;)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2025-01-09 at 8.31.09 PM.png&quot; data-origin-width=&quot;1658&quot; data-origin-height=&quot;162&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bAJzt5/btsLJbOCnmd/mBIYGmZdXT4pxxI6cUpNHk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bAJzt5/btsLJbOCnmd/mBIYGmZdXT4pxxI6cUpNHk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bAJzt5/btsLJbOCnmd/mBIYGmZdXT4pxxI6cUpNHk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbAJzt5%2FbtsLJbOCnmd%2FmBIYGmZdXT4pxxI6cUpNHk%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;1658&quot; height=&quot;162&quot; data-filename=&quot;Screenshot 2025-01-09 at 8.31.09 PM.png&quot; data-origin-width=&quot;1658&quot; data-origin-height=&quot;162&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;풀고 자신만만하게 제출했는데 틀려서 읭 했는데&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;초기에 방문처리랑 cnt 를 안올렸어..&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;</description>
      <category>Algorithm/DFS BFS</category>
      <category>bfs</category>
      <category>Python</category>
      <category>백준2667</category>
      <category>백준BFS</category>
      <author>함s</author>
      <guid isPermaLink="true">https://intheham.tistory.com/218</guid>
      <comments>https://intheham.tistory.com/218#entry218comment</comments>
      <pubDate>Thu, 9 Jan 2025 20:34:22 +0900</pubDate>
    </item>
    <item>
      <title>[Backjoon] 2606 - 바이러스 (DFS)</title>
      <link>https://intheham.tistory.com/217</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;0. 문제 및 입력값&lt;/h2&gt;
&lt;pre id=&quot;code_1735999650523&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;'''
신종 바이러스인 웜 바이러스는 네트워크를 통해 전파된다.
한 컴퓨터가 웜 바이러스에 걸리면 그 컴퓨터와 네트워크 상에서 연결되어 있는 모든 컴퓨터는 웜 바이러스에 걸리게 된다.
어느 날 1번 컴퓨터가 웜 바이러스에 걸렸다.
컴퓨터의 수와 네트워크 상에서 서로 연결되어 있는 정보가 주어질 때,
1번 컴퓨터를 통해 웜 바이러스에 걸리게 되는 컴퓨터의 수를 출력하는 프로그램을 작성하시오.

1. 컴퓨터의 수 (100 이하인 양의 정수)
- 각 컴퓨터에는 1번 부터 차례대로 번호가 매겨진다.
2. 컴퓨터 쌍의 수
3. 한 줄에 한 쌍씩, 컴퓨터의 번호 쌍

1번 컴퓨터를 통해 웜 바이러스에 걸리게 되는 컴퓨터의 수를 첫째 줄에 출력한다.
'''
'''
7
6
1 2
2 3
1 5
5 2
5 6
4 7
# 4
'''&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. 제출한 답&lt;/h2&gt;
&lt;pre id=&quot;code_1735999637745&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import sys

sys.stdin = open(&quot;input.txt&quot;, &quot;r&quot;)

# 개수만 알면 되니까 DFS! (최단거리는 BFS)
def DFS(c):
    # c 방문 처리
    v.append(c)

    # c와 연결된 노드 모두 처리
    for n in adj[c]:
        if n not in v:
            DFS(n)

N = int(input())    # 컴퓨터 수
P = int(input())    # 컴퓨터 쌍의 수

adj = [[] for _ in range(N+1)]
for _ in range(P):
    a, b = map(int, sys.stdin.readline().split())
    # 컴퓨터 쌍 양방 처리
    adj[a].append(b)
    adj[b].append(a)

v = []  # 방문 노드 저장 리스트
DFS(1)  # 1번 컴퓨터부터 시작

# 1번 컴퓨터를 뺀 방문한 컴퓨러의 수
print(len(v) - 1)&lt;/code&gt;&lt;/pre&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-filename=&quot;Screenshot 2025-01-04 at 11.08.50 PM.png&quot; data-origin-width=&quot;1606&quot; data-origin-height=&quot;236&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/UCuFf/btsLDwMRYEJ/Typl5THUkB9pXM6vARiwNk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/UCuFf/btsLDwMRYEJ/Typl5THUkB9pXM6vARiwNk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/UCuFf/btsLDwMRYEJ/Typl5THUkB9pXM6vARiwNk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FUCuFf%2FbtsLDwMRYEJ%2FTypl5THUkB9pXM6vARiwNk%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;1606&quot; height=&quot;236&quot; data-filename=&quot;Screenshot 2025-01-04 at 11.08.50 PM.png&quot; data-origin-width=&quot;1606&quot; data-origin-height=&quot;236&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;확실히 노트로 쓰면서 하니까.. 어.. 더 낫나?&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;for 문을 얼마나 돌릴건지가 항상 헷갈린다.&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;(+) BFS 번외&lt;/h2&gt;
&lt;pre id=&quot;code_1736000656720&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;def BFS(c):
    queue = deque([c])
    
    # queue 가 빌 때까지 진행
    while queue:
        n = queue.popleft() # 최하단 노드 뽑아서
        if n not in v:
            v.append(n) # 방문하지 않은 노드일 경우 방문 처리
            for a in adj[n]:    # 해당 노드와 연결된 노드 모두 방문
                if a not in v:
                    queue.append(a) # 방문하지 않은 노드일 경우 queue 삽입&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Algorithm/DFS BFS</category>
      <author>함s</author>
      <guid isPermaLink="true">https://intheham.tistory.com/217</guid>
      <comments>https://intheham.tistory.com/217#entry217comment</comments>
      <pubDate>Sat, 4 Jan 2025 23:24:56 +0900</pubDate>
    </item>
    <item>
      <title>[Backjoon] 2178 - 미로탐색 (BFS)</title>
      <link>https://intheham.tistory.com/216</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;0. 문제&lt;/h2&gt;
&lt;pre id=&quot;code_1735568650915&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;'''
N&amp;times;M크기의 배열로 표현되는 미로가 있다.
미로에서 1은 이동할 수 있는 칸을 나타내고, 0은 이동할 수 없는 칸을 나타낸다.
이러한 미로가 주어졌을 때,
(1, 1)에서 출발하여 (N, M)의 위치로 이동할 때 지나야 하는 최소의 칸 수를 구하는 프로그램을 작성하시오.
한 칸에서 다른 칸으로 이동할 때, 서로 인접한 칸으로만 이동할 수 있다.
칸을 셀 때에는 시작 위치와 도착 위치도 포함한다.

첫째 줄에 두 정수 N, M(2 &amp;le; N, M &amp;le; 100)이 주어진다.
다음 N개의 줄에는 M개의 정수로 미로가 주어진다.
각각의 수들은 붙어서 입력으로 주어진다.

첫째 줄에 지나야 하는 최소의 칸 수를 출력한다.
항상 도착위치로 이동할 수 있는 경우만 입력으로 주어진다.
'''
'''
4 6
101111
101010
101011
111011
&amp;gt;&amp;gt; 15

4 6
110110
110110
111111
111101
&amp;gt;&amp;gt; 9

2 25
1011101110111011101110111
1110111011101110111011101
&amp;gt;&amp;gt; 38

7 7
1011111
1110001
1000001
1000001
1000001
1000001
1111111
&amp;gt;&amp;gt; 13
'''&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. 답&lt;/h2&gt;
&lt;pre id=&quot;code_1735568625090&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import sys
from collections import deque

sys.stdin = open(&quot;input.txt&quot;, &quot;r&quot;)

# 최단거리 문제는 bfs 로 품!!
def bfs(sx, sy, ex, ey):
    # q, v 초기화
    q = deque()
    v = [[0] * M for _ in range(N)]

    # 시작점 큐에 넣고 방문 처리
    q.append((sx, sy))
    v[sx][sy] = 1

    # 큐가 다 빌 때까지 반복
    while q:
        # 최하단 값 꺼내기
        x, y = q.popleft()

        # 목적지 여부 확인 및 정답 반환
        if (x, y) == (ex, ey):
            return v[x][y]

        # 4방향 비교 -&amp;gt; 조건 맞으면 큐 삽입 및 방문 처리
        for dx, dy in [(-1, 0), (1, 0), (0, -1), (0, 1)]:
            nx, ny = x + dx, y + dy
            # 범위 안에 있고, 갈 수 있는 길이며, 아직 방문하지 않은 곳이면
            if 0 &amp;lt;= nx &amp;lt; N and 0 &amp;lt;= ny &amp;lt; M and miro[nx][ny] == 1 and v[nx][ny] == 0:
                q.append((nx, ny))
                v[nx][ny] = v[x][y] + 1


# 하나씩 나눠서 변수에 담기 -&amp;gt; split()
N, M = map(int, sys.stdin.readline().split())
# 한 줄 통째로 받기 -&amp;gt; strip() 
# 101111 -&amp;gt; [1, 0, 1, 1, 1, 1]
miro = [list(map(int, sys.stdin.readline().strip())) for _ in range(N)]
v = [[0 for _ in range(M)] for _ in range(N)]

print(bfs(0, 0, N -1, M -1))&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2024-12-30 at 11.26.43 PM.png&quot; data-origin-width=&quot;1658&quot; data-origin-height=&quot;232&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/HStLr/btsLAZ2TAk5/7bObiFCjGZHwNtNaVLwxhK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/HStLr/btsLAZ2TAk5/7bObiFCjGZHwNtNaVLwxhK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/HStLr/btsLAZ2TAk5/7bObiFCjGZHwNtNaVLwxhK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FHStLr%2FbtsLAZ2TAk5%2F7bObiFCjGZHwNtNaVLwxhK%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;1658&quot; height=&quot;232&quot; data-filename=&quot;Screenshot 2024-12-30 at 11.26.43 PM.png&quot; data-origin-width=&quot;1658&quot; data-origin-height=&quot;232&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;그래서 해설 영상을 찾아서 보고... 안보고 쳐보는 방식으로 해서 겨우겨우 통과했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;BFS 문제를 많이 연습해봐야겠다!&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;하다보면 어떻게든 손에 익겠지 뭐~&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>Algorithm/DFS BFS</category>
      <category>bfs</category>
      <category>백준 2178</category>
      <author>함s</author>
      <guid isPermaLink="true">https://intheham.tistory.com/216</guid>
      <comments>https://intheham.tistory.com/216#entry216comment</comments>
      <pubDate>Mon, 30 Dec 2024 23:27:49 +0900</pubDate>
    </item>
    <item>
      <title>[Backjoon] 1026 - DFS와 BFS (sys.stdin.readline())</title>
      <link>https://intheham.tistory.com/215</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;0. 문제&lt;/h2&gt;
&lt;pre id=&quot;code_1734876640912&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;'''
그래프를 DFS로 탐색한 결과와 BFS로 탐색한 결과를 출력하는 프로그램을 작성하시오.
단, 방문할 수 있는 정점이 여러 개인 경우에는 정점 번호가 작은 것을 먼저 방문하고,
더 이상 방문할 수 있는 점이 없는 경우 종료한다.
정점 번호는 1번부터 N번까지이다.

# 입력
첫째 줄에 정점의 개수 N(1 &amp;le; N &amp;le; 1,000), 간선의 개수 M(1 &amp;le; M &amp;le; 10,000), 탐색을 시작할 정점의 번호 V가 주어진다.
다음 M개의 줄에는 간선이 연결하는 두 정점의 번호가 주어진다.
어떤 두 정점 사이에 여러 개의 간선이 있을 수 있다. 입력으로 주어지는 간선은 양방향이다.

# 출력
첫째 줄에 DFS를 수행한 결과를,
그 다음 줄에는 BFS를 수행한 결과를 출력한다.
V부터 방문된 점을 순서대로 출력하면 된다.
'''

'''
예제 1

4 5 1
1 2
1 3
1 4
2 4
3 4

1 2 4 3
1 2 3 4
'''

'''
예제 2

5 5 3
5 4
5 2
1 2
3 4
3 1

3 1 2 5 4
3 1 4 2 5
'''

'''
예제 3

1000 1 1000
999 1000

1000 999
1000 999
'''&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. 첫번째 답&lt;/h2&gt;
&lt;pre id=&quot;code_1734876588198&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from collections import deque

# 정점의 개수, 간선의 개수, 시작 정점 입력받기
n, m, v = map(int, input().split())
arr = [list(map(int, input().split())) for _ in range(m)]

# 그래프 생성
graph = {i: [] for i in range(1, n + 1)}  # 1부터 n까지의 정점 초기화
for i, j in arr:
    graph[i].append(j)
    graph[j].append(i)


# 그래프 오름차순 정렬
for key in graph:
    graph[key].sort()


def DFS(v):
    visited_dfs.append(v)   # 현재 정점 방문 처리

    # 현재 정점과 연결된 정점 정렬 후 방문
    for node in graph[v]:
        if node not in visited_dfs:
            DFS(node)


def BFS(v):
    queue = deque()
    queue.append(v)

    visited_bfs.append(v)   # 현재 정점 방문 처리

    # queue 가 다 빌 때까지 그래프 방문
    while queue:
        q = queue.popleft()     # 최하단 노드 뽑기

        for node in graph[q]:
            if node not in visited_bfs:
                visited_bfs.append(node)    # 방문처리
                queue.append(node)      # 큐에 미방문 노드 넣기


# 방문할 정점을 기록할 리스트
visited_dfs = []
DFS(v)
print(*visited_dfs)

visited_bfs = []
BFS(v)
print(*visited_bfs)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 입력받은 그래프를 딕셔너리로 재구성함&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;1 2&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;1 3&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;-&amp;gt; {1: [2, 3], 2: [1], 3: [1]}&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 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;정점이 1000개인데 연결 노드가 1 라면 딕셔너리에 {999: [1000], 1000: [999]} 이렇게만 넣고 싶었는데&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;이렇게 if 문을 매 노드마다 거니까 런타임 에러가 나는거임..&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;그래서 그냥 딕셔너리를 정점 개수만큼 만들고 간선이 있는 노드에만 값을 append 해줌.&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;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2024-12-22 at 11.20.09 PM.png&quot; data-origin-width=&quot;1662&quot; data-origin-height=&quot;166&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/k90CY/btsLtgbrpLJ/cosFclOruLLbtClpFzgaa0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/k90CY/btsLtgbrpLJ/cosFclOruLLbtClpFzgaa0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/k90CY/btsLtgbrpLJ/cosFclOruLLbtClpFzgaa0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fk90CY%2FbtsLtgbrpLJ%2FcosFclOruLLbtClpFzgaa0%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;1662&quot; height=&quot;166&quot; data-filename=&quot;Screenshot 2024-12-22 at 11.20.09 PM.png&quot; data-origin-width=&quot;1662&quot; data-origin-height=&quot;166&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;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;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;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;2. 두번째 답&lt;/h2&gt;
&lt;pre id=&quot;code_1735379584546&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from sys import stdin as s
from collections import deque

# 정점의 개수, 간선의 개수, 시작 정점 입력받기
n, m, v = map(int, s.readline().split())

# 그래프 생성
graph = [[] for _ in range(n + 1)]  # 1부터 n까지의 정점 초기화
for _ in range(1, m + 1):
    a, b = map(int, s.readline().split())
    graph[a].append(b)
    graph[b].append(a)

# 그래프 오름차순 정렬
for nodes in graph:
    nodes.sort()

def DFS(v):
    visited_dfs.append(v)   # 현재 정점 방문 처리

    # 현재 정점과 연결된 정점 정렬 후 방문
    for node in graph[v]:
        if node not in visited_dfs:
            DFS(node)


def BFS(v):
    queue = deque()
    queue.append(v)

    visited_bfs.append(v)   # 현재 정점 방문 처리

    # queue 가 다 빌 때까지 그래프 방문
    while queue:
        q = queue.popleft()     # 최하단 노드 뽑기

        for node in graph[q]:
            if node not in visited_bfs:
                visited_bfs.append(node)    # 방문처리
                queue.append(node)      # 큐에 미방문 노드 넣기


# 방문할 정점을 기록할 리스트
visited_dfs = []
DFS(v)
print(*visited_dfs)

visited_bfs = []
BFS(v)
print(*visited_bfs)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;속도를 높일 수 있는 방법을 찾다가, sys 로 여러줄의 입력값을 빠르게 받는 방법을 찾음.&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 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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2024-12-28 at 7.03.28 PM.png&quot; data-origin-width=&quot;1660&quot; data-origin-height=&quot;158&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/FQxV2/btsLz2Mcykg/PBn15xlIIVZLxFOVW0YkK0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/FQxV2/btsLz2Mcykg/PBn15xlIIVZLxFOVW0YkK0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/FQxV2/btsLz2Mcykg/PBn15xlIIVZLxFOVW0YkK0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FFQxV2%2FbtsLz2Mcykg%2FPBn15xlIIVZLxFOVW0YkK0%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;1660&quot; height=&quot;158&quot; data-filename=&quot;Screenshot 2024-12-28 at 7.03.28 PM.png&quot; data-origin-width=&quot;1660&quot; data-origin-height=&quot;158&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;근데 ; Pypy로 제출하니까 속도가 100ms 나 줄었는데 메모리가.. 거의 세배를 .. 씀..&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;찾아보니, Pypy 는 반복문에 최적화되어 있어서 (그것땜에 메모리 씀)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 속도가 중요한 문제일 경우 Pypy&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 메모리가 제한적인 경우 Python3 로 제출하는게 좋다고 한다!&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;3. 세번째 답&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;왠지 속도와 메모리 사용량을 더 줄일 방법이 있을 것 같아서 GPT 한테 방법을 물어봄.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;메모리 최적화&lt;br /&gt;1. visited를 집합(set)으로 변경&lt;br /&gt;&amp;nbsp; &amp;nbsp; - 리스트에서의 탐색 시간 O(n) &amp;rarr; 집합에서 탐색 시간 O(1).&lt;br /&gt;&amp;nbsp; &amp;nbsp; - 메모리 사용량도 줄어듦.&lt;br /&gt;2. defaultdict를 사용한 그래프 저장&lt;br /&gt;&amp;nbsp; &amp;nbsp; - 불필요한 리스트 초기화를 줄여 메모리를 절약.&lt;br /&gt;3. 재귀 DFS를 스택 기반 반복으로 변환&lt;br /&gt;&amp;nbsp; &amp;nbsp; - 재귀 호출로 인해 발생하는 추가 스택 사용을 제거.&lt;br /&gt;&lt;br /&gt;속도 최적화&lt;br /&gt;1. 입력 처리 개선&lt;br /&gt;&amp;nbsp; &amp;nbsp; - stdin.read로 대량 입력을 빠르게 처리.&lt;br /&gt;2. 정렬된 상태로 그래프 저장&lt;br /&gt;&amp;nbsp; &amp;nbsp; - 탐색할 때마다 정렬하지 않도록, 초기 정렬 시 처리.&lt;br /&gt;3. 방문 여부 체크 최적화&lt;br /&gt;&amp;nbsp; &amp;nbsp; - 리스트 기반 체크 &amp;rarr; 집합 기반 체크.&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1735380958496&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from sys import stdin
from collections import deque, defaultdict

# 입력 받기
n, m, v = map(int, stdin.readline().split())

# 그래프 생성
graph = defaultdict(list)
for _ in range(m):
    a, b = map(int, stdin.readline().split())
    graph[a].append(b)
    graph[b].append(a)

# 그래프 정렬 (정렬된 상태로 저장)
for key in graph:
    graph[key].sort()

def DFS_iterative(v):
    stack = [v]
    visited = set()
    result = []

    while stack:
        node = stack.pop()
        if node not in visited:
            visited.add(node)
            result.append(node)
            # 방문할 노드를 역순으로 추가 (그래야 작은 노드부터 탐색)
            stack.extend(reversed(graph[node]))

    return result

def BFS(v):
    queue = deque([v])
    visited = set([v])
    result = []

    while queue:
        node = queue.popleft()
        result.append(node)
        for neighbor in graph[node]:
            if neighbor not in visited:
                visited.add(neighbor)
                queue.append(neighbor)

    return result

# DFS와 BFS 실행
print(*DFS_iterative(v))
print(*BFS(v))&lt;/code&gt;&lt;/pre&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-filename=&quot;Screenshot 2024-12-28 at 7.18.49 PM.png&quot; data-origin-width=&quot;1660&quot; data-origin-height=&quot;158&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/snQXi/btsLAabWEIq/ZyGaNid4gsAlhv75cqzJB0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/snQXi/btsLAabWEIq/ZyGaNid4gsAlhv75cqzJB0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/snQXi/btsLAabWEIq/ZyGaNid4gsAlhv75cqzJB0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FsnQXi%2FbtsLAabWEIq%2FZyGaNid4gsAlhv75cqzJB0%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;1660&quot; height=&quot;158&quot; data-filename=&quot;Screenshot 2024-12-28 at 7.18.49 PM.png&quot; data-origin-width=&quot;1660&quot; data-origin-height=&quot;158&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;이번엔 파이썬이 훨씬 빨라..&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;어웅 근데 아직 이 코드가 잘.. 뭔가 이해가 안된다.. 아직. 능력치 부족!&lt;/p&gt;</description>
      <category>Algorithm/DFS BFS</category>
      <category>bfs</category>
      <category>dfs</category>
      <category>python sys</category>
      <category>stdin.readline</category>
      <category>백준 1260</category>
      <author>함s</author>
      <guid isPermaLink="true">https://intheham.tistory.com/215</guid>
      <comments>https://intheham.tistory.com/215#entry215comment</comments>
      <pubDate>Sat, 28 Dec 2024 19:20:33 +0900</pubDate>
    </item>
    <item>
      <title>[이.코.테] DFS/BFS</title>
      <link>https://intheham.tistory.com/214</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;750&quot; data-origin-height=&quot;312&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/zSq8g/btsLhNoARkG/WOiwzJzy5Im0WQ9tMKABwK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/zSq8g/btsLhNoARkG/WOiwzJzy5Im0WQ9tMKABwK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/zSq8g/btsLhNoARkG/WOiwzJzy5Im0WQ9tMKABwK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FzSq8g%2FbtsLhNoARkG%2FWOiwzJzy5Im0WQ9tMKABwK%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;750&quot; height=&quot;312&quot; data-origin-width=&quot;750&quot; data-origin-height=&quot;312&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;h2 data-ke-size=&quot;size26&quot;&gt;대표 문제 유형&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 경로탐색 유형 (최단거리, 시간)&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;3. 조합 유형 (모든 조합 만들기)&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;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 21.2403%;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;td style=&quot;width: 35.31%;&quot;&gt;DFS&lt;/td&gt;
&lt;td style=&quot;width: 43.4496%;&quot;&gt;BFS&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 21.2403%;&quot;&gt;알고리즘 검증&lt;/td&gt;
&lt;td style=&quot;width: 35.31%;&quot;&gt;동작 검증을 하기 쉬움&lt;/td&gt;
&lt;td style=&quot;width: 43.4496%;&quot;&gt;어려움&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 21.2403%;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;td style=&quot;width: 35.31%;&quot;&gt;코드 간결, 버그 발생할 가능성 적음&lt;/td&gt;
&lt;td style=&quot;width: 43.4496%;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 21.2403%;&quot;&gt;수행 시간&lt;/td&gt;
&lt;td style=&quot;width: 35.31%;&quot;&gt;복불복&lt;/td&gt;
&lt;td style=&quot;width: 43.4496%;&quot;&gt;대박날 확률도 적지만 쪽박 찰 확율도 적다&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 21.2403%;&quot;&gt;= 시간 복잡도&lt;/td&gt;
&lt;td style=&quot;width: 35.31%;&quot;&gt;높다&lt;/td&gt;
&lt;td style=&quot;width: 43.4496%;&quot;&gt;낮다&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 21.2403%;&quot;&gt;문제 난이도&lt;/td&gt;
&lt;td style=&quot;width: 35.31%;&quot;&gt;쉬운 문제일 경우 추천&lt;/td&gt;
&lt;td style=&quot;width: 43.4496%;&quot;&gt;난이도 있어보이거나 &lt;br /&gt;DFS로 풀기 오래걸릴 것 같은 경우 추천&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;=&amp;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;1260 -- DFS와 BFS : 그래프에서 DFS / BFS 연습&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2606 -- 바이러스 : 그래프에서 DFS 활용 연습&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2667 -- 단지번호붙이기 : DFS를 이용한 Flood Fill 연습&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2178 -- 미로탐색 : BFS로 4방향 탐색 연습&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;7569 -- 토마토 : BFS로 6방향 탐색 연습&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;h2 data-ke-size=&quot;size26&quot;&gt;1. DFS (Depth-First Search)&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 깊이 우선 탐색&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;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;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 style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;--- 조합을 만들고 정답과 비교&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;=&amp;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 data-ke-size=&quot;size16&quot;&gt;- BFS (Breadth-First Search) 너비우선 탐색보다 간단하지만 단순 검색 속도 자체는 느리다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;1. 탐색 시작 노드를 스택에 삽입, 방문 처리&lt;br /&gt;&lt;br /&gt;2-1. 스택의 최상단 노드에 방문하지 않은 인접노드가 있으면 그 인접노드를 스택에 넣고 방문 처리,&lt;br /&gt;2-2. 방문하지 않은 인접노드가 없으면 스택에서 최상단 노드를 꺼냄&lt;br /&gt;(인접노드 방문순서는 문제에서 주어진 조건으로. 없다면 관행적으로 번호가 낮은 순서부터 처리)&lt;br /&gt;&lt;br /&gt;3. 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;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2024-12-13 at 11.05.55 PM.png&quot; data-origin-width=&quot;876&quot; data-origin-height=&quot;670&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/VgFiA/btsLh4jkWZu/wogcNiHudskCUIug2K2Pek/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/VgFiA/btsLh4jkWZu/wogcNiHudskCUIug2K2Pek/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/VgFiA/btsLh4jkWZu/wogcNiHudskCUIug2K2Pek/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FVgFiA%2FbtsLh4jkWZu%2FwogcNiHudskCUIug2K2Pek%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;551&quot; height=&quot;421&quot; data-filename=&quot;Screenshot 2024-12-13 at 11.05.55 PM.png&quot; data-origin-width=&quot;876&quot; data-origin-height=&quot;670&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;pre id=&quot;code_1734099666895&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;def dfs(graph, v, visited):
	visited[v] = True	# 현재 노드 방문 처리
    print(v, end=' ')
    
    for i in graph[v]:	# 현재 노드와 연결된 다른 노드 방문
    	if not visited[i]:
        	dfs(graph, i, visited)


# 각 노드의 연결정보 (2차원 리스트)
graph = [
	[],			# 인덱스가 1부터 시작하기 때문에 [0]에 빈 리스트 삽입
    [2, 3, 8],
    [1, 7],
    [1, 4, 5],
    [3, 5],
    [3, 4],
    [7],
    [2, 6, 8],
    [1, 7]
]

# 방문 정보 (1차원 리스트)
visited = [False] * 9	# 인덱스 0을 사용하지 않기 위해 +1

dfs(graph, 1, visited)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2. BFS (Breadth-First Search)&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 너비 우선 탐색: 가까운 노드부터 탐색&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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;&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;--- 각각 다를 경우, 다익스트라 알고리즘 등의 최단거리 알고리즘을 활용해야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;1. 탐색 시작 노드를 큐에 삽입하고 방문 처리&lt;br /&gt;&lt;br /&gt;2. 큐에서 노드를 꺼낸 뒤, 해당 노드의 인접 노드 중에서 방문하지 않은 노드를 모두 큐에 삽입하고 방문 처리&lt;br /&gt;&lt;br /&gt;3. 2번 과정을 더이상 수행할 수 없을 때까지 (큐가 완전히 빌 때까지) 반복&lt;br /&gt;3-1. 꺼낸 노드가 목표 지점이면 루프 종료&lt;br /&gt;3-2. 목표 지점을 찾지 못했어도 더 갈 수 있는 지점이 없으면 루프 종료&lt;/blockquote&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-filename=&quot;Screenshot 2024-12-14 at 10.21.45 PM.png&quot; data-origin-width=&quot;1000&quot; data-origin-height=&quot;712&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bnsWSX/btsLjvz1I4G/NJQqgN7QTBP29lUwplzdAk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bnsWSX/btsLjvz1I4G/NJQqgN7QTBP29lUwplzdAk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bnsWSX/btsLjvz1I4G/NJQqgN7QTBP29lUwplzdAk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbnsWSX%2FbtsLjvz1I4G%2FNJQqgN7QTBP29lUwplzdAk%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;485&quot; height=&quot;345&quot; data-filename=&quot;Screenshot 2024-12-14 at 10.21.45 PM.png&quot; data-origin-width=&quot;1000&quot; data-origin-height=&quot;712&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;pre id=&quot;code_1734182799120&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from collections import deque

def bfs(graph, start, visited):
	queue = deque([start])
    visited[start] = True
    
    # 큐가 빌 때까지 반복
    while queue:
    	v = queue.popleft()
        print(v, end=' ')
        
        # 아직 방문하지 않은 인접한 원소들을 큐에 삽입
        for i in graph[v]:
        	if not visited[i]:
            	queue.append(i)
                visited[i] = True
      
      
# 각 노드의 연결정보 (2차원 리스트)
graph = [
	[],			# 인덱스가 1부터 시작하기 때문에 [0]에 빈 리스트 삽입
    [2, 3, 8],
    [1, 7],
    [1, 4, 5],
    [3, 5],
    [3, 4],
    [7],
    [2, 6, 8],
    [1, 7]
]

# 방문 정보 (1차원 리스트)
visited = [False] * 9	# 인덱스 0을 사용하지 않기 위해 +1

bfs(graph, 1, visited)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&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;figure id=&quot;og_1734098292621&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;깊이 우선 탐색(DFS)&quot; data-og-description=&quot;최근에 첨가된 노드를 선택하고, 트리에서 다음 수준의 한 개의 자식노드를 첨가하며 목표 노드일 때까지 앞의 자식 노드의 첨가 과정을 반복하는 알고리즘&quot; data-og-host=&quot;velog.io&quot; data-og-source-url=&quot;https://velog.io/@kimjihong9/%EA%B9%8A%EC%9D%B4-%EC%9A%B0%EC%84%A0-%ED%83%90%EC%83%89DFS&quot; data-og-url=&quot;https://velog.io/@kimjihong9/깊이-우선-탐색DFS&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bjEBkG/hyXKtX2j9a/KfiKKy4N96O2Q4wz1UaGGK/img.png?width=750&amp;amp;height=312&amp;amp;face=0_0_750_312,https://scrap.kakaocdn.net/dn/b9VBJW/hyXOb9dygK/VsZEuzHKU4TDsmEyCsWrc0/img.png?width=750&amp;amp;height=312&amp;amp;face=0_0_750_312,https://scrap.kakaocdn.net/dn/TXGqm/hyXOljHpcO/9aKkP7lPiIeYb1SKlkCdf1/img.png?width=1436&amp;amp;height=1116&amp;amp;face=0_0_1436_1116&quot;&gt;&lt;a href=&quot;https://velog.io/@kimjihong9/%EA%B9%8A%EC%9D%B4-%EC%9A%B0%EC%84%A0-%ED%83%90%EC%83%89DFS&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://velog.io/@kimjihong9/%EA%B9%8A%EC%9D%B4-%EC%9A%B0%EC%84%A0-%ED%83%90%EC%83%89DFS&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bjEBkG/hyXKtX2j9a/KfiKKy4N96O2Q4wz1UaGGK/img.png?width=750&amp;amp;height=312&amp;amp;face=0_0_750_312,https://scrap.kakaocdn.net/dn/b9VBJW/hyXOb9dygK/VsZEuzHKU4TDsmEyCsWrc0/img.png?width=750&amp;amp;height=312&amp;amp;face=0_0_750_312,https://scrap.kakaocdn.net/dn/TXGqm/hyXOljHpcO/9aKkP7lPiIeYb1SKlkCdf1/img.png?width=1436&amp;amp;height=1116&amp;amp;face=0_0_1436_1116');&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;깊이 우선 탐색(DFS)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;최근에 첨가된 노드를 선택하고, 트리에서 다음 수준의 한 개의 자식노드를 첨가하며 목표 노드일 때까지 앞의 자식 노드의 첨가 과정을 반복하는 알고리즘&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;velog.io&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=7C9RgOcvkvo&amp;amp;list=PLRx0vPvlEmdAghTr5mXQxGpHjWqSz0dgC&amp;amp;index=4&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.youtube.com/watch?v=7C9RgOcvkvo&amp;amp;list=PLRx0vPvlEmdAghTr5mXQxGpHjWqSz0dgC&amp;amp;index=4&lt;/a&gt;&lt;/p&gt;
&lt;figure data-ke-type=&quot;video&quot; data-ke-style=&quot;alignCenter&quot; data-video-host=&quot;youtube&quot; data-video-url=&quot;https://www.youtube.com/watch?v=7C9RgOcvkvo&amp;amp;list=PLRx0vPvlEmdAghTr5mXQxGpHjWqSz0dgC&amp;amp;index=4&quot; data-video-thumbnail=&quot;https://scrap.kakaocdn.net/dn/cvi0GE/hyXKjVprSk/lTNiGlVxLOYtFKBpoxwEmk/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=0_0_1280_720,https://scrap.kakaocdn.net/dn/bi75HG/hyXKuCBgZz/xjJFxKkqKZt2P5dkMyUeE0/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=0_0_1280_720&quot; data-video-width=&quot;860&quot; data-video-height=&quot;484&quot; data-video-origin-width=&quot;860&quot; data-video-origin-height=&quot;484&quot; data-ke-mobilestyle=&quot;widthContent&quot; data-video-title=&quot;(이코테 2021 강의 몰아보기) 3. DFS &amp;amp; BFS&quot; data-original-url=&quot;&quot;&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/7C9RgOcvkvo&quot; width=&quot;860&quot; height=&quot;484&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;
&lt;figcaption style=&quot;display: none;&quot;&gt;&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=BsYbdUnKZ-Y&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.youtube.com/watch?v=BsYbdUnKZ-Y&lt;/a&gt;&lt;/p&gt;
&lt;figure data-ke-type=&quot;video&quot; data-ke-style=&quot;alignCenter&quot; data-video-host=&quot;youtube&quot; data-video-url=&quot;https://www.youtube.com/watch?v=BsYbdUnKZ-Y&quot; data-video-thumbnail=&quot;https://scrap.kakaocdn.net/dn/c7iv0Q/hyXKubMj9y/NNmNKIkOoeHjUzGb53YpPk/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=0_0_1280_720,https://scrap.kakaocdn.net/dn/fL5qR/hyXKrMSpEB/BKAiAMGbalu6kFWR8HMV6k/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=0_0_1280_720&quot; data-video-width=&quot;860&quot; data-video-height=&quot;484&quot; data-video-origin-width=&quot;860&quot; data-video-origin-height=&quot;484&quot; data-ke-mobilestyle=&quot;widthContent&quot; data-video-title=&quot;DFS BFS 깊이 너비 우선탐색 알고리즘 5분만에 이해하기&quot; data-original-url=&quot;&quot;&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/BsYbdUnKZ-Y&quot; width=&quot;860&quot; height=&quot;484&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;
&lt;figcaption style=&quot;display: none;&quot;&gt;&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=By77aC9Oe3Q&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.youtube.com/watch?v=By77aC9Oe3Q&lt;/a&gt;&lt;/p&gt;
&lt;figure data-ke-type=&quot;video&quot; data-ke-style=&quot;alignCenter&quot; data-video-host=&quot;youtube&quot; data-video-url=&quot;https://www.youtube.com/watch?v=By77aC9Oe3Q&quot; data-video-thumbnail=&quot;https://scrap.kakaocdn.net/dn/HlTga/hyXOgpotEs/Ik5VnDHxkuVWFov8s70izk/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=884_190_948_260,https://scrap.kakaocdn.net/dn/95zsL/hyXOkZDJqT/je7NBj2uxEFalmvKkO6cl0/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=884_190_948_260&quot; data-video-width=&quot;860&quot; data-video-height=&quot;484&quot; data-video-origin-width=&quot;860&quot; data-video-origin-height=&quot;484&quot; data-ke-mobilestyle=&quot;widthContent&quot; data-video-title=&quot;[10분 테코톡]  카프카의 탐색 알고리즘&quot; data-original-url=&quot;&quot;&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/By77aC9Oe3Q&quot; width=&quot;860&quot; height=&quot;484&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;
&lt;figcaption style=&quot;display: none;&quot;&gt;&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Algorithm/DFS BFS</category>
      <category>bfs</category>
      <category>dfs</category>
      <author>함s</author>
      <guid isPermaLink="true">https://intheham.tistory.com/214</guid>
      <comments>https://intheham.tistory.com/214#entry214comment</comments>
      <pubDate>Sat, 14 Dec 2024 22:31:54 +0900</pubDate>
    </item>
    <item>
      <title>[이.코.테] DFS/BFS 사전 학습 -- 스택, 큐, 재귀 함수</title>
      <link>https://intheham.tistory.com/213</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;DFS/BFS 는 대표적인 탐색 알고리즘이다.&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;p data-ke-size=&quot;size16&quot;&gt;스택과 큐의 자료구조는 삽입(Push), 삭제(Pop), 오버플로, 언더플로 등을 고려해야 한다.&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;h2 data-ke-size=&quot;size26&quot;&gt;1. 스택 (Stack)&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 선입후출, 후입선출 (ex. 박스 쌓기)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1734095784391&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;stack = []

stack.append(5)
stack.append(2)
stack.append(3)
stack.append(7)
stack.pop()			# 7 삭제
stack.append(1)
stack.append(4)
stack.pop()			# 4 삭제

print(stack)		# 최하단 원소부터 출력	# [5, 2, 3, 1]
print(stack[::-1])	# 최상단 원소부터 출력	# [1, 3, 2, 5]&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2. 큐 (Queue)&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 선입선출 (FIFO) (ex. 대기줄)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 기존 list 를 활용해서 구현할 수 있지만, 그러면 시간복잡도가 높아서 꼭 deque 라이브러리를 사용해 구현하도록 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1734096154851&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from collections import deque

queue = deque()

queue.append(5)
queue.append(2)
queue.append(3)
queue.append(7)
queue.popleft()	# 5 삭제
queue.append(1)
queue.append(4)
queue.popleft()	# 2 삭제

print(queue)	# 먼저 들어온 순서대로 출력	# deque([3, 7, 1, 4])
queue.reverse()	# 역순 변경
print(queue)	# 나중에 들어온 원소부터 출력	# deque([4, 1, 7, 3])&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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;3. 재귀함수 (Recursive Function)&lt;/h2&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;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;pre id=&quot;code_1734096793056&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 반복문으로 구현한 n!
def factorial_iterative(n):
    result = 1
    for i in range(1, n + 1):
    	result *= i
    return result

# 재귀적으로 구현한 n!
def factorial_recursive(n):
    if n &amp;lt;= 1 :			# 0! == 1! == 1
    	return 1
    return n * factorial_recursive(n - 1)&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1734097217447&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 최대공약수 계산 (유클리드 호제법)
def gcd(a, b)
    if a % b == 0:
    	return b
    else:
    	return gcd(b, a % b)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Algorithm/DFS BFS</category>
      <category>스택</category>
      <category>재귀함수</category>
      <category>큐</category>
      <author>함s</author>
      <guid isPermaLink="true">https://intheham.tistory.com/213</guid>
      <comments>https://intheham.tistory.com/213#entry213comment</comments>
      <pubDate>Fri, 13 Dec 2024 22:44:45 +0900</pubDate>
    </item>
    <item>
      <title>[이.코.테] 구현 (2) -- 시각, 왕실의 나이트, 게임 개발</title>
      <link>https://intheham.tistory.com/212</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;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. 시각&lt;/h2&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;pre id=&quot;code_1733313427864&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 정수 N이 입력되면
# 00시 00분 00초 부터 N시 59분 59초까지의 모든 시각 중에서
# 3이 하나라도 포함되는 모든 경우의 수를 구하라
# hour : 00 ~ N
# minute : 00 ~ 59
# second : 00 ~ 59

def case_include_3():
    cnt = 0
    num = input(&quot;5 -- &quot;)

    for h in range(int(num)+1):
        for m in range(60):
            for s in range(60):
                # 매 시각 안에 '3'이 포함되어 있다면 카운트 증가
                if '3' in str(h)+str(m)+str(s):
                    cnt += 1
    return cnt

# print(case_include_3())     # 5 -&amp;gt; 11475&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2. 왕실의 나이트&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;8가지 경우의 수를 하나씩 생각하며 if 문 만들고 있으려니..&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;그래도 문자를 ord 로 숫자로 바꿔서 접근한 건 잘했다~&lt;/p&gt;
&lt;pre id=&quot;code_1733313524313&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 행 (1~8), 열 (a~h)
# 나이트는 8X8 밖으로 나갈 수 없다.
# 1. 수평 2칸 -&amp;gt; 수직 1칸 이동
# 2. 수직 2칸 -&amp;gt; 수평 1칸 이동
def royal_knight():
    # 8X8 좌표 평면 상 현재 나이트의 좌표 문자열 입력 -- 열+행 (a1)
    x, y = input(&quot;a1 -- &quot;)
    x = ord(x) - ord('a') + 1
    y = int(y)
    steps = [(-2, -1), (-2, 1), (2, -1), (2, 1), (-1, -2), (1, -2), (-1, 2), (1, 2)]
    cnt = 0

    for step in steps:
        x, y = x + step[0], y + step[1]
        if 1 &amp;lt;= x &amp;lt;= 8 and 1 &amp;lt;= y &amp;lt;= 8:
            cnt += 1

    # 나이트가 이동할 수 있는 경우의 수 반환
    return cnt

# print(royal_knight())

'''
# 현재 나이트의 위치 입력받기
input_data = input()
row = int(input_data[1])
col = int(ord(input_data[0])) - int(ord('a')) + 1

# 나이트가 이동할 수 있는 8가지 방향 정의
steps = [(-2, -1), (-1, -2), (1, -2), (2, -1), (2, 1), (1, 2), (-1, 2) (-2, 1)]

# 8가지 방향에 대하여 각 위치로 이동이 가능한지 확인
result = 0
for step in steps:
    # 이동하고자 하는 위치 확인
    next_row = row + step[0]
    next_col = col + step[1]
    
    # 해당 위치로 이동이 가능하다면 카운트 증가
    if 1 &amp;lt;= next_row &amp;lt;= 8 and 1 &amp;lt;= next_col &amp;lt;= 8:
        result += 1

return result


# 8x8 좌표 평면 상 현재 나이트의 좌표 문자열 입력 -- 열+행 (예: &quot;a1&quot;)
position = input(&quot;Enter the knight's position (e.g., a1): &quot;)
x, y = ord(position[0]), int(position[1])  # x는 문자('a'-'h'), y는 숫자(1-8)
cnt = 0

# 나이트가 이동할 수 있는 8가지 방향 정의 (수평2칸+수직1칸 / 수직2칸+수평1칸)
moves = [
    (-2, -1), (-2, 1),  # 수직 2칸, 수평 1칸
    (-1, -2), (-1, 2),  # 수직 1칸, 수평 2칸
    (1, -2), (1, 2),    # 수직 1칸, 수평 2칸
    (2, -1), (2, 1)     # 수직 2칸, 수평 1칸
]

# 모든 방향에 대해 이동 가능 여부 확인
for move in moves:
    nx = x + move[0]  # 새로운 x좌표 (열)
    ny = y + move[1]  # 새로운 y좌표 (행)
    
    # 새로운 좌표가 8x8 체스판 범위를 벗어나지 않으면 카운트 증가
    if ord('a') &amp;lt;= nx &amp;lt;= ord('h') and 1 &amp;lt;= ny &amp;lt;= 8:
        cnt += 1
        
# 나이트가 이동할 수 있는 경우의 수 반환
return cnt
'''&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3. 게임 개발&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;와 진짜 어려웠다.. 문제 읽는데 머리가 돌아버릴 것 같아서 난이도 보니까 Level.2 였다!!&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;** 그룹화 하고 (나열 XXX)&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;그리고 자기 수준에 맞는 난이도의 문제부터 잘 풀어야 함...&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 Level.1 문제가 어느정도 만만하게 느껴질 때까지는 Level.1 문제만 주구장창 풀어야겠다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이거 원... 문제를 이해하는 것도, 로직 짜는 것도, 짜여진 로직 읽는 것도 머리가 빙빙 돌더라&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1733313710238&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# N X M -- 육지(0) or 바다(1) (바다는 못 감)
# (A, B)
# 상하좌우 -- 순서가 되면
# 0. 일단 왼쪽으로 몸을 돌려
# 1. 아직 가보지 않은 칸 -&amp;gt; 앞으로 한 킨
# 2. 가본 칸 -&amp;gt; 멈추고 0번으로
# 3. 네 방향 모두 가봤거나, 앞이 바다일 경우 -&amp;gt; 한칸 뒤로 가고 0번으로
# 4. 3번일 때, 뒤가 바다라면 멈추기
# 캐릭터가 방문한 칸 수 출력

def game_map():
    # 맵 크기 N x M
    n, m = map(int, input(&quot;4 4 -- &quot;).split())
    # 캐릭터 서있는 위치 A, B, 방향(북동남서 0123)
    a, b, d = map(int, input(&quot;1 1 0 -- &quot;).split())
    # 전체 맵 정보 입력 -- 육지(0), 바다(1)
    field = [list(map(int, input().split())) for _ in range(n)]
    
    # 북동남서
    steps = [(-1, 0), (0, -1), (1, 0), (0, 1)]

    ''' 방문한 위치를 저장하기 위한 맵을 생성하여 0으로 초기화 '''
    done = [[0] * m for _ in range(n)]
    ''' 서있는 곳 가본 곳으로 체크 '''
    done[a][b] = 2

    ''' 방문한 칸 수 -&amp;gt; 시작점도 방문했다고 생각해야 함 '''
    result = 1
    ''' 네 방향 모두 가봤는 지 체크 '''
    turn_time = 0

    while True:
        # 왼쪽으로 회전
        d = 0 if d == 3 else d + 1
        # 한 칸 앞 위치
        new_a, new_b = a + steps[d][0], b + steps[d][1]

        # 맵 안에서만 움직이기
        if 0 &amp;lt;= a &amp;lt;= n and 0 &amp;lt;= b &amp;lt;= m:
            ''' 조건을 순서대로 생각하지 말고 그룹화를 잘 해야 함 '''
            # 정면에 가보지 않은 칸이 있다면
            if done[new_a][new_b] == 0 and field[new_a][new_b] == 0:
                done[new_a][new_b] = 2     # 가본 곳으로 체크
                a, b = new_a, new_b         # 앞으로 한 칸 가기
                result += 1
                turn_time = 0
                continue

            # 정면에 가보지 않은 칸이 없거나 바다인 경우
            else:
                turn_time += 1

            # 네 방향 모두 갈 수 없는 경우
            if turn_time == 4:
                new_a, new_b = a - steps[d][0], b - steps[d][1]
                # 뒤쪽이 바다가 아니라면 한 칸 뒤로 가기
                if field[new_a][new_b] == 1:
                    a, b = new_a, new_b  # 뒤로 한 칸 가기
                else:
                    break
                turn_time = 0

        else:
            break

    return result


# 입력 예시
&quot;&quot;&quot;
4 4
1 1 0
1 1 1 1
1 0 0 1
1 1 0 1
1 1 1 1
&quot;&quot;&quot;
print(game_map())  # 출력: 3


'''
# N, M을 공백으로 구분하여 입력받기
n, m = map(int, input().split())

# 방문한 위치를 저장하기 위한 맵을 생성하여 0으로 초기화
d = [[0] * m for _ in range(n)]
# 현재 캐릭터의 X 좌표, Y 좌표, 방향을 입력받기
x, y, direction = map(int, input().split())

# 현재 좌표 방문 처리
d[x][y] = 1

# 전체 맵 정보를 입력받기
array = []
for i in range(n):
    array.append(list(map(int, input().split())))

# 북, 동, 남, 서 방향 정의
dx = [-1, 0, 1, 0]
dy = [0, 1, 0, -1]

# 왼쪽으로 회번
def turn_left():
    global direction    # 전역변수 불러옴
    direction -= 1
    if direction == -1:
        direction = 3

# 시뮬레이션 시작
count = 1
turn_time = 0
while True:
    # 왼쪽으로 회전
    turn_left()
    nx = x + dx[direction]
    ny = y + dy[direction]
    
    # 회전한 이후 정면에 가보지 않은 칸이 존재하는 경우 이동
    if d[nx][ny] == 0 and array[nx][ny] == 0:
        d[nx][ny] = 1
        x, y = nx, ny
        count += 1
        turn_time = 0
        continue
    # 회전한 이후 정면에 가보지 않은 칸이 없거나 바다인 경우
    else:
        turn_time += 1
    
    # 네 방향 모두 갈 수 없는 경우
    if turn_time == 4:
        nx = x - dx[direction]
        ny = y - dy[direction]
        # 뒤로 갈 수 있다면 이동하기
        if array[nx][ny] == 0:
            x, y = nx, ny
        # 뒤가 바다로 막혀있는 경우
        else:
            break
        turn_time = 0
        
# 정답 출력
print(count)
'''&lt;/code&gt;&lt;/pre&gt;</description>
      <category>Algorithm/Implementation</category>
      <author>함s</author>
      <guid isPermaLink="true">https://intheham.tistory.com/212</guid>
      <comments>https://intheham.tistory.com/212#entry212comment</comments>
      <pubDate>Wed, 4 Dec 2024 21:06:56 +0900</pubDate>
    </item>
    <item>
      <title>[Programers] 구현 / 최소직사각형 -- max(iterable), 리스트 병합 (+, extend, sum(_,[])</title>
      <link>https://intheham.tistory.com/211</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. 내 코드&lt;/h2&gt;
&lt;pre id=&quot;code_1732684566385&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;def solution(sizes):
    answer = 0
    w, h = 0, 0

    for card in sizes:
        # 카드의 w, h 를 오름차순으로 정렬
        card.sort()

        # w, h 각각의 최댓값을 변수로 할당
        if card[0] &amp;gt; w:
            w = card[0]
        if card[1] &amp;gt; h:
            h = card[1]

    # w, h의 최댓값을 곱해 최소한의 크기를 반환
    return w * h&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;직관적이고 명확하지만,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;sort() 를 굳이 쓰지 않아도 되는 부분에서 사용해서 다소 비효율적이다.&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;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2. 다른 사람 풀이&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1732684861610&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;def solution(sizes):
    return max(max(x) for x in sizes) * max(min(x) for x in sizes)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가장 간결하고 효율적이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. sizes = [[10, 20], [30, 40], [50, 60]]&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. for 문으로 sizes 배열에서 값을 하나 꺼내온다. -- [10, 20]&lt;br /&gt;3. 그 값 중 최댓값을 꺼낸다. -- max(10, 20) = 20&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. sizes 배열을 돌며 각 값들의 최댓값을 구해서 모은다. -- max(20, 40, 60) = 60&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5. 같은 순서로 sizes 배열을 돌며 각 값들의 최솟값을 구해서 모은다. -- max(10, 30, 40) = 40&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;6. 그 둘의 곱을 반환한다.&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;max(max()) 구조도 처음 봤고,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;max(iterable) 에 for 문을 넣을 수 있는 것도.. 분명 알고는 있었던 거 같은데&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;pre id=&quot;code_1732684926209&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;def solution(sizes):
    row = 0
    col = 0
    for a, b in sizes:
        if a &amp;lt; b:
            a, b = b, a
        row = max(row, a)
        col = max(col, b)
    return row * col&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;직관적이고 효율적이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;굳이 sort 를 쓸 필요 없이 조건문으로 간단하게 정렬한 부분이 인상깊다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1732685048969&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;solution = lambda sizes: max(sum(sizes, [])) * max(min(size) for size in sizes)&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1732707299894&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sizes = [[10, 20], [30, 40]]
sum(sizes, [])  # Flattens to [10, 20, 30, 40]&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;왜 이 코드에 sum() 이 등장하나 했더니, 리스트 속 리스트를 평탄화하는, 즉, 리스트끼리의 덧셈 용으로 쓰였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;sizes 의 모든 숫자 중 가장 큰 숫자를 구하고 &amp;lt;- 평탄화&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;sizes 속 값의 가장 작은 수 중 가장 큰 수를 구해서 서로 곱한다..&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 data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;A.extend(B)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;: 가장 효율적이다. 기존 리스트 A의 값이 변형된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;: O(B)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;b&gt;A + B (Concatenation)&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;: O(B)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;sum(List, [])&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;: sum() 은 리스트에 최적화되어있지 않아서 병합 목적으로 사용하면 다른 메서드보다 느리고 오버헤드가 많이 발생한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;: 병합될 때마다 새로운 리스트가 만들어진다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;: O(List)&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;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://blockdmask.tistory.com/558&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://blockdmask.tistory.com/558&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1732707633257&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;[python] 파이썬 리스트 합치기 (+, extend, sum)&quot; data-og-description=&quot;안녕하세요. BlockDMask입니다. 오늘은 파이썬에서 리스트를 합치는 방법에 대해서 알아보겠습니다. 1. +로 리스트 합치는 방법 2. extend로 리스트 합치기 3. sum으로 이중 리스트 합치기 1. 파이썬 리&quot; data-og-host=&quot;blockdmask.tistory.com&quot; data-og-source-url=&quot;https://blockdmask.tistory.com/558&quot; data-og-url=&quot;https://blockdmask.tistory.com/558&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/rsvEh/hyXGNghPAP/gih7BsGEN0GghuFOkSyEGk/img.png?width=300&amp;amp;height=186&amp;amp;face=0_0_300_186,https://scrap.kakaocdn.net/dn/bwfb7Z/hyXDezPjiC/fP58jvj3trFgYOKN6EpPO1/img.png?width=300&amp;amp;height=186&amp;amp;face=0_0_300_186&quot;&gt;&lt;a href=&quot;https://blockdmask.tistory.com/558&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://blockdmask.tistory.com/558&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/rsvEh/hyXGNghPAP/gih7BsGEN0GghuFOkSyEGk/img.png?width=300&amp;amp;height=186&amp;amp;face=0_0_300_186,https://scrap.kakaocdn.net/dn/bwfb7Z/hyXDezPjiC/fP58jvj3trFgYOKN6EpPO1/img.png?width=300&amp;amp;height=186&amp;amp;face=0_0_300_186');&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;[python] 파이썬 리스트 합치기 (+, extend, sum)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;안녕하세요. BlockDMask입니다. 오늘은 파이썬에서 리스트를 합치는 방법에 대해서 알아보겠습니다. 1. +로 리스트 합치는 방법 2. extend로 리스트 합치기 3. sum으로 이중 리스트 합치기 1. 파이썬 리&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;blockdmask.tistory.com&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;</description>
      <category>Algorithm/Implementation</category>
      <author>함s</author>
      <guid isPermaLink="true">https://intheham.tistory.com/211</guid>
      <comments>https://intheham.tistory.com/211#entry211comment</comments>
      <pubDate>Wed, 27 Nov 2024 20:50:28 +0900</pubDate>
    </item>
    <item>
      <title>[이.코.테] 구현 (1) -- 상하좌우</title>
      <link>https://intheham.tistory.com/210</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;구현 알고리즘이란?&lt;/h2&gt;
&lt;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;(ex. 특정 소수점 자리까지 출력, 문자열 입력을 한 문자 단위로 파싱 등 )&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;/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;h2 data-ke-size=&quot;size26&quot;&gt;구현 시 고려해야 할 메모리 제약 사항&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. int 크기 제약&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;대체로 long long 에서 다룰 수 있는 수보다 더 큰 정수를 처리하는 문제는 잘 출제되지 않는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Java -- long long, BigInteger(클래스. 범위제한없음)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Python -- 직접 자료형을 지정할 필요가 벗으며 매우 큰 수의 연산 또한 기본으로 지원&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;대체로 코딩 테스트에서는 128 ~ 512MB로 메모리 제한하고&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;h2 data-ke-size=&quot;size26&quot;&gt;구현 문제에 접근하는 방법&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;보통 문제에서 사소한 입력 조건 등을 명시해주기 떄문에 문제 길이가 꽤 긴 편.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그러나 고차원적인 사고력을 요구하는 문제는 나오지 않아서&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;다만, C/C++ 이나 Java 에서는 문자열 처리가 까다롭고 큰 정수를 처리하는 라이브러리를 별도로 사용해야 하기 때문에&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;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1732628546398&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# N x N 크기의 정사각형 공간에서 입력 방향대로 움직임
def up_down_left_right():
    position = [1, 1]

    N = int(input(&quot;5 -- &quot;))
    direction = list(input(&quot;R R R U D D -- &quot;).split())

    for d in direction:
        if d == 'L':
            if position[1] &amp;gt; 1:
                position[1] -= 1
        elif d == 'R':
            if position[1] &amp;lt; N:
                position[1] += 1
        elif d == 'U':
            if position[0] &amp;gt; 1:
                position[0] -= 1
        elif d == 'D':
            if position[0] &amp;lt; N:
                position[0] += 1

    return position

print(*up_down_left_right())

'''
# N을 입력받기
n = int(input())
x, y = 1, 1
plans = input().split()

# L, R, U, D 에 따른 이동 방향
dx = [0, 0, -1, 1]
dy = [-1, 1, 0, 0]
move_types = ['L', 'R', 'U', 'D']

# 이동 계획을 하나씩 확인
for plan in plans:
    # 이동 후 좌표 구하기
    for i in range(len(move_types)):
        if plan == move_types[i]:
            nx = x + dx[i]
            ny = y + dy[i]
            
    # 공간을 벗어나는 경우 무시
    if nx &amp;lt; 1 of ny &amp;lt; 1 or nx &amp;gt; n or ny &amp;gt; n:
        continue
    
    # 이동 수행
    x, y = nx, ny

print(x, y)
        
'''&lt;/code&gt;&lt;/pre&gt;</description>
      <category>Algorithm/Implementation</category>
      <category>오블완</category>
      <category>티스토리챌린지</category>
      <author>함s</author>
      <guid isPermaLink="true">https://intheham.tistory.com/210</guid>
      <comments>https://intheham.tistory.com/210#entry210comment</comments>
      <pubDate>Wed, 27 Nov 2024 10:12:52 +0900</pubDate>
    </item>
    <item>
      <title>[Programers] 그리디 / 예산 -- sorted()</title>
      <link>https://intheham.tistory.com/209</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1. 내 코드&lt;/h4&gt;
&lt;pre id=&quot;code_1732596962703&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 각 부서가 신청한 금액만큼을 모두 지원
# 최대 몇 개의 부서
def solution(d, budget):
    total = 0
    
    # 적은 금액부터 차례로 더해서 budget 이 커버 가능한 최대 개수 return
    for i, req in enumerate(sorted(d)):
        total += req
        
        # total 이 budget 을 넘을 경우
        if total &amp;gt; budget:
            return i

    # total 이 budget 보다 작을 경우
    return len(d)&lt;/code&gt;&lt;/pre&gt;
&lt;p 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;sort 를 써서 복잡도는&amp;nbsp;배열길의 n 의&lt;span&gt;&amp;nbsp;&lt;/span&gt;O(nlogn) 이 된다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;일차 반복문 -- O(n)&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;합 및 비교 연산 -- O(1)&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;=&amp;gt; 최종 복잡도는&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;O(nlogn)&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;이 된다.&lt;/span&gt;&lt;/span&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;h4 data-ke-size=&quot;size20&quot;&gt;2. 다른 사람 풀이&lt;/h4&gt;
&lt;pre id=&quot;code_1732597493990&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;def solution(d, budget):
    d.sort()
    while budget &amp;lt; sum(d):
        d.pop()
    return len(d)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 코드는 프로그래머스에서 좋아요 제일 많이 받은 코드.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;sum() 자체는 복잡도가 O(n) 이지만,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;while 문이 돌 때마다 매번 다른 값을 sum 해야 해서 복잡도가 O(n&amp;sup2;) 이 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래도 d 에서 하나씩 뺀 다음 길이만 반환하는 로직이 흥미로움.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1732597898726&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;def solution(d, budget):
    d.sort()
    cnt = 0
    for i in d :
        budget -= i
        if budget &amp;lt; 0 :
               break
        cnt += 1
    return cnt&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;budget 에서 아이템을 하나씩 빼는 방식으로 풀이한 코드.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;enumerate 썼으면 cnt 변수 선언할 필요 없이 더 깔끔하게 코드 나올 듯.&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>Algorithm/Greedy</category>
      <category>오블완</category>
      <category>티스토리챌린지</category>
      <author>함s</author>
      <guid isPermaLink="true">https://intheham.tistory.com/209</guid>
      <comments>https://intheham.tistory.com/209#entry209comment</comments>
      <pubDate>Tue, 26 Nov 2024 14:13:49 +0900</pubDate>
    </item>
    <item>
      <title>[Programers] 그리디 / 체육복 -- [:], set, &amp;amp;</title>
      <link>https://intheham.tistory.com/208</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1. 내 코드&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;for 문에서 리스트를 직접 수정할 경우 수정 직후 반복문이 끝나게 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 lost=[3,4] reserve=[4,3] 케이스에서 3만 없어지고 4는 남게 됨.&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;내 코드의 복잡도는 이중 반복문 (X) 과 sort (log) 로,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;L (lost size), R (reserve size) 라고 할 때,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;O(L x R + LlogL)&lt;/b&gt; 이다.&lt;/p&gt;
&lt;pre id=&quot;code_1732499403630&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;def solution(n, lost, reserve):
    answer = 0

    # 여벌 체육복 중 하나만 도난당했을 경우
    for l in lost[:]:
        if l in reserve:
            lost.remove(l)
            reserve.remove(l)
            
    if len(lost) &amp;gt; 1: lost.sort()
     
    # 체육복 나누기
    for num in lost:
        # 여벌 학생이 없으면 반복문 탈출
        if not reserve:
            break

        # 앞 뒤로 도난 학생 여부 파악 -&amp;gt; 나눠주고 여벌 학생 리스트 제거
        if (num - 1) in reserve:
            reserve.remove(num - 1)
        elif (num + 1) in reserve:
            reserve.remove(num + 1)
        else:
            continue
        
        answer += 1
        
        
    answer += n - len(lost)
    
    return answer&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;2. GPT 코드&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;set 을 써서 중복을 제거하면 복잡도를 x -&amp;gt; + 로 낮출 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;list 자료형을 set(집합)으로 변환한 뒤&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;amp; 연산자를 통해 교집합을 추출하여 중복을 제거한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 하면 복잡도는 &lt;b&gt;O(LlogL + R)&lt;/b&gt; 이 되어 이중반복문을 돌릴 때보다 낮은 복잡도를 갖게 된다.&lt;/p&gt;
&lt;pre id=&quot;code_1732499898215&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;def solution(n, lost, reserve):
    # Convert lists to sets for efficient operations
    lost_set = set(lost)
    reserve_set = set(reserve)
    
    # Remove students who have both lost and reserved a uniform
    overlap = lost_set &amp;amp; reserve_set
    lost_set -= overlap
    reserve_set -= overlap

    answer = n - len(lost_set)  # Start with the number of students who already have uniforms

    # Distribute uniforms
    for student in sorted(lost_set):
        if student - 1 in reserve_set:
            reserve_set.remove(student - 1)
            answer += 1
        elif student + 1 in reserve_set:
            reserve_set.remove(student + 1)
            answer += 1

    return answer&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://ctkim.tistory.com/entry/Python-%EC%9E%85%EB%AC%B8-%EA%B0%95%EC%A2%8C-12-%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EC%A7%91%ED%95%A9Set-%EC%A0%95%EB%A6%AC-%EB%B0%8F-%EC%82%AC%EC%9A%A9%EB%B2%95&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://ctkim.tistory.com/entry/Python-%EC%9E%85%EB%AC%B8-%EA%B0%95%EC%A2%8C-12-%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EC%A7%91%ED%95%A9Set-%EC%A0%95%EB%A6%AC-%EB%B0%8F-%EC%82%AC%EC%9A%A9%EB%B2%95&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1732511168088&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;[Python 입문 강좌 - 12] 파이썬 집합(Set) 정리 및 사용법&quot; data-og-description=&quot;더보기 ##파이썬 입문 목차 1. 파이썬 이란? 2-1. 파이썬 윈도우 설치 2-2. 파이썬 맥북 설치 2-3. 윈도우 파이썬 IDE 파이참 설치하기 2-4. 맥북 파이썬 IDE 파이참 설치하기 3. 파이썬 변수(Variable)의 정&quot; data-og-host=&quot;ctkim.tistory.com&quot; data-og-source-url=&quot;https://ctkim.tistory.com/entry/Python-%EC%9E%85%EB%AC%B8-%EA%B0%95%EC%A2%8C-12-%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EC%A7%91%ED%95%A9Set-%EC%A0%95%EB%A6%AC-%EB%B0%8F-%EC%82%AC%EC%9A%A9%EB%B2%95&quot; data-og-url=&quot;https://ctkim.tistory.com/entry/Python-%EC%9E%85%EB%AC%B8-%EA%B0%95%EC%A2%8C-12-%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EC%A7%91%ED%95%A9Set-%EC%A0%95%EB%A6%AC-%EB%B0%8F-%EC%82%AC%EC%9A%A9%EB%B2%95&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/UiCl6/hyXDlLKuSl/fUMzLBqdLZxN5wK4thHZy0/img.png?width=636&amp;amp;height=430&amp;amp;face=0_0_636_430,https://scrap.kakaocdn.net/dn/bJOqeu/hyXDcuwS9n/QZVXpJ8VEcVYowkeLiP7Dk/img.png?width=636&amp;amp;height=430&amp;amp;face=0_0_636_430,https://scrap.kakaocdn.net/dn/VGq6S/hyXDk7bd3k/cTZ3JyaKI15VJL2oKUcgs1/img.png?width=636&amp;amp;height=430&amp;amp;face=0_0_636_430&quot;&gt;&lt;a href=&quot;https://ctkim.tistory.com/entry/Python-%EC%9E%85%EB%AC%B8-%EA%B0%95%EC%A2%8C-12-%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EC%A7%91%ED%95%A9Set-%EC%A0%95%EB%A6%AC-%EB%B0%8F-%EC%82%AC%EC%9A%A9%EB%B2%95&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://ctkim.tistory.com/entry/Python-%EC%9E%85%EB%AC%B8-%EA%B0%95%EC%A2%8C-12-%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EC%A7%91%ED%95%A9Set-%EC%A0%95%EB%A6%AC-%EB%B0%8F-%EC%82%AC%EC%9A%A9%EB%B2%95&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/UiCl6/hyXDlLKuSl/fUMzLBqdLZxN5wK4thHZy0/img.png?width=636&amp;amp;height=430&amp;amp;face=0_0_636_430,https://scrap.kakaocdn.net/dn/bJOqeu/hyXDcuwS9n/QZVXpJ8VEcVYowkeLiP7Dk/img.png?width=636&amp;amp;height=430&amp;amp;face=0_0_636_430,https://scrap.kakaocdn.net/dn/VGq6S/hyXDk7bd3k/cTZ3JyaKI15VJL2oKUcgs1/img.png?width=636&amp;amp;height=430&amp;amp;face=0_0_636_430');&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;[Python 입문 강좌 - 12] 파이썬 집합(Set) 정리 및 사용법&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;더보기 ##파이썬 입문 목차 1. 파이썬 이란? 2-1. 파이썬 윈도우 설치 2-2. 파이썬 맥북 설치 2-3. 윈도우 파이썬 IDE 파이참 설치하기 2-4. 맥북 파이썬 IDE 파이참 설치하기 3. 파이썬 변수(Variable)의 정&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;ctkim.tistory.com&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;</description>
      <category>Algorithm/Greedy</category>
      <category>오블완</category>
      <category>티스토리챌린지</category>
      <author>함s</author>
      <guid isPermaLink="true">https://intheham.tistory.com/208</guid>
      <comments>https://intheham.tistory.com/208#entry208comment</comments>
      <pubDate>Mon, 25 Nov 2024 14:07:02 +0900</pubDate>
    </item>
    <item>
      <title>[이.코.테] 그리디 (3) -- 1이 될 때까지</title>
      <link>https://intheham.tistory.com/207</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;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1732454081144&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# N이 1이 될 떄까지 1 혹은 2 과정을 수행해야 하는 횟수의 최솟값
# 1) N-1
# 2) N/K -- N이 K로 나누어떨어질 떄에만 선택 가능

def until_one():
    n, k = map(int, input(&quot;25 5 --&quot;).split())
    result = 0
    while n != 1:
        if n % k == 0:
            n /= k
        else:
            n -= 1
        result += 1
    return result

print(until_one())

'''
# K로 가능한 한 많이 나눴을 때 가장 빠르게 N=1 만들 수 있다.
# N이 K의 배수가 되도록 효율적으로 한 번에 빼는 방식

# N, K를 공백으로 구분하여 입력받기
n, k = map(int, input(&quot;25 5 --&quot;).split())
result = 0

while True:
    # (N == K 로 나누어 떨어지는 수)가 될 때까지 1씩 빼기
    target = (n // k) * k   # 25    # 5     # 0
    result += (n - target)  # 0     # 1+0   # 2+1
    n = target              # 25    # 5     # 0
    
    # N이 K보다 작을 때 (더이상 나눌 수 없을 때) 반복문 탈출
    if n &amp;lt; k:       # 25&amp;lt;5  # 5&amp;lt;5   # 0&amp;lt;5
        break       # result 가 3이 될 때 탈출
    
    # K로 나누기
    result += 1     # 1     # 2
    n //= k         # 5     # 1

# 마지막으로 남은 수에 대하여 1씩 빼기
result += (n - 1)   # 3-1
print(result)       # 2
'''&lt;/code&gt;&lt;/pre&gt;</description>
      <category>Algorithm/Greedy</category>
      <category>오블완</category>
      <category>티스토리챌린지</category>
      <author>함s</author>
      <guid isPermaLink="true">https://intheham.tistory.com/207</guid>
      <comments>https://intheham.tistory.com/207#entry207comment</comments>
      <pubDate>Sun, 24 Nov 2024 22:15:49 +0900</pubDate>
    </item>
    <item>
      <title>[이.코.테] 그리디 (2) -- 큰 수의 법칙</title>
      <link>https://intheham.tistory.com/206</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1732285911923&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 배열의 수들을 M번 더하여 가장 큰 수를 만드는 법칙.
# 단, 특정 인덱스에 해당하는 수가 연속해서 K번 초과하여 더해질 수는 없음.
# 인덱스가 다른데 값이 같을 경우 서로 다른 값으로 간주함.
# N: 배열 크기, M: 숫자 더하는 횟수, K: 연속해서 더할 수 있는 횟수

# N, M, K 공백으로 구분하여 입력 받기
n, m, k = map(int, input().split())

# N개의 자연수 공백으로 구분하여 입력 받기
data = list(map(int, input().split()))

max_value = max(data)   # 가장 큰 수
data.remove(max_value)
next_max = max(data)    # 두 번째로 큰 수

result = 0
cnt = k
# 가장 큰 수를 더하는데, 연속해서 K번 더할 수는 없음
for i in range(m):
    if cnt == 0:
        # 두 번째로 큰 수를 한 번 더하기
        result += next_max
        cnt = k
    else :
        # 가장 큰 수를 k번 더하기
        result += max_value
        # 더할 때마다 1씩 빼기
        cnt -= 1

print(result)


'''
n, m, k = map(int, input().split())
data = list(map(int, input().split()))
data.sort()     # 입력받은 수들 정렬하기
first = data[n - 1]
second = data[n - 2]

# [1] 단순하게 푸는 방법

result = 0
while True:
    for i in range(k):  # 가장 큰 수 k번 더하기
        if m == 0:
            break
        result += first
        m -= 1  
    if m == 0:
        break 
    result += second
    m -= 1


# [2] 수학 공식 이용

# 가장 큰 수가 더해지는 횟수 계산
count = int(m/(k+1)) * k
count += m % (k+1)

result = 0
result += (count) * first   # 가장 큰 수 더하기
result += (m-count) * second    # 두 번째로 큰 수 더하기

print(result)

'''&lt;/code&gt;&lt;/pre&gt;</description>
      <category>Algorithm/Greedy</category>
      <category>오블완</category>
      <category>티스토리챌린지</category>
      <author>함s</author>
      <guid isPermaLink="true">https://intheham.tistory.com/206</guid>
      <comments>https://intheham.tistory.com/206#entry206comment</comments>
      <pubDate>Sat, 23 Nov 2024 23:55:58 +0900</pubDate>
    </item>
    <item>
      <title>[이.코.테] 그리디 (1) -- 숫자 카드 게임</title>
      <link>https://intheham.tistory.com/205</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;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;그리디 알고리즘이란?&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;어떠한 문제가 있을 때, 단순 무식하게, *탐욕적으로 푸는 알고리즘.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(탐욕적: 현재 상황에서 가장 좋은 것만 고르는 방법)&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;그리고 문제 풀이를 위해 해법을 찾을 때, 이것이 정당한지 검토해야 답을 도출할 수 있다.&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;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1732285911923&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 여러 개의 숫자 카드 중 가장 높은 숫자가 쓰인 카드 한장을 뽑는 게임
# 행을 선택 -&amp;gt; 가장 숫자가 작은 카드 뽑음
# 행마다 가장 작은 숫자를 뽑지만, 최종적으로는 가장 높은 숫자를 뽑아야 한다.
# 즉, 각 행의 가장 작은 숫자들 중 가장 큰 수를 찾아야 한다.

# n: 행, m: 열
n, m = map(int, input(&quot;3 4&quot;).split())
num = []

# 한 줄 씩 입력을 받고, 거기서 가장 작을 수를 뽑는다.
for _ in range(n):
    num.append(min(map(int, input().split())))

# 가장 작은 수들 중에서 가장 큰 수를 리턴.
# 이렇게 결과물을 모두 담고 한번에 계산할 경우, 메모리를 필요 이상으로 쓰게 된다.
print(max(num))

'''
## min() 함수 이용

result = 0
for i in range(n):
    data = list(map(int, input().split()))
    min_value = min(data)
    result = max(result, min_value)
    # 이렇게 하면 숫자를 전부 담지 않고 그때그때 값을 비교하므로 메모리 사용이 덜할 것 같다.
'''
'''
## 2중 반복문 구조 이용  

result = 0
for i in range(n):
    data = list(map(int, input().split()))

    # 각 숫자는 1 이상 10,000 이하의 자연수 
    # =&amp;gt; 나올 수 없는 가장 큰 수(10001)를 설정하여 무조건 첫 비교 시 min_value 에 값 할당하도록 함.
    min_value = 10001
    for a in data:
        min_value = min(min_value, a)

    result = max(result, min_value)
'''&lt;/code&gt;&lt;/pre&gt;</description>
      <category>Algorithm/Greedy</category>
      <category>오블완</category>
      <category>티스토리챌린지</category>
      <author>함s</author>
      <guid isPermaLink="true">https://intheham.tistory.com/205</guid>
      <comments>https://intheham.tistory.com/205#entry205comment</comments>
      <pubDate>Fri, 22 Nov 2024 23:32:21 +0900</pubDate>
    </item>
    <item>
      <title>[이.코.테] 알고리즘 문제 해결 과정</title>
      <link>https://intheham.tistory.com/204</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;파이썬 기초 문법 문제를 대략 180개 정도 풀었더니 약간 자신감이 생겨서&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;h2 data-ke-size=&quot;size26&quot;&gt;시간제한(수행시간 요구사항)&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;시간 제한이 1초인 경우, (파이썬의 경우) 해당 시간 복잡도의 알고리즘을 구현하는게 좋다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;( 여기서 N은, [1, 2, 3, 4] 일 경우 4 가 된다.)&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 39.6512%; height: 184px;&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: 33.3333%;&quot;&gt;N의 범위&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;시간 복잡도&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;명칭&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;500&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;O(N3)&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;삼차 시간&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;2,000&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;O(N2)&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;이차 시간&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;100,000&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;O(NlogN)&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;로그 선형 시간&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;10,000,000&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;O(N)&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&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;h2 data-ke-size=&quot;size26&quot;&gt;알고리즘 문제 해결 과정&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 지문 읽기. -- 컴퓨터적 사고를 통해 단계별로 접근&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;3. 문제 해결을 위한 아이디어 찾기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. 소스코드 설계 및 코딩&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 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;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;&amp;nbsp;&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 style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Algorithm/Basic</category>
      <category>오블완</category>
      <category>티스토리챌린지</category>
      <author>함s</author>
      <guid isPermaLink="true">https://intheham.tistory.com/204</guid>
      <comments>https://intheham.tistory.com/204#entry204comment</comments>
      <pubDate>Thu, 21 Nov 2024 23:32:07 +0900</pubDate>
    </item>
    <item>
      <title>[Python] Day 17 (1/5) -- rfind(), rindex(), endswith()</title>
      <link>https://intheham.tistory.com/203</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;&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;b&gt;문자열.find(부분값)&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;b&gt;문자열.rfind(부분값)&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;b&gt;문자열.index(부분값)&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;문자열.rindex(부분값)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- find, rfind 와 동일하게 진행된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 단, find 는 문자열에 부분값이 존재하지 않아도 error 를 일으키지 않지만&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;index 는 error 를 일으킨다.&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;&lt;b&gt;문자열.startswith(부분값)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;문자열.endswith(부분값)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 문자열에 부분값으로 시작하는지, 끝나는지 True/False 로 리턴&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;pre id=&quot;code_1732024627989&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# pat로 끝나는 가장 긴 부분 문자열
# pat은 반드시 myString의 부분 문자열로 주어집니다.
# 대문자와 소문자를 구분합니다.

def longest_pat_ending(myString, pat):
    return myString[: myString.rfind(pat)+len(pat)]

    # if myString.endswith(pat): return myString
    # answer = ''
    # arr = myString.split(pat)
    # for i in range(len(arr) - 1):
    #     if arr[i] == '': arr[i] = pat
    #     answer += arr[i]
    # return answer if answer.endswith(pat) else answer + pat

'''
solution=lambda x,y:x[:x.rindex(y)+len(y)]

return myString[:len(myString) - myString[::-1].index(pat[::-1])]

answer = ''
for ch in myString:
    answer += ch
    if mem.endswith(pat):
        return answer
'''

print(longest_pat_ending(&quot;AbCdEFG&quot;, &quot;AbCdEFG&quot;))     # &quot;AbCdEFG&quot;
print(longest_pat_ending(&quot;ancdnc&quot;, &quot;nc&quot;))           # &quot;ancdnc&quot;
print(longest_pat_ending(&quot;AAAAaaaa&quot;, &quot;a&quot;))          # &quot;AAAAaaaa&quot;

print(longest_pat_ending(&quot;abcdefghidj&quot;, &quot;d&quot;))       # &quot;abcdefghid&quot;
print(longest_pat_ending(&quot;AbCdEFG&quot;, &quot;dE&quot;))          # &quot;AbCdE&quot;

print(longest_pat_ending(&quot;asdf&quot;, &quot;a&quot;))              # &quot;a&quot;
print(longest_pat_ending(&quot;aasdf&quot;, &quot;a&quot;))             # &quot;aa&quot;
print(longest_pat_ending(&quot;aaaaAAAA&quot;, &quot;a&quot;))          # &quot;aaaa&quot;
print(longest_pat_ending(&quot;OxOOo&quot;, &quot;Ox&quot;))            # &quot;Ox&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&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;&lt;a href=&quot;https://hyunssssss.tistory.com/365&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://hyunssssss.tistory.com/365&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1732024290315&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;파이썬(Python) - 11.문자열 찾기(find(), rfind(), in)&quot; data-og-description=&quot;●문자열 찾기 - find(), rfind() - 문자열 내부에서 특정문자가 어디에 위치하는지 찾을 때 사용한다. - find()함수는 왼쪽부터 찾고, rfind()함수는 오른쪽부터 찾는다. ex) ●in연산자 - 문자열 내부에 &quot; data-og-host=&quot;hyunssssss.tistory.com&quot; data-og-source-url=&quot;https://hyunssssss.tistory.com/365&quot; data-og-url=&quot;https://hyunssssss.tistory.com/365&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/4PzXl/hyXzMQLNvb/29bBqg9E23x97k9d1hrig0/img.png?width=520&amp;amp;height=224&amp;amp;face=0_0_520_224,https://scrap.kakaocdn.net/dn/EMthQ/hyXzVtphw8/ixrbkWtaK28pKCEXpHQhqK/img.png?width=520&amp;amp;height=224&amp;amp;face=0_0_520_224,https://scrap.kakaocdn.net/dn/3XNiX/hyXzL5pHEn/vkozYlhrA1iR5rM5gLLhb1/img.png?width=520&amp;amp;height=224&amp;amp;face=0_0_520_224&quot;&gt;&lt;a href=&quot;https://hyunssssss.tistory.com/365&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://hyunssssss.tistory.com/365&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/4PzXl/hyXzMQLNvb/29bBqg9E23x97k9d1hrig0/img.png?width=520&amp;amp;height=224&amp;amp;face=0_0_520_224,https://scrap.kakaocdn.net/dn/EMthQ/hyXzVtphw8/ixrbkWtaK28pKCEXpHQhqK/img.png?width=520&amp;amp;height=224&amp;amp;face=0_0_520_224,https://scrap.kakaocdn.net/dn/3XNiX/hyXzL5pHEn/vkozYlhrA1iR5rM5gLLhb1/img.png?width=520&amp;amp;height=224&amp;amp;face=0_0_520_224');&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;파이썬(Python) - 11.문자열 찾기(find(), rfind(), in)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;●문자열 찾기 - find(), rfind() - 문자열 내부에서 특정문자가 어디에 위치하는지 찾을 때 사용한다. - find()함수는 왼쪽부터 찾고, rfind()함수는 오른쪽부터 찾는다. ex) ●in연산자 - 문자열 내부에&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;hyunssssss.tistory.com&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;a href=&quot;https://www.w3schools.com/python/ref_string_endswith.asp&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.w3schools.com/python/ref_string_endswith.asp&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1732024299324&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;W3Schools.com&quot; data-og-description=&quot;W3Schools offers free online tutorials, references and exercises in all the major languages of the web. Covering popular subjects like HTML, CSS, JavaScript, Python, SQL, Java, and many, many more.&quot; data-og-host=&quot;www.w3schools.com&quot; data-og-source-url=&quot;https://www.w3schools.com/python/ref_string_endswith.asp&quot; data-og-url=&quot;https://www.w3schools.com/python/ref_string_endswith.asp&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/5NSzf/hyXzVfTB4j/xHHSk2lx74iiZVrl6bIda0/img.png?width=436&amp;amp;height=228&amp;amp;face=0_0_436_228,https://scrap.kakaocdn.net/dn/Sdylo/hyXzTCmGwS/RasmnRK5iwDXC7evg5ARkK/img.png?width=300&amp;amp;height=300&amp;amp;face=0_0_300_300&quot;&gt;&lt;a href=&quot;https://www.w3schools.com/python/ref_string_endswith.asp&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.w3schools.com/python/ref_string_endswith.asp&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/5NSzf/hyXzVfTB4j/xHHSk2lx74iiZVrl6bIda0/img.png?width=436&amp;amp;height=228&amp;amp;face=0_0_436_228,https://scrap.kakaocdn.net/dn/Sdylo/hyXzTCmGwS/RasmnRK5iwDXC7evg5ARkK/img.png?width=300&amp;amp;height=300&amp;amp;face=0_0_300_300');&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;W3Schools.com&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;W3Schools offers free online tutorials, references and exercises in all the major languages of the web. Covering popular subjects like HTML, CSS, JavaScript, Python, SQL, Java, and many, many more.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.w3schools.com&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;</description>
      <category>Algorithm/Basic</category>
      <category>오블완</category>
      <category>티스토리챌린지</category>
      <author>함s</author>
      <guid isPermaLink="true">https://intheham.tistory.com/203</guid>
      <comments>https://intheham.tistory.com/203#entry203comment</comments>
      <pubDate>Wed, 20 Nov 2024 21:00:26 +0900</pubDate>
    </item>
    <item>
      <title>[Python] Day 16 (5/5) -- 부분 대소문자 변환 (replace(), swapcase())</title>
      <link>https://intheham.tistory.com/202</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;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1731932810685&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 79) =================================================================
# a -&amp;gt; A, 나머지 모두 소문자 변환

def a_to_A(myString):
    return myString.lower().replace('a', 'A')

'''
JS
const solution = s =&amp;gt; s.toLowerCase().replaceAll('a','A');
'''

print(a_to_A(&quot;abstract algebra&quot;))   # &quot;AbstrAct AlgebrA&quot;


# 80) =================================================================
def find_alp_and_up(my_string, alp):
    return my_string.replace(alp, my_string[my_string.find(alp)].upper())

'''
return my_string.replace(alp, alp.upper())

return my_string.replace(alp, alp.swapcase())
'''

print(find_alp_and_up(&quot;programmers&quot;, &quot;p&quot;))   # &quot;Programmers&quot;&lt;/code&gt;&lt;/pre&gt;</description>
      <category>Algorithm/Basic</category>
      <category>오블완</category>
      <category>티스토리챌린지</category>
      <author>함s</author>
      <guid isPermaLink="true">https://intheham.tistory.com/202</guid>
      <comments>https://intheham.tistory.com/202#entry202comment</comments>
      <pubDate>Tue, 19 Nov 2024 16:58:48 +0900</pubDate>
    </item>
    <item>
      <title>[Python] Day 16 (3/5) -- lower(), upper()</title>
      <link>https://intheham.tistory.com/201</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1731931443179&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 76) =================================================================
def str_upper(myString):
    return myString.upper()

'''
solution = lambda n : n.upper()
'''
'''
JS
const solution = s =&amp;gt; s.toUpperCase()

Java
return myString.toUpperCase();
'''

print(str_upper(&quot;aBcDeFg&quot;))     # &quot;ABCDEFG&quot;


# 77) =================================================================
def str_lower(myString):
    return myString.lower()

print(str_lower(&quot;aBcDeFg&quot;))     # &quot;abcdefg&quot;


# 78) =================================================================
# 홀수 인덱스 -&amp;gt; 소문자 변환, 짝수 인덱스 -&amp;gt; 대문자 변환
def odd_A_even_a(strArr):
    return [strArr[i].lower() if i%2==0 else strArr[i].upper() for i in range(len(strArr))]

'''
# range 보다 enumerate 를 사용하여 index 사용 권장
return [s.lower() if i % 2 == 0 else s.upper() for i, s in enumerate(strArr)]
'''

print(odd_A_even_a([&quot;AAA&quot;,&quot;BBB&quot;,&quot;CCC&quot;,&quot;DDD&quot;]))  # [&quot;aaa&quot;,&quot;BBB&quot;,&quot;ccc&quot;,&quot;DDD&quot;]&lt;/code&gt;&lt;/pre&gt;</description>
      <category>Algorithm/Basic</category>
      <category>오블완</category>
      <category>티스토리챌린지</category>
      <author>함s</author>
      <guid isPermaLink="true">https://intheham.tistory.com/201</guid>
      <comments>https://intheham.tistory.com/201#entry201comment</comments>
      <pubDate>Mon, 18 Nov 2024 21:04:35 +0900</pubDate>
    </item>
    <item>
      <title>[Python] Day 15 (5/5) -- (JS) 단항연산자 (+)</title>
      <link>https://intheham.tistory.com/200</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;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1731850529815&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// myString의 연속된 부분 문자열 중 pat이 존재하면 1을 그렇지 않으면 0
return +(myString.toUpperCase().includes(pat.toUpperCase()));&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;단항연산자 (+)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;문자열을 숫자로 변환해 줌&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;boolean 값을 숫자로 바꿀 때 용이할 듯!&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;pre id=&quot;code_1731850384108&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;'''
리스트(배열), 문자열
# 71) 조건에 맞게 수열 변환하기 1
# 72) 조건에 맞게 수열 변환하기 2
# 73) 1로 만들기
# 74) 길이에 따른 연산
# 75) 원하는 문자열 찾기
'''

# 71) ==========================================================================
# 50보다 크거나 같은 짝수라면 2로 나누고, 50보다 작은 홀수라면 2를 곱합니다.

def compare_50(arr):
    for i, n in enumerate(arr):
        if n &amp;gt;= 50 and n % 2 == 0:
            arr[i] = int(n/2)
        elif n &amp;lt; 50 and n % 2 != 0:
            arr[i] = n * 2
    return arr

'''
n % 2 == 0
(=) not n % 2

0 == False
'''


print(compare_50([1, 2, 3, 100, 99, 98]))   # [2, 2, 6, 50, 99, 49]


# 72) ==========================================================================
# 값이 50보다 크거나 같은 짝수라면 2로 나누고, 50보다 작은 홀수라면 2를 곱하고 다시 1을 더합니다.
# arr(x) = arr(x + 1)인 x 중 가장 작은 값 반환

def compare_50_x(arr):
    # debugging &amp;amp; tracking states

    all_result = [arr[:]]
    i = 0
    while True:
        for j, n in enumerate(arr):
            if n &amp;gt;= 50 and not n % 2:
                arr[j] = n // 2
            elif n &amp;lt; 50 and n % 2:
                arr[j] = n * 2 + 1
        all_result.append(arr[:])

        if all_result[i] == all_result[i + 1]:
            break
        else:
            i += 1
    return i

'''
# efficiency &amp;amp; simplicity

answer = 0
old = arr
while True:
    new = []
    for i in old:
        if i &amp;gt;= 50 and i % 2 == 0:
            i = i / 2
        elif i &amp;lt; 50 and i % 2 == 1:
            i = i * 2 + 1
        new.append(int(i))
    if old == new:
        break
    else:
        old = new
        answer += 1
return answer
'''

print(compare_50_x([1, 2, 3, 100, 99, 98]))     # 5


# 73) ==========================================================================
# 짝수라면 반으로 나누고, 홀수라면 1을 뺀 뒤 반으로 나누면, 마지막엔 1이 됩니다.
# num_list의 모든 원소를 1로 만들기 위해서 필요한 나누기 연산의 횟수 총합 리턴.

def count_for_one(num_list):
    answer = 0
    for n in num_list:
        count = 0
        while n != 1:
            if n % 2 == 0:
                n = n // 2
                count += 1
            else:
                n = (n - 1) // 2
                count += 1
        answer += count

    return answer

'''
# 바이트 연산
return sum(len(bin(i)) - 3 for i in num_list)

# 홀수일 때 1을 빼고 2로 나눈다는 것 = 몫을 구하겠다는 것
for n in num_list:
    while n != 1:
        n //= 2
        answer += 1
'''
'''
JS
return num_list.map(v =&amp;gt; v.toString(2).length - 1).reduce((a, c) =&amp;gt; a + c);

Java
return Arrays.stream(num_list).map(i -&amp;gt; Integer.toBinaryString(i).length() - 1).sum();
'''


print(count_for_one([12, 4, 15, 1, 14]))    # 11


# 74) ==========================================================================
# 리스트의 길이가 11 이상이면 리스트에 있는 모든 원소의 합을, 10 이하이면 모든 원소의 곱을 return

def if_list_11(num_list):
    if len(num_list) &amp;gt;= 11:
        return sum(num_list)
    else:
        mul = 1
        for n in num_list:
            mul *= n
        return mul

'''
return eval('*'.join(map(str, num_list)))

from functools import reduce
return reduce(lambda x, y: x * y, num_list)

from math import prod
def solution(num_list):
    return sum(num_list) if len(num_list)&amp;gt;=11 else prod(num_list)
'''
'''
JS
const solution = n =&amp;gt; n.reduce((a, v) =&amp;gt; n.length &amp;gt; 10 ? a + v : a * v)

const mult = (acc, v) =&amp;gt; acc * v;
const add = (acc, v) =&amp;gt; acc + v;
return num_list.length &amp;gt; 10
    ? num_list.reduce(add, 0)
    : num_list.reduce(mult, 1);
'''

print(if_list_11([3, 4, 5, 2, 5, 4, 6, 7, 3, 7, 2, 2, 1]))  # 51
print(if_list_11([2, 3, 4, 5]))          # 120


# 75) ==========================================================================
# myString의 연속된 부분 문자열 중 pat이 존재하면 1을 그렇지 않으면 0

def is_there_pat(myString, pat):
    return int(pat.lower() in myString.lower())


'''
JS
return +(myString.toUpperCase().includes(pat.toUpperCase()));
'''

print(is_there_pat(&quot;AbCdEfG&quot;, &quot;aBc&quot;))   # 1
print(is_there_pat(&quot;aaAA&quot;, &quot;aaaaa&quot;))    # 0&lt;/code&gt;&lt;/pre&gt;</description>
      <category>Algorithm/Basic</category>
      <category>오블완</category>
      <category>티스토리챌린지</category>
      <author>함s</author>
      <guid isPermaLink="true">https://intheham.tistory.com/200</guid>
      <comments>https://intheham.tistory.com/200#entry200comment</comments>
      <pubDate>Sun, 17 Nov 2024 22:39:13 +0900</pubDate>
    </item>
    <item>
      <title>[Python] Day 15 (4/5) -- 리스트의 모든 수를 곱하는 방법</title>
      <link>https://intheham.tistory.com/199</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;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1731590833354&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# for
result = 1
for n in numbers:
	result *= n

# while
result = 1
i = 0
while i &amp;lt; len(numbers):
	result *= numbers[i]
	i += 1&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;[1] 루프 사용&lt;/h2&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;- 코드가 다소 긴 편.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1731591146063&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from functools import reduce

reduce(lambda x, y: x * y, numbers)&lt;/code&gt;&lt;/pre&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] functools.reduce&lt;/h2&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;pre id=&quot;code_1731591233377&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import math

math.prod(numbers)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;[3] math.prod (Python 3.8 이상)&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 가장 간결하고 직관적. (가능하면 reduce 보다 prod 추천)&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;pre id=&quot;code_1731591309956&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;eval('*'.join(map(str, numbers)))
eval('*'.join([str(n) for n in numbers]))&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;[4] eval&lt;/h2&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;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1731591693086&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 리스트의 길이가 11 이상이면 리스트에 있는 모든 원소의 합을, 10 이하이면 모든 원소의 곱을 return

def if_list_11(num_list):
    if len(num_list) &amp;gt;= 11:
        return sum(num_list)
    else:
        mul = 1
        for n in num_list:
            mul *= n
        return mul

'''
return eval('*'.join(map(str, num_list)))

from functools import reduce
return reduce(lambda x, y: x * y, num_list)

from math import prod
def solution(num_list):
    return sum(num_list) if len(num_list)&amp;gt;=11 else prod(num_list)
'''
'''
JS
const solution = n =&amp;gt; n.reduce((a, v) =&amp;gt; n.length &amp;gt; 10 ? a + v : a * v)

const mult = (acc, v) =&amp;gt; acc * v;
const add = (acc, v) =&amp;gt; acc + v;
return num_list.length &amp;gt; 10
    ? num_list.reduce(add, 0)
    : num_list.reduce(mult, 1);
'''

print(if_list_11([3, 4, 5, 2, 5, 4, 6, 7, 3, 7, 2, 2, 1]))  # 51
print(if_list_11([2, 3, 4, 5]))          # 120&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://velog.io/@kim_sunnnny/python-int%ED%98%95-list-%EC%9B%90%EC%86%8C%EB%93%A4%EC%9D%98-%EA%B3%B1&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://velog.io/@kim_sunnnny/python-int%ED%98%95-list-%EC%9B%90%EC%86%8C%EB%93%A4%EC%9D%98-%EA%B3%B1&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1731590869449&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;[python] int형 list 원소들의 곱&quot; data-og-description=&quot;traversal : for looptime complexity : O(n)Auxiliary space : O(1)numpy.prodtime complexity : O(n)Auxiliary space : O(1)lambda w/ numpy.arraytime comple&quot; data-og-host=&quot;velog.io&quot; data-og-source-url=&quot;https://velog.io/@kim_sunnnny/python-int%ED%98%95-list-%EC%9B%90%EC%86%8C%EB%93%A4%EC%9D%98-%EA%B3%B1&quot; data-og-url=&quot;https://velog.io/@kim_sunnnny/python-int형-list-원소들의-곱&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/b0kquT/hyXzNt8VUH/TrRf0dlJ3MjYjeTtI5nV81/img.png?width=950&amp;amp;height=500&amp;amp;face=0_0_950_500,https://scrap.kakaocdn.net/dn/VTv7k/hyXwt49QWH/FTVWYAtDtOpbHPm5GUJwMK/img.jpg?width=1143&amp;amp;height=1080&amp;amp;face=332_759_380_810,https://scrap.kakaocdn.net/dn/6TDaU/hyXwkmRkmm/9kMUD40PUZLG1iFE5DBqok/img.png?width=1152&amp;amp;height=300&amp;amp;face=0_0_1152_300&quot;&gt;&lt;a href=&quot;https://velog.io/@kim_sunnnny/python-int%ED%98%95-list-%EC%9B%90%EC%86%8C%EB%93%A4%EC%9D%98-%EA%B3%B1&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://velog.io/@kim_sunnnny/python-int%ED%98%95-list-%EC%9B%90%EC%86%8C%EB%93%A4%EC%9D%98-%EA%B3%B1&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/b0kquT/hyXzNt8VUH/TrRf0dlJ3MjYjeTtI5nV81/img.png?width=950&amp;amp;height=500&amp;amp;face=0_0_950_500,https://scrap.kakaocdn.net/dn/VTv7k/hyXwt49QWH/FTVWYAtDtOpbHPm5GUJwMK/img.jpg?width=1143&amp;amp;height=1080&amp;amp;face=332_759_380_810,https://scrap.kakaocdn.net/dn/6TDaU/hyXwkmRkmm/9kMUD40PUZLG1iFE5DBqok/img.png?width=1152&amp;amp;height=300&amp;amp;face=0_0_1152_300');&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;[python] int형 list 원소들의 곱&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;traversal : for looptime complexity : O(n)Auxiliary space : O(1)numpy.prodtime complexity : O(n)Auxiliary space : O(1)lambda w/ numpy.arraytime comple&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;velog.io&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Array/reduce&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Array/reduce&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1731591652447&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;Array.prototype.reduce() - JavaScript | MDN&quot; data-og-description=&quot;reduce() 메서드는 배열의 각 요소에 대해 주어진 리듀서 (reducer) 함수를 실행하고, 하나의 결과값을 반환합니다.&quot; data-og-host=&quot;developer.mozilla.org&quot; data-og-source-url=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Array/reduce&quot; data-og-url=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Array/reduce&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/dRQ8WT/hyXwvWd1ur/KWPmhdUnX4IIOMyKsAh0q1/img.png?width=1920&amp;amp;height=1080&amp;amp;face=0_0_1920_1080&quot;&gt;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Array/reduce&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Array/reduce&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/dRQ8WT/hyXwvWd1ur/KWPmhdUnX4IIOMyKsAh0q1/img.png?width=1920&amp;amp;height=1080&amp;amp;face=0_0_1920_1080');&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;Array.prototype.reduce() - JavaScript | MDN&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;reduce() 메서드는 배열의 각 요소에 대해 주어진 리듀서 (reducer) 함수를 실행하고, 하나의 결과값을 반환합니다.&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;</description>
      <category>Algorithm/Basic</category>
      <category>오블완</category>
      <category>티스토리챌린지</category>
      <author>함s</author>
      <guid isPermaLink="true">https://intheham.tistory.com/199</guid>
      <comments>https://intheham.tistory.com/199#entry199comment</comments>
      <pubDate>Sat, 16 Nov 2024 21:41:04 +0900</pubDate>
    </item>
    <item>
      <title>[Python] Day 15 (2/5) -- do-while, 리스트 복사</title>
      <link>https://intheham.tistory.com/198</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;[1] do-while&lt;/h2&gt;
&lt;pre id=&quot;code_1731498263280&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;while True:
	# 실행문
    
    if 조건:
    	break&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;파이썬에서 do while 문은 while True 로 따라할 수 있다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;꼭 조건문과 break 를 써서 무한 루프를 만들지 말자.&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 style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;[2] 리스트 복사&lt;/h2&gt;
&lt;pre id=&quot;code_1731498976835&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;original = [1, 2, 3]

# 단순 복사
copy1 = original

# 얕은 복사
copy2-1 = original.copy()
copy2-2 = original[:]

# 깊은 복사
copy3 = copy.deepcopy(original)&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #333333; 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;original 과 copy1 은 같은 주소값을 가리킨다. 단지 이름만 다를 뿐이다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;즉, original 을 변경하거나 copy1 을 변경할 경우 서로에게 동시에 영향을 준다.&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;h3 style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;2. 얕은 복사&lt;/h3&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;copy2 를 수정해도 original 에는 반영되지 않는다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;하지만 copy2 의 특정 값을 수정하면 original 의 값도 같이 수정될 수 있다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;왜냐하면 얕은 복사는 &lt;b&gt;새로운 리스트 객체를 생성&lt;/b&gt;하지만,&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;그 &lt;b&gt;리스트 안에 있는 값들은 원래 리스트의 참조&lt;/b&gt;를 그대로 가져오기 때문이다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;그래서 리스트 안에 &lt;b&gt;가변 객체&lt;/b&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: #333333; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;* 가변객체 (mutable object)&lt;/h4&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;- 리스트(list), 딕셔너리(dict), 집합(set), 바이트 배열(bytearray)&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: #333333; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;* 불변 객체 (immutable object)&lt;/h4&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;- 숫자형(int, float), 문자열(str), 튜플(tuple), frozenset, 불리언(bool)&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;pre id=&quot;code_1731587847281&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 원본 리스트: 2차원 리스트 (내부에 가변 객체인 리스트가 포함되어 있음)
original = [[1, 2], [3, 4]]

# 얕은 복사: 원본 리스트의 탑 레벨만 복사됨 (내부 리스트는 참조만 복사)
# copy[0]은 original[0]과 같은 객체를 참조함
copy = original[:]

copy[0][0] = 99			# 내부 리스트의 값을 수정
print(original)			# [[99, 2], [3, 4]] (원본도 영향을 받음)

# 탑 레벨 리스트의 첫 번째 요소를 새 리스트로 대체 
copy[0] = [5, 6]  		# copy[0]만 새로운 리스트을 참조하도록 변경
print(original)			# [[99, 2], [3, 4]] (원본은 영향을 받지 않음)



# 원본 리스트: 숫자로만 이루어진 1차원 리스트 (숫자는 불변 객체임)
original_list = [1, 2, 3]

# 얕은 복사: 원본 리스트의 모든 요소가 새 리스트에 복사됨 (값만 복사)
# shallow_copy와 original_list는 독립적임
shallow_copy = original_list[:]

shallow_copy[0] = 99	# 복사본의 첫 번째 요소를 변경
print(original_list)	# [1, 2, 3] (원본은 영향을 받지 않음)&lt;/code&gt;&lt;/pre&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;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;3. 깊은 복사&lt;/h3&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;그래서 어느 한 쪽을 수정해도 서로 영향을 주지 않는다.&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;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;&amp;nbsp;&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 data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;* 문제 풀이&lt;/h2&gt;
&lt;pre id=&quot;code_1731498362102&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 값이 50보다 크거나 같은 짝수라면 2로 나누고, 50보다 작은 홀수라면 2를 곱하고 다시 1을 더합니다.
# arr(x) = arr(x + 1)인 x 중 가장 작은 값 반환

def compare_50_x(arr):
    # debugging &amp;amp; tracking states

    all_result = [arr[:]]
    i = 0
    while True:
        for j, n in enumerate(arr):
            if n &amp;gt;= 50 and not n % 2:
                arr[j] = n // 2
            elif n &amp;lt; 50 and n % 2:
                arr[j] = n * 2 + 1
        all_result.append(arr[:])

        if all_result[i] == all_result[i + 1]:
            break
        else:
            i += 1
    return i
    
'''
[[1, 2, 3, 100, 99, 98], [3, 2, 7, 50, 99, 49]]
[[1, 2, 3, 100, 99, 98], [3, 2, 7, 50, 99, 49], [7, 2, 15, 25, 99, 99]]
[[1, 2, 3, 100, 99, 98], [3, 2, 7, 50, 99, 49], [7, 2, 15, 25, 99, 99], [15, 2, 31, 51, 99, 99]]
[[1, 2, 3, 100, 99, 98], [3, 2, 7, 50, 99, 49], [7, 2, 15, 25, 99, 99], [15, 2, 31, 51, 99, 99], [31, 2, 63, 51, 99, 99]]
[[1, 2, 3, 100, 99, 98], [3, 2, 7, 50, 99, 49], [7, 2, 15, 25, 99, 99], [15, 2, 31, 51, 99, 99], [31, 2, 63, 51, 99, 99], [63, 2, 63, 51, 99, 99]]
[[1, 2, 3, 100, 99, 98], [3, 2, 7, 50, 99, 49], [7, 2, 15, 25, 99, 99], [15, 2, 31, 51, 99, 99], [31, 2, 63, 51, 99, 99], [63, 2, 63, 51, 99, 99], [63, 2, 63, 51, 99, 99]]
5
'''&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&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;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1731498491155&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# efficiency &amp;amp; simplicity

answer = 0
old = arr
while True:
    new = []
    for i in old:
        if i &amp;gt;= 50 and i % 2 == 0:
            i = i / 2
        elif i &amp;lt; 50 and i % 2 == 1:
            i = i * 2 + 1
        new.append(int(i))
    if old == new:
        break
    else:
        old = new
        answer += 1
return answer&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게, 이전 것과 현재 것만 변수에 담은 뒤, 값을 비교하고, 다른 경우 값을 바꿔치기 해서 진행하면&lt;/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;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;a href=&quot;https://www.freecodecamp.org/korean/news/pythonyi-do-whilemun-banbogmun-yeje/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.freecodecamp.org/korean/news/pythonyi-do-whilemun-banbogmun-yeje/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1731498304829&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;Python의 Do While문 - 반복문 예제&quot; data-og-description=&quot;모든 현대 프로그래밍 언어에서 반복문은 유용하게 자주 쓰입니다. 반복문을 사용하면 특정한 반복 작업을 자동화할 수 있고 프로그램에 반복적인 코드를 일일이 작성하지 않아도 됩니다. 반복&quot; data-og-host=&quot;www.freecodecamp.org&quot; data-og-source-url=&quot;https://www.freecodecamp.org/korean/news/pythonyi-do-whilemun-banbogmun-yeje/&quot; data-og-url=&quot;https://www.freecodecamp.org/korean/news/pythonyi-do-whilemun-banbogmun-yeje/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/blhjow/hyXzMu3eSk/HDTs5duML6UtKtzLNsEzs1/img.jpg?width=2000&amp;amp;height=1270&amp;amp;face=0_0_2000_1270,https://scrap.kakaocdn.net/dn/2z027/hyXwuQmUNd/XjalkTPa5jYezKh6j9pjAK/img.jpg?width=2000&amp;amp;height=1270&amp;amp;face=0_0_2000_1270,https://scrap.kakaocdn.net/dn/cnIbJn/hyXzPZBFmP/SUVLvOCZy1yvPmtyGU5CQ1/img.jpg?width=2000&amp;amp;height=1270&amp;amp;face=0_0_2000_1270&quot;&gt;&lt;a href=&quot;https://www.freecodecamp.org/korean/news/pythonyi-do-whilemun-banbogmun-yeje/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.freecodecamp.org/korean/news/pythonyi-do-whilemun-banbogmun-yeje/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/blhjow/hyXzMu3eSk/HDTs5duML6UtKtzLNsEzs1/img.jpg?width=2000&amp;amp;height=1270&amp;amp;face=0_0_2000_1270,https://scrap.kakaocdn.net/dn/2z027/hyXwuQmUNd/XjalkTPa5jYezKh6j9pjAK/img.jpg?width=2000&amp;amp;height=1270&amp;amp;face=0_0_2000_1270,https://scrap.kakaocdn.net/dn/cnIbJn/hyXzPZBFmP/SUVLvOCZy1yvPmtyGU5CQ1/img.jpg?width=2000&amp;amp;height=1270&amp;amp;face=0_0_2000_1270');&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;Python의 Do While문 - 반복문 예제&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;모든 현대 프로그래밍 언어에서 반복문은 유용하게 자주 쓰입니다. 반복문을 사용하면 특정한 반복 작업을 자동화할 수 있고 프로그램에 반복적인 코드를 일일이 작성하지 않아도 됩니다. 반복&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.freecodecamp.org&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://black-hair.tistory.com/49&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://black-hair.tistory.com/49&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1731498735435&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;[기능] 파이썬 리스트 복사 (python copy)&quot; data-og-description=&quot;Copy 파이썬에서 일반적으로 복사할 때 아래와 같은 형식으로 진행된다. list_A = [&amp;quot;ABC&amp;quot;,&amp;quot;DEF&amp;quot;] list_B = list_A 하지만 이렇게 복사를 하는 경우 단순한 값에 대해서는 문제가 없지만, 리스트를 복사할 때&quot; data-og-host=&quot;black-hair.tistory.com&quot; data-og-source-url=&quot;https://black-hair.tistory.com/49&quot; data-og-url=&quot;https://black-hair.tistory.com/49&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/PM2S1/hyXzSWkzZX/ryP7chQite72XFUwBU726K/img.png?width=800&amp;amp;height=135&amp;amp;face=0_0_800_135,https://scrap.kakaocdn.net/dn/Iwb8c/hyXwpatfIm/DTBskzaIFK2KVCk2swROdk/img.png?width=800&amp;amp;height=135&amp;amp;face=0_0_800_135&quot;&gt;&lt;a href=&quot;https://black-hair.tistory.com/49&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://black-hair.tistory.com/49&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/PM2S1/hyXzSWkzZX/ryP7chQite72XFUwBU726K/img.png?width=800&amp;amp;height=135&amp;amp;face=0_0_800_135,https://scrap.kakaocdn.net/dn/Iwb8c/hyXwpatfIm/DTBskzaIFK2KVCk2swROdk/img.png?width=800&amp;amp;height=135&amp;amp;face=0_0_800_135');&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;[기능] 파이썬 리스트 복사 (python copy)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Copy 파이썬에서 일반적으로 복사할 때 아래와 같은 형식으로 진행된다. list_A = [&quot;ABC&quot;,&quot;DEF&quot;] list_B = list_A 하지만 이렇게 복사를 하는 경우 단순한 값에 대해서는 문제가 없지만, 리스트를 복사할 때&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;black-hair.tistory.com&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;</description>
      <category>Algorithm/Basic</category>
      <category>오블완</category>
      <category>티스토리챌린지</category>
      <author>함s</author>
      <guid isPermaLink="true">https://intheham.tistory.com/198</guid>
      <comments>https://intheham.tistory.com/198#entry198comment</comments>
      <pubDate>Fri, 15 Nov 2024 19:06:12 +0900</pubDate>
    </item>
    <item>
      <title>[Python] Day 14 -- full code</title>
      <link>https://intheham.tistory.com/197</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div style=&quot;background-color: #1e1f22; color: #bcbec4;&quot;&gt;
&lt;pre class=&quot;python&quot;&gt;&lt;code&gt;'''
리스트(배열)
# 66) 홀수 vs 짝수
# 67) 5명씩
# 68) 할 일 목록
# 69) n보다 커질 때까지 더하기
# 70) 수열과 구간 쿼리1
'''

# 66) ====================================================================
# 가장 첫 번째 원소를 1번 원소라고 할 때, 홀수 번째 원소들의 합과 짝수 번째 원소들의 합 중 큰 값을 return

def odd_vs_even(num_list):
    odd, even = 0, 0
    odd = sum(num for num in num_list[1::2])
    even = sum(num for num in num_list[::2])

    return max(odd, even)

'''
return max(sum(num_list[::2]), sum(num_list[1::2]))
'''
'''
JS

num_list.map((val, idx) =&amp;gt; { !(idx % 2) ? even += val : odd += val })
return odd &amp;gt; even ? odd : even;

num_list.forEach((val, idx) =&amp;gt; idx % 2 == 0 ? even += val : odd += val);
return Math.max(odd, even);
'''

print(odd_vs_even([4, 2, 6, 1, 7, 6]))  # 17


# 67) ====================================================================
# 앞에서 부터 5명씩 묶은 그룹의 가장 앞

def group_leader(names):
    return names[::5]


# [&quot;nami&quot;, &quot;vex&quot;]
print(group_leader([&quot;nami&quot;, &quot;ahri&quot;, &quot;jayce&quot;, &quot;garen&quot;, &quot;ivern&quot;, &quot;vex&quot;, &quot;jinx&quot;]))


# 68) ====================================================================
#  아직 마치지 못한 일들을 순서대로

def todo(todo_list, finished):
    return [t for t, r in zip(todo_list, finished) if not bool(r)]

'''
return [work for idx, work in enumerate(todo_list) if not finished[idx]]

return [x for x, b in zip(todo_list, finished) if not b]
'''
'''
JS
return todo_list.filter((e,i) =&amp;gt; !finished[i]);

Java
for(int i=0; i&amp;lt;finished.length; i++){
    str = finished[i]==false ? str+todo_list[i]+&quot;,&quot; : str;
}
return str.split(&quot;,&quot;);
'''

# [&quot;practiceguitar&quot;, &quot;studygraph&quot;]
print(todo([&quot;problemsolving&quot;, &quot;practiceguitar&quot;, &quot;swim&quot;, &quot;studygraph&quot;],  [True, False, True, False]))


# 69) ====================================================================
# 앞에서부터 하나씩 더하다가 그 합이 n보다 커지는 순간 리턴

def add_num(numbers, n):
    answer = 0
    for num in numbers:
        answer += num
        if answer &amp;gt; n:
            return answer

'''
return next(sum(numbers[:i + 1]) for i in range(len(numbers)) if sum(numbers[:i + 1]) &amp;gt; n)

from itertools import accumulate
def find_first_exceeding_sum(numbers, n):
    return next((s for s in accumulate(numbers) if s &amp;gt; n), None)
'''

print(add_num([34, 5, 71, 29, 100, 34], 123))   # 139
print(add_num([58, 44, 27, 10, 100],    139))       # 239


# 70) ====================================================================
#  s &amp;le; i &amp;le; e인 모든 i에 대해 arr[i]에 1을 더합니다.

def section_query(arr, queries):
    for s, e in queries:
        for i in range(s, e+1):
            arr[i] += 1
    return arr

'''
JS
queries.forEach(([s, e]) =&amp;gt; {
    while (s &amp;lt;= e) arr[s++]++;
});
'''


# [1, 3, 4, 4, 4]
print(section_query([0, 1, 2, 3, 4],    [[0, 1],[1, 2],[2, 3]]))

&lt;/code&gt;&lt;/pre&gt;
&lt;/div&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;코딩 기초 트레이닝 캘린더.png&quot; data-origin-width=&quot;1912&quot; data-origin-height=&quot;2720&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/WWt9X/btsKFkgcbpq/EfZ1FguAsadeWOPgYurpkk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/WWt9X/btsKFkgcbpq/EfZ1FguAsadeWOPgYurpkk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/WWt9X/btsKFkgcbpq/EfZ1FguAsadeWOPgYurpkk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FWWt9X%2FbtsKFkgcbpq%2FEfZ1FguAsadeWOPgYurpkk%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;544&quot; height=&quot;774&quot; data-filename=&quot;코딩 기초 트레이닝 캘린더.png&quot; data-origin-width=&quot;1912&quot; data-origin-height=&quot;2720&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 style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;이제 30문제 남았다아&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;내년 넘어가기 전에 끝내자~~!!&lt;/p&gt;</description>
      <category>Algorithm/Basic</category>
      <category>오블완</category>
      <category>티스토리챌린지</category>
      <author>함s</author>
      <guid isPermaLink="true">https://intheham.tistory.com/197</guid>
      <comments>https://intheham.tistory.com/197#entry197comment</comments>
      <pubDate>Thu, 14 Nov 2024 21:29:05 +0900</pubDate>
    </item>
    <item>
      <title>[Python] Day 14 (4/5) -- next(), accumulate()</title>
      <link>https://intheham.tistory.com/196</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;&amp;nbsp;&lt;/p&gt;
&lt;div style=&quot;background-color: #1e1f22; color: #bcbec4;&quot;&gt;
&lt;pre class=&quot;lisp&quot;&gt;&lt;code&gt;return next(sum(numbers[:i + 1]) for i in range(len(numbers)) if sum(numbers[:i + 1]) &amp;gt; n)&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;next(조건, 기본값)&lt;/b&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;- 조건에 반복자(iter) 를 넣으면 for 문처럼 사용할 수 있음.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1731247029643&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from itertools import accumulate

def find_first_exceeding_sum(numbers, n):
    return next((s for s in accumulate(numbers) if s &amp;gt; n), None)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;accumulate(리스트)&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;- sum 의 반복 호출을 피할 수 있음.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- for 문으로 + 연산을 반복하는 것보다 훨씬 빠른 속도로 연산 가능.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1731247117617&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 앞에서부터 하나씩 더하다가 그 합이 n보다 커지는 순간 리턴

def add_num(numbers, n):
    answer = 0
    for num in numbers:
        answer += num
        if answer &amp;gt; n:
            return answer

'''
return next(sum(numbers[:i + 1]) for i in range(len(numbers)) if sum(numbers[:i + 1]) &amp;gt; n)

from itertools import accumulate
def find_first_exceeding_sum(numbers, n):
    return next((s for s in accumulate(numbers) if s &amp;gt; n), None)
'''

print(add_num([34, 5, 71, 29, 100, 34],	123))   # 139
print(add_num([58, 44, 27, 10, 100],	139))       # 239&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://dojang.io/mod/page/view.php?id=2408&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://dojang.io/mod/page/view.php?id=2408&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1731246934063&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;파이썬 코딩 도장: 39.4 iter, next 함수 활용하기&quot; data-og-description=&quot;이번에는 파이썬 내장 함수 iter, next에 대해 알아보겠습니다. iter는 객체의 __iter__ 메서드를 호출해주고, next는 객체의 __next__ 메서드를 호출해줍니다. 그럼 range(3)에 iter와 next를 사용해보겠습니&quot; data-og-host=&quot;dojang.io&quot; data-og-source-url=&quot;https://dojang.io/mod/page/view.php?id=2408&quot; data-og-url=&quot;https://dojang.io/mod/page/view.php?id=2408&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://dojang.io/mod/page/view.php?id=2408&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://dojang.io/mod/page/view.php?id=2408&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;파이썬 코딩 도장: 39.4 iter, next 함수 활용하기&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;이번에는 파이썬 내장 함수 iter, next에 대해 알아보겠습니다. iter는 객체의 __iter__ 메서드를 호출해주고, next는 객체의 __next__ 메서드를 호출해줍니다. 그럼 range(3)에 iter와 next를 사용해보겠습니&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;dojang.io&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://deok2kim.tistory.com/95&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://deok2kim.tistory.com/95&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1731246942666&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;[python] accumulate(itertools), 누적 합&quot; data-og-description=&quot;  accumulate 뜻으로는 축적하다? 한마디로 누적된 합을 뽑아주는 녀석   사용법 from itertools import accumulate a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] b = list(accumulate(a)) print(a) # [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] print(b) # [&quot; data-og-host=&quot;deok2kim.tistory.com&quot; data-og-source-url=&quot;https://deok2kim.tistory.com/95&quot; data-og-url=&quot;https://deok2kim.tistory.com/95&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cxoQhM/hyXwp8qSoY/L2AtrkrUI7b6VOK2KSPn6k/img.png?width=768&amp;amp;height=768&amp;amp;face=0_0_768_768,https://scrap.kakaocdn.net/dn/dlb6mP/hyXwnCK2ml/yowriQ8kPFxk2cskjMQ5oK/img.png?width=768&amp;amp;height=768&amp;amp;face=0_0_768_768,https://scrap.kakaocdn.net/dn/WUR7f/hyXwqTPFg5/ROyjD0FH5F4DZYuP8NLw31/img.png?width=768&amp;amp;height=768&amp;amp;face=0_0_768_768&quot;&gt;&lt;a href=&quot;https://deok2kim.tistory.com/95&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://deok2kim.tistory.com/95&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cxoQhM/hyXwp8qSoY/L2AtrkrUI7b6VOK2KSPn6k/img.png?width=768&amp;amp;height=768&amp;amp;face=0_0_768_768,https://scrap.kakaocdn.net/dn/dlb6mP/hyXwnCK2ml/yowriQ8kPFxk2cskjMQ5oK/img.png?width=768&amp;amp;height=768&amp;amp;face=0_0_768_768,https://scrap.kakaocdn.net/dn/WUR7f/hyXwqTPFg5/ROyjD0FH5F4DZYuP8NLw31/img.png?width=768&amp;amp;height=768&amp;amp;face=0_0_768_768');&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;[python] accumulate(itertools), 누적 합&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;  accumulate 뜻으로는 축적하다? 한마디로 누적된 합을 뽑아주는 녀석   사용법 from itertools import accumulate a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] b = list(accumulate(a)) print(a) # [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] print(b) # [&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;deok2kim.tistory.com&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;</description>
      <category>Algorithm/Basic</category>
      <category>오블완</category>
      <category>티스토리챌린지</category>
      <author>함s</author>
      <guid isPermaLink="true">https://intheham.tistory.com/196</guid>
      <comments>https://intheham.tistory.com/196#entry196comment</comments>
      <pubDate>Wed, 13 Nov 2024 14:59:07 +0900</pubDate>
    </item>
    <item>
      <title>[Python] Day 14 (3/5) -- list comprehension 조건 걸기</title>
      <link>https://intheham.tistory.com/195</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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;for 문을 한 줄로 작성할 수 있는 리스트 컴프리헨션에서&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;for 문 안에 조건문을 넣고 싶을 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그 때 if 만 쓰거나 if - else 까지 넣고 싶을 수 있다.&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;div style=&quot;background-color: #1e1f22; color: #bcbec4;&quot;&gt;
&lt;pre class=&quot;python&quot; data-ke-language=&quot;python&quot;&gt;&lt;code&gt;return [t for t, r in zip(todo_list, finished) if not r]&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;pre id=&quot;code_1731245002577&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 틀린 문법
return [t if not r else continue for t, r in zip(todo_list, finished)]&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;if 만 쓸 경우에는 for 문 뒤에 적어준다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;참고로,&amp;nbsp; continue, pass 와 같이 반복문 건너뛰는 명령어는 list comprehension 에서 쓸 수 없다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;else 문을 쓰려면 꼭 다른 반환되는 값이 필요하다.&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;pre id=&quot;code_1731245232632&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;[ num if num % 2 == 0 else 0 for num in num_list]&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;list comprehension 을 거치면 자동으로 해당되는 값이 담긴 리스트가 반환된다.&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;pre id=&quot;code_1731245317450&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#  아직 마치지 못한 일들을 순서대로

def todo(todo_list, finished):
    return [t for t, r in zip(todo_list, finished) if not bool(r)]

'''
return [work for idx, work in enumerate(todo_list) if not finished[idx]]

return [x for x, b in zip(todo_list, finished) if not b]
'''
'''
JS
return todo_list.filter((e,i) =&amp;gt; !finished[i]);

Java
for(int i=0; i&amp;lt;finished.length; i++){
    str = finished[i]==false ? str+todo_list[i]+&quot;,&quot; : str;
}
return str.split(&quot;,&quot;);
'''

# [&quot;practiceguitar&quot;, &quot;studygraph&quot;]
print(todo([&quot;problemsolving&quot;, &quot;practiceguitar&quot;, &quot;swim&quot;, &quot;studygraph&quot;],	[True, False, True, False]))&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://wikidocs.net/22805&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://wikidocs.net/22805&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1731244889492&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;1) 리스트 컴프리헨션&quot; data-og-description=&quot;## 리스트 생성하기 기존에 배운 문법으로 1부터 10까지 정수를 순서대로 가지고 있는 리스트를 생성하는코드는 다음과 같습니다. &amp;#96;&amp;#96;&amp;#96; numbers = [] for n i&amp;hellip;&quot; data-og-host=&quot;wikidocs.net&quot; data-og-source-url=&quot;https://wikidocs.net/22805&quot; data-og-url=&quot;https://wikidocs.net/22805&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bvcHty/hyXwq0xDsY/ioHikAqiK0S4tZnRqhpNRk/img.gif?width=99&amp;amp;height=130&amp;amp;face=0_0_99_130,https://scrap.kakaocdn.net/dn/ivNvY/hyXwuBTrnY/TVTPogI9NNKiqCZoic8961/img.png?width=1948&amp;amp;height=706&amp;amp;face=0_0_1948_706,https://scrap.kakaocdn.net/dn/gE21d/hyXwvgvHtz/0X8QrsxVHsS5ZFEa8WTpN1/img.png?width=1884&amp;amp;height=468&amp;amp;face=0_0_1884_468&quot;&gt;&lt;a href=&quot;https://wikidocs.net/22805&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://wikidocs.net/22805&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bvcHty/hyXwq0xDsY/ioHikAqiK0S4tZnRqhpNRk/img.gif?width=99&amp;amp;height=130&amp;amp;face=0_0_99_130,https://scrap.kakaocdn.net/dn/ivNvY/hyXwuBTrnY/TVTPogI9NNKiqCZoic8961/img.png?width=1948&amp;amp;height=706&amp;amp;face=0_0_1948_706,https://scrap.kakaocdn.net/dn/gE21d/hyXwvgvHtz/0X8QrsxVHsS5ZFEa8WTpN1/img.png?width=1884&amp;amp;height=468&amp;amp;face=0_0_1884_468');&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;1) 리스트 컴프리헨션&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;## 리스트 생성하기 기존에 배운 문법으로 1부터 10까지 정수를 순서대로 가지고 있는 리스트를 생성하는코드는 다음과 같습니다. ``` numbers = [] for n i&amp;hellip;&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;wikidocs.net&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://jinmay.github.io/2020/05/28/python/python-list-comprehension-with-if-statement/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://jinmay.github.io/2020/05/28/python/python-list-comprehension-with-if-statement/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1731244930154&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;[python]리스트 컴프리핸션에서 if문 사용하기&quot; data-og-description=&quot;리스트 컴프리핸션(list comprehension)이란 pythonic 하다고 표현되는 대표적인 문법 중에 하나이다. 꽤 간단한 방법으로 리스트를 만들 수 있다는 장점이 있다. 기본적으로 for문을 사용하기 때문에 반&quot; data-og-host=&quot;jinmay.github.io&quot; data-og-source-url=&quot;https://jinmay.github.io/2020/05/28/python/python-list-comprehension-with-if-statement/&quot; data-og-url=&quot;https://jinmay.github.io/2020/05/28/python/python-list-comprehension-with-if-statement/index.html&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://jinmay.github.io/2020/05/28/python/python-list-comprehension-with-if-statement/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://jinmay.github.io/2020/05/28/python/python-list-comprehension-with-if-statement/&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;[python]리스트 컴프리핸션에서 if문 사용하기&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;리스트 컴프리핸션(list comprehension)이란 pythonic 하다고 표현되는 대표적인 문법 중에 하나이다. 꽤 간단한 방법으로 리스트를 만들 수 있다는 장점이 있다. 기본적으로 for문을 사용하기 때문에 반&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;jinmay.github.io&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://itgilajavy.tistory.com/25&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://itgilajavy.tistory.com/25&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1731245182595&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;14. python 반복문 제어하기 - break, continue, pass&quot; data-og-description=&quot;1. continue - continue는 반복문(for, while)에서 아래 code를 실행 시키지 않게 다음 반복 구문으로 넘어가도록 하는 제어자 입니다. - 보통 if구문(조건문)으로 조건에 따라 다음 반복문으로 건너 뛸지를 &quot; data-og-host=&quot;itgilajavy.tistory.com&quot; data-og-source-url=&quot;https://itgilajavy.tistory.com/25&quot; data-og-url=&quot;https://itgilajavy.tistory.com/25&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bhT8KZ/hyXwmDRnbN/6wxytnbSQ8D6VVbKrk6wlK/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/rpFsy/hyXwklIW5O/NNdKqTfNVXZJQKm4w21H51/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/l3JQX/hyXwmDRnaQ/NEwkf8vgVVU3vA7e8HSvZK/img.jpg?width=225&amp;amp;height=225&amp;amp;face=0_0_225_225&quot;&gt;&lt;a href=&quot;https://itgilajavy.tistory.com/25&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://itgilajavy.tistory.com/25&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bhT8KZ/hyXwmDRnbN/6wxytnbSQ8D6VVbKrk6wlK/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/rpFsy/hyXwklIW5O/NNdKqTfNVXZJQKm4w21H51/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/l3JQX/hyXwmDRnaQ/NEwkf8vgVVU3vA7e8HSvZK/img.jpg?width=225&amp;amp;height=225&amp;amp;face=0_0_225_225');&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;14. python 반복문 제어하기 - break, continue, pass&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;1. continue - continue는 반복문(for, while)에서 아래 code를 실행 시키지 않게 다음 반복 구문으로 넘어가도록 하는 제어자 입니다. - 보통 if구문(조건문)으로 조건에 따라 다음 반복문으로 건너 뛸지를&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;itgilajavy.tistory.com&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;</description>
      <category>Algorithm/Basic</category>
      <category>오블완</category>
      <category>티스토리챌린지</category>
      <author>함s</author>
      <guid isPermaLink="true">https://intheham.tistory.com/195</guid>
      <comments>https://intheham.tistory.com/195#entry195comment</comments>
      <pubDate>Tue, 12 Nov 2024 22:06:02 +0900</pubDate>
    </item>
    <item>
      <title>[Python] Day 14 (1/5) -- sum()</title>
      <link>https://intheham.tistory.com/194</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;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1731075284866&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 가장 첫 번째 원소를 1번 원소라고 할 때, 홀수 번째 원소들의 합과 짝수 번째 원소들의 합 중 큰 값을 return

def odd_vs_even(num_list):
    odd, even = 0, 0
    odd = sum(num for num in num_list[1::2])
    even = sum(num for num in num_list[::2])

    return max(odd, even)

'''
return max(sum(num_list[::2]), sum(num_list[1::2]))
'''
'''
JS

num_list.map((val, idx) =&amp;gt; { !(idx % 2) ? even += val : odd += val })
return odd &amp;gt; even ? odd : even;

num_list.forEach((val, idx) =&amp;gt; idx % 2 == 0 ? even += val : odd += val);
return Math.max(odd, even);
'''

print(odd_vs_even([4, 2, 6, 1, 7, 6]))  # 17&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;sum(iterable)&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;즉, sum([1, 2, 3]) 형태로 가능&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;=&amp;gt; 굳이 굳이 for 문을 돌릴 필요가 없다~~~&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;&lt;b&gt;sum(iterable, start = num)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;숫자 순환 변수에 추가로 또 더해줄 num 을 지정할 수 있음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;sum([1, 2, 3], start = 6) == 12&lt;/p&gt;</description>
      <category>Algorithm/Basic</category>
      <category>오블완</category>
      <category>티스토리챌린지</category>
      <author>함s</author>
      <guid isPermaLink="true">https://intheham.tistory.com/194</guid>
      <comments>https://intheham.tistory.com/194#entry194comment</comments>
      <pubDate>Mon, 11 Nov 2024 08:53:08 +0900</pubDate>
    </item>
    <item>
      <title>[Python] Day 13 (5/5) -- (JS) filter</title>
      <link>https://intheham.tistory.com/193</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;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1731074034122&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 첫 번째 원소부터 마지막 원소까지 n개 간격

def interval_n(num_list, n):
    return num_list[::n]

'''
JS
const solution = (num_list, n) =&amp;gt; num_list.filter((_, i) =&amp;gt; !(i % n))

Java
int N = num_list.length % n == 0 ? num_list.length / n : num_list.length / n + 1;
int idx = 0;
int[] answer = new int[N];
for (int i = 0;i &amp;lt; num_list.length;i+=n)
    answer[idx++] = num_list[i];
return answer;
'''

print(interval_n([4, 2, 6, 1, 7, 6],	2))     # [4, 6, 7]&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;배열.filter((callback, index) =&amp;gt; 조건식 )&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;_ 는 쓰이지 않는 매개변수를 뜻함.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;index 자리에는 배열에서 처리중인 현재 요소의 인덱스가 담김.&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;인덱스를 n (간격) 으로 나누었을 때 0 이 나온다는 건 그 간격의 인덱스라는 것.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;! (index % n) 은, 즉, 원하는 간격의 인덱스가 아닌 것을 걸러내자! 는 거다!&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;
&lt;pre id=&quot;code_1731074561325&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;'''
리스트(배열)
# 61) n 번째 원소부터
# 62) 순서 바꾸기
# 63) 왼쪽 오른쪽
# 64) n 번째 원소까지
# 65) n 개 간격의 원소들
'''

# 61) ===================================================================
def from_n(num_list, n):
    return num_list[n-1:]

'''
JS
return num_list.slice(n - 1);
'''

print(from_n([2, 1, 6],	3))             # [6]
print(from_n([5, 2, 1, 7, 5],	2))     # [2, 1, 7, 5]



# 62) ===================================================================
def change_order(num_list, n):
    return num_list[n:] + num_list[:n]

'''
JS
# removing n elements starting from index 0
# The removed elements are returned as an array

num_list.push(...num_list.splice(0, n));
return num_list
'''

print(change_order([2, 1, 6], 1))       # [1, 6, 2]
print(change_order([5, 2, 1, 7, 5],	3)) # [7, 5, 5, 2, 1]


# 63) ===================================================================
# str_list에는 &quot;u&quot;, &quot;d&quot;, &quot;l&quot;, &quot;r&quot; 네 개의 문자열이 여러 개 저장
# &quot;l&quot;과 &quot;r&quot; 중 먼저 나오는 문자 --&amp;gt; &quot;l&quot; 왼쪽 문자열 / &quot;r&quot; 오른쪽 문자열 / 없으면 빈 문자열

def left_right(str_list):
    for i, val in enumerate(str_list):
        if val == &quot;l&quot;:
            return str_list[:i]
        if val == &quot;r&quot;:
            return str_list[i+1:]
    return []

'''
JS
for(let i = 0; i &amp;lt; arr.length; i++) {
     if (arr[i] === 'l') return arr.slice(0, i);
     if (arr[i] === 'r') return arr.slice(i + 1);
 }
 return [];
'''

print(left_right([&quot;u&quot;, &quot;u&quot;, &quot;l&quot;, &quot;r&quot;])) # [&quot;u&quot;, &quot;u&quot;]
print(left_right([&quot;l&quot;]))                # []



# 64) ===================================================================
# num_list의 첫 번째 원소부터 n 번째 원소까지의 모든 원소를 담은 리스트

def to_n(num_list, n):
    return num_list[:n]

'''
JS
return num_list.slice(0, n);

Java
return Arrays.copyOfRange(num_list,0,n);
'''

print(to_n([2, 1, 6],	1))     # [2]


# 65) ===================================================================
# 첫 번째 원소부터 마지막 원소까지 n개 간격

def interval_n(num_list, n):
    return num_list[::n]

'''
JS
const solution = (num_list, n) =&amp;gt; num_list.filter((_, i) =&amp;gt; !(i % n))

Java
int N = num_list.length % n == 0 ? num_list.length / n : num_list.length / n + 1;
int idx = 0;
int[] answer = new int[N];
for (int i = 0;i &amp;lt; num_list.length;i+=n)
    answer[idx++] = num_list[i];
return answer;
'''

print(interval_n([4, 2, 6, 1, 7, 6],	2))     # [4, 6, 7]&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&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;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Array/filter&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Array/filter&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1731074435804&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;Array.prototype.filter() - JavaScript | MDN&quot; data-og-description=&quot;Array 인스턴스의 filter() 메서드는 주어진 배열의 일부에 대한 얕은 복사본을 생성하고, 주어진 배열에서 제공된 함수에 의해 구현된 테스트를 통과한 요소로만 필터링 합니다.&quot; data-og-host=&quot;developer.mozilla.org&quot; data-og-source-url=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Array/filter&quot; data-og-url=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Array/filter&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/br98eU/hyXsY5obB1/Phz1VqYofrnzhHWkqSoeEK/img.png?width=1920&amp;amp;height=1080&amp;amp;face=0_0_1920_1080&quot;&gt;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Array/filter&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Array/filter&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/br98eU/hyXsY5obB1/Phz1VqYofrnzhHWkqSoeEK/img.png?width=1920&amp;amp;height=1080&amp;amp;face=0_0_1920_1080');&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;Array.prototype.filter() - JavaScript | MDN&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Array 인스턴스의 filter() 메서드는 주어진 배열의 일부에 대한 얕은 복사본을 생성하고, 주어진 배열에서 제공된 함수에 의해 구현된 테스트를 통과한 요소로만 필터링 합니다.&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;&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>Algorithm/Basic</category>
      <category>오블완</category>
      <category>티스토리챌린지</category>
      <author>함s</author>
      <guid isPermaLink="true">https://intheham.tistory.com/193</guid>
      <comments>https://intheham.tistory.com/193#entry193comment</comments>
      <pubDate>Sun, 10 Nov 2024 10:57:47 +0900</pubDate>
    </item>
    <item>
      <title>[Python] Day 13 (4/5) -- (Java) Array.copyOfRange</title>
      <link>https://intheham.tistory.com/191</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;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1731073432249&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# num_list의 첫 번째 원소부터 n 번째 원소까지의 모든 원소를 담은 리스트

def to_n(num_list, n):
    return num_list[:n]

'''
JS
return num_list.slice(0, n);

Java
return Arrays.copyOfRange(num_list,0,n);
'''

print(to_n([2, 1, 6],	1))     # [2]&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Arrays.copyOfRange(원본배열, 시작 인덱스, 끝 인덱스)&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;ex)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;String[] arr = new String[] (&quot;a&quot;, &quot;b&quot;, &quot;c&quot;};&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;String[] copy = Arrays.copyOfRange(arr, 0, 3);&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;// copy == {&quot;a&quot;, &quot;b&quot;, &quot;c&quot;, null}&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;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://romcanrom.tistory.com/48&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://romcanrom.tistory.com/48&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1731073809346&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;java/ copyOf(), copyOfRange(), arraycopy() : 배열을 복사하는 메서드&quot; data-og-description=&quot;Arrays 클래스는 배열과 관련된 여러 메서드들을 지원한다. *java.util 패키지에 포함되어 있으므로 Arrays의 메서드들을 사용하기 위해서는 import가 필요하다. import java.util.Arrays; Arrays.copyOf() Arrays.copyO&quot; data-og-host=&quot;romcanrom.tistory.com&quot; data-og-source-url=&quot;https://romcanrom.tistory.com/48&quot; data-og-url=&quot;https://romcanrom.tistory.com/48&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/fFLdg/hyXwjNxvn9/nhSDZMq0E5BWyCUcq6IDuK/img.png?width=65&amp;amp;height=115&amp;amp;face=0_0_65_115,https://scrap.kakaocdn.net/dn/s9OsV/hyXwp1hyXh/eqkS27BRlQcjCdgHGiq4h0/img.png?width=65&amp;amp;height=115&amp;amp;face=0_0_65_115,https://scrap.kakaocdn.net/dn/wqcrp/hyXsUPnygJ/PgKBIsKV06aTaBPNzKBsDK/img.png?width=264&amp;amp;height=200&amp;amp;face=0_0_264_200&quot;&gt;&lt;a href=&quot;https://romcanrom.tistory.com/48&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://romcanrom.tistory.com/48&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/fFLdg/hyXwjNxvn9/nhSDZMq0E5BWyCUcq6IDuK/img.png?width=65&amp;amp;height=115&amp;amp;face=0_0_65_115,https://scrap.kakaocdn.net/dn/s9OsV/hyXwp1hyXh/eqkS27BRlQcjCdgHGiq4h0/img.png?width=65&amp;amp;height=115&amp;amp;face=0_0_65_115,https://scrap.kakaocdn.net/dn/wqcrp/hyXsUPnygJ/PgKBIsKV06aTaBPNzKBsDK/img.png?width=264&amp;amp;height=200&amp;amp;face=0_0_264_200');&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;java/ copyOf(), copyOfRange(), arraycopy() : 배열을 복사하는 메서드&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Arrays 클래스는 배열과 관련된 여러 메서드들을 지원한다. *java.util 패키지에 포함되어 있으므로 Arrays의 메서드들을 사용하기 위해서는 import가 필요하다. import java.util.Arrays; Arrays.copyOf() Arrays.copyO&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;romcanrom.tistory.com&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;</description>
      <category>Algorithm/Basic</category>
      <category>오블완</category>
      <category>티스토리챌린지</category>
      <author>함s</author>
      <guid isPermaLink="true">https://intheham.tistory.com/191</guid>
      <comments>https://intheham.tistory.com/191#entry191comment</comments>
      <pubDate>Sat, 9 Nov 2024 20:24:12 +0900</pubDate>
    </item>
    <item>
      <title>[Python] Day 13 (3/5) 왼쪽오른쪽</title>
      <link>https://intheham.tistory.com/189</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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;text-align: left;&quot;&gt;문자열 리스트&amp;nbsp;&lt;/span&gt;str_list&lt;span style=&quot;text-align: left;&quot;&gt;에는 &quot;u&quot;, &quot;d&quot;, &quot;l&quot;, &quot;r&quot; 네 개의 문자열이 여러 개 저장되어 있습니다.&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;str_list&lt;span style=&quot;text-align: left;&quot;&gt;에서 &quot;l&quot;과 &quot;r&quot; 중 먼저 나오는 문자열이 &quot;l&quot;이라면 해당 문자열을 기준으로 왼쪽에 있는 문자열들을 순서대로 담은 리스트를, &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;text-align: left;&quot;&gt;먼저 나오는 문자열이 &quot;r&quot;이라면 해당 문자열을 기준으로 오른쪽에 있는 문자열들을 순서대로 담은 리스트를 return하도록 &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;text-align: left;&quot;&gt;solution 함수를 완성해주세요. &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;text-align: left;&quot;&gt;&quot;l&quot;이나 &quot;r&quot;이 없다면 빈 리스트를 return합니다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1731072616024&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;def left_right(str_list):
    for i, val in enumerate(str_list):
        if val == &quot;l&quot;:
            return str_list[:i]
        if val == &quot;r&quot;:
            return str_list[i+1:]
    return []

'''
JS
for(let i = 0; i &amp;lt; arr.length; i++) {
     if (arr[i] === 'l') return arr.slice(0, i);
     if (arr[i] === 'r') return arr.slice(i + 1);
 }
 return [];
'''

print(left_right([&quot;u&quot;, &quot;u&quot;, &quot;l&quot;, &quot;r&quot;])) # [&quot;u&quot;, &quot;u&quot;]
print(left_right([&quot;l&quot;]))                # []&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;분명 맞게 접근한 거 같은데 테스트케이스 절반이 틀려서 왜인가 했더니,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;[i:] 라고 했음.&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;</description>
      <category>Algorithm/Basic</category>
      <category>오블완</category>
      <category>티스토리챌린지</category>
      <author>함s</author>
      <guid isPermaLink="true">https://intheham.tistory.com/189</guid>
      <comments>https://intheham.tistory.com/189#entry189comment</comments>
      <pubDate>Fri, 8 Nov 2024 22:34:00 +0900</pubDate>
    </item>
    <item>
      <title>[Python] Day 13 (2/5) -- (JS) splice()</title>
      <link>https://intheham.tistory.com/188</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;너무 간단한 코드여서 한 문제만 올릴 수 없었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다른사람 풀이에서 자바스크립트 코드도 겸사겸사 보고 있는데,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1730984612069&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;num_list.push(...num_list.splice(0, n));&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이건 대체 무슨 코드냐고..&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;a배열.push(&lt;span style=&quot;color: #ee2323;&quot;&gt;...&lt;/span&gt;b배열)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;a배열 끝에 b배열의 값을 하나씩 넣어줌&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;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;배열.&lt;span style=&quot;color: #ee2323;&quot;&gt;splice&lt;/span&gt;(시작인덱스, 범위, 추가)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;원본 배열을 건드림.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특정 범위를 삭제하거나, 새로 추가하거나, 기존 값을 대체할 수 있음.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;splice(시작) : 인덱스부터 전체 삭제&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;splice(시작, 범위) : 인덱스부터 범위까지 삭제&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;splice(시작, 0, 추가) : 인덱스 자리에 값 추가 -- splice(10, 0, a, b)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;splice(시작, 범위, 추가) : 인덱스부터 범위까지 삭제하고 값을 추가 splice(10, 2, a, b) 일종의 값 대체.&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;num_list = [2, 1, 6]&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;n = 1&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;num_list.splice(0, 1) --&amp;gt; num_list[0] 을 잘라냄. 즉, 반환값은 [2] 가 됨.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;splice 는 원본 배열에 변경사항을 바로 반영하니까&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;num_list = [1, 6] 만 남아있음.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;거기에 반환값 [2] 를 push 를 통해 끝에 붙임.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;최종적으로 [1, 6, 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;pre id=&quot;code_1730984570307&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 61) ===================================================================
def from_n(num_list, n):
    return num_list[n-1:]

'''
JS
return num_list.slice(n - 1);
'''

print(from_n([2, 1, 6],	3))             # [6]
print(from_n([5, 2, 1, 7, 5],	2))     # [2, 1, 7, 5]



# 62) ===================================================================
def change_order(num_list, n):
    return num_list[n:] + num_list[:n]

'''
JS
# removing n elements starting from index 0
# The removed elements are returned as an array

num_list.push(...num_list.splice(0, n));
return num_list
'''

print(change_order([2, 1, 6], 1))       # [1, 6, 2]
print(change_order([5, 2, 1, 7, 5],	3)) # [7, 5, 5, 2, 1]&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.daleseo.com/js-array-slice-splice/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.daleseo.com/js-array-slice-splice/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1730985099480&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;자바스크립트 배열의 slice()와 splice() 함수&quot; data-og-description=&quot;Engineering Blog by Dale Seo&quot; data-og-host=&quot;www.daleseo.com&quot; data-og-source-url=&quot;https://www.daleseo.com/js-array-slice-splice/&quot; data-og-url=&quot;https://www.daleseo.com/js-array-slice-splice/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bWpilO/hyXsXFeuCi/V6n19zlbgkXRwQbU6QKkFk/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630&quot;&gt;&lt;a href=&quot;https://www.daleseo.com/js-array-slice-splice/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.daleseo.com/js-array-slice-splice/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bWpilO/hyXsXFeuCi/V6n19zlbgkXRwQbU6QKkFk/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630');&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;자바스크립트 배열의 slice()와 splice() 함수&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Engineering Blog by Dale Seo&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.daleseo.com&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;</description>
      <category>Algorithm/Basic</category>
      <category>오블완</category>
      <category>티스토리챌린지</category>
      <author>함s</author>
      <guid isPermaLink="true">https://intheham.tistory.com/188</guid>
      <comments>https://intheham.tistory.com/188#entry188comment</comments>
      <pubDate>Thu, 7 Nov 2024 22:26:08 +0900</pubDate>
    </item>
    <item>
      <title>[Python] Day 12 -- get(), extend(), list(filter(lambda</title>
      <link>https://intheham.tistory.com/187</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;&lt;b&gt;get(key, default)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;딕셔너리에서 key 로 value 를 불러오는 함수. 값이 없으면 defalut 리턴.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;original.extend(new_list)&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;(+ 연산자 -- 합쳐진 리스트를 새로 반환)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1732020230308&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;list(filter(lambda i: arr[i] == 2, range(len(arr))))&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;list에서 value 로 다중 index 찾기&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;pre id=&quot;code_1730642101962&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;'''
리스트 (배열)
# 56) 리스트 자르기
# 57) 첫 번째로 나오는 음수
# 58) 배열 만들기 3
# 59) 2의 영역
# 60) 배열 조각하기
'''

# 56) ===========================================================================
def cut_list(n, slicer, num_list):
    a, b, c = slicer
    if n == 1: return num_list[:b+1]
    elif n == 2: return num_list[a:]
    elif n == 3: return num_list[a:b+1]
    elif n == 4: return num_list[a:b+1:c]
    return num_list

'''
return [num_list[:b + 1], num_list[a:], num_list[a:b + 1], num_list[a:b + 1:c]][n - 1]

slices = {
    1: num_list[:b+1],
    2: num_list[a:],
    3: num_list[a:b+1],
    4: num_list[a:b+1:c]
}
return slices.get(n, num_list)
'''

# [2, 3, 4, 5, 6]
print(cut_list(3, [1, 5, 2], [1, 2, 3, 4, 5, 6, 7, 8, 9]))


# 57) ===========================================================================
def find_minus(num_list):
    for i, num in enumerate(num_list):
        if num &amp;lt; 0:
            return i
    return -1

'''
JS
const solution = num_list =&amp;gt; num_list.findIndex(v =&amp;gt; v &amp;lt; 0)
'''

print(find_minus([12, 4, 15, 46, 38, -2, 15]))  # 5
print(find_minus([13, 22, 53, 24, 15, 6]))      # -1


# 58) ===========================================================================
def two_arr(arr, intervals):
    answer = []
    for a, b in intervals:
        answer.extend(arr[a:b+1])
    return answer


'''
JS
const [[a,b],[c,d]] = intervals;
return [...arr.slice(a, b+1), ...arr.slice(c, d+1)];
'''

# [2, 3, 4, 1, 2, 3, 4, 5]
print(two_arr([1, 2, 3, 4, 5], [[1, 3], [0, 4]]))


# 59) ===========================================================================
def find_2_range(arr):
    index_list = list(filter(lambda i: arr[i] == 2, range(len(arr))))
    if not index_list:
        return [-1]
    return arr[index_list[0]:index_list[-1]+1]

'''
if 2 not in arr:
    return [-1]
return arr[arr.index(2) : len(arr) - arr[::-1].index(2)]
'''

'''
JS
const from = arr.indexOf(2);
const end = arr.lastIndexOf(2);
return from === -1 ? [-1] : arr.slice(from, end+1);
'''

print(find_2_range([1, 2, 1, 2, 1, 10, 2, 1]))  # [2, 1, 2, 1, 10, 2]
print(find_2_range([1, 2, 1]))      # [2]
print(find_2_range([1, 1, 1]))      # [-1]


# 60) ===========================================================================
# 짝수 -- 인덱스 뒷부분 버리기
# 홀수 -- 인덱스 앞부분 버리기
def cut_arr(arr, query):
    for i, q in enumerate(query):
        if i % 2 == 0:
            arr = arr[:q+1]
        else:
            arr = arr[q:]
    return arr

'''
JS
query.map((v,i)=&amp;gt;i%2?arr.splice(0,v):arr.splice(v+1))
'''

print(cut_arr([0, 1, 2, 3, 4, 5],[4, 1, 2]))    # [1, 2, 3]&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://velog.io/@ash5541/get-get%EB%A9%94%EC%84%9C%EB%93%9C%EB%9E%80&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://velog.io/@ash5541/get-get%EB%A9%94%EC%84%9C%EB%93%9C%EB%9E%80&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1730642325959&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;파이썬 get() get메서드란?&quot; data-og-description=&quot;get() 메서드는 딕셔너리에서 주어진 키(key)에 해당하는 값을 반환하는 메서드입니다.get() 메서드는 두 개의 파라미터를 가질 수 있습니다. 첫 번째 파라미터는 찾고자하는 키(key)이고, 두 번째 파&quot; data-og-host=&quot;velog.io&quot; data-og-source-url=&quot;https://velog.io/@ash5541/get-get%EB%A9%94%EC%84%9C%EB%93%9C%EB%9E%80&quot; data-og-url=&quot;https://velog.io/@ash5541/get-get메서드란&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/zRFVU/hyXsWZsnwE/8KYCyLsLkmJ7T5ErRN4Ql1/img.png?width=950&amp;amp;height=500&amp;amp;face=0_0_950_500,https://scrap.kakaocdn.net/dn/XYqmc/hyXs10Lpdo/789GZcBXTdKmyi4ohAJtE0/img.png?width=214&amp;amp;height=214&amp;amp;face=0_0_214_214&quot;&gt;&lt;a href=&quot;https://velog.io/@ash5541/get-get%EB%A9%94%EC%84%9C%EB%93%9C%EB%9E%80&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://velog.io/@ash5541/get-get%EB%A9%94%EC%84%9C%EB%93%9C%EB%9E%80&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/zRFVU/hyXsWZsnwE/8KYCyLsLkmJ7T5ErRN4Ql1/img.png?width=950&amp;amp;height=500&amp;amp;face=0_0_950_500,https://scrap.kakaocdn.net/dn/XYqmc/hyXs10Lpdo/789GZcBXTdKmyi4ohAJtE0/img.png?width=214&amp;amp;height=214&amp;amp;face=0_0_214_214');&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;파이썬 get() get메서드란?&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;get() 메서드는 딕셔너리에서 주어진 키(key)에 해당하는 값을 반환하는 메서드입니다.get() 메서드는 두 개의 파라미터를 가질 수 있습니다. 첫 번째 파라미터는 찾고자하는 키(key)이고, 두 번째 파&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;velog.io&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;a href=&quot;https://splayer.tistory.com/15&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://splayer.tistory.com/15&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1730642155276&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;Python 두개 리스트를 하나로 합치기&quot; data-og-description=&quot;리스트 두 개를 하나의 리스트로 합치는 방법에 대해서 알아보겠습니다. + 연산자를 사용하는 방법 기본적인 방법으로 아래와 같이 + 연산자를 사용하여 2개의 리스트를 합칠 수 있습니다. + 연&quot; data-og-host=&quot;splayer.tistory.com&quot; data-og-source-url=&quot;https://splayer.tistory.com/15&quot; data-og-url=&quot;https://splayer.tistory.com/15&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/wzh6X/hyXs0tZ9WV/cuUHnQ27APSY31o7yyx3I1/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/2gDzd/hyXpuDvrN1/Xn6i6KWEz6tyog3JvLMHlk/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800&quot;&gt;&lt;a href=&quot;https://splayer.tistory.com/15&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://splayer.tistory.com/15&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/wzh6X/hyXs0tZ9WV/cuUHnQ27APSY31o7yyx3I1/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/2gDzd/hyXpuDvrN1/Xn6i6KWEz6tyog3JvLMHlk/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800');&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;Python 두개 리스트를 하나로 합치기&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;리스트 두 개를 하나의 리스트로 합치는 방법에 대해서 알아보겠습니다. + 연산자를 사용하는 방법 기본적인 방법으로 아래와 같이 + 연산자를 사용하여 2개의 리스트를 합칠 수 있습니다. + 연&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;splayer.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://bill1224.tistory.com/228&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://bill1224.tistory.com/228&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1730642164486&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;[ python ] list 에서 value 값으로 다중 index 찾기&quot; data-og-description=&quot;result = [1,2,3,4,5,3] result 라는 list 에서 원소값이 3인 index번호를 알고 싶을 때는??! print(test_list.index(3)) index() 를 사용하게되면 list안에 중복된 value가 있을 때에는 index 번호가 빠른 것만 결가값이 나&quot; data-og-host=&quot;bill1224.tistory.com&quot; data-og-source-url=&quot;https://bill1224.tistory.com/228&quot; data-og-url=&quot;https://bill1224.tistory.com/228&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/jneaT/hyXsSir6Al/00lUUQHhpipxChd3IH81wK/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/bSSzE4/hyXs4iR5Tg/acIrb27OpIOI7SNqNBibD0/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800&quot;&gt;&lt;a href=&quot;https://bill1224.tistory.com/228&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://bill1224.tistory.com/228&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/jneaT/hyXsSir6Al/00lUUQHhpipxChd3IH81wK/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/bSSzE4/hyXs4iR5Tg/acIrb27OpIOI7SNqNBibD0/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800');&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;[ python ] list 에서 value 값으로 다중 index 찾기&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;result = [1,2,3,4,5,3] result 라는 list 에서 원소값이 3인 index번호를 알고 싶을 때는??! print(test_list.index(3)) index() 를 사용하게되면 list안에 중복된 value가 있을 때에는 index 번호가 빠른 것만 결가값이 나&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;bill1224.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://dojang.io/mod/page/view.php?id=2360&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://dojang.io/mod/page/view.php?id=2360&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1730642185551&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;파이썬 코딩 도장: 32.2 람다 표현식과 map, filter, reduce 함수 활용하기&quot; data-og-description=&quot;람다 표현식 작성 방법을 알아보았으니 이번에는 람다 표현식과 map, filter, reduce 함수를 함께 사용해보겠습니다. 32.2.1&amp;nbsp; 람다 표현식에 조건부 표현식 사용하기 먼저 람다 표현식에서 조건부 표&quot; data-og-host=&quot;dojang.io&quot; data-og-source-url=&quot;https://dojang.io/mod/page/view.php?id=2360&quot; data-og-url=&quot;https://dojang.io/mod/page/view.php?id=2360&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/Ps1pL/hyXsWSFrrH/qAVqKmyyGvFqeflb3VoMa0/img.png?width=960&amp;amp;height=720&amp;amp;face=0_0_960_720,https://scrap.kakaocdn.net/dn/bXDZ9n/hyXsZhxVKD/dsDW98cm7ksz4bmQaHOqSK/img.png?width=960&amp;amp;height=720&amp;amp;face=0_0_960_720,https://scrap.kakaocdn.net/dn/cdMfNr/hyXsPF1neL/pnuTJ6MxQAKWqyXktJv9ik/img.png?width=960&amp;amp;height=720&amp;amp;face=0_0_960_720&quot;&gt;&lt;a href=&quot;https://dojang.io/mod/page/view.php?id=2360&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://dojang.io/mod/page/view.php?id=2360&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/Ps1pL/hyXsWSFrrH/qAVqKmyyGvFqeflb3VoMa0/img.png?width=960&amp;amp;height=720&amp;amp;face=0_0_960_720,https://scrap.kakaocdn.net/dn/bXDZ9n/hyXsZhxVKD/dsDW98cm7ksz4bmQaHOqSK/img.png?width=960&amp;amp;height=720&amp;amp;face=0_0_960_720,https://scrap.kakaocdn.net/dn/cdMfNr/hyXsPF1neL/pnuTJ6MxQAKWqyXktJv9ik/img.png?width=960&amp;amp;height=720&amp;amp;face=0_0_960_720');&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;파이썬 코딩 도장: 32.2 람다 표현식과 map, filter, reduce 함수 활용하기&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;람다 표현식 작성 방법을 알아보았으니 이번에는 람다 표현식과 map, filter, reduce 함수를 함께 사용해보겠습니다. 32.2.1&amp;nbsp; 람다 표현식에 조건부 표현식 사용하기 먼저 람다 표현식에서 조건부 표&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;dojang.io&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Algorithm/Basic</category>
      <author>함s</author>
      <guid isPermaLink="true">https://intheham.tistory.com/187</guid>
      <comments>https://intheham.tistory.com/187#entry187comment</comments>
      <pubDate>Sun, 3 Nov 2024 23:02:27 +0900</pubDate>
    </item>
    <item>
      <title>[Python] Day 11 -- ord(), not in, index(val, start)</title>
      <link>https://intheham.tistory.com/186</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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;list_1 = [0] * 52&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;list_2 = [[0] * w for _ in range(h)}&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;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;ord(값)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;값을 10진수 유니코드 값으로 출력 (아스키 코드로 변환)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;A = 65&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;if val &lt;b&gt;not in&lt;/b&gt; list&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;list 에 val 가 들어있지 않은 경우 가정&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-- 자바스크립트에서는 if(!(val in list)) 이런식으로 씀&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1730377916651&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;'''
리스트(배열)
# 51) 문자 개수 세기
# 52) 배열 만들기 1
# 53) 글자 지우기
# 54) 카운트 다운
# 55) 가까운 1 찾기
'''

# 51) ===========================================================================
# A의 개수 ~ z의 개수 == 총 52개의 정수 배열

def count_alphabet(my_string):
    answer = [0 for _ in range(58)]
    for char in my_string:
        answer[ord(char)-65] += 1
    return answer[:26] + answer[32:]

'''
answer=[0]*52
for x in my_string:
    if x.isupper():
        answer[ord(x)-65]+=1
    else:
        answer[ord(x)-71]+=1
return answer


answer = []
alphabet = &quot;ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz&quot;
for i in alphabet:
    answer.append(len(my_string.split(i))-1)
return answer


return [my_string.count(alphabet) for alphabet in 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz']
'''

# [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 2, 0, 1, 0, 0, 3, 1, 0, 0, 0, 0, 0, 0, 0]
print(count_alphabet(&quot;Programmers&quot;))


# 52) ===========================================================================
# 1 이상 n이하의 정수 중에서 k의 배수를 오름차순으로 저장한 배열
def make_arr(n, k):
    return [i for i in range(k, n+1, k)]

'''
return list(range(k, n + 1, k))
'''

print(make_arr(10,	3))     # [3, 6, 9]


# 53) ===========================================================================

def remove_char(my_string, indices):
    answer = list(my_string)

    for index in indices:
        answer[index] = ''

    return ''.join(answer)

'''
# 인덱스 없는 글자를 이어붙임
return &quot;&quot;.join([v for i,v in enumerate(my_string) if i not in indices])

# 인덱스를 내림차순 정렬 후 뒤에서부터 리스트 값 삭제
my_string = list(my_string)
for i in sorted(indices, reverse=True):
    del my_string[i]
return ''.join(my_string)
'''

# &quot;programmers&quot;
print(remove_char(&quot;apporoograpemmemprs&quot;,	[1, 16, 6, 15, 0, 10, 11, 3]))


# 54) ===========================================================================
# start_num에서 end_num까지 1씩 감소하는 수
def countdown(start_num, end_num):
    return list(range(start_num, end_num-1, -1))

print(countdown(10, 3))     # [10, 9, 8, 7, 6, 5, 4, 3]


# 55) ===========================================================================

def near_one(arr, idx):
    for i in range(idx, len(arr)):
        if arr[i] == 1:
            return i
    return -1

'''
answer = 0
try:
    answer = arr.index(1, idx)
except:
    answer = -1
return answer
'''


print(near_one([0, 0, 0, 1], 1))            # 3
print(near_one([1, 0, 0, 1, 0, 0],	4))     # -1
print(near_one([1, 1, 1, 1, 0],	3))         # 3&lt;/code&gt;&lt;/pre&gt;</description>
      <category>Algorithm/Basic</category>
      <author>함s</author>
      <guid isPermaLink="true">https://intheham.tistory.com/186</guid>
      <comments>https://intheham.tistory.com/186#entry186comment</comments>
      <pubDate>Thu, 31 Oct 2024 21:39:23 +0900</pubDate>
    </item>
    <item>
      <title>[Python] Day 10 -- 문자열 슬라이싱</title>
      <link>https://intheham.tistory.com/185</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;수학적 사고가 정말 중요하다...&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1730202633975&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;'''
문자열
# 46) 문자열의 앞의 n글자
# 47) 접두사인지 확인하기
# 48) 문자열 뒤집기
# 49) 세로 읽기
# 50) qr code
'''

# 46)===============================================================

def return_nlen_str(my_string, n):
    return my_string[:n]

print(return_nlen_str(&quot;ProgrammerS123&quot;, 11))    # &quot;ProgrammerS&quot;


# 47)===============================================================

def check_perfix(my_string, is_prefix):
    return int(my_string.startswith(is_prefix))

print(check_perfix(&quot;banana&quot;,	&quot;ban&quot;))     # 1

'''
return int(my_string[:len(is_prefix)] == is_prefix)
'''


# 48)===============================================================

def reverse_part(my_string, s, e):
    return my_string[:s] + my_string[s:e+1][::-1] + my_string[e+1:]

print(reverse_part(&quot;Progra21Sremm3&quot;,	6,	12))    # &quot;ProgrammerS123&quot;


# 49)===============================================================
# my_string을 한 줄에 m 글자씩 가로로 적었을 때 왼쪽부터 세로로 c번째 열에 적힌 글자들

def vertical_str(my_string, m, c):
    return my_string[c-1::m]

print(vertical_str(&quot;ihrhbakrfpndopljhygc&quot;,	4,	2)) # &quot;happy&quot;


# 50)===============================================================
# code의 각 인덱스를 q로 나누었을 때 나머지가 r인 위치의 문자

def QRCode(q, r, code):
    return ''.join(char if idx % q == r else '' for idx, char in enumerate(code))

'''
# index = x * q + r 임을 알 수 있고, 우리가 필요한 index는 [0q+r, 1q+r, 2q+r... xq+r]입니다. 
# 즉 [r, q+r, 2q+r... xq+r]임을 알 수있고, r로 시작해서 q씩 커지는 index만 가져오면 됩니다 :)
return code[r::q]
'''

print(QRCode(3,	1,	&quot;qjnwezgrpirldywt&quot;))    # jerry
print(QRCode(1,	0,	&quot;programmers&quot;))         # programmers&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://spirit0833.tistory.com/5&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://spirit0833.tistory.com/5&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1730202866120&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;[Python] 문자열 인덱싱 (Indexing) &amp;amp; 슬라이싱 (Slicing)&quot; data-og-description=&quot;해당 글은 문자열 인덱싱과 문자열 슬라이싱에 대한 개념과 활용 예제에 대해 자세하게 소개한 글입니다.&amp;nbsp;1) 문자열 인덱싱 (indexing)타 언어에서는 문자열 인덱스 번호가 0부터 시작합니다. 하지&quot; data-og-host=&quot;spirit0833.tistory.com&quot; data-og-source-url=&quot;https://spirit0833.tistory.com/5&quot; data-og-url=&quot;https://spirit0833.tistory.com/5&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cRS9FL/hyXpr6M5ED/pL5ygiWZkPx0Opabd4MezK/img.jpg?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/eftL4v/hyXprFI9LF/OrQpQgqI1mcKkbyjvayhh1/img.jpg?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800&quot;&gt;&lt;a href=&quot;https://spirit0833.tistory.com/5&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://spirit0833.tistory.com/5&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cRS9FL/hyXpr6M5ED/pL5ygiWZkPx0Opabd4MezK/img.jpg?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/eftL4v/hyXprFI9LF/OrQpQgqI1mcKkbyjvayhh1/img.jpg?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800');&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;[Python] 문자열 인덱싱 (Indexing) &amp;amp; 슬라이싱 (Slicing)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;해당 글은 문자열 인덱싱과 문자열 슬라이싱에 대한 개념과 활용 예제에 대해 자세하게 소개한 글입니다.&amp;nbsp;1) 문자열 인덱싱 (indexing)타 언어에서는 문자열 인덱스 번호가 0부터 시작합니다. 하지&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;spirit0833.tistory.com&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.tistory.com/event/write-challenge-2024&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.tistory.com/event/write-challenge-2024&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1730202899141&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;작심삼주 오블완 챌린지&quot; data-og-description=&quot;오늘 블로그 완료! 21일 동안 매일 블로그에 글 쓰고 글력을 키워보세요.&quot; data-og-host=&quot;www.tistory.com&quot; data-og-source-url=&quot;https://www.tistory.com/event/write-challenge-2024&quot; data-og-url=&quot;https://www.tistory.com/event/write-challenge-2024&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bHYJvI/hyXpCtAc8O/sXT9f4wZ3OVjczcAnt4Bzk/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/sRMNH/hyXpqfAyMr/0xt33xjKCe57qcyRKMisQK/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/zIjMx/hyXprr2qaz/PE3u3N41MgQRGR07NEnwkk/img.png?width=1080&amp;amp;height=1719&amp;amp;face=0_0_1080_1719&quot;&gt;&lt;a href=&quot;https://www.tistory.com/event/write-challenge-2024&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.tistory.com/event/write-challenge-2024&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bHYJvI/hyXpCtAc8O/sXT9f4wZ3OVjczcAnt4Bzk/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/sRMNH/hyXpqfAyMr/0xt33xjKCe57qcyRKMisQK/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/zIjMx/hyXprr2qaz/PE3u3N41MgQRGR07NEnwkk/img.png?width=1080&amp;amp;height=1719&amp;amp;face=0_0_1080_1719');&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;작심삼주 오블완 챌린지&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;오늘 블로그 완료! 21일 동안 매일 블로그에 글 쓰고 글력을 키워보세요.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.tistory.com&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;</description>
      <category>Algorithm/Basic</category>
      <author>함s</author>
      <guid isPermaLink="true">https://intheham.tistory.com/185</guid>
      <comments>https://intheham.tistory.com/185#entry185comment</comments>
      <pubDate>Tue, 29 Oct 2024 20:55:07 +0900</pubDate>
    </item>
  </channel>
</rss>