<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>코딩 공부하는 공삼이</title>
    <link>https://study3.tistory.com/</link>
    <description></description>
    <language>ko</language>
    <pubDate>Thu, 21 May 2026 06:52:44 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>공삼이</managingEditor>
    <image>
      <title>코딩 공부하는 공삼이</title>
      <url>https://tistory1.daumcdn.net/tistory/5146654/attach/f708643102b2474b86f3d900e1412472</url>
      <link>https://study3.tistory.com</link>
    </image>
    <item>
      <title>[js/react] 공유하기 기능, 어떤 기술을 써야할까? 1편 - web share api</title>
      <link>https://study3.tistory.com/11</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;664&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bUT6Vx/btsh9BOPR7l/FKCpb3j0ax001WunbC8Zyk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bUT6Vx/btsh9BOPR7l/FKCpb3j0ax001WunbC8Zyk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bUT6Vx/btsh9BOPR7l/FKCpb3j0ax001WunbC8Zyk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbUT6Vx%2Fbtsh9BOPR7l%2FFKCpb3j0ax001WunbC8Zyk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1280&quot; height=&quot;664&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;664&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프로젝트 진행 중 공유하기 기능이 필요했다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #009a87;&quot;&gt;&lt;b&gt;필요 기능: url 링크 복사 &amp;amp; 카카오톡 공유 &amp;amp; 트위터 공유&lt;/b&gt;&lt;/span&gt;&lt;/p&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;기술적으로 구현할 수 있는 방법은 크게 두가지이다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;Web Share API&lt;/li&gt;
&lt;li&gt;모달창으로 자체 구현&lt;/li&gt;
&lt;/ol&gt;
&lt;h1&gt;1. web share api&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/API/Web_Share_API&quot;&gt;mdn 공식문서 보기&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;OS에 내장되어 있는 공유 매커니즘을 사용해서 텍스트, 링크, 파일 등을 공유할 수 있게 해주는 API이다.&lt;br /&gt;주의할 점은 이 API는 HTTPS에서만 작동하며, HTTP에서는 작동하지 않는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://velog.velcdn.com/images/big9138/post/90c732dc-12cf-4307-8451-c02372145011/image.jpg&quot; alt=&quot;&quot; width=&quot;569&quot; height=&quot;662&quot; /&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;아이폰에서의 작동 모습&lt;/i&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;Web share api는 딱 &lt;b&gt;두가지 메서드&lt;/b&gt;가 있다!&lt;br /&gt;데이터가 공유 가능한지를 알려주는 것과, 실제로 공유를 하는 것 이렇게 두가지이다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1-1. navigator.canShare()&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/API/Navigator/canShare&quot;&gt;mdn 공식문서 보기&lt;/a&gt;&lt;br /&gt;첫번째 메서드 canshare이다.&lt;br /&gt;canShare은 공유가 가능하다면 true를 반환한다.&lt;br /&gt;반면 데이터가 공유 불가능하다면 false를 반환한다.&lt;/p&gt;
&lt;pre class=&quot;nix&quot;&gt;&lt;code&gt;let shareData = {
  title: &quot;MDN&quot;,
  text: &quot;Learn web development on MDN!&quot;,
  url: &quot;https://developer.mozilla.org&quot;,
};

const resultPara = document.querySelector(&quot;.result&quot;);

if (!navigator.canShare) {
  resultPara.textContent = &quot;navigator.canShare() not supported.&quot;;
} else if (navigator.canShare(shareData)) {
  resultPara.textContent =
    &quot;navigator.canShare() supported. We can use navigator.share() to send the data.&quot;;
} else {
  resultPara.textContent = &quot;Specified data cannot be shared.&quot;;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;https://velog.velcdn.com/images/big9138/post/fa587937-6f05-4a45-b0a5-ce55e860bb7d/image.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1-2. navigator.share()&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실제 공유하기 기능을 사용할 때 필요한 메서드이다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Parameters&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;data : 공유할 데이터가 담긴 객체. 아래의 필드들 중 적어도 하나는 명시되어야 한다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;url: 공유될 URL을 나타내는 USVString.&lt;/li&gt;
&lt;li&gt;text: 공유될 본문을 나타내는 USVString.&lt;/li&gt;
&lt;li&gt;title: 공유될 제목을 나타내는 USVString.&lt;/li&gt;
&lt;/ol&gt;
&lt;pre class=&quot;less&quot;&gt;&lt;code&gt;navigator.share({
  title: document.title,
  text: 'Hello World',
  url: 'https://developer.mozilla.org',
}); // share the URL of MDN
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;https://velog.velcdn.com/images/big9138/post/017cb52f-a9a3-4915-acd3-2cf2a81ab2e4/image.png&quot; alt=&quot;mdn 공식문서 보기&quot; /&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;대부분의 브라우저에서 지원하지만, &lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;웹뷰 안드로이드에서 지원을 하지 않는다 ....!! (&lt;/b&gt;&lt;/span&gt;ㅠㅠ)&lt;br /&gt;진행 중인 프로젝트가 소셜을 중심으로 바이럴하는 것이 목적이기에,&lt;br /&gt;안드로이드 폰의 인스타, 카카오톡 등에서도 공유하기가 작동해야한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;공유하기 기능을 사용하기 위한 자바스크립트 코드는 아래와 같다.&lt;/p&gt;
&lt;pre class=&quot;dart&quot;&gt;&lt;code&gt;const shareData = {
  title: &quot;MDN&quot;,
  text: &quot;Learn web development on MDN!&quot;,
  url: &quot;https://developer.mozilla.org&quot;,
};

const btn = document.querySelector(&quot;button&quot;);
const resultPara = document.querySelector(&quot;.result&quot;);

// Share must be triggered by &quot;user activation&quot;
btn.addEventListener(&quot;click&quot;, async () =&amp;gt; {
  try {
    await navigator.share(shareData);
    resultPara.textContent = &quot;MDN shared successfully&quot;;
  } catch (err) {
    resultPara.textContent = `Error: ${err}`;
  }
});
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://mdn.github.io/dom-examples/web-share/&quot;&gt;위 코드 작동 예시 확인하기&lt;/a&gt;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1-3. 장점과 단점&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;web share api는 mdn 자체 api로, 간단한 코드로 os 기반 기능을 구현할 수 있다는 점이 장점이다.&lt;br /&gt;각 브라우저에 맞추어 팝업이 뜨니, 복잡한 구현 없이 공유 버튼만 있다면 손쉽게 구현할 수 있다.&lt;br /&gt;그러나 단점은 지원하지 않는 브라우저가 있다는 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또한 카카오톡 공유를 했을 때 자체적으로 템플릿을 만드는 것은 불가하고 링크만 보내진다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;648&quot; data-origin-height=&quot;460&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/oo5AA/btsh9BOPNni/Pdhn9to2QOBoVDxqc69wNK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/oo5AA/btsh9BOPNni/Pdhn9to2QOBoVDxqc69wNK/img.png&quot; data-alt=&quot;web share api 사용했을 때 모습&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/oo5AA/btsh9BOPNni/Pdhn9to2QOBoVDxqc69wNK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Foo5AA%2Fbtsh9BOPNni%2FPdhn9to2QOBoVDxqc69wNK%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;648&quot; height=&quot;460&quot; data-origin-width=&quot;648&quot; data-origin-height=&quot;460&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;web share api 사용했을 때 모습&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h1&gt;2. 모달창으로 자체 구현&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위와 같은 한계점으로 우리는 모달창으로 공유하기 기능을 자체 구현하기로 결정했다.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://velog.velcdn.com/images/big9138/post/14587007-36de-4ca8-aa6f-03c94b2d5ed6/image.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 처럼 url 복사와, 소셜 공유를 한번에 가지고 있는 모달 창을 띄울 계획이다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2-1. 카카오톡 공유하기 api&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이를 위해서는 카카오톡 공유하기 api를 받아와야 한다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2-2. 트위터 공유하기 api&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;트위터 공유하기 api도 받아와야한다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2-3. 장점과 단점&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;시간이 오래걸리고 구현이 복잡해진다.&lt;br /&gt;그러나 서비스에 맞게 커스텀해서 사용할 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;564&quot; data-origin-height=&quot;756&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cTilLG/btsh40VTSxa/mJ85NSyt1fyFYRHIK5OFjk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cTilLG/btsh40VTSxa/mJ85NSyt1fyFYRHIK5OFjk/img.png&quot; data-alt=&quot;카카오톡 공유하기 api 사용한 모습&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cTilLG/btsh40VTSxa/mJ85NSyt1fyFYRHIK5OFjk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcTilLG%2Fbtsh40VTSxa%2FmJ85NSyt1fyFYRHIK5OFjk%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;437&quot; height=&quot;586&quot; data-origin-width=&quot;564&quot; data-origin-height=&quot;756&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;카카오톡 공유하기 api 사용한 모습&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;i&gt;각각은 새로운 게시글로 계속 연재하도록 하겠다!&lt;/i&gt;&lt;/h4&gt;</description>
      <category>JavaScript</category>
      <category>API</category>
      <category>JavaScript</category>
      <category>react</category>
      <category>web share api</category>
      <category>공유하기</category>
      <category>공유하기 기능 구현</category>
      <category>소셜공유</category>
      <category>카카오 공유하기</category>
      <category>프로젝트</category>
      <author>공삼이</author>
      <guid isPermaLink="true">https://study3.tistory.com/11</guid>
      <comments>https://study3.tistory.com/11#entry11comment</comments>
      <pubDate>Wed, 31 May 2023 12:23:49 +0900</pubDate>
    </item>
    <item>
      <title>[CS스터디] 디자인 패턴 - 팩토리 패턴 (factory pattern)</title>
      <link>https://study3.tistory.com/10</link>
      <description>&lt;h1 style=&quot;color: #000000; text-align: start;&quot;&gt;팩토리 패턴 factory&lt;/h1&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;팩토리 패턴은 객체를 사용하는 코드에서&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;객체 생성 부분을 떼어내 추상화&lt;/b&gt;한 패턴이자 상속 관계에 있는 두 클래스에서&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;상위 클래스가 중요한 뼈대를 결정하고, 하위 클래스에서 객체 생성에 관한 구체적인 내용을 결정&lt;/b&gt;하는 패턴입니다.&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;상위클래스, 하위클래스가 분리되어 느슨한 결합을 가지며 상위 클래스에서는 인스턴스 생성 방식에 대해 전혀 알 필요가 없기 때문에 더 많은 유연성을 갖게 된다.&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;객체 생성 로직이 따로 떼어져 있기 때문에 코드를 리팩터링하더라도 한 곳만 고칠 수 잇게 되니 유지 보수성이 증가.&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;상위 클래스 : 레시피 같은 거!!! 라떼 레시피, 아메리카노 레시피,,,&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;하위 클래스 : 레시피 토대로 생산하는 공장 같은 거!!&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;자바스크립트&lt;/h2&gt;
&lt;pre class=&quot;delphi&quot; style=&quot;color: #000000; text-align: start;&quot;&gt;&lt;code&gt;const num = new Object(42)
const str = new Object('abc')
num.constructor.name; //Number
str.constructor.name; //String
&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;숫자를 전달하거나 문자열을 전달함에 따라 다른 타입의 객체를 만든다.&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;전달 받은 값에 따라 다른 객체를 생성하며, 인스턴스의 타입 등을 정한다.&lt;/p&gt;
&lt;pre class=&quot;javascript&quot; style=&quot;color: #000000; text-align: start;&quot;&gt;&lt;code&gt;class Latte{
	constructor() {
		this.name = &quot;latte&quot;
	}
}

class Espresso {
	constructor() {
		this.name = &quot;Espresso&quot;
	}
}

class LatteFactory {
	static createCoffee(){
		return new Latte()
	}
{

class EspressoFactory {
	static createCoffee(){
		return new Espresso()
	}
}

const factoryList = {LatteFactory, EspressoFactory}

class CoffeeFactory {  //상위 클래스
	static createCoffee(type){
		const factory = factoryList[type]
		return factory.createCoffee()
	}
}

const main = () =&amp;gt; {
	//라떼 커피를 주문한다.
	const coffee = CoffeFactory.createCoffee(&quot;LatteFactory&quot;)
	//커피 이름을 부른다.
	console.log(coffee.name) //latte
}

main()
&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;CoffeeFactory라는 상위 클래스가 뼈대 결정.&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;하위 클래스 LatteFactory가 구체적인 내용 결정.&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;의존성 주입이라고도 볼 수 있다. 왜냐?? 상위 클래스에서 하위클래스의 인스턴스를 생성하는 것이 아니라, 하위 클래스에서 생성한 인스턴스를 상위 클래스에 주입하고 있음!&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;CoffeeFactory를 보면 static으로 createCoffee()라는 정적 메서드를 정의하고 있다. 정적 메서드를 쓰면 클래스의 인스턴스 없이 호출이 가능하여 메모리 절약이 가능. 개별 인스턴스에 묶이지 않으며 클래스 내의 함수를 정의할 수 있는 장점이 있다.&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;자바&lt;/h2&gt;
&lt;pre class=&quot;java&quot; style=&quot;color: #000000; text-align: start;&quot;&gt;&lt;code&gt;abstract class Coffee { 
    public abstract int getPrice(); 
    
    @Override
    public String toString(){
        return &quot;Hi this coffee is &quot;+ this.getPrice();
    }
}

class CoffeeFactory { 
    public static Coffee getCoffee(String type, int price){
        if(&quot;Latte&quot;.equalsIgnoreCase(type)) return new Latte(price);
        else if(&quot;Americano&quot;.equalsIgnoreCase(type)) return new Americano(price);
        else{
            return new DefaultCoffee();
        } 
    }
}
class DefaultCoffee extends Coffee {
    private int price;

    public DefaultCoffee() {
        this.price = -1;
    }

    @Override
    public int getPrice() {
        return this.price;
    }
}
class Latte extends Coffee { 
    private int price; 
    
    public Latte(int price){
        this.price=price; 
    }
    @Override
    public int getPrice() {
        return this.price;
    } 
}
class Americano extends Coffee { 
    private int price; 
    
    public Americano(int price){
        this.price=price; 
    }
    @Override
    public int getPrice() {
        return this.price;
    } 
} 
public class HelloWorld{ 
     public static void main(String []args){ 
        Coffee latte = CoffeeFactory.getCoffee(&quot;Latte&quot;, 4000);
        Coffee ame = CoffeeFactory.getCoffee(&quot;Americano&quot;,3000); 
        System.out.println(&quot;Factory latte ::&quot;+latte);
        System.out.println(&quot;Factory ame ::&quot;+ame); 
     }
} 
/*
Factory latte ::Hi this coffee is 4000
Factory ame ::Hi this coffee is 3000
*/
&lt;/code&gt;&lt;/pre&gt;</description>
      <category>CS (Computer Science)</category>
      <category>cs스터디</category>
      <category>디자인패턴</category>
      <category>팩토리패턴</category>
      <author>공삼이</author>
      <guid isPermaLink="true">https://study3.tistory.com/10</guid>
      <comments>https://study3.tistory.com/10#entry10comment</comments>
      <pubDate>Mon, 3 Apr 2023 17:13:32 +0900</pubDate>
    </item>
    <item>
      <title>[CS스터디] 디자인 패턴 - 싱글톤 패턴 (singleton pattern)</title>
      <link>https://study3.tistory.com/9</link>
      <description>&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;내용출처: 면접을 위한 CS 전공지식 노트&lt;span style=&quot;text-align: start;&quot;&gt;디자인 패턴, 운영체제, 데이터베이스, 자료 구조, 네트워크, 개발자 면접&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; color: #000000; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;
&lt;div style=&quot;color: #777777;&quot;&gt;저자&amp;nbsp;&lt;span&gt;주홍철&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;div style=&quot;color: #777777;&quot;&gt;출판&amp;nbsp;&lt;span&gt;길벗&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;div style=&quot;color: #777777;&quot;&gt;발행&amp;nbsp;&lt;span&gt;2022.04.28.&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;디자인 패턴이란?&lt;/h2&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;프로그램을 설계할 때 발생했던 문제점들을 객체 간의 상호 관계 등을 이용하여 해결할 수 있도록 하나의 규약 형태로 만들어놓은 것.&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;1.1.1 싱글톤 패턴 - singleton pattern&lt;/h2&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;하나의 클래스에 단 하나의 인스턴스만 가지는 패턴.&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;하나의 인스턴스를 만들어놓고 해당 인스턴스를 다른 모듈들이 공유하며 사용하기 때문에 인스턴스를 생성할 때 드는 비용이 줄어드는 장점, 의존성이 높아진다는 단점이 있다.&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;자바스크립트&lt;/h3&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;자바스크립트는 리터럴 {} 또는 new Object로 객체를 생성하게 되면 다른 어떤 객체와도 같지 않기 때문에 이 자체만으로 싱글 톤 패턴을 구현할 수 있다.&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot; style=&quot;color: #000000; text-align: start;&quot;&gt;&lt;code&gt;const obj = {
	a: 27
}
const obj2 = {
	a: 27
}
console.log(obj === obj)
///false
&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;보통은 아래의 방식으로 구현한다.&lt;/p&gt;
&lt;pre class=&quot;typescript&quot; style=&quot;color: #000000; text-align: start;&quot;&gt;&lt;code&gt;Class Singleton {
	constructor(){
		if(!Singleton.instance) {
			Singleton.instance = this
		}
		return Single.instance
	}
	getInstance() {
		return this.instance
	}
}

const a = new Singleton()
const b = new Singleton()

console.log(a===b) 
//true. 단 하나의 인스턴스를 가지니까!!

&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;싱글톤 패턴은 데이터베이스 연결 모듈에 많이 쓰인다.&lt;/p&gt;
&lt;pre class=&quot;typescript&quot; style=&quot;color: #000000; text-align: start;&quot;&gt;&lt;code&gt;const URL = 'DB주소'
const createConnection = url =&amp;gt; ({&quot;url&quot; : url})
create DB {
	constructor(url){
		if(!DB.instance){
				DB.instance = createConnection(url)
		}
		return DB.instance
	}
	connect() {
		return this.instance
	}
}

const a = new DB(URL)
const b = new DB(URL)
console.log( a === b ) //true!!!! 같은 인스턴스다.
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;자바&lt;/h3&gt;
&lt;pre class=&quot;smali&quot; style=&quot;color: #000000; text-align: start;&quot;&gt;&lt;code&gt;Class Singleton {
	
	private static class singleInstanceHolder {
			private static final Single INSTANCE = new Singletone();
	}
	public static Singleton getInstance() {
		return singleInstanceHolder.INSTANCE;
				
}

// 싸피 수업에서 사용한 방법

class Singleton2 {
  private static Singleton2 instance = new Singleton2();

  private Singleton2() {}

  public static Singleton2 getInstance() {
    return instance;
  }
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;mongoose&lt;/h3&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;Node.js에서 MongoDB 데이터베이스를 연결할 때 쓰는 mongoose 모듈에서 볼 수 있다.&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;mongoose의 데이터베이스를 연결할 때 쓰는 connect() 라는 함수는 싱글톤 인스턴스를 반환한다.&lt;/p&gt;
&lt;pre class=&quot;typescript&quot; style=&quot;color: #000000; text-align: start;&quot;&gt;&lt;code&gt;Mongoose.prototype.connect = function(uri, options, callback) {
	const _mongoose = this instanceof Mongoose ? this : mongoose;
	const conn = _mongoose.connection;

	return _mongoose._promiseOrCallback(callback, cb =&amp;gt; {
			conn.openUri(uri, options, err =&amp;gt; {
					if (err != null) {
							return cb(err);
					}
					return cb(null, _mongoose);
			});
	});
});
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;mySQL&lt;/h3&gt;
&lt;pre class=&quot;javascript&quot; style=&quot;color: #000000; text-align: start;&quot;&gt;&lt;code&gt;//메인모듈
const mysql = require('mysql');
const pool = mysql.createPool({
		connectionLimit: 10,
		hoist: 'example.org',
		user: 'kundol',
		password: 'secret',
		database: '승철이디비'
});
pool.connect();

// 모듈 a
pool.query(query, function(error, results, fields){
		if(error) throw error;
		console.log('The solution is: ',results[0].solution);
});

//모듈b
pool.query(query, function(error, results, fields){
		if(error) throw error;
		console.log('The solution is: ',results[0].solution);
});

&lt;/code&gt;&lt;/pre&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;싱글톤 단점&lt;/h2&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;Test Driven Development 할 때 걸림돌이 됨.&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;TDD는 단위 테스트를 주로 하는데, 단위 테스트는 테스트가 서로 독립적이어야 하며 테스트를 어떤 순서로든 실행할 수 있어야 합니다.&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;그러나, 싱글톤은 미리 생성된 하나의 인스턴스를 기반으로 구현하는 패턴이므로 각 테스트마다 독립적인 인스턴스를 만들기 어려움.&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;의존성 주입. dependency injection&lt;/h2&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;싱글톤은 사용하기 쉽고 실용적이지만 모듈 간의 결합을 강하게 만드는 단점이 있다.&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;이때 의존성 주입을 통해 모듈간의 결합을 좀 더 느슨하게 만들어 해결할 수 있음.&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;의존성 주입이란, 종속성이라고도 하며, A가 B에 의존성 있다는 것은 B의 변경 사항에 대해 A 또한 변해야 된다는 것을 의미.&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;메인 모듈이 직접 하위모듈에 의존성을 주지 않고, 중간에 의존성 주입자가 이부분을 가로채서 메인 모듈이 간접적으로 의존성을 주입할 수 있도록!!!!&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;이를 통해 메인 모듈은 하위 모듈에 대한 의존성이 떨어짐. = 디커플링 된다.&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;ex ) post 요청을 main으로 바로 쏘지 않고 의존성으로 보냄.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; color: #000000; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;의존성 주입의 장점&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;모듈을 쉽게 교체할 수 있는 구조가 되어 테스팅 쉬움.&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;마이그레이션 쉬움.&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;구현할 때 추상화 레이어를 넣고 이를 기반으로 구현체를 넣어 주기 때문에 애플리케이션 의존성 방향이 일관되고, 애플리케이션을 쉽게 추론할 수 있으며 모듈간의 관계들이 조금 더 명확해집니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; color: #000000; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;단점&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;모듈들이 더욱더 분리되므로 클래스 수가 늘어나 복잡성이 증가될 수 있으며 약간의 런타임 페널티가 생기기도 합니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; color: #000000; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;의존성 주입 원칙&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;상위 모듈은 하위 모듈에서 어떠한 것도 가져오지 않아야 합니다. 또한 둘 다 추상화에 의존해야 하며, 이때 추상화는 세부 사항에 의존하지 말아야 합니다.&amp;rdquo;&lt;/p&gt;</description>
      <category>CS (Computer Science)</category>
      <category>cs스터디</category>
      <category>싱글톤</category>
      <category>자바</category>
      <category>자바스크립트</category>
      <author>공삼이</author>
      <guid isPermaLink="true">https://study3.tistory.com/9</guid>
      <comments>https://study3.tistory.com/9#entry9comment</comments>
      <pubDate>Mon, 3 Apr 2023 17:11:43 +0900</pubDate>
    </item>
    <item>
      <title>[파이썬/알고리즘] 스택을 활용한 가장 큰 수 문제</title>
      <link>https://study3.tistory.com/8</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;파이썬을 이용한 가장 큰 수 구하기 문제&lt;/h2&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;문제) 주어진 숫자의 자릿수에서 m개의 수를 제거해서 가장 큰 수를 만드는 프로그램을 작성하라.&lt;/blockquote&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;입력&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;10진수 n과 제거해야할 자릿수의 개수 m이 주어진다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;풀이&lt;/h2&gt;
&lt;pre id=&quot;code_1670608292773&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;n, m = map(int, input().split())
n = list(map(int, str(n)))  #숫자n을 스트링으로 바꿔야 하나씩 접근 가능.
stack=[]
for x in n:
   while stack and m&amp;gt;0 and stack[-1]&amp;lt;x:  #stack이 비어있지 않고, stack의 마지막 자릿수가 더 작으면 pop
      stack.pop()
      m -= 1
   stack.append(x)
if m!=0:
   stack=stack[:-m]&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;n = 9977252641, m = 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;자신의 앞에 있는 숫자가 자신보다 작으면 꺼낸다(pop)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스택: 9 9 7 7 6 4 1&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5 -&amp;gt; 앞에 2를 제거&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;6 -&amp;gt; 앞에 2, 5 제거&lt;/p&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개밖에 제거 못했기 때문에, 뒤에서 2개를 더 제거한다.(내림차순이 되어 있기 때문에.)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;stack[:-2]&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;참고)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://study3.tistory.com/6&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://study3.tistory.com/6&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1670611126448&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;stack(스택) last in first out 가장 나중에 쌓아진 것이 가장 먼저 나간다. 활용) list에서 pop, append -&amp;gt; stack 자료형 파이썬에서는 list 활용해서 stack을 사용한다. ex) 뒤로가기 버튼, ctrl+z, undo queue(큐) first &quot; data-og-host=&quot;study3.tistory.com&quot; data-og-source-url=&quot;https://study3.tistory.com/6&quot; data-og-url=&quot;https://study3.tistory.com/6&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bwLhbi/hyQQon4Ys2/WuExE0hjArvuFvZM70qQ1K/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/bsSCRw/hyQQqTImsR/4WHnCLUcNngflvseEg7nPK/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/LBvlp/hyQQrLRVv8/Wpodq6Tu5iQNKP23jKhMXK/img.jpg?width=1125&amp;amp;height=623&amp;amp;face=0_0_1125_623&quot;&gt;&lt;a href=&quot;https://study3.tistory.com/6&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://study3.tistory.com/6&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bwLhbi/hyQQon4Ys2/WuExE0hjArvuFvZM70qQ1K/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/bsSCRw/hyQQqTImsR/4WHnCLUcNngflvseEg7nPK/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/LBvlp/hyQQrLRVv8/Wpodq6Tu5iQNKP23jKhMXK/img.jpg?width=1125&amp;amp;height=623&amp;amp;face=0_0_1125_623');&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;stack(스택) last in first out 가장 나중에 쌓아진 것이 가장 먼저 나간다. 활용) list에서 pop, append -&amp;gt; stack 자료형 파이썬에서는 list 활용해서 stack을 사용한다. ex) 뒤로가기 버튼, ctrl+z, undo queue(큐) first&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;study3.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;출력&lt;/h2&gt;
&lt;pre id=&quot;code_1670609112387&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#결과출력방법1
res=''.join(map(str,stack))
print(res)

#결과출력방법2
for x in stack:
   print(x, end='')&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Python/알고리즘 문제풀이</category>
      <category>스택</category>
      <category>알고리즘</category>
      <category>코딩테스트</category>
      <category>파이썬</category>
      <author>공삼이</author>
      <guid isPermaLink="true">https://study3.tistory.com/8</guid>
      <comments>https://study3.tistory.com/8#entry8comment</comments>
      <pubDate>Sat, 10 Dec 2022 03:39:49 +0900</pubDate>
    </item>
    <item>
      <title>[파이썬/알고리즘]이진트리 - 전위순회 중위순회 후위순회</title>
      <link>https://study3.tistory.com/7</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;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;&lt;a href=&quot;https://ko.wikipedia.org/wiki/깊이_우선_탐색&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://ko.wikipedia.org/wiki/깊이_우선_탐색&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1667878498908&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;위키백과, 우리 모두의 백과사전. 깊이 우선 탐색의 애니메이션 예시 깊이 우선 탐색( - 優先探索, 영어: depth-first search, DFS)은 맹목적 탐색방법의 하나로 탐색트리의 최근에 첨가된 노드를 선택&quot; data-og-host=&quot;ko.wikipedia.org&quot; data-og-source-url=&quot;https://ko.wikipedia.org/wiki/깊이_우선_탐색&quot; data-og-url=&quot;https://ko.wikipedia.org/wiki/%EA%B9%8A%EC%9D%B4_%EC%9A%B0%EC%84%A0_%ED%83%90%EC%83%89&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bMb2tu/hyQvi2PVME/DXfkalKRUsXa5wnvdqSXp0/img.png?width=1200&amp;amp;height=769&amp;amp;face=0_0_1200_769,https://scrap.kakaocdn.net/dn/bP8Uxy/hyQvlkWLku/oDXofoRXAaYUlIdqmMg2I0/img.png?width=800&amp;amp;height=513&amp;amp;face=0_0_800_513,https://scrap.kakaocdn.net/dn/boMUpQ/hyQvfSyywU/0AdpCDv1gZ0WNuSk6LaJ8K/img.png?width=640&amp;amp;height=410&amp;amp;face=0_0_640_410&quot;&gt;&lt;a href=&quot;https://ko.wikipedia.org/wiki/깊이_우선_탐색&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://ko.wikipedia.org/wiki/깊이_우선_탐색&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bMb2tu/hyQvi2PVME/DXfkalKRUsXa5wnvdqSXp0/img.png?width=1200&amp;amp;height=769&amp;amp;face=0_0_1200_769,https://scrap.kakaocdn.net/dn/bP8Uxy/hyQvlkWLku/oDXofoRXAaYUlIdqmMg2I0/img.png?width=800&amp;amp;height=513&amp;amp;face=0_0_800_513,https://scrap.kakaocdn.net/dn/boMUpQ/hyQvfSyywU/0AdpCDv1gZ0WNuSk6LaJ8K/img.png?width=640&amp;amp;height=410&amp;amp;face=0_0_640_410');&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;위키백과, 우리 모두의 백과사전. 깊이 우선 탐색의 애니메이션 예시 깊이 우선 탐색( - 優先探索, 영어: depth-first search, DFS)은 맹목적 탐색방법의 하나로 탐색트리의 최근에 첨가된 노드를 선택&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;ko.wikipedia.org&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;깊이우선탐색은 아래 세가지 종류가 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;992&quot; data-origin-height=&quot;578&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/5Fa1e/btrQAxnIO5Z/BrVK0VdnK5xhsLK9aHDfK1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/5Fa1e/btrQAxnIO5Z/BrVK0VdnK5xhsLK9aHDfK1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/5Fa1e/btrQAxnIO5Z/BrVK0VdnK5xhsLK9aHDfK1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F5Fa1e%2FbtrQAxnIO5Z%2FBrVK0VdnK5xhsLK9aHDfK1%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;481&quot; height=&quot;280&quot; data-origin-width=&quot;992&quot; data-origin-height=&quot;578&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;전위순회: a&amp;nbsp;&amp;rarr; b &amp;rarr; c&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;중위순회: b &amp;rarr; a &amp;rarr; c&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;후위순회: b &amp;rarr; c &amp;rarr; a&lt;/b&gt;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;이진트리&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1304&quot; data-origin-height=&quot;1098&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/biyeoN/btrQBK8gmo9/C3gu59aAORUFICxtA5AkA1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/biyeoN/btrQBK8gmo9/C3gu59aAORUFICxtA5AkA1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/biyeoN/btrQBK8gmo9/C3gu59aAORUFICxtA5AkA1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbiyeoN%2FbtrQBK8gmo9%2FC3gu59aAORUFICxtA5AkA1%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;511&quot; height=&quot;430&quot; data-origin-width=&quot;1304&quot; data-origin-height=&quot;1098&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음과 같은 이진트리가 있다고 할 때, 전위순회, 중위순회, 우휘순회는 어떻게 출력값이 나오는지 알아보도록 하자.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;전위순회&lt;/h2&gt;
&lt;pre id=&quot;code_1667875337402&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;def DFS(x):
    if x&amp;gt;7:
        return
    else:
    	print(x, end=&quot; &quot;)      #호출하기 전에 프린트
        DFS(x*2)
        DFS(x*2+1)
        
DFS(1)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #1a5490;&quot;&gt;&lt;b&gt;출력값: 1 2 4 5 3 6 7&lt;/b&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;b&gt;- 출력 과정&lt;/b&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;b&gt;DFS(1) 호출, &lt;span style=&quot;color: #ee2323;&quot;&gt;print(1)&lt;/span&gt;, DFS(2)호출, DFS(3) 실행 못하고 넘어감.&lt;/b&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;b&gt;DFS(2) 호출, &lt;span style=&quot;color: #ee2323;&quot;&gt;print(2)&lt;/span&gt;, DFS(4) 호출, DFS(5) 실행 못하고 넘어감.&lt;/b&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;b&gt;DFS(4) 호출, &lt;span style=&quot;color: #ee2323;&quot;&gt;print(4)&lt;/span&gt;, DFS(8) 호출 -&amp;gt; return 함수 종료.&lt;/b&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;b&gt;실행 못한 DFS(5) 호출, &lt;span style=&quot;color: #ee2323;&quot;&gt;print(5),&amp;nbsp;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;DFS(10) 호출 -&amp;gt; return 함수 종료.&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;실행 못한 DFS(3) 호출, &lt;span style=&quot;color: #ee2323;&quot;&gt;print(3)&lt;/span&gt;, DFS(6) 호출, DFS(7) 실행 못하고 넘어감.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;DFS(6) 호출,&lt;span style=&quot;color: #ee2323;&quot;&gt; print(6),&lt;/span&gt; DFS(12) 호출 -&amp;gt; return 함수 종료.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;실행 못한 DFS(7) 호출,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;print(7)&lt;/span&gt;, DFS(14) -&amp;gt; return 함수 종료.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;중위순회&lt;/h2&gt;
&lt;pre id=&quot;code_1667875905997&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;def DFS(x):
    if x&amp;gt;7:
        return
    else:
        DFS(x*2)
        print(x, end=&quot; &quot;)      
        DFS(x*2+1)
        
DFS(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;&lt;span style=&quot;color: #1a5490;&quot;&gt;&lt;b&gt;출력값: 4 2 5 1 6 3 7&amp;nbsp;&lt;/b&gt;&lt;/span&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;pre id=&quot;code_1667875950586&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;def DFS(x):
    if x&amp;gt;7:
        return
    else:
        DFS(x*2)
        DFS(x*2+1)
        print(x, end=&quot; &quot;)      

DFS(1)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #1a5490;&quot;&gt;&lt;b&gt;출력값: 4 5 2 6 7 3 1&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #1a5490;&quot;&gt;&lt;b&gt;ex. 병합정렬&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Python/문법</category>
      <category>이진트리</category>
      <category>전위순회</category>
      <category>중위순회</category>
      <category>파이썬 알고리즘</category>
      <category>후위순회</category>
      <author>공삼이</author>
      <guid isPermaLink="true">https://study3.tistory.com/7</guid>
      <comments>https://study3.tistory.com/7#entry7comment</comments>
      <pubDate>Thu, 8 Dec 2022 22:53:30 +0900</pubDate>
    </item>
    <item>
      <title>[자료구조] 스택, 큐</title>
      <link>https://study3.tistory.com/6</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;stack(스택)&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;last in first out&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가장 나중에 쌓아진 것이 가장 먼저 나간다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;활용)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;list에서 pop, append -&amp;gt;&amp;nbsp;stack 자료형&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;파이썬에서는 list 활용해서 stack을 사용한다.&lt;/p&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) 뒤로가기 버튼, ctrl+z, undo&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;queue(큐)&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;first in first out&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;ex) push 알림, 콜센터.&lt;/p&gt;</description>
      <category>자료구조</category>
      <author>공삼이</author>
      <guid isPermaLink="true">https://study3.tistory.com/6</guid>
      <comments>https://study3.tistory.com/6#entry6comment</comments>
      <pubDate>Thu, 8 Dec 2022 22:50:23 +0900</pubDate>
    </item>
    <item>
      <title>[파이썬/알고리즘] 재귀함수를 이용한 이진수 출력</title>
      <link>https://study3.tistory.com/5</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;파이썬을 이용한 이진수 출력 문제&lt;/h2&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;문제) 10진수가 입력되면 2진수로 변환해 출력하는 프로그램을 작성하라.&lt;/blockquote&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;입력&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;첫 줄에 10진수 n이 주어진다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;풀이&lt;/h2&gt;
&lt;pre id=&quot;code_1667217583113&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;n=int(input())

def DFS(x):
   if x==0:
      return
   else:
      DFS(x//2)
      print(x%2, end='')

DFS(n)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;DFS(깊이 우선 탐색)&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;예를 들어 n=11 일 때, 작동하는 과정은 아래와 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;DFS(11) 호출&lt;/b&gt;, 함수의 호출 정보를 스택에 기록, print(11%2, end='')는 시행되지 못하고 DFS(11//2) 호출로 넘어감&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;DFS(5) 호출&lt;/b&gt;, 함수의 호출 정보를 스택에 기록, print(5%2, end='')는 시행되지 못하고 DFS(5//2) 호출로 넘어감&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;DFS(2) 호출&lt;/b&gt;, 함수의 호출 정보를 스택에 기록, print(2%2, end='')는 시행되지 못하고 DFS(2//2) 호출로 넘어감&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;DFS(1) 호출&lt;/b&gt;, 함수의 호출 정보를 스택에 기록, print(1%2, end='')는 시행되지 못하고 DFS(1//2) 호출로 넘어감&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;DFS(0) 호출 -&amp;gt; 종료(return),&amp;nbsp;&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;그후 스택에서 가장 최근에 기록된 것부터 복귀하여 시행한다. (앞에서 시행되지 못했던 print가 작동한다.)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래줄부터 print 실행된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #1a5490;&quot;&gt;&lt;b&gt;print(1%2, end='')&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #1a5490;&quot;&gt;&lt;b&gt;print(2%2, end='')&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #1a5490;&quot;&gt;&lt;b&gt;print(5%2, end='')&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #1a5490;&quot;&gt;&lt;b&gt;print(11%2, end='')&lt;/b&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;size18&quot;&gt;&lt;b&gt;&amp;gt;&amp;gt; 1011&lt;/b&gt;&lt;/p&gt;</description>
      <category>Python/알고리즘 문제풀이</category>
      <category>십진수에서 이진수로</category>
      <category>알고리즘 문제풀이</category>
      <category>이진수</category>
      <category>이진수변환</category>
      <category>재귀함수</category>
      <category>파이썬</category>
      <category>파이썬알고리즘</category>
      <author>공삼이</author>
      <guid isPermaLink="true">https://study3.tistory.com/5</guid>
      <comments>https://study3.tistory.com/5#entry5comment</comments>
      <pubDate>Tue, 8 Nov 2022 02:25:35 +0900</pubDate>
    </item>
    <item>
      <title>[파이썬] 전역변수와 지역변수, 의미와 사용법</title>
      <link>https://study3.tistory.com/4</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;전역변수와 지역변수란?&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;지역 변수&lt;/b&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;(&lt;/span&gt;local variable&lt;span style=&quot;background-color: #ffffff;&quot;&gt;) - 함수 안에서 만들어진 변수&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000;&quot;&gt;&lt;b&gt;전역 변수&lt;/b&gt;(global variable) - 함수 밖에서 만들어진 변수&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;span style=&quot;background-color: #ffffff; color: #202122;&quot;&gt;이름에서 알 수 있듯 지역변수는 Local - 특정 영역에서만 사용할 수 있는 변수이고,&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #202122;&quot;&gt;전역변수는 global - 모든 곳에서 사용할 수 있는 변수입니다.&lt;/span&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;span style=&quot;background-color: #ffffff; color: #202122;&quot;&gt;지역변수(local)&lt;/span&gt;&lt;/h2&gt;
&lt;pre id=&quot;code_1667835970229&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;def F(x):
    a=10         #지역변수
    print(a)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위에서 a는 함수 안에서만 사용되는 지역변수입니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;234&quot; data-origin-height=&quot;126&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/buIigx/btrQCVuJLI7/BcPk1oQPolpcvxY7G7aWP0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/buIigx/btrQCVuJLI7/BcPk1oQPolpcvxY7G7aWP0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/buIigx/btrQCVuJLI7/BcPk1oQPolpcvxY7G7aWP0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbuIigx%2FbtrQCVuJLI7%2FBcPk1oQPolpcvxY7G7aWP0%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;234&quot; height=&quot;126&quot; data-origin-width=&quot;234&quot; data-origin-height=&quot;126&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;F라는 함수는 print(a)를 시행하는데, 함수 안에서 선언된 a=10을 출력하는 것을 볼 수있습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;758&quot; data-origin-height=&quot;304&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b2eFRN/btrQCWmPRTf/eCTi6hUPgskIHwjWMPvXYK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b2eFRN/btrQCWmPRTf/eCTi6hUPgskIHwjWMPvXYK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b2eFRN/btrQCWmPRTf/eCTi6hUPgskIHwjWMPvXYK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb2eFRN%2FbtrQCWmPRTf%2FeCTi6hUPgskIHwjWMPvXYK%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;559&quot; height=&quot;224&quot; data-origin-width=&quot;758&quot; data-origin-height=&quot;304&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그러나 a는 함수 안에서만 유효하기 때문에 a를 함수에 대입하거나, a 자체를 프린트하려고 하면, 오류가 나는 것을 볼 수 있습니다.&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;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;함수의 안의 변수는 함수 안에서만 유효하다!!!&lt;/b&gt; &lt;/span&gt;를 기억해야 합니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;전역변수(global)&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;pre id=&quot;code_1667836476966&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;a = 10     #전역변수
print(a)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위에서 a는 전역변수 입니다. 따라서 프린트, 함수 대입 등도 오류 없이 이뤄지는 것을 볼 수 있습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;258&quot; data-origin-height=&quot;146&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/zfnBE/btrQGQL2CNc/k0CMtFwjwbhudU7pDQunc0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/zfnBE/btrQGQL2CNc/k0CMtFwjwbhudU7pDQunc0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/zfnBE/btrQGQL2CNc/k0CMtFwjwbhudU7pDQunc0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FzfnBE%2FbtrQGQL2CNc%2Fk0CMtFwjwbhudU7pDQunc0%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;258&quot; height=&quot;146&quot; data-origin-width=&quot;258&quot; data-origin-height=&quot;146&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;지역변수를 전역변수로 사용하는 법 (local --&amp;gt; global)&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;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;global&lt;/b&gt;&lt;/span&gt;&quot;을 이용하여 지역변수를 전역변수로 사용할 수 있습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1667836708945&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;def F(x):
	global a
	a = 10
	print(a)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;전역변수로 선언하고 싶은 변수 앞에 global만 붙여주면 됩니다!&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;226&quot; data-origin-height=&quot;122&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Iru7N/btrQAxAZd5H/WWyLE7TJZP47xCQa1JZkrK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Iru7N/btrQAxAZd5H/WWyLE7TJZP47xCQa1JZkrK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Iru7N/btrQAxAZd5H/WWyLE7TJZP47xCQa1JZkrK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FIru7N%2FbtrQAxAZd5H%2FWWyLE7TJZP47xCQa1JZkrK%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;226&quot; height=&quot;122&quot; data-origin-width=&quot;226&quot; data-origin-height=&quot;122&quot;/&gt;&lt;/span&gt;&lt;/figure&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;이 변수는 함수 바깥에서도 자유롭게 쓸 수 있게 된 것 입니다!&lt;/p&gt;</description>
      <category>Global</category>
      <category>global선언</category>
      <category>local</category>
      <category>Python</category>
      <category>알고리즘</category>
      <category>전역변수</category>
      <category>지역변수</category>
      <category>파이썬</category>
      <author>공삼이</author>
      <guid isPermaLink="true">https://study3.tistory.com/4</guid>
      <comments>https://study3.tistory.com/4#entry4comment</comments>
      <pubDate>Tue, 8 Nov 2022 01:01:04 +0900</pubDate>
    </item>
    <item>
      <title>[Python] 재귀함수의 개념과 종료조건</title>
      <link>https://study3.tistory.com/3</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;재귀함수란?&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;재귀함수란 자기 자신을 호출하는 함수이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉, 함수 안에 자신의 함수를 가지고 있는 것이다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;예시&lt;/h3&gt;
&lt;pre id=&quot;code_1666785871671&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;def A(x):
	print(x)
	A(x-1)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 함수를 보면 A라는 함수 안에 A 함수를 다시 가지고 있는 것을 볼 수 있다.&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;A(5)는&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;print(5) ➡️ &amp;nbsp;A(4) ➡️&amp;nbsp;print(4) ➡️&amp;nbsp;A(3) ➡️ print(3) &amp;nbsp;이 과정을 무한 반복하게 한다!&lt;/p&gt;
&lt;pre id=&quot;code_1666786417901&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt;A(5)
5
4
3
2
1
0
-1
-2
#무한출력주의!!!&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;재귀함수 종료조건&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 무한출력을 방지하기 위해서는 종료 조건을 넣어줘야한다. (참고로&amp;nbsp;종료 조건을 넣는 방법은 아래 2가지.)&lt;/p&gt;
&lt;pre id=&quot;code_1666786984773&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#if문
def A(x):
	if x&amp;gt;0:
    print(x)
    A(x-1)

#if, return 사용
def A(x):
	if x&amp;lt;=0:
		return
	print(x)
	A(x-1)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/MmDxx/btrPE5xjU8n/KlIa9MocsZeYRxMsdHAj90/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/MmDxx/btrPE5xjU8n/KlIa9MocsZeYRxMsdHAj90/img.png&quot; data-origin-width=&quot;410&quot; data-origin-height=&quot;366&quot; data-is-animation=&quot;false&quot; data-widthpercent=&quot;52.19&quot; style=&quot;width: 51.587070296634906%; margin-right: 10px;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/MmDxx/btrPE5xjU8n/KlIa9MocsZeYRxMsdHAj90/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FMmDxx%2FbtrPE5xjU8n%2FKlIa9MocsZeYRxMsdHAj90%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;410&quot; height=&quot;366&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/GcNdl/btrPGd9nqN5/P0PTq5BNGGjXAaHzkbJUo1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/GcNdl/btrPGd9nqN5/P0PTq5BNGGjXAaHzkbJUo1/img.png&quot; data-origin-width=&quot;394&quot; data-origin-height=&quot;384&quot; data-is-animation=&quot;false&quot; data-widthpercent=&quot;47.81&quot; style=&quot;width: 47.25013900569068%;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/GcNdl/btrPGd9nqN5/P0PTq5BNGGjXAaHzkbJUo1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FGcNdl%2FbtrPGd9nqN5%2FP0PTq5BNGGjXAaHzkbJUo1%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;394&quot; height=&quot;384&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실제로 파이썬을 돌려보면 무한반복되지 않고 값이 출력되는 것을 볼 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;재귀함수 - 예제로 이해하기&lt;/b&gt;&lt;/h2&gt;
&lt;pre id=&quot;code_1666788048952&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;def A(x):
	if x==0:
    		return 1
	return A(x-1)*2&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위는, x가 0일 때 1을 리턴하고,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그렇지 않을 때, A(x-1)*2를 리턴하는 함수이다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;482&quot; data-origin-height=&quot;386&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/4G0Am/btrPDr2qEXA/WXPOdKF6a9C72kUBROsemK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/4G0Am/btrPDr2qEXA/WXPOdKF6a9C72kUBROsemK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/4G0Am/btrPDr2qEXA/WXPOdKF6a9C72kUBROsemK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F4G0Am%2FbtrPDr2qEXA%2FWXPOdKF6a9C72kUBROsemK%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;482&quot; height=&quot;386&quot; data-origin-width=&quot;482&quot; data-origin-height=&quot;386&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 함수는 파이썬에서 실행했을 때의 결과로 알 수 있듯 A 라는 함수는 입력한 값을 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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;x에 3이 들어가면 A(2)*2를 반환하고, A(2)가 시행된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;A(2)는 A(1)*2을 반환하고, A(1)이 시행된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 과정을 A(0)에 도달할 때까지 반복한다.&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 46.97674418604651%; height: 90px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 18px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 18px;&quot;&gt;A(3) &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;rarr;&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 18px;&quot;&gt;A(2)*2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 18px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 18px;&quot;&gt;A(2) &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;rarr;&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 18px;&quot;&gt;A(1)*2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 18px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 18px;&quot;&gt;A(1)&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&amp;rarr;&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 18px;&quot;&gt;A(0)*2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 18px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 18px;&quot;&gt;A(0)&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&amp;rarr;&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 18px;&quot;&gt;1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 18px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 18px;&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;A(3) &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;--&amp;gt;&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 18px;&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;2*2*2*1&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 표를 거꾸로 거슬러 올라가보자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;A(0)에 1을 대입하면, A(1)은 1*2가 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;A(1)에 2를 대입하면 A(2)는 2*2가 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;A(2)에 2*2를 대입하면 A(3)은 2*2*2가 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이러한 과정으로 재귀함수의 값이 반환되는 것을 알 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Python/문법</category>
      <category>python algorithm</category>
      <category>python 알고리즘</category>
      <category>재귀함수</category>
      <category>재귀함수 종료</category>
      <category>재귀함수개념</category>
      <category>재귀함수파이썬</category>
      <category>파이썬 재귀함수</category>
      <author>공삼이</author>
      <guid isPermaLink="true">https://study3.tistory.com/3</guid>
      <comments>https://study3.tistory.com/3#entry3comment</comments>
      <pubDate>Wed, 26 Oct 2022 23:09:26 +0900</pubDate>
    </item>
    <item>
      <title>[알고리즘] 회문 문자열 파이썬, python 회문 문자열 풀이</title>
      <link>https://study3.tistory.com/2</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;파이썬 회문 문자열 풀이 (python algorithm)&lt;/h2&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;문제) 각 문자열이 회문 문자열(대칭)일 경우 True, 그렇지 않을 경우 False를 출력하는 프로그램.&lt;/blockquote&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;회문(&lt;span style=&quot;background-color: #ffffff; color: #656565;&quot;&gt;palindrome)&lt;/span&gt;?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;앞에서부터 읽으나 뒤에서부터 읽으나 동일한 단어나 구&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;EX) mom, madam, level, dad, wow, noon&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;문자열 인덱싱 (string indexing)&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;a ='level'&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인덱스를 나타내는 방법은 아래처럼 두가지가 있다.&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 46px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style4&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 18px;&quot;&gt;
&lt;td style=&quot;width: 16.666666666666668%; height: 18px;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;td style=&quot;width: 16.666666666666668%; height: 18px;&quot;&gt;l&lt;/td&gt;
&lt;td style=&quot;width: 16.666666666666668%; height: 18px;&quot;&gt;e&lt;/td&gt;
&lt;td style=&quot;width: 16.666666666666668%; height: 18px;&quot;&gt;v&lt;/td&gt;
&lt;td style=&quot;width: 16.666666666666668%; height: 18px;&quot;&gt;e&lt;/td&gt;
&lt;td style=&quot;width: 16.666666666666668%; height: 18px;&quot;&gt;l&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 18px;&quot;&gt;
&lt;td style=&quot;width: 16.666666666666668%; height: 18px;&quot;&gt;index&lt;/td&gt;
&lt;td style=&quot;width: 16.666666666666668%; height: 18px;&quot;&gt;0&lt;/td&gt;
&lt;td style=&quot;width: 16.666666666666668%; height: 18px;&quot;&gt;1&lt;/td&gt;
&lt;td style=&quot;width: 16.666666666666668%; height: 18px;&quot;&gt;2&lt;/td&gt;
&lt;td style=&quot;width: 16.666666666666668%; height: 18px;&quot;&gt;3&lt;/td&gt;
&lt;td style=&quot;width: 16.666666666666668%; height: 18px;&quot;&gt;4&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 10px;&quot;&gt;
&lt;td style=&quot;width: 16.666666666666668%; height: 10px;&quot;&gt;index&lt;/td&gt;
&lt;td style=&quot;width: 16.666666666666668%; height: 10px;&quot;&gt;-5&lt;/td&gt;
&lt;td style=&quot;width: 16.666666666666668%; height: 10px;&quot;&gt;-4&lt;/td&gt;
&lt;td style=&quot;width: 16.666666666666668%; height: 10px;&quot;&gt;-3&lt;/td&gt;
&lt;td style=&quot;width: 16.666666666666668%; height: 10px;&quot;&gt;-2&lt;/td&gt;
&lt;td style=&quot;width: 16.666666666666668%; height: 10px;&quot;&gt;-1&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 경우, 문자열이 대칭인지 확인하기 위해서는 &amp;nbsp;a[0]==a[-1] and a[1]==a[-2] 를 만족해야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;i=0 일 때 -i-1=-1&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;i=1 일 때 -i-1=-2&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가 된다.&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;i&gt;input&lt;/i&gt;&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;level&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;good&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;bad&lt;/p&gt;
&lt;pre id=&quot;code_1663919690294&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;n=int(input())

for i in range(n):
	s=input()
	size=len(s)   
	for j in range(size//2):
    	if s[j] == s[-1-j]:
        	print(True)
            break
	else:
    	print(False)&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;파이썬 풀이2&lt;/h2&gt;
&lt;pre id=&quot;code_1663921793295&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;n=int(input())

for i in range(n):
    s=input()
    if s==s[::-1]:   #문자열을 리버스해주는 코드.
        print(True)
    else:
        print(False)&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;blob&quot; data-origin-width=&quot;280&quot; data-origin-height=&quot;100&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b40zBa/btrMUk45qk0/2TFQi4639K5TnKo1Rjxbk0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b40zBa/btrMUk45qk0/2TFQi4639K5TnKo1Rjxbk0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b40zBa/btrMUk45qk0/2TFQi4639K5TnKo1Rjxbk0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb40zBa%2FbtrMUk45qk0%2F2TFQi4639K5TnKo1Rjxbk0%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;280&quot; height=&quot;100&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;280&quot; data-origin-height=&quot;100&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;</description>
      <category>Python/알고리즘 문제풀이</category>
      <author>공삼이</author>
      <guid isPermaLink="true">https://study3.tistory.com/2</guid>
      <comments>https://study3.tistory.com/2#entry2comment</comments>
      <pubDate>Wed, 26 Oct 2022 17:50:50 +0900</pubDate>
    </item>
  </channel>
</rss>