<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>DEVNOTE: 기록하는 개발자</title>
        <link>https://velog.io/</link>
        <description></description>
        <lastBuildDate>Wed, 31 Dec 2025 13:56:27 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>DEVNOTE: 기록하는 개발자</title>
            <url>https://velog.velcdn.com/images/gyngxn_/profile/04540bec-84b8-4c24-91a8-1bee7b739e8c/image.jpg</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. DEVNOTE: 기록하는 개발자. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/gyngxn_" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[[JAVA/자료구조] 선형구조 - 연결 리스트(LinkedList)]]></title>
            <link>https://velog.io/@gyngxn_/JAVA%EC%9E%90%EB%A3%8C%EA%B5%AC%EC%A1%B0-%EC%84%A0%ED%98%95%EA%B5%AC%EC%A1%B0-%EC%97%B0%EA%B2%B0-%EB%A6%AC%EC%8A%A4%ED%8A%B8LinkedList</link>
            <guid>https://velog.io/@gyngxn_/JAVA%EC%9E%90%EB%A3%8C%EA%B5%AC%EC%A1%B0-%EC%84%A0%ED%98%95%EA%B5%AC%EC%A1%B0-%EC%97%B0%EA%B2%B0-%EB%A6%AC%EC%8A%A4%ED%8A%B8LinkedList</guid>
            <pubDate>Wed, 31 Dec 2025 13:56:27 GMT</pubDate>
            <description><![CDATA[<h2 id="💡-연결-리스트linked-list">💡 연결 리스트(Linked List)</h2>
<ul>
<li>데이터를 감싼 <strong>노드(Node)</strong> 가 서로 연결되어 있는 구조</li>
<li>각 노드는 <strong>데이터</strong>와 다음 노드를 가리키는 <strong>주소(Next)</strong> 로 이루어져 있음</li>
</ul>
<h4 id="linked-list의-특징">Linked List의 특징</h4>
<ul>
<li>데이터들이 노드로 구성되어 있음
→ 바로 뒷 노드만 알고 있고 건너 건너에는 어떤 데이터가 있는지 모름</li>
</ul>
<ul>
<li>메모리의 유연함
→ 크기 제한이 없고 늘리고 줄이고가 자유로움</li>
</ul>
<ul>
<li>데이터 삽입/삭제 용이함
→ 물리적인 이동 없이 주소만 바꿔주면 됨 (O(1))</li>
</ul>
<ul>
<li>조회 속도가 느림
→ 처음부터(Head) 하나하나 확인하며 가야 함 (O(N))</li>
</ul>
<hr>
<h4 id="💡배열과-linkedlist-비교">💡배열과 LinkedList 비교</h4>
<table>
<thead>
<tr>
<th>특징</th>
<th>배열(Array)</th>
<th>연결 리스트(Linked List)</th>
</tr>
</thead>
<tbody><tr>
<td>저장 방식</td>
<td>연속된 메모리 공간에 저장</td>
<td>떨어진 공간에 저장되나 주소로 연결</td>
</tr>
<tr>
<td>조회</td>
<td><strong>빠름 (O(1))</strong> : 인덱스로 즉시 조회</td>
<td><strong>느림 (O(N))</strong> : 첫 노드부터 순차 탐색</td>
</tr>
<tr>
<td>추가/삭제</td>
<td><strong>느림 (O(N))</strong> : 데이터를 뒤로 밀거나 당겨야 함</td>
<td><strong>빠름 (O(1))</strong> : 주소 연결만 바꾸면 됨</td>
</tr>
<tr>
<td>크기</td>
<td>고정(한 번 생성하면 변경 불가)</td>
<td>동적</td>
</tr>
</tbody></table>
<hr>
<h4 id="linkedlist-선언-방법">LinkedList 선언 방법</h4>
<pre><code class="language-java">import java.util.LinkedList;

//1. 선언
LinkedList&lt;String&gt; list = new LinkedList&lt;&gt;();

//2. 값 추가
list.add(&quot;Java&quot;);
list.add(&quot;Spring&quot;);
list.add(1, &quot;Boot&quot;); // 중간에 삽입 (인덱스 1번)

//3. 값 삭제
list.remove(1); // 인덱스로 삭제
list.remove(&quot;Java&quot;);

//4. 값 조회
System.out.println(list.get(0));</code></pre>
<hr>
<h3 id="💡단순-연결-리스트singly-linked-list">💡단순 연결 리스트(Singly Linked List)</h3>
<p><img src="https://velog.velcdn.com/images/gyngxn_/post/dd9be88f-09d0-4730-80f2-b0e1f1d05014/image.png" alt=""></p>
<p>단순 연결 리스트는 위에서 말한 연결 리스트와 동일한 특징을 가지고 있다</p>
<hr>
<h3 id="💡이중-연결-리스트doubly-linked-list">💡이중 연결 리스트(Doubly Linked List)</h3>
<ul>
<li>각 노드가 이전 노드와 다음 노드를 가리키는 두 개의 포인터를 갖는 구조</li>
</ul>
<h4 id="이중-연결-리스트의-특징">이중 연결 리스트의 특징</h4>
<ul>
<li><p>양방향 탐색
→ 앞(Next)으로도 갈 수 있고 뒤(Prev)로도 이동이 가능하여 단순 연결 리스트보다 탐색이 유연</p>
</li>
<li><p>효율적인 검색과 삭제
→ 양쪽 방향에서 삽입과 삭제가 가능</p>
</li>
<li><p>메모리 사용이 많다
→ 이전 노드의 주소를 추가로 저장해야 하기 때문에 단순 연결 리스트와 달리 메모리를 더 차지 함</p>
</li>
</ul>
<p><img src="https://velog.velcdn.com/images/gyngxn_/post/6964739b-9a27-40c7-972a-81fa9a170956/image.png" alt=""></p>
<hr>
<h3 id="💡원형-연결-리스트circular-linked-list">💡원형 연결 리스트(Circular Linked List)</h3>
<ul>
<li>마지막 노드의 포인터가 NULL이 아닌 첫 번째 노드를 가리키는 형태를 갖는 구조
→ 마지막 노드의 다음 노드는 첫 번째 노드
→ 첫 번째 노드의 이전 노드는 마지막 노드</li>
</ul>
<p><img src="https://velog.velcdn.com/images/gyngxn_/post/5d7ff7fe-6d1c-443b-84c0-cac2723c1a90/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[백준] JAVA / 최댓값]]></title>
            <link>https://velog.io/@gyngxn_/%EB%B0%B1%EC%A4%80-JAVA-%EC%B5%9C%EB%8C%93%EA%B0%92</link>
            <guid>https://velog.io/@gyngxn_/%EB%B0%B1%EC%A4%80-JAVA-%EC%B5%9C%EB%8C%93%EA%B0%92</guid>
            <pubDate>Sun, 28 Dec 2025 14:17:19 GMT</pubDate>
            <description><![CDATA[<p><a href="https://www.acmicpc.net/problem/2566">BOJ/백준 2566 - 최댓값</a></p>
<h2 id="백준-2566---최댓값">백준 2566 - 최댓값</h2>
<h3 id="1-문제-분석">1. 문제 분석</h3>
<h4 id="문제-이해">문제 이해</h4>
<p>9 X 9 배열에 있는 81개의 자연수에서 최대값을 찾고, 그 값의 위치를 찾는 문제이다</p>
<h4 id="풀이-방법">풀이 방법</h4>
<ul>
<li>최댓값이 나타날 때 마다 그 행과 열 갱신<pre><code class="language-java">for(int i = 0; i &lt; 9; i++) {
  for(int j = 0; j &lt; 9; j++) {
      if(max &lt; arr[i][j]) {
          max = arr[i][j];
          row = i;
          col = j;    
      }
  }
}</code></pre>
</li>
</ul>
<h3 id="2-코드-구현">2. 코드 구현</h3>
<pre><code class="language-java">import java.io.*;
import java.util.*;

public class No_2566 {

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

        int arr[][] = new int[9][9];

        //1. 배열 채워넣기
        for(int i = 0; i &lt; 9; i++) {
            st = new StringTokenizer(br.readLine());
            for(int j = 0; j &lt; 9; j++) {
                arr[i][j] = Integer.parseInt(st.nextToken());
            }
        }

        int max = 0;
        int row = 0;
        int col = 0;

        //2. 최댓값 찾기
        for(int i = 0; i &lt; 9; i++) {
            for(int j = 0; j &lt; 9; j++) {
                if(max &lt; arr[i][j]) {
                    max = arr[i][j];
                    row = i;
                    col = j;

                }
            }
        }
        System.out.println(max);
        System.out.println((row + 1) + &quot; &quot; + (col + 1));
    }
}
</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[[백준] JAVA / 바구니 뒤집기]]></title>
            <link>https://velog.io/@gyngxn_/%EB%B0%B1%EC%A4%80-JAVA-%EB%B0%94%EA%B5%AC%EB%8B%88-%EB%92%A4%EC%A7%91%EA%B8%B0</link>
            <guid>https://velog.io/@gyngxn_/%EB%B0%B1%EC%A4%80-JAVA-%EB%B0%94%EA%B5%AC%EB%8B%88-%EB%92%A4%EC%A7%91%EA%B8%B0</guid>
            <pubDate>Sat, 27 Dec 2025 11:38:35 GMT</pubDate>
            <description><![CDATA[<p><a href="https://www.acmicpc.net/problem/10811">BOJ/백준 10811 - 바구니 뒤집기</a></p>
<h2 id="백준-10811---바구니-뒤집기">백준 10811 - 바구니 뒤집기</h2>
<h3 id="1-문제-분석">1. 문제 분석</h3>
<h4 id="문제-이해">문제 이해</h4>
<p>1 ~ N번까지의 번호를 가진 바구니가 있다
M번의 바구니의 순서를 역순으로 만들 것이다</p>
<p>M번의 역순을 다 한 후, 바구니 번호를 왼쪽 부터 출력하는 문제 이다.</p>
<p>바구니의 개수 N = 5
역순의 개수 M = 4</p>
<p>1 2 3 4 5의 바구니가 있을 때</p>
<ul>
<li>(1, 2) 수행하면 -&gt; 2 1 3 4 5</li>
<li>(3, 4) 수행하면 -&gt; 2 1 4 3 5</li>
<li>(1, 4) 수행하면 -&gt; 3 4 1 2 5</li>
<li>(2, 2) 수행하면 -&gt; 3 4 1 2 5 이런식으로 풀어가는 것이다</li>
</ul>
<h4 id="풀이-방법">풀이 방법</h4>
<ul>
<li><p>바구니 번호 배열 저장</p>
<pre><code class="language-java">for(int i = 0; i &lt; N; i++) {
  arr[i] = i + 1;
}</code></pre>
</li>
<li><p>투 포인터 알고리즘 사용으로 역순으로 표현</p>
<pre><code class="language-java">while(front &lt; end) {
  int temp = arr[end];
  arr[end] = arr[front];
  arr[front] = temp;

  front++;
  end--;
}</code></pre>
</li>
</ul>
<blockquote>
<p>💡 투 포인터는 양쪽 끝에서 시작해서 서로 마주 보는 방향으로 좁혀 오는 알고리즘</p>
</blockquote>
<blockquote>
<p><code>front</code>는 오른쪽으로 이동 <code>end</code>는 왼쪽으로 이동하면서 역순으로 표현하는 것</p>
</blockquote>
<h3 id="2-코드-구현">2. 코드 구현</h3>
<pre><code class="language-java">import java.io.*;
import java.util.*;

public class No_10811 {

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

        int N = Integer.parseInt(st.nextToken());
        int M = Integer.parseInt(st.nextToken());

        int arr[] = new int[N];

        //1. 배열 저장
        for(int i = 0; i &lt; N; i++) {
            arr[i] = i + 1;
        }

        //2. 역순 부분 입력
        for(int i = 0; i &lt; M; i++) {
            st = new StringTokenizer(br.readLine());
            int front = Integer.parseInt(st.nextToken()) - 1;
            int end = Integer.parseInt(st.nextToken()) - 1;


            //3. 역순으로 표현 - 투 포인터 사용
            while(front &lt; end) {
                int temp = arr[end];
                arr[end] = arr[front];
                arr[front] = temp;

                front++;
                end--;
            }
        }

        //4. 마지막으로 저장된 배열 출력
        for(int i = 0; i &lt; arr.length; i++) {
            System.out.print(arr[i] + &quot; &quot;);
        }
    }
}</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[[JAVA/자료구조] 선형구조 - 순차 리스트(ArrayList)]]></title>
            <link>https://velog.io/@gyngxn_/JAVA%EC%9E%90%EB%A3%8C%EA%B5%AC%EC%A1%B0-%EC%84%A0%ED%98%95%EA%B5%AC%EC%A1%B0-%EC%88%9C%EC%B0%A8-%EB%A6%AC%EC%8A%A4%ED%8A%B8ArrayList</link>
            <guid>https://velog.io/@gyngxn_/JAVA%EC%9E%90%EB%A3%8C%EA%B5%AC%EC%A1%B0-%EC%84%A0%ED%98%95%EA%B5%AC%EC%A1%B0-%EC%88%9C%EC%B0%A8-%EB%A6%AC%EC%8A%A4%ED%8A%B8ArrayList</guid>
            <pubDate>Sun, 21 Dec 2025 15:40:28 GMT</pubDate>
            <description><![CDATA[<h2 id="💡-순차-리스트sequential-list">💡 순차 리스트(Sequential List)</h2>
<ul>
<li>데이터들이 순서대로 메모리에 연속으로 저장되는 것 (ex. 배열)</li>
<li>각 데이터들은 다음 데이터와 연결되어 있고 각 데이터는 인덱스를 통해 접근이 가능</li>
</ul>
<hr>
<h3 id="💡-리스트-arraylist">💡 리스트 (ArrayList)</h3>
<ul>
<li>컬렉션 프레임워크의 List의 인터페이스를 사용하여 구현한 구현체</li>
</ul>
<blockquote>
<p>순차 리스트 종류에는 ArrayList, LinkedList, Vector 등이 있다</p>
</blockquote>
<pre><code class="language-java">List&lt;자료형&gt; list = new ArrayList&lt;&gt;();</code></pre>
<p>객체를 생성할 때, 데이터 타입은 제너릭 타입의 매개변수로 사용
객체 자료형에는 어떤 것이 들어갈까??</p>
<h4 id="객체-자료형-종류">객체 자료형 종류</h4>
<ol>
<li>Integer - 정수 값을 저장하는 타입</li>
<li>String - 문자열 값을 저장하는 타입</li>
<li>Double - 실수 값을 저장하는 타입</li>
<li>Boolean - 논리 값(True/False)을 저장하는 타입</li>
<li>Object - 모든 객체 타입을 저장할 수 있는 타입</li>
</ol>
<hr>
<h4 id="arraylist의-특징">ArrayList의 특징</h4>
<ul>
<li><p>동적 배열(Array)
  → 일반 배열과는 달리 자동으로 크기를 조절 할 수 있음</p>
</li>
<li><p>조회(get) 속도가 매우 빠름
  → 인덱스를 알면 O(1)의 속도로 한 번에 데이터를 찾아감</p>
</li>
<li><p>데이터 추가/삭제가 느림 (특히 중간에 삽입 / 삭제할 때)
  → 중간에 데이터가 삽입되거나 삭제되면, 그 뒤의 모든 데이터를 한 칸씩 밀거나 당기는 작업이 필요</p>
</li>
</ul>
<hr>
<h4 id="arraylist-선언-방법">ArrayList 선언 방법</h4>
<pre><code class="language-java">import java.util.ArrayList;
import java.util.List;

List&lt;String&gt; fruits = new ArrayList&lt;&gt;();
fruits.add(&quot;사과&quot;);
fruits.add(&quot;바나나&quot;);
fruits.add(&quot;딸기&quot;);

String secondFruit = fruits.get(1);

System.out.println(fruits); // [사과, 바나나, 딸기]
System.out.println(secondFruit); // 바나나</code></pre>
<hr>
<h4 id="배열과-arraylist-비교">배열과 ArrayList 비교</h4>
<table>
<thead>
<tr>
<th>비교 항목</th>
<th>배열(Array)</th>
<th>ArrayList</th>
</tr>
</thead>
<tbody><tr>
<td>크기(size)</td>
<td>고정 (헌 번 생성하면 변경 불가)</td>
<td>동적 (데이터 양에 따라 자동으로 늘어남)</td>
</tr>
<tr>
<td>조회</td>
<td>매우 빠름(인덱스로 바로 접근)</td>
<td>빠름</td>
</tr>
<tr>
<td>삽입/삭제</td>
<td>어려움</td>
<td>편함</td>
</tr>
<tr>
<td>데이터타입</td>
<td>기본형(int),참조형 모두 가능</td>
<td>참조형만 가능</td>
</tr>
</tbody></table>
<blockquote>
<p>사실 배열이랑 ArrayList는 큰 차이는 없다
💡단지 배열 크기 늘리기, 데이터 복사하기 작업을 ArrayList가 대신해주는 것이다
코딩 테스트를 할 떄 크기가 정해져 있다면 배열을 사용하는 것이 조금 더 빠르다</p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[[JAVA/자료구조] 선형구조 - 덱(Deque)]]></title>
            <link>https://velog.io/@gyngxn_/JAVA%EC%9E%90%EB%A3%8C%EA%B5%AC%EC%A1%B0-%EC%84%A0%ED%98%95%EA%B5%AC%EC%A1%B0-%EB%8D%B1Deque</link>
            <guid>https://velog.io/@gyngxn_/JAVA%EC%9E%90%EB%A3%8C%EA%B5%AC%EC%A1%B0-%EC%84%A0%ED%98%95%EA%B5%AC%EC%A1%B0-%EB%8D%B1Deque</guid>
            <pubDate>Sun, 21 Dec 2025 14:04:45 GMT</pubDate>
            <description><![CDATA[<h2 id="deque">Deque</h2>
<ul>
<li>덱(Deque)은 스택과 큐의 기능을 모두 가진 자료구조이며, 양쪽 끝에서 삽입과 삭제가 가능하다</li>
<li>선입선출과, 후입선출의 특성을 가진다</li>
</ul>
<h3 id="덱의-동작-과정">덱의 동작 과정</h3>
<h4 id="데이터-추가">데이터 추가</h4>
<ul>
<li>새로운 데이터가 Front(앞) 또는 Rear(뒤) 양쪽 어디서든 들어갈 수 있음</li>
</ul>
<h4 id="rear--front">rear &amp; front</h4>
<ul>
<li>큐와 위치는 같지만, 입구와 출구의 역할이 고정되지 않음</li>
</ul>
<h4 id="데이터-꺼내기">데이터 꺼내기</h4>
<ul>
<li>Front(앞) 또는 Rear(뒤) 양쪽 어디서든 데이터를 꺼낼 수 있음</li>
</ul>
<p><img src="https://velog.velcdn.com/images/gyngxn_/post/380de5c3-12a0-4c47-bbdc-8cd33406cbb3/image.png" alt=""></p>
<ul>
<li>데이터 추가 : <code>offerFirst()</code> / <code>offerLast()</code> <ul>
<li><code>offerFirst()</code> - 덱의 맨 앞에 데이터를 추가</li>
<li><code>offerLast()</code> - 덱의 맨 뒤에 데이터를 추가</li>
</ul>
</li>
</ul>
<ul>
<li>데이터 꺼내기 : <code>pollFirst()</code> / <code>pollLast()</code><ul>
<li><code>pollFirst()</code> - 덱의 맨 앞에서 데이터를 제거하고 반환 / 덱이 비어 있으면 null 반환</li>
<li><code>pollLast()</code> - 덱의 맨 뒤에서 데이터를 제거하고 반환 / 덱이 비어 있으면 null 반환</li>
</ul>
</li>
</ul>
<ul>
<li>데이터 확인하기 : <code>peekFirst()</code>  / <code>peekLast()</code> - <strong>데이터를 삭제하지 않음</strong><ul>
<li><code>peekFirst()</code> - 덱의 맨 앞에서 데이터를 반환 / 덱이 비어 있으면 null 반환</li>
<li><code>peekLast()</code> - 덱의 맨 뒤에서 데이터를 반환 / 덱이 비어 있으면 null 반환</li>
</ul>
</li>
</ul>
<blockquote>
<p>💡 덱은 큐의 상위 호환으로 알고 있으면 쉽게 이해할 수 있다</p>
<ul>
<li>데이터를 추가할 때 <code>add()</code></li>
<li>데이터를 삭제할 때 <code>remove()</code> 사용해도 되지만 <strong>선언하는 것에 따라 다르다</strong></li>
</ul>
</blockquote>
<blockquote>
<ul>
<li><code>ArrayDeque</code> 나 <code>LinkedList</code> 로 만들었다면 용량 제한이 없어서 에러가 발생하지 않지만 크기가 고정된 덱있다면 에러가 발생하기 때문에 <code>offer()</code>, <code>poll()</code>, <code>peek()</code>를 사용하는 게 좋다</li>
</ul>
</blockquote>
<hr>
<h3 id="덱-예시">덱 예시</h3>
<pre><code class="language-java">Deque&lt;자료형&gt; deque = new LinkedList&lt;&gt;();

// 덱의 데이터 추가
deque.offerFirst(&quot;Apple&quot;);
deque.offerFirst(&quot;Banana&quot;);
deque.offerLast(&quot;Orange&quot;);
deque.offerLast(&quot;Grape&quot;);

// 덱의 데이터 꺼내기 - 첫번째 데이터 제거(Banana 삭제)
deque.pollFirst();  </code></pre>
<hr>
<h3 id="덱-사용-예시">덱 사용 예시</h3>
<ul>
<li>회문 판별 - 앞, 뒤에서 읽었을 때 동일한 문자열을 검사할 때 사용</li>
</ul>
<hr>
<h3 id="덱-장단점">덱 장단점</h3>
<ul>
<li>장점<ul>
<li>양쪽 끝에서 삽입과 삭제가 가능</li>
</ul>
</li>
</ul>
<ul>
<li>단점<ul>
<li>메모리 사용이 큼</li>
</ul>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[JAVA/자료구조] 선형구조 - 큐(Queue)]]></title>
            <link>https://velog.io/@gyngxn_/JAVA%EC%9E%90%EB%A3%8C%EA%B5%AC%EC%A1%B0-%EC%84%A0%ED%98%95%EA%B5%AC%EC%A1%B0-%ED%81%90Queue</link>
            <guid>https://velog.io/@gyngxn_/JAVA%EC%9E%90%EB%A3%8C%EA%B5%AC%EC%A1%B0-%EC%84%A0%ED%98%95%EA%B5%AC%EC%A1%B0-%ED%81%90Queue</guid>
            <pubDate>Sat, 20 Dec 2025 11:28:43 GMT</pubDate>
            <description><![CDATA[<h2 id="queue">Queue</h2>
<ul>
<li>선형 구조의 형태이며 먼저 들어온 데이터가 먼저 나가는 자료구조이며 선입선출(FIFO, First-In-First-Out)의 특성을 가진다</li>
</ul>
<h3 id="큐의-동작-과정">큐의 동작 과정</h3>
<h4 id="enqueue--데이터-추가">Enqueue : 데이터 추가</h4>
<ul>
<li>새로운 데이터가 큐의 입구로 들어가는 과정</li>
<li><code>rear</code>의 위치는 다음 데이터가 삽입될 위치로 이동</li>
</ul>
<h4 id="rear--front--입구와-출구">rear &amp; front : 입구와 출구</h4>
<ul>
<li>rear : 큐의 맨 뒤 / 데이터가 들어오는(추가되는) 곳</li>
<li>front : 큐의 맨 앞 / 데이터가 나가는(삭제되는) 곳</li>
</ul>
<h4 id="dequeue--데이터-꺼내기">Dequeue : 데이터 꺼내기</h4>
<ul>
<li>맨 앞에 있는 데이터만 큐의 출구로 나갈 수 있음</li>
<li><code>front</code>의 위치는 다음 데이터가 추출될 위치로 이동</li>
</ul>
<p><img src="https://velog.velcdn.com/images/gyngxn_/post/1247c1f4-7d4f-49a7-bcf0-3b2f6f060b16/image.png" alt=""></p>
<ul>
<li>데이터 추가 : <code>add()</code> vs <code>offer()</code><ul>
<li><code>add()</code> - 큐가 꽉 차서 못 넣으면 <code>IllegalStateException</code> 에러 발생</li>
<li><code>offer()</code> - 큐가 꽉 차면 <code>false</code> 반환 (실무나 코딩테스트에서는 에러가 안터지는 offer 자주 사용)</li>
</ul>
</li>
</ul>
<ul>
<li>데이터 꺼내기 : <code>remove()</code> vs <code>poll()</code> <ul>
<li><code>remove()</code> - 큐가 비어있는데 꺼내라고 하면 <code>NoSuchElementException</code> 에러 발생</li>
<li><code>poll()</code> - 큐의 맨 앞 데이터를 제거 하고 반환 / 큐가 비어있으면 null 반환</li>
</ul>
</li>
</ul>
<ul>
<li>데이터 확인하기 : <code>element()</code> vs <code>peek()</code><ul>
<li><code>element()</code> - 큐가 비어있으면 에러 발생</li>
<li><code>peek()</code> - 큐가 비어있으면 null 반환 (데이터가 삭제되지 않음)</li>
</ul>
</li>
</ul>
<ul>
<li>모든 데이터 제거 - <code>clear()</code></li>
</ul>
<hr>
<h3 id="큐-예시">큐 예시</h3>
<pre><code class="language-java">Queue&lt;자료형&gt; queue = new LinkedList&lt;&gt;();

// 큐의 데이터 추가
queue.offer(&quot;Apple&quot;);
queue.offer(&quot;Orange&quot;);
queue.offer(&quot;Banana&quot;);

// 큐의 데이터 꺼내기 - 첫번째 데이터 제거(Apple 삭제)
queue.poll();</code></pre>
<hr>
<h3 id="큐-사용-에시">큐 사용 에시</h3>
<ul>
<li>먼저 온 순서대로 업무를 처리할 때 </li>
<li>BFS(너비 우선 탐색) - 인접한 노드를 우선으로 방문해야 하는 경우</li>
</ul>
<hr>
<h3 id="큐-장단점">큐 장단점</h3>
<ul>
<li><p>장점</p>
<ul>
<li>데이터의 순서가 중요한 작업에 적합</li>
</ul>
</li>
<li><p>단점</p>
<ul>
<li>큐의 크기가 고정되어 있으면 데이터가 가득 차면 더 이상 삽입이 불가능</li>
</ul>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[백준] JAVA / 전구]]></title>
            <link>https://velog.io/@gyngxn_/%EB%B0%B1%EC%A4%80-JAVA-%EC%A0%84%EA%B5%AC</link>
            <guid>https://velog.io/@gyngxn_/%EB%B0%B1%EC%A4%80-JAVA-%EC%A0%84%EA%B5%AC</guid>
            <pubDate>Fri, 19 Dec 2025 10:10:47 GMT</pubDate>
            <description><![CDATA[<p><a href="https://www.acmicpc.net/problem/21918">BOJ/백준 21918 - 전구</a></p>
<h2 id="백준-21918---전구">백준 21918 - 전구</h2>
<h3 id="1-문제-분석">1. 문제 분석</h3>
<h4 id="문제-이해">문제 이해</h4>
<p>전구의 상태를 주어진 명령어를 다 수행한 결과 전구는 어떤 상태인지 알아내는 문제이다.</p>
<p>전구의 상태는 0(꺼진거), 1(켜진거) 2가지가 있다.
명령어의 종류는 4가지가 있다.</p>
<ul>
<li>1번 명령어<ul>
<li><code>[i, x]</code> - i 번째 전구의 상태를 x로 변경</li>
</ul>
</li>
</ul>
<ul>
<li>2번 명령어<ul>
<li><code>[l, r]</code> - l번째부터 r번째까지의 전구의 상태를 변경(0 -&gt; 1, 1 -&gt; 0)</li>
</ul>
</li>
</ul>
<ul>
<li>3번 명령어<ul>
<li><code>[l, r]</code> - l번째부터 r번째까지의 전구를 끔</li>
</ul>
</li>
</ul>
<ul>
<li>4번 명령어<ul>
<li><code>[l, r]</code> - l번째부터 r번째까지의 전구를 킴</li>
</ul>
</li>
</ul>
<h4 id="풀이방법">풀이방법</h4>
<ul>
<li><p>전구의 상태를 저장하는 배열</p>
<pre><code class="language-java">int[] state = new int[N];

      st = new StringTokenizer(br.readLine());
      for(int i = 0; i &lt; N; i++) {
          state[i] = Integer.parseInt(st.nextToken());
      }</code></pre>
</li>
<li><p>명령어 수행</p>
<pre><code class="language-java">if(a == 1) { // 1번 명령어
  state[b - 1] = c;
}
</code></pre>
</li>
</ul>
<p>if(a == 2) { // 2번 명령어
    for(int j = b; j &lt;= c; j++) {
        if(state[j - 1] == 0) {
            state[j - 1] = 1;
        } else {
            state[j - 1] = 0;
        }
    }
}</p>
<p>if(a == 3) { // 3번 명령어
    for(int j = b; j &lt;= c; j++) {
        state[j - 1] = 0;
    }
}</p>
<p>if(a == 4) { // 4번 명령어
    for(int j = b; j &lt;= c; j++) {
        state[j - 1] = 1;
    }
}</p>
<pre><code>
* 바뀐 전구의 상태를 출력
```java
for(int i = 0; i &lt; state.length; i++) {
            System.out.print(state[i] + &quot; &quot;);
        }</code></pre><h3 id="2-코드-구현">2. 코드 구현</h3>
<pre><code class="language-java">import java.io.*;
import java.util.*;

public class No_21918 {

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

        int N = Integer.parseInt(st.nextToken());
        int M = Integer.parseInt(st.nextToken());

        int[] state = new int[N];

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

        for(int i = 0; i &lt; M; i++) {
            st = new StringTokenizer(br.readLine());
            int a = Integer.parseInt(st.nextToken());
            int b = Integer.parseInt(st.nextToken());
            int c = Integer.parseInt(st.nextToken());

            if(a == 1) {
                state[b - 1] = c;
            }

            if(a == 2) {
                for(int j = b; j &lt;= c; j++) {
                    if(state[j - 1] == 0) {
                        state[j - 1] = 1;
                    } else {
                        state[j - 1] = 0;
                    }
                }
            }

            if(a == 3) {
                for(int j = b; j &lt;= c; j++) {
                    state[j - 1] = 0;
                }
            }

            if(a == 4) {
                for(int j = b; j &lt;= c; j++) {
                    state[j - 1] = 1;
                }
            }
        }

        for(int i = 0; i &lt; state.length; i++) {
            System.out.print(state[i] + &quot; &quot;);
        }
    }
}
</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[[백준] JAVA / 소가 길을 건너간 이유1]]></title>
            <link>https://velog.io/@gyngxn_/%EB%B0%B1%EC%A4%80-JAVA-%EC%86%8C%EA%B0%80-%EA%B8%B8%EC%9D%84-%EA%B1%B4%EB%84%88%EA%B0%84-%EC%9D%B4%EC%9C%A01</link>
            <guid>https://velog.io/@gyngxn_/%EB%B0%B1%EC%A4%80-JAVA-%EC%86%8C%EA%B0%80-%EA%B8%B8%EC%9D%84-%EA%B1%B4%EB%84%88%EA%B0%84-%EC%9D%B4%EC%9C%A01</guid>
            <pubDate>Thu, 18 Dec 2025 13:38:18 GMT</pubDate>
            <description><![CDATA[<p><a href="https://www.acmicpc.net/problem/14467">BOJ/백준 14467 - 소가 길을 건너간 이유1</a></p>
<h2 id="백준-14467---소가-길을-건너간-이유1">백준 14467 - 소가 길을 건너간 이유1</h2>
<h3 id="1-문제-분석">1. 문제 분석</h3>
<h4 id="문제-이해">문제 이해</h4>
<p>소들이 길을 건너간 횟수를 구하는 문제이다
소의 번호와 위치(0 또는 1)가 주어진다
같은 소가 위치가 바뀔 때 마다 카운트를 1씩 증가해야함</p>
<h4 id="입력">입력</h4>
<p>첫 줄에 관찰 횟수 N이 주어짐 N은 100 이하의 양의 정수
다음 N줄부터는 한 줄에 하나씩 관찰 결과(소의 번호와 위치 0, 1로 이루어짐)</p>
<h4 id="풀이-방법">풀이 방법</h4>
<ul>
<li><p>데이터 저장용 배열</p>
<pre><code class="language-java">//1. 소 번호, 위치 2차원 배열에 저장
      for(int i = 0; i &lt; N; i++) {
          StringTokenizer st = new StringTokenizer(br.readLine());
          records[i][0] = Integer.parseInt(st.nextToken());
          records[i][1] = Integer.parseInt(st.nextToken());
      }</code></pre>
</li>
<li><p>소의 위치 기록용 배열</p>
<pre><code class="language-java">//2. 소의 현재 위치 배열
      int[] cowPos = new int[11];
      Arrays.fill(cowPos, -1); //아직 확인 되지 않은 소는 -1로 초기화</code></pre>
</li>
<li><p>저장된 데이터 순회하면서 확인</p>
<pre><code class="language-java">for(int i = 0 ; i &lt; N; i++) {
          int cowNum = records[i][0];
          int location = records[i][1];

          //처음 보는 소라면 위치 저장
          if(cowPos[cowNum] == -1) {
              cowPos[cowNum] = location;
          } 

          // 전에 봤던 소인데 위치가 다르다면? 위치 갱신
          else if(cowPos[cowNum] != location) {
              count++;
              cowPos[cowNum] = location;
          }
      }</code></pre>
</li>
</ul>
<h3 id="2-코드-구현">2. 코드 구현</h3>
<pre><code class="language-java">package Bronze;

import java.io.*;
import java.util.*;

public class No_14467 { //소가 길을 건너간 이유1

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

        int N = Integer.parseInt(br.readLine());
        int[][] records = new int[N][2];

        //1. 소 번호, 위치 2차원 배열에 저장
        for(int i = 0; i &lt; N; i++) {
            StringTokenizer st = new StringTokenizer(br.readLine());
            records[i][0] = Integer.parseInt(st.nextToken());
            records[i][1] = Integer.parseInt(st.nextToken());
        }

        //2. 소의 현재 위치 배열
        int[] cowPos = new int[11];
        Arrays.fill(cowPos, -1); //아직 확인 되지 않은 소는 -1로 초기화

        int count = 0;

        for(int i = 0 ; i &lt; N; i++) {
            int cowNum = records[i][0];
            int location = records[i][1];

            //처음 보는 소라면 위치 저장
            if(cowPos[cowNum] == -1) {
                cowPos[cowNum] = location;
            } 

            // 전에 봤던 소인데 위치가 다르다면? 위치 갱신
            else if(cowPos[cowNum] != location) {
                count++;
                cowPos[cowNum] = location;
            }
        }
        System.out.println(count);
    }
}</code></pre>
<hr>
<p>문제를 풀고 나서 보니까 꼭 2차원 배열을 안써도 되는 것을 알았다
입력 받자마자 바로 소의 위치 배열과 비교해서 처리하면 메모리를 더 아깔 수 있을 것 같다</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[백준] JAVA / 그룹 단어 체커 - 1316]]></title>
            <link>https://velog.io/@gyngxn_/%EB%B0%B1%EC%A4%80-JAVA-%EA%B7%B8%EB%A3%B9-%EB%8B%A8%EC%96%B4-%EC%B2%B4%EC%BB%A4-1316</link>
            <guid>https://velog.io/@gyngxn_/%EB%B0%B1%EC%A4%80-JAVA-%EA%B7%B8%EB%A3%B9-%EB%8B%A8%EC%96%B4-%EC%B2%B4%EC%BB%A4-1316</guid>
            <pubDate>Sat, 29 Nov 2025 15:52:21 GMT</pubDate>
            <description><![CDATA[<p><a href="https://www.acmicpc.net/problem/1316">BOJ/백준 1316 - 그룹 단어 체커</a></p>
<h2 id="백준-1316---그룹-단어-체커">백준 1316 - 그룹 단어 체커</h2>
<h3 id="1-문제-분석">1. 문제 분석</h3>
<h4 id="문제-이해">문제 이해</h4>
<p>그룹 단어란 단어에 존재하는 모든 문자에 대해서, 각 문자가 연속해서 나타나는 경우를 말한다
예를 들면 aabbbcccc는 a,b,c가 모두 연속해서 나타나기 떄문에 그룹 단어이지만,
aabba는 a가 떨어져서 나타나기 때문에 그룹 단어가 아니다</p>
<p>단어 N개를 입력 받아서 그룹 단어의 개수를 출력하자</p>
<h4 id="입력">입력</h4>
<p>첫째 줄에 단어의 개수 N, N은 100보다 작거나 같은 자연수
둘째 줄에 N개 만큼의 단어가 들어옴, 단어는 소문자로만 되어있고 중복되지 않는다, 길이는 최대 100</p>
<h4 id="풀이-방법">풀이 방법</h4>
<p>이 문제를 풀기 위해선 한번 나온 문자가 연속되지 않고 다른 문자가 나온 뒤에 또 나오면 그룹단어가 아니다 라는 개념이 있으면 된다</p>
<p>자 위에 했지만 다시 한 번 예시를 들어보자
<code>aaabbcc</code> -&gt; 그룹 단어 (같은 문자끼리 뭉쳐 있다)
<code>ccaazzddc</code> -&gt; 그룹 단어가 아님 (c는 맨 압에 나왔는데, 중간에 a,z,d가 나오고 다시 나왔다)</p>
<p>코드에 확인 해야할 것은 </p>
<ol>
<li>이전 문자와 다음 문자가 다른가?</li>
<li>만약 다르다면 다음 문자가 이전에 나온 적이 있는가?</li>
</ol>
<p>두 조건이 참이라면 해당 단어는 그룹 단어가 아니라서 개수에서 제외</p>
<h3 id="2-코드-구현">2. 코드 구현</h3>
<pre><code class="language-java">import java.io.*;

public class No_1316 { //그룹 단어 체커

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

        int N = Integer.parseInt(br.readLine());
        int count = 0;

        for(int i = 0; i &lt; N; i++) {
            String str = br.readLine();
            boolean arr[] = new boolean[26];
            boolean check = true;

            arr[str.charAt(0) - &#39;a&#39;] = true;  //첫 글자 왔었다

            for(int j = 0; j &lt; str.length() - 1; j++) {
                int pre = str.charAt(j);
                int next = str.charAt(j + 1);

                //전 과 후가 다를 때
                if(pre != next) {
                    if(arr[next - &#39;a&#39;] == true) { //뒷 글자가 이미 나왔었던 경우
                        check = false;
                        break;
                    }
                    arr[next - &#39;a&#39;] = true; // 처음 나온 글자면 왔다고 표시
                } 
            }
            if(check == true) count++;
        }
        System.out.println(count);
    }
}</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[[SWEA] JAVA / D2 - 초심자의 회문 검사]]></title>
            <link>https://velog.io/@gyngxn_/SWEA-JAVA-D2-%EC%B4%88%EC%8B%AC%EC%9E%90%EC%9D%98-%ED%9A%8C%EB%AC%B8-%EA%B2%80%EC%82%AC</link>
            <guid>https://velog.io/@gyngxn_/SWEA-JAVA-D2-%EC%B4%88%EC%8B%AC%EC%9E%90%EC%9D%98-%ED%9A%8C%EB%AC%B8-%EA%B2%80%EC%82%AC</guid>
            <pubDate>Wed, 19 Nov 2025 03:58:43 GMT</pubDate>
            <description><![CDATA[<p><a href="https://swexpertacademy.com/main/talk/solvingClub/problemView.do?solveclubId=AV6kld8aisgDFASb&amp;contestProbId=AV5PyTLqAf4DFAUq&amp;probBoxId=AV9oaSMa3DEDFAQc&amp;type=PROBLEM&amp;problemBoxTitle=%5BD1%7ED2+%EB%AC%B8%EC%A0%9C%ED%92%80%EC%9D%B4%5D+%EA%B8%B0%EC%B4%88+%EB%8B%A4%EC%A7%80%EA%B8%B0+Part2&amp;problemBoxCnt=14">SWEA - 초심자의 회문 검사</a></p>
<h3 id="문제-분석">문제 분석</h3>
<p>토마토처럼 거꾸로 읽어도 제대로 읽은 것과 같은 문장이나 낱말을 회문이라고 한다
단어를 입력 받아 회문이면 1, 아니면 0 출력</p>
<h3 id="입력">입력</h3>
<ul>
<li>첫 줄에는 테스트 케이스 수 T</li>
<li>단어의 길이는 3이상 10이하</li>
</ul>
<h3 id="출력">출력</h3>
<ul>
<li>단어를 입력 받아 회문이면 1, 아니면 0 출력</li>
</ul>
<h3 id="코드-구현">코드 구현</h3>
<pre><code class="language-java">import java.io.*;
import java.util.*;

public class No_1989 {

    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 &lt; T; i++) {
            String str = br.readLine();
            int answer = 0;

            int len = str.length();

            for(int j = 0; j &lt; len / 2; j++) {
                char front = str.charAt(j);
                char end = str.charAt(len - 1 - j);

                if(front == end) {
                    answer = 1;
                    break;
                }
            }
            System.out.println(&quot;#&quot; + (i+1) + &quot; &quot; + answer);
        }
    }
}</code></pre>
<hr>
<h3 id="💡문제-풀이">💡문제 풀이</h3>
<ul>
<li><p>방법 1</p>
<ul>
<li>회문이면 앞에서 읽을 때와 뒤에서 읽을 때가 같아야함</li>
<li>맨 앞과 맨 뒤 글자가 같은지 하나씩 확인하면서 중앙으로 오는 방법</li>
</ul>
</li>
<li><p>방법 2</p>
<ul>
<li>문자열을 통째로 뒤집어서 원본 문자열과 뒤집은 문자열 비교하는 방법</li>
</ul>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[SWEA] JAVA / D2 - 패턴 마디의 길이]]></title>
            <link>https://velog.io/@gyngxn_/SWEA-JAVA-D2-%ED%8C%A8%ED%84%B4-%EB%A7%88%EB%94%94%EC%9D%98-%EA%B8%B8%EC%9D%B4</link>
            <guid>https://velog.io/@gyngxn_/SWEA-JAVA-D2-%ED%8C%A8%ED%84%B4-%EB%A7%88%EB%94%94%EC%9D%98-%EA%B8%B8%EC%9D%B4</guid>
            <pubDate>Tue, 18 Nov 2025 07:16:07 GMT</pubDate>
            <description><![CDATA[<p><a href="https://swexpertacademy.com/main/talk/solvingClub/problemView.do?solveclubId=AV6kld8aisgDFASb&amp;contestProbId=AV5P1kNKAl8DFAUq&amp;probBoxId=AV9oaSMa3DEDFAQc&amp;type=PROBLEM&amp;problemBoxTitle=%5BD1%7ED2+%EB%AC%B8%EC%A0%9C%ED%92%80%EC%9D%B4%5D+%EA%B8%B0%EC%B4%88+%EB%8B%A4%EC%A7%80%EA%B8%B0+Part2&amp;problemBoxCnt=14">SWEA - 패턴 마디의 길이</a></p>
<h3 id="문제-분석">문제 분석</h3>
<ul>
<li>패턴에서 반복되는 부분을 마디라고 부른다</li>
<li>문자열을 입력 받아 마디의 길이를 출력하자</li>
</ul>
<h3 id="입력">입력</h3>
<ul>
<li>첫 줄에는 테스트 케이스의 개수 T</li>
<li>문자열의 길이는 30, 마디의 최대 길이는 10</li>
</ul>
<h3 id="출력">출력</h3>
<ul>
<li>마디의 길이를 출력</li>
</ul>
<h3 id="코드-구현">코드 구현</h3>
<pre><code class="language-java">import java.io.*;

public class No_2007 {

    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 &lt; T; i++) {
            String str = br.readLine();
            int answer = 0;

            for(int j = 1; j &lt;= 10; j++) {
                String pattern1 = str.substring(0, j);
                String pattern2 = str.substring(j, j + j);

                if(pattern1.equals(pattern2)) {
                    answer = j;
                    break;
                }
            }
            System.out.println(&quot;#&quot; + (i+1) + &quot; &quot; + answer);
        }
    }
}</code></pre>
<hr>
<h3 id="💡문제-풀이">💡문제 풀이</h3>
<ul>
<li>브루트 포스(완전 탐색) 방식으로 모든 경우를 다 확인하는 방식으로 풀었다</li>
</ul>
<ol>
<li>마디의 최대 길이는 10이므로 1부터 10까지 차례대로 가정</li>
<li>가정한 길이 j만큼 문자열 자르기<ul>
<li>첫 번째 마디 : <code>str.substring(0, j)</code></li>
<li>두 번째 마디 : <code>str.substring(j, j + j)</code></li>
</ul>
</li>
<li>첫 번째 마디와 두 번째 마디가 같은지 <code>equals</code>를 사용하여 확인</li>
<li>만약 같고 제일 먼저 발견된 길이가 최소 길이니까 반복문 종료후 빠져나오기</li>
</ol>
]]></description>
        </item>
        <item>
            <title><![CDATA[[프로그래머스] 최대값과 최솟값]]></title>
            <link>https://velog.io/@gyngxn_/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-%EC%B5%9C%EB%8C%80%EA%B0%92%EA%B3%BC-%EC%B5%9C%EC%86%9F%EA%B0%92</link>
            <guid>https://velog.io/@gyngxn_/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-%EC%B5%9C%EB%8C%80%EA%B0%92%EA%B3%BC-%EC%B5%9C%EC%86%9F%EA%B0%92</guid>
            <pubDate>Sun, 02 Nov 2025 14:09:48 GMT</pubDate>
            <description><![CDATA[<h3 id="문제-분석">문제 분석</h3>
<ul>
<li>문자열에는 공백으로 구분된 숫자들이 저장되어 있음</li>
<li>문자열에 나타나는 숫자 중 최소값과 최대값을 찾아 <code>&quot;최소값 최대값&quot;</code> 형태로 구하자</li>
</ul>
<h3 id="제한">제한</h3>
<ul>
<li>s에는 둘 이상의 정수가 공백으로 구분되어 있음</li>
</ul>
<h3 id="코드-구현">코드 구현</h3>
<pre><code class="language-java">class Solution {
    public String solution(String s) {
        String[] str = s.split(&quot; &quot;);

        int min = Integer.parseInt(str[0]);
        int max = Integer.parseInt(str[0]);

        for(int i = 0; i &lt; str.length; i++) {
            int num = Integer.parseInt(str[i]);
            if(num &lt; min) {
                min = num;
            }
            if(num &gt; max) {
                max = num;
            }
        }
        return min + &quot; &quot; + max;
    }
}</code></pre>
<hr>
<h3 id="💡접근-방법">💡접근 방법</h3>
<ul>
<li><code>split(&quot; &quot;)</code> - 공백을 기준으로 나눠서 배열로 저장</li>
<li>최대값과 최솟값을 배열의 초기값으로 설정해주기</li>
<li>배열의 모든 요소를 하나씩 num에 저장<ul>
<li>현재 num이 임시 최솟값보다 작으면 min 갱신</li>
<li>현재 num이 임시 최대값보다 크면 max 갱신 후 반환</li>
</ul>
</li>
</ul>
<hr>
<p><a href="https://school.programmers.co.kr/learn/courses/30/lessons/12939">프로그래머스 - 최대값과 최솟값</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[프로그래머스] 두 정수 사이의 합]]></title>
            <link>https://velog.io/@gyngxn_/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-%EB%91%90-%EC%A0%95%EC%88%98-%EC%82%AC%EC%9D%B4%EC%9D%98-%ED%95%A9</link>
            <guid>https://velog.io/@gyngxn_/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-%EB%91%90-%EC%A0%95%EC%88%98-%EC%82%AC%EC%9D%B4%EC%9D%98-%ED%95%A9</guid>
            <pubDate>Sun, 02 Nov 2025 11:41:51 GMT</pubDate>
            <description><![CDATA[<h3 id="문제-분석">문제 분석</h3>
<ul>
<li>두 정수 a, b가 주어졌을 때 a와 b 사이에 속한 모든 정수의 합을 구하라</li>
<li>예시) <code>a = 3</code>, <code>b = 5</code> 이면 <code>3 + 4 + 5 = 12</code> 출력</li>
</ul>
<h3 id="제한">제한</h3>
<ul>
<li>a와 b가 같은 경우는 둘 중 아무 수나 리턴</li>
<li>a와 b는 -10,000,000 이상 10,000,000 이하 인 정수</li>
<li>a와 b의 대소관계는 정해져 있지 않다</li>
</ul>
<h3 id="코드-구현">코드 구현</h3>
<pre><code class="language-java">class Solution {
    public long solution(int a, int b) {
        long answer = 0;

        int start = Math.min(a, b);
        int end = Math.max(a, b);

        for(int i = start; i &lt;= end; i++) {
            answer += i;
        }
        return answer;
    }
}</code></pre>
<hr>
<p><a href="https://school.programmers.co.kr/learn/courses/30/lessons/12912">프로그래머스 - 두 정수 사이의 합</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[스택] 백준 - 1874]]></title>
            <link>https://velog.io/@gyngxn_/%EC%8A%A4%ED%83%9D-%EB%B0%B1%EC%A4%80-1874</link>
            <guid>https://velog.io/@gyngxn_/%EC%8A%A4%ED%83%9D-%EB%B0%B1%EC%A4%80-1874</guid>
            <pubDate>Fri, 31 Oct 2025 13:28:57 GMT</pubDate>
            <description><![CDATA[<h2 id="백준-1874---스택-수열">백준 1874 - 스택 수열</h2>
<h3 id="1-문제-분석">1. 문제 분석</h3>
<h4 id="문제-이해">문제 이해</h4>
<p>스택의 원리를 정확하게 알고 있는지 확인하는 문제
스택의 pop, push과 후입선출 특성을 이해하고 있다면 쉽게 풀 수 있을 것이다
단, 스택에 push하는 순서는 오름차순을 지키도록 함</p>
<p>에제 입력으로 문제 이해를 해보자</p>
<pre><code class="language-java">8
4
3
6
8
7
5
2
1</code></pre>
<p>순서대로 입력 했다고 하자</p>
<p>수열 4 찾아야함
STACK - 1
STACK - 1 2
STACK - 1 2 3
STACK - 1 2 3 4 / PUSH(4) 까지
수열 3 찾아야함
STACK - 1 2 3 / POP(3)
수열 6 찾아야함
STACK - 1 2 5 6 / PUSH(6) 까지 한 후 POP(6)
수열 8 찾아야함
STACK - 1 2 5 7 8 / PUSH(8) 까지 한 후 POP(8)
수열 7 찾아야함
STACK - 1 2 5 7 / PUSH(7) 까지 한 후 POP(7)
수열 5 찾아야함
STACK - 1 2 5 / POP(5)
수열 2 찾아야함
STACK - 1 2 / POP(2)
수열 1 찾아야함
STACK - 1 / POP(1)</p>
<p>이러한 방식으로 문제를 풀어야 한다</p>
<ul>
<li><p>어떻게 스택 연산을 수행할까 (오름차순으로 넣고 뺄까)</p>
<ul>
<li><p>현재 수열 값 &gt;= 자연수</p>
<ul>
<li><code>PUSH(4)</code> 까지 해야하니 자연수가 1부터 4까지 <code>PUSH()</code> 하고 마지막에 한 번 <code>POP()</code></li>
</ul>
</li>
<li><p>현재 수열 값 &lt; 자연수</p>
<ul>
<li><code>POP(4)</code> 를 하면면 자연수는 5가 되고 수열 값은 3이 된다 따라서 POP(3) </li>
<li>만약 해당 조건을 만족하지 않는 다면 스택이 정상적으로 작동하지 않기 때문에 <code>&quot;NO&quot;</code> 출력</li>
</ul>
</li>
</ul>
</li>
</ul>
<h4 id="입력">입력</h4>
<ul>
<li>첫째 줄 - n (1 이상 10만 이하)</li>
<li>둘째 줄 - 수열을 이루는 1이상 n이하의 정수</li>
<li>중복 되는 정수는 나오지 않는다</li>
</ul>
<h4 id="출력">출력</h4>
<ul>
<li>push -&gt; &quot;+&quot; / pop -&gt; &quot;-&quot;</li>
<li>불가능한 경우 &quot;NO&quot;</li>
</ul>
<h3 id="시간-복잡도">시간 복잡도</h3>
<ul>
<li>Stack 연산(<code>pop()</code>, <code>push()</code>)은 상수 시간 복잡도가 소요된다 -&gt; O(1)</li>
<li>최대 한 번씩 스택에 값을 pop, push 하니까 N개의 수를 처리하는데 O(N)의 시간이 걸림</li>
</ul>
<h3 id="코드-구현">코드 구현</h3>
<pre><code class="language-java">import java.io.*;
import java.util.*;

public class No_1874 {

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

        int T = Integer.parseInt(br.readLine());
        int arr[] = new int[T];

        // 1. 수열 배열 만들기
        for(int i = 0; i &lt; T; i++) {
            arr[i] = Integer.parseInt(br.readLine());
        }

        Stack&lt;Integer&gt; stack = new Stack&lt;&gt;();

        int num = 1;
        boolean ps = true;

        // 2. 수열을 하나씩 확인
        for(int i = 0; i &lt; arr.length; i++) {
            int su = arr[i];

            // 3. 수열이 num 보다 크면 num을 수열 숫자까지 push
            if (su &gt;= num) {  
                while(su &gt;= num) {
                    stack.push(num++);
                    sb.append(&quot;+\n&quot;);
                }
                stack.pop();
                sb.append(&quot;-\n&quot;);
            } else {  // 4. 수열이 num 보다 작을 때
                int top = stack.pop(); 

                // 5. 스택에서 꺼낸 top와 수열 값이 다른 경우
                if(top != su) {
                    System.out.println(&quot;NO&quot;);
                    ps = false;
                    break;
                } else {
                    sb.append(&quot;-\n&quot;);
                }
            }
        }

        // 6. for문이 중단되지 않고 스택 연산이 모두 이뤄진 경우
        if(ps) {
            System.out.println(sb.toString());
        }
    }
}</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[[SWEA] JAVA / D2 - 간단한 소인수분해]]></title>
            <link>https://velog.io/@gyngxn_/SWEA-JAVA-D2-%EA%B0%84%EB%8B%A8%ED%95%9C-%EC%86%8C%EC%9D%B8%EC%88%98%EB%B6%84%ED%95%B4</link>
            <guid>https://velog.io/@gyngxn_/SWEA-JAVA-D2-%EA%B0%84%EB%8B%A8%ED%95%9C-%EC%86%8C%EC%9D%B8%EC%88%98%EB%B6%84%ED%95%B4</guid>
            <pubDate>Thu, 30 Oct 2025 12:56:15 GMT</pubDate>
            <description><![CDATA[<p><a href="https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV5Pl0Q6ANQDFAUq">SWEA - 간단한 소인수분해</a></p>
<h3 id="문제-분석">문제 분석</h3>
<p>숫자 N은 아래와 같다
<img src="https://velog.velcdn.com/images/gyngxn_/post/5b8f51f6-8c0c-4e61-84a1-5d75c939a512/image.png" alt="">
이떄 a,b,c,d,e 구하는 문제 이다</p>
<ul>
<li>N의 크기는 2 이상 10,000,000이하</li>
</ul>
<h3 id="입력">입력</h3>
<ul>
<li>첫 줄에는 테스트 케이스의 개수 T</li>
<li>각 테스트 케이스의 첫 번째 줄에 N</li>
</ul>
<h3 id="출력">출력</h3>
<ul>
<li>출력의 각 줄은 <code>#t</code>로 시작하고, 공백을 한 칸 둔 다음 정답을 출력</li>
</ul>
<h3 id="코드-구현">코드 구현</h3>
<pre><code class="language-java">import java.util.*;
import java.io.*;

public class No_1945 {

    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 &lt; T; i++) {
            int N = Integer.parseInt(br.readLine());

            int a = 0;
            int b = 0;
            int c = 0;
            int d = 0;
            int e = 0;

            while (N % 2 == 0) {
                a++;
                N /= 2;
            }

            while (N % 3 == 0) {
                b++;
                N /= 3;
            }

            while (N % 5 == 0) {
                c++;
                N /= 5;
            }

            while (N % 7 == 0) {
                d++;
                N /= 7;
            }

            while (N % 11 == 0) {
                e++;
                N /= 11;
            }
            System.out.print(&quot;#&quot; + (i + 1) + &quot; &quot; + a + &quot; &quot; + b + &quot; &quot; + c + &quot; &quot; + d + &quot; &quot; + e);
        }
    }
}</code></pre>
<hr>
<h3 id="💡문제-풀이">💡문제 풀이</h3>
<p>우선 문제를 보면 a,b,c,d,e를 구해야하니까 N들의 수는 2,3,5,7,11로 나눠떨어지는 수이다
따라서 <strong>N이 해당 숫자로 더 이상 나눠지지 않을 때까지 계속 나누는 것</strong>이다</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[SWEA] JAVA / D2 - +=]]></title>
            <link>https://velog.io/@gyngxn_/SWEA-D2-</link>
            <guid>https://velog.io/@gyngxn_/SWEA-D2-</guid>
            <pubDate>Mon, 27 Oct 2025 14:05:20 GMT</pubDate>
            <description><![CDATA[<p><a href="https://swexpertacademy.com/main/code/problem/problemDetail.do?problemLevel=2&amp;contestProbId=AZD8K_UayDoDFAVs&amp;categoryId=AZD8K_UayDoDFAVs&amp;categoryType=CODE&amp;problemTitle=&amp;orderBy=FIRST_REG_DATETIME&amp;selectCodeLang=ALL&amp;select-1=2&amp;pageSize=10&amp;pageIndex=1">SWEA - +=</a></p>
<h3 id="문제-분석">문제 분석</h3>
<p>프로그래밍 언어에는 <code>+=</code> 연산자가 있다
<code>x += y</code> = <code>x = x + y</code> 이런식으로 x의 값이 바뀐다
문제에서는 x에 저장된 값은 A, y에 저장된 값은 B라고 한다
<code>x += y</code>, <code>y += x</code>의 연산을 원하는 만큼 수행해서 x 와 y 둘 중 하나 이상의 저장된 값이 N이 초과가 되게 하려고 할 때, 최소 몇 번 수행해야 하는지 계산하는 프로그램을 만드는 것이 목적</p>
<h3 id="입력">입력</h3>
<p>첫 번째 줄에 테스트 케이스의 수 T가 주어진다
각 줄에는 세 개의 정수가 주어짐
<img src="https://velog.velcdn.com/images/gyngxn_/post/ddd12ecc-3110-4de4-acb6-08adcd184417/image.png" alt="">
테스트 케이스 개수는 60만개 이상으로 상당히 많다</p>
<h3 id="출력">출력</h3>
<p>문제와 같이 x 와 y 둘 중 하나 이상의 저장된 값이 N초과가 되게 하려고 할 때, 최소 몇 번 수행해야 하는지 계산하는 프로그램을 만드는 것이 목적</p>
<h3 id="코드-구현">코드 구현</h3>
<pre><code class="language-java">import java.util.*;
import java.io.*;

public class No_21425 {

    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 &lt; T; i++) {
            StringTokenizer st = new StringTokenizer(br.readLine());
            int A = Integer.parseInt(st.nextToken());
            int B = Integer.parseInt(st.nextToken());
            int N = Integer.parseInt(st.nextToken());

            int count = 0;

            while (A &lt;= N &amp;&amp; B &lt;= N) {
                if(A &lt; B) {
                    A += B;
                } else {
                    B += A;
                }
                count++;
            }
            System.out.println(count);
        }
    }
}</code></pre>
<hr>
<h3 id="💡-문제-풀이">💡 문제 풀이</h3>
<p>A 또는 B 둘 중 하나라도 N을 초과하게 만들면 되기 때문에 값을 빨리 키우는 게 좋다
항상 더 작은 값을 더 큰 값에 더해주는 로직을 만들면 된다 예시를 들어보자
만약 <code>A=2</code>, <code>B=5</code>, <code>N=10</code> 일 때</p>
<ul>
<li>if(A &lt; B)<ul>
<li>A += B 실행 -&gt; A = A + B<ul>
<li>2 + 5 = 7 (N을 초과하지 않음) 1회</li>
<li>7 + 5 = 12 (N을 초과) 2회 // 총 2회</li>
</ul>
</li>
</ul>
</li>
</ul>
<ul>
<li>B += A 실행 -&gt; B = B + A<ul>
<li>5 + 2 = 7 (N을 초과하지 않음) 1회</li>
<li>7 + 2 = 9 (N을 초과하지 않음) 2회</li>
<li>9 + 2 = 11 (N을 초과) 3회 // 총 3회</li>
</ul>
</li>
</ul>
<p>따라서 <strong>더 작은 값을 큰 값에 더해주면 된다!</strong></p>
<blockquote>
<p>💡이것을 <strong>탐욕 알고리즘(Greedy Algorithm)</strong> 이라고 부른다
매 순간 가장 좋아 보이는 선택을 하는 것 기억해두자</p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[[프로그래머스] 간단한 식 계산하기]]></title>
            <link>https://velog.io/@gyngxn_/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-%EA%B0%84%EB%8B%A8%ED%95%9C-%EC%8B%9D-%EA%B3%84%EC%82%B0%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@gyngxn_/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-%EA%B0%84%EB%8B%A8%ED%95%9C-%EC%8B%9D-%EA%B3%84%EC%82%B0%ED%95%98%EA%B8%B0</guid>
            <pubDate>Sun, 26 Oct 2025 08:50:55 GMT</pubDate>
            <description><![CDATA[<p><a href="https://school.programmers.co.kr/learn/courses/30/lessons/181865">프로그래머스 - 간단한 식 계산하기</a></p>
<h3 id="문제-분석">문제 분석</h3>
<p>문자열 <code>binomial</code>은 <code>a</code> <code>op</code> <code>b</code> 형태의 이항식이다
<code>a</code> 와<code>b</code>는 음이 아닌 정수이고 <code>op</code>는 <code>+</code>, <code>-</code>, <code>*</code> 중 하나이다</p>
<p>풀기 위해서 문자열을 공백을 기준으로 나누고 switch문으로 연산자의 기준에 따라 나누는 것으로 했다</p>
<h3 id="제한">제한</h3>
<p><code>a</code> 와<code>b</code> 는 0 이상 40,000이하의 음이 아닌 정수
0을 제외하고 <code>a</code> 와<code>b</code>는 0으로 시작하지 않는다 ex) 02393</p>
<h3 id="코드-구현">코드 구현</h3>
<pre><code class="language-java">class Solution {
    public int solution(String binomial) {
        int answer = 0;
        String[] arr = binomial.split(&quot; &quot;);

        int a = Integer.parseInt(arr[0]);
        int b = Integer.parseInt(arr[2]);

        String op = arr[1];

        switch(op) {
            case &quot;+&quot;:
                answer = a + b;
                break;

            case &quot;-&quot;:
                answer = a - b;
                break;

            case &quot;*&quot;:
                answer = a * b;
                break;
        }

        return answer;
    }
}</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[[프로그래머스] 배열에서 문자열 대소문자 변환하기]]></title>
            <link>https://velog.io/@gyngxn_/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-%EB%B0%B0%EC%97%B4%EC%97%90%EC%84%9C-%EB%AC%B8%EC%9E%90%EC%97%B4-%EB%8C%80%EC%86%8C%EB%AC%B8%EC%9E%90-%EB%B3%80%ED%99%98%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@gyngxn_/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-%EB%B0%B0%EC%97%B4%EC%97%90%EC%84%9C-%EB%AC%B8%EC%9E%90%EC%97%B4-%EB%8C%80%EC%86%8C%EB%AC%B8%EC%9E%90-%EB%B3%80%ED%99%98%ED%95%98%EA%B8%B0</guid>
            <pubDate>Sat, 25 Oct 2025 12:26:26 GMT</pubDate>
            <description><![CDATA[<p><a href="https://school.programmers.co.kr/learn/courses/30/lessons/181875">프로그래머스 - 배열에서 문자열 대소문자 변환하기</a></p>
<h3 id="문제-분석">문제 분석</h3>
<p>모든 배열의 원소가 알파벳으로 이루어져 있을 때</p>
<ul>
<li>배열의 홀수 인덱스의 문자열은 대문자로 변환</li>
<li>배열의 짝수 인덱스의 문자열은 소문자로 변환</li>
</ul>
<h3 id="제한">제한</h3>
<ul>
<li><code>strArr</code>의 원소의 길이는 1이상 20이하</li>
<li><code>strArr</code>의 원소는 알파벳으로 이루어져 있음</li>
</ul>
<h3 id="코드-구현">코드 구현</h3>
<pre><code class="language-java">class Solution {
    public String[] solution(String[] strArr) {
        String[] answer = new String[strArr.length];

        for(int i = 0; i &lt; strArr.length; i++) {
            if(i % 2 == 0) {
                answer[i] = strArr[i].toLowerCase();
            } else {
                answer[i] = strArr[i].toUpperCase();
            }
        }
        return answer;
    }
}</code></pre>
<hr>
<h3 id="💡문제-핵심-풀이">💡문제 핵심 풀이</h3>
<ul>
<li><code>toLowerCase()</code> -&gt; 소문자로 변환</li>
<li><code>toUpperCase()</code> -&gt; 대문자로 변환</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[프로그래머스] 공백으로 구분하기 2]]></title>
            <link>https://velog.io/@gyngxn_/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-%EA%B3%B5%EB%B0%B1%EC%9C%BC%EB%A1%9C-%EA%B5%AC%EB%B6%84%ED%95%98%EA%B8%B0-2</link>
            <guid>https://velog.io/@gyngxn_/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-%EA%B3%B5%EB%B0%B1%EC%9C%BC%EB%A1%9C-%EA%B5%AC%EB%B6%84%ED%95%98%EA%B8%B0-2</guid>
            <pubDate>Sat, 25 Oct 2025 09:32:23 GMT</pubDate>
            <description><![CDATA[<p><a href="https://school.programmers.co.kr/learn/courses/30/lessons/181868">프로그래머스 - 공백으로 구분하기 2</a></p>
<h3 id="문제-분석">문제 분석</h3>
<p>단어가 공백 한 개 이상으로 구분되어 있는 문자열이 있음
문자열에서 나온 단어를 앞에서부터 순서대로 담기</p>
<h3 id="제한">제한</h3>
<ol>
<li>문자열은 영소문자와 공백으로만 이루어짐</li>
<li>문자열의 길이는 1 이상 1000 이하</li>
<li>문자열의 맨 앞과 맨 뒤에도 공백이 있을 수 있음</li>
<li>문자열안에 단어 하나 이상 존재</li>
</ol>
<h3 id="코드-구현">코드 구현</h3>
<pre><code class="language-java">class Solution {
    public String[] solution(String my_string) {
        String[] answer = my_string.trim().split(&quot;\\s+&quot;);

        return answer;
    }
}</code></pre>
<hr>
<h3 id="💡-풀이-설명">💡 풀이 설명</h3>
<p><code>trim()</code> 사용해서 문자열의 앞, 뒤 공백 없애기
<code>split()</code> 안에 <code>\\s+</code> 사용</p>
<blockquote>
<p><code>\s</code> -&gt; 모든 공백 문자</p>
<ul>
<li>스페이스(&quot; &quot;)</li>
<li>탭(\t)</li>
<li>줄바꿈(\n)</li>
<li>이 외의 모든 공백</li>
<li><code>+</code> -&gt; 앞의 패턴이 1번이상 반복됨을 의미</li>
</ul>
</blockquote>
<blockquote>
<p><code>\s</code>는 <code>\n</code> 처럼 이스케이프 문자가 아니라 정규 표현식이라서 \ 하나 더 추가해야 함</p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[[스택] 백준 - 10828]]></title>
            <link>https://velog.io/@gyngxn_/%EC%8A%A4%ED%83%9D-%EB%B0%B1%EC%A4%80-10828</link>
            <guid>https://velog.io/@gyngxn_/%EC%8A%A4%ED%83%9D-%EB%B0%B1%EC%A4%80-10828</guid>
            <pubDate>Thu, 23 Oct 2025 13:26:10 GMT</pubDate>
            <description><![CDATA[<p><a href="https://www.acmicpc.net/problem/10828">BOJ/백준 10828 - 스택</a></p>
<p>해당 문제는 친절하게 어떤거 쓰고 어떻게 쓰이는 지 알려주고 있다</p>
<p>우선 코드에서 사용한 스택 함수를 보여드리겠습니다</p>
<table>
<thead>
<tr>
<th align="center">스택 함수</th>
<th align="center">설명</th>
</tr>
</thead>
<tbody><tr>
<td align="center">push()</td>
<td align="center">스택의 맨 위 요소 추가</td>
</tr>
<tr>
<td align="center">pop()</td>
<td align="center">스택에서 맨 위에 있는 정수 반환 후 제거</td>
</tr>
<tr>
<td align="center">size()</td>
<td align="center">스택의 크기 반환</td>
</tr>
<tr>
<td align="center">isEmpty()</td>
<td align="center">스택에 원소가 없으면 &#39;True&#39;, 있으면 &#39;False&#39;</td>
</tr>
<tr>
<td align="center">peek()</td>
<td align="center">스택의 맨 위 요소를 삭제하지 않고 반환</td>
</tr>
</tbody></table>
<blockquote>
<p>💡<code>isEmpty()</code> 는 boolean 값을 반환하므로 코드에선 1과 0으로 변경해줘야 함</p>
</blockquote>
<hr>
<h2 id="백준-10828---스택">백준 10828 - 스택</h2>
<h3 id="1-문제-분석">1. 문제 분석</h3>
<h4 id="문제-이해">문제 이해</h4>
<p>정수를 저장하는 스택을 구현 후 명령을 처리하는 프로그램 만들어보자
명령1. push X → X를 스택에 넣기
명령2. pop → 스택에서 가장 위에 있는 정수를 빼고, 그 수 출력 만약 스택에 정수가 없으면 -1 출력
명령3. size → 스택에 들어있는 정수의 개수 출력
명령4. empty → 스택이 비어있으면 1, 아니면 0 출력
명령5. top → 스택에 가장 위에 있는 정수 출력, 만약 스택에 정수가 없으면 -1</p>
<h4 id="입력">입력</h4>
<ul>
<li>첫째 줄에 주어지는 명령의 개수 N → <code>(1 &lt;= N &lt;= 10,000)</code></li>
<li>둘째 줄부터 명령이 하나씩 주어짐 → <code>(1 &lt;= 명령 &lt;= 100,000)</code></li>
</ul>
<p>단, 문제에 나와있지 않은 명령이 주어지는 경우는 없음</p>
<h4 id="출력">출력</h4>
<p>명령 한 줄당 결과도 하나씩 출력</p>
<h3 id="2-시간-복잡도">2. 시간 복잡도</h3>
<ul>
<li>N개의 명령어 만큼 반복해야하니까 → O(N)</li>
<li>나머지 스택 연산들은 → O(1)</li>
</ul>
<blockquote>
<p>💡for문이 한 번 돌때마다 스택 연산이 한 번씩 일어나기 때문에 총 시간 복잡도는 O(N)</p>
</blockquote>
<h3 id="3-코드-구현">3. 코드 구현</h3>
<pre><code class="language-java">import java.io.*;
import java.util.*;

public class No_10828 {

    public static void main(String[] args) throws IOException {

        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int N = Integer.parseInt(br.readLine());
        Stack&lt;Integer&gt; stack = new Stack&lt;&gt;();
        StringBuilder sb = new StringBuilder();

        for(int i = 0; i &lt; N; i++) {
            StringTokenizer st = new StringTokenizer(br.readLine());
            String s = st.nextToken();

            switch(s) {
            case &quot;push&quot; :
                stack.push(Integer.parseInt(st.nextToken()));
                break;

            case &quot;pop&quot; :
                if(stack.isEmpty()) {
                    sb.append(&quot;-1\n&quot;);
                } else {
                    sb.append(stack.pop()).append(&quot;\n&quot;);
                }
                break;

            case &quot;size&quot; :
                sb.append(stack.size()).append(&quot;\n&quot;);
                break;

            case &quot;empty&quot; :
                if(stack.isEmpty()) {
                    sb.append(&quot;1\n&quot;);
                } else {
                    sb.append(&quot;0\n&quot;);
                }
                break;

            case &quot;top&quot; :
                if(stack.isEmpty()) {
                    sb.append(&quot;-1\n&quot;);
                } else {
                    sb.append(stack.peek()).append(&quot;\n&quot;);
                }
                break;
            }
        }
        System.out.println(sb);
    }
}</code></pre>
]]></description>
        </item>
    </channel>
</rss>