<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>sj-lee33.log</title>
        <link>https://velog.io/</link>
        <description></description>
        <lastBuildDate>Fri, 25 Feb 2022 11:16:40 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>sj-lee33.log</title>
            <url>https://images.velog.io/images/sj-lee33/profile/0bda0b44-687d-4fac-b4aa-d154903c5624/다운로드.png</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. sj-lee33.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/sj-lee33" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[백준 14565]]></title>
            <link>https://velog.io/@sj-lee33/%EB%B0%B1%EC%A4%80-14565</link>
            <guid>https://velog.io/@sj-lee33/%EB%B0%B1%EC%A4%80-14565</guid>
            <pubDate>Fri, 25 Feb 2022 11:16:40 GMT</pubDate>
            <description><![CDATA[<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;algorithm&gt;
#include &lt;vector&gt;
#define ll long long
using namespace std;

ll gcd(ll n, ll a)
{
    if (a == 0) return n;
    return gcd(a, n % a);
}

ll extended_euclid(ll n, ll a)
{
    vector&lt;ll&gt; Si = { 1, 0 };
    vector&lt;ll&gt; Ti = { 0, 1 };
    vector&lt;ll&gt; Ri = { n, a };
    ll Qi = n / a ;
    ll r1, r2, temp;
    while (1)
    {
        r2 = Ri[Ri.size() - 2];
        r1 = Ri[Ri.size() - 1];

        temp = r2 % r1;
        Ri.push_back(temp);
        if (temp==0) return Ti[Ti.size()-1];
        Qi = r2 / r1;
        Si.push_back(Si[Si.size() - 2] - Si[Si.size() - 1] * Qi);
        Ti.push_back(Ti[Ti.size() - 2] - Ti[Ti.size() - 1] * Qi);

    }
}
int main()
{
    ll n, a;
    cin &gt;&gt; n &gt;&gt; a;

    cout &lt;&lt; n - a &lt;&lt; &quot; &quot;;
    if (gcd(n, a) != 1)
    {
        cout &lt;&lt; -1;
        return 0;
    }

    ll ret = extended_euclid(n, a);
    while (ret &lt; 0)
    {
        ret += n;
    }

    cout &lt;&lt; ret;
    return 0;
}</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[백준 21608]]></title>
            <link>https://velog.io/@sj-lee33/%EB%B0%B1%EC%A4%80-21608</link>
            <guid>https://velog.io/@sj-lee33/%EB%B0%B1%EC%A4%80-21608</guid>
            <pubDate>Thu, 24 Feb 2022 15:37:54 GMT</pubDate>
            <description><![CDATA[<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;vector&gt;
#include &lt;algorithm&gt;

#define MAX 25
using namespace std;

struct STUDENT
{
    int Num;
    int Friend[4];
};

struct POSITION
{
    int x;
    int y;
    int Nearly_Empty;
    int Nearly_Friend;
};

int N, Answer;
int MAP[MAX][MAX];
STUDENT Student_Arr[MAX * MAX];
vector&lt;STUDENT&gt; Student;

int dx[] = { 0, 0, 1, -1 };
int dy[] = { 1, -1, 0, 0 };

void Input()
{
    cin &gt;&gt; N;
    for (int i = 0; i &lt; N * N; i++)
    {
        int a, b, c, d, e;
        cin &gt;&gt; a &gt;&gt; b &gt;&gt; c &gt;&gt; d &gt;&gt; e;
        Student.push_back({ a, { b, c, d, e} });
        Student_Arr[a].Num = a;
        Student_Arr[a].Friend[0] = b;
        Student_Arr[a].Friend[1] = c;
        Student_Arr[a].Friend[2] = d;
        Student_Arr[a].Friend[3] = e;
    }
}

bool Cmp(POSITION A, POSITION B)
{
    if (A.Nearly_Friend &gt;= B.Nearly_Friend)
    {
        if (A.Nearly_Friend == B.Nearly_Friend)
        {
            if (A.Nearly_Empty &gt;= B.Nearly_Empty)
            {
                if (A.Nearly_Empty == B.Nearly_Empty)
                {
                    if (A.x &lt;= B.x)
                    {
                        if (A.x == B.x)
                        {
                            if (A.y &lt; B.y)
                            {
                                return true;
                            }
                            return false;
                        }
                        return true;
                    }
                    return false;
                }
                return true;
            }
            return false;
        }
        return true;
    }
    return false;
}

void Set_Position()
{
    for (int i = 0; i &lt; Student.size(); i++)
    {
        vector&lt;POSITION&gt; Pos;
        int Student_Num = Student[i].Num;
        for (int x = 0; x &lt; N; x++)
        {
            for (int y = 0; y &lt; N; y++)
            {
                if (MAP[x][y] != 0) continue;

                int Nearly_Friend = 0;
                int Nearly_Empty = 0;
                for (int k = 0; k &lt; 4; k++)
                {
                    int nx = x + dx[k];
                    int ny = y + dy[k];
                    if (nx &lt; 0 || ny &lt; 0 || nx &gt;= N || ny &gt;= N) continue;
                    if (MAP[nx][ny] == 0) Nearly_Empty++;
                    else
                    {
                        for (int j = 0; j &lt; 4; j++)
                        {
                            int Friend_Num = Student[i].Friend[j];
                            if (MAP[nx][ny] == Friend_Num)
                            {
                                Nearly_Friend++;
                                break;
                            }
                        }
                    }
                }
                Pos.push_back({ x, y, Nearly_Empty, Nearly_Friend });
            }
        }
        sort(Pos.begin(), Pos.end(), Cmp);
        int Pos_x = Pos[0].x;
        int Pos_y = Pos[0].y;
        MAP[Pos_x][Pos_y] = Student_Num;
    }
}

int Calculate(int F)
{
    if (F == 0) return 0;
    if (F == 1) return 1;
    if (F == 2) return 10;
    if (F == 3) return 100;
    if (F == 4) return 1000;
}

void Calculate_Satisfy()
{
    for (int i = 0; i &lt; N; i++)
    {
        for (int j = 0; j &lt; N; j++)
        {
            int Student_Num = MAP[i][j];
            int Friend = 0;
            for (int k = 0; k &lt; 4; k++)
            {
                int nx = i + dx[k];
                int ny = j + dy[k];
                if (nx &lt; 0 || ny &lt; 0 || nx &gt;= N || ny &gt;= N) continue;

                for (int l = 0; l &lt; 4; l++)
                {
                    int Friend_Num = Student_Arr[Student_Num].Friend[l];
                    if (MAP[nx][ny] == Friend_Num)
                    {
                        Friend++;
                        break;
                    }
                }
            }
            Answer += Calculate(Friend);
        }
    }
}

void Solution()
{
    Set_Position();
    Calculate_Satisfy();
    cout &lt;&lt; Answer &lt;&lt; endl;
}

void Solve()
{
    Input();
    Solution();
}

int main(void)
{
    ios::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);

    Solve();

    return 0;
}
</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[백준 17837]]></title>
            <link>https://velog.io/@sj-lee33/%EB%B0%B1%EC%A4%80-17837</link>
            <guid>https://velog.io/@sj-lee33/%EB%B0%B1%EC%A4%80-17837</guid>
            <pubDate>Wed, 23 Feb 2022 13:29:04 GMT</pubDate>
            <description><![CDATA[<pre><code class="language-cpp">#include&lt;iostream&gt;
#include&lt;vector&gt;

#define endl &quot;\n&quot;
#define MAX 12
#define CHESS_MAX 10
using namespace std;

struct CHESS
{
    int x;
    int y;
    int dir;
};

int N, K, Answer;
int MAP[MAX][MAX];
vector&lt;int&gt; MAP_State[MAX][MAX];
CHESS Chess[CHESS_MAX];

int dx[] = { 0, 0, 0, -1, 1 };
int dy[] = { 0, 1, -1, 0, 0 };

void Print()
{
    for (int i = 0; i &lt; N; i++)
    {
        for (int j = 0; j &lt; N; j++)
        {
            cout &lt;&lt; MAP_State[i][j].size() &lt;&lt; &quot; &quot;;
        }
        cout &lt;&lt; endl;
    }
    cout &lt;&lt; &quot;#######################################################################&quot; &lt;&lt; endl;
}
void Input()
{
    cin &gt;&gt; N &gt;&gt; K;
    for (int i = 0; i &lt; N; i++)
    {
        for (int j = 0; j &lt; N; j++)
        {
            cin &gt;&gt; MAP[i][j];
        }
    }
    for (int i = 0; i &lt; K; i++)
    {
        int x, y, d; cin &gt;&gt; x &gt;&gt; y &gt;&gt; d;
        x--; y--;
        Chess[i] = { x, y, d };
        MAP_State[x][y].push_back(i);
    }
}

int Find_Delete_Num(int x, int y, int Chess_Num)
{
    /* 해당 말을 옮긴 후, 기존 좌표에서 몇 번 삭제를 해야 하는지 찾는 함수. */
    int Cnt = 0;
    for (int i = MAP_State[x][y].size() - 1; i &gt;= 0; i--)
    {
        if (MAP_State[x][y][i] == Chess_Num) break;
        Cnt++;
    }
    return Cnt + 1;
}

int Reverse_Dir(int Num)
{
    int Dir = Chess[Num].dir;
    if (Dir == 1) return 2;
    else if (Dir == 2) return 1;
    else if (Dir == 3) return 4;
    else if (Dir == 4) return 3;
}

void MoveChess(int x, int y, int nx, int ny, int Chess_Num, int Pos, int Ms)
{
    if (Ms == 0)
    {
        for (int i = Pos; i &lt; MAP_State[x][y].size(); i++)
        {
            MAP_State[nx][ny].push_back(MAP_State[x][y][i]);
            int Idx = MAP_State[x][y][i];
            Chess[Idx].x = nx;
            Chess[Idx].y = ny;
        }
        int Delete_Num = Find_Delete_Num(x, y, Chess_Num);
        for (int i = 0; i &lt; Delete_Num; i++) MAP_State[x][y].pop_back();
    }
    else if (Ms == 1)
    {
        for (int i = MAP_State[x][y].size() - 1; i &gt;= Pos; i--)
        {
            MAP_State[nx][ny].push_back(MAP_State[x][y][i]);
            int Idx = MAP_State[x][y][i];
            Chess[Idx].x = nx;
            Chess[Idx].y = ny;
        }
        int Delete_Num = Find_Delete_Num(x, y, Chess_Num);
        for (int i = 0; i &lt; Delete_Num; i++) MAP_State[x][y].pop_back();
    }
    else if (Ms == 2)
    {
        int Dir = Reverse_Dir(Chess_Num);
        Chess[Chess_Num].dir = Dir;
        int nnx = x + dx[Dir];
        int nny = y + dy[Dir];

        if (nnx &gt;= 0 &amp;&amp; nny &gt;= 0 &amp;&amp; nnx &lt; N &amp;&amp; nny &lt; N)
        {
            if (MAP[nnx][nny] != 2) MoveChess(x, y, nnx, nny, Chess_Num, Pos, MAP[nnx][nny]);
        }
    }
}

int Find_Position(int x, int y, int Idx)
{
    /* 해당 말이 몇 번째에 위치하고 있는지 찾아서 return 하는 함수. */
    for (int i = 0; i &lt; MAP_State[x][y].size(); i++)
    {
        if (MAP_State[x][y][i] == Idx) return i;
    }
}

bool Check_State()
{
    for (int i = 0; i &lt; K; i++)
    {
        int x = Chess[i].x;
        int y = Chess[i].y;
        if (MAP_State[x][y].size() &gt;= 4) return true;
    }
    return false;
}

void Solution()
{
    bool Flag = false;
    int Time = 0;
    while (1)
    {
        if (Time &gt; 1000) break;

        for (int i = 0; i &lt; K; i++)
        {
            int x = Chess[i].x;
            int y = Chess[i].y;
            int dir = Chess[i].dir;

            int nx = x + dx[dir];
            int ny = y + dy[dir];

            int Pos = Find_Position(x, y, i);
            if (nx &gt;= 0 &amp;&amp; ny &gt;= 0 &amp;&amp; nx &lt; N &amp;&amp; ny &lt; N) MoveChess(x, y, nx, ny, i, Pos, MAP[nx][ny]);            
            else MoveChess(x, y, nx, ny, i, Pos, 2);

            if (Check_State() == true)
            {
                Flag = true;
                break;
            }
        }
        if (Flag == true) break;
        Time++;
    }

    if (Flag == true) cout &lt;&lt; Time + 1 &lt;&lt; endl;
    else cout &lt;&lt; -1 &lt;&lt; endl;
}

void Solve()
{
    Input();
    Solution();
}

int main(void)
{
    ios::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);

    Solve();

    return 0;
}</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[백준 17779]]></title>
            <link>https://velog.io/@sj-lee33/%EB%B0%B1%EC%A4%80-17779</link>
            <guid>https://velog.io/@sj-lee33/%EB%B0%B1%EC%A4%80-17779</guid>
            <pubDate>Tue, 22 Feb 2022 11:26:32 GMT</pubDate>
            <description><![CDATA[<pre><code class="language-cpp">#include&lt;iostream&gt;
#include&lt;algorithm&gt;

#define endl &quot;\n&quot;
#define MAX 20
using namespace std;

struct COORD
{
    int x;
    int y;
};

int N, Answer = 987654321;
int MAP[MAX][MAX];
int Label[MAX][MAX];
COORD Pos[4];

int Min(int A, int B) { if (A &lt; B) return A; return B; }

void Input()
{
    cin &gt;&gt; N;
    for (int i = 0; i &lt; N; i++)
    {
        for (int j = 0; j &lt; N; j++)
        {
            cin &gt;&gt; MAP[i][j];
        }
    }
}

bool CanMakeLine(int x, int y, int d1, int d2)
{
    if (x + d1 &gt;= N || y - d1 &lt; 0) return false;
    if (x + d2 &gt;= N || y + d2 &gt;= N) return false;
    if (x + d1 + d2 &gt;= N || y - d1 + d2 &gt;= N) return false;
    if (x + d2 + d1 &gt;= N || y + d2 - d1 &lt; 0) return false;

    return true;
}

void Calculate()
{
    int Sum[6] = { 0, 0, 0, 0, 0, 0};
    for (int i = 0; i &lt; N; i++)
    {
        for (int j = 0; j &lt; N; j++)
        {
            Sum[Label[i][j]] = Sum[Label[i][j]] + MAP[i][j];
        }
    }
    sort(Sum, Sum + 6);
    int Diff = Sum[5] - Sum[1];
    Answer = Min(Answer, Diff);
}

void Labeling(int a, int b, int c, int d)
{
    for (int i = 0; i &lt; N; i++)
    {
        for (int j = 0; j &lt; N; j++)
        {
            Label[i][j] = 5;
        }
    }

    int SubArea = 0;
    for (int i = 0; i &lt; Pos[1].x; i++)
    {
        if (i &gt;= Pos[0].x) SubArea++;
        for (int j = 0; j &lt;= Pos[0].y - SubArea; j++)
        {
            Label[i][j] = 1;
        }
    }

    int PlusArea = 0;
    for (int i = 0; i &lt;= Pos[2].x; i++)
    {
        if (i &gt; Pos[0].x) PlusArea++;
        for (int j = Pos[0].y + 1 + PlusArea; j &lt; N; j++)
        {
            Label[i][j] = 2;
        }
    } 

    SubArea = 0;
    for (int i = N - 1; i &gt;= Pos[1].x; i--)
    {
        if (i &lt; Pos[3].x) SubArea++;
        for (int j = 0; j &lt; Pos[3].y - SubArea; j++)
        {
            Label[i][j] = 3;
        }
    }

    PlusArea = 0;
    for (int i = N - 1; i &gt; Pos[2].x; i--)
    {
        if (i &lt;= Pos[3].x) PlusArea++;
        for (int j = Pos[3].y + PlusArea; j &lt; N; j++)
        {
            Label[i][j] = 4;
        }
    }

    Calculate();
}

void Solution()
{
    for (int i = 0; i &lt; N; i++)
    {
        for (int j = 1; j &lt; N; j++)
        {
            for (int D1 = 1; D1 &lt;= j; D1++)    
            {
                for (int D2 = 1 ; D2 &lt; N - j; D2++) 
                {
                    if (CanMakeLine(i, j, D1, D2) == true)  
                    {
                        Pos[0].x = i; Pos[0].y = j;
                        Pos[1].x = i + D1; Pos[1].y = j - D1;
                        Pos[2].x = i + D2; Pos[2].y = j + D2;
                        Pos[3].x = i + D1 + D2; Pos[3].y = j - D1 + D2;
                        Labeling(i, j, D1, D2);
                    }
                }
            }
        }
    }
    cout &lt;&lt; Answer &lt;&lt; endl;
}

void Solve()
{
    Input();
    Solution();
}

int main(void)
{
    ios::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);

    Solve();

    return 0;
}</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[백준 20061]]></title>
            <link>https://velog.io/@sj-lee33/%EB%B0%B1%EC%A4%80-20061</link>
            <guid>https://velog.io/@sj-lee33/%EB%B0%B1%EC%A4%80-20061</guid>
            <pubDate>Mon, 21 Feb 2022 11:57:49 GMT</pubDate>
            <description><![CDATA[<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;vector&gt;

#define endl &quot;\n&quot;
using namespace std;

int N, Block_Cnt, Score, Figure_Num = 1;
int Area[10][4][2];
vector&lt;pair&lt;int, pair&lt;int, int&gt;&gt;&gt; V;

int dx[] = { 0, 0, 1, -1 };
int dy[] = { 1, -1, 0, 0 };

int Min(int A, int B) { if (A &lt; B) return A; return B; }
int Max(int A, int B) { if (A &gt; B) return A; return B; }

void Input()
{
    cin &gt;&gt; N;
    for (int i = 0; i &lt; N; i++)
    {
        int a, b, c; cin &gt;&gt; a &gt;&gt; b &gt;&gt; c;
        V.push_back(make_pair(a, make_pair(b, c)));
    }
}

void Setting_Block(int Shape, int x, int y)
{
    if (Shape == 1)
    {
        int B_Idx = y + 1;
        while (B_Idx &lt; 10 &amp;&amp; Area[B_Idx][x][0] == 0) B_Idx++; B_Idx--;
        Area[B_Idx][x][0] = Figure_Num;

        int G_Idx = x + 1;
        while (G_Idx &lt; 10 &amp;&amp; Area[G_Idx][y][1] == 0) G_Idx++; G_Idx--;
        Area[G_Idx][y][1] = Figure_Num++;

        Block_Cnt += 2;
    }
    else if (Shape == 2)
    {
        int B_Idx = y + 2;
        while (B_Idx &lt; 10 &amp;&amp; Area[B_Idx][x][0] == 0) B_Idx++; B_Idx--;
        Area[B_Idx][x][0] = Figure_Num;
        Area[B_Idx - 1][x][0] = Figure_Num;

        int G_Idx = x + 1;
        while (G_Idx &lt; 10 &amp;&amp; Area[G_Idx][y][1] == 0 &amp;&amp; Area[G_Idx][y + 1][1] == 0) G_Idx++; G_Idx--;
        Area[G_Idx][y][1] = Figure_Num;
        Area[G_Idx][y + 1][1] = Figure_Num++;

        Block_Cnt += 4;
    }
    else
    {
        int B_Idx = y + 1;
        while (B_Idx &lt; 10 &amp;&amp; Area[B_Idx][x][0] == 0 &amp;&amp; Area[B_Idx][x + 1][0] == 0) B_Idx++; B_Idx--;
        Area[B_Idx][x][0] = Figure_Num;
        Area[B_Idx][x + 1][0] = Figure_Num;

        int G_Idx = x + 2;
        while (G_Idx &lt; 10 &amp;&amp; Area[G_Idx][y][1] == 0) G_Idx++; G_Idx--;
        Area[G_Idx][y][1] = Figure_Num;
        Area[G_Idx - 1][y][1] = Figure_Num++;

        Block_Cnt += 4;
    }
}

void Remove(int Idx, int Color)
{
    for (int i = 0; i &lt; 4; i++)
    {
        if (Area[Idx][i][Color] == 0) continue;

        Area[Idx][i][Color] = 0;
        Block_Cnt--;
    }
}

pair&lt;int, int&gt; Find_Partner(int Idx, int Pos, int Color)
{
    if (Color == 0)
    {
        for (int i = 0; i &lt; 4; i++)
        {
            int n_Idx = Idx + dx[i];
            int n_Pos = Pos + dy[i];

            if (n_Idx &gt;= 4 &amp;&amp; n_Idx &lt; 10 &amp;&amp; n_Pos &gt;= 0 &amp;&amp; n_Pos &lt; 4)
            {
                if (Area[Idx][Pos][Color] == Area[n_Idx][n_Pos][Color])
                {
                    if (Idx == n_Idx) return{ 3, i };
                    return{ 2, i };
                }
            }
        }
        return{ 1, -1 };
    }

    for (int i = 0; i &lt; 4; i++)
    {
        for (int i = 0; i &lt; 4; i++)
        {
            int n_Idx = Idx + dx[i];
            int n_Pos = Pos + dy[i];

            if (n_Idx &gt;= 4 &amp;&amp; n_Idx &lt; 10 &amp;&amp; n_Pos &gt;= 0 &amp;&amp; n_Pos &lt; 4)
            {
                if (Area[Idx][Pos][Color] == Area[n_Idx][n_Pos][Color])
                {
                    if (Idx == n_Idx) return{ 2, i };
                    return{ 3, i };
                }
            }
        }
        return{ 1, -1 };
    }
}

void Move(int Index, int Color)
{
    if (Index == 3) return;

    int Idx = Index - 1;
    for (int i = 0; i &lt; 4; i++)
    {
        if (Area[Idx][i][Color] == 0) continue;

        int Pos = i;
        int F_Num = Figure_Num[Area][Idx][i];
        pair&lt;int, int&gt; Shape = Find_Partner(Idx , Pos, Color);

        if (Shape.first == 1)
        {
            int n_Idx = Idx + 1;
            Area[n_Idx][i][Color] = Area[Idx][i][Color];
            Area[Idx][i][Color] = 0;
        }
        else if (Shape.first == 2)
        {
            int P_Idx = Idx + dx[Shape.second];
            int P_Pos = Pos + dy[Shape.second];
            if (Color == 0)
            {
                int Standard_Idx = Max(P_Idx, Idx);
                int Partner_Idx = Min(P_Idx, Idx);
                int n_Idx = Standard_Idx + 1;
                int nP_Idx = Partner_Idx + 1;
                Area[n_Idx][i][Color] = Area[Standard_Idx][i][Color];
                Area[nP_Idx][i][Color] = Area[Partner_Idx][i][Color];
                Area[Partner_Idx][i][Color] = 0;
            }
            else
            {
                int n_Idx = Idx + 1;
                int nP_Idx = P_Idx + 1;
                Area[n_Idx][i][Color] = Area[Idx][i][Color];
                Area[nP_Idx][i][Color] = Area[P_Idx][i][Color];
                Area[Idx][i][Color] = 0;
                Area[P_Idx][i][Color] = 0;
            }
        }
        else
        {
            int P_Idx = Idx + dx[Shape.second];
            int P_Pos = Pos + dy[Shape.second];
            if(Color == 0)
            { 
                int n_Idx = Idx + 1;
                int nP_Idx = P_Idx + 1;
                Area[n_Idx][i][Color] = Area[Idx][i][Color];
                Area[nP_Idx][i][Color] = Area[P_Idx][i][Color];
                Area[Idx][i][Color] = 0;
                Area[P_Idx][i][Color] = 0;
            }
            else
            {
                int Standard_Idx = Max(Idx, P_Idx);
                int Partner_Idx = Min(Idx, P_Idx);
                int n_Idx = Standard_Idx + 1;
                int nP_Idx = Partner_Idx + 1;
                Area[n_Idx][i][Color] = Area[Standard_Idx][i][Color];
                Area[nP_Idx][i][Color] = Area[Partner_Idx][i][Color];
                Area[Partner_Idx][i][Color] = 0;
            }
        }
    }
    Move(Index - 1, Color);
}

void Remove_Full_Block()
{
    bool Flag = false;
    for (int Color = 0; Color &lt; 2; Color++)
    {
        for (int i = 4; i &lt; 10; i++)
        {
            int Cnt = 0;
            for (int j = 0; j &lt; 4; j++)
            {
                if (Area[i][j][Color] == 0) break;
                Cnt++;
            }

            if (Cnt == 4)
            {
                Flag = true;
                Score++;
                Remove(i, Color);
                Move(i, Color);
            }
        }
    }

    if (Flag == true) Remove_Full_Block();
}

void Check_Special_Point()
{
    for (int Color = 0; Color &lt; 2; Color++)
    {
        int Cnt = 0;
        for(int i = 4; i &lt; 6; i++)
        { 

            for (int j = 0; j &lt; 4; j++)
            {
                if (Area[i][j][Color] == 0) continue;
                Cnt++;
                break;
            }
        }

        for (int i = 0; i &lt; Cnt; i++)
        {
            Remove(9, Color);
            Move(9, Color);
        }
    }
}

void Solution()
{
    for (int i = 0; i &lt; V.size(); i++)
    {
        int t = V[i].first;
        int x = V[i].second.first;
        int y = V[i].second.second;

        Setting_Block(t, x, y);
        Remove_Full_Block();
        Check_Special_Point();
    }
    cout &lt;&lt; Score &lt;&lt; endl &lt;&lt; Block_Cnt &lt;&lt; endl;
}

void Solve()
{
    Input();
    Solution();
}

int main(void)
{
    ios::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);

    Solve();

    return 0;
}</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[백준 23290]]></title>
            <link>https://velog.io/@sj-lee33/%EB%B0%B1%EC%A4%80-23290</link>
            <guid>https://velog.io/@sj-lee33/%EB%B0%B1%EC%A4%80-23290</guid>
            <pubDate>Thu, 17 Feb 2022 14:36:25 GMT</pubDate>
            <description><![CDATA[<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;vector&gt;

#define endl &quot;\n&quot;
#define MAX 5
using namespace std;

struct fish {
    int x;
    int y;
    int dir;
};

int n = 4, m, s, maxEating;
int tempRoute[3], route[3];
int smellMap[MAX][MAX];
vector&lt;fish&gt; fishMap[MAX][MAX], cMap[MAX][MAX];
pair&lt;int, int&gt; shark;

int fdx[] = { 0, 0, -1, -1, -1, 0, 1, 1, 1 };
int fdy[] = { 0, -1, -1, 0, 1, 1, 1, 0, -1 };

int sdx[] = { 0, -1, 0, 1, 0 };
int sdy[] = { 0, 0, -1, 0, 1 };


void input() {
    cin &gt;&gt; m &gt;&gt; s;
    for (int i = 0; i &lt; m; i++) {
        int x, y, d;
        cin &gt;&gt; x &gt;&gt; y &gt;&gt; d;
        x--; y--;
        fish f = { x, y, d };
        fishMap[x][y].push_back(f);
    }
    cin &gt;&gt; shark.first &gt;&gt; shark.second;
    shark.first--; shark.second--;
}

void copyMap(vector&lt;fish&gt; A[][MAX], vector&lt;fish&gt; B[][MAX]) {
    for (int i = 0; i &lt; n; i++) {
        for (int j = 0; j &lt; n; j++) {
            A[i][j] = B[i][j];
        }
    }
}

void copyFish() {
    copyMap(cMap, fishMap);
}

int changeDir(int dir) {
    switch (dir) {
    case 1:
        return 8;
    case 2:
        return 1;
    case 3:
        return 2;
    case 4:
        return 3;
    case 5:
        return 4;
    case 6:
        return 5;
    case 7:
        return 6;
    case 8:
        return 7;
    }
}

void moveFish() {
    vector&lt;fish&gt; tempMap[MAX][MAX];

    for (int i = 0; i &lt; n; i++) {
        for (int j = 0; j &lt; n; j++) {
            for (int k = 0; k &lt; fishMap[i][j].size(); k++) {
                int x = fishMap[i][j][k].x;
                int y = fishMap[i][j][k].y;
                int dir = fishMap[i][j][k].dir;
                int nx = x;
                int ny = y;
                bool Flag = false;
                for (int l = 0; l &lt; 8; l++) {
                    nx = x + fdx[dir];
                    ny = y + fdy[dir];
                    if (nx &gt;= 0 &amp;&amp; ny &gt;= 0 &amp;&amp; nx &lt; n &amp;&amp; ny &lt; n) {
                        if ((nx != shark.first || ny != shark.second) &amp;&amp; smellMap[nx][ny] == 0) {
                            Flag = true;
                            break;
                        }
                    }
                    dir = changeDir(dir);
                }
                if (Flag == true) {
                    fish f = { nx, ny, dir };
                    tempMap[nx][ny].push_back(f);
                }
                else {
                    fish f = { x, y, dir };
                    tempMap[x][y].push_back(f);
                }
            }
        }
    }
    copyMap(fishMap, tempMap);
}

int routeSimulation() {
    bool visit[MAX][MAX] = { false, };
    int x = shark.first;
    int y = shark.second;
    int eat = 0;
    for (int i = 0; i &lt; 3; i++) {
        int dir = tempRoute[i];
        int nx = x + sdx[dir];
        int ny = y + sdy[dir];
        if (nx &lt; 0 || ny &lt; 0 || nx &gt;= n || ny &gt;= n) return -1;
        if (visit[nx][ny] == false) {
            visit[nx][ny] = true;
            eat += fishMap[nx][ny].size();
        }
        x = nx;
        y = ny;
    }
    return eat;
}

void findRoute(int cnt) {
    if (cnt == 3) {
        int eatNum = routeSimulation();
        if (eatNum &gt; maxEating) {
            for (int i = 0; i &lt; 3; i++) {
                route[i] = tempRoute[i];
            }
            maxEating = eatNum;
        }
        return;
    }

    for (int i = 1; i &lt;= 4; i++) {
        tempRoute[cnt] = i;
        findRoute(cnt + 1);
    }
}

void moveShark(int time) {
    vector&lt;fish&gt; tempMap[MAX][MAX];
    copyMap(tempMap, fishMap);

    int x = shark.first;
    int y = shark.second;
    for (int i = 0; i &lt; 3; i++) {
        int dir = route[i];
        int nx = x + sdx[dir];
        int ny = y + sdy[dir];
        if (tempMap[nx][ny].size() != 0) {
            smellMap[nx][ny] = time;
            tempMap[nx][ny].clear();
        }
        x = nx;
        y = ny;
        shark.first = x;
        shark.second = y;
    }
    copyMap(fishMap, tempMap);
}

void aboutShark(int time) {
    maxEating = -1;
    findRoute(0);
    moveShark(time);
}

void removeSmell(int time) {
    for (int i = 0; i &lt; n; i++) {
        for (int j = 0; j &lt; n; j++) {
            if (smellMap[i][j] == 0) continue;
            if (time - smellMap[i][j] == 2) {
                smellMap[i][j] = 0;
            }
        }
    }
}

void bornFish() {
    for (int i = 0; i &lt; n; i++) {
        for (int j = 0; j &lt; n; j++) {
            for (int k = 0; k &lt; cMap[i][j].size(); k++) {
                fishMap[i][j].push_back(cMap[i][j][k]);
            }
        }
    }
}

int findAnswer() {
    int ret = 0;
    for (int i = 0; i &lt; n; i++) {
        for (int j = 0; j &lt; n; j++) {
            ret += fishMap[i][j].size();
        }
    }
    return ret;
}

void solution() {
    for (int i = 1; i &lt;= s; i++) {
        copyFish();
        moveFish();
        aboutShark(i);
        removeSmell(i);
        bornFish();
    }
    cout &lt;&lt; findAnswer() &lt;&lt; endl;
}

void solve() {
    input();
    solution();
}

int main(void) {
    ios::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);

    solve();

    return 0;
}</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[백준 19238]]></title>
            <link>https://velog.io/@sj-lee33/%EB%B0%B1%EC%A4%80-19238-aexoops1</link>
            <guid>https://velog.io/@sj-lee33/%EB%B0%B1%EC%A4%80-19238-aexoops1</guid>
            <pubDate>Thu, 17 Feb 2022 14:35:05 GMT</pubDate>
            <description><![CDATA[<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;algorithm&gt;
#include &lt;queue&gt;
#include &lt;vector&gt;
#include &lt;cstring&gt;

#define endl &quot;\n&quot;
#define MAX 25
using namespace std;

struct CUSTOMER
{
    int x;
    int y;
    int Dest_x;
    int Dest_y;
};

struct INFO
{
    int x;
    int y;
    int Dist;
    int Num;
};

int N, M, Fuel;
int Taxi_x, Taxi_y;
int MAP[MAX][MAX];
bool Visit[MAX][MAX];
CUSTOMER Customer[MAX * MAX];

int dx[] = { 0, 0, 1, -1 };
int dy[] = { 1, -1, 0, 0 };

void Input()
{
    cin &gt;&gt; N &gt;&gt; M &gt;&gt; Fuel;
    for (int i = 0; i &lt; N; i++)
    {
        for (int j = 0; j &lt; N; j++)
        {
            cin &gt;&gt; MAP[i][j];
            if (MAP[i][j] == 1) MAP[i][j] = -1;
        }
    }
    cin &gt;&gt; Taxi_x &gt;&gt; Taxi_y;
    Taxi_x--; Taxi_y--;
    for (int i = 1; i &lt;= M; i++)
    {
        int a, b, c, d; cin &gt;&gt; a &gt;&gt; b &gt;&gt; c &gt;&gt; d;
        a--; b--; c--; d--;
        Customer[i] = { a, b, c, d };
        MAP[a][b] = i;
    }
}

bool Info_Cmp(INFO A, INFO B)
{

    if (A.Dist &lt;= B.Dist)
    {
        if (A.Dist == B.Dist)
        {
            if (A.x &lt;= B.x)
            {
                if (A.x == B.x)
                {
                    if (A.y &lt; B.y)
                    {
                        return true;
                    }
                    return false;
                }
                return true;
            }
            return false;
        }
        return true;
    }
    return false;
}

bool BFS(int a, int b, int c, int d, int Num)
{
    memset(Visit, false, sizeof(Visit));
    queue&lt;pair&lt;pair&lt;int, int&gt;, pair&lt;int,int&gt;&gt;&gt; Q;
    Q.push(make_pair(make_pair(a, b), make_pair(0, Fuel)));
    Visit[a][b] = true;

    while (Q.empty() == 0)
    {
        int x = Q.front().first.first;
        int y = Q.front().first.second;
        int Distance = Q.front().second.first;
        int Spare_Fuel = Q.front().second.second;
        Q.pop();

        if (x == c &amp;&amp; y == d)
        {
            Fuel = Fuel - Distance;
            Fuel = Fuel + (Distance * 2);
            Taxi_x = x;
            Taxi_y = y;
            return true;
        }
        if (Spare_Fuel == 0) return false;
        for (int i = 0; i &lt; 4; i++)
        {
            int nx = x + dx[i];
            int ny = y + dy[i];
            if (nx &gt;= 0 &amp;&amp; ny &gt;= 0 &amp;&amp; nx &lt; N &amp;&amp; ny &lt; N)
            {
                if (MAP[nx][ny] != -1 &amp;&amp; Visit[nx][ny] == false)
                {
                    Visit[nx][ny] = true;
                    Q.push(make_pair(make_pair(nx, ny), make_pair(Distance + 1, Spare_Fuel - 1)));
                }
            }
        }
    }
    return false;
}

int Find_Shortest_Customer()
{
    memset(Visit, false, sizeof(Visit));
    queue&lt;pair&lt;pair&lt;int, int&gt;, pair&lt;int, int&gt;&gt;&gt; Q;
    Q.push(make_pair(make_pair(Taxi_x, Taxi_y), make_pair(0, Fuel)));
    Visit[Taxi_x][Taxi_y] = true;
    vector&lt;INFO&gt; V;

    while (Q.empty() == 0)
    {
        int x = Q.front().first.first;
        int y = Q.front().first.second;
        int Distance = Q.front().second.first;
        int Spare_Fuel = Q.front().second.second;
        Q.pop();

        if (MAP[x][y] &gt;= 1) V.push_back({ x, y, Distance, MAP[x][y] });
        if (Spare_Fuel == 0) continue;

        for (int i = 0; i &lt; 4; i++)
        {
            int nx = x + dx[i];
            int ny = y + dy[i];
            if (nx &gt;= 0 &amp;&amp; ny &gt;= 0 &amp;&amp; nx &lt; N &amp;&amp; ny &lt; N)
            {
                if (MAP[nx][ny] != -1 &amp;&amp; Visit[nx][ny] == false)
                {
                    Visit[nx][ny] = true;
                    Q.push(make_pair(make_pair(nx, ny), make_pair(Distance + 1, Spare_Fuel - 1)));
                }
            }
        }
    }

    sort(V.begin(), V.end(), Info_Cmp);
    MAP[V[0].x][V[0].y] = 0;
    Fuel = Fuel - V[0].Dist;
    return V[0].Num;    
}

void Solution()
{
    for (int i = 0; i &lt; M; i++)
    {
        int Num = Find_Shortest_Customer();
        if (Num == -1)
        {
            cout &lt;&lt; -1 &lt;&lt; endl;
            return;
        }

        bool Move = BFS(Customer[Num].x, Customer[Num].y, Customer[Num].Dest_x, Customer[Num].Dest_y, Num);
        if (Move == false)
        {
            cout &lt;&lt; -1 &lt;&lt; endl;
            return;
        }
    }
    cout &lt;&lt; Fuel &lt;&lt; endl;
}

void Solve()
{
    Input();
    Solution();
}

int main(void)
{
    ios::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);

    Solve();

    return 0;
}</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[백준 15286 ]]></title>
            <link>https://velog.io/@sj-lee33/%EB%B0%B1%EC%A4%80-15286</link>
            <guid>https://velog.io/@sj-lee33/%EB%B0%B1%EC%A4%80-15286</guid>
            <pubDate>Wed, 16 Feb 2022 15:31:17 GMT</pubDate>
            <description><![CDATA[<p>#include <iostream></p>
<p>#define endl &quot;\n&quot;
#define MAX 110
using namespace std;</p>
<p>int N, K;
int Weight[MAX];
int Value[MAX];
int DP[MAX][100010];</p>
<p>int Max(int A, int B) { if (A &gt; B) return A; return B; }</p>
<p>void Input()
{
    cin &gt;&gt; N &gt;&gt; K;
    for (int i = 1; i &lt;= N; i++)
    {
        cin &gt;&gt; Weight[i] &gt;&gt; Value[i];
    }
}</p>
<p>void Solution()
{
    for (int i = 1; i &lt;= N; i++)
    {
        for (int j = 1; j &lt;= K; j++)
        {
            if (j &gt;= Weight[i])    DP[i][j] = Max(DP[i - 1][j], DP[i - 1][j - Weight[i]] + Value[i]);
            else DP[i][j] = DP[i - 1][j];
        }
    }
    cout &lt;&lt; DP[N][K] &lt;&lt; endl;
}</p>
<p>void Solve()
{
    Input();
    Solution();
}</p>
<p>int main(void)
{
    ios::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);</p>
<pre><code>//freopen(&quot;Input.txt&quot;, &quot;r&quot;, stdin);
Solve();

return 0;</code></pre><p>}</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[백준 21609]]></title>
            <link>https://velog.io/@sj-lee33/%EB%B0%B1%EC%A4%80-21609</link>
            <guid>https://velog.io/@sj-lee33/%EB%B0%B1%EC%A4%80-21609</guid>
            <pubDate>Tue, 15 Feb 2022 14:15:42 GMT</pubDate>
            <description><![CDATA[<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;vector&gt;
#include &lt;algorithm&gt;
#include &lt;cstring&gt;
#include &lt;queue&gt;
#include &lt;stdio.h&gt;

#define MAX 25
using namespace std;

struct BLOCK
{
    int Size;
    int Rainbow_Cnt;
    int x;
    int y;
    vector&lt;pair&lt;int, int&gt;&gt; Block_Pos;
};

int N, M, Answer;
int MAP[MAX][MAX];
bool Visit[MAX][MAX];
bool R_Visit[MAX][MAX];

int dx[] = { 0, 0, 1, -1 };
int dy[] = { 1, -1, 0 ,0 };

void Input()
{
    cin &gt;&gt; N &gt;&gt; M;
    for (int i = 0; i &lt; N; i++)
    {
        for (int j = 0; j &lt; N; j++)
        {
            cin &gt;&gt; MAP[i][j];
        }
    }
}

bool Cmp(pair&lt;int, int&gt; A, pair&lt;int, int&gt; B)
{
    if (A.first &lt;= B.first)
    {
        if (A.first == B.first)
        {
            if (A.second &lt; B.second)
            {
                return true;
            }
            return false;
        }
        return true;
    }
    return false;
}

BLOCK BFS(int a, int b, int Color)
{
    memset(R_Visit, false, sizeof(R_Visit));
    vector&lt;pair&lt;int, int&gt;&gt; Block;
    vector&lt;pair&lt;int, int&gt;&gt; Except_Rainbow_Block;
    queue&lt;pair&lt;int, int&gt;&gt; Q;
    Block.push_back(make_pair(a, b));
    Except_Rainbow_Block.push_back(make_pair(a, b));
    Q.push(make_pair(a, b));
    Visit[a][b] = true;
    int Rainbow = 0;

    while (Q.empty() == false)
    {
        int x = Q.front().first;
        int y = Q.front().second;
        Q.pop();

        for (int i = 0; i &lt; 4; i++)
        {
            int nx = x + dx[i];
            int ny = y + dy[i];
            if (nx &gt;= 0 &amp;&amp; ny &gt;= 0 &amp;&amp; nx &lt; N &amp;&amp; ny &lt; N)
            {
                if (MAP[nx][ny] == 0)
                {
                    if (R_Visit[nx][ny] == false)
                    {
                        R_Visit[nx][ny] = true;
                        Rainbow++;
                        Block.push_back(make_pair(nx, ny));
                        Q.push(make_pair(nx, ny));
                    }
                }
                else if(MAP[nx][ny] == Color)
                {
                    if (Visit[nx][ny] == false)
                    {
                        Visit[nx][ny] = true;
                        Q.push(make_pair(nx, ny));
                        Block.push_back(make_pair(nx, ny));
                        Except_Rainbow_Block.push_back(make_pair(nx, ny));
                    }
                }
            }
        }
    }

    sort(Except_Rainbow_Block.begin(), Except_Rainbow_Block.end(), Cmp);
    BLOCK R_Block;
    R_Block.Size = Block.size();
    R_Block.Rainbow_Cnt = Rainbow;
    R_Block.x = Except_Rainbow_Block[0].first;
    R_Block.y = Except_Rainbow_Block[0].second;
    R_Block.Block_Pos = Block;
    return R_Block;
}

bool Compare_Block(BLOCK A, BLOCK B)
{
    if (A.Size &gt;= B.Size)
    {
        if (A.Size == B.Size)
        {
            if (A.Rainbow_Cnt &gt;= B.Rainbow_Cnt)
            {
                if (A.Rainbow_Cnt == B.Rainbow_Cnt)
                {
                    if (A.x &gt;= B.x)
                    {
                        if (A.x == B.x)
                        {
                            if (A.y &gt; B.y)
                            {
                                return true;
                            }
                            return false;
                        }
                        return true;
                    }
                    return false;
                }
                return true;
            }
            return false;
        }
        return true;
    }
    return false;
}

BLOCK Find_Biggest_Block()
{
    memset(Visit, false, sizeof(Visit));
    BLOCK Result;
    Result.Size = -1;
    for (int i = 0; i &lt; N; i++)
    {
        for (int j = 0; j &lt; N; j++)
        {
            if (Visit[i][j] == true) continue;
            if (MAP[i][j] == -1 || MAP[i][j] == -2 || MAP[i][j] == 0) continue;
            BLOCK Temp_Result = BFS(i, j, MAP[i][j]);

            if (Result.Size == -1) Result = Temp_Result;
            else
            {
                if (Compare_Block(Temp_Result, Result) == true) Result = Temp_Result;
            }
        }
    }
    return Result;
}

void Delete_Block(BLOCK Result)
{
    vector&lt;pair&lt;int, int&gt;&gt; V = Result.Block_Pos;
    for (int i = 0; i &lt; V.size(); i++)
    {
        int x = V[i].first;
        int y = V[i].second;
        MAP[x][y] = -2;
    }
    Answer += (V.size() * V.size());
}

void Gravity()
{
    for (int i = N - 2; i &gt;= 0; i--)
    {
        for (int j = 0; j &lt; N; j++)
        {
            if (MAP[i][j] == -2) continue;
            if (MAP[i][j] == -1) continue;

            int Color = MAP[i][j];
            int nx = i + 1;
            while (1)
            {
                if (MAP[nx][j] != -2) break;
                if (nx == N) break;
                nx++;
            }
            nx--;
            MAP[i][j] = -2;
            MAP[nx][j] = Color;
        }
    }
}

void Rotate()
{
    for (int i = 0; i &lt; N / 2; i++)
    {
        int Sx = i;
        int Sy = i;
        int Ex = N - i - 1;
        int Ey = N - i - 1;

        int x_Idx = Ex;
        int y_Idx = Sy;
        int Idx = 0;
        vector&lt;int&gt; Temp;
        for (int x = Ex; x &gt; Sx; x--) Temp.push_back(MAP[x][Sy]);
        for (int y = Sy; y &lt; Ey; y++) MAP[x_Idx--][Sy] = MAP[Sx][y];
        for (int x = Sx; x &lt; Ex; x++) MAP[Sx][y_Idx++] = MAP[x][Ey];
        for (int y = Ey; y &gt; Sy; y--) MAP[x_Idx++][Ey] = MAP[Ex][y];
        for (int y = Ey; y &gt; Sy; y--) MAP[Ex][y] = Temp[Idx++];
    }
}

void Solution()
{
    while (1)
    {
        BLOCK Result = Find_Biggest_Block();
        if (Result.Size &lt; 2) break;
        Delete_Block(Result);
        Gravity();
        Rotate();
        Gravity();
    }
    cout &lt;&lt; Answer &lt;&lt; endl;
}

void Solve()
{
    Input();
    Solution();
}

int main(void)
{
    ios::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);

    Solve();

    return 0;
}</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[백준 7571]]></title>
            <link>https://velog.io/@sj-lee33/%EB%B0%B1%EC%A4%80-7571</link>
            <guid>https://velog.io/@sj-lee33/%EB%B0%B1%EC%A4%80-7571</guid>
            <pubDate>Mon, 14 Feb 2022 13:35:14 GMT</pubDate>
            <description><![CDATA[<p>#include <iostream>
#include <algorithm>
using namespace std;</p>
<p>int n, m, ans;
int mx, my;
int ax[100000]; int ay[100000];
void init() {
    cin &gt;&gt; n &gt;&gt; m;
    for (int i = 0; i &lt; m; i++) {
        int x, y;
        cin &gt;&gt; ax[i] &gt;&gt; ay[i];
    }
    sort(ax, ax + m);
    sort(ay, ay + m);
    mx = ax[m / 2];
    my = ay[m / 2];
}</p>
<p>int main() {</p>
<pre><code>init();
for (int i = 0; i &lt; m; i++) {
    ans += abs(mx - ax[i]) + abs(my - ay[i]);
}
cout &lt;&lt; ans;</code></pre><p>}</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[백준 20058]]></title>
            <link>https://velog.io/@sj-lee33/%EB%B0%B1%EC%A4%80-20058</link>
            <guid>https://velog.io/@sj-lee33/%EB%B0%B1%EC%A4%80-20058</guid>
            <pubDate>Fri, 11 Feb 2022 13:12:51 GMT</pubDate>
            <description><![CDATA[<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;vector&gt;
#include &lt;queue&gt;

#define MAX 70
#define endl &quot;\n&quot;
using namespace std;

int N, Q, Sum_Answer, Size_Answer;
int MAP[MAX][MAX];
bool Visit[MAX][MAX];
vector&lt;int&gt; Cmd;

int dx[] = { 0, 0, 1, -1 };
int dy[] = { 1, -1, 0, 0 };

int Max(int A, int B) { return A &gt; B ? A : B; }

void Input()
{
    cin &gt;&gt; N &gt;&gt; Q;
    N = (1 &lt;&lt; N);
    for (int i = 0; i &lt; N; i++)
    {
        for (int j = 0; j &lt; N; j++)
        {
            cin &gt;&gt; MAP[i][j];
            Sum_Answer += MAP[i][j];
        }
    }
    for (int i = 0; i &lt; Q; i++)
    {
        int a; cin &gt;&gt; a;
        Cmd.push_back(a);
    }
}

void Turning(int a, int b, int Len)
{
    int Square = Len / 2;
    for (int Number = 0; Number &lt; Square; Number++)
    {
        int Start_x = a + Number;
        int Start_y = b + Number;
        int End_x = a + Len - Number - 1;
        int End_y = b + Len - Number - 1;

        int x_Idx = End_x;
        int y_Idx = Start_y;
        int Idx = 0;
        vector&lt;int&gt; Temp;
        for (int i = Start_x; i &lt; End_x; i++) Temp.push_back(MAP[i][Start_y]);
        for (int i = Start_x; i &lt; End_x; i++) MAP[i][Start_y] = MAP[End_x][y_Idx++];
        for (int i = Start_y; i &lt; End_y; i++) MAP[End_x][i] = MAP[x_Idx--][End_y];
        for (int i = End_x; i &gt; Start_x; i--) MAP[i][End_y] = MAP[Start_x][y_Idx--];
        for (int i = End_y; i &gt; Start_y; i--) MAP[Start_x][i] = Temp[Idx++];
    }
}

void Remake_MAP(int Len)
{
    for (int i = 0; i &lt; N; i += Len)
    {
        for (int j = 0; j &lt; N; j += Len)
        {
            Turning(i, j, Len);
        }
    }
}

void Melting_Ice()
{
    vector&lt;pair&lt;int, int&gt;&gt; V;
    for (int i = 0; i &lt; N; i++)
    {
        for (int j = 0; j &lt; N; j++)
        {
            if (MAP[i][j] == 0) continue;

            int Cnt = 0;
            for (int k = 0; k &lt; 4; k++)
            {
                int nx = i + dx[k];
                int ny = j + dy[k];
                if (nx &lt; 0 || ny &lt; 0 || nx &gt;= N || ny &gt;= N) continue;
                if (MAP[nx][ny] == 0) continue;
                Cnt++;
            }

            if (Cnt &lt; 3) V.push_back(make_pair(i, j));
        }
    }

    for (int i = 0; i &lt; V.size(); i++)
    {
        int x = V[i].first;
        int y = V[i].second;
        MAP[x][y]--;
        Sum_Answer--;
    }
}

int BFS(int a, int b)
{
    queue&lt;pair&lt;int, int&gt;&gt; Q;
    Q.push(make_pair(a, b));
    Visit[a][b] = true;
    int Cnt = 1;

    while (Q.empty() == 0)
    {
        int x = Q.front().first;
        int y = Q.front().second;
        Q.pop();

        for (int i = 0; i &lt; 4; i++)
        {
            int nx = x + dx[i];
            int ny = y + dy[i];
            if (nx &gt;= 0 &amp;&amp; ny &gt;= 0 &amp;&amp; nx &lt; N &amp;&amp; ny &lt; N)
            {
                if (MAP[nx][ny] != 0 &amp;&amp; Visit[nx][ny] == false)
                {
                    Visit[nx][ny] = true;
                    Q.push(make_pair(nx, ny));
                    Cnt++;
                }
            }
        }
    }
    return Cnt;
}

void Calculate_Ice_Size()
{
    for (int i = 0; i &lt; N; i++)
    {
        for (int j = 0; j &lt; N; j++)
        {
            if (MAP[i][j] == 0) continue;
            if (Visit[i][j] == true) continue;

            int Result = BFS(i, j);
            Size_Answer = Max(Size_Answer, Result);
        }
    }
}

void Solution()
{
    for (int i = 0; i &lt; Q; i++)
    {
        int L = (1 &lt;&lt; Cmd[i]);
        Remake_MAP(L);
        Melting_Ice();
    }
    Calculate_Ice_Size();

    cout &lt;&lt; Sum_Answer &lt;&lt; endl &lt;&lt; Size_Answer &lt;&lt; endl;
}

void Solve()
{
    Input();
    Solution();
}

int main(void)
{
    ios::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);
    Solve();

    return 0;
}</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[백준 20057]]></title>
            <link>https://velog.io/@sj-lee33/%EB%B0%B1%EC%A4%80-20057</link>
            <guid>https://velog.io/@sj-lee33/%EB%B0%B1%EC%A4%80-20057</guid>
            <pubDate>Thu, 10 Feb 2022 14:45:46 GMT</pubDate>
            <description><![CDATA[<pre><code class="language-cpp">#include &lt;iostream&gt;

#define MAX 510
#define endl &quot;\n&quot;
using namespace std;

int N, Answer;
int MAP[MAX][MAX];

int dx[] = { 0, 0, 1, -1 };
int dy[] = { 1, -1, 0, 0 };

int xdx[4][10] = { { -1, 1, -1, 1, -1, 1, -2, 2, 0, 0 },{ -1, 1, -1, 1, -1, 1, -2, 2, 0, 0 },
                  { 0, 0, 1, 1, 2, 2, 1, 1, 3, 2}, { 0, 0, -1, -1, -2, -2, -1, -1, -3, -2} };
int ydy[4][10] = { { 0, 0, 1, 1, 2, 2, 1, 1, 3, 2}, { 0, 0, -1, -1, -2, -2, -1, -1, -3, -2},
                  { -1, 1, -1, 1, -1, 1, -2, 2, 0, 0}, {-1, 1, -1, 1, -1, 1, -2, 2, 0, 0} };
int Percent[9] = { 1, 1, 7, 7, 10, 10, 2, 2, 5 };

void Input()
{
    cin &gt;&gt; N;
    for (int i = 1; i &lt;= N; i++) 
    {
        for (int j = 1; j &lt;= N; j++)
        {
            cin &gt;&gt; MAP[i][j];
        }
    }
}

int Change_Dir(int Dir)
{
    if (Dir == 0) return 3;
    if (Dir == 1) return 2;
    if (Dir == 2) return 0;
    if (Dir == 3) return 1;
}

void Spread_Sand(int x, int y,int Dir)
{
    int xx = x + dx[Dir];
    int yy = y + dy[Dir];
    if (MAP[xx][yy] == 0) return;

    int Sand = MAP[xx][yy];
    int Temp = Sand;
    for (int i = 0; i &lt; 9; i++)
    {
        int nx = x + xdx[Dir][i];
        int ny = y + ydy[Dir][i];
        int Per = Percent[i];
        int Plus = (Temp * Per) / 100;

        if (nx &lt; 1 || ny &lt; 1 || nx &gt; N || ny &gt; N) Answer += Plus;
        else MAP[nx][ny] += Plus;

        Sand -= Plus;
    }
    int nx = x + xdx[Dir][9];
    int ny = y + ydy[Dir][9];

    if (nx &lt; 1 || ny &lt; 1 || nx &gt; N || ny &gt; N) Answer += Sand;
    else MAP[nx][ny] += Sand;
    MAP[xx][yy] = 0;
}

void Solution()
{
    int x = (N + 1) / 2;
    int y = (N + 1) / 2;
    int Dir = 1;        
    int Move_Cnt = 1;    

    while (1)
    {
        for (int i = 0; i &lt; 2; i++)
        {
            for (int j = 0; j &lt; Move_Cnt; j++)
            {
                Spread_Sand(x, y, Dir);
                x += dx[Dir];
                y += dy[Dir];
            }
            Dir = Change_Dir(Dir);
        }

        Move_Cnt++;
        if (Move_Cnt == N)
        {
            for (int j = 0; j &lt; Move_Cnt; j++)
            {
                Spread_Sand(x, y, Dir);
                x += dx[Dir];
                y += dy[Dir];
            }
            break;
        }
    }
    cout &lt;&lt; Answer &lt;&lt; endl;
}

void Solve()
{
    Input();
    Solution();
}

int main(void)
{
    ios::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);

    Solve();

    return 0;
}
</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[백준 20056]]></title>
            <link>https://velog.io/@sj-lee33/%EB%B0%B1%EC%A4%80-20056</link>
            <guid>https://velog.io/@sj-lee33/%EB%B0%B1%EC%A4%80-20056</guid>
            <pubDate>Wed, 09 Feb 2022 17:16:10 GMT</pubDate>
            <description><![CDATA[<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;vector&gt;

#define MAX 55
#define endl &quot;\n&quot;
using namespace std;

struct FIREBALL
{
    int x;
    int y;
    int Massive;
    int Speed;
    int Dir;
};

int dx[] = { -1, -1, 0, 1, 1, 1, 0, -1 };
int dy[] = { 0, 1, 1, 1, 0, -1, -1, -1 };
int T_Dir[] = { 0, 2, 4, 6 };
int F_Dir[] = { 1, 3, 5 ,7 };

int N, M, K;
vector&lt;FIREBALL&gt; MAP[MAX][MAX];
vector&lt;FIREBALL&gt; FireBall;

void Input()
{
    int Num = 0;
    cin &gt;&gt; N &gt;&gt; M &gt;&gt; K;
    for (int i = 0; i &lt; M; i++)
    {
        int r, c, m, s, d;
        cin &gt;&gt; r &gt;&gt; c &gt;&gt; m &gt;&gt; s &gt;&gt; d;
        FireBall.push_back({ r, c, m, s, d });
        MAP[r][c].push_back({ r, c, m, s, d });
    }
}

void Move_FireBall()
{
    for (int i = 1; i &lt;= N; i++)
    {
        for (int j = 1; j &lt;= N; j++)
        {
            MAP[i][j].clear();
        }
    }

    for (int i = 0; i &lt; FireBall.size(); i++)
    {
        int x = FireBall[i].x;
        int y = FireBall[i].y;
        int Mass = FireBall[i].Massive;
        int Speed = FireBall[i].Speed;
        int Dir = FireBall[i].Dir;

        int Move = Speed % N;
        int nx = x + dx[Dir] * Move;
        int ny = y + dy[Dir] * Move;
        if (nx &gt; N) nx -= N;
        if (ny &gt; N) ny -= N;
        if (nx &lt; 1) nx += N;
        if (ny &lt; 1) ny += N;
        MAP[nx][ny].push_back({ nx,ny,Mass,Speed,Dir });
        FireBall[i].x = nx;
        FireBall[i].y = ny;
    }
}

void Sum_FireBall()
{
    vector&lt;FIREBALL&gt; Temp;
    for (int i = 1; i &lt;= N; i++)
    {
        for (int j = 1; j &lt;= N; j++)
        {
            if (MAP[i][j].size() == 0)continue;
            if (MAP[i][j].size() == 1)
            {
                Temp.push_back(MAP[i][j][0]);
                continue;
            }

            int Massive_Sum = 0;
            int Speed_Sum = 0;
            int Cnt = MAP[i][j].size();

            bool Even = true;
            bool Odd = true;
            for (int k = 0; k &lt; MAP[i][j].size(); k++)
            {
                Massive_Sum += MAP[i][j][k].Massive;
                Speed_Sum += MAP[i][j][k].Speed;
                if (MAP[i][j][k].Dir % 2 == 0) Odd = false;
                else Even = false;
            }

            int Mass = Massive_Sum / 5;
            int Speed = Speed_Sum / Cnt;
            if (Mass == 0) continue;
            if (Even == true || Odd == true)
            {
                for (int k = 0; k &lt; 4; k++)    Temp.push_back({ i, j, Mass, Speed, T_Dir[k] });
            }
            else
            {
                for (int k = 0; k &lt; 4; k++) Temp.push_back({ i, j, Mass, Speed, F_Dir[k] });
            }
        }
    }
    FireBall = Temp;
}

void Solution()
{
    for (int i = 0; i &lt; K; i++)
    {
        Move_FireBall();
        Sum_FireBall();
    }

    int Answer = 0;
    for(int i = 0 ; i&lt; FireBall.size(); i++) Answer += FireBall[i].Massive;

    cout &lt;&lt; Answer &lt;&lt; endl;
}

void Solve()
{
    Input();
    Solution();
}

int main(void)
{
    ios::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);

    Solve();

    return 0;
}</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[백준 23289]]></title>
            <link>https://velog.io/@sj-lee33/%EB%B0%B1%EC%A4%80-23289</link>
            <guid>https://velog.io/@sj-lee33/%EB%B0%B1%EC%A4%80-23289</guid>
            <pubDate>Tue, 08 Feb 2022 14:55:26 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p><a href="https://www.acmicpc.net/problem/23289">https://www.acmicpc.net/problem/23289</a></p>
</blockquote>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;vector&gt;
#include &lt;queue&gt;

#define endl &quot;\n&quot;
#define MAX 25
using namespace std;

int r, c, k, w;
int map[MAX][MAX];
bool wallMap[MAX][MAX][4];

vector&lt;pair&lt;int, int&gt;&gt; searchPos;
vector&lt;pair&lt;pair&lt;int, int&gt;, int&gt;&gt; heater;
vector&lt;pair&lt;pair&lt;int, int&gt;, int&gt;&gt; wall;

int dx[] = { 0, 0, 1, -1 };
int dy[] = { 1, -1, 0, 0 };

int wdx[4][3] = { { -1, 0, 1 }, {-1, 0, 1 }, {1, 1, 1}, {-1, -1, -1} };
int wdy[4][3] = { { 1, 1, 1}, { -1, -1, -1 }, {-1, 0, 1 },{-1, 0, 1} };

void printMap(int A[][MAX]) {
    for (int i = 1; i &lt;= r; i++) {
        for (int j = 1; j &lt;= c; j++) {
            printf(&quot;%2d &quot;, A[i][j]);
        }
        cout &lt;&lt; endl;
    }
    cout &lt;&lt; &quot;#######################################################&quot; &lt;&lt; endl;
}

void input() {
    cin &gt;&gt; r &gt;&gt; c &gt;&gt; k;
    for (int i = 1; i &lt;= r; i++) {
        for (int j = 1; j &lt;= c; j++) {
            cin &gt;&gt; map[i][j];
            if (map[i][j] != 0 &amp;&amp; map[i][j] != 5) {
                heater.push_back(make_pair(make_pair(i, j), map[i][j]));
            }
            else if (map[i][j] == 5) {
                searchPos.push_back(make_pair(i, j));
            }
            map[i][j] = 0;
        }
    }
    cin &gt;&gt; w;
    for (int i = 0; i &lt; w; i++) {
        int a, b, c; cin &gt;&gt; a &gt;&gt; b &gt;&gt; c;
        wall.push_back(make_pair(make_pair(a, b), c));
    }
}

void settingWall() {
    for (int i = 0; i &lt; w; i++) {
        int x = wall[i].first.first;
        int y = wall[i].first.second;
        int t = wall[i].second;

        if (t == 0) {
            wallMap[x][y][3] = true;
            wallMap[x - 1][y][2] = true;
        }
        else {
            wallMap[x][y][0] = true;
            wallMap[x][y + 1][1] = true;
        }
    }
}

bool check() {
    for (int i = 0; i &lt; searchPos.size(); i++) {
        int x = searchPos[i].first;
        int y = searchPos[i].second;
        if (map[x][y] &lt; k) return false;
    }
    return true;
}

int changeMydir(int d) {
    switch (d) {
    case 1:
        return 0;
    case 2:
        return 1;
    case 3:
        return 3;
    case 4:
        return 2;
    }
}

void copyMap(int A[][MAX], int B[][MAX]) {
    for (int i = 1; i &lt;= r; i++) {
        for (int j = 1; j &lt;= c; j++) {
            A[i][j] = B[i][j];
        }
    }
}

bool checkWall(int x, int y, int nx, int ny, int d, int dir) {
    if (dir == 1) {
        if (wallMap[x][y][d] == false) return true;
    }
    else if(dir == 0){
        if (d == 0) {
            int upx = x - 1;
            int upy = y;
            if (wallMap[x][y][3] == false &amp;&amp; wallMap[upx][upy][0] == false) return true;
        }
        else if (d == 1) {
            int upx = x - 1;
            int upy = y;
            if (wallMap[x][y][3] == false &amp;&amp; wallMap[upx][upy][1] == false) return true;
        }
        else if (d == 2) {
            int dnx = x;
            int dny = y - 1;
            if (wallMap[x][y][1] == false &amp;&amp; wallMap[dnx][dny][2] == false) return true;
        }
        else if (d == 3) {
            int dnx = x;
            int dny = y - 1;
            if (wallMap[x][y][1] == false &amp;&amp; wallMap[dnx][dny][3] == false) return true;
        }
    }
    else if (dir == 2) {
        if (d == 0) {
            int upx = x + 1;
            int upy = y;
            if (wallMap[x][y][2] == false &amp;&amp; wallMap[upx][upy][0] == false) return true;
        }
        else if (d == 1) {
            int upx = x + 1;
            int upy = y;
            if (wallMap[x][y][2] == false &amp;&amp; wallMap[upx][upy][1] == false) return true;
        }
        else if (d == 2) {
            int dnx = x;
            int dny = y + 1;
            if (wallMap[x][y][0] == false &amp;&amp; wallMap[dnx][dny][2] == false) return true;
        }
        else if (d == 3) {
            int dnx = x;
            int dny = y + 1;
            if (wallMap[x][y][0] == false &amp;&amp; wallMap[dnx][dny][3] == false) return true;
        }
    }
    return false;
}

void addMap(int A[][MAX], int B[][MAX]) {
    for (int i = 1; i &lt;= r; i++) {
        for (int j = 1; j &lt;= c; j++) {
            A[i][j] += B[i][j];
        }
    }
}

void spread(int x, int y, int d) {
    bool update[MAX][MAX] = { false, };
    d = changeMydir(d);
    x += dx[d];
    y += dy[d];
    if (x &lt; 1 || y &lt; 1 || x &gt; r || y &gt; c) return;

    queue&lt;pair&lt;pair&lt;int, int&gt;, int &gt;&gt; q;
    q.push(make_pair(make_pair(x, y), 5));

    while (q.empty() == 0) {
        int x = q.front().first.first;
        int y = q.front().first.second;
        int wind = q.front().second;
        q.pop();

        map[x][y] += wind;
        if (wind == 1) continue;

        for (int i = 0; i &lt; 3; i++) {
            int nx = x + wdx[d][i];
            int ny = y + wdy[d][i];
            if (nx &gt;= 1 &amp;&amp; ny &gt;= 1 &amp;&amp; nx &lt;= r &amp;&amp; ny &lt;= c) {
                if (update[nx][ny] == false &amp;&amp; checkWall(x, y, nx, ny, d, i) == true) {
                    update[nx][ny] = true;
                    q.push(make_pair(make_pair(nx, ny), wind - 1));
                }
            }
        }
    }
}

void spreadWind() {
    for (int i = 0; i &lt; heater.size(); i++) {
        int x = heater[i].first.first;
        int y = heater[i].first.second;
        int d = heater[i].second;
        spread(x, y, d);
    }
}

void controlTemperature() {
    int tempMap[MAX][MAX] = { 0, };
    for (int x = 1; x &lt;= r; x++) {
        for (int y = 1; y &lt;= c; y++) {
            for (int i = 0; i &lt; 2; i++) {
                int dir = i == 0 ? 0 : 2;
                int nx = x + dx[dir];
                int ny = y + dy[dir];
                if (nx &gt;= 1 &amp;&amp; ny &gt;= 1 &amp;&amp; nx &lt;= r &amp;&amp; ny &lt;= c) {
                    if (wallMap[x][y][dir] == false) {
                        pair&lt;int, int&gt; maxCoord, minCoord;
                        if (map[x][y] &gt; map[nx][ny]) {
                            maxCoord = { x, y };
                            minCoord = { nx, ny };
                        }
                        else {
                            maxCoord = { nx, ny };
                            minCoord = { x, y };
                        }

                        int diff = abs(map[x][y] - map[nx][ny]);
                        diff /= 4;
                        tempMap[maxCoord.first][maxCoord.second] -= diff;
                        tempMap[minCoord.first][minCoord.second] += diff;
                    }
                }
            }
        }
    }
    addMap(map, tempMap);
}

void decreaseTemperature() {
    for (int i = 1; i &lt;= c; i++) {
        if (map[1][i] &gt; 0) map[1][i]--;
        if (map[r][i] &gt; 0) map[r][i]--;
    }
    for (int i = 2; i &lt; r; i++) {
        if (map[i][1] &gt; 0) map[i][1]--;
        if (map[i][c] &gt; 0) map[i][c]--;
    }

}

void solution() {
    settingWall();
    int chocolate = 0;
    while (1) {
        if (chocolate &gt; 100) {
            break;
        }
        spreadWind();
        controlTemperature();
        decreaseTemperature();
        chocolate++;

        if (check() == true) {
            break;
        }
    }
    cout &lt;&lt; chocolate &lt;&lt; endl;
}

void solve() {
    input();
    solution();
}

int main(void) {
    ios::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);

    solve();

    return 0;
}</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[백준 21610]]></title>
            <link>https://velog.io/@sj-lee33/%EB%B0%B1%EC%A4%80-21610</link>
            <guid>https://velog.io/@sj-lee33/%EB%B0%B1%EC%A4%80-21610</guid>
            <pubDate>Mon, 07 Feb 2022 14:03:52 GMT</pubDate>
            <description><![CDATA[<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;cstring&gt;
#include &lt;vector&gt;

#define MAX 55
using namespace std;

int N, M, Answer;
int MAP[MAX][MAX];
bool Cloud_MAP[MAX][MAX];
vector&lt;pair&lt;int, int&gt;&gt; Cloud;
vector&lt;pair&lt;int, int&gt;&gt; Cmd;

int dx[] = { 0, 0, -1, -1, -1, 0, 1, 1, 1 };
int dy[] = { 0, -1, -1, 0, 1, 1, 1, 0, -1 };

void Input()
{
    cin &gt;&gt; N &gt;&gt; M;
    for (int i = 0; i &lt; N; i++)
    {
        for (int j = 0; j &lt; N; j++)
        {
            cin &gt;&gt; MAP[i][j];
        }
    }
    for (int i = 0; i &lt; M; i++)
    {
        int a, b; cin &gt;&gt; a &gt;&gt; b;
        Cmd.push_back(make_pair(a, b));
    }
}

void Init_Cloud()
{
    Cloud.push_back(make_pair(N - 2, 0));
    Cloud.push_back(make_pair(N - 2, 1));
    Cloud.push_back(make_pair(N - 1, 0));
    Cloud.push_back(make_pair(N - 1, 1));
    Cloud_MAP[N - 2][0] = true;
    Cloud_MAP[N - 2][1] = true;
    Cloud_MAP[N - 1][0] = true;
    Cloud_MAP[N - 1][1] = true;
}

int Make_Range(int x)
{
    if (x &lt; 0) return N - 1;
    if (x &gt;= N) return 0;
    return x;
}

void Move_Cloud(int Idx)
{
    int Dir = Cmd[Idx].first;
    int Cnt = Cmd[Idx].second;
    memset(Cloud_MAP, false, sizeof(Cloud_MAP));
    for (int i = 0; i &lt; Cloud.size(); i++)
    {
        int x = Cloud[i].first;
        int y = Cloud[i].second;
        int nx = x;
        int ny = y;
        for (int j = 0; j &lt; Cnt; j++)
        {
            nx += dx[Dir];
            ny += dy[Dir];
            nx = Make_Range(nx);
            ny = Make_Range(ny);
        }
        Cloud[i].first = nx;
        Cloud[i].second = ny;
    }
    for (int i = 0; i &lt; Cloud.size(); i++)
    {
        int x = Cloud[i].first;
        int y = Cloud[i].second;
        Cloud_MAP[x][y] = true;
    }
}

void Make_Rain()
{
    for (int i = 0; i &lt; Cloud.size(); i++)
    {
        int x = Cloud[i].first;
        int y = Cloud[i].second;
        MAP[x][y]++;
    }
}

void Water_Bug()
{
    for (int i = 0; i &lt; Cloud.size(); i++)
    {
        int x = Cloud[i].first;
        int y = Cloud[i].second;
        int Cnt = 0;
        for (int j = 2; j &lt;= 8; j += 2)
        {
            int nx = x + dx[j];
            int ny = y + dy[j];
            if (nx &lt; 0 || ny &lt; 0 || nx &gt;= N || ny &gt;= N) continue;
            if (MAP[nx][ny] &gt;= 1) Cnt++;
        }
        MAP[x][y] += Cnt;
    }
}

void Delete_Cloud()
{
    Cloud.clear();
}

void Make_Cloud()
{
    for (int i = 0; i &lt; N; i++)
    {
        for (int j = 0; j &lt; N; j++)
        {
            if (Cloud_MAP[i][j] == true) continue;
            if (MAP[i][j] &lt; 2) continue;
            MAP[i][j] -= 2;
            Cloud.push_back(make_pair(i, j));
        }
    }

    memset(Cloud_MAP, false, sizeof(Cloud_MAP));
    for (int i = 0; i &lt; Cloud.size(); i++)
    {
        int x = Cloud[i].first;
        int y = Cloud[i].second;
        Cloud_MAP[x][y] = true;
    }
}

void Find_Answer()
{
    for (int i = 0; i &lt; N; i++)
    {
        for (int j = 0; j &lt; N; j++)
        {
            Answer += MAP[i][j];
        }
    }
}

void Solution()
{
    Init_Cloud();
    for (int i = 0; i &lt; M; i++)
    {
        Move_Cloud(i);
        Make_Rain();
        Water_Bug();
        Delete_Cloud();
        Make_Cloud();
    }
    Find_Answer();
    cout &lt;&lt; Answer &lt;&lt; endl;
}

void Solve()
{
    Input();
    Solution();
}

int main(void)
{
    ios::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);

    Solve();

    return 0;
}</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[안드로이드 카카오 로그인, 로그아웃 ]]></title>
            <link>https://velog.io/@sj-lee33/%EC%95%88%EB%93%9C%EB%A1%9C%EC%9D%B4%EB%93%9C-%EC%B9%B4%EC%B9%B4%EC%98%A4-%EB%A1%9C%EA%B7%B8%EC%9D%B8-%EB%A1%9C%EA%B7%B8%EC%95%84%EC%9B%83</link>
            <guid>https://velog.io/@sj-lee33/%EC%95%88%EB%93%9C%EB%A1%9C%EC%9D%B4%EB%93%9C-%EC%B9%B4%EC%B9%B4%EC%98%A4-%EB%A1%9C%EA%B7%B8%EC%9D%B8-%EB%A1%9C%EA%B7%B8%EC%95%84%EC%9B%83</guid>
            <pubDate>Sat, 05 Feb 2022 07:27:54 GMT</pubDate>
            <description><![CDATA[<h1 id="요약">요약</h1>
<p>사용자를 인증하고 토큰을 발급함</p>
<h2 id="토큰">토큰</h2>
<ol>
<li>access token : 사용자 정보 기반의 API 호출에 쓰임</li>
<li>refresh token : 일정기간동안 사용자 인증 절차를 거치지 않고도 엑세스 토큰을 갱신하도록 해줌</li>
</ol>
<ul>
<li>토큰 발행 절차
  1) 카카오계정 인증
  2) 사용자 동의 (이미 동의한 경우, 건너뛰기)
  3) Authorization Code - 인가코드 발급
  4) 인가코드로 OAuthToken - 토큰 발급</li>
</ul>
<h2 id="1-카카오-로그인">[1] 카카오 로그인</h2>
<ol>
<li><p><a href="https://developers.kakao.com/docs/latest/ko/kakaologin/android#login-through-kakaotalk">카카오톡으로 로그인</a>
카톡에 연결된 계정 및 인증정보 사용</p>
</li>
<li><p><a href="https://developers.kakao.com/docs/latest/ko/kakaologin/android#login-with-kakaoaccount">카카오 계정으로(웹 브라우저로) 로그인</a>
직접 계정정보 입력</p>
</li>
<li><p>인증을 완료한 뒤, 사용자에게 앱 이용 관련 동의를 요청하는 동의 화면을 출력합니다. 동의 화면에서 사용자가 모든 필수 항목에 동의하고 [동의하고 계속하기]를 선택하면 Android SDK는 인가 코드 및 토큰 발급을 진행하여 카카오 로그인을 완료합니다.</p>
</li>
</ol>
<h2 id="2-a-hrefhttpsdeveloperskakaocomdocslatestkokakaologinandroidtoken-presence토큰-존재여부-확인a">[2] <a href="https://developers.kakao.com/docs/latest/ko/kakaologin/android#token-presence">토큰 존재여부 확인</a></h2>
<p>기존에 발급받은 엑세스토큰 or 리프레시토큰 존재 여부를 <code>bool</code>로 확인</p>
<ul>
<li>hasToken()의 API 결과가 False ➡️ 토큰 없음 ➡️ 로그인 필요</li>
<li>hasToken()의 API 결과가 True ➡️ 엑세스토큰 유효성 확인 ➡️ 성공시 엑세스토큰 반환, 실패시 재로그인 필요</li>
</ul>
<h2 id="3-카카오-로그아웃">[3] 카카오 로그아웃</h2>
<ul>
<li>API 요청 성공여부 상관 없이, SDK에서 토큰 삭제하면 됨</li>
</ul>
<h2 id="4-a-hrefhttpsdeveloperskakaocomdocslatestkokakaologinandroidreq-user-info사용자-정보a">[4] <a href="https://developers.kakao.com/docs/latest/ko/kakaologin/android#req-user-info">사용자 정보</a></h2>
<ul>
<li>동의 시 회원번호, 이메일, 닉네임, 프로필사진 가져올 수 있음</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[백준 16235 : 나무 재테크]]></title>
            <link>https://velog.io/@sj-lee33/%EB%B0%B1%EC%A4%80-16235-%EB%82%98%EB%AC%B4-%EC%9E%AC%ED%85%8C%ED%81%AC</link>
            <guid>https://velog.io/@sj-lee33/%EB%B0%B1%EC%A4%80-16235-%EB%82%98%EB%AC%B4-%EC%9E%AC%ED%85%8C%ED%81%AC</guid>
            <pubDate>Fri, 04 Feb 2022 08:13:17 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p><a href="https://www.acmicpc.net/problem/16235">https://www.acmicpc.net/problem/16235</a></p>
</blockquote>
<h1 id="문제">문제</h1>
<p>부동산 투자로 억대의 돈을 번 상도는 최근 N×N 크기의 땅을 구매했다. 상도는 손쉬운 땅 관리를 위해 땅을 1×1 크기의 칸으로 나누어 놓았다. 각각의 칸은 (r, c)로 나타내며, r은 가장 위에서부터 떨어진 칸의 개수, c는 가장 왼쪽으로부터 떨어진 칸의 개수이다. r과 c는 1부터 시작한다.</p>
<p>상도는 전자통신공학과 출신답게 땅의 양분을 조사하는 로봇 S2D2를 만들었다. S2D2는 1×1 크기의 칸에 들어있는 양분을 조사해 상도에게 전송하고, 모든 칸에 대해서 조사를 한다. 가장 처음에 양분은 모든 칸에 5만큼 들어있다.</p>
<p>매일 매일 넓은 땅을 보면서 뿌듯한 하루를 보내고 있던 어느 날 이런 생각이 들었다.</p>
<p>나무 재테크를 하자!</p>
<p>나무 재테크란 작은 묘목을 구매해 어느정도 키운 후 팔아서 수익을 얻는 재테크이다. 상도는 나무 재테크로 더 큰 돈을 벌기 위해 M개의 나무를 구매해 땅에 심었다. 같은 1×1 크기의 칸에 여러 개의 나무가 심어져 있을 수도 있다.</p>
<p>이 나무는 사계절을 보내며, 아래와 같은 과정을 반복한다.</p>
<p>봄에는 나무가 자신의 나이만큼 양분을 먹고, 나이가 1 증가한다. 각각의 나무는 나무가 있는 1×1 크기의 칸에 있는 양분만 먹을 수 있다. 하나의 칸에 여러 개의 나무가 있다면, 나이가 어린 나무부터 양분을 먹는다. 만약, 땅에 양분이 부족해 자신의 나이만큼 양분을 먹을 수 없는 나무는 양분을 먹지 못하고 즉시 죽는다.</p>
<p>여름에는 봄에 죽은 나무가 양분으로 변하게 된다. 각각의 죽은 나무마다 나이를 2로 나눈 값이 나무가 있던 칸에 양분으로 추가된다. 소수점 아래는 버린다.</p>
<p>가을에는 나무가 번식한다. 번식하는 나무는 나이가 5의 배수이어야 하며, 인접한 8개의 칸에 나이가 1인 나무가 생긴다. 어떤 칸 (r, c)와 인접한 칸은 (r-1, c-1), (r-1, c), (r-1, c+1), (r, c-1), (r, c+1), (r+1, c-1), (r+1, c), (r+1, c+1) 이다. 상도의 땅을 벗어나는 칸에는 나무가 생기지 않는다.</p>
<p>겨울에는 S2D2가 땅을 돌아다니면서 땅에 양분을 추가한다. 각 칸에 추가되는 양분의 양은 A[r][c]이고, 입력으로 주어진다.</p>
<p>K년이 지난 후 상도의 땅에 살아있는 나무의 개수를 구하는 프로그램을 작성하시오.</p>
<h3 id="핵심">핵심</h3>
<ul>
<li><p>땅크기 NxN</p>
</li>
<li><p>칸 좌표 (r, c), 1부터 시작</p>
<pre><code>(1,1)  (1,2)
(2,1)  (2,2)</code></pre></li>
<li><p>모든 칸을 조사</p>
</li>
<li><p>초기 나무 M개, 한 칸에 여러개 가능</p>
</li>
<li><p>초기양분 5</p>
</li>
<li><p>봄</p>
<ul>
<li>양분-=나이 ➡️ 나이++</li>
<li>자기 칸의 양분만 먹을수 있음, 어린 나무부터, 양껏 못먹으면 죽음</li>
</ul>
</li>
<li><p>여름</p>
<ul>
<li>양분 += (죽은나무 나이)/2</li>
<li>소수점 버림</li>
</ul>
</li>
<li><p>가을</p>
<ul>
<li>if (나이%5 == 0) ➡️ 번식</li>
<li>번식 == 인접 8칸에 나이가 1인 나무 생김</li>
</ul>
</li>
<li><p>겨울</p>
<ul>
<li>땅 양분 += A[r][c]</li>
</ul>
</li>
<li><p>K년 후 남은 나무 갯수 구하기</p>
</li>
</ul>
<hr>
<h1 id="입력">입력</h1>
<p>첫째 줄에 <strong>N, M, K</strong>가 주어진다.</p>
<p>둘째 줄부터 N개의 줄에 <strong>A</strong>배열의 값이 주어진다. r번째 줄의 c번째 값은 A[r][c]이다.</p>
<p>다음 M개의 줄에는 상도가 심은 <strong>나무의 정보</strong>를 나타내는 세 정수 x, y, z가 주어진다. 
처음 두 개의 정수는 나무의 위치 (x, y)를 의미하고, 
마지막 정수는 그 나무의 나이를 의미한다.</p>
<h2 id="제한">제한</h2>
<ul>
<li>1 ≤ N ≤ 10</li>
<li>1 ≤ M ≤ N2</li>
<li>1 ≤ K ≤ 1,000</li>
<li>1 ≤ A[r][c] ≤ 100</li>
<li>1 ≤ 입력으로 주어지는 나무의 나이 ≤ 10</li>
<li>입력으로 주어지는 나무의 위치는 모두 서로 다름</li>
</ul>
<hr>
<h1 id="풀이">풀이</h1>
<h3 id="📍-접근">📍 접근</h3>
<ul>
<li>배열의 모든 요소를 방문하고, 모든 요소에서 작업을 해줘야 함
➡️ 그래프 탐색까지 할 필요 없음. 그냥 반복문 돌려야 됨.</li>
<li>그럼 땅 <code>MAP</code>은 정수배열로, 그 땅의 양분 저장</li>
<li><code>alive_tree</code>는 deque로, 살아있는 나무의 (x, y, z)를 저장
➡️ 나이가 어린 나무부터 양분을 먹기때문에 <code>deque</code>로</li>
<li><code>dead_tree</code>도 deque로, 죽은 나무의 (x, y, z)를 저장</li>
<li>겨울에 <strong>인접 8개 칸 방문</strong> 해야되니까 dx, dy도 선언</li>
</ul>
<h3 id="📍-풀이">📍 풀이</h3>
<ul>
<li>계절별로 함수 나누자</li>
<li><code>Solution</code> 함수에서 K년을 난다</li>
<li><code>main</code> 함수에서 살아있는 나무를 세어 출력한다</li>
</ul>
<h3 id="📍-코드">📍 코드</h3>
<pre><code class="language-cpp">#include &lt;algorithm&gt;  // for sort deque
#include &lt;deque&gt;
#include &lt;iostream&gt;
using namespace std;
#define MAX 11

int N, M, K;
int A[MAX][MAX];
int MAP[MAX][MAX];
deque&lt;int&gt; alive_tree[MAX][MAX];
deque&lt;int&gt; dead_tree[MAX][MAX];
int ans;

// 위쪽부터 시계방향으로 인근 8칸 이동
int dx[8] = {-1, -1, 0, 1, 1, 1, 0, -1};
int dy[8] = {0, 1, 1, 1, 0, -1, -1, -1};

void Spring() {
    for (int i = 1; i &lt;= N; i++) {
        for (int j = 1; j &lt;= N; j++) {
            // 이 땅에 살아있는 나무 갯수 trees
            int trees = alive_tree[i][j].size();
            while (trees--) {
                int age = alive_tree[i][j].front();
                alive_tree[i][j].pop_front();
                if (age &gt; MAP[i][j]) {
                    // 죽어
                    dead_tree[i][j].push_back(age);
                    continue;
                }
                MAP[i][j] -= age;
                alive_tree[i][j].push_back(age + 1);
            }
        }
    }
}

void Summer() {
    for (int i = 1; i &lt;= N; i++) {
        for (int j = 1; j &lt;= N; j++) {
            // 이 땅에 죽어있는 나무 갯수 dtrees
            int dtrees = dead_tree[i][j].size();
            while (dtrees--) {
                int age = dead_tree[i][j].front();
                dead_tree[i][j].pop_front();
                MAP[i][j] += (age / 2);
            }
        }
    }
}

void Breeding(int x, int y) {
    for (int i = 0; i &lt; 8; i++) {
        int nx = x + dx[i];
        int ny = y + dy[i];
        if (nx &lt;= N &amp;&amp; ny &lt;= N &amp;&amp; nx &gt;= 1 &amp;&amp; ny &gt;= 1) {
            alive_tree[nx][ny].push_front(1);
        }
    }
}

void Fall() {
    for (int i = 1; i &lt;= N; i++) {
        for (int j = 1; j &lt;= N; j++) {
            // 이 땅에 살아있는 나무 갯수 trees
            int trees = alive_tree[i][j].size();
            for (int k = 0; k &lt; trees; k++) {
                int age = alive_tree[i][j][k];
                if (age % 5 == 0) {
                    Breeding(i, j);
                }
            }
        }
    }
}

void Winter() {
    for (int i = 1; i &lt;= N; i++) {
        for (int j = 1; j &lt;= N; j++) {
            MAP[i][j] += A[i][j];
        }
    }
}

void Solution() {
    // 첫번째 봄이 오기 전에 alive_tree 나이순 정렬 해줘야됨
    for (int i = 1; i &lt;= N; i++) {
        for (int j = 1; j &lt;= N; j++) {
            sort(alive_tree[i][j].begin(), alive_tree[i][j].end());
        }
    }

    // K년 나기
    while (K--) {
        Spring();
        Summer();
        Fall();
        Winter();
    }

    // 살아남은 나무 세기
    for (int i = 1; i &lt;= N; i++) {
        for (int j = 1; j &lt;= N; j++) {
            ans += alive_tree[i][j].size();
        }
    }
}

void Input() {
    int x, y, z;
    cin &gt;&gt; N &gt;&gt; M &gt;&gt; K;
    for (int i = 1; i &lt;= N; i++) {
        for (int j = 1; j &lt;= N; j++) {
            cin &gt;&gt; A[i][j];
            MAP[i][j] = 5;
        }
    }
    for (int i = 0; i &lt; M; i++) {
        cin &gt;&gt; x &gt;&gt; y &gt;&gt; z;
        alive_tree[x][y].push_back(z);
    }
}

int main() {
    // 입력
    Input();
    Solution();

    cout &lt;&lt; ans &lt;&lt; endl;
}</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[백준 19238]]></title>
            <link>https://velog.io/@sj-lee33/%EB%B0%B1%EC%A4%80-19238</link>
            <guid>https://velog.io/@sj-lee33/%EB%B0%B1%EC%A4%80-19238</guid>
            <pubDate>Fri, 04 Feb 2022 06:24:41 GMT</pubDate>
            <description><![CDATA[<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;algorithm&gt;
#include &lt;queue&gt;
#include &lt;vector&gt;
#include &lt;cstring&gt;

#define endl &quot;\n&quot;
#define MAX 25
using namespace std;

/* 손님을 관리하기 위한 구조체 */
/* 알아야할 정보 = [ 손님의 좌표 , 손님의 목적지 좌표 ] */
struct CUSTOMER
{
    int x;
    int y;
    int Dest_x;
    int Dest_y;
};

/* 조건에 맞는 손님을 찾기 위한 정보를 관리하는 구조체 */
/* 알아야할 정보 = [ x좌표 , y좌표 , 거리 , 손님의 번호 ] */
struct INFO
{
    int x;
    int y;
    int Dist;
    int Num;
};

int N, M, Fuel;
int Taxi_x, Taxi_y;
int MAP[MAX][MAX];
bool Visit[MAX][MAX];
CUSTOMER Customer[MAX * MAX];

int dx[] = { 0, 0, 1, -1 };
int dy[] = { 1, -1, 0, 0 };

void Input()
{
    cin &gt;&gt; N &gt;&gt; M &gt;&gt; Fuel;
    for (int i = 0; i &lt; N; i++)
    {
        for (int j = 0; j &lt; N; j++)
        {
            cin &gt;&gt; MAP[i][j];
            if (MAP[i][j] == 1) MAP[i][j] = -1;
            // 맵에서 벽으로 표시되는 1을 -1로 변경.
        }
    }
    cin &gt;&gt; Taxi_x &gt;&gt; Taxi_y;
    Taxi_x--; Taxi_y--;
    for (int i = 1; i &lt;= M; i++)
    {
        int a, b, c, d; cin &gt;&gt; a &gt;&gt; b &gt;&gt; c &gt;&gt; d;
        a--; b--; c--; d--;
        Customer[i] = { a, b, c, d };
        MAP[a][b] = i;
        // 손님이 있는 위치를 각 손님의 번호로 변경
    }
}

bool Info_Cmp(INFO A, INFO B)
{
    /* 조건에 맞는 손님을 찾기 위해서 Vector를 정렬하기 위한 기준 설정. */
    if (A.Dist &lt;= B.Dist)
    {
        if (A.Dist == B.Dist)
        {
            if (A.x &lt;= B.x)
            {
                if (A.x == B.x)
                {
                    if (A.y &lt; B.y)
                    {
                        return true;
                    }
                    return false;
                }
                return true;
            }
            return false;
        }
        return true;
    }
    return false;
}

bool BFS(int a, int b, int c, int d, int Num)
{
    /* 손님을 최단 거리로 목적지까지 이동시키기 위한 BFS 탐색 함수. */
    memset(Visit, false, sizeof(Visit));
    queue&lt;pair&lt;pair&lt;int, int&gt;, pair&lt;int,int&gt;&gt;&gt; Q;
    Q.push(make_pair(make_pair(a, b), make_pair(0, Fuel)));
    Visit[a][b] = true;

    while (Q.empty() == 0)
    {
        int x = Q.front().first.first;
        int y = Q.front().first.second;
        int Distance = Q.front().second.first;
        int Spare_Fuel = Q.front().second.second;
        Q.pop();

        /* 목적지에 도달한다면 ? */
        /* 연료의 양을 문제의 조건에 맞게 재설정. */
        /* 택시의 위치를, 현재 이동시킨 손님의 목적지 위치로 재설정. */
        if (x == c &amp;&amp; y == d)
        {
            Fuel = Fuel - Distance;
            Fuel = Fuel + (Distance * 2);
            Taxi_x = x;
            Taxi_y = y;
            return true;
        }
        /* 더 이상 연료가 없다면 ? = 손님을 더 이상 이동시킬 수 없다. */
        if (Spare_Fuel == 0) return false;
        for (int i = 0; i &lt; 4; i++)
        {
            int nx = x + dx[i];
            int ny = y + dy[i];
            if (nx &gt;= 0 &amp;&amp; ny &gt;= 0 &amp;&amp; nx &lt; N &amp;&amp; ny &lt; N)
            {
                if (MAP[nx][ny] != -1 &amp;&amp; Visit[nx][ny] == false)
                {
                    Visit[nx][ny] = true;
                    Q.push(make_pair(make_pair(nx, ny), make_pair(Distance + 1, Spare_Fuel - 1)));
                }
            }
        }
    }
    return false;
}

int Find_Shortest_Customer()
{
    /* 현재 택시 위치에서 가장 가까운 손님을 찾기 위한 BFS함수. */
    memset(Visit, false, sizeof(Visit));
    queue&lt;pair&lt;pair&lt;int, int&gt;, pair&lt;int, int&gt;&gt;&gt; Q;
    Q.push(make_pair(make_pair(Taxi_x, Taxi_y), make_pair(0, Fuel)));
    Visit[Taxi_x][Taxi_y] = true;
    vector&lt;INFO&gt; V;
    /* 위의 벡터가 &quot;현재 연료의 양으로 찾아갈 수 있는 모든 손님에 대한 정보&quot;를 저장. */
    while (Q.empty() == 0)
    {
        int x = Q.front().first.first;
        int y = Q.front().first.second;
        int Distance = Q.front().second.first;
        int Spare_Fuel = Q.front().second.second;
        Q.pop();

        /* 맵이 1 이상이라는 것은 해당 좌표에 손님이 있음을 의미. */
        /* 따라서, 해당 좌표에 있는 손님에 대한 정보를 Vector에 저장. */
        if (MAP[x][y] &gt;= 1) V.push_back({ x, y, Distance, MAP[x][y] });
        if (Spare_Fuel == 0) continue;

        for (int i = 0; i &lt; 4; i++)
        {
            int nx = x + dx[i];
            int ny = y + dy[i];
            if (nx &gt;= 0 &amp;&amp; ny &gt;= 0 &amp;&amp; nx &lt; N &amp;&amp; ny &lt; N)
            {
                if (MAP[nx][ny] != -1 &amp;&amp; Visit[nx][ny] == false)
                {
                    Visit[nx][ny] = true;
                    Q.push(make_pair(make_pair(nx, ny), make_pair(Distance + 1, Spare_Fuel - 1)));
                }
            }
        }
    }

    /* Vector의 Size = 0 이라는 것은 찾아갈 수 있는 손님이 없음을 의미. */
    if (V.size() == 0) return -1;

    /* 그게 아니라면, 우리가 찾는 딱 한명의 손님을 찾기 위해서 Vector를 정렬. */
    /* 해당 손님은 이제 더 이상 해당 좌표에 없으므로 맵에서 값 변경. */
    /* 현재 택시 위치에서 해당 손님까지 가는데 든 연료만큼 연료의 양 또한 변경. */
    sort(V.begin(), V.end(), Info_Cmp);
    MAP[V[0].x][V[0].y] = 0;
    Fuel = Fuel - V[0].Dist;
    return V[0].Num;    
}

void Solution()
{
    /* 아무리 많아도 손님의 수 만큼만 움직이면 된다. */
    /* 따라서, 0 ~ M번까지만 반복. */
    for (int i = 0; i &lt; M; i++)
    {
        int Num = Find_Shortest_Customer();
        if (Num == -1)
        {
            cout &lt;&lt; -1 &lt;&lt; endl;
            return;
        }

        bool Move = BFS(Customer[Num].x, Customer[Num].y, Customer[Num].Dest_x, Customer[Num].Dest_y, Num);
        if (Move == false)
        {
            cout &lt;&lt; -1 &lt;&lt; endl;
            return;
        }
    }
    cout &lt;&lt; Fuel &lt;&lt; endl;
}

void Solve()
{
    Input();
    Solution();
}

int main(void)
{
    ios::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);

    //freopen(&quot;Input.txt&quot;, &quot;r&quot;, stdin);
    Solve();

    return 0;
}


출처: https://yabmoons.tistory.com/497 [얍문&#39;s Coding World..]</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[MacOS openJDK 1.8 설치하기]]></title>
            <link>https://velog.io/@sj-lee33/MacOS-openJDK-1.8-%EC%84%A4%EC%B9%98%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@sj-lee33/MacOS-openJDK-1.8-%EC%84%A4%EC%B9%98%ED%95%98%EA%B8%B0</guid>
            <pubDate>Wed, 02 Feb 2022 07:42:42 GMT</pubDate>
            <description><![CDATA[<p>개발환경 : MacBook Pro M1
목표 : openJDK 1.8.0 설치하기</p>
<h1 id="설치-방법">설치 방법</h1>
<pre><code class="language-c">// 요약

1. /bin/bash -c &quot;$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)&quot;

2. brew tap AdoptOpenJDK/openjdk

3. brew install --cask adoptopenjdk8</code></pre>
<h3 id="➡️-step-0">➡️ STEP 0</h3>
<p>맥 터미널에 들어간다.
<code>command</code>+<code>spacebar</code> 단축키로 Spotlight 창을 열어 &#39;터미널&#39; 검색해서 찾는다.</p>
<h3 id="➡️-step-1-homebrew-설치">➡️ STEP 1. Homebrew 설치</h3>
<pre><code>/bin/bash -c &quot;$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)&quot;</code></pre><p>위 코드를 입력한다.
좀 기다리면 </p>
<pre><code>==&gt; Checking for `sudo` access (which may request your password)...
Password:</code></pre><p>이런 게 뜨는데, 맨처음 환경설정할 때 지정한 컴퓨터 비밀번호 입력하면 된다.</p>
<p>뭔가 진행되다가 </p>
<pre><code>Press RETURN to continue or any other key to abort:</code></pre><p>이런 줄이 나온다. 아무 키나 눌러주면 된다. 엔터키같은 거!</p>
<h4 id="📍--homebrew-설치-확인">📍 +) Homebrew 설치 확인</h4>
<pre><code>brew help</code></pre><p>위 코드를 입력해서 다음 이미지와 같은 안내문구가 제대로 나오면 설치된 것
<img src="https://images.velog.io/images/sj-lee33/post/5b9bbd64-d665-4714-a411-f94b4f918d83/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202022-02-02%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%204.33.08.png" alt=""></p>
<h3 id="➡️-step-2-openjdk-설치">➡️ STEP 2. openJDK 설치</h3>
<pre><code>brew tap AdoptOpenJDK/openjdk
brew install --cask adoptopenjdk8</code></pre><p>위 명령어를 입력한다. 중간에 Password 치라고 한번 더 나오니 앞에서 했던 것과 똑같이 입력해 주자.</p>
<h3 id="➡️-step-3-환경변수경로-지정">➡️ STEP 3. 환경변수(경로) 지정</h3>
<pre><code>/usr/libexec/java_home -v 1.8</code></pre><p>여기까지 완료했으면 openJDK 1.8 설치 완료.</p>
<h4 id="📍--jdk-설치-확인-버전-확인">📍 +) JDK 설치 확인 (버전 확인)</h4>
<pre><code>java -version</code></pre><p>이 명령어를 입력했을 때 다음과 같은 대답이 나오면 openJDK 1.8 버전이 잘 설치된 것이다.</p>
<pre><code>openjdk version &quot;1.8.0_292&quot;
OpenJDK Runtime Environment (AdoptOpenJDK)(build 1.8.0_292-b10)
OpenJDK 64-Bit Server VM (AdoptOpenJDK)(build 25.292-b10, mixed mode)</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[백준 19237]]></title>
            <link>https://velog.io/@sj-lee33/%EB%B0%B1%EC%A4%80-19237</link>
            <guid>https://velog.io/@sj-lee33/%EB%B0%B1%EC%A4%80-19237</guid>
            <pubDate>Fri, 28 Jan 2022 14:21:31 GMT</pubDate>
            <description><![CDATA[<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;vector&gt;
#include &lt;algorithm&gt;

#define endl &quot;\n&quot;
#define MAX 25
using namespace std;

struct SHARK
{
    int x;
    int y;
    int Dir;
    bool Live;
    vector&lt;int&gt; Priority[5];
};

struct MAP_INFO
{
    vector&lt;int&gt; V;
    int Smell_Time;
    int Smell_Host;
};

int N, M, K;
MAP_INFO MAP[MAX][MAX];
SHARK Shark[410];

int dx[] = { 0, -1, 1, 0, 0 };
int dy[] = { 0, 0, 0, -1, 1 }; 

void Input()
{
    cin &gt;&gt; N &gt;&gt; M &gt;&gt; K;
    for (int i = 0; i &lt; N; i++)
    {
        for (int j = 0; j &lt; N; j++)
        {
            int a; cin &gt;&gt; a;
            if (a != 0)
            {
                MAP[i][j].V.push_back(a);
                Shark[a].x = i;
                Shark[a].y = j;
            }
            MAP[i][j].Smell_Time = 0;
            MAP[i][j].Smell_Host = 0;
        }
    }
    for (int i = 1; i &lt;= M; i++)
    {
        int Dir; cin &gt;&gt; Dir;
        Shark[i].Dir = Dir;
        Shark[i].Live = true;
    }
    for (int i = 1; i &lt;= M; i++)
    {
        for (int j = 1; j &lt;= 4; j++)
        {
            int Arr[4];
            cin &gt;&gt; Arr[0] &gt;&gt; Arr[1] &gt;&gt; Arr[2] &gt;&gt; Arr[3];
            for (int k = 0; k &lt; 4; k++)
            {
                Shark[i].Priority[j].push_back(Arr[k]);
            }
        }
    }
}

bool Check()
{
    for (int i = 2; i &lt;= M; i++)
    {
        if (Shark[i].Live == true) return false;
    }
    return true;
}

void Setting_Smell(int Time)
{
    for (int i = 1; i &lt;= M; i++)
    {
        if (Shark[i].Live == false) continue;

        int x = Shark[i].x;
        int y = Shark[i].y;
        MAP[x][y].Smell_Time = Time + K;
        MAP[x][y].Smell_Host = i;
    }
}

void Move_Shark(int Time)
{
    for (int i = 1; i &lt;= M; i++)
    {
        if (Shark[i].Live == false) continue;
        int x = Shark[i].x;
        int y = Shark[i].y;
        MAP[x][y].V.clear();
    }

    for (int i = 1; i &lt;= M; i++)
    {
        if (Shark[i].Live == false) continue;

        int x = Shark[i].x;
        int y = Shark[i].y;
        int Dir = Shark[i].Dir;
        int Self_x, Self_y, Self_Dir;
        Self_x = Self_y = Self_Dir = -1;
        bool Flag = false;

        for (int j = 0; j &lt; Shark[i].Priority[Dir].size(); j++)
        {
            int nDir = Shark[i].Priority[Dir][j];
            int nx = x + dx[nDir];
            int ny = y + dy[nDir];
            if (nx &gt;= 0 &amp;&amp; ny &gt;= 0 &amp;&amp; nx &lt; N &amp;&amp; ny &lt; N)
            {
                if (MAP[nx][ny].Smell_Time &lt;= Time)
                {
                    Flag = true;
                    MAP[nx][ny].V.push_back(i);
                    Shark[i].x = nx;
                    Shark[i].y = ny;
                    Shark[i].Dir = nDir;
                    break;
                }
                else
                {
                    if (MAP[nx][ny].Smell_Host == i)
                    {
                        if (Self_x == -1)
                        {
                            Self_x = nx;
                            Self_y = ny;
                            Self_Dir = nDir;
                        }
                    }
                }
            }
        }

        if (Flag == false)
        {
            MAP[Self_x][Self_y].V.push_back(i);
            Shark[i].x = Self_x;
            Shark[i].y = Self_y;
            Shark[i].Dir = Self_Dir;
        }
    }
}

void Killing_Shark()
{
    for (int i = 1; i &lt;= M; i++)
    {
        if (Shark[i].Live == false) continue;

        int x = Shark[i].x;
        int y = Shark[i].y;
        if (MAP[x][y].V.size() &gt;= 2)
        {
            sort(MAP[x][y].V.begin(), MAP[x][y].V.end());
            int Live_Num = MAP[x][y].V[0];
            for (int j = 1; j &lt; MAP[x][y].V.size(); j++)
            {
                int Shark_Num = MAP[x][y].V[j];
                Shark[Shark_Num].Live = false;
            }
            MAP[x][y].V.clear();
            MAP[x][y].V.push_back(Live_Num);
            MAP[x][y].Smell_Host = Live_Num;
        }
    }
}

void Solution()
{
    for (int Time = 0; Time &lt; 1001; Time++)
    {
        if (Check() == true)
        {
            cout &lt;&lt; Time &lt;&lt; endl;
            return;
        }
        Setting_Smell(Time);
        Move_Shark(Time);
        Killing_Shark();
    }
    cout &lt;&lt; -1 &lt;&lt; endl;
}

void Solve()
{
    Input();
    Solution();
}

int main(void)
{
    ios::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);

    //freopen(&quot;Input.txt&quot;, &quot;r&quot;, stdin);
    Solve();

    return 0;
}


출처: https://yabmoons.tistory.com/496 [얍문&#39;s Coding World..]</code></pre>
]]></description>
        </item>
    </channel>
</rss>