<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>ParyJane.log</title>
        <link>https://velog.io/</link>
        <description>오늘을 살고 내일을 꿈꾸는 낭만주의자</description>
        <lastBuildDate>Tue, 14 Mar 2023 06:41:06 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>ParyJane.log</title>
            <url>https://velog.velcdn.com/images/p_zane/profile/d086c825-cd2a-4236-abc1-ca7c2baf2d75/image.jpeg</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. ParyJane.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/p_zane" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[[프로그래머스] 올바른 괄호]]></title>
            <link>https://velog.io/@p_zane/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-%EC%98%AC%EB%B0%94%EB%A5%B8-%EA%B4%84%ED%98%B8</link>
            <guid>https://velog.io/@p_zane/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-%EC%98%AC%EB%B0%94%EB%A5%B8-%EA%B4%84%ED%98%B8</guid>
            <pubDate>Tue, 14 Mar 2023 06:41:06 GMT</pubDate>
            <description><![CDATA[<h4 id="🔗-문제-보러가기-👉-올바른-괄호">🔗 문제 보러가기 👉 <a href="https://school.programmers.co.kr/learn/courses/30/lessons/12909#">올바른 괄호</a></h4>
<p><img src="https://velog.velcdn.com/images/p_zane/post/84c9a17e-9337-463c-a569-0bdbc6bf4854/image.png" alt=""></p>
<br>

<blockquote>
<h4 id="📌-stack-활용하기">📌 Stack 활용하기</h4>
<p>Stack은 가장 나중에 들어온(push) 데이터가 제일 먼저 나가는(pop) <span style="background-color: rgba(242,179,188,0.4)">후입선출(LIFO)</span> 자료구조이다.</p>
</blockquote>
<pre><code class="language-java">import java.util.Stack;
Stack&lt;Integer&gt; st = new Stack&lt;Integer&gt;(); 
// 스택 제일 상단에 데이터 저장
st.push(1);
// 스택의 제일 상단(제일 마지막으로 저장된) 요소를 반환
st.peek();
// 스택의 제일 상단에 있는 요소를 반환하고, 해당 요소를 스택에서 제거
st.pop();
// 스택이 비어 있으면 true를, 비어 있지 않으면 false를 반환
st.empty();</code></pre>
<br>

<h4 id="✅-문제풀이">✅ 문제풀이</h4>
<ol>
<li><code>toCharArray()</code>로 문자열을 char 배열로 변환하여 for문 실행</li>
<li>&#39;(&#39; 이면 스택에 push 하고</li>
<li>&#39;)&#39; 일때 스택이 비었다면 false 반환, 그렇지 않다면 pop</li>
<li>for문이 끝난 후 스택이 비었다면 true, 그렇지 않다면 false 반환</li>
</ol>
<pre><code class="language-java">import java.util.Stack;

class Solution {
    boolean solution(String s) {

        Stack&lt;Character&gt; st = new Stack&lt;Character&gt;();
        char[] arr = s.toCharArray();

        for(char c : arr) {
            if(c == &#39;(&#39;) {
                st.push(c);
            } else {
                if(!st.empty()) st.pop();
                else return false;
            }
        }

        return st.empty();
    }
}</code></pre>
<p><img src="https://velog.velcdn.com/images/p_zane/post/8743de46-083b-410e-8101-e843a68016e0/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[프로그래머스] 이진 변환 반복하기]]></title>
            <link>https://velog.io/@p_zane/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-%EC%9D%B4%EC%A7%84-%EB%B3%80%ED%99%98-%EB%B0%98%EB%B3%B5%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@p_zane/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-%EC%9D%B4%EC%A7%84-%EB%B3%80%ED%99%98-%EB%B0%98%EB%B3%B5%ED%95%98%EA%B8%B0</guid>
            <pubDate>Mon, 13 Mar 2023 07:50:22 GMT</pubDate>
            <description><![CDATA[<h4 id="🔗문제-보러가기-👉-이진-변환-반복하기">🔗문제 보러가기 👉 <a href="https://school.programmers.co.kr/learn/courses/30/lessons/70129">이진 변환 반복하기</a></h4>
<p><img src="https://velog.velcdn.com/images/p_zane/post/2822e019-2251-4d6d-b0ef-b31daae572b0/image.png" alt="">
<img src="https://velog.velcdn.com/images/p_zane/post/9b74e71b-8c86-4ecc-900e-2114cc0948f3/image.png" alt=""></p>
<br>

<blockquote>
<h4 id="📌-문제의-핵심">📌 문제의 핵심</h4>
</blockquote>
<ol>
<li><code>Integer.toBinaryString(int)</code> : 10진수를 2진수로 변환하여 String으로 반환</li>
<li>재귀함수</li>
</ol>
<br>

<h4 id="✅-문제-풀이">✅ 문제 풀이</h4>
<ol>
<li>재귀함수 <code>toBinary(String 2진수, int[] answer)</code> 를 선언<ul>
<li>2진수 문자열에서 &quot;0&quot;을 &quot;&quot;로 치환</li>
<li>이진 변환의 횟수 : answer[0]++</li>
<li>제거된 모든 0의 개수 : 0을 지우기 전의 문자열 길이(before) - 지운 후의 문자열 길이(after)</li>
<li>after의 길이(int)를 2진수(String)로 변환해서 toBinary() 호출</li>
<li>before가 1일때 return 하면서 재귀함수 멈춤</li>
</ul>
</li>
</ol>
<pre><code class="language-java">class Solution {

    public int[] solution(String s) {
        int[] answer = new int[2];
        toBinary(s, answer);
        return answer;
    }

    public static void toBinary(String before, int[] answer) {
        if(before.equals(&quot;1&quot;)) return;

        String after = before.replace(&quot;0&quot;, &quot;&quot;);
        answer[0]++;
        answer[1] += before.length() - after.length();

        toBinary(Integer.toBinaryString(after.length()), answer);
    }
}</code></pre>
<p><img src="https://velog.velcdn.com/images/p_zane/post/5e08da77-1bcb-480f-9651-e44a18159b42/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[프로그래머스] JadenCase 문자열 만들기]]></title>
            <link>https://velog.io/@p_zane/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-JadenCase-%EB%AC%B8%EC%9E%90%EC%97%B4-%EB%A7%8C%EB%93%A4%EA%B8%B0</link>
            <guid>https://velog.io/@p_zane/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-JadenCase-%EB%AC%B8%EC%9E%90%EC%97%B4-%EB%A7%8C%EB%93%A4%EA%B8%B0</guid>
            <pubDate>Mon, 13 Mar 2023 06:23:42 GMT</pubDate>
            <description><![CDATA[<h4 id="🔗문제-보러가기-👉-jadencase-문자열-만들기">🔗문제 보러가기 👉 <a href="https://school.programmers.co.kr/learn/courses/30/lessons/12951">JadenCase 문자열 만들기</a></h4>
<p><img src="https://velog.velcdn.com/images/p_zane/post/d2d7342a-5b0c-47c5-981b-7b964c59a1b6/image.png" alt=""></p>
<br>

<blockquote>
<h4 id="📌-문제의-핵심">📌 문제의 핵심</h4>
</blockquote>
<ol>
<li><code>new StringTokenizer(문자열, &quot;구분자&quot;, 구분자 포함여부)</code><pre><code> - hasMoreTokens() : 남은 토큰이 있으면 true, 없다면 false
 - nextToken() : 다음 토큰을 String 으로 반환</code></pre></li>
<li><code>toUpperCase()</code> / <code>toLowerCase()</code> : 문자열을 모두 대문자/소문자로 바꿈</li>
<li><code>replaceFirst()</code> : 문자열에서 처음으로 나오는 조건만 바꿈</li>
</ol>
<br>

<h4 id="✅-문제-풀이">✅ 문제 풀이</h4>
<ol>
<li><code>new StringTokenizer(s.toLowerCase(), &quot; &quot; ,true)</code><ul>
<li>단어의 첫 문자 빼고는 모두 소문자여야 하기때문에 s.toLowerCase() 로 변환한 뒤 StringTokenizer로 나눠줘야 한다.</li>
<li><span style="background-color: rgba(242,179,188,0.4)">공백문자가 연속해서 나올 수 있기</span>때문에 구분자(공백)도 토큰으로 포함시켜야 한다.</li>
</ul>
</li>
<li><code>str.replaceFirst(c, c.toUpperCase())</code><ul>
<li>단어의 첫 문자만 대문자로 바꿔야 하기때문에 replaceFirst()를 사용해준다.</li>
<li>replace 함수는  조건으로 문자열만 사용할 수 있으므로 Character.toString()을 사용해 char 형식에서 String 으로 변환해준다.</li>
</ul>
</li>
</ol>
<pre><code class="language-java">import java.util.StringTokenizer;

class Solution {
    public String solution(String s) {
        StringBuffer answer = new StringBuffer();
        StringTokenizer st = new StringTokenizer(s.toLowerCase(), &quot; &quot; ,true);

        while(st.hasMoreTokens()) {
            String str = st.nextToken();
            String c = Character.toString(str.charAt(0));
            str = str.replaceFirst(c, c.toUpperCase());
            answer.append(str);
        }

        return answer.toString();
    }
}</code></pre>
<p><img src="https://velog.velcdn.com/images/p_zane/post/24348405-a306-4aa4-be9b-1dfa8d1063db/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[백준] 피보나치 수 5]]></title>
            <link>https://velog.io/@p_zane/%EB%B0%B1%EC%A4%80-%ED%94%BC%EB%B3%B4%EB%82%98%EC%B9%98-%EC%88%98-5</link>
            <guid>https://velog.io/@p_zane/%EB%B0%B1%EC%A4%80-%ED%94%BC%EB%B3%B4%EB%82%98%EC%B9%98-%EC%88%98-5</guid>
            <pubDate>Fri, 03 Mar 2023 02:55:29 GMT</pubDate>
            <description><![CDATA[<h4 id="🔗-문제로-이동-👉-피보나치-수-5">🔗 문제로 이동 👉 <a href="https://www.acmicpc.net/problem/10870">[피보나치 수 5]</a></h4>
<br>

<blockquote>
<h4 id="span-stylecolorredtipspan-재귀-함수를-사용해서-풀어보기"><span style="color:red;">TIP</span> 재귀 함수를 사용해서 풀어보기</h4>
</blockquote>
<br>

<h4 id="☑️-첫-번째-풀이">☑️ 첫 번째 풀이</h4>
<p> 피보나치 수는 바로 앞 두 피보나치 수의 합 이기 때문에<em><del>(2번째 피보나치의 수 이상),</del></em> 재귀 함수를 호출할때 몇 번째 호출인지 나타내는 정수 cnt,  첫번째 수 a, 그 다음 수 b를 인자로 담아서 넘겨주었다. 
 시간이나 메모리 측면에서 나쁘진 않으나 피보나치 수가 0번째 일때 예외처리되는 조건문이 매끄럽지 못해 다시 풀어보았다.</p>
<pre><code class="language-java">import java.io.BufferedReader;
import java.io.InputStreamReader;

class Main {

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

        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int n = Integer.parseInt(br.readLine());

        if(n == 0) System.out.println(0);
        else System.out.println(recursion(n, 0, 1));

    }

    public static int recursion(int cnt, int a, int b) {

        int sum = a + b;
        if(cnt &lt; 3) return sum;

        return recursion(cnt - 1, b, sum);

    }

}</code></pre>
<p><img src="https://velog.velcdn.com/images/p_zane/post/1c9416df-9a47-41a9-99e0-7dd19654d1d6/image.png" alt=""></p>
<br>

<h4 id="✅-두-번째-풀이">✅ 두 번째 풀이</h4>
<p> 첫 번째 풀이에선  <code>int sum = a + b;</code> 로 두 수를 합쳐줬다면, </p>
<p>두 번째 풀이에선 합치는 과정을 아예 <code>recursion(num-1) + recursion(num-2);</code> 으로 정의해줬다.</p>
<pre><code class="language-java">import java.io.BufferedReader;
import java.io.InputStreamReader;

class Main {

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

        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int n = Integer.parseInt(br.readLine());

        System.out.println(recursion(n));

    }

    public static int recursion(int num) {

        if(num == 0) return 0;
        else if(num == 1) return 1;
        else return recursion(num-1) + recursion(num-2); // Here!

    }

}</code></pre>
<p><img src="https://velog.velcdn.com/images/p_zane/post/62544875-76e4-4dd6-ae59-03dffd3f3881/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[회고] 원티드 프리온보딩 5차 MySQL "잘" 사용하기]]></title>
            <link>https://velog.io/@p_zane/%ED%9A%8C%EA%B3%A0-%EC%9B%90%ED%8B%B0%EB%93%9C-%ED%94%84%EB%A6%AC%EC%98%A8%EB%B3%B4%EB%94%A9-5%EC%B0%A8-MySQL-%EC%9E%98-%EC%82%AC%EC%9A%A9%ED%95%98%EA%B8%B0-ndeeppwf</link>
            <guid>https://velog.io/@p_zane/%ED%9A%8C%EA%B3%A0-%EC%9B%90%ED%8B%B0%EB%93%9C-%ED%94%84%EB%A6%AC%EC%98%A8%EB%B3%B4%EB%94%A9-5%EC%B0%A8-MySQL-%EC%9E%98-%EC%82%AC%EC%9A%A9%ED%95%98%EA%B8%B0-ndeeppwf</guid>
            <pubDate>Thu, 02 Mar 2023 07:12:56 GMT</pubDate>
            <description><![CDATA[<blockquote>
<h4 id="프리온보딩-소개">프리온보딩 소개</h4>
</blockquote>
<h4 id="🔗-프리온보딩-백엔드-챌린지-2월-httpswwwwantedcokreventspre_challenge_be_4-사이트-바로가기">🔗 [[프리온보딩 백엔드 챌린지 2월]] (<a href="https://www.wanted.co.kr/events/pre_challenge_be_4">https://www.wanted.co.kr/events/pre_challenge_be_4</a>) 사이트 바로가기</h4>
<br>

<blockquote>
<h4 id="사전과제">사전과제</h4>
</blockquote>
<ol>
<li>관계형 데이터베이스(RDBMS)와 비관계형 데이터베이스(NoSQL)의 장단점 비교</li>
<li>트랜잭션(transaction)이란?</li>
<li>MySQL에서 조인(join)의 역할은 무엇인가? (다양한 join의 방식에 대해 설명해주세요.)</li>
<li>MySQL에서 인덱스(index)란?</li>
</ol>
<h4 id="🔗-사전-과제-제출-github-보러가기-👉--클릭-httpsgithubcomparyjanewanted-pre-onboarding-challenge-be-task-februaryblobmainanswermd">🔗 사전 과제 제출 Github 보러가기 👉 [[ 클릭!]] (<a href="https://github.com/ParyJane/wanted-pre-onboarding-challenge-be-task-February/blob/main/answer.md">https://github.com/ParyJane/wanted-pre-onboarding-challenge-be-task-February/blob/main/answer.md</a>)</h4>
<p>프리온보딩에선 챌린지에 참여하기 앞서 사전과제를 수행하도록 적극 권장한다. 
별거 아닌것 처럼 보이지만 본격적인 챌린지에 앞서 어떤걸 배우는지 흐름을 파악할 수 있어 좋았고, 스스로 부족한 부분을 점검할 수 있어 브리온보딩 챌린지를 시작하려는 사람들에게 사전과제를 하는 것을 강력 추천한다!</p>
<br>

<blockquote>
<h4 id="week-1-1-다양한-데이터베이스의-특징과-장단점">[Week 1-1] 다양한 데이터베이스의 특징과 장/단점</h4>
</blockquote>
<h4 id="cap-theorem-rdbms-nosql">CAP Theorem, RDBMS, NoSQL</h4>
<ul>
<li>데이터베이스의 원칙</li>
<li>다양한 데이터베이스 종류와 CAP Theorem</li>
<li>예제로 보는 서비스에 적합한 데이터베이스 선택법</li>
<li>관계형 데이터베이스(RDBMS)와 비관계형 데이터베이스(NoSQL) 비교</li>
</ul>
<br>

<blockquote>
<h4 id="week-1-2-왜-big-tech기업들이-mysql을-사용하는지에-대해-논의">[Week 1-2] 왜 Big Tech기업들이 MySQL을 사용하는지에 대해 논의</h4>
</blockquote>
<h4 id="transaction-acid-lock-isolation-level">Transaction, ACID, Lock, Isolation Level</h4>
<ul>
<li>MySQL이 Transaction을 통해 작업의 완전성을 보장하는 방식</li>
<li>Database Lock을 통한 동시성 제어</li>
<li>Isolation Level 설정을 통한 MySQL 동작 제어</li>
<li>각 항목들이 어떤 의미가 있는지?<br>

</li>
</ul>
<h4 id="아하-모먼트-공부하는-방법">[아하! 모먼트] 공부하는 방법</h4>
<ol>
<li>같이하는 방법</li>
</ol>
<ul>
<li>회사 프로젝트 / 회사 동료 와 함께 성장하기</li>
<li>스터디 / 사이드 프로젝트 (프론트에서 받기 좋은 API 고민하기 / 배포 해보는게 중요)</li>
<li>커뮤니티</li>
</ul>
<ol start="2">
<li>혼자하는 방법</li>
</ol>
<ul>
<li>구글링, 개발 서적, 강의 (근본적인 동작원리를 알기에 좋다)</li>
<li>신입이라면 네트워크, 세션, 쿠키 알아함</li>
<li>ORM / Raw Query</li>
</ul>
<br>

<blockquote>
<h4 id="week-2-1-mysql이-제공하는-기본-기능에-대해-논의">[Week 2-1] MySQL이 제공하는 기본 기능에 대해 논의</h4>
</blockquote>
<h4 id="query-join-subquery-sql-functions-실행계획">Query, Join, Subquery, SQL functions, 실행계획</h4>
<ul>
<li>query 작동 순서</li>
<li>join을 통해 여러 테이블의 데이터를 동시에 가져오는 방법</li>
<li>subquery를 활용한 쿼리방법</li>
<li>빠르게 연산을 제공하는 SQL functions</li>
</ul>
<br>

<h4 id="아하-모먼트-이직을-준비하는-방법">[아하! 모먼트] 이직을 준비하는 방법</h4>
<ol>
<li>이력서 많이 올리기</li>
</ol>
<ul>
<li>원티드, 프로그래머스, 로켓펀치, 링크드인, 점핏 등 다양한 플랫폼에 이력서 올려두기</li>
<li>신입도 3년차까지는 지원하는 것을 추천</li>
<li>지원하는 회사에 맞춰서 이력서를 수정하기 ex) 원하는 기술 순서대로 수정</li>
<li>포폴 만들때 DB 조회 index 사용해서 얼만큼 속도를 줄였는지 등을 예시로 퍼센트로 보여주기</li>
</ul>
<ol start="2">
<li>블로그 운영하기</li>
</ol>
<ul>
<li><a href="https://tech.socarcorp.kr/data/2023/02/15/how-to-organize-tech-blog.html">🔗 기술 블로그 글 쓰는법 _ 쏘카에서 기술 블로그를 운영하는 방법</a></li>
</ul>
<ol start="3">
<li>코딩테스트를 대비한 알고리즘 공부하기</li>
</ol>
<ul>
<li>처음이라면 알고리즘 이론을 공부하고 문제 많이 풀기!</li>
<li><a href="https://www.youtube.com/@eleanorlim/videos">https://www.youtube.com/@eleanorlim/videos</a></li>
</ul>
<br>

<blockquote>
<h4 id="week-2-2-어떻게-mysql의-효율을-개선할-수-있는지-논의">[Week 2-2] 어떻게 MySQL의 효율을 개선할 수 있는지 논의</h4>
</blockquote>
<h4 id="indexing-normalization-partitioning-cache">Indexing, Normalization, Partitioning, Cache</h4>
<ul>
<li>index의 의미화 효율적인 index 사용법</li>
<li>normalization을 사용한 중복 데이터 감소</li>
<li>partitioning을 활용한 데이터 분산</li>
<li>cache를 사용한 쿼리 효율 개선</li>
</ul>
<br>

<h4 id="아하-모먼트-개발자에게-글쓰기블로그가-중요한-이유">[아하! 모먼트] 개발자에게 글쓰기(블로그)가 중요한 이유</h4>
<ol>
<li>글을 쓰며 꾸준한 학습</li>
<li>자기 브랜딩</li>
<li>과거의 나 갉아먹기</li>
</ol>
<p>가끔 블로그를 보고 연락이 오는 회사가 꽤나 있고, 글을 쓸 때 남한테 보여주는 글이라고 생각하고 정성스럽게 쓰는 연습을 해야한다. 그리고 일단 잘 작성해두면 나중에 활용할 수 있으니 퀄리티 신경써서 쓰기! 글은 쓸수록 는다!</p>
<br>

<blockquote>
<h4 id="총평">총평</h4>
</blockquote>
<p>강의는 실무에서 바로 적용하고 실제 사례들을 경험할 수 있을거라 기대했으나 이론 설명이 대부분이었다. 그리고 Zoom으로 진행하는 라이브 강의이다보니 중간에 인터넷이 끊기기도 하고, 돌발상황이 발생했을 때 매끄럽게 대처할 수 없어 아쉬웠다.</p>
<p>하지만 강의 후 약 1시간 동안 질문 문답을 해주는게 좋았고, 강의와 별개로 <span style="font-weight: bold;">[아하! 모먼트]</span>가 생각보다 유용했다. 그리고 무엇보다 덕분에 MySQL을 보다 깊게 공부할 수 있는 동기부여가 됐고, 그동안 미뤄왔던 이력서 / 포트폴리오를 완성하며 추춤했던 취업활동에 다시 불을 붙여서 좋았다.</p>
<p>마지막으로 아래와 같은 사람들에게 이 챌린지를 추천한다!</p>
<ul>
<li>강의를 통해 공부 방향성을 잡고싶은 사람 </li>
<li>현직자의 오프더레코드(이력서 작성 팁, 면접 후기, 회사를 고르는 팁, 공부하는 방법)를 듣고싶은 사람 </li>
<li>러프한 틀 안에서 자기주도학습으로 CS이론을 배우고 이력서 완성하고싶은사람</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[프로그래머스] 모음 제거]]></title>
            <link>https://velog.io/@p_zane/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-%EB%AA%A8%EC%9D%8C-%EC%A0%9C%EA%B1%B0</link>
            <guid>https://velog.io/@p_zane/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-%EB%AA%A8%EC%9D%8C-%EC%A0%9C%EA%B1%B0</guid>
            <pubDate>Wed, 15 Feb 2023 07:41:00 GMT</pubDate>
            <description><![CDATA[<h3 id="🔗-문제로-이동-👉-모음-제거">🔗 문제로 이동 👉 <a href="https://school.programmers.co.kr/learn/courses/30/lessons/120849">[모음 제거]</a></h3>
<br>

<blockquote>
<h4 id="📌-replace와-replaceall-의-차이">📌 replace()와 replaceAll() 의 차이</h4>
</blockquote>
<pre><code class="language-java">    /* replace(CharSequence target, CharSequence replacement)는 target 문자 자체를 replacement로 대체한다 */ 
    String str = &quot;aaaabcbbbabccccabc&quot;;
    str = str.replace(&quot;abc&quot;,&quot;0&quot;);

    // &#39;abc&#39; 문자 자체를 &#39;0&#39;으로 변경
    // aaa&#39;abc&#39;bbb&#39;abc&#39;ccc&#39;abc&#39; -&gt; aaa0bbb0ccc0


    /* replaceAll(String regex, String replacement)은 정규식 표현을 사용해여 문자를 대체하는 형식이다 */
    String str = &quot;aaaabcbbbabccccabc&quot;;
    str = str.replaceAll(&quot;[abc]&quot;,&quot;0&quot;);

    // &#39;a&#39;,&#39;b&#39;,&#39;c&#39; 를 &#39;0&#39;으로 변경
    // aaaabcbbbabccccabc -&gt; 000000000000000000</code></pre>
<br>

<blockquote>
<h4 id="정규표현식character-classes-👉-더-보러가기">정규표현식(Character classes) 👉 <a href="https://www.notion.so/replace-replaceAll-feat-bf1d5740082e421aa20980f2c46a8eef">더 보러가기!</a></h4>
</blockquote>
<table>
<thead>
<tr>
<th>정규표현식</th>
<th>설명</th>
</tr>
</thead>
<tbody><tr>
<td>[abc]</td>
<td>‘a’ or ‘b’ or ‘c’</td>
</tr>
<tr>
<td>[^abc]</td>
<td>a, b, c 를 제외</td>
</tr>
<tr>
<td>[a-zA-Z]</td>
<td>a 부터 z &amp;&amp; A 부터 Z</td>
</tr>
<tr>
<td>[a-z&amp;&amp;[^bc]]</td>
<td>a 부터 z 이면서 b, c를 제외 (ad-z)</td>
</tr>
<tr>
<td>\s</td>
<td>공백</td>
</tr>
<tr>
<td>\w</td>
<td>알파벳이나 숫자</td>
</tr>
<tr>
<td>\d</td>
<td>[0-9] 와 동일</td>
</tr>
<tr>
<td>\대문자</td>
<td>위의 내용과 반대</td>
</tr>
</tbody></table>
<p><br><br></p>
<h3 id="✅-문제-풀이">✅ 문제 풀이</h3>
<pre><code class="language-java">class Solution {
    public String solution(String my_string) {
                // &#39;a&#39;,&#39;e&#39;,&#39;i&#39;,&#39;o&#39;,&#39;u&#39; 를 공백으로 변경
        String answer = my_string.replaceAll(&quot;[a,e,i,o,u]&quot;,&quot;&quot;);
        return answer;
    }
}</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[[프로그래머스] 소인수분해]]></title>
            <link>https://velog.io/@p_zane/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-%EC%86%8C%EC%9D%B8%EC%88%98%EB%B6%84%ED%95%B4</link>
            <guid>https://velog.io/@p_zane/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-%EC%86%8C%EC%9D%B8%EC%88%98%EB%B6%84%ED%95%B4</guid>
            <pubDate>Wed, 15 Feb 2023 07:18:52 GMT</pubDate>
            <description><![CDATA[<h3 id="🔗-문제로-이동-👉-소인수분해">🔗 문제로 이동 👉 <a href="https://school.programmers.co.kr/learn/courses/30/lessons/120852">[소인수분해]</a></h3>
<br>

<blockquote>
<h4 id="이-문제의-핵심은-크게-아래와-같이-볼-수-있다">이 문제의 핵심은 크게 아래와 같이 볼 수 있다.</h4>
</blockquote>
<ol>
<li>소인수들은 중복값을 갖지 않는다. 
예를 들어 <code>12</code>를 소인수 분해하면 <code>2 * 2 * 3</code> 으로 나타낼 수 있고, 이때 <code>12</code>의 소인수는 <code>2</code> 와 <code>3</code> 으로 중복되는 숫자는 삭제한다.</li>
<li><code>stream</code>을 사용하여 <code>set</code>을 <code>Array</code>로 변환시킨다.</li>
</ol>
<p><br><br></p>
<h3 id="☑️-첫-번째-풀이">☑️ 첫 번째 풀이</h3>
<p> 처음 문제를 풀었을땐 <code>deduplication()</code> 처리를 해주지 않아서 오답이 나왔다.  <code>100</code> 의 소인수는 <code>2</code> 와 <code>5</code> 이지만 <strong>중복 제거를 하지 않고</strong> 코드를 실행했으 땐 <code>2, 4, 5, 25</code> 가 결과값으로 나오기 때문이다.</p>
<pre><code class="language-java">import java.util.Arrays;
import java.util.Set;
import java.util.HashSet;

class Solution {

    public static boolean[] visited = new boolean[10001];
    public int[] solution(int n) {

        Set&lt;Integer&gt; set = new HashSet&lt;Integer&gt;();
        for(int i = 2; i &lt;= n; i++) {
            if(n % i == 0) {
                if(!visited[i]) {
                    set.add(i);
                    deduplication(i); // 중복 제거
                }
                n /= i;
            }
        }

                // Set to Array
        int[] answer = set.stream()
                        .mapToInt(Integer::intValue)
                        .toArray();

        Arrays.sort(answer);
        return answer;
    }

        // 특정 index로 나뉘어질경우 그 index의 배수를 모두 방문처리 한다
    public static void deduplication(int index) {
        for(int i = index; i &lt; visited.length; i += index ) {
            visited[i] = true;
        }
    }
}</code></pre>
<p><img src="https://velog.velcdn.com/images/p_zane/post/157e3857-d60b-4778-a28f-759565fd0b7e/image.png" alt=""></p>
<p><br><br></p>
<h3 id="✅-두-번째-풀이">✅ 두 번째 풀이</h3>
<p> 위의 코드가 정답처리는 됐지만 <strong>테스트 9</strong> 번의 실행 시간이 너무 길어서 다시 풀어 보았다. 
이때는 중복처리 함수를 따로 두지않고 <strong>while문</strong>을 통해 해당 값으로 더 이상 나눠지지 않을 때까지 반복 실행 해주었다.</p>
<pre><code class="language-java">import java.util.Arrays;
import java.util.Set;
import java.util.HashSet;

class Solution {

    public int[] solution(int n) {

        Set&lt;Integer&gt; set = new HashSet&lt;Integer&gt;();
        for(int i = 2; i &lt;= n; i++) {
            boolean flag = false;
                        // i로 더이상 나눠지지 않을때까지 반복 실행
            while(n % i == 0) {
                flag = true;
                n /= i;
            }
            if(flag) set.add(i);
        }

        int[] answer = set.stream()
                        .mapToInt(Integer::intValue)
                        .toArray();

        Arrays.sort(answer);

        return answer;
    }

}</code></pre>
<p><img src="https://velog.velcdn.com/images/p_zane/post/703db646-e943-4024-9ce4-37d587e6f31f/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[프로그래머스] 특이한 정렬]]></title>
            <link>https://velog.io/@p_zane/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-%ED%8A%B9%EC%9D%B4%ED%95%9C-%EC%A0%95%EB%A0%AC</link>
            <guid>https://velog.io/@p_zane/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-%ED%8A%B9%EC%9D%B4%ED%95%9C-%EC%A0%95%EB%A0%AC</guid>
            <pubDate>Wed, 15 Feb 2023 07:07:50 GMT</pubDate>
            <description><![CDATA[<h3 id="🔗-문제로-이동-👉-특이한-정렬">🔗 문제로 이동 👉 <a href="https://school.programmers.co.kr/learn/courses/30/lessons/120880">[특이한 정렬]</a></h3>
<p><br><br></p>
<blockquote>
<h4 id="이-문제의-핵심은-크게-아래와-같이-볼-수-있다">이 문제의 핵심은 크게 아래와 같이 볼 수 있다.</h4>
<p><a href="https://www.notion.so/efe4317a44b6419cac6212d71f440c61">🔗 정수 배열 내림차순 정렬</a> </p>
</blockquote>
<br>

<h3 id="✅-문제-풀이">✅ 문제 풀이</h3>
<ol>
<li><code>numlist</code>를 내림차순으로 정렬한다 → <code>n</code> 과의 거리가 같다면 <strong>더 큰 수를 앞에 오도록 배치</strong>해야하기 때문</li>
<li><strong>두 수의 차</strong>와 <strong>해당 인덱스</strong>를 담을 <code>int[][] gap</code> 배열 초기화</li>
<li>두 수의 차가 <strong>적은</strong> <strong>순서대로</strong> 오름차순 정렬</li>
<li>n과 가까운 순서대로 정렬한 배열 <code>int[] answer</code> 배열 초기화</li>
</ol>
<pre><code class="language-java">import java.util.Arrays;
import java.util.Comparator;
import java.util.Collections;

class Solution {
    public int[] solution(int[] numlist, int n) {

        // numlist를 내림차순으로 정렬
        numlist = Arrays.stream(numlist)
                    .boxed().sorted(Collections.reverseOrder())
                    .mapToInt(Integer::intValue)
                    .toArray();

        // 두 수의 차와 해당 인덱스를 담은 배열
        int[][] gap = new int[numlist.length][2];
        for(int i = 0; i &lt; numlist.length; i++) {
            int k = Math.max(numlist[i], n) - Math.min(numlist[i], n);
            gap[i][0] = k; 
            gap[i][1] = i;
        }

        // 두 수의 차가 적은 순서대로 오름차순 정렬
        Arrays.sort(gap, Comparator.comparing(i -&gt; i[0]));

        // n과 가까운 순서대로 정렬한 배열
        int[] answer = new int[numlist.length];
        for(int i = 0; i &lt; numlist.length; i++) {
            int index = gap[i][1];
            answer[i] = numlist[index];
        }

        return answer;
    }
}</code></pre>
<p><img src="https://velog.velcdn.com/images/p_zane/post/b8a6fe7e-29c1-4747-9968-7597e6dbd6ba/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[프로그래머스] 배열 자르기]]></title>
            <link>https://velog.io/@p_zane/%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%9E%90%EB%A5%B4%EA%B8%B0</link>
            <guid>https://velog.io/@p_zane/%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%9E%90%EB%A5%B4%EA%B8%B0</guid>
            <pubDate>Wed, 15 Feb 2023 06:49:49 GMT</pubDate>
            <description><![CDATA[<h3 id="🔗-문제로-이동-👉-배열-자르기">🔗 문제로 이동 👉 <a href="https://school.programmers.co.kr/learn/courses/30/lessons/120833">[배열 자르기]</a></h3>
<p><br><br></p>
<blockquote>
<h4 id="💡-javautilarrays-관련-메소드-더-알아보기-👉-클릭">💡 java.util.Arrays 관련 메소드 더 알아보기 👉 <a href="https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/Arrays.html">클릭!</a></h4>
</blockquote>
<ul>
<li><strong>copyOfRange(int[] original, int from, int to)</strong> : original 배열의 from 인덱스부터 to (마지막 요소의 바로 다음)인덱스까지 복사해서 새로운 배열 반환</li>
<li><strong>fill(int[] a, int value)</strong> : 배열 a을 해당 value 값으로 채우기</li>
<li><strong>sort(int[] a)</strong> : 배열을 오름차순으로 정렬</li>
<li><strong>equals(int[] a, int[] b)</strong> : 두 배열의 내용물이 같은지 비교하기</li>
<li><strong>toString()</strong> : 배열 내용 출력하기</li>
</ul>
<p><br><br></p>
<h3 id="☑️-첫-번째-풀이">☑️ 첫 번째 풀이</h3>
<p> 정답은 맞췄으나 코드가 깔끔하지 못한 것 같아서 다시 풀어보았다.</p>
<pre><code class="language-java">class Solution {
    public int[] solution(int[] numbers, int num1, int num2) {

        int[] answer = new int[num2 - num1 + 1];
        for(int i = 0; i &lt; answer.length; i++) {
            answer[i] = numbers[num1];
            num1++;
        }
        return answer;
    }
}</code></pre>
<p><img src="https://velog.velcdn.com/images/p_zane/post/c97a73d7-d05e-49c5-ace6-c1867ee7af06/image.png" alt=""></p>
<p><br><br></p>
<h3 id="✅-for문을-사용한-다른-풀이">✅ for문을 사용한 다른 풀이</h3>
<p> 코딩을 접한지 3년차..<em><del>(경력은 3년차가 아님)</del></em> for문 안에서 변수를 여러개 쓸 수 있다는 사실을 이제서야 알았다..🤦‍♀️ 위의 코드와 크게 다를건 없지만 문제에서 주어지는 매개변수를 손대지 않고 풀 수 있어서 좋다!</p>
<pre><code class="language-java">class Solution {
    public int[] solution(int[] numbers, int num1, int num2) {

        int[] answer = new int[num2 - num1 + 1];
        for(int i = num1, j = 0; i &lt;= num2; i++) {
            answer[j] = numbers[i];
            j++;
        }
        return answer;
    }
}</code></pre>
<p><img src="https://velog.velcdn.com/images/p_zane/post/5d1f5cd8-2f51-4923-9bdd-f8a718e5c08c/image.png" alt=""></p>
<p><br><br></p>
<h3 id="✅-arrays를-사용한-풀이">✅ Arrays를 사용한 풀이</h3>
<p>  <code>Arrays.copyOfRange()</code> 메소드로 문제를 풀었더니 한 줄로 끝나고 심지어 속도도 빠르다. <em><del>역시 아는 것이 힘..</del></em> </p>
<pre><code class="language-java">import java.util.Arrays;
class Solution {
        public int[] solution(int[] numbers, int num1, int num2) {
                // copyOfRange(복사할 배열, 시작 index, 마지막 요소의 바로 다음 index)
                return Arrays.copyOfRange(numbers, num1, num2+1);
        }
}</code></pre>
<p><img src="https://velog.velcdn.com/images/p_zane/post/cffd64e5-8204-4150-9517-19df5bee0bfe/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[프로그래머스] 최빈값 구하기]]></title>
            <link>https://velog.io/@p_zane/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-%EC%B5%9C%EB%B9%88%EA%B0%92-%EA%B5%AC%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@p_zane/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-%EC%B5%9C%EB%B9%88%EA%B0%92-%EA%B5%AC%ED%95%98%EA%B8%B0</guid>
            <pubDate>Wed, 15 Feb 2023 06:35:50 GMT</pubDate>
            <description><![CDATA[<h3 id="🔗-문제로-이동-👉-최빈값-구하기">🔗 문제로 이동 👉 <a href="https://school.programmers.co.kr/learn/courses/30/lessons/120812">[최빈값 구하기]</a></h3>
<p><br><br></p>
<blockquote>
<h4 id="이-문제의-핵심은-크게-아래와-같이-볼-수-있다">이 문제의 핵심은 크게 아래와 같이 볼 수 있다.</h4>
</blockquote>
<ol>
<li>적절한 result 배열의 크기 지정하기</li>
</ol>
<br>

<h3 id="✅-문제-풀이">✅ 문제 풀이</h3>
<p> 처음 문제를 풀 때 result 선언을 <code>new int[array.length+1];</code> 로 해줬더니 런타임 에러가 떴다. 
문제를 다시 읽어보니 array 안의 숫자가 연속적이란 말이 없었다. <del><em>(아무도 속인 사람이 없지만 나 혼자 속은 기분..)</em></del> 그래서 result 의 크기를 array 의 원소 범위에 맞춰 선언해 주고 문제를 풀었더니 정답!</p>
<pre><code class="language-java">class Solution {

    public int solution(int[] array) {
        // 0 ≤ array의 원소 &lt; 1000
        int[] result = new int[1000];
        if(array.length == 1) return array[0];

                // result 배열의 index에는 array의 정수, vaule에는 해당 정수의 count값을 넣어준다  
        for(int i = 0; i &lt; array.length; i++) {
            result[array[i]] += 1;
        }

        int max = 0;
        int answer = 0;
        for(int i  = 0; i &lt; result.length; i++) {
            if(max &lt; result[i]) {
                max = result[i];
                answer = i;
            } else if(max == result[i]) {
                answer = -1;
            }
        }

        return answer;
    }
}</code></pre>
<p><img src="https://velog.velcdn.com/images/p_zane/post/593f09b6-6090-4e81-8b71-ba688648186d/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Java] StringBuffer와 StringBuilder의 차이 ]]></title>
            <link>https://velog.io/@p_zane/Java-StringBuffer%EC%99%80-StringBuilder%EC%9D%98-%EC%B0%A8%EC%9D%B4</link>
            <guid>https://velog.io/@p_zane/Java-StringBuffer%EC%99%80-StringBuilder%EC%9D%98-%EC%B0%A8%EC%9D%B4</guid>
            <pubDate>Wed, 15 Feb 2023 04:46:22 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p><code>String</code>, <code>StringBuffer</code>, <code>StringBuilder</code> 모두 문자열을 저장하고 관리하는 클래스이다. 이들의 차이점과 장단점을 알아보자.</p>
</blockquote>
<br>

<h2 id="1-string">1) String</h2>
<p>먼저 String 과 다른 두 문자열 클래스의 아주 기본적인 차이점은 <strong><span style="color : blue">immutable(불변) / mutable(변함)</span></strong>에 있다.</p>
<p><strong>String 객체는 한 번 생성되면 할당된 메모리 공간이 변하지 않는다.</strong> + 연산자 또는 concat 메소드를 통해 String 클래스 객체 문자열에 다른 문자열을 붙이면 기존 문자열에 새로운 문자열을 붙이는 것이 아니라, 새로운 String 객체를 만들어 연결된 문자열을 저장하고, 그 객체를 참조하는 방식이다. (처음 선언한 &quot;Hello&quot;의 메모리 영역은 Garge로 남아있다가 기존 객체가 제거되면 GC(Garbage Collection)에 의해 사라진다.)</p>
<p>이러한 이유로 문자열 연산이 많은 경우 성능이 좋지 않기 때문에 <code>문자열의 추가, 수정, 삭제가 빈번하게 발생하는 경우라면 String 클래스가 아닌 StringBuffer, StringBuilder 클래스를 사용해야한다.</code></p>
<p><img src="https://velog.velcdn.com/images/p_zane/post/6f32d7d0-86ac-4601-8690-b2781e1a300a/image.png" alt=""></p>
<p><br><br></p>
<h2 id="2-stringbuffer--stringbuilder">2) StringBuffer / StringBuilder</h2>
<p>String 과 반대로 StringBuffer / StringBuilder 는 가변성을 가지기 때문에 문자열 연산 등으로 기존 객체의 공간이 부족하게 되는 경우, 기존 버퍼의 크기를 늘리며 유연하게 동작한다. 
다시말해, <code>append()</code>, <code>delete()</code> 등의 API를 이용하여 <strong>동일 객체 내에서 문자열을 변경하는 것이 가능</strong>하다. </p>
<p>그렇다면 StringBuffer 와 StringBuilder 의 차이는 뭘까? 바로 <strong>동기화 여부</strong>이다. StringBuffer 는 각 메소드 별로 Synchronized Keyword 가 존재하여 멀티스레드 환경에서도 동기화를 지원하는 반면, StringBuilder 는 동기화를 보장하지 않는다.  </p>
<p><img src="https://velog.velcdn.com/images/p_zane/post/492ce234-72d4-49f8-89ba-f44ac8a5ef4a/image.png" alt=""></p>
<p><br><br></p>
<blockquote>
<h3 id="정리">정리</h3>
<p><strong>String</strong> : 문자열 연산이 적고 멀티스레드 환경일 경우
<strong>StringBuffer</strong> :문자열 연산이 많고 멀티스레드 환경일경우
<strong>StringBuilder</strong> : 문자열 연산이 많고 단일 스레드이거나 동기화를 고려하지 않아도 되는경우</p>
</blockquote>
<p><br><br></p>
<hr>
<p>📚 참고
<a href="https://ifuwanna.tistory.com/221">https://ifuwanna.tistory.com/221</a>
<a href="https://12bme.tistory.com/42">https://12bme.tistory.com/42</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[프로그래머스] 문자열 뒤집기]]></title>
            <link>https://velog.io/@p_zane/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-%EB%AC%B8%EC%9E%90%EC%97%B4-%EB%92%A4%EC%A7%91%EA%B8%B0</link>
            <guid>https://velog.io/@p_zane/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-%EB%AC%B8%EC%9E%90%EC%97%B4-%EB%92%A4%EC%A7%91%EA%B8%B0</guid>
            <pubDate>Mon, 13 Feb 2023 06:00:14 GMT</pubDate>
            <description><![CDATA[<h3 id="🔗-문제로-이동-👉-문자열-뒤집기">🔗 문제로 이동 👉 <a href="https://school.programmers.co.kr/learn/courses/30/lessons/120822">[문자열 뒤집기]</a></h3>
<p><br><br></p>
<blockquote>
<h4 id="이-문제의-핵심은-크게-아래와-같이-볼-수-있다">이 문제의 핵심은 크게 아래와 같이 볼 수 있다.</h4>
<p>💡 <strong><code>StringBuilder()</code></strong> 활용하기</p>
</blockquote>
<p><br><br></p>
<h3 id="☑️-첫-번째-풀이">☑️ 첫 번째 풀이</h3>
<p>단순하게 String을 char 단위로 쪼개서 조합하는 코드를 짰는데 생각보다 시간이 너무 많이 오래걸려서 다시 풀어보았다. </p>
<pre><code class="language-java">class Solution {
    public String solution(String my_string) {
        String answer = &quot;&quot;;
        for(int i = my_string.length(); i &gt; 0; i--) {
            answer += my_string.charAt(i-1);
        }
        return answer;
    }
}</code></pre>
<p><img src="https://velog.velcdn.com/images/p_zane/post/30fda5cf-932d-4e82-b64b-6bc23d99af39/image.png" alt=""></p>
<p><br><br></p>
<h3 id="✅-두-번째-풀이">✅ 두 번째 풀이</h3>
<p><code>StringBuilder()</code> 를 활용했더니 시간이 엄청 줄었다! </p>
<blockquote>
<h4 id="참고">참고</h4>
<p><a href="https://velog.io/@p_zane/Java-StringBuffer%EC%99%80-StringBuilder%EC%9D%98-%EC%B0%A8%EC%9D%B4">🔗String과 StringBuilder의 차이가 궁금하다면 클릭!</a>
<code>append(AnyType anything)</code> : 어떤 자료형이든 추가
<code>sb.reverse()</code> : 순서 거꾸로 변환
<code>sb.toString()</code> : 문자열 타입으로 변환</p>
</blockquote>
<pre><code class="language-java">class Solution {
    public String solution(String my_string) {
        StringBuilder sb = new StringBuilder();
        sb.append(my_string);
        sb.reverse();
        String answer = sb.toString();
        return answer;
    }
}</code></pre>
<p><img src="https://velog.velcdn.com/images/p_zane/post/fc605b99-7576-4d65-9af1-2f7cdb673314/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[프로그래머스] 분수의 덧셈]]></title>
            <link>https://velog.io/@p_zane/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-%EB%B6%84%EC%88%98%EC%9D%98-%EB%8D%A7%EC%85%88</link>
            <guid>https://velog.io/@p_zane/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-%EB%B6%84%EC%88%98%EC%9D%98-%EB%8D%A7%EC%85%88</guid>
            <pubDate>Mon, 13 Feb 2023 05:42:37 GMT</pubDate>
            <description><![CDATA[<h3 id="🔗문제로-이동-👉-분수의-덧셈">🔗문제로 이동 👉 <a href="https://school.programmers.co.kr/learn/courses/30/lessons/120808">[분수의 덧셈]</a></h3>
<p><br><br></p>
<blockquote>
<h4 id="이-문제의-핵심은-크게-아래와-같이-볼-수-있다">이 문제의 핵심은 크게 아래와 같이 볼 수 있다.</h4>
</blockquote>
<ul>
<li>최대공약수 / 최소공배수 구하기</li>
<li><strong>유클리드 호제법</strong> 알고리즘 활용하기 <a href="https://ko.wikipedia.org/wiki/%EC%9C%A0%ED%81%B4%EB%A6%AC%EB%93%9C_%ED%98%B8%EC%A0%9C%EB%B2%95">(참고사이트)</a></li>
</ul>
<p><br><br></p>
<h3 id="☑️-첫-번째-풀이">☑️ 첫 번째 풀이</h3>
<p> for문을 사용하여 최대공약수를 찾도록 코드를 짰다. 정답으로 인정은 됐지만 속도가 아쉬워 다시 풀어보았다.</p>
<pre><code class="language-java">class Solution {

    // 최대공약수
    public int gdc(int x, int y) {
        int min = 1;
        for(int i = 2; i &lt;= Math.min(x, y); i++) {
            if(x%i == 0 &amp;&amp; y%i == 0) {
                min = i;
            }
        }
        return min;
    }

    public int[] solution(int denum1, int num1, int denum2, int num2) {

        int num3  = (num1 * num2) / gdc(num1, num2); // 분자(최소공배수)
        int denum3 = (num3 / num1 * denum1) + (num3 / num2 * denum2); // 분모
        int result = gdc(num3, denum3); // 기약분수

        int[] answer = {denum3/result, num3/result};

        return answer;
    }
}</code></pre>
<p><img src="https://velog.velcdn.com/images/p_zane/post/448c2875-e253-428f-a7ed-267f3ad8e505/image.png" alt=""></p>
<p><br><br></p>
<h3 id="✅-두-번째-풀이">✅ 두 번째 풀이</h3>
<p>  그래서 알게된 <strong>유클리드 호제법</strong>! 위에 반복문을 돌리는 것 보다 가독성이 좋고 심지어 속도도 훨씬 빠르다. <em><del>이런 간단한 알고리즘은 외워두는게…</del></em></p>
<pre><code class="language-java">class Solution {

    // 최대공약수(유클리드 호제법)
    public int gdc(int x, int y) {
        if(x % y == 0) return y;
                return gdc(y, x % y);
    }

    public int[] solution(int denum1, int num1, int denum2, int num2) {

        int num3  = (num1 * num2) / gdc(num1, num2); // 분자(최소공배수)
        int denum3 = (num3 / num1 * denum1) + (num3 / num2 * denum2); // 분모
        int result = gdc(num3, denum3); // 기약분수

        int[] answer = {denum3/result, num3/result};

        return answer;
    }
}</code></pre>
<p><img src="https://velog.velcdn.com/images/p_zane/post/7ec796c2-984f-4a2f-b1e6-caa13111efbd/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[프로그래머스] 배열의 평균값]]></title>
            <link>https://velog.io/@p_zane/%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%9D%98-%ED%8F%89%EA%B7%A0%EA%B0%92</link>
            <guid>https://velog.io/@p_zane/%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%9D%98-%ED%8F%89%EA%B7%A0%EA%B0%92</guid>
            <pubDate>Mon, 13 Feb 2023 05:34:43 GMT</pubDate>
            <description><![CDATA[<h3 id="🔗-문제로-이동-👉-배열의-평균값">🔗 문제로 이동 👉 <a href="https://school.programmers.co.kr/learn/courses/30/lessons/120817">[배열의 평균값]</a></h3>
<p><br><br></p>
<blockquote>
<h4 id="이-문제의-핵심은-크게-아래와-같이-볼-수-있다">이 문제의 핵심은 크게 아래와 같이 볼 수 있다.</h4>
</blockquote>
<ul>
<li>double 자료형 확인 (소수점)</li>
<li>반복문과 Stream을 사용하여 배열의 합계와 평균을 계산 (<a href="https://www.notion.so/Stream-058a5a7ac492444e91d7184b39ce9132">더 자세히 공부하러 가기</a> ✏️)</li>
</ul>
<p><br><br></p>
<h3 id="✅-첫-번째-풀이">✅ 첫 번째 풀이</h3>
<p>forEach로 <code>numbers</code>의 모든 배열을 <code>double</code> 형으로 합쳐준 다음, 배열의 길이로 나눠 평균값을 구했다.</p>
<pre><code class="language-java">class Solution {
    public double solution(int[] numbers) {

        double answer = 0;
        for(double num : numbers) {
            answer += num;
        }
        return answer/numbers.length;
    }
}</code></pre>
<p><img src="https://velog.velcdn.com/images/p_zane/post/690b9b77-ceca-4fed-ba03-e090d6d7fbfa/image.png" alt=""></p>
<p><br><br></p>
<h3 id="☑️-두-번째-풀이">☑️ 두 번째 풀이</h3>
<p>다른사람의 코드를 보니 <code>stream</code>을 사용해서 푸는 방법도 있길래 다시 한 번 풀어보았다. 속도는 for문을 돌려서 연산하는 것이 훨씬 빠르지만, 가독성 때문인지 <code>stream</code>을 많이 쓰는 추세인듯 하다.
<code>return</code> 자료형이 <code>double</code>이기 때문에 <code>getAsDouble()</code> 을 꼭 붙여줘야한다.  </p>
<pre><code class="language-java">import java.util.Arrays;
class Solution {
    public double solution(int[] numbers) {
        return Arrays.stream(numbers).average().getAsDouble();
    }
}</code></pre>
<p><img src="https://velog.velcdn.com/images/p_zane/post/e3d047b9-3a3d-4de2-8772-3501cec33cb7/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[프로그래머스] 소수찾기]]></title>
            <link>https://velog.io/@p_zane/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-%EC%86%8C%EC%88%98%EC%B0%BE%EA%B8%B0</link>
            <guid>https://velog.io/@p_zane/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-%EC%86%8C%EC%88%98%EC%B0%BE%EA%B8%B0</guid>
            <pubDate>Fri, 10 Feb 2023 07:25:18 GMT</pubDate>
            <description><![CDATA[<h3 id="🔗문제로-이동-👉-소수찾기">🔗문제로 이동 👉 <a href="https://school.programmers.co.kr/learn/courses/30/lessons/42839">[소수찾기]</a></h3>
<p><br><br></p>
<blockquote>
<h4 id="이-문제의-핵심은-크게-아래와-같이-볼-수-있다">이 문제의 핵심은 크게 아래와 같이 볼 수 있다.</h4>
</blockquote>
<ol>
<li>숫자 조합하기 👉 🥭<a href="https://www.notion.so/Permutation-b434d8deaf4a4c0894dbffc30638f202">순열 Permutation</a></li>
<li>소수 찾기</li>
</ol>
<p><br><br></p>
<h3 id="✅-문제-풀이">✅ 문제 풀이</h3>
<ol>
<li>문제에서 주어지는 문자열을 <code>numbers.split(&quot;&quot;)</code> 을 통해 배열로 만든다.</li>
<li><code>permutation()</code> 메소드와 <code>swap()</code> 메소드를 통해 모든 숫자들의 조합을 구하고, <code>Set</code> 에 담아서 중복을 제거한다.</li>
<li><code>findPrimeNumber()</code> 메소드를 사용해서 소수를 찾는다. <em>(소수이면 true, 아니면 false 를 반환)</em></li>
</ol>
<pre><code class="language-java">import java.util.Set;
import java.util.HashSet;

class Solution {

        static String[] arr;
        static Set&lt;Integer&gt; set = new HashSet&lt;Integer&gt;();

        public int solution(String numbers) {
                int answer = 0;
                arr = numbers.split(&quot;&quot;);

                // 숫자 조합하기
                for (int i = 1; i &lt;= arr.length; i++) {
                        permutation(0, arr.length, i);
                }

                // 소수 count    
                for (int num : set) {
                        if(findPrimeNumber(num)) answer++;
                }        

                return answer;
        }

        // 순열 만들기(1) : r은 조합할 수의 개수 
        static void permutation(int depth, int n, int r) {
                if(depth == r) {
                        // 조합한 숫자 Set에 저장(중복 제거)
                        String num = &quot;&quot;;
                        for(int i = 0; i &lt; r; i++) {
                                num += arr[i];
                        }
                        set.add(Integer.parseInt(num));
                        return;
                }

                for (int i = depth; i &lt; n; i++) {
                        swap(depth, i);
                        permutation(depth+1, n, r);
                        swap(depth, i);
                }
        }

        // 순열 만들기(2) - swap
        static void swap(int depth, int index) {
                String temp = arr[depth];
                arr[depth] = arr[index];
                arr[index] = temp;
        }

        // 소수 찾기
        static boolean findPrimeNumber(int num) {
                if(num &lt;= 1) return false;
                for (int i = 2; i * i &lt;= num; i++) {
                        if(num % i == 0) return false;    
                }
                return true;
        }
}</code></pre>
<p><img src="https://velog.velcdn.com/images/p_zane/post/88969470-116c-48ce-ae49-dcba21157566/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[프로그래머스] 타겟 넘버]]></title>
            <link>https://velog.io/@p_zane/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-%ED%83%80%EA%B2%9F-%EB%84%98%EB%B2%84</link>
            <guid>https://velog.io/@p_zane/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-%ED%83%80%EA%B2%9F-%EB%84%98%EB%B2%84</guid>
            <pubDate>Fri, 10 Feb 2023 07:21:29 GMT</pubDate>
            <description><![CDATA[<h3 id="🔗-문제로-이동-👉-타겟-넘버">🔗 문제로 이동 👉 <a href="https://school.programmers.co.kr/learn/courses/30/lessons/43165">[타겟 넘버]</a></h3>
<p><br><br></p>
<blockquote>
<h4 id="이-문제의-핵심은-크게-아래와-같이-볼-수-있다">이 문제의 핵심은 크게 아래와 같이 볼 수 있다.</h4>
</blockquote>
<ol>
<li>모든 경우의 수 구하기 (완전탐색)</li>
<li>재귀함수를 구현할때 어떤 인자를 넘길지 생각하기</li>
</ol>
<p><br><br></p>
<h3 id="✅-문제-풀이">✅ 문제 풀이</h3>
<pre><code class="language-java">/* 타겟 넘버 */
public class Main {

    public static int answer = 0;

    public static void recursion(int[]numbers, int target, int index, int sum) {

        // numbers의 모든 숫자를 합쳤을 때
        if(index == numbers.length) { 
            if(sum == target) {
                answer++;
                return;
            }

        } else {
            // 해당 인덱스가 양수일 경우
            recursion(numbers, target, index + 1, sum + numbers[index]);
            // 해당 인덱스가 음수일 경우 
            recursion(numbers, target, index + 1, sum - numbers[index]);
        }

    }

    public static void main(String[] args) {
        int[] numbers = {1, 1, 1, 1, 1};
        int target = 3;

        recursion(numbers, target, 0, 0);

        System.out.println(answer);

    }

}</code></pre>
<p><img src="https://velog.velcdn.com/images/p_zane/post/f0975a30-4422-4a75-a7dc-cb20ee8f91d4/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[프로그래머스] 크기가 작은 부분 문자열]]></title>
            <link>https://velog.io/@p_zane/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-%ED%81%AC%EA%B8%B0%EA%B0%80-%EC%9E%91%EC%9D%80-%EB%B6%80%EB%B6%84-%EB%AC%B8%EC%9E%90%EC%97%B4</link>
            <guid>https://velog.io/@p_zane/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-%ED%81%AC%EA%B8%B0%EA%B0%80-%EC%9E%91%EC%9D%80-%EB%B6%80%EB%B6%84-%EB%AC%B8%EC%9E%90%EC%97%B4</guid>
            <pubDate>Fri, 10 Feb 2023 06:32:39 GMT</pubDate>
            <description><![CDATA[<h3 id="🔗문제로-이동-👉-크기가-작은-부분-문자열">🔗문제로 이동 👉 <a href="https://school.programmers.co.kr/learn/courses/30/lessons/147355">[크기가 작은 부분 문자열]</a></h3>
<p><br><br></p>
<blockquote>
<h4 id="문제를-통해-새롭게-배운-부분-or-느낀점">문제를 통해 새롭게 배운 부분 OR 느낀점</h4>
<p>💡 <strong>알 수 없는 <code>런타임 에러</code>가 발생하면 <code>자료형</code>을 확인하자!</strong>
분명 테스트 케이스는 모두 통과했는데 막상 코드를 제출하니 런타임 에러가 발생했다. 이상하다 싶어서 문제를 다시 읽어보니 놓친 부분이 있었다. 
<strong>• 1 ≤ p의 길이 ≤ 18</strong>
<strong>• p의 길이 ≤ t의 길이 ≤ 10,000</strong>
위의 조건을 제대로 안보고 단순히 <code>p</code> ≤ <code>t</code> 로 이해하고 넘어가서 <code>tn</code>과 <code>pn</code>을 <code>int</code> 타입으로 지정해서 벌어진 문제였다😱
앞으로는 마음이 급하다고 대충 보고 지나가는 것이 아니라, 출제자가 왜 저런 조건을 걸었는지 생각하는 습관을 길러야겠다.</p>
</blockquote>
<p><br><br></p>
<h3 id="✅-문제풀이">✅ 문제풀이</h3>
<ol>
<li><code>t</code>와 <code>p</code>가 나타내는 수 <code>tn</code>, <code>pn</code>을 선언한다.<ul>
<li><code>t</code>의 길이가 최대 10,000 이기 때문에 <code>long</code> 타입으로 선언한다.</li>
</ul>
</li>
<li><code>for</code>문을 사용해 <code>p</code>의 제일 앞자리 숫자와  <code>t</code>의 해당 인덱스에 해당하는 숫자를 비교한다.<ul>
<li><code>i &lt;= t.length() - p.length()</code> → <code>p</code>보다 작은 자리수는 비교할 필요가 없기 때문에 생략한다.</li>
</ul>
</li>
<li><code>t</code>의 해당 인덱스에 해당하는 숫자가 같거나 작다면 <code>tn</code>을 현재 인덱스부터 <code>p</code>의 길이만큼 자른다.</li>
<li><code>tn</code>이 <code>pn</code>보다 작거나 같다면 <code>answer++</code> 해준다.</li>
</ol>
<pre><code class="language-java">class Solution {

    public int solution(String t, String p) {
        int answer = 0;
        long tn = 0;
        long pn = Long.parseLong(p);

        for(int i = 0; i &lt;= t.length() - p.length(); i++) {
            if(t.charAt(i) &lt;= p.charAt(0)) {
                tn = Long.parseLong(t.substring(i, i + p.length()));
                if(tn &lt;= pn) answer++;
            }
        }

        return answer;
    }
}</code></pre>
<p><img src="https://velog.velcdn.com/images/p_zane/post/7919c0ca-1fbf-4efd-acd5-c8103e1c34ab/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[프로그래머스] 숫자 문자열과 영단어]]></title>
            <link>https://velog.io/@p_zane/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-%EC%88%AB%EC%9E%90-%EB%AC%B8%EC%9E%90%EC%97%B4%EA%B3%BC-%EC%98%81%EB%8B%A8%EC%96%B4</link>
            <guid>https://velog.io/@p_zane/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-%EC%88%AB%EC%9E%90-%EB%AC%B8%EC%9E%90%EC%97%B4%EA%B3%BC-%EC%98%81%EB%8B%A8%EC%96%B4</guid>
            <pubDate>Fri, 10 Feb 2023 06:26:11 GMT</pubDate>
            <description><![CDATA[<h3 id="🔗문제로-이동-👉-숫자-문자열과-영단어">🔗문제로 이동 👉 <a href="https://school.programmers.co.kr/learn/courses/30/lessons/81301">[숫자 문자열과 영단어]</a></h3>
<p><br><br></p>
<blockquote>
<h4 id="문제를-통해-새롭게-배운-부분-or-중요한-부분">문제를 통해 새롭게 배운 부분 OR 중요한 부분</h4>
</blockquote>
<ul>
<li><code>indexOf()</code> 활용</li>
<li><em>ArrayList*</em> 자료구조에서 <strong>특정 문자의 인덱스를 반환</strong>하는 함수이다. 때문에 일반 배열의 인덱스를 반환하고자 할 때는 <code>Arrays.asList()</code> 를 사용해 <strong>List</strong>로 변환 후 사용해야 한다.</li>
</ul>
<p><br><br></p>
<h3 id="✅-문제풀이">✅ 문제풀이</h3>
<ol>
<li>영단어를 문자열 배열에 순서대로 담는다. </li>
<li><code>replaceAll</code>을 통해 <code>s</code>에 포함된 영단어들을 숫자로 대치한다. <ul>
<li>영단어가 숫자로 대치된 값은, 문자열 배열에서 영단어의 인덱스 값과 같다.</li>
<li><code>Arrays.asList(배열).indexOf(영단어)</code></li>
</ul>
</li>
<li>반환값이 <code>int</code> 이기 때문에 문자열에서 숫자로 형 변환 후 반환한다.</li>
</ol>
<pre><code class="language-java">import java.util.Arrays;

class Solution {
    public int solution(String s) {
        int answer = Integer.parseInt(replaceNumber(s));

        return answer;
    }

    public static String replaceNumber(String s) {
        String[] arr = {&quot;zero&quot;, &quot;one&quot;, &quot;two&quot;, &quot;three&quot;, &quot;four&quot;, &quot;five&quot;, &quot;six&quot;, &quot;seven&quot;, &quot;eight&quot;, &quot;nine&quot;};
        for(String str : arr) {
            String index = String.valueOf(Arrays.asList(arr).indexOf(str)); 
            s = s.replaceAll(str, index);
        }

        return s;
    }
}</code></pre>
<p><img src="https://velog.velcdn.com/images/p_zane/post/3ef698e8-5dc3-4a5a-96e5-9cefded86465/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[프로그래머스] 실패율]]></title>
            <link>https://velog.io/@p_zane/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-%EC%8B%A4%ED%8C%A8%EC%9C%A8</link>
            <guid>https://velog.io/@p_zane/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-%EC%8B%A4%ED%8C%A8%EC%9C%A8</guid>
            <pubDate>Fri, 10 Feb 2023 05:56:14 GMT</pubDate>
            <description><![CDATA[<h3 id="🔗-문제로-이동-👉-실패율">🔗 문제로 이동 👉 <a href="https://school.programmers.co.kr/learn/courses/30/lessons/42889#">[실패율]</a></h3>
<p><br><br></p>
<blockquote>
<h4 id="이-문제의-핵심은-크게-아래와-같이-볼-수-있다">이 문제의 핵심은 크게 아래와 같이 볼 수 있다.</h4>
</blockquote>
<ol>
<li>실패율을 담은 <code>List</code> 내림차순으로 정렬하기</li>
<li>스테이지에 도달한 유저가 없는 경우 해당 스테이지의 실패율은 <code>0</code> 으로 정의하기</li>
</ol>
<p><br><br></p>
<h3 id="✅-문제풀이">✅ 문제풀이</h3>
<ol>
<li>해당 stage 와 실패율을 담을 리스트 <code>failureRate</code> 를 선언한다.</li>
<li>stage 에 도달한 유저가 없는경우 해당 스테이지의 실패율은 <code>0</code> 으로 정의한다.</li>
<li>실패율을 내림차순으로 정렬한다.</li>
</ol>
<blockquote>
<h4 id="🔥-compare-메소드를-사용하여-오름차순으로-정렬할-경우">🔥 compare() 메소드를 사용하여 <strong>오름차순</strong>으로 정렬할 경우</h4>
<p>첫번째 파라미터 <span style="color: blue"><strong>&gt;</strong></span> 두번째 파라미터 이면 <span style="color: blue"><strong>양수</strong></span>
첫번째 파라미터 <span style="color: red"><strong>&lt;</strong> </span> 두번째 파라미터이면 <span style="color: red"><strong>음수</strong></span>
<span style="color: green"><strong>같으면 0</strong></span> 을 리턴한다.
<em>반면 <strong>‘내림차순’</strong>으로 정렬 할 경우 <strong>양수</strong>와 <strong>음수</strong>를 <strong>반대로</strong> 리턴하면 된다.</em></p>
</blockquote>
<pre><code class="language-java">import java.util.ArrayList;

class Solution {
    public int[] solution(int N, int[] stages) {
        int[] answer = new int[N];
        ArrayList&lt;double[]&gt; failureRate = new ArrayList&lt;double[]&gt;();

        // 실패율 구하기 
        for(int i = 1; i &lt;= N; i++) {
            double arrive = 0;
            int clear = 0;
            for(int j = 0; j &lt; stages.length; j++) {
                if(stages[j] &gt;= i) {
                    if(stages[j] == i) arrive++;
                    clear++;
                }
            }
            // 스테이지에 도달한 유저가 없는 경우 해당 스테이지의 실패율은 0 으로 정의    
            if(clear == 0) {
                failureRate.add(new double[] {i, 0});
                continue;
            }
            failureRate.add(new double[] {i, arrive/clear});
        }

        //직접 정의해서 정렬하기는 방법은 아래에 따로 정리! 
        // 실패율 내림차순으로 정렬하기 
        failureRate.sort((a, b) -&gt; Double.compare(b[1], a[1]));

        // 출력
        for(int i = 0; i &lt; N; i++) {
            answer[i] = (int)failureRate.get(i)[0];
            //System.out.println((int)failureRate.get(i)[0] + &quot;/&quot; + failureRate.get(i)[1]);
        }

        return answer;
    }
}</code></pre>
<p><img src="https://velog.velcdn.com/images/p_zane/post/79920474-0d6d-4a11-87c8-56391dbdc24a/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/p_zane/post/41e3c610-b2b4-4e24-9006-eeb0551cd657/image.png" alt=""></p>
<p><br><br></p>
<blockquote>
<h4 id="💡-람다식이-아닌-직접-정의해서-정렬해보기">💡 람다식이 아닌 직접 정의해서 정렬해보기</h4>
</blockquote>
<pre><code class="language-java">import java.util.Collections;

Comparator&lt;double[]&gt; comparator = new Comparator&lt;double[]&gt;() {
        @Override
        public int compare(double[] o1, double[] o2) {
                if(o1[1] &gt; o2[1]) {
                        return -1; // 내림차순일 경우 음수 
                } else if(o1[1] == o2[1]) {
                        return 0; 
                } else {
                        return 1; // 내림차순일 경우 양수 
                } 
        }
};

Collections.sort(failureRate, comparator);</code></pre>
<h2 id="brbr"><br><br></h2>
<p>📚 참고 사이트</p>
<p><a href="https://taehoung0102.tistory.com/25">https://taehoung0102.tistory.com/25</a></p>
<p><a href="https://ttl-blog.tistory.com/148">https://ttl-blog.tistory.com/148</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[프로그래머스] 완주하지 못한 선수]]></title>
            <link>https://velog.io/@p_zane/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-%EC%99%84%EC%A3%BC%ED%95%98%EC%A7%80-%EB%AA%BB%ED%95%9C-%EC%84%A0%EC%88%98</link>
            <guid>https://velog.io/@p_zane/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-%EC%99%84%EC%A3%BC%ED%95%98%EC%A7%80-%EB%AA%BB%ED%95%9C-%EC%84%A0%EC%88%98</guid>
            <pubDate>Fri, 10 Feb 2023 05:40:01 GMT</pubDate>
            <description><![CDATA[<h3 id="🔗-문제로-이동--완주하지-못한-선수">🔗 문제로 이동  <a href="https://school.programmers.co.kr/learn/courses/30/lessons/42576">[완주하지 못한 선수]</a></h3>
<p><br><br></p>
<blockquote>
<h4 id="이-문제의-핵심은-크게-아래와-같이-볼-수-있다">이 문제의 핵심은 크게 아래와 같이 볼 수 있다.</h4>
</blockquote>
<ul>
<li>HashMap의 활용 👉 <a href="https://www.notion.so/Map-af9e4fa137e143088ba83c623a7db9d6">더 보러가기</a></li>
<li><code>entrySet()</code> : Key와 Value의 값이 모두 필요한 경우 사용
  <code>keySet()</code> : Key의 값만 필요한 경우 사용</li>
</ul>
<p><br><br></p>
<h3 id="✅-문제풀이">✅ 문제풀이</h3>
<pre><code class="language-java">import java.util.HashMap;
import java.util.Map.Entry;

class Solution {
    public String solution(String[] participant, String[] completion) {
        String answer = &quot;&quot;;

                // 참가자 명단 초기화
        HashMap&lt;String, Integer&gt; hm = new HashMap&lt;String, Integer&gt;();
        for(String p : participant) {
            if(!hm.containsKey(p)) hm.put(p, 1);
            else hm.put(p, hm.get(p) + 1);
        }

                // 완주자 명단과 비교하여 해당 선수가 존재할 시 value--
        for(String c : completion) {
            if(hm.containsKey(c)) hm.put(c, hm.get(c) - 1);
        }

                // value가 0이 아닌 경우 찾기
        for(Entry&lt;String, Integer&gt; e : hm.entrySet()) {
            if(e.getValue() != 0) {
                answer = e.getKey();
                break;
            }
        }

        return answer;
    }
}</code></pre>
<p><img src="https://velog.velcdn.com/images/p_zane/post/86ebe76b-0443-4b20-af0b-042a5ecff411/image.png" alt=""></p>
<br>

<blockquote>
<p>💬 참고로 <code>keySet()</code>을 사용해서 풀어본 결과 아래와 같이 결과가 나왔다. 수치상으로 큰 차이는 없어 보이지만 <code>hm.get(key)</code> 할 때마다 계속 HashMap을 탐색해야하기 때문에 매우 비효율적이다. 
때문에 <strong>key, value를 같이 가져올 때</strong>는 항상 <code>entrySet()</code>을 사용해야 한다.</p>
</blockquote>
<pre><code class="language-java">for(String key : hm.keySet()) {
        if(hm.get(key) != 0) {
            answer = key;
            break;
        }
}</code></pre>
<p><img src="https://velog.velcdn.com/images/p_zane/post/8767c1f5-333b-424a-bd2b-ef32a85d4136/image.png" alt=""></p>
]]></description>
        </item>
    </channel>
</rss>