<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>Coding JOAH</title>
    <link>https://july7k.tistory.com/</link>
    <description>           </description>
    <language>ko</language>
    <pubDate>Thu, 7 May 2026 02:24:07 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>joah.k</managingEditor>
    <image>
      <title>Coding JOAH</title>
      <url>https://tistory1.daumcdn.net/tistory/4368662/attach/b72018a54d9643de959517ec09eae7d5</url>
      <link>https://july7k.tistory.com</link>
    </image>
    <item>
      <title>[Python] Mac 환경에서 파이썬 설치 방법</title>
      <link>https://july7k.tistory.com/245</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;&lt;b&gt;1. 파이썬 다운로드&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.python.org/downloads/macos/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.python.org/downloads/macos/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1703580741788&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;Python Releases for macOS&quot; data-og-description=&quot;The official home of the Python Programming Language&quot; data-og-host=&quot;www.python.org&quot; data-og-source-url=&quot;https://www.python.org/downloads/macos/&quot; data-og-url=&quot;https://www.python.org/downloads/macos/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bwlmea/hyUTF617mc/yxdK1DLz3TJnVzChGJtAQ0/img.png?width=200&amp;amp;height=200&amp;amp;face=0_0_200_200&quot;&gt;&lt;a href=&quot;https://www.python.org/downloads/macos/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.python.org/downloads/macos/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bwlmea/hyUTF617mc/yxdK1DLz3TJnVzChGJtAQ0/img.png?width=200&amp;amp;height=200&amp;amp;face=0_0_200_200');&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;Python Releases for macOS&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;The official home of the Python Programming Language&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.python.org&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1346&quot; data-origin-height=&quot;1156&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/d2wICR/btsCF7udy6p/5JjqRNLrqf3k6EklgKix3k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/d2wICR/btsCF7udy6p/5JjqRNLrqf3k6EklgKix3k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/d2wICR/btsCF7udy6p/5JjqRNLrqf3k6EklgKix3k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fd2wICR%2FbtsCF7udy6p%2F5JjqRNLrqf3k6EklgKix3k%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;1346&quot; height=&quot;1156&quot; data-origin-width=&quot;1346&quot; data-origin-height=&quot;1156&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; 너무 최신버전보다는 stable releases 버전을 선택한다.&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;b&gt;2. 다운받은 파일 실행&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1242&quot; data-origin-height=&quot;886&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/U86tR/btsCzKGRZDd/Oszeq5eGokp8iZo3B5uvSk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/U86tR/btsCzKGRZDd/Oszeq5eGokp8iZo3B5uvSk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/U86tR/btsCzKGRZDd/Oszeq5eGokp8iZo3B5uvSk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FU86tR%2FbtsCzKGRZDd%2FOszeq5eGokp8iZo3B5uvSk%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;1242&quot; height=&quot;886&quot; data-origin-width=&quot;1242&quot; data-origin-height=&quot;886&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1244&quot; data-origin-height=&quot;882&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ok4zk/btsCDd2x5vT/IUIUmuOmm8MHwHPefKB4u0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ok4zk/btsCDd2x5vT/IUIUmuOmm8MHwHPefKB4u0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ok4zk/btsCDd2x5vT/IUIUmuOmm8MHwHPefKB4u0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fok4zk%2FbtsCDd2x5vT%2FIUIUmuOmm8MHwHPefKB4u0%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;1244&quot; height=&quot;882&quot; data-origin-width=&quot;1244&quot; data-origin-height=&quot;882&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그냥 쭉쭉 선택 후 설치가 완료되면 파일들이 열린다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;610&quot; data-origin-height=&quot;494&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bw6XsE/btsCzEmhheP/bEqlA1YmB9r3jbSoZAyJOK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bw6XsE/btsCzEmhheP/bEqlA1YmB9r3jbSoZAyJOK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bw6XsE/btsCzEmhheP/bEqlA1YmB9r3jbSoZAyJOK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbw6XsE%2FbtsCzEmhheP%2FbEqlA1YmB9r3jbSoZAyJOK%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;610&quot; height=&quot;494&quot; data-origin-width=&quot;610&quot; data-origin-height=&quot;494&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;&lt;b&gt;3. 실행&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;--&amp;gt; IDLE.app 클릭하면 파이썬을 실행할 수 있다.&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-origin-width=&quot;1296&quot; data-origin-height=&quot;618&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ch1IaW/btsCzT4KzCY/AidQyitQAMkgA0LrBrxdqk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ch1IaW/btsCzT4KzCY/AidQyitQAMkgA0LrBrxdqk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ch1IaW/btsCzT4KzCY/AidQyitQAMkgA0LrBrxdqk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fch1IaW%2FbtsCzT4KzCY%2FAidQyitQAMkgA0LrBrxdqk%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;1296&quot; height=&quot;618&quot; data-origin-width=&quot;1296&quot; data-origin-height=&quot;618&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;626&quot; data-origin-height=&quot;74&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/oFnP0/btsCIE6lwhd/d7rDRnK52gnTOmjGr5wMe0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/oFnP0/btsCIE6lwhd/d7rDRnK52gnTOmjGr5wMe0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/oFnP0/btsCIE6lwhd/d7rDRnK52gnTOmjGr5wMe0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FoFnP0%2FbtsCIE6lwhd%2Fd7rDRnK52gnTOmjGr5wMe0%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;626&quot; height=&quot;74&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;626&quot; data-origin-height=&quot;74&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;</description>
      <category>Programming/Python</category>
      <category>mac python install</category>
      <category>맥북 파이썬</category>
      <category>파이썬 설치</category>
      <author>joah.k</author>
      <guid isPermaLink="true">https://july7k.tistory.com/245</guid>
      <comments>https://july7k.tistory.com/245#entry245comment</comments>
      <pubDate>Tue, 26 Dec 2023 18:11:42 +0900</pubDate>
    </item>
    <item>
      <title>백준 2588. 곱셈 (JAVA) -2</title>
      <link>https://july7k.tistory.com/244</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://july7k.tistory.com/213&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://july7k.tistory.com/213&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1700641714891&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;백준 2588. 곱셈 (JAVA)&quot; data-og-description=&quot;https://www.acmicpc.net/problem/2588 2588번: 곱셈 첫째 줄부터 넷째 줄까지 차례대로 (3), (4), (5), (6)에 들어갈 값을 출력한다. www.acmicpc.net 곱셈 시간 제한메모리 제한제출정답맞힌 사람정답 비율 1 초 128 MB&quot; data-og-host=&quot;july7k.tistory.com&quot; data-og-source-url=&quot;https://july7k.tistory.com/213&quot; data-og-url=&quot;https://july7k.tistory.com/213&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/dCu9RE/hyUyshleno/Dkb10lub6zPKpXsYVIwgDK/img.png?width=306&amp;amp;height=183&amp;amp;face=0_0_306_183,https://scrap.kakaocdn.net/dn/bJpKoU/hyUyAfjKOO/PdhAV4fcvmnT7zT5HO78IK/img.png?width=306&amp;amp;height=183&amp;amp;face=0_0_306_183,https://scrap.kakaocdn.net/dn/cajxIK/hyUyvylW7Q/PKEse6dkK8WQkNYA45eu3K/img.jpg?width=384&amp;amp;height=480&amp;amp;face=0_0_384_480&quot;&gt;&lt;a href=&quot;https://july7k.tistory.com/213&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://july7k.tistory.com/213&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/dCu9RE/hyUyshleno/Dkb10lub6zPKpXsYVIwgDK/img.png?width=306&amp;amp;height=183&amp;amp;face=0_0_306_183,https://scrap.kakaocdn.net/dn/bJpKoU/hyUyAfjKOO/PdhAV4fcvmnT7zT5HO78IK/img.png?width=306&amp;amp;height=183&amp;amp;face=0_0_306_183,https://scrap.kakaocdn.net/dn/cajxIK/hyUyvylW7Q/PKEse6dkK8WQkNYA45eu3K/img.jpg?width=384&amp;amp;height=480&amp;amp;face=0_0_384_480');&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;백준 2588. 곱셈 (JAVA)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;https://www.acmicpc.net/problem/2588 2588번: 곱셈 첫째 줄부터 넷째 줄까지 차례대로 (3), (4), (5), (6)에 들어갈 값을 출력한다. www.acmicpc.net 곱셈 시간 제한메모리 제한제출정답맞힌 사람정답 비율 1 초 128 MB&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;july7k.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;지난 문제 풀이 과정. 어쩌다 보니 다시 보게 되어 풀이법으로 풀어 보기로..&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;이번엔 char[] 배열에 저장하여 하나씩 처리하기로..&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1700641787517&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Beakjoon2588_2 {
    // 백준 2588. 곱셈
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int a = Integer.parseInt(br.readLine());
        char[] b = br.readLine().toCharArray();

        int sum =0;
        int su = 1;
        for(int i=2; i&amp;gt;=0; i--){
            int temp = Integer.parseInt(String.valueOf(b[i]));
            System.out.println(a*temp);
            sum += (a*temp)*su;
            su *= 10;
        }
        System.out.println(sum);
    }
}&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1150&quot; data-origin-height=&quot;428&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/YmHZJ/btsAMlm0nfO/kvRESi51NGwsx4j44sX1Ok/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/YmHZJ/btsAMlm0nfO/kvRESi51NGwsx4j44sX1Ok/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/YmHZJ/btsAMlm0nfO/kvRESi51NGwsx4j44sX1Ok/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FYmHZJ%2FbtsAMlm0nfO%2FkvRESi51NGwsx4j44sX1Ok%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;428&quot; data-origin-width=&quot;1150&quot; data-origin-height=&quot;428&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>알고리즘 문제풀이/Beakjoon</category>
      <category>백준 2588</category>
      <category>백준 2588 자바</category>
      <category>백준 알고리즘</category>
      <author>joah.k</author>
      <guid isPermaLink="true">https://july7k.tistory.com/244</guid>
      <comments>https://july7k.tistory.com/244#entry244comment</comments>
      <pubDate>Wed, 22 Nov 2023 17:32:24 +0900</pubDate>
    </item>
    <item>
      <title>Integer.parseInt()와 (int) 캐스팅 차이점</title>
      <link>https://july7k.tistory.com/243</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;Integer.parseInt() 와 (int) 캐스팅을 사용하면 int 형식으로 변환된다.&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;Integer.parseInt() 메소드는 &lt;b&gt;문자열&lt;/b&gt;을 인자로 받아 해당 문자열을 정수(int)로 변환한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어, &quot;123&quot;이라는 문자열을 123이라는 정수로 변환하는 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만약 문자열이 유효한 정수 형태가 아니라면 NumberFormatException을 발생시킨다.&lt;/p&gt;
&lt;pre id=&quot;code_1696569907906&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;String str = &quot;123&quot;;
int num = Integer.parseInt(str); // num은 123


// 문자 -&amp;gt; 숫자&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;br /&gt;(int)&amp;nbsp;캐스팅&amp;nbsp;연산자는&amp;nbsp;이미&amp;nbsp;&lt;b&gt;숫자형&amp;nbsp;데이터&lt;/b&gt;를&amp;nbsp;다른&amp;nbsp;숫자형으로&amp;nbsp;변환할&amp;nbsp;때&amp;nbsp;사용된다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를&amp;nbsp;들어,&amp;nbsp;double&amp;nbsp;형식의&amp;nbsp;123.45를&amp;nbsp;int&amp;nbsp;형식으로&amp;nbsp;캐스팅하면&amp;nbsp;소수점&amp;nbsp;이하&amp;nbsp;부분이&amp;nbsp;버려지고&amp;nbsp;123만&amp;nbsp;남게&amp;nbsp;된다.&lt;/p&gt;
&lt;pre id=&quot;code_1696569952078&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;double d = 123.45;
int num = (int)d; // num은 123, 소수점 이하 삭제


// 숫자 -&amp;gt; 숫자&lt;/code&gt;&lt;/pre&gt;</description>
      <category>Programming/Java</category>
      <category>parseInt 캐스팅 차이점</category>
      <author>joah.k</author>
      <guid isPermaLink="true">https://july7k.tistory.com/243</guid>
      <comments>https://july7k.tistory.com/243#entry243comment</comments>
      <pubDate>Fri, 6 Oct 2023 14:26:08 +0900</pubDate>
    </item>
    <item>
      <title>백준 10813. 공 바꾸기(Java)</title>
      <link>https://july7k.tistory.com/242</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/10813&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://www.acmicpc.net/problem/10813&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1694591495158&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;10813번: 공 바꾸기&quot; data-og-description=&quot;도현이는 바구니를 총 N개 가지고 있고, 각각의 바구니에는 1번부터 N번까지 번호가 매겨져 있다. 바구니에는 공이 1개씩 들어있고, 처음에는 바구니에 적혀있는 번호와 같은 번호가 적힌 공이 &quot; data-og-host=&quot;www.acmicpc.net&quot; data-og-source-url=&quot;https://www.acmicpc.net/problem/10813&quot; data-og-url=&quot;https://www.acmicpc.net/problem/10813&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bdmdBY/hyTSpFsGS1/F2ik2ANFQQc1Dpg2KxGpc0/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/10813&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.acmicpc.net/problem/10813&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bdmdBY/hyTSpFsGS1/F2ik2ANFQQc1Dpg2KxGpc0/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;10813번: 공 바꾸기&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;도현이는 바구니를 총 N개 가지고 있고, 각각의 바구니에는 1번부터 N번까지 번호가 매겨져 있다. 바구니에는 공이 1개씩 들어있고, 처음에는 바구니에 적혀있는 번호와 같은 번호가 적힌 공이&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;div style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;
&lt;div&gt;
&lt;h1 style=&quot;color: #585f69;&quot;&gt;&lt;span&gt;공 바꾸기&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/h1&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;
&lt;div&gt;시간 제한메모리 제한제출정답맞힌 사람정답 비율
&lt;table id=&quot;problem-info&quot; style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1 초&lt;/td&gt;
&lt;td&gt;256 MB&lt;/td&gt;
&lt;td&gt;34231&lt;/td&gt;
&lt;td&gt;22682&lt;/td&gt;
&lt;td&gt;20743&lt;/td&gt;
&lt;td&gt;67.025%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;problem-body&quot; style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;h2 style=&quot;color: #585f69;&quot; data-ke-size=&quot;size26&quot;&gt;문제&lt;/h2&gt;
&lt;/div&gt;
&lt;div id=&quot;problem_description&quot;&gt;
&lt;p style=&quot;color: #555555;&quot; data-ke-size=&quot;size16&quot;&gt;도현이는 바구니를 총 N개 가지고 있고, 각각의 바구니에는 1번부터 N번까지 번호가 매겨져 있다. 바구니에는 공이 1개씩 들어있고, 처음에는 바구니에 적혀있는 번호와 같은 번호가 적힌 공이 들어있다.&lt;/p&gt;
&lt;p style=&quot;color: #555555;&quot; data-ke-size=&quot;size16&quot;&gt;도현이는 앞으로 M번 공을 바꾸려고 한다. 도현이는 공을 바꿀 바구니 2개를 선택하고, 두 바구니에 들어있는 공을 서로 교환한다.&lt;/p&gt;
&lt;p style=&quot;color: #555555;&quot; data-ke-size=&quot;size16&quot;&gt;공을 어떻게 바꿀지가 주어졌을 때, M번 공을 바꾼 이후에 각 바구니에 어떤 공이 들어있는지 구하는 프로그램을 작성하시오.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;h2 style=&quot;color: #585f69;&quot; data-ke-size=&quot;size26&quot;&gt;입력&lt;/h2&gt;
&lt;/div&gt;
&lt;div id=&quot;problem_input&quot;&gt;
&lt;p style=&quot;color: #555555;&quot; data-ke-size=&quot;size16&quot;&gt;첫째 줄에 N (1 &amp;le; N &amp;le; 100)과 M (1 &amp;le; M &amp;le; 100)이 주어진다.&lt;/p&gt;
&lt;p style=&quot;color: #555555;&quot; data-ke-size=&quot;size16&quot;&gt;둘째 줄부터 M개의 줄에 걸쳐서 공을 교환할 방법이 주어진다. 각 방법은 두 정수 i j로 이루어져 있으며, i번 바구니와&amp;nbsp;j번 바구니에 들어있는 공을 교환한다는 뜻이다. (1 &amp;le; i &amp;le; j &amp;le; N)&lt;/p&gt;
&lt;p style=&quot;color: #555555;&quot; data-ke-size=&quot;size16&quot;&gt;도현이는 입력으로 주어진 순서대로 공을 교환한다.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;h2 style=&quot;color: #585f69;&quot; data-ke-size=&quot;size26&quot;&gt;출력&lt;/h2&gt;
&lt;/div&gt;
&lt;div id=&quot;problem_output&quot;&gt;
&lt;p style=&quot;color: #555555;&quot; data-ke-size=&quot;size16&quot;&gt;1번 바구니부터 N번 바구니에 들어있는 공의 번호를 공백으로 구분해 출력한다.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;h2 style=&quot;color: #585f69;&quot; data-ke-size=&quot;size26&quot;&gt;예제 입력 1&lt;span&gt;&amp;nbsp;&lt;/span&gt;복사&lt;/h2&gt;
&lt;/div&gt;
&lt;pre id=&quot;sample-input-1&quot; class=&quot;basic&quot; style=&quot;background-color: #f7f7f9; color: #333333;&quot;&gt;&lt;code&gt;5 4
1 2
3 4
1 4
2 2
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;h2 style=&quot;color: #585f69;&quot; data-ke-size=&quot;size26&quot;&gt;예제 출력 1&lt;span&gt;&amp;nbsp;&lt;/span&gt;복사&lt;/h2&gt;
&lt;/div&gt;
&lt;pre id=&quot;sample-output-1&quot; class=&quot;basic&quot; style=&quot;background-color: #f7f7f9; color: #333333;&quot;&gt;&lt;code&gt;3 1 4 2 5&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;풀이&lt;/b&gt; : 데이터를 바구니에 담아 위치를 바꾸는 문제&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1. 먼저 주어진 n,m을 입력받아 n 크기의 바구니를 만든다 .&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1694591722508&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());

        int n = Integer.parseInt(st.nextToken());
        int m = Integer.parseInt(st.nextToken());
        int temp = 0;
        int[] basket = new int[n];&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;&lt;b&gt;2. 바구니에 순서대로&amp;nbsp; 번호를 담는다. (1,2,3...n)&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1694591800563&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;        for (int i = 0; i &amp;lt; n; i++) {
            basket[i] = i + 1;
}&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;&lt;b&gt;3. m번 만큼 공을 교환한다.&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp;임시로 숫자를 받을 temp 를 사용하여 바구니 속 데이터를 바꾼다.&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1694591875356&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;for (int j = 0; j &amp;lt; m; j++) {
            StringTokenizer st1 = new StringTokenizer(br.readLine());

            int a = Integer.parseInt(st1.nextToken());
            int b = Integer.parseInt(st1.nextToken());

            temp = basket[a-1];
            basket[a-1] = basket[b-1];
            basket[b-1] = temp;
        }&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;&lt;b&gt;4. 바구니를 출력&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1694591899388&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;	for(int i=0; i&amp;lt;basket.length; i++){
            System.out.print(basket[i] + &quot; &quot;);
        }&lt;/code&gt;&lt;/pre&gt;</description>
      <category>알고리즘 문제풀이/Beakjoon</category>
      <category>beakjoon 10813 java</category>
      <category>백준 10813</category>
      <category>백준 공 바꾸기</category>
      <category>알고리즘</category>
      <author>joah.k</author>
      <guid isPermaLink="true">https://july7k.tistory.com/242</guid>
      <comments>https://july7k.tistory.com/242#entry242comment</comments>
      <pubDate>Wed, 13 Sep 2023 17:00:08 +0900</pubDate>
    </item>
    <item>
      <title>Apache Struts 의 특징 및 Spring 과의 차이점</title>
      <link>https://july7k.tistory.com/240</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;지금은 잘 안 쓰이지만.. 프로젝트를 하면서 어쩔 수 없이 Struts 를 다뤄야 했다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 Sturuts에 대해 정리하고, 더 나아가 대세로 자리매김한(?) 자바 프레임워크인 Sping과 비교해보고자 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&amp;nbsp;Struts 프레임워크 특징&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Struts 프레임워크는 Apache 사에서 개발한 Java 웹 애플리케이션을 개발하기 위한 오픈소스 프레임워크이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;크게 3가지 특징을 정리해보자면&amp;nbsp;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal; background-color: #f2f7ff; color: #505567; text-align: left;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;MVC 방식&amp;nbsp;&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;MVC 아키텍처는 Model-View-Controller의 약자로서, 애플리케이션에서 데이터, UI, 제어 로직 등을 분리하여 개발하는 방식이다. 이렇게 분리함으로써 유지보수가 용이하고, 여러 사람이 같이 개발하는 경우 코드 관리가 편해진다는 이점이 있다. 아파치 스트러츠 역시 이러한 MVC 아키텍처 방식으로 구성된다.&lt;br /&gt;&lt;br /&gt;ex) 상품 list를 보여주는 페이지 구성 시 : Model(데이터 처리)-View(화면 표시)-Controller(페이지 전환 및 요청 처리)를 분리하여 작성한다.&amp;nbsp;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;태그 라이브러리의 사용&amp;nbsp;&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;태그 라이브러리는 JSP에서 뷰를 구현하기 위한 태그들의 모음이다. 스트러츠에서는 JSP 내에서 HTML태그와 함께 스트러츠 태그를 사용할 수 있는데, 스트러츠 태그는 JSP 내에서 자바 코드 없이도 폼 처리, 데이터베이스 연동, 오픈소스 자바스크립트 라이브러리와의 연동 등 다양한 기능을 제공한다.&amp;nbsp;&lt;br /&gt;&lt;br /&gt;ex) HTML 태그 라이브러리, Beans 태그 라이브러리 (자바 Bean), Logic 태그 라이브러리 (iterate, present...), 네스티드(Nested) 태그 라이브러리, 템플릿(Titles) 라이브러리 등&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;액션클래스-앤션 매핑&amp;nbsp;&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;스트러츠의 핵심은 액션 클래스라고 할 수 있다. 액션 클래스는 사용자 요청을 처리하고, 결과를 반환한다. &lt;br /&gt;이 때, 액션 클래스와 URL을 매핑해주어야 하는데, 이를 위해 아파치 스트러츠에서는 XML 설정 파일을 사용하여 액션 클래스를 매핑 설정 한다.&amp;nbsp;&lt;br /&gt;&lt;br /&gt;ex) 상품 list 조회, 상품 상세 보기 조회, 주문 처리 등 각각의 Action 클래스를 작성 후 구현한 Action 클래스와 URL 매핑을 위해 struts.xml 파일에 등록하여 요청과 응답 처리&amp;nbsp;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;pre id=&quot;code_1690699274773&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;!-- 로그인 처리를 위한 액션 클래스 매핑 --&amp;gt;
        &amp;lt;action name=&quot;login&quot; class=&quot;com.example.actions.LoginAction&quot;&amp;gt;
            &amp;lt;result name=&quot;success&quot;&amp;gt;/welcome.jsp&amp;lt;/result&amp;gt;
            &amp;lt;result name=&quot;error&quot;&amp;gt;/loginError.jsp&amp;lt;/result&amp;gt;
        &amp;lt;/action&amp;gt;&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;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;Struts 에서 Spring 으로의 이동&amp;nbsp;&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/blockquote&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;span style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;Struts 프레임워크는 기술발전이나 채택이 감소하고 있으며 현재는 Spring 프레임워크가 더 널리 쓰이고 있다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;Spring 프레임워크와 비교했을 때 몇몇 부분에서 Struts는 다음과 같은 제약 사항이나 부족한 부분이 있었다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal; background-color: #f2f7ff; color: #505567; text-align: left;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;유연성 및 확장성: &lt;/b&gt;&lt;br /&gt;Struts는 전통적으로 &lt;b&gt;단일 컨트롤러&lt;/b&gt;를 이용한 구조를 가지고 있기 때문에, 구현과 관련된 일부 설정과 코드 부분이 서로 강하게 결합 될 수 있다. -&amp;gt; 유연성과 확장성이 Spring과 비교했을 때 상대적으로 떨어질 수 있다.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;통합 환경: &lt;/b&gt;&lt;br /&gt;Struts는 &lt;b&gt;주로 웹 계층을 위한 MVC 프레임워크로&lt;/b&gt;서 사용되며, Spring 과 같은 전체적인 통합 환경을 제공하지는 않는다. 반면 Spring은 웹 뿐만 아니라 자바 어플리케이션에도 특화된 프레임워크로서 웹 환경 이상으로 범위가 더 넓다. Struts를 사용하기 위해선 데이터베이스 처리, 보안, 트랜잭션 관리 등 다양한 기능을 위해 다른 프레임워크나 라이브러리와 함께 사용해야 하는 불편함이 존재했다.&amp;nbsp;&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;계층화된 서비스 구조: &lt;/b&gt;&lt;br /&gt;Struts는 웹 애플리케이션 개발에 초점을 맞추어, Spring 만큼 세분화된 계층화된 서비스 구조 보다는 &lt;b&gt;Action 클래스를 기반&lt;/b&gt;으로 한 비즈니스 로직 처리를 위주로 설정된다. -&amp;gt; 비즈니스 로직이 복잡해지면 관리가 어려울 수 있다.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;강제성&lt;/b&gt; : &lt;br /&gt;Struts의 경우, 개발자들이 프레임워크에서 정의한 정해진 규칙에 따라 코드를 작성해야 한다. 하지만 Spring은 프레임워크 자체에서 정의된 강제성이 작아 개발자들이 필요한 방식으로 코드를 작성할 수 있는 유연한 구조를 가지고 있다.&amp;nbsp;&lt;/li&gt;
&lt;/ol&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; color: #000000; text-align: start;&quot;&gt;이러한 부족점들 때문에 Spring을 채택하는 경우가 늘었고 Struts로 새로운 프로젝트를 하는 경우는 거의 없다고 한다...... ^..^&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 고도화를 할 생각이 없는 어떤 회사를 위하여.. Struts 를 공부하긴 해야겠다 ㅠ&amp;nbsp;&lt;/p&gt;</description>
      <category>Programming/Spring</category>
      <category>strusts 특징</category>
      <category>struts spring 차이</category>
      <category>struts 개념</category>
      <category>스트럿츠</category>
      <category>아파치 스트럿츠</category>
      <author>joah.k</author>
      <guid isPermaLink="true">https://july7k.tistory.com/240</guid>
      <comments>https://july7k.tistory.com/240#entry240comment</comments>
      <pubDate>Sun, 30 Jul 2023 15:43:45 +0900</pubDate>
    </item>
    <item>
      <title>백준 5356. Triangles (Java)</title>
      <link>https://july7k.tistory.com/239</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/5356&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://www.acmicpc.net/problem/5356&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1690030513881&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;5356번: Triangles&quot; data-og-description=&quot;Read in a letter and a number. The number indicates how big the letter triangle should be. The number indicating the size of the triangle will have a range from 0 to 250 (i.e., num&amp;gt;=0 and num&amp;lt;=250). The letters must wrap around from Z to A. If you start wi&quot; data-og-host=&quot;www.acmicpc.net&quot; data-og-source-url=&quot;https://www.acmicpc.net/problem/5356&quot; data-og-url=&quot;https://www.acmicpc.net/problem/5356&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/c2u8gr/hyTnSBxV2Z/DCbG4WryNFIpEKu1E5Br4K/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/5356&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.acmicpc.net/problem/5356&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/c2u8gr/hyTnSBxV2Z/DCbG4WryNFIpEKu1E5Br4K/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;5356번: Triangles&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Read in a letter and a number. The number indicates how big the letter triangle should be. The number indicating the size of the triangle will have a range from 0 to 250 (i.e., num&amp;gt;=0 and num&amp;lt;=250). The letters must wrap around from Z to A. If you start wi&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;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;
&lt;div&gt;
&lt;h1 style=&quot;color: #585f69;&quot;&gt;&lt;span&gt;Triangles&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #777777; color: #ffffff; text-align: center;&quot;&gt;다국어&lt;/span&gt;&lt;/h1&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;
&lt;div&gt;시간 제한메모리 제한제출정답맞힌 사람정답 비율
&lt;table id=&quot;problem-info&quot; style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1 초&lt;/td&gt;
&lt;td&gt;128 MB&lt;/td&gt;
&lt;td&gt;236&lt;/td&gt;
&lt;td&gt;176&lt;/td&gt;
&lt;td&gt;159&lt;/td&gt;
&lt;td&gt;79.500%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;problem-body&quot; style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;h2 style=&quot;color: #585f69;&quot; data-ke-size=&quot;size26&quot;&gt;문제&lt;/h2&gt;
&lt;/div&gt;
&lt;div id=&quot;problem_description&quot;&gt;
&lt;p style=&quot;color: #555555;&quot; data-ke-size=&quot;size16&quot;&gt;Read in a letter and a number. The number indicates how big the letter triangle should be. The number indicating the size of the triangle will have a range from 0 to 250 (i.e., num&amp;gt;=0 and num&amp;lt;=250).&lt;/p&gt;
&lt;p style=&quot;color: #555555;&quot; data-ke-size=&quot;size16&quot;&gt;The letters must wrap around from Z to A. If you start with Z and have to print 5 levels, you must wrap around and start with A after the Z level is complete.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;h2 style=&quot;color: #585f69;&quot; data-ke-size=&quot;size26&quot;&gt;입력&lt;/h2&gt;
&lt;/div&gt;
&lt;div id=&quot;problem_input&quot;&gt;
&lt;p style=&quot;color: #555555;&quot; data-ke-size=&quot;size16&quot;&gt;The first number indicates the number of data sets to follow. Each data set will contain one letter and one number. All letter input will be uppercase.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;h2 style=&quot;color: #585f69;&quot; data-ke-size=&quot;size26&quot;&gt;출력&lt;/h2&gt;
&lt;/div&gt;
&lt;div id=&quot;problem_output&quot;&gt;
&lt;p style=&quot;color: #555555;&quot; data-ke-size=&quot;size16&quot;&gt;Print out the letter triangles in the order given. There is one blank line between each letter triangle.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;h2 style=&quot;color: #585f69;&quot; data-ke-size=&quot;size26&quot;&gt;예제 입력 1&lt;span&gt;&amp;nbsp;&lt;/span&gt;복사&lt;/h2&gt;
&lt;/div&gt;
&lt;pre id=&quot;sample-input-1&quot; class=&quot;basic&quot; style=&quot;background-color: #f7f7f9; color: #333333;&quot;&gt;&lt;code&gt;3
5 A
3 Z
4 C
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;h2 style=&quot;color: #585f69;&quot; data-ke-size=&quot;size26&quot;&gt;예제 출력 1&lt;span&gt;&amp;nbsp;&lt;/span&gt;복사&lt;/h2&gt;
&lt;/div&gt;
&lt;pre id=&quot;sample-output-1&quot; class=&quot;armasm&quot; style=&quot;background-color: #f7f7f9; color: #333333;&quot;&gt;&lt;code&gt;A
BB
CCC
DDDD
EEEEE

Z
AA
BBB

C
DD
EEE
FFFF
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;풀이 :&lt;/b&gt;&lt;/p&gt;
&lt;div style=&quot;color: #505567; text-align: justify;&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;알파벳과 숫자를 입력받아, 주어진 알파벳부터 시작해서 삼각형 모양으로 줄마다 1개씩 증가하는 개수만큼 알파벳을 차례대로 출력하고, 'Z' 다음에는 'A'부터 다시 시작하는 문제.&amp;nbsp;&lt;br /&gt;&lt;br /&gt;삼각형 모양 반복문이야 익숙하고, 이 문제에서 생각할 것은 2 가지.&amp;nbsp;&lt;br /&gt;&lt;br /&gt;1) 주어진 알파벳으로부터 이어지는 알파벳 구하기 : A-&amp;gt;B-&amp;gt;C...&amp;nbsp;&lt;br /&gt;2) 알파벳의 시작과 끝 처리 : A~Z의 반복, Z 다음엔 A가 나와야 함&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;pre id=&quot;code_1690030769200&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public class Beakjoon5356 {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int t = Integer.parseInt(br.readLine());

        for(int i=0; i&amp;lt;t; i++) {
            StringTokenizer st = new StringTokenizer(br.readLine());
            int n = Integer.parseInt(st.nextToken());
            char alphabet = st.nextToken().charAt(0); // 시작 문자열

            for (int j = 0; j &amp;lt; n; j++) {
                for (int k = 0; k &amp;lt;= j; k++) 
                
                    // 알파벳 출력 부분 
                    
                    System.out.print((char) ((alphabet - 'A' + j) % 26 + 'A'));
                }
                System.out.println();
            }
            // Print a blank line between letter triangles
            if (i &amp;lt; t - 1) {
                System.out.println();
            }
        }
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;div style=&quot;color: #000000; text-align: justify;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;color: #000000; text-align: justify;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 반복에 맞게 알파벳을 출력하는 부분을 작성해야 하는데 단계별로 풀어보자면...&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 알파벳 처리 : 입력받은 문자 alphabet 에서 'A' 를 뺀다. &lt;br /&gt;자바에서는 내부적으로 숫자 값으로 저장되므로 이렇게 하면 'A'로 부터 몇 번째 알파벳인지 알 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; ex) 'B'-'A'=1, 'C'-'A'=2&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. alphabet - 'A' + j : 입력받은 문자열로부터 ~ 증가하는 변수인 j를 더한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; ex) B 부터 시작,&amp;nbsp; j 가 2 까지일 때&amp;nbsp; B로부터 2개 증가한 알파벳을 구함&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. Z-&amp;gt;A 설정 : 알파벳은 총 26자이다. (&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;alphabet - 'A' + j)%26 을 해서 A부터 Z 까지만 반복되도록 설정&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;4.&amp;nbsp; &amp;nbsp;(&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;(&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;alphabet - 'A' + j)%26&lt;span&gt; ) + 'A' : 실제 출력할 대문자 알파벳을 구함&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp; ex)&amp;nbsp; 예를 들어 j=1, 입력값 alphabet='A'이라 가정 한다면 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;alphabet - 'A' + j)%26&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;)의 계산 결과는 1 이 된다. &lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 이 값에 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;아스키 코드 65인 'A'를 더하면 새로운 문자 'B'(아스키 코드 66) 이 된다.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;5. 그리고 형변환을 통해 숫자로 입력된 알파벳을 문자로 변환&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&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;&amp;nbsp;&lt;/p&gt;</description>
      <category>알고리즘 문제풀이/Beakjoon</category>
      <category>백준 5356</category>
      <category>백준 5656 triangles</category>
      <category>백준 알고리즘</category>
      <author>joah.k</author>
      <guid isPermaLink="true">https://july7k.tistory.com/239</guid>
      <comments>https://july7k.tistory.com/239#entry239comment</comments>
      <pubDate>Sat, 22 Jul 2023 22:15:36 +0900</pubDate>
    </item>
    <item>
      <title>Error handling response: TypeError: Cannot read properties of undefined (reading 'always')  원인과 해결 방법</title>
      <link>https://july7k.tistory.com/238</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1468&quot; data-origin-height=&quot;296&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dP0HEj/btsdKjzSAGn/CJd0OUKQg2oTCP2QvwIq60/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dP0HEj/btsdKjzSAGn/CJd0OUKQg2oTCP2QvwIq60/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dP0HEj/btsdKjzSAGn/CJd0OUKQg2oTCP2QvwIq60/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdP0HEj%2FbtsdKjzSAGn%2FCJd0OUKQg2oTCP2QvwIq60%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;1468&quot; height=&quot;296&quot; data-origin-width=&quot;1468&quot; data-origin-height=&quot;296&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;처음엔 에러 처리가 문제인가? 싶어서 try-catch 문도 추가해보고 그랬는데&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;chrome-extension이라 써있는 걸로 보아, 크롬 확장 기능 때문에 생긴 문제로 보인다.&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;구글링 해보니 drag free 확장 기능 때문에 생긴 문제라고 한다.&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;</description>
      <category>Programming/JS +</category>
      <category>chrome extention error</category>
      <category>Error handling response: TypeError: Cannot read properties of undefined (reading 'always')</category>
      <category>크롬 에러</category>
      <author>joah.k</author>
      <guid isPermaLink="true">https://july7k.tistory.com/238</guid>
      <comments>https://july7k.tistory.com/238#entry238comment</comments>
      <pubDate>Wed, 3 May 2023 16:23:03 +0900</pubDate>
    </item>
    <item>
      <title>백준 4740. 거울, 오! 거울(JAVA)</title>
      <link>https://july7k.tistory.com/237</link>
      <description>&lt;p style=&quot;color: #555555;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/4740&quot;&gt;https://www.acmicpc.net/problem/4740&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1683015126639&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;4740번: 거울, 오! 거울&quot; data-og-description=&quot;하나 또는 그 이상의 줄에 각각&amp;nbsp;ASCII 글자로 나타낼 수 있는 단어들(알파벳, 숫자, 공백, 구두점 등)로 구성된 문장을&amp;nbsp;입력한다. 각 문장은 최소 1글자에서 최대 80글자로 이루어져 있으며,&amp;nbsp;***을 &quot; data-og-host=&quot;www.acmicpc.net&quot; data-og-source-url=&quot;https://www.acmicpc.net/problem/4740&quot; data-og-url=&quot;https://www.acmicpc.net/problem/4740&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/AV8Aa/hyRBNogdXS/LtWnbYe7Frm3sakkyHqBf0/img.png?width=2834&amp;amp;height=1480&amp;amp;face=0_0_2834_1480&quot;&gt;&lt;a style=&quot;color: #000000;&quot; href=&quot;https://www.acmicpc.net/problem/4740&quot; data-source-url=&quot;https://www.acmicpc.net/problem/4740&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/AV8Aa/hyRBNogdXS/LtWnbYe7Frm3sakkyHqBf0/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; style=&quot;color: #000000;&quot; data-ke-size=&quot;size16&quot;&gt;4740번: 거울, 오! 거울&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; style=&quot;color: #909090;&quot; data-ke-size=&quot;size16&quot;&gt;하나 또는 그 이상의 줄에 각각&amp;nbsp;ASCII 글자로 나타낼 수 있는 단어들(알파벳, 숫자, 공백, 구두점 등)로 구성된 문장을&amp;nbsp;입력한다. 각 문장은 최소 1글자에서 최대 80글자로 이루어져 있으며,&amp;nbsp;***을&lt;/p&gt;
&lt;p class=&quot;og-host&quot; style=&quot;color: #909090;&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 style=&quot;color: #555555;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;h1 style=&quot;color: #000000;&quot;&gt;&lt;span&gt;거울, 오! 거울&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/h1&gt;
&lt;div&gt;&lt;span&gt;한국어&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;시간 제한메모리 제한제출정답맞힌 사람정답 비율
&lt;table id=&quot;problem-info&quot; style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1 초&lt;/td&gt;
&lt;td&gt;128 MB&lt;/td&gt;
&lt;td&gt;2224&lt;/td&gt;
&lt;td&gt;1272&lt;/td&gt;
&lt;td&gt;1151&lt;/td&gt;
&lt;td&gt;61.354%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;problem-body&quot;&gt;
&lt;div style=&quot;color: #333333; text-align: start;&quot;&gt;
&lt;div&gt;
&lt;h2 style=&quot;color: #000000;&quot; data-ke-size=&quot;size26&quot;&gt;문제&lt;/h2&gt;
&lt;/div&gt;
&lt;div id=&quot;problem_description&quot;&gt;
&lt;p style=&quot;color: #555555;&quot; data-ke-size=&quot;size16&quot;&gt;근하와 세용이는 주차장에서 자신들의 차 뒤에 주차된 구급차에 쓰여있는 ECNALUBMA라는 알&amp;nbsp;수없는&amp;nbsp;글자를 보고 갸우뚱하였다. 그리고&amp;nbsp;그들이 차에 탄 뒤 백미러를 통해 보고서야 그 글자가&amp;nbsp;AMBULANCE라는 것이였음을 알고는 웃음을 참을 수 없었다.&lt;/p&gt;
&lt;p style=&quot;color: #555555;&quot; data-ke-size=&quot;size16&quot;&gt;근하와 세용이는 뒤늦게서야 각각의 문자의 위치가 거꾸로 되어버린&amp;nbsp;이 글자들을&amp;nbsp;자신들도 모르는 사이에&amp;nbsp;머릿속에서&amp;nbsp;올바른 글자가 되도록 수정작업을 하며 애를 쓰고&amp;nbsp;있었음을&amp;nbsp;깨달았다.&lt;/p&gt;
&lt;p style=&quot;color: #555555;&quot; data-ke-size=&quot;size16&quot;&gt;이 경험을 통해&amp;nbsp;흥미를&amp;nbsp;가지게 된&amp;nbsp;근하와 세용이는,&amp;nbsp;문장을 입력하면&amp;nbsp;입력한 문장의 개별 단어들을 역순으로 배치하여 거꾸로 바뀐 문장을&amp;nbsp;출력하는 프로그램을 만들어&amp;nbsp;'거울&amp;nbsp;읽기'&amp;nbsp;연습을 하려고 마음먹었다.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div style=&quot;color: #333333; text-align: start;&quot;&gt;
&lt;div&gt;
&lt;h2 style=&quot;color: #000000;&quot; data-ke-size=&quot;size26&quot;&gt;입력&lt;/h2&gt;
&lt;/div&gt;
&lt;div id=&quot;problem_input&quot;&gt;
&lt;p style=&quot;color: #555555;&quot; data-ke-size=&quot;size16&quot;&gt;하나 또는 그 이상의 줄에 각각&amp;nbsp;ASCII 글자로 나타낼 수 있는 단어들(알파벳, 숫자, 공백, 구두점 등)로 구성된 문장을&amp;nbsp;입력한다.&lt;/p&gt;
&lt;p style=&quot;color: #555555;&quot; data-ke-size=&quot;size16&quot;&gt;각 문장은 최소 1글자에서 최대 80글자로 이루어져 있으며,&amp;nbsp;***을 입력하면 프로그램이 종료된다.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div style=&quot;color: #333333; text-align: start;&quot;&gt;
&lt;div&gt;
&lt;h2 style=&quot;color: #000000;&quot; data-ke-size=&quot;size26&quot;&gt;출력&lt;/h2&gt;
&lt;/div&gt;
&lt;div id=&quot;problem_output&quot;&gt;
&lt;p style=&quot;color: #555555;&quot; data-ke-size=&quot;size16&quot;&gt;한 문장의 입력이 끝난 뒤&amp;nbsp;바로 입력한&amp;nbsp;문장의 글자들이&amp;nbsp;역순으로 바뀌어 배치된 문장을&amp;nbsp;출력한다.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div style=&quot;color: #333333; text-align: start;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;h2 style=&quot;color: #585f69;&quot; data-ke-size=&quot;size26&quot;&gt;예제 입력 1&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/h2&gt;
&lt;/div&gt;
&lt;pre id=&quot;sample-output-1&quot; class=&quot;ada&quot; style=&quot;background-color: #f7f7f9; color: #333333;&quot;&gt;&lt;code&gt;ECNALUBMA
naivE
mada m'i ,madam&lt;/code&gt;&lt;/pre&gt;
&lt;div style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;
&lt;div&gt;
&lt;h2 style=&quot;color: #585f69;&quot; data-ke-size=&quot;size26&quot;&gt;예제 출력 1&lt;/h2&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;pre id=&quot;sample-input-1&quot; class=&quot;ada&quot; style=&quot;background-color: #f7f7f9; color: #333333;&quot;&gt;&lt;code&gt;AMBULANCE Evian madam, i'm adam ***&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;풀이&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;: 문자열을 뒤집는 문제.&lt;/p&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;메소드 없이 for문으로 문자열을 받아 거꾸로 출력하는 방법,&lt;/p&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;그리고 StringBuffer 클래스의 reverse() 메소드를 이용하여 출력하는 방법 두 가지를 사용했다.&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;다음과 같이 StringBuffer를 사용하여 푼 것이 속도가 30초 정도 빠르다!&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; 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-origin-width=&quot;982&quot; data-origin-height=&quot;336&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/QFHaH/btsdGPR7nyl/ekBrkJf791sRPj0dfBgtkk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/QFHaH/btsdGPR7nyl/ekBrkJf791sRPj0dfBgtkk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/QFHaH/btsdGPR7nyl/ekBrkJf791sRPj0dfBgtkk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FQFHaH%2FbtsdGPR7nyl%2FekBrkJf791sRPj0dfBgtkk%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;982&quot; height=&quot;336&quot; data-origin-width=&quot;982&quot; data-origin-height=&quot;336&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div style=&quot;color: #333333; text-align: start;&quot;&gt;
&lt;p style=&quot;color: #555555;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;gt;&amp;gt; StringBuffer 클래스의 reverse() 메소드를 사용한 풀이&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1683015224411&quot; class=&quot;java&quot; style=&quot;background-color: #000000; color: #000000;&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main {
    // 백준 4740. 거울, 오! 거울
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        while (true) {
            String s = br.readLine();
            if (&quot;***&quot;.equals(s)) break;

            StringBuffer sb = new StringBuffer(s); // 문자열 그대로 받기
            System.out.println(sb.reverse()); // reverse() 메소드 사용 
        }
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #555555;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #555555;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #555555;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;gt;&amp;gt; for문 이용 풀이&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1683015224414&quot; class=&quot;processing&quot; style=&quot;background-color: #000000; color: #000000;&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main {
    // 백준 4740. 거울, 오! 거울
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        while (true){
            String s = br.readLine();
            if(&quot;***&quot;.equals(s)) break;

            String reverse = &quot;&quot;;
            for(int i=s.length()-1; i&amp;gt;=0; i--){
                reverse = reverse + s.charAt(i);
            }
            System.out.println(reverse);

        }
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;div style=&quot;color: #333333; text-align: start;&quot;&gt;
&lt;div id=&quot;reaction-217&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;</description>
      <category>알고리즘 문제풀이/Beakjoon</category>
      <category>java 문자열 뒤집기</category>
      <category>백준 4740</category>
      <category>백준 4740 자바</category>
      <author>joah.k</author>
      <guid isPermaLink="true">https://july7k.tistory.com/237</guid>
      <comments>https://july7k.tistory.com/237#entry237comment</comments>
      <pubDate>Tue, 2 May 2023 17:15:00 +0900</pubDate>
    </item>
    <item>
      <title>[Node.js] 기초 개념</title>
      <link>https://july7k.tistory.com/183</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;gt;&amp;gt; Node.js란?&amp;nbsp;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Node.js는 &lt;b&gt;서버&lt;/b&gt; 측 자바스크립트 실행 플랫폼이다.&amp;nbsp;&amp;nbsp;php, .net, jsp 등의 서버 사이드 플랫폼과 같다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Node.js는 &lt;b&gt;이벤트 기반, 비동기식 I/O 모델&lt;/b&gt;을 사용하여 가볍고 효율적인 서버 측 애플리케이션을 만드는 데 사용된다.&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;gt;&amp;gt; 비동기 처리 방식&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Node.js는 비동기 처리 방식이란?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Node.js가 I/O 작업을 수행할 때 다음 작업을 기다리지 않고 다른 작업을 수행할 수 있다는 것을 의미한다. 이 방식은 애플리케이션의 성능을 향상시키고 더 많은 요청을 처리할 수 있도록 한다.&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;gt;&amp;gt; 콜백 함수&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Node.js에서 콜백 함수는 비동기 함수가 &lt;b&gt;완료될 때&lt;/b&gt; 실행되는 함수.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;콜백 함수를 사용하여 비동기 함수의 결과를 처리하거나 오류를 처리할 수 있고 Node.js에서 &lt;b&gt;비동기 작업&lt;/b&gt;을 수행할 수 있게된다.&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;gt;&amp;gt;  NPM (Node Packaged Modules)&amp;nbsp;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Node.js로 만들어진 모듈을 인터넷에서 받아서 설치해주는 패키지 매니저.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Node.js의 모듈은 진짜.. 엄청나게 많다. NPM을 이용함으로서 여러 기능들을 편리하게 이용할 수 있다.&amp;nbsp;&lt;/p&gt;</description>
      <category>Programming/JS +</category>
      <category>js서버</category>
      <category>nodejs</category>
      <category>nodejs 기초</category>
      <author>joah.k</author>
      <guid isPermaLink="true">https://july7k.tistory.com/183</guid>
      <comments>https://july7k.tistory.com/183#entry183comment</comments>
      <pubDate>Sun, 30 Apr 2023 16:46:31 +0900</pubDate>
    </item>
    <item>
      <title>Node.js 기반 뉴스 크롤링 페이지에 요약 기능 추가하기 (with OpenAI)_실패의 기록</title>
      <link>https://july7k.tistory.com/235</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;Node는 확장성이 좋아서 재미있다 !&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; 이번엔 ChatGPT 를 개발한 OpenAI 사의 API 를 가지고 뉴스 요약 기능을 추가해보기로 함.&lt;/p&gt;
&lt;figure id=&quot;og_1683271148236&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot; Node.js를 이용한 뉴스 기사 크롤링 방법&quot; data-og-description=&quot;Node.js 를 이용하여 뉴스 기사를 크롤링해서 웹 페이지에 가져오자! 1. Node.js와 관련된 패키지 설치 서버 구축을 위해 NPM을 통해 패키지를 설치한다. # NPM NPM은 Node.js와 관련한 여러 패키지들을 설&quot; data-og-host=&quot;july7k.tistory.com&quot; data-og-source-url=&quot;https://july7k.tistory.com/217&quot; data-og-url=&quot;https://july7k.tistory.com/217&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/1czFU/hyStKxGQM7/xmQAgmwNUw2H4bKTBHqkTK/img.png?width=800&amp;amp;height=152&amp;amp;face=0_0_800_152,https://scrap.kakaocdn.net/dn/GyBeY/hyStUG3N3e/25bJJSBr9eKOibxNz2nWd1/img.png?width=800&amp;amp;height=152&amp;amp;face=0_0_800_152,https://scrap.kakaocdn.net/dn/jyPSV/hySvutcSwx/WI2kTVFFCjld4t2mFyvk1k/img.png?width=954&amp;amp;height=520&amp;amp;face=0_0_954_520&quot;&gt;&lt;a style=&quot;color: #000000;&quot; href=&quot;https://july7k.tistory.com/217&quot; data-source-url=&quot;https://july7k.tistory.com/217&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/1czFU/hyStKxGQM7/xmQAgmwNUw2H4bKTBHqkTK/img.png?width=800&amp;amp;height=152&amp;amp;face=0_0_800_152,https://scrap.kakaocdn.net/dn/GyBeY/hyStUG3N3e/25bJJSBr9eKOibxNz2nWd1/img.png?width=800&amp;amp;height=152&amp;amp;face=0_0_800_152,https://scrap.kakaocdn.net/dn/jyPSV/hySvutcSwx/WI2kTVFFCjld4t2mFyvk1k/img.png?width=954&amp;amp;height=520&amp;amp;face=0_0_954_520');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; style=&quot;color: #000000;&quot; data-ke-size=&quot;size16&quot;&gt; Node.js를 이용한 뉴스 기사 크롤링 방법&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; style=&quot;color: #909090;&quot; data-ke-size=&quot;size16&quot;&gt;Node.js 를 이용하여 뉴스 기사를 크롤링해서 웹 페이지에 가져오자! 1. Node.js와 관련된 패키지 설치 서버 구축을 위해 NPM을 통해 패키지를 설치한다. # NPM NPM은 Node.js와 관련한 여러 패키지들을 설&lt;/p&gt;
&lt;p class=&quot;og-host&quot; style=&quot;color: #909090;&quot; data-ke-size=&quot;size16&quot;&gt;july7k.tistory.com&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;p data-ke-size=&quot;size16&quot;&gt;하지만 &lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;실패의 기록&lt;/b&gt;&lt;/span&gt;이므로 혹시나 검색에 걸려 들어오셨다면 참고만...하시길&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;1.&amp;nbsp; OpenAI API 사용 준비 - Key 발급&lt;/b&gt;&lt;/h3&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;- &lt;span style=&quot;background-color: #ffffff; color: #1b2e46; text-align: start;&quot;&gt;API 키를 발급 받으려면 먼저 OpenAI에서 회원이어야 하는데, 나는 ChatGPT를 사용하기에 이미 계정이 있었다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #1b2e46; text-align: start;&quot;&gt;- 우측 상단의 프로필을 클릭하여 [View API Keys] 메뉴 클릭&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1384&quot; data-origin-height=&quot;1182&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/RsUvu/btsdXJXPYje/80ag4NRD6Z7O35a03ZQnYk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/RsUvu/btsdXJXPYje/80ag4NRD6Z7O35a03ZQnYk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/RsUvu/btsdXJXPYje/80ag4NRD6Z7O35a03ZQnYk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FRsUvu%2FbtsdXJXPYje%2F80ag4NRD6Z7O35a03ZQnYk%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;1384&quot; height=&quot;1182&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1384&quot; data-origin-height=&quot;1182&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;- create new secret key 를 클릭하며 개인키를 발급받는다.&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-origin-width=&quot;1394&quot; data-origin-height=&quot;1140&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/zXfdS/btsdXOxYt3B/wnffSBK6UModCLHK7as8l0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/zXfdS/btsdXOxYt3B/wnffSBK6UModCLHK7as8l0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/zXfdS/btsdXOxYt3B/wnffSBK6UModCLHK7as8l0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FzXfdS%2FbtsdXOxYt3B%2FwnffSBK6UModCLHK7as8l0%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;1394&quot; height=&quot;1140&quot; data-origin-width=&quot;1394&quot; data-origin-height=&quot;1140&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 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2.&amp;nbsp; OpenAI API 적용 및 요약 함수 추가&amp;nbsp;&lt;/b&gt;&lt;/h3&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #555555;&quot;&gt;적용 방법은 공식 문서를 참고한다. &lt;/span&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1683271202120&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;OpenAI API&quot; data-og-description=&quot;An API for accessing new AI models developed by OpenAI&quot; data-og-host=&quot;platform.openai.com&quot; data-og-source-url=&quot;https://platform.openai.com/examples/default-summarize?lang=node.js&quot; data-og-url=&quot;https://platform.openai.com&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://platform.openai.com/examples/default-summarize?lang=node.js&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://platform.openai.com/examples/default-summarize?lang=node.js&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&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;OpenAI API&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;An API for accessing new AI models developed by OpenAI&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;platform.openai.com&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;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #555555;&quot;&gt;그리고 API를 다루기 때문에 따로 환경변수로 빼서 관리하고자 한다. &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;color: #555555;&quot;&gt;-&amp;gt; 서버 소스 상단에 dotenv 추가&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;div style=&quot;background-color: #1e1e1e; color: #d4d4d4;&quot;&gt;
&lt;div&gt;&lt;span style=&quot;color: #dcdcaa;&quot;&gt;require&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;'dotenv'&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;).&lt;/span&gt;&lt;span style=&quot;color: #dcdcaa;&quot;&gt;config&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;();&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;gt; .env 파일을 생성해 port 번호랑 api 키를 등록&amp;nbsp;&lt;/p&gt;
&lt;div style=&quot;background-color: #1e1e1e; color: #d4d4d4;&quot;&gt;
&lt;div&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;PORT&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt; = 8090&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;OPENAI_API_KEY&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;= &lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;&quot;발급받은 api 키 번호&quot;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;-&amp;gt; 서버단에서 환경변수를 가져옴&amp;nbsp;&lt;/p&gt;
&lt;div style=&quot;background-color: #1e1e1e; color: #d4d4d4;&quot;&gt;
&lt;div&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #4fc1ff;&quot;&gt;port&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;process&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;env&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #4fc1ff;&quot;&gt;PORT&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;;&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #4fc1ff;&quot;&gt;apiKey&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;process&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;env&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #4fc1ff;&quot;&gt;OPENAI_API_KEY&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;그리고 공식 문서를 참고하여 summary 기능을 추가하기로 하는데..&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;570&quot; data-origin-height=&quot;174&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cZBvW1/btsd4GmnssE/3zdRjrhYUql19zK49lSIF1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cZBvW1/btsd4GmnssE/3zdRjrhYUql19zK49lSIF1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cZBvW1/btsd4GmnssE/3zdRjrhYUql19zK49lSIF1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcZBvW1%2Fbtsd4GmnssE%2F3zdRjrhYUql19zK49lSIF1%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;570&quot; height=&quot;174&quot; data-origin-width=&quot;570&quot; data-origin-height=&quot;174&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;지긋지긋한 429 에러..&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;OpenAI api 에서 무료로 제공하는 쿼터를 초과하여 생긴 문제로 보였다.&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;span style=&quot;background-color: #f6e199;&quot;&gt;1. 요청 시간을 조정 - setTimeout() 함수로 요청 시간 조정해보기&lt;/span&gt; -- fail&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1683270644670&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const getSummary = async (url) =&amp;gt; {
  const { data } = await axios.get(url);
  const text = cheerio.load(data)(&quot;body&quot;).text();

  return new Promise((resolve, reject) =&amp;gt; {
    setTimeout(() =&amp;gt; {
      openai.createCompletion({
        model: &quot;text-davinci-002&quot;,
        prompt: `Summarize this for a second-grade student:\n\n${text}`,
        max_tokens: 64,
        temperature: 0.7,
        n: 1,
        stop: &quot;\n&quot;,
      })
        .then(({ data }) =&amp;gt; {
          console.log(data.choices[0].text.trim());
          resolve(data.choices[0].text.trim());
        })
        .catch(reject);
    }, 2000);
  });
};&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;혹시 보내는 뉴스의 양(5개)가 많아서 생긴 문제일까?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;2.&lt;span&gt; &amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;'많이 본 뉴스'의 전체 리스트를 가져오지 말고 1개만 가져와 요약 요청&lt;/span&gt;을 해보자 -- fail&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1683270930384&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// news 크롤링 함수
const getNews = async () =&amp;gt; {
  try {
    const { data } = await axios.get(
      &quot;https://news.naver.com/main/main.naver?mode=LSD&amp;amp;mid=shm&amp;amp;sid1=101&quot;,
      { responseType: &quot;arraybuffer&quot; }
    );
    const decoded = iconv.decode(Buffer.from(data), &quot;euc-kr&quot;);
    const $ = cheerio.load(decoded);
    const ranking_news_arr = $(&quot;#_rankingList0 &amp;gt; li &amp;gt; div &amp;gt; div &amp;gt; div&quot;).toArray();
    const div = ranking_news_arr[0]; // 첫 번째 뉴스만 가져옴
    const aFirst = $(div).find(&quot;a&quot;).first(); //div 안에서 처음 나타나는 'a' 태그 선택
    const title = aFirst.text().trim();
    const path = aFirst.attr(&quot;href&quot;); //path 변수에 저장하고
    const url = path; //path를 이용, 뉴스기사 전체 url 저장 

    // 언론사
    const aLast = $(div).find(&quot;a&quot;).last(); // div 내 가장 마지막에 나타나는 'a'태그 선택
    const author = aLast.text().trim(); //문자열 앞뒤 공백 제거
    // 요약
    const summary = await getSummary(url);

    const news = [
      {
        url,
        title,
        author,
        summary,
      },
    ];

    return news;
  } catch (error) {
    console.error(error);
    return []; // 예외가 발생한 경우 빈 배열 반환
  }
};&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1654&quot; data-origin-height=&quot;434&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cGUDZU/btsd01xU05g/Oj5lJ17dDa5WSQo64NKg0K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cGUDZU/btsd01xU05g/Oj5lJ17dDa5WSQo64NKg0K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cGUDZU/btsd01xU05g/Oj5lJ17dDa5WSQo64NKg0K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcGUDZU%2Fbtsd01xU05g%2FOj5lJ17dDa5WSQo64NKg0K%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;1654&quot; height=&quot;434&quot; data-origin-width=&quot;1654&quot; data-origin-height=&quot;434&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 data-ke-size=&quot;size16&quot;&gt;결국 OpenAI 사의 API 가 아니라 네이버나 다른 곳에서 제공하는 API 를 사용하는 것이 낫겠다는 생각이 들었다.&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;다음에 또 해봐야지..&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;</description>
      <category>Programming/JS +</category>
      <category>OpenAI key 발급법</category>
      <category>뉴스 요악 API</category>
      <author>joah.k</author>
      <guid isPermaLink="true">https://july7k.tistory.com/235</guid>
      <comments>https://july7k.tistory.com/235#entry235comment</comments>
      <pubDate>Sat, 29 Apr 2023 23:59:27 +0900</pubDate>
    </item>
  </channel>
</rss>