<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>The Development Log 🌏</title>
        <link>https://velog.io/</link>
        <description>I'm Junior iOS developer 배지해.</description>
        <lastBuildDate>Thu, 07 Mar 2024 01:17:37 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>The Development Log 🌏</title>
            <url>https://velog.velcdn.com/images/jihae__qu/profile/b2a2a36c-277f-4e99-b6ba-1ff329d0b8e4/image.jpg</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. The Development Log 🌏. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/jihae__qu" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[[프로그래머스] 덧칠하기]]></title>
            <link>https://velog.io/@jihae__qu/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-%EB%8D%A7%EC%B9%A0%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@jihae__qu/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-%EB%8D%A7%EC%B9%A0%ED%95%98%EA%B8%B0</guid>
            <pubDate>Thu, 07 Mar 2024 01:17:37 GMT</pubDate>
            <description><![CDATA[<p>🍄 코딩테스트 
<a href="https://school.programmers.co.kr/learn/courses/30/lessons/161989">코딩테스트 문제 풀이</a></p>
<p>✍🏻 Github</p>
<p><a href="%5Bhttps://github.com/BaeJihae/-Swift-CodingTest/blob/main/%5B%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4%5D/1-%EC%97%B0%EC%8A%B5/161989_%EB%8D%A7%EC%B9%A0%ED%95%98%EA%B8%B0.swift%5D(https://github.com/BaeJihae/-Swift-CodingTest/blob/main/%5B%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4%5D/1-%EC%97%B0%EC%8A%B5/161989_%EB%8D%A7%EC%B9%A0%ED%95%98%EA%B8%B0.swift)">문제 풀이 github 링크</a></p>
<h3 id="문제-설명">문제 설명</h3>
<p>어느 학교에 페인트가 칠해진 길이가 <code>n</code>미터인 벽이 있습니다. 벽에 동아리 · 학회 홍보나 회사 채용 공고 포스터 등을 게시하기 위해 테이프로 붙였다가 철거할 때 떼는 일이 많고 그 과정에서 페인트가 벗겨지곤 합니다. 페인트가 벗겨진 벽이 보기 흉해져 학교는 벽에 페인트를 덧칠하기로 했습니다.</p>
<p>넓은 벽 전체에 페인트를 새로 칠하는 대신, 구역을 나누어 일부만 페인트를 새로 칠 함으로써 예산을 아끼려 합니다. 이를 위해 벽을 1미터 길이의 구역 <code>n</code>개로 나누고, 각 구역에 왼쪽부터 순서대로 1번부터 <code>n</code>번까지 번호를 붙였습니다. 그리고 페인트를 다시 칠해야 할 구역들을 정했습니다.</p>
<p>벽에 페인트를 칠하는 롤러의 길이는 <code>m</code>미터이고, 롤러로 벽에 페인트를 <strong>한 번</strong> 칠하는 규칙은 다음과 같습니다.</p>
<ul>
<li>롤러가 벽에서 벗어나면 안 됩니다.</li>
<li>구역의 일부분만 포함되도록 칠하면 안 됩니다.</li>
</ul>
<p>즉, 롤러의 좌우측 끝을 구역의 경계선 혹은 벽의 좌우측 끝부분에 맞춘 후 롤러를 위아래로 움직이면서 벽을 칠합니다. 현재 페인트를 칠하는 구역들을 완전히 칠한 후 벽에서 롤러를 떼며, 이를 벽을 <strong>한 번</strong> 칠했다고 정의합니다.</p>
<p>한 구역에 페인트를 여러 번 칠해도 되고 다시 칠해야 할 구역이 아닌 곳에 페인트를 칠해도 되지만 다시 칠하기로 정한 구역은 적어도 한 번 페인트칠을 해야 합니다. 예산을 아끼기 위해 다시 칠할 구역을 정했듯 마찬가지로 롤러로 페인트칠을 하는 횟수를 최소화하려고 합니다.</p>
<p>정수 <code>n</code>, <code>m</code>과 다시 페인트를 칠하기로 정한 구역들의 번호가 담긴 정수 배열 <code>section</code>이 매개변수로 주어질 때 롤러로 페인트칠해야 하는 최소 횟수를 return 하는 solution 함수를 작성해 주세요.</p>
<p><strong>제한사항</strong></p>
<ul>
<li>1 ≤ <code>m</code> ≤ <code>n</code> ≤ 100,000</li>
<li>1 ≤ <code>section</code>의 길이 ≤ <code>n</code><ul>
<li>1 ≤ <code>section</code>의 원소 ≤ <code>n</code></li>
<li><code>section</code>의 원소는 페인트를 다시 칠해야 하는 구역의 번호입니다.</li>
<li><code>section</code>에서 같은 원소가 두 번 이상 나타나지 않습니다.</li>
<li><code>section</code>의 원소는 오름차순으로 정렬되어 있습니다.</li>
</ul>
</li>
</ul>
<p><strong>입출력 예</strong></p>
<table>
<thead>
<tr>
<th>n</th>
<th>m</th>
<th>section</th>
<th>result</th>
</tr>
</thead>
<tbody><tr>
<td>8</td>
<td>4</td>
<td>[2, 3, 6]</td>
<td>2</td>
</tr>
<tr>
<td>5</td>
<td>4</td>
<td>[1, 3]</td>
<td>1</td>
</tr>
<tr>
<td>4</td>
<td>1</td>
<td>[1, 2, 3, 4]</td>
<td>4</td>
</tr>
</tbody></table>
<p><strong>입출력 예 설명</strong></p>
<p>입출력 예 #1</p>
<ul>
<li><p>예제 1번은 2, 3, 6번 영역에 페인트를 다시 칠해야 합니다. 롤러의 길이가 4미터이므로 한 번의 페인트칠에 연속된 4개의 구역을 칠할 수 있습니다. 처음에 3, 4, 5, 6번 영역에 페인트칠을 하면 칠해야 할 곳으로 2번 구역만 남고 1, 2, 3, 4번 구역에 페인트칠을 하면 2번 만에 다시 칠해야 할 곳에 모두 페인트칠을 할 수 있습니다.</p>
<p>  <img src="https://velog.velcdn.com/images/jihae__qu/post/befe5fc0-1a07-480f-b0a4-6890f7fe84c3/image.png" alt=""></p>
<p>  2번보다 적은 횟수로 2, 3, 6번 영역에 페인트를 덧칠하는 방법은 없습니다. 따라서 최소 횟수인 2를 return 합니다.</p>
</li>
</ul>
<p>입출력 예 #2</p>
<ul>
<li><p>예제 2번은 1, 3번 영역에 페인트를 다시 칠해야 합니다. 롤러의 길이가 4미터이므로 한 번의 페인트칠에 연속된 4개의 구역을 칠할 수 있고 1, 2, 3, 4번 영역에 페인트칠을 하면 한 번에 1, 3번 영역을 모두 칠할 수 있습니다.</p>
<p>  <img src="https://velog.velcdn.com/images/jihae__qu/post/1b2e44de-c880-424b-adc3-63845df7ca09/image.png" alt=""></p>
<p>  따라서 최소 횟수인 1을 return 합니다.</p>
</li>
</ul>
<p>입출력 예 #3</p>
<ul>
<li><p>예제 3번은 모든 구역에 페인트칠을 해야 합니다. 롤러의 길이가 1미터이므로 한 번에 한 구역밖에 칠할 수 없습니다. 구역이 4개이므로 각 구역을 한 번씩만 칠하는 4번이 최소 횟수가 됩니다.</p>
<p>  <img src="https://velog.velcdn.com/images/jihae__qu/post/e78d26bd-9174-4453-be29-0e1a99282265/image.png" alt=""></p>
<p>  따라서 4를 return 합니다.</p>
</li>
</ul>
<hr>
<h3 id="문제-풀이">문제 풀이</h3>
<p><strong>나의 풀이</strong></p>
<pre><code class="language-swift">import Foundation

func solution(_ n:Int, _ m:Int, _ section:[Int]) -&gt; Int {

    // 현재 롤러의 위치
    var location: Int = 0
    var count: Int = 0

    for i in section {

        // 롤러의 위치가 벽을 넘어서면 반복문 종료
        if location &gt; n {
            break
        }

        // 벽이 칠해지지 않았다면 실행
        if i &gt;= location {
            location = i + m
            count += 1
        }
    }

    return count
}</code></pre>
<p>현재 롤러의 위치를 파악해 문제를 풀려고 하였다.</p>
<p>롤러의 위치가 section의 요소보다 작다면 아직 안칠해진 것이고, section의 요소 보다 크다면 이미 칠해진 벽일 것이다.</p>
<p>이를 이용해 문제를 풀었다.</p>
<p>여기서 실행 시간을 조금 더 줄이기 위해 현재의 위치가 벽의 길이를 넘어간다면 반복문을 종료하여 풀도록 하였다.</p>
<p>실행시간은 n값과 같거나 작을 것으로 생각된다.</p>
<p>더 좋은 방법이 있을까?</p>
<p>다른 사람의 풀이를 살펴보았는데 나와의 비슷한 풀이 방법이 많았고, 더 좋은 시간 복잡도를 가지는 코드는 아직 찾지 못하였다.</p>
<p>이미 한번 풀었던 문제라도 풀이 방법에 대한 기억이 전혀 없음..</p>
<p>전에 풀었던 풀이를 한 번 살펴보자.</p>
<pre><code class="language-swift">import Foundation

func solution(_ n:Int, _ m:Int, _ section:[Int]) -&gt; Int {

    var k = section[0] + m - 1
    var count = 1

    for i in section {
        if i &gt; k {
            k = i + m - 1
            count += 1
            if k &gt;= n {
                break
            }
        }
    }
    return count
}</code></pre>
<p>아주 비슷하지만, 현재의 위치가 벽의 길이를 넘어가는 코드를 현재의 위치를 올렸을 때 바로 적응하여 한번의 반복문 실행을 더 줄인 것으로 보인다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[TIL] 실패는 성공의 어머니라고 했다.. ( 업캐스팅과 다운캐스팅 )]]></title>
            <link>https://velog.io/@jihae__qu/TIL-%EC%8B%A4%ED%8C%A8%EB%8A%94-%EC%84%B1%EA%B3%B5%EC%9D%98-%EC%96%B4%EB%A8%B8%EB%8B%88%EB%9D%BC%EA%B3%A0-%ED%96%88%EB%8B%A4..-%EC%97%85%EC%BA%90%EC%8A%A4%ED%8C%85%EA%B3%BC-%EB%8B%A4%EC%9A%B4%EC%BA%90%EC%8A%A4%ED%8C%85</link>
            <guid>https://velog.io/@jihae__qu/TIL-%EC%8B%A4%ED%8C%A8%EB%8A%94-%EC%84%B1%EA%B3%B5%EC%9D%98-%EC%96%B4%EB%A8%B8%EB%8B%88%EB%9D%BC%EA%B3%A0-%ED%96%88%EB%8B%A4..-%EC%97%85%EC%BA%90%EC%8A%A4%ED%8C%85%EA%B3%BC-%EB%8B%A4%EC%9A%B4%EC%BA%90%EC%8A%A4%ED%8C%85</guid>
            <pubDate>Wed, 06 Mar 2024 13:33:32 GMT</pubDate>
            <description><![CDATA[<p>오늘도 9시가 넘어서야 TIL을 작성하구 있네요..!</p>
<p>너무 집중이 안되서 커피 수혈을 조금 했는데..
심장이 쿵! 쾅! 쿵! 쾅! 과다 카페인 섭취를 한 거 같아요..
몸이 아주 무리데스네
그렇게 오늘 저녁은 패스입니다요..</p>
<hr>
<br/>

<h2 id="다운캐스팅-error">다운캐스팅 Error</h2>
<p>과제를 풀다가 다운 캐스팅을 사용해서 기깔나게 마무리하려고 했는데.. 반복적으로 생기는 오류!
대체 뭐가 문제인지 모르겠어서 구글링을 거쳐서 다운 캐스팅과 업 캐스팅부터 다시 공부합니다.</p>
<p><br/><br/></p>
<h3 id="업캐스팅upcasting과-다운캐스팅downcasting">업캐스팅(Upcasting)과 다운캐스팅(Downcasting)</h3>
<p>두 단어 모두 클래스의 상속과 관련된 용어로 부모클래스와 자식클래스 사이의 타입 변환을 위해 사용됩니다.</p>
<blockquote>
<p><strong>업캐스팅이란?</strong>
하위 클래스의 인스턴스를 상위 클래스 타입으로 변환하는 것</p>
</blockquote>
<ul>
<li>[하위 클래스의 인스턴스] as [상위 클래스]</li>
<li>안전하게 진행할 수 있어 따로 검사가 필요하지 않다.</li>
</ul>
<br/>

<blockquote>
<p><strong>다운캐스팅이란?</strong>
상위 클래스의 인스턴스를 하위 클래스 타입으로 변환하는 것</p>
</blockquote>
<p>다운캐스팅은 항상 안전하게 진행될 수 없기 때문에 오류가 생길 수도 있습니다. 옵셔널 바인딩을 하는 것과 같이 캐스팅하는 방법이 두 가지 존재합니다.</p>
<h4 id="-첫번째-방법--as-강제-다운-캐스트">[ 첫번째 방법 ] as! (강제 다운 캐스트)</h4>
<ul>
<li>[상위 클래스의 인스턴스] as! [하위 클래스]</li>
<li>강제로 업래핑을 하는 거다 보니 런타임 시점에서 다운 캐스트를 성공하지 못했다면 에러가 납니다.</li>
</ul>
<h4 id="-두번째-방법--as-안전한-다운-캐스트">[ 두번째 방법 ] as? (안전한 다운 캐스트)</h4>
<ul>
<li>[상위 클래스의 인스턴스] as? [하위 클래스]</li>
<li>런타임 시점에서 다운 캐스팅을 진행하는데 성공하지 못했다면 nil을 반환</li>
<li><blockquote>
<p>옵셔널 타입으로 지정해주어야함!</p>
</blockquote>
</li>
</ul>
<br/>

<h3 id="해결">해결</h3>
<p>제가 에러가 난 부분을 다시 확인해보니 저는 강제 다운 캐스트를 진행을 했는데 런타임 시점에서 성공하지 못해서 에러가 났습니다.</p>
<ul>
<li><p>클래스 선언부</p>
<pre><code class="language-swift">class AbstractOperation {
    func calculate(_ firstNumber: Int ,_ secondNumber: Int) -&gt; Double {
        return 0.0
    }
}

class AddOperation4: AbstractOperation {
    override func calculate(_ firstNumber: Int ,_ secondNumber: Int) -&gt; Double {
        return Double(firstNumber + secondNumber)
    }
}

class SubtractOperation4: AbstractOperation {
    override func calculate(_ firstNumber: Int ,_ secondNumber: Int) -&gt; Double {
        return Double(firstNumber - secondNumber)
    }
}

class MultiplyOperation4: AbstractOperation {
    override func calculate(_ firstNumber: Int ,_ secondNumber: Int) -&gt; Double {
        return Double(firstNumber * secondNumber)
    }
}

class DivideOperation4: AbstractOperation {
    override func calculate(_ firstNumber: Int ,_ secondNumber: Int) -&gt; Double {
        return Double(firstNumber) / Double(secondNumber)
    }
}

class ModulusOperation4: AbstractOperation {
    override func calculate(_ firstNumber: Int ,_ secondNumber: Int) -&gt; Double {
        return Double(firstNumber % secondNumber)
    }
}</code></pre>
</li>
<li><p>다운캐스팅하여 위의 클래스의 인스턴스를 활용하려는 클래스</p>
<pre><code class="language-swift">class Calculator4 {

    var firstNumber: Int = 0
    var secondNumber: Int = 0
    var op: Character?

    init(firstNumber: Int, secondNumber: Int, op: Character? = nil) {
        self.firstNumber = firstNumber
        self.secondNumber = secondNumber
        self.op = op
    }

    func calculate() -&gt; Double {

        var operation = AbstractOperation()

        // 🚨Error
        if op == &quot;+&quot; { operation as! AddOperation4 }
        else if op == &quot;-&quot; { operation as! SubtractOperation4 }
        else if op == &quot;/&quot; { operation as! DivideOperation4 }
        else if op == &quot;*&quot; { operation as! MultiplyOperation4 }
        else if op == &quot;%&quot; { operation as! ModulusOperation4 }
        else { return 0.0 }

        return operation.calculate(firstNumber, secondNumber)
    }
}</code></pre>
</li>
<li><p>Calculator4의 인스턴스를 만들어 해당 메서드를 이용해 값 출력</p>
<pre><code class="language-swift">let calculator4 = Calculator4(firstNumber: 30, secondNumber: 6, op: &quot;+&quot;)
let addResult = calculator4.calculate()
print(&quot;addResult : \(addResult)&quot;)</code></pre>
</li>
</ul>
<p>위의 코드는 addResult에서 <strong>&quot; error: execution was interrupted, reason: signal sigabrt. the process has been left at the point where it was interrupted, use &quot;thread return -x&quot;</strong> to return to the state before expression evaluation. &quot; 이런 에러가 나더라구요. 강제 다운 캐스팅에 실패했을 때 뜨는 에러라고 합니다.</p>
<p>우선 업캐스팅과 다운캐스팅을 공부하고 다시 봤더니 제가 난 오류는 단순히 다운 캐스팅때문에 난 오류가 아니더라구요.. 개념적으로 풀 수 없는 방법으로 풀려고 시도했더니 안되지..
그래도 혹시나 혹시나 가능할 수도 있으니 내일 튜텨님께 질문을 꼭 해봐야겠어요!</p>
<p>Calculator4의 calculate() 메서드를 이렇게 고쳤더니 해결이 되었습니다!</p>
<pre><code class="language-swift">func calculate() -&gt; Double {

//           🚨Error
//        var operation = AbstractOperation()
//        if op == &quot;+&quot; { operation as! AddOperation4 }
//        else if op == &quot;-&quot; { operation as! SubtractOperation4 }
//        else if op == &quot;/&quot; { operation as! DivideOperation4 }
//        else if op == &quot;*&quot; { operation as! MultiplyOperation4 }
//        else if op == &quot;%&quot; { operation as! ModulusOperation4 }
//        else { return 0.0 }

        guard let op = op else { return 0.0 }

        switch op {
        case &quot;+&quot; :
            return AddOperation4().calculate(firstNumber, secondNumber)
        case &quot;-&quot; :
            return SubtractOperation4().calculate(firstNumber, secondNumber)
        case &quot;/&quot; :
            return DivideOperation4().calculate(firstNumber, secondNumber)
        case &quot;*&quot; :
            return MultiplyOperation4().calculate(firstNumber, secondNumber)
        case &quot;%&quot; :
            return ModulusOperation4().calculate(firstNumber, secondNumber)
        default :
            print(&quot;계산기에 존재하지 않는 연산자입니다.&quot;)
            return 0.0
        }
    }</code></pre>
<p> <br/><br/></p>
<p><strong>[ 내일 해결해야 할 문제 ]</strong>
❎ 한가지의 변수에 부모 클래스의 인스턴스를 대입하고, 그 변수를 자식 클래스로 다운캐스팅하여 메서드를 사용하려고 할 때, 경우에 따라 다른 다운 캐스팅을 하여 진행하면 안되는지.. 안된다면 왜 안되는지..!!!!</p>
<br/>

<h4 id="참고한-블로그-📄">참고한 블로그 📄</h4>
<p><a href="https://babbab2.tistory.com/127">https://babbab2.tistory.com/127</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Swift] 튜플(Tuple)]]></title>
            <link>https://velog.io/@jihae__qu/Swift-%ED%8A%9C%ED%94%8CTuple</link>
            <guid>https://velog.io/@jihae__qu/Swift-%ED%8A%9C%ED%94%8CTuple</guid>
            <pubDate>Wed, 06 Mar 2024 09:37:42 GMT</pubDate>
            <description><![CDATA[<p><br/> <br/></p>
<h1 id="1-튜플-기본">1. 튜플 기본</h1>
<h2 id="1-튜플">1) 튜플</h2>
<p>: 여러 가지 타입의 데이터를 저장하는 Compound(복합/혼합) 타입</p>
<pre><code class="language-swift">let twoNumbers: (Int, Int) = (1, 2)
let threeNumbers = (1, 2, 5)
var threeValues = (&quot;홍길동&quot;, 20, &quot;서울&quot;)</code></pre>
<ul>
<li>() (소괄호)와 , (콤마)를 이용해 여러가지 연관된 데이터를 저장할 수 있다.</li>
<li>변수를 선언과 동시 해당 멤버(데이터의 종류 및 갯수)는 결정되므로 추가/삭제 불가</li>
<li>서로 다른 데이터 타입도 저장이 가능하다.</li>
</ul>
<br/>

<h3 id="튜플은-인덱스-번호를-사용해-요소에-접근"><strong>튜플은 인덱스 번호를 사용해 요소에 접근</strong></h3>
<p>: 연관된 값의 각각의 데이터의 접근은 앞에서부터 번호를 매겨 0부터 시작이 된다.</p>
<pre><code class="language-swift">print(type(of: threeValues))
print(threeValues.0)
print(threeValues.1)
print(threeValues.2)

/* 결과:
(String, Int, String)
홍길동
20
서울
*/</code></pre>
<p>❗️ type(of: 변수) - 타입을 알고 싶을 때 쓰는 함수
<br/></p>
<h3 id="이름이-매겨진-튜플-named-tuple">이름이 매겨진 튜플 (Named Tuple)</h3>
<p>: 데이터의 각 요소에 이름을 매길 수 있다.</p>
<pre><code class="language-swift">let iOS = (language: &quot;Swift&quot;, version: &quot;5&quot;)

print(iOS.0)
print(iOS.1) 

print(iOS.language)
print(iOS.version)

/* 결과:
Swift
5
Swift
5
*/</code></pre>
<p>→ iOS.0 이라는 표현을 써도 좋지만, iOS.language 라는 표현을 쓰면, 어떤 데이터가 튜플의 0번째에 들어있는지 알 수 있다.</p>
<p>→ iOS.0과 iOS.language를 출력해도 결과 값이 동일하다.</p>
<p>❓ 왜 이름이 매겨진 튜플을 사용
: 가독성을 높이기 위해</p>
<br/>

<h3 id="튜플의-분해-decomposition">튜플의 분해 (Decomposition)</h3>
<p>: 튜플의 각 요소를 상수/변수화 가능(바인딩)</p>
<pre><code class="language-swift">let name = ( 5, 6, 7 )</code></pre>
<p>→ 튜플의 값을 name이라는 한 개의 상수에 저장할 수 있지만,</p>
<pre><code class="language-swift">let (first, second, third) = ( 5, 6, 7 )</code></pre>
<p>→ 데이터 묶음을 한 개씩 분해해 상수나 변수에 저장하는 것도 가능하다.</p>
<pre><code class="language-swift">let threeNumbers = (1, 2, 5)
let (first, second, third) = threeNumbers

print(first)   // 결과 : 1
print(second)  // 결과 : 2 
print(third)   // 결과 : 5</code></pre>
<p>❗️ 이때, <strong>let</strong>, <strong>var</strong>은 상관없음
<br/></p>
<h3 id="튜플의-값의-비교">튜플의 값의 비교</h3>
<p>: 튜플에서의 비교는 인덱스가 낮은 값을 우선으로 비교한다. ( 실제 사용하는 경우는 흔하지는 않음 )</p>
<pre><code class="language-swift">(1, &quot;zebra&quot;) &lt; (2, &quot;apple&quot;)   // true, 1이 2보다 작고; zebra가 apple은 비교하지 않기 때문
(3, &quot;apple&quot;) &lt; (3, &quot;bird&quot;)    // true 왼쪽 3이 오른쪽 3과 같고; apple은 bird보다 작기 때문
(4, &quot;dog&quot;) == (4, &quot;dog&quot;)</code></pre>
<ul>
<li>문자열의 비교는 문자열의 순서대로 스펠링의 순서로 판단</li>
<li>Bool은 비교할 수 없다.</li>
</ul>
<p><br/><br/></p>
<h1 id="2-튜플의-활용">2. 튜플의 활용</h1>
<h2 id="1-튜플과-switch-문">1) 튜플과 switch 문</h2>
<h3 id="튜플의-매칭matching">튜플의 매칭(Matching)</h3>
<ul>
<li><p><strong>if문 사용</strong></p>
<pre><code class="language-swift">  let iOS = (language: &quot;Swift&quot;, version: &quot;4&quot;)</code></pre>
<pre><code class="language-swift">  if iOS.language == &quot;Swift&quot; &amp;&amp; iOS.version == &quot;5&quot; {
      print(&quot;스위프트 버전 5입니다.&quot;)
  } else {
      print(&quot;다른 버전입니다.&quot;)
  }</code></pre>
<pre><code class="language-swift">  if (&quot;Swift&quot;,&quot;4&quot;) == iOS {
      print(&quot;스위프트 버전 5입니다.&quot;)
  }</code></pre>
</li>
<li><p><strong>switch문 사용</strong></p>
<pre><code class="language-swift">  switch iOS{
  case (&quot;Swift&quot;,&quot;4&quot;) :
      print(&quot;스위프트 버전 5입니다.&quot;)
  default :
      break
  }</code></pre>
<p>  → 위의 <strong>if</strong> 조건문을 <strong>switch</strong> 조건문을 이용하면 단순해진다.</p>
</li>
</ul>
<p>❗️ 튜플의 비교에서는 switch 문을 사용하면 더 편하다.</p>
   <br/>

<h3 id="튜플의-활용--좌표-where절-활용-">튜플의 활용 ( 좌표, where절 활용 )</h3>
<ul>
<li><p>튜플의 바인딩 ( 좌표 )</p>
<pre><code class="language-swift">  var coordinate = (3, 5)

  switch coordinate {
  case (let distance, 0), (0, let distance):
      print(&quot;X 또는 Y축 위에 위치하며, \(distance)만큼의 거리가 떨어져 있음&quot;)
  default:
      print(&quot;축 위에 있지 않음&quot;)
  }

  // 결과 : 축 위에 있지 않음</code></pre>
<p>  → 튜플을 사용한 바인딩에서는 조건이 맞는 것만 바인딩 된다.</p>
</li>
</ul>
<ul>
<li><p><a href="https://www.notion.so/d256d6a3648548deaca6435b3d74bcb3?pvs=21">튜플의 where절 활용</a></p>
<pre><code class="language-swift">  coordinate = (5, 0)

  switch coordinate {
  case (let x, let y) where x == y:
      print(&quot;(\(x), \(y))의 좌표는 y = x 1차함수의 그래프 위에 있다.&quot;)

  case let (x, y) where x == -y:
      print(&quot;(\(x), \(y))의 좌표는 y = -x 1차함수의 그래프 위에 있다.&quot;)

  case let (x, y):
      print(&quot;(\(x), \(y))의 좌표는 y = x, 또는 y = -x 그래프가 아닌 임의의 지점에 있다.&quot;)
  }</code></pre>
<p>  ❗️ 이때, let(x, y)와 (let x, let y)는 같은 문장이다.</p>
</li>
</ul>
<p><br/><br/></p>
<h2 id="2-튜플을-사용하는-이유">2) 튜플을 사용하는 이유</h2>
<p>: 함수는 원칙적으로 리턴값이 한개만 존재하기 때문에 여러개의 값을 반환할 수 없지만, 어떤 묶음 값으로는 반환하는 것이 가능하기 때문이다.</p>
<p>❓❗️ 튜플은 많은 데이터를 담는 데는 적합하지 않고, 2~3개의 연관된 값을 담기에 좋은 타입이다. 튜플의 값을 사용하기 위해서는 다시 매핑하는 작업이 필요하기 때문이다.</p>
<p><br/><br/></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Swift] 데이터 타입 (Data Type)]]></title>
            <link>https://velog.io/@jihae__qu/Swift-%EB%8D%B0%EC%9D%B4%ED%84%B0-%ED%83%80%EC%9E%85-Data-Type</link>
            <guid>https://velog.io/@jihae__qu/Swift-%EB%8D%B0%EC%9D%B4%ED%84%B0-%ED%83%80%EC%9E%85-Data-Type</guid>
            <pubDate>Wed, 06 Mar 2024 09:13:03 GMT</pubDate>
            <description><![CDATA[<p>❓ <em>타입이 왜 필요한가</em></p>
<p>: 컴퓨터는 변수나 상수를 선언하면 메모리에 공간을 생성한다. 이 때, 데이터가 어떤 형태로 저장해야하며 데이터의 크기가 얼만큼인지 정해주어야 컴퓨터가 인지할 수 있다. 또한 컴퓨터의 메모리 공간도 보다더 효율적으로 사용할 수 있을 것이다.</p>
<br/>

<h2 id="1-스위프트의-데이터-타입type">1) <strong>스위프트의 데이터 타입(Type)</strong></h2>
<table>
<thead>
<tr>
<th>키워드</th>
<th>타입 설명</th>
<th>예시</th>
</tr>
</thead>
<tbody><tr>
<td>Int🔸 / 정수</td>
<td>정수. 8바이트(64비트환경에서)</td>
<td>5, 7, -123, 0</td>
</tr>
<tr>
<td>Float / 실수</td>
<td>부동소수(6자리). 4바이트(32비트)</td>
<td>3.14, -14.187</td>
</tr>
<tr>
<td>Double🔸 / 실수</td>
<td>부동소수(15자리). 8바이트(64비트)</td>
<td>3.14, -14.187</td>
</tr>
<tr>
<td>Character / 문자</td>
<td>하나의 문자. 쌍따옴표 사용(“”)</td>
<td>“A”,“a”,“한”,“ ”</td>
</tr>
<tr>
<td>String🔸 / 문자열</td>
<td>문자열. 쌍따옴표 사용(“”)</td>
<td>“안녕하세요”, “스티브 잡스” , “”</td>
</tr>
<tr>
<td>Bool🔸 / 참과 거짓</td>
<td>참/거짓</td>
<td>true, false</td>
</tr>
<tr>
<td>기타</td>
<td>UInt, UInt64, Int32 ...</td>
<td></td>
</tr>
</tbody></table>
<br/>

<h3 id="✔️-int">✔️ Int</h3>
<p>정수형 타입으로 -2,147,483,648 ~ 2,147,483,647 사이의 정수값을 표현가능하다.</p>
<pre><code class="language-swift">var age: Int = 2</code></pre>
<br/>

<h3 id="✔️-float">✔️ Float</h3>
<p>32비트의 부동 소수를 표현하는 타입으로 소수점 이하 6자리까지 정확한 표현이 가능하다.</p>
<pre><code class="language-swift">var interestRate: Float = 1.2345678910
print(&quot;이자율은 \(interestRate)% 입니다.&quot;)
// 출력 : 이자율은 1.2345679% 입니다.</code></pre>
<p>→ 소수점 이하 10자리를 입력하더라도 6자리까지만 정확한 값을 도출해내고, 아래의 값은 반올림하여 도출해낸다.</p>
<br/>

<h3 id="✔️-double">✔️ Double</h3>
<p>64비트의 부동 소수를 표현하는 타입으로 소수점 이하 15자리까지 정확한 표현이 가능하다.</p>
<pre><code class="language-swift">var interestRate2: Double = 1.2345678910111213
print(&quot;이자율은 \(interestRate2)% 입니다.&quot;)
// 출력 : 이자율은 1.2345678910111213% 입니다.</code></pre>
<br/>

<h3 id="✔️-bool">✔️ Bool</h3>
<p>참과 거짓을 표현하는 타입으로 참은 <code>true</code>, 거짓은 <code>false</code>로 표현한다.</p>
<pre><code class="language-swift">var isOpen: Bool = true
var isLogged: Bool = false

if isOpen {
    print(&quot;문이 열려 있습니다.&quot;)
}else {
    print(&quot;문이 닫혀 있습니다.&quot;)
}

// 출력 : 문이 열려 있습니다.

func checkLoginStatus(_ isLogged: Bool){
    if isLogged {
        print(&quot;로그인되었습니다.&quot;)
    }else {
        print(&quot;로그아웃되었습니다.&quot;)
    }
}

checkLoginStatus(isLogged)
// 출력 : 로그아웃되었습니다.</code></pre>
<br/>

<h3 id="✔️-string">✔️ String</h3>
<p>문자열을 표현하는 데이터타입으로 한 줄은 “문자열” 로 여러줄은 “””문자열“”” 로 정의가능하다.</p>
<pre><code class="language-swift">// 빈 문자열 표현하는 방법
var emptyString: String = &quot;&quot;
var anotherEmptyString = String()

print(emptyString)
// 출력 : 
print(anotherEmptyString)
// 출력 :

var introduce:String = &quot;&quot;&quot;
안녕하세요
저는
배지해
입니다.
&quot;&quot;&quot;

print(str)
// 출력 : 안녕하세요
//저는
//배지해
//입니다.</code></pre>
<ul>
<li><p>문자열은 + 연산을 이용해 이어 붙일 수 있다.</p>
<pre><code class="language-swift">var variableString = &quot;Mom&quot;
variableString += &quot; and Dad&quot;

print(variableString)
// 출력 : Mom and Dad</code></pre>
</li>
</ul>
<br/>

<h3 id="✔️-character">✔️ Character</h3>
<p>하나의 문자를 표현하는 데이터타입</p>
<pre><code class="language-swift">var cha: Character = &quot;a&quot;

// 빈문자열은 Error
// cha = &quot;&quot;

// 공백문자는 가능
cha = &quot; &quot;</code></pre>
<ul>
<li><p>Character 타입으로 된 배열을 합치는 방법 → String으로 타입변환 사용</p>
<pre><code class="language-swift">
  var catCharaters: [Character] = [&quot;c&quot;,&quot;a&quot;,&quot;t&quot;,&quot;!&quot;]
  var catString = String(catCharaters)

  print(catString)
  // 출력 : cat!</code></pre>
</li>
<li><p>String 타입으로 된 배열을 합치는 방법 → joined() 사용</p>
<pre><code class="language-swift">  var catCharaters1: [String] = [&quot;cdd&quot;,&quot;aee&quot;,&quot;tee&quot;,&quot;!!!&quot;]

  // var catString1 = String(catCharaters1) 🚨Error

  print(catCharaters1.joined())
  // 출력 : cddaeetee!!!</code></pre>
</li>
</ul>
<ul>
<li><p><strong>스위프트에서 데이터 타입의 첫글자는 대문자를 사용하여야 한다.</strong></p>
<pre><code class="language-swift">  var b: Int = 7

  var c: Double = 3

  var chr3: Character = &quot; &quot;

  let str: String = &quot;&quot;</code></pre>
</li>
</ul>
<p><br/><br/></p>
<h2 id="2-타입의-주석-type-annotation-">2) 타입의 주석( Type Annotation )</h2>
<p>: 변수를 선언하면서 타입을 명확하게 지정하는 방식</p>
<pre><code class="language-swift">var name: String = “홍길동”
var value: Double = 5.345</code></pre>
<p><br/><br/></p>
<h2 id="3-타입의-추론-type-inference-">3) 타입의 추론( Type Inference )</h2>
<p>: 변수를 선언할 때, 타입을 지정하지 않아도 컴파일러가 타입을 유추하는 방식</p>
<pre><code class="language-swift">var name = “홍길동”
type(of: name) // 결과 : String

var num1 = 2
type(of: num1) // 결과 : Int</code></pre>
<p>❗️ type(of: 변수명) - 변수의 타입을 확인하는 함수이다.</p>
<br/>

<blockquote>
<p><strong>컴파일러란?</strong>
소스 코드를 분석하여 기계어로 번역해주는 프로그램
소스코드분석 → 의미분석 → 코드최적화 → 코드 생성의 단계를 거침</p>
</blockquote>
<p><br/><br/></p>
<h2 id="4-타입의-안정성-type-safety-">4) 타입의 안정성( Type Safety )</h2>
<p>: 스위프트는 데이터 타입을 명확하게 구분하여 사용하는 언어</p>
<p>❗️ 스위프트는 다른 타입끼리 계산할 수 없다.</p>
<pre><code class="language-swift">var number = 12 // Int

// number = 3.14 -&gt; 에러  
// Int형 데이터 타입으로 선언된 변수에 실수를 넣으면 에러가 남

var x = 10
var y = 10.0

// var z = x + y 🚨 Error
// x와 y는 각각 Int 타입, Double 타입이므로 연산이 불가능함.</code></pre>
<p><br/><br/></p>
<h2 id="5-타입형-변환type-conversion">5) 타입(형) 변환(Type Conversion)</h2>
<p>: 타입을 변환하는 방법</p>
<ul>
<li><p>기존에 메모리에 저장된 값을 다른 형식으로 바꿔서, 새로운 값을 생성해서 다른 메모리 공간에 다시 저장</p>
<pre><code class="language-swift">let str2 = &quot;123&quot;
type(of: str2)
// 결과 : String

let number1 = Int(str2)
type(of: number1)
// 결과 : Int
print(number1)
// 결과 : Optional(123)</code></pre>
</li>
<li><p>타입형 변환에 실패하였을 때, <a href="https://www.notion.so/Part-8-Optional-2c8460ae4ea04216b4124f334880d13c?pvs=21">nil 값</a>이 리턴될 수 있다.</p>
<pre><code class="language-swift">let doubleString = &quot;321.2&quot;
let number2 = Int(doubleString)

type(of: number2)
// 결과 : Int
print(number2)
// 결과 : nil</code></pre>
</li>
</ul>
<p><br/><br/></p>
<h2 id="6-타입-애일리어스type-alias">6) 타입 애일리어스(Type Alias)</h2>
<p>: <strong>프로그래밍에서 (수학의)치환과 동일한 문법</strong> (타입만 치환 시켜서 사용가능)</p>
<pre><code class="language-swift">typealias Name = String</code></pre>
<pre><code class="language-swift">typealias Something = (Int) -&gt; String

func someFunction(completionHandler: (Int) -&gt; String) {

}

func someFunction2(completionHandler: Something) {

}</code></pre>
<br/>

<p>❓ <em>타입 애일리어스는 왜 써</em></p>
<p>: 길게 쓸때 유용하고, 문법이 간단해진다. ( 코드의 가독성을 높이기 위해 )</p>
<p><br/><br/></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Swift] 변수와 상수]]></title>
            <link>https://velog.io/@jihae__qu/Swift-%EB%B3%80%EC%88%98%EC%99%80-%EC%83%81%EC%88%98</link>
            <guid>https://velog.io/@jihae__qu/Swift-%EB%B3%80%EC%88%98%EC%99%80-%EC%83%81%EC%88%98</guid>
            <pubDate>Wed, 06 Mar 2024 08:37:14 GMT</pubDate>
            <description><![CDATA[<h2 id="1-변수-variables-">1) 변수( variables )</h2>
<p>: 데이터를 담을 수 있는 공간</p>
<center><img src = "https://velog.velcdn.com/images/jihae__qu/post/fb17dae5-44be-44fd-98cd-fa9cbf387655/image.jpg" width = "300" height = "300" ></center>


<p>→ 바구니라고 생각하면 편하다.</p>
<br/>

<ul>
<li>변수는 짧게 줄여서 <strong><em>var</em></strong>로 선언을 한다.</li>
</ul>
<pre><code class="language-swift">**var** a = 3
**var** b = 7

print(a + b)</code></pre>
<ul>
<li>변수를 여러개 한꺼번에 선언하는 방법: ,(콤마)로 연결</li>
</ul>
<pre><code class="language-swift">**var** x = 1, y = 2, z = 3</code></pre>
<br/>

<h3 id="변수의-이름-짓기-규칙">변수의 이름 짓기 규칙</h3>
<ul>
<li>첫 글자에 숫자가 오는 것이 불가능 ( 중간에는 가능 )</li>
<li>첫 글자는 소문자로 시작하는 것을 권장</li>
<li>음절을 구분할 땐 뒷음절의 첫 글자를 대문자로 표기하여 구분 ( 카멜 표기법 )</li>
</ul>
<pre><code class="language-swift">var realName = &quot;배지해&quot;</code></pre>
<p>→ 특수문자, 한자, 한글 등이 사용가능 하지만 관습상 쓰지 않음</p>
<br/>

<h3 id="변수를-문자열안에서-출력하기">변수를 문자열안에서 출력하기</h3>
<ul>
<li>변수에 문자열을 저장할 땐 “ “(큰 따옴표)를 쓴다.</li>
</ul>
<pre><code class="language-swift">var name = &quot;홍길동&quot;
var age = 20
var address = &quot;서울 강남구&quot;</code></pre>
<br/>

<p>✔️ <strong>String Interporation ( 문자열 보간법 )</strong></p>
<ul>
<li>문자열 중간에 <strong>(변수명)</strong> 을 삽입하여 문자열을 출력한다.</li>
</ul>
<pre><code class="language-swift">print(“저의 이름은 \(name)입니다. 나이는 \(age)살 이고, \(address)에 살고 있습니다.”)</code></pre>
<p><br/><br/></p>
<h2 id="2-상수-constants-">2) 상수( constants )</h2>
<p>: <strong>변하지 않는 데이터</strong>를 담을 수 있는 공간</p>
<br/>

<p>❓ <em>변수가 있는데 굳이 상수를 사용하는 이유</em>
: 특정 의미를 강조하고 가독성을 위해서 사용한다.</p>
<ul>
<li>상수는 짧게 줄여서 <strong><em>let</em></strong>로 선언을 한다.</li>
</ul>
<pre><code class="language-swift">let name2 = &quot;김철수&quot;</code></pre>
<p>→ 밑의 코드에서 상수 name2를 다른 값으로 변경하려고 하면 에러가 남.</p>
<p><br/><br/></p>
<h2 id="3-변수의-선언과-저장">3) 변수의 선언과 저장</h2>
<pre><code class="language-swift">var num: Int
num = 10</code></pre>
<p>→ Int 형 변수 num을 선언하면 메모리에 num이라는 변수 영역이 생긴다.</p>
<p>→ 변수 num에 10값을 저장하면 num이라는 변수 영역에 10이 저장된다.</p>
<pre><code class="language-swift">var a: Int = 3</code></pre>
<p>→ 변수를 선언하면서 저장할 수도 있다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[24/3/6] 소수 만들기]]></title>
            <link>https://velog.io/@jihae__qu/2436-%EC%86%8C%EC%88%98-%EB%A7%8C%EB%93%A4%EA%B8%B0</link>
            <guid>https://velog.io/@jihae__qu/2436-%EC%86%8C%EC%88%98-%EB%A7%8C%EB%93%A4%EA%B8%B0</guid>
            <pubDate>Wed, 06 Mar 2024 01:06:29 GMT</pubDate>
            <description><![CDATA[<p>🍄 코딩테스트 
<a href="https://school.programmers.co.kr/learn/courses/30/lessons/12977">코딩테스트 문제 풀이</a></p>
<p>✍🏻 Github</p>
<p><a href="%5Bhttps://github.com/BaeJihae/-Swift-CodingTest/blob/main/%5B%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4%5D/1-%EC%97%B0%EC%8A%B5/12977_%EC%86%8C%EC%88%98%EB%A7%8C%EB%93%A4%EA%B8%B0.swift%5D(https://github.com/BaeJihae/-Swift-CodingTest/blob/main/%5B%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4%5D/1-%EC%97%B0%EC%8A%B5/12977_%EC%86%8C%EC%88%98%EB%A7%8C%EB%93%A4%EA%B8%B0.swift)">문제 풀이 github 링크</a></p>
<h3 id="문제-설명">문제 설명</h3>
<p>주어진 숫자 중 3개의 수를 더했을 때 소수가 되는 경우의 개수를 구하려고 합니다. 숫자들이 들어있는 배열 nums가 매개변수로 주어질 때, nums에 있는 숫자들 중 서로 다른 3개를 골라 더했을 때 소수가 되는 경우의 개수를 return 하도록 solution 함수를 완성해주세요.</p>
<p><strong>제한사항</strong></p>
<ul>
<li>nums에 들어있는 숫자의 개수는 3개 이상 50개 이하입니다.</li>
<li>nums의 각 원소는 1 이상 1,000 이하의 자연수이며, 중복된 숫자가 들어있지 않습니다.</li>
</ul>
<p><strong>입출력 예</strong></p>
<table>
<thead>
<tr>
<th>nums</th>
<th>result</th>
</tr>
</thead>
<tbody><tr>
<td>[1,2,3,4]</td>
<td>1</td>
</tr>
<tr>
<td>[1,2,7,6,4]</td>
<td>4</td>
</tr>
</tbody></table>
<p><strong>입출력 예 설명</strong></p>
<pre><code>입출력 예 #1

[1,2,4]를 이용해서 7을 만들 수 있습니다.

입출력 예 #2

[1,2,4]를 이용해서 7을 만들 수 있습니다.

[1,4,6]을 이용해서 11을 만들 수 있습니다.

[2,4,7]을 이용해서 13을 만들 수 있습니다.

[4,6,7]을 이용해서 17을 만들 수 있습니다.</code></pre><hr>
<h3 id="문제-풀이">문제 풀이</h3>
<p><strong>나의 풀이</strong></p>
<p>첫번째 풀이는 시간초과로 인한 오답이 떴다.</p>
<pre><code class="language-swift">func calculaterPrimeNumber(_ n: Int) -&gt; Bool {
    (1...n).filter{ n % $0 == 0 }.count == 2
}</code></pre>
<p>시간을 조금더 줄이기 위해서 소수를 푸는 함수에서 1과 자기자신의 비교를 빼고 진행하였다.</p>
<pre><code class="language-swift">import Foundation

func solution(_ nums:[Int]) -&gt; Int {
    var answer = 0
    for i in 0..&lt;nums.count-2 {
        for j in i+1..&lt;nums.count-1 {
            for k in j+1..&lt;nums.count {
                answer += calculaterPrimeNumber(nums[i] + nums[j] + nums[k]) ? 1 : 0
            }
        }
    }
    return answer
}
func calculaterPrimeNumber(_ n: Int) -&gt; Bool {
    (2..&lt;n).filter{ n % $0 == 0 }.count == 0
}</code></pre>
<pre><code class="language-swift">테스트 1 〉    통과 (44.99ms, 16.4MB)
테스트 2 〉    통과 (65.09ms, 16.1MB)
테스트 3 〉    통과 (12.67ms, 16.3MB)
테스트 4 〉    통과 (9.13ms, 16.4MB)
테스트 5 〉    통과 (67.15ms, 16.6MB)
테스트 6 〉    통과 (861.58ms, 16.5MB)
테스트 7 〉    통과 (24.79ms, 16.5MB)
테스트 8 〉    통과 (1621.68ms, 16MB)
테스트 9 〉    통과 (136.97ms, 16.3MB)
테스트 10 〉    통과 (2041.98ms, 16.3MB)
테스트 11 〉    통과 (3.24ms, 16.3MB)
테스트 12 〉    통과 (0.86ms, 16.2MB)
테스트 13 〉    통과 (2.38ms, 16.4MB)
테스트 14 〉    통과 (0.96ms, 16.3MB)
테스트 15 〉    통과 (0.69ms, 16.1MB)
테스트 16 〉    통과 (6212.07ms, 16.6MB)
테스트 17 〉    통과 (7658.00ms, 16.4MB)
테스트 18 〉    통과 (47.01ms, 15.9MB)
테스트 19 〉    통과 (0.90ms, 16.1MB)
테스트 20 〉    통과 (7668.19ms, 16.4MB)
테스트 21 〉    통과 (6374.08ms, 16.3MB)
테스트 22 〉    통과 (1427.69ms, 16.3MB)
테스트 23 〉    통과 (0.07ms, 16.2MB)
테스트 24 〉    통과 (6291.97ms, 16.4MB)
테스트 25 〉    통과 (6818.84ms, 16.5MB)
테스트 26 〉    통과 (0.07ms, 16MB)</code></pre>
<p>소수를 찾기 위해서 어쩔 수 없이 반복문을 돌아야하는데 이를 줄일 방법을 더 찾아보기 위해서 고민을 해보았지만, 떠오르는 게 없었다.</p>
<p>유클리드 호제법은 약수의 개수를 찾기 위해서 사용했던 것 같은데.. 소수에도 적용이 가능하냐는 고민을 했던거 같다.</p>
<p>for문을 forEach로 바꾸면 조금 더 시간을 줄일 수 있으려나..?</p>
<pre><code class="language-swift">import Foundation

func solution(_ nums:[Int]) -&gt; Int {
    var answer = 0
    let numCount = nums.count

    (0..&lt;numCount-2).forEach{ a in
        (a+1..&lt;numCount-1).forEach{ b in
            (b+1..&lt;numCount).forEach { c in
                answer += calculaterPrimeNumber(nums[a] + nums[b] + nums[c]) ? 1 : 0
            }
        }
    }

    return answer
}
func calculaterPrimeNumber(_ n: Int) -&gt; Bool {
    (2..&lt;n).filter{ n % $0 == 0 }.count == 0
}</code></pre>
<p>for 보다 forEach가 더 느리기 때문에 실행시간도 당연히 더 느려진다.</p>
<pre><code class="language-swift">테스트 1 〉    통과 (77.46ms, 16.6MB)
테스트 2 〉    통과 (84.20ms, 16.4MB)
테스트 3 〉    통과 (23.64ms, 16.2MB)
테스트 4 〉    통과 (14.08ms, 16.5MB)
테스트 5 〉    통과 (81.58ms, 16.4MB)
테스트 6 〉    통과 (1008.58ms, 16.4MB)
테스트 7 〉    통과 (24.58ms, 16.3MB)
테스트 8 〉    통과 (2069.57ms, 16.6MB)
테스트 9 〉    통과 (150.36ms, 16.5MB)
테스트 10 〉    통과 (2399.58ms, 16.4MB)
테스트 11 〉    통과 (3.56ms, 16.4MB)
테스트 12 〉    통과 (1.46ms, 16.4MB)
테스트 13 〉    통과 (4.83ms, 16.4MB)
테스트 14 〉    통과 (1.53ms, 16.5MB)
테스트 15 〉    통과 (0.68ms, 16.5MB)
테스트 16 〉    통과 (6453.26ms, 16.2MB)
테스트 17 〉    통과 (8351.00ms, 16.3MB)
테스트 18 〉    통과 (48.33ms, 16.5MB)
테스트 19 〉    통과 (0.88ms, 16.4MB)
테스트 20 〉    통과 (8251.90ms, 16.5MB)
테스트 21 〉    통과 (7166.18ms, 16.4MB)
테스트 22 〉    통과 (1526.53ms, 16.5MB)
테스트 23 〉    통과 (0.07ms, 16.1MB)
테스트 24 〉    통과 (5985.34ms, 16.6MB)
테스트 25 〉    통과 (6182.21ms, 16.2MB)
테스트 26 〉    통과 (0.13ms, 16.4MB)</code></pre>
<br/>

<p><strong>다른 사람 풀이</strong></p>
<pre><code class="language-swift">import Foundation

func solution(_ nums:[Int]) -&gt; Int {

    func isPrime(_ num: Int) -&gt; Bool {
        var n = 2
        while n &lt; num {
            if num % n == 0 { return false }
            n += 1
        }
        return true
    }

    var answer = 0

    for i in 0 ..&lt; nums.count - 2 {
        for j in i + 1 ..&lt; nums.count - 1 {
            for k in j + 1 ..&lt; nums.count {
                if isPrime(nums[i] + nums[j] + nums[k]) { answer += 1 }
            }
        }
    }
    return answer
}</code></pre>
<p>소수를 알 수 있으려면 무조건 반복문을 다 돌아야한다고 생각했는데 아니었다.</p>
<p>만약 중간에 나누어 지는 게 있다면 반복문을 빠져나가 false를 내보내면 된다.</p>
<p>다른 사람의 풀이에서 받아온 아이디어로 다시 코드를 짰다.</p>
<br/>


<p><strong>다른 사람의 풀이를 참고한 나의 풀이</strong></p>
<pre><code class="language-swift">import Foundation

func solution(_ nums:[Int]) -&gt; Int {
    var answer = 0
    let numsCount = nums.count

    for i in 0..&lt;numsCount-2 {
        for j in i+1..&lt;numsCount-1 {
            for k in j+1..&lt;numsCount {
                answer += isPrimeNumber(nums[i] + nums[j] + nums[k]) ? 1 : 0
            }
        }
    }
    return answer
}

func isPrimeNumber(_ n: Int) -&gt; Bool {
    for i in (2..&lt;n) {
        if n % i == 0 {
            return false
        }
    }
    return true
}</code></pre>
<pre><code class="language-swift">테스트 1 〉    통과 (0.81ms, 16.4MB)
테스트 2 〉    통과 (1.08ms, 16.3MB)
테스트 3 〉    통과 (0.23ms, 16.2MB)
테스트 4 〉    통과 (0.16ms, 16.4MB)
테스트 5 〉    통과 (1.19ms, 16.2MB)
테스트 6 〉    통과 (13.09ms, 16.4MB)
테스트 7 〉    통과 (0.28ms, 16.3MB)
테스트 8 〉    통과 (16.21ms, 16.4MB)
테스트 9 〉    통과 (1.37ms, 16.3MB)
테스트 10 〉    통과 (15.44ms, 16.4MB)
테스트 11 〉    통과 (0.05ms, 16.3MB)
테스트 12 〉    통과 (0.04ms, 16.6MB)
테스트 13 〉    통과 (0.08ms, 16.3MB)
테스트 14 〉    통과 (0.03ms, 16.5MB)
테스트 15 〉    통과 (0.03ms, 16.5MB)
테스트 16 〉    통과 (48.69ms, 16.5MB)
테스트 17 〉    통과 (0.84ms, 16.4MB)
테스트 18 〉    통과 (0.80ms, 16.2MB)
테스트 19 〉    통과 (0.06ms, 16.4MB)
테스트 20 〉    통과 (98.30ms, 16.5MB)
테스트 21 〉    통과 (53.67ms, 16.5MB)
테스트 22 〉    통과 (0.35ms, 16.6MB)
테스트 23 〉    통과 (0.01ms, 16.3MB)
테스트 24 〉    통과 (47.29ms, 16.4MB)
테스트 25 〉    통과 (61.05ms, 16.5MB)
테스트 26 〉    통과 (0.02ms, 16.5MB)</code></pre>
<p>역시나 시간을 훨~~씬 줄일 수 있었다.</p>
<br/>

<h3 id="중요한-개념">중요한 개념</h3>
<ul>
<li>소수인지 아닌지를 판별할 때는 반복문을 처음부터 끝까지 돌리지 않고, 조건에 부합하지 않는다면 바로 빠져나오게 코드를 짜면 시간을 훨씬 줄일 수 있다.</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[TIL] 정리할게 너무나 많아요..]]></title>
            <link>https://velog.io/@jihae__qu/TIL-%EC%A0%95%EB%A6%AC%ED%95%A0%EA%B2%8C-%EB%84%88%EB%AC%B4%EB%82%98-%EB%A7%8E%EC%95%84%EC%9A%94</link>
            <guid>https://velog.io/@jihae__qu/TIL-%EC%A0%95%EB%A6%AC%ED%95%A0%EA%B2%8C-%EB%84%88%EB%AC%B4%EB%82%98-%EB%A7%8E%EC%95%84%EC%9A%94</guid>
            <pubDate>Tue, 05 Mar 2024 13:33:52 GMT</pubDate>
            <description><![CDATA[<br/>
<br/>
<br/>
오늘은 정리할게 너무나 많은 날이네요..
저번주 하루를 통째로 결석해버린 탓에 저번주에 끝냈어야할 정리들을 아직도 하고 있어요..
주말에 할 수 있었음에도 논 나를 탓하리!

<p>머릿속에 들어온 개념들과 벨로그에 정리하고 싶은 내용들은 많은 데 많은 양을 못쳐내고 있는 오늘입니다.
강의도 들어야하고, 새로운 개념들도 어서 정리해야할텐데 말이죠!</p>
<p>우선 오늘의 TIL을 적어봅시다.</p>
<br/>

<hr>
<br/>

<h2 id="tuple의-인스턴스에-이름-설정-가능"><strong>Tuple</strong>의 인스턴스에 이름 설정 가능!</h2>
<pre><code class="language-swift">  let case = (
      a: [1, 2, 3, 4, 5],
      b: [1, 2, 3, 5, 2, 3],
      c: [1, 3, 4, 2, 3, 4, 5, 6]
  )</code></pre>
<p>다른 사람의 풀이 중에서 이런 코드를 확인했는데 이게 대체 뭐지..? 싶었어요.
구글링을 뭐라고 해야할지도 감이 잡히지 않아 튜터님께 질문을 드렸어요!</p>
<p>tuple 타입인데, 인스턴스의 이름을 넣어서 깔끔하게 정리한 코드라는 답변을 받았습니다.
여기서 하나를 더 깨달았죵.. &#39;아.. 나 Tuple에 대해서 잘 모르는 구나..&#39;</p>
<p>당장 Tuple 공부 시작해!해서
Tuple에 대해서 학습하였습니다.</p>
<p><a href="https://velog.io/@jihae__qu/2436-%EB%AA%A8%EC%9D%98%EA%B3%A0%EC%82%AC">velog_모의고사</a>
자세한 내용은 위의 링크를 참고해주세요!</p>
<p>Tuple은 배열과 딕셔너리와는 다르게 하나의 변수나 상수에 여러 가지 타입을 정렬할 수 있는 타입입니다. 각 요소에 대한 접근은 요소의 인덱스를 사용하여 접근하고, 인덱스 대신에 위의 코드처럼 인스턴스의 이름을 넣어서 인스턴스 이름으로 접근도 가능합니다. tuple을 통째로 다른 변수의 튜플에 대입을 시켜 사용할 수도 있고, 함수의 리턴값으로도 사용할 수 있습니다.</p>
<br/>
<br/>

<h2 id="커리큘럼-매니저님의-학습법-특강">커리큘럼 매니저님의 학습법 특강</h2>
<p>오늘은 유OO 커리큘럼 매니저님의 학습법에 대한 특강이 있으셨어요.
앞으로의 4개월동안 어떤 마음가짐으로 어떻게 학습해야하는지에 대한 방향성의 이야기였습니다.</p>
<p>오늘 특강 중 가장 기억에 남는 말은</p>
<blockquote>
<p><strong>여러분은 예비 개발자가 아니라 주니어 개발자입니다.</strong></p>
</blockquote>
<p>이었어요.</p>
<p>저는 항상 저를 소개할 때 &#39;예비 iOS 개발자 배지해입니다.&#39;라고 소개했어요.
그러면서 가까운 미래에는 &#39;iOS 개발자 배지해입니다.&#39; 라고 소개하고 싶다라고 생각을 했죠.</p>
<p>하지만 오늘 특강을 듣고는 마인드를 바꾸기로 했습니다.
&#39;예비 그딴거 치우고 나는 오늘부터 <strong>주니어 개발자</strong>이다.&#39;
라는 생각으로 코딩과 팀플과 그 이외의 모든 학습에 임하기로 했습니다.</p>
<br/>


<p><strong>[ 학습방법 ]</strong></p>
<ol>
<li>로직과 코드에 대한 <strong>&quot;의도&quot;</strong> 생각하기</li>
<li>구현하는 기술, 스택에 <strong>목적과 근거</strong>를 가지기</li>
<li>내가 선택한 방법이 항상 옳고 좋은 것이라고 생각하지 않기</li>
</ol>
<p>매니저님께서 지속적으로 강조하신건 모든 코드에 의문점을 가지라는 것이었어요. 아주 사소한 것이라도 물음표를 찍고, 거기에 대한 해답을 스스로 찾아가보라고..</p>
<p>개발자가 가져야하는 가장 중요한 덕목이라고 생각을 하고 인지는 하고 있는 데 마음처럼 쉽지가 않더라구요..
하지만, 오늘부터 저의 모든 코드에 이유를 만들고, 다른 사람의 모든 코드에 의문점을 가지기로 하였습니다. 내가 나의 코드에 대한 목적과 근거를 설명할 수 없다면 그건 내가 짠 코드가 아니다! 라고 생각하기로 했어요.</p>
<blockquote>
<p>모든 것에 의문을 갖고 그 해결점을 찾아서 기록하며 내것으로 만들자!</p>
</blockquote>
<p>또한 내가 선택한 방법이 항상 좋은 방법이 아니라 더 좋은 방법을 항상 고민하고 실현해야한다라는 말이 정말 와닿았어요. 사실 팀플을 진행하며 속으로 &#39;이게 맞는 거 같은데..&#39;라는 생각을 한적도 있었어요. 그 생각이 틀렸다라는 것을 깨닫게 되었습니다. 내가 생각한 것이 다 맞는 건 아니라는 것을 항상 가슴속에 새겨놓고 문제점을 바라보기로 하였어요.</p>
<br/>

<p><strong>[ 협업하기 ]</strong></p>
<ol>
<li>예쁘게 말하기</li>
<li>전달하고자 하는 바를 <strong>명확하게</strong> 말하기</li>
<li>데이터 또는 기술적인 <strong>근거를 바탕으로 소통</strong>하기</li>
</ol>
<p>코더가 아닌 개발자가 되기 위해서는 소프트 스킬이 매우매우매우 중요하다고 하셨어요. </p>
<p>&#39;이게 아닌데&#39;라고 생각이 되더라도 둥글게 말하고 전달하는 것을 연습해야겠어요. 똑같은 이야기와 요구를 하더라도 말이 아다르고 어다르기 때문에 팀을 좋은 방향으로 이끌어가기 위해서는 꼭 필요한 스킬이라고 생각이 들었습니다. 상대방의 기분을 위해 말을 돌려서 하더라도 내가 전달하고자 하는 바는 명확히 이야기해야할 것 같아요!</p>
<p>또한 내가 의견을 내세울 때는 그 의견에 뒷받침되는 기술적인 근거가 무조건 있어야 하구나도 깨달았어요. 무작정 &#39;그냥요&#39;가 아닌 이러해서 저러하기 때문에 이게 더 좋을 것 같아요~! 라고 이야기할 수 있어야한다는 것! 아주 깊이 이해하였습니다.</p>
<br/>

<p>한시간의 특강동안 깨달은 것도 배운 것도 많은 것 같아요.</p>
<p>*<em>개발자에게 &quot;그냥&quot;이라는 단어는 없다!
*</em></p>
<hr>
<p>오늘은 여기까지하고 이만 자야겠네요!!</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Git & Github 기초 완벽히 떼기 - 1]]></title>
            <link>https://velog.io/@jihae__qu/Git-Github-%EA%B8%B0%EC%B4%88-%EC%99%84%EB%B2%BD%ED%9E%88-%EB%96%BC%EA%B8%B0-1</link>
            <guid>https://velog.io/@jihae__qu/Git-Github-%EA%B8%B0%EC%B4%88-%EC%99%84%EB%B2%BD%ED%9E%88-%EB%96%BC%EA%B8%B0-1</guid>
            <pubDate>Tue, 05 Mar 2024 12:02:36 GMT</pubDate>
            <description><![CDATA[<p>안녕하세요! 째입니다🤵🏻</p>
<p>Git은 쓸때마다 헷갈리고 순서 잊어버려서
구글 검색으로 명령어 찾아보고..
이제 그거 안할렵니다!</p>
<p>오늘부로 Git 명령어 안찾아볼 수 있도록 마스터한다!!</p>
<br/>

<p><em>이 포스팅은 “예병수 튜터”님께서 특강해주신 내용들을 바탕으로 작성되었습니다👏🏻</em></p>
<p><br/><br/></p>
<hr>
<br/>


<h2 id="git과-github란">Git과 Github란?</h2>
<br/>

<p>Git과 Github 같은거 아냐?!
아뇨! 다릅니다!</p>
<blockquote>
<p><strong>Git 이란?</strong>
코드 변경점을 기록하는 도구</p>
</blockquote>
<p>어려운 말로 <strong>Git</strong> 은 “버전 관리 도구” ( 형상 관리 도구 ) 라고 합니다. “버전관리도구..?” 그게 뭔데! 말이 왜이렇게 어려워! 쉽게 말해서 작업하고 있는 프로젝트( 소프트 웨어 )의 변경사항이 시간 순서대로 정리되어 기록되고 관리할 수 있도록 도와주는 도구에요.</p>
<p>내가 프로젝트를 만들면서 새로 적은 코드, 수정한 코드, 삭제한 코드가 다~~ 기록된다고 생각하시면 됩니다. 내가 수정한 사항들이 기록이 되어있으니깐 파일을 잘못 수정하였어도 에러가 발생하더라도 과거의 코드로 쉽게 돌릴 수도 있는거죠. 그 덕에 파일과 폴더를 따로 복사하여 진행하지 않아도 되는거죠!  </p>
<br/>

<p>그럼 Github는 뭔데?!?!</p>
<blockquote>
<p><strong>Github 이란?</strong>
온라인에 파일을 백업하고, 그 파일을 다른 사람들과 공유하고, 팀과 협업할 수 있는 프로그램</p>
</blockquote>
<p>그냥 Github는 “백업, 공유, 협업” 이 세 단어로 정리할 수 있어요! Git에서 나의 업데이트과정을 기록했다면, 그 과정을 정리해서 온라인 저장소에다가 업로드하는 거에요. 그럼 다른 사람들도 언제든지 나의 코드를 볼 수 있고 다운받을 수도 있으며, 수정도 가능한거죠!</p>
<br/>

<hr>
<h2 id="git-명령어-모음">Git 명령어 모음</h2>
<br/>

<blockquote>
<p><code>pwd</code> -  directory 주소
<code>ls</code> - directory 안의 폴더 리스트
<code>ls -a</code> - directory 안의 모든 폴더 리스트 ( 숨겨진 폴더 )
<code>cd 폴더명</code> - repository 변경
<code>cd ..</code> - 한 단계 위의 repository로 변경
    <code>cd 폴더명/폴더명</code> - 해당 repository로 한번에 이동
<code>mkdir 폴더명</code> - 폴더 생성
<code>touch 파일명</code> - 파일 생성 </p>
</blockquote>
<br/>

<h3 id="1-pwd">1. pwd</h3>
<p>: print working directory의 줄임말로 사용자가 위치해있는 directory의 주소를 알려주는 명령어</p>
<p>여기서 directory는 폴더라고 생각하시면 됩니다. print working directory를 해석하면 ‘ 내가 작업하고 있는 폴더를 보여줘!’ 라는 뜻이에요!</p>
<p><img src="https://velog.velcdn.com/images/jihae__qu/post/9876ad5d-1e06-46bd-bd22-2544b34fe5a2/image.png" alt="">
terminal에 pwd를 입력하니 제가 현재 위치하고 있는 directory가 뜨네요!</p>
<br/>

<p><strong>[ Terminal 창 여는 방법 ]</strong></p>
<ul>
<li><code>cmd + space</code> → Spotlight 창 → terminal 입력 → enter</li>
<li>Launchpad → 상단 검색창 → terminal 입력 → terminal 어플 클릭</li>
</ul>
<br/>

<h3 id="2-ls">2. ls</h3>
<p>: list의 줄임말로 home 안의 폴더 list를 보여주는 명령어</p>
<p><img src="https://velog.velcdn.com/images/jihae__qu/post/cc0ad5f6-ac45-4d78-b56e-6edf0e2638f5/image.png" alt=""></p>
<p>terminal에 ls를 입력하니 현재 제가 위치해있는 repository안의 폴더명을 보여주네요!</p>
<br/>

<h3 id="3-ls--a">3. ls -a</h3>
<p>: list all의 줄임말로 home 안의 폴더 list 뿐만 아니라 숨겨진 폴더까지 보여주는 명령어</p>
<p><img src="https://velog.velcdn.com/images/jihae__qu/post/5572a2bf-22a2-4f68-9890-2c106b07ae8f/image.png" alt=""></p>
<p>위의 ls와는 다른게 보이시나요?!?!
보시면 아시겠지만 보통 숨겨진 폴더들은 앞에 ‘.’이 붙어있어요!</p>
<br/>

<h3 id="4-cd-폴더명">4. cd 폴더명</h3>
<p>: change directory 의 줄임말로 현재 내가 위치해있는 repository를 변경하는 명령어</p>
<p><img src="https://velog.velcdn.com/images/jihae__qu/post/7a3021e6-2cde-40d7-bddc-484e98c7e349/image.png" alt=""></p>
<ul>
<li><p><code>cd ..</code>  : 한 단계 위의 repository로 이동</p>
</li>
<li><p><code>cd 폴더명/폴더명</code> : 해당 repository로 한번에 이등</p>
<p>  ex) cd Desktop/studying-swift</p>
</li>
</ul>
<br/>

<h3 id="5-mkdir-폴더명">5. mkdir 폴더명</h3>
<p>: make directory의 줄임말로 원하는 폴더를 만들 수 있는 명령어</p>
<p><img src="https://velog.velcdn.com/images/jihae__qu/post/d4b231aa-b684-45d0-91ad-f27d0a4a0caa/image.png" alt=""></p>
<p>폴더를 생성했는데, 폴더가 생기지 않길래 보니 directory가 desktop이 아니더라구요!</p>
<p><code>cd</code> 명령어로 원하는 directory로 이동한 후에 다시 <code>mkdir</code> 를 입력하여 폴더를 생성해주었습니다. 이번에는 정상적으로 바탕화면에 폴더가 하나 생겼네요!</p>
<p><img src="https://velog.velcdn.com/images/jihae__qu/post/d7e10d69-a8ea-4cf3-affc-33f9d8a78fa0/image.png" alt=""></p>
<p>꼭 원하는 directory에 가셔서 명령어를 입력해야합니다!</p>
<p>아님 저처럼 엉뚱한 곳에 폴더를 설치하시게 될거에요..ㅋㅋ</p>
<br/>

<h3 id="6-touch-파일명">6. touch 파일명</h3>
<p>: 원하는 파일을 만들 수 있는 명령어</p>
<p>정확히는 파일의 생성과 파일의 날짜, 시간을 변경하는 명령어라 touch라는 이름이 불여졌다고 합니다.</p>
<p><img src="https://velog.velcdn.com/images/jihae__qu/post/fa6b1f47-2d1e-4346-af1e-5b96b123ba28/image.png" alt="">
<img src="https://velog.velcdn.com/images/jihae__qu/post/3dbd1716-ff6f-4fb9-bcbe-065979fe544c/image.png" alt=""></p>
<p>위에서 생성한 test 폴더로 이동하여 touch 명령어를 이용해 swift 파일을 하나 생성하였습니다. 정상적으로 생성한 것을 확인해볼 수 있어요!</p>
<br/>
<br/>
<br/>

<p>github에 레포지토리를 생성하는 것과
git add/commit 명령어를 사용하는 방법은 다음 포스팅으로 찾아뵙겠습니다! </p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[미니프로젝트] 나만의 KDT]]></title>
            <link>https://velog.io/@jihae__qu/%EB%AF%B8%EB%8B%88%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-%EB%82%98%EB%A7%8C%EC%9D%98-KDT</link>
            <guid>https://velog.io/@jihae__qu/%EB%AF%B8%EB%8B%88%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-%EB%82%98%EB%A7%8C%EC%9D%98-KDT</guid>
            <pubDate>Tue, 05 Mar 2024 10:07:28 GMT</pubDate>
            <description><![CDATA[<br/>

<p>안녕하세요 째에요🩵
우선 저만의 회고록을 작성하기 전에 KPT가 무엇인지 알아보고 갑시다!</p>
<br/>

<hr>
<blockquote>
<p>** KPT란? **
매우 간단한 애자일 회고 방법론으로 Keep, Problem, Try의 줄임말이다.</p>
</blockquote>
<ul>
<li><strong>Keep</strong> : 현재 만족하는 부분과 계속 이루어졌으면 하는 부분</li>
<li><strong>Problem</strong> : 불편 또는 불만을 느끼는 부분, 개선이 필요하다고 생각되는 부분, 잠재적인 문제<ul>
<li>문제점 : 이번 프로젝트에서 발생한 <strong>문제점</strong>을 객관적으로 판단</li>
<li>해결 방안 : 해당 문제점을 <strong>해결할 수 있는 현실적인 방안</strong> 제시</li>
</ul>
</li>
<li><strong>Try</strong> : 다음 프로젝트를 위해 해야 할 노력<ul>
<li>Feel : 이번 프로젝트를 통해 느낀 점</li>
</ul>
</li>
</ul>
<hr>
<br/>
<br/>

<h2 id="☑️-keep">☑️ Keep</h2>
<p>프로젝트 기간 동안의 저희 팀 내에서의 의사 소통 방면에서 아주 만족하고 있습니다. 팀원들 모두가 서로 의견을 존중해주는 자세를 기본적으로 깔고 있었어요. 상대방에게 자신의 의견을 내세워야 할 때도 상대방의 기분이 나쁘지 않게끔 예쁜 말들로 이야기를 주고 받았습니다. 그랬기에 말하는 사람도 듣는 사람도 적극적으로 의견을 수용할 수 있었고, 주눅들지 않고 자신의 의견을 PR했어요. 특히나 작은 것 하나라도 의사결정을 할 때엔 모든 사람들의 의견을 들어보려고 한 부분이 너무 좋았습니다.</p>
<p>전체적인 UI를 디자인 하려고 할 때도 한 분이 디자인하고 설계하는 것이 아닌 모든 사람들이 개인의 디자인을 가지고 와서 함께 소통하고 그 과정에서 의견을 합쳐서 최종적인 UI를 만들어내는 과정이 좋았습니다. 그래서 팀원 모두가 UI에 대한 자부심과 애착을 가질 수도 있었던 것 같아요.</p>
<p>저 개인적으로는 다른 팀원들에게 생긴 문제점도 적극적으로 나서서 도와주려고 했던 자세입니다. 나의 역할이 끝났다는 것에서 끝내지 않고, 적극적으로 팀원들을 도와주려고 했어요. 그 부분에서 저 스스로도 성장할 수 있는 계기가 되었습니다.</p>
<br/>
<br/>

<h2 id="☑️-problem">☑️ Problem</h2>
<p>처음부터 Github를 사용하여 프로젝트를 만들어 나갔더라면 좀 더 수월하게 작업하고 소통할 수 있었지 않았을 까하는 부분에서의 아쉬움이 있습니다. 이 부분은 저의 Github의 사용법과 병합 방법을 숙지하지 못했던 기술적인 문제이지 않나 싶습니다.</p>
<p>프로젝트를 구성할 때 더 다양한 기술이나 다양한 기능이 들어갔었으면 더 좋지 않았을까라는 생각이 듭니다. 프로젝트의 기간이 짧기도 했고 첫 프로젝트였다보니 구현해내지 못함에 대한 불안함이 있었습니다. &quot;할 수 있다&quot;, &quot;해보자&quot;라는 생각을 가지고 좀 더 많은 기능을 추가해서 구현하였다면 더 풍부한 프로젝트가 되지 않았을까 하는 아쉬움이 있습니다. 이 부분은 저의 개인 사정으로 인한 프로젝트의 마무리 단계에서 제가 참여하지 못한다라는 것에서 기능 추가를 주춤했던 저의 문제점이 아니었나 싶습니다.</p>
<p><br/><br/></p>
<h2 id="☑️-try">☑️ Try</h2>
<h3 id="기술적-측면에서의-git-사용-부재에-대한-try">기술적 측면에서의 Git 사용 부재에 대한 Try</h3>
<p>Git과 Github에 대한 개인적인 공부를 하여 직접 사용해보고, 연습해보고 통합해보는 시도를 해보기로 하였습니다.</p>
<h3 id="구상-과정에-대한-회고">구상 과정에 대한 회고</h3>
<p>다음 프로젝트에서는 구현하고 싶었던 기능을 자신감있게 추가해보고, 시도해보기로 하였습니다.</p>
<p><br/><br/></p>
<h2 id="☑️-feel">☑️ Feel</h2>
<p>이번 프로젝트를 통해 나는 앱 개발하는 것이 즐겁고 재밌다라는 사실을 한번 더 깨달았습니다. 나의 아이디어로 나의 손으로 만들어진 앱을 볼 때면 너무나 뿌듯하고, 즐겁습니다.</p>
<p>또한 팀프로젝트를 통해서 팀원들과 어떻게 소통하고 더 좋은 방향으로 팀을 이끌어 가기 위해서는 어떤 스탠스를 취해야 하는지를 알게 되었던 것 같습니다. 팀원들의 자세에서 많은 것을 배웠어요. 다른 사람에게 칭찬을 아끼지 않는 팀원들을 보면서 더더욱 어떤 개발자가 되어야 할지 확신이 섰던 것 같습니다.</p>
<p><br/><br/></p>
<h3 id="참고사이트">참고사이트</h3>
<p>📄 <a href="https://www.designsori.com/zero/1157702">https://www.designsori.com/zero/1157702</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[24/3/6] 모의고사]]></title>
            <link>https://velog.io/@jihae__qu/2436-%EB%AA%A8%EC%9D%98%EA%B3%A0%EC%82%AC</link>
            <guid>https://velog.io/@jihae__qu/2436-%EB%AA%A8%EC%9D%98%EA%B3%A0%EC%82%AC</guid>
            <pubDate>Tue, 05 Mar 2024 08:02:16 GMT</pubDate>
            <description><![CDATA[<p>🍄 코딩테스트 
<a href="https://school.programmers.co.kr/learn/courses/30/lessons/42840">코딩테스트 문제 풀이</a></p>
<p>✍🏻 Github</p>
<p><a href="%5Bhttps://github.com/BaeJihae/-Swift-CodingTest/blob/main/%5B%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4%5D/1-%EC%97%B0%EC%8A%B5/42840_%EB%AA%A8%EC%9D%98%EA%B3%A0%EC%82%AC.swift%5D(https://github.com/BaeJihae/-Swift-CodingTest/blob/main/%5B%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4%5D/1-%EC%97%B0%EC%8A%B5/42840_%EB%AA%A8%EC%9D%98%EA%B3%A0%EC%82%AC.swift)">문제 풀이 github 링크</a></p>
<h3 id="문제-설명">문제 설명</h3>
<p>수포자는 수학을 포기한 사람의 준말입니다. 수포자 삼인방은 모의고사에 수학 문제를 전부 찍으려 합니다. 수포자는 1번 문제부터 마지막 문제까지 다음과 같이 찍습니다.</p>
<p>1번 수포자가 찍는 방식: 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, ...</p>
<p>2번 수포자가 찍는 방식: 2, 1, 2, 3, 2, 4, 2, 5, 2, 1, 2, 3, 2, 4, 2, 5, ...</p>
<p>3번 수포자가 찍는 방식: 3, 3, 1, 1, 2, 2, 4, 4, 5, 5, 3, 3, 1, 1, 2, 2, 4, 4, 5, 5, ...</p>
<p>1번 문제부터 마지막 문제까지의 정답이 순서대로 들은 배열 answers가 주어졌을 때, 가장 많은 문제를 맞힌 사람이 누구인지 배열에 담아 return 하도록 solution 함수를 작성해주세요.</p>
<p><strong>제한 조건</strong></p>
<ul>
<li>시험은 최대 10,000 문제로 구성되어있습니다.</li>
<li>문제의 정답은 1, 2, 3, 4, 5중 하나입니다.</li>
<li>가장 높은 점수를 받은 사람이 여럿일 경우, return하는 값을 오름차순 정렬해주세요.</li>
</ul>
<p><strong>입출력 예</strong></p>
<table>
<thead>
<tr>
<th>answers</th>
<th>return</th>
</tr>
</thead>
<tbody><tr>
<td>[1,2,3,4,5]</td>
<td>[1]</td>
</tr>
<tr>
<td>[1,3,2,4,2]</td>
<td>[1,2,3]</td>
</tr>
</tbody></table>
<p><strong>입출력 예 설명</strong></p>
<p>입출력 예 #1</p>
<ul>
<li>수포자 1은 모든 문제를 맞혔습니다.</li>
<li>수포자 2는 모든 문제를 틀렸습니다.</li>
<li>수포자 3은 모든 문제를 틀렸습니다.</li>
</ul>
<p>따라서 가장 문제를 많이 맞힌 사람은 수포자 1입니다.</p>
<p>입출력 예 #2</p>
<ul>
<li>모든 사람이 2문제씩을 맞췄습니다.</li>
</ul>
<hr>
<h3 id="문제-풀이">문제 풀이</h3>
<br/>

<p><strong>나의 풀이</strong></p>
<pre><code class="language-swift">import Foundation

func solution(_ answers:[Int]) -&gt; [Int] {

    // 수포자들의 답안지
    let case1 = [1,2,3,4,5]
    let case2 = [2,1,2,3,2,4,2,5]
    let case3 = [3,3,1,1,2,2,4,4,5,5]

    // 맞춘 개수
    var answersCount: [Int] = [0,0,0]

    for i in 0..&lt;answers.count {
        if case1[i%5] == answers[i%answers.count] {
            answersCount[0] += 1
        }
        if case2[i%8] == answers[i%answers.count] {
            answersCount[1] += 1
        }
        if case3[i%10] == answers[i%answers.count] {
            answersCount[2] += 1
        }
    }

    return answersCount.enumerated().filter{ $0.element == answersCount.max()! }.map{ $0.offset + 1 }
}</code></pre>
<p>처음에는 문제를 잘 이해하지 못했던 것 같다.</p>
<p>예시와 더불어 반복해서 읽어보니 어떻게 풀어야할지가 보였고,</p>
<p>배열의 나머지 연산을 이용해 반복적인 비교를 하였다.</p>
<p>완전 탐색으로 밖에 풀지 못하는 문제라 더 반복문을 만들려고만 하지 않았다.</p>
<p>맞춘 개수를 처음엔 변수로 나열하다가 마지막에 map을 써서 답을 도출해내고 싶어서 배열을 사용했다.</p>
<p>가장 많이 맞춘 사람의 번호를 출력하는 문제여서 배열의 최댓값을 이용해 가장 많이 맞춘 사람을 도출해냈고,</p>
<p>enumerated를 사용하여 그 사람의 인덱스 번호를 출력하였다.</p>
<br/>
<br/>

<p><strong>다른 사람 풀이</strong></p>
<pre><code class="language-swift">import Foundation

func solution(_ answers:[Int]) -&gt; [Int] {
    let answer = (
                a: [1, 2, 3, 4, 5], // index % 5
        b: [2, 1, 2, 3, 2, 4, 2, 5], // index % 8
        c: [3, 3, 1, 1, 2, 2, 4, 4, 5, 5] // index % 10
    )
    var point = [1:0, 2:0, 3:0]

    for (i, v) in answers.enumerated() {
        if v == answer.a[i % 5] { point[1] = point[1]! + 1 }
        if v == answer.b[i % 8] { point[2] = point[2]! + 1 }
        if v == answer.c[i % 10] { point[3] = point[3]! + 1 }
    }

    return point.sorted{ $0.key &lt; $1.key }.filter{ $0.value == point.values.max() }.map{ $0.key }
}</code></pre>
<br/>

<p><strong>⁉️ 상수 안에 배열을 어떻게 넣을 수 있나?!?</strong></p>
<p>위의 answer은 tuple 타입의 상수이다. 각각의 tuple의 요소에 배열을 넣고, 튜플의 파라미터인 배열에 이름을 붙인 것이다.</p>
<br/>

<p>학생 수가 3명 밖에 되지 않아서 굳이 Dictionary를 사용해서 풀지 않아도 되겠다고 생각했는데, 사람 수가 많아진다면 이 분의 풀이가 좀 더 유용할 것 같다.</p>
<br/>

<p><strong>⁉️ 딕셔너리의 값에 + 1 이라는 연산을 할 때, !를 붙여주는 이유는?!?!</strong></p>
<p>딕셔너리는 배열처럼 정해진 범위 안에서의 값이 아니기 때문에, 어떤 키값을 가지고 있는지 알 수가 없다.</p>
<p>애플에서는 딕셔너리에서 없는 키를 호출했을 때의 오류가 날 가능성을 생각하여 딕셔너리의 값을 옵셔널로 감싸두었다.</p>
<p>그래서 딕셔너리에서는 값을 불러올 때는 옵셔널을 한번 벗겨내야한다. </p>
<br/>
<br/>

<h3 id="중요한-개념">중요한 개념</h3>
<blockquote>
<p><strong>Tuple</strong> 이란?
배열과 딕셔너리와는 다르게 여러가지의 타입을 하나의 변수나 상수에 저장할 수 있는 타입이다.</p>
</blockquote>
<ul>
<li>Tuple은 여러 가지의 타입의 값을 () 소괄호로 묶어 정의한다.</li>
</ul>
<pre><code class="language-swift">let tuple1 = (0.1, 2, 3, &quot;String&quot;)</code></pre>
<ul>
<li>Tuple은 인덱스 속성을 이용하여 각각의 값에 접근한다.</li>
</ul>
<pre><code class="language-swift">print(tuple1.0) // 0.1
print(tuple1.1) // 2
print(tuple1.2) // 3
print(tuple1.3) // &quot;String&quot;</code></pre>
<ul>
<li>Tuple의 파라미터에 이름을 지정해줄 수 있다. ( 이 경우에도 인덱스 속성으로 접근 가능 )</li>
</ul>
<pre><code class="language-swift">let tuple2 = ( a: 0.1, b: 2, c: 3, d: &quot;String&quot;)

print(tuple2.a) // 0.1
print(tuple2.b) // 2
print(tuple2.c) // 3
print(tuple2.d) // &quot;String&quot;

print(tuple2.0) // 0.1</code></pre>
<ul>
<li>타입 어노테이션을 위한 타입 정의가 가능하다.</li>
</ul>
<pre><code class="language-swift">var tpl01: (Int, Int) = (100,200)
var tpl02: (Int, String, Int) = (100, &quot;a&quot;, 200)
var tpl03: (Int, (String, String)) = (100, (&quot;t&quot;, &quot;v&quot;))
var tpl04: (String) = (&quot;sample string&quot;)</code></pre>
<p>이 때, <code>tpl04</code>를 주목해보면 튜플로 선언을 하였더라도 튜플 안의 요소가 1개 밖에 저장되어 있지 않다면, 일반 자료형으로 선언이 된다.</p>
<pre><code class="language-swift">print(type(of: tpl04)) //String</code></pre>
<ul>
<li>타입 어노테이션을 지정해주지 않는다면?!</li>
</ul>
<p><code>1</code>은 <code>Int</code>로 <code>“안녕하세요”</code>는 <code>String</code>으로 컴파일러가 자동으로 타입 추론을 하여 타입을 정의내린다.</p>
<p>하지만 <code>0.1</code>과 같은 값들은 <code>float</code>도 가능하고 <code>Double</code>로도 정의가 가능하다. 이럴 땐 더 상위 타입으로 정의가 된다. 그러므로 <code>“a”</code>는 <code>String</code>로 정의된다.</p>
<blockquote>
<p><strong>타입 어노테이션(Type Annotation) 이란?</strong>
자료형을 지정해주는 것이다.
예를 들어 <code>var a: Int = 1</code> 와 같이 <code>a</code>라는 변수를 선언할 때 <code>: Int</code> 로 이 변수의 타입을 개발자가 지정해주는 것이다.</p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[🍎 공부할 때 참고하기 좋은 Apple 공식 자료 모임]]></title>
            <link>https://velog.io/@jihae__qu/%EA%B3%B5%EB%B6%80%ED%95%A0-%EB%95%8C-%EC%B0%B8%EA%B3%A0%ED%95%98%EA%B8%B0-%EC%A2%8B%EC%9D%80-Apple-%EA%B3%B5%EC%8B%9D-%EC%9E%90%EB%A3%8C-%EB%AA%A8%EC%9E%84</link>
            <guid>https://velog.io/@jihae__qu/%EA%B3%B5%EB%B6%80%ED%95%A0-%EB%95%8C-%EC%B0%B8%EA%B3%A0%ED%95%98%EA%B8%B0-%EC%A2%8B%EC%9D%80-Apple-%EA%B3%B5%EC%8B%9D-%EC%9E%90%EB%A3%8C-%EB%AA%A8%EC%9E%84</guid>
            <pubDate>Tue, 05 Mar 2024 03:14:22 GMT</pubDate>
            <description><![CDATA[<h3 id="☑️-apple-developer-documentation-⭐️">☑️ <a href="https://developer.apple.com/documentation/">Apple Developer Documentation</a> ⭐️</h3>
<p>: iOS와 Swift 문법과 관련된 정보를 찾을 수 있다.</p>
<p><img src="https://velog.velcdn.com/images/jihae__qu/post/0ce9785c-02c8-4f25-a092-f68cb10a2636/image.png" alt=""></p>
<h3 id="☑️-swift-programming-language-guideeng-📄">☑️ <a href="https://docs.swift.org/swift-book/documentation/the-swift-programming-language/">Swift Programming Language Guide(ENG)</a> 📄</h3>
<p>: Swift 언어 사전</p>
<p><img src="https://velog.velcdn.com/images/jihae__qu/post/3435b077-4f44-4282-8167-64982bc3e312/image.png" alt=""></p>
<p>한국어로 변역되어 있는 사이트 → <a href="https://jusung.gitbook.io/the-swift-language-guide/">The Swift Language Guide(한국어)</a> 📄</p>
<h3 id="☑️-swift-api-design-guidelines-📄">☑️ <a href="https://www.swift.org/documentation/api-design-guidelines/">Swift API Design Guidelines</a> 📄</h3>
<p>: 네이밍 컨벤션을 정할 때 참고하면 좋은 API 디자인 가이드 라인</p>
<p><img src="https://velog.velcdn.com/images/jihae__qu/post/36129638-652e-4810-b826-dc97860ba683/image.png" alt=""></p>
<blockquote>
<p><strong>네이밍 컨벤션(Naming Convention)이란?</strong>
프로그래밍에서 변수, 함수, 클래스, 파일 등의 이름을 정하는데 쓰이는 규칙이나 관례</p>
</blockquote>
<p><strong>[ 네이밍 컨벤션(Naming Convention)의 종류 ]</strong></p>
<ul>
<li>⭐️ 카멜케이스 : 첫글자는 소문자로, 띄어쓰기 대신 대문자로 표시 <span style="color: blue"><strong>( Swift는 카멜케이스 사용 )</strong></span>
  예) baeJihae</li>
</ul>
<ul>
<li><p>파스칼케이스 : 첫글자도 대문자로, 띄어쓰기 대신 대문자로 표시</p>
<p>  예) BaeJihae</p>
</li>
<li><p>스네이크케이스 : 띄어쓰기를 _로 표시
  예) bae_jihae</p>
</li>
<li><p>케밥케이스 : 띄어쓰기를 -로 표시
  예) bae-jihae</p>
</li>
<li><p>헝가리안케이스 : 함수의 이름 앞에 변수의 타입 붙이는 방법
  → 코드의 가독성 높이고 버그를 방지
  예) strName</p>
</li>
</ul>
<h3 id="☑️-apple-developer-wwdc-videos--⭐️">☑️ <a href="https://developer.apple.com/videos/all-videos/">Apple Developer WWDC Videos</a>  ⭐️</h3>
<p>: 매년 Apple에서 발표하는 신제품, 업데이트 사항, 새로운 기능, OS 버전 업데이트 등 다양한 주제에 대한 영상</p>
<p><img src="https://velog.velcdn.com/images/jihae__qu/post/9d5c2828-6d7b-4d32-b99f-a01b090f84e6/image.png" alt=""></p>
<p>→ iOS개발자라면 매년 6월마다 꼭 챙겨봐야하는 행사!</p>
<p>→ WWDC 22 부터 한국어 자막 지원</p>
<h3 id="☑️-ios-app-dev-tutorials-📄">☑️ <strong><a href="https://developer.apple.com/tutorials/app-dev-training">iOS App Dev Tutorials</a></strong> 📄</h3>
<p>: UIKit, SwiftUI 등 iOS개발의 기초적인 내용을 공부할 수 있는 tutorial을 제공하는 페이지</p>
<p><img src="https://velog.velcdn.com/images/jihae__qu/post/b32a5c90-bf65-4e18-a565-7366a14c1fa0/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[미니프로젝트] Team-T 발표]]></title>
            <link>https://velog.io/@jihae__qu/TIL-%EB%AF%B8%EB%8B%88%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-Team-T-%EB%B0%9C%ED%91%9C</link>
            <guid>https://velog.io/@jihae__qu/TIL-%EB%AF%B8%EB%8B%88%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-Team-T-%EB%B0%9C%ED%91%9C</guid>
            <pubDate>Mon, 04 Mar 2024 13:44:53 GMT</pubDate>
            <description><![CDATA[<br/>


<p>오늘은 저희 팀이 5일동안 제작한 미니 프로젝트를 발표하는 발표회가 있었습니다.
열심히 피피티 만들고, 스크립트짜서 올려주신 팀장님🩵
저희가 1조라서 발표회가 시작하자마자 저희 조꺼부터 발표를 하였는데요..
제가 발표하는 것도 아닌데 엄청나게 떨렸습니다..🥹 헙..
발표 너무 잘해주신 팀장님 체고..</p>
<p>오늘은 피피티로 된 발표자료를 글로 정리해서 올려보려고 합니다!
나중에 이런 미니 프로젝트를 했었구나~
회상하기 좋을거 같아서요!ㅎㅎ</p>
<p>그럼 시작해볼게요!</p>
<hr>
<br/>
<br/>

<h1 id="1조-응-나t야">1조 &quot;응~ 나T야&quot;</h1>
<h4 id="프로젝트-명--team-t">프로젝트 명 : [TEAM-T]</h4>
<br/>

<h2 id="1-팀-소개">1. 팀 소개</h2>
<p>저희 <strong>[ 응~나 T야 ]</strong> 팀은 MBTI 성격 유형 중 T(Thinking, 사고형)를 가진 5명의 멤버로 구성되어 있습니다.
다양한 경험을 가진 팀원들이 각각의 개별적인 역량과 성격을 바탕으로 서로 협력하며 프로젝트를 진행하고 있습니다.
모두 iOS 개발자가 되고 싶어 하는 열정을 가진 저희가 일주일 동안 팀 프로젝트 앱을 개발하며 서로의 단점을 보완하고 장점을 극대화하며 <strong>‘팀이란 이런 것이다’</strong>를 보여줄 수 있도록 노력하는 <strong>[ 응~나 T야 ]</strong> 팀이 되도록 하겠습니다.</p>
<br/>

<h2 id="2-팀원-소개">2. 팀원 소개</h2>
<p>5명의 예비 iOS 개발자로 구성된 팀입니다.</p>
<table>
<thead>
<tr>
<th align="center">Zep 캐릭터</th>
<th align="center">이름</th>
<th align="center">태그</th>
<th align="center">MBTI</th>
<th align="left">Blog</th>
</tr>
</thead>
<tbody><tr>
<td align="center"><img src="https://velog.velcdn.com/images/jihae__qu/post/e248f653-d6e2-44cb-84df-99d7301ea5ee/image.png" width="60"></td>
<td align="center"><span style="color: red">염아현</span></td>
<td align="center">팀장</td>
<td align="center">ENTJ</td>
<td align="left"><a href="https://velog.io/@gritahy/posts">https://velog.io/@gritahy/posts</a></td>
</tr>
<tr>
<td align="center"><img src="https://velog.velcdn.com/images/jihae__qu/post/34749b90-10cb-4d76-a422-c2b3f70a69eb/image.png" width="60"></td>
<td align="center"><span style="color: blue">김정호</span></td>
<td align="center">팀원</td>
<td align="center">INTJ</td>
<td align="left"><a href="https://jeongnote.tistory.com/">https://jeongnote.tistory.com/</a></td>
</tr>
<tr>
<td align="center"><img src="https://velog.velcdn.com/images/jihae__qu/post/dd8c6f12-3324-4467-98c8-33056c848aa8/image.png" width="60"></td>
<td align="center"><span style="background-color:pink">배지해</span></td>
<td align="center">팀원</td>
<td align="center">ISTP</td>
<td align="left"><a href="https://velog.io/@jihae__qu/posts">https://velog.io/@jihae__qu/posts</a></td>
</tr>
<tr>
<td align="center"><img src="https://velog.velcdn.com/images/jihae__qu/post/ba581ecb-aa7f-4d52-952c-3ec32b435ae6/image.png" width="60"></td>
<td align="center"><span style="background-color:#FFF6B9">송정훈</span></td>
<td align="center">팀원</td>
<td align="center">INTP</td>
<td align="left"><a href="https://velog.io/@otxoid/posts">https://velog.io/@otxoid/posts</a></td>
</tr>
<tr>
<td align="center"><img src="https://velog.velcdn.com/images/jihae__qu/post/c46c7530-dadc-4991-877f-10bff5d00828/image.png" width="60"></td>
<td align="center"><span style="color: green">윤소연</span></td>
<td align="center">팀원</td>
<td align="center">INTP</td>
<td align="left"><a href="https://wood-fxrest.tistory.com/">https://wood-fxrest.tistory.com/</a></td>
</tr>
</tbody></table>
<br/>

<h2 id="3-와이어프레임">3. 와이어프레임</h2>
<h3 id="초기-와이어프레임">초기 와이어프레임</h3>
<p align="center"><img src = "https://velog.velcdn.com/images/jihae__qu/post/3a35371f-a315-4c64-8f74-8d758fdeeb92/image.png" width ="450" >

<p align="left">

<p>와이어프레임은 팀원 모두가 개인이 생각한 와이어프레임을 그려와서 모두의 의견을 모아 수렴점을 찾아서 그려나갔다.</p>
<h3 id="최종-와이어프레임">최종 와이어프레임</h3>
<p align="center"><img src = "https://velog.velcdn.com/images/jihae__qu/post/fd674140-7cd3-4c94-95bf-ebad4e9a8841/image.png" width ="450" >
<p align="left">

<p>정확한 레이아웃과 디자인을 짜기 위해서 피그마를 사용해 UI를 짰다.
디자인팀이 없었기 때문에 모든 팀원들의 의견을 모아 수정에 수정에 수정을 거쳐서 완성된 디자인이다.
모든 팀원들이 UI에 참여하였기 때문에 더더욱이나 구현을 하였을 때 UI에 애착이 갔다.</p>
<p>로고 하나 글자 하나도 많은 보기를 만들어서 팀원들과 의견 공유 후 골라 수정을 거쳤고,
글자 위치 하나까지도 핸드폰에 들어갔을 이미지들을 생각하며 수정을 하였다.</p>
<p>팀원 프로필 화면에는 개개인의 Zep 캐릭터와 어울리는 퍼스널 컬러를 추가해 개개인의 특성을 더더욱 강조하도록 노력했다.
<br/></p>
<h2 id="4-기능-및-역할-분담">4. 기능 및 역할 분담</h2>
<table>
<thead>
<tr>
<th>이름</th>
<th>역할</th>
</tr>
</thead>
<tbody><tr>
<td><span style="color: red">염아현</span></td>
<td>메인 화면 구현 및 발표</td>
</tr>
<tr>
<td><span style="color: blue">김정호</span></td>
<td>팀원 프로필 화면 페이지 구현 및 전체 코드 병합</td>
</tr>
<tr>
<td><span style="color: deeppink">배지해</span></td>
<td>splash 화면 구현 및 로고&amp;아이콘 디자인 및 인포메이션 페이지 세그 구현</td>
</tr>
<tr>
<td><span style="background-color:#FFF6B9">송정훈</span></td>
<td>팀원 개인 프로필 내 인포메이션 페이지 구현</td>
</tr>
<tr>
<td><span style="color: green">윤소연</span></td>
<td>팀 소개 페이지 구현 및 이미지 디자인</td>
</tr>
<tr>
<td><br/></td>
<td></td>
</tr>
</tbody></table>
<h2 id="5-github-링크">5. Github 링크</h2>
<p><a href="https://github.com/Yeom-A-Hyeon/TeamTMiniProject">https://github.com/Yeom-A-Hyeon/TeamTMiniProject</a>
<br/></p>
<h2 id="6-구현-화면-소개">6. 구현 화면 소개</h2>
<h3 id="splash-화면">Splash 화면</h3>
<p align="center"><img src = "https://velog.velcdn.com/images/jihae__qu/post/4dfdf26e-b192-4028-8803-32fc7f789c18/image.png" width ="250" >


<p>앱이 실행되기 전에 실행되는 Splash 화면입니다.
1초정도 실행하도록 설정하였으며, LaunchScreen을 활용하여 구현하였습니다.</p>
<h3 id="메인-화면">메인 화면</h3>
<p align="center"><img src = "https://velog.velcdn.com/images/jihae__qu/post/48a599a8-e542-480f-ad7f-b57163f46146/image.png" width ="250" >

<p>팀 소개 화면을 보여주는 T탄이 캐릭터와 멤버들의 Zep 캐릭터를 보여주는 메인 화면입니다.
T탄이를 클릭할 시 아래에서 위로 팀 소개화면이 뜨고,
각 멤버들의 Zep 캐릭터를 클릭할 시 오른쪽에서 왼쪽으로 각 멤버들의 개인 프로필 화면이 뜹니다.</p>
<p>직관적으로 보여주기 위해서 아래에 &quot; 캐릭터를 클릭해주세요 &quot; 라는 문구를 넣었고,
MBTI T탄이 옆으로 &quot;Click!!!&quot;이라는 말풍선을 넣어주었습니다.</p>
<p>원래 아래에서 위로 슬라이드하여 위로 올라올 수 있게 하는 창을 넣고 싶었는데 구현해내지 못하여 버튼을 클릭하여 위로 올라오는 세그웨이로 수정을 하게 되었습니다.</p>
<p>버튼을 생성하였을 때, xml로 이미지 파일을 넣는 방법이 아닌 방법이라 버튼에 캐릭터 이미지를 삽입하는 것에 어려움을 겪었습니다. 이 부분은 배경화면에 이미지를 넣고, 해당 이미지 위에 투명 버튼을 설치해서 해당 캐릭터를 클릭하는 것 처럼 구현을 하였습니다.</p>
<h3 id="팀-소개-화면">팀 소개 화면</h3>
<p align="center"><img src = "https://velog.velcdn.com/images/jihae__qu/post/3b9f5319-1875-4d92-8087-5319f920909e/image.png" width ="250" >

<p>메인화면에서 T탄이 캐릭터를 클릭할시 아래에서 위로 나오는 팀 소개 화면입니다.</p>
<p>저희들의 소개할 수 있는 간결한 문장을 3문장 넣었고,
밑에 저희 팀의 소개글을 넣었습니다.</p>
<p>스토리보드를 통해서 구현을 하였습니다.</p>
<h3 id="팀원-프로필-화면">팀원 프로필 화면</h3>
<p align="center"><img src = "https://velog.velcdn.com/images/jihae__qu/post/1b35a25d-0e57-4d60-aa20-d236788fed29/image.png" width ="250" >

<p>메인화면에서 멤버들의 개인 캐릭터를 클릭할 시 오른쪽에서 왼쪽으로 나오는 팀원 프로필 화면입니다.</p>
<p>멤버들의 Zep 캐릭터와 자기소개 한 줄이 상단에 위치해있고,
이름, MBTI, 혈액형, 생일, 기술, 희망분야가 표로 정리되어서 보여지고 있습니다.</p>
<p>네이게이션 뷰로 구현하여 왼쪽 상단의 화살표를 클릭하면 메인화면으로 이동하게 되고,
오른쪽 상단의 느낌표를 클릭하면 아래에서 위로 인포메이션 화면이 나오게 됩니다.</p>
<p>팀원 프로필 화면의 ViewController에 name이라는 변수를 만들어서 메인 ViewController에서 해당 Zep 캐릭터가 클릭되었을 때, 해당 Zep 캐릭터의 이름을 name이라는 변수에 넣어서 정보를 전달하였습니다. </p>
<p>팀원 프로필 화면의 ViewController의 UI를 Storyboard로 만들지 않고, Code로 짰습니다. 코드베이스로 UI를 짜다보니 storyboard가 nil인 상태인데, 이 상태로 instantiateViewController 메소드에 접근하다보니 정상적으로 코드가 실행되지 않았습니다. 그래서 UIStoryboard(name: &quot;Main&quot;, bundle: nil)를 통해 storyboard 객체를 생성 한 후, 변수에 할당하여 instantiateViewController 메소드에 접근하는 방법으로 문제를 해결하였습니다.</p>
<h3 id="팀원-프로필-내-인포메이션-화면">팀원 프로필 내 인포메이션 화면</h3>
<p align="center"><img src = "https://velog.velcdn.com/images/jihae__qu/post/4a75fb5c-8f65-43b2-aa97-a68d45d27351/image.png" width ="250" >

<p>팀원 프로필 화면에서 오른쪽 상단의 info 버튼을 클릭했을 때 아래에서 위로 올라오는 팀원 프로필 내 인포메이션 화면입니다.</p>
<p>View가 모든 페이지를 덮지 않고 일부 페이지만큼만 올라와서 팀원 프로필 화면이 일부 보이게 구현을 하기 위해 UISheetPresentationController를 사용하여 구현하였습니다. UISheetPresentationController를 사용하니 배경색이 흐려지는 dim(흐리게) 현상도 없앨 수 있어서 좋았습니다.</p>
<p>또한 블로그와 깃허브 링크의 라벨을 버튼으로 생성하여 URL이 연결이 되도록 구현하였습니다.</p>
<h2 id="7-느낀-점-앞으로의-각오">7. 느낀 점, 앞으로의 각오</h2>
<p>팀 프로젝트를 진행하니 더더욱 Github의 중요성에 대해서 깨달았던 것 같습니다.
팀원들과의 소통에서 모든 팀원들이 존중하며 자신의 의견을 적극적으로 PR하였기 때문에 더더욱 좋은 추억으로 남은 프로젝트가 아니었나 싶습니다!</p>
<p>개인적인 회고는 다음 벨로그로 찾아뵐게요~! ㅎㅎ</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[24/3/4] 콜라문제]]></title>
            <link>https://velog.io/@jihae__qu/2434-%EC%BD%9C%EB%9D%BC%EB%AC%B8%EC%A0%9C</link>
            <guid>https://velog.io/@jihae__qu/2434-%EC%BD%9C%EB%9D%BC%EB%AC%B8%EC%A0%9C</guid>
            <pubDate>Sun, 03 Mar 2024 23:26:31 GMT</pubDate>
            <description><![CDATA[<p>🍄 코딩테스트 
<a href="https://school.programmers.co.kr/learn/courses/30/lessons/132267">코딩테스트 문제 풀이</a></p>
<p>✍🏻 Github</p>
<p><a href="%5Bhttps://github.com/BaeJihae/-Swift-CodingTest/blob/main/%5B%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4%5D/1-%EC%97%B0%EC%8A%B5/132267_%EC%BD%9C%EB%9D%BC%EB%AC%B8%EC%A0%9C.swift%5D(https://github.com/BaeJihae/-Swift-CodingTest/blob/main/%5B%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4%5D/1-%EC%97%B0%EC%8A%B5/132267_%EC%BD%9C%EB%9D%BC%EB%AC%B8%EC%A0%9C.swift)">문제 풀이 github 링크</a></p>
<h3 id="문제-설명">문제 설명</h3>
<p>오래전 유행했던 콜라 문제가 있습니다. 콜라 문제의 지문은 다음과 같습니다.</p>
<blockquote>
<p>정답은 아무에게도 말하지 마세요.</p>
<p>콜라 빈 병 2개를 가져다주면 콜라 1병을 주는 마트가 있다. 빈 병 20개를 가져다주면 몇 병을 받을 수 있는가?</p>
<p>단, 보유 중인 빈 병이 2개 미만이면, 콜라를 받을 수 없다.</p>
</blockquote>
<p>문제를 풀던 상빈이는 콜라 문제의 완벽한 해답을 찾았습니다. 상빈이가 푼 방법은 아래 그림과 같습니다. 우선 콜라 빈 병 20병을 가져가서 10병을 받습니다. 받은 10병을 모두 마신 뒤, 가져가서 5병을 받습니다. 5병 중 4병을 모두 마신 뒤 가져가서 2병을 받고, 또 2병을 모두 마신 뒤 가져가서 1병을 받습니다. 받은 1병과 5병을 받았을 때 남은 1병을 모두 마신 뒤 가져가면 1병을 또 받을 수 있습니다. 이 경우 상빈이는 총 10 + 5 + 2 + 1 + 1 = 19병의 콜라를 받을 수 있습니다.</p>
<p><img src="https://velog.velcdn.com/images/jihae__qu/post/1b5e578c-b85e-460c-9451-66ddedb1e2e3/image.png" alt=""></p>
<p>문제를 열심히 풀던 상빈이는 일반화된 콜라 문제를 생각했습니다. 이 문제는 빈 병 <code>a</code>개를 가져다주면 콜라 <code>b</code>병을 주는 마트가 있을 때, 빈 병 <code>n</code>개를 가져다주면 몇 병을 받을 수 있는지 계산하는 문제입니다. 기존 콜라 문제와 마찬가지로, 보유 중인 빈 병이 <code>a</code>개 미만이면, 추가적으로 빈 병을 받을 순 없습니다. 상빈이는 열심히 고심했지만, 일반화된 콜라 문제의 답을 찾을 수 없었습니다. 상빈이를 도와, 일반화된 콜라 문제를 해결하는 프로그램을 만들어 주세요.</p>
<p>콜라를 받기 위해 마트에 주어야 하는 병 수 <code>a</code>, 빈 병 a개를 가져다 주면 마트가 주는 콜라 병 수 <code>b</code>, 상빈이가 가지고 있는 빈 병의 개수 <code>n</code>이 매개변수로 주어집니다. 상빈이가 받을 수 있는 콜라의 병 수를 return 하도록 solution 함수를 작성해주세요.</p>
<hr>
<p><strong>제한사항</strong></p>
<ul>
<li>1 ≤ <code>b</code> &lt; <code>a</code> ≤ <code>n</code> ≤ 1,000,000</li>
<li>정답은 항상 int 범위를 넘지 않게 주어집니다.</li>
</ul>
<hr>
<p><strong>입출력 예</strong></p>
<table>
<thead>
<tr>
<th>a</th>
<th>b</th>
<th>n</th>
<th>result</th>
</tr>
</thead>
<tbody><tr>
<td>2</td>
<td>1</td>
<td>20</td>
<td>19</td>
</tr>
<tr>
<td>3</td>
<td>1</td>
<td>20</td>
<td>9</td>
</tr>
</tbody></table>
<hr>
<p><strong>입출력 예 설명</strong></p>
<p>입출력 예 #1</p>
<ul>
<li>본문에서 설명한 예시입니다.</li>
</ul>
<p>입출력 예 #2</p>
<ul>
<li>빈 병 20개 중 18개를 마트에 가져가서, 6병의 콜라를 받습니다. 이때 상빈이가 가지고 있는 콜라 병의 수는 8(20 – 18 + 6 = 8)개 입니다.</li>
<li>빈 병 8개 중 6개를 마트에 가져가서, 2병의 콜라를 받습니다. 이때 상빈이가 가지고 있는 콜라 병의 수는 4(8 – 6 + 2 = 4)개 입니다.</li>
<li>빈 병 4 개중 3개를 마트에 가져가서, 1병의 콜라를 받습니다. 이때 상빈이가 가지고 있는 콜라 병의 수는 2(4 – 3 + 1 = 2)개 입니다.</li>
<li>3번의 교환 동안 상빈이는 9(6 + 2 + 1 = 9)병의 콜라를 받았습니다.</li>
</ul>
<hr>
<h3 id="문제-풀이">문제 풀이</h3>
<p><strong>나의 풀이</strong></p>
<pre><code class="language-swift">import Foundation

func solution(_ a:Int, _ b:Int, _ n:Int) -&gt; Int {
    var n: Int = n
    var answer: Int = 0
    while n &gt;= a {
        answer = answer + ( n / a * b )
        n = n / a * b + n % a
    } 
    return answer
}</code></pre>
<p>n값은 현재 가지고 있는 콜라 병 수, answer은 상빈이가 받을 수 있는 콜라의 개수이다.</p>
<p>반복문으로 풀었다.</p>
<p><strong>다른 사람 풀이</strong></p>
<pre><code class="language-swift">func solution(_ a:Int, _ b:Int, _ n:Int) -&gt; Int {
    return (n &gt; b ? n - b : 0) / (a - b) * b
}</code></pre>
<p>반복문을 한 문장으로 끝내버리는 클라스.. 쩐다..</p>
<p>근데 코드 이해를 전혀 하지 못했다..</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[24/2/28] 푸드 파이트 대회]]></title>
            <link>https://velog.io/@jihae__qu/24228-%ED%91%B8%EB%93%9C-%ED%8C%8C%EC%9D%B4%ED%8A%B8-%EB%8C%80%ED%9A%8C</link>
            <guid>https://velog.io/@jihae__qu/24228-%ED%91%B8%EB%93%9C-%ED%8C%8C%EC%9D%B4%ED%8A%B8-%EB%8C%80%ED%9A%8C</guid>
            <pubDate>Wed, 28 Feb 2024 02:27:34 GMT</pubDate>
            <description><![CDATA[<p>🍄 코딩테스트 
<a href="https://school.programmers.co.kr/learn/courses/30/lessons/134240">코딩테스트 문제 풀이</a></p>
<p>✍🏻 Github</p>
<p><a href="https://github.com/BaeJihae/-Swift-CodingTest/blob/main/%5B%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4%5D/1-%EC%97%B0%EC%8A%B5/134240_%ED%91%B8%EB%93%9C%ED%8C%8C%EC%9D%B4%ED%8A%B8%EB%8C%80%ED%9A%8C.swift">문제 풀이 github 링크</a></p>
<h3 id="문제-설명">문제 설명</h3>
<p>수웅이는 매달 주어진 음식을 빨리 먹는 푸드 파이트 대회를 개최합니다. 이 대회에서 선수들은 1대 1로 대결하며, 매 대결마다 음식의 종류와 양이 바뀝니다. 대결은 준비된 음식들을 일렬로 배치한 뒤, 한 선수는 제일 왼쪽에 있는 음식부터 오른쪽으로, 다른 선수는 제일 오른쪽에 있는 음식부터 왼쪽으로 순서대로 먹는 방식으로 진행됩니다. 중앙에는 물을 배치하고, 물을 먼저 먹는 선수가 승리하게 됩니다.</p>
<p>이때, 대회의 공정성을 위해 두 선수가 먹는 음식의 종류와 양이 같아야 하며, 음식을 먹는 순서도 같아야 합니다. 또한, 이번 대회부터는 칼로리가 낮은 음식을 먼저 먹을 수 있게 배치하여 선수들이 음식을 더 잘 먹을 수 있게 하려고 합니다. 이번 대회를 위해 수웅이는 음식을 주문했는데, 대회의 조건을 고려하지 않고 음식을 주문하여 몇 개의 음식은 대회에 사용하지 못하게 되었습니다.</p>
<p>예를 들어, 3가지의 음식이 준비되어 있으며, 칼로리가 적은 순서대로 1번 음식을 3개, 2번 음식을 4개, 3번 음식을 6개 준비했으며, 물을 편의상 0번 음식이라고 칭한다면, 두 선수는 1번 음식 1개, 2번 음식 2개, 3번 음식 3개씩을 먹게 되므로 음식의 배치는 &quot;1223330333221&quot;이 됩니다. 따라서 1번 음식 1개는 대회에 사용하지 못합니다.</p>
<p>수웅이가 준비한 음식의 양을 칼로리가 적은 순서대로 나타내는 정수 배열 <code>food</code>가 주어졌을 때, 대회를 위한 음식의 배치를 나타내는 문자열을 return 하는 solution 함수를 완성해주세요.</p>
<p><strong>제한사항</strong></p>
<ul>
<li>2 ≤ <code>food</code>의 길이 ≤ 9</li>
<li>1 ≤ <code>food</code>의 각 원소 ≤ 1,000</li>
<li><code>food</code>에는 칼로리가 적은 순서대로 음식의 양이 담겨 있습니다.</li>
<li><code>food[i]</code>는 i번 음식의 수입니다.</li>
<li><code>food[0]</code>은 수웅이가 준비한 물의 양이며, 항상 1입니다.</li>
<li>정답의 길이가 3 이상인 경우만 입력으로 주어집니다.</li>
</ul>
<p><strong>입출력 예</strong></p>
<table>
<thead>
<tr>
<th>food</th>
<th>result</th>
</tr>
</thead>
<tbody><tr>
<td>[1, 3, 4, 6]</td>
<td>&quot;1223330333221&quot;</td>
</tr>
<tr>
<td>[1, 7, 1, 2]</td>
<td>&quot;111303111&quot;</td>
</tr>
</tbody></table>
<p><strong>입출력 예 설명</strong></p>
<p><strong>입출력 예 #1</strong></p>
<ul>
<li>문제 예시와 같습니다.</li>
</ul>
<p><strong>입출력 예 #2</strong></p>
<ul>
<li>두 선수는 1번 음식 3개, 3번 음식 1개를 먹게 되므로 음식의 배치는 &quot;111303111&quot;입니다.</li>
</ul>
<hr>
<h3 id="문제-풀이">문제 풀이</h3>
<p><strong>나의 풀이</strong></p>
<pre><code class="language-swift">import Foundation

func solution(_ food:[Int]) -&gt; String {

    var answer: String = &quot;0&quot;

    for (i, food) in food.enumerated().reversed() {
        var j = 0
        while ( j &lt; food / 2 ){
            answer = &quot;\(i)&quot; + answer + &quot;\(i)&quot;
            j += 1
        }
    }

    return answer
}
</code></pre>
<p>배열을 거꾸로 탐색하면서 food의 개수보다 작거나 같은 최대의 짝수만큼의 반복문을 돌며, 문자열을 추가해준다.</p>
<p>완전 탐색으로 풀었고, 반복문을 도는 부분이 시간 손실이 날 것 같았다.</p>
<p>** 나의 풀이 1 테스트 결과 **</p>
<pre><code class="language-swift">테스트 1 〉    통과 (0.73ms, 16.3MB)
테스트 2 〉    통과 (0.66ms, 16.4MB)
테스트 3 〉    통과 (0.64ms, 16.2MB)
테스트 4 〉    통과 (1.21ms, 16.3MB)
테스트 5 〉    통과 (0.22ms, 16.2MB)
테스트 6 〉    통과 (0.95ms, 16.4MB)
테스트 7 〉    통과 (1.17ms, 16.4MB)
테스트 8 〉    통과 (0.65ms, 16.4MB)
테스트 9 〉    통과 (0.37ms, 16.4MB)
테스트 10 〉    통과 (0.48ms, 16.1MB)
테스트 11 〉    통과 (0.08ms, 16.5MB)
테스트 12 〉    통과 (0.09ms, 16.3MB)
테스트 13 〉    통과 (0.09ms, 16MB)
테스트 14 〉    통과 (2.19ms, 16.4MB)
테스트 15 〉    통과 (0.09ms, 16.1MB)
테스트 16 〉    통과 (0.11ms, 16.3MB)
테스트 17 〉    통과 (0.10ms, 16.3MB)
테스트 18 〉    통과 (0.13ms, 16.1MB)
테스트 19 〉    통과 (0.09ms, 16.4MB)
테스트 20 〉    통과 (0.09ms, 16.3MB)</code></pre>
<pre><code class="language-swift">func solution(_ food:[Int]) -&gt; String {

    var answer: String = &quot;0&quot;

    for (i, food) in food.enumerated().reversed() {
        let addStr = String(repeating: &quot;\(i)&quot;, count: food / 2)
        answer = addStr + answer + addStr
    }

    return answer
}</code></pre>
<p>그래서 반복문을 푸는 부분을 String의 생성자를 이용하여 반복해서 코드를 바꿔주었다.</p>
<p>** 나의 풀이 2 테스트 결과 **</p>
<pre><code class="language-swift">테스트 1 〉    통과 (0.15ms, 16.3MB)
테스트 2 〉    통과 (0.17ms, 16.4MB)
테스트 3 〉    통과 (0.23ms, 16.2MB)
테스트 4 〉    통과 (0.19ms, 16.2MB)
테스트 5 〉    통과 (0.15ms, 16.4MB)
테스트 6 〉    통과 (0.25ms, 16.5MB)
테스트 7 〉    통과 (0.20ms, 16.5MB)
테스트 8 〉    통과 (0.22ms, 16.1MB)
테스트 9 〉    통과 (0.19ms, 16.5MB)
테스트 10 〉    통과 (0.12ms, 16.3MB)
테스트 11 〉    통과 (0.08ms, 16.3MB)
테스트 12 〉    통과 (0.17ms, 16.5MB)
테스트 13 〉    통과 (0.14ms, 16.3MB)
테스트 14 〉    통과 (0.44ms, 16.4MB)
테스트 15 〉    통과 (0.13ms, 16.3MB)
테스트 16 〉    통과 (0.13ms, 16.2MB)
테스트 17 〉    통과 (0.09ms, 16.2MB)
테스트 18 〉    통과 (0.09ms, 16.5MB)
테스트 19 〉    통과 (0.10ms, 16.4MB)
테스트 20 〉    통과 (0.09ms, 16.3MB)</code></pre>
<p>더 빨라짐ㅎㅎ</p>
<p><strong>다른 사람 풀이</strong></p>
<pre><code class="language-swift">import Foundation

func solution(_ food:[Int]) -&gt; String {
    var result = &quot;&quot;
    for i in food.indices {
        result += String(repeating: String(i), count: food[i] / 2)
    }
    return result + &quot;0&quot; + result.reversed()
}</code></pre>
<p>이 분은 한 쪽만 값을 만들어서 양쪽으로 이어붙였다.</p>
<p>더 깔끔하고, reversed()를 반복문에서 하지 않아서 더 빠를 것 같은 느뀜~?</p>
<p>하지만, 테스트 결과를 비교해보니 테스트 케이스에 따라 다른 것 같다. </p>
<p>food의 종류가 많냐, 한 food 당 개수가 많냐의 차이인듯!</p>
<p>처음에 이 코드를 보자마자 <code>indices</code> 가 뭐였지..? 했다! 여기 공부 1개 추가요~</p>
<p>오홍 이렇게도 풀 수 있구낭?!?</p>
<p>** 다른 사람의 풀이 테스트 결과 **</p>
<pre><code class="language-swift">테스트 1 〉    통과 (0.26ms, 16.4MB)
테스트 2 〉    통과 (0.26ms, 16.6MB)
테스트 3 〉    통과 (0.22ms, 16.4MB)
테스트 4 〉    통과 (0.39ms, 16.1MB)
테스트 5 〉    통과 (0.11ms, 16.6MB)
테스트 6 〉    통과 (0.34ms, 16.6MB)
테스트 7 〉    통과 (0.59ms, 16.5MB)
테스트 8 〉    통과 (0.22ms, 16.3MB)
테스트 9 〉    통과 (0.56ms, 16.1MB)
테스트 10 〉    통과 (0.47ms, 16.3MB)
테스트 11 〉    통과 (0.05ms, 16.4MB)
테스트 12 〉    통과 (0.05ms, 16.1MB)
테스트 13 〉    통과 (0.05ms, 16.4MB)
테스트 14 〉    통과 (0.71ms, 16.5MB)
테스트 15 〉    통과 (0.05ms, 16.3MB)
테스트 16 〉    통과 (0.04ms, 16.3MB)
테스트 17 〉    통과 (0.04ms, 16.4MB)
테스트 18 〉    통과 (0.04ms, 16.3MB)
테스트 19 〉    통과 (0.05ms, 16.3MB)
테스트 20 〉    통과 (0.05ms, 16.3MB)</code></pre>
<h3 id="중요한-개념">중요한 개념</h3>
<ul>
<li><p><code>indices</code> : Collection의 <strong>유효 범위</strong>를 가지고 있는 Property</p>
<ul>
<li>예) array라는 배열이 [3, 3, 3, 3]일 때, 이 Collection은 4개의 요소를 가지고 있으므로 indices의 값은 0…&lt;4가 된다.</li>
<li>언제 사용? 배열을 안전하게 조회하고 싶을 때 사용하면 된다. For 문에서 배열의 범위 만큼의 값을 출력하고 싶을 때 주로 사용이 된다.</li>
</ul>
</li>
<li><p>String(repeating: 문자열(String),  count: 반복횟수(Int))</p>
<p>  : repeating은 쓰는 방법을 자꾸 까먹는다. 꼭 외우기!!!!</p>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[미니프로젝트] Splash Screen 구현하기]]></title>
            <link>https://velog.io/@jihae__qu/TIL-Splash-Screen-%EA%B5%AC%ED%98%84%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@jihae__qu/TIL-Splash-Screen-%EA%B5%AC%ED%98%84%ED%95%98%EA%B8%B0</guid>
            <pubDate>Tue, 27 Feb 2024 12:20:10 GMT</pubDate>
            <description><![CDATA[<p>안녕하세요! 째에요💗
오늘은 미니 프로젝트에서 제가 맡은 <strong>Splash 화면</strong>을 구현하는 방법에 대한 회고를 써볼까 합니다.</p>
<hr>
<p>Splash 화면을 구현하는 방법에는 다양한 방법이 있습니다.</p>
<p>저는 그 중 <strong>LaunchScreen</strong>을 사용하여 구현하는 방법을 사용했어요!</p>
<br/>
<br/>

<h2 id="launchscreen이란">LaunchScreen이란?</h2>
<p>애플에서 만들어놓은 앱이 시작할 때 가장 먼저 나타나도록 설정된 화면입니다.</p>
<br/>
<br/>




<h2 id="launchscreen을-활용한-splash-화면-구현">LaunchScreen을 활용한 Splash 화면 구현</h2>
<p>너어무나 간단합니다요!!!!
우선 iOS 앱 프로젝트를 생성하여 줍니다.</p>
<img src= "https://velog.velcdn.com/images/jihae__qu/post/8b8d3d7c-b36a-4ef5-86fe-96c4f5809745/image.png">


<p>저희 팀 이름이 &quot;응~ 나 T야&quot;여서 프로젝트 명을 간단히 Team-T로 했어요!</p>
<p>iPhone 앱을 만들 예정이라 설정에서 Destinations은
iPhone을 제외하고는 다 삭제했습니다.</p>
<p>이제 오른쪽의 네비게이션에서 LaunchScreen을 선택하여 storyboard를 띄웁니다.</p>
<img src="https://velog.velcdn.com/images/jihae__qu/post/67dcb969-dd23-45b4-bbba-cddf625c5447/image.png" width=400>

<p>View 위에 ImageView를 넣고, ImageView의 AutoLayout을 화면과 맞게 설정해줍니다.</p>
<br/>

<hr>
<h3 id="--autolayout-화면과-일치하도록-설정-">** [ AutoLayout 화면과 일치하도록 설정 ]**</h3>
<p>  오른쪽 하단의 가운데 아이콘을 클릭하면 아래보이는 것처럼 Add New Constraints가 떠요!</p>
<img src="https://velog.velcdn.com/images/jihae__qu/post/c1166788-7c40-49f5-b873-a02ce3ff6f9e/image.png" width=350>

<p>  동서남북으로 놓여있는 저 칸에 원하는 만큼의 크기를 적으면 AutoLayout 설정 완료!</p>
<p>  하지만, 일반적으로 설정이 되어있는 건 Safe Area에 맞춰져 있어서 0으로 설정해도 위 아래, 양 옆에 여백이 생깁니다. 여백이 없기 위해서는 AutoLayout의 FirstItem을 Superview로 일일히 바꿔주는 설정을 해야합니다.</p>
<p>  너무 번거롭기 때문에 한번에 바꿔볼게요!</p>
<img src="https://velog.velcdn.com/images/jihae__qu/post/61f7b15e-eca8-45f9-bfb7-e04919cc1a6a/image.png" width=300>

<p>  빨강색 동그라미를 클릭하면 
<img src="https://velog.velcdn.com/images/jihae__qu/post/e6e461d1-1e37-477d-8df7-d0948e2e693e/image.png" width=300></p>
<p>  이렇게 뜰거에요~!
  이미 선택되어 있는 Safe Area의 밑의 View를 클릭해주시고 다음에 숫자를 0으로 바꿔주시면 됩니다.</p>
<p>  그리고 또 까먹으면 안되는 한가지!
  바로 Constrain to margins의 체크표시를 해제해주셔야 해요!
  그래야 이미 설정이 되어있는 margin까지 없앨 수 있습니다.</p>
<hr>
<p>그 다음 View를 잘 선택해서 오른쪽의 인스펙터 화면에서 제일 상단에 있는 Image에서 원하는 Image를 선택하시면 됩니다!</p>
<img src="https://velog.velcdn.com/images/jihae__qu/post/0d23c0a6-9355-4767-b6b6-dc9a6f05a360/image.png" width=300>

<p>이 때, Image를 넣는 방법은 Assets에 원하는 이미지 파일을 끌어다 놓으시면 돼요!</p>
<p>이렇게 Splash 화면 만들기 끝!!
쉽죠?!</p>
<p>근데 너무 빨리 없어져서 좀 더 시간을 늘리고 싶으시다면,
AppDelegate에</p>
<pre><code class="language-swift">// Splash Screen을 1초동안 띄우기
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -&gt; Bool {
    sleep(1)
    return true
}</code></pre>
<p>를 추가해주시면 됩니다~!</p>
<p>다음에는 Splash 화면을 애니메이션으로 만들어보고 싶네요~!</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[24/2/27] 가장 가까운 같은 글자]]></title>
            <link>https://velog.io/@jihae__qu/24227-%EA%B0%80%EC%9E%A5-%EA%B0%80%EA%B9%8C%EC%9A%B4-%EA%B0%99%EC%9D%80-%EA%B8%80%EC%9E%90</link>
            <guid>https://velog.io/@jihae__qu/24227-%EA%B0%80%EC%9E%A5-%EA%B0%80%EA%B9%8C%EC%9A%B4-%EA%B0%99%EC%9D%80-%EA%B8%80%EC%9E%90</guid>
            <pubDate>Tue, 27 Feb 2024 01:15:49 GMT</pubDate>
            <description><![CDATA[<p>🍄 코딩테스트 
<a href="https://school.programmers.co.kr/learn/courses/30/lessons/142086">코딩테스트 문제 풀이</a></p>
<p>✍🏻 Github</p>
<p><a href="https://github.com/BaeJihae/-Swift-CodingTest/blob/main/%5B%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4%5D/1-%EC%97%B0%EC%8A%B5/142086_%EA%B0%80%EC%9E%A5%20%EA%B0%80%EA%B9%8C%EC%9A%B4%20%EA%B0%99%EC%9D%80%20%EA%B8%80%EC%9E%90.swift">문제 풀이 github 링크</a></p>
<h3 id="문제-설명">문제 설명</h3>
<p>문자열 <code>s</code>가 주어졌을 때, <code>s</code>의 각 위치마다 자신보다 앞에 나왔으면서, 자신과 가장 가까운 곳에 있는 같은 글자가 어디 있는지 알고 싶습니다.</p>
<p>예를 들어, <code>s</code>=&quot;banana&quot;라고 할 때,  각 글자들을 왼쪽부터 오른쪽으로 읽어 나가면서 다음과 같이 진행할 수 있습니다.</p>
<ul>
<li>b는 처음 나왔기 때문에 자신의 앞에 같은 글자가 없습니다. 이는 -1로 표현합니다.</li>
<li>a는 처음 나왔기 때문에 자신의 앞에 같은 글자가 없습니다. 이는 -1로 표현합니다.</li>
<li>n은 처음 나왔기 때문에 자신의 앞에 같은 글자가 없습니다. 이는 -1로 표현합니다.</li>
<li>a는 자신보다 두 칸 앞에 a가 있습니다. 이는 2로 표현합니다.</li>
<li>n도 자신보다 두 칸 앞에 n이 있습니다. 이는 2로 표현합니다.</li>
<li>a는 자신보다 두 칸, 네 칸 앞에 a가 있습니다. 이 중 가까운 것은 두 칸 앞이고, 이는 2로 표현합니다.</li>
</ul>
<p>따라서 최종 결과물은 [-1, -1, -1, 2, 2, 2]가 됩니다.</p>
<p>문자열 <code>s</code>이 주어질 때, 위와 같이 정의된 연산을 수행하는 함수 solution을 완성해주세요.</p>
<p><strong>제한사항</strong></p>
<ul>
<li>1 ≤ <code>s</code>의 길이 ≤ 10,000<ul>
<li><code>s</code>은 영어 소문자로만 이루어져 있습니다.</li>
</ul>
</li>
</ul>
<p><strong>입출력 예</strong></p>
<table>
<thead>
<tr>
<th>s</th>
<th>result</th>
</tr>
</thead>
<tbody><tr>
<td>&quot;banana&quot;</td>
<td>[-1, -1, -1, 2, 2, 2]</td>
</tr>
<tr>
<td>&quot;foobar&quot;</td>
<td>[-1, -1, 1, -1, -1, -1]</td>
</tr>
</tbody></table>
<p><strong>입출력 예 설명</strong></p>
<ul>
<li><p>입출력 예 #1</p>
<p>  지문과 같습니다.</p>
</li>
<li><p>입출력 예 #2</p>
<p>  설명 생략</p>
</li>
</ul>
<hr>
<h3 id="문제-풀이">문제 풀이</h3>
<p><strong>나의 풀이</strong></p>
<pre><code class="language-swift">func solution(_ s:String) -&gt; [Int] {
    var stack = [String]()

    return s.map{ x in
         let chr: String = String(x)
         if stack == [] || !stack.contains(chr) {
             stack.append(chr)
             return -1
         }else{
             let a = stack.count - Int(stack.lastIndex(of: chr)!)
             stack.append(chr)
             return a
         }
    }
}</code></pre>
<p>stack에 글자를 넣으면서 그 글자가 stack에 포함이 되어있다면, 뒤에서 몇 번째인지 출력하고, stack에 포함이 되어있지않다면, -1을 출력하도록 로직을 짰다.</p>
<p>map과 조건문을 사용하여, 실행시간을  최대한 줄였고, 코드를 간단하게 짜는 것에 초점을 맞추어 풀었다.</p>
<p>풀면서 궁금한게 있다면, 뒤에서 부터 몇 번째의 인덱스인지를 도출해나가는 과정에서 <code>stack.count - Int(stack.lastIndex(of: chr)!)</code> 보다 더 좋은 코드가 있는지 궁금했다.</p>
<br/>


<p><strong>다른 사람 풀이</strong></p>
<pre><code class="language-swift">func solution(_ s: String) -&gt; [Int] {
    var word: [String: Int] = [:]
    var result: [Int] = []

    for (index, val) in Array(s).map { String($0) }.enumerated() {
        if let beforeIndex = word[val] {
            result.append(index - beforeIndex)
        } else {
            result.append(-1)
        }

        word[val] = index
    }

    return result
}</code></pre>
<p>이 분의 풀이는 Dictionary를 사용하여 풀었다.</p>
<p>Dictionary에 값이 없다면, -1을 반환하고, Dictionary에 [ Character : Index ] 형식으로 저장을 한다.</p>
<p>만약 Dictionary에 값이 존재한다면, 지금의 index에서 Dictionary의 Index 값을 빼준 후, Dictionary는 새로운 Index 값으로 업데이트를 해준다.</p>
<p>나의 풀이는 stack을 쌓았다면, 다른 사람의 풀이에서는 Dictionary에 업데이트를 해주었다.</p>
<p>실행시간을 비교해보니</p>
<ul>
<li><p>나의 풀이 실행시간</p>
<pre><code>  정확성  테스트
  테스트 1 〉    통과 (0.06ms, 16.3MB)
  테스트 2 〉    통과 (0.45ms, 16.6MB)
  테스트 3 〉    통과 (0.44ms, 16.3MB)
  테스트 4 〉    통과 (8.31ms, 16.7MB)
  테스트 5 〉    통과 (87.90ms, 17.8MB)
  테스트 6 〉    통과 (34.33ms, 16.7MB)
  테스트 7 〉    통과 (66.40ms, 17.7MB)
  테스트 8 〉    통과 (17.31ms, 17MB)
  테스트 9 〉    통과 (50.37ms, 17.5MB)
  테스트 10 〉    통과 (10.68ms, 16.7MB)
  테스트 11 〉    통과 (58.05ms, 17.5MB)
  테스트 12 〉    통과 (0.05ms, 16.3MB)
  테스트 13 〉    통과 (0.06ms, 16.2MB)
  테스트 14 〉    통과 (6.71ms, 16.5MB)
  테스트 15 〉    통과 (0.07ms, 16.4MB)
  테스트 16 〉    통과 (0.10ms, 16.2MB)
  테스트 17 〉    통과 (0.41ms, 16.6MB)
  테스트 18 〉    통과 (10.90ms, 16.7MB)
  테스트 19 〉    통과 (11.85ms, 16.7MB)
  테스트 20 〉    통과 (2.11ms, 16.5MB)
  테스트 21 〉    통과 (0.30ms, 16.3MB)
  테스트 22 〉    통과 (28.03ms, 17MB)
  테스트 23 〉    통과 (2.33ms, 16.4MB)
  테스트 24 〉    통과 (3.00ms, 16.6MB)
  테스트 25 〉    통과 (8.37ms, 16.4MB)
  테스트 26 〉    통과 (1.21ms, 16.6MB)
  테스트 27 〉    통과 (3.96ms, 16.5MB)
  테스트 28 〉    통과 (3.45ms, 16.7MB)
  테스트 29 〉    통과 (0.04ms, 16.3MB)
  테스트 30 〉    통과 (67.43ms, 17.5MB)</code></pre></li>
<li><p>다른 사람의 풀이 실행시간</p>
<pre><code>  정확성  테스트
  테스트 1 〉    통과 (0.08ms, 16.1MB)
  테스트 2 〉    통과 (0.14ms, 16.2MB)
  테스트 3 〉    통과 (0.14ms, 16.3MB)
  테스트 4 〉    통과 (0.68ms, 16.7MB)
  테스트 5 〉    통과 (5.94ms, 17.8MB)
  테스트 6 〉    통과 (4.44ms, 17MB)
  테스트 7 〉    통과 (9.29ms, 17.8MB)
  테스트 8 〉    통과 (1.90ms, 16.8MB)
  테스트 9 〉    통과 (5.23ms, 17.7MB)
  테스트 10 〉    통과 (1.18ms, 16.9MB)
  테스트 11 〉    통과 (5.24ms, 17.8MB)
  테스트 12 〉    통과 (0.07ms, 16.5MB)
  테스트 13 〉    통과 (0.08ms, 16.3MB)
  테스트 14 〉    통과 (0.35ms, 16.5MB)
  테스트 15 〉    통과 (0.08ms, 16.4MB)
  테스트 16 〉    통과 (0.10ms, 16.5MB)
  테스트 17 〉    통과 (0.11ms, 16.3MB)
  테스트 18 〉    통과 (1.11ms, 16.6MB)
  테스트 19 〉    통과 (2.13ms, 16.6MB)
  테스트 20 〉    통과 (0.30ms, 16.6MB)
  테스트 21 〉    통과 (0.12ms, 16.5MB)
  테스트 22 〉    통과 (2.90ms, 16.9MB)
  테스트 23 〉    통과 (0.31ms, 16.5MB)
  테스트 24 〉    통과 (0.39ms, 16.6MB)
  테스트 25 〉    통과 (0.54ms, 16.5MB)
  테스트 26 〉    통과 (0.16ms, 16.2MB)
  테스트 27 〉    통과 (0.47ms, 16.6MB)
  테스트 28 〉    통과 (0.53ms, 16.5MB)
  테스트 29 〉    통과 (0.09ms, 16.4MB)
  테스트 30 〉    통과 (6.11ms, 18MB)</code></pre></li>
</ul>
<p>Dictionary로 푼 다른 사람의 풀이가 훨씬 빨랐다.</p>
<p><strong>이렇게 오늘 하나를 또 배웁니다...!!!!</strong>
<br/>
<br/>
<br/></p>
<h3 id="중요한-개념">중요한 개념</h3>
<ul>
<li><p>Dictionary를 업데이트하며 활용하는 방법!</p>
<pre><code class="language-swift">// Dictionary 선언
var word: [String: Int] = [:]

// Dictionary에 값이 들어있는지 확인하는 코드
if let beforeIndex = word[val] {
      // 코드
}

// Dictionary 업데이트 ( 값이 없다면 추가, 값이 있다면 업데이트 )
word[val] = index
</code></pre>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[미니프로젝트] 첫째주 첫째날의 회고록]]></title>
            <link>https://velog.io/@jihae__qu/TIL-%EB%82%B4%EB%B0%B0%EC%BA%A0-%EC%B2%AB%EC%A7%B8%EB%82%A0-%ED%9A%8C%EA%B3%A0%EB%A1%9D</link>
            <guid>https://velog.io/@jihae__qu/TIL-%EB%82%B4%EB%B0%B0%EC%BA%A0-%EC%B2%AB%EC%A7%B8%EB%82%A0-%ED%9A%8C%EA%B3%A0%EB%A1%9D</guid>
            <pubDate>Mon, 26 Feb 2024 15:41:59 GMT</pubDate>
            <description><![CDATA[<p>🖊️
안녕하세요, 째에요!</p>
<p>내일배움캠프의 드디어 <strong>첫째주 첫째날</strong>이 되었어요!
오늘은 새로운 개념을 배우기 보다는
새로운 팀원들을 만나고 새로운 환경에 적응하며
미니 프로젝트를 진행하기 위한 S.A를 작성하였어요.</p>
<p>어떤 새로운 경험을 하고, 어떤 것을 느꼈는지를 남겨볼까해요!
<br/></p>
<hr>
<br/>

<p><strong>오전 9시부터 오후 9시까지</strong> 진행되는 캠프이기에
되게 긴 시간동안 학습해야한다는 것에 조금 부담이 되었어요!</p>
<p>하지만, 하루만에 12시간이라는 시간이 이렇게 짧을 수도 있구나를 느꼈습니다...</p>
<p>[ OT진행 -&gt; 팀원들과의 인사 및 회의 -&gt; 점심시간 -&gt; 팀원들과 회의 -&gt; 저녁시간 -&gt; 팀 회의.. ]</p>
<p>아주 정신없이 흘러가서 오히려 시간이 모자르게 느껴졌어요..
큐ㅠㅠ 하루를 더 알차게 보내야겠더라구요!</p>
<p>시작엔 학습할 내용들을 정리하고,
마지막엔 오늘 배운 내용 중 하나라도 TIL 작성하기!</p>
<br/>

<h3 id="팀원들과의-첫만남">팀원들과의 첫만남</h3>
<p>낯을 많이 가리는 성격이라 걱정이 이만저만이 아니었는데,,
이게뭐람! 아주 좋은 팀원들을 만난 것 같습니다!</p>
<p>팀장님을 제외한 다른 분들이 다 I라서 아직은 수줍수줍하지만,
오히려 그래서 팀장님을 더 잘 따를 수 있는 거 같아요!
팀장님이 작은 것에도 칭찬을 너무 잘해주셔서 팀 분위기가 아주 좋았습니다!</p>
<p>웃긴건 모든 사람이 T더라구요..ㅋㅋㅋㅋ
( 오히려 좋아 흐흐흫 )
모든 분들이 이성적인 판단을 이해해주실거라고 생각하며
마음 편하게 의견 제시하고, 조율해나갔던거 같아요!</p>
<p>그래서 저희 조의 이름은 <strong>&quot;응~나T야&quot;</strong>로 정하게 되었습니다!ㅋㅋ
티드로이드, 티오에스 등등.. 많은 팀명 후보가 있었지만,
듣자마자 꽂힌 응~ 나 T야! ㅋㅋㅋㅋㅋ</p>
<p>쿄쿄 다들 커여워..ㅋㅋ
아주 긴 회의로 마지막엔 다들 지쳐갔지만,,
저희 앞으로 화이팅 해보자구요!</p>
<br/>

<h3 id="미니프로젝트">미니프로젝트</h3>
<p>오늘의 저희의 미션은 자기소개하는 앱을 구현하기 위한 S.A를 작성하여 오후 6시까지 제출하는 것이었어요!</p>
<p>( 사실 S.A를 오늘 처음 알게 되었는데.. )</p>
<blockquote>
<p>S.A란 Starting Assignments의 약자로 개발 시작단계에서 작성하는 문서입니다.</p>
</blockquote>
<p>각자 팀원들이 생각하는 UI를 직접 그리고, 안의 들어갈 기능이나 배치등을 생각한 후에
추합하여 결정하였습니다.</p>
<p>팀장님께서 열심히 정리해주시고, 직접 그려주셔서 완성된 첫 와이어 프레임</p>
<p><img src="https://velog.velcdn.com/images/jihae__qu/post/6cdec290-d7b9-4a14-9389-4ad496d31021/image.jpeg" alt=""></p>
<p>귀엽져?!?!ㅋㅋㅋㅋ</p>
<p>UI를 어떻게 구성할 것인지에 대한 회의를 진행하고 그 후에 역할 분담을 했어요!
팀 프로젝트를 한번도 해보지 않아서 역할 분담을 어떻게 해야할지 아주 막막하더라구요!</p>
<p>팀 프로젝트를 진행하면서 Github를 사용해보지도 않았던터라,
병합이 뭔지.. 휴.. 갈길이 멀다 지해야..!</p>
<p>튜터님께 도움을 요청하고,
서서히 갈피를 잡기 시작했어요.</p>
<p>근데 역할 분담 후 개발을 생각하니 정하고 통일하는게 많더라구요..?!?
그래서 처음 써보는 피그마로 다시 UI를 작성하기 시작했습니다.</p>
<p><img src="https://velog.velcdn.com/images/jihae__qu/post/718c2b37-b4ce-40d7-9b96-b01b21222c59/image.png" alt="난생 처음 피그마 써본 사람의 UI"></p>
<p>역시 괜히 디자이너가 있는게 아녔어..!
디자인이 왜이렇게 힘든지..
팀원들과 많은 소통을 하고, 많은 이야기를 나누고
수정에 수정에 수정을 하여 UI를 구성하였습니다.</p>
<p>이 과정에서 많은 것을 깨달았던거 같아요.</p>
<p>우선 팀원들과 소통하는 것이 힘들었다기 보다는 어려웠던거 같아요.
뭔가 내 의견을 PR하고 싶을 때, 어떤 방법으로 어떻게 P.R 해야
팀원들에게 기분나쁘게 들리지 않을까 하는 고민도 있고,
모든 사람의 생각이 다르다보니 의견이 맞물리는 시점도 있는데
어떻게 하면 현명한 쪽으로 이끌어 나갈까? 하는 고민도 있었어요!</p>
<p>어떻게보면 처음 보는 사람들과 프로젝트를 시작하는게 처음이다보니
현명하게 소통하는 방법이 아직 어렵더라구요!</p>
<p>서툴게 자신의 의견을 PR하는 저임에도
아주 따숩하게 받아주고, 경청해주신 팀원들.. 아주 고맙습니다ㅎ</p>
<p>정말 알찬 하루였어요!
쵸큼 지치긴 했지만, 팀원들과 앱 계획하며 행복했다랄까..?ㅋㅋ</p>
<p><strong>내배캠 듣길 진짜 잘했다!!!!</strong></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[24/2/26] 두 개 뽑아서 더하기]]></title>
            <link>https://velog.io/@jihae__qu/24226-%EB%91%90-%EA%B0%9C-%EB%BD%91%EC%95%84%EC%84%9C-%EB%8D%94%ED%95%98%EA%B8%B0-%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-%EC%BD%94%EB%93%9C%EC%B9%B4%ED%83%80-in-Swift</link>
            <guid>https://velog.io/@jihae__qu/24226-%EB%91%90-%EA%B0%9C-%EB%BD%91%EC%95%84%EC%84%9C-%EB%8D%94%ED%95%98%EA%B8%B0-%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-%EC%BD%94%EB%93%9C%EC%B9%B4%ED%83%80-in-Swift</guid>
            <pubDate>Mon, 26 Feb 2024 14:51:53 GMT</pubDate>
            <description><![CDATA[<p>🍄 코딩테스트 
<a href="https://school.programmers.co.kr/learn/courses/30/lessons/68644">코딩테스트 문제 풀이</a></p>
<p>✍🏻 Github
<a href="%5Bhttps://github.com/BaeJihae/-Swift-CodingTest/blob/main/%5B%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4%5D/1-%EC%97%B0%EC%8A%B5/68644_%EB%91%90%EA%B0%9C%EB%BD%91%EC%95%84%EC%84%9C%EB%8D%94%ED%95%98%EA%B8%B0.swift%5D(https://github.com/BaeJihae/-Swift-CodingTest/blob/main/%5B%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4%5D/1-%EC%97%B0%EC%8A%B5/68644_%EB%91%90%EA%B0%9C%EB%BD%91%EC%95%84%EC%84%9C%EB%8D%94%ED%95%98%EA%B8%B0.swift)">문제 풀이 github 링크</a></p>
<h3 id="문제-설명">문제 설명</h3>
<p>정수 배열 numbers가 주어집니다. numbers에서 서로 다른 인덱스에 있는 두 개의 수를 뽑아 더해서 만들 수 있는 모든 수를 배열에 오름차순으로 담아 return 하도록 solution 함수를 완성해주세요.</p>
<hr>
<p><strong>제한사항</strong></p>
<ul>
<li>numbers의 길이는 2 이상 100 이하입니다.<ul>
<li>numbers의 모든 수는 0 이상 100 이하입니다.</li>
</ul>
</li>
</ul>
<hr>
<p><strong>입출력 예</strong></p>
<table>
<thead>
<tr>
<th>numbers</th>
<th>result</th>
</tr>
</thead>
<tbody><tr>
<td>[2,1,3,4,1]</td>
<td>[2,3,4,5,6,7]</td>
</tr>
<tr>
<td>[5,0,2,7]</td>
<td>[2,5,7,9,12]</td>
</tr>
</tbody></table>
<hr>
<p><strong>입출력 예 설명</strong></p>
<ul>
<li>입출력 예 #1<ul>
<li>2 = 1 + 1 입니다. (1이 numbers에 두 개 있습니다.)</li>
<li>3 = 2 + 1 입니다.</li>
<li>4 = 1 + 3 입니다.</li>
<li>5 = 1 + 4 = 2 + 3 입니다.</li>
<li>6 = 2 + 4 입니다.</li>
<li>7 = 3 + 4 입니다.</li>
<li>따라서 <code>[2,3,4,5,6,7]</code> 을 return 해야 합니다.</li>
</ul>
</li>
<li>입출력 예 #2<ul>
<li>2 = 0 + 2 입니다.</li>
<li>5 = 5 + 0 입니다.</li>
<li>7 = 0 + 7 = 5 + 2 입니다.</li>
<li>9 = 2 + 7 입니다.</li>
<li>12 = 5 + 7 입니다.</li>
<li>따라서 <code>[2,5,7,9,12]</code> 를 return 해야 합니다.</li>
</ul>
</li>
</ul>
<hr>
<h3 id="문제-풀이">문제 풀이</h3>
<p><strong>나의 풀이</strong></p>
<pre><code class="language-swift">import Foundation

func solution(_ numbers:[Int]) -&gt; [Int] {
    var answer = [Int]()
    for i in 0..&lt;numbers.count-1{
        for j in i+1..&lt;numbers.count{
            let newN:Int = numbers[i] + numbers[j] 
            if !answer.contains(newN) {
                answer.append(newN)
            }
        }
    }
    return answer.sorted()
}</code></pre>
<br/>

<p><strong>[ 회고 ]</strong></p>
<p>이 문제는 전에 이미 한번 풀었던 문제였다.
풀이 과정이 기억이 나지는 않았지만, 금방 문제를 이해하고 풀 수 있었다.</p>
<p>근데 전 풀이와 비교해보니 놀랍게도 풀이가 토시하나 틀리지 않고 똑같았다ㅋㅋ</p>
<p>다른 사람들의 풀이도 살펴보니, 다들 나랑 비슷하게 푸셨다.
이 풀이보다 시간이 더 빠른 코드는 없는 듯 했다.</p>
<p>아주 뿌듯^____^</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[24/2/7] K번째수]]></title>
            <link>https://velog.io/@jihae__qu/2427-K%EB%B2%88%EC%A7%B8%EC%88%98-%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-%EC%BD%94%EB%93%9C%EC%B9%B4%ED%83%80-in-Swift</link>
            <guid>https://velog.io/@jihae__qu/2427-K%EB%B2%88%EC%A7%B8%EC%88%98-%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-%EC%BD%94%EB%93%9C%EC%B9%B4%ED%83%80-in-Swift</guid>
            <pubDate>Wed, 07 Feb 2024 14:41:53 GMT</pubDate>
            <description><![CDATA[<p>🍄 코딩테스트 
<a href="https://school.programmers.co.kr/learn/courses/30/lessons/42748">코딩테스트 문제 풀이</a></p>
<p>✍🏻 Github</p>
<p><a href="%5Bhttps://github.com/BaeJihae/-Swift-CodingTest/blob/main/%5B%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4%5D/1-%EC%97%B0%EC%8A%B5/42748_K%EB%B2%88%EC%A7%B8%EC%88%98.swift%5D(https://github.com/BaeJihae/-Swift-CodingTest/blob/main/%5B%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4%5D/1-%EC%97%B0%EC%8A%B5/42748_K%EB%B2%88%EC%A7%B8%EC%88%98.swift)">문제 풀이 github 링크</a></p>
<br/>


<h3 id="문제-설명">문제 설명</h3>
<p>배열 array의 i번째 숫자부터 j번째 숫자까지 자르고 정렬했을 때, k번째에 있는 수를 구하려 합니다.</p>
<p>예를 들어 array가 [1, 5, 2, 6, 3, 7, 4], i = 2, j = 5, k = 3이라면</p>
<ol>
<li>array의 2번째부터 5번째까지 자르면 [5, 2, 6, 3]입니다.</li>
<li>1에서 나온 배열을 정렬하면 [2, 3, 5, 6]입니다.</li>
<li>2에서 나온 배열의 3번째 숫자는 5입니다.</li>
</ol>
<p>배열 array, [i, j, k]를 원소로 가진 2차원 배열 commands가 매개변수로 주어질 때, commands의 모든 원소에 대해 앞서 설명한 연산을 적용했을 때 나온 결과를 배열에 담아 return 하도록 solution 함수를 작성해주세요.</p>
<p><strong>제한사항</strong></p>
<ul>
<li>array의 길이는 1 이상 100 이하입니다.<ul>
<li>array의 각 원소는 1 이상 100 이하입니다.</li>
</ul>
</li>
<li>commands의 길이는 1 이상 50 이하입니다.</li>
<li>commands의 각 원소는 길이가 3입니다.</li>
</ul>
<p><strong>입출력 예</strong></p>
<table>
<thead>
<tr>
<th>array</th>
<th>commands</th>
<th>return</th>
</tr>
</thead>
<tbody><tr>
<td>[1, 5, 2, 6, 3, 7, 4]</td>
<td>[[2, 5, 3], [4, 4, 1], [1, 7, 3]]</td>
<td>[5, 6, 3]</td>
</tr>
</tbody></table>
<p><strong>입출력 예 설명</strong></p>
<pre><code>[1, 5, 2, 6, 3, 7, 4]를 2번째부터 5번째까지 자른 후 정렬합니다. [2, 3, 5, 6]의 세 번째 숫자는 5입니다.

[1, 5, 2, 6, 3, 7, 4]를 4번째부터 4번째까지 자른 후 정렬합니다. [6]의 첫 번째 숫자는 6입니다.

[1, 5, 2, 6, 3, 7, 4]를 1번째부터 7번째까지 자릅니다. [1, 2, 3, 4, 5, 6, 7]의 세 번째 숫자는 3입니다.</code></pre><hr>
<h3 id="문제-풀이">문제 풀이</h3>
<h4 id="나의-풀이"><strong>나의 풀이</strong></h4>
<pre><code class="language-swift">import Foundation

func solution(_ array:[Int], _ commands:[[Int]]) -&gt; [Int] {
    return commands.map{ i in array[i[0]-1...i[1]-1].sorted{$0 &lt; $1}[i[2]-1] }
}</code></pre>
<p>*<em>문제 해결 방법
*</em></p>
<ul>
<li>해당 배열의 서브스트링 문법을 활용하여 원하는 범위로 잘라서 <code>sorted</code> 함수를 이용해 오름차순으로 정렬하여 서브스트링 문법을 활용해 원하는 값을 도출하였다. 이 과정에서 <code>map</code> 고차함수를 사용해 바로 배열로 출력했다.</li>
</ul>
<br/>
<br/>]]></description>
        </item>
        <item>
            <title><![CDATA[[24/2/7] 문자열 내 마음대로 정렬하기]]></title>
            <link>https://velog.io/@jihae__qu/2427-%EB%AC%B8%EC%9E%90%EC%97%B4-%EB%82%B4-%EB%A7%88%EC%9D%8C%EB%8C%80%EB%A1%9C-%EC%A0%95%EB%A0%AC%ED%95%98%EA%B8%B0-%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-%EC%BD%94%EB%93%9C%EC%B9%B4%ED%83%80-in-Swift</link>
            <guid>https://velog.io/@jihae__qu/2427-%EB%AC%B8%EC%9E%90%EC%97%B4-%EB%82%B4-%EB%A7%88%EC%9D%8C%EB%8C%80%EB%A1%9C-%EC%A0%95%EB%A0%AC%ED%95%98%EA%B8%B0-%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-%EC%BD%94%EB%93%9C%EC%B9%B4%ED%83%80-in-Swift</guid>
            <pubDate>Wed, 07 Feb 2024 14:22:05 GMT</pubDate>
            <description><![CDATA[<p>🍄 코딩테스트 
<a href="https://school.programmers.co.kr/learn/courses/30/lessons/12915">코딩테스트 문제 풀이</a></p>
<p>✍🏻 Github</p>
<p><a href="https://github.com/BaeJihae/-Swift-CodingTest/blob/main/%5B%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4%5D/1-%EC%97%B0%EC%8A%B5/12915_%EB%AC%B8%EC%9E%90%EC%97%B4%EB%82%B4%EB%A7%88%EC%9D%8C%EB%8C%80%EB%A1%9C%EC%A0%95%EB%A0%AC%ED%95%98%EA%B8%B0.swift">문제 풀이 github 링크</a></p>
<h3 id="문제-설명">문제 설명</h3>
<p>문자열로 구성된 리스트 strings와, 정수 n이 주어졌을 때, 각 문자열의 인덱스 n번째 글자를 기준으로 오름차순 정렬하려 합니다. 예를 들어 strings가 [&quot;sun&quot;, &quot;bed&quot;, &quot;car&quot;]이고 n이 1이면 각 단어의 인덱스 1의 문자 &quot;u&quot;, &quot;e&quot;, &quot;a&quot;로 strings를 정렬합니다.</p>
<p><strong>제한 조건</strong></p>
<ul>
<li>strings는 길이 1 이상, 50이하인 배열입니다.</li>
<li>strings의 원소는 소문자 알파벳으로 이루어져 있습니다.</li>
<li>strings의 원소는 길이 1 이상, 100이하인 문자열입니다.</li>
<li>모든 strings의 원소의 길이는 n보다 큽니다.</li>
<li>인덱스 1의 문자가 같은 문자열이 여럿 일 경우, 사전순으로 앞선 문자열이 앞쪽에 위치합니다.</li>
</ul>
<p><strong>입출력 예</strong></p>
<table>
<thead>
<tr>
<th>strings</th>
<th>n</th>
<th>return</th>
</tr>
</thead>
<tbody><tr>
<td>[&quot;sun&quot;, &quot;bed&quot;, &quot;car&quot;]</td>
<td>1</td>
<td>[&quot;car&quot;, &quot;bed&quot;, &quot;sun&quot;]</td>
</tr>
<tr>
<td>[&quot;abce&quot;, &quot;abcd&quot;, &quot;cdx&quot;]</td>
<td>2</td>
<td>[&quot;abcd&quot;, &quot;abce&quot;, &quot;cdx&quot;]</td>
</tr>
</tbody></table>
<p><strong>입출력 예 설명</strong></p>
<ul>
<li><p><strong>입출력 예 1</strong></p>
<p> &quot;sun&quot;, &quot;bed&quot;, &quot;car&quot;의 1번째 인덱스 값은 각각 &quot;u&quot;, &quot;e&quot;, &quot;a&quot; 입니다. 이를 기준으로 strings를 정렬하면 [&quot;car&quot;, &quot;bed&quot;, &quot;sun&quot;] 입니다.</p>
</li>
<li><p><strong>입출력 예 2</strong></p>
<p>  &quot;abce&quot;와 &quot;abcd&quot;, &quot;cdx&quot;의 2번째 인덱스 값은 &quot;c&quot;, &quot;c&quot;, &quot;x&quot;입니다. 따라서 정렬 후에는 &quot;cdx&quot;가 가장 뒤에 위치합니다. &quot;abce&quot;와 &quot;abcd&quot;는 사전순으로 정렬하면 &quot;abcd&quot;가 우선하므로, 답은 [&quot;abcd&quot;, &quot;abce&quot;, &quot;cdx&quot;] 입니다.</p>
</li>
</ul>
<hr>
<br/>

<h3 id="문제-풀이">문제 풀이</h3>
<h4 id="나의-풀이"><strong>나의 풀이</strong></h4>
<pre><code class="language-swift">func solution(_ strings:[String], _ n:Int) -&gt; [String] {
    return strings.sorted{ ( $0[String.Index(encodedOffset: n)] &lt; $1[String.Index(encodedOffset: n)] ) || ($0[String.Index(encodedOffset: n)] == $1[String.Index(encodedOffset: n)] &amp;&amp; $0 &lt; $1) }                   
}</code></pre>
<pre><code>테스트 1 〉    통과 (0.09ms, 16.5MB)
테스트 2 〉    통과 (0.10ms, 16.3MB)
테스트 3 〉    통과 (0.14ms, 16.5MB)
테스트 4 〉    통과 (0.15ms, 16.5MB)
테스트 5 〉    통과 (0.09ms, 16.3MB)
테스트 6 〉    통과 (0.19ms, 16.5MB)
테스트 7 〉    통과 (0.10ms, 16.2MB)
테스트 8 〉    통과 (0.16ms, 16.4MB)
테스트 9 〉    통과 (0.13ms, 16.3MB)
테스트 10 〉    통과 (0.25ms, 16.5MB)
테스트 11 〉    통과 (0.09ms, 16.5MB)
테스트 12 〉    통과 (0.36ms, 16.5MB)</code></pre><h4 id="문제-해결-방법"><strong>문제 해결 방법</strong></h4>
<ul>
<li>n번째의 문자열을 찾기위해 String.Index(encodedOffset: n) 를 사용했다.</li>
<li>같은 문자열이 여럿일 경우엔 사전식으로 나열하기 위해 n번째 문자열이 같을 경우 문자열 비교하는 코드를 추가로 사용했다.<br/>

</li>
</ul>
<h4 id="다른-사람-풀이"><strong>다른 사람 풀이</strong></h4>
<pre><code class="language-swift">func solution(_ strings:[String], _ n:Int) -&gt; [String] {
    return strings.sorted{  Array($0)[n] == Array($1)[n] ? $0 &lt; $1 :  Array($0)[n] &lt; Array($1)[n] }
}</code></pre>
<pre><code>테스트 1 〉    통과 (0.09ms, 16.3MB)
테스트 2 〉    통과 (0.20ms, 16.4MB)
테스트 3 〉    통과 (1.53ms, 16.5MB)
테스트 4 〉    통과 (1.39ms, 16.4MB)
테스트 5 〉    통과 (0.30ms, 16.5MB)
테스트 6 〉    통과 (3.33ms, 16.6MB)
테스트 7 〉    통과 (0.36ms, 16.6MB)
테스트 8 〉    통과 (0.52ms, 16.4MB)
테스트 9 〉    통과 (0.45ms, 16.6MB)
테스트 10 〉    통과 (6.94ms, 16.3MB)
테스트 11 〉    통과 (0.17ms, 16.4MB)
테스트 12 〉    통과 (15.57ms, 16.4MB)</code></pre><p><strong>문제 해결 방법</strong></p>
<p>이 풀이는 나의 풀이와 방법은 같지만, Array를 이용하여 n번째의 문자열을 도착하였다.</p>
<p>아무래도 배열을 사용하다보니, 실행시간이 좀 더 오래 걸렸다.</p>
<br/>

<h3 id="중요한-개념">중요한 개념</h3>
<ul>
<li>String의 n번째의 문자열을 도출하는 코드 : <code>String.Index(encodedOffset: n)</code></li>
</ul>
<br/>
<br/>]]></description>
        </item>
    </channel>
</rss>