<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>xx.log</title>
        <link>https://velog.io/</link>
        <description>End up being.</description>
        <lastBuildDate>Wed, 30 Jun 2021 05:41:05 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>xx.log</title>
            <url>https://images.velog.io/images/xxwb__/profile/9d035a31-9f7a-4773-9b4a-6d0dc1c53f9e/KakaoTalk_20210406_095323626.jpg</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. xx.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/xxwb__" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[안드로이드 앱개발 #WIL5]]></title>
            <link>https://velog.io/@xxwb__/%EC%95%88%EB%93%9C%EB%A1%9C%EC%9D%B4%EB%93%9C-%EC%95%B1%EA%B0%9C%EB%B0%9C-WIL5</link>
            <guid>https://velog.io/@xxwb__/%EC%95%88%EB%93%9C%EB%A1%9C%EC%9D%B4%EB%93%9C-%EC%95%B1%EA%B0%9C%EB%B0%9C-WIL5</guid>
            <pubDate>Wed, 30 Jun 2021 05:41:05 GMT</pubDate>
            <description><![CDATA[<h3 id="✅-파이어베이스-애널리틱스">✅ 파이어베이스 애널리틱스</h3>
<h4 id="유저-행동-데이터-수집">유저 행동 데이터 수집</h4>
<ul>
<li>사용자들이 앱을 언제, 어떻게 사용하고 있는지 파악 가능</li>
<li>기본적인 데이터들이 자동으로 데이터 수집되어 콘솔을 활용해 데이터 분석, 조회 가능</li>
</ul>
<br>

<h4 id="이벤트-기록">이벤트 기록</h4>
<ul>
<li>이벤트들을 자동으로 로깅<pre><code class="language-kotlin"></code></pre>
</li>
</ul>
<p>FirebaseAnalytics.getInstance(this).logEvent(&quot;click_submit&quot;) {
  param(&quot;answer1&quot;, answer1.toLong())
  param(&quot;answer2&quot;, answer2.toLong())
}</p>
<pre><code>
#### 사용자 속성 기록
- 속성 자동으로 로깅
```kotlin
FirebaseAnalytics.getInstance(this).setUserProperty(&quot;user_test_type&quot;, &quot;SE&quot;)
</code></pre><br>

<h3 id="✅-애드몹admob">✅ 애드몹(AdMob)</h3>
<h4 id="앱에-광고-붙이기">앱에 광고 붙이기</h4>
<ul>
<li><p>프로젝트에 모바일 광고 SDK(Mobile Ads SDK) 추가</p>
</li>
<li><p>레이아웃에 AdView를 사용하여 광고 추가 
<code>배너 광고 테스트용 AdUnitId</code></p>
</li>
</ul>
<pre><code class="language-xml">&lt;com.google.android.gms.ads.AdView
  xml:ads=&quot;https://schemas.android.com/apk/res-auto&quot;
  ads:adSize=&quot;SMART_BANNER&quot;
  ads:adUnitId=&quot;ca-app-pub-8940256099942544/6300978111&quot;  /&gt; </code></pre>
<ul>
<li>메인화면 배너 로드<pre><code class="language-kotlin">var mainAdView: AdView = findViewById(R.id.adView)
var adRequest = AdRequest.Builder().build()
mainAdView.loadAd(adRequest)</code></pre>
</li>
</ul>
<br>


<h3 id="✅-apk-aab">✅ APK, AAB</h3>
<ul>
<li>apk는 exe, dmg 같은 설치파일</li>
<li>ABB(Android App Bundle)는 앱의 모든 컴파일된 코드와 리소스를 포함하고 APK생성 및 서명을 구글 플레이에 맡기는 방식</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[안드로이드 앱개발 #WIL4]]></title>
            <link>https://velog.io/@xxwb__/%EC%95%88%EB%93%9C%EB%A1%9C%EC%9D%B4%EB%93%9C-%EC%95%B1%EA%B0%9C%EB%B0%9C-WIL4</link>
            <guid>https://velog.io/@xxwb__/%EC%95%88%EB%93%9C%EB%A1%9C%EC%9D%B4%EB%93%9C-%EC%95%B1%EA%B0%9C%EB%B0%9C-WIL4</guid>
            <pubDate>Thu, 24 Jun 2021 11:39:19 GMT</pubDate>
            <description><![CDATA[<h3 id="✅-toast-메시지">✅ Toast 메시지</h3>
<pre><code class="language-kotlin">Toast.makeText(view.context, &quot;text&quot;, Toast.LENGTH_LONG).show()</code></pre>
<ul>
<li><p>view.context 
:: 뷰의 맥락. 즉, 앱이 어떤 상태에 있는지 토스트에게 알려주기 위해 전달하는 값</p>
</li>
<li><p>&quot;text&quot;
:: 토스트에 표시하려는 컨텐츠를 전달하는 값</p>
</li>
<li><p>Toast.LENGTH_LONG
:: 토스트가 노출되는 시간 설정. (+ LENGHT_SHORT)</p>
</li>
</ul>
<br>

<h3 id="✅-intent">✅ Intent</h3>
<h4 id="개별-앱-컴포넌트-간에-런타임-바인딩을-제공하는-객체">개별 앱 컴포넌트 간에 런타임 바인딩을 제공하는 객체</h4>
<ul>
<li>어떤 작업을 하겠다는 &#39;의도&#39;를 표현하는 용도</li>
</ul>
<pre><code class="language-kotlin">var intent = Intent(this, SubActivity::class.java)
intent.putExtra(&quot;name&quot;, &quot;Bob&quot;)
startActivity(intent)
</code></pre>
<pre><code class="language-kotlin">-----------------------------------------------------
SubActivity.java

var name = intent.getStringExtra(&quot;name&quot;)</code></pre>
<ul>
<li><p>Intent(this, SubActivity::class.java))
:: 첫번째 값은 출발지 액티비티, 두번째 값은 도착지 액티비티</p>
</li>
<li><p>SubActivity는 액티비티 객체를 ::class.java는 참조를 위한 class 값</p>
</li>
<li><p>putExtra(key, value)
:: 정보를 담아서 전달. key는 다른 화면에서 데이터 확인할 때 쓰는 값이고 value는 전달하려는 값</p>
</li>
<li><p>getStringExtra(key
:: key에 담긴 정보를 가져옴. 티입에 맞춰 getIntExtra, getBooleanExtra 등 사용</p>
<blockquote>
<p>this를 더 명확히 명시하기 위해
<code>this@MainActivity</code> 같은 방식으로 사용</p>
</blockquote>
<blockquote>
<p><strong>this</strong> and <strong>view.context</strong>
this :: activity의 컨텍스트를 사용하겠다.
view.context :: view에 담겨있는 컨텍스트를 사용하겠다.</p>
</blockquote>
</li>
</ul>
<br>

<blockquote>
<pre><code class="language-kotlin">fun click(view: View) {
  var button = view as Button
}</code></pre>
</blockquote>
<pre><code>```xml
&lt;Button
    android:onclick=&quot;click&quot; /&gt;</code></pre><p>-&gt; click 함수의 view는 Button 정보가 담겨있다.</p>
<blockquote>
<blockquote>
<p><code>as</code>는 코틀린의 타입 캐스팅</p>
</blockquote>
</blockquote>
<br>

<h3 id="✅-webview">✅ WebView</h3>
<h4 id="앱에서-웹페이지를-보여주는-웹뷰webview">앱에서 웹페이지를 보여주는 웹뷰(WebView)</h4>
<pre><code class="language-xml">&lt;WebView
    android:id=&quot;@+id/webview&quot; /&gt;</code></pre>
<pre><code class="language-kotlin">var myWebView: WebView = findViewById(R.id.webview)
myWebView.webViewClient = WebViewClient()
myWebView.loadUrl(&quot;https://www.abc.com/&quot;)</code></pre>
<ul>
<li>웹뷰를 표시하기 위해서는 인터넷 사용 권한을 추가해야 한다.<pre><code class="language-xml">AndroidManifest.xml
</code></pre>
</li>
</ul>
<p>앱에 인터넷 권한 요청 추가하기</p>
<uses-permission android:name="android.permission.INTERNET" />


<p>앱에 일반 텍스트 네트워크 트래픽 설정하기</p>
<p>&lt;application
  ...
  android:usesCleartextTraffic=&quot;true&quot;
  ...</p>
<blockquote>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[안드로이드 앱개발 #WIL3]]></title>
            <link>https://velog.io/@xxwb__/%EC%95%88%EB%93%9C%EB%A1%9C%EC%9D%B4%EB%93%9C-%EC%95%B1%EA%B0%9C%EB%B0%9C-WIL3</link>
            <guid>https://velog.io/@xxwb__/%EC%95%88%EB%93%9C%EB%A1%9C%EC%9D%B4%EB%93%9C-%EC%95%B1%EA%B0%9C%EB%B0%9C-WIL3</guid>
            <pubDate>Mon, 21 Jun 2021 05:15:15 GMT</pubDate>
            <description><![CDATA[<h3 id="✅-kotlin">✅ Kotlin</h3>
<blockquote>
<p>장점</p>
</blockquote>
<ol>
<li>간결해서 생산성이 높아진다.</li>
<li>Java 대비 &#39;버그&#39;가 발생될 가능성이 낮다.</li>
<li>코틀린은 Java와 호환 가능. (안드로이드 프로젝트에서 두개의 언어를 혼용해서 사용 가능함)</li>
</ol>
<h4 id="1-변수variable--기본연산">1. 변수(Variable) &amp; 기본연산</h4>
<ul>
<li><code>var</code>로 변수 선언</li>
<li>변수는 처음 값의 타입을 기억하고, 앞으로 같은 타입만 넣을 수 있다.</li>
<li>변수명은 코틀린에서 주로 camelCase 많이 사용</li>
</ul>
<pre><code class="language-kotlin">var temp1 = 20
var temp2 = &quot;Bob&quot;

tmep1 = &quot;Bob&quot;   // error 발생</code></pre>
<pre><code class="language-kotlin">var a = 1
var b = 2

println(a + b)  // 3

var first = &quot;Bob&quot;
var last = &quot;Lee&quot;

println(first + last)  // &#39;BobLee&#39;

println(first + a)  // Bob1  문자 + 숫자를 하면, 숫자를 문자로 바꾼 뒤 수
</code></pre>
<br>

<h4 id="2-컬렉션---리스트list-맵map">2. 컬렉션 - 리스트(List), 맵(Map)</h4>
<ul>
<li>리스트<ul>
<li>같은 타입만 들어감<pre><code class="language-kotlin">var numList = listOf(1, 2, 3)  // 리스트 선언
</code></pre>
</li>
</ul>
</li>
</ul>
<p>println(numList[0])  // 1 </p>
<p>// 리스트의 길이 구하기
numList.size  // 3</p>
<pre><code>
- 맵
    - 키(key)-값(value) 의 묶음
```kotlin
var myMap = mapOf(&quot;firstName&quot; to &quot;Bob&quot;, &quot;LastName&quot; to &quot;Lee&quot;)  // 맵 선언

println(myMap[&quot;FirstName&quot;])  // Bob

// 맵에 있는 key의 수
myMap.size
// 맵에 있는 key값 가져오기 
myMap.keys
// 맵에 있는 value값 가져오기
myMap.values</code></pre><ul>
<li>수정가능한 리스트와 맵<blockquote>
<p>listOf()와 mapOf()을 생성하면 읽기전용 모드로 생성되어 수정 불가능.
<code>mutableListOf()와 mutableMapOf()</code> 사용!</p>
</blockquote>
</li>
</ul>
<pre><code class="language-kotlin">var alphabetList = mutableListOf(&quot;a&quot;, &quot;b&quot;, &quot;c&quot;)

// 새로운 값을 마지막에 추가
alphabetList.add(&quot;d&quot;)

// n번째에 값을 추가
alphabetList.add(2, &quot;d&quot;)

// 값을 변경
alphabetList[0] = &quot;A&quot;
// 또는
alphabetList.set(1, &quot;B&quot;)

// 해당 하는 값이 있으면 가장 먼저 나오는 값을 제거
alphabetList.remove(&quot;d&quot;)

// n번째 값을 제거
alphabetList.removeAt(3)</code></pre>
<pre><code class="language-kotlin">var myMap = mutableMapOf(&quot;FirstName&quot; to &quot;Bob&quot;, &quot;LastName&quot; to &quot;Lee&quot;)

// 새로운 값을 추가
myMap.put(&quot;language&quot;, &quot;kor&quot;)

// 값을 변경
myMap[&quot;LastName&quot;] = &quot;Park&quot;
// 또는
myMap.put(&quot;language&quot;, &quot;kotlin&quot;)

//값을 제거
myMap.remove(&quot;FirstName&quot;)</code></pre>
<ul>
<li>리스트와 맵의 조화<pre><code class="language-kotlin">var students = mutableListOf(
mapOf(&quot;name&quot; to &quot;bob&quot;, &quot;age&quot; to 20),
mapOf(&quot;name&quot; to &quot;carry&quot;, &quot;age&quot; to 28)
)
</code></pre>
</li>
</ul>
<p>println(students[0][&quot;name&quot;])  // bob</p>
<p>println(students)  // [{name=bob, age=20}, {name=carry, age=28}]</p>
<pre><code>
&lt;br&gt;

#### 3. 함수
```kotlin
// 만들기
fun 함수이름(필요한 변수들) {
  내릴 명령어들을 순차적으로 작성
}

// 사용하기
함수이름(필요한 변수들)

// 동작을 실행하고 결과를 돌려주는(return) 경우
fun 함수이름(필요한 변수들): return타입 {
  내릴 명령어들을 순차적으로 작성
  retun 돌려주는 결과 값
}

//사용하기 
var 함수결과저장변수 = 함수이름(필요한 변수들)</code></pre><pre><code class="language-kotlin">// 자주 쓰이는 타입

// 숫자
var one: Int = 1
var pi: Double = 3.14

// 글자열
var name: String = &quot;Lee&quot;

// 참거짓
var isEasy: Boolean = true
</code></pre>
<br>

<h4 id="4-조건문">4. 조건문</h4>
<pre><code class="language-kotlin">if (조건1) {

} else if (조건2) {

} else {

}</code></pre>
<br>

<h4 id="5-반복문">5. 반복문</h4>
<pre><code class="language-kotlin">for (i in 0..99) {
 print(i)

 // 0..99는 숫자의 범위를 나타내는 방법</code></pre>
<pre><code class="language-kotlin">for (변수 in 리스트) {

}</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[안드로이드 앱개발 #WIL2]]></title>
            <link>https://velog.io/@xxwb__/%EC%95%88%EB%93%9C%EB%A1%9C%EC%9D%B4%EB%93%9C-%EC%95%B1%EA%B0%9C%EB%B0%9C-WIL2</link>
            <guid>https://velog.io/@xxwb__/%EC%95%88%EB%93%9C%EB%A1%9C%EC%9D%B4%EB%93%9C-%EC%95%B1%EA%B0%9C%EB%B0%9C-WIL2</guid>
            <pubDate>Thu, 17 Jun 2021 11:14:02 GMT</pubDate>
            <description><![CDATA[<h3 id="✅-xml">✅ XML</h3>
<pre><code class="language-xml">&lt;TextView
    android:layout_width=&quot;wrap_content&quot;
    android:layout_height=&quot;wrap_content&quot;
       android:text=&quot;Hello World!&quot;/&gt;</code></pre>
<ul>
<li>element
  <code>TextView</code></li>
<li>attribute
  <code>android:layout_width, android:layout_height, android:text</code><blockquote>
<p>모든 Attribute를 다 알 수는 없다.. 필요할 때마다 검색해서 사용!!</p>
</blockquote>
</li>
</ul>
<br>

<h3 id="✅-자주-사용하는-레이아웃">✅ 자주 사용하는 레이아웃</h3>
<h4 id="1-constraintlayout">1. ConstraintLayout</h4>
<p>반응형 UI를 만들기 위한 Layout으로 RelativeLayout보다 더 복잡하게 표현할 수 있음</p>
<blockquote>
<p><strong>RelativeLayout</strong>
소속한 뷰들을 상대적인 위치로 표현할 수 있음</p>
</blockquote>
<p><code>app: layout_constraint방향(위젯의 해당 방향에서)_to(대상 위젯의 해당 방향으로)of : 대상id or parent</code></p>
<ul>
<li>app: layout_constraintEnd_toEndOf</li>
<li>app: layout_constraintStart_toStartOf</li>
<li>app: layout_constraintBottom_toBottomOf</li>
<li>app: layout_constraintBottom_toTopOf</li>
<li>app: layout_constraintTop_toBottomOf</li>
<li>app: layout_constraintBottom_tBottomOf  ....</li>
</ul>
<br>


<table>
<thead>
<tr>
<th>방향 이름</th>
<th>방향</th>
</tr>
</thead>
<tbody><tr>
<td>top</td>
<td>위</td>
</tr>
<tr>
<td>bottom</td>
<td>아래</td>
</tr>
<tr>
<td>start(left)</td>
<td>왼쪽</td>
</tr>
<tr>
<td>end(right)</td>
<td>오른쪽</td>
</tr>
</tbody></table>
<br>

<h4 id="2-linearlayout">2. LinearLayout</h4>
<p>가로 또는 세로 한 방향으로 순차적으로 추가</p>
<ul>
<li>android:orientation=&quot;horizontal&quot; or &quot;vertical&quot;</li>
</ul>
<br>

<h4 id="3-scrollview">3. ScrollView</h4>
<p>내용물이 실제 화면의 높이보다 클 때 화면을 스크롤할 수 있도록 하기 위해 사용</p>
<ul>
<li>ScrollView 내부에는 항상 1개의 Layout이 있어야 한다. (주로 LinearLayout, RelativeLayout, ConstraintLayout 중에서 사용)</li>
</ul>
<br>


<h3 id="✅-새로운-화면activity-추가">✅ 새로운 화면(Activity) 추가</h3>
<h4 id="1-안드로이드-작명-규칙">1. 안드로이드 작명 규칙</h4>
<ul>
<li>액티비티 : <code>[이름]Activity</code></li>
<li>레이아웃 : <code>activity_[이름]</code></li>
</ul>
<br>

<h4 id="2-manifestxml-파일에-activity-정보-추가">2. Manifest.xml 파일에 activity 정보 추가</h4>
]]></description>
        </item>
        <item>
            <title><![CDATA[안드로이드 앱개발 #WIL1]]></title>
            <link>https://velog.io/@xxwb__/%EC%95%88%EB%93%9C%EB%A1%9C%EC%9D%B4%EB%93%9C-%EC%95%B1%EA%B0%9C%EB%B0%9C-WIL1</link>
            <guid>https://velog.io/@xxwb__/%EC%95%88%EB%93%9C%EB%A1%9C%EC%9D%B4%EB%93%9C-%EC%95%B1%EA%B0%9C%EB%B0%9C-WIL1</guid>
            <pubDate>Mon, 07 Jun 2021 11:17:31 GMT</pubDate>
            <description><![CDATA[<h3 id="✅-apk">✅ APK</h3>
<p>Android Application Package, 안드로이드 앱의 모든 콘텐츠가 들어 있음</p>
<br>

<h3 id="✅-manifest-file">✅ Manifest file</h3>
<ul>
<li>앱에서 사용하는 화면</li>
<li>앱이 요구하는 권한</li>
<li>앱에 필요한 정보가 기록되어 있음</li>
</ul>
<br>

<h3 id="✅-app-resource-앱-리소스">✅ App Resource (앱 리소스)</h3>
<ul>
<li>layout</li>
<li>drawable</li>
<li>mipmap</li>
<li>values</li>
</ul>
<br>



<h3 id="✅-app-component-앱-컨포넌트">✅ App Component (앱 컨포넌트)</h3>
<ul>
<li>앱에 표시해야 하는 정보, 앱의 동작이 담겨 있음</li>
<li>액티비티는 앱 컴포넌트 중 하나</li>
</ul>
<p><code>Activity(액티비티) = 화면, 페이지</code></p>
<br>

<blockquote>
<p><strong>안드로이드 앱</strong> = manifest file + app resource + app component</p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[[프로그래머스] 내적]]></title>
            <link>https://velog.io/@xxwb__/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-%EB%82%B4%EC%A0%81</link>
            <guid>https://velog.io/@xxwb__/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-%EB%82%B4%EC%A0%81</guid>
            <pubDate>Fri, 28 May 2021 00:43:34 GMT</pubDate>
            <description><![CDATA[<h1 id="🔗-문제-링크">🔗 문제 링크</h1>
<p><a href="https://programmers.co.kr/learn/courses/30/lessons/70128">https://programmers.co.kr/learn/courses/30/lessons/70128</a></p>
<br>

<h1 id="💻-코드">💻 코드</h1>
<pre><code class="language-python">def solution(a, b):
    answer = 0
    for i in range(len(a)):
        answer += a[i] * b[i]
    return answer

# zip 함수 사용 풀이법 
def solution(a, b):
    return sum([x*y for x, y in zip(a, b)])</code></pre>
<br>

<h1 id="📝-정리">📝 정리</h1>
<p><strong>파이썬 zip 함수</strong> </p>
<p>여러 개의 iterable 객체를 인자로 받고, 각 객체가 담고 있는 원소를 튜플 형태로 반환</p>
<pre><code class="language-python">list(zip([1, 2, 3], [4, 5, 6]))

#[(1, 4), (2, 5), (3, 6)]</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[[프로그래머스] 모의고사]]></title>
            <link>https://velog.io/@xxwb__/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-%EB%AA%A8%EC%9D%98%EA%B3%A0%EC%82%AC</link>
            <guid>https://velog.io/@xxwb__/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-%EB%AA%A8%EC%9D%98%EA%B3%A0%EC%82%AC</guid>
            <pubDate>Mon, 17 May 2021 12:08:51 GMT</pubDate>
            <description><![CDATA[<h1 id="🔗-문제-링크">🔗 문제 링크</h1>
<p><a href="https://programmers.co.kr/learn/courses/30/lessons/42840">https://programmers.co.kr/learn/courses/30/lessons/42840</a></p>
<br>

<h1 id="💻-코드">💻 코드</h1>
<pre><code class="language-python">def solution(answers):
    answer = []
    pattern1 = [1, 2, 3, 4, 5]
    pattern2 = [2, 1, 2, 3, 2, 4, 2, 5]
    pattern3 = [3, 3, 1, 1, 2, 2, 4, 4, 5, 5]

    score = [0] * 3

    for i in range(1, len(answers) + 1):
        if answers[i - 1] == pattern1[(i - 1) % len(pattern1)]:
            score[0] += 1
        if answers[i - 1] == pattern2[(i - 1) % len(pattern2)]:
            score[1] += 1
        if answers[i - 1] == pattern3[(i - 1) % len(pattern3)]:
            score[2] += 1

    max_result = max(score)

    for i in range(0, 3):
        if max_result == score[i]:
            answer.append(i + 1)
    # for idx, i in enumerate(score):
    #     if i == max(score):
    #         answer.append(idx + 1)

    return answer</code></pre>
<br>

<h1 id="📝-정리">📝 정리</h1>
<h4 id="파이썬-enumerate">파이썬 enumerate()</h4>
<ul>
<li>인덱스 번호와 컬렉션의 원소를 tuple 형태로 반환<pre><code class="language-python">t = [1, 5, 7, 33, 39, 52]
for p in enumerate(t):
   print(p)
</code></pre>
</li>
</ul>
<p>(0, 1)
(1, 5)
(2, 7)
(3, 33)
(4, 39)
(5, 52)
```</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[백준] 나무 자르기 (2805번) - 이진 탐색]]></title>
            <link>https://velog.io/@xxwb__/%EB%B0%B1%EC%A4%80-%EB%82%98%EB%AC%B4-%EC%9E%90%EB%A5%B4%EA%B8%B0-2805%EB%B2%88-%EC%9D%B4%EC%A7%84-%ED%83%90%EC%83%89</link>
            <guid>https://velog.io/@xxwb__/%EB%B0%B1%EC%A4%80-%EB%82%98%EB%AC%B4-%EC%9E%90%EB%A5%B4%EA%B8%B0-2805%EB%B2%88-%EC%9D%B4%EC%A7%84-%ED%83%90%EC%83%89</guid>
            <pubDate>Sat, 15 May 2021 09:13:55 GMT</pubDate>
            <description><![CDATA[<h1 id="🔗-문제-링크">🔗 문제 링크</h1>
<p><a href="https://www.acmicpc.net/problem/2805">https://www.acmicpc.net/problem/2805</a></p>
<br>

<h1 id="💻-코드">💻 코드</h1>
<pre><code class="language-python">N, M = map(int, input().split())

tree = list(map(int, input().split()))

def binary_search(target, start, end):
    result_max = 0  # 나무 높이의 합이 정확히 M으로 떨어지지 않을 때 최댓값
    while start &lt;= end:
        result = 0
        mid = (start + end) // 2
        for i in tree:
            if i &gt; mid:
                result += i - mid
        if result == target:
            return mid
        elif result &gt; target :
            result_max = mid
            start = mid + 1
        else :
            end = mid - 1
    return result_max

print(binary_search(M, 0, max(tree)))
</code></pre>
<h2 id="설계">설계</h2>
<p>나무의 높이의 합은 정확히 M이 되지 않을 수도 있다. 이때, 절단된 나무의 높이의 합이 M보다 크고 절단기에 설정할 수 있는 높이의 최댓값을 위의 코드에서 <code>result &gt; target</code>일 때 구할 수 있으므로 result_max에 값을 저장해 놓고 반환한다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[백준] 유기농 배추 (1012번) - DFS]]></title>
            <link>https://velog.io/@xxwb__/%EB%B0%B1%EC%A4%80-%EC%9C%A0%EA%B8%B0%EB%86%8D-%EB%B0%B0%EC%B6%94-1012%EB%B2%88-DFS</link>
            <guid>https://velog.io/@xxwb__/%EB%B0%B1%EC%A4%80-%EC%9C%A0%EA%B8%B0%EB%86%8D-%EB%B0%B0%EC%B6%94-1012%EB%B2%88-DFS</guid>
            <pubDate>Fri, 14 May 2021 11:45:40 GMT</pubDate>
            <description><![CDATA[<h1 id="🔗-문제-링크">🔗 문제 링크</h1>
<p><a href="https://www.acmicpc.net/problem/1012">https://www.acmicpc.net/problem/1012</a></p>
<br>

<h1 id="💻-코드">💻 코드</h1>
<pre><code class="language-python">import sys
sys.setrecursionlimit(10000)

def dfs(x, y):
    if x &lt; 0 or x &gt;= M or y &lt; 0 or y &gt;= N:
        return False
    if graph[y][x] == 1:
        graph[y][x] = 0
        dfs(x - 1, y)
        dfs(x + 1, y)
        dfs(x, y -1)
        dfs(x, y + 1)
        return True
    return False

T = int(input())

for _ in range(T):
    M, N, K = map(int, input().split())

    graph = [[0] * M for i in range(N)]

    for _ in range(K):
        x, y = map(int, input().split())
        graph[y][x] = 1

    result = 0      
    for i in range(N):
        for j in range(M):
            if dfs(j, i) == True:
                result += 1
    print(result)</code></pre>
<br>

<h1 id="📝-정리">📝 정리</h1>
<p><strong>재귀함수로 인해 런타임 에러(Recursion Error)가 발생</strong>하면 최대 재귀한도 깊이를 설정하여 에러를 해결할 수 있다.</p>
<pre><code class="language-python">import sys
sys.setrecursionlimit(10000)</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[[백준] 동전 0 (11047번) - 그리디]]></title>
            <link>https://velog.io/@xxwb__/%EB%B0%B1%EC%A4%80-%EB%8F%99%EC%A0%84-0-11047%EB%B2%88-%EA%B7%B8%EB%A6%AC%EB%94%94</link>
            <guid>https://velog.io/@xxwb__/%EB%B0%B1%EC%A4%80-%EB%8F%99%EC%A0%84-0-11047%EB%B2%88-%EA%B7%B8%EB%A6%AC%EB%94%94</guid>
            <pubDate>Fri, 14 May 2021 10:39:06 GMT</pubDate>
            <description><![CDATA[<h1 id="🔗-문제-링크">🔗 문제 링크</h1>
<p><a href="https://www.acmicpc.net/problem/11047">https://www.acmicpc.net/problem/11047</a></p>
<br>

<h1 id="💻-코드">💻 코드</h1>
<pre><code class="language-python">N, K = map(int, input().split())

A = [] * N

for _ in range(N):
    A.append(int(input()))

A.sort(reverse=True)

result = 0
for i in A:
    if i &gt; K:
        continue
    else:
        result += K // i
        K = K % i

print(result)</code></pre>
<h2 id="설계">설계</h2>
<p>가치가 큰 동전이 가치가 작은 동전의 배수이므로, K보다 가치가 작고 그 중에 가치가 큰 동전부터 필요한 동전 개수에 포함시킨다. 
이 그리디 알고리즘은 동전의 가치가 배수로 주어졌기 때문에 가능하다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[백준] 경로 찾기 (11403번) - 플로이드 워셜]]></title>
            <link>https://velog.io/@xxwb__/%EB%B0%B1%EC%A4%80-%EA%B2%BD%EB%A1%9C-%EC%B0%BE%EA%B8%B0-11403%EB%B2%88-%ED%94%8C%EB%A1%9C%EC%9D%B4%EB%93%9C-%EC%9B%8C%EC%85%9C</link>
            <guid>https://velog.io/@xxwb__/%EB%B0%B1%EC%A4%80-%EA%B2%BD%EB%A1%9C-%EC%B0%BE%EA%B8%B0-11403%EB%B2%88-%ED%94%8C%EB%A1%9C%EC%9D%B4%EB%93%9C-%EC%9B%8C%EC%85%9C</guid>
            <pubDate>Thu, 13 May 2021 12:13:25 GMT</pubDate>
            <description><![CDATA[<h1 id="🔗-문제-링크">🔗 문제 링크</h1>
<p><a href="https://www.acmicpc.net/problem/11403">https://www.acmicpc.net/problem/11403</a></p>
<br>

<h1 id="💻-코드">💻 코드</h1>
<pre><code class="language-python">N = int(input())

graph = [list(map(int, input().split())) for i in range(N)]

for k in range(N):
    for a in range(N):
        for b in range(N):
            if graph[a][k] == 1 and graph[k][b] == 1: 
                graph[a][b] = 1 

for a in range(N):
    for b in range(N):
        print(graph[a][b], end = &quot; &quot;)
    print()</code></pre>
<h2 id="설계">설계</h2>
<p>i에서 j로 가능 경로가 있는지 없는지 구해야 한다. i에서 다른 정점을 거쳐 j로 가는 경우를 고려하여 i에서 다른 정점에 갈 때 경로가 존재하고, 다른 정점에서 j로 갈 때 경로가 존재하면, i에서 j로 가는 경로가 존재한다.  </p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[백준] 1, 2, 3 더하기 (9095번) - 다이나믹 프로그래밍]]></title>
            <link>https://velog.io/@xxwb__/%EB%B0%B1%EC%A4%80-1-2-3-%EB%8D%94%ED%95%98%EA%B8%B0-9095%EB%B2%88-%EB%8B%A4%EC%9D%B4%EB%82%98%EB%AF%B9-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D</link>
            <guid>https://velog.io/@xxwb__/%EB%B0%B1%EC%A4%80-1-2-3-%EB%8D%94%ED%95%98%EA%B8%B0-9095%EB%B2%88-%EB%8B%A4%EC%9D%B4%EB%82%98%EB%AF%B9-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D</guid>
            <pubDate>Wed, 12 May 2021 11:49:41 GMT</pubDate>
            <description><![CDATA[<h1 id="🔗-문제-링크">🔗 문제 링크</h1>
<p><a href="https://www.acmicpc.net/problem/9095">https://www.acmicpc.net/problem/9095</a></p>
<br>

<h1 id="💻-코드">💻 코드</h1>
<pre><code class="language-python">t = int(input())

d = [0] * 12

d[1] = 1
d[2] = 2
d[3] = 4

for i in range(4, 12):
    for j in range(1, 4):
        d[i] += d[i - j]

for i in range(t):
    n = int(input())
    print(d[n])</code></pre>
<h2 id="설계">설계</h2>
<blockquote>
<p>참고) <a href="https://www.youtube.com/watch?v=R9WCxrPs2b8">https://www.youtube.com/watch?v=R9WCxrPs2b8</a></p>
</blockquote>
<p><img src="https://images.velog.io/images/xxwb__/post/6b904b84-5453-4e28-ac43-eeabd329b257/KakaoTalk_20210512_204318793.jpg" alt=""></p>
<p>1, 2, 3만 더할 수 있으므로 정수 n이 주어진다면 n-1에서 1을 더하면 n이 되고, n-2에서 2를 더하면 n이 되고, n-3에서 3을 더하면 n이 된다. 그러므로 n을 만들 수 있는 수는 n-1, n-2, n-3을 만들 수 있는 수를 다 더하면 된다.</p>
<br>

<h1 id="📝-정리">📝 정리</h1>
<p>점화식 생각해 내기 너무 어렵다....</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[백준] 바이러스 (2606번) - BFS]]></title>
            <link>https://velog.io/@xxwb__/%EB%B0%B1%EC%A4%80-%EB%B0%94%EC%9D%B4%EB%9F%AC%EC%8A%A4-2606%EB%B2%88-BFS</link>
            <guid>https://velog.io/@xxwb__/%EB%B0%B1%EC%A4%80-%EB%B0%94%EC%9D%B4%EB%9F%AC%EC%8A%A4-2606%EB%B2%88-BFS</guid>
            <pubDate>Mon, 10 May 2021 15:10:22 GMT</pubDate>
            <description><![CDATA[<h1 id="🔗-문제-링크">🔗 문제 링크</h1>
<p><a href="https://www.acmicpc.net/problem/2606">https://www.acmicpc.net/problem/2606</a></p>
<br>

<h1 id="💻-코드">💻 코드</h1>
<pre><code class="language-python">from collections import deque

v = int(input())
e = int(input())

graph = [[] for _ in range(v + 1)]

for _ in range(e):
    a, b = map(int, input().split())
    # 양방향 그래프
    graph[a].append(b)
    graph[b].append(a)  

visited = [False] * (v+1)

def bfs(x):
    queue = deque()
    queue.append(x)
    while queue:
        a = queue.popleft()
        for i in graph[a]:
            if not visited[i]:
                queue.append(i)
                visited[i] = True
bfs(1)
if visited[1] == True:  # 1번 컴퓨터는 결과값에서 제외되어야 한다.
    print(visited.count(True) - 1)
else:
    print(visited.count(True))

</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[[백준] 단지번호붙이기 (2667번) - DFS]]></title>
            <link>https://velog.io/@xxwb__/%EB%B0%B1%EC%A4%80-%EB%8B%A8%EC%A7%80%EB%B2%88%ED%98%B8%EB%B6%99%EC%9D%B4%EA%B8%B0-2667%EB%B2%88-DFS</link>
            <guid>https://velog.io/@xxwb__/%EB%B0%B1%EC%A4%80-%EB%8B%A8%EC%A7%80%EB%B2%88%ED%98%B8%EB%B6%99%EC%9D%B4%EA%B8%B0-2667%EB%B2%88-DFS</guid>
            <pubDate>Mon, 10 May 2021 14:08:56 GMT</pubDate>
            <description><![CDATA[<h1 id="🔗-문제-링크">🔗 문제 링크</h1>
<p><a href="https://www.acmicpc.net/problem/2667">https://www.acmicpc.net/problem/2667</a></p>
<br>

<h1 id="💻-코드">💻 코드</h1>
<pre><code class="language-python">n = int(input())

graph = []

for i in range(n):
    graph.append(list(map(int,input())))

def dfs(x, y, z):
    if x &lt;= -1 or x &gt;= n or y &lt;= -1 or y &gt;= n:
        return False
    if graph[x][y] == 1:
        graph[x][y] = z
        dfs(x - 1, y, z)
        dfs(x, y - 1, z)
        dfs(x + 1, y, z)
        dfs(x, y + 1, z)
        return True
    return False

result = 0  # result는 단지수
z = 2  # z는 단지 번호. 0, 1번이 집 여부를 나타내므로 단지 번호는 2부터 시작하게 하였다.
for i in range(n):
    for j in range(n):
        if dfs(i, j, z) == True:
            z += 1
            result += 1

result_num = [0 * i for i in range(result)]

for i in range(n):
    for j in range(2, 2 + result):
        result_num[j-2] += graph[i].count(j)

result_num.sort()

print(result)
for i in result_num:
    print(i)</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[[프로그래머스] 서울에서 김서방 찾기]]></title>
            <link>https://velog.io/@xxwb__/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-%EC%84%9C%EC%9A%B8%EC%97%90%EC%84%9C-%EA%B9%80%EC%84%9C%EB%B0%A9-%EC%B0%BE%EA%B8%B0</link>
            <guid>https://velog.io/@xxwb__/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-%EC%84%9C%EC%9A%B8%EC%97%90%EC%84%9C-%EA%B9%80%EC%84%9C%EB%B0%A9-%EC%B0%BE%EA%B8%B0</guid>
            <pubDate>Sun, 09 May 2021 08:58:04 GMT</pubDate>
            <description><![CDATA[<h1 id="🔗-문제-링크">🔗 문제 링크</h1>
<p><a href="https://programmers.co.kr/learn/courses/30/lessons/12919">https://programmers.co.kr/learn/courses/30/lessons/12919</a></p>
<br>

<h1 id="💻-코드">💻 코드</h1>
<pre><code class="language-python">def solution(seoul):
    idx = seoul.index(&quot;Kim&quot;)
    answer = &quot;김서방은 &quot; + str(idx) + &quot;에 있다&quot;
    # answer = &quot;김서방은 {}에 있다&quot;.format(seoul.index(&quot;Kim&quot;))
    return answer</code></pre>
<br>

<h1 id="📝-정리">📝 정리</h1>
<h4 id="파이썬-format">파이썬 format()</h4>
<p>문자열 중간에 특정 변수의 값을 넣어 주기 위해 사용</p>
<pre><code class="language-python">    answer = &quot;김서방은 {}에 있다&quot;.format(1)</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[[백준] 단어의 개수 (1152번) - 구현]]></title>
            <link>https://velog.io/@xxwb__/%EB%B0%B1%EC%A4%80-%EB%8B%A8%EC%96%B4%EC%9D%98-%EA%B0%9C%EC%88%98-1152%EB%B2%88-%EA%B5%AC%ED%98%84</link>
            <guid>https://velog.io/@xxwb__/%EB%B0%B1%EC%A4%80-%EB%8B%A8%EC%96%B4%EC%9D%98-%EA%B0%9C%EC%88%98-1152%EB%B2%88-%EA%B5%AC%ED%98%84</guid>
            <pubDate>Sat, 08 May 2021 04:53:09 GMT</pubDate>
            <description><![CDATA[<h1 id="🔗-문제-링크">🔗 문제 링크</h1>
<p><a href="https://www.acmicpc.net/problem/1152">https://www.acmicpc.net/problem/1152</a></p>
<br>

<h1 id="💻-코드">💻 코드</h1>
<pre><code class="language-python">data = input().split(&#39; &#39;)

count = 0
for i in data:
    if i == &#39;&#39;:
        count += 1 

print(len(data) - count)</code></pre>
<h2 id="설계">설계</h2>
<p>문자열의 앞과 뒤 공백은 split(&#39; &#39;)을 통해 문자열을 나누면 빈 문자열이 리스트에 삽입된다. 따라서 빈 문자열이 삽입된 개수를 찾아 list의 개수에서 빼주었다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[백준] 설탕 배달 (2839번) - 그리디]]></title>
            <link>https://velog.io/@xxwb__/%EB%B0%B1%EC%A4%80-%EC%84%A4%ED%83%95-%EB%B0%B0%EB%8B%AC-2839%EB%B2%88</link>
            <guid>https://velog.io/@xxwb__/%EB%B0%B1%EC%A4%80-%EC%84%A4%ED%83%95-%EB%B0%B0%EB%8B%AC-2839%EB%B2%88</guid>
            <pubDate>Sat, 08 May 2021 04:00:04 GMT</pubDate>
            <description><![CDATA[<h1 id="🔗-문제-링크">🔗 문제 링크</h1>
<p><a href="https://www.acmicpc.net/problem/2839">https://www.acmicpc.net/problem/2839</a></p>
<br>

<h1 id="💻-코드">💻 코드</h1>
<pre><code class="language-python">N = int(input())

# 5킬로그램 봉지를 최대로 가질 수 있는 경우
cnt_5_temp = N // 5

data = N
result = 0
flag = False  # N킬로그램을 만들 수 있는지 확인하는 변수

# 5킬로그램 봉지를 처음에는 가질 수 있는 최대로 갖고,
# N킬로그램을 만들 수 없다면 그 수를 하나씩 줄여가며 결과를 찾는다.
for cnt_5 in range(cnt_5_temp, -1, -1): 
    data -= 5 * cnt_5

    # 5킬로그램 봉지를 가지고 남은 무게를 3킬로그램으로 채울 수 있다면 결과 return
    if data % 3 == 0 :
        cnt_3 = data // 3
        result = cnt_5 + cnt_3
        flag = True
        break
    data = N

if flag == False:
    print(-1)
else:   
    print(result)</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[[프로그래머스] 자연수 뒤집어 배열로 만들기]]></title>
            <link>https://velog.io/@xxwb__/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-%EC%9E%90%EC%97%B0%EC%88%98-%EB%92%A4%EC%A7%91%EC%96%B4-%EB%B0%B0%EC%97%B4%EB%A1%9C-%EB%A7%8C%EB%93%A4%EA%B8%B0</link>
            <guid>https://velog.io/@xxwb__/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-%EC%9E%90%EC%97%B0%EC%88%98-%EB%92%A4%EC%A7%91%EC%96%B4-%EB%B0%B0%EC%97%B4%EB%A1%9C-%EB%A7%8C%EB%93%A4%EA%B8%B0</guid>
            <pubDate>Fri, 30 Apr 2021 06:13:27 GMT</pubDate>
            <description><![CDATA[<h1 id="🔗-문제-링크">🔗 문제 링크</h1>
<p><a href="https://programmers.co.kr/learn/courses/30/lessons/12932">https://programmers.co.kr/learn/courses/30/lessons/12932</a></p>
<br>

<h1 id="💻-코드">💻 코드</h1>
<pre><code class="language-python">def solution(n):
    answer = []
    while n &gt; 0:
        answer.append(n % 10)
        n //= 10
    return answer</code></pre>
<br>

<h1 id="📝-정리">📝 정리</h1>
<p><strong>[다른 풀이법] 입력된 숫자를 문자열로 바꾸고 map()으로 각 자리 숫자를 리스트로 만드는 방법</strong></p>
<p><code>map(f, iterable)은 함수(f)와 반복 가능한 자료형을 입력으로 받아서 함수가 수행한 결과를 돌려주는 함수이다.</code></p>
<pre><code class="language-python">    answer = list(map(int, str(n)))
    answer.reverse()</code></pre>
<ul>
<li>list(map(함수, 리스트))</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[프로그래머스] 두 정수 사이의 합]]></title>
            <link>https://velog.io/@xxwb__/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-%EB%8B%A4%EB%A5%B8-%EC%82%AC%EB%9E%8C%EC%9D%98-%ED%92%80%EC%9D%B4</link>
            <guid>https://velog.io/@xxwb__/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-%EB%8B%A4%EB%A5%B8-%EC%82%AC%EB%9E%8C%EC%9D%98-%ED%92%80%EC%9D%B4</guid>
            <pubDate>Mon, 26 Apr 2021 12:55:42 GMT</pubDate>
            <description><![CDATA[<h1 id="🔗-문제-링크">🔗 문제 링크</h1>
<p><a href="https://programmers.co.kr/learn/courses/30/lessons/12912">https://programmers.co.kr/learn/courses/30/lessons/12912</a></p>
<br>

<h1 id="💻-코드">💻 코드</h1>
<pre><code class="language-python">def solution(a, b):
    answer = 0

    if a &lt; b:
        for i in range(a, b + 1):
            answer += i
    else:
        for i in range(b, a + 1):
            answer += i
    return answer</code></pre>
<br>

<h1 id="📝-정리">📝 정리</h1>
<p><strong>for문 돌려서 합 구하지 말고 sum() 메서드 사용하기</strong></p>
<pre><code class="language-python">def solution(a, b):
    answer = 0

    if a &lt; b:
        answer = sum(range(a, b + 1))
    else:
        answer = sum(range(b, a + 1))
    return answer
</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[[프로그래머스] 문자열 내림차순으로 배치하기]]></title>
            <link>https://velog.io/@xxwb__/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-%EB%AC%B8%EC%9E%90%EC%97%B4-%EB%82%B4%EB%A6%BC%EC%B0%A8%EC%88%9C%EC%9C%BC%EB%A1%9C-%EB%B0%B0%EC%B9%98%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@xxwb__/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-%EB%AC%B8%EC%9E%90%EC%97%B4-%EB%82%B4%EB%A6%BC%EC%B0%A8%EC%88%9C%EC%9C%BC%EB%A1%9C-%EB%B0%B0%EC%B9%98%ED%95%98%EA%B8%B0</guid>
            <pubDate>Thu, 22 Apr 2021 12:10:50 GMT</pubDate>
            <description><![CDATA[<h1 id="🔗-문제-링크">🔗 문제 링크</h1>
<p><a href="https://programmers.co.kr/learn/courses/30/lessons/12917">https://programmers.co.kr/learn/courses/30/lessons/12917</a></p>
<br>

<h1 id="💻-코드">💻 코드</h1>
<pre><code class="language-python">def solution(s):
    return &#39;&#39;.join(sorted(s, reverse=True))</code></pre>
<br>

<h1 id="📝-정리">📝 정리</h1>
<ul>
<li><code>sorted()</code> : 리스트로 변환 후 정렬</li>
<li><code>join()</code> : 리스트를 문자열로 합치기</li>
</ul>
]]></description>
        </item>
    </channel>
</rss>