<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>Bibidi</title>
    <link>https://bibidi0.tistory.com/</link>
    <description></description>
    <language>ko</language>
    <pubDate>Sun, 5 Apr 2026 18:47:17 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>_Bibidi</managingEditor>
    <item>
      <title>알고리즘을 위한 자바 입출력 함수 만들기</title>
      <link>https://bibidi0.tistory.com/184</link>
      <description>&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;h3 data-ke-size=&quot;size23&quot;&gt;Scanner Class&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;장점&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;nextInt, nextLong 등의 편리한 메소드를 제공하기 때문에 입력을 받기 편하다. System.out.print 메소드와 같이 사용하면 짧고 가독성도 쓸만한 코드를 금방 짤 수 있다.&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;&amp;nbsp;사용하는 건 편한데, 너무 느리다. 왜 이렇게 느린지 궁금해서 intellij를 이용해 내부 클래스를 한 번 살펴봤다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screen Shot 2023-02-13 at 6.00.19 PM.png&quot; data-origin-width=&quot;1272&quot; data-origin-height=&quot;836&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bzDvW5/btrZagjis4J/P8Db7MGihhVl7ZLvJVk8sk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bzDvW5/btrZagjis4J/P8Db7MGihhVl7ZLvJVk8sk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bzDvW5/btrZagjis4J/P8Db7MGihhVl7ZLvJVk8sk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbzDvW5%2FbtrZagjis4J%2FP8Db7MGihhVl7ZLvJVk8sk%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;600&quot; height=&quot;394&quot; data-filename=&quot;Screen Shot 2023-02-13 at 6.00.19 PM.png&quot; data-origin-width=&quot;1272&quot; data-origin-height=&quot;836&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;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;Pattern 클래스와 Matcher 클래스가 보인다. 벌써부터 단순 입력만을 위해 쓰기에는 복잡하지 않을까 하는 느낌이 온다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screen Shot 2023-02-13 at 6.01.16 PM.png&quot; data-origin-width=&quot;1464&quot; data-origin-height=&quot;872&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/IXBHQ/btrZa43YOAI/gWMg7dZWlMrQqLHK00pcIK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/IXBHQ/btrZa43YOAI/gWMg7dZWlMrQqLHK00pcIK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/IXBHQ/btrZa43YOAI/gWMg7dZWlMrQqLHK00pcIK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FIXBHQ%2FbtrZa43YOAI%2FgWMg7dZWlMrQqLHK00pcIK%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;600&quot; height=&quot;357&quot; data-filename=&quot;Screen Shot 2023-02-13 at 6.01.16 PM.png&quot; data-origin-width=&quot;1464&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;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;클래스 코드 시작 라인이 304인데, 내부에서 사용할 변수 선언이 519 라인까지이다. 변수 선언에만 200 라인을 사용하고 총 라인 수는 2600 라인이다. BufferedReader 클래스의 총 라인 수가 500 ~ 600 라인 정도 되는 것에 비하면 라인 수가 상당하다. Scanner 클래스를 사용하는 것만으로도 시간을 꽤 잡아먹었는데, 다 이유가 있었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screen Shot 2023-02-13 at 6.11.11 PM.png&quot; data-origin-width=&quot;1066&quot; data-origin-height=&quot;926&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c32DoL/btrY4niXGVt/O7w2pz59s1NPhu9oGSNh31/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c32DoL/btrY4niXGVt/O7w2pz59s1NPhu9oGSNh31/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c32DoL/btrY4niXGVt/O7w2pz59s1NPhu9oGSNh31/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc32DoL%2FbtrY4niXGVt%2FO7w2pz59s1NPhu9oGSNh31%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;600&quot; height=&quot;521&quot; data-filename=&quot;Screen Shot 2023-02-13 at 6.11.11 PM.png&quot; data-origin-width=&quot;1066&quot; data-origin-height=&quot;926&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;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;Scanner 클래스를 사용하면서 정말 많이 사용하게 되는 메소드인데, 내부 코드가 복잡하다. 내부적으로 캐쉬를 사용하는지 캐싱과 관련된 메소드도 포함되어 있고 matcher의 group 메소드도 사용하고 integer token을 처리하기 위한 메소드도 사용하고 있다. 여러 메소드를 거친 뒤에야 Integer 클래스의 parseInt 메소드를 사용해 정수를 반환한다.&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;&amp;nbsp;알고리즘 문제에서 주어지는 입력은 포맷이 일정한 형식을 잘 갖추고 있어서 토큰을 받고 타입에 따라 형변환만 적절히 잘해주면 문제가 없다. Scanner 클래스의 여러 메소드들은 알고리즘 문제 풀이에 사용하기엔 쓸모없는 기능을 너무 많이 담고 있어 무겁다.&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;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;BufferedReader, BufferedWriter, StringTokenizer 조합&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;장점&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;Scanner 클래스와는 비교할 수 없는 그 속도가 장점이다. 입출력이 조금만 많아져도 이 클래스들을 사용해야 문제를 풀 수 있다. 사실상 이것 외엔 선택지가 없다.&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;&amp;nbsp;새 라인을 입력 받을 때마다 StringTokenier에 넣어줘야 한다. 그리고 token을 변수에 할당할 때마다 알맞게 파싱해줘야 한다. 그리고 타이핑 할 때 자동완성의 덕을 그렇게 크게 못 본다. 자동완성을 기다리는 시간이나 내가 치는 시간이나 큰 차이가 없다.&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;&amp;nbsp;또, 입출력 할 때 사용하는 코드 길이도 길다. 이게 생각보다 눈을 어지럽게 한다. 코드 복잡도가 조금 올라간 건데 이게 의외로 영향을 꽤 준다. 자바 코딩 실력이 꽤 오른 지금도 문제 풀이엔 C++이 훨씬 편하다. C++ 사용할 때는 뭔가 머리에 공간이 조금 더 남는 느낌이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screen Shot 2023-02-13 at 7.01.55 PM.png&quot; data-origin-width=&quot;1284&quot; data-origin-height=&quot;922&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bR3T0g/btrY1njmd5G/GJG02oo65MoYIP8gPdG2DK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bR3T0g/btrY1njmd5G/GJG02oo65MoYIP8gPdG2DK/img.png&quot; data-alt=&quot;Java code&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bR3T0g/btrY1njmd5G/GJG02oo65MoYIP8gPdG2DK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbR3T0g%2FbtrY1njmd5G%2FGJG02oo65MoYIP8gPdG2DK%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;600&quot; height=&quot;431&quot; data-filename=&quot;Screen Shot 2023-02-13 at 7.01.55 PM.png&quot; data-origin-width=&quot;1284&quot; data-origin-height=&quot;922&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Java code&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screen Shot 2023-02-13 at 7.15.44 PM.png&quot; data-origin-width=&quot;710&quot; data-origin-height=&quot;724&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/GcG9w/btrZcljIVkc/6g2URmqTOxcWlkScrRkv2K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/GcG9w/btrZcljIVkc/6g2URmqTOxcWlkScrRkv2K/img.png&quot; data-alt=&quot;C++ code&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/GcG9w/btrZcljIVkc/6g2URmqTOxcWlkScrRkv2K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FGcG9w%2FbtrZcljIVkc%2F6g2URmqTOxcWlkScrRkv2K%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;600&quot; height=&quot;612&quot; data-filename=&quot;Screen Shot 2023-02-13 at 7.15.44 PM.png&quot; data-origin-width=&quot;710&quot; data-origin-height=&quot;724&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;C++ code&lt;/figcaption&gt;
&lt;/figure&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;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;그래서 만드는 입출력 함수&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;어떻게 만들까?&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;처음엔 여러 가지로 많이 생각했는데, 적당히 빠르게 구현할 수 있도록 타협했다. 코드가 복잡하면 나중에 다른 환경에서 알고리즘 문제를 풀 때 바로 구현해서 사용하기 힘들다. 메소드는 Scanner를 참조하고 내부 구현만 BufferedReader, BufferedWriter, StringTokenizer로 적당히 구현하면 될 것 같다. 만들어 놓은 뒤에 Live Templates에 등록하면 코드도 금방 불러와서 사용할 수 있다.&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;pre id=&quot;code_1676297699937&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;static class FastReader {
    private final BufferedReader br;
    private StringTokenizer st;

    public FastReader() {
        br = new BufferedReader(new InputStreamReader(System.in));
    }

    String next() {
        if (st != null &amp;amp;&amp;amp; st.hasMoreTokens()) {
            return st.nextToken();
        }

        try {
            st = new StringTokenizer(br.readLine());
        } catch (IOException e) {
            e.printStackTrace();
        }
        return st.nextToken();
    }

    String nextLine() {
        if (st != null &amp;amp;&amp;amp; st.hasMoreTokens()) {
            return st.nextToken(&quot;\n&quot;);
        }

        String str = &quot;&quot;;
        try {
            str = br.readLine();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return str;
    }

    int nextInt() {
        return Integer.parseInt(next());
    }

    long nextLong() {
        return Long.parseLong(next());
    }

    double nextDouble() {
        return Double.parseDouble(next());
    }
}

static class FastWriter {
    private final BufferedWriter bw;

    public FastWriter() {
        bw = new BufferedWriter(new OutputStreamWriter(System.out));
    }

    public void print(Object object) {
        try {
            bw.append(object.toString());
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public void println(Object object) {
        try {
            bw.append(object.toString()).append(&quot;\n&quot;);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public void close() {
        try {
            bw.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}&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;이전에는 main 함수 내에서 BufferedReader, Writer를 사용해서 Throw IOException을 main 함수에 달아줘야 했다. 이게 거슬려서 클래스 메소드 내에서 try-catch로 exception을 다 처리하도록 했다.&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;&amp;nbsp;항상 쓰던 메소드를 클래스로 래핑한 느낌이라 따로 빡세게 테스트는 안 하고 atcoder 문제 하나 풀어서 테스트했다. 잘 작동한다. 풀이 코드도 이전보다 훨씬 깔끔해져서 사용하기 편하다. 입력을 처리하는 부분에 힘 쓰는 게 귀찮았는데, 그게 시원하게 해결됐다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div&gt;
&lt;pre class=&quot;java&quot; data-ke-language=&quot;java&quot;&gt;&lt;code&gt;public class ABC289_B {
    static class FastReader { ... }
    static class FastWriter { ... }

    public static void main(String[] args) {
        FastReader in = new FastReader();
        FastWriter out = new FastWriter();

        int n = in.nextInt();
        int m = in.nextInt();

        int[] arr = new int[m];
        for (int i = 0; i &amp;lt; m; i++) {
            arr[i] = in.nextInt();
        }

        boolean[] re = new boolean[n + 1];
        for (int x : arr) {
            re[x] = true;
        }

        for (int i = 1, j = 1; i &amp;lt;= n; i = ++j) {
            while (re[j]) j++;
            for (int k = j; k &amp;gt;= i; k--) {
                out.print(k + &quot; &quot;);
            }
        }

        out.close();
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Live Templates&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;FastReader, FastWriter 클래스와 main 함수 내에 세팅까지 다 복사해서 fiom 키워드로 등록했다. 그리고 클래스 내에서 사용되는 라이브러리도 ifiom으로 등록했다. 미리 import 안 하면 FastReader와 FastWriter 구현하는 데 필요한 것들을 하나하나 import 하도록 intellij가 추천하는데, 이게 불편하다. 처음부터 import를 다 하면 불편함을 피할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screen Shot 2023-02-13 at 11.39.30 PM.png&quot; data-origin-width=&quot;864&quot; data-origin-height=&quot;796&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ldWli/btrZc7FHSQS/1eiM54VsrxKF4kdyS7MQEK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ldWli/btrZc7FHSQS/1eiM54VsrxKF4kdyS7MQEK/img.png&quot; data-alt=&quot;기본 세팅&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ldWli/btrZc7FHSQS/1eiM54VsrxKF4kdyS7MQEK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FldWli%2FbtrZc7FHSQS%2F1eiM54VsrxKF4kdyS7MQEK%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;600&quot; height=&quot;553&quot; data-filename=&quot;Screen Shot 2023-02-13 at 11.39.30 PM.png&quot; data-origin-width=&quot;864&quot; data-origin-height=&quot;796&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;기본 세팅&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>컴퓨터공학/대회 알고리즘</category>
      <author>_Bibidi</author>
      <guid isPermaLink="true">https://bibidi0.tistory.com/184</guid>
      <comments>https://bibidi0.tistory.com/184#entry184comment</comments>
      <pubDate>Mon, 13 Feb 2023 23:44:29 +0900</pubDate>
    </item>
    <item>
      <title>알고리즘을 위한 자바 프로젝트 설정하기</title>
      <link>https://bibidi0.tistory.com/268</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;알고리즘 문제 풀이 파일을 관리하고 싶은데..&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;알고리즘 문제를 풀고 그냥 소스코드를 날리는 것이 아니라 코드를 문제별로 잘 정리한 뒤에 깃허브에 저장해서 사용하고 싶다. 문제는 intellij에 아무런 설정을 안 하면 아래와 같이 자바 파일을 만들 때 굉장히 번거롭다. 파일을 만들 때 하나하나 .java 확장자를 붙여줘야 되고 만든 파일 내에 같은 이름의 클래스가 자동 생성되는 것이 아니라 빈 파일만 덩그러니 나온다. 문제 하나 풀 때마다 같은 작업을 계속 반복해서 해야 하는데, 이게 너무너무 귀찮다.&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;&amp;nbsp;또 다른 문제는 컴파일과 실행이다. 매번 터미널을 이용해 자바 파일을 컴파일한 뒤 클래스 파일을 실행해야 된다. 이전 문제와는 비교도 되지 않을 정도로 귀찮다. 문제 잘못 풀면 매번 컴파일하고 실행해야 되는데, 이게 정말 지옥 같다. 거기에 같은 폴더 내에 class 파일이 남아서 하나하나 지워주는 것도 만만치 않은 공수가 들어간다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screen Shot 2023-02-13 at 12.12.16 AM.png&quot; data-origin-width=&quot;1264&quot; data-origin-height=&quot;1248&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dtYbd4/btrYTOnvl8K/ZUSlsf2haDLdbF5dTNdHbk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dtYbd4/btrYTOnvl8K/ZUSlsf2haDLdbF5dTNdHbk/img.png&quot; data-alt=&quot;설정 없이 자바 파일 만들 때&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dtYbd4/btrYTOnvl8K/ZUSlsf2haDLdbF5dTNdHbk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdtYbd4%2FbtrYTOnvl8K%2FZUSlsf2haDLdbF5dTNdHbk%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;600&quot; height=&quot;592&quot; data-filename=&quot;Screen Shot 2023-02-13 at 12.12.16 AM.png&quot; data-origin-width=&quot;1264&quot; data-origin-height=&quot;1248&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;설정 없이 자바 파일 만들 때&lt;/figcaption&gt;
&lt;/figure&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;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;반복 작업을 줄이기 위한 Intellij 설정&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;프로젝트 설정&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프로젝트 폴더 우클릭 후 Open Module Setting으로 들어간 뒤 왼쪽 메뉴에서 Project를 선택하면 다음과 같은 창이 나온다. 아래에서 원하는 SDK, Language level을 선택하면 된다. Compiler ouput에 나와있는 path는 파일을 컴파일 했을 때 그 결과물이 저장되는 곳이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screen Shot 2023-02-13 at 12.24.57 AM.png&quot; data-origin-width=&quot;2048&quot; data-origin-height=&quot;1544&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/usX6w/btrYTpVHP7K/yMex4fEKQq2iAQ3DvuDEMk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/usX6w/btrYTpVHP7K/yMex4fEKQq2iAQ3DvuDEMk/img.png&quot; data-alt=&quot;프로젝트 설정창&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/usX6w/btrYTpVHP7K/yMex4fEKQq2iAQ3DvuDEMk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FusX6w%2FbtrYTpVHP7K%2FyMex4fEKQq2iAQ3DvuDEMk%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;600&quot; height=&quot;452&quot; data-filename=&quot;Screen Shot 2023-02-13 at 12.24.57 AM.png&quot; data-origin-width=&quot;2048&quot; data-origin-height=&quot;1544&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;프로젝트 설정창&lt;/figcaption&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;Module 설정&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;다음으로 Modules 탭으로 넘어간다. Language level은 project default로 두면 default 값을 따라간다. 여기서 원하는 폴더를 선택한 뒤에 Mark as Sources를 하면 해당 폴더가 파란색으로 변하면서 프로젝트에서 설정한 언어 소스 폴더로 변한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screen Shot 2023-02-13 at 12.31.34 AM.png&quot; data-origin-width=&quot;2048&quot; data-origin-height=&quot;1544&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cGrJRC/btrY2nouIsM/pIkV2gcRfrV423VBlgkkkK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cGrJRC/btrY2nouIsM/pIkV2gcRfrV423VBlgkkkK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cGrJRC/btrY2nouIsM/pIkV2gcRfrV423VBlgkkkK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcGrJRC%2FbtrY2nouIsM%2FpIkV2gcRfrV423VBlgkkkK%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;600&quot; height=&quot;452&quot; data-filename=&quot;Screen Shot 2023-02-13 at 12.31.34 AM.png&quot; data-origin-width=&quot;2048&quot; data-origin-height=&quot;1544&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;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;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screen Shot 2023-02-13 at 12.39.11 AM.png&quot; data-origin-width=&quot;1348&quot; data-origin-height=&quot;1394&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bUnLZY/btrYWai1rGI/YWbkNfZnUGqXqQUMXvB260/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bUnLZY/btrYWai1rGI/YWbkNfZnUGqXqQUMXvB260/img.png&quot; data-alt=&quot;파일 생성창이 변한 모습&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bUnLZY/btrYWai1rGI/YWbkNfZnUGqXqQUMXvB260/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbUnLZY%2FbtrYWai1rGI%2FYWbkNfZnUGqXqQUMXvB260%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;600&quot; height=&quot;620&quot; data-filename=&quot;Screen Shot 2023-02-13 at 12.39.11 AM.png&quot; data-origin-width=&quot;1348&quot; data-origin-height=&quot;1394&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;파일 생성창이 변한 모습&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screen Shot 2023-02-13 at 12.39.52 AM.png&quot; data-origin-width=&quot;1302&quot; data-origin-height=&quot;746&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/om5e8/btrYT95XWNm/YkTQHaBKu1Hj89ZkaFp9A1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/om5e8/btrYT95XWNm/YkTQHaBKu1Hj89ZkaFp9A1/img.png&quot; data-alt=&quot;자동 생성된 코드&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/om5e8/btrYT95XWNm/YkTQHaBKu1Hj89ZkaFp9A1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fom5e8%2FbtrYT95XWNm%2FYkTQHaBKu1Hj89ZkaFp9A1%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;600&quot; height=&quot;344&quot; data-filename=&quot;Screen Shot 2023-02-13 at 12.39.52 AM.png&quot; data-origin-width=&quot;1302&quot; data-origin-height=&quot;746&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;자동 생성된 코드&lt;/figcaption&gt;
&lt;/figure&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;&amp;nbsp;이제 클래스 내에 main 메소드를 만든 뒤에 파일을 우클릭하면 Run이 뜨는 것을 볼 수 있다. 여기 말고도 파일 내 main 메소드 왼쪽에 재생 버튼이 생긴 것을 볼 수 있다. 원하는 방식으로 파일을 실행하면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screen Shot 2023-02-13 at 12.46.58 AM.png&quot; data-origin-width=&quot;1216&quot; data-origin-height=&quot;1424&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kRR5U/btrYUuhVeik/uIaxpj9LpZWKQ46gbE8TM0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kRR5U/btrYUuhVeik/uIaxpj9LpZWKQ46gbE8TM0/img.png&quot; data-alt=&quot;실행 버튼이 생긴 모습&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kRR5U/btrYUuhVeik/uIaxpj9LpZWKQ46gbE8TM0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkRR5U%2FbtrYUuhVeik%2FuIaxpj9LpZWKQ46gbE8TM0%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;600&quot; height=&quot;703&quot; data-filename=&quot;Screen Shot 2023-02-13 at 12.46.58 AM.png&quot; data-origin-width=&quot;1216&quot; data-origin-height=&quot;1424&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;실행 버튼이 생긴 모습&lt;/figcaption&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;.gitignore 파일 설정&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;이제 마지막으로 .gitignore 파일을 설정해주면 된다. 파일을 실행하면 class 파일이 만들어지는데, 이 파일은 프로젝트 설정의&amp;nbsp; Compiler ouput에 명시한 path에 만들어진다. 이 path에 해당하는 폴더를 .gitignore에 설정해 제외한다. 그리고 .idea는 intellij ide를 위한 설정 모음이다. 필요없으니 제외해준다. 그 외에 제외하고 싶은 파일이나 폴더를 제외하면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screen Shot 2023-02-13 at 12.57.39 AM.png&quot; data-origin-width=&quot;1494&quot; data-origin-height=&quot;750&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/2AAc3/btrYY6HkZzZ/cbrGpr4Pr5W91VksHInKgK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/2AAc3/btrYY6HkZzZ/cbrGpr4Pr5W91VksHInKgK/img.png&quot; data-alt=&quot;내 .gitignore 설정&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/2AAc3/btrYY6HkZzZ/cbrGpr4Pr5W91VksHInKgK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F2AAc3%2FbtrYY6HkZzZ%2FcbrGpr4Pr5W91VksHInKgK%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;600&quot; height=&quot;301&quot; data-filename=&quot;Screen Shot 2023-02-13 at 12.57.39 AM.png&quot; data-origin-width=&quot;1494&quot; data-origin-height=&quot;750&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;내 .gitignore 설정&lt;/figcaption&gt;
&lt;/figure&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;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;코드도 반복된다&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;위에서 언급한 작업들만 반복되는 것이 아니다. 알고리즘 문제 풀 때마다 매번 작성해야 하는 코드들이 있다. 대표적으로 main 메소드와 입출력과 관련된 코드들이다.&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;Live Template 기능 활용하기&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;맥의 경우 Command + ,(comma), 윈도우의 경우 Ctrl + Alt + s를 누르면 세팅창을 열 수 있다. 여기서 Editor - Live Templates으로 들어가면 자동완성 키워드를 볼 수 있다. 여기에 키워드와 코드를 등록하면 해당 키워드로 코드 자동 생성이 가능해진다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screen Shot 2023-02-13 at 3.26.31 PM.png&quot; data-origin-width=&quot;1960&quot; data-origin-height=&quot;1426&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/wV86J/btrYXjnOhHX/lA0tcKtnVxaF8i0Fd8oghK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/wV86J/btrYXjnOhHX/lA0tcKtnVxaF8i0Fd8oghK/img.png&quot; data-alt=&quot;Live Templates&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/wV86J/btrYXjnOhHX/lA0tcKtnVxaF8i0Fd8oghK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FwV86J%2FbtrYXjnOhHX%2FlA0tcKtnVxaF8i0Fd8oghK%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;600&quot; height=&quot;437&quot; data-filename=&quot;Screen Shot 2023-02-13 at 3.26.31 PM.png&quot; data-origin-width=&quot;1960&quot; data-origin-height=&quot;1426&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Live Templates&lt;/figcaption&gt;
&lt;/figure&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;&amp;nbsp;코드를 등록한 뒤에 자동 생성을 시도해보면 아래와 같이 작동한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screen Shot 2023-02-13 at 3.53.41 PM.png&quot; data-origin-width=&quot;1072&quot; data-origin-height=&quot;126&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/I8wyD/btrY2oIUZzY/xX6RW0aJ1VUOk7Y0qOGQV1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/I8wyD/btrY2oIUZzY/xX6RW0aJ1VUOk7Y0qOGQV1/img.png&quot; data-alt=&quot;코드 생성 추천&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/I8wyD/btrY2oIUZzY/xX6RW0aJ1VUOk7Y0qOGQV1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FI8wyD%2FbtrY2oIUZzY%2FxX6RW0aJ1VUOk7Y0qOGQV1%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;600&quot; height=&quot;71&quot; data-filename=&quot;Screen Shot 2023-02-13 at 3.53.41 PM.png&quot; data-origin-width=&quot;1072&quot; data-origin-height=&quot;126&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;코드 생성 추천&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screen Shot 2023-02-13 at 3.53.53 PM.png&quot; data-origin-width=&quot;344&quot; data-origin-height=&quot;262&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cbrzzB/btrZbO0lq7W/HPIVp4EtZENIxaC5SEC0H0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cbrzzB/btrZbO0lq7W/HPIVp4EtZENIxaC5SEC0H0/img.png&quot; data-alt=&quot;자동 생성된 코드&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cbrzzB/btrZbO0lq7W/HPIVp4EtZENIxaC5SEC0H0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcbrzzB%2FbtrZbO0lq7W%2FHPIVp4EtZENIxaC5SEC0H0%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;600&quot; height=&quot;457&quot; data-filename=&quot;Screen Shot 2023-02-13 at 3.53.53 PM.png&quot; data-origin-width=&quot;344&quot; data-origin-height=&quot;262&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;자동 생성된 코드&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>컴퓨터공학/대회 알고리즘</category>
      <author>_Bibidi</author>
      <guid isPermaLink="true">https://bibidi0.tistory.com/268</guid>
      <comments>https://bibidi0.tistory.com/268#entry268comment</comments>
      <pubDate>Mon, 13 Feb 2023 01:08:41 +0900</pubDate>
    </item>
    <item>
      <title>제로베이스 백엔드 스쿨 4기 5개월차 후기</title>
      <link>https://bibidi0.tistory.com/239</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;부트 캠프 지원 계기&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;처음 부트 캠프를 생각하게 된 계기는 공부 자료 때문입니다. 개발 실력을 기르기 위해 필요한 자료들을 찾아야 하는데, 제대로 된 자료를 찾기 힘들었습니다. 인터넷에는 잘못된 정보도 정보지만 옛날에나 쓰던 개발 코드들이 계속 재반복되어 올라오는 게 문제였습니다. 분명 글은 몇 달 안 된 글인데, 내용은 7년 전에 게시된 어느 글과 거의 다를 바가 없는 경우가 많았습니다. 특히 자바 게시판과 자바스크립트 엔진에 대한 내용은 몇 년째 안 변하는 건지 알 수가 없을 정도로 긴 기간 동안 코드가 같더라구요 ㅋㅋㅋ 책은 책대로 개발 기초를 위한 책을 찾기가 힘들었습니다. 출판된지 오래된 책도 많구요. 사람인 백엔드 개발자 구인 공고에 나오는 기술들을 적용한 프로젝트를 해보고 싶었는데, 그런 책은 없더라구요.&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;&amp;nbsp;그러다보니 그냥 이렇게 시간을 날리기보단 돈을 써서 좋은 교육을 받는 게 낫지 않나 싶어서 부트 캠프를 찾아봤습니다. 그 중 커리큘럼이 가장 마음에 드는 것이 제로베이스였습니다. 몇몇 부트캠프는 어떻게 진행되는지 과정에 대한 안내는 없고 뭔 겉멋든 광고만 많은 반면에 제로베이스는 과정이 상세하게 안내되어 있었습니다. 그 중 리팩토링 등 코드에 신경쓰는 강의가 눈에 띄어 선택하게 되었습니다.&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;&amp;nbsp;커리큘럼은 part1, part2로 이루어져 있습니다.&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;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;PART 1 후기&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;Part 1은 자바스크립트 기초, 자바 기초, 알고리즘, CS, 스프링부트 입문으로 구성되어 있습니다.&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;&amp;nbsp;웹 개발자라면 기본적으로 알아야 할 기초 상식이고 딱 그 정도 선에서 끝나는 강의입니다. CSS 강의 하시는 분 CSS 다루는 감각이 남달라 보여서 집중하려고 할 때 딱 끝난 기억이 남아있네요. 돈과 시간만 많았으면 프런트쪽도 신청해 보고 싶을 정도였습니다.&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;&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;&amp;nbsp;기초부터 Stream까지 깔끔하게 잘 정리해 줍니다. 강의 진행에 어려움은 겪는 사람이 있는지, 중간에 좀 더 쉬운 강의를 추가해주시더라구요. 제로베이스 들으면서 장점이 이거였습니다. 상황에 따라 강의를 더 추가해 학습을 원활하게 진행할 수 있도록 도와줍니다. 전 전공자에 자바를 어느 정도 경험했기 때문에 간단하게 정리하고 넘어갔습니다.&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;&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;&amp;nbsp;수강생들이 본격적으로 썰려나가기 시작합니다. 일주일에 한 번씩 코딩테스트를 치는데, 많은 수강생들이 어려워 하더라구요. 만약 여러분이 알고리즘에 대한 경험 없이 이 부트 캠프를 신청하셨다면 먼저 백준부터 들어가서 열심히 풀라고 권하고 싶네요. 이걸 못 버텨서 Part2로 못 넘어오고 다 떨어지는 것 같더라구요. 알고리즘 강의는 아는 내용이 대부분이라 그냥 스킵해서 잘 모르겠습니다.&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;&amp;nbsp;알고리즘 테스트 수준은 코포 기준으로 민트면 Part1은 거의 올솔, Part2도 올솔을 노릴만하게 나옵니다. 블루 정도면 스피드런 연습? 그리고 언어는 Java, Python으로 고정입니다. c++ 못 써요. 요즘 코딩테스트에선 직무에 맞는 언어를 선택하도록 강제하는 경우가 많다고 하네요. 처음엔 이게 불만이었는데, 자바로 문제 풀 다 보니 언어 숙련도가 엄청 늘더라구요. 개인적으론 괜찮았습니다.&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;&amp;nbsp;알고리즘 공부는 사실 수업보다는 다양한 문제를 많이 경험하는 게 가장 좋다고 생각합니다. 또 문제가 안 풀리면 오랫동안 고민하지 말고 답안지 보고 분석하는 게 낫다고 생각하는 사람 중 하나입니다.&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;&amp;nbsp;이론은 kks227 블로그가 제일 낫습니다. 책도 볼 필요가 없다고 생각해요. 여기만큼 정리가 잘 된 곳이 없고 알고리즘 고인물들이 가장 많이 추천하는 블로그입니다. 저도 이걸로 공부했습니다. 자바로 된 코드가 필요하다면 로버트 세지윅의 알고리즘 4판을 추천합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- Link : &lt;a href=&quot;https://m.blog.naver.com/kks227/220769859177&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://m.blog.naver.com/kks227/220769859177&lt;/a&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;&amp;nbsp;백준은 무조건 solved.ac를 참고해서 푸세요. solved.ac의 클래스에 있는 문제를 차근차근 풀어가다가 나중에 랜덤 디펜스 하면 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- Link : &lt;a href=&quot;https://solved.ac/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://solved.ac/&lt;/a&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;&amp;nbsp;그리고 실전 연습은 Atcoder ABC, Codeforces div.3를 추천합니다. 실력은 여기 참가해서 문제 푸는 게 가장 빨리 늘었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- Link : &lt;a href=&quot;https://codeforces.com/contests&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://codeforces.com/contests&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- Link : &lt;a href=&quot;https://kenkoooo.com/atcoder/#/table/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://kenkoooo.com/atcoder/#/table/&lt;/a&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;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;CS&lt;/h4&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;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;강의는 좋지만 그렇다고 강의만 듣고 끝내면 깊이가 없지 않나 싶어 추가로 공부하는 중입니다. CSAPP와 OSTEP을 보고 있는데, 여러분도 꼭 보세요. 많은 사람들이 추천하던데, 역시 추천하는 이유가 있습니다.&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;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;스프링부트 입문부터 Part 2 현재까지&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;양세열 강사님의 스프링부트 입문 강의는 제로베이스 과정 중에서 가장 만족하는 강의 중 하나가 아닐까 합니다. 의존성 많은 코드 때문에 지옥을 한 번 겪은 적이 있어 SOLID를 어떻게 하면 지킬 수 있는지에 관심이 많았는데, 입문 강의에서 코드에 관한 그 고민을 시원하게 해결해줍니다. 제가 지금까지 본 코드 중에서 가장 깔끔한 코드였습니다. SOLID 원칙 중 OCP가 가장 이해하기 난해했는데, 이 코드를 보면서 이해하게 됐습니다. 아 이게 확장에 열린 코드구나 싶더라구요. 이 강의 하나만으로도 저는 만족이 되더라구요.&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;&amp;nbsp;혼자서 공부할 땐 게시판 수준의 프로젝트를 확장하는 수준에서 끝이었는데, 커리큘럼을 따라가면서 다양한 기술과 좋은 코드들을 접하고 있습니다. 지금 짜는 코드 보다가 예전에 게시판 짠 코드를 돌아보니 참 엉망이네요. 이런 거 보면 참 많이 발전하긴 했습니다.&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;&amp;nbsp;부트캠프를 고려하신다면 제로베이스를 한 번 고려해 보는 것도 좋다고 생각합니다. 처음에는 여길 추천해도 되나 싶었는데, 지금은 다른 사람에게 충분히 권할만 하다고 생각 중입니다. 과제도 많고 커리가 쉽지는 않은데, 대신 얻는 게 많습니다.&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;&amp;nbsp;말하고 싶은 내용이 많이 있었는데, 손가락이 아파오는 게 후기는 여기까지 해야겠네요. 그럼 이만 ~&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;&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;&amp;nbsp;- &lt;a href=&quot;https://zero-base.co.kr/category_dev_camp/school_BE&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://zero-base.co.kr/category_dev_camp/school_BE&lt;/a&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;&amp;nbsp;&lt;/p&gt;</description>
      <category>기타</category>
      <category>부트 캠프</category>
      <category>제로베이스</category>
      <category>제로베이스 백엔드 스쿨</category>
      <category>제로베이스 스쿨</category>
      <author>_Bibidi</author>
      <guid isPermaLink="true">https://bibidi0.tistory.com/239</guid>
      <comments>https://bibidi0.tistory.com/239#entry239comment</comments>
      <pubDate>Sun, 4 Dec 2022 22:57:11 +0900</pubDate>
    </item>
    <item>
      <title>Atcoder Boot camp Problems Medium 6 ~ 10</title>
      <link>https://bibidi0.tistory.com/206</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;6. B - Minesweeper&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;코드&lt;/p&gt;
&lt;pre id=&quot;code_1668378544546&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import java.io.*;
import java.util.*;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        StringTokenizer st;

        st = new StringTokenizer(br.readLine());
        int h = Integer.parseInt(st.nextToken());
        int w = Integer.parseInt(st.nextToken());
        String[] strs = new String[h];

        for (int i = 0; i &amp;lt; strs.length; i++) {
            strs[i] = br.readLine();
        }

        int[][] board = new int[h][w];
        for (int y = 0; y &amp;lt; h; y++) {
            for (int x = 0; x &amp;lt; w; x++) {
                if (strs[y].charAt(x) == '#') {
                    board[y][x] = -100;
                    for (int dy = -1; dy &amp;lt;= 1; dy++) {
                        for (int dx = -1; dx &amp;lt;= 1; dx++) {
                            int ny = y + dy;
                            int nx = x + dx;
                            if (ny &amp;lt; 0 || ny &amp;gt;= h || nx &amp;lt; 0 || nx &amp;gt;= w) continue;
                            board[ny][nx]++;
                        }
                    }
                }
            }
        }

        StringBuffer sb = new StringBuffer();
        for (int i = 0; i &amp;lt; board.length; i++) {
            for (int j = 0; j &amp;lt; board[0].length; j++) {
                if (board[i][j] &amp;lt; 0) sb.append('#');
                else sb.append(board[i][j]);
            }
            sb.append('\n');
        }
        bw.write(sb.toString());

        bw.flush();
        bw.close();
        br.close();
    }
}&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;p data-ke-size=&quot;size16&quot;&gt;7. B - Cut and Count&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;코드&lt;/p&gt;
&lt;pre id=&quot;code_1668380811667&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import java.io.*;
import java.util.*;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        StringTokenizer st;

        int n = Integer.parseInt(br.readLine());
        String str = br.readLine();

        int ans = 0;
        for (int i = 1; i &amp;lt; str.length(); i++) {
            boolean[] a = new boolean[26];
            for (int j = 0; j &amp;lt; i; j++) {
                a[str.charAt(j) - 'a'] = true;
            }

            boolean[] b = new boolean[26];
            for (int j = i; j &amp;lt; str.length(); j++) {
                b[str.charAt(j) - 'a'] = true;
            }

            int cnt = 0;
            for (int j = 0; j &amp;lt; 26; j++) {
                if (a[j] &amp;amp;&amp;amp; b[j]) cnt++;
            }
            ans = Math.max(ans, cnt);
        }

        bw.write(ans + &quot;&quot;);

        bw.flush();
        bw.close();
        br.close();
    }
}&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;p data-ke-size=&quot;size16&quot;&gt;8. C - Colorful Leaderboard&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;풀이&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;최소를 구할 때 주의해야 한다. rating이 3200 미만인 인원이 한 명이라도 있는 경우 서로 다른 색깔의 수이고 없다면 rating이 3200 이상인 인원들의 색을 하나로 고정한 경우가 최소이다.&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;코드&lt;/p&gt;
&lt;pre id=&quot;code_1668383945458&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import java.io.*;
import java.util.*;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        StringTokenizer st;

        int[] score = new int[]{400, 800, 1200, 1600, 2000, 2400, 2800, 3200};
        int n = Integer.parseInt(br.readLine());
        st = new StringTokenizer(br.readLine());

        boolean[] color = new boolean[score.length];
        int free = 0;
        for (int i = 0; i &amp;lt; n; i++) {
            int cur = Integer.parseInt(st.nextToken());
            int idx = 0;

            while (idx &amp;lt; score.length &amp;amp;&amp;amp; score[idx] &amp;lt;= cur) idx++;

            if (idx &amp;lt; score.length) color[idx] = true;
            else free++;
        }

        int cnt = 0;
        for (int i = 0; i &amp;lt; color.length; i++) {
            if (color[i]) cnt++;
        }

        int min = Math.max(cnt, 1);
        int max = cnt + free;
        bw.write(min + &quot; &quot; + max);

        bw.flush();
        bw.close();
        br.close();
    }
}&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;p data-ke-size=&quot;size16&quot;&gt;9. B - Choose Integer&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;코드&lt;/p&gt;
&lt;pre id=&quot;code_1668387327309&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import java.io.*;
import java.util.*;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        StringTokenizer st;

        st = new StringTokenizer(br.readLine());
        int a = Integer.parseInt(st.nextToken());
        int b = Integer.parseInt(st.nextToken());
        int c = Integer.parseInt(st.nextToken());

        HashSet&amp;lt;Integer&amp;gt; set = new HashSet&amp;lt;&amp;gt;();
        int sum = a;
        while (!set.contains(sum % b)) {
            set.add(sum % b);
            sum += a;
        }

        bw.write(set.contains(c) ? &quot;YES&quot; : &quot;NO&quot;);

        bw.flush();
        bw.close();
        br.close();
    }
}&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;p data-ke-size=&quot;size16&quot;&gt;10. C - Together&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;코드&lt;/p&gt;
&lt;pre id=&quot;code_1668389306503&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import java.io.*;
import java.util.*;

public class Main {
    public static void add(HashMap&amp;lt;Integer, Integer&amp;gt; map, int n) {
        map.putIfAbsent(n, 0);
        map.replace(n, map.get(n) + 1);
    }

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        StringTokenizer st;

        int n = Integer.parseInt(br.readLine());
        st = new StringTokenizer(br.readLine());
        HashMap&amp;lt;Integer, Integer&amp;gt; map = new HashMap();

        for (int i = 0; i &amp;lt; n; i++) {
            int cur = Integer.parseInt(st.nextToken());
            add(map, cur - 1);
            add(map, cur);
            add(map, cur + 1);
        }

        int ans = 0;
        for (int x : map.values()) {
            ans = Math.max(ans, x);
        }

        bw.write(ans + &quot;&quot;);

        bw.flush();
        bw.close();
        br.close();
    }
}&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>컴퓨터공학/Problem Solving</category>
      <author>_Bibidi</author>
      <guid isPermaLink="true">https://bibidi0.tistory.com/206</guid>
      <comments>https://bibidi0.tistory.com/206#entry206comment</comments>
      <pubDate>Mon, 14 Nov 2022 10:32:56 +0900</pubDate>
    </item>
    <item>
      <title>Atcoder Boot camp Problems Medium 1 ~ 5</title>
      <link>https://bibidi0.tistory.com/205</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. B - Trained?&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;코드&lt;/p&gt;
&lt;pre id=&quot;code_1668322917776&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import java.io.*;
import java.util.*;
 
public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        StringTokenizer st;
 
        int n = Integer.parseInt(br.readLine());
        int[] arr = new int[n + 1];
        boolean[] visited = new boolean[n + 1];
        for (int i = 1; i &amp;lt;= n; i++) {
            arr[i] = Integer.parseInt(br.readLine());
        }
 
        int cur = 1;
        visited[cur] = true;
        int ans = 0;
        while (cur != 2) {
            if (!visited[arr[cur]]) {
                cur = arr[cur];
              	visited[cur] = true;
                ans++;
            } else break;
        }
 
        bw.write((cur == 2 ? ans : -1) + &quot;&quot;);
 
        bw.flush();
        bw.close();
        br.close();
    }
}&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;p data-ke-size=&quot;size16&quot;&gt;2. &lt;span style=&quot;background-color: #ffffff;&quot;&gt;A - Irreversible operation&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;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;코드&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1668323217380&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import java.io.*;
import java.util.*;
 
public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        StringTokenizer st;
 
        String str = br.readLine();
        long cnt = 0;
        long ans = 0;
        for (int i = 0; i &amp;lt; str.length(); i++) {
            if (str.charAt(i) == 'W') {
                ans += cnt;
            } else if (str.charAt(i) == 'B') {
                cnt++;
            }
        }
 
        bw.write(ans + &quot;&quot;);
 
        bw.flush();
        bw.close();
        br.close();
    }
}&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;p data-ke-size=&quot;size16&quot;&gt;3. A - &amp;gt;&amp;lt;&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;개선&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;&amp;nbsp;- 현재 값이 이전 값에 따라 결정되어 따로 count 변수를 이용할 필요없이 이전 값을 이용해 현재 값을 채울 수 있다. 코드의 의미가 좀 더 명확해지고 깔끔해진다. 첫 제출 코드는 꽤 지저분했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- stream을 이용하면 코드를 줄일 수 있다. 앞으로 의식하면서 계속 사용해야겠다.&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;코드&lt;/p&gt;
&lt;pre id=&quot;code_1668322807057&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import java.io.*;
import java.util.*;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        StringTokenizer st;

        String str = br.readLine();
        long[] arr = new long[str.length() + 1];

        for (int i = 0; i &amp;lt; str.length(); i++) {
            if (str.charAt(i) == '&amp;lt;') {
                arr[i + 1] = Math.max(arr[i + 1], arr[i] + 1);
            }
        }

        for (int i = str.length() - 1; i &amp;gt;= 0; i--) {
            if (str.charAt(i) == '&amp;gt;') {
                arr[i] = Math.max(arr[i], arr[i + 1] + 1);
            }
        }

        bw.write(Arrays.stream(arr).sum() + &quot;&quot;);

        bw.flush();
        bw.close();
        br.close();
    }
}&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;p data-ke-size=&quot;size16&quot;&gt;4. B - ss&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;코드&lt;/p&gt;
&lt;pre id=&quot;code_1668325666862&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import java.io.*;
import java.util.*;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        StringTokenizer st;

        String str = br.readLine();
        int ans = 0;
        for (int len = 2; len &amp;lt; str.length(); len += 2) {
            for (int i = 0; i + len - 1 &amp;lt; str.length(); i++) {
                String left = str.substring(i, i + len / 2);
                String right = str.substring(i + len / 2, i + len);
                if (left.equals(right)) ans = len;
            }
        }

        bw.write(ans + &quot;&quot;);

        bw.flush();
        bw.close();
        br.close();
    }
}&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;p data-ke-size=&quot;size16&quot;&gt;5. D - ModSum&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;풀이&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;(1 mod 2) + (2 mod 3) + ... + (N-1 mod N) + (N mod 1)이 되도록 하는 게 최선이다. 어떤 permutation 값을 바꾸든 기존 값보다 적어진다는 것을 보여주면 된다.&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;&amp;nbsp;케이스를 마지막 번재 값과 다른 어느 값을 바꾸는 경우, 마지막 번째를 제외한 나머지 중 어느 두 값을 바꾸는 경우로 나눌 수 있다.&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;&amp;nbsp;i &amp;lt; j라 하자. 그럼 x_i = i + 1이고 x_j = j + 1이다. (j mod (i + 1)) + (i mod (j + 1)) &amp;lt;= i + i &amp;lt; i + j = (i mod (i + 1)) + (j mod (j + 1))이므로 반드시 손해를 본다.&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;&amp;nbsp;- 마지막 번째를 포함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(i mod 1) + (N mod (i + 1)) = (N mod (i + 1)) &amp;lt;= i = (i mod (i + 1)) + (N mod 1)이므로 서로 바꿔도 이득을 얻진 않는다.&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;&amp;nbsp;따라서 기존의 방식은 최적이며, 정답은 1 ~ N - 1까지의 합이다.&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;&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;&amp;nbsp;- Even인지 판단하는 부분을 짤 때, 지원해주는 라이브러리를 사용하지 않고 일일이 구현했다. 문자열에 관한 문제는 기본으로 제공해주는 라이브러리를 잘 활용할 수 있도록 의식해야 된다.&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;코드&lt;/p&gt;
&lt;pre id=&quot;code_1668328575732&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import java.io.*;
import java.util.*;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        StringTokenizer st;

        long n = Integer.parseInt(br.readLine());
        long ans = (n - 1) * n / 2;

        bw.write(ans + &quot;&quot;);

        bw.flush();
        bw.close();
        br.close();
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>컴퓨터공학/Problem Solving</category>
      <author>_Bibidi</author>
      <guid isPermaLink="true">https://bibidi0.tistory.com/205</guid>
      <comments>https://bibidi0.tistory.com/205#entry205comment</comments>
      <pubDate>Sun, 13 Nov 2022 16:35:16 +0900</pubDate>
    </item>
    <item>
      <title>[백준/BOJ] 1152 : 단어의 개수 (자바/Java)</title>
      <link>https://bibidi0.tistory.com/189</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;문제&lt;/h3&gt;
&lt;figure id=&quot;og_1662944316668&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;1152번: 단어의 개수&quot; data-og-description=&quot;첫 줄에 영어 대소문자와 공백으로 이루어진 문자열이 주어진다. 이 문자열의 길이는 1,000,000을 넘지 않는다. 단어는&amp;nbsp;공백 한 개로 구분되며, 공백이 연속해서 나오는 경우는 없다. 또한 문자열&quot; data-og-host=&quot;www.acmicpc.net&quot; data-og-source-url=&quot;https://www.acmicpc.net/problem/1152&quot; data-og-url=&quot;https://www.acmicpc.net/problem/1152&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/nKi6V/hyPLi9TRRR/c3KIPbhbY4VJG3OAm1C681/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/1152&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.acmicpc.net/problem/1152&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/nKi6V/hyPLi9TRRR/c3KIPbhbY4VJG3OAm1C681/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;1152번: 단어의 개수&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;첫 줄에 영어 대소문자와 공백으로 이루어진 문자열이 주어진다. 이 문자열의 길이는 1,000,000을 넘지 않는다. 단어는&amp;nbsp;공백 한 개로 구분되며, 공백이 연속해서 나오는 경우는 없다. 또한 문자열&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;h3 data-ke-size=&quot;size23&quot;&gt;풀이&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;StringTokenizer 클래스를 사용하는 것이 가장 편리합니다. 알아서 공백 문자열을 기준으로 잘라서 유효한 String만을 골라 추출하기 때문입니다. PS판에서 Java를 통해 문제를 풀겠다면 반드시 사용하게 되는 클래스입니다. StringTokenizer 클래스의 countTokens 메소드를 이용해 단어의 개수를 쉽게 알 수 있습니다.&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;* 주의점&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;String의 split 메소드는 라인의 앞뒤에 공백 문자가 있거나 순수 공백 문자열 또는 빈 문자열에 대해 regex를 &quot; &quot;로 설정하고 메소드를 실행했을 때 문자열을 제대로 추출하지 못합니다. &quot;&quot;.split(&quot; &quot;).length를 출력하면 1이 출력됩니다. 이 메소드를 이용해 문제를 풀 때는 라인의 앞뒤 빈 문자열을 잘라준 뒤 문자열이 빈 문자열인지 확인한 뒤 split 메소드를 이용해야 합니다.&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;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;코드&lt;/h3&gt;
&lt;pre id=&quot;code_1662942457233&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import java.io.*;
import java.util.*;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        StringTokenizer st;

        st = new StringTokenizer(br.readLine());
        bw.write(st.countTokens() + &quot;\n&quot;);

        bw.flush();
        bw.close();
        br.close();
    }
}&lt;/code&gt;&lt;/pre&gt;</description>
      <category>컴퓨터공학/Problem Solving</category>
      <author>_Bibidi</author>
      <guid isPermaLink="true">https://bibidi0.tistory.com/189</guid>
      <comments>https://bibidi0.tistory.com/189#entry189comment</comments>
      <pubDate>Mon, 12 Sep 2022 10:14:42 +0900</pubDate>
    </item>
    <item>
      <title>[백준/BOJ] 1008 : A/B (자바/Java)</title>
      <link>https://bibidi0.tistory.com/188</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;문제&lt;/h3&gt;
&lt;figure id=&quot;og_1662943617461&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;1008번: A/B&quot; data-og-description=&quot;두 정수 A와 B를 입력받은 다음, A/B를 출력하는 프로그램을 작성하시오.&quot; data-og-host=&quot;www.acmicpc.net&quot; data-og-source-url=&quot;https://www.acmicpc.net/problem/1008&quot; data-og-url=&quot;https://www.acmicpc.net/problem/1008&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bNrSOg/hyPJSSwo6K/0iIVr4Q1RgKF3ZIUYW0Ku0/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/1008&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.acmicpc.net/problem/1008&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bNrSOg/hyPJSSwo6K/0iIVr4Q1RgKF3ZIUYW0Ku0/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;1008번: A/B&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;두 정수 A와 B를 입력받은 다음, A/B를 출력하는 프로그램을 작성하시오.&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;h3 data-ke-size=&quot;size23&quot;&gt;풀이&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; a, b를 정수가 아닌 실수로 받아 a/b를 출력하면 됩니다. 자바의 double은 소수점을 16자리까지 표현이 가능하므로 자연스럽게 오차가 1e-9 이하가 됩니다.&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;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;코드&lt;/h3&gt;
&lt;pre id=&quot;code_1662943730196&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import java.io.*;
import java.util.*;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        StringTokenizer st;

        st = new StringTokenizer(br.readLine());
        double a = Integer.parseInt(st.nextToken());
        double b = Integer.parseInt(st.nextToken());
        bw.write(a / b + &quot;\n&quot;);

        bw.flush();
        bw.close();
        br.close();
    }
}&lt;/code&gt;&lt;/pre&gt;</description>
      <category>컴퓨터공학/Problem Solving</category>
      <author>_Bibidi</author>
      <guid isPermaLink="true">https://bibidi0.tistory.com/188</guid>
      <comments>https://bibidi0.tistory.com/188#entry188comment</comments>
      <pubDate>Mon, 12 Sep 2022 09:52:53 +0900</pubDate>
    </item>
    <item>
      <title>[백준/BOJ] 1001 : A-B (자바/Java)</title>
      <link>https://bibidi0.tistory.com/187</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;문제&lt;/h3&gt;
&lt;figure id=&quot;og_1662943452948&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;1001번: A-B&quot; data-og-description=&quot;두 정수 A와 B를 입력받은 다음, A-B를 출력하는 프로그램을 작성하시오.&quot; data-og-host=&quot;www.acmicpc.net&quot; data-og-source-url=&quot;https://www.acmicpc.net/problem/1001&quot; data-og-url=&quot;https://www.acmicpc.net/problem/1001&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/c4Y3Bt/hyPJ7IVgBD/ckRjqDYQGwOkjnPx12DLr0/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/1001&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.acmicpc.net/problem/1001&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/c4Y3Bt/hyPJ7IVgBD/ckRjqDYQGwOkjnPx12DLr0/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;1001번: A-B&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;두 정수 A와 B를 입력받은 다음, A-B를 출력하는 프로그램을 작성하시오.&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;h3 data-ke-size=&quot;size23&quot;&gt;풀이&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;정수 a, b를 받고 a - b를 출력하면 됩니다.&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;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;코드&lt;/h3&gt;
&lt;pre id=&quot;code_1662942457233&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import java.io.*;
import java.util.*;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        StringTokenizer st;

        st = new StringTokenizer(br.readLine());
        int a = Integer.parseInt(st.nextToken());
        int b = Integer.parseInt(st.nextToken());
        bw.write(a - b + &quot;\n&quot;);

        bw.flush();
        bw.close();
        br.close();
    }
}&lt;/code&gt;&lt;/pre&gt;</description>
      <category>컴퓨터공학/Problem Solving</category>
      <author>_Bibidi</author>
      <guid isPermaLink="true">https://bibidi0.tistory.com/187</guid>
      <comments>https://bibidi0.tistory.com/187#entry187comment</comments>
      <pubDate>Mon, 12 Sep 2022 09:44:50 +0900</pubDate>
    </item>
    <item>
      <title>[백준/BOJ] 1000 : A+B (자바/Java)</title>
      <link>https://bibidi0.tistory.com/186</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;문제&lt;/h3&gt;
&lt;figure id=&quot;og_1662940530267&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;1000번: A+B&quot; data-og-description=&quot;두 정수 A와 B를 입력받은 다음,&amp;nbsp;A+B를 출력하는 프로그램을 작성하시오.&quot; data-og-host=&quot;www.acmicpc.net&quot; data-og-source-url=&quot;https://www.acmicpc.net/problem/1000&quot; data-og-url=&quot;https://www.acmicpc.net/problem/1000&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/b3a4oQ/hyPJXsIWGP/BH6tyedewmZYQCKnlD9K9K/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/1000&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.acmicpc.net/problem/1000&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/b3a4oQ/hyPJXsIWGP/BH6tyedewmZYQCKnlD9K9K/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;1000번: A+B&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;두 정수 A와 B를 입력받은 다음,&amp;nbsp;A+B를 출력하는 프로그램을 작성하시오.&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;h3 data-ke-size=&quot;size23&quot;&gt;풀이&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;정수 a, b를 받고 a + b를 출력하면 됩니다.&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;&amp;nbsp;Scanner라는 편한 클래스가 있지만 나중을 위해 BufferedReader, BufferedWriter 클래스를 사용하는 것이 더 나은 선택입니다. Scanner는 선언하는 것만으로도 무겁고 입출력 속도가 너무 느립니다. 문제를 풀다 보면 로직 자체에 아무런 문제가 없는데, 시간 초과가 나오는 것을 종종 볼 수 있습니다. 어떤 문제는 단지 Scanner를 선언하는 것만으로도 시간 초과가 납니다. Scanner 때문에 시간 초과가 날 수 있다는 것을 염두에 두고 있으면 그때그때 제대로 대처할 수도 있겠지만 보통은 종종 잊곤 합니다. 이럴 때 가장 큰 문제점은 아무런 오류가 없는 로직 자체를 의심해 많은 시간을 삽질하게 만든다는 점입니다. 그러니 이 글을 보고 있는 여러분은 빠르게 BufferedRedaer, BufferedWriter 클래스 사용법을 익히기를 권합니다. 아니면 C++로 갈아타는 것도 좋은 방법입니다. 필자는 어쩔 수 없이 현재 Java를 사용하고 있습니다.&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;&amp;nbsp;아래 사진에서 위쪽은 BufferedReader, BufferedWriter를 사용했을 때 속도, 아래쪽은 Scanner를 사용했을 때 속도입니다. 이 문제에선 입출력이 한 줄씩인데도 속도가 이 정도로 차이가 납니다. 입출력이 커지면 이러한 차이는 더욱 커집니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screen Shot 2022-09-12 at 8.59.48 AM.png&quot; data-origin-width=&quot;1662&quot; data-origin-height=&quot;228&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cQ9dO0/btrLMzKiCRM/tLIyZrbx1YM6kXG4c8dE90/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cQ9dO0/btrLMzKiCRM/tLIyZrbx1YM6kXG4c8dE90/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cQ9dO0/btrLMzKiCRM/tLIyZrbx1YM6kXG4c8dE90/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcQ9dO0%2FbtrLMzKiCRM%2FtLIyZrbx1YM6kXG4c8dE90%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;1662&quot; height=&quot;228&quot; data-filename=&quot;Screen Shot 2022-09-12 at 8.59.48 AM.png&quot; data-origin-width=&quot;1662&quot; data-origin-height=&quot;228&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;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;코드&lt;/h3&gt;
&lt;pre id=&quot;code_1662941569788&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import java.io.*;
import java.util.*;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        StringTokenizer st;

        st = new StringTokenizer(br.readLine());
        int a = Integer.parseInt(st.nextToken());
        int b = Integer.parseInt(st.nextToken());
        bw.write(a + b + &quot;\n&quot;);

        bw.flush();
        bw.close();
        br.close();
    }
}&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>컴퓨터공학/Problem Solving</category>
      <author>_Bibidi</author>
      <guid isPermaLink="true">https://bibidi0.tistory.com/186</guid>
      <comments>https://bibidi0.tistory.com/186#entry186comment</comments>
      <pubDate>Mon, 12 Sep 2022 09:25:03 +0900</pubDate>
    </item>
    <item>
      <title>Linux 기본 환경 세팅 &amp;amp; 명령어</title>
      <link>https://bibidi0.tistory.com/177</link>
      <description>&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;20.04버전만 이런 건지 모르겠으나 기본적으로 깔려야 될 것 같은 프로그램들이 안 깔려있다. 특히 gcc는 왜 안 깔려있는지 의문 과제를 진행하다가 여러 명령어가 막혀서 정리한다.&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;sudo apt-get update : repository에 새로 추가된 패키지 등, 변경된 패키지 정보를 업데이트 한다.&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;sudo apt-get build-essential : 소스코드 빌드 시 필요한 기본적인 패키지를 설치한다. gcc, g++, make, perl 등의 각종 라이브러리들이 설치된다. apt show build-essential를 이용해 정보들을 볼 수 있다.&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;sudo apt-get install gcc-multilib : 32-bit 헤더와 라이브러리들을 다운로드 받는 명령어이다. CSAPP 과제를 진행하던 도중 bits/libc-header-start.h가 없다는 에러를 받았는데, 이게 32-bit와 관련된 헤더인가보다.&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;sudo apt-get install openssh-server : install package 명으로 package를 설치할 수 있다. 이 경우 openssh-server 패키지를 설치하라는 명령이다. openssh-server는 ssh를 통해 원격으로 접속하기 위해 설치해야 하는 패키지이다.&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;sudo ufw allow 22 : SSH 포트 22번 허용(=tcp/udp 22번 포트를 모두 허용)이라는 의미이다. UFW(Uncomplicated Firewall)은 다양한 리눅스 환경에서 작동하는 사용하기 쉬운 방화벽 관리 프로그램이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>컴퓨터공학/Linux</category>
      <author>_Bibidi</author>
      <guid isPermaLink="true">https://bibidi0.tistory.com/177</guid>
      <comments>https://bibidi0.tistory.com/177#entry177comment</comments>
      <pubDate>Tue, 30 Aug 2022 23:24:42 +0900</pubDate>
    </item>
  </channel>
</rss>