<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>yes_jihyeon.log</title>
        <link>https://velog.io/</link>
        <description>꼭꼭 씹어서 소화시키는 맛있는 코딩</description>
        <lastBuildDate>Fri, 15 Dec 2023 00:03:20 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>yes_jihyeon.log</title>
            <url>https://velog.velcdn.com/images/yes_jihyeon/profile/073a66d7-21e9-4e82-b4bb-98a3d7f4fd45/image.png</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. yes_jihyeon.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/yes_jihyeon" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[[자바(JAVA)] 정수 내림차순으로 배치하기 String.parseString(n), StringBuilder(). reverse()]]></title>
            <link>https://velog.io/@yes_jihyeon/%EC%9E%90%EB%B0%94JAVA-%EC%A0%95%EC%88%98-%EB%82%B4%EB%A6%BC%EC%B0%A8%EC%88%9C%EC%9C%BC%EB%A1%9C-%EB%B0%B0%EC%B9%98%ED%95%98%EA%B8%B0-String.parseStringn-StringBuilder.-reverse</link>
            <guid>https://velog.io/@yes_jihyeon/%EC%9E%90%EB%B0%94JAVA-%EC%A0%95%EC%88%98-%EB%82%B4%EB%A6%BC%EC%B0%A8%EC%88%9C%EC%9C%BC%EB%A1%9C-%EB%B0%B0%EC%B9%98%ED%95%98%EA%B8%B0-String.parseStringn-StringBuilder.-reverse</guid>
            <pubDate>Fri, 15 Dec 2023 00:03:20 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/yes_jihyeon/post/afd2f014-0bc6-4e79-9ddc-e5eaef5382a9/image.png" alt=""></p>
<p>문제: <a href="https://school.programmers.co.kr/learn/courses/30/lessons/12933">https://school.programmers.co.kr/learn/courses/30/lessons/12933</a></p>
<p><br><br></p>
<hr>
<h2 id="🔻-stringparsestring의-오류">🔻 String.parseString()의 오류</h2>
<p>처음에는 String.parseString(n) 메서드를 사용하려 했으나, Java에서 이런 메서드는 없었다. 
필요할 경우 String.valueOf(n) 또는 Long.toString(n)을 사용하여 long 타입의 숫자를 문자열로 변환할 수 있었다.</p>
<p><br><br></p>
<h2 id="🔻-collectionssort와-stringbuilderreverse의-정렬과-문자열-변환">🔻 Collections.sort()와 StringBuilder.reverse()의 정렬과 문자열 변환</h2>
<p>내가 생각해낸 방법은 아래와 같다.</p>
<ol>
<li>숫자를 각 자릿수별로 분해하여 ArrayList에 저장.</li>
<li>Collections.sort()를 사용하여 내림차순 정렬.</li>
<li>StringBuilder를 사용하여 정렬된 숫자를 문자열로 변환.</li>
</ol>
<p><br><br></p>
<p>이 내용을 토대로 문제를 풀어봤다.</p>
<p><br><br><br><br></p>
<p>--</p>
<h2 id="✅-내-풀이1--arrayssort와-stringbuilder-사용">✅ 내 풀이(1) : Arrays.sort()와 StringBuilder 사용</h2>
<pre><code class="language-java">
import java.util.Arrays;

class Solution {
    public long solution(long n) {
        String str1 = Long.toString(n);
        char[] ch = str1.toCharArray();
        StringBuilder sbuilder = new StringBuilder();

        Arrays.sort(ch);

        for(int i=ch.length-1; i&gt;=0; i--) {
            sbuilder.append(ch[i]);
        }
        String str2 = sbuilder.toString();
        long answer = Long.parseLong(str2);
        return answer;
    }
}
</code></pre>
<p>👉 <strong>문자열을 배열로 변환</strong>하고, <strong>배열을 정렬</strong>한 후 <strong>StringBuilder를 사용</strong>하여 문자열을 뒤집고, 다시 숫자로 변환했다.</p>
<h2 id="✅-내-풀이2--arraylist와-collections-사용">✅ 내 풀이(2) : ArrayList와 Collections 사용</h2>
<pre><code class="language-java">import java.util.ArrayList;
import java.util.Collections;

class Solution {
    public long solution(long n) {
        ArrayList&lt;Integer&gt; temp = new ArrayList&lt;&gt;();
        while(n &gt; 0){
            temp.add((int)(n % 10));
            n /= 10;
        }
        Collections.sort(temp, Collections.reverseOrder());

        StringBuilder result = new StringBuilder();
        for (int digit : temp) {
            result.append(digit);
        }

        return Long.parseLong(result.toString());
    }
}
</code></pre>
<p>👉 <strong>숫자를 분해</strong>하여 각 자릿수를 <strong>내림차순으로 정렬</strong>한 후, 다시 <strong>문자열로</strong> 합치는 과정을 거칩니다.</p>
<p>📚 배운 점: StringBuilder의 reverse() 메서드
StringBuilder 클래스에는 문자열을 뒤집는 reverse() 메서드가 구현되어 있었다. 반면, String 클래스는 불변(immutable)하기 때문에 reverse() 메서드를 직접 제공하지 않는다. 
따라서 문자열을 뒤집기 위해서는 StringBuilder를 사용하는게 효율적이다</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[자바(JAVA)] 나누어 떨어지는 숫자 배열 / Arrays.copyOf(), sort(), ArrayList<>, Collections.sort()]]></title>
            <link>https://velog.io/@yes_jihyeon/%EC%9E%90%EB%B0%94JAVA-%EB%82%98%EB%88%84%EC%96%B4-%EB%96%A8%EC%96%B4%EC%A7%80%EB%8A%94-%EC%88%AB%EC%9E%90-%EB%B0%B0%EC%97%B4-Arrays.copyOf-sort-ArrayList-Collections.sort</link>
            <guid>https://velog.io/@yes_jihyeon/%EC%9E%90%EB%B0%94JAVA-%EB%82%98%EB%88%84%EC%96%B4-%EB%96%A8%EC%96%B4%EC%A7%80%EB%8A%94-%EC%88%AB%EC%9E%90-%EB%B0%B0%EC%97%B4-Arrays.copyOf-sort-ArrayList-Collections.sort</guid>
            <pubDate>Thu, 14 Dec 2023 23:58:02 GMT</pubDate>
            <description><![CDATA[<ul>
<li><img src="https://blog.kakaocdn.net/dn/erufEc/btskAZUCGKY/euNnKWDfcXyrSF25TsGk2K/img.png" alt=""></li>
</ul>
<p><br><br></p>
<p>✅ 내 풀이 ①</p>
<pre><code class="language-java">import java.util.Arrays;
class Solution {
    public int[] solution(int[] arr, int divisor) {
        int[] answer = new int[arr.length];
        int index = 0;          // 새 배열의 인덱스값 확인하기

                for(int i : arr){
            if(i % divisor == 0) {
                answer[index] = i;
                index++;
            }
        }
        if(index == 0) {
            return new int[] {-1};
        }else {
            answer = Arrays.copyOf(answer, index);          // 초기화된 값 잘라내기
            Arrays.sort(answer);
            return answer;
        }
    }
}</code></pre>
<p>  <br><br></p>
<p>처음에는 주어진 배열인 int[]에 임의로 길이를 설정한 후 index변수를 부여하여 잘라내는 방식으로 진행했다.</p>
  <br>

<p>생각해보니 길이를 부여해서 추가작업이 생긴거면 애초에 길이설정이 필요없는 ArrayList로 진행하면 되지 않을까? 라는 생각이 들어서 다시 확인해봤다.</p>
  <br>

<p>✅ 내 풀이 ②</p>
<pre><code class="language-java">import java.util.ArrayList;
import java.util.Collections;
class Solution {
    public ArrayList&lt;Integer&gt; solution(int[] arr, int divisor) {
        ArrayList&lt;Integer&gt; answer = new ArrayList&lt;Integer&gt;();

        for(int i : arr){
            if(i % divisor == 0) {
                answer.add(i);
            }
        }
        if(answer.size() == 0) {
            answer.add(-1);
        }else {
           Collections.sort(answer);

                    }
        return answer;
    }
}</code></pre>
<p><br><br></p>
<p>ArrayList를 사용하면 index를 추가하고 copyOf(배열, 원하는 길이)를 안해도 된다.</p>
<p>다만 return값이 int[]라서 마지막에 int[]배열로 바꿔줘야 하는 단점이 있다.</p>
<p>현재 코드가 정상적으로 진행되는지 확인하기위해 ArrayList<Integer>로 선언했으나 문제의 의도대로 진행하려면 int[]배열로 바꿔야하는점을 기억하자!</p>
<p>  <br><br><br><br></p>
<hr>
<h2 id="arrayscopyof">Arrays.copyOf()</h2>
<p>배열의 특정 부분을 복사하여 새로운 배열을 생성하는 데 사용됩니다. 이 메서드는 원하는 길이로 배열을 크기 조정하거나, 배열의 특정 부분을 추출하고 싶을 때 유용하다.</p>
<p>배열 전체를 복사할 경우</p>
<p><img src="https://blog.kakaocdn.net/dn/eeAlJH/btsklniLBet/niNJrmV6oEk9rR6LffCN60/img.png" alt=""></p>
<p>sourceArray.length를 사용하여 복사할 길이를 지정함</p>
<p>배열의 일부분을 복사할 경우</p>
<p><img src="https://blog.kakaocdn.net/dn/FrZgO/btskuY3rImB/LNNcXw0jtSMuV2sDRmqi3k/img.png" alt=""></p>
<p>배열의 인덱스 1부터 4까지 (4는 포함되지 않음)만 복사한다.</p>
<p>Arrays.copyOf() 메서드는 원본 배열의 요소 유형과 동일한 유형의 새로운 배열을 반환하기 때문에 int[] 배열의 경우에는 int[]로, String[] 배열의 경우에는 String[]로 복사된 배열이 생성된다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[자바(JAVA)] 서울에서 김서방 찾기(equals(), Arrays.asList().indexOf() ), 향상된 for문]]></title>
            <link>https://velog.io/@yes_jihyeon/%EC%9E%90%EB%B0%94JAVA-%EC%84%9C%EC%9A%B8%EC%97%90%EC%84%9C-%EA%B9%80%EC%84%9C%EB%B0%A9-%EC%B0%BE%EA%B8%B0equals-Arrays.asList.indexOf-%ED%96%A5%EC%83%81%EB%90%9C-for%EB%AC%B8</link>
            <guid>https://velog.io/@yes_jihyeon/%EC%9E%90%EB%B0%94JAVA-%EC%84%9C%EC%9A%B8%EC%97%90%EC%84%9C-%EA%B9%80%EC%84%9C%EB%B0%A9-%EC%B0%BE%EA%B8%B0equals-Arrays.asList.indexOf-%ED%96%A5%EC%83%81%EB%90%9C-for%EB%AC%B8</guid>
            <pubDate>Thu, 14 Dec 2023 23:55:52 GMT</pubDate>
            <description><![CDATA[<p><img src="https://blog.kakaocdn.net/dn/dkLyjb/btskgHtNLPY/E7cfBB5E61HfC0zYNdjkUk/img.png" alt=""></p>
<br>

<h1 id="✅-내-풀이"><strong>✅ 내 풀이</strong> </h1>
  <br>

<pre><code class="language-java">class Solution {
    public String solution(String[] seoul) {
        String answer = &quot;&quot;;
        String find = &quot;Kim&quot;;
                for(int i=0; i&lt;seoul.length; i++) {
            if(seoul[i].equals(find)){
                answer = &quot;김서방은 &quot; + i + &quot;에 있다&quot;;
                break;
            }
        }
        return answer;
    }
}</code></pre>
<p>  <br><br></p>
<p>equals는 JAVA에서 두 객체의 서로 동일한지 비교하는 메서드이다.</p>
<p>Object를 상속받았기 때문에 모든 메서드에서 사용할 수 있다.</p>
<p>자바의 원시 타입인 int, double, boolean 등에 대해서도 equals 메서드를 사용할 수 있는데 이 경우에는 원시 타입을 해당하는 객체 래퍼 클래스로 자동 박싱하여 비교한다.</p>
  <br>

<pre><code>int num1 = 10;
int num2 = 20;
boolean isEqual = Integer.valueOf(num1).equals(Integer.valueOf(num2)); // false</code></pre><br>


<p>배열에 대해서도 equals 메서드를 사용할 수 있습니다. 배열의 내용이 같은지 비교하기 위해서는 Arrays 클래스의 equals 메서드를 사용하면 된다.</p>
  <br>

<pre><code>int[] arr1 = {1, 2, 3};
int[] arr2 = {1, 2, 3};
boolean isEqual = Arrays.equals(arr1, arr2); // true</code></pre><br>
위의 예시에서는 Arrays.equals 메서드를 사용하여 arr1과 arr2 배열의 내용을 비교했다.

  <br>

<p> equals 메서드는 모든 객체에 대해 사용할 수 있으며, 숫자, 문자열, 배열 등 모든 타입에 대해 내용 비교를 수행할 수 있습니다.</p>
<p><br><br><br></p>
<h1 id="✅-다른-풀이">✅ 다른 풀이</h1>
  <br>

<pre><code class="language-java">import java.util.Arrays;
public class FindKim {
    public String findKim(String[] seoul){
        //x에 김서방의 위치를 저장하세요.
        int x = Arrays.asList(seoul).indexOf(&quot;Kim&quot;);        
        return &quot;김서방은 &quot;+ x + &quot;에 있다&quot;;
    }</code></pre>
<p>  <br><br></p>
<h2 id="👇--풀이">👇  풀이</h2>
<ol>
<li>int x = Arrays.asList(seoul).indexOf(&quot;Kim&quot;);</li>
</ol>
<ul>
<li>Arrays.asList(seoul)을 사용하여 seoul 배열을 List로 변환한다.</li>
<li>indexOf(&quot;Kim&quot;) 메서드를 사용하여 &quot;Kim&quot;이라는 문자열이 List에서 처음으로 등장하는 인덱스를 찾는다.</li>
<li>찾은 인덱스를 x에 저장한다.</li>
</ul>
<ol start="3">
<li>return &quot;김서방은 &quot;+ x + &quot;에 있다&quot;;</li>
</ol>
<ul>
<li>&quot;김서방은 &quot; 문자열과 x 값을 문자열로 결합한다.</li>
<li>결합한 문자열에 &quot;에 있다&quot;를 더해서 최종 결과를 반환한다.</li>
</ul>
<hr>
<h3 id="arraysaslistseoulindexofkim"><strong>Arrays.asList(seoul).indexOf(&quot;Kim&quot;);</strong>    </h3>
<p>  <br><br></p>
<h3 id="1-aslist"><strong>1. asList</strong></h3>
<blockquote>
<p>asList는 자바에서 배열을 리스트로 변환하기 위한 메서드이다. (java.util.Arrays 클래스에 있음)<br>배열 -&gt; 리스트<br>기본형 배열의 경우 각 요소는 해당 기본형의 래퍼 클래스로 자동 변환된다.</p>
<p>예시)</p>
<p><img src="https://blog.kakaocdn.net/dn/c0FKsT/btskifQQNjz/XjhyCtLxDFCblxz3AA1fBk/img.png" alt=""></p>
</blockquote>
<p><br><br><br></p>
<h3 id="2-indexofkim"><strong>2. indexOf(&quot;Kim&quot;)</strong></h3>
<blockquote>
<p>indexOf()<br>컬렉션 또는 문자열에서 <strong>특정 요소 또는 문자열이 처음으로 등장하는 인덱스를 반환</strong>하는 메서드이다.<br>이 메서드는 주어진 요소 또는 문자열을 찾아서 해당 위치의 인덱스를 반환하며, 찾지 못한 경우 -1을 반환한다.</p>
<p>배열에서 특정 문자열이 처음으로 나오는 인텍스를 찾는건 indexOf()만 있으며, 배열형의 경우 List인터체이스를 구현한 컬렉션 클래스에서만 사용이 가능하다. <br>일반 배열에서는 사용할 수 없기 때문에 Arrays.asList()로 변환되었다.</p>
<p>* indexOf() 메서드의 사용은 컬렉션과 문자열에서 약간 다를 수 있기 때문에 아래의 예시를 참고.</p>
</blockquote>
<p>  <br><br><br></p>
<p>1. 컬렉션에서의 indexOf()</p>
<ul>
<li>List 인터페이스를 구현한 컬렉션 클래스에서 사용할 수 있습니다.</li>
<li>메서드 시그니처: int indexOf(Object o)</li>
<li>주어진 객체 o를 컬렉션에서 찾아서 처음 등장하는 위치의 인덱스를 반환합니다.</li>
<li>찾지 못한 경우 -1을 반환합니다.</li>
</ul>
<p><img src="https://blog.kakaocdn.net/dn/Eownc/btskfbWBaWx/7KaElo5rqvpiyVcRk8IKBK/img.png" alt=""></p>
<p><br><br></p>
<p>2. 문자열에서의 indexOf()</p>
<ul>
<li>String 클래스에 정의된 메서드로 문자열에서 사용할 수 있습니다.</li>
<li>메서드 시그니처: int indexOf(String str)</li>
<li>주어진 문자열 str을 호출한 문자열에서 찾아서 처음 등장하는 위치의 인덱스를 반환합니다.</li>
<li>찾지 못한 경우 -1을 반환합니다.</li>
</ul>
<p><img src="https://blog.kakaocdn.net/dn/yvF4r/btskhCyLQXe/fbrAo3H4xp3399n1Tnf8mK/img.png" alt=""></p>
<hr>
<p><br><br></p>
<h3 id="✅-다른-풀이-2">✅ 다른 풀이 2</h3>
<pre><code class="language-java">import java.util.Arrays;
class Solution {
   public String solution(String[] seoul) {
        for (int i = 0; i&lt;seoul.length;i++)
            if (seoul[i].equals(&quot;Kim&quot;)){
                return &quot;김서방은 &quot;+i+&quot;에 있다&quot;;
            }
        return &quot;-1&quot;;
    }
}</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[[자바(JAVA)] 문자열 내 p와 y의 개수 (toLowerCase)]]></title>
            <link>https://velog.io/@yes_jihyeon/%EC%9E%90%EB%B0%94JAVA-%EB%AC%B8%EC%9E%90%EC%97%B4-%EB%82%B4-p%EC%99%80-y%EC%9D%98-%EA%B0%9C%EC%88%98-toLowerCase</link>
            <guid>https://velog.io/@yes_jihyeon/%EC%9E%90%EB%B0%94JAVA-%EB%AC%B8%EC%9E%90%EC%97%B4-%EB%82%B4-p%EC%99%80-y%EC%9D%98-%EA%B0%9C%EC%88%98-toLowerCase</guid>
            <pubDate>Thu, 14 Dec 2023 23:51:57 GMT</pubDate>
            <description><![CDATA[<p><img src="https://blog.kakaocdn.net/dn/cbVUCT/btskifXuWc5/EMmDbJ8MyH8r5pVdmHwI3K/img.png" alt=""></p>
<p>문제: <a href="https://school.programmers.co.kr/learn/courses/30/lessons/12916">https://school.programmers.co.kr/learn/courses/30/lessons/12916</a></p>
<p><br><br><br><br></p>
<p>✅ 내 풀이</p>
<pre><code>class Solution {
    boolean solution(String s) {
        String lowercase = s.toLowerCase();
        int p = 0, y = 0;
       for(int i=0; i&lt;s.length(); i++) {
           if (lowercase.charAt(i) == &#39;p&#39;){
               p++;
           }
           else if(lowercase.charAt(i) == &#39;y&#39;) {
               y++;
           }
       }

        return p == y;
    }
}</code></pre><p>.toLowerCase();
<img src="https://velog.velcdn.com/images/yes_jihyeon/post/99d09573-e45d-4d57-8c06-b81bd71aa591/image.png" alt=""></p>
<p>주의할 점은 문자열은 불변(immutable)이기 때문에 원래의 문자열이 변경되는 것이 아니라 새로운 문자열이 생성된다는 점이다.</p>
<p><br><br><br></p>
<hr>
<p>✅ 다른풀이1</p>
<pre><code>class Solution {
    boolean solution(String s) {
        s = s.toLowerCase();
        int count = 0;
               for(int i=0; i&lt;s.length(); i++) {
           if (s.charAt(i) == &#39;p&#39;){
               count++;
           }
           else if(s.charAt(i) == &#39;y&#39;) {
               count--;
           }
       }

        return count==0;
    }
}</code></pre><p>1. 매개변수 s를 재정의 하면서 변수를 줄임
2. 값의 비교를 ±로 진행하면서 변수를 줄임</p>
<p>  <br><br></p>
<p>내 코드와 비슷하지만 이런식으로 변수를 줄일 수 있는 방법을 생각해보자!</p>
<p>  <br><br><br></p>
<hr>
<p>✅ 다른풀이2</p>
<pre><code>//stream 사용
class Solution {
    boolean solution(String s) {
        s = s.toUpperCase();

        return s.chars().filter( e -&gt; &#39;P&#39;== e).count() == s.chars().filter( e -&gt; &#39;Y&#39;== e).count();
    }
}</code></pre><p>  <br><br></p>
<p>stream은 아직 배우지 않았으나 코드가 간결해보여서 어떤 의미인지 찾아봤다.</p>
<p>  <br><br></p>
<ol>
<li>s = s.toUpperCase();: 주어진 문자열 s를 대문자로 변환하면서 통일시킴. 
(두 번째 줄에서 사용되는 s.chars() 메서드를 통해 문자열을 문자 스트림으로 변환하기 전에 수행됨)</li>
<li>s.chars().filter( e -&gt; &#39;P&#39;== e): 문자열 s를 문자 스트림으로 변환한 후, 해당 스트림에서 문자 &#39;P&#39;와 일치하는 요소만 필터링을 진행하여 새로운 스트임을 반환함.</li>
<li>.count(): 이전 단계에서 필터링된 문자 스트림의 요소 개수를 계산하여 반환함(즉, 문자열 s에서 문자 &#39;P&#39;의 개수를 카운팅)</li>
<li>s.chars().filter( e -&gt; &#39;Y&#39;== e): 문자열 s를 문자 스트림으로 변환한 후, 해당 스트림에서 문자 &#39;Y&#39;와 일치하는 요소만 필터링함.</li>
<li>.count(): 이전 단계에서 필터링된 문자 스트림의 요소 개수를 계산하여 반환함(즉, 문자열 s에서 문자 &#39;Y&#39;의 개수를 카운팅)</li>
<li>==: 앞서 계산된 &#39;P&#39;의 개수와 &#39;Y&#39;의 개수를 비교한다.</li>
</ol>
<br>

<p>따라서, 반환되는 값은 문자열 s에 포함된 &#39;P&#39;와 &#39;Y&#39;의 개수가 동일한지를 나타내는 boolean 값이다. 
만약 개수가 동일하다면 true를 반환하고, 그렇지 않다면 false를 반환하게 된다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[자바(JAVA)] x만큼 간격이 있는 n개의 숫자 (valueOf())]]></title>
            <link>https://velog.io/@yes_jihyeon/%EC%9E%90%EB%B0%94JAVA-x%EB%A7%8C%ED%81%BC-%EA%B0%84%EA%B2%A9%EC%9D%B4-%EC%9E%88%EB%8A%94-n%EA%B0%9C%EC%9D%98-%EC%88%AB%EC%9E%90-valueOf</link>
            <guid>https://velog.io/@yes_jihyeon/%EC%9E%90%EB%B0%94JAVA-x%EB%A7%8C%ED%81%BC-%EA%B0%84%EA%B2%A9%EC%9D%B4-%EC%9E%88%EB%8A%94-n%EA%B0%9C%EC%9D%98-%EC%88%AB%EC%9E%90-valueOf</guid>
            <pubDate>Thu, 14 Dec 2023 23:19:54 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/yes_jihyeon/post/684b0340-0fb8-4aa6-b5a2-809636c9af8c/image.png" alt=""></p>
<p>문제: <a href="https://school.programmers.co.kr/learn/courses/30/lessons/12954">https://school.programmers.co.kr/learn/courses/30/lessons/12954</a></p>
<p><br><br><br></p>
<h1 id="✅-내-풀이">✅ 내 풀이</h1>
<br>

<pre><code class="language-java">class Solution {
    public long[] solution(int x, int n) {
        long[] answer = new long[n];
        for (int i = 0; i &lt; n; i++) {
            answer[i] = (long) x * (i + 1);
        }
        return answer;
    }
}</code></pre>
<p><br><br>
처음 이 문제를 풀었을때는 오답으로 나왔는데 그 이유는 타입변환에 있었다.
x 자체가 int이기 때문에 long 타입으로 변환해주지 않으면 부분 에러가 발생하게 된다.
그렇지 않으면 큰 수에서 오버플로우가 발생할 수 있다.</p>
<br>

<h2 id="valueof-메서드">valueOf 메서드</h2>
<p>valueOf 메서드는 Java에서 <strong>기본 데이터 타입</strong>을 해당하는 <strong>래퍼 클래스의 객체</strong>로 변환하는 데 사용되는 정적 메서드다. 
이 메서드는 기본 데이터 타입을 객체로 변환하는 과정, 즉 오토박싱(autoboxing)에 유용하다. </p>
<p><br><br></p>
<h3 id="valueof-메서드의-역할과-사용">valueOf 메서드의 역할과 사용</h3>
<ul>
<li>기본 데이터 타입: int, long, float, double, boolean, char 등</li>
<li>래퍼 클래스: Integer, Long, Float, Double, Boolean, Character 등</li>
</ul>
<p><br><br></p>
<pre><code class="language-java">int number = 10;
Integer integerValue = Integer.valueOf(number);
</code></pre>
<p><br><br></p>
<p>이러한 방법으로 문제를 해결하면서 각 메서드와 클래스의 특성을 이해하고, 상황에 맞는 최적의 해결책을 찾는 데 도움이 되었습니다.</p>
<h3 id="사용-예시">사용 예시</h3>
<ol>
<li><strong>정수 변환 예시</strong>:</li>
</ol>
<pre><code>int number = 10;
Integer integerValue = Integer.valueOf(number);</code></pre><p><code>int</code> -&gt; <code>Integer</code> 객체로 변환</p>
<p><br><br> </p>
<ol start="2">
<li><strong>문자열 변환 예시</strong>:</li>
</ol>
<pre><code>Integer integerValue = Integer.valueOf(&quot;123&quot;);</code></pre><p>문자열 <code>&quot;123&quot;</code> -&gt;  <code>Integer</code> 객체로 변환</p>
<p><br><br><br></p>
<h3 id="주의사항">주의사항</h3>
<ul>
<li><code>valueOf</code> 메서드는 자동으로 형변환을 수행하지 않는다. 
예를 들어, <code>Double.valueOf(3)</code>는 오류를 발생시킬 수 있기 때문에 <code>Double.valueOf(3.0)</code>과 같이 실수 리터럴을 사용하는 것을 주의하자.</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[자바(JAVA)] 2016년 (LocalDate, Calendar)]]></title>
            <link>https://velog.io/@yes_jihyeon/%EC%9E%90%EB%B0%94JAVA-2016%EB%85%84-LocalDate-DayOfWeek</link>
            <guid>https://velog.io/@yes_jihyeon/%EC%9E%90%EB%B0%94JAVA-2016%EB%85%84-LocalDate-DayOfWeek</guid>
            <pubDate>Thu, 14 Dec 2023 22:51:15 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/yes_jihyeon/post/95f06284-f7eb-47af-925c-c160dea8b8e7/image.png" alt=""></p>
<p>문제: <a href="https://school.programmers.co.kr/learn/courses/30/lessons/12901">https://school.programmers.co.kr/learn/courses/30/lessons/12901</a></p>
<h1 id="✅-내-풀이">✅ 내 풀이</h1>
<pre><code class="language-java">class Solution {
    public String solution(int a, int b) {
        String dayWeek[] = {&quot;THU&quot;,&quot;FRI&quot;,&quot;SAT&quot;,&quot;SUN&quot;,&quot;MON&quot;,&quot;TUE&quot;,&quot;WED&quot;};       //요일판별
        int monthDay[] ={31,29,31,30,31,30,31,31,30,31,30,31};  //한달일수
        int day = 0;
        String answer = &quot;&quot;;


            for(int i=0; i&lt;a-1; i++) {             // 1월부터 입력한 전달까지만 
                day += monthDay[i];
            }

        day = day + b;        

        answer = dayWeek[(day % 7)]; 
        return answer;
    }
}</code></pre>
<p>이 풀이는 2016년의 특정 날짜에 해당하는 요일을 찾기 위해 배열을 사용했다.</p>
<blockquote>
<ol>
<li>날짜 계산:
for문을 사용하여 주어진 월(a)의 전 월까지의 총 일수를 day 변수에 누적함.<br> 예를 들어, a가 3월이면 1월과 2월의 총 일수를 더한다.
입력된 일(b)을 day에 더하여, 2016년 1월 1일부터 a월 b일까지의 총 일수를 계산한다.<br><br></li>
<li>요일 계산:
계산된 총 일수(day)를 7로 나눈 나머지를 구하여 해당 요일의 인덱스를 얻는다. <br> 문제의 기준점인 2016년 1월 1일이 금요일이기 때문에, 나머지에 해당하는 인덱스를 사용하여 요일을 결정힌다.
예를 들어, 나머지가 0이면 &quot;THU&quot;(목요일), 1이면 &quot;FRI&quot;(금요일)가 되는것이다.<br><br></li>
<li>결과 반환:
계산된 요일을 answer에 할당하고, 이를 반환한다.</li>
</ol>
</blockquote>
<p><br><br><br></p>
<hr>
<h1 id="✅-다른-풀이-1-localdate-활용">✅ 다른 풀이 1: LocalDate 활용</h1>
<pre><code class="language-java">
import java.time.*;
class Solution {
  public String solution(int a, int b) {
      return LocalDate.of(2016, a, b).getDayOfWeek().toString().substring(0,3);
  }
}</code></pre>
<p>Java 8의 <code>LocalDate</code> 클래스를 활용하여 날짜를 처리한다. <code>getDayOfWeek()</code> 메서드를 통해 요일을 구하고, 문자열로 변환하여 출력한다.</p>
<ul>
<li>LocalDate.of(2016, a, b): 2016년의 특정 월(a)과 일(b)에 해당하는 LocalDate 객체를 생성한다.</li>
<li>getDayOfWeek(): 생성된 LocalDate 객체에서 요일 정보를 얻는다.</li>
<li>toString().substring(0, 3): 요일 정보를 문자열로 변환하고, 첫 세 글자를 추출하여 요일의 축약형(예: &quot;TUE&quot;)을 얻는다.</li>
</ul>
<p>LocalDate와 DayOfWeek 클래스는 Java 8에서 도입된 날짜와 시간 API의 일부로, 날짜 관련 연산을 간결하고 직관적으로 처리할 수 있게 해준다.
이 방법은 내부적인 계산 없이 표준 라이브러리를 사용하여 요일을 구하는 가장 간단하고 효율적인 방법이라고 생각한다.</p>
<p><br><br><br></p>
<hr>
<h1 id="✅-다른-풀이-2-calendar-클래스-활용">✅ 다른 풀이 2: Calendar 클래스 활용</h1>
<pre><code class="language-java">
import java.util.*;

class TryHelloWorld {
    public String getDayName(int month, int day)     {
        Calendar cal = new Calendar.Builder().setCalendarType(&quot;iso8601&quot;)
                        .setDate(2016, month - 1, day).build();
        return cal.getDisplayName(Calendar.DAY_OF_WEEK, Calendar.SHORT, new Locale(&quot;ko-KR&quot;)).toUpperCase();
    }
    public static void main(String[] args)     {
        TryHelloWorld test = new TryHelloWorld();
        int a=5, b=24;
        System.out.println(test.getDayName(a,b));
    }
}</code></pre>
<p><code>Calendar</code> 클래스를 사용하여 더 복잡한 달력 처리를 수행하지만 코드가 길어질 수 있다.</p>
<ul>
<li>Calendar.Builder(): Calendar 객체를 구성하기 위한 빌더를 사용한다.</li>
<li>setCalendarType(&quot;iso8601&quot;): ISO 8601 달력 시스템을 사용하도록 설정한다..</li>
<li>setDate(2016, month - 1, day): 날짜를 2016년, 월(month - 1), 일(day)로 설정합니다. Calendar 클래스에서 월은 0부터 시작하기 때문에 month - 1을 사용한다.</li>
<li>getDisplayName(): 설정된 날짜에 해당하는 요일의 이름을 지정된 언어(여기서는 한국어)로 반환한다.</li>
</ul>
<p><br><br><br>
Calendar 클래스는 Java의 초기 버전부터 사용되어 온 전통적인 날짜 및 시간 처리 클래스입니다. 더 복잡한 날짜 시간 계산이 필요할 때 유용하다.
이 방법은 더 많은 설정과 세부적인 날짜 시간 관리가 가능하지만, 코드가 길어지고 복잡해질 수 있다.</p>
<p><br><br><br></p>
<blockquote>
<p>두 방법 모두 유효하지만, LocalDate를 사용하는 방법이 더 현대적이고 간결하다는 점을 기억하자</p>
</blockquote>
<ul>
<li>Calendar를 사용하는 방법은 더 복잡한 날짜 시간 연산에 적합할 수 있다.</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[자바(JAVA)] 핸드폰 번호 가리기 replaceAll,substring]]></title>
            <link>https://velog.io/@yes_jihyeon/%EC%9E%90%EB%B0%94JAVA-%ED%95%B8%EB%93%9C%ED%8F%B0-%EB%B2%88%ED%98%B8-%EA%B0%80%EB%A6%AC%EA%B8%B0-replaceAllsubstring</link>
            <guid>https://velog.io/@yes_jihyeon/%EC%9E%90%EB%B0%94JAVA-%ED%95%B8%EB%93%9C%ED%8F%B0-%EB%B2%88%ED%98%B8-%EA%B0%80%EB%A6%AC%EA%B8%B0-replaceAllsubstring</guid>
            <pubDate>Thu, 14 Dec 2023 21:52:25 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/yes_jihyeon/post/839714a0-851f-4495-9e14-dcc0b6e5bc55/image.png" alt=""></p>
<p>문제: <a href="https://school.programmers.co.kr/learn/courses/30/lessons/12948">https://school.programmers.co.kr/learn/courses/30/lessons/12948</a></p>
<p><br><br></p>
<p>✅ 내 풀이(최종코드)</p>
<br>


<pre><code>
```java
class Solution {
    public String solution(String phone_number) {
        String answer = &quot;&quot;;
        int phoneLength = phone_number.length();  

        answer = &quot;*&quot;.repeat(phoneLength-4);
        answer += phone_number.substring(phone_number.length()-4);
        return answer;
    }
}</code></pre><p><br><br></p>
<hr>
<p>❓ 처음엔 당연히 반복문을 사용했다. 하지만 주어진값이 최대 20자까지 되고, 문제가 간단하기 때문에 <br>&quot;마스킹(&#39;*&#39;) 처리만 하면 될 것 같은데 반복문을 꼭 돌려야 할까??&quot;<br> 라는 의문이 들어서 문자열을 대체하는 방법을 알아보았다.</p>
<p><br><br></p>
<h1 id="1-replaceall과-replace-메서드">1. replaceAll()과 replace() 메서드</h1>
<p>replaceAll()과 replace() 메서드는 둘 다 문자열에서 특정 패턴을 찾아 다른 문자열로 대체하는 역할을 하지만 차이가 있다.
<br></p>
<ol>
<li>replaceAll() 메서드:</li>
</ol>
<ul>
<li>문법: replaceAll(String regex, String replacement)</li>
<li>기능: 주어진 정규 표현식(regex)과 일치하는 모든 부분을 찾아 replacement로 대체한다.</li>
<li>예시:위 예시에서 &quot;o&quot;라는 정규 표현식과 일치하는 모든 부분이 &quot;*&quot;로 대체되어 출력된다.</li>
<li>주의사항:<ul>
<li>replaceAll() 메서드는 정규 표현식을 사용하기 때문에 패턴이 복잡할 수 있습니다. 일반적인 문자열 대체를 위해서는 replace() 메서드를 사용하는 것이 더 편리하다.</li>
</ul>
</li>
</ul>
<p><br><br><br><br><br><br></p>
<ol start="2">
<li>replace() 메서드:</li>
</ol>
<ul>
<li>문법: replace(CharSequence target, CharSequence replacement)</li>
<li>기능: 주어진 대상 문자열(target)과 일치하는 모든 부분을 찾아 replacement로 대체한다.</li>
<li>예시:위 예시에서 &quot;o&quot;라는 대상 문자열과 일치하는 모든 부분이 &quot;*&quot;로 대체되어 출력된다.</li>
<li>javaCopy code</li>
</ul>
<pre><code class="language-java">String str = &quot;Hello, World!&quot;; String replaced = str.replace(&quot;o&quot;, &quot;\*&quot;);
System.out.println(replaced); // Hell\*, W\*rld!</code></pre>
<ul>
<li>주의사항:<ul>
<li>replace() 메서드는 정규 표현식을 사용하지 않으므로 간단한 문자열 대체에 적합하다. 
문자열 내에서 특정 문자 또는 문자열을 대체할 때 사용할 수 있다.</li>
</ul>
</li>
</ul>
<pre><code class="language-java">String str = &quot;Hello, World!&quot;;
String replaced = str.replace(&quot;o&quot;, &quot;*&quot;);
System.out.println(replaced); // Hell*, W*rld!</code></pre>
<p><br><br></p>
<p>따라서, replaceAll() 메서드는 정규 표현식을 사용하여 문자열을 대체하고 싶을 때 사용하며, replace() 메서드는 단순히 특정 문자 또는 문자열을 대체하고 싶을 때 사용한다.
해당 문제는 특정한 단어를 대체하는게 아니기 때문에 다른 방법을 알아보았다.
<br><br><br><br><br><br><br><br></p>
<hr>
<h1 id="2-substring">2. substring()</h1>
<pre><code class="language-java">class Solution {
    public String solution(String phone_number) {
        String answer = &quot;&quot;;

        for(int i=0; i&lt;phone_number.length()-4; i++) {
            answer += &quot;*&quot;;
        }
        answer += phone_number.substring(phone_number.length()-4);
        return answer;
    }
}</code></pre>
<p>substring() 메서드는 문자열에서 원하는 부분 문자열을 추출하는 데 사용된다. 
이 문제에서는 뒤의 4자리만 기존값을 사용하고 나머지는 모두 마스킹처리를 진행하면 되기 때문에 substring()으로 필요한 부분만 추출해서 사용하는게 더 좋다고 생각한다.</p>
<h2 id="substring-메서드의-사용-예시brbr">substring() 메서드의 사용 예시<br><br></h2>
<ol>
<li>substring(int beginIndex) 메서드:</li>
</ol>
<ul>
<li>beginIndex부터 문자열의 끝까지의 부분 문자열을 반환</li>
</ul>
<pre><code class="language-java">String str = &quot;Hello, World!&quot;;
String substr = str.substring(7);
System.out.println(substr); // &quot;World!&quot;</code></pre>
<ul>
<li>위의 예시에서 substring(7)은 인덱스 7부터 문자열의 끝까지의 부분 문자열인 &quot;World!&quot;를 추출합니다.</li>
</ul>
<p><br><br><br></p>
<ol start="2">
<li>substring(int beginIndex, int endIndex) 메서드:</li>
</ol>
<ul>
<li>beginIndex부터 endIndex - 1까지의 부분 문자열을 반환</li>
</ul>
<pre><code class="language-java">String str = &quot;Hello, World!&quot;;
String substr = str.substring(0, 5);
System.out.println(substr); // &quot;Hello&quot;</code></pre>
<p><em>콤마를 안찍으면 기입한 숫자부터 끝까지 출력</em>
<br><br><br></p>
<p>주의사항:</p>
<ul>
<li>substring() 메서드는 추출된 부분 문자열을 반환하며, 원본 문자열은 변경되지 않습니다.</li>
<li>beginIndex는 추출하려는 부분 문자열의 시작 인덱스를 나타내며, endIndex는 추출하려는 부분 문자열의 끝 인덱스를 나타냅니다. endIndex는 실제 추출되는 부분 문자열에는 포함되지 않습니다.</li>
<li>인덱스는 0부터 시작하므로 첫 번째 문자는 인덱스 0입니다.</li>
<li>beginIndex와 endIndex 값은 유효한 범위 내에 있어야 합니다. 그렇지 않으면 IndexOutOfBoundsException이 발생할 수 있습니다.</li>
</ul>
<p>위의 사용 방법을 참고하여 substring() 메서드를 적절히 활용하여 원하는 부분 문자열을 추출할 수 있습니다.</p>
<br>


<p>✅다른풀이(1)</p>
<pre><code class="language-java">class Solution {
  public String solution(String phone_number) {
     char[] ch = phone_number.toCharArray();
     for(int i = 0; i &lt; ch.length - 4; i ++){
         ch[i] = &#39;*&#39;;
     }
     return String.valueOf(ch);
  }
}</code></pre>
<p>.toCharArray();</p>
<p>앞 부분의 배열만 바꾸면 되는거라 바꾸고 스트링으로 다시 변환하기</p>
<p><br><br><br>
✅다른풀이 (2-1)</p>
<pre><code class="language-java">class Solution {
  public String solution(String phone_number) {
      String answer = &quot;&quot;;

        for (int i = 0; i &lt; phone_number.length() - 4; i++)
            answer += &quot;*&quot;;

        answer += phone_number.substring(phone_number.length() - 4);

        return answer;
  }
}</code></pre>
<p>✅다른풀이 (2-2)</p>
<pre><code class="language-java">class Solution {
    public String solution(String phone_number) {
        String answer = &quot;&quot;;
        int phoneLength = phone_number.length();  

        answer = &quot;*&quot;.repeat(phoneLength-4);
        answer += phone_number.substring(phone_number.length()-4);
        return answer;
    }
}</code></pre>
<p>풀이 2번에서는 두번 사용되는 String phone_number의 길이를 변수화 시키고,
.repeat()을 활용하여 phone_number의 자리수가 달라지더라도 (phoneLength-4)번만 마스킹 처리를 진행하게 만든다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[자바(JAVA)] 나누어 떨어지는 숫자 배열( ArrayList<Integer>, Collections.sort() ) ]]></title>
            <link>https://velog.io/@yes_jihyeon/%EC%9E%90%EB%B0%94JAVA-%EB%82%98%EB%88%84%EC%96%B4-%EB%96%A8%EC%96%B4%EC%A7%80%EB%8A%94-%EC%88%AB%EC%9E%90-%EB%B0%B0%EC%97%B4</link>
            <guid>https://velog.io/@yes_jihyeon/%EC%9E%90%EB%B0%94JAVA-%EB%82%98%EB%88%84%EC%96%B4-%EB%96%A8%EC%96%B4%EC%A7%80%EB%8A%94-%EC%88%AB%EC%9E%90-%EB%B0%B0%EC%97%B4</guid>
            <pubDate>Thu, 14 Dec 2023 21:40:22 GMT</pubDate>
            <description><![CDATA[<p><img src="https://blog.kakaocdn.net/dn/dgczso/btskizanZhH/g2QMMjKXHlZjILEhn13Iv1/img.png" alt=""></p>
<p>문제: <a href="https://school.programmers.co.kr/learn/courses/30/lessons/12910">https://school.programmers.co.kr/learn/courses/30/lessons/12910</a></p>
<p><br> <br></p>
<p>✅ 내 풀이</p>
  <br>

<pre><code class="language-java">import java.util.Arrays;
class Solution {
    public int[] solution(int[] arr, int divisor) {
        int[] answer = new int[arr.length];
        int index = 0;

        for(int i=0; i&lt;arr.length; i++) {
            if(arr[i] % divisor == 0) {
                answer[index] = arr[i];
                index++;
            }
        }
        if(index == 0) {
            return new int[] {-1};
        }else {
            answer = Arrays.copyOf(answer, index);
            Arrays.sort(answer);
        }

                return answer;
    }
}</code></pre>
<p>  <br>  <br>  <br> </p>
<hr>
<p>✅  반환값을 바꿔봤음</p>
<pre><code>import java.util.ArrayList;
import java.util.Collections;

class Solution {
//    public int[] solution(int[] arr, int divisor) {
//    public ArrayList&lt;Integer&gt; solution(int[] arr, int divisor) {
        ArrayList&lt;Integer&gt; answer = new ArrayList&lt;Integer&gt;();

                for(int a:arr) {
            if(a % divisor == 0) {
                answer.add(a);
            } 
        }
        if (answer.size() == 0) {
            answer.add(-1);
        }
        Collections.sort(answer);

                return answer;
    }
}</code></pre>  <br>   

<p>이렇게 문제를 바꾸면 안되지만 주어진 문제대로 풀어보기도 했고 내가 원하는 방식으로 풀고싶어서 확인해봤다.</p>
<p>이 문제는 배열의 나머지 여부를 확인 후 조건에 해당되는 값만 배열로 받은 후 오름차순으로 정렬하는 문제이다.</p>
<p>array와 Arrays.sort()로 해결할 수 있으나, 또 사실 기존의 문제가 int[]형으로 돌려주기 때문에 array로 푸는것이 맞으나 </p>
<p>array의 경우 배열이 추가될 때 값의 수정이 아닌 복사 후 새로 만들기 때문에 메모리와 성능적인 관점에서 동적으로 조정이 가능한 ArrayList를 써보고 싶었다.</p>
<p>그리고 array의 경우 초기화가 필수이기 때문에 초기화값(0)이 남을 수 있고, 쓰레기값을 버리기 위해 오름차순으로 정리 후 다시 배열을 생성해야하는 번거로움이 있다고 생각했다.</p>
   <br>  



<hr>
<p>1. 반환타입 고치기 int[] -&gt; ArrayList<Integer></p>
<p>2. 향상된 for문으로 해당값만 answer.add() 하기</p>
<p>3. Collections.sort()를 이용하여 오름차순 정리하기</p>
<blockquote>
<p>* Collections.sort()<br>List 인터페이스를 구현한 모든 컬렉션에 사용할 수 있다.<br>ArrayList, LinkedList, Vector 등과 같은 자바의 내장 컬렉션 클래스뿐만 아니라, Stack, Queue 등과 같은 컬렉션 인터페이스를 구현한 사용자 정의 컬렉션 클래스에도 Collections.sort()를 적용할 수 있다.</p>
<p>Collections.sort()는 컬렉션의 요소를 정렬하기 위해 자바의 정렬 알고리즘을 활용합니다. 따라서 요소들이 정렬 가능한 객체여야 한다. <br> 정렬 가능한 객체는 Comparable 인터페이스를 구현한 객체이거나, Comparator를 제공하여 비교 로직을 지정한 객체이다.  <br>이에 따라 컬렉션의 요소가 정렬 가능한 객체인 경우 Collections.sort()를 사용하여 정렬할 수 있다.</p>
</blockquote>
<p>4. answer.size()로 공배열 여부를 확인 후 공배열일 경우 .add(-1)를 진행하기</p>
   <br> 
   <br> 

<p>👉정답 도출 확인완료</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[자바(JAVA)] 문자열 섞기 (StringBuffer/ StringBuilder)]]></title>
            <link>https://velog.io/@yes_jihyeon/%EC%9E%90%EB%B0%94JAVA-%EB%AC%B8%EC%9E%90%EC%97%B4-%EC%84%9E%EA%B8%B0-StringBuffer-StringBuilder</link>
            <guid>https://velog.io/@yes_jihyeon/%EC%9E%90%EB%B0%94JAVA-%EB%AC%B8%EC%9E%90%EC%97%B4-%EC%84%9E%EA%B8%B0-StringBuffer-StringBuilder</guid>
            <pubDate>Thu, 14 Dec 2023 21:38:00 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>📌 StringBuffer / StringBuilder 설명참조  </p>
<p><a href="https://velog.io/@yes_jihyeon/%EC%9E%90%EB%B0%94JAVA-%EB%AC%B8%EC%9E%90%EC%97%B4-%EB%92%A4%EC%A7%91%EA%B8%B0-StringBuffer-StringBuilder">[프로그래머스(java)] 문자열 뒤집기 (StringBuffer, StringBuilder)</a></p>
</blockquote>
<br>

<hr>
<p><img src="https://blog.kakaocdn.net/dn/OF3k5/btsibpiGRQD/shQFkfqVq8FRlTEpAdzd2k/img.png" alt=""></p>
<p>문제: <a href="https://school.programmers.co.kr/learn/courses/30/lessons/181942">https://school.programmers.co.kr/learn/courses/30/lessons/181942</a></p>
<br>

<br>

<hr>
<p>✅ 내 코드
<br></p>
<pre><code class="language-java">import java.util.*;

class Solution {
    public String solution(String str1, String str2) {
        StringBuilder sb = new StringBuilder();

        for (int i=0; i&lt;str1.length(); i++) {
            sb.append(str1.charAt(i)).append(str2.charAt(i));
        }
        return sb.toString();
    }
}</code></pre>
<br>

<hr>
<br>

<p>&lt;풀이&gt;</p>
<blockquote>
<p>이 문제는 String 문자열을 한 단어씩 번갈아 조합하여 새로운 문자열을 만드는 것이다.<br>.charAt()을 사용하여 문자열을 한개씩 꺼내올 수 있으며, 그렇게 추출한 문자들을 한 문장으로 만들기 위해 반복문 for을 사용했다.<br>
return문으로 돌려주는 형태를 String으로 선언해도 동일한 값은 나오지만 
String의 경우 불변(immutable)한 클래스이기 때문에 비용이 증가하여 비효율적이다.
그래서 가변 클래스인 StringBuilder()/ StringBuffer()를 사용하는게 좋다.</p>
</blockquote>
<p><br><br><br></p>
<hr>
<p>&lt;비교&gt;
<br></p>
<p><img src="https://blog.kakaocdn.net/dn/bD2JBa/btsikACb3oK/bdymsJuHDcRNnNDPeSuSUk/img.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[자바(JAVA)] 자릿수 더하기]]></title>
            <link>https://velog.io/@yes_jihyeon/%EC%9E%90%EB%B0%94JAVA-%EC%9E%90%EB%A6%BF%EC%88%98-%EB%8D%94%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@yes_jihyeon/%EC%9E%90%EB%B0%94JAVA-%EC%9E%90%EB%A6%BF%EC%88%98-%EB%8D%94%ED%95%98%EA%B8%B0</guid>
            <pubDate>Thu, 14 Dec 2023 21:33:17 GMT</pubDate>
            <description><![CDATA[<p><img src="https://blog.kakaocdn.net/dn/cwXv0N/btshyzRUNO2/TPoSOxmy0FdK06EkaLZyGK/img.png" alt=""></p>
<p>문제:<a href="https://school.programmers.co.kr/learn/courses/30/lessons/12931">https://school.programmers.co.kr/learn/courses/30/lessons/12931</a></p>
<p>✅ 내 코드_나머지값을 활용함<br><br></p>
<pre><code class="language-java">class Solution {
    public int solution(int n) {
        int answer = 0;

        while(n&gt;0){
            answer+=n%10;
            n/=10;
        }

        return answer;
    }
}</code></pre>
<br>


<blockquote>
<p>조건: n &gt; 0<br>활용방안: 나머지 수</p>
</blockquote>
<p><br><br></p>
<blockquote>
<p>&lt;풀이&gt;  </p>
<p>n = 1234일 때 <br>n % 10 = 123.4  즉, 값 4를 반환함<br>n / = 10으로 반복 진행<br>n의 진행값 : (<strong>123</strong>.<strong>4</strong> (<strong>123</strong>) -&gt; <strong>12</strong>.<strong>3</strong> (<strong>12</strong>)-&gt; <strong>1</strong>.<strong>2</strong> (<strong>1</strong>) -&gt; 0.<strong>1</strong> (0) ) 반복종료</p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[[자바(JAVA)] 배열의 평균값 (stream average()와 orElse(0))]]></title>
            <link>https://velog.io/@yes_jihyeon/%EC%9E%90%EB%B0%94JAVA-%EB%B0%B0%EC%97%B4%EC%9D%98-%ED%8F%89%EA%B7%A0%EA%B0%92-stream-average%EC%99%80-orElse0</link>
            <guid>https://velog.io/@yes_jihyeon/%EC%9E%90%EB%B0%94JAVA-%EB%B0%B0%EC%97%B4%EC%9D%98-%ED%8F%89%EA%B7%A0%EA%B0%92-stream-average%EC%99%80-orElse0</guid>
            <pubDate>Thu, 14 Dec 2023 21:28:49 GMT</pubDate>
            <description><![CDATA[<p><img src="https://blog.kakaocdn.net/dn/SO5gM/btshp5knmKK/3JtVXihvW6ACjvyleNrmeK/img.png" alt=""></p>
<p>문제: <a href="https://school.programmers.co.kr/learn/courses/30/lessons/120817">https://school.programmers.co.kr/learn/courses/30/lessons/120817</a></p>
<p><br><br><br></p>
<p>✅ 내 풀이
<br></p>
<pre><code class="language-java">class Solution {
    public double solution(int[] numbers) {
        double answer = 0;
        int sum = 0;
        for(int i: numbers){
            sum+=i;
        }
        answer = sum/(double)numbers.length;
        return answer;
    }
}</code></pre>
<br>

<hr>
<pre><code class="language-java">// 다른풀이 stream()
import java.util.Arrays;

class Solution {
    public double solution(int[] numbers) {
        return Arrays.stream(numbers).average().orElse(0);
    }
}</code></pre>
<br>

<hr>
<br>

<h2 id="📌stream">📌stream()</h2>
<br>


<p><strong>average()와 orElse(0)는 스트림을 활용하여 평균 값을 계산하고 반환할 때 유용한 명령어이다.</strong></p>
<blockquote>
<p><strong>stream()</strong>은 데이터의 연속적인 흐름을 나타내는 기능이며 컬렉션(Collection)과 배열 등의 데이터 소스로부터 데이터를 받아들이고, 다양한 중간 연산과 최종 연산을 통해 데이터를 처리하는 기능을 제공한다.</p>
</blockquote>
<p>  <br><br></p>
<p>🔻 특징</p>
  <br>

<ol>
<li><strong>데이터 소스</strong>: 스트림은 컬렉션, 배열, I/O 채널 등 다양한 데이터 소스로부터 데이터를 받아들일 수 있다.</li>
<li><strong>연속적인 흐름</strong>: 스트림은 데이터를 순차적으로 한 번에 하나씩 처리합니다. 이는 데이터를 메모리에 모두 로드하지 않고 필요한 데이터만 처리할 수 있게 해준다.</li>
<li><strong>중간 연산</strong>: 스트림은 중간 연산을 통해 데이터를 변환, 필터링, 정렬 등의 작업을 수행할 수 있습니다. 이러한 중간 연산은 지연(lazy) 연산이며, 최종 연산이 호출될 때에만 실제로 수행된다.</li>
<li><strong>최종 연산</strong>: 스트림은 최종 연산을 통해 데이터를 처리하고 결과를 반환합니다. 최종 연산은 스트림 파이프라인을 종료시키는 역할을 수행하며, 스트림의 요소를 수집하거나 결과를 반환하는 역할을 할 수 있다.</li>
<li><strong>내부 반복</strong>: 스트림은 내부적으로 반복을 처리하므로 개발자가 직접 반복 코드를 작성할 필요가 없다.</li>
</ol>
<br>

<p>💬 스트림을 사용하기 위해 다음과 같은 일련의 단계를 따를 수 있다.
<br></p>
<ol>
<li><strong>스트림 생성</strong>: 데이터 소스로부터 스트림을 생성 후 Stream 인터페이스의 정적 메서드를 사용하거나, 컬렉션의 stream() 메서드를 호출하여 스트림을 생성할 수 있다.</li>
<li><strong>중간 연산</strong>: 생성된 스트림에 대해 중간 연산을 적용한다. 이 단계에서 데이터를 변환, 필터링, 정렬 등의 작업을 수행할 수 있고, 중간 연산은 여러 개를 연결하여 체인 형태로 작성할 수 있다.</li>
<li><strong>최종 연산</strong>: 최종 연산을 통해 스트림의 요소를 처리하고 결과를 반환한다. 이 단계에서 스트림의 파이프라인이 종료되며, 결과를 수집하거나 반환할 수 있다.</li>
</ol>
<p><br><br><br></p>
<p><br><br><br>
✅ 스트림(stream) 예시
<br></p>
<pre><code class="language-java">import java.util.Arrays;
import java.util.List;
public class StreamExample {
    public static void main(String[] args) {
        List&lt;String&gt; fruits = Arrays.asList(&quot;apple&quot;, &quot;banana&quot;, &quot;orange&quot;, &quot;kiwi&quot;, &quot;grape&quot;);

        fruits.stream()  // 스트림 생성
                .filter(fruit -&gt; fruit.length() &gt; 5)  // 중간 연산: 길이가 5보다 큰 과일만 필터링
                .map(String::toUpperCase)  // 중간 연산: 모든 과일을 대문자로 변환
                .sorted()  // 중간 연산: 과일을 알파벳순으로 정렬
                .forEach(System.out::println);  // 최종 연산: 결과 출력
    }
}</code></pre>
<br>

<blockquote>
<p>예시에서는 fruits 리스트를 스트림으로 변환하고, 중간 연산과 최종 연산을 사용하여 데이터를 처리하고 결과를 출력하고 있다.<br>filter(), map(), sorted() 등의 중간 연산을 체인 형태로 연결하고, forEach()를 통해 최종 연산을 수행하여 각 과일을 대문자로 변환하고 알파벳순으로 정렬한 결과를 출력한다.<br>스트림은 데이터 처리 작업을 간결하고 효율적으로 수행할 수 있는 강력한 기능으로, 함수형 프로그래밍 스타일의 코드를 작성할 수 있으며, 스트림은 병렬 처리 등 다양한 기능을 지원하므로 대량의 데이터를 처리할 때 효과적으로 사용할 수 있다.</p>
</blockquote>
<p><br><br></p>
<hr>
<p><br><br><br></p>
<h2 id="❗-자주-사용되는-몇-가지-스트림-연산">❗ 자주 사용되는 몇 가지 스트림 연산</h2>
  <br>


<p><strong>1. 중간 연산 (Intermediate Operations):</strong></p>
<br>

<ul>
<li>filter(Predicate<T> predicate): 주어진 조건에 맞는 요소만을 선택합니다.</li>
<li>map(Function&lt;T, R&gt; mapper): 요소를 다른 형태로 변환합니다.</li>
<li>flatMap(Function&lt;T, Stream<R>&gt; mapper): 요소를 다른 형태의 스트림으로 변환한 후 펼쳐서 결합합니다.</li>
<li>sorted(): 요소를 정렬합니다.</li>
<li>distinct(): 중복 요소를 제거합니다.</li>
<li>limit(long maxSize): 요소의 개수를 제한합니다.</li>
<li>skip(long n): 처음 n개의 요소를 건너뜁니다.</li>
<li>peek(Consumer<T> action): 요소를 소비하면서 중간 결과를 확인합니다.</li>
</ul>
<p><br><br></p>
<p><strong>2. 최종 연산 (Terminal Operations):</strong>
<br></p>
<ul>
<li>forEach(Consumer<T> action): 각 요소를 소비하여 작업을 수행합니다.</li>
<li>count(): 요소의 개수를 반환합니다.</li>
<li>collect(Collector&lt;T, A, R&gt; collector): 요소를 수집하여 컬렉션, 맵, 문자열 등의 형태로 반환합니다.</li>
<li>min(Comparator<T> comparator) / max(Comparator<T> comparator): 최소값 또는 최대값을 반환합니다.</li>
<li>anyMatch(Predicate<T> predicate): 주어진 조건을 만족하는 요소가 하나라도 있는지 확인합니다.</li>
<li>allMatch(Predicate<T> predicate): 모든 요소가 주어진 조건을 만족하는지 확인합니다.</li>
<li>noneMatch(Predicate<T> predicate): 모든 요소가 주어진 조건을 만족하지 않는지 확인합니다.</li>
<li>findFirst(): 첫 번째 요소를 반환합니다.</li>
<li>findAny(): 임의의 요소를 반환합니다.</li>
</ul>
<p><br><br><br><br><br><br><br><br><br><br></p>
<p>✅ average() // orElse(0): 예제
<br></p>
<pre><code class="language-java">import java.util.stream.IntStream;
public class StreamAverageExample {
    public static void main(String[] args) {
        IntStream numbers = IntStream.of(1, 2, 3, 4, 5);
        double average = numbers.average().orElse(0);
        System.out.println(&quot;Average: &quot; + average);
    }
}</code></pre>
<hr>
  <br>

<p>🔹 average():</p>
  <br>

<ul>
<li>average()는 스트림의 요소들의 평균 값을 계산하는 <strong>최종 연산</strong>이다.</li>
<li>double 타입의 OptionalDouble 객체를 반환한다.</li>
<li>스트림이 비어있는 경우 OptionalDouble.empty()를 반환한다.</li>
<li>예를 들어, IntStream에서 average()를 호출하면 평균 값을 계산하여 반환한다.</li>
<li>위의 예시에서는 IntStream에 대한 평균 값을 계산하고 있습니다. average()를 호출한 후 orElse(0)을 사용하여 평균 값이 존재하지 않는 경우에는 0을 반환하도록 처리되었다.</li>
</ul>
<p><br><br></p>
<p>🔹 orElse(0):</p>
 <br> 

<ul>
<li>orElse(0)는 Optional 객체가 비어있는 경우 대체 값을 반환하는 메서드이다.</li>
<li>Optional 객체가 비어있는 경우, 대체 값을 반환하며, 비어있지 않은 경우 Optional 객체의 값을 반환한다.</li>
<li>위 예시 코드에서 average() 메서드의 결과는 OptionalDouble 객체이므로, orElse(0)를 호출하여 평균 값이 존재하지 않는 경우 0을 반환하도록 처리되었다.</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[자바(JAVA)] 최댓값 만들기(1) (Arrays.sort)]]></title>
            <link>https://velog.io/@yes_jihyeon/%EC%9E%90%EB%B0%94JAVA-%EC%B5%9C%EB%8C%93%EA%B0%92-%EB%A7%8C%EB%93%A4%EA%B8%B0-1</link>
            <guid>https://velog.io/@yes_jihyeon/%EC%9E%90%EB%B0%94JAVA-%EC%B5%9C%EB%8C%93%EA%B0%92-%EB%A7%8C%EB%93%A4%EA%B8%B0-1</guid>
            <pubDate>Thu, 14 Dec 2023 21:21:49 GMT</pubDate>
            <description><![CDATA[<p><img src="https://blog.kakaocdn.net/dn/bc3zy5/btshp3tT9Hp/Zjdo5BK9jNnYFtC4EzOlX1/img.png" alt=""></p>
<p>문제: <a href="https://school.programmers.co.kr/learn/courses/30/lessons/120847">https://school.programmers.co.kr/learn/courses/30/lessons/120847</a></p>
<p>✅ 내 풀이
<br></p>
<pre><code class="language-java">import java.util.Arrays;
class Solution {
    public int solution(int[] numbers) {
        Arrays.sort(numbers);               // 오름차순 정렬 후 
        return numbers[numbers.length-1] * numbers[numbers.length-2];  // 인덱스값으로 곱하기
    }
}</code></pre>
<p>  <br><br></p>
<hr>
<p>📌  sort()<br>java.util.Arrays 클래스에는 배열을 정렬하는 데 사용할 수 있는 <strong>sort() 메서드</strong>가 있다.</p>
  <br>

<p>이 메서드를 사용하면 배열의 요소를 오름차순으로 정렬할 수 있다.
<br></p>
<pre><code>public static void sort(int[] a)  // a : 정렬하려는 배열</code></pre><p>  <br><br></p>
<p>✅ sort() 예시코드</p>
  <br>

<pre><code class="language-java">import java.util.Arrays;
public class Main {
    public static void main(String[] args) {
        int[] array = {5, 2, 8, 1, 6};

        Arrays.sort(array);             // array를 오름차순으로 정렬함

        // 정렬된 배열 출력               
        System.out.print(Arrays.toString(array));      
    }
}

// 출력값 : [1, 2, 5, 6, 8]</code></pre>
<br>]]></description>
        </item>
        <item>
            <title><![CDATA[[자바(JAVA)] 배열 자르기(Arrays.copyOfRange() )]]></title>
            <link>https://velog.io/@yes_jihyeon/%EC%9E%90%EB%B0%94JAVA-%EB%B0%B0%EC%97%B4-%EC%9B%90%EC%86%8C%EC%9D%98-%EA%B8%B8%EC%9D%B4</link>
            <guid>https://velog.io/@yes_jihyeon/%EC%9E%90%EB%B0%94JAVA-%EB%B0%B0%EC%97%B4-%EC%9B%90%EC%86%8C%EC%9D%98-%EA%B8%B8%EC%9D%B4</guid>
            <pubDate>Thu, 14 Dec 2023 21:20:04 GMT</pubDate>
            <description><![CDATA[<p><img src="https://blog.kakaocdn.net/dn/ci4gHQ/btshqUJv4gC/4kWcyqtxATRZJIEMTWwKsk/img.png" alt=""></p>
<p>문제: <a href="https://school.programmers.co.kr/learn/courses/30/lessons/120854">https://school.programmers.co.kr/learn/courses/30/lessons/120854</a></p>
<p>✅ 내 코드</p>
<pre><code class="language-java">
class Solution {
    public int[] solution(int[] numbers, int num1, int num2) {
        int index = 0;
        int[] answer = new int[num2 - num1 + 1];     // 배열의 크기 지정
        for (int i = num1; i &lt;= num2; i++) {
            answer[index] = numbers[i];                // 여기서 값을 받기 위해 새로운 배열을 생성했음
            index++;                                

          }
        return answer;
    }
}</code></pre>
<p><br><br></p>
<hr>
<p>✅ 다른풀이(1) (코드 간결화)</p>
<pre><code>class Solution {
    public int[] solution(int[] numbers, int num1, int num2) {
        int[] answer = new int[num2 - num1 + 1];
        for (int i = num1; i &lt;= num2; i++) {
            answer[i -num1] = numbers[i];
        }

        return answer;
    }
}</code></pre><p>  <br><br></p>
<hr>
<p>✅ 다른풀이(2) </p>
<pre><code>import java.util.*;
class Solution {
    public int[] solution(int[] numbers, int num1, int num2) {
        return Arrays.copyOfRange(numbers, num1, num2 + 1);
    }
}</code></pre><p>  <br><br></p>
<p>📌 copyOfRange()</p>
<p>java.util.Arrays.copyOfRange() 메서드는 Java에서 배열의 특정 구간을 복사하여 새로운 배열을 생성하는 기능을 제공하는 메서드이다.</p>
<pre><code>public static T[] copyOfRange(T[] original, int from, int to)</code></pre><ul>
<li>original: 복사할 원본 배열</li>
<li>from: 복사할 구간의 시작 인덱스 (포함)</li>
<li>to: 복사할 구간의 끝 인덱스 (포함하지 않음)</li>
</ul>
<br>

<p>✔ original 배열에서 from 인덱스부터 to 인덱스까지의 구간을 새로운 배열로 복사하여 반환하며, 반환되는 배열의 길이는 (to - from)</p>
<p>이다.</p>
<p>from = 이상 ( from(인덱스 값) &lt;= x)to = 미만( x &lt; to(인덱스 값))</p>
<p><img src="https://blog.kakaocdn.net/dn/efkYhJ/btshp2nRng1/w4hSflQKQIv3qgkWQj2DV1/img.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[자바(JAVA)] 짝수 홀수 개수]]></title>
            <link>https://velog.io/@yes_jihyeon/%EC%9E%90%EB%B0%94JAVA-%EC%A7%9D%EC%88%98-%ED%99%80%EC%88%98-%EA%B0%9C%EC%88%98</link>
            <guid>https://velog.io/@yes_jihyeon/%EC%9E%90%EB%B0%94JAVA-%EC%A7%9D%EC%88%98-%ED%99%80%EC%88%98-%EA%B0%9C%EC%88%98</guid>
            <pubDate>Thu, 14 Dec 2023 21:17:01 GMT</pubDate>
            <description><![CDATA[<p><img src="https://blog.kakaocdn.net/dn/2lHUS/btshrz6bwXP/QjOff1xyjDmBXRXYpUoykK/img.png" alt=""></p>
<p>문제: <a href="https://school.programmers.co.kr/learn/courses/30/lessons/120824">https://school.programmers.co.kr/learn/courses/30/lessons/120824</a></p>
<p><br><br><br></p>
<p>✅ 내 풀이
<br></p>
<pre><code class="language-java">
class Solution {
    public int[] solution(int[] num_list) {
        int even = 0, odd = 0;
        int[] answer = new int[2];

                for (int i=0; i&lt; num_list.length; i++){
            if(num_list[i] % 2 == 0) {
                even++;
            }
            else odd++; 
            answer[0] = even;
            answer[1] = odd;
        }
        return answer;
    }
}</code></pre>
<h2 id="brbr">  <br><br></h2>
<p>✅ 1. 다른풀이 (코드 간결화)
<br></p>
<pre><code>// 1. 다른풀이 (코드 간결화)
class Solution {
    public int[] solution(int[] num_list) {
        int[] answer = new int[2];

        for(int i = 0 ; i &lt; num_list.length ; i++){
            if(num_list[i]%2==0){
                answer[0]++;
            }else{
                answer[1]++;
            }
        }

        return answer;
    }
}</code></pre><blockquote>
<p>📄 내 코드보다 깔끔한 이유 ❓<br>: 출력값이 [짝수, 홀수]로 나오기 때문에 굳이 변수를 선언하는게 아니라 if문에 맞춰서 answer[0], [1]값을 바로 카운팅하면 된다.</p>
</blockquote>
<p><br><br></p>
<hr>
<p>✅ 2. 다른풀이</p>
<pre><code>class Solution {
    public int[] solution(int[] num_list) {
        int[] answer = new int[2];
        for(int i = 0; i &lt; num_list.length; i++)
            answer[num_list[i] % 2]++;

        return answer;
    }
}</code></pre><hr>
<p>📄 풀이)</p>
<pre><code>num_list = {1, 2, 3, 4, 5}; 일때
num_list[0] % 2 = 1;
num_list[1] % 2 = 0;
num_list[2] % 2 = 1;
num_list[3] % 2 = 0;
num_list[4] % 2 = 1;
answer[1]++;
answer[0]++;
answer[1]++;
answer[0]++;
answer[1]++;

// 결과값 형태: [짝수의 개수, 홀수의 개수]
// 짝수 = 나머지가 0임 = answer의 0번째 인덱스에 카운팅됨

// 즉, answer[num_list[i] % 2]++; 코드로 짝수 or 홀수 판별 후 카운팅까지 가능함</code></pre><p><br><br></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[자바(JAVA)] 문자 반복 출력하기]]></title>
            <link>https://velog.io/@yes_jihyeon/%EC%9E%90%EB%B0%94JAVA-%EB%AC%B8%EC%9E%90-%EB%B0%98%EB%B3%B5-%EC%B6%9C%EB%A0%A5%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@yes_jihyeon/%EC%9E%90%EB%B0%94JAVA-%EB%AC%B8%EC%9E%90-%EB%B0%98%EB%B3%B5-%EC%B6%9C%EB%A0%A5%ED%95%98%EA%B8%B0</guid>
            <pubDate>Fri, 08 Dec 2023 10:34:48 GMT</pubDate>
            <description><![CDATA[<p><img src="https://blog.kakaocdn.net/dn/6XEA6/btshp6p4AyK/0lizBKWJ1jqkFgkUJhzQt1/img.png" alt=""></p>
<p>문제: <a href="https://school.programmers.co.kr/learn/courses/30/lessons/120825">https://school.programmers.co.kr/learn/courses/30/lessons/120825</a></p>
<p><br><br></p>
<p>✅ 내 풀이</p>
<pre><code class="language-java">class Solution {
    public String solution(String my_string, int n) {
        String answer = &quot;&quot;;

        for(int i=0; i&lt;my_string.length();i++){
            for (int j=0; j&lt;n; j++){
                answer += my_string.charAt(i);
            }
        }
        return answer;
    }
}</code></pre>
<hr>
<p>  <br><br></p>
<p>🔻 1. 다른풀이</p>
  <br>

<pre><code class="language-java">class Solution {
    public String solution(String my_string, int n) {
        String answer = &quot;&quot;;
        String[] str = my_string.split(&quot;&quot;);       // 문자열을 한글자씩 분리 후 배열저장
        for(int i=0; i&lt;my_string.length(); i++){  
            answer += str[i].repeat(n);               // 반복 후 String으로 저장    
        }
        return answer;
    }
}</code></pre>
<p><br><br></p>
<p>📌split () : 자바의 split() 메서드는 문자열을 특정 구분자(delimiter)를 기준으로 분리하여 문자열 배열로 반환하는 기능을 제공함.</p>
  <br>

<p>ex) abcdef -&gt; split(&quot;c&quot;)</p>
<br>
\> ab, def

  <br>

<p>split(&quot;&quot;) -&gt; 모든 단어를 끊어서 배열에 저장한다.</p>
<p>  <br><br></p>
<hr>
<p>🔻 2. 다른풀이</p>
  <br>

<pre><code class="language-java">class Solution {
    public String solution(String my_string, int n) {
        StringBuilder sb = new StringBuilder();
        for(char c : my_string.toCharArray()){
            sb.append((c + &quot;&quot;).repeat(n));  // c배열값 하나씩 돌리면서 반복을 함께 진행
        }
        return sb.toString();
    }
}</code></pre>
  <br>

<p>📌 toCharArray()는 자바 문자열을 문자 배열(char array)로 변환하는 메서드이다.</p>
<p>  <br><br></p>
<p>이 메서드는 문자열의 각 문자를 개별적인 배열 요소로 만들어 새로운 char 배열을 반환한다.</p>
<p>  <br><br></p>
<pre><code class="language-java">String originalString = &quot;Hello&quot;;
char[] charArray = originalString.toCharArray();
for (char ch : charArray) {
    System.out.println(ch);
}

// 출력값
// H
// e
// l
// l
// o</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[[자바(JAVA)] 특정 문자 제거하기(replace)]]></title>
            <link>https://velog.io/@yes_jihyeon/%EC%9E%90%EB%B0%94JAVA-%ED%8A%B9%EC%A0%95-%EB%AC%B8%EC%9E%90-%EC%A0%9C%EA%B1%B0%ED%95%98%EA%B8%B0replace</link>
            <guid>https://velog.io/@yes_jihyeon/%EC%9E%90%EB%B0%94JAVA-%ED%8A%B9%EC%A0%95-%EB%AC%B8%EC%9E%90-%EC%A0%9C%EA%B1%B0%ED%95%98%EA%B8%B0replace</guid>
            <pubDate>Fri, 08 Dec 2023 10:25:41 GMT</pubDate>
            <description><![CDATA[<p><img src="https://blog.kakaocdn.net/dn/Y2OYG/btshrcXlRxS/LO8YI5Ci4BKcm6Y4ICN041/img.png" alt=""></p>
<p>문제: <a href="https://school.programmers.co.kr/learn/courses/30/lessons/120826">https://school.programmers.co.kr/learn/courses/30/lessons/120826</a></p>
<p><br><br></p>
<p>✅ 내 풀이</p>
<pre><code class="language-java">class Solution {
    public String solution(String my_string, String letter) {
        String answer = &quot;&quot;;

        answer = my_string.replace(letter, &quot;&quot;);

        return answer;
    }
}</code></pre>
<p><br><br></p>
<h4 id="📌-replace">📌 replace() </h4>
<p>: 문자열에서 특정 문자 또는 문자열을 다른 문자 또는 문자열로 대체하는 기능을 제공한다.</p>
<br>

<pre><code>// 단일 문자 대체
String originalString = &quot;Hello, World!&quot;;
String replacedString = originalString.replace(&#39;o&#39;, &#39;x&#39;);
System.out.println(replacedString);  // &quot;Hellx, Wxrld!&quot;

// 문자열 대체 
// target과 일치하는 모든 문자열을 변경한다.
String originalString2 = &quot;Hello, Java!&quot;;
String replacedString2 = originalString2.replace(&quot;Java&quot;, &quot;Python&quot;);
System.out.println(replacedString2);  // &quot;Hello, Python!&quot;</code></pre>  <br>

<p>❌ replace() 메서드는 원본 문자열을 변경하지 않고 대체된 새로운 문자열을 반환한다.</p>
<p>따라서 원본 문자열을 변경하고자 한다면 <span style="background-color:#FFFF81"> StringBuilder</span> 또는 <span style="background-color:#FFFF81"> StringBuffer</span>를 사용하여 문자열을 조작해야 한다.</p>
<br>

<p>참고) <a href="https://velog.io/@yes_jihyeon/%EC%9E%90%EB%B0%94JAVA-%EB%AC%B8%EC%9E%90%EC%97%B4-%EB%92%A4%EC%A7%91%EA%B8%B0-StringBuffer-StringBuilder">https://velog.io/@yes_jihyeon/%EC%9E%90%EB%B0%94JAVA-%EB%AC%B8%EC%9E%90%EC%97%B4-%EB%92%A4%EC%A7%91%EA%B8%B0-StringBuffer-StringBuilder</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[자바(JAVA)] 문자열 뒤집기 (StringBuffer, StringBuilder)]]></title>
            <link>https://velog.io/@yes_jihyeon/%EC%9E%90%EB%B0%94JAVA-%EB%AC%B8%EC%9E%90%EC%97%B4-%EB%92%A4%EC%A7%91%EA%B8%B0-StringBuffer-StringBuilder</link>
            <guid>https://velog.io/@yes_jihyeon/%EC%9E%90%EB%B0%94JAVA-%EB%AC%B8%EC%9E%90%EC%97%B4-%EB%92%A4%EC%A7%91%EA%B8%B0-StringBuffer-StringBuilder</guid>
            <pubDate>Fri, 08 Dec 2023 10:21:28 GMT</pubDate>
            <description><![CDATA[<p><img src="https://blog.kakaocdn.net/dn/G4ytW/btshsGcxMe0/K1WqftvXp6L6fEmSaLHAtk/img.png" alt=""></p>
<p>문제: <a href="https://school.programmers.co.kr/learn/courses/30/lessons/120822">https://school.programmers.co.kr/learn/courses/30/lessons/120822</a></p>
<p><br><br><br></p>
<p>✅ 내 코드</p>
<pre><code class="language-java">

class Solution {
    public String solution(String str) {
        String answer = &quot;&quot;;

        for(int i=str.length()-1; i &gt;= 0; i--){
            answer+=str.charAt(i);
        }
        return answer;
    }
}</code></pre>
<p>  <br><br></p>
<p>📌 다른풀이(1) : StringBuilder() 사용</p>
<pre><code>class Solution {
    public String solution(String my_string) {

        StringBuilder sb = new StringBuilder(my_string);
        String answer = sb.reverse().toString();

        return answer;
    }
}</code></pre><p><br><br></p>
<p>📌  다른풀이(2) : StringBuffer() 사용</p>
<pre><code>class Solution {
    public String solution(String my_string) {

        StringBuffer sb = new StringBuffer(my_string);
        String answer = sb.reverse().toString();

        return answer;
    }
}</code></pre><p><br><br><br><br><br><br></p>
<hr>
<p>📘 String , StringBuilder, StringBuffer의 차이점</p>
<p>1. 불변성(Immutability)<br>2. 스레드 안전성(Thread Safety)<br>3. 성능</p>
<hr>
<br>

<table>
<thead>
<tr>
<th></th>
<th></th>
<th></th>
<th></th>
<th></th>
</tr>
</thead>
<tbody><tr>
<td></td>
<td>불변성</td>
<td>안전성</td>
<td>성능</td>
<td>추천환경</td>
</tr>
<tr>
<td>String</td>
<td>불변(immutable)한 클래스</td>
<td>안전함</td>
<td>문자열 조작이 빈번하게 발생하는 경우 메모리 할당과 가비지 컬렉션 비용이 증가</td>
<td>변경이 없는 단일 스레드 환경</td>
</tr>
<tr>
<td>StringBuilder</td>
<td>가변(mutable)한 클래스</td>
<td>안전하지 않음</td>
<td>내부 배열을 조작하므로 객체 생성 비용x<br></td>
<td>단일 스레드 환경</td>
</tr>
<tr>
<td>StringBuffer</td>
<td>가변(mutable)한 클래스</td>
<td><strong>안전함</strong></td>
<td>내부 배열을 조작하므로 객체 생성 비용x<br>단, 동기화 메커니즘을 내부적으로 처리하기 때문에 조금 더 오버헤드가 발생할 수 있음</td>
<td>멀티스레드 환경</td>
</tr>
</tbody></table>
<p><br><br></p>
<h3 id="1-💬-불변성immutability">1. 💬 불변성(Immutability)</h3>
  <br>

<p>        🔸 String - 불변(immutable)한 클래스</p>
  <br>

<p>          : 한 번 생성된 String 객체는 변경할 수 없기 때문에 문자열을 수정하거나 조작할 때마다 새로운 String 객체가 생성   된다.</p>
<p>          : String의 값이 변경된것처럼 보이는 이유는 기존 문자열을 수정하는것이 아니라 내부적으로 변경된 문자열을 새롭게 만들어내기 때문이다.</p>
<p>          : 즉, String은 문자열을 할당한 후에는 수정하지 말고 읽기만 하려는 목적을 가지고 있다. </p>
 <br> 

<p>        🔸StringBuilder, StringBuffer - 가변(mutable)한 클래스</p>
<p>          : 내부적으로 가변 크기의 문자 배열을 사용하여 문자열 조작하기 때문에 문자열을 변경할 때마다 새로운 객체를 생성하지 않고 내부 배열을 조작한다.</p>
<p>  <br><br><br></p>
<h3 id="2-💬-스레드-안전성thread-safety">2. 💬 스레드 안전성(Thread Safety)</h3>
<blockquote>
<p>⭐ 스레드 안전성(Thread Safety)이란❓<br>: 멀티스레드 환경에서 여러 스레드가 동시에 하나의 공유된 자원을 접근하더라도 원하는 동작을 안전하게 보장하는 것을 말한다.</p>
</blockquote>
<br>
        🔸 String - 불변성으로 인해 여러 스레드에서 안전하게 공유될 수 있다.



<p>        🔸 StringBuilder - 멀티스레드 환경에서 동시에 접근할 경우 동기화 문제가 발생할 수 있기 때문에 안전하지 않다.</p>
<p>        🔸 StringBuffer - 여러 스레드에서 동시에 접근하더라도 안전하게 조작할 수 있도록 동기화 메커니즘을 내부적으로 제공하기 때문에 안전하다.</p>
<p>  <br><br></p>
<p>   1. 정확성:</p>
<p>        - 멀티스레드 환경에서도 올바른 결과를 산출한다.</p>
<p>        - 여러 스레드가 동시에 자원에 접근하더라도 데이터 불일치, 잘못된 결과를 생성하지 않고 의도한 대로 동작한다.</p>
<p>    2. 일관성:</p>
<p>        - 동일한 입력과 상태에서 여러 번 실행되더라도 실행 결과가 스레드 간에 일관성을 유지하여 항상 일관된 결과를 제공한다.</p>
<p>    3. 동기화:</p>
<p>        - 스레드 간의 동기화를 통해 자원의 동시 접근 문제를 제어한다.</p>
<p>        - 동기화 메커니즘을 사용하여 스레드가 상호 배타적으로 접근하도록 보장한다.</p>
<p><br><br>
스레드 안전성을 보장하기 위해서는 공유 자원에 대한 접근을 동기화해야 합니다. 동기화 메커니즘으로는 락(lock), 세마포어(semaphore), 모니터(monitor) 등이 사용될 수 있습니다. 이를 통해 한 번에 하나의 스레드만이 공유 자원에 접근할 수 있도록 보장하고, 일관성과 정확성을 유지할 수 있습니다.</p>
<p>  <br><br><br></p>
<p>스레드 안전성은 멀티스레드 환경에서 동시성 문제를 해결하고, 데이터 불일치와 같은 오류를 방지하는 데 중요한 역할을 합니다. 스레드 안전한 코드를 작성하여 프로그램의 안정성과 성능을 유지하고, 예기치 않은 동작을 방지할 수 있습니다.</p>
<hr>
<p><br><br></p>
<h3 id="3-💬-성능">3. 💬 성능</h3>
<p>  <br><br></p>
<p>        🔸 String </p>
<p>          : 불변성으로 인해 문자열을 변경할 때마다 새로운 객체를 생성해야한다.</p>
<p>          : 문자열을 연결하거나 수정할 때마다 새로운 String 객체가 생성되므로 메모리 사용이 늘어나서 조작이 빈번할 경우 메모리 할당과 가비지 컬렉션 비용이 증가할 수 있다.</p>
<p>        🔸 StringBuilder </p>
<p>          : 내부적으로 가변 크기의 문자 배열을 사용하여 문자열 조작을 수행한다.</p>
<p>          : 문자열을 변경할 때마다 새로운 객체를 생성하지 않고 내부 배열을 조작하여 성능을 향상시킨다.</p>
<p>        🔸 StringBuffer </p>
<p>          : 내부 배열을 조작하므로 객체 생성 비용이 들지 않기 때문에 문자열 조작이 많은 경우 성능상 이점이 있다.</p>
<p>          : 다만, 동기화 메커니즘을 내부에서 처리하기 때문에 오버헤드가 조금 더 발생할 수 있다.</p>
<p><br><br></p>
<blockquote>
<p>일반적으로 단일 스레드 환경 + 문자열 조작이 필요한 경우 <strong>StringBuilder</strong>를 사용하는 것이 가장 효율적이다.<br>멀티스레드 환경에서 스레드 안전성이 요구되는 경우 <strong>StringBuffer</strong>를 사용한다.<br><strong>String</strong>은 문자열이 변경되지 않는 경우나 스레드 안전성이 보장된 단일 스레드 환경에서 주로 사용한다.</p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[[자바(JAVA)] 제곱수 판별하기]]></title>
            <link>https://velog.io/@yes_jihyeon/%EC%9E%90%EB%B0%94JAVA-%EC%A0%9C%EA%B3%B1%EC%88%98-%ED%8C%90%EB%B3%84%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@yes_jihyeon/%EC%9E%90%EB%B0%94JAVA-%EC%A0%9C%EA%B3%B1%EC%88%98-%ED%8C%90%EB%B3%84%ED%95%98%EA%B8%B0</guid>
            <pubDate>Fri, 08 Dec 2023 10:17:23 GMT</pubDate>
            <description><![CDATA[<p><img src="https://blog.kakaocdn.net/dn/HebLV/btshpBKnQxV/TMl3k9q5u7I0JSIsxqWFO0/img.png" alt=""></p>
<p>문제: <a href="https://school.programmers.co.kr/learn/courses/30/lessons/120909">https://school.programmers.co.kr/learn/courses/30/lessons/120909</a></p>
<br>

<p>✅ 내 풀이</p>
<pre><code class="language-java">class Solution {
    public int solution(int n) {
        return Math.sqrt(n) % 1 == 0 ? 1 : 2;
    }
}</code></pre>
<br>


<p>📌Math.sqrt() : 숫자의 제곱근을 반환하는 함수 </p>
<p>ex) 14의 제곱근 </p>
<p><img src="https://blog.kakaocdn.net/dn/cllJTd/btshp8AXlAr/BneWtugTbEFem2Pw3CnDx0/img.png" alt=""><img src="https://blog.kakaocdn.net/dn/5aEDg/btshrzYOZvA/Xf642q5vFm5QwB63k7OUj1/img.png" alt="">출력값</p>
<p>n이 어떤수의 제곱이라면 출력값이 정수로 나옴</p>
<p>즉, 출력값 % 1 = 0이므로 아래와 같이 사용할 수 있다.
<br></p>
<pre><code>return Math.sqrt(n) % 1 == 0 ? 1 : 2;</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[[자바(JAVA)] 양꼬치]]></title>
            <link>https://velog.io/@yes_jihyeon/%EC%9E%90%EB%B0%94JAVA-%EC%96%91%EA%BC%AC%EC%B9%98</link>
            <guid>https://velog.io/@yes_jihyeon/%EC%9E%90%EB%B0%94JAVA-%EC%96%91%EA%BC%AC%EC%B9%98</guid>
            <pubDate>Fri, 08 Dec 2023 10:14:47 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/yes_jihyeon/post/aa2c8345-f22f-430b-9a9b-0310a248bd52/image.png" alt=""></p>
<br>

<p>문제: <a href="https://school.programmers.co.kr/learn/courses/30/lessons/120830">https://school.programmers.co.kr/learn/courses/30/lessons/120830</a></p>
<p><br><br></p>
<p>✅ 내 풀이</p>
<pre><code class="language-java">class Solution {
    public int solution(int n, int k) {
        int price1 = 12000 * n;              // 양꼬치 총 몇 인분인지
        int freeCount = (n / 10);            // 양꼬치 10인분당 음료서비스 1개 산출
        int price2 = 2000 * (k - freeCount); // 총 음료에서 서비스 제외

        int answer = price1 + price2;
        return answer;
    }
}</code></pre>
<p><br> <br></p>
<p>✅ 다른풀이</p>
<pre><code class="language-java">class Solution {
    public int solution(int n, int k) {
        int answer = 0;
        answer= n*12000 + (k-n/10)*2000;
        return answer;
    }
}</code></pre>
<p>값은 똑같지만 내 풀이의 코드가 더 길다.
그래서 이유를 살펴보았다.</p>
<blockquote>
<p>[풀이의 코드가 길어진 이유]  <br></p>
</blockquote>
<p>1) 매개변수 선언시 데이터 타입(int)을 이미 설정했기 때문에 int price1,2를 선언할 필요가 없음
2) 단순연산만 필요하기 때문에 굳이 연산식을 따로 정의할 필요가 없음</p>
<p><br><br> 
결론: 쉬운문제라도 변수의 활용을 줄이고 코드의 비용이 가장 적게드는 방법을 연구해보자!</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[카카오 소셜로그인 유저차단 검증로직 별도 구현]]></title>
            <link>https://velog.io/@yes_jihyeon/%EC%B9%B4%EC%B9%B4%EC%98%A4-%EC%86%8C%EC%85%9C%EB%A1%9C%EA%B7%B8%EC%9D%B8-%EC%9C%A0%EC%A0%80%EC%B0%A8%EB%8B%A8-%EA%B2%80%EC%A6%9D%EB%A1%9C%EC%A7%81-%EB%B3%84%EB%8F%84-%EA%B5%AC%ED%98%84</link>
            <guid>https://velog.io/@yes_jihyeon/%EC%B9%B4%EC%B9%B4%EC%98%A4-%EC%86%8C%EC%85%9C%EB%A1%9C%EA%B7%B8%EC%9D%B8-%EC%9C%A0%EC%A0%80%EC%B0%A8%EB%8B%A8-%EA%B2%80%EC%A6%9D%EB%A1%9C%EC%A7%81-%EB%B3%84%EB%8F%84-%EA%B5%AC%ED%98%84</guid>
            <pubDate>Fri, 10 Nov 2023 02:27:00 GMT</pubDate>
            <description><![CDATA[<ul>
<li><p><strong>[BE] 카카오 소셜로그인 유저차단 검증로직 별도 구현</strong></p>
<p>  문제</p>
<ul>
<li>유저 Role 중에 <code>BLOCK</code>이면 모든 권한이 차단되어 일반 로그인 시 <code>JwtAuthenticationFilter</code>에서 <code>DisabledException</code>을 발생시키고 로그인이 차단되도록 구현되어 있었으나, 카카오 소셜로그인의 경우에는 <code>JwtAuthenticationFilter</code>를 통과하지 않고 로그인이 정상적으로 진행되는 문제가 발생함.</li>
</ul>
</li>
</ul>
<pre><code>시도

- **로그 분석**: 카카오 유저의 로그인 흐름을 파악하기 `JwtAuthenticationFilter`와 `KakaoService` 에 log.info를 추가하여 분석하였고, 카카오 소셜로그인의 경우에는 해당 필터를 거치지 않는 것을 확인함.
- **원인 파악**: 카카오 소셜 로그인은 클라이언트와 카카오 서버 간의 직접적인 통신이 진행된다. 따라서 JwtAuthenticationFilter를 타지 않는 것으로 추정함
- **로그인 처리 시 유저 상태 확인 추가**:

    ```java
    if (kakaoMember != null &amp;&amp; kakaoMember.getRole().equals(UserRoleEnum.BLOCK)) {
        throw new DisabledException(&quot;차단된 계정입니다.&quot;);
    }
    ```

    • `KakaoService`의 `registerKakaoUserIfNeeded` 메소드 내에서 이미 존재하는 카카오 사용자인 경우, 사용자의 상태를 확인하고 차단된 사용자인 경우 로그인을 허용하지 않는 로직을 추가.

- **예외 처리 및 응답 로직 추가**:

    ```java
    public Map&lt;String, Object&gt; registerKakaoUserIfNeeded(KakaoUserInfoDto kakaoUserInfo) {
        // ... 기존 코드 ...
        Member kakaoMember = memberRepository.findByKakaoId(kakaoId).orElse(null);
        // 기존 사용자가 BLOCK 상태인지 확인
        if (kakaoMember != null &amp;&amp; kakaoMember.getRole() == UserRoleEnum.BLOCK) {
            throw new CustomKakaoBlockException(&quot;BLOCK 상태의 계정으로 로그인할 수 없습니다.&quot;);
        }
        // ...
        return result;
    }
    ```

- `KakaoService`에서 예외가 발생한 경우를 적절히 처리하고 클라이언트에게 적절한 응답을 반환할 수 있도록 예외 처리 로직 추가.
- **커스텀 예외 및 전역 예외 처리 추가**:

    ```java
    public class CustomKakaoBlockException extends RuntimeException {
        public CustomKakaoBlockException(String message) {
            super(message);
        }
    }
    ```

    ```java
            @RestControllerAdvice
    public class GlobalExceptionHandler {
        @ExceptionHandler(CustomKakaoBlockException.class)
        public ResponseEntity&lt;MsgResponse&gt; handleCustomException(CustomKakaoBlockException ex) {
            MsgResponse errorResponse = new MsgResponse(ex.getMessage());
            return new ResponseEntity&lt;&gt;(errorResponse, HttpStatus.FORBIDDEN);
        }
    }
    ```

    • `CustomKakaoBlockException` 클래스를 생성하여 커스텀 예외를 정의하고, 이를 전역에서 처리할 수 있도록 `GlobalExceptionHandler`에 예외 핸들러를 추가.


해결

- **문제 해결**: 카카오 소셜로그인 사용자도 계정이 차단된 경우에는 로그인이 차단되고, 클라이언트에게는 적절한 응답이 전달되도록 수정됨.</code></pre>]]></description>
        </item>
    </channel>
</rss>