<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>이것저것 공부 기록하기</title>
    <link>https://dlforbi.tistory.com/</link>
    <description></description>
    <language>ko</language>
    <pubDate>Wed, 1 Jul 2026 06:11:32 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>얍욥얍</managingEditor>
    <item>
      <title>[Deep Learning] Forward propagation</title>
      <link>https://dlforbi.tistory.com/78</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;순전파(Forward propagation)&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;뉴럴 네트워크 모델의 입력층부터 출력층까지 순서대로 변수들을 계산하고 저장하는 것을 의미한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;한개의 은닉층(hidden layer)를 갖는 딥 네트워크를 예로 들어 단계별로 어떻게 계산되는지 살펴보자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;먼저, 은닉층의 가중치 파라미터인 W^(1)과 입력값 x를 곱하여 중간 변수 z를 정의한다. (간단하게 식을 구성하기 위해 편향(bias) 항목은 생략)&lt;/li&gt;
&lt;li&gt;&amp;nbsp;중간 변수 z를 활성화 함수(activation function)에 입력해서 벡터 길이가 h인 은닉층 변수를 얻는다. (은닉 변수 h도 중간 변수)&lt;/li&gt;
&lt;li&gt;출력층의 가중치 W^(2) 만을 사용한다고 가정하면, 벡터 길이가 q인 출력층의 변수 o를 W^(2) x h로 계산할 수 있다.&lt;/li&gt;
&lt;li&gt;손실 함수(loss function)를 l 이라고 하고, 샘플 레이블을 y라고 가정하면, 하나의 데이터 샘플에 대한 손실(Loss)값을 다음과 같이 계산할 수 있다.&amp;nbsp; &amp;nbsp;L =l(o, y)&amp;nbsp;&lt;/li&gt;
&lt;li&gt;L2 norm 정규화(regularization)의 정의에 따라, 하이퍼파라미터 gamma가 주어졌을 때 정규화 항목은 다음과 같다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;502&quot; data-origin-height=&quot;124&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cEc5yc/btrLLXYMuKN/Qnm2hDOx8CIW3IGzmETCk1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cEc5yc/btrLLXYMuKN/Qnm2hDOx8CIW3IGzmETCk1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cEc5yc/btrLLXYMuKN/Qnm2hDOx8CIW3IGzmETCk1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcEc5yc%2FbtrLLXYMuKN%2FQnm2hDOx8CIW3IGzmETCk1%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;288&quot; height=&quot;71&quot; data-origin-width=&quot;502&quot; data-origin-height=&quot;124&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp;6. 여기서 행렬의 Frobenius norm은 행렬을 벡터로 바꾼 후 계산하는 L2 norm과 같다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp;7. 마지막으로, 한개의 데이터 샘플에 대한 모델의 정규화된 손실(regularized loss) 값을 계산한다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;J = L + s&lt;/li&gt;
&lt;li&gt;J : 주어진 데이터 샘플에 대한 목표 함수(objective function). 즉, 목표 함수(objective function).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;412&quot; data-origin-height=&quot;133&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b3NBo0/btrLSt2UUkm/fON6fOtt9dCkfvMv7AstV0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b3NBo0/btrLSt2UUkm/fON6fOtt9dCkfvMv7AstV0/img.jpg&quot; data-alt=&quot;순전파(forward propagation)의 연산 그래프&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b3NBo0/btrLSt2UUkm/fON6fOtt9dCkfvMv7AstV0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb3NBo0%2FbtrLSt2UUkm%2FfON6fOtt9dCkfvMv7AstV0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;508&quot; height=&quot;164&quot; data-origin-width=&quot;412&quot; data-origin-height=&quot;133&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;순전파(forward propagation)의 연산 그래프&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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;References&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://ko.d2l.ai/chapter_deep-learning-basics/backprop.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://ko.d2l.ai/chapter_deep-learning-basics/backprop.html&lt;/a&gt;&lt;/p&gt;</description>
      <category>DeepLearning</category>
      <author>얍욥얍</author>
      <guid isPermaLink="true">https://dlforbi.tistory.com/78</guid>
      <comments>https://dlforbi.tistory.com/78#entry78comment</comments>
      <pubDate>Mon, 12 Sep 2022 00:06:21 +0900</pubDate>
    </item>
    <item>
      <title>[Paper Review] FastSpeech 2: Fast and High-Quality End-to-End Text to Speech (ICLR 2021)</title>
      <link>https://dlforbi.tistory.com/75</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;제목: FastSpeech2: Fast and High-Quality End-to-End Text to Speech&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;저자: Yi Ren, Chenxu Hu, Xu Tan, Tao Qin, Sheng Zhao, Zhou Zhao, Tie-Yan Liu&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;소속: Zhejiang University, Microsoft Research Asia, Microsoft Azure Speech&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;발표: ICLR&amp;nbsp;2021&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;논문:&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a href=&quot;https://arxiv.org/abs/2006.04558&quot;&gt;https://arxiv.org/abs/2006.04558&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;오디오샘플:&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a href=&quot;https://speechresearch.github.io/fastspeech2/&quot;&gt;https://speechresearch.github.io/fastspeech2/&lt;/a&gt;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. Introduction&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Previous Work: FastSpeech&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Non-autoregressive TTS 모델들 중, FastSpeech는 가장 successful한 모델 중 하나&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- FastSpeech는 one-to-many mapping problem을 경감시킬 수 있는 두 가지 방안을 제시함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- one-to-many mapping problem 이란 하나의 text에 대해서도 매우 다양한 speech가 나올 수 있다는 의미 (예를 들어, 사람에 따라 억양이나 어조, 말하는 스타일이 다름)&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;Knowledge Distillation&lt;/li&gt;
&lt;li&gt;duration information&lt;/li&gt;
&lt;/ol&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;two-stage teacher-student 학습 파이프라인은 학습 과정을 복잡하게 함&lt;/li&gt;
&lt;li&gt;teacher 모델로부터 생성된 target mel-spectrogram은 information loss 가 일어나서 ground-truth에 비해 음성합성 퀄리티가 떨어짐&lt;/li&gt;
&lt;li&gt;teacher 모델의 attention map에서 추출된 duration이 충분히 정확하지 않음&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서, 이러한 FastSpeech의 이슈 사항을 다루고 non-autoregressive TTS에서의 one-to-many mapping problem을 더 잘 다룰 수 있도록 하는 FastSpeech2를 소개함&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. FastSpeech2 and 2s&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2.1 Motivation&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- TTS는 전형적으로 one-to-many problem 을 갖고 있음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 이러한 one-to-many problem이 생기는 이유는 speech의 variation(ex. pitch, duration, sound volume, prosody)로 인해 text sequence에 대하여 다양한 speech sequences가 가능하기 때문&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- non-autoregressive TTS에서는 text가 유일한 input 정보이기 때문에 speech의 variance를 충분히 예측할 수 없음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 이 경우, 모델은 일반화가 잘 안 되어 training set에 있는 target speech의 variation에 오버피팅되는 경향이 있음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- FastSpeech는 이러한 one-to-many problem을 경감하기 위한 두 가지 방법을 고안했지만, 그에 따른 이슈들을 가져왔음 (1. 복잡한 파이프라인 / 2. information loss / 3. 충분히 정확하지 않은 ground-truth duration)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2.2 Model Overview&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1045&quot; data-origin-height=&quot;530&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/23Yyx/btrLMzv1GCE/Phb0Rj7uS823xkJOvrE77k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/23Yyx/btrLMzv1GCE/Phb0Rj7uS823xkJOvrE77k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/23Yyx/btrLMzv1GCE/Phb0Rj7uS823xkJOvrE77k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F23Yyx%2FbtrLMzv1GCE%2FPhb0Rj7uS823xkJOvrE77k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1045&quot; height=&quot;530&quot; data-origin-width=&quot;1045&quot; data-origin-height=&quot;530&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- (a: overall architecture)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- encoder는 phoneme embedding sequence를 phoneme hidden sequence로 변환시킴&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 그 후, variance adaptor는 variance(ex. duration, pitch, energy)들을 hidden sequence에 더함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 마지막으로, mel-spectrogram decoder는 adapted hidden sequence를 mel-spectrogram sequence로 변환함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- encoder와 mel-spectrogram decoder의 기본구조로는 self-attention layer와 1D-conv를 쌓은 feed-forward Transformer를 사용&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- FastSpeech와의 차이점은 teacher-student distillation 파이프라인과 teacher model로부터의 phoneme duration 이 있음&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;FastSpeech2에서는 teacher-studen distillation 파이프라인을 제거하고, ground-truth 멜을 target으로 하여 학습함&lt;br /&gt;&amp;rarr; 이로써 diltilled 멜에서의 정보손실을 피하고, voice quality를 높임&lt;/li&gt;
&lt;li&gt;FastSpeech2에서는 variance adaptor를 통해 duration 뿐 아니라 pitch나 energy 등을 함께 predict하여 one-to-many problem을 해소함
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;이때, duration predictor는 forced alignment(McAuliffe et al., 2017) 방법을 통해 얻은 phoneme duration을 training 타겟으로 사용하여 autoregressive teacher model의 attention map에서 추출한 것보다 더 정확한 duration을 얻을 수 있도록 함&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;한편, 학습 파이프라인을 보다 간소화하기 위한 방안으로 text에서 바로 waveform을 생성하여 &lt;span&gt;fully end-to-end 시스템으로 &lt;/span&gt;수 있행될 수 있는 FastSpeech2s를 제안&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2.3 Variance Adaptor&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Duration Predictor&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Pitch Predictor&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Energy Predictor&lt;/h4&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.4 FastSpeech 2s&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Challenges in Text-to-Waveform Generation&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Our Method&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2.5 Discussions&lt;/h3&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. Experiments and Results&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3.1 Experimental Setup&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3.2 Results&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;References&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://github.com/rishikksh20/FastSpeech2&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://github.com/rishikksh20/FastSpeech2&lt;/a&gt;&lt;/p&gt;</description>
      <category>DeepLearning/Speech</category>
      <category>FastSpeech</category>
      <category>fastspeech2</category>
      <category>fastspeech2s</category>
      <category>Paper review</category>
      <category>Speech</category>
      <category>Speech Synthesis</category>
      <category>tts</category>
      <category>variance adaptor</category>
      <category>논문 리뷰</category>
      <category>리뷰</category>
      <author>얍욥얍</author>
      <guid isPermaLink="true">https://dlforbi.tistory.com/75</guid>
      <comments>https://dlforbi.tistory.com/75#entry75comment</comments>
      <pubDate>Sat, 10 Sep 2022 18:53:12 +0900</pubDate>
    </item>
    <item>
      <title>[Algorithm] 1일1솔 - 백준 1874 스택 수열 (python3)</title>
      <link>https://dlforbi.tistory.com/74</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;문제링크&lt;/h2&gt;
&lt;figure id=&quot;og_1647022180024&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;1874번: 스택 수열&quot; data-og-description=&quot;1부터 n까지에 수에 대해 차례로 [push, push, push, push, pop, pop, push, push, pop, push, push, pop, pop, pop, pop, pop] 연산을 수행하면 수열 [4, 3, 6, 8, 7, 5, 2, 1]을 얻을 수 있다.&quot; data-og-host=&quot;www.acmicpc.net&quot; data-og-source-url=&quot;https://www.acmicpc.net/problem/1874&quot; data-og-url=&quot;https://www.acmicpc.net/problem/1874&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/xmXkq/hyNFLnoQHr/aBsfkkNSKMUSZjkKCzyp8K/img.png?width=2834&amp;amp;height=1480&amp;amp;face=0_0_2834_1480&quot;&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/1874&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.acmicpc.net/problem/1874&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/xmXkq/hyNFLnoQHr/aBsfkkNSKMUSZjkKCzyp8K/img.png?width=2834&amp;amp;height=1480&amp;amp;face=0_0_2834_1480');&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;1874번: 스택 수열&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;1부터 n까지에 수에 대해 차례로 [push, push, push, push, pop, pop, push, push, pop, push, push, pop, pop, pop, pop, pop] 연산을 수행하면 수열 [4, 3, 6, 8, 7, 5, 2, 1]을 얻을 수 있다.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.acmicpc.net&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;문제설명&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;push, pop 을 해가며 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;8 4 3 6 8 7 5 2 1 과 같이 입력을 받을 때, 수열 리스트 = [4,3,6,8,7,5,2,1] 이 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우선 push를 4번 하면 스택에 다음과 같이 수가 담긴다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;s = [1,2,3,4]&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서 입력 받은 수열과 같게 하려면 pop을 두 번 해서 수열 리스트에 담아주면 [4,3] 과 같이 된다.&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_1647022036034&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

n = int(input()); stack = []
seq = []; cnt = 1
tmp = True

for i in range(n):
    num = int(input())
    while cnt &amp;lt;= num:
        if cnt &amp;gt; num:
            break
        stack.append(cnt)
        seq.append('+')
        cnt += 1
    if stack[-1] == num:
        stack.pop()
        seq.append('-')
    else:
        tmp = False
if tmp == False:
    print('NO')
else:
    for x in seq:
        print(x)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1074&quot; data-origin-height=&quot;56&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/TR6B5/btrvFfgwa27/XobWIBZXElIklKzmdT5QkK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/TR6B5/btrvFfgwa27/XobWIBZXElIklKzmdT5QkK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/TR6B5/btrvFfgwa27/XobWIBZXElIklKzmdT5QkK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FTR6B5%2FbtrvFfgwa27%2FXobWIBZXElIklKzmdT5QkK%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;764&quot; height=&quot;40&quot; data-origin-width=&quot;1074&quot; data-origin-height=&quot;56&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>Algorithm/Baekjoon</category>
      <author>얍욥얍</author>
      <guid isPermaLink="true">https://dlforbi.tistory.com/74</guid>
      <comments>https://dlforbi.tistory.com/74#entry74comment</comments>
      <pubDate>Fri, 11 Mar 2022 19:47:55 +0900</pubDate>
    </item>
    <item>
      <title>[Algorithm] 1일1솔 - 백준 1904 01타일 (python3)</title>
      <link>https://dlforbi.tistory.com/73</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;문제링크&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/1904&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://www.acmicpc.net/problem/1904&lt;/a&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;문제설명&lt;/h3&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;1928&quot; data-origin-height=&quot;1376&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bPZe06/btrvvEGHSZD/bOgNDBk72Wh8K6UBkHdt81/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bPZe06/btrvvEGHSZD/bOgNDBk72Wh8K6UBkHdt81/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bPZe06/btrvvEGHSZD/bOgNDBk72Wh8K6UBkHdt81/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbPZe06%2FbtrvvEGHSZD%2FbOgNDBk72Wh8K6UBkHdt81%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;740&quot; height=&quot;528&quot; data-origin-width=&quot;1928&quot; data-origin-height=&quot;1376&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;문제풀이&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;a, b, c가 모두 같을 경우 a, b, c가 0 이하가 될 때까지 재귀를 돌게 되어 시간이 매우 오래 걸리므로, 메모이제이션을 활용하여 풀이했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1644304874478&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;n = int(input())

dp = [0] * 1000001
dp[1], dp[2] = 1,2
for i in range(3, n+1):
    dp[i] = (dp[i-1] + dp[i-2]) % 15746
print(dp[n])&lt;/code&gt;&lt;/pre&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1072&quot; data-origin-height=&quot;60&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/xXzFe/btrvxk15Gc2/8QxTcI4x89sANDPykMpK8K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xXzFe/btrvxk15Gc2/8QxTcI4x89sANDPykMpK8K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xXzFe/btrvxk15Gc2/8QxTcI4x89sANDPykMpK8K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FxXzFe%2Fbtrvxk15Gc2%2F8QxTcI4x89sANDPykMpK8K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;770&quot; height=&quot;43&quot; data-origin-width=&quot;1072&quot; data-origin-height=&quot;60&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>Algorithm/Baekjoon</category>
      <category>9184</category>
      <category>BOJ</category>
      <category>DP</category>
      <category>memoization</category>
      <category>python3</category>
      <category>메모이제이션</category>
      <category>백준</category>
      <category>신나는 함수 실행</category>
      <category>신나는함수실행</category>
      <category>재귀</category>
      <author>얍욥얍</author>
      <guid isPermaLink="true">https://dlforbi.tistory.com/73</guid>
      <comments>https://dlforbi.tistory.com/73#entry73comment</comments>
      <pubDate>Wed, 9 Mar 2022 15:40:48 +0900</pubDate>
    </item>
    <item>
      <title>[Algorithm] 1일1솔 - 백준 9184 신나는 함수 실행 (python3)</title>
      <link>https://dlforbi.tistory.com/72</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;문제링크&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/9184&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://www.acmicpc.net/problem/9184&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1644304793823&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;9184번: 신나는 함수 실행&quot; data-og-description=&quot;입력은 세 정수 a, b, c로 이루어져 있으며, 한 줄에 하나씩 주어진다. 입력의 마지막은 -1 -1 -1로 나타내며, 세 정수가 모두 -1인 경우는 입력의 마지막을 제외하면 없다.&quot; data-og-host=&quot;www.acmicpc.net&quot; data-og-source-url=&quot;https://www.acmicpc.net/problem/9184&quot; data-og-url=&quot;https://www.acmicpc.net/problem/9184&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/2NvkE/hyNliFm7TX/188Wm7dNDHTPew5CZzeFlk/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630&quot;&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/9184&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.acmicpc.net/problem/9184&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/2NvkE/hyNliFm7TX/188Wm7dNDHTPew5CZzeFlk/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;9184번: 신나는 함수 실행&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;입력은 세 정수 a, b, c로 이루어져 있으며, 한 줄에 하나씩 주어진다. 입력의 마지막은 -1 -1 -1로 나타내며, 세 정수가 모두 -1인 경우는 입력의 마지막을 제외하면 없다.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.acmicpc.net&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;문제설명&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;문제에 재귀 함수 코드가 주어져 있고, 그대로 구현하면 값을 구하는 데 시간이 매우 오래 걸린다는 힌트도 주고 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 메모이제이션으로 풀어야 함을 알 수 있고, 이 때 0 이하인 수는 1, 20 초과인 수의 경우는 모두 w(20,20,20) 이므로 초기값은 20까지 설정해두면 된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;973&quot; data-origin-height=&quot;632&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dPfTWJ/btrsMAAyuoF/RWwEByXtO7oj730lFDdNN1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dPfTWJ/btrsMAAyuoF/RWwEByXtO7oj730lFDdNN1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dPfTWJ/btrsMAAyuoF/RWwEByXtO7oj730lFDdNN1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdPfTWJ%2FbtrsMAAyuoF%2FRWwEByXtO7oj730lFDdNN1%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;752&quot; height=&quot;489&quot; data-origin-width=&quot;973&quot; data-origin-height=&quot;632&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;문제풀이&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;a, b, c가 모두 같을 경우 a, b, c가 0 이하가 될 때까지 재귀를 돌게 되어 시간이 매우 오래 걸리므로, 메모이제이션을 활용하여 풀이했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;0~20 범위로 메모이제이션 배열 memo 를 만들어 초기값 0으로 설정하고, 0 이하일 경우부터 고려해준 후 memo 배열에 a,b,c 에 해당하는 값이 있으면 리턴한다.&lt;/p&gt;
&lt;pre id=&quot;code_1644304874478&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

memo = [[[0]*21 for _ in range(21)] for _ in range(21)]

def w(a,b,c):
    if a&amp;lt;=0 or b&amp;lt;=0 or c&amp;lt;=0 :
        return 1
    if a&amp;gt;20 or b&amp;gt;20 or c&amp;gt;20 :
        return w(20, 20, 20)
    if memo[a][b][c]:
        return memo[a][b][c]
    if a &amp;lt; b &amp;lt; c:
        memo[a][b][c] = w(a,b,c-1) + w(a,b-1,c-1) - w(a,b-1,c)
        return memo[a][b][c]
    memo[a][b][c] = w(a-1,b,c) + w(a-1,b-1,c) + w(a-1,b,c-1) - w(a-1,b-1,c-1)

    return memo[a][b][c]

while True:
    a, b, c = map(int, input().split())
    if a == -1 and b == -1 and c == -1:
        break
    print(f'w({a}, {b}, {c}) =', w(a,b,c))&lt;/code&gt;&lt;/pre&gt;
&lt;div&gt;
&lt;div&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;536&quot; data-origin-height=&quot;27&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bA9tUg/btrsROR0DvO/ZEXsZDVSwykCkRLwUrWgNK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bA9tUg/btrsROR0DvO/ZEXsZDVSwykCkRLwUrWgNK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bA9tUg/btrsROR0DvO/ZEXsZDVSwykCkRLwUrWgNK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbA9tUg%2FbtrsROR0DvO%2FZEXsZDVSwykCkRLwUrWgNK%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;536&quot; height=&quot;27&quot; data-origin-width=&quot;536&quot; data-origin-height=&quot;27&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/div&gt;
&lt;/div&gt;</description>
      <category>Algorithm/Baekjoon</category>
      <category>9184</category>
      <category>BOJ</category>
      <category>DP</category>
      <category>memoization</category>
      <category>python3</category>
      <category>메모이제이션</category>
      <category>백준</category>
      <category>신나는 함수 실행</category>
      <category>신나는함수실행</category>
      <category>재귀</category>
      <author>얍욥얍</author>
      <guid isPermaLink="true">https://dlforbi.tistory.com/72</guid>
      <comments>https://dlforbi.tistory.com/72#entry72comment</comments>
      <pubDate>Tue, 8 Feb 2022 16:32:10 +0900</pubDate>
    </item>
    <item>
      <title>[Algorithm] 1일1솔 - 백준 9663 스도쿠 (python3)</title>
      <link>https://dlforbi.tistory.com/69</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;문제링크&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/2580&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://www.acmicpc.net/problem/2580&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1643938933000&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;2580번: 스도쿠&quot; data-og-description=&quot;스도쿠는 18세기 스위스 수학자가 만든 '라틴 사각형'이랑 퍼즐에서 유래한 것으로 현재 많은 인기를 누리고 있다. 이 게임은 아래 그림과 같이 가로, 세로 각각 9개씩 총 81개의 작은 칸으로 이루&quot; data-og-host=&quot;www.acmicpc.net&quot; data-og-source-url=&quot;https://www.acmicpc.net/problem/2580&quot; data-og-url=&quot;https://www.acmicpc.net/problem/2580&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/ghCyg/hyNjOJRp5o/Ne4rUS2wITeeHhMfQCebvk/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630&quot;&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/2580&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.acmicpc.net/problem/2580&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/ghCyg/hyNjOJRp5o/Ne4rUS2wITeeHhMfQCebvk/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;2580번: 스도쿠&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;스도쿠는 18세기 스위스 수학자가 만든 '라틴 사각형'이랑 퍼즐에서 유래한 것으로 현재 많은 인기를 누리고 있다. 이 게임은 아래 그림과 같이 가로, 세로 각각 9개씩 총 81개의 작은 칸으로 이루&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.acmicpc.net&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;문제설명&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;문제풀이&lt;/h3&gt;</description>
      <category>Algorithm/Baekjoon</category>
      <category>14889</category>
      <category>backtracking</category>
      <category>dfs</category>
      <category>Python</category>
      <category>백준</category>
      <category>백트래킹</category>
      <category>완탐</category>
      <category>재귀함수</category>
      <category>파이썬</category>
      <author>얍욥얍</author>
      <guid isPermaLink="true">https://dlforbi.tistory.com/69</guid>
      <comments>https://dlforbi.tistory.com/69#entry69comment</comments>
      <pubDate>Mon, 24 Jan 2022 23:49:29 +0900</pubDate>
    </item>
    <item>
      <title>[Algorithm] 1일1솔 - 백준 14889 스타트와 링크 (python3)</title>
      <link>https://dlforbi.tistory.com/68</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;문제링크&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/14889&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://www.acmicpc.net/problem/14889&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1642727190262&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;14889번: 스타트와 링크&quot; data-og-description=&quot;예제 2의 경우에 (1, 3, 6), (2, 4, 5)로 팀을 나누면 되고, 예제 3의 경우에는 (1, 2, 4, 5), (3, 6, 7, 8)로 팀을 나누면 된다.&quot; data-og-host=&quot;www.acmicpc.net&quot; data-og-source-url=&quot;https://www.acmicpc.net/problem/14889&quot; data-og-url=&quot;https://www.acmicpc.net/problem/14889&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/hhPnz/hyNaokfRRh/3EsEcNs33WpxYqpMuLBY90/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630&quot;&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/14889&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.acmicpc.net/problem/14889&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/hhPnz/hyNaokfRRh/3EsEcNs33WpxYqpMuLBY90/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;14889번: 스타트와 링크&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;예제 2의 경우에 (1, 3, 6), (2, 4, 5)로 팀을 나누면 되고, 예제 3의 경우에는 (1, 2, 4, 5), (3, 6, 7, 8)로 팀을 나누면 된다.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.acmicpc.net&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;문제설명&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;짝수 N명의 사람들을 스타트 팀과 링크 팀으로 나누었을 때, 팀 간 능력치를 최소화하는 문제이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;S는 팀의 i번 사람과 j번 사람이 같은 팀에 속했을 때의 능력치를 담은 2차원 배열이며, S_ij 와 S_ji 는 다르게 취급되므로 그 경우를 각각 따져주기 위해 이중 for 문으로 각 능력치를 구하여 팀 전체의 능력치에 더해줬다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;805&quot; data-origin-height=&quot;276&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cHwHEU/btrspJRXAOA/gVB2xYQDkRLUwsFH5HgDQK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cHwHEU/btrspJRXAOA/gVB2xYQDkRLUwsFH5HgDQK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cHwHEU/btrspJRXAOA/gVB2xYQDkRLUwsFH5HgDQK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcHwHEU%2FbtrspJRXAOA%2FgVB2xYQDkRLUwsFH5HgDQK%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;805&quot; height=&quot;276&quot; data-origin-width=&quot;805&quot; data-origin-height=&quot;276&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;744&quot; data-origin-height=&quot;807&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/HbTGm/btrscOGH56q/kSAZWNSVK9jKagAHBQtyw0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/HbTGm/btrscOGH56q/kSAZWNSVK9jKagAHBQtyw0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/HbTGm/btrscOGH56q/kSAZWNSVK9jKagAHBQtyw0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FHbTGm%2FbtrscOGH56q%2FkSAZWNSVK9jKagAHBQtyw0%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;744&quot; height=&quot;807&quot; data-origin-width=&quot;744&quot; data-origin-height=&quot;807&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;문제풀이&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;combinations 를 활용해서 팀 조합을 만들고, 스타트팀과 링크팀의 능력치를 각각 구한 다음 능력치의 최솟값을 갱신하며 구했다. 링크팀은 팀 조합 중, 스타트팀으로 쓰인 팀과 겹치지 않도록 팀 조합의 맨 뒤 경우부터 따져주었다. (스타트팀은 팀 조합의 맨 앞부터 차례로)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;i번 사람과 j번 사람에 대한 능력치를 구하는 것이므로 S의 행과 열이 같은 경우는 if 문으로 제외해주었으나, 실질적으로 채점해보았을 때는 if 문을 넣어주지 않았을 경우가 더 빨랐다. (약 570ms 차이)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이미 col을 구하기 위한 for 문을 돌고 if 문을 처리해줘서 오히려 느려지는 것 같고, 어차피 행과 열이 같을 때의 능력치가 이미 0으로 들어와있기 때문에 그냥 다 더해줘도 처리속도에 있어서 문제가 있지 않은 것 같다.&lt;/p&gt;
&lt;pre id=&quot;code_1643936823939&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import sys
from itertools import combinations
input = sys.stdin.readline
n = int(input())
s = [list(map(int, input().split())) for _ in range(n)]
members = [i for i in range(n)]
team_comb = list(combinations(members, n//2))
min_gap = sys.maxsize

for i in range(len(team_comb)//2):	# 스타트팀과 링크팀의 두 경우를 따지기 위해 팀 조합의 반까지의 인덱스를 돌게 했다.
# 스타트팀
    team = team_comb[i]	# 팀 조합의 인덱스 0 ~ len(team_comb)//2 -1 까지
    start = 0
    for j in range(n//2):	# 팀 인원(n//2) 중에서  
        row = team[j]
        for col in team:
            if col != row:	# if 구간을 없애주는 것이 속도가 더 빠름
                start += s[row][col]

# 링크팀
    team = team_comb[-i-1]	# 팀 조합의 인덱스 -1(= len(team_comb)-1) ~ len(team_comb)//2 (= -len(team_comb)//2) 까지 역순으로
    link = 0
    for j in range(n//2):	# 팀 인원(n//2) 중에서 
        row = team[j]
        for col in team:
            if col != row:  # if 구간을 없애주는 것이 속도가 더 빠름
                link += s[row][col]
    min_gap = min(min_gap, abs(start-link))
print(min_gap)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;643&quot; data-origin-height=&quot;27&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/57Qiw/btrsrVdedmZ/XkGm1guqfU8WB6t4iFKJO1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/57Qiw/btrsrVdedmZ/XkGm1guqfU8WB6t4iFKJO1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/57Qiw/btrsrVdedmZ/XkGm1guqfU8WB6t4iFKJO1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F57Qiw%2FbtrsrVdedmZ%2FXkGm1guqfU8WB6t4iFKJO1%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;643&quot; height=&quot;27&quot; data-origin-width=&quot;643&quot; data-origin-height=&quot;27&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>Algorithm/Baekjoon</category>
      <category>14889</category>
      <category>backtracking</category>
      <category>dfs</category>
      <category>Python</category>
      <category>백준</category>
      <category>백트래킹</category>
      <category>스타트와링크</category>
      <category>완탐</category>
      <category>재귀함수</category>
      <category>파이썬</category>
      <author>얍욥얍</author>
      <guid isPermaLink="true">https://dlforbi.tistory.com/68</guid>
      <comments>https://dlforbi.tistory.com/68#entry68comment</comments>
      <pubDate>Fri, 21 Jan 2022 21:07:37 +0900</pubDate>
    </item>
    <item>
      <title>[Algorithm] 1일1솔 - 백준 14888 연산자 끼워넣기(python3)</title>
      <link>https://dlforbi.tistory.com/67</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;문제링크&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/14888&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://www.acmicpc.net/problem/14888&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1642725353210&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;14888번: 연산자 끼워넣기&quot; data-og-description=&quot;첫째 줄에 수의 개수 N(2 &amp;le; N &amp;le; 11)가 주어진다. 둘째 줄에는 A1, A2, ..., AN이 주어진다. (1 &amp;le; Ai &amp;le; 100) 셋째 줄에는 합이 N-1인 4개의 정수가 주어지는데, 차례대로 덧셈(+)의 개수, 뺄셈(-)의 개수,&amp;nbsp;&quot; data-og-host=&quot;www.acmicpc.net&quot; data-og-source-url=&quot;https://www.acmicpc.net/problem/14888&quot; data-og-url=&quot;https://www.acmicpc.net/problem/14888&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bBgW00/hyNatZ2yFA/DKNYQW14sIoWucVJA7fkpk/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630&quot;&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/14888&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.acmicpc.net/problem/14888&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bBgW00/hyNatZ2yFA/DKNYQW14sIoWucVJA7fkpk/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;14888번: 연산자 끼워넣기&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;첫째 줄에 수의 개수 N(2 &amp;le; N &amp;le; 11)가 주어진다. 둘째 줄에는 A1, A2, ..., AN이 주어진다. (1 &amp;le; Ai &amp;le; 100) 셋째 줄에는 합이 N-1인 4개의 정수가 주어지는데, 차례대로 덧셈(+)의 개수, 뺄셈(-)의 개수,&amp;nbsp;&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.acmicpc.net&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;문제설명&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;N개로 이루어진 수열과 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;예를 들어, -2 를 3으로 나누어야 한다면, -(-2) // 3 을 해준 후, -1을 곱해주어야 하는 식이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;주어지는 N의 개수는 다음과 같이 2 이상 11 이하라는 범위 하에 주어지므로 시간 초과 문제는 크게 신경쓰지 않고 (python으로) dfs로 풀었다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2316&quot; data-origin-height=&quot;576&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bs07y1/btrrjiUAtAF/xBi2AX6qlYqsMOSUNQ6v10/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bs07y1/btrrjiUAtAF/xBi2AX6qlYqsMOSUNQ6v10/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bs07y1/btrrjiUAtAF/xBi2AX6qlYqsMOSUNQ6v10/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbs07y1%2FbtrrjiUAtAF%2FxBi2AX6qlYqsMOSUNQ6v10%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;2316&quot; height=&quot;576&quot; data-origin-width=&quot;2316&quot; data-origin-height=&quot;576&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;문제풀이&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;DFS를 기반으로 연산자에 따른 조건을 구분해주며 최대값과 최소값을 갱신해주었다. 연산 횟수를 저장하는 cur 변수를 설정해 연산이 한 번 이뤄질 때마다 +1 을 하였고, 그 수가 n 과 같아지는 때를 탈출조건으로 설정하였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;계산되는 값의 변수는 ret로 설정했고, 계산은 앞에서부터 차례로 이뤄지므로 초기값은 피연산자로 주어지는 수들의 첫번째 값으로 두었다.&lt;/p&gt;
&lt;pre id=&quot;code_1642725414837&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

n = int(input())
opnd = list(map(int, input().split()))   # operand
optr = list(map(int, input().split()))   # opertor
max_val = -sys.maxsize  # 최대값 디폴트
min_val = sys.maxsize   # 최소값 디폴트

def dfs(cur, ret, p, m, mul, div):
    global min_val, max_val
    if cur == n:
        max_val = max(ret, max_val)
        min_val = min(ret, min_val)
        return

    if p:
        dfs(cur+1, ret+opnd[cur], p-1, m, mul, div)
    if m:
        dfs(cur+1, ret-opnd[cur], p, m-1, mul, div)
    if mul:
        dfs(cur+1, ret*opnd[cur], p, m, mul-1, div)
    if div:
        dfs(cur+1, -(abs(ret)//opnd[cur]) if ret &amp;lt; 0 else ret//opnd[cur], p, m, mul, div-1)

dfs(1, opnd[0], optr[0], optr[1], optr[2], optr[3])
print(max_val, min_val, sep='\n')


### 참고
print(-(2)//3)	# -1
print(-(2//3))	# 0&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Algorithm/Baekjoon</category>
      <category>14888</category>
      <category>backtracking</category>
      <category>permutations</category>
      <category>python3</category>
      <category>백준</category>
      <category>백트래킹</category>
      <category>순열</category>
      <category>실버1</category>
      <category>연산자끼워넣기</category>
      <category>파이썬</category>
      <author>얍욥얍</author>
      <guid isPermaLink="true">https://dlforbi.tistory.com/67</guid>
      <comments>https://dlforbi.tistory.com/67#entry67comment</comments>
      <pubDate>Thu, 20 Jan 2022 17:06:47 +0900</pubDate>
    </item>
    <item>
      <title>[Algorithm] 프로그래머스 Lv.3 N-Queen (backtracking, python3)</title>
      <link>https://dlforbi.tistory.com/66</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;문제링크&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://programmers.co.kr/learn/courses/30/lessons/12952&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://programmers.co.kr/learn/courses/30/lessons/12952&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1642555358359&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;코딩테스트 연습 - N-Queen&quot; data-og-description=&quot;가로, 세로 길이가 n인 정사각형으로된 체스판이 있습니다. 체스판 위의 n개의 퀸이 서로를 공격할 수 없도록 배치하고 싶습니다. 예를 들어서 n이 4인경우 다음과 같이 퀸을 배치하면 n개의 퀸은&quot; data-og-host=&quot;programmers.co.kr&quot; data-og-source-url=&quot;https://programmers.co.kr/learn/courses/30/lessons/12952&quot; data-og-url=&quot;https://programmers.co.kr/learn/courses/30/lessons/12952&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/CKsgY/hyM73ou6U9/LONDLanliT50vpclN37Ri0/img.jpg?width=626&amp;amp;height=626&amp;amp;face=0_0_626_626,https://scrap.kakaocdn.net/dn/bpL9me/hyM76FwMqz/zKfJkGUSKULV6GzGNCzO90/img.jpg?width=626&amp;amp;height=626&amp;amp;face=0_0_626_626&quot;&gt;&lt;a href=&quot;https://programmers.co.kr/learn/courses/30/lessons/12952&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://programmers.co.kr/learn/courses/30/lessons/12952&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/CKsgY/hyM73ou6U9/LONDLanliT50vpclN37Ri0/img.jpg?width=626&amp;amp;height=626&amp;amp;face=0_0_626_626,https://scrap.kakaocdn.net/dn/bpL9me/hyM76FwMqz/zKfJkGUSKULV6GzGNCzO90/img.jpg?width=626&amp;amp;height=626&amp;amp;face=0_0_626_626');&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;코딩테스트 연습 - N-Queen&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;가로, 세로 길이가 n인 정사각형으로된 체스판이 있습니다. 체스판 위의 n개의 퀸이 서로를 공격할 수 없도록 배치하고 싶습니다. 예를 들어서 n이 4인경우 다음과 같이 퀸을 배치하면 n개의 퀸은&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;programmers.co.kr&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;h3 data-ke-size=&quot;size23&quot;&gt;문제설명&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1111&quot; data-origin-height=&quot;709&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bg2y4R/btrq2jOtvMh/LyoBf8OjisbmI8zgqxiU01/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bg2y4R/btrq2jOtvMh/LyoBf8OjisbmI8zgqxiU01/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bg2y4R/btrq2jOtvMh/LyoBf8OjisbmI8zgqxiU01/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbg2y4R%2Fbtrq2jOtvMh%2FLyoBf8OjisbmI8zgqxiU01%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;772&quot; height=&quot;493&quot; data-origin-width=&quot;1111&quot; data-origin-height=&quot;709&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;631&quot; data-origin-height=&quot;382&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/67zlz/btrq6ZOGvV5/TpVCLCKLaFvI1Z6nOcBqqk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/67zlz/btrq6ZOGvV5/TpVCLCKLaFvI1Z6nOcBqqk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/67zlz/btrq6ZOGvV5/TpVCLCKLaFvI1Z6nOcBqqk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F67zlz%2Fbtrq6ZOGvV5%2FTpVCLCKLaFvI1Z6nOcBqqk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;626&quot; height=&quot;379&quot; data-origin-width=&quot;631&quot; data-origin-height=&quot;382&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;문제풀이&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1642556394102&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;def promising(i, col):      # 대각선 방향 겹치는지 체크
    k = 1
    flag = True
    while k &amp;lt; i and flag:
        if col[i] == col[k] or (abs(col[i]-col[k]) == i-k):
            flag = False
        k += 1
    return flag

def nqueen(i,n,col):    # 같은 행, 같은 열인지
    global ans
    if promising(i, col):
        if i == n:
            ans += 1
        else:
            for j in range(1, n+1):
                col[i+1] = j
                nqueen(i+1, n, col)
    return ans

ans = 0
def solution(n):
    col = [0] * (n + 1)
    return nqueen(0,n,col)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;821&quot; data-origin-height=&quot;398&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bpQstu/btrq9XQfxMy/KO1NQYFlGoGuaxyOnmxEI0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bpQstu/btrq9XQfxMy/KO1NQYFlGoGuaxyOnmxEI0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bpQstu/btrq9XQfxMy/KO1NQYFlGoGuaxyOnmxEI0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbpQstu%2Fbtrq9XQfxMy%2FKO1NQYFlGoGuaxyOnmxEI0%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;821&quot; height=&quot;398&quot; data-origin-width=&quot;821&quot; data-origin-height=&quot;398&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;pre id=&quot;code_1642557224614&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;def dfs(col,n,i):
    cnt = 0
    if n == i:
        return 1
    for j in range(n):
        col[i] = j
        for x in range(i):
            if col[x] == col[i]:
                break
            if abs(col[x] - col[i]) == (i-x):
                break
        else:
            cnt += dfs(col, n, i+1)
    return cnt

def solution(n):
    ans = dfs([0]*n, n, 0)
    return ans&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;820&quot; data-origin-height=&quot;404&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dcVSCu/btrq69Rpeuw/jumMNKejvHXJd2K3vjPS60/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dcVSCu/btrq69Rpeuw/jumMNKejvHXJd2K3vjPS60/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dcVSCu/btrq69Rpeuw/jumMNKejvHXJd2K3vjPS60/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdcVSCu%2Fbtrq69Rpeuw%2FjumMNKejvHXJd2K3vjPS60%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;820&quot; height=&quot;404&quot; data-origin-width=&quot;820&quot; data-origin-height=&quot;404&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;h3 data-ke-size=&quot;size23&quot;&gt;다른 풀이&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;야매이긴 하지만, 백준 문제처럼 조건이 더 빡센 n-queen 문제에서는 유용한 풀이인 것 같다.&lt;/p&gt;
&lt;pre id=&quot;code_1642572426283&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;def solution(n):
    nQueen = [0, 1, 0, 0, 2, 10, 4, 40, 92, 352, 724, 2680, 14200, 73712, 365596, 2279184, 14772512, 95815104, 666090624, 4968057848, 39029188884, 314666222712, 2691008701644, 24233937684440, 227514171973736, 2207893435808352, 22317699616364044, 234907967154122528]
    return nQueen[n]&lt;/code&gt;&lt;/pre&gt;</description>
      <category>Algorithm/Programmers</category>
      <category>Algorithm</category>
      <category>backtracking</category>
      <category>N-Queen</category>
      <category>NQueen</category>
      <category>Python</category>
      <category>백트래킹</category>
      <category>알고리즘</category>
      <category>코테</category>
      <category>파이썬</category>
      <category>프로그래머스</category>
      <author>얍욥얍</author>
      <guid isPermaLink="true">https://dlforbi.tistory.com/66</guid>
      <comments>https://dlforbi.tistory.com/66#entry66comment</comments>
      <pubDate>Wed, 19 Jan 2022 10:54:50 +0900</pubDate>
    </item>
    <item>
      <title>[Algorithm] 1일1솔 - 백준 15652 N과 M (4) (python3)</title>
      <link>https://dlforbi.tistory.com/64</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;문제링크&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/15652&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://www.acmicpc.net/problem/15652&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1642381302545&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;15652번: N과 M (4)&quot; data-og-description=&quot;한 줄에 하나씩 문제의 조건을 만족하는 수열을 출력한다. 중복되는 수열을 여러 번 출력하면 안되며, 각 수열은 공백으로 구분해서 출력해야 한다. 수열은 사전 순으로 증가하는 순서로 출력해&quot; data-og-host=&quot;www.acmicpc.net&quot; data-og-source-url=&quot;https://www.acmicpc.net/problem/15652&quot; data-og-url=&quot;https://www.acmicpc.net/problem/15652&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cQLgZv/hyM6A0Oafj/5qlds1OSTkhWNttpaBXRC1/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630&quot;&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/15652&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.acmicpc.net/problem/15652&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cQLgZv/hyM6A0Oafj/5qlds1OSTkhWNttpaBXRC1/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;15652번: N과 M (4)&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.acmicpc.net&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;문제설명&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #555555;&quot;&gt;앞서 풀이했던 N과 M 시리즈 문제(위 링크 참고)와 유사하다.&lt;/span&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1642383645945&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;[Algorithm] 1일1솔 - 백준 15649 N과 M (1) (python3)&quot; data-og-description=&quot;문제링크 https://www.acmicpc.net/problem/15649 15649번: N과 M (1) 한 줄에 하나씩 문제의 조건을 만족하는 수열을 출력한다. 중복되는 수열을 여러 번 출력하면 안되며, 각 수열은 공백으로 구분해서 출력&quot; data-og-host=&quot;dlforbi.tistory.com&quot; data-og-source-url=&quot;https://dlforbi.tistory.com/61&quot; data-og-url=&quot;https://dlforbi.tistory.com/61&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/buCFDa/hyM6MmMbJS/4rEtsfj0QQFYRk9hd9kFM0/img.png?width=748&amp;amp;height=423&amp;amp;face=0_0_748_423,https://scrap.kakaocdn.net/dn/nA5S4/hyM8al0Evq/G70oHj0kmixk4TzVi93vg0/img.png?width=748&amp;amp;height=423&amp;amp;face=0_0_748_423,https://scrap.kakaocdn.net/dn/LmcJI/hyM6Di3OtA/oQzV7koBk4wiyCjZi6wHt0/img.png?width=972&amp;amp;height=620&amp;amp;face=0_0_972_620&quot;&gt;&lt;a href=&quot;https://dlforbi.tistory.com/61&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://dlforbi.tistory.com/61&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/buCFDa/hyM6MmMbJS/4rEtsfj0QQFYRk9hd9kFM0/img.png?width=748&amp;amp;height=423&amp;amp;face=0_0_748_423,https://scrap.kakaocdn.net/dn/nA5S4/hyM8al0Evq/G70oHj0kmixk4TzVi93vg0/img.png?width=748&amp;amp;height=423&amp;amp;face=0_0_748_423,https://scrap.kakaocdn.net/dn/LmcJI/hyM6Di3OtA/oQzV7koBk4wiyCjZi6wHt0/img.png?width=972&amp;amp;height=620&amp;amp;face=0_0_972_620');&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;[Algorithm] 1일1솔 - 백준 15649 N과 M (1) (python3)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;문제링크 https://www.acmicpc.net/problem/15649 15649번: N과 M (1) 한 줄에 하나씩 문제의 조건을 만족하는 수열을 출력한다. 중복되는 수열을 여러 번 출력하면 안되며, 각 수열은 공백으로 구분해서 출력&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;dlforbi.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;figure id=&quot;og_1642383659410&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;[Algorithm] 1일1솔 - 백준 15650 N과 M (2) (python3)&quot; data-og-description=&quot;문제링크 https://www.acmicpc.net/problem/15650 15650번: N과 M (2) 한 줄에 하나씩 문제의 조건을 만족하는 수열을 출력한다. 중복되는 수열을 여러 번 출력하면 안되며, 각 수열은 공백으로 구분해서 출력&quot; data-og-host=&quot;dlforbi.tistory.com&quot; data-og-source-url=&quot;https://dlforbi.tistory.com/62&quot; data-og-url=&quot;https://dlforbi.tistory.com/62&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bd2UKM/hyM6OdNi3k/zk5xTSJYv6KRvEQ4y8xEaK/img.png?width=800&amp;amp;height=365&amp;amp;face=0_0_800_365,https://scrap.kakaocdn.net/dn/bVg8NW/hyM6Ox7tEy/jLZZoeiOtqCSsyeKBMeW80/img.png?width=800&amp;amp;height=365&amp;amp;face=0_0_800_365,https://scrap.kakaocdn.net/dn/ba6bsg/hyM6NMKxcF/zvxnsP3K4t6bEIehK7g17K/img.png?width=988&amp;amp;height=621&amp;amp;face=0_0_988_621&quot;&gt;&lt;a href=&quot;https://dlforbi.tistory.com/62&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://dlforbi.tistory.com/62&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bd2UKM/hyM6OdNi3k/zk5xTSJYv6KRvEQ4y8xEaK/img.png?width=800&amp;amp;height=365&amp;amp;face=0_0_800_365,https://scrap.kakaocdn.net/dn/bVg8NW/hyM6Ox7tEy/jLZZoeiOtqCSsyeKBMeW80/img.png?width=800&amp;amp;height=365&amp;amp;face=0_0_800_365,https://scrap.kakaocdn.net/dn/ba6bsg/hyM6NMKxcF/zvxnsP3K4t6bEIehK7g17K/img.png?width=988&amp;amp;height=621&amp;amp;face=0_0_988_621');&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;[Algorithm] 1일1솔 - 백준 15650 N과 M (2) (python3)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;문제링크 https://www.acmicpc.net/problem/15650 15650번: N과 M (2) 한 줄에 하나씩 문제의 조건을 만족하는 수열을 출력한다. 중복되는 수열을 여러 번 출력하면 안되며, 각 수열은 공백으로 구분해서 출력&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;dlforbi.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;figure id=&quot;og_1642383672162&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;[Algorithm] 1일1솔 - 백준 15651 N과 M (3) (python3)&quot; data-og-description=&quot;문제링크 https://www.acmicpc.net/problem/15651 15651번: N과 M (3) 한 줄에 하나씩 문제의 조건을 만족하는 수열을 출력한다. 중복되는 수열을 여러 번 출력하면 안되며, 각 수열은 공백으로 구분해서 출력&quot; data-og-host=&quot;dlforbi.tistory.com&quot; data-og-source-url=&quot;https://dlforbi.tistory.com/63&quot; data-og-url=&quot;https://dlforbi.tistory.com/63&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/MB4N1/hyM77bKA69/YYnAoQ2QPux5trzgVOPVa1/img.png?width=800&amp;amp;height=758&amp;amp;face=0_0_800_758,https://scrap.kakaocdn.net/dn/nfew8/hyM6NeSvRE/S0fqfLEeXutiJmBXn1IqCk/img.png?width=800&amp;amp;height=758&amp;amp;face=0_0_800_758,https://scrap.kakaocdn.net/dn/bVR29y/hyM6EhYm4i/aEf2kA2gU52TLSPvjkSrnk/img.png?width=994&amp;amp;height=943&amp;amp;face=0_0_994_943&quot;&gt;&lt;a href=&quot;https://dlforbi.tistory.com/63&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://dlforbi.tistory.com/63&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/MB4N1/hyM77bKA69/YYnAoQ2QPux5trzgVOPVa1/img.png?width=800&amp;amp;height=758&amp;amp;face=0_0_800_758,https://scrap.kakaocdn.net/dn/nfew8/hyM6NeSvRE/S0fqfLEeXutiJmBXn1IqCk/img.png?width=800&amp;amp;height=758&amp;amp;face=0_0_800_758,https://scrap.kakaocdn.net/dn/bVR29y/hyM6EhYm4i/aEf2kA2gU52TLSPvjkSrnk/img.png?width=994&amp;amp;height=943&amp;amp;face=0_0_994_943');&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;[Algorithm] 1일1솔 - 백준 15651 N과 M (3) (python3)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;문제링크 https://www.acmicpc.net/problem/15651 15651번: N과 M (3) 한 줄에 하나씩 문제의 조건을 만족하는 수열을 출력한다. 중복되는 수열을 여러 번 출력하면 안되며, 각 수열은 공백으로 구분해서 출력&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;dlforbi.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #555555;&quot;&gt;&lt;b&gt;'고른 수열은 비내림차순이어야 한다'는 조건&lt;/b&gt;이 추가되었다. &lt;b&gt;백트래킹으로 풀이하면 pruning 과정에서 해당 조건을 추가&lt;/b&gt;해주면 된다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또한, 경우의 수로 풀이하는 경우에는 &lt;b&gt;비내림차순&lt;/b&gt; 조건을 충족시킨다는 건&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;순서 상관없이 같은 수열로 취급&lt;/b&gt;하며, &lt;b&gt;같은 수도 중복하여 인정&lt;/b&gt;한다는 의미이므로,&lt;span&gt; &lt;/span&gt;&lt;b&gt;중복조합&lt;/b&gt;을 이용해서 풀 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;951&quot; data-origin-height=&quot;866&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/baOHGH/btrqXwenkhp/RIul9Ksh3P4SEVotZwNoqk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/baOHGH/btrqXwenkhp/RIul9Ksh3P4SEVotZwNoqk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/baOHGH/btrqXwenkhp/RIul9Ksh3P4SEVotZwNoqk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbaOHGH%2FbtrqXwenkhp%2FRIul9Ksh3P4SEVotZwNoqk%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;951&quot; height=&quot;866&quot; data-origin-width=&quot;951&quot; data-origin-height=&quot;866&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;h3 data-ke-size=&quot;size23&quot;&gt;문제풀이&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1. 중복조합&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;중복조합 nHr&lt;/b&gt;을 구하기 위해서 &lt;b&gt;itertools&lt;/b&gt; 의 &lt;b&gt;combinations_with_replacement&lt;/b&gt;&amp;nbsp;를 사용해서 풀이하였다.&lt;/p&gt;
&lt;pre id=&quot;code_1642382873651&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import sys
from itertools import combinations_with_replacement

n, m = map(int, sys.stdin.readline().split())
comb = combinations_with_replacement(range(1,n+1),m)
for x in comb:
    print(*x)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;532&quot; data-origin-height=&quot;28&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bKWgVj/btrqMSjtnjf/tzX6KwTcvR8ik9bJd2bs01/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bKWgVj/btrqMSjtnjf/tzX6KwTcvR8ik9bJd2bs01/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bKWgVj/btrqMSjtnjf/tzX6KwTcvR8ik9bJd2bs01/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbKWgVj%2FbtrqMSjtnjf%2FtzX6KwTcvR8ik9bJd2bs01%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;532&quot; height=&quot;28&quot; data-origin-width=&quot;532&quot; data-origin-height=&quot;28&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;2. 백트래킹&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;stack이 비어있는 경우 또는, stack에 수가 들어있는 경우 순서 조건(비내림차순) 고려하여 if문에서 pruning 작업을 수행&lt;/b&gt;했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자연수 i 추가한 후 dfs로 탐색하고, 이후 스택에서 자연수 pop하여 제거하며 반복탐색한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;탈출 조건은 스택의 길이가 M이 될 때로 설정하였다.&lt;/p&gt;
&lt;pre id=&quot;code_1642383073471&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import sys

n, m = map(int, sys.stdin.readline().split())
ret = []
def dfs():
    if len(ret) == m:
        print(*ret)
        return
    for i in range(1, n+1):
        if not ret or (ret and ret[-1] &amp;lt;= i):
            ret.append(i)
            dfs()
            ret.pop()
        else:
            continue
dfs()&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;536&quot; data-origin-height=&quot;29&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bc9aQE/btrqMRSlUec/dXSQ5rwZg2KnlcE3Wmltbk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bc9aQE/btrqMRSlUec/dXSQ5rwZg2KnlcE3Wmltbk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bc9aQE/btrqMRSlUec/dXSQ5rwZg2KnlcE3Wmltbk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbc9aQE%2FbtrqMRSlUec%2FdXSQ5rwZg2KnlcE3Wmltbk%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;536&quot; height=&quot;29&quot; data-origin-width=&quot;536&quot; data-origin-height=&quot;29&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>Algorithm/Baekjoon</category>
      <category>15652</category>
      <category>backtracking</category>
      <category>dfs</category>
      <category>N과M</category>
      <category>N과M(4)</category>
      <category>Python</category>
      <category>백준 15652</category>
      <category>백트래킹</category>
      <category>알고리즘</category>
      <category>파이썬</category>
      <author>얍욥얍</author>
      <guid isPermaLink="true">https://dlforbi.tistory.com/64</guid>
      <comments>https://dlforbi.tistory.com/64#entry64comment</comments>
      <pubDate>Mon, 17 Jan 2022 10:50:20 +0900</pubDate>
    </item>
  </channel>
</rss>