<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>Hello_Develop</title>
    <link>https://dhelloper.tistory.com/</link>
    <description>안녕_개발</description>
    <language>ko</language>
    <pubDate>Thu, 27 Aug 2026 10:14:19 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>D_Helloper</managingEditor>
    <image>
      <title>Hello_Develop</title>
      <url>https://tistory1.daumcdn.net/tistory/5628001/attach/f91b829aa7e442fa852d2d1e8e007247</url>
      <link>https://dhelloper.tistory.com</link>
    </image>
    <item>
      <title>백준 10026 - 적록색약 (Java)</title>
      <link>https://dhelloper.tistory.com/117</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/10026&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.acmicpc.net/problem/10026&lt;/a&gt;&lt;/p&gt;
&lt;div style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;
&lt;div&gt;
&lt;h2 style=&quot;color: #585f69;&quot; data-ke-size=&quot;size26&quot;&gt;문제&lt;/h2&gt;
&lt;/div&gt;
&lt;div id=&quot;problem_description&quot;&gt;
&lt;p style=&quot;color: #555555;&quot; data-ke-size=&quot;size16&quot;&gt;적록색약은 빨간색과 초록색의 차이를 거의 느끼지 못한다. 따라서, 적록색약인 사람이 보는 그림은 아닌 사람이 보는 그림과는 좀 다를 수 있다.&lt;/p&gt;
&lt;p style=&quot;color: #555555;&quot; data-ke-size=&quot;size16&quot;&gt;크기가 N&amp;times;N인 그리드의 각 칸에 R(빨강), G(초록), B(파랑) 중 하나를 색칠한 그림이 있다. 그림은 몇 개의 구역으로 나뉘어져 있는데, 구역은 같은 색으로 이루어져 있다. 또, 같은 색상이 상하좌우로 인접해 있는 경우에 두 글자는 같은 구역에 속한다. (색상의 차이를 거의 느끼지 못하는 경우도 같은 색상이라 한다)&lt;/p&gt;
&lt;p style=&quot;color: #555555;&quot; data-ke-size=&quot;size16&quot;&gt;예를 들어, 그림이 아래와 같은 경우에&lt;/p&gt;
&lt;pre class=&quot;armasm&quot; style=&quot;background-color: #f5f5f5; color: #333333;&quot;&gt;&lt;code&gt;RRRBB
GGBBB
BBBRR
BBRRR
RRRRR&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #555555;&quot; data-ke-size=&quot;size16&quot;&gt;적록색약이 아닌 사람이 봤을 때 구역의 수는 총 4개이다. (빨강 2, 파랑 1, 초록 1) 하지만, 적록색약인 사람은 구역을 3개 볼 수 있다. (빨강-초록 2, 파랑 1)&lt;/p&gt;
&lt;p style=&quot;color: #555555;&quot; data-ke-size=&quot;size16&quot;&gt;그림이 입력으로 주어졌을 때, 적록색약인 사람이 봤을 때와 아닌 사람이 봤을 때 구역의 수를 구하는 프로그램을 작성하시오.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;
&lt;div&gt;
&lt;h2 style=&quot;color: #585f69;&quot; data-ke-size=&quot;size26&quot;&gt;입력&lt;/h2&gt;
&lt;/div&gt;
&lt;div id=&quot;problem_input&quot;&gt;
&lt;p style=&quot;color: #555555;&quot; data-ke-size=&quot;size16&quot;&gt;첫째 줄에 N이 주어진다. (1 &amp;le; N &amp;le; 100)&lt;/p&gt;
&lt;p style=&quot;color: #555555;&quot; data-ke-size=&quot;size16&quot;&gt;둘째 줄부터 N개 줄에는 그림이 주어진다.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;
&lt;div&gt;
&lt;h2 style=&quot;color: #585f69;&quot; data-ke-size=&quot;size26&quot;&gt;출력&lt;/h2&gt;
&lt;/div&gt;
&lt;div id=&quot;problem_output&quot;&gt;
&lt;p style=&quot;color: #555555;&quot; data-ke-size=&quot;size16&quot;&gt;적록색약이 아닌 사람이 봤을 때의 구역의 개수와 적록색약인 사람이 봤을 때의 구역의 수를 공백으로 구분해 출력한다.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;h2 style=&quot;color: #585f69;&quot; data-ke-size=&quot;size26&quot;&gt;예제 입력 1&lt;span&gt;&amp;nbsp;&lt;/span&gt;복사&lt;/h2&gt;
&lt;/div&gt;
&lt;pre id=&quot;sample-input-1&quot; class=&quot;armasm&quot; style=&quot;background-color: #f7f7f9; color: #333333;&quot;&gt;&lt;code&gt;5
RRRBB
GGBBB
BBBRR
BBRRR
RRRRR
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;h2 style=&quot;color: #585f69;&quot; data-ke-size=&quot;size26&quot;&gt;예제 출력 1&lt;span&gt;&amp;nbsp;&lt;/span&gt;복사&lt;/h2&gt;
&lt;/div&gt;
&lt;pre id=&quot;sample-output-1&quot; class=&quot;basic&quot; style=&quot;background-color: #f7f7f9; color: #333333;&quot;&gt;&lt;code&gt;4 3&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;풀이&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;요즘 BFS 감이 떨어져서 푼 문제,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;BFS를 두 번 돌리면 될 것이라 생각했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;색약인 경우와 아닌 경우의 탈출조건만 다르게 주면 될 것이라 생각.&lt;/p&gt;
&lt;pre id=&quot;code_1715696827088&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayDeque;
import java.util.LinkedList;
import java.util.Queue;
import java.util.StringTokenizer;

public class BJ_10026_적록색약 {
    static int N;
    static boolean[][] visited;
    static char[][] map;
    static Queue&amp;lt;int[]&amp;gt; que;
    static int[][] deltas = {{-1,0},{0,1},{1,0},{0,-1}};
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        N = Integer.parseInt(br.readLine());
        map = new char[N][N];
        visited = new boolean[N][N];
        que = new ArrayDeque&amp;lt;&amp;gt;();
        for(int i=0; i&amp;lt;N; i++)
        {
            String str = br.readLine();
            for(int j=0; j&amp;lt;N; j++)
            {
                map[i][j] = str.charAt(j);
            }
        }
        int cnt=0;
        for(int i=0; i&amp;lt;N; i++)
        {
            for(int j=0; j&amp;lt;N; j++)
            {
                if(!visited[i][j])
                {
                    que.add(new int[]{i,j});
                    visited[i][j] = true;
                    cnt++;
                    BFS();
                }
            }
        }
        visited = new boolean[N][N];
        int cnt2=0;
        for(int i=0; i&amp;lt;N; i++)
        {
            for(int j=0; j&amp;lt;N; j++)
            {
                if(!visited[i][j])
                {
                    que.add(new int[]{i,j});
                    visited[i][j] = true;
                    cnt2++;
                    BFS2();
                }
            }
        }
        System.out.println(cnt);
        System.out.println(cnt2);
    }
    public static void BFS()
    {
        while(!que.isEmpty())
        {
            int[] temp = que.poll();
            for(int dir=0; dir&amp;lt;4; dir++)
            {
                int dx = temp[0]+deltas[dir][0];
                int dy = temp[1]+deltas[dir][1];
                if(dx&amp;lt;0||dy&amp;lt;0||dx&amp;gt;=N||dy&amp;gt;=N||visited[dx][dy]||map[dx][dy]!=map[temp[0]][temp[1]]) continue;
                visited[dx][dy] = true;
                que.add(new int[]{dx,dy});
            }
        }
    }
    public static void BFS2()
    {
        while(!que.isEmpty())
        {
            int[] temp = que.poll();
            for(int dir=0; dir&amp;lt;4; dir++)
            {
                int dx = temp[0]+deltas[dir][0];
                int dy = temp[1]+deltas[dir][1];
                if(dx&amp;lt;0||dy&amp;lt;0||dx&amp;gt;=N||dy&amp;gt;=N||visited[dx][dy]) continue;
                if(map[temp[0]][temp[1]]=='R' || map[temp[0]][temp[1]]=='G'){
                    if(map[dx][dy]=='B') continue;
                }
                else {
                    if(map[temp[0]][temp[1]]!=map[dx][dy]) continue;
                }

                visited[dx][dy] = true;
                que.add(new int[]{dx,dy});
            }
        }
    }
}&lt;/code&gt;&lt;/pre&gt;</description>
      <category>알고리즘/백준</category>
      <author>D_Helloper</author>
      <guid isPermaLink="true">https://dhelloper.tistory.com/117</guid>
      <comments>https://dhelloper.tistory.com/117#entry117comment</comments>
      <pubDate>Tue, 14 May 2024 23:27:16 +0900</pubDate>
    </item>
    <item>
      <title>백준 6593 - 상범 빌딩 (Java)</title>
      <link>https://dhelloper.tistory.com/116</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/6593&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.acmicpc.net/problem/6593&lt;/a&gt;&lt;/p&gt;
&lt;div style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;
&lt;div&gt;
&lt;h2 style=&quot;color: #585f69;&quot; data-ke-size=&quot;size26&quot;&gt;문제&lt;/h2&gt;
&lt;/div&gt;
&lt;div id=&quot;problem_description&quot;&gt;
&lt;p style=&quot;color: #555555;&quot; data-ke-size=&quot;size16&quot;&gt;당신은 상범 빌딩에 갇히고 말았다. 여기서 탈출하는 가장 빠른 길은 무엇일까? 상범 빌딩은 각 변의 길이가 1인 정육면체(단위 정육면체)로 이루어져있다. 각 정육면체는 금으로 이루어져 있어 지나갈 수 없거나, 비어있어서 지나갈 수 있게 되어있다. 당신은 각 칸에서 인접한 6개의 칸(동,서,남,북,상,하)으로 1분의 시간을 들여 이동할 수 있다. 즉, 대각선으로 이동하는 것은 불가능하다. 그리고 상범 빌딩의 바깥면도 모두 금으로 막혀있어 출구를 통해서만 탈출할 수 있다.&lt;/p&gt;
&lt;p style=&quot;color: #555555;&quot; data-ke-size=&quot;size16&quot;&gt;당신은 상범 빌딩을 탈출할 수 있을까? 만약 그렇다면 얼마나 걸릴까?&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;
&lt;div&gt;
&lt;h2 style=&quot;color: #585f69;&quot; data-ke-size=&quot;size26&quot;&gt;입력&lt;/h2&gt;
&lt;/div&gt;
&lt;div id=&quot;problem_input&quot;&gt;
&lt;p style=&quot;color: #555555;&quot; data-ke-size=&quot;size16&quot;&gt;입력은 여러 개의 테스트 케이스로 이루어지며, 각 테스트 케이스는 세 개의 정수 L, R, C로 시작한다.&amp;nbsp;L(1 &amp;le; L &amp;le; 30)은 상범 빌딩의 층 수이다.&amp;nbsp;R(1 &amp;le; R &amp;le; 30)과 C(1 &amp;le; C &amp;le; 30)는 상범 빌딩의 한 층의 행과 열의 개수를 나타낸다.&lt;/p&gt;
&lt;p style=&quot;color: #555555;&quot; data-ke-size=&quot;size16&quot;&gt;그 다음 각 줄이 C개의 문자로 이루어진 R개의 행이 L번 주어진다. 각 문자는 상범 빌딩의 한 칸을 나타낸다. 금으로 막혀있어 지나갈 수 없는 칸은 '#'으로 표현되고, 비어있는 칸은 '.'으로 표현된다. 당신의 시작 지점은 'S'로 표현되고, 탈출할 수 있는 출구는 'E'로 표현된다. 각 층 사이에는 빈 줄이 있으며, 입력의 끝은 L, R, C가 모두 0으로 표현된다. 시작 지점과 출구는 항상 하나만 있다.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;
&lt;div&gt;
&lt;h2 style=&quot;color: #585f69;&quot; data-ke-size=&quot;size26&quot;&gt;출력&lt;/h2&gt;
&lt;/div&gt;
&lt;div id=&quot;problem_output&quot;&gt;
&lt;p style=&quot;color: #555555;&quot; data-ke-size=&quot;size16&quot;&gt;각 빌딩에 대해 한 줄씩 답을 출력한다. 만약 당신이 탈출할 수 있다면 다음과 같이 출력한다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;Escaped in x minute(s).&lt;/blockquote&gt;
&lt;p style=&quot;color: #555555;&quot; data-ke-size=&quot;size16&quot;&gt;여기서 x는 상범 빌딩을 탈출하는 데에 필요한 최단 시간이다.&lt;/p&gt;
&lt;p style=&quot;color: #555555;&quot; data-ke-size=&quot;size16&quot;&gt;만일 탈출이 불가능하다면, 다음과 같이 출력한다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;Trapped!&lt;/blockquote&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;h2 style=&quot;color: #585f69;&quot; data-ke-size=&quot;size26&quot;&gt;예제 입력 1&lt;span&gt;&amp;nbsp;&lt;/span&gt;복사&lt;/h2&gt;
&lt;/div&gt;
&lt;pre id=&quot;sample-input-1&quot; class=&quot;clean&quot; style=&quot;background-color: #f7f7f9; color: #333333;&quot;&gt;&lt;code&gt;3 4 5
S....
.###.
.##..
###.#

#####
#####
##.##
##...

#####
#####
#.###
####E

1 3 3
S##
#E#
###

0 0 0
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;h2 style=&quot;color: #585f69;&quot; data-ke-size=&quot;size26&quot;&gt;예제 출력 1&lt;span&gt;&amp;nbsp;&lt;/span&gt;복사&lt;/h2&gt;
&lt;/div&gt;
&lt;pre id=&quot;sample-output-1&quot; class=&quot;angelscript&quot; style=&quot;background-color: #f7f7f9; color: #333333;&quot;&gt;&lt;code&gt;Escaped in 11 minute(s).
Trapped!&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;풀이&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기본적인 BFS를 수행하면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;주의할 점은 위 아래 층이 있어서 층을 탐색해야 된다는 것, 그래서 map을 3차원 배열로 만들어서 층을 추가해주었다. 탐색하는 방향 또한 3개로 나눠서 {-1,0,0}, {1,0,0}와 같이 위층으로, 아래층으로를 추가했다.&lt;/p&gt;
&lt;pre id=&quot;code_1715605076503&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayDeque;
import java.util.Queue;
import java.util.StringTokenizer;

public class BJ_6593_상범빌딩 {
    public static class sang{
        int x;
        int y;
        int l;
        int count;
        public sang(int l, int x, int y, int count){
            this.l = l;
            this.x = x;
            this.y = y;
            this.count = count;
        }
    }
    static int N;
    static int M;
    static int L;
    static char[][][] map;
    static boolean[][][] visited;
    static int[][] deltas = {{-1,0,0},{1,0,0},{0,-1,0},{0,0,1},{0,1,0},{0,0,-1}};
    static Queue&amp;lt;sang&amp;gt; que;
    static sang end;

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        while(true){
            StringTokenizer st = new StringTokenizer(br.readLine());
            L = Integer.parseInt(st.nextToken());
            N = Integer.parseInt(st.nextToken());
            M = Integer.parseInt(st.nextToken());
            if(L == 0 &amp;amp;&amp;amp; N == 0 &amp;amp;&amp;amp; M == 0) break;
            que = new ArrayDeque&amp;lt;&amp;gt;();
            map = new char[L][N][M];
            visited = new boolean[L][N][M];
            for(int i=0; i&amp;lt;L; i++)
            {
                for(int j=0; j&amp;lt;N; j++)
                {
                    String str = br.readLine();
                    for(int k=0; k&amp;lt;M; k++)
                    {
                        map[i][j][k] = str.charAt(k);
                        if(map[i][j][k] == 'S') que.add(new sang(i,j,k,0));
                        else if(map[i][j][k]=='E') end = new sang(i,j,k,0);
                    }
                }
                br.readLine();
            }
            int min=Integer.MAX_VALUE;
            boolean check=false;
            A:while(!que.isEmpty()){
                sang temp = que.poll();
                for(int dir=0; dir&amp;lt;6; dir++)
                {
                    int dl = temp.l+deltas[dir][0];
                    int dx = temp.x+deltas[dir][1];
                    int dy = temp.y+deltas[dir][2];

                    if(dl&amp;lt;0 || L &amp;lt;= dl || dx &amp;lt; 0 || N &amp;lt;= dx || dy &amp;lt; 0 || M &amp;lt;= dy || visited[dl][dx][dy] || map[dl][dx][dy]=='#') continue;
                    if(map[dl][dx][dy]=='E') {
                        check = true;
                        min = Math.min(min, temp.count+1);
                        break A;
                    }
                    visited[dl][dx][dy] = true;
                    que.add(new sang(dl,dx,dy,temp.count+1));
                }
            }
            if(check) System.out.println(&quot;Escaped in &quot;+min+&quot; minute(s).&quot;);
            else System.out.println(&quot;Trapped!&quot;);
        }
    }
}&lt;/code&gt;&lt;/pre&gt;</description>
      <category>알고리즘/백준</category>
      <author>D_Helloper</author>
      <guid isPermaLink="true">https://dhelloper.tistory.com/116</guid>
      <comments>https://dhelloper.tistory.com/116#entry116comment</comments>
      <pubDate>Mon, 13 May 2024 21:58:02 +0900</pubDate>
    </item>
    <item>
      <title>백준 2661 - 좋은수열(Java)</title>
      <link>https://dhelloper.tistory.com/115</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/2661&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.acmicpc.net/problem/2661&lt;/a&gt;&lt;/p&gt;
&lt;div style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;
&lt;div&gt;
&lt;h2 style=&quot;color: #585f69;&quot; data-ke-size=&quot;size26&quot;&gt;문제&lt;/h2&gt;
&lt;/div&gt;
&lt;div id=&quot;problem_description&quot;&gt;
&lt;p style=&quot;color: #555555;&quot; data-ke-size=&quot;size16&quot;&gt;숫자 1, 2, 3으로만 이루어지는 수열이 있다. 임의의 길이의 인접한 두 개의 부분 수열이 동일한 것이 있으면, 그 수열을 나쁜 수열이라고 부른다. 그렇지 않은 수열은 좋은 수열이다.&lt;/p&gt;
&lt;p style=&quot;color: #555555;&quot; data-ke-size=&quot;size16&quot;&gt;다음은 나쁜 수열의 예이다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;color: #555555;&quot;&gt;&lt;u&gt;33&lt;/u&gt;&lt;/li&gt;
&lt;li style=&quot;color: #555555;&quot;&gt;3&lt;u&gt;2121&lt;/u&gt;323&lt;/li&gt;
&lt;li style=&quot;color: #555555;&quot;&gt;&lt;u&gt;123123&lt;/u&gt;213&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;color: #555555;&quot; data-ke-size=&quot;size16&quot;&gt;다음은 좋은 수열의 예이다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;color: #555555;&quot;&gt;2&lt;/li&gt;
&lt;li style=&quot;color: #555555;&quot;&gt;32&lt;/li&gt;
&lt;li style=&quot;color: #555555;&quot;&gt;32123&lt;/li&gt;
&lt;li style=&quot;color: #555555;&quot;&gt;1232123&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;color: #555555;&quot; data-ke-size=&quot;size16&quot;&gt;길이가 N인 좋은 수열들을 N자리의 정수로 보아 그중 가장 작은 수를 나타내는 수열을 구하는 프로그램을 작성하라. 예를 들면, 1213121과 2123212는 모두 좋은 수열이지만 그 중에서 작은 수를 나타내는 수열은 1213121이다.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;
&lt;div&gt;
&lt;h2 style=&quot;color: #585f69;&quot; data-ke-size=&quot;size26&quot;&gt;입력&lt;/h2&gt;
&lt;/div&gt;
&lt;div id=&quot;problem_input&quot;&gt;
&lt;p style=&quot;color: #555555;&quot; data-ke-size=&quot;size16&quot;&gt;입력은 숫자 N하나로 이루어진다. N은 1 이상 80 이하이다.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;
&lt;div&gt;
&lt;h2 style=&quot;color: #585f69;&quot; data-ke-size=&quot;size26&quot;&gt;출력&lt;/h2&gt;
&lt;/div&gt;
&lt;div id=&quot;problem_output&quot;&gt;
&lt;p style=&quot;color: #555555;&quot; data-ke-size=&quot;size16&quot;&gt;첫 번째 줄에 1, 2, 3으로만 이루어져 있는 길이가 N인 좋은 수열들 중에서 가장 작은 수를 나타내는 수열만 출력한다. 수열을 이루는 1, 2, 3들 사이에는 빈칸을 두지 않는다.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;h2 style=&quot;color: #585f69;&quot; data-ke-size=&quot;size26&quot;&gt;예제 입력 1&lt;span&gt;&amp;nbsp;&lt;/span&gt;복사&lt;/h2&gt;
&lt;/div&gt;
&lt;pre id=&quot;sample-input-1&quot; class=&quot;angelscript&quot; style=&quot;background-color: #f7f7f9; color: #333333;&quot;&gt;&lt;code&gt;7
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;h2 style=&quot;color: #585f69;&quot; data-ke-size=&quot;size26&quot;&gt;예제 출력 1&lt;span&gt;&amp;nbsp;&lt;/span&gt;복사&lt;/h2&gt;
&lt;/div&gt;
&lt;pre id=&quot;sample-output-1&quot; class=&quot;angelscript&quot; style=&quot;background-color: #f7f7f9; color: #333333;&quot;&gt;&lt;code&gt;1213121&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;풀이&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일단 빈 문자열을 선언 후,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;백트래킹을 돌면서 1부터 3까지 추가해본다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그렇게 만들어진 문자열을 check() 메서드에 던져서 가능한지 불가능한지를 확인한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;문자열의 길이로 나누고 앞부분, 뒷부분을 비교해서 같은지를 보는 것.&lt;/p&gt;
&lt;pre id=&quot;code_1715494384102&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class BJ_2661_좋은수열 {
    static int N;
    static boolean exit = false;
    static String answer = &quot;&quot;;
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        N = Integer.parseInt(br.readLine());
        back(0);

    }
    public static void back(int cnt)
    {
        if(exit) return;
        if(cnt==N){
            System.out.println(answer);
            exit = true;
            return;
        }
        for(int i=1; i&amp;lt;4; i++)
        {
            answer+=i;
                if(check(answer))
                {
                    back(cnt+1);
                }
            answer = answer.substring(0,answer.length()-1);
        }

    }

    public static boolean check(String str) {
        for(int i = 1; i &amp;lt;= str.length() / 2; i++) {
            String front = str.substring(str.length() -i * 2, str.length() - i);
            String back = str.substring(str.length() - i, str.length());
            if(front.equals(back)) return false;
        }
        return true;
    }
}&lt;/code&gt;&lt;/pre&gt;</description>
      <category>알고리즘/백준</category>
      <author>D_Helloper</author>
      <guid isPermaLink="true">https://dhelloper.tistory.com/115</guid>
      <comments>https://dhelloper.tistory.com/115#entry115comment</comments>
      <pubDate>Sun, 12 May 2024 15:13:09 +0900</pubDate>
    </item>
    <item>
      <title>백준 10942 - 팰린드롬 ? (Java)</title>
      <link>https://dhelloper.tistory.com/114</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/10942&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.acmicpc.net/problem/10942&lt;/a&gt;&lt;/p&gt;
&lt;div style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;
&lt;div&gt;
&lt;h2 style=&quot;color: #585f69;&quot; data-ke-size=&quot;size26&quot;&gt;문제&lt;/h2&gt;
&lt;/div&gt;
&lt;div id=&quot;problem_description&quot;&gt;
&lt;p style=&quot;color: #555555;&quot; data-ke-size=&quot;size16&quot;&gt;명우는 홍준이와 함께 팰린드롬 놀이를 해보려고 한다.&lt;/p&gt;
&lt;p style=&quot;color: #555555;&quot; data-ke-size=&quot;size16&quot;&gt;먼저, 홍준이는 자연수 N개를 칠판에 적는다. 그 다음, 명우에게 질문을 총 M번 한다.&lt;/p&gt;
&lt;p style=&quot;color: #555555;&quot; data-ke-size=&quot;size16&quot;&gt;각 질문은 두 정수 S와 E(1 &amp;le; S &amp;le; E &amp;le; N)로 나타낼 수 있으며, S번째 수부터 E번째 까지 수가 팰린드롬을 이루는지를 물어보며, 명우는 각 질문에 대해 팰린드롬이다 또는 아니다를 말해야 한다.&lt;/p&gt;
&lt;p style=&quot;color: #555555;&quot; data-ke-size=&quot;size16&quot;&gt;예를 들어, 홍준이가 칠판에 적은 수가 1, 2, 1, 3, 1, 2, 1라고 하자.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;color: #555555;&quot;&gt;S = 1, E = 3인 경우 1, 2, 1은 팰린드롬이다.&lt;/li&gt;
&lt;li style=&quot;color: #555555;&quot;&gt;S = 2, E = 5인 경우 2, 1, 3, 1은 팰린드롬이 아니다.&lt;/li&gt;
&lt;li style=&quot;color: #555555;&quot;&gt;S = 3, E = 3인 경우 1은 팰린드롬이다.&lt;/li&gt;
&lt;li style=&quot;color: #555555;&quot;&gt;S = 5, E = 7인 경우 1, 2, 1은 팰린드롬이다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;color: #555555;&quot; data-ke-size=&quot;size16&quot;&gt;자연수 N개와 질문 M개가 모두 주어졌을 때, 명우의 대답을 구하는 프로그램을 작성하시오.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;
&lt;div&gt;
&lt;h2 style=&quot;color: #585f69;&quot; data-ke-size=&quot;size26&quot;&gt;입력&lt;/h2&gt;
&lt;/div&gt;
&lt;div id=&quot;problem_input&quot;&gt;
&lt;p style=&quot;color: #555555;&quot; data-ke-size=&quot;size16&quot;&gt;첫째 줄에 수열의 크기 N (1 &amp;le; N &amp;le; 2,000)이 주어진다.&lt;/p&gt;
&lt;p style=&quot;color: #555555;&quot; data-ke-size=&quot;size16&quot;&gt;둘째 줄에는 홍준이가 칠판에 적은 수 N개가 순서대로 주어진다. 칠판에 적은 수는 100,000보다 작거나 같은 자연수이다.&lt;/p&gt;
&lt;p style=&quot;color: #555555;&quot; data-ke-size=&quot;size16&quot;&gt;셋째 줄에는 홍준이가 한 질문의 개수 M (1 &amp;le; M &amp;le; 1,000,000)이 주어진다.&lt;/p&gt;
&lt;p style=&quot;color: #555555;&quot; data-ke-size=&quot;size16&quot;&gt;넷째 줄부터 M개의 줄에는 홍준이가 명우에게 한 질문 S와 E가 한 줄에 하나씩 주어진다.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;
&lt;div&gt;
&lt;h2 style=&quot;color: #585f69;&quot; data-ke-size=&quot;size26&quot;&gt;출력&lt;/h2&gt;
&lt;/div&gt;
&lt;div id=&quot;problem_output&quot;&gt;
&lt;p style=&quot;color: #555555;&quot; data-ke-size=&quot;size16&quot;&gt;총 M개의 줄에 걸쳐 홍준이의 질문에 대한 명우의 답을 입력으로 주어진 순서에 따라서 출력한다. 팰린드롬인 경우에는 1, 아닌 경우에는 0을 출력한다.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;h2 style=&quot;color: #585f69;&quot; data-ke-size=&quot;size26&quot;&gt;예제 입력 1&lt;span&gt;&amp;nbsp;&lt;/span&gt;복사&lt;/h2&gt;
&lt;/div&gt;
&lt;pre id=&quot;sample-input-1&quot; class=&quot;basic&quot; style=&quot;background-color: #f7f7f9; color: #333333;&quot;&gt;&lt;code&gt;7
1 2 1 3 1 2 1
4
1 3
2 5
3 3
5 7
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;h2 style=&quot;color: #585f69;&quot; data-ke-size=&quot;size26&quot;&gt;예제 출력 1&lt;span&gt;&amp;nbsp;&lt;/span&gt;복사&lt;/h2&gt;
&lt;/div&gt;
&lt;pre id=&quot;sample-output-1&quot; class=&quot;angelscript&quot; style=&quot;background-color: #f7f7f9; color: #333333;&quot;&gt;&lt;code&gt;1
0
1
1&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;풀이&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;먼저 dp 배열을 정의해보자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;dp[i][j]는 i번째 수부터 j번째 수 까지가 팰린드롬인가? 에 대해 true, false를 갖는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;문제를 살펴보면 한 자리는 팰린드롬, 두 자리는 앞 뒤가 같으면 팰린드롬이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그렇다면 먼저 배열을 쭉 순회하면서 팰린드롬 dp 배열을 만든 후에, start, end 값을 받아서 출력 하면 끝.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;길이가 1이면 dp[i][i] = true&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;길이가 2이면 arr[i] == arr[i+1]일 때 dp[i][i+1] = true&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;길이가 3이상이면&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;arr[j] == arr[j+i] (시작과 끝 수가 같고)&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;dp[j+1][j+i-1] (그 중간에 있는 수가 팰린드롬일 때)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;dp[j][j+i] = true 이다.&lt;/p&gt;
&lt;pre id=&quot;code_1715266021002&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class BJ_10942_팰린드롬 {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringBuilder sb = new StringBuilder();
        int N = Integer.parseInt(br.readLine());
        int[] arr = new int[N+1];
        boolean[][] dp = new boolean[N+1][N+1];

        StringTokenizer st = new StringTokenizer(br.readLine());
        for(int i=1; i&amp;lt;=N; i++)
        {
            arr[i] = Integer.parseInt(st.nextToken());
        }
        for(int i=1; i&amp;lt;=N; i++)
        {
            dp[i][i] = true;
        }
        for(int i=1; i&amp;lt;=N-1; i++)
        {
            if(arr[i]==arr[i+1]) dp[i][i+1] = true;
        }
        for(int i=2; i&amp;lt;N; i++)
        {
            for(int j=1; j&amp;lt;=N-i; j++)
            {
                if(arr[j]==arr[j+i] &amp;amp;&amp;amp; dp[j+1][j+i-1]) dp[j][j+i] = true;
            }
        }
        int M = Integer.parseInt(br.readLine());
        for(int i=0; i&amp;lt;M; i++)
        {
            st = new StringTokenizer(br.readLine());
            int start = Integer.parseInt(st.nextToken());
            int end = Integer.parseInt(st.nextToken());
            sb.append(dp[start][end]?1+&quot;\n&quot;:0+&quot;\n&quot;);
        }
        System.out.println(sb);
    }
}&lt;/code&gt;&lt;/pre&gt;</description>
      <category>알고리즘/백준</category>
      <author>D_Helloper</author>
      <guid isPermaLink="true">https://dhelloper.tistory.com/114</guid>
      <comments>https://dhelloper.tistory.com/114#entry114comment</comments>
      <pubDate>Thu, 9 May 2024 23:47:06 +0900</pubDate>
    </item>
    <item>
      <title>백준 15989 - 1,2,3더하기 4 (Java)</title>
      <link>https://dhelloper.tistory.com/113</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/15989&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.acmicpc.net/problem/15989&lt;/a&gt;&lt;/p&gt;
&lt;div style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;
&lt;div&gt;
&lt;h2 style=&quot;color: #585f69;&quot; data-ke-size=&quot;size26&quot;&gt;문제&lt;/h2&gt;
&lt;/div&gt;
&lt;div id=&quot;problem_description&quot;&gt;
&lt;p style=&quot;color: #555555;&quot; data-ke-size=&quot;size16&quot;&gt;정수 4를 1, 2, 3의 합으로 나타내는 방법은 총 4가지가 있다. 합을 나타낼 때는 수를 1개 이상 사용해야 한다. 합을 이루고 있는 수의 순서만 다른 것은 같은 것으로 친다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;color: #555555;&quot;&gt;1+1+1+1&lt;/li&gt;
&lt;li style=&quot;color: #555555;&quot;&gt;2+1+1 (1+1+2, 1+2+1)&lt;/li&gt;
&lt;li style=&quot;color: #555555;&quot;&gt;2+2&lt;/li&gt;
&lt;li style=&quot;color: #555555;&quot;&gt;1+3 (3+1)&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;color: #555555;&quot; data-ke-size=&quot;size16&quot;&gt;정수 n이 주어졌을 때, n을 1, 2, 3의 합으로 나타내는 방법의 수를 구하는 프로그램을 작성하시오.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;
&lt;div&gt;
&lt;h2 style=&quot;color: #585f69;&quot; data-ke-size=&quot;size26&quot;&gt;입력&lt;/h2&gt;
&lt;/div&gt;
&lt;div id=&quot;problem_input&quot;&gt;
&lt;p style=&quot;color: #555555;&quot; data-ke-size=&quot;size16&quot;&gt;첫째 줄에 테스트 케이스의 개수 T가 주어진다. 각 테스트 케이스는 한 줄로 이루어져 있고, 정수 n이 주어진다. n은 양수이며 10,000보다 작거나 같다.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;
&lt;div&gt;
&lt;h2 style=&quot;color: #585f69;&quot; data-ke-size=&quot;size26&quot;&gt;출력&lt;/h2&gt;
&lt;/div&gt;
&lt;div id=&quot;problem_output&quot;&gt;
&lt;p style=&quot;color: #555555;&quot; data-ke-size=&quot;size16&quot;&gt;각 테스트 케이스마다, n을 1, 2, 3의 합으로 나타내는 방법의 수를 출력한다.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;h2 style=&quot;color: #585f69;&quot; data-ke-size=&quot;size26&quot;&gt;예제 입력 1&lt;span&gt;&amp;nbsp;&lt;/span&gt;복사&lt;/h2&gt;
&lt;/div&gt;
&lt;pre id=&quot;sample-input-1&quot; class=&quot;angelscript&quot; style=&quot;background-color: #f7f7f9; color: #333333;&quot;&gt;&lt;code&gt;3
4
7
10
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;h2 style=&quot;color: #585f69;&quot; data-ke-size=&quot;size26&quot;&gt;예제 출력 1&lt;span&gt;&amp;nbsp;&lt;/span&gt;복사&lt;/h2&gt;
&lt;/div&gt;
&lt;pre id=&quot;sample-output-1&quot; class=&quot;angelscript&quot; style=&quot;background-color: #f7f7f9; color: #333333;&quot;&gt;&lt;code&gt;4
8
14&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;풀이&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;문제를 보고 힌트를 얻기 시작했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일단. dp 배열은 dp[i][j] 라고 할 때, 숫자 i를 만들 때, j개의 숫자를 사용한 경우의 수.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;점화식을 보자면&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;dp[i][1] = dp[i-1][1]&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;dp[i][2] = dp[i-2][1] + dp[i-2][2]&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;dp[i][3] = dp[i-3][1] + dp[i-3][2] + dp[i-3][3]&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그냥.. 손으로 따라 써가면서 풀었더니&amp;nbsp; 점화식이 나왔고, 그 점화식으로 풀렸다.&lt;/p&gt;
&lt;pre id=&quot;code_1715174220343&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class BJ_15989_123더하기4 {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
        StringBuilder sb = new StringBuilder();
        int[][]dp;

        int T = Integer.parseInt(st.nextToken());
        dp = new int[10001][4];
        for(int t = 0; t&amp;lt;T; t++)
        {
            int N = Integer.parseInt(br.readLine());
            dp[1][1] = dp[2][1] = dp[2][2] = dp[3][1] = dp[3][2] = dp[3][3] = 1;
            for(int i=4; i&amp;lt;=N; i++)
            {
                dp[i][1] = dp[i-1][1];
                dp[i][2] = dp[i-2][1] + dp[i-2][2];
                dp[i][3] = dp[i-3][1] + dp[i-3][2] + dp[i-3][3];
            }
            sb.append(dp[N][3]+dp[N][2]+dp[N][1]+&quot;\n&quot;);
        }
        System.out.println(sb);
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>알고리즘/백준</category>
      <author>D_Helloper</author>
      <guid isPermaLink="true">https://dhelloper.tistory.com/113</guid>
      <comments>https://dhelloper.tistory.com/113#entry113comment</comments>
      <pubDate>Wed, 8 May 2024 22:17:04 +0900</pubDate>
    </item>
    <item>
      <title>백준 11066 - 파일 합치기 (Java)</title>
      <link>https://dhelloper.tistory.com/112</link>
      <description>&lt;div style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;
&lt;div&gt;
&lt;h2 style=&quot;color: #585f69;&quot; data-ke-size=&quot;size26&quot;&gt;문제&lt;/h2&gt;
&lt;/div&gt;
&lt;div id=&quot;problem_description&quot;&gt;
&lt;p style=&quot;color: #555555;&quot; data-ke-size=&quot;size16&quot;&gt;소설가인 김대전은 소설을 여러 장(chapter)으로 나누어 쓰는데, 각 장은 각각 다른 파일에 저장하곤 한다. 소설의 모든 장을 쓰고 나서는 각 장이 쓰여진 파일을 합쳐서 최종적으로 소설의 완성본이 들어있는 한 개의 파일을 만든다. 이 과정에서 두 개의 파일을 합쳐서 하나의 임시파일을 만들고, 이 임시파일이나 원래의 파일을 계속 두 개씩 합쳐서 소설의 여러 장들이 연속이 되도록 파일을 합쳐나가고, 최종적으로는 하나의 파일로 합친다. 두 개의 파일을 합칠 때 필요한 비용(시간 등)이 두 파일 크기의 합이라고 가정할 때, 최종적인 한 개의 파일을 완성하는데 필요한 비용의 총 합을 계산하시오.&lt;/p&gt;
&lt;p style=&quot;color: #555555;&quot; data-ke-size=&quot;size16&quot;&gt;예를 들어, C1, C2, C3, C4가 연속적인 네 개의 장을 수록하고 있는 파일이고, 파일 크기가 각각 40, 30, 30, 50 이라고 하자. 이 파일들을 합치는 과정에서, 먼저 C2와 C3를 합쳐서 임시파일 X1을 만든다. 이때 비용 60이 필요하다. 그 다음으로 C1과 X1을 합쳐 임시파일 X2를 만들면 비용 100이 필요하다. 최종적으로 X2와 C4를 합쳐 최종파일을 만들면 비용 150이 필요하다. 따라서, 최종의 한 파일을 만드는데 필요한 비용의 합은 60+100+150=310 이다. 다른 방법으로 파일을 합치면 비용을 줄일 수 있다. 먼저 C1과 C2를 합쳐 임시파일 Y1을 만들고, C3와 C4를 합쳐 임시파일 Y2를 만들고, 최종적으로 Y1과 Y2를 합쳐 최종파일을 만들 수 있다. 이때 필요한 총 비용은 70+80+150=300 이다.&lt;/p&gt;
&lt;p style=&quot;color: #555555;&quot; data-ke-size=&quot;size16&quot;&gt;소설의 각 장들이 수록되어 있는 파일의 크기가 주어졌을 때, 이 파일들을 하나의 파일로 합칠 때 필요한 최소비용을 계산하는 프로그램을 작성하시오.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;
&lt;div&gt;
&lt;h2 style=&quot;color: #585f69;&quot; data-ke-size=&quot;size26&quot;&gt;입력&lt;/h2&gt;
&lt;/div&gt;
&lt;div id=&quot;problem_input&quot;&gt;
&lt;p style=&quot;color: #555555;&quot; data-ke-size=&quot;size16&quot;&gt;프로그램은 표준 입력에서 입력 데이터를 받는다. 프로그램의 입력은 T개의 테스트 데이터로 이루어져 있는데, T는 입력의 맨 첫 줄에 주어진다.각 테스트 데이터는 두 개의 행으로 주어지는데, 첫 행에는 소설을 구성하는 장의 수를 나타내는 양의 정수 K (3 &amp;le; K &amp;le; 500)가 주어진다. 두 번째 행에는 1장부터 K장까지 수록한 파일의 크기를 나타내는 양의 정수 K개가 주어진다. 파일의 크기는 10,000을 초과하지 않는다.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;
&lt;div&gt;
&lt;h2 style=&quot;color: #585f69;&quot; data-ke-size=&quot;size26&quot;&gt;출력&lt;/h2&gt;
&lt;/div&gt;
&lt;div id=&quot;problem_output&quot;&gt;
&lt;p style=&quot;color: #555555;&quot; data-ke-size=&quot;size16&quot;&gt;프로그램은 표준 출력에 출력한다. 각 테스트 데이터마다 정확히 한 행에 출력하는데, 모든 장을 합치는데 필요한 최소비용을 출력한다.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;h2 style=&quot;color: #585f69;&quot; data-ke-size=&quot;size26&quot;&gt;예제 입력 1&lt;span&gt;&amp;nbsp;&lt;/span&gt;복사&lt;/h2&gt;
&lt;/div&gt;
&lt;pre id=&quot;sample-input-1&quot; class=&quot;angelscript&quot; style=&quot;background-color: #f7f7f9; color: #333333;&quot;&gt;&lt;code&gt;2
4
40 30 30 50
15
1 21 3 4 5 35 5 4 3 5 98 21 14 17 32
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;h2 style=&quot;color: #585f69;&quot; data-ke-size=&quot;size26&quot;&gt;예제 출력 1&lt;span&gt;&amp;nbsp;&lt;/span&gt;복사&lt;/h2&gt;
&lt;/div&gt;
&lt;pre id=&quot;sample-output-1&quot; class=&quot;angelscript&quot; style=&quot;background-color: #f7f7f9; color: #333333;&quot;&gt;&lt;code&gt;300
864&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;풀이&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;어느정도 점화식이 그려지긴 했으나 구체적으로 서지 않았던 문제, 해설을 살펴보았다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;dp[i][j] 의 정의는 i부터 j번째까지를 합했을 때 최솟 값,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;고로 dp[1][N]을 구하는 문제다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;dp[i][j]&amp;nbsp; = dp[i][k] + dp[k+1][j] 점화식을 구체화 한다면&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;dp[i][i] = arr[i] ( &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;입력받은 배열&lt;span&gt; &lt;/span&gt;&lt;/span&gt;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;dp[i][i+1] = arr[i] + arr[i+1]&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;...&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;dp[i][j] = Math.min(dp[i][j]&lt;span style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot;&gt;&lt;span&gt; &lt;/span&gt;,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;dp[i][x]+dp[x+1][j]+sum[j]-sum[i-1]) 이렇게 점화식이 세워진다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;sum은 누적합을 구해놓은 배열이다.&lt;/p&gt;
&lt;pre id=&quot;code_1715084886059&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class BJ_11066_파일합치기 {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
        int[][] dp;
        int[] arr;
        int[] sum;
        int N;
        int T = Integer.parseInt(st.nextToken());
        for(int t=0; t&amp;lt;T; t++)
        {
            st = new StringTokenizer(br.readLine());
            N = Integer.parseInt(st.nextToken());
            dp = new int[N+1][N+1];
            arr = new int[N+1];
            sum = new int[N+1];

            st = new StringTokenizer(br.readLine());
            for(int i=1; i&amp;lt;=N; i++)
            {
                arr[i] = Integer.parseInt(st.nextToken());
                sum[i] = sum[i-1]+arr[i];
            }
            for (int i=1; i&amp;lt;=N; i++) {
                for (int j=1; j+i &amp;lt;= N; j++) {
                    int k = j + i;
                    dp[j][k] = 214748364;
                    for (int x = j; x &amp;lt; k; x++) {
                        dp[j][k] = Math.min(dp[j][k], dp[j][x] + dp[x + 1][k] + sum[k] - sum[j - 1]);
                    }
                }
            }
            System.out.println(dp[1][N]);
        }
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>알고리즘/백준</category>
      <author>D_Helloper</author>
      <guid isPermaLink="true">https://dhelloper.tistory.com/112</guid>
      <comments>https://dhelloper.tistory.com/112#entry112comment</comments>
      <pubDate>Tue, 7 May 2024 21:28:12 +0900</pubDate>
    </item>
    <item>
      <title>백준 10653 - 마라톤 2 (Java)</title>
      <link>https://dhelloper.tistory.com/111</link>
      <description>&lt;div style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;
&lt;div&gt;
&lt;h2 style=&quot;color: #585f69;&quot; data-ke-size=&quot;size26&quot;&gt;문제&lt;/h2&gt;
&lt;/div&gt;
&lt;div id=&quot;problem_description&quot;&gt;
&lt;p style=&quot;color: #555555;&quot; data-ke-size=&quot;size16&quot;&gt;농장에 있는 젖소들이 건강하지 못하다고 생각한 농부 존은 젖소들을 위한 마라톤 대회를 열었고, 농부 존의 총애를 받는 젖소 박승원 역시 이 대회에 참가할 예정이다.&lt;/p&gt;
&lt;p style=&quot;color: #555555;&quot; data-ke-size=&quot;size16&quot;&gt;마라톤 코스는 N (3 &amp;lt;= N &amp;lt;= 500) 개의 체크포인트로 구성되어 있으며, 1번 체크포인트에서 시작해서 모든 체크 포인트를 순서대로 방문한 후 N번 체크포인트에서 끝나야지 마라톤이 끝난다. 게으른 젖소 박승원은 막상 대회에 참가하려 하니 귀찮아져서 중간에 있는 체크포인트 K 개를 몰래 건너뛰려 한다. (K &amp;lt; N) 단, 1번 체크포인트와 N번 체크포인트를 건너뛰면 너무 눈치가 보이니 두 체크포인트는 건너뛰지 않을 생각이다.&lt;/p&gt;
&lt;p style=&quot;color: #555555;&quot; data-ke-size=&quot;size16&quot;&gt;젖소 박승원이 체크포인트를 최대 K 개 건너뛰면서 달릴 수 있다면, 과연 승원이가 달려야 하는 최소 거리는 얼마일까?&lt;/p&gt;
&lt;p style=&quot;color: #555555;&quot; data-ke-size=&quot;size16&quot;&gt;참고로, 젖소 마라톤 대회는 서울시내 한복판에서 진행될 예정이기 때문에 거리는 택시 거리(Manhattan Distance)로 계산하려고 한다. 즉, (x1,y1)과 (x2,y2) 점 간의 거리는 |x1-x2| + |y1-y2| 로 표시할 수 있다. (|x|는 절댓값 기호다.)&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;
&lt;div&gt;
&lt;h2 style=&quot;color: #585f69;&quot; data-ke-size=&quot;size26&quot;&gt;입력&lt;/h2&gt;
&lt;/div&gt;
&lt;div id=&quot;problem_input&quot;&gt;
&lt;p style=&quot;color: #555555;&quot; data-ke-size=&quot;size16&quot;&gt;첫 번째 줄에 체크포인트의 수 N과 건너뛸 체크포인트의 수 K가 주어진다.&lt;/p&gt;
&lt;p style=&quot;color: #555555;&quot; data-ke-size=&quot;size16&quot;&gt;이후 N개의 줄에 정수가 두개씩 주어진다. i번째 줄의 첫 번째 정수는 체크포인트 i의 x 좌표, 두 번째 정수는 y 좌표이다. (-1000 &amp;lt;= x &amp;lt;= 1000, -1000 &amp;lt;= y &amp;lt;= 1000)&lt;/p&gt;
&lt;p style=&quot;color: #555555;&quot; data-ke-size=&quot;size16&quot;&gt;체크 포인트의 좌표는 겹칠 수도 있다 - 젖소 박승원이 한 체크포인트를 건너뛸 때는 그 번호의 체크포인트만 건너뛰며, 그 점에 있는 모든 체크포인트를 건너뛰지 않는다.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;
&lt;div&gt;
&lt;h2 style=&quot;color: #585f69;&quot; data-ke-size=&quot;size26&quot;&gt;출력&lt;/h2&gt;
&lt;/div&gt;
&lt;div id=&quot;problem_output&quot;&gt;
&lt;p style=&quot;color: #555555;&quot; data-ke-size=&quot;size16&quot;&gt;젖소 박승원이 체크포인트 K 개를 건너뛰고 달릴 수 있는 최소 거리를 출력하라.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;h2 style=&quot;color: #585f69;&quot; data-ke-size=&quot;size26&quot;&gt;예제 입력 1&lt;span&gt;&amp;nbsp;&lt;/span&gt;복사&lt;/h2&gt;
&lt;/div&gt;
&lt;pre id=&quot;sample-input-1&quot; class=&quot;basic&quot; style=&quot;background-color: #f7f7f9; color: #333333;&quot;&gt;&lt;code&gt;5 2
0 0
8 3
1 1
10 -5
2 2
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;h2 style=&quot;color: #585f69;&quot; data-ke-size=&quot;size26&quot;&gt;예제 출력 1&lt;span&gt;&amp;nbsp;&lt;/span&gt;복사&lt;/h2&gt;
&lt;/div&gt;
&lt;pre id=&quot;sample-output-1&quot; class=&quot;angelscript&quot; style=&quot;background-color: #f7f7f9; color: #333333;&quot;&gt;&lt;code&gt;4&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;풀이&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;DP 배열은 2차원으로, dp[k][i]는 i번째까지 도달하면서, k번을 건너 뛰었을 때의 최솟값으로 잡았다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그 후 고려해야 하는 점은&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;dp[k][i-1] + i-1과 i번째의 거리&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 경우에는 모두 다 건너뛰어서 더이상 건너 뛸 수 없기 때문에, 직전까지 최소 거리 + 가야할 거리를 더한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 처럼 몇번 건너 뛰었는지에 따라 i-1가 될지, i-2가 될지 정해져야 한다는 것.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그럼 dp[k][n] 는 dp[k-1][N-i-1] + 현재 가야할 거리 가 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 점화식을 토대로 문제를 해결하면 된다.&lt;/p&gt;
&lt;pre id=&quot;code_1714979777836&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;

public class BJ_10653_마라톤2 {
    public static class Point{
        int x;
        int y;
        Point(int x, int y){
            this.x = x;
            this.y = y;
        }
    }

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
        int N = Integer.parseInt(st.nextToken());
        int K = Integer.parseInt(st.nextToken());
        Point[] points = new Point[N];
        int dp[][] = new int[K+1][N];

        for(int i=0; i&amp;lt;N; i++)
        {
            st = new StringTokenizer(br.readLine());
            points[i] = new Point(Integer.parseInt(st.nextToken()),Integer.parseInt(st.nextToken()));
        }

        for(int i=0; i&amp;lt;=K; i++)
        {
            Arrays.fill(dp[i],-1);
            if(i==0)dp[i][0]=0;
        }

        int min, temp;
        for(int i=1; i&amp;lt;N; i++){
            for(int j=0; j&amp;lt;=K; j++)
            {
                if(i-j&amp;gt;0){
                    min = Integer.MAX_VALUE;
                    for(int k=0;k&amp;lt;=j;k++)
                    {
                        temp = dp[j-k][i-k-1];
                        if(temp==-1) continue;
                        int distance = Math.abs(points[i-k-1].x-points[i].x) + Math.abs(points[i-k-1].y-points[i].y);
                        min = Math.min(min, temp+distance);
                    }
                    dp[j][i] = min;
                }
            }
        }
        int result = dp[0][N-1];
        for(int i=1; i&amp;lt;=K; i++)
        {
            result = Math.min(result,dp[i][N-1]);
        }
        System.out.println(result);

    }
}&lt;/code&gt;&lt;/pre&gt;</description>
      <category>알고리즘/백준</category>
      <author>D_Helloper</author>
      <guid isPermaLink="true">https://dhelloper.tistory.com/111</guid>
      <comments>https://dhelloper.tistory.com/111#entry111comment</comments>
      <pubDate>Mon, 6 May 2024 16:16:23 +0900</pubDate>
    </item>
    <item>
      <title>백준 2310 - 어드벤처 게임 (Java)</title>
      <link>https://dhelloper.tistory.com/110</link>
      <description>&lt;div style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;
&lt;div&gt;
&lt;h2 style=&quot;color: #585f69;&quot; data-ke-size=&quot;size26&quot;&gt;문제&lt;/h2&gt;
&lt;/div&gt;
&lt;div id=&quot;problem_description&quot;&gt;
&lt;p style=&quot;color: #555555;&quot; data-ke-size=&quot;size16&quot;&gt;어드벤처 게임을 하던 중, 1부터 n까지의 번호가 붙은 방을 지나가야 하는 마법의 미로를 마주쳤다. 각 방 안에는 번호가 붙은 문이 있을 수 있고, 각 문은 해당하는 번호의 방으로 통한다. 방 안에는 레프리콘이나 트롤이 있을 수도 있다.&lt;/p&gt;
&lt;p style=&quot;color: #555555;&quot; data-ke-size=&quot;size16&quot;&gt;레프리콘이 있는 방에 들어가면 레프리콘은 모험가의 소지금이 일정 양 이하로 떨어지지 않게 채워준다. 레프리콘은 모험가의 소지금이 일정량 미만일 때에는 그만한 양이 되도록 금화를 채워주고, 소지금이 일정량 이상일 때에는 그대로 둔다. 트롤이 있는 방에 들어가려면 일정량의 통행료를 지불해야 한다. 이는 맨 처음에 모험가가 1번 방에서 시작하려 할 때에도 마찬가지이다.&lt;/p&gt;
&lt;p style=&quot;color: #555555;&quot; data-ke-size=&quot;size16&quot;&gt;모험가는 소지금이 0인 상태에서 출발한다. 과연 모험가는 1번 방에서 출발해서 n번 방에 도착할 수 있을까?&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;
&lt;div&gt;
&lt;h2 style=&quot;color: #585f69;&quot; data-ke-size=&quot;size26&quot;&gt;입력&lt;/h2&gt;
&lt;/div&gt;
&lt;div id=&quot;problem_input&quot;&gt;
&lt;p style=&quot;color: #555555;&quot; data-ke-size=&quot;size16&quot;&gt;입력은 여러 개의 미로로 주어진다. 각 미로의 첫 줄에는 미로의 방 수를 나타내는 정수 n(1 &amp;le; n &amp;le; 1000)이 주어진다. 다음 n 줄에는 각 방의 정보가 주어진다. 각 방의 정보는 방의 내용물을 나타내는 알파벳 하나(E: 빈 방, L: 레프리콘, T: 트롤)와 그 방의 레프리콘이나 트롤이 정해놓은 금액(빈 방일 경우 0이고, 금액은 500보다 작거나 같은 자연수), 그리고 그 방에서 다른 방으로 갈 수 있는 문의 번호들로 이루어진다. 각 줄은 0으로 끝난다. 미로의 방 수가 0개인 입력이 들어오면 입력을 종료한다.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;
&lt;div&gt;
&lt;h2 style=&quot;color: #585f69;&quot; data-ke-size=&quot;size26&quot;&gt;출력&lt;/h2&gt;
&lt;/div&gt;
&lt;div id=&quot;problem_output&quot;&gt;
&lt;p style=&quot;color: #555555;&quot; data-ke-size=&quot;size16&quot;&gt;출력은 각 미로마다 한 줄씩으로 이루어진다. 각 줄에는 1번 방에서 n번 방까지 갈 수 있는지를 &quot;Yes&quot; 또는 &quot;No&quot;로 출력한다.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;h2 style=&quot;color: #585f69;&quot; data-ke-size=&quot;size26&quot;&gt;예제 입력 1&lt;span&gt;&amp;nbsp;&lt;/span&gt;복사&lt;/h2&gt;
&lt;/div&gt;
&lt;pre id=&quot;sample-input-1&quot; class=&quot;angelscript&quot; style=&quot;background-color: #f7f7f9; color: #333333;&quot;&gt;&lt;code&gt;3
E 0 2 0
L 10 3 0
T 15 1 2 0
4
E 0 2 3 0
L 201 2 3 0
L 10 4 0
T 15 2 3 1 0
0
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;h2 style=&quot;color: #585f69;&quot; data-ke-size=&quot;size26&quot;&gt;예제 출력 1&lt;span&gt;&amp;nbsp;&lt;/span&gt;복사&lt;/h2&gt;
&lt;/div&gt;
&lt;pre id=&quot;sample-output-1&quot; class=&quot;yaml&quot; style=&quot;background-color: #f7f7f9; color: #333333;&quot;&gt;&lt;code&gt;No
Yes&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;풀이&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아니 좀. 그렇다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;반복 방문하면 안된다는 지문도 없을 뿐 더러 문제는 미로의 탈출을 얘기하면서 정답은 N번방에 도착할 수 있는지를 묻고있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;반복 방문 하는 건 테케 돌려보다가 스택오버플로우 나서 보니까 계속 돌더라. 아니 이게 무슨..&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여러모로 갸우뚱하게 만들었던 문제, 그냥 DFS로 탐색했다.&lt;/p&gt;
&lt;pre id=&quot;code_1714884969060&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
import java.util.StringTokenizer;

public class BJ_2310_어드벤처게임 {
    public static class Room{
        char type;
        int value;
        List&amp;lt;Integer&amp;gt; door;
        boolean visited=false;
        public Room(char type, int value, List&amp;lt;Integer&amp;gt; door,boolean visited)
        {
            this.type = type;
            this.value = value;
            this.door = door;
            this.visited = visited;
        }
    }
    static int N;
    static List&amp;lt;Room&amp;gt; list;
    static int result;
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        while(true)
        {
            StringTokenizer st = new StringTokenizer(br.readLine());
            N = Integer.parseInt(st.nextToken());
            if(N == 0) break;

            //맵 정보 받을 준비
            list = new ArrayList&amp;lt;&amp;gt;();
            for(int i=0; i&amp;lt;N; i++)
            {
                result=0;
                List&amp;lt;Integer&amp;gt; roomList = new ArrayList&amp;lt;&amp;gt;();
                st = new StringTokenizer(br.readLine());
                char t = st.nextToken().charAt(0);
                int v = Integer.parseInt(st.nextToken());
                while(true)
                {
                    int check = Integer.parseInt(st.nextToken());
                    if(check==0) break;
                    roomList.add(check-1);
                }

                list.add(new Room(t,v,roomList,false));
            }
            DFS(0,0);
            System.out.println(result==1?&quot;Yes&quot;:&quot;No&quot;);
        }
    }

    public static void DFS(int start, int gold)
    {
        if(list.get(start).type=='T') gold-=list.get(start).value;
        else {
            if(gold &amp;lt; list.get(start).value)
                gold+=list.get(start).value;
        }

        if(gold&amp;gt;=0)
        {
            if(start+1==N){
                result = 1;
                return;
            }
            list.get(start).visited=true;
            for(int i=0; i&amp;lt;list.get(start).door.size();i++)
            {
                if(!list.get(list.get(start).door.get(i)).visited)
                    DFS(list.get(start).door.get(i),gold);
            }
            list.get(start).visited=false;
        }
        else
        {
            if(list.get(start).type=='T') gold += list.get(start).value;
            return;
        }
    }
}&lt;/code&gt;&lt;/pre&gt;</description>
      <category>알고리즘/백준</category>
      <author>D_Helloper</author>
      <guid isPermaLink="true">https://dhelloper.tistory.com/110</guid>
      <comments>https://dhelloper.tistory.com/110#entry110comment</comments>
      <pubDate>Sun, 5 May 2024 13:56:41 +0900</pubDate>
    </item>
    <item>
      <title>백준 2174 - 로봇 시뮬레이션(Java)</title>
      <link>https://dhelloper.tistory.com/109</link>
      <description>&lt;div style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;
&lt;div&gt;
&lt;h2 style=&quot;color: #585f69;&quot; data-ke-size=&quot;size26&quot;&gt;문제&lt;/h2&gt;
&lt;/div&gt;
&lt;div id=&quot;problem_description&quot;&gt;
&lt;p style=&quot;color: #555555;&quot; data-ke-size=&quot;size16&quot;&gt;가로 A(1&amp;le;A&amp;le;100), 세로 B(1&amp;le;B&amp;le;100) 크기의 땅이 있다. 이 땅 위에 로봇들이 N(1&amp;le;N&amp;le;100)개 있다.&lt;/p&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;516&quot; data-origin-height=&quot;279&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lAjjn/btsHbUKP7rP/sPr8guC1wKh13Qeekysqo0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lAjjn/btsHbUKP7rP/sPr8guC1wKh13Qeekysqo0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lAjjn/btsHbUKP7rP/sPr8guC1wKh13Qeekysqo0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlAjjn%2FbtsHbUKP7rP%2FsPr8guC1wKh13Qeekysqo0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;516&quot; height=&quot;279&quot; data-origin-width=&quot;516&quot; data-origin-height=&quot;279&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;

&lt;p style=&quot;color: #555555;&quot; data-ke-size=&quot;size16&quot;&gt;로봇들의 초기 위치는 x좌표와 y좌표로 나타난다. 위의 그림에서 보듯 x좌표는 왼쪽부터, y좌표는 아래쪽부터 순서가 매겨진다. 또한 각 로봇은 맨 처음에 NWES 중 하나의 방향을 향해 서 있다. 초기에 서 있는 로봇들의 위치는 서로 다르다.&lt;/p&gt;
&lt;p style=&quot;color: #555555;&quot; data-ke-size=&quot;size16&quot;&gt;이러한 로봇들에 M(1&amp;le;M&amp;le;100)개의 명령을 내리려고 한다. 각각의 명령은 순차적으로 실행된다. 즉, 하나의 명령을 한 로봇에서 내렸으면, 그 명령이 완수될 때까지 그 로봇과 다른 모든 로봇에게 다른 명령을 내릴 수 없다. 각각의 로봇에 대해 수행하는 명령은 다음의 세 가지가 있다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li style=&quot;color: #555555;&quot;&gt;L:&amp;nbsp;로봇이 향하고 있는 방향을 기준으로 왼쪽으로 90도 회전한다.&lt;/li&gt;
&lt;li style=&quot;color: #555555;&quot;&gt;R: 로봇이 향하고 있는 방향을 기준으로 오른쪽으로 90도 회전한다.&lt;/li&gt;
&lt;li style=&quot;color: #555555;&quot;&gt;F: 로봇이 향하고 있는 방향을 기준으로 앞으로 한 칸 움직인다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p style=&quot;color: #555555;&quot; data-ke-size=&quot;size16&quot;&gt;간혹 로봇들에게 내리는 명령이 잘못될 수도 있기 때문에, 당신은 로봇들에게 명령을 내리기 전에 한 번 시뮬레이션을 해 보면서 안전성을 검증하려 한다. 이를 도와주는 프로그램을 작성하시오.&lt;/p&gt;
&lt;p style=&quot;color: #555555;&quot; data-ke-size=&quot;size16&quot;&gt;잘못된 명령에는 다음의 두 가지가 있을 수 있다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li style=&quot;color: #555555;&quot;&gt;Robot X crashes into the wall: X번 로봇이 벽에 충돌하는 경우이다. 즉, 주어진 땅의 밖으로 벗어나는 경우가 된다.&lt;/li&gt;
&lt;li style=&quot;color: #555555;&quot;&gt;Robot X crashes into robot Y: X번 로봇이 움직이다가 Y번 로봇에 충돌하는 경우이다.&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;
&lt;div&gt;
&lt;h2 style=&quot;color: #585f69;&quot; data-ke-size=&quot;size26&quot;&gt;입력&lt;/h2&gt;
&lt;/div&gt;
&lt;div id=&quot;problem_input&quot;&gt;
&lt;p style=&quot;color: #555555;&quot; data-ke-size=&quot;size16&quot;&gt;첫째 줄에 두 정수 A, B가 주어진다. 다음 줄에는 두 정수 N, M이 주어진다. 다음 N개의 줄에는 각 로봇의 초기 위치(x, y좌표 순) 및 방향이 주어진다. 다음 M개의 줄에는 각 명령이 명령을 내리는 순서대로 주어진다. 각각의 명령은 명령을 내리는 로봇, 명령의 종류(위에 나와 있는), 명령의 반복 회수로 나타낸다. 각 명령의 반복 회수는 1이상 100이하이다.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;
&lt;div&gt;
&lt;h2 style=&quot;color: #585f69;&quot; data-ke-size=&quot;size26&quot;&gt;출력&lt;/h2&gt;
&lt;/div&gt;
&lt;div id=&quot;problem_output&quot;&gt;
&lt;p style=&quot;color: #555555;&quot; data-ke-size=&quot;size16&quot;&gt;첫째 줄에 시뮬레이션 결과를 출력한다. 문제가 없는 경우에는 OK를, 그 외의 경우에는 위의 형식대로 출력을 한다. 만약 충돌이 여러 번 발생하는 경우에는 가장 먼저 발생하는 충돌을 출력하면 된다.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;h2 style=&quot;color: #585f69;&quot; data-ke-size=&quot;size26&quot;&gt;예제 입력 1&lt;span&gt;&amp;nbsp;&lt;/span&gt;복사&lt;/h2&gt;
&lt;/div&gt;
&lt;pre id=&quot;sample-input-1&quot; class=&quot;basic&quot; style=&quot;background-color: #f7f7f9; color: #333333;&quot;&gt;&lt;code&gt;5 4
2 2
1 1 E
5 4 W
1 F 7
2 F 7
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;h2 style=&quot;color: #585f69;&quot; data-ke-size=&quot;size26&quot;&gt;예제 출력 1&lt;span&gt;&amp;nbsp;&lt;/span&gt;복사&lt;/h2&gt;
&lt;/div&gt;
&lt;pre id=&quot;sample-output-1&quot; class=&quot;angelscript&quot; style=&quot;background-color: #f7f7f9; color: #333333;&quot;&gt;&lt;code&gt;Robot 1 crashes into the wall&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;풀이&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아. 진짜 싫다. 처음에 구현할 때 생각했던게&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;A,B의 반전, 그리고 이에 따른 상, 하의 반전이다. 여기까진 생각했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 나서 구현을 쭉했는데 몇몇 반례만 통과가 안되더라.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;뭐지 ? 하고 디버깅만 1시간을 넘게했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;알고보니 list에 넣을 때도 x,y를 반전시켜서 y,x로 넣은 것. 근데 Class에 선언된 x,y는 사실 상관 없던 것.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아. 진짜 싫다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일단, 문제의 조건을 보면&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 상,하가 반전되어 있어서 탐색할때 증감하는 부분도 반전이 되어야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. A,B가 int[A][B]가 아니라 int[B][A] 이다. (이거 때문에 문제 몇번 읽었다. 인지부조화 오네)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 위 2번 조건에 따라 x와 y의 활용 또한 map[x][y]가 아니라 map[y][x]다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 3번 조건때문에 list에 넣을때도 y,x로 넣었는데 class에는 x,y로 선언되어있었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일단. 검사를 하다가 벽에 부딛히거나 다른 로봇과 부딛히면 로직을 끝내는 flag용 boolean exit을 사용했다.&lt;/p&gt;
&lt;pre id=&quot;code_1714810138538&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.StringTokenizer;

public class BJ_2174_로봇시뮬레이션 {

    public static class Robot{
        int x;
        int y;
        int dir;
        public Robot(int x, int y, int dir)
        {
            this.x = x;
            this.y = y;
            this.dir = dir;
        }
    }
    static int A,B,N,M;
    static int[][] map;
    static int[][] deltas = {{0,1},{1,0},{0,-1},{-1,0}};
    static boolean exit = false;
    static ArrayList&amp;lt;Robot&amp;gt; list = new ArrayList&amp;lt;&amp;gt;();
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());

        A = Integer.parseInt(st.nextToken());
        B = Integer.parseInt(st.nextToken());
        map = new int[B][A];
        st = new StringTokenizer(br.readLine());

        N = Integer.parseInt(st.nextToken());
        M = Integer.parseInt(st.nextToken());
        list.add(new Robot(-1,-1,-1));
        for(int i=0; i&amp;lt;N; i++)
        {
            st = new StringTokenizer(br.readLine());
            int x = Integer.parseInt(st.nextToken())-1;
            int y = Integer.parseInt(st.nextToken())-1;
            String d = st.nextToken();
            int tempDir = -1;
            if(d.equals(&quot;N&quot;)) tempDir = 0;
            else if(d.equals(&quot;E&quot;)) tempDir = 1;
            else if(d.equals(&quot;S&quot;)) tempDir = 2;
            else if(d.equals(&quot;W&quot;)) tempDir = 3;
            list.add(new Robot(x,y,tempDir));
            map[y][x] = i+1;
        }
        for(int i=0; i&amp;lt;M; i++){
            st = new StringTokenizer(br.readLine());
            int index = Integer.parseInt(st.nextToken());
            String com = st.nextToken();
            int loof = Integer.parseInt(st.nextToken());
            if(com.equals(&quot;L&quot;)) turnLeft(index,loof);
            else if(com.equals(&quot;R&quot;)) turnRight(index,loof);
            else if(com.equals(&quot;F&quot;)) go(index,loof);
            if(exit) break;

        }
        if(!exit) System.out.println(&quot;OK&quot;);

    }

    public static void turnLeft(int index, int loof)
    {
        for(int i=0; i&amp;lt;loof; i++)
        {
            int dir = list.get(index).dir;
            if(dir == 0) list.get(index).dir = 3;
            else list.get(index).dir -= 1;
        }
    }
    public static void turnRight(int index, int loof)
    {
        for(int i=0; i&amp;lt;loof; i++)
        {
            int dir = list.get(index).dir;
            if(dir == 3) list.get(index).dir = 0;
            else list.get(index).dir += 1;
        }
    }
    public static void go(int index,int loof) {
        int nx = list.get(index).x;
        int ny = list.get(index).y;
        int dir = list.get(index).dir;
        for (int i = 0; i &amp;lt; loof; i++) {
            nx += deltas[dir][0];
            ny += deltas[dir][1];
            if (nx &amp;lt; 0 || A &amp;lt;= nx || ny &amp;lt; 0 || B &amp;lt;= ny) {
                System.out.println(&quot;Robot &quot; + index + &quot; crashes into the wall&quot;);
                exit = true;
                return;
            }
            if (map[ny][nx] != 0) {
                System.out.println(&quot;Robot &quot; + index + &quot; crashes into robot &quot; + map[ny][nx]);
                exit = true;
                return;
            }
            map[list.get(index).y][list.get(index).x] = 0;
            map[ny][nx] = index;
            list.get(index).x = nx;
            list.get(index).y = ny;
        }
    }
}&lt;/code&gt;&lt;/pre&gt;</description>
      <category>알고리즘/백준</category>
      <author>D_Helloper</author>
      <guid isPermaLink="true">https://dhelloper.tistory.com/109</guid>
      <comments>https://dhelloper.tistory.com/109#entry109comment</comments>
      <pubDate>Sat, 4 May 2024 17:11:37 +0900</pubDate>
    </item>
    <item>
      <title>백준 1799 - 비숍 (Java)</title>
      <link>https://dhelloper.tistory.com/108</link>
      <description>&lt;div style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;
&lt;div&gt;
&lt;h2 style=&quot;color: #585f69;&quot; data-ke-size=&quot;size26&quot;&gt;문제&lt;/h2&gt;
&lt;/div&gt;
&lt;div id=&quot;problem_description&quot;&gt;
&lt;p style=&quot;color: #555555;&quot; data-ke-size=&quot;size16&quot;&gt;서양 장기인 체스에는 대각선 방향으로 움직일 수 있는 비숍(bishop)이 있다. &amp;lt; 그림 1 &amp;gt;과 같은 정사각형 체스판 위에 B라고 표시된 곳에 비숍이 있을 때 비숍은 대각선 방향으로 움직여 O로 표시된 칸에 있는 다른 말을 잡을 수 있다.&lt;/p&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;237&quot; data-origin-height=&quot;229&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lf2jG/btsHcpXDrqc/hGzZLxjGpqbXiyggMI8MMk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lf2jG/btsHcpXDrqc/hGzZLxjGpqbXiyggMI8MMk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lf2jG/btsHcpXDrqc/hGzZLxjGpqbXiyggMI8MMk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Flf2jG%2FbtsHcpXDrqc%2FhGzZLxjGpqbXiyggMI8MMk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;237&quot; height=&quot;229&quot; data-origin-width=&quot;237&quot; data-origin-height=&quot;229&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;

&lt;p style=&quot;color: #555555; text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;lt; 그림 1 &amp;gt;&lt;/p&gt;
&lt;p style=&quot;color: #555555;&quot; data-ke-size=&quot;size16&quot;&gt;그런데 체스판 위에는 비숍이 놓일 수 없는 곳이 있다. &amp;lt; 그림 2 &amp;gt;에서 체스판에 색칠된 부분은 비숍이 놓일 수 없다고 하자. 이와 같은 체스판에 서로가 서로를 잡을 수 없도록 하면서 비숍을 놓는다면 &amp;lt; 그림 3 &amp;gt;과 같이 최대 7개의 비숍을 놓을 수 있다. 색칠된 부분에는 비숍이 놓일 수 없지만 지나갈 수는 있다.&lt;/p&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;180&quot; data-origin-height=&quot;178&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/FDDAg/btsHbikUHW2/bn397OrpWkucFXkI5Dj3T1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/FDDAg/btsHbikUHW2/bn397OrpWkucFXkI5Dj3T1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/FDDAg/btsHbikUHW2/bn397OrpWkucFXkI5Dj3T1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FFDDAg%2FbtsHbikUHW2%2Fbn397OrpWkucFXkI5Dj3T1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;180&quot; height=&quot;178&quot; data-origin-width=&quot;180&quot; data-origin-height=&quot;178&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;

&lt;p style=&quot;color: #555555; text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;lt; 그림 2 &amp;gt;&lt;/p&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;183&quot; data-origin-height=&quot;181&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/JZZD0/btsHbVbByp8/L7z1IkJRRess5e8UWPkva0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/JZZD0/btsHbVbByp8/L7z1IkJRRess5e8UWPkva0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/JZZD0/btsHbVbByp8/L7z1IkJRRess5e8UWPkva0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FJZZD0%2FbtsHbVbByp8%2FL7z1IkJRRess5e8UWPkva0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;183&quot; height=&quot;181&quot; data-origin-width=&quot;183&quot; data-origin-height=&quot;181&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;

&lt;p style=&quot;color: #555555; text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;lt; 그림 3 &amp;gt;&lt;/p&gt;
&lt;p style=&quot;color: #555555;&quot; data-ke-size=&quot;size16&quot;&gt;정사각형 체스판의 한 변에 놓인 칸의 개수를 체스판의 크기라고 한다. 체스판의 크기와 체스판 각 칸에 비숍을 놓을 수 있는지 없는지에 대한 정보가 주어질 때, 서로가 서로를 잡을 수 없는 위치에 놓을 수 있는 비숍의 최대 개수를 구하는 프로그램을 작성하시오.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;
&lt;div&gt;
&lt;h2 style=&quot;color: #585f69;&quot; data-ke-size=&quot;size26&quot;&gt;입력&lt;/h2&gt;
&lt;/div&gt;
&lt;div id=&quot;problem_input&quot;&gt;
&lt;p style=&quot;color: #555555;&quot; data-ke-size=&quot;size16&quot;&gt;첫째 줄에 체스판의 크기가 주어진다. 체스판의 크기는 10이하의 자연수이다. 둘째 줄부터 아래의 예와 같이 체스판의 각 칸에 비숍을 놓을 수 있는지 없는지에 대한 정보가 체스판 한 줄 단위로 한 줄씩 주어진다. 비숍을 놓을 수 있는 곳에는 1, 비숍을 놓을 수 없는 곳에는 0이 빈칸을 사이에 두고 주어진다.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;
&lt;div&gt;
&lt;h2 style=&quot;color: #585f69;&quot; data-ke-size=&quot;size26&quot;&gt;출력&lt;/h2&gt;
&lt;/div&gt;
&lt;div id=&quot;problem_output&quot;&gt;
&lt;p style=&quot;color: #555555;&quot; data-ke-size=&quot;size16&quot;&gt;첫째 줄에 주어진 체스판 위에 놓을 수 있는 비숍의 최대 개수를 출력한다.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;h2 style=&quot;color: #585f69;&quot; data-ke-size=&quot;size26&quot;&gt;예제 입력 1&lt;span&gt;&amp;nbsp;&lt;/span&gt;복사&lt;/h2&gt;
&lt;/div&gt;
&lt;pre id=&quot;sample-input-1&quot; class=&quot;basic&quot; style=&quot;background-color: #f7f7f9; color: #333333;&quot;&gt;&lt;code&gt;5
1 1 0 1 1
0 1 0 0 0
1 0 1 0 1
1 0 0 0 0
1 0 1 1 1
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;h2 style=&quot;color: #585f69;&quot; data-ke-size=&quot;size26&quot;&gt;예제 출력 1&lt;span&gt;&amp;nbsp;&lt;/span&gt;복사&lt;/h2&gt;
&lt;/div&gt;
&lt;pre id=&quot;sample-output-1&quot; class=&quot;angelscript&quot; style=&quot;background-color: #f7f7f9; color: #333333;&quot;&gt;&lt;code&gt;7&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;풀이&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;메모리초과 시간초과 둘 다 봤다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;처음엔 백트래킹 만들고 배열 계속 복사해서 넘겨주니까 메모리초과,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;복사 빼니까 시간초과&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;검색해보니까 두 개로 나누라고 나온다. 체스 판에서 흰색과 검은색에 있는 비숍은 서로간에 간섭을 못한단다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아?!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;체스란걸 전혀 생각 안했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;검은색과 하얀색 두개로 나눠서 백트래킹 진행. 둘의 합을 출력하면 된다.&lt;/p&gt;
&lt;pre id=&quot;code_1714742286953&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.StringTokenizer;

public class BJ_1799_비숍 {
    static int N;
    static int result;
    static int black;
    static int white;

    static int[][] map;
    static int[][] chess;
    static int[][] deltas = {{-1,-1},{-1,1},{1,-1},{1,1}};
    static boolean[][] visited;
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());

        N = Integer.parseInt(st.nextToken());
        map = new int[N][N];
        visited = new boolean[N][N];
        for(int i=0; i&amp;lt;N; i++)
        {
            st = new StringTokenizer(br.readLine());
            for(int j=0; j&amp;lt;N; j++)
            {
                map[i][j] = Integer.parseInt(st.nextToken());
            }
        }
        chess = new int[N][N];
        int count = 0;
        for(int i = 0; i &amp;lt; N; i++) {
            for(int j = 0; j &amp;lt; N; j++) {
                chess[i][j] = (i+j) % 2;
            }
        }
        dfs(0,0,chess[0][0],0);
        dfs(0,1,chess[0][1],0);
        result = black+white;
        System.out.println(result);
    }

    public static void dfs(int y, int x, int color ,int count) {
        if(y &amp;gt;= N) {
            if(color == 0) {
                black = Math.max(black, count);
            }
            else {
                white = Math.max(white, count);
            }
            return;
        }

        int nx = x + 2;
        int ny = y;

        if(nx &amp;gt;= N) {
            ny++;
            if(ny &amp;lt; N) {
                if(chess[ny][0] == color) {
                    nx = 0;
                }
                else {
                    nx = 1;
                }
            }
        }

        if(map[y][x] == 0) {
            dfs(ny, nx, color, count);
            return;
        }

        if(check(y,x)) {
            visited[y][x] = true;
            dfs(ny, nx, color, count+1);
            visited[y][x] = false;
        }

        dfs(ny, nx, color, count);
    }

    public static boolean check(int x,int y)
    {
        int goCnt = 0;
        for(int dir=0; dir&amp;lt;4; dir++)
        {
            if(go(x,y,dir)) goCnt++;
        }
        if(goCnt&amp;lt;4) return false;
        return true;
    }

    public static boolean go(int x, int y, int dir)
    {
        int nx = x;
        int ny = y;
        while(true)
        {
            nx+=deltas[dir][0];
            ny+=deltas[dir][1];
            if(nx&amp;lt;0||N&amp;lt;=nx || ny&amp;lt;0||N&amp;lt;=ny) break;
            if(visited[nx][ny]) return false;
        }
        return true;
    }
}&lt;/code&gt;&lt;/pre&gt;</description>
      <category>알고리즘/백준</category>
      <author>D_Helloper</author>
      <guid isPermaLink="true">https://dhelloper.tistory.com/108</guid>
      <comments>https://dhelloper.tistory.com/108#entry108comment</comments>
      <pubDate>Fri, 3 May 2024 22:18:16 +0900</pubDate>
    </item>
  </channel>
</rss>