-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathsearch.xml
3208 lines (1538 loc) · 909 KB
/
search.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
<?xml version="1.0" encoding="utf-8"?>
<search>
<entry>
<title>Hexo 블로그 테마 추가</title>
<link href="/2022/11/03/blog-hexoTheme/"/>
<url>/2022/11/03/blog-hexoTheme/</url>
<content type="html"><![CDATA[<h1 id="Hexo-Blog-테마-설치"><a href="#Hexo-Blog-테마-설치" class="headerlink" title="Hexo Blog 테마 설치"></a>Hexo Blog 테마 설치</h1><p>저의 경우 butterfly theme을 사용하고 있어, butterfly theme 기준으로 설명하겠습니다</p><ul><li>command 창에 아래 명령어를 입력해 테마를 github에서 다운로드 받아옵니다</li></ul><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git clone -b master https://github.com/jerryc127/hexo-theme-butterfly.git themes/butterfly</span><br></pre></td></tr></table></figure><ul><li>root 폴더의 config.yml로 이동하여 테마를 butterfly로 변경합니다</li></ul><figure class="highlight yml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># Extensions</span></span><br><span class="line"><span class="comment">## Plugins: https://hexo.io/plugins/</span></span><br><span class="line"><span class="comment">## Themes: https://hexo.io/themes/</span></span><br><span class="line"><span class="attr">theme:</span> <span class="string">butterfly</span></span><br></pre></td></tr></table></figure><ul><li><p>이제 <code>hexo clean && hexo server</code>로 local에서 테마가 바뀌었는지 테스트 합니다</p><ul><li>만약 바뀌지 않았다면?<ul><li>themes 폴더에 들어가서 butterfly를 제외하고 모두 삭제</li><li>브라우저에서 캐시 모두 삭제</li><li><code>hexo deploy -g</code> 실행</li></ul></li></ul></li><li><p>테마 별로 지원하는 기능이 다르니 기존의 설정도 다시 해봅니다</p><ul><li><code>google-analystics</code>를 themes-config.yml에서 다시 설정할 수 있습니다</li></ul></li></ul>]]></content>
<categories>
<category> algorithm </category>
</categories>
</entry>
<entry>
<title>Hexo 블로그 구글 애널리스틱스 등록</title>
<link href="/2022/10/31/blog-googleAnalistic/"/>
<url>/2022/10/31/blog-googleAnalistic/</url>
<content type="html"><![CDATA[<h1 id="개요"><a href="#개요" class="headerlink" title="개요"></a>개요</h1><p>멘토링 중 hexo blog를 구글 서치 콘솔에 등록하려던 중 문제 발생<br>일반적인 html 삽입 방식 말고 깔끔한 방법이 있었던걸로 기억해서 기억 복구 겸 재정리합니다</p><h1 id="Google-Analistics"><a href="#Google-Analistics" class="headerlink" title="Google Analistics"></a>Google Analistics</h1><ul><li>구글 애널리스틱스는 웹,앱 등의 메타데이터 관리 지원해주는 구글 서비스입니다</li></ul><h2 id="Google-Analistics-등록"><a href="#Google-Analistics-등록" class="headerlink" title="Google Analistics 등록"></a>Google Analistics 등록</h2><ul><li><a href="https://analytics.google.com/">구글 애널리스틱스 홈페이지</a>에 접속합니다</li><li>설정 - 관리에서 속성을 생성합니다<ul><li>속성 생성시 이름은 <code>Github Pages</code>로 생성합니다</li><li>데이터 스트림 - 웹 - 본인의 블로그 url을 등록합니다</li></ul></li><li>url 등록까지 마치면 코드가 발급 됨을 확인할 수 있습니다</li></ul><h2 id="Hexo-등록"><a href="#Hexo-등록" class="headerlink" title="Hexo 등록"></a>Hexo 등록</h2><ul><li>본인의 theme 하위의 config.yml에 들어가 생성된 코드를 아래 형식으로 입력<ul><li><code>google_analytics: G-C17******</code></li></ul></li><li><code>hexo deploy -g</code>후 구글 서치 콘솔 등록시 구글 애널리스틱스로 등록하시면 됩니다</li></ul>]]></content>
<categories>
<category> blog </category>
</categories>
</entry>
<entry>
<title>hexo blog SEO와 Sitemap setting</title>
<link href="/2022/10/14/blog-sitemap-seo/"/>
<url>/2022/10/14/blog-sitemap-seo/</url>
<content type="html"><![CDATA[<h1 id="Hexo-SEO와-sitemap-xml"><a href="#Hexo-SEO와-sitemap-xml" class="headerlink" title="Hexo SEO와 sitemap.xml"></a>Hexo SEO와 sitemap.xml</h1><ul><li>아래 커맨드를 터미널(git bash 등)에 실행해주세요</li></ul><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">npm install hexo-generator-feed --save</span><br><span class="line">npm install hexo-generator-seo-friendly-sitemap --save</span><br></pre></td></tr></table></figure><ul><li>블로그 폴더의 <code>_config.yml</code>에 아래 복사 붙여 넣기 합니다</li></ul><figure class="highlight yml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">feed:</span></span><br><span class="line"> <span class="attr">type:</span> <span class="string">atom</span> <span class="comment"># atom or rss2</span></span><br><span class="line"> <span class="attr">path:</span> <span class="string">atom.xml</span></span><br><span class="line"> <span class="attr">limit:</span> <span class="number">50</span> <span class="comment"># 공개할 rss feed 수</span></span><br><span class="line"> <span class="comment"># 기본적으로 여기까지만 쓴다. 아래는 옵션</span></span><br><span class="line"> <span class="attr">hub:</span></span><br><span class="line"> <span class="attr">content:</span></span><br><span class="line"> <span class="attr">content_limit:</span> <span class="number">140</span> <span class="comment"># 요약 글자수</span></span><br><span class="line"> <span class="attr">content_limit_delim:</span> <span class="string">' '</span></span><br><span class="line"><span class="comment"># sitemap auto generator</span></span><br><span class="line"><span class="attr">sitemap:</span></span><br><span class="line"> <span class="attr">path:</span> <span class="string">sitemap.xml</span></span><br><span class="line"> <span class="attr">tag:</span> <span class="literal">true</span> <span class="comment"># 사이트맵에 태그 주소 포함 여부</span></span><br><span class="line"> <span class="attr">category:</span> <span class="literal">true</span> <span class="comment"># 사이트맵에 카테고리 주소 포함 여부</span></span><br></pre></td></tr></table></figure><ul><li><p>터미널에 <code>hexo deploy -g</code> 를 입력합니다</p></li><li><p><a href="https://search.google.com/search-console?hl=ko&resource_id=https://goberomsu.github.io/">구글 서치 콘솔</a>에 들어갑니다.</p><ul><li>처음 들어가면 속성 유형을 선택하라 뜰텐데, URL 접두어에 자신의 블로그 주소를 입력합니다<ul><li><img src="https://user-images.githubusercontent.com/37897508/195773123-a1485b63-d557-4220-89de-c319c13322c8.png" alt="image"></li><li>저의 경우 <a href="https://goberomsu.github.io/">https://goberomsu.github.io/</a>를 입력해야겠죠!?</li></ul></li><li>다음은 sitemaps에 들어가 sitemap.xml을 입력하고 제출합니다<ul><li><img src="https://user-images.githubusercontent.com/37897508/195773825-1a7d6a14-af84-443b-972c-7b6d441bdead.png" alt="image"></li><li>왼쪽 Tab을 보면 있습니다</li></ul></li></ul></li><li><p>sitemap이 바로 뜨지 않기도 하는데 그럴 땐 조금 기다려주세요</p></li></ul>]]></content>
<categories>
<category> algorithm </category>
</categories>
</entry>
<entry>
<title>Kurento 시그널링 서버 feat STUN/TURN</title>
<link href="/2022/08/15/kurento-signaling/"/>
<url>/2022/08/15/kurento-signaling/</url>
<content type="html"><![CDATA[<h2 id="시그널링-서버-왜-필요한가"><a href="#시그널링-서버-왜-필요한가" class="headerlink" title="시그널링 서버 왜 필요한가?"></a>시그널링 서버 왜 필요한가?</h2><p>시그널링이 필요한 이유를 꼽으라면, WebRTC를 이용한 P2P 통신을 하기 전 세팅을 하기 위함이다.<br>제 3자 소프트웨어 설치 없이 종단 간 데이터 공유화 화상 회를</p><h2 id="Reference"><a href="#Reference" class="headerlink" title="Reference"></a>Reference</h2><p><a href="https://gh402.tistory.com/47">[WebRTC] WebRTC를 공부하며 스트리밍 과정 익히기</a></p><p><a href="https://medium.com/monday-9-pm/%EC%B4%88%EB%B3%B4-%EA%B0%9C%EB%B0%9C%EC%9E%90-webrtc-%EC%8B%9C%EB%8F%99%EA%B1%B8%EA%B8%B0-ebefe6feadf7">초보 개발자 WebRTC 시동걸기</a></p><p><a href="https://medium.com/monday-9-pm/%EC%B4%88%EB%B3%B4%EA%B0%9C%EB%B0%9C%EC%9E%90-webrtc-%EC%8B%9C%EA%B7%B8%EB%84%90%EB%A7%81%EC%84%9C%EB%B2%84-%EB%A7%8C%EB%93%A4%EA%B8%B0-caf8cf9adc9a">초보개발자 WebRTC 시그널링서버 만들기</a></p>]]></content>
<categories>
<category> dev </category>
</categories>
</entry>
<entry>
<title>Docker 사용법</title>
<link href="/2022/08/14/howToUseDocker/"/>
<url>/2022/08/14/howToUseDocker/</url>
<content type="html"><![CDATA[<h1 id="Docker-사용법"><a href="#Docker-사용법" class="headerlink" title="Docker 사용법"></a>Docker 사용법</h1><ul><li>모든 이미지 제거</li></ul><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">docker rm $(docker ps -a -q)</span><br></pre></td></tr></table></figure><ul><li>이미지 직접 접근</li></ul><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">docker exec -it [container_id] bash</span><br></pre></td></tr></table></figure><ul><li>이미지 조회</li></ul><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">docker images -a</span><br></pre></td></tr></table></figure><h2 id="Docker-설치"><a href="#Docker-설치" class="headerlink" title="Docker 설치"></a>Docker 설치</h2><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br></pre></td><td class="code"><pre><span class="line">// apt 인덱스 업데이트</span><br><span class="line"><span class="meta prompt_">$ </span><span class="language-bash">sudo apt-get update</span></span><br><span class="line"></span><br><span class="line">// repository over HTTPS를 사용하기 위한 패키지 설치</span><br><span class="line"><span class="meta prompt_">$ </span><span class="language-bash">sudo apt-get install -y apt-transport-https ca-certificates curl gnupg-agent software-properties-common</span></span><br><span class="line"></span><br><span class="line">// GPG Key를 추가하고 확인</span><br><span class="line"><span class="meta prompt_">$ </span><span class="language-bash">curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -</span></span><br><span class="line"><span class="meta prompt_">$ </span><span class="language-bash">sudo apt-key fingerprint 0EBFCD88</span></span><br><span class="line"></span><br><span class="line">pub rsa4096 2017-02-22 [SCEA]</span><br><span class="line"> 9DC8 5822 9FC7 DD38 854A E2D8 8D81 803C 0EBF CD88</span><br><span class="line">uid [ unknown] Docker Release (CE deb) <[email protected]></span><br><span class="line">sub rsa4096 2017-02-22 [S]</span><br><span class="line"></span><br><span class="line">// 저장소 추가하고 apt 인덱스 업데이트</span><br><span class="line"><span class="meta prompt_">$ </span><span class="language-bash">sudo add-apt-repository <span class="string">"deb [arch=amd64] https://download.docker.com/linux/ubuntu <span class="subst">$(lsb_release -cs)</span> stable"</span></span></span><br><span class="line"><span class="meta prompt_">$ </span><span class="language-bash">sudo apt-get update</span></span><br><span class="line"></span><br><span class="line">// Docker 설치</span><br><span class="line"><span class="meta prompt_">$ </span><span class="language-bash">sudo apt-get install docker-ce docker-ce-cli containerd.io</span></span><br><span class="line"></span><br><span class="line">// Docker 서비스 시작</span><br><span class="line"><span class="meta prompt_">$ </span><span class="language-bash">sudo systemctl start docker</span></span><br></pre></td></tr></table></figure><h2 id="Error"><a href="#Error" class="headerlink" title="Error"></a>Error</h2><p>socket 파일이 없는 경우</p><ul><li>Docker를 설치하고 재부팅하면 된다!</li></ul>]]></content>
<categories>
<category> dev </category>
</categories>
</entry>
<entry>
<title>git 사용 방법</title>
<link href="/2022/08/10/howToUseGit/"/>
<url>/2022/08/10/howToUseGit/</url>
<content type="html"><![CDATA[<h1 id="Git-사용법"><a href="#Git-사용법" class="headerlink" title="Git 사용법"></a>Git 사용법</h1><ul><li>원격 저장소 갱신</li></ul><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git remote update </span><br></pre></td></tr></table></figure><ul><li>원격 저장소 branch 확인</li></ul><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git branch -r</span><br></pre></td></tr></table></figure><ul><li>원격 저장소 가져오기<ul><li>branch 이름 형식은 origin/dev 이렇게 적어야합니다.</li><li>git branch -r로 출력된 이름을 입력하면 되요</li></ul></li></ul><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git checkout -t [branch 이름]</span><br></pre></td></tr></table></figure><h2 id="Reference"><a href="#Reference" class="headerlink" title="Reference"></a>Reference</h2><p><a href="https://yztech.tistory.com/32">git 브랜치: 가져오기, 합치기, 삭제하기</a></p>]]></content>
<categories>
<category> dev </category>
</categories>
<tags>
<tag> git </tag>
</tags>
</entry>
<entry>
<title>Linear Regression(회귀) - ML</title>
<link href="/2022/07/31/ai-LinearRegression/"/>
<url>/2022/07/31/ai-LinearRegression/</url>
<content type="html"><![CDATA[<h1 id="Linear-Regression-회귀-ML"><a href="#Linear-Regression-회귀-ML" class="headerlink" title="Linear Regression(회귀) - ML"></a>Linear Regression(회귀) - ML</h1><p>선형 예측 함수를 사용해 회귀식을 모델링하여 알려지지 않은 파라미터는 데이터부터 추정한다<br>현실 세계의 많은 데이터들은 선형 그래프를 그리고, 선형 그래프는 직관적이다.<br>늦게 잘수록 피곤하다. 많이 먹을수록 배부르다 등 대부분의 데이터가 근사하게 선을 그리게 된다</p><p>이러한 회귀 모델은 일반적으로 최소 제곱법을 사용해 선형 회귀 모델을 만든다<br> - 최소 제곱법을 사용하면 일단 값이 모두 양수가 나오고, 선형 함수 - 실제 값에 가중치를 주는 것을 의미한다</p><h2 id="Linear-Hypothesis"><a href="#Linear-Hypothesis" class="headerlink" title="Linear Hypothesis"></a>Linear Hypothesis</h2><p>선형한 그래프를 예측한다는 것은 어떤 데이터 값의 집합에서 Linear한 선을 찾는다 생각할 수 있다<br>이 때 Linear Regression Model이 학습 하는 것은 해당 데이터를 가장 잘 표현하는 선형 그래프를 찾는 것이다.</p><p>또한 축이 2개이고, 일반적으로 변수가 2개이므로, H(x) = Wx+b의 그래프를 가진다<br>H(x)는 가설이며, Hypothesis를 세우는 것이 선형 회귀의 시작이다.</p><h2 id="Cost-오차-x2F-손실"><a href="#Cost-오차-x2F-손실" class="headerlink" title="Cost (오차/손실)"></a>Cost (오차/손실)</h2><p>데이터 분석에서 중요한 것은 오차를 파악하는 것이다.<br>실제 데이터와 모델의 값 차이를 오차라고 한다. 이 값 차이가 작을수록 당연히 정밀하다</p><p>오차를 Cost라하며 오차를 최소화하는 것이 모델링의 주요한 요점이다.<br>그렇다면 이 Cost를 표현해야할텐데 표현하는 방식은 다양하다.<br>이러한 방법들을 Cost(Loss) Function이라하며, Cost를 최소화하는 함수를 minimize Cost Function이라고 한다.</p><h3 id="Gradient-descent-algorithm"><a href="#Gradient-descent-algorithm" class="headerlink" title="Gradient descent algorithm"></a>Gradient descent algorithm</h3><h2 id="Reference"><a href="#Reference" class="headerlink" title="Reference"></a>Reference</h2><p><a href="https://ko.wikipedia.org/wiki/%EC%84%A0%ED%98%95_%ED%9A%8C%EA%B7%80">선형 회귀</a><br><a href="https://ko.wikipedia.org/wiki/%EC%84%A0%ED%98%95_%ED%9A%8C%EA%B7%80">선형 회귀 쉽게 이해하기</a></p>]]></content>
<categories>
<category> ai </category>
</categories>
</entry>
<entry>
<title>Kurento Docker로 설치하는 방법 feat Window</title>
<link href="/2022/07/28/kurentoSetUp/"/>
<url>/2022/07/28/kurentoSetUp/</url>
<content type="html"><![CDATA[<h2 id="현재-상황"><a href="#현재-상황" class="headerlink" title="현재 상황"></a>현재 상황</h2><ul><li>Window Docker Client가 있긴 하지만, 프로젝트 초기기도 하구 이참에 그냥 WSL에서 쓰는게 더 편할거라 생각했다</li></ul><h2 id="준비-사항"><a href="#준비-사항" class="headerlink" title="준비 사항"></a>준비 사항</h2><ul><li>WSL2</li><li><del>Kali Linux</del><ul><li>Kali도 데비안 계열이라 상관 없을거라 생각했는데 패키지 저장소 관련 에러가 막 터져서 우분투로 갔다</li><li>22.07.30 기준 Ubuntu가 정신 건강에 매우 좋다</li></ul></li><li>Ubuntu 18.0.5</li><li>Docker</li></ul><h2 id="WSL2에-Docker-설치"><a href="#WSL2에-Docker-설치" class="headerlink" title="WSL2에 Docker 설치"></a>WSL2에 Docker 설치</h2><ol><li><p>Docker 설치</p><ul><li><p><a href="https://www.docker.com/products/docker-desktop/">Docker 홈페이지</a>에 들어가서 윈도우용 클라이언트를 설치한다<br><img src="https://user-images.githubusercontent.com/37897508/182014118-39e55cfe-7778-4fa1-a510-0e9d83d8ab68.png" alt="image"></p></li><li><p>설치가 완료되면 Docker를 열어서 Setting - Resource에서 WSL2와 연동 시키고, Restart 하면 된다.</p></li><li><p>이제 docker images 커맨드를 입력하면 아래와 같이 실행되는 것을 알 수 있다</p></li></ul><p> <img src="https://user-images.githubusercontent.com/37897508/181415322-cf5ce763-e6c7-49e8-a5bb-513a47c93c6e.png" alt="Docker 설치 완료!"></p></li><li><p>Docker 저장소에서 Kurento Server 가져오자</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">docker pull kurento/kurento-media-server:latest</span><br></pre></td></tr></table></figure></li><li><p>Kurento Media Server 실행</p></li></ol><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">docker run -d --name kms --network host \kurento/kurento-media-server:latest</span><br></pre></td></tr></table></figure><ul><li><p>Docker 옵션의 의미는 아래와 같다</p><ul><li>-d : 백그라운드 실행을 하겠다</li><li>–name : 현재 실행 시킬 이미지의 이름(별칭)을 정한다</li><li>–network: 컨테이너의 네트워크 설정<ul><li>host : 컨테이너를 호스트 컴퓨터와 동일한 네트워크에서 돌리겠다는 의미이다.</li></ul></li></ul></li><li><p>host 적고 한 칸 띄고 \kurento/kurento-media-server:latest로 적어야한다</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">docker run --rm \-p 8888:8888/tcp \-p 5000-5050:5000-5050/udp \-e KMS_MIN_PORT=5000 \-e KMS_MAX_PORT=5050 \kurento/kurento-media-server:latest</span><br></pre></td></tr></table></figure></li><li><p>마지막으로 실행 중인 미디어 서버의 포트 설정을 해준다</p></li></ul><h2 id="Error"><a href="#Error" class="headerlink" title="Error"></a>Error</h2><h3 id="Hardware-assisted-virtualization-and-data-execution-protection-must-be-enabled-in-the-BIOS"><a href="#Hardware-assisted-virtualization-and-data-execution-protection-must-be-enabled-in-the-BIOS" class="headerlink" title="Hardware assisted virtualization and data execution protection must be enabled in the BIOS"></a>Hardware assisted virtualization and data execution protection must be enabled in the BIOS</h3><ul><li>제어판 설정에서 Hypervisor, 가상 머신이 켜져 있었고 혹시 몰라 컨테이너도 켰음에도 에러가 발생하였다. 보통 나의 경우에는 윈도우에서 Docker의 경우 Hypervisor를 거쳐서 실행되는데 자동 실행 등을 꺼놓아서 에러를 겪었다</li></ul><ol><li>Hyper-v 재활성화</li></ol><p>Powershell을 관리자 권한으로 실행 한다. 아래 커맨드를 입력 후 재부팅한다</p><figure class="highlight powershell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">Enable-WindowsOptionalFeature</span> <span class="literal">-Online</span> <span class="literal">-FeatureName</span> Microsoft<span class="literal">-Hyper-V</span> <span class="literal">-All</span></span><br></pre></td></tr></table></figure><ol start="2"><li>Hyper-v 자동실행 설정</li></ol><p>Powershell을 관리자 권한으로 실행 후 아래 명령어 입력하고 재부팅한다.</p><figure class="highlight powershell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">bcdedit /<span class="built_in">set</span> hypervisorlaunchtype auto</span><br></pre></td></tr></table></figure><h3 id="gnupg-gnupg2-and-gnupg1-do-not-seem-to-be-installed-but-one-of-them-is-required-for-this-operation"><a href="#gnupg-gnupg2-and-gnupg1-do-not-seem-to-be-installed-but-one-of-them-is-required-for-this-operation" class="headerlink" title="gnupg, gnupg2 and gnupg1 do not seem to be installed, but one of them is required for this operation"></a>gnupg, gnupg2 and gnupg1 do not seem to be installed, but one of them is required for this operation</h3><ul><li><p>apt-key adv –keyserver keyserver.ubuntu.com:80 –recv-keys 5AFA7A83 커맨드 입력시 에러 발생</p><ul><li>쿠렌토 저장소를 추가하려는 상황이었다</li></ul><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">apt-get update</span><br><span class="line">apt-get install gnupg</span><br></pre></td></tr></table></figure></li></ul><h3 id="The-following-signatures-couldn’t-be-verified-because-the-public-key-is-not-available-NO-PUBKEY-7EA0A9C3F273FCD8"><a href="#The-following-signatures-couldn’t-be-verified-because-the-public-key-is-not-available-NO-PUBKEY-7EA0A9C3F273FCD8" class="headerlink" title="The following signatures couldn’t be verified because the public key is not available: NO_PUBKEY 7EA0A9C3F273FCD8"></a>The following signatures couldn’t be verified because the public key is not available: NO_PUBKEY 7EA0A9C3F273FCD8</h3><ul><li><p>패키지를 다운로드 받으려는데 공개키가 없다고 하는 상황이다</p></li><li><p>그냥 없는 공키를 아래 커맨드에 넣어 추가하면 된다</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys <PUBKEY></span><br><span class="line"></span><br></pre></td></tr></table></figure></li></ul><h3 id="The-repository-‘https-download-docker-com-linux-ubuntu-kali-rolling-Release’-does-not-have-a-Release-file"><a href="#The-repository-‘https-download-docker-com-linux-ubuntu-kali-rolling-Release’-does-not-have-a-Release-file" class="headerlink" title="The repository ‘https://download.docker.com/linux/ubuntu kali-rolling Release’ does not have a Release file"></a>The repository ‘<a href="https://download.docker.com/linux/ubuntu">https://download.docker.com/linux/ubuntu</a> kali-rolling Release’ does not have a Release file</h3><ul><li><p>칼리 리눅스와 우분투에서 별 차이 없이 Set up이 될 줄 알았는데 아니다</p><ul><li>데비안 계열 커맨드를 사용해서 저장소를 다시 설정해 주어야한다.</li></ul><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">printf "%s\n" "deb [arch=amd64] https://download.docker.com/linux/debian buster stable" |\</span><br><span class="line">sudo tee /etc/apt/sources.list.d/docker-ce.list</span><br><span class="line">curl -fsSL https://download.docker.com/linux/debian/gpg | sudo apt-key add -</span><br><span class="line">sudo apt-get update</span><br><span class="line">sudo apt-get install docker-ce docker-ce-cli containerd.io</span><br></pre></td></tr></table></figure></li></ul><h2 id="Reference"><a href="#Reference" class="headerlink" title="Reference"></a>Reference</h2><p><a href="https://gh402.tistory.com/44?category=935378">쿠렌토 서버 Docker로 실행시켜보기</a><br><a href="https://unix.stackexchange.com/questions/630643/how-to-install-docker-ce-in-kali-linux">칼리 리눅스에 도커설치하는 방법</a></p>]]></content>
<categories>
<category> dev </category>
</categories>
<tags>
<tag> Docker </tag>
<tag> Kurento </tag>
</tags>
</entry>
<entry>
<title>Kurento로 N:N Group Call 하는 방법</title>
<link href="/2022/07/27/kurentoGroupCall/"/>
<url>/2022/07/27/kurentoGroupCall/</url>
<content type="html"><![CDATA[<h1 id="Group-Call-wtih-Kurento-Java"><a href="#Group-Call-wtih-Kurento-Java" class="headerlink" title="Group Call wtih Kurento- Java"></a>Group Call wtih Kurento- Java</h1><p>Node.js로 어플리케이션을 개발하는 중인데 Webrtc를 사용하는 것이 처음이다보니, Docs에 있는 예제를 읽고 먼저 이해하는 것이 먼저란 생각이 들어서 해당 글을 쓰게 되었다. 개념도 부족하고 이해도 부족하기에 일단 블로그 포스팅하고 점점 채워 나가야겠다</p><h2 id="선행-개념"><a href="#선행-개념" class="headerlink" title="선행 개념"></a>선행 개념</h2><ul><li><p>방이란?</p><ul><li>각 방은 다른 방과 격리된 자체 파이프라인을 생성한다</li><li>특정 방에 접속한 클라이언트는 같은 방에 있는 클라이언트와만 미디어 교환이 가능하다</li></ul></li><li><p>클라이언트</p><ul><li>각 클라이언트는 자체 미디어를 보내고 차례로 다른 모든 참가자로부터 미디어를 받는다.</li><li>이는 각 방의 총 n*n 개의 WebRTC End Point가 있음을 의미한다.</li><li>n은 클라이언트의 수이다.</li></ul></li><li><p>새 클라이언트가 방에 들어오면 새 webrtc가 생성되고 서버에서 미디어를 수신하도록 협상한다</p><ul><li>방에 원래 있던 사용자들에게는 새 사용자가 연결되었음을 알린다</li><li>모든 참가자는 서버에 새 참가자의 미디어를 수신하도록 요청한다</li><li>새로 들어온 사람은 차례로 연결된 모든 참가자의 목록을 가져온다<ul><li>이를 위해 서버에 방에 있는 모든 현재 클라이언트로부터 미디어를 수신하도록 요청한다.</li></ul></li></ul></li><li><p>클라이언트가 방을 나가는 상황</p><ul><li>클라이언트가 방을 나갈 때 서버에게 이 사실을 알린다.</li><li>방을 나가는 클라이언트 측에서 서버에 남는 클라이언트과 관련된 모든 미디어 요소를 취소하도록 요청한다.</li></ul></li><li><p>통신을 위해서는 2 개의 Web Socket이 필요하다</p><ol><li>클라이언트와 응용 프로그램 서버 사이의 Web Socket이 생성된다<ul><li>사용자 지정 신호 프로토콜을 구현하기 위해 만들어진다.</li></ul></li><li>Kurento Client와 Kurento Media Server 간의 통신을 위한 Web Socket이 생성된다.<ul><li>통신은 Kurento 프로토콜을 사용하여 이루어진다.</li></ul></li></ol></li></ul><h2 id="Application-Server-Logic"><a href="#Application-Server-Logic" class="headerlink" title="Application Server Logic"></a>Application Server Logic</h2><p>서버 로직의 핵심은 GroupCallApp 클래스이다. KurentoClient는 해당 클래스에서 Spring Bean으로 인스턴스화 된다.<br>해당 Bean은 애플리케이션에 미디어 기능을 추가하는데 사용되는 Kurento 미디어 파이프라인을 만드는데 사용된다.</p><p>Kurento 클라이언트가 인스턴스화 되면 Kurento 미디어 서버와 통신하고 멀티 미디어 기능을 제어할 준비가 된 것이다.</p><ul><li>Web Socket의 용도<ul><li>요청 및 응답을 통해 클라이언트와 애플리케이션 서버 간의 통신에 사용된다</li><li>해당 클래스에서는 Websocket 요청을 처리하기 위해 WebSocketConfigurer를 WebSocketHnadler에 등록한다<ul><li>WebSocket의 요청을 처리하기 위해 Group Call 경로가 필요하다</li></ul></li></ul></li><li>Call Handler 클래스의 용도<ul><li>TextWebSocket Handler로 WebSocket 요청을 처리하기 위해 구현된다.</li><li>해당 클래스의 핵심은 handleTextMesage이다.<ul><li>요청에 대한 작업을 구현하고 Web Socket을 통해 응답을 반환한다.</li><li>즉 이전 시퀀스 다이어그램에서 설명한 시그널링 프로토콜의 서버 부분을 구현하다</li></ul></li><li>Text로 들어오는 메시지들을 확인해서 switch 절에서 명령을 정리한다.</li></ul></li></ul><h2 id="Client-Logic"><a href="#Client-Logic" class="headerlink" title="Client Logic"></a>Client Logic</h2><ul><li>서버에 생성된 WebSocket 서비스를 호출하기 위해 Javascript가 사용되었다</li><li>Kurento-util.js는 Kurento Javascript 라이브러리를 사용하여 WebRTC와 서버 간의 상호 작용을 단순화한다.<ul><li>브라우저의 차이를 위해 사용되는 adapter.js에 의존한다</li></ul></li><li>클라이언트 측에서는 json 신호 프로토콜을 이용해 메세지를 생성한다.<ul><li>Kurento-utils.js가 이 때에 사용된다.</li></ul></li></ul><h1 id="Reference"><a href="#Reference" class="headerlink" title="Reference"></a>Reference</h1><ul><li><a href="https://doc-kurento.readthedocs.io/en/6.16.0/tutorials/java/tutorial-groupcall.html">Kurento Group Call - Java</a></li></ul>]]></content>
<categories>
<category> dev </category>
</categories>
<tags>
<tag> Kurento </tag>
<tag> Webrtc </tag>
</tags>
</entry>
<entry>
<title>Tensorflow intro - Hello Tensor Flow</title>
<link href="/2022/07/27/ai-hello/"/>
<url>/2022/07/27/ai-hello/</url>
<content type="html"><![CDATA[<h1 id="TensorFlow-입문"><a href="#TensorFlow-입문" class="headerlink" title="TensorFlow 입문"></a>TensorFlow 입문</h1><p>TensorFlow는 graph로 연산을 나타내는 프로그래밍 시스템이다.<br>그래서 당연히 노드 단위로 일을 하고 graph에 있는 노드는 op(작업)(operation)이라고 부른다.<br>보통 op는 0 이상의 Tensor를 가질 수 있다. Tensor는 정형화된 다차원 배열이다</p><p>TensorFlow에서 Graph는 연산을 표현해 놓은 것이라서 연산을 하려면 graph가 session 상에 실행되어야 한다. Session은 graph의 작업을 CPU/GPU 같은 Device에 배정하고 실행을 위한 메서들을 제공한다.<br>이러한 메서드들이 작업을 실행해서 Tensor를 만들어 낸다.(Tensorflow 2.x.x 이상 부터는 Session을 만드는 과정이 사라졌다)</p><p>보통 Tensro는 파이썬에서 numpy ndarry 형식으로 출력된다ㅓ.</p><h2 id="설치-방법"><a href="#설치-방법" class="headerlink" title="설치 방법"></a>설치 방법</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">pip install tensorflow-gpu</span><br></pre></td></tr></table></figure><h2 id="Error-amp-amp-Tip"><a href="#Error-amp-amp-Tip" class="headerlink" title="Error && Tip"></a>Error && Tip</h2><h3 id="코드-실행-시-Warning-뜨지-않게-하는-방법"><a href="#코드-실행-시-Warning-뜨지-않게-하는-방법" class="headerlink" title="코드 실행 시 Warning 뜨지 않게 하는 방법"></a>코드 실행 시 Warning 뜨지 않게 하는 방법</h3><ul><li>아래 코드를 입력하면된다</li><li>코드 내용은 메세지 코드 중 Warning을 뜨지 않게 하겠다란 의미이다<ul><li>2 번이 Warning이다.</li></ul></li></ul><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> os</span><br><span class="line"></span><br><span class="line">os.environ[<span class="string">'TF_CPP_MIN_LOG_LEVEL'</span>] = <span class="string">'2'</span></span><br></pre></td></tr></table></figure><h3 id="Could-not-load-dynamic-library-‘cudart64-110-dll’"><a href="#Could-not-load-dynamic-library-‘cudart64-110-dll’" class="headerlink" title="Could not load dynamic library ‘cudart64_110.dll’"></a>Could not load dynamic library ‘cudart64_110.dll’</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">2022-07-27 15:00:14.017560: W tensorflow/stream_executor/platform/default/dso_loader.cc:64] Could not load dynamic library <span class="string">'cudart64_110.dll'</span>; dlerror: cudart64_110.dll not found</span><br><span class="line">2022-07-27 15:00:14.026248: I tensorflow/stream_executor/cuda/cudart_stub.cc:29] Ignore above cudart dlerror <span class="keyword">if</span> you <span class="keyword">do</span> not have a GPU <span class="built_in">set</span> up on your machine.</span><br></pre></td></tr></table></figure><p>CUDA는 GPU에서 수행하는 병렬처리 알고리즘을 프로그래밍언어로 사용가능하게 하는 기술이다.<br>NVIDIA에서 개발한 GPU 개발 툴인데 딥러닝에 사용할 수 있도록 오픈 되었다<br>AI, 채굴, 딥러닝 분야에서 많은 양의 연산을 동시처리하는 것이 목표이다보니 자연스레 사용하게 된다</p><p>보통은 CPU로 프로그램을 돌리니까 설치가 안되었거나 버전 낮은 경우가 있는데 나도 그런 케이스라 다시 설치하게 되었다</p><ul><li>CUDA 64bit 11 Version을 재설치 후 재부팅하면 된다</li></ul><h3 id="AttributeError-module-‘tensorflow’-has-no-attribute-‘Session’"><a href="#AttributeError-module-‘tensorflow’-has-no-attribute-‘Session’" class="headerlink" title="AttributeError: module ‘tensorflow’ has no attribute ‘Session’"></a>AttributeError: module ‘tensorflow’ has no attribute ‘Session’</h3><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> tensorflow <span class="keyword">as</span> tf</span><br><span class="line"></span><br><span class="line">hello = tf.constant(<span class="string">"hello world!"</span>)</span><br><span class="line"></span><br><span class="line">sess =tf.Session()</span><br><span class="line"><span class="built_in">print</span>(sess.run(hello))</span><br><span class="line">sess.close()</span><br></pre></td></tr></table></figure><ul><li>Session을 사용하는 경우는 텐서플로우 1.x.x 버전 식 표현이다.</li><li>텐서플로우 2.0 버전부터는 session을 정의하고 run 해주는 과정이 생략 된다.</li></ul><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> tensorflow <span class="keyword">as</span> tf</span><br><span class="line"></span><br><span class="line">hello = tf.constant(<span class="string">"hello world!"</span>)</span><br><span class="line"></span><br><span class="line">tf.<span class="built_in">print</span>(hello)</span><br></pre></td></tr></table></figure><ul><li>새로운 version은 위와 같이 간단하게 쓰면 된다!</li></ul><h2 id="Reference"><a href="#Reference" class="headerlink" title="Reference"></a>Reference</h2><ul><li><a href="https://tensorflowkorea.gitbooks.io/tensorflow-kr/content/g3doc/get_started/basic_usage.html">TensorFlow 문서 번역</a></li></ul>]]></content>
<categories>
<category> ai </category>
</categories>
</entry>
<entry>
<title>백준 1439 뒤집기</title>
<link href="/2022/07/27/algorithm-boj1439/"/>
<url>/2022/07/27/algorithm-boj1439/</url>
<content type="html"><![CDATA[<h2 id="풀이"><a href="#풀이" class="headerlink" title="풀이"></a>풀이</h2><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> sys</span><br><span class="line"></span><br><span class="line">st = sys.stdin.readline().rstrip()</span><br><span class="line">stl=[]</span><br><span class="line">temp=<span class="string">''</span></span><br><span class="line">flag=st[<span class="number">0</span>]</span><br><span class="line"><span class="keyword">for</span> s <span class="keyword">in</span> st:</span><br><span class="line"> <span class="keyword">if</span> flag!=s:</span><br><span class="line"> stl.append(temp)</span><br><span class="line"> temp=s</span><br><span class="line"> flag=s</span><br><span class="line"> <span class="keyword">else</span>:</span><br><span class="line"> temp+=s</span><br><span class="line">stl.append(temp)</span><br><span class="line"></span><br><span class="line">zcount=<span class="number">0</span></span><br><span class="line">ocount = <span class="number">0</span></span><br><span class="line"><span class="keyword">for</span> st <span class="keyword">in</span> stl:</span><br><span class="line"> <span class="keyword">if</span> st[<span class="number">0</span>]==<span class="string">'0'</span>:</span><br><span class="line"> zcount+=<span class="number">1</span></span><br><span class="line"> <span class="keyword">else</span>:</span><br><span class="line"> ocount+=<span class="number">1</span></span><br><span class="line"><span class="built_in">print</span>(<span class="built_in">min</span>(zcount,ocount))</span><br></pre></td></tr></table></figure><ul><li>뒤집는 횟수는 결국은 1과 0 뭉텅이 중 뭐가 제일 많이 나왔느냐라 생각했다</li><li>처음엔 횟수로 나눴는데 생각을 잘못해서 오류가 떴었다. 그렇게 푸는게 시간이 덜 들어갈 듯하다</li></ul><h2 id="회고"><a href="#회고" class="headerlink" title="회고"></a>회고</h2><ul><li>solved.ac 기준 silver 3이상으로 풀자<ul><li>일단은 조곰 생각하면 풀어버린다</li><li>티어가 안올라가니까 추가적인 동기부여가 없는 듯</li></ul></li></ul>]]></content>
<categories>
<category> algorithm </category>
</categories>
</entry>
<entry>
<title>백준 1417 국회의원 선거</title>
<link href="/2022/07/27/algorithm-boj1417/"/>
<url>/2022/07/27/algorithm-boj1417/</url>
<content type="html"><![CDATA[<h2 id="풀이"><a href="#풀이" class="headerlink" title="풀이"></a>풀이</h2><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> sys</span><br><span class="line"><span class="keyword">import</span> heapq</span><br><span class="line"></span><br><span class="line">num = <span class="built_in">int</span>(sys.stdin.readline())</span><br><span class="line">heap = []</span><br><span class="line">ds = <span class="number">0</span></span><br><span class="line"><span class="keyword">for</span> n <span class="keyword">in</span> <span class="built_in">range</span>(num):</span><br><span class="line"> nm = <span class="built_in">int</span>(sys.stdin.readline())</span><br><span class="line"> <span class="keyword">if</span> n==<span class="number">0</span>:</span><br><span class="line"> ds=nm</span><br><span class="line"> <span class="keyword">else</span>:</span><br><span class="line"> heapq.heappush(heap, -nm)</span><br><span class="line">count = <span class="number">0</span></span><br><span class="line"><span class="keyword">while</span> heap:</span><br><span class="line"> <span class="built_in">max</span> = -heapq.heappop(heap)</span><br><span class="line"> <span class="keyword">if</span> ds><span class="built_in">max</span>:</span><br><span class="line"> <span class="keyword">break</span></span><br><span class="line"> ds+=<span class="number">1</span></span><br><span class="line"> heapq.heappush(heap,-<span class="built_in">max</span>+<span class="number">1</span>)</span><br><span class="line"> count+=<span class="number">1</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="built_in">print</span>(count)</span><br></pre></td></tr></table></figure><ul><li>우선순위를 부여해서 값을 구하면 될거라 생각했다<ul><li>이런 정렬 자료구조에서 보통은 오름차순 정렬이 되서 값이 나오는데 이름 내림차순으로 바꿀 필요가 있었다</li><li>heapq를 사용했고, 값을 넣을 때 음수로 바꿔서 넣음으로써 내림차순을 구현했다</li></ul></li></ul><h2 id="배열에-우선순위를-부여하자"><a href="#배열에-우선순위를-부여하자" class="headerlink" title="배열에 우선순위를 부여하자"></a>배열에 우선순위를 부여하자</h2><h3 id="우선순위-큐"><a href="#우선순위-큐" class="headerlink" title="우선순위 큐"></a>우선순위 큐</h3><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">from</span> queue <span class="keyword">import</span> PriorityQue <span class="comment"># Class Import</span></span><br><span class="line">que = PriorityQueue()<span class="comment"># 우선 순위 큐 생성</span></span><br></pre></td></tr></table></figure><ul><li>우선순위 큐는 iterable 하지 않기 때문에 인덱스로 접근이 불가능<ul><li>print하면 출력이 아니라 object 주소가 나온다</li></ul></li><li>기본적으로 오름차순 정렬이 되어 있다<ul><li>내림차순 하는 법을 찾고 있었는데 차라리 heapq를 사용하는게 더 편할거라 생각해서 바꿨다</li></ul></li></ul><h3 id="Heap"><a href="#Heap" class="headerlink" title="Heap"></a>Heap</h3><ul><li>완전 이진 트리의 일종으로 우선순위 큐를 위하여 만들어진 자료구조이다.</li><li>힙은 일종의 반 정렬 상태를 유지한다<ul><li>큰 값이 상위 레벨에 있고 작은 값이 하위 레벨에 있지만 엄격하진 않다</li></ul></li><li>구현하기가 쉽고, 배열을 이용하기 때문에 알고리즘 문제 풀 때 유용하다</li></ul><h2 id="회고"><a href="#회고" class="headerlink" title="회고"></a>회고</h2><ul><li>좀 더 파고들어서 공부할 필요가 있다.</li><li>그렇게 어려운 문제는 아니었는데 아이디어 떠올리는데서 조곰 헤맸다</li></ul>]]></content>
<categories>
<category> algorithm </category>
</categories>
</entry>
<entry>
<title>Docker 공부</title>
<link href="/2022/07/26/docker/"/>
<url>/2022/07/26/docker/</url>
<content type="html"><![CDATA[<h1 id="Docker란-무엇인가"><a href="#Docker란-무엇인가" class="headerlink" title="Docker란 무엇인가?"></a>Docker란 무엇인가?</h1><ul><li>Docker는 Linux Container에 여러 기능을 추가함으로써 Application을 좀 더 쉽게 사용할 수 있게 만들어진 오픈소스 가상화 플랫폼</li><li>Docker는 격리된 공간에 필요한 라이브러리, 실행파일만 담아놓고 사용하기 때문에 부담이 줄어든다.</li><li>Docker는 컨테이너 생성 및 관리가 매우 쉽다<ul><li>일종의 모듈식(경량화) 가상 머신이다</li></ul></li></ul><h2 id="컨테이너-Container"><a href="#컨테이너-Container" class="headerlink" title="컨테이너 (Container)"></a>컨테이너 (Container)</h2><p>Docker에서의 컨테이너의 개념은 다양한 프로그램, 다양한 운영체제 및 실행 환경등을 컨테이너로 추상화하여 동일한 인터페이스를 제공하여, 배포 및 관리를 단순화 시키는 것을 말한다.</p><h3 id="가상-머신과-차이점"><a href="#가상-머신과-차이점" class="headerlink" title="가상 머신과 차이점"></a>가상 머신과 차이점</h3><p>가상 머신은 Hypervisor를 이용해 하나의 Host에서 여러 개의 OS를 생성해 사용하는 방식이다. 가상 머신의 Guest OS들은 서로 간에 완전히 독립된 공간을 할당 받는다.</p><p>하지만, 이런한 작업 방식은 Hypervisor를 반드시 거쳐야 하기 때문에 성능 저하가 발생합니다. 또한 각 Virtual Machine은 Guest OS를 위한 Library,Kernal 등을 모두 포함해야하므로 배포시 image의 크기가 커진다.</p><h2 id="도커를-사용하는-이유"><a href="#도커를-사용하는-이유" class="headerlink" title="도커를 사용하는 이유"></a>도커를 사용하는 이유</h2><ul><li><p>독립된 개발 환경 보장<br>Container는 격리된 공간이므로 그 자체에 특별한 권한을 주지 않는 한 내부에서 무엇을 하든 Host OS에는 여향을 끼치지 않습니다</p></li><li><p>개발/운영 환경의 통합<br>Container 내부 작업을 배포하기 위해서는 해당 Container를 docker image라는 하나의 패키지로 만들어 운영 서버에 전달하면 된다.</p><p>서비스 개발 환경을 다른 서버에서도 똑같이 복제할 수 있어 의존성 걱정이 없다</p></li><li><p>배포 신속성 및 H/W 효율<br>Guast OS와 달리 Kernal을 포함하고 있지 않기 때문에 image 크기가 비교적 작다. 따라서 Application의 배포 속도가 매우 빨라지며, H/W 용량을 작게 차지한다.</p></li><li><p>여러 Application의 독립성과 확장성이 높아진다<br>여러 Module을 독립된 형태로 구성하므로 언어에 종속되지 않고 변화에 빠르게 대응할 수 있다. 독립된 형태들을 구현하는데는 주로 Docker Container가 많이 사용된다.</p></li></ul><h2 id="단점"><a href="#단점" class="headerlink" title="단점"></a>단점</h2><ol><li>Docker는 플랫폼 의존적이다.<br>Docker는 윈도우에서는 linux 가상 머신 위에서 돌아간다. 즉 linux에서만 실행가능하다</li><li>Docker는 bare-metal 방식보다 느리다.<br>Docker가 기존의 가상화 방식보다 overhead가 적긴 하지만 여전히 bare-metal 방식에 속도에 비하면 느리다<br>bare-metal은 클라우드가 아닌 실제 하드웨어 서버를 말한다</li><li>Docker 위에서 GUI 앱을 돌리기가 불편하다<br>command Line에서 동작하는 앱을 호스팅하기 위해 디자인되어서 gui 실행은 가능하나 불편하다</li></ol><h2 id="Referance"><a href="#Referance" class="headerlink" title="Referance"></a>Referance</h2><ul><li><a href="https://velog.io/@iuliet716/Docker%EC%9D%98-%EC%97%AD%ED%95%A0%EA%B3%BC-%EC%9E%A5%EC%A0%90">Docker의 역할과 장점</a></li><li><a href="https://chanos.tistory.com/entry/Docker-%EB%8F%84%EC%BB%A4Docker%EB%9E%80-%EB%8F%84%EC%BB%A4%EC%9D%98-%EA%B0%9C%EB%85%90">Docker의 개념</a></li><li><a href="https://hanhyx.tistory.com/27">Docker의 개요 및 장점 그리고 도커를 쓰는 이유</a></li></ul>]]></content>
<categories>
<category> dev </category>
</categories>
</entry>
<entry>
<title>백준 1343 폴리오미노</title>
<link href="/2022/07/25/algorithm-boj1343/"/>
<url>/2022/07/25/algorithm-boj1343/</url>
<content type="html"><![CDATA[<h2 id="풀이"><a href="#풀이" class="headerlink" title="풀이"></a>풀이</h2><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> sys</span><br><span class="line"></span><br><span class="line">st = sys.stdin.readline().rstrip()</span><br><span class="line">stl = []</span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">solve</span>(<span class="params">st</span>):</span><br><span class="line"> answer=<span class="string">''</span></span><br><span class="line"> temp=<span class="string">''</span></span><br><span class="line"> <span class="keyword">for</span> s <span class="keyword">in</span> st:</span><br><span class="line"> <span class="keyword">if</span> temp==<span class="string">''</span>:</span><br><span class="line"> temp+=s</span><br><span class="line"> <span class="keyword">elif</span> temp[<span class="number">0</span>]==s:</span><br><span class="line"> temp+=s</span><br><span class="line"> <span class="keyword">else</span>:</span><br><span class="line"> stl.append(temp)</span><br><span class="line"> temp=s</span><br><span class="line"> stl.append(temp)</span><br><span class="line"> <span class="keyword">if</span> <span class="built_in">len</span>(st)==<span class="number">0</span>:</span><br><span class="line"> <span class="keyword">return</span> -<span class="number">1</span></span><br><span class="line"> <span class="keyword">for</span> st <span class="keyword">in</span> stl:</span><br><span class="line"> <span class="keyword">if</span> st[<span class="number">0</span>]==<span class="string">'X'</span>:</span><br><span class="line"> <span class="keyword">if</span> <span class="built_in">len</span>(st)%<span class="number">2</span>!=<span class="number">0</span>:<span class="comment">#짝수가 아닌 것은 만들 수 없으니까 제거 한다</span></span><br><span class="line"> <span class="keyword">return</span> -<span class="number">1</span></span><br><span class="line"> x = <span class="built_in">len</span>(st)//<span class="number">4</span></span><br><span class="line"> y= <span class="built_in">len</span>(st)-x*<span class="number">4</span></span><br><span class="line"> answer+=<span class="string">'A'</span>*x*<span class="number">4</span></span><br><span class="line"> answer+=y*<span class="string">'B'</span></span><br><span class="line"> <span class="keyword">else</span>:</span><br><span class="line"> answer+=<span class="built_in">len</span>(st)*<span class="string">'.'</span></span><br><span class="line"> <span class="keyword">return</span> answer</span><br><span class="line"></span><br><span class="line"><span class="built_in">print</span>(solve(st))</span><br></pre></td></tr></table></figure><ul><li>사전 순으로 나오라는 말은 그냥 A가 먼저 나오면 되니까 4로 나눠지는 몫으로 A를 입력 후 남는 값에 B를 넣었다<ul><li>당연히 홀수인 경우는 미리 예외 처리 했다</li></ul></li></ul><h2 id="회고"><a href="#회고" class="headerlink" title="회고"></a>회고</h2><ul><li>solve() 등을 만들어서 예외처리를 그냥 return -1하니까 문제 풀 때 편하다</li><li>구현력이 꽤나 떨어짐을 느낀다. 쉬운 문제부터 차근차근 해결해 나가자<ul><li>일단은 그리디 문제 풀면서 조곰씩 폼을 올릴 생각이다</li></ul></li></ul>]]></content>
<categories>
<category> algorithm </category>
</categories>
</entry>
<entry>
<title>신규 아이디 추천</title>
<link href="/2022/07/25/programmers-5/"/>
<url>/2022/07/25/programmers-5/</url>
<content type="html"><![CDATA[<h2 id="풀이"><a href="#풀이" class="headerlink" title="풀이"></a>풀이</h2><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">def</span> <span class="title function_">solution</span>(<span class="params">new_id</span>):</span><br><span class="line"> answer = <span class="string">''</span></span><br><span class="line"> answer = new_id.lower()</span><br><span class="line"> temp =<span class="string">''</span></span><br><span class="line"> <span class="keyword">for</span> s <span class="keyword">in</span> answer:</span><br><span class="line"> <span class="keyword">if</span> s.isalnum() <span class="keyword">or</span> s==<span class="string">'-'</span> <span class="keyword">or</span> s==<span class="string">'_'</span><span class="keyword">or</span> s==<span class="string">'.'</span>:</span><br><span class="line"> temp+=s</span><br><span class="line"> answer=temp</span><br><span class="line"> temp=answer[<span class="number">0</span>]</span><br><span class="line"> <span class="keyword">for</span> i <span class="keyword">in</span> <span class="built_in">range</span>(<span class="number">1</span>,<span class="built_in">len</span>(answer)):</span><br><span class="line"> <span class="keyword">if</span> answer[i-<span class="number">1</span>]==<span class="string">'.'</span> <span class="keyword">and</span> answer[i]==<span class="string">'.'</span>:</span><br><span class="line"> <span class="keyword">continue</span></span><br><span class="line"> temp+=answer[i]</span><br><span class="line"> answer=temp.strip(<span class="string">'.'</span>)</span><br><span class="line"> <span class="keyword">if</span> answer==<span class="string">''</span>:</span><br><span class="line"> answer+=<span class="string">'a'</span></span><br><span class="line"> <span class="keyword">if</span> <span class="built_in">len</span>(answer)>=<span class="number">16</span>:</span><br><span class="line"> answer=answer[<span class="number">0</span>:<span class="number">15</span>]</span><br><span class="line"> <span class="keyword">if</span> answer[-<span class="number">1</span>]==<span class="string">'.'</span>:</span><br><span class="line"> answer=answer[:<span class="built_in">len</span>(answer)-<span class="number">1</span>]</span><br><span class="line"> <span class="keyword">while</span> <span class="built_in">len</span>(answer)<=<span class="number">2</span>:</span><br><span class="line"> answer+=answer[-<span class="number">1</span>]</span><br><span class="line"> <span class="keyword">return</span> answer</span><br></pre></td></tr></table></figure><ul><li>파이썬의 문자열을 다룰 수 있는가를 물어보는 문제이다<ul><li>lower()은 문자열을 바꾸는게 아니라 바뀐 문자열을 리턴함수이다</li></ul></li></ul><h2 id="회고"><a href="#회고" class="headerlink" title="회고"></a>회고</h2><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> re</span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">solution</span>(<span class="params">new_id</span>):</span><br><span class="line"> st = new_id</span><br><span class="line"> st = st.lower()</span><br><span class="line"> st = re.sub(<span class="string">'[^a-z0-9\-_.]'</span>, <span class="string">''</span>, st)</span><br><span class="line"> st = re.sub(<span class="string">'\.+'</span>, <span class="string">'.'</span>, st)</span><br><span class="line"> st = re.sub(<span class="string">'^[.]|[.]$'</span>, <span class="string">''</span>, st)</span><br><span class="line"> st = <span class="string">'a'</span> <span class="keyword">if</span> <span class="built_in">len</span>(st) == <span class="number">0</span> <span class="keyword">else</span> st[:<span class="number">15</span>]</span><br><span class="line"> st = re.sub(<span class="string">'^[.]|[.]$'</span>, <span class="string">''</span>, st)</span><br><span class="line"> st = st <span class="keyword">if</span> <span class="built_in">len</span>(st) > <span class="number">2</span> <span class="keyword">else</span> st + <span class="string">""</span>.join([st[-<span class="number">1</span>] <span class="keyword">for</span> i <span class="keyword">in</span> <span class="built_in">range</span>(<span class="number">3</span>-<span class="built_in">len</span>(st))])</span><br><span class="line"> <span class="keyword">return</span> st</span><br><span class="line"></span><br></pre></td></tr></table></figure><ul><li>위의 문제를 정규식으로 깔끔하게 풀어낸 사람도 존재한다</li><li>난 솔직히 더럽게 푼건데 사실 정규식으로 풀기를 원한 문제였을가 싶다</li></ul>]]></content>
<categories>
<category> algorithm </category>
</categories>
<tags>
<tag> Programmers </tag>
</tags>
</entry>
<entry>
<title>더 맵게</title>
<link href="/2022/07/23/programmers-4/"/>
<url>/2022/07/23/programmers-4/</url>
<content type="html"><![CDATA[<h2 id="풀이"><a href="#풀이" class="headerlink" title="풀이"></a>풀이</h2><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">def</span> <span class="title function_">solution</span>(<span class="params">scoville, K</span>):</span><br><span class="line"> answer = <span class="number">0</span></span><br><span class="line"> </span><br><span class="line"> <span class="keyword">while</span> <span class="literal">True</span>:</span><br><span class="line"> scoville.sort(reverse=<span class="literal">True</span>)</span><br><span class="line"> <span class="keyword">if</span> <span class="built_in">len</span>(scoville)==<span class="number">1</span> <span class="keyword">and</span> scoville[<span class="number">0</span>]<K:</span><br><span class="line"> <span class="keyword">return</span> -<span class="number">1</span></span><br><span class="line"> <span class="keyword">elif</span> scoville[-<span class="number">1</span>] >=K:</span><br><span class="line"> <span class="keyword">break</span></span><br><span class="line"> n1 = scoville.pop()</span><br><span class="line"> n2 = scoville.pop()</span><br><span class="line"> scoville.append(n1+<span class="number">2</span>*n2)</span><br><span class="line"> answer+=<span class="number">1</span></span><br><span class="line"> </span><br><span class="line"> <span class="keyword">return</span> answer</span><br></pre></td></tr></table></figure><ul><li>보자마자 떠오른 아이디어는 반복문 안에서 스택 사용해서 계속 정렬하면서 값을 구하는 것이었다</li><li>답은 맞는데 정렬하는 부분에서 시간 초과가 당연히 발생한다</li></ul><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> heapq</span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">solution</span>(<span class="params">scoville, K</span>):</span><br><span class="line"> answer = <span class="number">0</span></span><br><span class="line"></span><br><span class="line"> scoville.sort()</span><br><span class="line"></span><br><span class="line"> <span class="keyword">while</span> <span class="literal">True</span>:</span><br><span class="line"> <span class="keyword">if</span> <span class="built_in">len</span>(scoville)==<span class="number">1</span> <span class="keyword">and</span> scoville[<span class="number">0</span>]<K:</span><br><span class="line"> <span class="keyword">return</span> -<span class="number">1</span></span><br><span class="line"> <span class="keyword">if</span> scoville[<span class="number">0</span>] >=K:</span><br><span class="line"> <span class="keyword">break</span></span><br><span class="line"> n1 = heapq.heappop(scoville)</span><br><span class="line"> n2 = heapq.heappop(scoville)</span><br><span class="line"> heapq.heappush(scoville,n1+<span class="number">2</span>*n2)</span><br><span class="line"> answer+=<span class="number">1</span></span><br><span class="line"> <span class="keyword">return</span> answer</span><br></pre></td></tr></table></figure><ul><li>파이썬의 자료구조 heapq는 트리 구조로 데이터가 저장 되어 자동으로 입력을 할 때 정렬이 되는 특징이 있다<ul><li>이를 이용하여 문제 해결!</li></ul></li></ul><h2 id="회고"><a href="#회고" class="headerlink" title="회고"></a>회고</h2><ul><li>자연스럽게 문제를 풀 때 자료구조를 먼저 찾고 적용한 흐름은 잘했다</li><li>아쉬운 점이라면, 자동 완성 등 없이 문제를 푸니까 불편함이 확연하다. 좀 고집이나 싶기도 하다</li><li>파이썬이 편해서 파이썬으로 공부하긴 하는데 다른 언어로 공부해야하나 싶다.<ul><li>물론 반대편에서는 로직만 같다면 구현할 수 있는거 아니냐란 생각도 들어 일단 꾸준히 함에 집중하자</li></ul></li></ul>]]></content>
<categories>
<category> algorithm </category>
</categories>
<tags>
<tag> Programmers </tag>
</tags>
</entry>
<entry>
<title>폰켓몬</title>
<link href="/2022/07/23/programmers-3/"/>
<url>/2022/07/23/programmers-3/</url>
<content type="html"><![CDATA[<h2 id="풀이"><a href="#풀이" class="headerlink" title="풀이"></a>풀이</h2><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">def</span> <span class="title function_">solution</span>(<span class="params">nums</span>):</span><br><span class="line"> answer=<span class="number">0</span></span><br><span class="line"> s = <span class="built_in">list</span>(<span class="built_in">set</span>(nums))</span><br><span class="line"> size = <span class="built_in">len</span>(nums)/<span class="number">2</span> <span class="keyword">if</span> <span class="built_in">len</span>(nums)%<span class="number">2</span>==<span class="number">0</span> <span class="keyword">else</span> <span class="built_in">int</span>(<span class="built_in">len</span>(nums)/<span class="number">2</span>)+<span class="number">1</span></span><br><span class="line"> <span class="keyword">if</span> size><span class="built_in">len</span>(s):</span><br><span class="line"> answer = <span class="built_in">len</span>(s)</span><br><span class="line"> <span class="keyword">else</span>:</span><br><span class="line"> answer = size</span><br><span class="line"> <span class="keyword">return</span> answer</span><br></pre></td></tr></table></figure><h2 id="회고"><a href="#회고" class="headerlink" title="회고"></a>회고</h2><ul><li>너무 쉽게 풀려서 뭐지 싶었는데, 오르는 점수 보니까 쉬운 문제였다</li><li>별다른 로직이 없기도 했음</li></ul>]]></content>
<categories>
<category> algorithm </category>
</categories>
<tags>
<tag> Programmers </tag>
</tags>
</entry>
<entry>
<title>Web RTC란?</title>
<link href="/2022/07/22/webRTC/"/>
<url>/2022/07/22/webRTC/</url>
<content type="html"><![CDATA[<h1 id="Web-RTC란"><a href="#Web-RTC란" class="headerlink" title="Web RTC란?"></a>Web RTC란?</h1><p>Web RTC는 드라이버나 플러그인 설치 없이 웹 브라우저 간 P2P 연결을 통해 데이터 교환을 가능하게 하는 기술입니다.<br>Web RTC의 핵심을 꼽으라면 저는 시그널링을 이야기할 것입니다<br>브라우저 간 시그널링을 통해 별도의 중간자를 거치지 않고 P2P 연결이 가능해지기 때문입니다.<br>즉 중개 서버가 없기 때문에 빠른 속도도 보장되고, HTTPS가 강제되기 때문에 중간자 공격으로부터 보호도 됩니다.</p><p>그렇다면 브라우저는 여러 개인듯 브라우저 호환성은 괜찮은가? 의문이 생깁니다<br>Web RTC는 구글이 주도한 오픈소스 프로젝트 기반 웹 표준이라 크롬과 호환성이 높습니다.<br>파이어폭스나 오페라 등도 WEebRTC 표준을 따르고 있죠. 하지마 애플 특유의 폐쇄성으로 WebKit 기반 브라우저라 WebRTC 지원은 하지만 호환성은 떨어집니다. 즉 다양한 플랫폼에 대한 표준화가 완전히 구현되지 않은 것입니다.</p><p>그래도 괜찮습니다. 이런 크로스 브라우징 이슈를 해결하기 위해서 adapter.js 라이브러리가 존재합니다.</p><h2 id="Peer-to-Peer-연결-절차"><a href="#Peer-to-Peer-연결-절차" class="headerlink" title="Peer to Peer 연결 절차"></a>Peer to Peer 연결 절차</h2><ol><li><p>각 브라우저가 P2P 커뮤니케이션에 동의</p></li><li><p>서로의 주소를 가져옴</p></li><li><p>보안 사항 및 방화벽 우회<br>일반적인 컴퓨터에는 공인 IP가 할당되어 있지 않습니다. 그 이유는 방호벽이나 NAT, 또는 DHCP 때문입니다<br>그래서 단순히 공인 IP를 알아낸다해서 특정한 사용자를 가리 킬 수 없습니다<br>해당 네트워크 내에서의 사설 IP 주소까지 알아내야하죠<br>라우터 등을 통과해서 연결할 방법을 찾는 과정을 NAT 트래버셜이라고 합니다.</p><p> 이는 STUN 서버에 의해 이루어집니다. STUN은 단말이 자신의 공인 IP 주소와 포트를 확인하는 과정에 대한 프로콜입니다. 즉 WebRTC 연결을 시작하기 전 STUN 서버를 향해 요청을 보내면 STUN 서버는 NAT 뒷 단의 피어들을 서로 연결할 수 있도록 공인 IP와 포트를 찾아줍니다.</p><p> 최후의 수단으로는 TURN 방식도 잇습니다.</p></li><li><p>멀티미디어 데이터를 실시간 교환</p></li></ol><ul><li>시그널링이란</li></ul><h2 id="ICE와-Canddidate"><a href="#ICE와-Canddidate" class="headerlink" title="ICE와 Canddidate"></a>ICE와 Canddidate</h2><ul><li>여태껏 이야기한 STUN, TURN 서버를 이용해 획득했던 IP 주소와 프로토콜, 포트의 조합으로 구성된 연결이 가능한 네트워크 주소들을 후보라 부릅니다<ul><li>후보들을 수집합면 일반적으로 3개의 주소를 얻게 된다<ul><li>자신의 사설 IP와 포트 넘버</li><li>자신의 공인 IP와 포트 넘버 (STUN, TURN 서버로부터 획등 가능)</li><li>TURN 서버의 IP와 포트 넘버(TURN 서버로부터 획득 가능)</li></ul></li></ul></li></ul><p>위의 과정은 모두 ICE(Interactive Connectivity Estabilishment)라는 프레임워크 위에서 이루어집니다.<br>두 개의 단말이 P2P 연결을 가능하게 하도록 최적의 경로를 찾아주는 프레임워크이다.</p><h2 id="SDP-Session-Description-Protocol"><a href="#SDP-Session-Description-Protocol" class="headerlink" title="SDP(Session Description Protocol)"></a>SDP(Session Description Protocol)</h2><ul><li>WebRTC에서 스트리밍 미디어의 해상도나 형식, 코덱 등의 멀티미디어 컨텐츠의 초기 인수를 설명하기 위해 채택한 프로토콜</li><li>제안 응답 모델을 가지고 있다<ul><li>어떤 피어가 미디어 스트림을 교환할 것을 제안하면, 상대방으로부터 응답이 오기를 기다린다.</li><li>응답을 받으면 각자의 피어가 수집합 ICE 후보 중에서 최적의 경로를 결정하고 협상하는 프로세스 발생</li><li>수집한 ICE 후보들로 패킷을 보내 가장 지연 시간이 적고 안정적인 경로를 찾는 것이다.</li><li>최적의 ICE 후보가 선택되면 기본적으로 필요한 모든 메타 데이터와 IP 주소 및 포트, 미디어 정보가 피어 간 합의 가 완료된다.</li><li>즉 P2P 연결이 완전히 설정되고 활성화 된 것이다.</li></ul></li></ul><h2 id="Trickle-ICE"><a href="#Trickle-ICE" class="headerlink" title="Trickle ICE"></a>Trickle ICE</h2><ul><li>일반적으로 각 피어는 ICE 후보들을 수집해서 그 목록을 완성한 후 한꺼번에 교환하게 된다.</li><li>하지만 이러한 방식은 SDP의 제안 응답 모델과 맛물리면서 단점으로 작용한다</li></ul><p>후보들을 모으는데도 시간이 오래 걸리고 그 과정에서 네트워크 환경에 따라 지연이 걸릴 수 있다.<br>또한 한 쪽 피어의 ICE 후보 수집 작업이 완료되어야만 다른 피어가 ICE 후보를 모을 수 있어 비효율적이다.<br>이러한 비효율적인 후보 교환 작업을 병령 프로세스로 수행할 수 있게 만든 것이 바로 Trickle ICE이다.</p><h2 id="시그널링"><a href="#시그널링" class="headerlink" title="시그널링"></a>시그널링</h2><p>RTCPeerConnection 통신에서 사용할 통신 규격을 교환하기 위해 두 장치의 제어 정보를 교환하는 과정을 의미합니다. WebRTC 연결 전까지의 과정입니다</p><p>즉 시그널링은 WebRTC 자체에서 지원하는 기능이 아닙다.</p><p>시그널링은 쉽게 말해서 약속을 잡는 것입니다. 시그널링 서버에서는 SDP와 ICE 프로토콜을 사용해 약속을 잡습니다.</p><h2 id="STUN-서버"><a href="#STUN-서버" class="headerlink" title="STUN 서버"></a>STUN 서버</h2><p>STUN 서버도 약속을 잡는 것입니다. STUN 서버는 어디서 만날래와 같은 약속을 잡는 서버입니다.<br>즉 IP를 알아주는 서버인 것이죠</p><h2 id="Reference"><a href="#Reference" class="headerlink" title="Reference"></a>Reference</h2><ul><li><a href="https://velog.io/@yerimii11/Project-%EB%82%98%EB%A7%8C%EC%9D%98-%EB%AC%B4%EA%B8%B0-%ED%9A%8C%EA%B3%A0-03.0703.12-D-71-5%EC%A3%BC%EC%B0%A8">SFU 방식 구현 && 서버 구현 과정</a></li><li><a href="http://john-home.iptime.org:8085/xe/index.php?mid=board_sKSz42&document_srl=1551">WebRTC 정보 모음집</a></li><li><a href="https://wormwlrm.github.io/2021/01/24/Introducing-WebRTC.html">Web RTC 개요부터 관련 개념까지</a></li><li><a href="https://developer.mozilla.org/ko/docs/Web/API/WebRTC_API">WebRTC API</a></li><li><a href="https://github.com/muaz-khan/RTCMultiConnection">RTCMultiConneciton</a><ul><li>Sample Code 및 Demo가 많음</li></ul></li><li><a href="https://github.com/mariogasparoni/kurento-mcu-webrtc">Kurento-mcu-server</a></li></ul>]]></content>
<categories>
<category> dev </category>
</categories>
</entry>
<entry>
<title>로또의 최고 순위와 최저 순위</title>
<link href="/2022/07/22/programmers-2/"/>
<url>/2022/07/22/programmers-2/</url>
<content type="html"><![CDATA[<h2 id="풀이"><a href="#풀이" class="headerlink" title="풀이"></a>풀이</h2><ul><li>순서에 상관 없이 번호만 일치하면 된다</li><li>바꿀 수 있는 번호는 0이다</li></ul><p>로또 당첨 번호 받아서 순차적으로 안에 값이 있는지 확인해서, 없는 것만 찾으면 될 듯하다<br>최소 당첨 번호는 일치하는 숫자의 갯수이다. 최대 당첨 번호는 전체 자릿 수에서 일치하지 않는 번호만 빼면 된다</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">def</span> <span class="title function_">solution</span>(<span class="params">lottos, win_nums</span>):</span><br><span class="line"> answer = []</span><br><span class="line"> correct,zero = <span class="number">0</span>,<span class="number">0</span></span><br><span class="line"> <span class="keyword">for</span> l <span class="keyword">in</span> lottos:</span><br><span class="line"> <span class="keyword">if</span> l==<span class="number">0</span>:</span><br><span class="line"> zero+=<span class="number">1</span></span><br><span class="line"> <span class="keyword">elif</span> l <span class="keyword">in</span> win_nums:</span><br><span class="line"> correct+=<span class="number">1</span></span><br><span class="line"> </span><br><span class="line"> mini,maxi=<span class="number">0</span>,<span class="number">0</span></span><br><span class="line"> maxi = correct+zero</span><br><span class="line"> mini = correct</span><br><span class="line"> </span><br><span class="line"> <span class="keyword">if</span> maxi==<span class="number">0</span> <span class="keyword">or</span> maxi ==<span class="number">1</span>:</span><br><span class="line"> answer.append(<span class="number">6</span>) </span><br><span class="line"> <span class="keyword">else</span>: </span><br><span class="line"> answer.append(<span class="number">7</span>-maxi)</span><br><span class="line"> <span class="keyword">if</span> mini==<span class="number">0</span> <span class="keyword">or</span> mini==<span class="number">1</span>:</span><br><span class="line"> answer.append(<span class="number">6</span>)</span><br><span class="line"> <span class="keyword">else</span>:</span><br><span class="line"> answer.append(<span class="number">7</span>-mini)</span><br><span class="line"> </span><br><span class="line"> <span class="keyword">return</span> answer</span><br></pre></td></tr></table></figure><h2 id="회고"><a href="#회고" class="headerlink" title="회고"></a>회고</h2><ul><li>로직은 매우 쉬운데, 내 생각이 좀 분산된 듯하다</li><li>예외처리 잘하자 그냥 조건만 잘 읽으면 예외처리는 껌이야</li></ul>]]></content>
<tags>
<tag> Programmers </tag>
</tags>
</entry>
<entry>
<title>신고 결과 받기 - Programmers</title>
<link href="/2022/07/22/programmers-1/"/>
<url>/2022/07/22/programmers-1/</url>
<content type="html"><![CDATA[<h2 id="풀이"><a href="#풀이" class="headerlink" title="풀이"></a>풀이</h2><ul><li>한 유저가 중복해서 같은 유저를 계속 신고할 수 없다</li><li>k 번 이상 신고된 유저는 정지되고, 그 결과를 모든 유저에게 정지 사실을 메일로 발송한다</li></ul><p>즉 유저는 신고한 유저의 정보를 가지고 있어야 하고, 유저마다 신고된 횟수도 기록되어야 한다.<br>최종적으로 answer에는 각 유저들이 받은 처리 메일만 기록하면 된다.</p><p>풀이 방법은 신고 받은 유저 딕셔너리를 만들고, 해당 유저를 신고한 유저들을 한 명씩 넣는다<br>그리고 연산 끝에 한 번에 정지된 이용자를 정리한다</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br></pre></td><td class="code"><pre><span class="line">score = {}</span><br><span class="line">result = {}</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">solution</span>(<span class="params">id_list, report, k</span>):</span><br><span class="line"> answer = []</span><br><span class="line"> <span class="keyword">for</span> <span class="built_in">id</span> <span class="keyword">in</span> id_list:</span><br><span class="line"> score[<span class="built_in">id</span>] =[]</span><br><span class="line"> result[<span class="built_in">id</span>]=<span class="number">0</span></span><br><span class="line"> <span class="keyword">for</span> rp <span class="keyword">in</span> report:</span><br><span class="line"> gUser,bUser = rp.split()</span><br><span class="line"> score[bUser].append(gUser)</span><br><span class="line"> score[bUser] = <span class="built_in">list</span>(<span class="built_in">set</span>(score[bUser]))</span><br><span class="line"> <span class="keyword">for</span> sc <span class="keyword">in</span> score.keys():</span><br><span class="line"> <span class="keyword">if</span> <span class="built_in">len</span>(score[sc])>=k:</span><br><span class="line"> <span class="keyword">for</span> s <span class="keyword">in</span> score[sc]:</span><br><span class="line"> result[s]+=<span class="number">1</span></span><br><span class="line"> answer = <span class="built_in">list</span>(result.values())</span><br><span class="line"> <span class="keyword">return</span> answer</span><br></pre></td></tr></table></figure><h2 id="회고"><a href="#회고" class="headerlink" title="회고"></a>회고</h2><ul><li>확실히 그냥 무지성으로 푸는 것이 아니라 쉬운 문제도 꼼꼼히 봐야 풀 수 있는 문제들이 출제되는구나</li><li>감이 확실히 많이 떨어졌다.</li></ul>]]></content>
<categories>
<category> algorithm </category>
</categories>
<tags>
<tag> Programmers </tag>
</tags>
</entry>
<entry>
<title>이분 탐색</title>
<link href="/2022/03/10/algorithm-binarysearch/"/>
<url>/2022/03/10/algorithm-binarysearch/</url>
<content type="html"><![CDATA[<!-- 튜토리얼, 하우 투 가이드, 설명 ,레퍼런스 https://documentation.divio.com/tutorials/--><h2 id="이분-탐색이란-What-is-binary-Search"><a href="#이분-탐색이란-What-is-binary-Search" class="headerlink" title="이분 탐색이란(What is binary Search)"></a>이분 탐색이란(What is binary Search)</h2><p>이분 탐색은 __정렬된 배열__에서 중앙값과 비교하여 목표값을 찾는 알고리즘이다.</p><p>목표 값을 중앙값(Mid)과 비교하여,중앙값보다 목표값이 작거나 크다면 범위를 중앙 값 기준으로 범위를 절반 제한하며 탐색한다.</p><p>길이 15이고, 인덱스와 배열의 값이 같은 배열에서 이분 탐색을 하는 상황을 가정해보자(편의상 배열의 중앙 값은 Mid, 시작은 start, 끝은 end다.)<br>start의 인덱스는 0, end는 14이다. Mid는 (0+14)2인 7이다.</p><p>우리가 찾고 싶은 값은 3이다.<br>3은 mid 7보다 작으므로, 중앙값 기준으로 왼쪽에 있으며, 중앙 값의 오른편은 값이 없음을 신뢰할 수 있다.<br>이 때 왼 편을 기준으로 다시 이분 탐색을 한다.<br>start는 0,end는 (mid-1)인 6, 새로운 mid는 (0+6)/3이다.<br>그 후 다시 3을 찾을 때까지 이분 탐색을 반복한다.</p><p>이분 탐색의 핵심은 중앙 값을 이용해 검색 범위를 줄여나가는 것이다.</p><p>이분 탐색의 시간 복잡도는 최대 성능 O(1), 최악 성능은 O(log2 n)이며, 평균 성능은 O(log n)이다.</p><h2 id="Code"><a href="#Code" class="headerlink" title="Code:"></a>Code:</h2><p>아래 코드는 aList에 이분 탐색을 하여 값을 있으면 1, 없으면 0을 반환한다</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> sys</span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">bnSearch</span>(<span class="params">num:<span class="built_in">int</span>,aList:<span class="built_in">list</span></span>):</span><br><span class="line"> start=<span class="number">0</span></span><br><span class="line"> end=<span class="built_in">len</span>(aList)-<span class="number">1</span></span><br><span class="line"> <span class="keyword">while</span>(start<=end):</span><br><span class="line"> mid = <span class="built_in">int</span>((start+end)/<span class="number">2</span>)</span><br><span class="line"> <span class="keyword">if</span>(num>aList[mid]):</span><br><span class="line"> start = mid+<span class="number">1</span></span><br><span class="line"> <span class="keyword">elif</span>(num<aList[mid]):</span><br><span class="line"> end=mid-<span class="number">1</span></span><br><span class="line"> <span class="keyword">elif</span>(num==aList[mid]):</span><br><span class="line"> <span class="keyword">return</span> <span class="number">1</span></span><br><span class="line"> <span class="keyword">return</span> <span class="number">0</span></span><br></pre></td></tr></table></figure><h2 id="Reference"><a href="#Reference" class="headerlink" title="Reference"></a>Reference</h2><p><a href="https://en.wikipedia.org/wiki/Binary_search_algorithm">Wikipedia_binarySearch</a><br><a href="https://sirzzang.github.io/programming/Programming-Binary-Search/">[알고리즘] 이분탐색</a></p>]]></content>
<categories>
<category> algorithm </category>
</categories>
<tags>
<tag> 블로그 </tag>
</tags>
</entry>
<entry>
<title>백준 1003 피보나치 함수</title>
<link href="/2022/03/10/algorithm-boj1003/"/>
<url>/2022/03/10/algorithm-boj1003/</url>
<content type="html"><![CDATA[<h1 id="백준-1003-피보나치-함수"><a href="#백준-1003-피보나치-함수" class="headerlink" title="백준 1003 피보나치 함수"></a>백준 1003 피보나치 함수</h1><h2 id="문제"><a href="#문제" class="headerlink" title="문제"></a>문제</h2><p>피보나치 수열의 0과 1의 갯수를 구해서 출력하는 문제이다</p><p>첫째 줄에 테스트 케이스의 개수 T가 주어진다.</p><p>각 테스트 케이스는 한 줄로 이루어져 있고, N이 주어진다. N은 40보다 작거나 같은 자연수 또는 0이다.</p><h3 id="출력"><a href="#출력" class="headerlink" title="출력"></a>출력</h3><p>각 테스트 케이스마다 0이 출력되는 횟수와 1이 출력되는 횟수를 공백으로 구분해서 출력한다.</p><h2 id="풀이"><a href="#풀이" class="headerlink" title="풀이"></a>풀이</h2><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> sys</span><br><span class="line"><span class="comment"># fibo(n) = fibo(n-2) + fibo(n-1)</span></span><br><span class="line">zdp = [<span class="number">1</span>,<span class="number">0</span>]</span><br><span class="line">odp = [<span class="number">0</span>,<span class="number">1</span>]</span><br><span class="line"><span class="keyword">for</span> i <span class="keyword">in</span> <span class="built_in">range</span>(<span class="number">2</span>,<span class="number">41</span>):</span><br><span class="line"> zdp.append(zdp[i-<span class="number">2</span>]+zdp[i-<span class="number">1</span>])</span><br><span class="line"> odp.append(odp[i-<span class="number">2</span>]+odp[i-<span class="number">1</span>])</span><br><span class="line"></span><br><span class="line">n = <span class="built_in">int</span>(sys.stdin.readline())</span><br><span class="line"></span><br><span class="line"><span class="keyword">for</span> j <span class="keyword">in</span> <span class="built_in">range</span>(n):</span><br><span class="line"> num = <span class="built_in">int</span>(sys.stdin.readline())</span><br><span class="line"> <span class="built_in">print</span>(<span class="string">f"<span class="subst">{zdp[num]}</span> <span class="subst">{odp[num]}</span>"</span>)</span><br></pre></td></tr></table></figure><p>0과 1의 갯수를 따로 계산해서 출력하면 된다.</p>]]></content>
<categories>
<category> algorithm </category>
</categories>
<tags>
<tag> 블로그 </tag>
</tags>
</entry>
<entry>
<title>백준 1012 유기농 배추</title>
<link href="/2022/03/10/algorithm-boj1012/"/>
<url>/2022/03/10/algorithm-boj1012/</url>
<content type="html"><![CDATA[<!-- 튜토리얼, 하우 투 가이드, 설명 ,레퍼런스 https://documentation.divio.com/tutorials/--><h1 id="백준-1012-유기농-배추"><a href="#백준-1012-유기농-배추" class="headerlink" title="백준 1012 유기농 배추"></a>백준 1012 유기농 배추</h1><h2 id="문제"><a href="#문제" class="headerlink" title="문제"></a>문제</h2><p>차세대 영농인 한나는 강원도 고랭지에서 유기농 배추를 재배하기로 하였다. 농약을 쓰지 않고 배추를 재배하려면 배추를 해충으로부터 보호하는 것이 중요하기 때문에, 한나는 해충 방지에 효과적인 배추흰지렁이를 구입하기로 결심한다. 이 지렁이는 배추근처에 서식하며 해충을 잡아 먹음으로써 배추를 보호한다. 특히, 어떤 배추에 배추흰지렁이가 한 마리라도 살고 있으면 이 지렁이는 인접한 다른 배추로 이동할 수 있어, 그 배추들 역시 해충으로부터 보호받을 수 있다. 한 배추의 상하좌우 네 방향에 다른 배추가 위치한 경우에 서로 인접해있는 것이다.</p><p>한나가 배추를 재배하는 땅은 고르지 못해서 배추를 군데군데 심어 놓았다. 배추들이 모여있는 곳에는 배추흰지렁이가 한 마리만 있으면 되므로 서로 인접해있는 배추들이 몇 군데에 퍼져있는지 조사하면 총 몇 마리의 지렁이가 필요한지 알 수 있다. 예를 들어 배추밭이 아래와 같이 구성되어 있으면 최소 5마리의 배추흰지렁이가 필요하다. 0은 배추가 심어져 있지 않은 땅이고, 1은 배추가 심어져 있는 땅을 나타낸다.</p><h2 id="풀이"><a href="#풀이" class="headerlink" title="풀이"></a>풀이</h2><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> sys</span><br><span class="line"><span class="keyword">from</span> collections <span class="keyword">import</span> deque</span><br><span class="line">t = <span class="built_in">int</span>(sys.stdin.readline())</span><br><span class="line">dx = [<span class="number">0</span>,<span class="number">0</span>,<span class="number">1</span>,-<span class="number">1</span>]</span><br><span class="line">dy = [<span class="number">1</span>,-<span class="number">1</span>,<span class="number">0</span>,<span class="number">0</span>]</span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">bfs</span>(<span class="params">mp,a,b</span>):</span><br><span class="line"> queue = deque()</span><br><span class="line"> queue.append((a,b))</span><br><span class="line"> mp[a][b]=<span class="number">0</span></span><br><span class="line"> <span class="keyword">while</span> queue:</span><br><span class="line"> x,y=queue.popleft()</span><br><span class="line"> <span class="keyword">for</span> i <span class="keyword">in</span> <span class="built_in">range</span>(<span class="number">4</span>):</span><br><span class="line"> nx=x+dx[i]</span><br><span class="line"> ny=y+dy[i]</span><br><span class="line"> <span class="keyword">if</span> nx<<span class="number">0</span> <span class="keyword">or</span> nx>=n <span class="keyword">or</span> ny <<span class="number">0</span> <span class="keyword">or</span> ny>= m:</span><br><span class="line"> <span class="keyword">continue</span></span><br><span class="line"> <span class="keyword">if</span> mp[nx][ny]==<span class="number">1</span>:</span><br><span class="line"> mp[nx][ny]=<span class="number">0</span></span><br><span class="line"> queue.append((nx,ny))</span><br><span class="line"></span><br><span class="line"><span class="keyword">for</span> i <span class="keyword">in</span> <span class="built_in">range</span>(t):</span><br><span class="line"> count=<span class="number">0</span></span><br><span class="line"> n,m,k = <span class="built_in">map</span>(<span class="built_in">int</span>,sys.stdin.readline().split())</span><br><span class="line"> mp = [[<span class="number">0</span>]*m <span class="keyword">for</span> _ <span class="keyword">in</span> <span class="built_in">range</span>(n)]</span><br><span class="line"></span><br><span class="line"> <span class="keyword">for</span> j <span class="keyword">in</span> <span class="built_in">range</span>(k):</span><br><span class="line"> x,y = <span class="built_in">map</span>(<span class="built_in">int</span>,sys.stdin.readline().split())</span><br><span class="line"> mp[x][y]=<span class="number">1</span></span><br><span class="line"> <span class="keyword">for</span> a <span class="keyword">in</span> <span class="built_in">range</span>(n):</span><br><span class="line"> <span class="keyword">for</span> b <span class="keyword">in</span> <span class="built_in">range</span>(m):</span><br><span class="line"> <span class="keyword">if</span> mp[a][b]==<span class="number">1</span>:</span><br><span class="line"> bfs(mp, a, b)</span><br><span class="line"> count+=<span class="number">1</span></span><br><span class="line"> <span class="built_in">print</span>(count)</span><br></pre></td></tr></table></figure><p>맵을 (0,0)부터 순환하면서 1을 만나면, 주변을 탐색해서 연결된 1을 다 제거하고 카운트를 센다.</p><p>bfs 문제를 많이 안풀어봐서 벡터를 사용하면 되겠거니 했는데, 아이디어는 맞았는데 지렁이를 잘못 세었다.</p>]]></content>
<categories>
<category> algorithm </category>
</categories>
<tags>
<tag> 블로그 </tag>
</tags>
</entry>
<entry>
<title>백준 1074 Z</title>
<link href="/2022/03/10/algorithm-boj1074/"/>
<url>/2022/03/10/algorithm-boj1074/</url>
<content type="html"><![CDATA[<!-- 튜토리얼, 하우 투 가이드, 설명 ,레퍼런스 https://documentation.divio.com/tutorials/--><h1 id="백준-1074-Z"><a href="#백준-1074-Z" class="headerlink" title="백준 1074 Z"></a>백준 1074 Z</h1><h2 id="문제"><a href="#문제" class="headerlink" title="문제"></a>문제</h2><p>한수는 크기가 2N × 2N인 2차원 배열을 Z모양으로 탐색하려고 한다. 예를 들어, 2×2배열을 왼쪽 위칸, 오른쪽 위칸, 왼쪽 아래칸, 오른쪽 아래칸 순서대로 방문하면 Z모양이다.</p><p>N > 1인 경우, 배열을 크기가 2N-1 × 2N-1로 4등분 한 후에 재귀적으로 순서대로 방문한다.<br>N이 주어졌을 때, r행 c열을 몇 번째로 방문하는지 출력하는 프로그램을 작성하시오.</p><h2 id="풀이"><a href="#풀이" class="headerlink" title="풀이"></a>풀이</h2><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> sys</span><br><span class="line"></span><br><span class="line">N,r,c = <span class="built_in">map</span>(<span class="built_in">int</span>,sys.stdin.readline().split())</span><br><span class="line"></span><br><span class="line">ans = <span class="number">0</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">while</span> N!=<span class="number">0</span>:</span><br><span class="line"> N-=<span class="number">1</span></span><br><span class="line"> <span class="keyword">if</span> r<<span class="number">2</span>**N <span class="keyword">and</span> c<<span class="number">2</span>**N:</span><br><span class="line"> <span class="keyword">continue</span></span><br><span class="line"> <span class="keyword">elif</span> r<<span class="number">2</span>**N <span class="keyword">and</span> c>=<span class="number">2</span>**N:</span><br><span class="line"> ans +=(<span class="number">2</span>**N)*(<span class="number">2</span>**N)*<span class="number">1</span></span><br><span class="line"> c-=(<span class="number">2</span>**N)</span><br><span class="line"> <span class="keyword">elif</span> r>=<span class="number">2</span> **N <span class="keyword">and</span> c<<span class="number">2</span>**N:</span><br><span class="line"> ans+=(<span class="number">2</span>**N)*(<span class="number">2</span>**N)*<span class="number">2</span></span><br><span class="line"> r-=(<span class="number">2</span>**N)</span><br><span class="line"> <span class="keyword">else</span>:</span><br><span class="line"> ans+=(<span class="number">2</span>**N)*(<span class="number">2</span>**N)*<span class="number">3</span></span><br><span class="line"> r-=(<span class="number">2</span>**N)</span><br><span class="line"> c-=(<span class="number">2</span>**N)</span><br><span class="line"></span><br><span class="line"><span class="built_in">print</span>(ans)</span><br></pre></td></tr></table></figure><p><a href="https://ggasoon2.tistory.com/11">이 블로그</a>를 참고했습니다. 꽤나 까다로운 문제였습니다.</p><p>분할과 재귀 문제라는데 머리론 이해가 되는데 구현을 못하는 상황에 직면했습니다.</p><p>문제는 말 그대로 쪼개면 됩니다. N 크기의 맵에서 어느 사분면에 해당하는지 찾은 후 쪼갠 맵에서 다시 어느 사분면에 해당하는지 찾습니다.</p><p>복습이 필요한 문제이다.</p>]]></content>
<categories>
<category> algorithm </category>
</categories>
<tags>
<tag> 블로그 </tag>
</tags>
</entry>
<entry>
<title>백준 10820 문자열 분석</title>
<link href="/2022/03/10/algorithm-boj10820/"/>
<url>/2022/03/10/algorithm-boj10820/</url>
<content type="html"><![CDATA[<!--튜토리얼, 하우 투 가이드, 설명 ,레퍼런스https://documentation.divio.com/tutorials/--><h1 id="백준-10820-문자열-분석"><a href="#백준-10820-문자열-분석" class="headerlink" title="백준 10820 문자열 분석"></a>백준 10820 문자열 분석</h1><h2 id="문제"><a href="#문제" class="headerlink" title="문제"></a>문제</h2><p>문자열 N개가 주어진다. 이때, 문자열에 포함되어 있는 소문자, 대문자, 숫자, 공백의 개수를 구하는 프로그램을 작성하시오.</p><p>각 문자열은 알파벳 소문자, 대문자, 숫자, 공백으로만 이루어져 있다.</p><h3 id="입력"><a href="#입력" class="headerlink" title="입력"></a>입력</h3><p>첫째 줄부터 N번째 줄까지 문자열이 주어진다. (1 ≤ N ≤ 100) 문자열의 길이는 100을 넘지 않는다.</p><h3 id="출력"><a href="#출력" class="headerlink" title="출력"></a>출력</h3><p>첫째 줄부터 N번째 줄까지 각각의 문자열에 대해서 소문자, 대문자, 숫자, 공백의 개수를 공백으로 구분해 출력한다.</p><h2 id="풀이"><a href="#풀이" class="headerlink" title="풀이"></a>풀이</h2><p>대소문자,공백, 숫자를 카운트하는건 어렵지 않았다. EOF 처리랑 문자열을 어떻게 만질것인가가 관건이다.</p><p>문제 풀 때 rstrip()을 무심코 사용했었는데 그래서 틀릴 뻔 했다.</p><h4 id="rstrip"><a href="#rstrip" class="headerlink" title="rstrip()"></a>rstrip()</h4><p><a href="https://www.w3schools.com/python/ref_string_rstrip.asp">rstrip()</a>은 인자로 주어지는 문자를 문자열에서 모두 지우는 메소드이다.<br>기본적으로 아무것도 주어지지 않으면 문자열의 끝(개행문자)와 공백을 지운다.</p><h3 id="핵심-아이디어"><a href="#핵심-아이디어" class="headerlink" title="핵심 아이디어"></a>핵심 아이디어</h3><ul><li>EOF 처리를 어떻게 할 것인가?</li></ul><p>문자열이 얼마나 들어올지 알려주지 않기 때문에 try 문을 이용해 EOF 예외 처리를 했다.</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">while</span> <span class="number">1</span>:</span><br><span class="line"> <span class="keyword">try</span>:</span><br><span class="line"> <span class="keyword">pass</span></span><br><span class="line"> <span class="keyword">except</span> EOFError:</span><br><span class="line"> <span class="keyword">pass</span></span><br></pre></td></tr></table></figure><p>그리고 입력된 문자열이 존재하는지 확인해서 없을 경우 while문을 멈추게 했다.</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">s = sys.stdin.readline().rstrip(<span class="string">'\n)</span></span><br><span class="line"><span class="string">if not s:</span></span><br><span class="line"><span class="string"> break</span></span><br></pre></td></tr></table></figure><h2 id="Code"><a href="#Code" class="headerlink" title="Code"></a>Code</h2><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br></pre></td><td class="code"><pre><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">fun</span>(<span class="params">s</span>):</span><br><span class="line"></span><br><span class="line"> small,big,number,space=<span class="number">0</span>,<span class="number">0</span>,<span class="number">0</span>,<span class="number">0</span></span><br><span class="line"></span><br><span class="line"> <span class="keyword">for</span> val <span class="keyword">in</span> s:</span><br><span class="line"> <span class="keyword">if</span> val.isupper():</span><br><span class="line"> big+=<span class="number">1</span></span><br><span class="line"> <span class="keyword">elif</span> val.islower():</span><br><span class="line"> small+=<span class="number">1</span></span><br><span class="line"> <span class="keyword">elif</span> val == <span class="string">' '</span>:</span><br><span class="line"> space+=<span class="number">1</span></span><br><span class="line"> <span class="keyword">elif</span> val.isdigit():</span><br><span class="line"> number+=<span class="number">1</span></span><br><span class="line"> <span class="keyword">else</span>:</span><br><span class="line"> <span class="keyword">return</span> -<span class="number">1</span></span><br><span class="line"> <span class="keyword">break</span></span><br><span class="line"> <span class="keyword">return</span> <span class="string">f"<span class="subst">{small}</span> <span class="subst">{big}</span> <span class="subst">{number}</span> <span class="subst">{space}</span>"</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">while</span> <span class="number">1</span>:</span><br><span class="line"> <span class="keyword">try</span>:</span><br><span class="line"> s = sys.stdin.readline().rstrip(<span class="string">'\n'</span>)</span><br><span class="line"> <span class="keyword">if</span> <span class="keyword">not</span> s:</span><br><span class="line"> <span class="keyword">break</span></span><br><span class="line"> <span class="keyword">else</span>:</span><br><span class="line"> ans = fun(s)</span><br><span class="line"> <span class="keyword">if</span> ans ==-<span class="number">1</span>:</span><br><span class="line"> <span class="keyword">break</span></span><br><span class="line"> <span class="keyword">else</span>:</span><br><span class="line"> <span class="built_in">print</span>(ans)</span><br><span class="line"></span><br><span class="line"> <span class="keyword">except</span> EOFError:</span><br><span class="line"> <span class="keyword">break</span></span><br></pre></td></tr></table></figure>]]></content>
<categories>
<category> algorithm </category>
</categories>
<tags>
<tag> 블로그 </tag>
</tags>
</entry>
<entry>
<title>백준 11047 동전 0</title>
<link href="/2022/03/10/algorithm-boj11047/"/>
<url>/2022/03/10/algorithm-boj11047/</url>
<content type="html"><![CDATA[<!-- 튜토리얼, 하우 투 가이드, 설명 ,레퍼런스 https://documentation.divio.com/tutorials/--><h1 id="동전-0"><a href="#동전-0" class="headerlink" title="동전 0"></a>동전 0</h1><h2 id="문제"><a href="#문제" class="headerlink" title="문제"></a>문제</h2><p>준규가 가지고 있는 동전은 총 N종류이고, 각각의 동전을 매우 많이 가지고 있다.</p><p>동전을 적절히 사용해서 그 가치의 합을 K로 만들려고 한다. 이때 필요한 동전 개수의 최솟값을 구하는 프로그램을 작성하시오.</p><h2 id="풀이"><a href="#풀이" class="headerlink" title="풀이"></a>풀이</h2><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> sys</span><br><span class="line"></span><br><span class="line">n,k = <span class="built_in">map</span>(<span class="built_in">int</span>,sys.stdin.readline().split())</span><br><span class="line">coins=[<span class="built_in">int</span>(sys.stdin.readline()) <span class="keyword">for</span> i <span class="keyword">in</span> <span class="built_in">range</span>(n)]</span><br><span class="line">cnt=<span class="number">0</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">for</span> i <span class="keyword">in</span> <span class="built_in">range</span>(n-<span class="number">1</span>,-<span class="number">1</span>,-<span class="number">1</span>):</span><br><span class="line"> <span class="keyword">if</span> k==<span class="number">0</span>:</span><br><span class="line"> <span class="keyword">break</span></span><br><span class="line"> <span class="keyword">if</span> coins[i]>k:</span><br><span class="line"> <span class="keyword">continue</span></span><br><span class="line"> cnt+=k//coins[i]</span><br><span class="line"> k%=coins[i]</span><br><span class="line"><span class="built_in">print</span>(cnt)</span><br></pre></td></tr></table></figure>]]></content>
<categories>
<category> algorithm </category>
</categories>
<tags>
<tag> 블로그 </tag>
</tags>
</entry>
<entry>
<title>백준 11279 최대 힙</title>
<link href="/2022/03/10/algorithm-boj11279/"/>
<url>/2022/03/10/algorithm-boj11279/</url>
<content type="html"><![CDATA[<!-- 튜토리얼, 하우 투 가이드, 설명 ,레퍼런스 https://documentation.divio.com/tutorials/--><h1 id="백준-11279-최대-힙"><a href="#백준-11279-최대-힙" class="headerlink" title="백준 11279 최대 힙"></a>백준 11279 최대 힙</h1><h2 id="문제"><a href="#문제" class="headerlink" title="문제"></a>문제</h2><p>널리 잘 알려진 자료구조 중 최대 힙이 있다. 최대 힙을 이용하여 다음과 같은 연산을 지원하는 프로그램을 작성하시오.</p><p>배열에 자연수 x를 넣는다.<br>배열에서 가장 큰 값을 출력하고, 그 값을 배열에서 제거한다.<br>프로그램은 처음에 비어있는 배열에서 시작하게 된다.</p><h2 id="풀이"><a href="#풀이" class="headerlink" title="풀이"></a>풀이</h2><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> sys</span><br><span class="line"><span class="keyword">import</span> heapq</span><br><span class="line"></span><br><span class="line"><span class="comment"># 배열에 자연수를 x를 넣는다</span></span><br><span class="line"><span class="comment"># 배열에서 가장 큰 값을 출력하고 그 값을 배열에서 제거한다</span></span><br><span class="line"></span><br><span class="line">n = <span class="built_in">int</span>(sys.stdin.readline())</span><br><span class="line">l = []</span><br><span class="line"></span><br><span class="line"><span class="keyword">for</span> i <span class="keyword">in</span> <span class="built_in">range</span>(n):</span><br><span class="line"> t= <span class="built_in">int</span>(sys.stdin.readline())</span><br><span class="line"> <span class="keyword">if</span> t == <span class="number">0</span>:</span><br><span class="line"> <span class="keyword">if</span> <span class="keyword">not</span> l:</span><br><span class="line"> <span class="built_in">print</span>(<span class="number">0</span>)</span><br><span class="line"> <span class="keyword">else</span>:</span><br><span class="line"> <span class="built_in">print</span>(heapq.heappop(l)[<span class="number">1</span>])</span><br><span class="line"> <span class="keyword">else</span>:</span><br><span class="line"> heapq.heappush(l, (-t,t))</span><br><span class="line"></span><br></pre></td></tr></table></figure><p>파이썬의 heapq 라이브러리는 최솟 값만 정렬한다.<br>그래서 맥스 heap을 구하려면 위의 코드처럼 트릭을 써야한다.</p><p>값을 음수로 넣어서 정렬하면 최댓 값이 최솟 값이 되는 원리이다</p>]]></content>
<categories>
<category> algorithm </category>
</categories>
<tags>
<tag> 블로그 </tag>
</tags>
</entry>
<entry>
<title>백준 11286 절댓값 힙</title>
<link href="/2022/03/10/algorithm-boj11286/"/>
<url>/2022/03/10/algorithm-boj11286/</url>
<content type="html"><![CDATA[<!-- 튜토리얼, 하우 투 가이드, 설명 ,레퍼런스 https://documentation.divio.com/tutorials/--><h1 id="백준-11286-절댓값-힙"><a href="#백준-11286-절댓값-힙" class="headerlink" title="백준 11286 절댓값 힙"></a>백준 11286 절댓값 힙</h1><h2 id="문제"><a href="#문제" class="headerlink" title="문제"></a>문제</h2><p>절댓값 힙은 다음과 같은 연산을 지원하는 자료구조이다.</p><p>배열에 정수 x (x ≠ 0)를 넣는다.<br>배열에서 절댓값이 가장 작은 값을 출력하고, 그 값을 배열에서 제거한다. 절댓값이 가장 작은 값이 여러개일 때는, 가장 작은 수를 출력하고, 그 값을 배열에서 제거한다.<br>프로그램은 처음에 비어있는 배열에서 시작하게 된다.</p><p>입력에서 0이 주어진 회수만큼 답을 출력한다. 만약 배열이 비어 있는 경우인데 절댓값이 가장 작은 값을 출력하라고 한 경우에는 0을 출력하면 된다.</p><h2 id="풀이"><a href="#풀이" class="headerlink" title="풀이"></a>풀이</h2><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> sys</span><br><span class="line"><span class="keyword">import</span> heapq</span><br><span class="line"></span><br><span class="line">n = <span class="built_in">int</span>(sys.stdin.readline())</span><br><span class="line">heap=[]</span><br><span class="line"><span class="keyword">for</span> i <span class="keyword">in</span> <span class="built_in">range</span>(n):</span><br><span class="line"> num=<span class="built_in">int</span>(sys.stdin.readline())</span><br><span class="line"> <span class="keyword">if</span> num ==<span class="number">0</span>:</span><br><span class="line"> <span class="keyword">if</span> <span class="keyword">not</span> heap:</span><br><span class="line"> <span class="built_in">print</span>(<span class="number">0</span>)</span><br><span class="line"> <span class="keyword">continue</span></span><br><span class="line"> <span class="built_in">print</span>(heapq.heappop(heap)[<span class="number">1</span>])</span><br><span class="line"> <span class="keyword">else</span>:</span><br><span class="line"> heapq.heappush(heap,(<span class="built_in">abs</span>(num),num))</span><br></pre></td></tr></table></figure><p>heapq 라이브러리를 사용하면 간단하게 풀 수 있다.<br>다른 최소 힙, 최대 힙 문제와 똑같이 튜플로 값을 대입하여 우선순위를 지정한다.</p>]]></content>
<categories>
<category> algorithm </category>
</categories>
<tags>
<tag> 블로그 </tag>
</tags>
</entry>
<entry>
<title>백준 11403 경로 찾기</title>
<link href="/2022/03/10/algorithm-boj11403/"/>
<url>/2022/03/10/algorithm-boj11403/</url>
<content type="html"><![CDATA[<!-- 튜토리얼, 하우 투 가이드, 설명 ,레퍼런스 https://documentation.divio.com/tutorials/--><h1 id="백준-11403-경로-찾기"><a href="#백준-11403-경로-찾기" class="headerlink" title="백준 11403 경로 찾기"></a>백준 11403 경로 찾기</h1><h2 id="문제"><a href="#문제" class="headerlink" title="문제"></a>문제</h2><p>가중치 없는 방향 그래프 G가 주어졌을 때, 모든 정점 (i, j)에 대해서, i에서 j로 가는 경로가 있는지 없는지 구하는 프로그램을 작성하시오.</p><h3 id="입력"><a href="#입력" class="headerlink" title="입력"></a>입력</h3><p>첫째 줄에 정점의 개수 N (1 ≤ N ≤ 100)이 주어진다. 둘째 줄부터 N개 줄에는 그래프의 인접 행렬이 주어진다. i번째 줄의 j번째 숫자가 1인 경우에는 i에서 j로 가는 간선이 존재한다는 뜻이고, 0인 경우는 없다는 뜻이다. i번째 줄의 i번째 숫자는 항상 0이다.</p><h3 id="출력"><a href="#출력" class="headerlink" title="출력"></a>출력</h3><p>총 N개의 줄에 걸쳐서 문제의 정답을 인접행렬 형식으로 출력한다. 정점 i에서 j로 가는 경로가 있으면 i번째 줄의 j번째 숫자를 1로, 없으면 0으로 출력해야 한다</p><h2 id="풀이"><a href="#풀이" class="headerlink" title="풀이"></a>풀이</h2><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> sys</span><br><span class="line"><span class="keyword">from</span> collections <span class="keyword">import</span> deque</span><br><span class="line"></span><br><span class="line">n = <span class="built_in">int</span>(sys.stdin.readline())</span><br><span class="line">mp=[<span class="built_in">list</span>(<span class="built_in">map</span>(<span class="built_in">int</span>,sys.stdin.readline().split())) <span class="keyword">for</span> _ <span class="keyword">in</span> <span class="built_in">range</span>(n)]</span><br><span class="line"></span><br><span class="line">nodes=[[] <span class="keyword">for</span> i <span class="keyword">in</span> <span class="built_in">range</span>(n)]</span><br><span class="line"></span><br><span class="line"><span class="keyword">for</span> i <span class="keyword">in</span> <span class="built_in">range</span>(<span class="built_in">len</span>(mp)):</span><br><span class="line"> <span class="keyword">for</span> j <span class="keyword">in</span> <span class="built_in">range</span>(<span class="built_in">len</span>(mp[i])):</span><br><span class="line"> <span class="keyword">if</span> mp[i][j]==<span class="number">1</span>:</span><br><span class="line"> nodes[i].append(j)</span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">bfs</span>(<span class="params">node</span>):</span><br><span class="line"> q=deque()</span><br><span class="line"> visited=[<span class="literal">False</span>]*n</span><br><span class="line"> <span class="keyword">for</span> i <span class="keyword">in</span> nodes[node]:</span><br><span class="line"> q.append(i)</span><br><span class="line"> visited[i]=<span class="literal">True</span></span><br><span class="line"></span><br><span class="line"> <span class="keyword">while</span> q:</span><br><span class="line"> x=q.popleft()</span><br><span class="line"> <span class="keyword">for</span> i <span class="keyword">in</span> nodes[x]:</span><br><span class="line"> <span class="keyword">if</span> <span class="keyword">not</span> visited[i]:</span><br><span class="line"> visited[i]=<span class="literal">True</span></span><br><span class="line"> mp[node][x]=<span class="number">1</span></span><br><span class="line"> q.append(i)</span><br><span class="line"> nodes[node].append(i)</span><br><span class="line"> mp[node][i]=<span class="number">1</span></span><br><span class="line"><span class="keyword">for</span> i <span class="keyword">in</span> <span class="built_in">range</span>(n):</span><br><span class="line"> bfs(i)</span><br><span class="line"></span><br><span class="line"><span class="keyword">for</span> m <span class="keyword">in</span> mp:</span><br><span class="line"> <span class="built_in">print</span>(*m)</span><br></pre></td></tr></table></figure><p>초기에 연결된 연결된 노드들을 추가한다. ( 방향 그래프임을 유의할 것)<br>이미 연결된 노드들을 visited 체크하고, q에 넣어 연결된 노드들이 또 연결된 노드를 찾는다.</p><p>시간 복잡도를 줄이기 위해 중간 중간 맵 변환해주는 것도 잊지 말자</p><h3 id="꼭-잊지-말자"><a href="#꼭-잊지-말자" class="headerlink" title="꼭 잊지 말자"></a>꼭 잊지 말자</h3><ul><li>BFS 문제의 경우 순완 오류에 빠지거나 검색 범위가 너무 넓어질 수 있으니, visited 처럼 갔는지 체크하자</li><li>매개 변수와 베이스 케이스를 명확히 하자</li></ul><h3 id="잘한-점"><a href="#잘한-점" class="headerlink" title="잘한 점"></a>잘한 점</h3><ul><li>답지를 보지 않고 문제를 풀었다.<ul><li>내가 만든 내 풀이!</li></ul></li><li>문제를 차근차근 읽어서 처음에 헤매지 않음</li></ul>]]></content>
<categories>
<category> algorithm </category>
</categories>
<tags>
<tag> 블로그 </tag>
</tags>
</entry>
<entry>
<title>백준 1149 RGB 거리</title>
<link href="/2022/03/10/algorithm-boj1149/"/>
<url>/2022/03/10/algorithm-boj1149/</url>
<content type="html"><![CDATA[<!-- 튜토리얼, 하우 투 가이드, 설명 ,레퍼런스 https://documentation.divio.com/tutorials/--><h1 id="백준-1149-RGB-거리"><a href="#백준-1149-RGB-거리" class="headerlink" title="백준 1149 RGB 거리"></a>백준 1149 RGB 거리</h1><h2 id="문제"><a href="#문제" class="headerlink" title="문제"></a>문제</h2><p>RGB거리에는 집이 N개 있다. 거리는 선분으로 나타낼 수 있고, 1번 집부터 N번 집이 순서대로 있다.</p><p>집은 빨강, 초록, 파랑 중 하나의 색으로 칠해야 한다. 각각의 집을 빨강, 초록, 파랑으로 칠하는 비용이 주어졌을 때, 아래 규칙을 만족하면서 모든 집을 칠하는 비용의 최솟값을 구해보자.</p><p>1번 집의 색은 2번 집의 색과 같지 않아야 한다.<br>N번 집의 색은 N-1번 집의 색과 같지 않아야 한다.<br>i(2 ≤ i ≤ N-1)번 집의 색은 i-1번, i+1번 집의 색과 같지 않아야 한다.</p><h2 id="풀이"><a href="#풀이" class="headerlink" title="풀이"></a>풀이</h2><h2 id="코드"><a href="#코드" class="headerlink" title="코드"></a>코드</h2><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> sys</span><br><span class="line"></span><br><span class="line">n = <span class="built_in">int</span>(sys.stdin.readline())</span><br><span class="line">dp = [[<span class="number">0</span>]*<span class="number">3</span> <span class="keyword">for</span> i <span class="keyword">in</span> <span class="built_in">range</span>(n)]</span><br><span class="line">numbers=[]</span><br><span class="line"><span class="keyword">for</span> i <span class="keyword">in</span> <span class="built_in">range</span>(n):</span><br><span class="line"> numbers.append(<span class="built_in">list</span>(<span class="built_in">map</span>(<span class="built_in">int</span>,sys.stdin.readline().split())))</span><br><span class="line">dp[<span class="number">0</span>]=numbers[<span class="number">0</span>]</span><br><span class="line"><span class="keyword">for</span> i <span class="keyword">in</span> <span class="built_in">range</span>(<span class="number">1</span>,n):</span><br><span class="line"> dp[i][<span class="number">0</span>]=<span class="built_in">min</span>(dp[i-<span class="number">1</span>][<span class="number">1</span>],dp[i-<span class="number">1</span>][<span class="number">2</span>])+numbers[i][<span class="number">0</span>]</span><br><span class="line"> dp[i][<span class="number">1</span>]=<span class="built_in">min</span>(dp[i-<span class="number">1</span>][<span class="number">0</span>],dp[i-<span class="number">1</span>][<span class="number">2</span>])+numbers[i][<span class="number">1</span>]</span><br><span class="line"> dp[i][<span class="number">2</span>]=<span class="built_in">min</span>(dp[i-<span class="number">1</span>][<span class="number">1</span>],dp[i-<span class="number">1</span>][<span class="number">0</span>])+numbers[i][<span class="number">2</span>]</span><br><span class="line"></span><br><span class="line"><span class="built_in">print</span>(<span class="built_in">min</span>(dp[n-<span class="number">1</span>]))</span><br></pre></td></tr></table></figure>]]></content>
<categories>
<category> algorithm </category>
</categories>
<tags>
<tag> 블로그 </tag>
</tags>
</entry>
<entry>
<title>백준 11724 연결 요소 개수</title>
<link href="/2022/03/10/algorithm-boj11724/"/>
<url>/2022/03/10/algorithm-boj11724/</url>
<content type="html"><![CDATA[<!-- 튜토리얼, 하우 투 가이드, 설명 ,레퍼런스 https://documentation.divio.com/tutorials/--><h1 id="백준-11724-연결-요소-개수"><a href="#백준-11724-연결-요소-개수" class="headerlink" title="백준 11724 연결 요소 개수"></a>백준 11724 연결 요소 개수</h1><h2 id="문제"><a href="#문제" class="headerlink" title="문제"></a>문제</h2><p>방향 없는 그래프가 주어졌을 때, 연결 요소 (Connected Component)의 개수를 구하는 프로그램을 작성하시오.</p><p>첫째 줄에 정점의 개수 N과 간선의 개수 M이 주어진다. (1 ≤ N ≤ 1,000, 0 ≤ M ≤ N×(N-1)/2) 둘째 줄부터 M개의 줄에 간선의 양 끝점 u와 v가 주어진다. (1 ≤ u, v ≤ N, u ≠ v) 같은 간선은 한 번만 주어진다.</p><h2 id="풀이"><a href="#풀이" class="headerlink" title="풀이"></a>풀이</h2><p>문제 푸는 흐름은 맞는데 BFS와 DFS 개념이 아직 덜 잡힌 것 같다.</p><h3 id="DFS-풀이"><a href="#DFS-풀이" class="headerlink" title="DFS 풀이"></a>DFS 풀이</h3><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> sys</span><br><span class="line"></span><br><span class="line">sys.setrecursionlimit(<span class="number">10000</span>)</span><br><span class="line"></span><br><span class="line">n,m = <span class="built_in">map</span>(<span class="built_in">int</span>,sys.stdin.readline().split())</span><br><span class="line">nodes = [[] <span class="keyword">for</span> i <span class="keyword">in</span> <span class="built_in">range</span>(n+<span class="number">1</span>)]</span><br><span class="line">nodes[<span class="number">0</span>]=[<span class="number">0</span>,<span class="number">0</span>]</span><br><span class="line">check = [<span class="literal">False</span> <span class="keyword">for</span> _ <span class="keyword">in</span> <span class="built_in">range</span>(n+<span class="number">1</span>)]</span><br><span class="line"></span><br><span class="line">cnt = <span class="number">0</span></span><br><span class="line"><span class="keyword">for</span> i <span class="keyword">in</span> <span class="built_in">range</span>(m):</span><br><span class="line"> node1,node2 = <span class="built_in">map</span>(<span class="built_in">int</span>,sys.stdin.readline().split())</span><br><span class="line"> nodes[node1].append(node2)</span><br><span class="line"> nodes[node2].append(node1)</span><br><span class="line"> nodes[node1].sort()</span><br><span class="line"> nodes[node2].sort()</span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">dfs</span>(<span class="params">start</span>):</span><br><span class="line"> check[start]=<span class="literal">True</span></span><br><span class="line"> <span class="keyword">for</span> i <span class="keyword">in</span> nodes[start]:</span><br><span class="line"> <span class="keyword">if</span> <span class="keyword">not</span> check[i]:</span><br><span class="line"> dfs(i)</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">for</span> i <span class="keyword">in</span> <span class="built_in">range</span>(<span class="number">1</span>,n+<span class="number">1</span>):</span><br><span class="line"> <span class="keyword">if</span> check[i] == <span class="literal">False</span>:</span><br><span class="line"> cnt+=<span class="number">1</span></span><br><span class="line"> dfs(i)</span><br><span class="line"></span><br><span class="line"><span class="built_in">print</span>(cnt)</span><br></pre></td></tr></table></figure><h3 id="BFS-풀이"><a href="#BFS-풀이" class="headerlink" title="BFS 풀이"></a>BFS 풀이</h3><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> sys</span><br><span class="line"><span class="keyword">from</span> collections <span class="keyword">import</span> deque</span><br><span class="line"></span><br><span class="line">sys.setrecursionlimit(<span class="number">10000</span>)</span><br><span class="line"><span class="comment"># 방향 없는 그래프가 주어졌을 때, 연결 요소 개수 세는 법</span></span><br><span class="line"></span><br><span class="line">n, m = <span class="built_in">map</span>(<span class="built_in">int</span>, sys.stdin.readline().split())</span><br><span class="line">nodes = [[] <span class="keyword">for</span> i <span class="keyword">in</span> <span class="built_in">range</span>(n + <span class="number">1</span>)]</span><br><span class="line">check = [<span class="literal">False</span> <span class="keyword">for</span> _ <span class="keyword">in</span> <span class="built_in">range</span>(n + <span class="number">1</span>)]</span><br><span class="line"></span><br><span class="line">cnt = <span class="number">0</span></span><br><span class="line"><span class="keyword">for</span> i <span class="keyword">in</span> <span class="built_in">range</span>(m):</span><br><span class="line"> node1, node2 = <span class="built_in">map</span>(<span class="built_in">int</span>, sys.stdin.readline().split())</span><br><span class="line"> nodes[node1].append(node2)</span><br><span class="line"> nodes[node2].append(node1)</span><br><span class="line"> nodes[node1].sort()</span><br><span class="line"> nodes[node2].sort()</span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">bfs</span>(<span class="params">node</span>):</span><br><span class="line"> check[node] == <span class="literal">True</span></span><br><span class="line"> q = deque([node])</span><br><span class="line"> <span class="keyword">while</span> q:</span><br><span class="line"> v = q.popleft()</span><br><span class="line"> <span class="keyword">for</span> i <span class="keyword">in</span> nodes[v]:</span><br><span class="line"> <span class="keyword">if</span> <span class="keyword">not</span> check[i]:</span><br><span class="line"> check[i] = <span class="literal">True</span></span><br><span class="line"> q.append(i)</span><br><span class="line"></span><br><span class="line"><span class="keyword">for</span> i <span class="keyword">in</span> <span class="built_in">range</span>(<span class="number">1</span>, n + <span class="number">1</span>):</span><br><span class="line"> <span class="keyword">if</span> <span class="keyword">not</span> check[i]:</span><br><span class="line"> cnt += <span class="number">1</span></span><br><span class="line"> bfs(i)</span><br><span class="line"></span><br><span class="line"><span class="built_in">print</span>(cnt)</span><br><span class="line"></span><br></pre></td></tr></table></figure>]]></content>
<categories>
<category> algorithm </category>
</categories>
<tags>
<tag> 블로그 </tag>
</tags>
</entry>
<entry>
<title>백준 11659 구간 합 구하기 4</title>
<link href="/2022/03/10/algorithm-boj11659/"/>
<url>/2022/03/10/algorithm-boj11659/</url>
<content type="html"><![CDATA[<!-- 튜토리얼, 하우 투 가이드, 설명 ,레퍼런스 https://documentation.divio.com/tutorials/--><h1 id="백준-11659-구간-합-구하기-4"><a href="#백준-11659-구간-합-구하기-4" class="headerlink" title="백준 11659 구간 합 구하기 4"></a>백준 11659 구간 합 구하기 4</h1><h2 id="문제"><a href="#문제" class="headerlink" title="문제"></a>문제</h2><p>수 N개가 주어졌을 때, i번째 수부터 j번째 수까지 합을 구하는 프로그램을 작성하시오.</p><h2 id="풀이"><a href="#풀이" class="headerlink" title="풀이"></a>풀이</h2><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> sys</span><br><span class="line"></span><br><span class="line">n,m = <span class="built_in">map</span>(<span class="built_in">int</span>,sys.stdin.readline().split())</span><br><span class="line">numbers = <span class="built_in">list</span>(<span class="built_in">map</span>(<span class="built_in">int</span>,sys.stdin.readline().split()))</span><br><span class="line">sums = [<span class="number">0</span>,numbers[<span class="number">0</span>]]</span><br><span class="line"></span><br><span class="line"><span class="keyword">for</span> num <span class="keyword">in</span> <span class="built_in">range</span>(<span class="number">2</span>,<span class="built_in">len</span>(numbers)+<span class="number">1</span>):</span><br><span class="line"> sums.append(sums[num-<span class="number">1</span>]+numbers[num-<span class="number">1</span>])</span><br><span class="line"></span><br><span class="line"><span class="keyword">for</span> i <span class="keyword">in</span> <span class="built_in">range</span>(m):</span><br><span class="line"> start,end=<span class="built_in">map</span>(<span class="built_in">int</span>,sys.stdin.readline().split())</span><br><span class="line"> <span class="built_in">print</span>(sums[end]-sums[start-<span class="number">1</span>])</span><br></pre></td></tr></table></figure><p>간단한 문제인데, 계속 시간 초과가 나왔었다.<br>구간 합을 구할 때마다 계속 반복되는 연산이 많아 그런거라, 합을 미리 구해 빼서 해결하였다</p>]]></content>
<categories>
<category> algorithm </category>
</categories>
<tags>
<tag> 블로그 </tag>
</tags>
</entry>
<entry>
<title>백준 1260 DFS와 BFS</title>
<link href="/2022/03/10/algorithm-boj1260/"/>
<url>/2022/03/10/algorithm-boj1260/</url>
<content type="html"><![CDATA[<!-- 튜토리얼, 하우 투 가이드, 설명 ,레퍼런스 https://documentation.divio.com/tutorials/--><h1 id="백준-1260-DFS와-BFS"><a href="#백준-1260-DFS와-BFS" class="headerlink" title="백준 1260 DFS와 BFS"></a>백준 1260 DFS와 BFS</h1><h2 id="문제"><a href="#문제" class="headerlink" title="문제"></a>문제</h2><h2 id="풀이"><a href="#풀이" class="headerlink" title="풀이"></a>풀이</h2><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> sys</span><br><span class="line"><span class="keyword">from</span> collections <span class="keyword">import</span> deque</span><br><span class="line"></span><br><span class="line">n,m,v =<span class="built_in">map</span>(<span class="built_in">int</span>,sys.stdin.readline().split())</span><br><span class="line">nodes = [[] <span class="keyword">for</span> _ <span class="keyword">in</span> <span class="built_in">range</span>(n+<span class="number">1</span>)]</span><br><span class="line">check = [<span class="literal">False</span> <span class="keyword">for</span> _ <span class="keyword">in</span> <span class="built_in">range</span>(n+<span class="number">1</span>)]</span><br><span class="line"></span><br><span class="line"><span class="keyword">for</span> i <span class="keyword">in</span> <span class="built_in">range</span>(m):</span><br><span class="line"> node1,node2 = <span class="built_in">map</span>(<span class="built_in">int</span>,sys.stdin.readline().split())</span><br><span class="line"> nodes[node1].append(node2)</span><br><span class="line"> nodes[node2].append(node1)</span><br><span class="line"><span class="keyword">for</span> i <span class="keyword">in</span> <span class="built_in">range</span>(<span class="number">1</span>,n+<span class="number">1</span>):</span><br><span class="line"> nodes[i].sort()</span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">bfs</span>(<span class="params">v</span>):</span><br><span class="line"> check[v]=<span class="literal">True</span></span><br><span class="line"> q = deque([v])</span><br><span class="line"> <span class="keyword">while</span> q:</span><br><span class="line"> node=q.popleft()</span><br><span class="line"> <span class="built_in">print</span>(node,end=<span class="string">' '</span>)</span><br><span class="line"> <span class="keyword">for</span> i <span class="keyword">in</span> nodes[node]:</span><br><span class="line"> <span class="keyword">if</span> check[i]==<span class="literal">False</span>:</span><br><span class="line"> q.append(i)</span><br><span class="line"> check[i]=<span class="literal">True</span></span><br><span class="line"> </span><br><span class="line"><span class="keyword">def</span> <span class="title function_">dfs</span>(<span class="params">v</span>):</span><br><span class="line"> <span class="built_in">print</span>(v,end=<span class="string">' '</span>)</span><br><span class="line"> check[v]=<span class="literal">True</span></span><br><span class="line"> <span class="keyword">for</span> i <span class="keyword">in</span> nodes[v]:</span><br><span class="line"> <span class="keyword">if</span> <span class="keyword">not</span> check[i]:</span><br><span class="line"> dfs(i)</span><br><span class="line"></span><br><span class="line">dfs(v)</span><br><span class="line">check=[<span class="literal">False</span>]*(n+<span class="number">1</span>)</span><br><span class="line"><span class="built_in">print</span>()</span><br><span class="line">bfs(v)</span><br><span class="line"></span><br></pre></td></tr></table></figure>]]></content>
<categories>
<category> algorithm </category>
</categories>
<tags>
<tag> 블로그 </tag>
</tags>
</entry>
<entry>
<title>백준 1303 전쟁 - 전투</title>
<link href="/2022/03/10/algorithm-boj1303/"/>
<url>/2022/03/10/algorithm-boj1303/</url>
<content type="html"><![CDATA[<!-- 튜토리얼, 하우 투 가이드, 설명 ,레퍼런스 https://documentation.divio.com/tutorials/--><h1 id="백준-1303-전쟁-전투"><a href="#백준-1303-전쟁-전투" class="headerlink" title="백준 1303 전쟁 - 전투"></a>백준 1303 전쟁 - 전투</h1><h2 id="문제"><a href="#문제" class="headerlink" title="문제"></a>문제</h2><h2 id="풀이"><a href="#풀이" class="headerlink" title="풀이"></a>풀이</h2><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> sys</span><br><span class="line"><span class="keyword">from</span> collections <span class="keyword">import</span> deque</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">N,M = <span class="built_in">map</span>(<span class="built_in">int</span>,sys.stdin.readline().split())</span><br><span class="line">mp = []</span><br><span class="line"><span class="keyword">for</span> i <span class="keyword">in</span> <span class="built_in">range</span>(M):</span><br><span class="line"> mp.append(<span class="built_in">list</span>(sys.stdin.readline().rstrip()))</span><br><span class="line"></span><br><span class="line">visited=[[<span class="literal">False</span>] * N <span class="keyword">for</span> _ <span class="keyword">in</span> <span class="built_in">range</span>(M)]</span><br><span class="line">W, B = [], []</span><br><span class="line">dx, dy = [<span class="number">0</span>, <span class="number">0</span>, <span class="number">1</span>, -<span class="number">1</span>], [<span class="number">1</span>, -<span class="number">1</span>, <span class="number">0</span>, <span class="number">0</span>]</span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">bfs</span>(<span class="params">x, y</span>):</span><br><span class="line"> q = deque([(x, y)])</span><br><span class="line"> color = mp[x][y]</span><br><span class="line"> count=<span class="number">0</span></span><br><span class="line"> <span class="keyword">while</span> q:</span><br><span class="line"> x, y = q.popleft()</span><br><span class="line"> <span class="keyword">for</span> i <span class="keyword">in</span> <span class="built_in">range</span>(<span class="number">4</span>):</span><br><span class="line"> nx,ny=x+dx[i],y+dy[i]</span><br><span class="line"> <span class="keyword">if</span> nx<<span class="number">0</span> <span class="keyword">or</span> ny<<span class="number">0</span> <span class="keyword">or</span> nx>=M <span class="keyword">or</span> ny>=N:</span><br><span class="line"> <span class="keyword">continue</span> </span><br><span class="line"> <span class="keyword">if</span> color==mp[nx][ny] <span class="keyword">and</span> visited[nx][ny]==<span class="literal">False</span>:</span><br><span class="line"> visited[nx][ny]=<span class="literal">True</span></span><br><span class="line"> q.append((nx,ny))</span><br><span class="line"> count+=<span class="number">1</span></span><br><span class="line"> <span class="keyword">if</span> count==<span class="number">0</span>:</span><br><span class="line"> count=<span class="number">1</span></span><br><span class="line"> <span class="keyword">if</span> color==<span class="string">'W'</span>:</span><br><span class="line"> W.append(count)</span><br><span class="line"> <span class="keyword">else</span>:</span><br><span class="line"> B.append(count)</span><br><span class="line"> </span><br><span class="line"><span class="keyword">for</span> i <span class="keyword">in</span> <span class="built_in">range</span>(M):</span><br><span class="line"> <span class="keyword">for</span> j <span class="keyword">in</span> <span class="built_in">range</span>(N):</span><br><span class="line"> <span class="keyword">if</span> <span class="keyword">not</span> visited[i][j]:</span><br><span class="line"> bfs(i, j)</span><br><span class="line"></span><br><span class="line">answer=[]</span><br><span class="line"><span class="keyword">for</span> i <span class="keyword">in</span> (W,B):</span><br><span class="line"> ans=<span class="number">0</span></span><br><span class="line"> <span class="keyword">for</span> j <span class="keyword">in</span> i:</span><br><span class="line"> ans+=j**<span class="number">2</span></span><br><span class="line"> answer.append(ans)</span><br><span class="line"><span class="built_in">print</span>(*answer)</span><br></pre></td></tr></table></figure><ul><li>졸린 관계로 식이 좀 더럽다</li><li>계속 왜 틀렸나 했는데 visited를 만들 때 가로와 세로를 헷갈렸다.</li></ul><p>다음엔 좀 더 신경 써야 할 것</p><ol><li>따로 리스트를 선언해서 간 곳을 체크하라</li></ol><ul><li>괜히 복잡해져서 헷갈리느니, 그냥 체크하자</li></ul><ol start="2"><li>디버깅할 때 값이 제대로 입력 되는지 확인하자</li></ol><p>이런 유형의 bfs 문제는 간 곳을 체크해서 카운트만 하면 되기 때문에 자주 문제를 풀어서 익숙해지도록 하자</p>]]></content>
<categories>
<category> algorithm </category>
</categories>
<tags>
<tag> 블로그 </tag>
</tags>
</entry>
<entry>
<title>백준 1373 2진수 8진수</title>
<link href="/2022/03/10/algorithm-boj1373/"/>
<url>/2022/03/10/algorithm-boj1373/</url>
<content type="html"><![CDATA[<!--튜토리얼, 하우 투 가이드, 설명 ,레퍼런스https://documentation.divio.com/tutorials/--><h1 id="백준-1373-2진수-8진수"><a href="#백준-1373-2진수-8진수" class="headerlink" title="백준 1373 2진수 8진수"></a>백준 1373 2진수 8진수</h1><h2 id="문제"><a href="#문제" class="headerlink" title="문제"></a>문제</h2><p>2진수가 주어졌을 때, 8진수로 변환하는 프로그램을 작성하시오.</p><h2 id="풀이"><a href="#풀이" class="headerlink" title="풀이"></a>풀이</h2><p>파이썬에서는 내장 함수로 8진수 변환 함수인 oct가 존재한다.<br>또한 int()의 경우 매개 변수를 이용해서 2진수로 표현할 수 있다.</p><p>int(input(),2)는 입력 받은 십진수를 2진수로 바꿔준다.</p><h2 id="코드"><a href="#코드" class="headerlink" title="코드"></a>코드</h2><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">print</span>(<span class="built_in">oct</span>(<span class="built_in">int</span>(<span class="built_in">input</span>(),<span class="number">2</span>))[<span class="number">2</span>:])</span><br></pre></td></tr></table></figure>]]></content>
<categories>
<category> algorithm </category>
</categories>
<tags>
<tag> 블로그 </tag>
</tags>
</entry>
<entry>
<title>백준 1389 케빈 베이컨의 6단계 법칙</title>
<link href="/2022/03/10/algorithm-boj1389/"/>
<url>/2022/03/10/algorithm-boj1389/</url>
<content type="html"><![CDATA[<!-- 튜토리얼, 하우 투 가이드, 설명 ,레퍼런스 https://documentation.divio.com/tutorials/--><h1 id="백준-1389-케빈-베이컨의-6단계-법칙"><a href="#백준-1389-케빈-베이컨의-6단계-법칙" class="headerlink" title="백준 1389 케빈 베이컨의 6단계 법칙"></a>백준 1389 케빈 베이컨의 6단계 법칙</h1><h2 id="문제"><a href="#문제" class="headerlink" title="문제"></a>문제</h2><p>BOJ 유저의 수와 친구 관계가 입력으로 주어졌을 때, 케빈 베이컨의 수가 가장 작은 사람을 구하는 프로그램을 작성하시오.</p><p>첫째 줄에 유저의 수 N (2 ≤ N ≤ 100)과 친구 관계의 수 M (1 ≤ M ≤ 5,000)이 주어진다.<br>둘째 줄부터 M개의 줄에는 친구 관계가 주어진다. 친구 관계는 A와 B로 이루어져 있으며, A와 B가 친구라는 뜻이다.<br>A와 B가 친구이면, B와 A도 친구이며, A와 B가 같은 경우는 없다.<br>친구 관계는 중복되어 들어올 수도 있으며, 친구가 한 명도 없는 사람은 없다.<br>모든 사람은 친구 관계로 연결되어져 있다.<br>사람의 번호는 1부터 N까지이며, 두 사람이 같은 번호를 갖는 경우는 없다.</p><h2 id="풀이"><a href="#풀이" class="headerlink" title="풀이"></a>풀이</h2><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> sys</span><br><span class="line"><span class="keyword">from</span> collections <span class="keyword">import</span> deque</span><br><span class="line">n,m= <span class="built_in">map</span>(<span class="built_in">int</span>, sys.stdin.readline().split())</span><br><span class="line"></span><br><span class="line">persons = [[] <span class="keyword">for</span> _ <span class="keyword">in</span> <span class="built_in">range</span>(n+<span class="number">1</span>)]</span><br><span class="line">kebin = [<span class="number">0</span> <span class="keyword">for</span> _ <span class="keyword">in</span> <span class="built_in">range</span>(n+<span class="number">1</span>)]</span><br><span class="line"><span class="keyword">for</span> i <span class="keyword">in</span> <span class="built_in">range</span>(<span class="number">1</span>,m+<span class="number">1</span>):</span><br><span class="line"> p1,p2 = <span class="built_in">map</span>(<span class="built_in">int</span>,sys.stdin.readline().split())</span><br><span class="line"> persons[p1].append(p2)</span><br><span class="line"> persons[p2].append(p1)</span><br><span class="line"> persons[p1].sort()</span><br><span class="line"> persons[p2].sort()</span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">bfs</span>(<span class="params">person</span>):</span><br><span class="line"> q = deque([person])</span><br><span class="line"> check,count=[],[<span class="number">0</span>]*(n+<span class="number">1</span>)</span><br><span class="line"> <span class="keyword">while</span> q:</span><br><span class="line"> x=q.popleft()</span><br><span class="line"> <span class="keyword">for</span> i <span class="keyword">in</span> persons[x]:</span><br><span class="line"> <span class="keyword">if</span> i <span class="keyword">not</span> <span class="keyword">in</span> check:</span><br><span class="line"> count[i]=count[x]+<span class="number">1</span></span><br><span class="line"> check.append(i)</span><br><span class="line"> q.append(i)</span><br><span class="line"> kebin[person]=<span class="built_in">sum</span>(count)</span><br><span class="line"><span class="keyword">for</span> i <span class="keyword">in</span> <span class="built_in">range</span>(<span class="number">1</span>,n+<span class="number">1</span>):</span><br><span class="line"> bfs(i)</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="built_in">print</span>(kebin.index(<span class="built_in">min</span>(kebin[<span class="number">1</span>:])))</span><br></pre></td></tr></table></figure><ul><li>노드(친구)를 거칠 때마다 해당 노드의 count를 세서 저장하고, 리스트 kebin에 합을 저장한다.</li></ul>]]></content>
<categories>
<category> algorithm </category>
</categories>
<tags>
<tag> 블로그 </tag>
</tags>
</entry>
<entry>
<title>백준 1463 1로 만들기</title>
<link href="/2022/03/10/algorithm-boj1463/"/>
<url>/2022/03/10/algorithm-boj1463/</url>
<content type="html"><![CDATA[<!-- 튜토리얼, 하우 투 가이드, 설명 ,레퍼런스 https://documentation.divio.com/tutorials/--><h1 id="백준-1463-1로-만들기"><a href="#백준-1463-1로-만들기" class="headerlink" title="백준 1463 1로 만들기"></a>백준 1463 1로 만들기</h1><h2 id="문제"><a href="#문제" class="headerlink" title="문제"></a>문제</h2><p>정수 X에 사용할 수 있는 연산은 다음과 같이 세 가지 이다.</p><p>X가 3으로 나누어 떨어지면, 3으로 나눈다.<br>X가 2로 나누어 떨어지면, 2로 나눈다.<br>1을 뺀다.<br>정수 N이 주어졌을 때, 위와 같은 연산 세 개를 적절히 사용해서 1을 만들려고 한다. 연산을 사용하는 횟수의 최솟값을 출력하시오.</p><h2 id="풀이"><a href="#풀이" class="headerlink" title="풀이"></a>풀이</h2><ul><li><p>그리디 알고리즘 문제가 아니다<br> 10의 경우 10 - 9 - 3 - 1 로 3번 만에 만든다<br> 그리디 알고리즘 문제라면 10 - 5 - 4 - 2 - 1 로 4번 시도해야한다<br> 그리디 알고리즘으로 풀 경우의 해가 유효성이 검증되지 못했다.</p></li><li><p>메모제이션 기법을 사용한다<br> 10 - 9 - 3 - 1로 10의 해를 구한다.<br> 이 때 3은 (1을 구하는 횟수 + 1), 9는 (3을 구하는 횟수 + 1)이 성립한다<br> 주어질 숫자의 최소 횟수를 아래서부터 계속 만들어가면, 최솟 값을 구할 수 있다.</p></li></ul><h2 id="코드"><a href="#코드" class="headerlink" title="코드"></a>코드</h2><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> sys</span><br><span class="line"></span><br><span class="line">num = <span class="built_in">int</span>(sys.stdin.readline())</span><br><span class="line">dp = [<span class="number">0</span>]*(num+<span class="number">1</span>)</span><br><span class="line"></span><br><span class="line"><span class="keyword">for</span> i <span class="keyword">in</span> <span class="built_in">range</span>(<span class="number">2</span>,num+<span class="number">1</span>):</span><br><span class="line"> dp[i]=dp[i-<span class="number">1</span>]+<span class="number">1</span></span><br><span class="line"></span><br><span class="line"> <span class="keyword">if</span> i%<span class="number">2</span> ==<span class="number">0</span>:</span><br><span class="line"> dp[i] = <span class="built_in">min</span>(dp[i],dp[i//<span class="number">2</span>]+<span class="number">1</span>)</span><br><span class="line"> <span class="keyword">if</span> i%<span class="number">3</span> ==<span class="number">0</span>:</span><br><span class="line"> dp[i] = <span class="built_in">min</span>(dp[i],dp[i//<span class="number">3</span>]+<span class="number">1</span>)</span><br><span class="line"><span class="built_in">print</span>(dp[num])</span><br></pre></td></tr></table></figure>]]></content>
<categories>
<category> algorithm </category>
</categories>
<tags>
<tag> 블로그 </tag>
</tags>
</entry>
<entry>
<title>백준 1541 잃어버린 괄호</title>
<link href="/2022/03/10/algorithm-boj1541/"/>
<url>/2022/03/10/algorithm-boj1541/</url>
<content type="html"><![CDATA[<!-- 튜토리얼, 하우 투 가이드, 설명 ,레퍼런스 https://documentation.divio.com/tutorials/--><h1 id="백준-1541-잃어버린-괄호"><a href="#백준-1541-잃어버린-괄호" class="headerlink" title="백준 1541 잃어버린 괄호"></a>백준 1541 잃어버린 괄호</h1><h2 id="문제"><a href="#문제" class="headerlink" title="문제"></a>문제</h2><p>세준이는 양수와 +, -, 그리고 괄호를 가지고 식을 만들었다. 그리고 나서 세준이는 괄호를 모두 지웠다.</p><p>그리고 나서 세준이는 괄호를 적절히 쳐서 이 식의 값을 최소로 만들려고 한다.</p><p>괄호를 적절히 쳐서 이 식의 값을 최소로 만드는 프로그램을 작성하시오.</p><h2 id="풀이"><a href="#풀이" class="headerlink" title="풀이"></a>풀이</h2><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> sys</span><br><span class="line"><span class="keyword">from</span> collections <span class="keyword">import</span> deque</span><br><span class="line"></span><br><span class="line">sen =sys.stdin.readline().rstrip()</span><br><span class="line">sentence = deque([i <span class="keyword">for</span> i <span class="keyword">in</span> sen])</span><br><span class="line">numbers,op=[],[]</span><br><span class="line"></span><br><span class="line">temp=<span class="string">''</span></span><br><span class="line"><span class="keyword">while</span> sentence:</span><br><span class="line"> x = sentence.popleft()</span><br><span class="line"> <span class="keyword">if</span> <span class="number">48</span><=<span class="built_in">ord</span>(x)<=<span class="number">57</span>:</span><br><span class="line"> temp+=x</span><br><span class="line"> <span class="keyword">else</span>:</span><br><span class="line"> numbers.append(<span class="built_in">int</span>(temp))</span><br><span class="line"> temp=<span class="string">''</span></span><br><span class="line"> op.append(x)</span><br><span class="line">numbers.append(<span class="built_in">int</span>(temp))</span><br><span class="line"></span><br><span class="line">op=deque(op)</span><br><span class="line">flag=<span class="literal">True</span></span><br><span class="line">res,idx=<span class="number">0</span>,<span class="number">9999</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">for</span> i <span class="keyword">in</span> <span class="built_in">range</span>(<span class="built_in">len</span>(op)):</span><br><span class="line"> <span class="keyword">if</span> op[i]==<span class="string">'-'</span>:</span><br><span class="line"> idx=i</span><br><span class="line"> <span class="keyword">break</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> idx==<span class="number">9999</span>:</span><br><span class="line"> <span class="built_in">print</span>(<span class="built_in">sum</span>(numbers))</span><br><span class="line"><span class="keyword">else</span>:</span><br><span class="line"> <span class="built_in">print</span>(<span class="built_in">sum</span>(numbers[<span class="number">0</span>:idx+<span class="number">1</span>])-<span class="built_in">sum</span>(numbers[idx+<span class="number">1</span>:<span class="built_in">len</span>(numbers)]))</span><br></pre></td></tr></table></figure><ul><li>문제를 똑바로 읽을 것</li><li>생각을 좀 더 깊이 할 것</li></ul><p>괄호를 쳐서 이 식의 값을 최소로 만들려면, -가 등장한 후 모든 값이 음수가 되면 된다.</p>]]></content>
<categories>
<category> algorithm </category>
</categories>
<tags>
<tag> 블로그 </tag>
</tags>
</entry>
<entry>
<title>백준 15654 N과 M (5)</title>
<link href="/2022/03/10/algorithm-boj15654/"/>
<url>/2022/03/10/algorithm-boj15654/</url>
<content type="html"><![CDATA[<!-- 튜토리얼, 하우 투 가이드, 설명 ,레퍼런스 https://documentation.divio.com/tutorials/--><h1 id="백준-15654-N과-M-5"><a href="#백준-15654-N과-M-5" class="headerlink" title="백준 15654 N과 M (5)"></a>백준 15654 N과 M (5)</h1><h2 id="문제"><a href="#문제" class="headerlink" title="문제"></a>문제</h2><p>N개의 자연수와 자연수 M이 주어졌을 때, 아래 조건을 만족하는 길이가 M인 수열을 모두 구하는 프로그램을 작성하시오. N개의 자연수는 모두 다른 수이다.</p><p>N개의 자연수 중에서 M개를 고른 수열</p><h2 id="풀이"><a href="#풀이" class="headerlink" title="풀이"></a>풀이</h2><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> sys</span><br><span class="line"><span class="keyword">from</span> itertools <span class="keyword">import</span> permutations</span><br><span class="line">N,M=<span class="built_in">map</span>(<span class="built_in">int</span>,sys.stdin.readline().split())</span><br><span class="line">numbers = <span class="built_in">list</span>(<span class="built_in">map</span>(<span class="built_in">int</span>,sys.stdin.readline().split()))</span><br><span class="line">numbers.sort()</span><br><span class="line"></span><br><span class="line"><span class="keyword">for</span> n <span class="keyword">in</span> permutations(numbers, M):</span><br><span class="line"> <span class="built_in">print</span>(*n)</span><br></pre></td></tr></table></figure>]]></content>
<categories>
<category> algorithm </category>
</categories>
<tags>
<tag> 블로그 </tag>
</tags>
</entry>
<entry>
<title>백준 1697 숨바꼭질</title>
<link href="/2022/03/10/algorithm-boj1697/"/>
<url>/2022/03/10/algorithm-boj1697/</url>
<content type="html"><![CDATA[<!-- 튜토리얼, 하우 투 가이드, 설명 ,레퍼런스 https://documentation.divio.com/tutorials/--><h1 id="백준-1697-숨바꼭질"><a href="#백준-1697-숨바꼭질" class="headerlink" title="백준 1697 숨바꼭질"></a>백준 1697 숨바꼭질</h1><h2 id="문제"><a href="#문제" class="headerlink" title="문제"></a>문제</h2><p>수빈이는 동생과 숨바꼭질을 하고 있다. 수빈이는 현재 점 N(0 ≤ N ≤ 100,000)에 있고, 동생은 점 K(0 ≤ K ≤ 100,000)에 있다. 수빈이는 걷거나 순간이동을 할 수 있다. 만약, 수빈이의 위치가 X일 때 걷는다면 1초 후에 X-1 또는 X+1로 이동하게 된다. 순간이동을 하는 경우에는 1초 후에 2*X의 위치로 이동하게 된다.</p><p>수빈이와 동생의 위치가 주어졌을 때, 수빈이가 동생을 찾을 수 있는 가장 빠른 시간이 몇 초 후인지 구하는 프로그램을 작성하시오.</p><p>첫 번째 줄에 수빈이가 있는 위치 N과 동생이 있는 위치 K가 주어진다. N과 K는 정수이다.</p><h2 id="풀이"><a href="#풀이" class="headerlink" title="풀이"></a>풀이</h2><p>bfs 개념을 직접 문제에 적용해본 적이 없어서, 그걸로 어떻게 문제를 푼다는거지? 했었다.</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> sys</span><br><span class="line"><span class="keyword">from</span> collections <span class="keyword">import</span> deque</span><br><span class="line"></span><br><span class="line">n,k = <span class="built_in">map</span>(<span class="built_in">int</span>,sys.stdin.readline().split())</span><br><span class="line">MAX=<span class="number">100000</span></span><br><span class="line">clock = [<span class="number">0</span> <span class="keyword">for</span> i <span class="keyword">in</span> <span class="built_in">range</span>(MAX+<span class="number">1</span>)]</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">bfs</span>(<span class="params">n</span>):</span><br><span class="line"> q= deque([n])</span><br><span class="line"> <span class="keyword">while</span> q:</span><br><span class="line"> x=q.popleft()</span><br><span class="line"> <span class="keyword">if</span> x==k:</span><br><span class="line"> <span class="keyword">return</span> clock[x]</span><br><span class="line"> <span class="keyword">for</span> i <span class="keyword">in</span> (x-<span class="number">1</span>,x+<span class="number">1</span>,x*<span class="number">2</span>):</span><br><span class="line"> <span class="keyword">if</span> <span class="number">0</span><=i <=MAX <span class="keyword">and</span> <span class="keyword">not</span> clock[i]:</span><br><span class="line"> clock[i]=clock[x]+<span class="number">1</span></span><br><span class="line"> q.append(i)</span><br><span class="line"><span class="built_in">print</span>(bfs(n))</span><br></pre></td></tr></table></figure><p>수빈이의 처음 위치를 x라 하자. 수빈이는 x-1, x<em>2, x+1로 이동할 수 있다.<br>수빈이는 각각의 값에 대해 다시 또 x-1, x</em>2, x+1로 이동할 수 있다.</p><p>큐에 수빈이의 처음 위치를 넣은 후 반복문이 1회 돌 때마다 카운트한다.(시간 초를 세기 위해서이다)<br>차례차례 다음 회차의 노드들을 큐에 넣은 후 하나하나 동생의 위치와 비교한다</p>]]></content>
<categories>
<category> algorithm </category>
</categories>
<tags>
<tag> 블로그 </tag>
</tags>
</entry>
<entry>
<title>백준 1699 제곱수의 합</title>
<link href="/2022/03/10/algorithm-boj1699/"/>
<url>/2022/03/10/algorithm-boj1699/</url>
<content type="html"><![CDATA[<!-- 튜토리얼, 하우 투 가이드, 설명 ,레퍼런스 https://documentation.divio.com/tutorials/--><h1 id="백준-1699-제곱수의-합"><a href="#백준-1699-제곱수의-합" class="headerlink" title="백준 1699 제곱수의 합"></a>백준 1699 제곱수의 합</h1><h2 id="문제"><a href="#문제" class="headerlink" title="문제"></a>문제</h2><p>어떤 자연수 N은 그보다 작거나 같은 제곱수들의 합으로 나타낼 수 있다. 예를 들어 11=32+12+12(3개 항)이다. 이런 표현방법은 여러 가지가 될 수 있는데, 11의 경우 11=2^2+2^2+1^2+1^2+1^2(5개 항)도 가능하다. 이 경우, 수학자 소크라테스는 “11은 3개 항의 제곱수 합으로 표현할 수 있다.”라고 말한다. 또한 11은 그보다 적은 항의 제곱수 합으로 표현할 수 없으므로, 11을 그 합으로써 표현할 수 있는 제곱수 항의 최소 개수는 3이다.</p><p>주어진 자연수 N을 이렇게 제곱수들의 합으로 표현할 때에 그 항의 최소개수를 구하는 프로그램을 작성하시오</p><h2 id="풀이"><a href="#풀이" class="headerlink" title="풀이"></a>풀이</h2><p>처음 문제를 접근할 땐 주어진 숫자보다 작은 가장 큰 제곱 수부터 차례대로 구하면서 풀었다.<br>하지만 가장 큰 제곱 수부터 차례대로 구하는 방식이 항의 갯수를 최소한으로 한단 보장을 하지 못한다.<br>즉 DP 문제이다.</p><h3 id="핵심"><a href="#핵심" class="headerlink" title="핵심"></a>핵심</h3><p>아래는 1부터 7까지의 최소 제곱 항의 수이다.</p><p>|1|2|3|4|5|6|7|<br>|—|—|—|——|—|—|—|—|—|<br>|1|2|3|1|2|3|4|4|</p><p>1~3까지는 1의 합으로 최소 항을 구할 수 있다.<br>2는 1+1이다. 이는 dp[1]+1이다.<br>3은 1+1+1이다. 이는 dp[2]+1<br>4는 1+1+1+1, 2^2로 나타낼 수 있다. 이는 dp[0]+1 또는 dp[3]+1이다.</p><p>즉 dp[i]는 dp[i-n^2]+1 들의 최솟 값이다. (n은 주어진 숫자의 1/2 제곱 수)</p><h2 id="코드"><a href="#코드" class="headerlink" title="코드"></a>코드</h2><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> sys</span><br><span class="line"></span><br><span class="line">num = <span class="built_in">int</span>(sys.stdin.readline())</span><br><span class="line">dp = [i <span class="keyword">for</span> i <span class="keyword">in</span> <span class="built_in">range</span>(num+<span class="number">1</span>)]</span><br><span class="line"></span><br><span class="line"><span class="keyword">for</span> i <span class="keyword">in</span> <span class="built_in">range</span>(<span class="number">4</span>,num+<span class="number">1</span>):</span><br><span class="line"> <span class="built_in">pow</span> = <span class="built_in">int</span>(i**<span class="number">0.5</span>)</span><br><span class="line"> <span class="keyword">for</span> j <span class="keyword">in</span> <span class="built_in">range</span>(<span class="number">1</span>,<span class="built_in">pow</span>+<span class="number">1</span>):</span><br><span class="line"> dp[i]=<span class="built_in">min</span>(dp[i],dp[i-j*j]+<span class="number">1</span>)</span><br><span class="line"></span><br><span class="line"><span class="built_in">print</span>(dp[num])</span><br></pre></td></tr></table></figure>]]></content>
<categories>
<category> algorithm </category>
</categories>
<tags>
<tag> 블로그 </tag>
</tags>
</entry>
<entry>
<title>백준 17219 비밀번호 찾기</title>
<link href="/2022/03/10/algorithm-boj17219/"/>
<url>/2022/03/10/algorithm-boj17219/</url>
<content type="html"><![CDATA[<!-- 튜토리얼, 하우 투 가이드, 설명 ,레퍼런스 https://documentation.divio.com/tutorials/--><h2 id="문제"><a href="#문제" class="headerlink" title="문제"></a>문제</h2><p>첫째 줄에 저장된 사이트 주소의 수 N(1 ≤ N ≤ 100,000)과 비밀번호를 찾으려는 사이트 주소의 수 M(1 ≤ M ≤ 100,000)이 주어진다.</p><p>두번째 줄부터 N개의 줄에 걸쳐 각 줄에 사이트 주소와 비밀번호가 공백으로 구분되어 주어진다. 사이트 주소는 알파벳 소문자, 알파벳 대문자, 대시(‘-‘), 마침표(‘.’)로 이루어져 있고, 중복되지 않는다. 비밀번호는 알파벳 대문자로만 이루어져 있다. 모두 길이는 최대 20자이다.</p><p>N+2번째 줄부터 M개의 줄에 걸쳐 비밀번호를 찾으려는 사이트 주소가 한줄에 하나씩 입력된다. 이때, 반드시 이미 저장된 사이트 주소가 입력된다.</p><h3 id="출력"><a href="#출력" class="headerlink" title="출력"></a>출력</h3><p>첫 번째 줄부터 M개의 줄에 걸쳐 비밀번호를 찾으려는 사이트 주소의 비밀번호를 차례대로 각 줄에 하나씩 출력한다.</p><h2 id="풀이"><a href="#풀이" class="headerlink" title="풀이"></a>풀이</h2><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> sys</span><br><span class="line"></span><br><span class="line">n,m = <span class="built_in">map</span>(<span class="built_in">int</span>,sys.stdin.readline().split())</span><br><span class="line"></span><br><span class="line">dic = {}</span><br><span class="line"></span><br><span class="line"><span class="keyword">for</span> i <span class="keyword">in</span> <span class="built_in">range</span>(n):</span><br><span class="line"> web,key = <span class="built_in">map</span>(<span class="built_in">str</span>,sys.stdin.readline().rstrip().split())</span><br><span class="line"> dic[web] = key</span><br><span class="line"><span class="keyword">for</span> j <span class="keyword">in</span> <span class="built_in">range</span>(m):</span><br><span class="line"> w = sys.stdin.readline().rstrip()</span><br><span class="line"> <span class="built_in">print</span>(dic[w])</span><br></pre></td></tr></table></figure><p>딕셔너리를 사용하면 간단하게 풀 수 있는 문제이다</p>]]></content>
<categories>
<category> algorithm </category>
</categories>
<tags>
<tag> 블로그 </tag>
</tags>
</entry>
<entry>
<title>백준 17299 오등큰수</title>
<link href="/2022/03/10/algorithm-boj17299/"/>
<url>/2022/03/10/algorithm-boj17299/</url>
<content type="html"><![CDATA[<!-- 튜토리얼, 하우 투 가이드, 설명 ,레퍼런스 https://documentation.divio.com/tutorials/--><h1 id="백준-17299-오등큰수"><a href="#백준-17299-오등큰수" class="headerlink" title="백준 17299 오등큰수"></a>백준 17299 오등큰수</h1><h2 id="문제"><a href="#문제" class="headerlink" title="문제"></a>문제</h2><p>크기가 N인 수열 A = A1, A2, …, AN이 있다. 수열의 각 원소 Ai에 대해서 오등큰수 NGF(i)를 구하려고 한다.</p><p>Ai가 수열 A에서 등장한 횟수를 F(Ai)라고 했을 때, Ai의 오등큰수는 오른쪽에 있으면서 수열 A에서 등장한 횟수가 F(Ai)보다 큰 수 중에서 가장 왼쪽에 있는 수를 의미한다. 그러한 수가 없는 경우에 오등큰수는 -1이다.</p><p>예를 들어, A = [1, 1, 2, 3, 4, 2, 1]인 경우 F(1) = 3, F(2) = 2, F(3) = 1, F(4) = 1이다. A1의 오른쪽에 있으면서 등장한 횟수가 3보다 큰 수는 없기 때문에, NGF(1) = -1이다. A3의 경우에는 A7이 오른쪽에 있으면서 F(A3=2) < F(A7=1) 이기 때문에, NGF(3) = 1이다. NGF(4) = 2, NGF(5) = 2, NGF(6) = 1 이다.</p><p><strong>오등큰수</strong> 란 한 인덱스의 오른 편에 있는 자기보다 등장한 횟수가 큰 수 중 가장 왼쪽에 있는 수이다.</p><h2 id="풀이"><a href="#풀이" class="headerlink" title="풀이"></a>풀이</h2><p>미리 result를 -1로 선언해두고, 딕셔너리에 빈도수를 저장한다.</p><p>주어진 값이 저장된 list인 arr의 값이 스택에 마지막 값의 빈도수를 비교한다.</p><p>스택의 마지막 값의 빈도수가 arr의 값의 빈도수 보다 작다면 arr의 값은 스택에 저장된 값의 오큰수이다.</p><h3 id="핵심-아이디어"><a href="#핵심-아이디어" class="headerlink" title="핵심 아이디어"></a>핵심 아이디어</h3><ul><li>스택에 인덱스를 저장한다</li></ul><h2 id="CODE"><a href="#CODE" class="headerlink" title="CODE"></a>CODE</h2><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> sys</span><br><span class="line"></span><br><span class="line">result = [-<span class="number">1</span> <span class="keyword">for</span> i <span class="keyword">in</span> <span class="built_in">range</span>(<span class="built_in">int</span>(sys.stdin.readline()))]</span><br><span class="line">arr = <span class="built_in">list</span>(<span class="built_in">map</span>(<span class="built_in">int</span>, sys.stdin.readline().split()))</span><br><span class="line">dic={}</span><br><span class="line">stack = []</span><br><span class="line"><span class="keyword">for</span> i <span class="keyword">in</span> arr:</span><br><span class="line"> <span class="keyword">if</span> i <span class="keyword">in</span> dic:</span><br><span class="line"> dic[i]+=<span class="number">1</span></span><br><span class="line"> <span class="keyword">else</span>:</span><br><span class="line"> dic[i]=<span class="number">1</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">for</span> s <span class="keyword">in</span> <span class="built_in">enumerate</span>(arr):</span><br><span class="line"> <span class="keyword">while</span> stack <span class="keyword">and</span> dic[arr[stack[-<span class="number">1</span>]]]<dic[s[<span class="number">1</span>]]:</span><br><span class="line"> result[stack.pop()]=s[<span class="number">1</span>]</span><br><span class="line"> stack.append(s[<span class="number">0</span>])</span><br><span class="line"></span><br><span class="line"><span class="built_in">print</span>(*result)</span><br></pre></td></tr></table></figure>]]></content>
<categories>
<category> algorithm </category>
</categories>
<tags>
<tag> 블로그 </tag>