<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>y-siro.log</title>
        <link>https://velog.io/</link>
        <description>잉차차</description>
        <lastBuildDate>Tue, 16 Aug 2022 01:16:19 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>y-siro.log</title>
            <url>https://images.velog.io/images/y-siro/profile/db4e59dc-1ffb-4d61-a8b4-639859d526e6/dlrbduf1346-picture-1638176645637.png</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. y-siro.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/y-siro" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[백준 25391 특별상]]></title>
            <link>https://velog.io/@y-siro/%EB%B0%B1%EC%A4%80-25391-%ED%8A%B9%EB%B3%84%EC%83%81</link>
            <guid>https://velog.io/@y-siro/%EB%B0%B1%EC%A4%80-25391-%ED%8A%B9%EB%B3%84%EC%83%81</guid>
            <pubDate>Tue, 16 Aug 2022 01:16:19 GMT</pubDate>
            <description><![CDATA[<p><a href="https://www.acmicpc.net/problem/25391">https://www.acmicpc.net/problem/25391</a></p>
<ul>
<li>그리디 알고리즘</li>
<li>풀이
어떤 상황이던 심판이 점수를 높게준 K 명의 학생은 수상을 한다는 사실을 알 수 있다. 따라서 심판이 점수를 높게준 K 명을 제외한 주최자가 점수를 높게 준 학생 M 명의 점수를 가장 높게 선정하면 수상하는 학생들의 점수 합을 최대로 얻을 수 있다.
먼저 b 배열을 내림차순으로 정렬하고 앞에서부터 K 명의 점수를 얻는다. 그 후, a 배열을 내림차순으로 정렬하여 앞에서부터 M 명의 점수를 얻되, 이 인원은 이미 선정한 K 명중 포함되지 않아야 한다.</li>
</ul>
<pre><code class="language-C">#include &lt;bits/stdc++.h&gt;
using namespace std;
#define fast ios_base::sync_with_stdio(false); cin.tie(NULL), cout.tie(NULL)
#define ll long long
const char en = &#39;\n&#39;;
const int INF = (int)1e9 + 7;
const int mod = (int)1e9 + 7;

struct s {
    int a, b;
    bool c;
};

bool cmp_1(s x, s y) {
    if (x.a == y.a) return x.b &gt; y.b;
    return x.a &gt; y.a;
}

bool cmp_2(s x, s y) {
    if (x.b == y.b) return x.a &gt; y.a;
    return x.b &gt; y.b;
}


int main(void) {
    fast;

    int n, m, k; cin &gt;&gt; n &gt;&gt; m &gt;&gt; k;
    vector&lt;s&gt; v(n);
    for (int i = 0; i &lt; n; ++i) {
        cin &gt;&gt; v[i].a &gt;&gt; v[i].b;
        v[i].c = false;
    }

    sort(v.begin(), v.end(), cmp_2);
    ll ans = 0;

    for (int i = 0; i &lt; k; ++i) v[i].c = true;
    sort(v.begin(), v.end(), cmp_1);

    for (int i = 0; m; ++i) {
        if (!v[i].c) v[i].c = true, m--;
    }

    for (int i = 0; i &lt; n; ++i) {
        if (v[i].c) ans += v[i].a;
    }

    cout &lt;&lt; ans &lt;&lt; en;
    return 0;
}</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[백준 25386 라즈베리 파이]]></title>
            <link>https://velog.io/@y-siro/%EB%B0%B1%EC%A4%80-25386-%EB%9D%BC%EC%A6%88%EB%B2%A0%EB%A6%AC-%ED%8C%8C%EC%9D%B4</link>
            <guid>https://velog.io/@y-siro/%EB%B0%B1%EC%A4%80-25386-%EB%9D%BC%EC%A6%88%EB%B2%A0%EB%A6%AC-%ED%8C%8C%EC%9D%B4</guid>
            <pubDate>Fri, 12 Aug 2022 01:34:47 GMT</pubDate>
            <description><![CDATA[<p><a href="https://www.acmicpc.net/problem/25386">https://www.acmicpc.net/problem/25386</a>
<img src="https://velog.velcdn.com/images/y-siro/post/a951dfdf-beca-42d8-af9d-853653c44d3e/image.png" alt=""></p>
<ul>
<li>그리디 알고리즘, 애드 혹</li>
<li>풀이</li>
</ul>
<ol>
<li>M과 N이 같을 때, 라즈베리 배열의 모든 칸이 차있으므로 라즈베리를 이동할 수 없습니다. 이 경우엔 a = b가 아닐 시 -1을 출력합니다.</li>
<li>두 참가자의 원하는 라즈베리의 위치가 중복일 시에도 충족되게 나눠줄 수 없습니다. 이 경우엔 -1를 출력합니다.</li>
</ol>
<p>라즈베리의 원형배열을 일차원 배열처럼 생각합니다. 배정한 라즈베리 파이의 순서를 유지하는 한, 일차원 배열을 계속 확장할 수 있습니다.
a,b 배열을 pair로 묶고 b를 기준, 오름차순으로 정렬했습니다. </p>
<pre><code class="language-C">#include &lt;bits/stdc++.h&gt;
using namespace std;
#define fast ios_base::sync_with_stdio(false); cin.tie(NULL), cout.tie(NULL)
#define ll long long
const char en = &#39;\n&#39;;
const int INF = (int)1e9 + 7;
const int mod = (int)1e9 + 7;

bool cmp(pair&lt;ll, ll&gt; a, pair&lt;ll, ll&gt; b) {
    if (a.second == b.second) return a.first &lt; b.first;
    return a.second &lt; b.second;
}

int main(void) {
    fast;

    int m, n; cin &gt;&gt; m &gt;&gt; n;
    vector&lt;pair&lt;ll, ll&gt;&gt; a(n);
    for (int i = 0; i &lt; n; ++i) cin &gt;&gt; a[i].first;
    for (int i = 0; i &lt; n; ++i) cin &gt;&gt; a[i].second;

    if (m == n) {
        for (int i = 0; i &lt; n; ++i) {
            if (a[i].first != a[i].second) {
                cout &lt;&lt; -1 &lt;&lt; en; return 0;
            }
        }
        cout &lt;&lt; 0 &lt;&lt; en; return 0;
    }

    sort(a.begin(), a.end(), cmp);
    for (int i = 0; i &lt; n - 1; ++i) {
        if (a[i].second == a[i + 1].second) {
            cout &lt;&lt; -1 &lt;&lt; en; return 0;
        }
    }

    ll ans = 0, cnt = 0;

    for (int i = 0; i &lt; n - 1; ++i) {
        if (a[i].first &gt; a[i + 1].first) {
            double ce = ceil(((double)a[i].first - (double)a[i + 1].first) / (double)m)*(double)m;
            a[i + 1].first += ce;
        }
    }

    for (int i = 0; i &lt; n; ++i) {
        if (a[i].first + (cnt*m) &lt; a[i].second) {
            cnt += 1;
        }
    }

    for (int i = 0; i &lt; n; ++i) a[i].first += cnt * m;

    if (a.front().first + m &lt;= a.back().first) {
        cout &lt;&lt; -1 &lt;&lt; en; return 0;
    }
    for (int i = 0; i &lt; n; ++i) ans += a[i].first - a[i].second;
    cout &lt;&lt; ans &lt;&lt; en;

    return 0;
}</code></pre>
<ul>
<li><p>예제에 관한 풀이 그림 첨부
순서대로 입력 예제 1,2 입니다.<img src="https://velog.velcdn.com/images/y-siro/post/7cd397e6-da00-405b-aaf6-36896589e786/image.jpg" alt=""></p>
</li>
<li><p>라즈베리 배열은 원래 원형 배열이므로, 정렬된 a 배열의 마지막 조각은 처음 a 조각 + M 보다 크거나 같아야 합니다. ( if(a.front().first + m &lt;= a.back().first  부분입니다.)</p>
</li>
<li><p>참가자에게 배정한 파이 조각 위치는 참가자가 원하는 파이 조각의 번호보다 커야합니다.</p>
</li>
</ul>
<ul>
<li>올해 진행된 UCPC 문제들을 몇 문제 풀어봤습니다. 다들 난이도가 상당히 어려웠고, 이 문제는 거진 3일 정도 생각하여 푼 문제였습니다. </li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[백준 24524 아름다운 문자열]]></title>
            <link>https://velog.io/@y-siro/%EB%B0%B1%EC%A4%80-24524-%EC%95%84%EB%A6%84%EB%8B%A4%EC%9A%B4-%EB%AC%B8%EC%9E%90%EC%97%B4</link>
            <guid>https://velog.io/@y-siro/%EB%B0%B1%EC%A4%80-24524-%EC%95%84%EB%A6%84%EB%8B%A4%EC%9A%B4-%EB%AC%B8%EC%9E%90%EC%97%B4</guid>
            <pubDate>Wed, 02 Mar 2022 09:00:23 GMT</pubDate>
            <description><![CDATA[<p><a href="https://www.acmicpc.net/problem/24524">https://www.acmicpc.net/problem/24524</a></p>
<ul>
<li><p>문자열, 그리디 알고리즘</p>
</li>
<li><p>풀이
문자열 S 에 대하여 반복해서 T를 찾으면 시간 초과가 날 수 있다고 생각했다.
앞쪽 문자열이 이미 나왔는지를 확인한다. 만약 s[i]가 t[j]와 같을 시 t[j] 이전 문자들이 몇 번 나왔는지 확인한다. 이전 문자들이 더 적게 나왔을 경우 추가하지 않고 많이 나왔을 경우만 추가한다.</p>
</li>
</ul>
<pre><code class="language-C">#include &lt;bits/stdc++.h&gt;
using namespace std;
#define fast ios_base::sync_with_stdio(false); cin.tie(NULL), cout.tie(NULL)
#define ll long long 
#define pii pair&lt;long, long&gt;

string s, t;
vector&lt;int&gt; A;
int cnt = 0;

bool check_prev(int N) {
    for (int i = 0; i &lt; N; ++i) {
        if (!A[i] or A[i] &lt;= A[N]) return false;
    }
    return true;
}

bool complete() {
    for (int i = 0; i &lt; A.size(); ++i) {
        if (!A[i]) return false;
    }
    return true;
}

void del() {
    for (int i = 0; i &lt; A.size(); ++i) A[i]--;
}

int main(void) {
    fast;

    cin &gt;&gt; s &gt;&gt; t;
    A.resize(t.size());
    for (int i = 0; i &lt; s.size(); ++i) {
        for (int j = 0; j &lt; t.size(); ++j) {
            if (s[i] == t[j]) {
                if (check_prev(j)) {
                    A[j]++;
                    if (complete()) {
                        del(); cnt++;
                    }
                }
            }
        }
    }
    cout &lt;&lt; cnt;
}</code></pre>
<ul>
<li>check_prev 함수 중 A[i] &lt;= A[N] 부분을 추가해주셔야 합니다.
재미있게 푼 문제입니다!</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[백준 24393 조커 찾기]]></title>
            <link>https://velog.io/@y-siro/%EB%B0%B1%EC%A4%80-24393-%EC%A1%B0%EC%BB%A4-%EC%B0%BE%EA%B8%B0</link>
            <guid>https://velog.io/@y-siro/%EB%B0%B1%EC%A4%80-24393-%EC%A1%B0%EC%BB%A4-%EC%B0%BE%EA%B8%B0</guid>
            <pubDate>Sat, 05 Feb 2022 06:58:20 GMT</pubDate>
            <description><![CDATA[<p><a href="https://www.acmicpc.net/problem/24393">https://www.acmicpc.net/problem/24393</a></p>
<ul>
<li><p>자료 구조, 큐, 시뮬레이션</p>
</li>
<li><p>풀이
기재된 섞는 순서에 맞춰 left_side queue, right_side queue 에 분배해 놓는다.
입력은 총 카드 수인 27 합을 맞출 때까지 받는다.
오른쪽 한번 왼쪽 한번 반복하여 left_side, right_side에서 카드를 메인 queue로 보내 합친다.
위 로직을 반복한다.</p>
</li>
</ul>
<pre><code class="language-C">#include &lt;bits/stdc++.h&gt;
using namespace std;
#define fast ios_base::sync_with_stdio(false); cin.tie(NULL), cout.tie(NULL)

int N;
queue&lt;int&gt; ls, rs, ret;

int main(void){
    fast;
    cin&gt;&gt;N;
    ret.push(-1);
    for(int i=0;i&lt;26;++i) ret.push(1);
    while(N--){
        int cnt=0;
        for(int i=0;i&lt;13;++i) {
            ls.push(ret.front()); ret.pop();
        }
        for(int i=0;i&lt;14;++i){
            rs.push(ret.front()); ret.pop();
        }
        bool flag=true;
        while(cnt&lt;27){
            int card; cin&gt;&gt;card;
            cnt+=card;
            for(int i=0;i&lt;card;++i){
                if(flag){
                    ret.push(rs.front()); rs.pop();
                } else{
                    ret.push(ls.front()); ls.pop();
                }
            }
            flag=!flag;
        }
    }
    for(int i=1;i&lt;=27;++i){
        int cur=ret.front(); ret.pop();
        if(cur==-1){
            cout&lt;&lt;i; return 0;
        }
    }
}</code></pre>
<ul>
<li>자료구조 - 큐와 구현력을 물어보는 문제</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[백준 24391 귀찮은 해강이]]></title>
            <link>https://velog.io/@y-siro/%EB%B0%B1%EC%A4%80-24391-%EA%B7%80%EC%B0%AE%EC%9D%80-%ED%95%B4%EA%B0%95%EC%9D%B4</link>
            <guid>https://velog.io/@y-siro/%EB%B0%B1%EC%A4%80-24391-%EA%B7%80%EC%B0%AE%EC%9D%80-%ED%95%B4%EA%B0%95%EC%9D%B4</guid>
            <pubDate>Fri, 04 Feb 2022 15:56:00 GMT</pubDate>
            <description><![CDATA[<p><a href="https://www.acmicpc.net/problem/24391">https://www.acmicpc.net/problem/24391</a></p>
<ul>
<li><p>자료 구조, 분리 집합</p>
</li>
<li><p>풀이
연결되어 있는 건물들을 같은 집합에 포함 시킨다.
그 후 다른 집합에 있는 건물일 시 (check 함수), res를 더하여 마지막에 출력한다.</p>
</li>
</ul>
<ul>
<li>코드<pre><code class="language-C">#include &lt;bits/stdc++.h&gt;
using namespace std;
#define fast ios_base::sync_with_stdio(false); cin.tie(NULL), cout.tie(NULL)
</code></pre>
</li>
</ul>
<p>const int MAX = 101010;
int N, M, res=0;
int par[MAX];</p>
<p>void init(int num){
    for(int i=0;i&lt;num;i++) par[i]=i;
}</p>
<p>int find(int x){
    if(x==par[x]) return x;
    return par[x]=find(par[x]);
}</p>
<p>void Union(int x, int y){
    x=find(x); y=find(y);
    if(x&lt;y) par[y]=x;
    else par[x]=y;
}</p>
<p>bool check(int x, int y){
    x=find(x); y=find(y);
    if(x==y) return true;
    return false;
}</p>
<p>int main(void){
    fast;
    cin&gt;&gt;N&gt;&gt;M;
    init(N);
    for(int i=0;i&lt;M;++i){
        int s,e; cin&gt;&gt;s&gt;&gt;e;
        Union(s,e);
    }
    vector<int> table(N);
    for(int i=0;i&lt;N;++i) cin&gt;&gt;table[i];
    for(int i=0;i&lt;N-1;++i){
        if(!check(table[i], table[i+1])) res++;
    }
    cout&lt;&lt;res;
}</p>
<pre><code></code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[백준 24390 또 전자레인지야?]]></title>
            <link>https://velog.io/@y-siro/%EB%B0%B1%EC%A4%80-24390-%EB%98%90-%EC%A0%84%EC%9E%90%EB%A0%88%EC%9D%B8%EC%A7%80%EC%95%BC</link>
            <guid>https://velog.io/@y-siro/%EB%B0%B1%EC%A4%80-24390-%EB%98%90-%EC%A0%84%EC%9E%90%EB%A0%88%EC%9D%B8%EC%A7%80%EC%95%BC</guid>
            <pubDate>Fri, 04 Feb 2022 15:21:23 GMT</pubDate>
            <description><![CDATA[<p><a href="https://www.acmicpc.net/problem/24390">https://www.acmicpc.net/problem/24390</a></p>
<ul>
<li><p>그리디 알고리즘</p>
</li>
<li><p>풀이
거스름돈 문제와 비슷한 로직으로 해결했다.
30초, 60초 이하인 부분만 예외로 처리했다.</p>
</li>
<li><p>코드</p>
<pre><code class="language-c">#include &lt;bits/stdc++.h&gt;
using namespace std;
#define fast ios_base::sync_with_stdio(false); cin.tie(NULL), cout.tie(NULL)
</code></pre>
</li>
</ul>
<p>string tt;
int M,S;</p>
<p>int main(void){
    fast;
    cin&gt;&gt;tt;
    M=stoi(tt.substr(0,2)); S=stoi(tt.substr(3,2));
    S+=M*60;
    if(!S){
        cout&lt;&lt;0; return 0;
    }
    if(S&lt;30){
        cout&lt;&lt;(S/10)+1; return 0;
    }
    if(S&lt;60){
        cout&lt;&lt;((S-30)/10)+1; return 0;
    }
    int A=S;
    int ss, sm=1;
    S-=30; ss=1;
    ss+=S/600; S%=600;
    ss+=S/60; S%=60;
    ss+=S/30; S%=30;
    ss+=S/10;</p>
<pre><code>sm+=A/600; A%=600;
sm+=A/60; A%=60;
sm+=A/30; A%=30;
sm+=A/10;
cout&lt;&lt;min(ss,sm);</code></pre><p>}</p>
<pre><code></code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[백준 23562 ㄷ 만들기]]></title>
            <link>https://velog.io/@y-siro/%EB%B0%B1%EC%A4%80-23562-%E3%84%B7-%EB%A7%8C%EB%93%A4%EA%B8%B0</link>
            <guid>https://velog.io/@y-siro/%EB%B0%B1%EC%A4%80-23562-%E3%84%B7-%EB%A7%8C%EB%93%A4%EA%B8%B0</guid>
            <pubDate>Mon, 20 Dec 2021 22:12:15 GMT</pubDate>
            <description><![CDATA[<p><a href="https://www.acmicpc.net/problem/23562">https://www.acmicpc.net/problem/23562</a></p>
<ul>
<li><p>브루트포스 알고리즘, 구현</p>
</li>
<li><p>풀이
ㄷ자를 만들 수 있는 모든 경우들을 확인했다.</p>
</li>
<li><p>코드</p>
<pre><code class="language-c">#include &lt;bits/stdc++.h&gt;
using namespace std;
#define fast ios_base::sync_with_stdio(false); cin.tie(NULL), cout.tie(NULL)
#define ll long long
#define vc vector
#define vi vector&lt;int&gt;
#define vs vector&lt;string&gt;
#define pb push_back
#define mp make_pair
#define pii pair&lt;int,int&gt;
#define pll pair&lt;ll,ll&gt;
</code></pre>
</li>
</ul>
<p>int n, m, a, b, mv=(int)1e9;
bool A[22][22];
bool visited[22][22];</p>
<p>void ch3(int x, int y) {
    int cnt = 0;
    memset(visited, false, sizeof(visited));
    for (int i = y; i &lt; y + 3; ++i) {
        if (!A[x][i]) cnt += a;
        visited[x][i] = true;
    }
    if (!A[x + 1][y]) cnt += a;
    visited[x + 1][y] = true;
    for (int i = y; i &lt; y + 3; ++i) {
        if (!A[x + 2][i]) cnt += a;
        visited[x + 2][i] = true;
    }
    for (int i = 0; i &lt; n; ++i) {
        for (int j = 0; j &lt; m; ++j) {
            if (!visited[i][j] and A[i][j]) cnt += b;
        }
    }
    mv = min(mv, cnt);<br>}</p>
<p>void ch6(int x, int y) {
    int cnt = 0;
    memset(visited, false, sizeof(visited));
    for (int i = y; i &lt; y + 6; ++i) {
        if (!A[x][i]) cnt += a;
        visited[x][i] = true;
    }
    for (int i = y; i &lt; y + 6; ++i) {
        if (!A[x+1][i]) cnt += a;
        visited[x+1][i] = true;
    }
    for (int i = y; i &lt; y + 2; ++i) {
        if (!A[x + 2][i]) cnt += a;
        visited[x + 2][i] = true;
    }
    for (int i = y; i &lt; y + 2; ++i) {
        if (!A[x + 3][i]) cnt += a;
        visited[x + 3][i] = true;
    }
    for (int i = y; i &lt; y + 6; ++i) {
        if (!A[x + 4][i]) cnt += a;
        visited[x + 4][i] = true;
    }
    for (int i = y; i &lt; y + 6; ++i) {
        if (!A[x + 5][i]) cnt += a;
        visited[x + 5][i] = true;
    }
    for (int i = 0; i &lt; n; ++i) {
        for (int j = 0; j &lt; m; ++j) {
            if (!visited[i][j] and A[i][j]) cnt += b;
        }
    }
    mv = min(mv, cnt);
}</p>
<p>void ch9(int x, int y) {
    int cnt = 0;
    memset(visited, false, sizeof(visited));
    for (int i = y; i &lt; y + 9; ++i) {
        if (!A[x][i]) cnt += a;
        visited[x][i] = true;
    }
    for (int i = y; i &lt; y + 9; ++i) {
        if (!A[x+1][i]) cnt += a;
        visited[x+1][i] = true;
    }
    for (int i = y; i &lt; y + 9; ++i) {
        if (!A[x+2][i]) cnt += a;
        visited[x+2][i] = true;
    }
    for (int i = y; i &lt; y + 3; ++i) {
        if (!A[x + 3][i]) cnt += a;
        visited[x + 3][i] = true;
    }
    for (int i = y; i &lt; y + 3; ++i) {
        if (!A[x + 4][i]) cnt += a;
        visited[x + 4][i] = true;
    }
    for (int i = y; i &lt; y + 3; ++i) {
        if (!A[x + 5][i]) cnt += a;
        visited[x + 5][i] = true;
    }
    for (int i = y; i &lt; y + 9; ++i) {
        if (!A[x + 6][i]) cnt += a;
        visited[x + 6][i] = true;
    }
    for (int i = y; i &lt; y + 9; ++i) {
        if (!A[x + 7][i]) cnt += a;
        visited[x + 7][i] = true;
    }
    for (int i = y; i &lt; y + 9; ++i) {
        if (!A[x + 8][i]) cnt += a;
        visited[x + 8][i] = true;
    }
    for (int i = 0; i &lt; n; ++i) {
        for (int j = 0; j &lt; m; ++j) {
            if (!visited[i][j] and A[i][j]) cnt += b;
        }
    }
    mv = min(mv, cnt);
}</p>
<p>void ch12(int x, int y) {
    int cnt = 0;
    memset(visited, false, sizeof(visited));
    for (int i = y; i &lt; y + 12; ++i) {
        if (!A[x][i]) cnt += a;
        visited[x][i] = true;
    }
    for (int i = y; i &lt; y + 12; ++i) {
        if (!A[x+1][i]) cnt += a;
        visited[x+1][i] = true;
    }
    for (int i = y; i &lt; y + 12; ++i) {
        if (!A[x+2][i]) cnt += a;
        visited[x+2][i] = true;
    }
    for (int i = y; i &lt; y + 12; ++i) {
        if (!A[x+3][i]) cnt += a;
        visited[x+3][i] = true;
    }
    for (int i = y; i &lt; y + 4; ++i) {
        if (!A[x+4][i]) cnt += a;
        visited[x+4][i] = true;
    }
    for (int i = y; i &lt; y + 4; ++i) {
        if (!A[x+5][i]) cnt += a;
        visited[x+5][i] = true;
    }
    for (int i = y; i &lt; y + 4; ++i) {
        if (!A[x+6][i]) cnt += a;
        visited[x+6][i] = true;
    }
    for (int i = y; i &lt; y + 4; ++i) {
        if (!A[x+7][i]) cnt += a;
        visited[x+7][i] = true;
    }
    for (int i = y; i &lt; y + 12; ++i) {
        if (!A[x+8][i]) cnt += a;
        visited[x+8][i] = true;
    }
    for (int i = y; i &lt; y + 12; ++i) {
        if (!A[x+9][i]) cnt += a;
        visited[x+9][i] = true;
    }
    for (int i = y; i &lt; y + 12; ++i) {
        if (!A[x+10][i]) cnt += a;
        visited[x+10][i] = true;
    }
    for (int i = y; i &lt; y + 12; ++i) {
        if (!A[x+11][i]) cnt += a;
        visited[x+11][i] = true;
    }
    for (int i = 0; i &lt; n; ++i) {
        for (int j = 0; j &lt; m; ++j) {
            if (!visited[i][j] and A[i][j]) cnt += b;
        }
    }
    mv = min(mv, cnt);
}</p>
<p>void ch15(int x, int y) {
    int cnt = 0;
    memset(visited, false, sizeof(visited));
    for (int i = y; i &lt; y + 15; ++i) {
        if (!A[x][i]) cnt += a;
        visited[x][i] = true;
    }
    for (int i = y; i &lt; y + 15; ++i) {
        if (!A[x+1][i]) cnt += a;
        visited[x+1][i] = true;
    }
    for (int i = y; i &lt; y + 15; ++i) {
        if (!A[x+2][i]) cnt += a;
        visited[x+2][i] = true;
    }
    for (int i = y; i &lt; y + 15; ++i) {
        if (!A[x+3][i]) cnt += a;
        visited[x+3][i] = true;
    }
    for (int i = y; i &lt; y + 15; ++i) {
        if (!A[x+4][i]) cnt += a;
        visited[x+4][i] = true;
    }
    for (int i = y; i &lt; y + 5; ++i) {
        if (!A[x+5][i]) cnt += a;
        visited[x+5][i] = true;
    }
    for (int i = y; i &lt; y + 5; ++i) {
        if (!A[x+6][i]) cnt += a;
        visited[x+6][i] = true;
    }
    for (int i = y; i &lt; y + 5; ++i) {
        if (!A[x+7][i]) cnt += a;
        visited[x+7][i] = true;
    }
    for (int i = y; i &lt; y + 5; ++i) {
        if (!A[x+8][i]) cnt += a;
        visited[x+8][i] = true;
    }
    for (int i = y; i &lt; y + 5; ++i) {
        if (!A[x+9][i]) cnt += a;
        visited[x+9][i] = true;
    }
    for (int i = y; i &lt; y + 15; ++i) {
        if (!A[x+10][i]) cnt += a;
        visited[x+10][i] = true;
    }
    for (int i = y; i &lt; y + 15; ++i) {
        if (!A[x+11][i]) cnt += a;
        visited[x+11][i] = true;
    }
    for (int i = y; i &lt; y + 15; ++i) {
        if (!A[x+12][i]) cnt += a;
        visited[x+12][i] = true;
    }
    for (int i = y; i &lt; y + 15; ++i) {
        if (!A[x+13][i]) cnt += a;
        visited[x+13][i] = true;
    }
    for (int i = y; i &lt; y + 15; ++i) {
        if (!A[x+14][i]) cnt += a;
        visited[x+14][i] = true;
    }</p>
<pre><code>for (int i = 0; i &lt; n; ++i) {
    for (int j = 0; j &lt; m; ++j) {
        if (!visited[i][j] and A[i][j]) cnt += b;
    }
}
mv = min(mv, cnt);</code></pre><p>}</p>
<p>void ch18(int x, int y) {
    int cnt = 0;
    memset(visited, false, sizeof(visited));
    for (int i = y; i &lt; y + 18; ++i) {
        if (!A[x][i]) cnt += a;
        visited[x][i] = true;
    }
    for (int i = y; i &lt; y + 18; ++i) {
        if (!A[x+1][i]) cnt += a;
        visited[x+1][i] = true;
    }
    for (int i = y; i &lt; y + 18; ++i) {
        if (!A[x+2][i]) cnt += a;
        visited[x+2][i] = true;
    }
    for (int i = y; i &lt; y + 18; ++i) {
        if (!A[x+3][i]) cnt += a;
        visited[x+3][i] = true;
    }
    for (int i = y; i &lt; y + 18; ++i) {
        if (!A[x+4][i]) cnt += a;
        visited[x+4][i] = true;
    }
    for (int i = y; i &lt; y + 18; ++i) {
        if (!A[x+5][i]) cnt += a;
        visited[x+5][i] = true;
    }
    for (int i = y; i &lt; y + 6; ++i) {
        if (!A[x+6][i]) cnt += a;
        visited[x+6][i] = true;
    }
    for (int i = y; i &lt; y + 6; ++i) {
        if (!A[x+7][i]) cnt += a;
        visited[x+7][i] = true;
    }
    for (int i = y; i &lt; y + 6; ++i) {
        if (!A[x+8][i]) cnt += a;
        visited[x+8][i] = true;
    }
    for (int i = y; i &lt; y + 6; ++i) {
        if (!A[x+9][i]) cnt += a;
        visited[x+9][i] = true;
    }
    for (int i = y; i &lt; y + 6; ++i) {
        if (!A[x+10][i]) cnt += a;
        visited[x+10][i] = true;
    }
    for (int i = y; i &lt; y + 6; ++i) {
        if (!A[x+11][i]) cnt += a;
        visited[x+11][i] = true;
    }
    for (int i = y; i &lt; y + 18; ++i) {
        if (!A[x+12][i]) cnt += a;
        visited[x+12][i] = true;
    }
    for (int i = y; i &lt; y + 18; ++i) {
        if (!A[x+13][i]) cnt += a;
        visited[x+13][i] = true;
    }
    for (int i = y; i &lt; y + 18; ++i) {
        if (!A[x+14][i]) cnt += a;
        visited[x+14][i] = true;
    }
    for (int i = y; i &lt; y + 18; ++i) {
        if (!A[x+15][i]) cnt += a;
        visited[x+15][i] = true;
    }
    for (int i = y; i &lt; y + 18; ++i) {
        if (!A[x+16][i]) cnt += a;
        visited[x+16][i] = true;
    }
    for (int i = y; i &lt; y + 18; ++i) {
        if (!A[x+17][i]) cnt += a;
        visited[x+17][i] = true;
    }
    for (int i = 0; i &lt; n; ++i) {
        for (int j = 0; j &lt; m; ++j) {
            if (!visited[i][j] and A[i][j]) cnt += b;
        }
    }</p>
<pre><code>mv = min(mv, cnt);</code></pre><p>}</p>
<p>int main(void) {
    fast;
    cin &gt;&gt; n &gt;&gt; m &gt;&gt; a &gt;&gt; b;
    for (int i = 0; i &lt; n; ++i) {
        for (int j = 0; j &lt; m; ++j) {
            char c; cin &gt;&gt; c;
            if (c == &#39;#&#39;) A[i][j] = true;
            else A[i][j] = false;
        }
    }
    int u = min(n, m);</p>
<pre><code>if (u &gt;= 18) {
    for (int i = 0; i &lt; n; ++i) {
        for (int j = 0; j &lt; m; ++j) {
            if (i + 2 &lt; n and j + 2 &lt; m) ch3(i, j);
            if (i + 5 &lt; n and j + 5 &lt; m) ch6(i, j);
            if (i + 8 &lt; n and j + 8 &lt; m) ch9(i, j);
            if (i + 11 &lt; n and j + 11 &lt; m) ch12(i, j);
            if (i + 14 &lt; n and j + 14 &lt; m) ch15(i, j);
            if (i + 17 &lt; n and j + 17 &lt; m) ch18(i, j);
        }
    }
}
else if (u &gt;= 15) {
    for (int i = 0; i &lt; n; ++i) {
        for (int j = 0; j &lt; m; ++j) {
            if (i + 2 &lt; n and j + 2 &lt; m) ch3(i, j);
            if (i + 5 &lt; n and j + 5 &lt; m) ch6(i, j);
            if (i + 8 &lt; n and j + 8 &lt; m) ch9(i, j);
            if (i + 11 &lt; n and j + 11 &lt; m) ch12(i, j);
            if (i + 14 &lt; n and j + 14 &lt; m) ch15(i, j);
        }
    }
}
else if (u &gt;= 12) {
    for (int i = 0; i &lt; n; ++i) {
        for (int j = 0; j &lt; m; ++j) {
            if (i + 2 &lt; n and j + 2 &lt; m) ch3(i, j);
            if (i + 5 &lt; n and j + 5 &lt; m) ch6(i, j);
            if (i + 8 &lt; n and j + 8 &lt; m) ch9(i, j);
            if (i + 11 &lt; n and j + 11 &lt; m) ch12(i, j);
        }
    }
}
else if (u &gt;= 9) {
    for (int i = 0; i &lt; n; ++i) {
        for (int j = 0; j &lt; m; ++j) {
            if (i + 2 &lt; n and j + 2 &lt; m) ch3(i, j);
            if (i + 5 &lt; n and j + 5 &lt; m) ch6(i, j);
            if (i + 8 &lt; n and j + 8 &lt; m) ch9(i, j);
        }
    }
}
else if (u &gt;= 6) {
    for (int i = 0; i &lt; n; ++i) {
        for (int j = 0; j &lt; m; ++j) {
            if (i + 2 &lt; n and j + 2 &lt; m) ch3(i, j);
            if (i + 5 &lt; n and j + 5 &lt; m) ch6(i, j);
        }
    }
}
else if (u &gt;= 3) {
    for (int i = 0; i &lt; n; ++i) {
        for (int j = 0; j &lt; m; ++j) {
            if(i+2&lt;n and j+2 &lt; m) ch3(i, j);
        }
    }
}        
cout &lt;&lt; mv;</code></pre><p>}</p>
<p>```</p>
<ul>
<li>딱 떠오르는 풀이가 없어서 모든 경우의 수들을 확인했습니다.... </li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[백준 23847 INU 막대기]]></title>
            <link>https://velog.io/@y-siro/%EB%B0%B1%EC%A4%80-23847-INU-%EB%A7%89%EB%8C%80%EA%B8%B0</link>
            <guid>https://velog.io/@y-siro/%EB%B0%B1%EC%A4%80-23847-INU-%EB%A7%89%EB%8C%80%EA%B8%B0</guid>
            <pubDate>Mon, 20 Dec 2021 02:50:33 GMT</pubDate>
            <description><![CDATA[<p><a href="https://www.acmicpc.net/problem/23847">https://www.acmicpc.net/problem/23847</a></p>
<ul>
<li><p>그래프 이론, 애드 혹, 많은 조건 분기</p>
</li>
<li><p>풀이
각각 I, N, U을 그래프의 정점으로 생각하여 연결되어 있는지를 확인한다.
다 연결되있다면 모든 값들의 합이 답이고 그 외는 간선들의 합을 비교하여 찾는다.</p>
</li>
<li><p>코드</p>
<pre><code class="language-c">#include &lt;bits/stdc++.h&gt;
using namespace std;
#define fast ios_base::sync_with_stdio(false); cin.tie(NULL), cout.tie(NULL)
#define ll long long
</code></pre>
</li>
</ul>
<p>int N;
int ii=0,nn=0,uu=0;
int in=0, iu=0,nu=0;
int ctin=0, ctiu=0, ctnu=0;</p>
<p>int main(void){
    fast;
    cin&gt;&gt;N;
    for(int i=0;i&lt;N;++i) {
        string s; int n;
        cin&gt;&gt;s&gt;&gt;n;
        if(s[0]==s[1]){
            if(s[0]==&#39;I&#39;) ii+=n;
            else if(s[0]==&#39;N&#39;) nn+=n;
            else uu+=n;
        }
        else{
            if((s[0]==&#39;I&#39; and s[1]==&#39;N&#39;) or s[0]==&#39;N&#39; and s[1]==&#39;I&#39;) {
                in+=n; ctin++;
            }
            if((s[0]==&#39;I&#39; and s[1]==&#39;U&#39;) or s[0]==&#39;U&#39; and s[1]==&#39;I&#39;) {
                iu+=n; ctiu++;
            }
            if((s[0]==&#39;N&#39; and s[1]==&#39;U&#39;) or s[0]==&#39;U&#39; and s[1]==&#39;N&#39;) {
                nu+=n; ctnu++;
            }
        }
    }
    if((ctin and ctiu and ctnu) or (ctin and ctiu and !ctnu) or (ctin and !ctiu and ctnu) or (!ctin and ctiu and ctnu)){
        cout&lt;&lt;ii+nn+uu+in+iu+nu; return 0;
    }</p>
<pre><code>if(ctin and !ctiu and !ctnu) {
    cout&lt;&lt;max(uu,ii+nn+in); return 0;
}

if(!ctin and ctiu and !ctnu) {
    cout&lt;&lt;max(nn,ii+uu+iu); return 0;
}

if(!ctin and !ctiu and ctnu) {
    cout&lt;&lt;max(ii,nn+uu+nu); return 0;
}
if(!ctin and !ctiu and !ctnu){
    cout&lt;&lt;max(ii,max(nn,uu)); return 0;
}</code></pre><p>}
```</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[백준 23845 마트료시카]]></title>
            <link>https://velog.io/@y-siro/%EB%B0%B1%EC%A4%80-23845-%EB%A7%88%ED%8A%B8%EB%A3%8C%EC%8B%9C%EC%B9%B4</link>
            <guid>https://velog.io/@y-siro/%EB%B0%B1%EC%A4%80-23845-%EB%A7%88%ED%8A%B8%EB%A3%8C%EC%8B%9C%EC%B9%B4</guid>
            <pubDate>Mon, 20 Dec 2021 02:45:31 GMT</pubDate>
            <description><![CDATA[<p><a href="https://www.acmicpc.net/problem/23845">https://www.acmicpc.net/problem/23845</a></p>
<ul>
<li><p>그리디 알고리즘</p>
</li>
<li><p>풀이
마트료시카를 가장 길게 만드는 것이 수익을 최대로 얻을 수 있으므로 가장 작은 값부터 최대한 긴 마트료시카를 얻는 것을 반복한다.</p>
</li>
<li><p>코드</p>
<pre><code class="language-c">#include &lt;bits/stdc++.h&gt;
using namespace std;
#define fast ios_base::sync_with_stdio(false); cin.tie(NULL), cout.tie(NULL)
#define ll long long
</code></pre>
</li>
</ul>
<p>ll N,ans=0;
vector<int> v;
ll m[202020];</p>
<p>int main(void){
    fast;
    cin&gt;&gt;N;
    memset(m,0,sizeof(m));
    v.resize(N);
    for(int i=0;i&lt;N;++i) {
        cin&gt;&gt;v[i]; m[v[i]]++;
    }</p>
<pre><code>sort(v.begin(),v.end());
ll Q,cnt;
for(int i=0;i&lt;N;++i){
    if(m[v[i]]){
        m[v[i]]--;
        Q=v[i], cnt=1;
        for(int j=v[i]+1;;++j){
            if(m[j]){
                Q=j; m[j]--; cnt++;
            }
            else{
                ans+=Q*cnt;
                break;
            }
        }
    }
}
cout&lt;&lt;ans;</code></pre><p>}</p>
<pre><code></code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[백준 23843 콘센트]]></title>
            <link>https://velog.io/@y-siro/%EB%B0%B1%EC%A4%80-23843-%EC%BD%98%EC%84%BC%ED%8A%B8</link>
            <guid>https://velog.io/@y-siro/%EB%B0%B1%EC%A4%80-23843-%EC%BD%98%EC%84%BC%ED%8A%B8</guid>
            <pubDate>Mon, 20 Dec 2021 02:37:17 GMT</pubDate>
            <description><![CDATA[<p><a href="https://www.acmicpc.net/problem/23843">https://www.acmicpc.net/problem/23843</a></p>
<ul>
<li><p>자료 구조, 그리디 알고리즘, 정렬, 우선순위 큐</p>
</li>
<li><p>풀이 </p>
</li>
</ul>
<ol>
<li>먼저 충전해야할 전자기기들을 충전 시간이 긴 순으로 정렬한다.</li>
<li>priority queue 구조인 사용 가능한 콘센트에 전부 충전시킨다.</li>
<li>먼저 끝나는 콘센트부터 다음으로 충전 시간이 긴 기기를 충전시킨다. 즉 priority queue의 top부터 갱신한다.</li>
<li>가장 오래 충전하는 콘센트의 시간을 출력한다.</li>
</ol>
<ul>
<li>코드<pre><code class="language-c">#include &lt;bits/stdc++.h&gt;
using namespace std;
#define fast ios_base::sync_with_stdio(false); cin.tie(NULL), cout.tie(NULL)
#define ll long long
</code></pre>
</li>
</ul>
<p>int N,M,ans=0,idx=0;
priority_queue&lt;int,vector<int>,greater<int>&gt; qq;</p>
<p>int main(void){
    fast;
    cin&gt;&gt;N&gt;&gt;M;
    vector<int> v(N);
    for(int i=0;i&lt;N;++i) cin&gt;&gt;v[i];
    sort(v.begin(),v.end(), greater<int>());</p>
<pre><code>if(M==1){
    for(int i=0;i&lt;N;++i){
        ans+=v[i];
    }
    cout&lt;&lt;ans; return 0;
}

if(N&lt;M){
    int mv=0;
    for(int i=0;i&lt;N;++i) mv=max(v[i],mv);
    cout&lt;&lt;mv; return 0;
}

for(int i=0;i&lt;M;++i) qq.push(v[i]);
idx+=M;

while(idx&lt;N){
    int ns=qq.top(); qq.pop();
    while(ns&lt;=qq.top() and idx&lt;N){
        ns+=v[idx]; idx++;
    }
    qq.push(ns);
}
for(int i=0;i&lt;M-1;++i) qq.pop();
cout&lt;&lt;qq.top();</code></pre><p>}</p>
<p>```</p>
<ul>
<li>M이 1일 때와 N보다 클 때는 예외처리하였다.
( M==1일 시 모든 충전기기의 합, M&gt;N일 시 가장 충전 시간이 긴 전자기기의 값이 정답이다. )</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[백준 23842 성냥개비]]></title>
            <link>https://velog.io/@y-siro/%EB%B0%B1%EC%A4%80-23842-%EC%84%B1%EB%83%A5%EA%B0%9C%EB%B9%84</link>
            <guid>https://velog.io/@y-siro/%EB%B0%B1%EC%A4%80-23842-%EC%84%B1%EB%83%A5%EA%B0%9C%EB%B9%84</guid>
            <pubDate>Sun, 19 Dec 2021 23:47:08 GMT</pubDate>
            <description><![CDATA[<p><a href="https://www.acmicpc.net/problem/23842">https://www.acmicpc.net/problem/23842</a></p>
<ul>
<li><p>브루트포스 알고리즘</p>
</li>
<li><p>풀이
올바른 수식을 찾아 반복문을 수행한다. 항상 두 자릿수에 맞게 표현해야 한다는 조건으로 출력한다.</p>
</li>
<li><p>코드</p>
<pre><code class="language-c">#include &lt;bits/stdc++.h&gt;
using namespace std;
#define fast ios_base::sync_with_stdio(false); cin.tie(NULL), cout.tie(NULL)
#define ll long long
</code></pre>
</li>
</ul>
<p>int main(void){
    fast;
    int N; cin&gt;&gt;N;
    int a[10]={6,2,5,5,4,5,6,3,7,6};</p>
<pre><code>N-=4;
for(int i=0;i&lt;10;++i){
    for(int j=0;j&lt;10;++j){
        for(int l=0;l&lt;10;++l){
            for(int k=0;k&lt;10;++k){
                for(int h=0;h&lt;10;++h){
                    for(int g=0;g&lt;10;++g){
                        if((a[i]+a[j]+a[l]+a[k]+a[h]+a[g]==N) and (i*10+j+l*10+k==h*10+g)) {
                            cout&lt;&lt;i&lt;&lt;j&lt;&lt;&#39;+&#39;&lt;&lt;l&lt;&lt;k&lt;&lt;&#39;=&#39;&lt;&lt;h&lt;&lt;g; return 0;
                        }
                    }
                }
            }
        }
    }
}
cout&lt;&lt;&quot;impossible&quot;;</code></pre><p>}
```</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[백준 23841 데칼코마니]]></title>
            <link>https://velog.io/@y-siro/%EB%B0%B1%EC%A4%80-23841-%EB%8D%B0%EC%B9%BC%EC%BD%94%EB%A7%88%EB%8B%88</link>
            <guid>https://velog.io/@y-siro/%EB%B0%B1%EC%A4%80-23841-%EB%8D%B0%EC%B9%BC%EC%BD%94%EB%A7%88%EB%8B%88</guid>
            <pubDate>Sun, 19 Dec 2021 23:43:32 GMT</pubDate>
            <description><![CDATA[<p><a href="https://www.acmicpc.net/problem/23841">https://www.acmicpc.net/problem/23841</a></p>
<ul>
<li><p>구현, 문자열</p>
</li>
<li><p>풀이
좌우 방향으로 포개어 접으므로 올바른 위치로 물감을 복사시켜주면 된다.</p>
</li>
<li><p>코드</p>
<pre><code class="language-c">#include &lt;bits/stdc++.h&gt;
using namespace std;
#define fast ios_base::sync_with_stdio(false); cin.tie(NULL), cout.tie(NULL)
#define ll long long
</code></pre>
</li>
</ul>
<p>int N,M;
char m[55][55];</p>
<p>int main(void){
    fast;
    cin&gt;&gt;N&gt;&gt;M;
    for(int i=0;i&lt;N;++i){
        for(int j=0;j&lt;M;++j){
            cin&gt;&gt;m[i][j];
        }
    }</p>
<pre><code>for(int i=0;i&lt;N;++i){
    for(int j=0;j&lt;M;++j){
        if(m[i][j]!=&#39;.&#39;){
            m[i][M-j-1]=m[i][j];
        }
    }
}

for(int i=0;i&lt;N;++i){
    for(int j=0;j&lt;M;++j){
        cout&lt;&lt;m[i][j];
    }
    cout&lt;&lt;&quot;\n&quot;;
}</code></pre><p>}</p>
<pre><code></code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[백준 1890 점프]]></title>
            <link>https://velog.io/@y-siro/%EB%B0%B1%EC%A4%80-1890-%EC%A0%90%ED%94%84</link>
            <guid>https://velog.io/@y-siro/%EB%B0%B1%EC%A4%80-1890-%EC%A0%90%ED%94%84</guid>
            <pubDate>Sat, 18 Dec 2021 12:52:20 GMT</pubDate>
            <description><![CDATA[<p><a href="https://www.acmicpc.net/problem/1890">https://www.acmicpc.net/problem/1890</a></p>
<ul>
<li><p>다이나믹 프로그래밍</p>
</li>
<li><p>풀이</p>
</li>
</ul>
<ol>
<li>dp 배열과 정답 배열 두개를 만들고, dp 배열에서 오른쪽과 아래로 이동했을 때, 숫자가 N보다 크지 않으면 정답 배열에 경우의 수 합을 넣는다.
(arr[i+d[i][j]][j]+=ans[i][j])</li>
<li>마지막 (N,N)칸에서 한번 더 경우의 수들을 더해주지 않도록 한다.
if .... !(i==N and j==N)</li>
<li>값이 int보다 커질 수 있으므로 long long 자료형을 사용한다.</li>
</ol>
<ul>
<li>코드<pre><code class="language-c">#include &lt;bits/stdc++.h&gt;
using namespace std;
#define fast ios_base::sync_with_stdio(false); cin.tie(NULL), cout.tie(NULL)
#define ll long long
#define vc vector
#define vi vector&lt;int&gt;
#define vs vector&lt;string&gt;
#define pb push_back
#define mp make_pair
#define pii pair&lt;int,int&gt;
#define pll pair&lt;ll,ll&gt;
</code></pre>
</li>
</ul>
<p>ll N;
ll d[101][101], ans[101][101];</p>
<p>int main(void){
    fast;
    cin&gt;&gt;N;
    for(int i=1;i&lt;=N;++i){
        for(int j=1;j&lt;=N;++j){
            cin&gt;&gt;d[i][j];
        }
    }
    memset(ans,0,sizeof(ans));
    ans[1][1]=1;
    for(int i=1;i&lt;=N;++i){
        for(int j=1;j&lt;=N;++j){
            if(i+d[i][j]&lt;=N and ans[i][j] and !(i==N and j==N)) ans[i+d[i][j]][j]+=ans[i][j];
            if(j+d[i][j]&lt;=N and ans[i][j] and !(i==N and j==N)) ans[i][j+d[i][j]]+=ans[i][j];
        }
    }
    cout&lt;&lt;ans[N][N];
}</p>
<pre><code></code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[백준 12851 숨바꼭질 2]]></title>
            <link>https://velog.io/@y-siro/%EB%B0%B1%EC%A4%80-12851-%EC%88%A8%EB%B0%94%EA%BC%AD%EC%A7%88-2</link>
            <guid>https://velog.io/@y-siro/%EB%B0%B1%EC%A4%80-12851-%EC%88%A8%EB%B0%94%EA%BC%AD%EC%A7%88-2</guid>
            <pubDate>Thu, 16 Dec 2021 00:04:58 GMT</pubDate>
            <description><![CDATA[<p><a href="https://www.acmicpc.net/problem/12851">https://www.acmicpc.net/problem/12851</a></p>
<ul>
<li>너비 우선 탐색</li>
<li>풀이
세 가지 방법(한 칸 뒤로, 한 칸 앞으로, 현재 칸의 두 배인 위치로)으로 이동할 수 있습니다. pop할 때 visited를 check해야 다른 경우들을 고려할 수 있습니다.</li>
</ul>
<pre><code class="language-c">#include &lt;bits/stdc++.h&gt;
using namespace std;
#define fast ios_base::sync_with_stdio(false); cin.tie(NULL), cout.tie(NULL)
#define ll long long
#define vc vector
#define vi vector&lt;int&gt;
#define vs vector&lt;string&gt;
#define pb push_back
#define mp make_pair
#define pii pair&lt;int,int&gt;
#define pll pair&lt;ll,ll&gt;

// 12851 숨바꼭질2

int N,K,ans,ac=0;
bool visited[101010];
queue&lt;pii&gt; q;

void bfs(int x){
    visited[x]=true;
    q.push({x,0});
    while(!q.empty()){
        int x=q.front().first, cnt=q.front().second;
        q.pop();
        visited[x]=true;
        if(x==K and ac){
            if(cnt==ans) ac++;
        }
        if(x==K and !ac){
            ans=cnt; ac++;
        }


        for(int i=0;i&lt;3;++i){
            if(i==0) {
                int nx=x-1;
                if(nx&gt;=0 and !visited[nx]){
                    q.push({nx,cnt+1});
                }
            }
            else if(i==1) {
                int nx=x+1;
                if(nx&lt;101010 and !visited[nx]){
                    q.push({nx,cnt+1});
                }
            }
            else {
                int nx=x*2;
                if(nx&lt;101010 and !visited[nx]){
                    q.push({nx,cnt+1});
                }
            }


        }
    }
    cout&lt;&lt;ans&lt;&lt;&quot;\n&quot;&lt;&lt;ac;
}

int main(void){
    fast;
    memset(visited,false,sizeof(visited));
    cin&gt;&gt;N&gt;&gt;K;
    bfs(N);
}</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[백준 1600 말이 되고픈 원숭이]]></title>
            <link>https://velog.io/@y-siro/%EB%B0%B1%EC%A4%80-1600-%EB%A7%90%EC%9D%B4-%EB%90%98%EA%B3%A0%ED%94%88-%EC%9B%90%EC%88%AD%EC%9D%B4</link>
            <guid>https://velog.io/@y-siro/%EB%B0%B1%EC%A4%80-1600-%EB%A7%90%EC%9D%B4-%EB%90%98%EA%B3%A0%ED%94%88-%EC%9B%90%EC%88%AD%EC%9D%B4</guid>
            <pubDate>Tue, 14 Dec 2021 16:05:59 GMT</pubDate>
            <description><![CDATA[<p><a href="https://www.acmicpc.net/problem/1600">https://www.acmicpc.net/problem/1600</a></p>
<ul>
<li>너비 우선 탐색</li>
<li>풀이 
특정 횟수 만큼 장기 &#39;마&#39; 처럼 점프할 수 있는 BFS문제입니다. 3차원 방문 배열을 사용하여 점프하는 경우와 인접한 곳으로 이동하는 경우를 둘다 살펴봐야 합니다.</li>
</ul>
<pre><code>#include &lt;bits/stdc++.h&gt;
using namespace std;
#define fast ios_base::sync_with_stdio(false); cin.tie(NULL), cout.tie(NULL)
#define vc vector
#define vi vector&lt;int&gt;
#define vs vector&lt;string&gt;
#define pb push_back
#define mp make_pair
#define pii pair&lt;int,int&gt;
#define pll pair&lt;ll,ll&gt;
using ll = long long;

// 1600 말이 되고픈 원숭이

int K, W, H;
int m[202][202];
bool visited[202][202][31];
int d[4][2] = { {0,1},{0,-1},{1,0},{-1,0} };
int dh[8][2] = { {-2,1},{-1,2},{1,2},{2,1},{2,-1},{1,-2},{-1,-2},{-2,-1} };
queue&lt;pair&lt;pii, pii&gt; &gt;q;

void bfs(int x, int y, int hc, int cnt) { // hc : K 남은 횟수, cnt : 이동 거리 카운트
    visited[x][y][hc] = true;
    q.push({ {x,y},{hc,cnt} });
    while (!q.empty()) {
        int x = q.front().first.first, y = q.front().first.second, hc = q.front().second.first, cnt = q.front().second.second;
        q.pop();
        if (x == H - 1 and y == W - 1) {
            cout &lt;&lt; cnt; return;
        }

        if (hc&gt;0) {
            for (int j = 0; j &lt; 8; ++j) {
                int nx = x + dh[j][0], ny = y + dh[j][1];
                if (nx &lt; 0 or nx &gt;= H or ny &lt; 0 or ny &gt;= W) continue;
                if (!visited[nx][ny][hc-1] and !m[nx][ny]) {
                    visited[nx][ny][hc-1] = true;
                    q.push({ {nx,ny},{hc - 1,cnt + 1} });
                }
            }
        }

        for (int i = 0; i &lt; 4; ++i) {
            int nx = x + d[i][0], ny = y + d[i][1];
            if (nx &lt; 0 or nx &gt;= H or ny &lt; 0 or ny &gt;= W) continue;
            if (!visited[nx][ny][hc] and !m[nx][ny]) {
                visited[nx][ny][hc] = true;
                q.push({ {nx,ny},{hc,cnt + 1} });
            }
        }
    }
    cout &lt;&lt; -1;
}



int main(void) {
    fast;
    cin &gt;&gt; K &gt;&gt; W &gt;&gt; H;
    for (int i = 0; i &lt; H; ++i) {
        for (int j = 0; j &lt; W; ++j) {
            cin &gt;&gt; m[i][j];
        }
    }
    bfs(0, 0, K, 0);    
}</code></pre><ul>
<li>W, H를 반대로 생각해서 헷갈렸던 문제입니다.</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[백준 5014 스타트링크]]></title>
            <link>https://velog.io/@y-siro/BOJ-5014-%EC%8A%A4%ED%83%80%ED%8A%B8%EB%A7%81%ED%81%AC</link>
            <guid>https://velog.io/@y-siro/BOJ-5014-%EC%8A%A4%ED%83%80%ED%8A%B8%EB%A7%81%ED%81%AC</guid>
            <pubDate>Tue, 14 Dec 2021 04:28:34 GMT</pubDate>
            <description><![CDATA[<p><a href="https://www.acmicpc.net/problem/5014">https://www.acmicpc.net/problem/5014</a></p>
<ul>
<li>너비 우선 탐색</li>
<li>풀이
기본 BFS 풀이를 적용했다. 이동할 수 있는 곳은 방문하지 않았던 up stair, down stair 두 군데이며, queue 에 넣기 전에 방문을 한 곳인지, 1층보다 더 내려 가는지 최고층보다 높이 올라가는지를 확인하여 push 했다.</li>
</ul>
<pre><code class="language-c">#include &lt;bits/stdc++.h&gt;
using namespace std;
#define fast ios_base::sync_with_stdio(false); cin.tie(NULL), cout.tie(NULL)
#define vc vector
#define vi vector&lt;int&gt;
#define vs vector&lt;string&gt;
#define pb push_back
#define mp make_pair
#define pii pair&lt;int,int&gt;
#define pll pair&lt;ll,ll&gt;
using ll = long long;

// 5014 스타트링크

int F, S, G, U, D; // F:총 층수, S:현재 위치, G: 스타트링크 위치, U: 위로가기 버튼 누를시, D: 내려가기 버튼 누를 시
bool visited[1010101];
vi v;
queue&lt;pii&gt; q;

void bfs(int cur, int cnt) {

    visited[cur] = true;
    q.push({ cur,cnt });

    while (!q.empty()) {
        int cur = q.front().first, cnt = q.front().second; q.pop();
        if (cur == G) {
            cout &lt;&lt; cnt; return;
        }
        for (int i = 0; i &lt; 2; ++i) {
            int nx = cur + v[i];
            if (nx &lt;= F and nx &gt;= 1 and !visited[nx]) {
                visited[nx] = true;
                q.push({ nx,cnt + 1 });
            }
        }
    }
    cout &lt;&lt; &quot;use the stairs&quot;;
}

int main(void) {
    fast;
    cin &gt;&gt; F &gt;&gt; S &gt;&gt; G &gt;&gt; U &gt;&gt; D;
    v.pb(U); v.pb(D * (-1));
    bfs(S, 0);
}</code></pre>
<p>- </p>
]]></description>
        </item>
        <item>
            <title><![CDATA[백준 23739 벼락치기]]></title>
            <link>https://velog.io/@y-siro/BOJ-23739-%EB%B2%BC%EB%9D%BD%EC%B9%98%EA%B8%B0</link>
            <guid>https://velog.io/@y-siro/BOJ-23739-%EB%B2%BC%EB%9D%BD%EC%B9%98%EA%B8%B0</guid>
            <pubDate>Mon, 13 Dec 2021 05:21:58 GMT</pubDate>
            <description><![CDATA[<p><a href="https://www.acmicpc.net/problem/23739">https://www.acmicpc.net/problem/23739</a></p>
<ul>
<li>구현, 수학</li>
<li>풀이
단순 구현 문제</li>
</ul>
<pre><code class="language-c">#include &lt;bits/stdc++.h&gt;
using namespace std;
#define fast ios_base::sync_with_stdio(false); cin.tie(NULL), cout.tie(NULL)
#define ll long long
#define vc vector
#define vi vector&lt;int&gt;
#define vs vector&lt;string&gt;
#define pb push_back
#define mp make_pair
#define pii pair&lt;int,int&gt;
#define pll pair&lt;ll,ll&gt;

// 23739 벼락치기

int N,ans=0,sum=0;
vi v;

int main(void){
    fast;
    cin&gt;&gt;N;
    v.resize(N);
    for(int i=0;i&lt;N;++i) {
        cin&gt;&gt;v[i];
        if((v[i]+1)/2&lt;=30-sum) ans++;
        sum+=v[i];
        if(sum&gt;=30) sum=0;
    }
    cout&lt;&lt;ans;
}</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[백준 23738 Ресторан]]></title>
            <link>https://velog.io/@y-siro/BOJ-23738</link>
            <guid>https://velog.io/@y-siro/BOJ-23738</guid>
            <pubDate>Mon, 13 Dec 2021 04:33:24 GMT</pubDate>
            <description><![CDATA[<p><a href="https://www.acmicpc.net/problem/23738">https://www.acmicpc.net/problem/23738</a></p>
<ul>
<li><p>구현, 문자열</p>
</li>
<li><p>풀이
매칭되는 문자열로 바꿔주면 바꿔주면 된다.</p>
</li>
</ul>
<pre><code class="language-c">#include &lt;bits/stdc++.h&gt;
using namespace std;
#define fast ios_base::sync_with_stdio(false); cin.tie(NULL), cout.tie(NULL)
#define ll long long
#define vc vector
#define vi vector&lt;int&gt;
#define vs vector&lt;string&gt;
#define pb push_back
#define mp make_pair
#define pii pair&lt;int,int&gt;
#define pll pair&lt;ll,ll&gt;

// 23738 Ресторан

int main(void){
    fast;
    string s, ans=&quot;&quot;; cin&gt;&gt;s;
    for(int i=0;i&lt;s.size();++i){
        if(s[i]==&#39;A&#39;) ans+=&quot;a&quot;;
        else if(s[i]==&#39;B&#39;) ans+=&quot;v&quot;;
        else if(s[i]==&#39;E&#39;) ans+=&quot;ye&quot;;
        else if(s[i]==&#39;K&#39;) ans+=&quot;k&quot;;
        else if(s[i]==&#39;M&#39;) ans+=&quot;m&quot;;
        else if(s[i]==&#39;H&#39;) ans+=&quot;n&quot;;
        else if(s[i]==&#39;O&#39;) ans+=&quot;o&quot;;
        else if(s[i]==&#39;P&#39;) ans+=&quot;r&quot;;
        else if(s[i]==&#39;C&#39;) ans+=&quot;s&quot;;
        else if(s[i]==&#39;T&#39;) ans+=&quot;t&quot;;
        else if(s[i]==&#39;Y&#39;) ans+=&quot;u&quot;;
        else ans+=&quot;h&quot;;
    }
    cout&lt;&lt;ans;
}</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[백준 23742 Player-based Team Distribution]]></title>
            <link>https://velog.io/@y-siro/BOJ-23742-Player-based-Team-Distribution</link>
            <guid>https://velog.io/@y-siro/BOJ-23742-Player-based-Team-Distribution</guid>
            <pubDate>Mon, 13 Dec 2021 03:02:00 GMT</pubDate>
            <description><![CDATA[<p><a href="https://www.acmicpc.net/problem/23742">https://www.acmicpc.net/problem/23742</a></p>
<ul>
<li>그리디 알고리즘, 정렬</li>
<li>풀이</li>
</ul>
<ol>
<li>점수를 받은 벡터를 정렬하고, 음수인 점수를 가진 인원들은 팀을 각각 따로 나누고 (음수 점수들의 합 : am), 양수인 점수를 가진 인원들은 하나의 팀 (ap)으로 묶는다.</li>
<li>음수인 점수를 가진 팀들 중에서 점수가 가장 큰 값을 가진 팀을 한 팀씩 ap 팀으로 보내면서 모든 플레이어의 점수의 합을 갱신한다.</li>
</ol>
<pre><code class="language-c">#include &lt;bits/stdc++.h&gt;
using namespace std;
#define fast ios_base::sync_with_stdio(false); cin.tie(NULL), cout.tie(NULL)
#define ll long long
#define vc vector
#define vi vector&lt;int&gt;
#define vs vector&lt;string&gt;
#define pb push_back
#define mp make_pair
#define pii pair&lt;int,int&gt;
#define pll pair&lt;ll,ll&gt;

// 23742 Player-based Team Distribution 

ll N, ans = 0, cnt = 0, idx=-1, am = 0, ap = 0;
vi v;

int main(void) {
    fast;
    cin &gt;&gt; N;
    v.resize(N);
    for (int i = 0; i &lt; N; ++i) cin &gt;&gt; v[i];
    sort(v.begin(), v.end());
    for (int i = 0; i &lt; N; ++i) {
        if (v[i] &lt; 0) am += v[i];
        if (v[i] &gt;= 0 and idx == -1) idx = i;
        if (v[i] &gt;= 0) ap += v[i];
    }
    ans = am + (N - idx) * ap;
    for (int i = idx - 1; i &gt;= 0; --i) {
        am -= v[i]; ap += v[i];
        ans = max(ans, am + (N - i) * ap);
    }

    cout &lt;&lt; ans;
}</code></pre>
<ul>
<li>합친 점수의 합들의 범위를 생각해 long long 자료형으로 선언하여 정답을 받았습니다.</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[백준 23740 버스 노선 개편하기]]></title>
            <link>https://velog.io/@y-siro/BOJ-23740-%EB%B2%84%EC%8A%A4-%EB%85%B8%EC%84%A0-%EA%B0%9C%ED%8E%B8%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@y-siro/BOJ-23740-%EB%B2%84%EC%8A%A4-%EB%85%B8%EC%84%A0-%EA%B0%9C%ED%8E%B8%ED%95%98%EA%B8%B0</guid>
            <pubDate>Mon, 13 Dec 2021 01:47:09 GMT</pubDate>
            <description><![CDATA[<p><a href="https://www.acmicpc.net/problem/23740">https://www.acmicpc.net/problem/23740</a></p>
<ul>
<li>풀이
주어진 N개의 노선들을 시작 구간을 기준으로 정렬 후, 스위핑 기법을 사용
가장 오른쪽 버스 노선의 e가 s보다 작다면 새로운 버스 노선을 만들어야 하고 크다면 e와 min_val(요금)을 변경</li>
</ul>
<pre><code class="language-c">#include &lt;bits/stdc++.h&gt;
using namespace std;
#define fast ios_base::sync_with_stdio(false); cin.tie(NULL), cout.tie(NULL)
#define ll long long
#define vc vector
#define vi vector&lt;int&gt;
#define vs vector&lt;string&gt;
#define pb push_back
#define mp make_pair
#define pii pair&lt;int,int&gt;
#define pll pair&lt;ll,ll&gt;

// 23740 버스 노선 개편하기

int N, cnt = 1;
vc&lt;pair&lt;pii, int&gt;&gt; v, ans;

int main(void) {
    fast;
    cin &gt;&gt; N;
    v.resize(N);
    for (int i = 0; i &lt; N; ++i) cin &gt;&gt; v[i].first.first &gt;&gt; v[i].first.second &gt;&gt; v[i].second;
    sort(v.begin(), v.end());

    int s = v[0].first.first, e = v[0].first.second, mv = v[0].second;
    for (int i = 1; i &lt; N; ++i) {
        if (v[i].first.first &gt; e) {
            cnt++;
            ans.pb({ {s,e},mv });
            s = v[i].first.first, e = v[i].first.second, mv = v[i].second;
        }
        else {
            e = max(e, v[i].first.second);
            mv = min(mv, v[i].second);
        }
    }
    ans.pb({ {s,e},mv });
    cout &lt;&lt; cnt &lt;&lt; &quot;\n&quot;;
    for (auto i : ans) cout &lt;&lt; i.first.first &lt;&lt; &#39; &#39; &lt;&lt; i.first.second &lt;&lt; &#39; &#39; &lt;&lt; i.second &lt;&lt; &quot;\n&quot;;
}</code></pre>
<ul>
<li>스위핑 기법을 통해 쉽게 풀 수 있는 문제</li>
</ul>
]]></description>
        </item>
    </channel>
</rss>