<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>내가 개발해볼게!!</title>
    <link>https://hee0912.tistory.com/</link>
    <description>
하루에 한 번 공부 기록 남기기</description>
    <language>ko</language>
    <pubDate>Fri, 15 May 2026 01:20:47 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>보송송희</managingEditor>
    <image>
      <title>내가 개발해볼게!!</title>
      <url>https://tistory1.daumcdn.net/tistory/5153378/attach/f14fb98958144da1bb6c2ad41e49114a</url>
      <link>https://hee0912.tistory.com</link>
    </image>
    <item>
      <title>[BOJ] 백준 1189번: 컴백홈(Java)</title>
      <link>https://hee0912.tistory.com/60</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/1189&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://www.acmicpc.net/problem/1189&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1696515537569&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;1189번: 컴백홈&quot; data-og-description=&quot;첫 줄에 정수 R(1 &amp;le; R &amp;le; 5), C(1 &amp;le; C &amp;le; 5), K(1 &amp;le; K &amp;le; R&amp;times;C)가 공백으로 구분되어 주어진다. 두 번째부터 R+1번째 줄까지는 R&amp;times;C 맵의 정보를 나타내는 '.'과 'T'로 구성된 길이가 C인 문자열이 주어진다&quot; data-og-host=&quot;www.acmicpc.net&quot; data-og-source-url=&quot;https://www.acmicpc.net/problem/1189&quot; data-og-url=&quot;https://www.acmicpc.net/problem/1189&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/jBFzy/hyT54AEcWT/CD0plaOLYHNrPhP5ck5uZK/img.png?width=2834&amp;amp;height=1480&amp;amp;face=0_0_2834_1480&quot;&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/1189&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.acmicpc.net/problem/1189&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/jBFzy/hyT54AEcWT/CD0plaOLYHNrPhP5ck5uZK/img.png?width=2834&amp;amp;height=1480&amp;amp;face=0_0_2834_1480');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;1189번: 컴백홈&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;첫 줄에 정수 R(1 &amp;le; R &amp;le; 5), C(1 &amp;le; C &amp;le; 5), K(1 &amp;le; K &amp;le; R&amp;times;C)가 공백으로 구분되어 주어진다. 두 번째부터 R+1번째 줄까지는 R&amp;times;C 맵의 정보를 나타내는 '.'과 'T'로 구성된 길이가 C인 문자열이 주어진다&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.acmicpc.net&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #ffffff; background-color: #0593d3;&quot;&gt;문제&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1149&quot; data-origin-height=&quot;237&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cptb83/btsw6XLv6K5/GU2sr4rtPffsBxaAKJUkr1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cptb83/btsw6XLv6K5/GU2sr4rtPffsBxaAKJUkr1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cptb83/btsw6XLv6K5/GU2sr4rtPffsBxaAKJUkr1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcptb83%2Fbtsw6XLv6K5%2FGU2sr4rtPffsBxaAKJUkr1%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;1149&quot; height=&quot;237&quot; data-origin-width=&quot;1149&quot; data-origin-height=&quot;237&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #ffffff; background-color: #0593d3;&quot;&gt;입력&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot;&gt;첫 줄에 정수 R(1 &amp;le; R &amp;le; 5), C(1 &amp;le; C &amp;le; 5), K(1 &amp;le; K &amp;le; R&amp;times;C)가 공백으로 구분되어 주어진다. 두 번째부터 R+1번째 줄까지는 R&amp;times;C 맵의 정보를 나타내는 '.'과 'T'로 구성된 길이가 C인 문자열이 주어진다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #ffffff; background-color: #0593d3;&quot;&gt;출력&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot;&gt;첫 줄에 거리가 K인 가짓수를 출력한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #ffffff; background-color: #0593d3;&quot;&gt;난이도&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실버 1&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #ffffff; background-color: #0593d3;&quot;&gt;Sol&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #1f2328; text-align: start;&quot;&gt;재귀 함수 - 왼쪽 아래(R-1, 0)에서 출발하여 오른쪽 위(0, C-1)까지 가는&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;모든 경우를 확인&lt;/b&gt;&lt;span style=&quot;background-color: #ffffff; color: #1f2328; text-align: start;&quot;&gt;하며&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;거리가 K인 경우를 카운트&lt;/b&gt;&lt;span style=&quot;background-color: #ffffff; color: #1f2328; text-align: start;&quot;&gt;한다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1696515622105&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public class BOJ1189 {
    static int R, C, K;
    static char[][] map; // 지도를 입력받을 배열
    static boolean[][] isvisited; // 방문 여부 확인할 배열
    static int[] dr = {1, -1, 0, 0};
    static int[] dc = {0, 0, -1, 1};
    static int count = 0;

    public static void main(String[] args) throws IOException {
        BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer token = new StringTokenizer(bf.readLine());
        R = Integer.parseInt(token.nextToken());
        C = Integer.parseInt(token.nextToken());
        K = Integer.parseInt(token.nextToken());

        map = new char[R][C];
        isvisited = new boolean[R][C];

        for(int i=0; i&amp;lt;R; i++){
            String st = bf.readLine();
            for(int j=0; j&amp;lt;C; j++) map[i][j] = st.charAt(j);
        }

        isvisited[R-1][0] = true; // 출발 지점(왼쪽 아래) 방문 처리
        search(R-1, 0, 1); // 왼쪽 아래에서 출발. 첫 칸부터 세야 하기 때문에 len=1부터 시작

        System.out.println(count);
    }

    static void search(int r, int c, int len){ // 현재 위치 (r, c), 이동한 거리 len
        if(r == 0 &amp;amp;&amp;amp; c == C-1){ // 오른쪽 위에 도착했을 때
            if(len==K) count++; // 이동 거리가 K라면 카운트
            return;
        }

        for(int i=0; i&amp;lt;4; i++){
            int nr = r + dr[i];
            int nc = c + dc[i];

            if(nr&amp;lt;0 || nc&amp;lt;0 || nr&amp;gt;=R || nc&amp;gt;=C) continue; // 이동 가능한 좌표인지 확인 ① 범위 내 좌표인지 확인
            if(map[nr][nc]=='T' || isvisited[nr][nc]) continue; // 이동 가능한 좌표인지 확인 ② 장애물 존재 여부, 방문 여부 확인

            isvisited[nr][nc] = true; // 방문 처리
            search(nr, nc, len+1); // 다음 좌표 방문
            isvisited[nr][nc] = false;  // 방문 후 돌아나온다 - 비방문 처리
        }
    }
}&lt;/code&gt;&lt;/pre&gt;</description>
      <category>Algorithm/BOJ</category>
      <author>보송송희</author>
      <guid isPermaLink="true">https://hee0912.tistory.com/60</guid>
      <comments>https://hee0912.tistory.com/60#entry60comment</comments>
      <pubDate>Thu, 5 Oct 2023 23:20:38 +0900</pubDate>
    </item>
    <item>
      <title>[BOJ] 백준 2468번: 안전 영역(Java)</title>
      <link>https://hee0912.tistory.com/59</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/2468&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://www.acmicpc.net/problem/2468&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1696075592167&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;2468번: 안전 영역&quot; data-og-description=&quot;재난방재청에서는 많은 비가 내리는 장마철에 대비해서 다음과 같은 일을 계획하고 있다. 먼저 어떤 지역의 높이 정보를 파악한다. 그 다음에 그 지역에 많은 비가 내렸을 때 물에 잠기지 않는 &quot; data-og-host=&quot;www.acmicpc.net&quot; data-og-source-url=&quot;https://www.acmicpc.net/problem/2468&quot; data-og-url=&quot;https://www.acmicpc.net/problem/2468&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bhUKgf/hyT52ahAN9/RP1kAkQKm2RR1ke6G0yyr0/img.png?width=2834&amp;amp;height=1480&amp;amp;face=0_0_2834_1480&quot;&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/2468&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.acmicpc.net/problem/2468&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bhUKgf/hyT52ahAN9/RP1kAkQKm2RR1ke6G0yyr0/img.png?width=2834&amp;amp;height=1480&amp;amp;face=0_0_2834_1480');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;2468번: 안전 영역&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;재난방재청에서는 많은 비가 내리는 장마철에 대비해서 다음과 같은 일을 계획하고 있다. 먼저 어떤 지역의 높이 정보를 파악한다. 그 다음에 그 지역에 많은 비가 내렸을 때 물에 잠기지 않는&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.acmicpc.net&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #ffffff; background-color: #0593d3;&quot;&gt;문제&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;917&quot; data-origin-height=&quot;872&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bPImAW/btsv5kH8JnK/wiv9lNGWxsjXSk6I1NAkfk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bPImAW/btsv5kH8JnK/wiv9lNGWxsjXSk6I1NAkfk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bPImAW/btsv5kH8JnK/wiv9lNGWxsjXSk6I1NAkfk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbPImAW%2Fbtsv5kH8JnK%2Fwiv9lNGWxsjXSk6I1NAkfk%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;917&quot; height=&quot;872&quot; data-origin-width=&quot;917&quot; data-origin-height=&quot;872&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #ffffff; background-color: #0593d3;&quot;&gt;입력&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot;&gt;첫째 줄에는 어떤 지역을 나타내는 2차원 배열의 행과 열의 개수를 나타내는 수 N이 입력된다. N은 2 이상 100 이하의 정수이다. 둘째 줄부터 N개의 각 줄에는 2차원 배열의 첫 번째 행부터 N번째 행까지 순서대로 한 행씩 높이 정보가 입력된다. 각 줄에는 각 행의 첫 번째 열부터 N번째 열까지 N개의 높이 정보를 나타내는 자연수가 빈 칸을 사이에 두고 입력된다. 높이는 1이상 100 이하의 정수이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #ffffff; background-color: #0593d3;&quot;&gt;출력&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot;&gt;첫째 줄에 장마철에 물에 잠기지 않는 안전한 영역의 최대 개수를 출력한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #ffffff; background-color: #0593d3;&quot;&gt;난이도&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실버 1&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #ffffff; background-color: #0593d3;&quot;&gt;Sol&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아무 지역도 물에 잠기지 않을 수 있다는 조건이 있기 때문에 이를 고려하여 answer의 초기값을 1로 줘야 한다. 로직에서 걸러낼 수 있을 줄 알고 answer의 초기값을 0으로 줬었는데 안되네.. N과 상관 없이 배열의 모든 요소를 1로 입력했을 때의 결과로 확인할 수 있다.&lt;/p&gt;
&lt;pre id=&quot;code_1696075853996&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public class B2468_안전영역 {
    static int[][] field;
    static boolean[][] isvisited;
    static int N;
    static int answer = 1;
    static int[] dx = {1, -1, 0, 0};
    static int[] dy = {0, 0, -1, 1};

    public static void main(String[] args) throws IOException {
        BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer token = new StringTokenizer(bf.readLine());
        N = Integer.parseInt(token.nextToken());

        field = new int[N][N];

        int max = 0;

        for(int i=0; i&amp;lt;N; i++){
            token = new StringTokenizer(bf.readLine());

            for(int j=0; j&amp;lt;N; j++){
                field[i][j] = Integer.parseInt(token.nextToken());
                max = Integer.max(field[i][j], max);
            }
        }
        // input

        for(int i=1; i&amp;lt;max; i++){
            isvisited = new boolean[N][N];
            int count = 0;
            for(int j=0; j&amp;lt;N; j++){
                for(int k=0; k&amp;lt;N; k++){
                    if(field[j][k]&amp;lt;=i) isvisited[j][k] = true;
                    // 물에 잠기는 영역을 방문 처리해 탐색 시 방문하지 못하게 한다
                }
            }

            for(int j=0; j&amp;lt;N; j++){
                for(int k=0; k&amp;lt;N; k++){
                    if(!isvisited[j][k]){
                        count++;
                        isvisited[j][k] = true;
                        search(j, k);
                    }
                }
            }

            answer = Integer.max(answer, count);
//            System.out.println(i + &quot;까지 물에 잠길 때, 영역의 최대 개수 &quot; + count);
        }
        // operation

        System.out.println(answer);
        // output
    }

    static void search(int x, int y){
        for(int i=0; i&amp;lt;4; i++){
            int nx = x + dx[i];
            int ny = y + dy[i];

            if(nx&amp;lt;0 || ny &amp;lt; 0 || nx &amp;gt;=N || ny &amp;gt;= N) continue;

            if(!isvisited[nx][ny]){
                isvisited[nx][ny] = true;
                search(nx, ny);
            }
        }
    }
}&lt;/code&gt;&lt;/pre&gt;</description>
      <category>Algorithm/BOJ</category>
      <author>보송송희</author>
      <guid isPermaLink="true">https://hee0912.tistory.com/59</guid>
      <comments>https://hee0912.tistory.com/59#entry59comment</comments>
      <pubDate>Sat, 30 Sep 2023 21:11:26 +0900</pubDate>
    </item>
    <item>
      <title>[BOJ] 백준 2841번: 외계인의 기타 연주</title>
      <link>https://hee0912.tistory.com/58</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/2841&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://www.acmicpc.net/problem/2841&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1695307382417&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;2841번: 외계인의 기타 연주&quot; data-og-description=&quot;첫째 줄에 멜로디에 포함되어 있는 음의 수 N과 한 줄에 있는 프렛의 수 P가 주어진다. (1 &amp;le; N &amp;le; 500,000, 2 &amp;le; P &amp;le; 300,000) 다음 N개 줄에는 멜로디의 한 음을 나타내는 두 정수가 주어진다. 첫 번째 &quot; data-og-host=&quot;www.acmicpc.net&quot; data-og-source-url=&quot;https://www.acmicpc.net/problem/2841&quot; data-og-url=&quot;https://www.acmicpc.net/problem/2841&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bfEnRW/hyTY2WMZhE/ZnU01ESuQ51yXOOGGEwTkk/img.png?width=2834&amp;amp;height=1480&amp;amp;face=0_0_2834_1480&quot;&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/2841&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.acmicpc.net/problem/2841&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bfEnRW/hyTY2WMZhE/ZnU01ESuQ51yXOOGGEwTkk/img.png?width=2834&amp;amp;height=1480&amp;amp;face=0_0_2834_1480');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;2841번: 외계인의 기타 연주&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;첫째 줄에 멜로디에 포함되어 있는 음의 수 N과 한 줄에 있는 프렛의 수 P가 주어진다. (1 &amp;le; N &amp;le; 500,000, 2 &amp;le; P &amp;le; 300,000) 다음 N개 줄에는 멜로디의 한 음을 나타내는 두 정수가 주어진다. 첫 번째&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.acmicpc.net&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;background-color: #0593d3; color: #ffffff;&quot;&gt;문제&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1150&quot; data-origin-height=&quot;284&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/d4mb7Y/btsu2bdwufo/1PJxy41zsy7Hs1DuBzK7xk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/d4mb7Y/btsu2bdwufo/1PJxy41zsy7Hs1DuBzK7xk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/d4mb7Y/btsu2bdwufo/1PJxy41zsy7Hs1DuBzK7xk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fd4mb7Y%2Fbtsu2bdwufo%2F1PJxy41zsy7Hs1DuBzK7xk%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;1150&quot; height=&quot;284&quot; data-origin-width=&quot;1150&quot; data-origin-height=&quot;284&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #ffffff; background-color: #0593d3;&quot;&gt;입력&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;첫째 줄에 멜로디에 포함되어 있는 음의 수 N과 한 줄에 있는 프렛의 수 P가 주어진다. (1 &amp;le; N &amp;le; 500,000, 2 &amp;le; P &amp;le; 300,000)&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;다음 N개 줄에는 멜로디의 한 음을 나타내는 두 정수가 주어진다. 첫 번째 정수는 줄의 번호이고 두 번째 정수는 그 줄에서 눌러야 하는 프렛의 번호이다. 입력으로 주어진 음의 순서대로 기타를 연주해야 한다. 줄의 번호는 N보다 작거나 같은 자연수이고, 프렛의 번호도 P보다 작거나 같은 자연수이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #ffffff; background-color: #0593d3;&quot;&gt;출력&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot;&gt;첫째 줄에 멜로디를 연주하는데 필요한 최소 손가락 움직임을 출력한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #ffffff; background-color: #0593d3;&quot;&gt;난이도&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실버 1&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #ffffff; background-color: #0593d3;&quot;&gt;Sol&lt;/span&gt;&lt;/h4&gt;
&lt;p style=&quot;background-color: #ffffff; color: #1f2328; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;스택&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;6개를 기타의 1번 줄부터 6번 줄이라고 가정하고, 누르고 있는 프렛의 번호를 스택에 저장한다&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #1f2328; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #1f2328; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;1.&lt;b&gt; line&lt;/b&gt;은 눌러야 하는 줄의 번호이고,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;fret&lt;/b&gt;은 그 줄에서 눌러야 하는 프렛의 번호이다. 1번 스택부터 6번 스택이 스택 배열 0번 인덱스부터 5번 인덱스까지 저장되기 때문에 line 입력받을 때마다 -1 처리를 했다&lt;/p&gt;
&lt;div style=&quot;background-color: #ffffff; color: #1f2328; text-align: start;&quot;&gt;2. &lt;span style=&quot;letter-spacing: 0px;&quot;&gt;만약 해당 줄을 누르고 있는 손가락이 없다면 바로&lt;/span&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;fret을 line번 스택에 추가&lt;/b&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;하고,&lt;/span&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;조작 횟수를 증가&lt;/b&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;시킨다&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: #ffffff; color: #1f2328; text-align: start;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. &lt;span style=&quot;background-color: #ffffff; color: #1f2328; letter-spacing: 0px;&quot;&gt;만약&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #1f2328; letter-spacing: 0px;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;fret보다 큰 프렛을 누르고 있는 손가락이 존재&lt;/b&gt;&lt;span style=&quot;background-color: #ffffff; color: #1f2328; letter-spacing: 0px;&quot;&gt;한다면&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #1f2328; letter-spacing: 0px;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;line번 스택에서 제거하고, 조작 횟수를 증가&lt;/b&gt;&lt;span style=&quot;background-color: #ffffff; color: #1f2328; letter-spacing: 0px;&quot;&gt;시킨다. 해당 과정은 fret보다 큰 프렛을 누르고 있는 손가락이 없을 때까지 반복해야 하기 때문에 while문에 작성했다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. &lt;b&gt;fret보다 작은 프렛을 누르고 있는 손가락이 존재&lt;/b&gt;한다면 굳이 손가락을 뗄 필요 없이&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;line번 스택에 fret을 추가하고, 조작 횟수를 증가&lt;/b&gt;시킨다&lt;/p&gt;
&lt;div style=&quot;background-color: #ffffff; color: #1f2328; text-align: start;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;p style=&quot;background-color: #ffffff; color: #1f2328; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;(코드의 간결함을 위해 2번 코드와 4번 코드의 if문을 한번에 작성했다.)&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #1f2328; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;주어진 모든 음에 대해 1번부터 4번까지의 과정을 반복한 뒤 최종적으로 손가락을 움직인 횟수&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;count&lt;/b&gt;를 출력한다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #1f2328; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1695307542506&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public class BOJ2841 {
    public static void main(String[] args) throws IOException {
        BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer token = new StringTokenizer(bf.readLine());
        int N = Integer.parseInt(token.nextToken()); // 멜로디에 포함되어 있는 음의 수
        int P = Integer.parseInt(token.nextToken()); // 한 줄에 있는 프렛의 수

        Stack&amp;lt;Integer&amp;gt;[] strings = new Stack[6];
        for(int i=0; i&amp;lt;6; i++){
            strings[i] = new Stack();
        }

        int count = 0;

        for(int i=0; i&amp;lt;N; i++){
            token = new StringTokenizer(bf.readLine());
            int line = Integer.parseInt(token.nextToken()) - 1;
            int fret = Integer.parseInt(token.nextToken());

            while (!strings[line].isEmpty() &amp;amp;&amp;amp; strings[line].peek() &amp;gt; fret) {
                strings[line].pop();
                count++;
            } // fret을 누른 음을 연주하기 위해 fret보다 큰 프렛을 누르고 있는 손가락을 모두 떼어야 한다

            // 1. fret보다 작은 프렛을 누르고 있는 손가락이 존재한다면 굳이 손가락을 떼지 않고 fret을 눌러도 된다
            // 2. 해당 줄을 누르고 있는 손가락이 없다면 바로 fret을 눌러도 된다
            if ((!strings[line].isEmpty() &amp;amp;&amp;amp; strings[line].peek() &amp;lt; fret) || strings[line].empty()) {
                strings[line].add(fret);
                count++;
            }
        }

        System.out.println(count);
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt; &lt;/h4&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;p data-ke-size=&quot;size16&quot;&gt;스터디원이 ArrayDeque를 사용했길래 서치해봤는데, Stack보다 ArrayDeque의 성능이 더 좋다고 한다(스레드를 사용하지 않는다면) 생각해보니까 큐 관련한 자료형의 사용법을 다 잊은 것 같다.. 이번주 내로 ArrayDeque를 다시 공부해야 될 것 같다&lt;/p&gt;</description>
      <category>Algorithm/BOJ</category>
      <author>보송송희</author>
      <guid isPermaLink="true">https://hee0912.tistory.com/58</guid>
      <comments>https://hee0912.tistory.com/58#entry58comment</comments>
      <pubDate>Thu, 21 Sep 2023 23:48:07 +0900</pubDate>
    </item>
    <item>
      <title>[스프링 DB 1편 데이터 접근 핵심 원리] 1. JDBC의 이해</title>
      <link>https://hee0912.tistory.com/57</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-db-1/dashboard&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-db-1/dashboard&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1695220347955&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;스프링 DB 1편 - 데이터 접근 핵심 원리 - 인프런 | 강의&quot; data-og-description=&quot;백엔드 개발에 필요한 DB 데이터 접근 기술을 기초부터 이해하고, 완성할 수 있습니다. 스프링 DB 접근 기술의 원리와 구조를 이해하고, 더 깊이있는 백엔드 개발자로 성장할 수 있습니다., 백엔&quot; data-og-host=&quot;www.inflearn.com&quot; data-og-source-url=&quot;https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-db-1/dashboard&quot; data-og-url=&quot;https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-db-1&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bfpNal/hyTY3gIOc9/b7kDFW5Cji2YQT7n3jgol0/img.png?width=1200&amp;amp;height=781&amp;amp;face=0_0_1200_781,https://scrap.kakaocdn.net/dn/73G3S/hyTY1iS2ZE/buVe9TsKk4W2iiNx91XcVk/img.png?width=1200&amp;amp;height=781&amp;amp;face=0_0_1200_781,https://scrap.kakaocdn.net/dn/dDaJmP/hyTY1JX81b/7PkVtKM9X0M7MMhKPIHnck/img.png?width=3000&amp;amp;height=2064&amp;amp;face=0_0_3000_2064&quot;&gt;&lt;a href=&quot;https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-db-1/dashboard&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-db-1/dashboard&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bfpNal/hyTY3gIOc9/b7kDFW5Cji2YQT7n3jgol0/img.png?width=1200&amp;amp;height=781&amp;amp;face=0_0_1200_781,https://scrap.kakaocdn.net/dn/73G3S/hyTY1iS2ZE/buVe9TsKk4W2iiNx91XcVk/img.png?width=1200&amp;amp;height=781&amp;amp;face=0_0_1200_781,https://scrap.kakaocdn.net/dn/dDaJmP/hyTY1JX81b/7PkVtKM9X0M7MMhKPIHnck/img.png?width=3000&amp;amp;height=2064&amp;amp;face=0_0_3000_2064');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;스프링 DB 1편 - 데이터 접근 핵심 원리 - 인프런 | 강의&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;백엔드 개발에 필요한 DB 데이터 접근 기술을 기초부터 이해하고, 완성할 수 있습니다. 스프링 DB 접근 기술의 원리와 구조를 이해하고, 더 깊이있는 백엔드 개발자로 성장할 수 있습니다., 백엔&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.inflearn.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&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;h2 data-ke-size=&quot;size26&quot;&gt;Java DataBase Connectivity&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;: 자바에서 DB에 접속할 수 있도록 하는 자바 API&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;데이터베이스마다 커넥션을 연결하는 방법, SQL을 전달하는 방법, 결과를 응답받는 방법이 다르다. = DB를 다른 종류의 DB로 변경하려면 애플리케이션 서버에 개발된 DB 사용 코드도 변경해야 한다 = 각 DB마다 사용법을 따로 익혀야 한다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; JDBC가 &lt;b&gt;표준 인터페이스&lt;/b&gt;를 제공한다&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;java.sql.Connection : 연결&lt;/li&gt;
&lt;li&gt;java.sql.Statement : SQL을 담은 내용&lt;/li&gt;
&lt;li&gt;java.sql.ResultSet : SQL 응답&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;JDBC 드라이버&lt;/b&gt; : JDBC 인터페이스를 각 DB 벤더(회사)에서 자신의 DB에 맞게 구현해 제공하는 라이브러리&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;JDBC의 등장으로 두 가지 문제가 해결되었다&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;DB를 다른 종류의 DB로 변경하려면 애플리케이션 서버에 개발된 DB 사용 코드도 변경해야 한다&lt;/li&gt;
&lt;li&gt;&amp;rarr; 애플리케이션 로직이 JDBC 표준 인터페이스에만 의존하기 때문에 DB를 변경하고 싶으면 JDBC 드라이버만 변경하면 된다&lt;/li&gt;
&lt;li&gt;각 DB마다 사용법을 따로 익혀야 한다&lt;/li&gt;
&lt;li&gt;&amp;rarr; JDBC 표준 인터페이스의 사용법만 익히면 모든 데이터베이스에 동일하게 적용할 수 있다 (SQL문은 해당 DB에 맞도록 변경해야한다)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;JDBC와 최신 데이터 접근 기술&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;JDBC는 오래되고 복잡한 기술이기 때문에 JDBC를 편리하게 사용하는 다른 기술을 주로 사용한다&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;SQL Mapper
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;JdbcTemplate, MyBatis&lt;/li&gt;
&lt;li&gt;장점: JDBC를 편리하게 사용하도록 SQL 응답 결과를 객체로 편리하게 반환해주고, JDBC의 반복 코드를 제거해준다&lt;/li&gt;
&lt;li&gt;단점: 개발자가 SQL을 직접 작성해야 한다&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;ORM 기술
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;JPA, JPA 구현체(하이버네이트, 이클립스링크)&lt;/li&gt;
&lt;li&gt;객체를 관계형 데이터베이스 테이블과 매핑해주는 기술. SQL을 동적으로 만들어 실행해준다&lt;/li&gt;
&lt;li&gt;장점: SQL 자체를 작성하지 않아도 돼서 개발 생산성이 높아진다&lt;/li&gt;
&lt;li&gt;단점: 실무에서 사용하려면 깊이 있게 학습해야 한다&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;데이터베이스와 연결&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;JDBC의 DriverManager.getConnection()을 사용하면 라이브러리에 있는 DB 드라이버를 찾아 해당 DB와 connection을 맺고 반환받을 수 있다.&lt;/p&gt;
&lt;pre id=&quot;code_1695220167759&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;16:35:42.388 [Test worker] INFO spring.practice.connection.DBConnectionUtil - get connection 
 = com.mysql.cj.jdbc.ConnectionImpl@6b5f8707, class = class com.mysql.cj.jdbc.ConnectionImpl&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #dddddd;&quot;&gt;com.mysql.cj.jdbc.ConnectionImpl&lt;/span&gt; : MySQL DB 드라이버가 제공하는 MySQL 전용 커넥션. java.sql.Connection 인터페이스를 구현하고 있다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;JDBC에서는 java.sql.Connection 표준 커넥션 인터페이스를 정의하고 있고, 각 DB마다 JDBC 커넥션 인터페이스를 구현한 구현체를 제공한다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;DriverManager 커넥션 요청 흐름&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;DriverManager는 라이브러리에 등록된 DB 드라이버들을 관리하고, 커넥션을 획득하는 기능을 제공한다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;애플리케이션 로직에서 커넥션이 필요하면 DriverManager.getConnection()을 호출한다&lt;/li&gt;
&lt;li&gt;DriverManager는 자동으로 인식한 라이브러리 내에 등록된 드라이버에게 URL, 이름, 비밀번호 등의 정보를 전달해 커넥션을 획득할 수 있는지 확인한다.&lt;/li&gt;
&lt;li&gt;URL의 앞부분에 데이터베이스의 종류가 명시되어 있다(jdbc:h2, jdbc:mysql) 각 드라이버는 해당 정보를 확인하여 본인이 처리할 수 있는 요청인지 판단한다.&lt;/li&gt;
&lt;li&gt;이렇게 찾은 커넥션 구현체를 클라이언트에 반환한다.&lt;/li&gt;
&lt;/ol&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;JDBC를 통한 데이터베이스의 조작은 다음과 같은 흐름으로 진행된다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;커넥션 획득 - SQL문 준비 및 실행 - 리소스 정리&lt;/b&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;커넥션 획득&lt;/b&gt; : Connection con = DriverManager.getConnection()&lt;/li&gt;
&lt;li&gt;&lt;b&gt;SQL문 준비 및 실행&lt;/b&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;String sql = &amp;ldquo;insert into book(book_id, price) values (?, ?)&amp;rdquo;; 데이터베이스에 전달할 SQL을 문자열 타입으로 정의했다&lt;/li&gt;
&lt;li&gt;PreparedStatement pstmt = con.prepareStatement(sql); DB에 전달할 SQL과 파라미터로 전달할 데이터들을 준비한다. 이때 PreparedStatement는 Statement의 자식 타입인데, PreparedStatement를 통한 파라미터 바인딩 방식을 사용해 SQL Injection 공격을 예방할 수 있다.&lt;/li&gt;
&lt;li&gt;pstmt.setString(1, &amp;ldquo;1234&amp;rdquo;); SQL의 1번째 ?에 값을 지정한다&lt;/li&gt;
&lt;li&gt;pstmt.execute(); 준비된 SQL을 커넥션을 통해 실제 DB에 전달한다.&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;리소스 정리&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;쿼리를 실행하고 나면 항상 사용한 리소스를 정리해야 하기 때문에 finally 구문에 작성한다. 만약 커넥션이 계속 끊어지지 않고 유지되는 문제, 리소스 누수가 발생하면 커넥션 부족으로 장애가 발생할 수 있다.&lt;/li&gt;
&lt;li&gt;사용한 리소스는 항상 역순으로 정리해줘야 한다( ResultSet &amp;rarr; PreparedStatement &amp;rarr; Connection )&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;</description>
      <category>Backend/Spring</category>
      <author>보송송희</author>
      <guid isPermaLink="true">https://hee0912.tistory.com/57</guid>
      <comments>https://hee0912.tistory.com/57#entry57comment</comments>
      <pubDate>Wed, 20 Sep 2023 23:34:06 +0900</pubDate>
    </item>
    <item>
      <title>[PRO] 프로그래머스 148653번: 마법의 엘리베이터</title>
      <link>https://hee0912.tistory.com/56</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/148653&quot;&gt;https://school.programmers.co.kr/learn/courses/30/lessons/148653&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1695133875283&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;프로그래머스&quot; data-og-description=&quot;코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.&quot; data-og-host=&quot;programmers.co.kr&quot; data-og-source-url=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/148653&quot; data-og-url=&quot;https://programmers.co.kr/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/yWZsC/hyTV0r8le6/gkSf0IGhNVxdP12CIcXaGk/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/bFTQsZ/hyTY8hLFpI/OzCzCLeEyvtW0U7bSeqWUK/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630&quot;&gt;&lt;a href=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/148653&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/148653&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/yWZsC/hyTV0r8le6/gkSf0IGhNVxdP12CIcXaGk/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/bFTQsZ/hyTY8hLFpI/OzCzCLeEyvtW0U7bSeqWUK/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;프로그래머스&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;programmers.co.kr&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #ffffff; background-color: #0593d3;&quot;&gt;문제&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1236&quot; data-origin-height=&quot;606&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/N9AyX/btsuOijhsXm/u760bOUSuFmMdSzA63eDM1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/N9AyX/btsuOijhsXm/u760bOUSuFmMdSzA63eDM1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/N9AyX/btsuOijhsXm/u760bOUSuFmMdSzA63eDM1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FN9AyX%2FbtsuOijhsXm%2Fu760bOUSuFmMdSzA63eDM1%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;1236&quot; height=&quot;606&quot; data-origin-width=&quot;1236&quot; data-origin-height=&quot;606&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;background-color: #0593d3; color: #ffffff;&quot;&gt;난이도&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Level 2&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;background-color: #0593d3; color: #ffffff;&quot;&gt;Sol&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;입력받은 층수 storey의 가장 작은 자리수부터 차례대로 처리한다&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;현재 자리수가 0, 1, 2, 3, 4&lt;/b&gt;라면 0이 될 때까지 -1을 반복하는 것이 횟수 측면에서 이득이다&lt;/li&gt;
&lt;li&gt;&lt;b&gt;해당 자리수가 5&lt;/b&gt;라면 다음 자릿수를 보고 판단한다&lt;br /&gt;2-1. &lt;b&gt;다음 자리수가 0, 1, 2, 3, 4&lt;/b&gt;라면 다음 자리수에서 -1 버튼을 누르는 횟수를 감소시키기 위해 해당 자리수에서 -1을 반복한다&lt;br /&gt;2-2. &lt;b&gt;다음 자리수가 5 이상&lt;/b&gt;이라면 다음 자리수에서 +1 버튼을 누르는 횟수를 감소시키기 위해 해당 자리수에서 +1을 반복하고, 다음 자리수에 1을 더해준다&lt;/li&gt;
&lt;li&gt;&lt;b&gt;해당 자리수가 6, 7, 8, 9&lt;/b&gt;라면 10이 될 때까지 +1을 반복하고, 다음 자리수에 1을 더해준다&lt;/li&gt;
&lt;/ol&gt;
&lt;pre id=&quot;code_1695133856149&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;static int solution(int storey) { // storey 층에서 0층으로 내려가는 데 필요한 마법의 돌의 최소 개수 answer
        int answer = 0;

        // 작은 자릿수부터 차례대로 정리. 매번 나머지를 계산하면 번거로움이 있으니 배열에 각 자리의 수를 저장
        // int형의 배열로 저장하기 위해 int -&amp;gt; String -&amp;gt; char[] -&amp;gt; int[]의 전환 과정을 거친다
        String s = String.valueOf(storey);
        char[] c = s.toCharArray();
        int[] input = new int[c.length];

        for(int i=0; i&amp;lt;c.length; i++){
            input[i] = c[i] - 48;
        }

        for(int i=input.length - 1; i &amp;gt;= 0; i--){
            int now = input[i];

            if(now &amp;gt;= 6){ // 해당 자릿수가 6, 7, 8, 9라면 0이 될 때까지 +1을 해주는 것이 이득
                answer += (10 - now);
                if(i-1 &amp;lt; 0){
                    answer++;
                } else {
                    input[i-1]++;
                }
            }
            else if(now &amp;lt;= 4){ // 해당 자릿수가 1, 2, 3, 4라면 0이 될 때까지 -1을 해주는 것이 이득
                answer += now;
            }
            else if(now == 5){ // 해당 자릿수가 5라면 다음 자릿수를 보고 판단
                if(i-1 &amp;lt; 0){ // 해당 자릿수가 마지막 자릿수라면
                    answer += now;
                } else{
                    if(input[i-1] &amp;lt; 5){
                        answer += now;
                    } else {
                        answer += now;
                        input[i-1]++;
                    }
                }
            }
        }

        return answer;
    }&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Algorithm/Programmers</category>
      <author>보송송희</author>
      <guid isPermaLink="true">https://hee0912.tistory.com/56</guid>
      <comments>https://hee0912.tistory.com/56#entry56comment</comments>
      <pubDate>Tue, 19 Sep 2023 23:32:02 +0900</pubDate>
    </item>
    <item>
      <title>[BOJ] 백준 11729번: 하노이 탑 이동 순서(Java)</title>
      <link>https://hee0912.tistory.com/55</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/11729&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://www.acmicpc.net/problem/11729&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1694703765153&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;11729번: 하노이 탑 이동 순서&quot; data-og-description=&quot;세 개의 장대가 있고 첫 번째 장대에는 반경이 서로 다른 n개의 원판이 쌓여 있다. 각 원판은 반경이 큰 순서대로 쌓여있다. 이제 수도승들이 다음 규칙에 따라 첫 번째 장대에서 세 번째 장대로 &quot; data-og-host=&quot;www.acmicpc.net&quot; data-og-source-url=&quot;https://www.acmicpc.net/problem/11729&quot; data-og-url=&quot;https://www.acmicpc.net/problem/11729&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/qw1TE/hyTVVJNUC0/n5F9i4qKiLBt53LhB8JWE0/img.png?width=2834&amp;amp;height=1480&amp;amp;face=0_0_2834_1480,https://scrap.kakaocdn.net/dn/bzZU2M/hyTVSzyZsy/gqJqroyTQQ5I131pyszPC0/img.png?width=3570&amp;amp;height=680&amp;amp;face=0_0_3570_680&quot;&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/11729&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.acmicpc.net/problem/11729&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/qw1TE/hyTVVJNUC0/n5F9i4qKiLBt53LhB8JWE0/img.png?width=2834&amp;amp;height=1480&amp;amp;face=0_0_2834_1480,https://scrap.kakaocdn.net/dn/bzZU2M/hyTVSzyZsy/gqJqroyTQQ5I131pyszPC0/img.png?width=3570&amp;amp;height=680&amp;amp;face=0_0_3570_680');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;11729번: 하노이 탑 이동 순서&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;세 개의 장대가 있고 첫 번째 장대에는 반경이 서로 다른 n개의 원판이 쌓여 있다. 각 원판은 반경이 큰 순서대로 쌓여있다. 이제 수도승들이 다음 규칙에 따라 첫 번째 장대에서 세 번째 장대로&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.acmicpc.net&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #ffffff; background-color: #0593d3;&quot;&gt;문제&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1144&quot; data-origin-height=&quot;433&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c4mMaz/btstX9uQZkr/E6MmjQEeGC2mwPay5DG0Sk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c4mMaz/btstX9uQZkr/E6MmjQEeGC2mwPay5DG0Sk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c4mMaz/btstX9uQZkr/E6MmjQEeGC2mwPay5DG0Sk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc4mMaz%2FbtstX9uQZkr%2FE6MmjQEeGC2mwPay5DG0Sk%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;1144&quot; height=&quot;433&quot; data-origin-width=&quot;1144&quot; data-origin-height=&quot;433&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #ffffff; background-color: #0593d3;&quot;&gt;입력&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot;&gt;첫째 줄에 첫 번째 장대에 쌓인 원판의 개수 N (1 &amp;le; N &amp;le; 20)이 주어진다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #ffffff; background-color: #0593d3;&quot;&gt;출력&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;첫째 줄에 옮긴 횟수 K를 출력한다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;두 번째 줄부터 수행 과정을 출력한다. 두 번째 줄부터 K개의 줄에 걸쳐 두 정수 A B를 빈칸을 사이에 두고 출력하는데, 이는 A번째 탑의 가장 위에 있는 원판을 B번째 탑의 가장 위로 옮긴다는 뜻이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #ffffff; background-color: #0593d3;&quot;&gt;난이도&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;골드 5&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #ffffff; background-color: #0593d3;&quot;&gt;Sol&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #1f2328; text-align: start;&quot;&gt;첫 번째 탑에 쌓여 있는 n번째 원판을 세 번째 탑으로 옮기려면 n번째 원판 아래의 n-1개의 원판을 두 번째 탑으로 옮겨야 한다. n-1개의 원판을 임시로 사용할 탑 temp와 목적지 end를 왔다갔다 하면서 temp로 옮긴 뒤 n번째 원판을 옮기는 과정을 재귀함수를 통해 반복한다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1694704006512&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public class B11729_하노이탑이동순서 {
    static int K;
    static StringBuilder sb = new StringBuilder();

    public static void main(String[] args) throws IOException {
        BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
        int N = Integer.parseInt(bf.readLine());

        hanoi(N, 1, 3, 2);

        System.out.println(K);
        System.out.println(sb);
    }

    static void hanoi(int n, int start, int end, int temp){
        if(n==1){
            K++;
            sb.append(start + &quot; &quot; + end + &quot;\n&quot;);
            return;
        }

        hanoi(n-1, start, temp, end);
        sb.append(start + &quot; &quot; + end + &quot;\n&quot;);
        K++;
        hanoi(n-1, temp, end, start);
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Algorithm/BOJ</category>
      <author>보송송희</author>
      <guid isPermaLink="true">https://hee0912.tistory.com/55</guid>
      <comments>https://hee0912.tistory.com/55#entry55comment</comments>
      <pubDate>Fri, 15 Sep 2023 00:07:05 +0900</pubDate>
    </item>
    <item>
      <title>[BOJ] 백준 3184번: 양(Java)</title>
      <link>https://hee0912.tistory.com/54</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/3184&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://www.acmicpc.net/problem/3184&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1694528676026&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;3184번: 양&quot; data-og-description=&quot;첫 줄에는 두 정수 R과 C가 주어지며(3 &amp;le; R, C &amp;le; 250), 각 수는 마당의 행과 열의 수를 의미한다. 다음 R개의 줄은 C개의 글자를 가진다. 이들은 마당의 구조(울타리, 양, 늑대의 위치)를 의미한다.&quot; data-og-host=&quot;www.acmicpc.net&quot; data-og-source-url=&quot;https://www.acmicpc.net/problem/3184&quot; data-og-url=&quot;https://www.acmicpc.net/problem/3184&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bK9GAN/hyTV1ivbRv/fKDTK2gW7SjENqrjXbcfE1/img.png?width=2834&amp;amp;height=1480&amp;amp;face=0_0_2834_1480&quot;&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/3184&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.acmicpc.net/problem/3184&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bK9GAN/hyTV1ivbRv/fKDTK2gW7SjENqrjXbcfE1/img.png?width=2834&amp;amp;height=1480&amp;amp;face=0_0_2834_1480');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;3184번: 양&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;첫 줄에는 두 정수 R과 C가 주어지며(3 &amp;le; R, C &amp;le; 250), 각 수는 마당의 행과 열의 수를 의미한다. 다음 R개의 줄은 C개의 글자를 가진다. 이들은 마당의 구조(울타리, 양, 늑대의 위치)를 의미한다.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.acmicpc.net&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #ffffff; background-color: #0593d3;&quot;&gt;문제&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1153&quot; data-origin-height=&quot;294&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/BQcr7/btstS9NDm6N/nAQAlKkZuWlNF3zKVA7gu0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/BQcr7/btstS9NDm6N/nAQAlKkZuWlNF3zKVA7gu0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/BQcr7/btstS9NDm6N/nAQAlKkZuWlNF3zKVA7gu0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FBQcr7%2FbtstS9NDm6N%2FnAQAlKkZuWlNF3zKVA7gu0%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;1153&quot; height=&quot;294&quot; data-origin-width=&quot;1153&quot; data-origin-height=&quot;294&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #ffffff; background-color: #0593d3;&quot;&gt;입력&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;첫 줄에는 두 정수 R과 C가 주어지며(3 &amp;le; R, C &amp;le; 250), 각 수는 마당의 행과 열의 수를 의미한다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;다음 R개의 줄은 C개의 글자를 가진다. 이들은 마당의 구조(울타리, 양, 늑대의 위치)를 의미한다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #ffffff; background-color: #0593d3;&quot;&gt;출력&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot;&gt;하나의 줄에 아침까지 살아있는 양과 늑대의 수를 의미하는 두 정수를 출력한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #ffffff; background-color: #0593d3;&quot;&gt;난이도&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실버 1&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #ffffff; background-color: #0593d3;&quot;&gt;Sol&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;DFS 함수를 통해 각 영역을 탐색하면서 양과 늑대의 수를 센 뒤 조건에 맞춰 살아남은 동물의 수를 카운트&lt;/p&gt;
&lt;pre id=&quot;code_1694528729293&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public class BOJ3184 {
    static int R, C;
    static char[][] field;
    static boolean[][] isVisited;
    static int[] dx = {1, -1, 0, 0};
    static int[] dy = {0, 0, 1, -1};
    static int s=0, w=0;

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

        R = Integer.parseInt(token.nextToken());
        C = Integer.parseInt(token.nextToken());

        field = new char[R][C];
        isVisited = new boolean[R][C];

        for(int i=0; i&amp;lt;R; i++){
            field[i] = bf.readLine().toCharArray();
        }
        // input

        int sheeps=0, wolves=0;

        for(int i=0; i&amp;lt;R; i++){
            for(int j=0; j&amp;lt;C; j++){
                s = 0;
                w = 0;
                if(!isVisited[i][j] &amp;amp;&amp;amp; field[i][j] != '#') search(i, j);

                if(s&amp;gt;w) sheeps += s;
                else wolves += w;
            }
        }
        // operation

        System.out.println(sheeps + &quot; &quot; + wolves);
        // output
    }

    static void search(int r, int c){
        isVisited[r][c] = true;

        if(field[r][c]=='v') w++;
        if(field[r][c]=='o') s++;

        for(int i=0; i&amp;lt;4; i++){
            int nr = r + dx[i];
            int nc = c + dy[i];

            if(nr&amp;lt;0 || nr&amp;gt;=R || nc&amp;lt;0 || nc&amp;gt;=C || isVisited[nr][nc] || field[nr][nc]=='#') continue;
            // 다음 위치가 범위 밖에 있거나, 이미 방문한 지점이거나, 다음 위치에 울타리가 존재한다면 탐색하지 않는다

            search(nr, nc); // 다음 위치 탐색
        }
    }
}&lt;/code&gt;&lt;/pre&gt;</description>
      <category>Algorithm/BOJ</category>
      <author>보송송희</author>
      <guid isPermaLink="true">https://hee0912.tistory.com/54</guid>
      <comments>https://hee0912.tistory.com/54#entry54comment</comments>
      <pubDate>Tue, 12 Sep 2023 23:27:47 +0900</pubDate>
    </item>
    <item>
      <title>[BOJ] 백준 15900번: 나무 탈출(Java)</title>
      <link>https://hee0912.tistory.com/53</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/15900&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://www.acmicpc.net/problem/15900&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1694098131278&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;15900번: 나무 탈출&quot; data-og-description=&quot;평소에 사이가 좋지 않던 성원이와 형석이가 드디어 제대로 한 판 붙으려고 한다. 성원이와 형석이 둘과 모두 똑같이 친한 인섭이가 대결 종목을 정해 가져왔다. 바로 '나무 탈출' 이라는 보드게&quot; data-og-host=&quot;www.acmicpc.net&quot; data-og-source-url=&quot;https://www.acmicpc.net/problem/15900&quot; data-og-url=&quot;https://www.acmicpc.net/problem/15900&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bNHap0/hyTPv6QrB4/o1OKOtBLCZKWgcTqZUVB41/img.png?width=2834&amp;amp;height=1480&amp;amp;face=0_0_2834_1480&quot;&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/15900&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.acmicpc.net/problem/15900&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bNHap0/hyTPv6QrB4/o1OKOtBLCZKWgcTqZUVB41/img.png?width=2834&amp;amp;height=1480&amp;amp;face=0_0_2834_1480');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;15900번: 나무 탈출&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;평소에 사이가 좋지 않던 성원이와 형석이가 드디어 제대로 한 판 붙으려고 한다. 성원이와 형석이 둘과 모두 똑같이 친한 인섭이가 대결 종목을 정해 가져왔다. 바로 '나무 탈출' 이라는 보드게&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.acmicpc.net&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #ffffff; background-color: #0593d3;&quot;&gt;문제&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1158&quot; data-origin-height=&quot;373&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b18Tdf/btstlKhTeit/49zgPN2LAk5bsKZJjkMz3k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b18Tdf/btstlKhTeit/49zgPN2LAk5bsKZJjkMz3k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b18Tdf/btstlKhTeit/49zgPN2LAk5bsKZJjkMz3k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb18Tdf%2FbtstlKhTeit%2F49zgPN2LAk5bsKZJjkMz3k%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;1158&quot; height=&quot;373&quot; data-origin-width=&quot;1158&quot; data-origin-height=&quot;373&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #ffffff; background-color: #0593d3;&quot;&gt;입력&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;첫째 줄에 트리의 정점 개수 N(2 &amp;le; N &amp;le; 500,000)이 주어진다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;둘째 줄부터 N-1줄에 걸쳐 트리의 간선 정보가 주어진다. 줄마다 두개의 자연수 a, b(1 &amp;le; a, b &amp;le; N, a &amp;ne; b)가 주어지는데, 이는 a와 b 사이에 간선이 존재한다는 뜻이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #ffffff; background-color: #0593d3;&quot;&gt;출력&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot;&gt;성원이가 최선을 다했을 때 이 게임을 이길 수 있으면&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;Yes&lt;span style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot;&gt;, 아니면&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;No&lt;span style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot;&gt;를 출력한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #ffffff; background-color: #0593d3;&quot;&gt;난이도&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실버 1&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #ffffff; background-color: #0593d3;&quot;&gt;Sol&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #1f2328; text-align: start;&quot;&gt;DFS 메소드를 통해 루트 노드부터 모든 리프 노드들을 방문하면서&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;각 노드들의 depth를 변수 sum에 합산&lt;/b&gt;&lt;span style=&quot;background-color: #ffffff; color: #1f2328; text-align: start;&quot;&gt;한다. 모든 리프 노드의 depth의 합이&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;홀수&lt;/b&gt;&lt;span style=&quot;background-color: #ffffff; color: #1f2328; text-align: start;&quot;&gt;이면 성원이가 이길 수 있다고 판단해&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;Yes&lt;/b&gt;&lt;span style=&quot;background-color: #ffffff; color: #1f2328; text-align: start;&quot;&gt;를 출력하고, depth의 합이&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;짝수&lt;/b&gt;&lt;span style=&quot;background-color: #ffffff; color: #1f2328; text-align: start;&quot;&gt;이면 이길 수 없다고 판단해&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;No&lt;/b&gt;&lt;span style=&quot;background-color: #ffffff; color: #1f2328; text-align: start;&quot;&gt;를 출력한다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1694098146889&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public class BOJ15900 {
    static List&amp;lt;ArrayList&amp;lt;Integer&amp;gt;&amp;gt; tree = new ArrayList&amp;lt;&amp;gt;();
    static boolean[] isVisited; // 각 노드의 방문 여부 체크하기 위한 배열
    static int sum = 0; // 모든 리프 노드의 depth의 합

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

        int N = Integer.parseInt(token.nextToken()); // 트리의 정점의 개수
        isVisited = new boolean[N+1];

        for(int i=0; i&amp;lt;=N; i++)
            tree.add(new ArrayList&amp;lt;&amp;gt;());


        for(int i=0; i&amp;lt;N-1; i++){
            token = new StringTokenizer(bf.readLine());
            int a = Integer.parseInt(token.nextToken());
            int b = Integer.parseInt(token.nextToken());
            tree.get(a).add(b);
            tree.get(b).add(a);
            // 방향이 없는 그래프이기 때문에 양쪽에 추가
        }
        // input

        dfs(1, 0);
        // operation

        if(sum%2!=0) System.out.println(&quot;Yes&quot;); // 합이 홀수일 경우 승리
        else System.out.println(&quot;No&quot;); // 합이 짝수일 경우 패배
        // output
    }

    static void dfs(int vertex, int depth){
        isVisited[vertex] = true; // 해당 정점 방문 처리
        for(int next: tree.get(vertex)){ // 해당 정점에서 방문할 수 있는 모든 정점들에 대해서
            if(!isVisited[next]){ // 다음 정점에 방문하지 않았다면
                dfs(next, depth+1); // depth 카운트를 1 더한 값을 가지고 다음 노드로 이동
            }
        }

        if(tree.get(vertex).size()==1 &amp;amp;&amp;amp; vertex != 1){ // 해당 노드가 부모 노드 하나만을 가지고 있는 자식 노드일 경우 재귀를 종료.
            // 이때 해당 노드가 자식 노드를 하나만 가진 루트 노드일 경우를 꼭 제외해야 한다
            sum += depth; // depth 합산
        }
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #1f2328; text-align: start;&quot;&gt; &lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #1f2328; text-align: start;&quot;&gt;정점이 1번부터 시작하기 때문에 ArrayList&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;tree&lt;/b&gt;&lt;span style=&quot;background-color: #ffffff; color: #1f2328; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;내에 저장하는 ArrayList의 개수와 boolean 배열의 크기를&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;N+1&lt;/b&gt;&lt;span style=&quot;background-color: #ffffff; color: #1f2328; text-align: start;&quot;&gt;로 지정해야 한다.&lt;/span&gt;&lt;/p&gt;</description>
      <category>Algorithm/BOJ</category>
      <author>보송송희</author>
      <guid isPermaLink="true">https://hee0912.tistory.com/53</guid>
      <comments>https://hee0912.tistory.com/53#entry53comment</comments>
      <pubDate>Thu, 7 Sep 2023 23:50:40 +0900</pubDate>
    </item>
    <item>
      <title>[PRO] 프로그래머스 155651번: 호텔 대실(Java)</title>
      <link>https://hee0912.tistory.com/52</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/155651&quot;&gt;https://school.programmers.co.kr/learn/courses/30/lessons/155651&lt;/a&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure id=&quot;og_1693925989756&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;프로그래머스&quot; data-og-description=&quot;코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.&quot; data-og-host=&quot;programmers.co.kr&quot; data-og-source-url=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/155651&quot; data-og-url=&quot;https://programmers.co.kr/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/mNyqR/hyTPxbXEVi/M5Duvf2e93UMKfs51lj6Ak/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/cdV8Xe/hyTPttUhDw/KmHbirkmyBIl1dRk3E7Nu1/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630&quot;&gt;&lt;a href=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/155651&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/155651&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/mNyqR/hyTPxbXEVi/M5Duvf2e93UMKfs51lj6Ak/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/cdV8Xe/hyTPttUhDw/KmHbirkmyBIl1dRk3E7Nu1/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;프로그래머스&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;programmers.co.kr&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #ffffff; background-color: #0593d3;&quot;&gt;문제&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;호텔을 운영 중인 코니는 최소한의 객실만을 사용하여 예약 손님들을 받으려고 합니다. 한 번 사용한 객실은 퇴실 시간을 기준으로 10분간 청소를 하고 다음 손님들이 사용할 수 있습니다.&lt;br /&gt;예약 시각이 문자열 형태로 담긴 2차원 배열&amp;nbsp;book_time이 매개변수로 주어질 때, 코니에게 필요한 최소 객실의 수를 return 하는 solution 함수를 완성해주세요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #ffffff; background-color: #0593d3;&quot;&gt;제한 사항&lt;/span&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;text-align: left;&quot;&gt;1 &amp;le;&amp;nbsp;&lt;/span&gt;book_time&lt;span style=&quot;text-align: left;&quot;&gt;의 길이 &amp;le; 1,000&lt;/span&gt;&lt;/span&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;text-align: left;&quot;&gt;book_time[i]는 [&quot;HH:MM&quot;, &quot;HH:MM&quot;]의 형태로 이루어진 배열입니다.&lt;/span&gt;&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;text-align: left;&quot;&gt;[대실 시작 시각, 대실 종료 시각] 형태입니다.&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;text-align: left;&quot;&gt;시각은 HH:MM 형태로 24시간 표기법을 따르며, &quot;00:00&quot;부터 &quot;23:59&quot;까지로 주어집니다.&lt;/span&gt;&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;text-align: left;&quot;&gt;예약 시각이 자정을 넘어가는 경우는 없습니다.&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;text-align: left;&quot;&gt;시작 시각은 항상 종료 시각보다 빠릅니다.&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #ffffff; background-color: #0593d3;&quot;&gt;입력&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;719&quot; data-origin-height=&quot;166&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/diWlLU/btstePv1IkC/m1oa1D2mJeGDlWnm7ycWf0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/diWlLU/btstePv1IkC/m1oa1D2mJeGDlWnm7ycWf0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/diWlLU/btstePv1IkC/m1oa1D2mJeGDlWnm7ycWf0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdiWlLU%2FbtstePv1IkC%2Fm1oa1D2mJeGDlWnm7ycWf0%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;719&quot; height=&quot;166&quot; data-origin-width=&quot;719&quot; data-origin-height=&quot;166&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #ffffff; background-color: #0593d3;&quot;&gt;출력&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;729&quot; data-origin-height=&quot;376&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cqpuAN/btss71kgpjo/SeApUYhgHem0UIEdkj3Dv1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cqpuAN/btss71kgpjo/SeApUYhgHem0UIEdkj3Dv1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cqpuAN/btss71kgpjo/SeApUYhgHem0UIEdkj3Dv1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcqpuAN%2Fbtss71kgpjo%2FSeApUYhgHem0UIEdkj3Dv1%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;729&quot; height=&quot;376&quot; data-origin-width=&quot;729&quot; data-origin-height=&quot;376&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #ffffff; background-color: #0593d3;&quot;&gt;난이도&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Level 2&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #1f2328; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #ffffff; background-color: #0593d3;&quot;&gt;Sol&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 입력받은 String 배열을 int 배열로 변환한다. 이때 퇴실 시각 + 청소 시간 10분을 반영해 값을 조정한다&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #1f2328; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;2. 람다식을 사용해 int 배열을 오름차순으로 정렬한다. 대실 시작 시각을 우선적으로 비교하고, 같다면 대실 종료 시각을 비교한다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #1f2328; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;3. 우선순위 큐를 사용해 각 예약을 객실에 배정한다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #1f2328; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;우선순위 큐 내의 데이터 하나를 객실 하나라고 가정하고, 각 객실의 마지막 퇴실 시각을 저장한다.&lt;/li&gt;
&lt;li&gt;int 배열에 저장된 데이터들을 정렬된 순서대로 객실의 마지막 퇴실 시각과 비교한다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;같은 객실에 예약할 수 있다면, 즉 만약 마지막 퇴실 시각과 새 데이터의 시작 시각이 겹치지 않으면 큐에서 기존 데이터를 제거하고 새 데이터의 퇴실 시각을 추가한다.&lt;/li&gt;
&lt;li&gt;같은 객실에 예약할 수 없다면, 즉 만약 마지막 퇴실 시각과 새 데이터의 시작 시각이 겹치면 기존 데이터 제거 없이 큐에 새 데이터의 퇴실 시각을 추가한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;background-color: #ffffff; color: #1f2328; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;4. 모든 객실의 배정을 마치고, 객실의 개수를 최종적으로 반환한다. 여기서 객실의 개수는 우선순위 큐 내에 들어 있는 데이터의 개수와 같다.&lt;/p&gt;
&lt;pre id=&quot;code_1693926022114&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class Solution {
    public int solution(String[][] book_time) {
        // 1. 입력받은 배열을 int 배열로 변환
        int[][] times = new int[book_time.length][2];
        for (int i = 0; i &amp;lt; book_time.length; i++) {
            times[i][0] = Integer.parseInt(book_time[i][0].replace(&quot;:&quot;, &quot;&quot;));
            int e = Integer.parseInt(book_time[i][1].replace(&quot;:&quot;, &quot;&quot;)) + 10; // 퇴실 후 청소 시간 반영

            if (e % 100 &amp;gt;= 60) { // 청소 시간 10분을 더했을 때 60분 이상이라면
                e = e - 60 + 100; // 60분 빼고 한 시간 추가
            }

            times[i][1] = e;
        }

        // 2. 오름차순으로 정렬
        Arrays.sort(times, (a, b) -&amp;gt; {
            if (a[0] &amp;gt; b[0]) return 1;
            else if (a[0] &amp;lt; b[0]) return -1; // 대실 시작 시각을 우선적으로 비교
            else {
                if (a[1] &amp;gt;= b[1]) return 1; // 시작 시각이 같다면 종료 시각을 비교
                else return -1;
            }
        });

        // 3. 각 예약을 객실에 배정
        PriorityQueue&amp;lt;Integer&amp;gt; rooms = new PriorityQueue&amp;lt;&amp;gt;();
        // 요소를 추가하면 자동으로 오름차순 정렬이 되는 priorityQueue를 사용
        // int[]를 추가하려고 했으나 굳이 시작 시각과 종료 시각을 모두 가지고 있을 필요가 없다고 생각해 종료 시각만 저장
        // queue에 들어 있는 각 요소들이 객실이라고 생각

        for (int[] book : times) {
            if (rooms.isEmpty()) { // 첫 예약의 퇴실 시각을 큐에 넣음
                rooms.add(book[1]);
            } else { // 두 번째 예약부터
                int end = rooms.peek(); // 예약된 객실 중 가장 늦은 퇴실 시각을 가져온다

                if (end &amp;lt;= book[0]) { // 같은 객실에 예약할 수 있다면
                    rooms.poll(); // 기존 데이터를 제거하고 (같은 객실로 취급하기 위해)
                    rooms.add(book[1]); // 새 데이터의 종료 시각을 추가한다.
                } else { // 같은 객실에 예약할 수 없다면
                    rooms.add(book[1]); // 기존 데이터를 제거하지 않고 그 위에 새 데이터의 종료 시각을 추가
                }
            }
        }

        return rooms.size();
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt; &lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #1f2328; text-align: start;&quot;&gt;람다식 내에서 조건문을 사용할 때 꼭 모든 경우에 대한 분기점을 만들어줘야 한다. if, else if만 사용하고&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;else를 써주지 않아 에러&lt;/b&gt;&lt;span style=&quot;background-color: #ffffff; color: #1f2328; text-align: start;&quot;&gt;가 났었다.&lt;/span&gt;&lt;/p&gt;</description>
      <category>Algorithm/Programmers</category>
      <author>보송송희</author>
      <guid isPermaLink="true">https://hee0912.tistory.com/52</guid>
      <comments>https://hee0912.tistory.com/52#entry52comment</comments>
      <pubDate>Wed, 6 Sep 2023 00:14:10 +0900</pubDate>
    </item>
    <item>
      <title>[BOJ] 백준 1992번: 쿼드 트리(Java)</title>
      <link>https://hee0912.tistory.com/51</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/1992&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://www.acmicpc.net/problem/1992&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1693491795610&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;1992번: 쿼드트리&quot; data-og-description=&quot;첫째 줄에는 영상의 크기를 나타내는 숫자 N 이 주어진다. N 은 언제나 2의 제곱수로 주어지며, 1 &amp;le; N &amp;le; 64의 범위를 가진다. 두 번째 줄부터는 길이 N의 문자열이 N개 들어온다. 각 문자열은 0 또&quot; data-og-host=&quot;www.acmicpc.net&quot; data-og-source-url=&quot;https://www.acmicpc.net/problem/1992&quot; data-og-url=&quot;https://www.acmicpc.net/problem/1992&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/reCUv/hyTPxIrUwF/wi7CyX9sk8c14jJ3ZVYL10/img.png?width=2834&amp;amp;height=1480&amp;amp;face=0_0_2834_1480&quot;&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/1992&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.acmicpc.net/problem/1992&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/reCUv/hyTPxIrUwF/wi7CyX9sk8c14jJ3ZVYL10/img.png?width=2834&amp;amp;height=1480&amp;amp;face=0_0_2834_1480');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;1992번: 쿼드트리&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;첫째 줄에는 영상의 크기를 나타내는 숫자 N 이 주어진다. N 은 언제나 2의 제곱수로 주어지며, 1 &amp;le; N &amp;le; 64의 범위를 가진다. 두 번째 줄부터는 길이 N의 문자열이 N개 들어온다. 각 문자열은 0 또&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.acmicpc.net&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #ffffff; background-color: #0593d3;&quot;&gt;문제&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1141&quot; data-origin-height=&quot;408&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/caADuz/btssHyow5Zx/XG7mhXjWLkY8zDPk9NEbk0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/caADuz/btssHyow5Zx/XG7mhXjWLkY8zDPk9NEbk0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/caADuz/btssHyow5Zx/XG7mhXjWLkY8zDPk9NEbk0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcaADuz%2FbtssHyow5Zx%2FXG7mhXjWLkY8zDPk9NEbk0%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;1141&quot; height=&quot;408&quot; data-origin-width=&quot;1141&quot; data-origin-height=&quot;408&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #ffffff; background-color: #0593d3;&quot;&gt;입력&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot;&gt;첫째 줄에는 영상의 크기를 나타내는 숫자 N 이 주어진다. N 은 언제나 2의 제곱수로 주어지며, 1 &amp;le; N &amp;le; 64의 범위를 가진다. 두 번째 줄부터는 길이 N의 문자열이 N개 들어온다. 각 문자열은 0 또는 1의 숫자로 이루어져 있으며, 영상의 각 점들을 나타낸다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #ffffff; background-color: #0593d3;&quot;&gt;출력&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot;&gt;영상을 압축한 결과를 출력한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #ffffff; background-color: #0593d3;&quot;&gt;난이도&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실버 1&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #ffffff; background-color: #0593d3;&quot;&gt;Sol&lt;/span&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;첫&amp;nbsp;좌표에&amp;nbsp;위치한&amp;nbsp;값을&amp;nbsp;기억해놓은&amp;nbsp;뒤&amp;nbsp;배열의&amp;nbsp;끝까지&amp;nbsp;돌면서&amp;nbsp;첫&amp;nbsp;좌표의&amp;nbsp;값과&amp;nbsp;해당&amp;nbsp;좌표에&amp;nbsp;위치한&amp;nbsp;값을&amp;nbsp;비교한다. &lt;br /&gt;범위 내에 첫 좌표의 값과 다른 값이 없다면 해당 값을 반환한다&lt;/li&gt;
&lt;li&gt;범위 내에 첫 좌표의 값과 다른 값이 있다면 해당 범위를 4등분한 뒤 각 범위마다 재귀 함수를 호출하고, 네 번의 함수에서 반환된 값을 괄호로 감싸 반환한다&lt;/li&gt;
&lt;li&gt;범위 4등분하고 값 반환할 때 주의: 왼쪽 위-오른쪽 위-왼쪽 아래-오른쪽 아래 순서로 압축된다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1693494297291&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public class BOJ1992 {
    static int N; // N x N 크기의 영상이 주어짐. N은 언제나 2의 제곱수. 1 &amp;lt;= N &amp;lt;= 64
    static String[] video;

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

        N = Integer.parseInt(bf.readLine());
        video = new String[N];

        for(int i=0; i&amp;lt;N; i++)
            video[i] = bf.readLine();
        // input

        String ans = compression(0, 0, N); // 재귀 함수 호출
        // operation

        System.out.println(ans);
        // output
    }


    /**
     * @param x : 시작 좌표
     * @param y : 끝 좌표
     * @param length : 탐색 길이
     * 첫 좌표에 위치하는 문자를 확인하고, 처음부터 끝까지 돌면서 만약 탐색 범위 내의 모든 문자가 같은 문자라면 해당 문자를 반환한다
     * 만약 범위 내에 첫 좌표에 위치하는 문자와 다른 문자가 존재하면 해당 범위를 4등분해서 각 범위마다 재귀 함수를 호출해 이 과정을 반복한다
     * */
    static String compression(int x, int y, int length){ // 시작 좌표, 끝 좌표, 길이
        char ch = video[x].charAt(y);

        for(int i=x; i&amp;lt;x + length; i++) {
            for(int j=y; j&amp;lt;y+length; j++) {
                if(ch != video[i].charAt(j))
                    return &quot;(&quot; + compression(x, y, length / 2) + compression(x, y + length / 2, length / 2)
                            + compression(x + length / 2, y, length / 2) + compression(x + length / 2, y + length / 2, length / 2) + &quot;)&quot;;
            } // 순서 주의
        }

        return String.valueOf(ch); // 첫 좌표의 문자와 다른 문자가 존재하지 않으면 if문에 걸리지 않고 해당 return문에 도달. 첫 좌표에 존재하는 문자를 반환한다
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt; &lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff; color: #1f2328; text-align: start;&quot;&gt;2차원 배열의 값을 조회할 때 x값이 행, y값이 열을 나타내기 때문에&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;(x, y) + (x, y+length/2) + (x+length/2, y)+ (x+length/2, y+length/2) 순서&lt;/b&gt;&lt;span style=&quot;background-color: #ffffff; color: #1f2328; text-align: start;&quot;&gt;로 값을 반환해야 한다. x와 y의 순서가 헷갈려 계속 다른 답이 출력됐다&lt;/span&gt;&lt;/p&gt;</description>
      <category>Algorithm/BOJ</category>
      <author>보송송희</author>
      <guid isPermaLink="true">https://hee0912.tistory.com/51</guid>
      <comments>https://hee0912.tistory.com/51#entry51comment</comments>
      <pubDate>Fri, 1 Sep 2023 00:13:04 +0900</pubDate>
    </item>
  </channel>
</rss>