<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>eun__esh</title>
        <link>https://velog.io/</link>
        <description>백엔드 떠오르는 상현달</description>
        <lastBuildDate>Mon, 26 Dec 2022 07:50:34 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>eun__esh</title>
            <url>https://velog.velcdn.com/images/eun_esh/profile/603c4058-9bff-47b9-82ef-a4d5f6a18e0d/image.jpg</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. eun__esh. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/eun_esh" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[[프로그래머스 / Java] Lv2 - 영어 끝말잇기]]></title>
            <link>https://velog.io/@eun_esh/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-Java-Lv2-%EC%98%81%EC%96%B4-%EB%81%9D%EB%A7%90%EC%9E%87%EA%B8%B0</link>
            <guid>https://velog.io/@eun_esh/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-Java-Lv2-%EC%98%81%EC%96%B4-%EB%81%9D%EB%A7%90%EC%9E%87%EA%B8%B0</guid>
            <pubDate>Mon, 26 Dec 2022 07:50:34 GMT</pubDate>
            <description><![CDATA[<h1 id="🔒-영어-끝말잇기">🔒 영어 끝말잇기</h1>
<h2 id="✔-문제-설명">✔ 문제 설명</h2>
<p><img src="https://velog.velcdn.com/images/eun_esh/post/ceeda1ee-1ecd-428b-88cf-19dc6b3e6a7e/image.png" alt=""> <img src="https://velog.velcdn.com/images/eun_esh/post/ce0bd3d4-36d0-4ed7-8854-8f7549992654/image.png" alt=""> <img src="https://velog.velcdn.com/images/eun_esh/post/2b2eb15e-2b7b-46be-98df-0ca7909ae25f/image.png" alt=""></p>
<h2 id="🚩-요구사항-분석">🚩 요구사항 분석</h2>
<ul>
<li>substring을 이용해 앞사람이 말한 마지막 문자 체크</li>
<li>임의의 count 변수를 활용해 인원수와 같으면 차례를 추가해 탈락자 확인</li>
</ul>
<h2 id="🔑문제풀이">🔑문제풀이</h2>
<pre><code class="language-java">class Solution {
    public int[] solution(int n, String[] words) {
        int[] answer = new int[2];
        List&lt;String&gt; gameList = new ArrayList&lt;&gt;();
        int count = 0;
        int care = 1;
        for(int i = 0; i&lt;words.length; i++){
            count++;
            if(!gameList.contains(words[i])){
                gameList.add(words[i]);
            } else{
                break;
            }

            if(i==0){
                continue;
            }
            String s= words[i-1].substring(words[i-1].length()-1,words[i-1].length());
            String p= words[i].substring(0,1);

            if(!s.equals(p)){
                break;
            }

            if(count == n){
                count = 0;
                care++;
            }
        }
        if(count != 0 ){       
            answer[0] = count;
            answer[1] = care;       
        }
        return answer;
    }
}</code></pre>
<h2 id="💡-추가한-테스트-케이스">💡 추가한 테스트 케이스</h2>
<table>
<thead>
<tr>
<th align="center"></th>
<th align="center">Parameters</th>
<th align="center">Return</th>
</tr>
</thead>
<tbody><tr>
<td align="center">추가한 테스트 케이스는 없다.</td>
<td align="center"></td>
<td align="center"></td>
</tr>
</tbody></table>
]]></description>
        </item>
        <item>
            <title><![CDATA[[프로그래머스 / Java] Lv2 - 짝지어 제거하기]]></title>
            <link>https://velog.io/@eun_esh/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-Java-Lv2-%EC%A7%9D%EC%A7%80%EC%96%B4-%EC%A0%9C%EA%B1%B0%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@eun_esh/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-Java-Lv2-%EC%A7%9D%EC%A7%80%EC%96%B4-%EC%A0%9C%EA%B1%B0%ED%95%98%EA%B8%B0</guid>
            <pubDate>Sun, 11 Dec 2022 10:16:58 GMT</pubDate>
            <description><![CDATA[<h1 id="🔒-짝지어-제거하기">🔒 짝지어 제거하기</h1>
<h2 id="✔-문제-설명">✔ 문제 설명</h2>
<p><img src="https://velog.velcdn.com/images/eun_esh/post/365245ae-1ee5-4b10-ba5d-f162d7fc69a9/image.png" alt=""></p>
<h2 id="🚩-요구사항-분석">🚩 요구사항 분석</h2>
<ul>
<li>스택을활용해 스택이 비어있지않고 peek 스택 값이 같다면 
지우는 방식을 진행했다.</li>
</ul>
<h2 id="🔑문제풀이">🔑문제풀이</h2>
<pre><code class="language-java">import java.util.Stack;

class Solution
{
    public int solution(String s)
    {
        int answer = 0;
        Stack&lt;Character&gt; stack = new Stack&lt;&gt;();
        //1. 문자제거하기
        for (int i=0; i &lt; s.length(); i++){
            char c = s.charAt(i);
            // 현재 스택이 비어있지않고 peek 스택의 최상위 값이 c와 같다면 pop  
            if(!stack.isEmpty() &amp;&amp; stack.peek() == c){
                stack.pop();
            }else{
                stack.push(c);
            }

        }
        answer = stack.size() == 0 ? 1 : 0;

        return answer;
    }
}</code></pre>
<h2 id="💡-추가한-테스트-케이스">💡 추가한 테스트 케이스</h2>
<table>
<thead>
<tr>
<th align="center"></th>
<th align="center">Parameters</th>
<th align="center">Return</th>
</tr>
</thead>
<tbody><tr>
<td align="center">test1</td>
<td align="center">&quot;baacaa&quot;</td>
<td align="center">0</td>
</tr>
<tr>
<td align="center">test2</td>
<td align="center">&quot;bbaaaa&quot;</td>
<td align="center">1</td>
</tr>
<tr>
<td align="center">test3</td>
<td align="center">&quot;bbaaaqwerasqqqr&quot;</td>
<td align="center">0</td>
</tr>
</tbody></table>
]]></description>
        </item>
        <item>
            <title><![CDATA[[프로그래머스 / Java] Lv2 - 이진 변환 반복하기]]></title>
            <link>https://velog.io/@eun_esh/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-Java-Lv2-%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/@eun_esh/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-Java-Lv2-%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>Sun, 11 Dec 2022 10:00:12 GMT</pubDate>
            <description><![CDATA[<h1 id="🔒-이진-변환-반복하기">🔒 이진 변환 반복하기</h1>
<h2 id="✔-문제-설명">✔ 문제 설명</h2>
<p><img src="https://velog.velcdn.com/images/eun_esh/post/0d8e5ea3-a35b-49ac-abd2-56e4219b3794/image.png" alt=""> <img src="https://velog.velcdn.com/images/eun_esh/post/e6f74ddc-d448-44e3-8aa9-b9f2ff3da97d/image.png" alt=""></p>
<h2 id="🚩-요구사항-분석">🚩 요구사항 분석</h2>
<ul>
<li>제거할 0의 개수 count에 저장 </li>
<li>1을 만들기 위해 반복되는 횟수 저장  </li>
<li>0을 제거한 후 남은 1의 개수를 이진 변환, 
스트링으로 변환하기위해 Integer.toBinaryString() 활용</li>
</ul>
<h2 id="🔑문제풀이">🔑문제풀이</h2>
<pre><code class="language-java">class Solution {
    public int[] solution(String s) {
        int[] answer = new int[2];
        int zero = 0;
        int count = 0;
        int l = 0;
        while(!s.equals(&quot;1&quot;)){
            zero++;
            l=0;
            for(int i=0; i&lt;s.length();i++){
                if(s.charAt(i) == &#39;0&#39;){
                  count++;  
                } else{
                  l++;
                }
            }         

            s= Integer.toBinaryString(l);

        }
        answer[0] = zero;
        answer[1] = count;
        return answer;
    }
}
</code></pre>
<h2 id="💡-추가한-테스트-케이스">💡 추가한 테스트 케이스</h2>
<table>
<thead>
<tr>
<th></th>
<th align="center">Parameters</th>
<th align="center">Return</th>
</tr>
</thead>
</table>
<blockquote>
<p>추가한 테스트케이스는 없다.</p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[[프로그래머스 / Java] Lv2 - 올바른 괄호]]></title>
            <link>https://velog.io/@eun_esh/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-Java-Lv2-%EC%98%AC%EB%B0%94%EB%A5%B8-%EA%B4%84%ED%98%B8-qnmrbks3</link>
            <guid>https://velog.io/@eun_esh/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-Java-Lv2-%EC%98%AC%EB%B0%94%EB%A5%B8-%EA%B4%84%ED%98%B8-qnmrbks3</guid>
            <pubDate>Sun, 11 Dec 2022 09:58:27 GMT</pubDate>
            <description><![CDATA[<h1 id="🔒-올바른-괄호">🔒 올바른 괄호</h1>
<h2 id="✔-문제-설명">✔ 문제 설명</h2>
<p><img src="https://velog.velcdn.com/images/eun_esh/post/a362f570-1fb4-4aa2-8ee1-f12dca0482cf/image.png" alt=""></p>
<h2 id="🚩-요구사항-분석">🚩 요구사항 분석</h2>
<ul>
<li>스택이 비어있지않고 들어오는 괄호가 &#39;)&#39;이고 현재 스택에있는 값이 반대인 &#39;(&#39; 라면 스택을 비워준다. -&gt; 올바른 괄호</li>
<li>아니라면 스택에 추가.</li>
<li>스택이 0 이라면 true 아니라면 false</li>
</ul>
<h2 id="🔑문제풀이">🔑문제풀이</h2>
<pre><code class="language-java">import java.util.Stack;

class Solution {
    boolean solution(String s) {
        boolean answer = true;

        Stack&lt;Character&gt; stack = new Stack&lt;&gt;();
        for(int i =0;i&lt;s.length();i++){
            char ch = s.charAt(i);
            if(!stack.isEmpty() &amp;&amp; ch==&#39;)&#39; &amp;&amp; stack.peek() != ch){
                stack.pop();
            }else{
                stack.push(ch);
            }  

        }
        answer = stack.size() == 0 ? true : false;
        return answer;
    }
}
</code></pre>
<h2 id="💡-추가한-테스트-케이스">💡 추가한 테스트 케이스</h2>
<table>
<thead>
<tr>
<th></th>
<th align="center">s</th>
<th align="center">answer</th>
</tr>
</thead>
</table>
<blockquote>
<p>추가한 테스트케이스는 없다.</p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[[우테코] 프리코스 4주차 - 다리 건너기 회고록]]></title>
            <link>https://velog.io/@eun_esh/%EC%9A%B0%ED%85%8C%EC%BD%94-%ED%94%84%EB%A6%AC%EC%BD%94%EC%8A%A4-4%EC%A3%BC%EC%B0%A8-%EB%8B%A4%EB%A6%AC-%EA%B1%B4%EB%84%88%EA%B8%B0-%ED%9A%8C%EA%B3%A0%EB%A1%9D</link>
            <guid>https://velog.io/@eun_esh/%EC%9A%B0%ED%85%8C%EC%BD%94-%ED%94%84%EB%A6%AC%EC%BD%94%EC%8A%A4-4%EC%A3%BC%EC%B0%A8-%EB%8B%A4%EB%A6%AC-%EA%B1%B4%EB%84%88%EA%B8%B0-%ED%9A%8C%EA%B3%A0%EB%A1%9D</guid>
            <pubDate>Sat, 10 Dec 2022 13:25:36 GMT</pubDate>
            <description><![CDATA[<h3 id="🔎-3주차-피드백-정리">🔎 3주차 피드백 정리</h3>
<h4 id="비즈니스-로직과-ui-로직을-분리한다">비즈니스 로직과 UI 로직을 분리한다.</h4>
<p>해당 피드백은 내가 고민한 부분을 답변해주는것 같았다. 주어진 Lotto 라는 클래스를 그에 맞는 역할을 담당하도록 로직을 분리했다. 분리하는 기준을 정하는 것에 시간을 많이 투자하였지만 기준이 명확하지 않아 힘들었다. 
-&gt; 현재 객체의 상태를 보기 위한 로그 메시지 성격이 강하다면 toString()을 통해 구현한다. View에서 사용할 데이터라면 getter 메서드를 통해 데이터를 전달해야한다.</p>
<h4 id="객체의-상태-접근을-제한한다">객체의 상태 접근을 제한한다.</h4>
<h4 id="객체는-객체스럽게-사용한다">객체는 객체스럽게 사용한다.</h4>
<p>해당 피드백은 내가 저번 3주차 미션에서 겪은 과정을 답변해주고 있었다.</p>
<ul>
<li>참고자료 <a href="https://tecoble.techcourse.co.kr/post/2020-04-28-ask-instead-of-getter/">(getter를 사용하는 대신 객체에 메시지를 보내자)</a><h4 id="필드인스턴스-변수의-수를-줄이기-위해-노력한다">필드(인스턴스 변수)의 수를 줄이기 위해 노력한다.</h4>
필드(인스턴스 변수)의 수가 많은 것은 객체의 복잡도를 높이고, 버그 발생 가능성을 높일 수 있다. 필드에 중복이 있거나, 불필요한 필드가 없는지 확인해 필드의 수를 최소화해야한다.</li>
</ul>
<h4 id="단위-테스트하기-어려운-코드를-단위-테스트하기">단위 테스트하기 어려운 코드를 단위 테스트하기</h4>
<p>올바른 로또 번호가 생성되는 것을 테스트를 하는것이 어려워 6개의 번호가 생성되는(size=6) 을 확인하는 테스트 밖에 진행하지 못했다.
하지만 테스트하기 어려운 것은 클래스 내부가 아닌 외부로 분리하는 시도를 거친다면 테스트를 할 수 있었다 ! </p>
<ul>
<li>참고자료 <a href="https://tecoble.techcourse.co.kr/post/2020-05-07-appropriate_method_for_test_by_parameter/">(메서드 시그니처를 수정하여 테스트하기 좋은 메서드로 만들기)</a></li>
</ul>
<p>더 많은 피드백이 있었고, 이번 3주차 피드백은 정말 감탄하면서 본 것 같다.</p>
<h3 id="📌-미션에-들어가기-전-목표">📌 미션에 들어가기 전 목표</h3>
<ul>
<li>클래스(객체)를 분리하는 연습</li>
<li>리팩터링</li>
<li>주어진 요구사항을 꼼꼼히 읽기<h2 id="🎪-다리-건너기-미션">🎪 다리 건너기 미션</h2>
<img src="https://velog.velcdn.com/images/eun_esh/post/8a51cec4-bfdf-40ad-8b5c-8c802cd5636a/image.png" alt=""> [오징어게임 - 다리건너기 미션의 한 장면]
이번 미션은 세계에서도 엄청나게 유명해진 오징어게임의 다리건너기 미션중의 하나인 프로그램을 구현하게되어 너무 기대가 되었다. 주어진 요구사항과 출력문을 확인해보자 !</li>
</ul>
<p><img src="https://velog.velcdn.com/images/eun_esh/post/d5e8cefa-10e9-43e8-a0f2-a9d0a45dda20/image.png" alt=""><img src="https://velog.velcdn.com/images/eun_esh/post/2894b311-aef4-4996-9dea-50e4f8ec2cfa/image.png" alt=""></p>
<h4 id="🐣-구현-코드-보러가기">🐣 <a href="https://github.com/EUNSH1/java-bridge">구현 코드 보러가기</a></h4>
<h3 id="👀-추가된-요구-사항-정리">👀 추가된 요구 사항 정리</h3>
<ul>
<li>함수(또는 메서드)의 길이가 10라인을 넘어가지 않도록 구현한다.</li>
<li>메서드의 파라미터 개수는 최대 3개까지만 허용한다</li>
<li>아래 있는 InputView, OutputView, BridgeGame, BridgeMaker, BridgeRandomNumberGenerator 클래스의 요구사항을 참고하여 구현한다.</li>
<li>각 클래스의 제약 사항은 아래 클래스별 세부 설명을 참고한다.
이외 필요한 클래스(또는 객체)와 메서드는 자유롭게 구현할 수 있다.<ul>
<li>InputView 클래스에서만 camp.nextstep.edu.missionutils.Console 의 readLine() 메서드를 이용해 사용자의 입력을 받을 수 있다.</li>
<li>BridgeGame 클래스에서 InputView, OutputView 를 사용하지 않는다.</li>
</ul>
</li>
</ul>
<p>정말 어려운 요구 사항들로만 구성되어있었고 코드를 하나씩 내가세운 기준에 맞게 구현해보았다.
그리고 추가된 요구사항을 확인하며 리팩터링해가는 방식으로 구현했다.</p>
<h3 id="✔--기능-구현-목록-작성">✔  기능 구현 목록 작성</h3>
<pre><code class="language-java">## 기능 목록

- [X] 다리의 길이를 입력받는다.
    - [X] 다리의 길이는 3부터 20 사이의 숫자여야한다.
    - [X] 다리의 입력 값은 숫자여야한다.
    - [X] 입력 값이 3과 20 사이의 숫자가 아닌경우 
    `IllegalStateException`를 발생시키고 &quot;[ERROR]&quot;로 시작하는 메시지 출력한다.

- [X] 입력한 길이만큼 0과 1 중 무작위 값으로 두 개의 다리를 생성한다.
    - [X] 다리의 시작은 `[`, 다리의 끝은 `]` 로 표시한다.
    - [X] 다리 칸의 구분은 `|`(앞뒤 공백 포함) 문자열로 구분한다.
    - [X] 무작위 값이 0인경우 아래칸이며 D값으로 정한다.
    - [X] 무작위 값이 1인경우 위칸이며 U값으로 정한다.

- [X] 플레이어는 입력한 길이만큼 라운드를 진행할 수 있다.
    - [X] 플레이어는 이동할 칸을 U(위 칸), D(아래 칸)으로 입력받는다.
        - [X] 생성된 다리가 이동할 수 있는 칸인 경우 O를 표시한다.
        - [X] 생성된 다리가 이동할 수 없는 칸인 경우 X를 표시한다.
            - [X] 게임을 다시 시도할지 여부를 입력할 수 있다.
                - [X] 재시도 (R) 입력 시, 이동할 칸을 처음부터 다시 입력받는다.
                - [X] 종료 : (Q) 입력 시, 최종 게임 결과로 이동하며 게임에 실패한다.
        - [X] 선택되지 않은 칸은 공백 한칸을 표시한다.
    - [X] 생성된 다리가 더 이상 없는 경우 최종 게임 결과로 이동하며 게임에 성공한다.
- [X] 최종 게임 결과를 출력한다.
    - [X] 플레이어가 이동한 칸 만큼 표시된 두 개의 다리를 보여준다.
- [X] 게임 성공 여부를 확인한다.
- [X] 총 시도한 횟수를 확인한다.
</code></pre>
<h3 id="💻-기능-구현">💻 기능 구현</h3>
<p>MVC 모델 적용 </p>
<pre><code class="language-java">bridge
    controller
        BridgeController (domain과 View, service를 결정하여 전달)
    domain
        BridgeEnum (플레이어가 선택한 방향, 생성된 다리는 1or0, 건널수있는지) 
        BridgeGame (다리 건너기 게임을 관리하는 클래스)
    exception
        BridgeGameException (사용자 잘못된 입력의 예외처리를 관리하는 클래스)
    service
        BridgeService (다리의 길이만큼 다리를 생성해준다.)
                        서비스로 분리를 함으로써 테스트코드를 작성하기 수월해졌다.
    view
        InputView  (사용자 입력 클래스)
        OutputView (출력 클래스)
    Application(컨트롤러를 실행하는 클래스)
    BridgeMaker(다리를 생성해주는 역할)
    BridgeNumberGenerator(인터페이스, 상속을 위함)
    BridgeRandomNumberGenerator(0과1을 랜덤으로 뽑아준다.)

</code></pre>
<h2 id="🎯-고민한-과정---느낀점">🎯 고민한 과정 -&gt; 느낀점</h2>
<ul>
<li>주어진 클래스의 요구사항대로 객체가 그 일만 수행하도록 만들도록 분리하여 구현하는 부분 </li>
</ul>
<p>추가된 요구사항에 InputView, OutputView, BridgeGame, BridgeMaker, BridgeRandomNumberGenerator 이 있었는데 클래스별 세부 사항을 파악하고 의도에 맞게 구현하는데 시간을 많이 투자하였고, 배우는 것이 정말 많았다. 
코드를 먼저 전체적으로 기능이 구현되게 작성한 후 확인해보니 BridgeGame 클래스가 도메인이 아닌 서비스에 있어야할 것 같은 생각이 들었다. 그러고 나면 domain에 생성된 다리를 관리하는 Bridge 클래스와 사용자가가 시도한 횟수를 담을수 있는 User 클래스를 둠으로써 domain, view, service를  결정하는 것이 수월할 것 같았다. </p>
<h4 id="하지만-리팩터링을-하려고-보니-bridgegame을-bridge-와-user클래스로-분리하는-역할을-나누는것이-객체에-메시지를-보내는-것이-아니라-getter를-사용하는-기능만-된다는-것에서-객체스럽게-사용하지-않다는-생각을-하고-bridgegame을-도메인으로-코드로-작성했습니다">하지만 리팩터링을 하려고 보니 BridgeGame을 Bridge 와 User클래스로 분리하는 역할을 나누는것이 객체에 메시지를 보내는 것이 아니라 getter를 사용하는 기능만 된다는 것에서 객체스럽게 사용하지 않다는 생각을 하고 BridgeGame을 도메인으로 코드로 작성했습니다.</h4>
<ul>
<li><p>다음 내가 작성한 enum은 연관성이 있는 상수를 묶어서 활용하려고 했지만, 파라미터가 4개로 사용할수 없었다.</p>
<pre><code class="language-java">  UP_TRUE(&quot;U&quot;, 1, true, &quot;O&quot;),
  UP_FALSE(&quot;U&quot;, 1, false, &quot;X&quot;),
  DOWN_TRUE(&quot;D&quot;, 0, true, &quot;O&quot;),
  DOWN_FALSE(&quot;D&quot;, 0, false, &quot;X&quot;);
  처음 구현한 Enum 클래스

  -&gt; 파라미터 최대 3개까지만 허용 요구사항에 위반</code></pre>
</li>
</ul>
<p>Enum의 상수와 get 메서드만 추가하여 같은 의미를 주는 것은 좋지만
추가하는 과정에서 메서드의 길이가 길어지고 타입이 반복되어 쓰이고있다는 사실을 파악하고 3개로 줄이는 리팩터링을 진행하였습니다.</p>
<h2 id="🚩-다음-목표">🚩 다음 목표</h2>
<ul>
<li>Java Enum 재공부</li>
<li>MVC 모델 재공부</li>
<li>getter를 사용하는 대신 객체에 메시지를 보내자</li>
<li>리팩터링을 진행해보자 !</li>
</ul>
<h3 id="프리코스-과정을-마치며">프리코스 과정을 마치며</h3>
<p>이번 우테코는 정말 나에게 정말 많은 도움을 주었다. 프로젝트를 진행하고 있었기에 두 개를 모두 할 수 있을까 힘들었지만 프리코스를 하면 정말 시간 가는줄 모르고 재밌게 했던 것 같다. 피드백과 코드 리뷰 등 얼마나 중요한지도 알게 되었고 짧은 시간이지만 깊이 배운 것 같다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[우테코] 프리코스 3주차  - 로또  회고록]]></title>
            <link>https://velog.io/@eun_esh/%EC%9A%B0%ED%85%8C%EC%BD%94-3%EC%A3%BC%EC%B0%A8-%ED%94%84%EB%A6%AC%EC%BD%94%EC%8A%A4-%EB%A1%9C%EB%98%90-%ED%9A%8C%EA%B3%A0%EB%A1%9D</link>
            <guid>https://velog.io/@eun_esh/%EC%9A%B0%ED%85%8C%EC%BD%94-3%EC%A3%BC%EC%B0%A8-%ED%94%84%EB%A6%AC%EC%BD%94%EC%8A%A4-%EB%A1%9C%EB%98%90-%ED%9A%8C%EA%B3%A0%EB%A1%9D</guid>
            <pubDate>Fri, 09 Dec 2022 07:54:19 GMT</pubDate>
            <description><![CDATA[<h3 id="🔎-2주차-피드백-정리">🔎 2주차 피드백 정리</h3>
<h4 id="readmemd-기능구현목록을-상세히-작성한다">README.md 기능구현목록을 상세히 작성한다</h4>
<h4 id="값을-하드-코딩하지-않는다">값을 하드 코딩하지 않는다</h4>
<h4 id="처음부터-큰-단위의-테스트를-만들지-않는다">처음부터 큰 단위의 테스트를 만들지 않는다</h4>
<p>테스트의 중요한 목적 중 하나는 내가 작성하는 코드에 대해 빠르게 피드백을 받는 것이다. 시작부터 큰 단위의 테스트를 만들게 된다면 작성한 코드에 대한 피드백을 받기까지 많은 시간이 걸린다. 그래서 문제를 작게 나누고, 그 중 핵심 기능에 가까운 부분부터 작게 테스트를 만들어 나가는것이 중요할 것이다..</p>
<h4 id="함수가-한-가지-기능을-하는지-확인하는-기준을-세운다">함수가 한 가지 기능을 하는지 확인하는 기준을 세운다</h4>
<p>함수를 분리하는 기준이 세워지면 함수를 분리하는 것 뿐만아니라, 그 기준에 대해 해당되는 클래스만 모을수 있게 되며 mvc 모델도 선별하기 쉬울것 같다. </p>
<ul>
<li>학습한 참고 자료
캡틴 제이슨 숫자 야구 기초</li>
</ul>
<h3 id="📌-미션에-들어가기-전-목표">📌 미션에 들어가기 전 목표</h3>
<ul>
<li>클래스(객체)를 분리하는 연습</li>
<li>도메인 로직에 대한 단위 테스트를 작성</li>
<li>학습한 참고 자료
<a href="https://www.youtube.com/watch?v=bIeqAlmNRrA">TDD 리팩토링 </a> by 자바지기 박재성님<h2 id="💰-로또-미션">💰 로또 미션</h2>
```java</li>
<li>로또 번호의 숫자 범위는 1~45까지이다.</li>
<li>1개의 로또를 발행할 때 중복되지 않는 6개의 숫자를 뽑는다.</li>
<li>당첨 번호 추첨 시 중복되지 않는 숫자 6개와 보너스 번호 1개를 뽑는다.</li>
<li>당첨은 1등부터 5등까지 있다. 당첨 기준과 금액은 아래와 같다.<ul>
<li>1등: 6개 번호 일치 / 2,000,000,000원</li>
<li>2등: 5개 번호 + 보너스 번호 일치 / 30,000,000원</li>
<li>3등: 5개 번호 일치 / 1,500,000원</li>
<li>4등: 4개 번호 일치 / 50,000원</li>
<li>5등: 3개 번호 일치 / 5,000원<pre><code>![](https://velog.velcdn.com/images/eun_esh/post/ae5b829e-1129-4d6f-bfdd-49ae02b10e7d/image.png)

</code></pre></li>
</ul>
</li>
</ul>
<h4 id="🐣-구현-코드-보러가기">🐣 <a href="https://github.com/EUNSH1/java-lotto/tree/EUNSH1">구현 코드 보러가기</a></h4>
<h3 id="👀-추가된-요구-사항-정리">👀 추가된 요구 사항 정리</h3>
<ul>
<li>함수(또는 메서드)의 길이가 15라인을 넘어가지 않도록 구현한다.<ul>
<li>함수(또는 메서드)가 한 가지 일만 잘 하도록 구현한다.</li>
<li>else 예약어를 쓰지 않는다 </li>
<li><blockquote>
<p>return 하는 방식으로 구현하면 else를 사용하지 않아도 된다.</p>
</blockquote>
</li>
</ul>
</li>
<li>Java Enum을 적용한다.</li>
<li><code>pickUniqueNumbersInRange()</code></li>
</ul>
<h3 id="✔--기능-구현-목록-작성">✔  기능 구현 목록 작성</h3>
<pre><code class="language-java">- [x] 로또 구입 금액을 입력받는다. (한장당 1000원)
    - [x] 한장당 1부터 45까지 서로 다른 6개의 임의의 수를 생성한다.
    - [x] 1000원으로 나누어 떨어지지 않는경우 `IllegalArgumentException`를 발생시킨다.
    - [x] 로또 번호는 오름차순으로 정렬한다.

- [x] 당첨 번호를 입력받는다.
    - [x] 서로 다른 6개의 임의의 수를 입력한다.
        - [x] 입력한 서로 다른 6개의 임의의 수는 오름차순으로 정렬한다.
    - [x] 보너스 번호를 입력한다.
- [x] 일치하는 로또 번호와 당첨 금액을 정의하는 enum 클래스 생성
- [x] 사용자가 구매한 로또 번호와 당첨번호를 비교해 당첨 내역을 확인할 수 있다.
    - [x] 일치하는 번호의 개수를 확인할 수 있다.
    - [x] 일치하는 번호의 수만큼 수익이 측정된다.
        - [x] 3개 번호가 일치하면 5_000원이며, 5등이다.
        - [x] 4개 번호가 일치하면 50_000원이며, 4등이다.
        - [x] 5개 번호가 일치하면 1_500_500원이며, 3등이다.
            - [x] 5개 번호가 일치하고 보너스 번호가 일치하면 30_000_000원 2등이다.
        - [x] 6개 번호가 일치하면 2_000_000_000원이다.

- [x] 사용자가 구입한 로또 금액과 당첨 금액으로 수익률을 확인할 수 있다.
    - [x] 수익률은 소수점 둘재 자리에서 반올림한다.
</code></pre>
<h3 id="💻-기능-구현">💻 기능 구현</h3>
<p>MVC 모델 적용 </p>
<pre><code class="language-java">lotto
    controller
        LottoController (domain과 View를 결정하여 전달)
    domain
        Lotto (당첨 로또 번호를 관리하는 역할) 
        LottoNumbers (1부터 45까지 서로 다른 6개의 임의의 수를 생성) 
        PlayerLottoAmount(사용자의 구입금액만큼 로또 구입)
        Ranking (로또 번호와 당첨 금액을 정의하는 enum 클래스)
        WinningResult (사용자와 당첨로또 번호를 비교하는 클래스) 
    view
        ExceptionMessage(에러 메시지를 관리하는 클래스)
        InputView  (사용자 입력 클래스)
        OutputView (출력 클래스)
    Application(컨트롤러를 실행하는 클래스)

</code></pre>
<p>추가한 테스트코드</p>
<pre><code class="language-java">domain
    LottoNumbersTest
    -&quot;로또_랜덤숫자_생성&quot;
    PlayerLottoAmountTest
    -&quot;올바르지_않은_금액&quot;
    -&quot;구매한_로또_티켓_장수&quot;
    WinningResultTest
    -&quot;사용자가 구매한 로또 번호와 당첨번호를 비교해 등수 확인&quot;
view 
    InputViewTest
    -&quot;올바르지 않은 입력값&quot; </code></pre>
<h2 id="🎯-고민한-과정---느낀점">🎯 고민한 과정 -&gt; 느낀점</h2>
<ul>
<li><p>제공된 Lotto 클래스는 리스트의 사이즈가 6이 아니라면 <code>IllegalArgumentException</code>을 발생시키는 함수가 주어져있었다.
이를 내가 세운 기준(로또 넘버 리스트 예외사항을 확인하는)으로 함수들로 추가기능을 구현하고 다른 클래스들과 Lotto 클래스 역할을 분리하는 작업에 시간이 많이 투자되었다.</p>
</li>
<li><p>enum 은 연관성이 있는 상수를 묶어서 활용하는데
이는 DB에서 컬럼을 가져오는것과 같이 사용할 수 있는 것 같다고 생각했다.
그래서 다음과같이 1등이 가지는 맞힌 개수(6),상금,출력 모아서 활용했다.</p>
</li>
</ul>
<pre><code class="language-java">    FIRST(6, 2_000_000_000, &quot;6개 일치 (2,000,000,000원) - &quot;), // 1등
    SECOND(5, 30_000_000, &quot;5개 일치, 보너스 볼 일치 (30,000,000원) - &quot;), // 2등
    THIRD(5, 1_500_000, &quot;5개 일치 (1,500,000원) - &quot;), // 3등
    FOURTH(4, 50_000, &quot;4개 일치 (50,000원) - &quot;), // 4등
    FIFTH(3, 5_000, &quot;3개 일치 (5,000원) - &quot;), // 5등
    MISS(0, 0, &quot;&quot;);</code></pre>
<ul>
<li><p>객체의 상태 접근을 제한하는 과정이 기능과 테스트를 순차적으로 구현하는데 있어 초기값은 private 으로 구현하였지만 public과 같이 다른 접근제어자를 활용해야할 것 같은 생각이 들었다. 인스턴스 변수의 접근제어자를 세우는 내 기준을 정하는게 좋을 것 같다.</p>
</li>
<li><p>TDD를 진행하는 과정에서 구현을 진행하고나니 테스트하기 어려운 코드들이 발생해서 시간을 많이 투자하였지만 테스트 코드를 완벽하게 작성하지 못한것에 아쉬움이 남는다.</p>
</li>
<li><p>수익률은 소수점 둘째 자리에서 반올림한다. (ex. 100.0%, 51.5%, 1,000,000.0%)</p>
<pre><code class="language-java">총 수익률은 62.5%입니다.
총 수익률은 100,0%입니다.
총 수익률은 1,000,000,0%입니다.</code></pre>
<p>위 예시와 같이 TEST 항목이 62.5%의 수익률을 나온다는 것을 확인하고 넘어갔지만 다시 확인해보니 수익률이 네자리이상은 가독성을 위해 ,를 찍어주었어야했는데 놓치고 말았다.
NumberFormat 함수를 사용하여 리팩토링을 진행해야할 것 같다.</p>
</li>
</ul>
<p>사용자가 잘못된 값을 입력할 경우 <code>IllegalArgumentException</code>를 발생시키고 &quot;[ERROR]&quot;로 시작하는 에러 메시지를 출력 후 종료하는 요구사항이 주어져 view의 아웃풋에서 관리하던 에러 출력 메시지들을 ExceptionMessage(클래스)로 관리하도록 리팩토링하였다. </p>
<h2 id="🚩-다음-목표">🚩 다음 목표</h2>
<ul>
<li><p>Java Enum 공부
-&gt; 참고 자료 <a href="https://techblog.woowahan.com/2527/">Java Enum 활용기</a></p>
</li>
<li><p>getter를 사용하는 대신 객체에 메시지를 보내자</p>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[우테코] 프리코스 2주차 - 숫자 야구 게임 회고록]]></title>
            <link>https://velog.io/@eun_esh/%EC%9A%B0%EC%95%84%ED%95%9C%ED%85%8C%ED%81%AC%EC%BD%94%EC%8A%A4-2%EC%A3%BC%EC%B0%A8-%EA%B3%BC%EC%A0%95-%ED%9A%8C%EA%B3%A0%EB%A1%9D-%EB%8B%A4%EC%8B%9C-%EA%B5%AC%ED%98%84%ED%95%B4%EB%B3%B4%EA%B3%A0-%EB%B9%84%EA%B5%90%ED%95%98%EC%9E%90</link>
            <guid>https://velog.io/@eun_esh/%EC%9A%B0%EC%95%84%ED%95%9C%ED%85%8C%ED%81%AC%EC%BD%94%EC%8A%A4-2%EC%A3%BC%EC%B0%A8-%EA%B3%BC%EC%A0%95-%ED%9A%8C%EA%B3%A0%EB%A1%9D-%EB%8B%A4%EC%8B%9C-%EA%B5%AC%ED%98%84%ED%95%B4%EB%B3%B4%EA%B3%A0-%EB%B9%84%EA%B5%90%ED%95%98%EC%9E%90</guid>
            <pubDate>Thu, 08 Dec 2022 11:44:54 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/eun_esh/post/1f70021f-8a63-40af-9d14-4ed1a6c01b67/image.jpg" alt=""></p>
<h3 id="🔎-1주차-피드백-정리">🔎 1주차 피드백 정리</h3>
<p>이름을 통해 의도를 드러낸다, 축약하지 않는다.</p>
<ul>
<li>변수, 이름, 함수(메서드), 클래스 이름을 짓는데 연속된 숫자나 불용어를 추가하는 방식을 사용했었다. 나와 다른 개발자 클래스의역할에 대한 의도를 드러내기위한 중요한 활동이므로 적절하지 못했다!</li>
</ul>
<p>공백도 코딩 컨벤션이다, 공백라인을 의미있게 사용한다.</p>
<ul>
<li>공백 라인을 의미 있게 사용하는 것이 좋아 보이며, 문맥을 분리하는 부분에 사용하는 것이 좋다. 과도한 공백은 다른 개발자에게 의문을 줄 수 있다.
if, for, while문 사이의 공백도 코딩 컨벤션!</li>
</ul>
<h3 id="📌-미션에-들어가기-전-목표">📌 미션에 들어가기 전 목표</h3>
<ul>
<li>기능 목록을 상세히 나누기</li>
<li>함수를 더 분리하는 과정</li>
<li>함수별로 테스트를 작성하는 것</li>
</ul>
<h2 id="⚾-숫자-야구-게임-미션">⚾ 숫자 야구 게임 미션</h2>
<pre><code class="language-java">같은 수가 같은 자리에 있으면 스트라이크, 
다른 자리에 있으면 볼, 같은 수가 전혀 없으면 낫싱이란 힌트를 얻고, 
그 힌트를 이용해서 먼저 상대방(컴퓨터)의 수를 맞추면 승리한다.
예) 상대방(컴퓨터)의 수가 425일 때
123을 제시한 경우 : 1스트라이크
456을 제시한 경우 : 1볼 1스트라이크
789를 제시한 경우 : 낫싱
위 숫자 야구 게임에서 상대방의 역할을 컴퓨터가 한다. 
컴퓨터는 1에서 9까지 서로 다른 임의의 수 3개를 선택한다. 
게임 플레이어는 컴퓨터가 생각하고 있는 서로 다른 3개의 숫자를 입력하고,
컴퓨터는 입력한 숫자에 대한 결과를 출력</code></pre>
<p><img src="https://velog.velcdn.com/images/eun_esh/post/151bf2e3-a762-4dcd-b19d-f4bf3ee7a04b/image.png" alt=""></p>
<h4 id="🐣-구현-코드-보러가기">🐣 <a href="https://github.com/EUNSH1/java-baseball/tree/EUNSH1">구현 코드 보러가기</a></h4>
<h3 id="👀-주어진-요구-사항-정리">👀 주어진 요구 사항 정리</h3>
<ul>
<li>indent(인덴트, 들여쓰기) depth를 3이 넘지 않도록 구현</li>
<li>함수(또는 메서드)가 한 가지 일만 하도록 최대한 작게</li>
<li>3항 연산자를 쓰지 않는다.</li>
<li>JUnit 5와 AssertJ를 이용하여 본인이 정리한 기능 목록이 정상 동작함을 테스트 코드로 확인</li>
<li><code>IllegalArgumentException</code></li>
<li><code>pickNumberInRange()</code></li>
<li><code>readLine()</code></li>
</ul>
<h3 id="✔--기능-구현-목록-작성">✔  기능 구현 목록 작성</h3>
<pre><code class="language-java">-숫자 랜덤 생성
1부터 9까지의 숫자
3자리 자연수
각 자리 숫자는 중복 x

-사용자 입력
[예외사항] 3자리의 자연수가 아닌경우
[예외사항] 1부터 9까지의 숫자가 아닌경우
[예외사항] 각 자릿수의 숫자중 중복된 값이 있는 경우
[예외사항] 0이하의 음수의 경우
예외사항의 경우 IllegalArgumentException을 발생시키고 종료

-사용자 입력과 랜덤 생성 숫자 비교
같은자릿수에 같은 수 : 스트라이크
다른자릿수에 같은 수 : 볼
다른자릿수에 다른 수 : 낫싱

-비교 결과 출력
볼, 스트라이크 카운트 후 출력
출력순서 : (x)볼 (y)스트라이크
y가 3이 아닌경우 2.사용자입력 으로 전환
(y=3) 3스트라이크 시 게임 종료 문구 출력

-종료 조건 입력
1 입력 재시작 : 1.숫자 랜덤 생성으로 전환
2 입력 종료 : 게임 종료
[예외사항] 1과 2의 숫자가 아닌 잘못된 값을 입력할 경우
</code></pre>
<h3 id="💻-기능-구현">💻 기능 구현</h3>
<p>MVC 모델 적용 </p>
<pre><code class="language-java">baseball
    controller
        BaseballGame (Model과 View를 결정하여 전달)
    model
        ComputerNumber (게임을 위한 숫자 랜덤 생성) 
        PlayerNumber (사용자 숫자 생성) 
        RetryNumber (재시작 생성)
    util
        NumberComapare (비교 후 볼, 스트라이크 카운트 저장)
        Validator (사용자 입력과 랜덤 생성 숫자 비교를 위한 검증자 생성)
    view
        InputView  (사용자 입력 클래스)
        OutputView (출력 클래스)</code></pre>
<h2 id="🎯-고민한-과정-회고">🎯 고민한 과정, 회고</h2>
<ul>
<li><p>MVC 모델을 적용하는 부분에서 클래스를 정확히 나누었는가?
Validator, RetryNumber의 이름과 위치에 대해서 고민했던 것 같다. </p>
</li>
<li><p>상수로 선언되는 부분을 그대로 하드코딩한 부분
다음과 같이 진행했어야 했을것 같다.</p>
<pre><code class="language-java">private static final int MIN_RANDOM_NUMBER = 1;
private static final int MAX_RANDOM_NUMBER = 9;
private static final int MAX_NUMBER_LENGTH = 3;</code></pre>
</li>
<li><p>Java 코드 컨벤션 규칙을 어기면서 하고있진 않나 코드를 작성하면서 계속 고민을 많이했지만 상수로 선언되는 부분, 지역변수 선언, 코드작성 순서 등  요구 사항을 만족하지 못했던 것 같다.</p>
</li>
</ul>
<p>고민한 과정과 코드들을 보고 다시 주어진 세가지 요구사항을 다시 확인하니 주어진 요구사항이 어떠한 이유로 주어진 것인지 의도를 파악하는데 노력을 많이해야할 것 같은 생각이 들었다.
주어진 요구사항들이 결국 미션에 들어가기 전 목표를 달성하기위한 방향을 나타내고있다고 생각한다. 
다음 회차때도 주어진 요구사항을 꼼꼼히 읽고 다른 관점에서 본다면 다른 의도가 있는지 시간을 많이 투자해야할 것 같다.</p>
<h2 id="🚩-다음-목표">🚩 다음 목표</h2>
<ul>
<li>테스트 코드를 사용해 구현 기능마다 확인하고 넘어가기</li>
<li>MVC 모델 공부</li>
<li>Java 코드 컨벤션 공부</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Java] StringBuffer, StringBuilder]]></title>
            <link>https://velog.io/@eun_esh/Java-StringBuffer-StringBuilder</link>
            <guid>https://velog.io/@eun_esh/Java-StringBuffer-StringBuilder</guid>
            <pubDate>Sun, 13 Nov 2022 08:15:48 GMT</pubDate>
            <description><![CDATA[<p>백준 알고리즘과 프로그래머스 코딩테스트를 작성하면서 String의 substring을 활용하며 문제를 해결하다가 효율성이 떨어지는 것을 느꼈다.
그래서 찾아보니 문자열을 StringBuilder나 StringBuffer를 통해 append하는 것이 많았다. 이 클래스에 대한 정보를 정리하기 위한 글을 작성하기로 하였다.</p>
<h2 id="string">String</h2>
<ul>
<li>문자열</li>
<li>implements Serializable, Comparable<String>, CharSequence</li>
<li>jdk 1.5 이후부터 +연산은 StringBuilder 사용해 성능 최적화 (단, 여러줄에 걸쳐 +할 경우 StringBuilder도 여러번 선언)</li>
</ul>
<pre><code class="language-java">public final class String implements Serializable, 
                        Comparable&lt;String&gt;, CharSequence {
  private final char[] value;
  ...
}</code></pre>
<p>위의 코드를 살펴보자
  char형의 배열을 final로 선언한 것이 보인다.
  -&gt; String + String의 결과는 새로운 String
  <img src="https://velog.velcdn.com/images/eun_esh/post/473d1137-1fc1-4a4c-acc2-f9d78241d9f9/image.png" alt=""></p>
<h2 id="-이렇게-string-주소값이-stack에-쌓이고-클래스는-garbage-collector-호출되기-전까지-heap에-지속적으로-쌓이는-구조이다">=&gt; 이렇게 String 주소값이 stack에 쌓이고 클래스는 Garbage Collector 호출되기 전까지 heap에 지속적으로 쌓이는 구조이다.</h2>
<h2 id="stringbuffer">StringBuffer</h2>
<ul>
<li>thread-safe하고, 변경 가능한 문자열<ul>
<li>implements Serializable, CharSequence</li>
<li>web이나 소켓 환경 같은 비동기 동작이 많은 경우에 자주 사용한다.</li>
</ul>
</li>
</ul>
<h2 id="stringbuilder">StringBuilder</h2>
<ul>
<li>변경 가능한 문자열</li>
<li>implements Serialiazable, CharSequence</li>
</ul>
<h3 id="append">append()</h3>
<p>StringBuffer와 StringBuilder에서 + 연산 대신 사용하는 함수</p>
<ul>
<li><p>value에 사용되지 않고 남아있는 공간에 새로운 문자열이 들어갈 정도의 크기가 있다면 그대로 삽입한다!! </p>
</li>
<li><p>그렇지 않다면 value 배열의 크기를 두배로 증가시키면서 기존의 문자열을 복사하고 새로운 문자열을 삽입한다.</p>
<p><img src="https://velog.velcdn.com/images/eun_esh/post/1f1fcc6b-503c-46d2-ae1a-c470ca6ec3cb/image.png" alt=""></p>
</li>
</ul>
<hr>
<p>  참조 : 
<a href="https://docs.oracle.com/javase/7/docs/api/java/lang/package-summary.html">https://docs.oracle.com/javase/7/docs/api/java/lang/package-summary.html</a></p>
<p><a href="https://novemberde.github.io/2017/04/15/String_0.html">https://novemberde.github.io/2017/04/15/String_0.html</a></p>
<p><a href="https://cjh5414.github.io/why-StringBuffer-and-StringBuilder-are-better-than-String/">https://cjh5414.github.io/why-StringBuffer-and-StringBuilder-are-better-than-String/</a></p>
<p>  <a href="https://yeonyeon.tistory.com/45">https://yeonyeon.tistory.com/45</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[프로그래머스 / Java] Lv2 - 점프와 순간 이동]]></title>
            <link>https://velog.io/@eun_esh/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-Java-Lv2-%EC%A0%90%ED%94%84%EC%99%80-%EC%88%9C%EA%B0%84-%EC%9D%B4%EB%8F%99</link>
            <guid>https://velog.io/@eun_esh/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-Java-Lv2-%EC%A0%90%ED%94%84%EC%99%80-%EC%88%9C%EA%B0%84-%EC%9D%B4%EB%8F%99</guid>
            <pubDate>Wed, 26 Oct 2022 03:47:52 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/eun_esh/post/e131cae8-8fc1-4afe-922a-e4f3201c72c5/image.png" alt=""></p>
<h1 id="🔒-점프와-순간-이동">🔒 점프와 순간 이동</h1>
<h2 id="✔-문제-설명">✔ 문제 설명</h2>
<p><img src="https://velog.velcdn.com/images/eun_esh/post/aa42a493-af81-4ac8-8b73-061105d83325/image.png" alt=""><img src="https://velog.velcdn.com/images/eun_esh/post/2fb23c94-d03b-4948-bf5a-93e31499753d/image.png" alt=""></p>
<h2 id="🚩-요구사항-분석">🚩 요구사항 분석</h2>
<blockquote>
<p>최소 이동을 위해 주어진 N을 2로 나눈다. (순간이동)
나눌수 없을 때 건전지 사용량(answer) 을 1 추가하고 n-1 진행
N이 1이되면 answer을 추가하고 종료 </p>
</blockquote>
<h2 id="🔑문제풀이">🔑문제풀이</h2>
<pre><code class="language-java">public class Solution {
    public int solution(int n) {
        int ans = 0;
        int a = n;
        for(int i = 0; i&lt;a ; i++){

            if(n%2 == 0){
                n = n/2;
            } else if(n == 1){
                ans++;
                break;
            } else {
                ans++;
                n = n-1;
            } 

        }


        return ans;
    }</code></pre>
<h2 id="💡-추가한-테스트-케이스">💡 추가한 테스트 케이스</h2>
<table>
<thead>
<tr>
<th></th>
<th align="left">N</th>
<th align="center">result</th>
</tr>
</thead>
</table>
<blockquote>
<p>추가한 케이스는 없다.</p>
</blockquote>
<h2 id="🎯-알아-볼-것">🎯 알아 볼 것</h2>
<blockquote>
<p>(제한사항)10억 이하의 자연수 
빠르게 풀 수 있는 시간복잡도 고민.</p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[[프로그래머스 / Java] Lv2 - 예상 대진표]]></title>
            <link>https://velog.io/@eun_esh/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-Java-Lv2-JadenCase-%EB%AC%B8%EC%9E%90%EC%97%B4-%EB%A7%8C%EB%93%A4%EA%B8%B0-ovs0b5ff</link>
            <guid>https://velog.io/@eun_esh/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-Java-Lv2-JadenCase-%EB%AC%B8%EC%9E%90%EC%97%B4-%EB%A7%8C%EB%93%A4%EA%B8%B0-ovs0b5ff</guid>
            <pubDate>Wed, 26 Oct 2022 03:45:36 GMT</pubDate>
            <description><![CDATA[<h1 id="🔒-예상-대진표">🔒 예상 대진표</h1>
<h2 id="✔-문제-설명">✔ 문제 설명</h2>
<p><img src="https://velog.velcdn.com/images/eun_esh/post/9016893e-c219-4a72-9d96-94cec012eb5e/image.png" alt=""><img src="https://velog.velcdn.com/images/eun_esh/post/25c2e716-c75a-4e14-a179-b02cd5dc8dfc/image.png" alt=""></p>
<h2 id="🚩-요구사항-분석">🚩 요구사항 분석</h2>
<blockquote>
<p>2의 지수 승으로 주어지는 n -&gt; 2의 제곱승찾기</p>
</blockquote>
<h2 id="🔑문제풀이">🔑문제풀이</h2>
<p><img src="https://velog.velcdn.com/images/eun_esh/post/8e9f8ab1-bc69-41ae-81cd-a75f0284ec82/image.png" alt=""></p>
<blockquote>
<p>항상 이긴다는 가정하에 주어지는 n을 반으로 나눠 왼쪽과 오른쪽으로 나눈다면 결국 오른쪽에있는경우는 해당 n의 제곱승이 나오기에 계속 잘라주면서 비교하는 방식으로 풀었다.
<img src="https://velog.velcdn.com/images/eun_esh/post/b63b8b2c-4d1a-411a-af68-0b4a9858f3e5/image.png" alt=""></p>
</blockquote>
<pre><code class="language-java">class Solution
{
    public int solution(int n, int a, int b){
        int answer = 0;
        int count = 0;
        int s = n;
        for(int i=0; i&lt;=n; i++){
            if (s == 1){
                break;
            }       
            s = s/2;
            count++;           
        }

        for(int i = count ; i&lt;=count; i--){
            n = n/2;

            if(n &lt; b &amp;&amp; n &gt;=a || b&lt;=n &amp;&amp; n&lt;a ){
                answer = i;
                break;
            } else if(n &lt;b &amp;&amp; n&lt;a){
                b = b-n;
                a = a-n;
            }


        }

        return answer;
    }
}</code></pre>
<h2 id="💡-추가한-테스트-케이스">💡 추가한 테스트 케이스</h2>
<table>
<thead>
<tr>
<th></th>
<th align="center">n</th>
<th align="center">param1</th>
<th align="center">param2</th>
<th align="center">Return</th>
</tr>
</thead>
<tbody><tr>
<td>row1</td>
<td align="center">8</td>
<td align="center">6</td>
<td align="center">8</td>
<td align="center">2</td>
</tr>
<tr>
<td>row2</td>
<td align="center">8</td>
<td align="center">1</td>
<td align="center">3</td>
<td align="center">2</td>
</tr>
<tr>
<td>row3</td>
<td align="center">16</td>
<td align="center">11</td>
<td align="center">15</td>
<td align="center">3</td>
</tr>
<tr>
<td>row4</td>
<td align="center">16</td>
<td align="center">8</td>
<td align="center">9</td>
<td align="center">4</td>
</tr>
</tbody></table>
<blockquote>
<p>n을 반으로 나눴을 때 오른쪽에있는 경우
반으로 나눴을때 왼쪽에있 경우
반으로 나누고 오른쪽, 반으로 나누고 왼쪽에있는 경우</p>
</blockquote>
<h2 id="🎯-알아-볼-것">🎯 알아 볼 것</h2>
<blockquote>
<p>제곱승을 구하는 함수</p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[[프로그래머스 / Java] Lv2 - JadenCase 문자열 만들기]]></title>
            <link>https://velog.io/@eun_esh/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-Java-Lv2-JadenCase-%EB%AC%B8%EC%9E%90%EC%97%B4-%EB%A7%8C%EB%93%A4%EA%B8%B0</link>
            <guid>https://velog.io/@eun_esh/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-Java-Lv2-JadenCase-%EB%AC%B8%EC%9E%90%EC%97%B4-%EB%A7%8C%EB%93%A4%EA%B8%B0</guid>
            <pubDate>Wed, 26 Oct 2022 03:43:19 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/eun_esh/post/c7a7ca08-209e-42b0-ac00-67377bb726ca/image.png" alt=""></p>
<h1 id="🔒-jadencase-문자열">🔒 JadenCase 문자열</h1>
<h2 id="✔-문제-설명">✔ 문제 설명</h2>
<p><img src="https://velog.velcdn.com/images/eun_esh/post/f5e8ad48-c1c7-404e-9547-a41b84d272f5/image.png" alt=""></p>
<h2 id="🚩-요구사항-분석">🚩 요구사항 분석</h2>
<blockquote>
<p>소문자로 바꾸는 함수 toLowerCase() 사용
 대문자로 바꾸는 함수 toUpperCase() 사용
 문자열을 공백으로 나누는 split 사용
 첫문자를 확인하기위해 substring 사용</p>
</blockquote>
<h2 id="🔑문제풀이">🔑문제풀이</h2>
<pre><code class="language-java">class Solution {
    public String solution(String s) {
        String answer = &quot;&quot;;
        String p = s.toLowerCase();

        String [] result = p.split(&quot; &quot;);   

        String [] array = new String[result.length];

        for(int i = 0; i&lt;result.length; i++){
            if(result[i].equals(&quot;&quot;)){
                array[i] = &quot;&quot;;
            } else{
                 String check =result[i].substring(0,1).toUpperCase() + 
                    result[i].substring(1);

                array[i] = check;   
            }

        }

        answer = String.join(&quot; &quot;, array);

        if(s.charAt(s.length()-1) == &#39; &#39;){
            answer = answer + &quot; &quot;;
        } 

        return answer;
    }
}</code></pre>
<h2 id="💡-추가한-테스트-케이스">💡 추가한 테스트 케이스</h2>
<table>
<thead>
<tr>
<th></th>
<th align="left">Parameters</th>
<th align="center">Return</th>
</tr>
</thead>
<tbody><tr>
<td>row1</td>
<td align="left">&quot;ho ho &quot;</td>
<td align="center">&quot;Ho Ho &quot;</td>
</tr>
</tbody></table>
<blockquote>
<p>중복공백문자
문자열 끝에 공백</p>
</blockquote>
<h2 id="🎯-알아-볼-것">🎯 알아 볼 것</h2>
<blockquote>
<p>substring의 효율성(메모리,시간)  </p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[Java Spring) 자격증 공부를 위한 사이트 자바스 개발일지 1 - 주제 선정, 역할 분배]]></title>
            <link>https://velog.io/@eun_esh/Java-Spring-%EC%9E%90%EA%B2%A9%EC%A6%9D-%EA%B3%B5%EB%B6%80%EB%A5%BC-%EC%9C%84%ED%95%9C-%EC%82%AC%EC%9D%B4%ED%8A%B8-%EC%9E%90%EB%B0%94%EC%8A%A4-%EA%B0%9C%EB%B0%9C%EC%9D%BC%EC%A7%80-1-%EC%A3%BC%EC%A0%9C-%EC%84%A0%EC%A0%95-%EC%97%AD%ED%95%A0-%EB%B6%84%EB%B0%B0</link>
            <guid>https://velog.io/@eun_esh/Java-Spring-%EC%9E%90%EA%B2%A9%EC%A6%9D-%EA%B3%B5%EB%B6%80%EB%A5%BC-%EC%9C%84%ED%95%9C-%EC%82%AC%EC%9D%B4%ED%8A%B8-%EC%9E%90%EB%B0%94%EC%8A%A4-%EA%B0%9C%EB%B0%9C%EC%9D%BC%EC%A7%80-1-%EC%A3%BC%EC%A0%9C-%EC%84%A0%EC%A0%95-%EC%97%AD%ED%95%A0-%EB%B6%84%EB%B0%B0</guid>
            <pubDate>Wed, 26 Oct 2022 03:26:38 GMT</pubDate>
            <description><![CDATA[<h3 id="팀원목록">팀원목록</h3>
<ul>
<li>작성자 : 은상현</li>
<li>팀원 : 박민호, 장민석, 전하준, 은상현</li>
<li>GitHub Repository<h3 id="개발-구축-환경">개발 구축 환경</h3>
<img src="https://velog.velcdn.com/images/eun_esh/post/635d2701-d224-41f7-8fa1-338361ac4c32/image.png" alt=""></li>
</ul>
<h3 id="주제">주제</h3>
<blockquote>
<ul>
<li><h5 id="자격증을-공부하기위해-정보를-얻고-싶은-취준생들을-위한-사이트이다">자격증을 공부하기위해 정보를 얻고 싶은 취준생들을 위한 사이트이다.</h5>
</li>
</ul>
</blockquote>
<ul>
<li><h5 id="자신이-원하는-자격증을-검색하여-교재동영상관심있는-자격증을-등록할-수-있고-홈페이지에-시험-d-day를-확인하도록-도와준다">자신이 원하는 자격증을 검색하여 교재,동영상,관심있는 자격증을 등록할 수 있고, 홈페이지에 시험 d-day를 확인하도록 도와준다.</h5>
</li>
<li><h5 id="회원들끼리-정보를-공유할-수-있으며-가까운-지역의-스터디카페를-추천해준다">회원들끼리 정보를 공유할 수 있으며, 가까운 지역의 스터디카페를 추천해준다.</h5>
</li>
</ul>
<h2 id="진행상황">진행상황</h2>
<hr>
<h3 id="역할분배">역할분배</h3>
<p>박민호</p>
<ul>
<li>자격증 사이트 메인 페이지 구성</li>
<li>자격증 qna 페이지 구성</li>
</ul>
<p>전하준</p>
<ul>
<li>자격증 정보 페이지 구성</li>
<li>자격증 상세정보 페이지 구성</li>
</ul>
<p>장민석</p>
<ul>
<li>스터디카페 Map api 활용 지역에있는 카페 마커 페이지구성</li>
<li>스터디카페 상세정보 페이지 구성</li>
<li>스터디카페 방 페이지구성</li>
</ul>
<p><span style="color: blue">은상현 (개발파트)</span> </p>
<ul>
<li><ul>
<li>로그인 페이지
회원, 관리자 (등급 분배)
관리자  </li>
<li>관리자 번호로 회원 등급 조절 </li>
<li>회원 결제정보 확인, 취소</li>
</ul>
</li>
<li><ul>
<li>스터디카페 예약시 결제 
회원 포인트 충전
상품결제
결제수단 선택
결제 후 날짜변경
결제 취소<h3 id="프로젝트-일정-관리">프로젝트, 일정 관리</h3>
</li>
</ul>
</li>
</ul>
<hr>
<ul>
<li><a href="https://github.com/20170856MS/GudiProject2">Git</a></li>
<li><a href="https://trello.com/b/B6cTQWFI/goodeeproject2">Trello</a></li>
</ul>
<h3 id="erd-다이어그램">ERD 다이어그램</h3>
<hr>
<ul>
<li>DB설계 : <a href="https://www.erdcloud.com/d/GtZKBvG8uKbjDWPma">Erdcloud</a>
<img src="https://velog.velcdn.com/images/eun_esh/post/752c589e-8e10-45ef-a2b1-97677335a176/image.png" alt=""></li>
</ul>
<h3 id="사이트설계">사이트설계</h3>
<hr>
<p><img src="https://velog.velcdn.com/images/eun_esh/post/d04ebfde-eb4f-4471-94ce-53997a042aef/image.png" alt=""></p>
]]></description>
        </item>
    </channel>
</rss>