<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>Mikyo CodingStory</title>
    <link>https://milyo-codingstories.tistory.com/</link>
    <description></description>
    <language>ko</language>
    <pubDate>Wed, 13 May 2026 02:42:38 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>밀쿄</managingEditor>
    <item>
      <title>VoiceOver: App Testing Beyond The Visuals</title>
      <link>https://milyo-codingstories.tistory.com/76</link>
      <description>&lt;p&gt;안녕하세요.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;오늘은 &lt;a href=&quot;https://developer.apple.com/videos/play/wwdc2018/226/?time=541&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;VoiceOverVoiceOver:&amp;nbsp;App&amp;nbsp;Testing&amp;nbsp;Beyond&amp;nbsp;The&amp;nbsp;Visuals&lt;/a&gt;라는 wwdc영상을 간단히 한 번 알아보겠습니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;VoiceOver라는 것은 무엇일까요?&lt;/p&gt;
&lt;p&gt;1) Screen Reader&lt;/p&gt;
&lt;p&gt;2) 시각 장애인을 위한 것&lt;/p&gt;
&lt;p&gt;1,2 둘 다 사실이지만 더 정확하게는 앱을 사용하는 또 다른 방법입니다.&lt;/p&gt;
&lt;p&gt;즉, 앱을 사용하는 모두가 VoiceOver를 사용할 수 있다는 거죠.&lt;/p&gt;
&lt;p&gt;하지만 슬프게도 &lt;span style=&quot;color: #333333;&quot;&gt;VoiceOver사용자가 모든 앱들을 사용할 수 있는 것은 아닙니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;모든 앱들이 VoiceOver를 사용하지 않기 때문이죠.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;그렇다면 개발자들이 &lt;span style=&quot;color: #333333;&quot;&gt;VoiceOver를 업데이트 해야하는데&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;과연 왜 업데이트 해야할까요?&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;1) VoiceOver를 사용한 테스트가 새로운 관점을 제공해줍니다.&lt;/p&gt;
&lt;p&gt;2) 앱이 겉으로만 보기 좋다고 사용하기 좋은 것은 아닙니다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp; &amp;nbsp; 즉, 다시 말하면 VoiceOver를 지원하면 눈 감고도 사용할 수 있는 깔끔한 앱이라는 것을 암시한다는 거죠&lt;/p&gt;
&lt;p&gt;3) 새로운 도전과 통찰력을 발견할 수 있습니다.&lt;/p&gt;
&lt;p&gt;4) VoiceOver가 우리가 하는 일의 핵심(?)이라고 하네요.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;iOS 개발자로써 사용하기 쉽고 이해하기 쉬운 앱을 만드는 것에 자부심을 느낀다고 합니다.&lt;/p&gt;
&lt;p&gt;그리고 발표자가 질문을 던지네요.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&lt;b&gt;&quot;당신의 앱은 너무 쉬워서 눈감고 사용할 수 있나요?&quot;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;이 질문은 테스터가 아닌 사용자에게 최고의 경험을 제공할 책임이 있는 '디자이너'와 '개발자'에게 던지는 질문이라고 합니다.&lt;/p&gt;
&lt;p&gt;그리고 이 질문의 답은 VoiceOver 테스터로 하라고 합니다.&lt;/p&gt;
&lt;p&gt;VoiceOver를 탐색하는 방법을 강제할 순 없으니 두 가지 모든 경우에 대해 테스트를 수행해야합니다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;( 이 부분이 이해가 잘 안갔는데 아마 화면을 탭하면서 탐색하는 방법이랑 화면을 쓸면서 탐색하는 방법 두 개가 있는 것 같습니다.)&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;여기서부터는 전반적으로 VoiceOver 제스처에 대해서 설명합니다. &amp;nbsp;&lt;/p&gt;
&lt;p&gt;저도 몇 번 듣고 번역기도 돌려봤는데 제대로 이해가 안되는 부분이 있으니 언제든 지적해주세요.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;VoiceOver를 사용하지 않으면 터치하면 앱이 열리지만&lt;/p&gt;
&lt;p&gt;VoiceOver를 사용하는 경우 한 번 터치하면 탭한 것이 무언인지 설명하고 그 탭한 액션을 수행하고 싶으면 두 번 터치하면 되네요.&lt;/p&gt;
&lt;p&gt;그리고 만약 VoiceOver를 중단하고 싶으면 두손가락으로 탭하면 됩니다.&lt;/p&gt;
&lt;p&gt;또한 홈화면으로 돌아가고 싶으면 일반 사용자처럼 밑에서부터 끌어올리면 되지만 다른 점은 진동이 있습니다.&lt;/p&gt;
&lt;p&gt;첫번째 진동은 홈화면으로 두번 째 진동은 앱전환기로 넘어갑니다.&lt;/p&gt;
&lt;p&gt;더불어서 홈화면 사이를 왔다갔다할 때는 세손가락을 뒤로가고 싶거나 취소버튼이 필요할때는 Z패턴 제스처를 사용한다고 합니다.&lt;/p&gt;
&lt;p&gt;이제 그 다음으론 Rotor이라는 제스쳐가 등장하네요. 두 손가락으로 보이지 않는 손잡이를 돌리는 듯한 제스쳐 입니다.&lt;/p&gt;
&lt;p&gt;Rotor를 사용해서 초첨이 맞춰진 뷰의 모든 옵션을 볼 수 있다고 합니다.&lt;/p&gt;
&lt;p&gt;개발자에게는 Rotor가 중요한다고 합니다. 머리말을 전환할 수 있다고 하네요.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;아마도 뒤에 시연에서 보니 Rotor 손잡이를 돌려서 heading(머리말)에 맞추고 손가락을 쓸어 내리니&lt;/p&gt;
&lt;p&gt;앱스토어에서 앱 Tab을 보면 IPhone이 처음이라면, 무료앱순위, 유료앱 순위, 인기앱, 새롭게 도전하세요, 아끼고, 모으고, 불리세요 이런 타이틀끼리 전환이 되네요.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;이렇게 데모가 끝나고 데모를 시연했던 시작장애인분이 아까했던 질문을 되묻습니다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&lt;b&gt;&quot;당신의 앱은 너무 쉬워서 눈감고 사용할 수 있나요?&quot;&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;그리고 발표자가 최종적결으로는 다음과 같이 말하네요.&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;1) VoiceOver는&amp;nbsp;&lt;/span&gt;메시지가 제대로 전달되고 있는 또 다른 방법입니다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;2) VoiceOver로 탐색하는 데 많은 시간이 소요된다면 보이는 것 역시 마찬가지 입니다.&lt;/p&gt;
&lt;p&gt;즉 섹션 제목을 추가하고 컨텐츠를 분리하는 등 깔끔하게 만들 필요가 있다는 것입니다.&lt;/p&gt;
&lt;p&gt;3)&amp;nbsp;VoiceOver는 읽기 순서로 탐색하기 때문에&amp;nbsp;&lt;span style=&quot;color: #333333;&quot;&gt;앱의 소리가 잘못된 경우 컨텐츠 역시 마찬가지일 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;VoiceOver에 대해서 아무런 생각이 없었는데 이번기회에 조금 관심을 가져봐야겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;흥미롭네요. 이쁜 앱이 잘 만든 앱인줄 알았는데 들리는 것도 꽤 중요한 것 같습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Swift&amp;amp;IOS</category>
      <category>VoiceOver</category>
      <author>밀쿄</author>
      <guid isPermaLink="true">https://milyo-codingstories.tistory.com/76</guid>
      <comments>https://milyo-codingstories.tistory.com/76#entry76comment</comments>
      <pubDate>Tue, 5 Jan 2021 18:26:50 +0900</pubDate>
    </item>
    <item>
      <title>2020년 회고</title>
      <link>https://milyo-codingstories.tistory.com/75</link>
      <description>&lt;p&gt;오랜만입니다.&lt;/p&gt;
&lt;p&gt;사실 중간에 여러 포스팅을 할려고 했으니 너무 바쁜 관계로 포스팅을 못했네요.&lt;/p&gt;
&lt;p&gt;저에게 2020년은 너무 많은 일들이 있었던 한해였습니다.&lt;/p&gt;
&lt;p&gt;소집해제, 프리랜서, 복학, 면접 까지 다사다난 했던 한 해였던 것 같습니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;01. 소집해제&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;길고 긴 사회 복무 생활이 끝이 났습니다.&lt;br /&gt;사실 사회 복무가 인생의 터닝 포인트가 되었습니다.&lt;/p&gt;
&lt;p&gt;사회 복무 전의 저는 방황을 하고 있었습니다.&lt;/p&gt;
&lt;p&gt;방황이란 단어가 좀 부정적으로 다가올 수 있지만&amp;nbsp;&lt;/p&gt;
&lt;p&gt;기대하고 갔던 전공 공부와 실제하는 전공 공부 사이에서 오는 갭이 너무 컸고&lt;/p&gt;
&lt;p&gt;무엇을 하고 싶은걸까에 대해 고민이 많았습니다.&lt;/p&gt;
&lt;p&gt;사회복무를 시작하고 해보고 싶은걸 해보기 시작했습니다.&lt;/p&gt;
&lt;p&gt;2년이란 시간을 버릴꺼란 두려움도 있었지만 iOS 앱 개발이라는걸 시작했습니다.&lt;/p&gt;
&lt;p&gt;그리고 2년이 지나가고 현재 iOS 앱 개발자를 꿈꾸고 있습니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;02. 프리랜서&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;프리랜서란 경험은 앞에서 이야기 한 사회복무요원이란 터닝 포인트가 없었다면 불가능했을 경험이라 생각합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;대충 시기는 6월부터 8월까지 3개월 조금 안되는 기간동안 필드를 경험해봤습니다.&lt;/p&gt;
&lt;p&gt;어떻게보면 저혼자 달려온 1년반이 조금 넘는 시기에서 배운 것보다 더 많은걸 배웠습니다&amp;nbsp;&lt;/p&gt;
&lt;p&gt;현업에서 협업이 어떻게 이루어지느지, RxSwift, MVVM, Moya 등등 셀 수 없는 걸 배울 수 있었고 귀중한 시간이었습니다.&lt;/p&gt;
&lt;p&gt;어쩌면 올해 있었던 일들중에선 젤 값지고 소중했던 시간이었던 것 같습니다.&lt;/p&gt;
&lt;p&gt;더불어서 iOS 앱 개발자로써 한 걸음 더 나아갈 수 있는 발판이 되었습니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;03. 복학&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;사실 복학을 하기전에 고민을 많이했습니다.&lt;/p&gt;
&lt;p&gt;프리랜서에서 정규직을 지원하든지 다른 회사를 다니든 어떻게든 현업에 남을지 아니면 복학을 할 지 고민을 했었습니다.&lt;/p&gt;
&lt;p&gt;일단 졸업장을 따자하고 복학을 골랐는데 회고를 쓰는 지금은 후회가 많이 남습니다.&lt;/p&gt;
&lt;p&gt;그냥 현업이 재미었던 것도 있지만 다니고 있는 전공과 제가하고싶은게 다르다보니 거기서 오는 괴리감도 있었고&lt;/p&gt;
&lt;p&gt;매주 리셋되는 과제 때문에 힘들어서도 그런게 있었지만 제일 컸던 건&amp;nbsp;&lt;/p&gt;
&lt;p&gt;주위 개발자들이 하나둘 졸업하고 취업을 하다보니 뒤쳐지는 느낌도 있었습니다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;물론 저는 그 분들에 비해서 어리지만 어쨰서인지 그런 느낌이 들더라구요.&lt;/p&gt;
&lt;p&gt;그래서 더더욱 복학을 후회했던 것 같습니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;04. 다시 현업으로&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;복학을 후회했고 이제 다시 현업으로 나가기 위해 발버둥 치고 있습니다.&lt;/p&gt;
&lt;p&gt;코로나라는 시대적 상황과 미졸업자라는 신분이 걸려서 취업하는데 에로 사항이 많습니다.&lt;/p&gt;
&lt;p&gt;그치만 다시 현업으로 나가고 싶어서 여기 저기 서류를 넣고 있습니다만 결과가 좋지 않습니다.&lt;/p&gt;
&lt;p&gt;물론 최근 R사에서 2차 면접까지 보기는 했지만 아직 결과를 안나왔는데 느낌은 좋지 않습니다.&lt;/p&gt;
&lt;p&gt;결과가 나온다면 별도의 후기로 찾아뵙도록 하겠습니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;저의 한해를 네 가지 키워드로 정리해봤습니다.&lt;/p&gt;
&lt;p&gt;여러분들의 한해는 어떠셨나요?&lt;/p&gt;
&lt;p&gt;코로나 때문에 정신 없었던 한해인가요?&lt;/p&gt;
&lt;p&gt;저도 그렇습니다만 코로나 말고 다르게 표현한다면&lt;/p&gt;
&lt;p&gt;&lt;b&gt;저는 iOS개발자로써 조금 더 다가갔던 한 해&lt;/b&gt;였던 것 같습니다.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;내년에는 더 다가가서 현업에 있으면 좋겠네요.&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;오랜만에 긴 글 포스팅을 읽어주신 분들이 있다면 감사합니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>잡담</category>
      <category>2020</category>
      <category>iOS개발자</category>
      <category>프리랜서</category>
      <category>현업이그리운</category>
      <category>회고</category>
      <author>밀쿄</author>
      <guid isPermaLink="true">https://milyo-codingstories.tistory.com/75</guid>
      <comments>https://milyo-codingstories.tistory.com/75#entry75comment</comments>
      <pubDate>Sat, 12 Dec 2020 17:45:07 +0900</pubDate>
    </item>
    <item>
      <title>유니온 파인드(Union-Find)</title>
      <link>https://milyo-codingstories.tistory.com/74</link>
      <description>&lt;p&gt;안녕하세요. 밀쿄입니다.&lt;/p&gt;
&lt;p&gt;오늘은 유니온 파인드라는 알고리즘에 대해서 알아보겠습니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;유니온 파인드는 &lt;b&gt;그래프 알고리즘의 일종&lt;/b&gt; 입니다.&lt;/p&gt;
&lt;p&gt;그리고 &lt;b&gt;합집합 찾기&lt;/b&gt;라는 의미를 담고 있습니다.&lt;/p&gt;
&lt;p&gt;이렇게 말하면 감이 안오지만 쉽게 말하자면&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&lt;b&gt;&quot;여러 가지 노드가 있을 때, 두 노드를 선택하여&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&lt;b&gt;가 같은 그래프에 속하는 지 판별하는 알고리즘&quot;&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot;&gt;이라고 생각하시면 편할 것 같습니다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot;&gt;따라서 이 알고리즘은 두 가지 연산으로 이루어져있습니다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot;&gt;이름에도 나와있듯이 &lt;b&gt;유니온(Union) 연산과 찾는(Find) 연산&lt;/b&gt;입니다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot;&gt;&lt;b&gt;Union은 두 노드가 속해있는 집합을 합치는 연산&lt;/b&gt;입니다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot;&gt;&lt;b&gt;Find는 한 노드가 어떤 집합에 포함되어 있는 지 찾는 연산&lt;/b&gt; 입니다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot;&gt;예시를 하나 들어보겠습니다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot;&gt;처음에는 1, 2, 3이 있다고 가정해봅시다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot;&gt;각각의 원소들은 연결된 정보가 없기 때문에 부모를 자기 자신으로 가지고 있습니다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot;&gt;1-1 . 2-2, 3-3 이런식으로 말이죠.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot;&gt;만약 여기서 1-2하고 연결되어있고 2-3이 연결되어있다고 입력이 들어온다고 가정해봅시다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot;&gt;1과 2는 서로 부모 노드가 다르므로 재귀 함수를 통해서 연결 여부를 파악하게 됩니다 (find 연산)&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot;&gt;재귀 함수 결과 1과 2는 서로 다른 부모를 가졌으므로 연결 해줍니다. (union 연산)&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot;&gt;2하고 3을 연결할때는 2의 부모와 3의 부모를 찾습니다. (find 연산)&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot;&gt;부모를 찾아보니 2의 부모는 1이고 3의 부모는 3인것을 찾습니다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot;&gt;따라서 두 부모가 다르므로 1과 3을 연결해줍니다 (union 연산)&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot;&gt;결국 연산결과 부모가 모두 1이기 때문에 세 노드는 모두 같은 그래프에 속한다는 것을 알 수 있습니다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot;&gt;이것이 유니온 파인드 알고리즘 입니다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot;&gt;대표적인 문제를 하나 풀어보겠습니다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/2606&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;www.acmicpc.net/problem/2606&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1590388227672&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-og-type=&quot;website&quot; data-og-title=&quot;2606번: 바이러스&quot; data-og-description=&quot;첫째 줄에는 컴퓨터의 수가 주어진다. 컴퓨터의 수는 100 이하이고 각 컴퓨터에는 1번 부터 차례대로 번호가 매겨진다. 둘째 줄에는 네트워크 상에서 직접 연결되어 있는 컴퓨터 쌍의 수가 주어��&quot; data-og-host=&quot;www.acmicpc.net&quot; data-og-source-url=&quot;https://www.acmicpc.net/problem/2606&quot; data-og-url=&quot;https://www.acmicpc.net/problem/2606&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/sKzuv/hyF99ilNZL/C8JBzuuRh1xy0o2DNNdgfK/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630&quot;&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/2606&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.acmicpc.net/problem/2606&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/sKzuv/hyF99ilNZL/C8JBzuuRh1xy0o2DNNdgfK/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot;&gt;2606번: 바이러스&lt;/p&gt;
&lt;p class=&quot;og-desc&quot;&gt;첫째 줄에는 컴퓨터의 수가 주어진다. 컴퓨터의 수는 100 이하이고 각 컴퓨터에는 1번 부터 차례대로 번호가 매겨진다. 둘째 줄에는 네트워크 상에서 직접 연결되어 있는 컴퓨터 쌍의 수가 주어��&lt;/p&gt;
&lt;p class=&quot;og-host&quot;&gt;www.acmicpc.net&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p&gt;먼저 처음에는 연결정보가 없으므로 부모를 자기 자신으로 만들어 줍니다.&lt;/p&gt;
&lt;pre id=&quot;code_1590388322080&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;var computers: Int = Int(readLine()!)!
var connection: Int = Int(readLine()!)!

var parents: [Int] = [Int]()

for index in 0 ... computers {
    parents.append(index)
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;그 다음엔 차례로 입력되는 두 노드를 연결해줍니다.&lt;/p&gt;
&lt;pre id=&quot;code_1590388375033&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;while connection != 0 {
    
    let input: [Int] = readLine()!.split(separator: &quot; &quot;).map { Int(String($0))! }
    var u: Int = input.first!
    var v: Int = input.last!
    
    union(&amp;amp;u,&amp;amp;v)
    connection -= 1
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;그리고 1번 컴퓨터가 바이러스에 걸렸으므로 1번과 연결된 노드의 갯수를 찾습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1590388428560&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;var result = 0
var one = find(1)
for index in 2 ... computers {
    if one == find(index) {
        result += 1
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;자 이제 핵심 로직이 union과 find를 한 번 살펴봅시다.&lt;/p&gt;
&lt;pre id=&quot;code_1590388470062&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;func union(_ x: inout Int, _ y: inout Int) {
    
    x = find(x)
    y = find(y)
    
    if x != y {
        parents[y] = x
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;x와 y의 부모를 찾아주고 부모가 같지 않다면 연결해줍니다.&lt;/p&gt;
&lt;p&gt;그럼 부모를 찾는 여정을 떠나봅시다.&lt;/p&gt;
&lt;pre id=&quot;code_1590388601337&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;func find(_ x: Int) -&amp;gt; Int {
    if x == parents[x] {
        return x
    } else {
        let y = find(parents[x])
        parents[x] = y
        return y
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;처음에 자기자신을 부모노드로 정했기 때문에 진짜 부모는 자기 자신을 가지고 있을껍니다.&lt;/p&gt;
&lt;p&gt;따라서 x랑 parents[x]랑 같은 값을 가지고 있으면 진짜 부모 이므로 x를 리턴 해주면 됩니다.&lt;/p&gt;
&lt;p&gt;만약 그렇지 않다면 재귀호출을 통해서 진짜 부모를 찾아주고 그 값을 리턴하면 됩니다.&lt;/p&gt;
&lt;p&gt;이렇게 작성된 코드를 제출하면 통과하실 수 있습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lhGvW/btqEmKTPOkG/M4jsSnJfAvbk4Ec98JYcp1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lhGvW/btqEmKTPOkG/M4jsSnJfAvbk4Ec98JYcp1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lhGvW/btqEmKTPOkG/M4jsSnJfAvbk4Ec98JYcp1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlhGvW%2FbtqEmKTPOkG%2FM4jsSnJfAvbk4Ec98JYcp1%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;다음 시간에 다른 알고리즘이나 다른 유니온 파인드 문제를 풀어보도록 하겠습니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>자료구조</category>
      <category>swift</category>
      <category>unionfind</category>
      <category>스위프트</category>
      <category>알고리즘</category>
      <category>유니온파인드</category>
      <author>밀쿄</author>
      <guid isPermaLink="true">https://milyo-codingstories.tistory.com/74</guid>
      <comments>https://milyo-codingstories.tistory.com/74#entry74comment</comments>
      <pubDate>Mon, 25 May 2020 15:41:24 +0900</pubDate>
    </item>
    <item>
      <title>SwiftUI - 맛보기</title>
      <link>https://milyo-codingstories.tistory.com/73</link>
      <description>&lt;p&gt;안녕하세요. 밀쿄입니다.&lt;br /&gt;오늘은 두 번째 시간입니다.&lt;br /&gt;오늘은 SwiftUI로 프로젝트를 생성해보고 간단히 살펴보겠습니다.&lt;/p&gt;
&lt;p&gt;생성된 파일을 보면 ContentView.swift가 있는데 기존에 StoryBoard로 프로젝트를 생성하면 있던 ViewController.swift에 해당합니다.&lt;/p&gt;
&lt;p&gt;ContentView부터 보면 재미있을 것 같지만 SceneDelegate.swift에 가면 특이한 부분이 있어서 그것부터 보겠습니다. UIHostingController라는 처음보는 녀석이 있을겁니다.&lt;br /&gt;UIHostingController의 선언부를 보면 다음과 같이 되어있습니다.&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;open class UIHostingController&amp;lt;Content&amp;gt; : UIViewController where Content : View
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;일단 눈에 띄는건&lt;b&gt; UIViewController를 상속 받는 다는 점과 View를 채택하고 있는 Content를 재네릭 변수&lt;/b&gt;로 받고 있습니다.&lt;/p&gt;
&lt;pre class=&quot;swift&quot;&gt;&lt;code&gt; open var rootViewController: UIViewController?&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;그 이유는&lt;b&gt; rootViewController의 타입이 UIViewController&lt;/b&gt; 이기 때문입니다.&lt;br /&gt;그리고 또한 UIHostingController가 UIViewController 타입이기 때문에 UIViewController에서 push하거나 present하거나 등 &lt;b&gt;UIViewController에서 SwiftUI뷰로 연결해줘야할 때 이 클래스를 사용&lt;/b&gt;하기도 합니다.&lt;/p&gt;
&lt;p&gt;그럼 저기에 있는 View는 무엇인지 한 번 살펴보도록 하겠습니다.&lt;/p&gt;
&lt;pre class=&quot;swift&quot;&gt;&lt;code&gt;public protocol View {
    associatedtype Body : View
    var body: Self.Body { get }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;기존의 &lt;a href=&quot;https://developer.apple.com/documentation/uikit/uiview&quot;&gt;UIView&lt;/a&gt;가 class였지만 View는 프로토콜 입니다.&lt;br /&gt;근데 위 선언을 보면 조금 특이하게 생겼습니다.&lt;br /&gt;&lt;b&gt;body에서 리턴한 것이 다시 View를 채택하는 View를 리턴&lt;/b&gt;합니다.&lt;br /&gt;이런 구조라면 무한 재귀호출이 되겠지만 View를 채택하는 걸 찾아보면 아래처럼 &lt;b&gt;재귀호출을 막고&lt;/b&gt;있습니다.&lt;/p&gt;
&lt;pre class=&quot;pgsql&quot;&gt;&lt;code&gt;extension Text : View {
    public typealias Body = Never
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;이렇듯 &lt;b&gt;SwiftUI에서는 기본 뷰들이나 컨테이너 뷰에는 Body에 Never타입을 사용&lt;/b&gt;합니다.&lt;br /&gt;자 여기까지 살펴봤으니 ContentView.swift를 보겠습니다.&lt;/p&gt;
&lt;pre class=&quot;capnproto&quot;&gt;&lt;code&gt;struct ContentView: View {    
    var body: some View {
        Text(&quot;Hello World&quot;)
    }

}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;여기서 CanvasView를 보면 Hello World가 출력되는 것을 확인할 수 있습니다.&lt;br /&gt;Text안에 있는 문자열을 바꿔보시면 CanvasView도 실시간으로 변한다는 것을 확인 할 수 있습니다.&lt;br /&gt;저는 여기서 &quot;폰크 크기가 30인 Bold인 문자열을 출력하고 싶다&quot;라고 주문을 넣어보겠습니다.&lt;/p&gt;
&lt;pre class=&quot;swift&quot; data-ke-language=&quot;swift&quot;&gt;&lt;code&gt;Text(&quot;Milkyo Blog&quot;)
    .font(.system(size: 30))
    .fontWeight(.bold)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;750&quot; data-origin-height=&quot;1635&quot; width=&quot;150&quot; height=&quot;NaN&quot; data-filename=&quot;blob&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bO0vn0/btqEmwUddMc/ZaKN8fdQYUXKs25HimWkb0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bO0vn0/btqEmwUddMc/ZaKN8fdQYUXKs25HimWkb0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bO0vn0/btqEmwUddMc/ZaKN8fdQYUXKs25HimWkb0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbO0vn0%2FbtqEmwUddMc%2FZaKN8fdQYUXKs25HimWkb0%2Fimg.png&quot; data-origin-width=&quot;750&quot; data-origin-height=&quot;1635&quot; width=&quot;150&quot; height=&quot;NaN&quot; data-filename=&quot;blob&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;주문한 대로 잘 나오는것을 확인 할 수 있습니다.&lt;/p&gt;
&lt;p&gt;이것이 작동되는 구조를 살펴보면 문자열이 표현되는 Text에 font라는 Modifier가 적용되고 새로운 뷰가 만들어 집니다.&lt;/p&gt;
&lt;p&gt;그 후 fontWeight라는&amp;nbsp;&lt;span style=&quot;color: #333333;&quot;&gt;Modifier가 적용되어 새로운 뷰가 만들어 집니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;이렇듯&lt;b&gt;&amp;nbsp;&lt;span style=&quot;color: #333333;&quot;&gt;Modifier는&lt;/span&gt; SwiftUI에서 새로운 동작이나 시각적 요소가 더해져 새로운 뷰&lt;/b&gt;를 만들게 됩니다..&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;또한 &lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;Modifier는 그 자신의 타입이나 뷰 프로토콜 반환하게 설계&lt;/b&gt;되어 있습니다.&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;따라서&lt;b&gt; 호출하는 순서가 매우 중요&lt;/b&gt;하게 됩니다. 이 부분에 대해선 다음 시간에 알아보겠습니다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;이렇듯 오늘은 SwiftUI가 어떻게 돌아가는지 간단하게 맛을 보았습니다.&lt;/p&gt;
&lt;p&gt;살짝 맛만 봐도 기존에 UIKIt가 돌아가는 방식이 많이 다르다는 것을 보셨을겁니다.&lt;/p&gt;
&lt;p&gt;앞으로 차근차근 시간나는대로 포스팅해나가겠습니다.&lt;/p&gt;
&lt;p&gt;긴 글 읽어주셔서 감사합니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>SwiftUI</category>
      <category>Apple</category>
      <category>ios</category>
      <category>swift</category>
      <category>SwiftUI</category>
      <category>uikit</category>
      <category>스위프트유아이</category>
      <category>스유</category>
      <author>밀쿄</author>
      <guid isPermaLink="true">https://milyo-codingstories.tistory.com/73</guid>
      <comments>https://milyo-codingstories.tistory.com/73#entry73comment</comments>
      <pubDate>Mon, 25 May 2020 14:04:53 +0900</pubDate>
    </item>
    <item>
      <title>다시 시작하는 SwiftUI</title>
      <link>https://milyo-codingstories.tistory.com/71</link>
      <description>&lt;p&gt;안녕하세요. 밀쿄입니다.&lt;/p&gt;
&lt;p&gt;오늘부터 조금씩 SwiftUI에 대해서 알아봅시다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;우선 이 프레임워크의 탄생 배경부터 살펴봅시다.&lt;/p&gt;
&lt;p&gt;현재&lt;b&gt; iOS의 앱구현에는 UIKit이 macOS 앱 구현에는 AppKit, watchOS에는 WatchKit&lt;/b&gt;이 사용되고 있습니다.&lt;/p&gt;
&lt;p&gt;물론 밑바탕에 있는 &lt;b&gt;Foundation이나 그래픽 영역을 공유&lt;/b&gt;하지만 유저 인터페이스 영역에는 앞에서 말한 것 처럼 각자 다른 프레임워크를 사용합니다.&amp;nbsp;물론 앞에서 언급한 프레임워크들은 모두다 &lt;b&gt;Objective-C 기반의 UI프레임워크&lt;/b&gt; 입니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;그렇기에 Swift 언어로 개발하면서 &lt;span style=&quot;color: #333333;&quot;&gt;Objective-C와 상호작용을 위해서 여러가지 작업을 해주고있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;우리가 흔하게 붙이는 함수 앞에 붙이는 @objc가 그 대표적인 예로 들수있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;그리고&lt;b&gt; Swift가 세상에 나온지 약 6년만에 Swift기반의 UI프레임워크인 SwiftUI&lt;/b&gt;가 나오게 되었습니다.&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;SwfitUI는 기존처럼 플랫폼에 따라 프레임워크가 나뉘는게 아니라 &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;애플 생태계에서 쓰이는 모든 플랫폼에서 사용 가능한 프레임워크&lt;/b&gt; 입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;SwiftUI에는 몇 가지 특징이 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;아래 두 가지 코드를 보겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1589948519286&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;let greenView = UIView()
greenView.backgroundColor = .systemBlue
self.view.addSubview(greenView)
greenView.translatesAutoresizingMaskIntoConstraints = false
NSLayoutConstraint.activate([
    greenView.centerXAnchor.constraint(equalTo: self.view.safeAreaLayoutGuide.centerXAnchor),
    greenView.centerYAnchor.constraint(equalTo: self.view.safeAreaLayoutGuide.centerYAnchor),
    greenView.widthAnchor.constraint(equalToConstant: 100),
    greenView.heightAnchor.constraint(equalTo: greenView.widthAnchor)
])
&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1589948992161&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;struct ContentView: View {
    var body: some View {
        Color(.systemBlue)
        .frame(width: 100, height: 100)
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;먼저 위에 있는 코드부터 살펴보겠습니다.&lt;/p&gt;
&lt;p&gt;위에 있는 코드들을 보면 한 줄 한 줄 &lt;b&gt;어떻게 표시할 지에 집중&lt;/b&gt;하고 있다는 것을 알 수 있습니다.&lt;/p&gt;
&lt;p&gt;쉽게 말하면 파란색 뷰를 화면의 한 가운데에 표시해줘 라고 말이죠.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;밑의 코드는 SwiftUI 측을 코드입니다.&lt;/p&gt;
&lt;p&gt;일단 위에 코드에 비해 정말로 간결합니다. 그리고 최종적으로 어떤 화면이 나오면 되는지만 표현하고 있네요.&lt;/p&gt;
&lt;p&gt;&quot;100 * 100 크기의 파란색 뷰가 필요해&quot;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;이렇듯 SwiftUI는 &lt;b&gt;내가 필요한 것을 주문하는 느낌&lt;/b&gt;으로 작성하시면 됩니다.&lt;/p&gt;
&lt;p&gt;그리고 이것이 첫번째 특징이 &lt;b&gt;선언형&lt;/b&gt;이라는 것입니다.&lt;/p&gt;
&lt;p&gt;그리고 위 코드에서 알 수 있듯이 &lt;b&gt;오토레이아웃이 필요없습니다&lt;/b&gt;. 알아서 &lt;b&gt;자동&lt;/b&gt;으로 배치해줍니다.&lt;/p&gt;
&lt;p&gt;이것말고도 SwitUI에서 자동으로 지원되는게 많습니다. 대표적으로 로컬라이징이 있겠네요.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;그리고 기존에 UIKit으로 개발하다가 오면 익숙하지 않고 이상하게 느껴질 수 있습니다.&lt;/p&gt;
&lt;p&gt;UIKit에서 구체적으로 어디에 무얼두고 어디에 어느크기만큼 두고 이런 디테일한 작업을 해오다가&lt;/p&gt;
&lt;p&gt;난 파란색 크기가 필요해!, 아 난 여기가 빈공간이면 좋겠어! 이렇게 짠다는게 쉽지 않습니다.&lt;/p&gt;
&lt;p&gt;하지만 SwiftUI는 분명히 강력한 언어임에 틀림 없다고 생각합니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;이 포스팅은 아래 책을 참조하면서 작성되고 있습니다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://book.naver.com/bookdb/book_detail.nhn?bid=16324763&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;book.naver.com/bookdb/book_detail.nhn?bid=16324763&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1590110307289&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-og-type=&quot;article&quot; data-og-title=&quot;스윗한 SwiftUI&quot; data-og-description=&quot;더 우수한 앱을 더 적은 코드로!SwiftUI를 활용한 스마트한 iOS 앱 개발 길라잡이애플이 UIKit를 지원하기 시작한 지 11년, 그리고 Swift를 발표한 지 5년 만에 드디어 Swift를 기반으로 처음부터 완전히 &quot; data-og-host=&quot;book.naver.com&quot; data-og-source-url=&quot;https://book.naver.com/bookdb/book_detail.nhn?bid=16324763&quot; data-og-url=&quot;http://book.naver.com/bookdb/book_detail.nhn?bid=16324763&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/dk4mNu/hyF8PJyV8O/a7dlpaQL72JHnCQgTgOB4K/img.jpg?width=140&amp;amp;height=186&amp;amp;face=0_0_140_186&quot;&gt;&lt;a href=&quot;https://book.naver.com/bookdb/book_detail.nhn?bid=16324763&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://book.naver.com/bookdb/book_detail.nhn?bid=16324763&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/dk4mNu/hyF8PJyV8O/a7dlpaQL72JHnCQgTgOB4K/img.jpg?width=140&amp;amp;height=186&amp;amp;face=0_0_140_186');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot;&gt;스윗한 SwiftUI&lt;/p&gt;
&lt;p class=&quot;og-desc&quot;&gt;더 우수한 앱을 더 적은 코드로!SwiftUI를 활용한 스마트한 iOS 앱 개발 길라잡이애플이 UIKit를 지원하기 시작한 지 11년, 그리고 Swift를 발표한 지 5년 만에 드디어 Swift를 기반으로 처음부터 완전히&lt;/p&gt;
&lt;p class=&quot;og-host&quot;&gt;book.naver.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>SwiftUI</category>
      <category>ios</category>
      <category>swift</category>
      <category>SwiftUI</category>
      <author>밀쿄</author>
      <guid isPermaLink="true">https://milyo-codingstories.tistory.com/71</guid>
      <comments>https://milyo-codingstories.tistory.com/71#entry71comment</comments>
      <pubDate>Wed, 20 May 2020 13:46:10 +0900</pubDate>
    </item>
    <item>
      <title>[Tip] 코드로 화면 짤 때 조금 더 편하게 짜는 법</title>
      <link>https://milyo-codingstories.tistory.com/70</link>
      <description>&lt;p&gt;안녕하세요. 밀쿄입니다.&lt;/p&gt;
&lt;p&gt;오늘은 코드로 화면 짤 때 조금 더 편하게 짜는 방법에 대해 알아보겠습니다.&lt;/p&gt;
&lt;p&gt;코드르 화면 짤 때 화면을 미리 볼 수 없어서 많이 불편했습니다.&lt;/p&gt;
&lt;p&gt;실제로 화면 하나를 수정하기 위해서 수정 -&amp;gt; 빌드를 몇 번이나 반복한 적도 있습니다..&lt;s&gt;( 이건 제가 실력이 없어서 그럴지..)&lt;/s&gt;&lt;/p&gt;
&lt;p&gt;그치만 XCode 11이 나오고 SwiftUI에서 사용할 수 있는 XCode의 Canvas뷰? Canvas모드?를 활용하면 조금 더 편하게 코드를 짤 수 있습니다.&lt;/p&gt;
&lt;p&gt;이 팁을 처음본건 작년 Let's Swift였는데 그 때만 해도 캔버브뷰만 틀면 제 엑스코드가 자주 먹통이 되어버려서..&lt;/p&gt;
&lt;p&gt;포스팅을 안하고 있었는데요..11.4부턴 조금 덜 먹통이 되길로 남겨봅니다..&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot;&gt;위에서 말했듯이 SwiftUI에서 사용할 수 있는 방법이기 때문에 기존에 화면 SwiftUI에서 사용할 수 있는 Object로 만들어줘야합니다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://developer.apple.com/documentation/swiftui/uiviewcontrollerrepresentable&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://developer.apple.com/documentation/swiftui/uiviewcontrollerrepresentable&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1587307001890&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-og-type=&quot;website&quot; data-og-title=&quot;UIViewControllerRepresentable - SwiftUI | Apple Developer Documentation&quot; data-og-description=&quot;Protocol UIViewControllerRepresentable A view that represents a UIKit view controller. Declarationprotocol UIViewControllerRepresentable where Self.Body == Never OverviewUse a UIViewControllerRepresentable instance to create and manage a UIViewController o&quot; data-og-host=&quot;developer.apple.com&quot; data-og-source-url=&quot;https://developer.apple.com/documentation/swiftui/uiviewcontrollerrepresentable&quot; data-og-url=&quot;https://developer.apple.com/documentation/swiftui/uiviewcontrollerrepresentable&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://developer.apple.com/documentation/swiftui/uiviewcontrollerrepresentable&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://developer.apple.com/documentation/swiftui/uiviewcontrollerrepresentable&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot;&gt;UIViewControllerRepresentable - SwiftUI | Apple Developer Documentation&lt;/p&gt;
&lt;p class=&quot;og-desc&quot;&gt;Protocol UIViewControllerRepresentable A view that represents a UIKit view controller. Declarationprotocol UIViewControllerRepresentable where Self.Body == Never OverviewUse a UIViewControllerRepresentable instance to create and manage a UIViewController o&lt;/p&gt;
&lt;p class=&quot;og-host&quot;&gt;developer.apple.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;이 프로토콜을 채택해서 만들면 됩니다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;이제 같이 만들어봅시다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;UIKit으로 만들어진 클래스 밑에&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;다음과 같이 선언해줍시다.&lt;/p&gt;
&lt;pre id=&quot;code_1587307322645&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#if canImport(SwiftUI) &amp;amp;&amp;amp; DEBUG
import SwiftUI
#endif&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;이제 이러고 나서 UIViewControllerRepresentable을 채택하는 구조체를 만들어줍시다.&lt;/p&gt;
&lt;p&gt;그러면 XCode에서 두 감지 함수를 생성하라고 할 것인데.&lt;/p&gt;
&lt;pre id=&quot;code_1587307481405&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;func makeUIViewController(context: Context) -&amp;gt; ViewController { }
func updateUIViewController(_ uiViewController: ViewController, context: Context) { }
&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;이 두 가지 함수를 구현해줘야합니다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;쉽게 생각하면 make로 시작하는 함수는 UIViewController를 초기화하고 생성하는 함수 입니다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;update로 시작하는 함수는 UIViewController가 업데이트가 필요하면 호출되는 함수 입니다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;이제 이렇게 SwiftUI에서 사용할 수 있는 Object를 만들고나면&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;PreviewProvider라는 프로토콜을 채택해서 다음과같이 만들어주시면 됩니다.&lt;/p&gt;
&lt;pre id=&quot;code_1587307725673&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;struct MainViewControllerPreview: PreviewProvider {
    static var previews: some View {
        //위에서 만들어준 구조체를 여기서 생성
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;이제 준비는 다 끝났습니다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;이제 Xcode에서 캔버스 뷰를 켜봅시다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cfVR0G/btqDw456KNo/ad6E2FXQad8mt5sDHAxh01/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cfVR0G/btqDw456KNo/ad6E2FXQad8mt5sDHAxh01/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cfVR0G/btqDw456KNo/ad6E2FXQad8mt5sDHAxh01/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcfVR0G%2FbtqDw456KNo%2Fad6E2FXQad8mt5sDHAxh01%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;이렇게 사용하시면 됩니다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;이제 왼쪽에 코드를 바꿀 때마다 자동으로 오른쪽에 업데이트가 됩니다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Swift&amp;amp;IOS</category>
      <category>ios</category>
      <category>swift</category>
      <category>UIViewControllerRepresentable</category>
      <author>밀쿄</author>
      <guid isPermaLink="true">https://milyo-codingstories.tistory.com/70</guid>
      <comments>https://milyo-codingstories.tistory.com/70#entry70comment</comments>
      <pubDate>Mon, 20 Apr 2020 00:00:53 +0900</pubDate>
    </item>
    <item>
      <title>[프로그래머스] 큰 수 만들기</title>
      <link>https://milyo-codingstories.tistory.com/69</link>
      <description>&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;안녕하세요. 밀쿄입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;오늘은 문제하나를 들고왔습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;풀다보니 이건 기록을 해야겠다 싶어서 포스팅을 해봅니다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;a style=&quot;color: #333333;&quot; href=&quot;https://programmers.co.kr/learn/courses/30/lessons/42883&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://programmers.co.kr/learn/courses/30/lessons/42883&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1586830670119&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-og-type=&quot;website&quot; data-og-title=&quot;프로그래머스&quot; data-og-description=&quot;코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.&quot; data-og-host=&quot;programmers.co.kr&quot; data-og-source-url=&quot;https://programmers.co.kr/learn/courses/30/lessons/42883&quot; data-og-url=&quot;https://programmers.co.kr/learn/courses/30/lessons/42883&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/btkVgq/hyFFoT28b8/PEVVMTccoHiVKlOMWidaO1/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630&quot;&gt;&lt;a href=&quot;https://programmers.co.kr/learn/courses/30/lessons/42883&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://programmers.co.kr/learn/courses/30/lessons/42883&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/btkVgq/hyFFoT28b8/PEVVMTccoHiVKlOMWidaO1/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot;&gt;프로그래머스&lt;/p&gt;
&lt;p class=&quot;og-desc&quot;&gt;코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.&lt;/p&gt;
&lt;p class=&quot;og-host&quot;&gt;programmers.co.kr&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;이 문제 입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;문제의 지문을 이해하기엔 크게 어려움이 없는 문제입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;문제의 요지는 k개 수를 제거했을 때 얻을 수 있는 가장 큰 수를 구하는 것 입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;먼저 예제를 보면&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;1924는 두 개의 수를 제거하여 19, 12, ,14, 92, 94 , 24 정도를 만들 수 있는데 94가 제일 크니 94가 답이 된다고 합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;여기서 오해했던게 1924에서 제일 큰 수 두개가 보다시피 9, 4 입니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;그래서 큰 수를 순서대로 뽑는 건가 싶었습니다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;s&gt;그래서 정렬해서 풀었습니다... 물론 오답이었지만요..&lt;/s&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;그치만 다음 예제를 보면 1231234 입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;여기서 4가 제일 큰 수이지만 4를 뽑으면...그 다음 3이 뽑히고 그런 문제인줄 알았는데..&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;아니었습니다...&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;말그대로 숫자의 순서는 바꿀 수 없고 k갯수만큼 제거해서 만들 수있느 제일 큰 수를 찾는 것 입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;문제는 여기서 K수 만큼 제거하고 남은 글자수에 너무 집중해서 처음에 코드가 엄청 이상했습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;글자수가 되면 반복문을 종료시킬려고 하거나.. 등등 글자수에 포커스를 맞추니 문제가 안풀렸습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;하지만 문제를 다시 읽어보니 &amp;nbsp;k개 수를 제거했을 때 얻을 수 있는 가장 큰 수입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;즉 앞에서부터 순회하면서 k를 줄여나가는 방식으로 방법을 전환하고 삽질을 그만 들 수 있었습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;즉,&amp;nbsp;배열 하나에 주어진 숫자를 하나하나 넣으면서 마지막값보다 큰 수가 들어오면 계속해서 삭제하고 k값을 감소 시켜 주면 됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1586831557648&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;while !temp.isEmpty &amp;amp;&amp;amp; Int(temp.last!)! &amp;lt; Int(String(num))! &amp;amp;&amp;amp; cK &amp;gt; 0 {
    temp.removeLast()
    cK -= 1
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;이렇게 반복을 돌다가 k값이 0 이 되면 남은 글자를 다 넣어주고 일단 반복을 종료합니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1586836579870&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;if cK == 0 {
    let sindex = number.index(number.startIndex, offsetBy: index)
    let str = String(number[sindex ..&amp;lt; number.endIndex])
    temp.append(str)
    break
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;하지만 k가 0이 되기전에 반복이 끝날 수도 있으니 k 값이 0 인지 체크하고 0이 아니면 나와야하는 글자수만큼 잘라줍니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1586836666528&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;if cK &amp;gt; 0 {
    result = temp[0 ..&amp;lt; temp.count - cK].joined()
} else {
    result = temp.joined()
}&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;끝입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;처음접근을 너무 어렵게 생각해서&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;더 어려웠던 문제였던것 같습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;다음에는 다른문제로 또 나타나겠습니다.&lt;/span&gt;&lt;/p&gt;</description>
      <category>자료구조</category>
      <category>Algorithm</category>
      <category>greedy</category>
      <category>programmers</category>
      <category>swift</category>
      <author>밀쿄</author>
      <guid isPermaLink="true">https://milyo-codingstories.tistory.com/69</guid>
      <comments>https://milyo-codingstories.tistory.com/69#entry69comment</comments>
      <pubDate>Tue, 14 Apr 2020 12:58:32 +0900</pubDate>
    </item>
    <item>
      <title>[MVC to MVVM 01] 일단 MVC부터..</title>
      <link>https://milyo-codingstories.tistory.com/68</link>
      <description>&lt;p&gt;오랜 시간 기다렸던 포스팅입니다.&lt;/p&gt;
&lt;p&gt;MVC에서 MVVM으로 만들어보는 프로젝트 입니다.&lt;/p&gt;
&lt;p&gt;중간에 이 글이 중단된다면 저는 무기한..귀차니즘에 빠진걸로..&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://milyo-codingstories.tistory.com/40&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://milyo-codingstories.tistory.com/40&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1586405535534&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-og-type=&quot;article&quot; data-og-title=&quot;MVC(Model-View-Controller)?&quot; data-og-description=&quot;안녕하세요. 밀쿄 입니다. 오늘은 미루고..미뤄왔던 포스팅을 해볼까합니다. 이 블로그 시작하며서 써야지 했던게 벌써 몇달이 흐르고 흘렀네요. 이 주제에 대해 자신이 없기도 했고 ( 지금도 없어요 지적 해주세..&quot; data-og-host=&quot;milyo-codingstories.tistory.com&quot; data-og-source-url=&quot;https://milyo-codingstories.tistory.com/40&quot; data-og-url=&quot;https://milyo-codingstories.tistory.com/40&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bwh8S3/hyFBnubfOz/gWKr8MI4QJhVMCGWNlRRa1/img.png?width=800&amp;amp;height=530&amp;amp;face=0_0_800_530,https://scrap.kakaocdn.net/dn/dX3vqE/hyFBuNDBfM/S4dNwqVJMeQUyedoB4ujUk/img.png?width=800&amp;amp;height=530&amp;amp;face=0_0_800_530,https://scrap.kakaocdn.net/dn/W2KLj/hyFBsoIRux/sj3e6QBS9oxnbgoLLnkts1/img.png?width=1186&amp;amp;height=786&amp;amp;face=0_0_1186_786&quot;&gt;&lt;a href=&quot;https://milyo-codingstories.tistory.com/40&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://milyo-codingstories.tistory.com/40&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bwh8S3/hyFBnubfOz/gWKr8MI4QJhVMCGWNlRRa1/img.png?width=800&amp;amp;height=530&amp;amp;face=0_0_800_530,https://scrap.kakaocdn.net/dn/dX3vqE/hyFBuNDBfM/S4dNwqVJMeQUyedoB4ujUk/img.png?width=800&amp;amp;height=530&amp;amp;face=0_0_800_530,https://scrap.kakaocdn.net/dn/W2KLj/hyFBsoIRux/sj3e6QBS9oxnbgoLLnkts1/img.png?width=1186&amp;amp;height=786&amp;amp;face=0_0_1186_786');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot;&gt;MVC(Model-View-Controller)?&lt;/p&gt;
&lt;p class=&quot;og-desc&quot;&gt;안녕하세요. 밀쿄 입니다. 오늘은 미루고..미뤄왔던 포스팅을 해볼까합니다. 이 블로그 시작하며서 써야지 했던게 벌써 몇달이 흐르고 흘렀네요. 이 주제에 대해 자신이 없기도 했고 ( 지금도 없어요 지적 해주세..&lt;/p&gt;
&lt;p class=&quot;og-host&quot;&gt;milyo-codingstories.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;MVC에 대한 설명은 여기 있습니다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;모자란 설명이지만 적혀있습니다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;자 그러면 시작하겠습니다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;(뷰 코드가 들어가면 길어지니 생략하겠습니다.)&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;먼저 모델을 만들어줄껍니다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;이 모델을 잘 만들어두면 MVVM이나 MVC이나&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;아무데나 가져다 써도 되니 잘 만들어주시면 됩니다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;먼저 API가 담길 구조체를 만들어줄껀데요.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;592&quot; data-origin-height=&quot;198&quot; width=&quot;402&quot; height=&quot;152&quot; data-filename=&quot;blob&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kC4PO/btqDg5RODqu/69HMlkBLDGjb1Zo0Zdhqe1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kC4PO/btqDg5RODqu/69HMlkBLDGjb1Zo0Zdhqe1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kC4PO/btqDg5RODqu/69HMlkBLDGjb1Zo0Zdhqe1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkC4PO%2FbtqDg5RODqu%2F69HMlkBLDGjb1Zo0Zdhqe1%2Fimg.png&quot; data-origin-width=&quot;592&quot; data-origin-height=&quot;198&quot; width=&quot;402&quot; height=&quot;152&quot; data-filename=&quot;blob&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;324&quot; height=&quot;151&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dVpeSe/btqDgx13VxE/2mebkp4SVKrZlGXPlQaizK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dVpeSe/btqDgx13VxE/2mebkp4SVKrZlGXPlQaizK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dVpeSe/btqDgx13VxE/2mebkp4SVKrZlGXPlQaizK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdVpeSe%2FbtqDgx13VxE%2F2mebkp4SVKrZlGXPlQaizK%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;324&quot; height=&quot;151&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;이건 쉽죠?&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;그대로 만드시면 됩니다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;이제 API를 호출해서 데이터를 가져오는 놈을 만들껍니다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;이런식으로 함수를 선언해주시고&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/IUyIw/btqDj3E1L3K/eWAvhIzYkBlH2XE04yghy0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/IUyIw/btqDj3E1L3K/eWAvhIzYkBlH2XE04yghy0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/IUyIw/btqDj3E1L3K/eWAvhIzYkBlH2XE04yghy0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FIUyIw%2FbtqDj3E1L3K%2FeWAvhIzYkBlH2XE04yghy0%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;저렇게 만들어주고 내부에서 JSONDecoder로 데이터 가져오시면 되는데&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/5eGU9/btqDkAbwGKH/BXkBux34LrmdWULN3uHPRk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/5eGU9/btqDkAbwGKH/BXkBux34LrmdWULN3uHPRk/img.png&quot; data-alt=&quot;애플 공식문서에서 발췌했습니다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/5eGU9/btqDkAbwGKH/BXkBux34LrmdWULN3uHPRk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F5eGU9%2FbtqDkAbwGKH%2FBXkBux34LrmdWULN3uHPRk%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;애플 공식문서에서 발췌했습니다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;원래라면 이런식으로 try를 써서 디코딩하시면 됩니다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;그치만 이렇게하면 do catch로 인해서 지저분해보이므로 다른방법으로 접근할 것입니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;580&quot; height=&quot;166&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bklRnv/btqDgxOAvJs/wyUXyRWQ3ul5KmpRl7o1D1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bklRnv/btqDgxOAvJs/wyUXyRWQ3ul5KmpRl7o1D1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bklRnv/btqDgxOAvJs/wyUXyRWQ3ul5KmpRl7o1D1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbklRnv%2FbtqDgxOAvJs%2FwyUXyRWQ3ul5KmpRl7o1D1%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;580&quot; height=&quot;166&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;JSONDecode를 확장해서 에러가 나면 nil을 리턴해주는 Extension을 만들어 줍니다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;이렇게 해주고나면 아래처럼 작성이 가능해집니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;686&quot; height=&quot;303&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bgKViv/btqDgzr4zsP/ayZ2rcwyiAm62R2MhJqkK1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bgKViv/btqDgzr4zsP/ayZ2rcwyiAm62R2MhJqkK1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bgKViv/btqDgzr4zsP/ayZ2rcwyiAm62R2MhJqkK1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbgKViv%2FbtqDgzr4zsP%2FayZ2rcwyiAm62R2MhJqkK1%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;686&quot; height=&quot;303&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;이렇게 API에서 데이터를 가져오는 것을 다 만들었다면&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;이제 이 함수를 실제적으로 요청하는 녀석을 만들러 가봅시다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;아래처럼 작성해주시면 됩니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;647&quot; height=&quot;191&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/M5t43/btqDkAvR6Qh/LRAepAyZ1shZAmsMOtWU60/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/M5t43/btqDkAvR6Qh/LRAepAyZ1shZAmsMOtWU60/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/M5t43/btqDkAvR6Qh/LRAepAyZ1shZAmsMOtWU60/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FM5t43%2FbtqDkAvR6Qh%2FLRAepAyZ1shZAmsMOtWU60%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;647&quot; height=&quot;191&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;이렇게하면 모델쪽 설계는 끝이 납니다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;자 이제 이 모델을 컨트롤러에서 호출해서 View에 뿌려주면 MVC는 완성입니다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;사실 이정도로 간단한 앱에선 MVC가 젤 좋습니다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;무조건 MVC보다 &amp;nbsp;MVVM가 우수해, 좋아 그런거 아니라는 거죠.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;디자인 패턴에서는 좋고 나쁨이 없다고 생각합니다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;상황마다 적절하게 잘 쓰면 되는거죠.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;더불어서 디자인 패턴을 쓰는 이유도&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;제 개인적인 견해로는 의사소통의 목적이라고 생각해서..&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;뭐 각설하고 View에 뿌려주러 가봅시다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;642&quot; height=&quot;339&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/blefv3/btqDhvJGWFp/JKHQTzKZODYRbjZircXXT0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/blefv3/btqDhvJGWFp/JKHQTzKZODYRbjZircXXT0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/blefv3/btqDhvJGWFp/JKHQTzKZODYRbjZircXXT0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fblefv3%2FbtqDhvJGWFp%2FJKHQTzKZODYRbjZircXXT0%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;642&quot; height=&quot;339&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;뷰에는 대충 이렇게 뿌려주면 됩니다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;네트워크 서비스를 호출해서&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;result가 성공이면 전역변수에 담아주고 tableView Reload&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;실패면 에러가 났다고 Alert 띄워주고..&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;자 간단하게 MVC를 만들어봤습니다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;다음시간엔 MVVM을 알아보고&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;이 간단한 앱을 MVVM으로 바꿔봅시다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Swift&amp;amp;IOS</category>
      <category>ios</category>
      <category>MVC</category>
      <category>MVVM</category>
      <category>swift</category>
      <author>밀쿄</author>
      <guid isPermaLink="true">https://milyo-codingstories.tistory.com/68</guid>
      <comments>https://milyo-codingstories.tistory.com/68#entry68comment</comments>
      <pubDate>Thu, 9 Apr 2020 18:00:05 +0900</pubDate>
    </item>
    <item>
      <title>[프로그래머스] 프린터</title>
      <link>https://milyo-codingstories.tistory.com/67</link>
      <description>&lt;p&gt;안녕하세요. 밀쿄입니다.&lt;/p&gt;
&lt;p&gt;오늘도 문제하나를 같이 풀어보겠습니다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://programmers.co.kr/learn/courses/30/lessons/42587&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://programmers.co.kr/learn/courses/30/lessons/42587&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1586149631590&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-og-type=&quot;website&quot; data-og-title=&quot;프로그래머스&quot; data-og-description=&quot;코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.&quot; data-og-host=&quot;programmers.co.kr&quot; data-og-source-url=&quot;https://programmers.co.kr/learn/courses/30/lessons/42587&quot; data-og-url=&quot;https://programmers.co.kr/learn/courses/30/lessons/42587&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/yIfna/hyFyxDPigi/Bw5GYLRfJqWnteukiKKRRk/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630&quot;&gt;&lt;a href=&quot;https://programmers.co.kr/learn/courses/30/lessons/42587&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://programmers.co.kr/learn/courses/30/lessons/42587&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/yIfna/hyFyxDPigi/Bw5GYLRfJqWnteukiKKRRk/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot;&gt;프로그래머스&lt;/p&gt;
&lt;p class=&quot;og-desc&quot;&gt;코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.&lt;/p&gt;
&lt;p class=&quot;og-host&quot;&gt;programmers.co.kr&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p&gt;이 문제는 우선순위 큐를 사용하는 문제입니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;먼저 큐와 우선순위 큐 두 개를 만들어 줍니다.&lt;br /&gt;큐는 배열의 인덱스와 함께 우선순위를 저장해줍니다,&lt;/p&gt;
&lt;p&gt;그리고 우선순위큐는 우선순위를 정렬해서 저장해줍니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;자 이렇게 해주고 나면 이제 당연하게&lt;/p&gt;
&lt;p&gt;큐에서 하나 pop하고 우선순위큐에서 pop을 해서 우선순위를 비교해줍니다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;우선순위가 같다면 당연히 인쇄를 해주고 리턴해줘야 할 값에 +1를 해주면 됩니다.&lt;/p&gt;
&lt;p&gt;이 때 큐에 인덱스같이 내가 찾는 location 값이라면 리턴을 해주면 됩니다.&lt;/p&gt;
&lt;p&gt;그리고 만약 같지 않다면 우선 순위가 더 높은 문서가 존재한다는 뜻이므로 큐에서 하나를 꺼내서 맨 끝에 push 해주시면 됩니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1586150567032&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;func solution(_ priorities:[Int], _ location:Int) -&amp;gt; Int {
    
    //인덱스랑 우선 순위가 같이 저장되는 큐
    var queue: [(Int, Int)] = []
    //우선순위큐( 우선순위 큐는 기본적으로 최대힙이므로 내림차순으로 정렬한다
    var priorityQueue = priorities.sorted(by : &amp;gt;)
    //결과적으로 리턴해줘야하는 값
    var result = 0
    
    //우선순위를 순회하면서 큐에 인덱스와 함께 우선순위를 저장한다.
    priorities.enumerated().forEach { (index, property) in
        queue.append((index, property))
    }
    
    //큐가 비어있을 때까지 순회를 한다.
    while !queue.isEmpty {
        
        // 큐의 맨 앞에 있는 우선순위와 우선순위큐의 첫번째 값을 비교한다.
        if queue.first!.1 == priorityQueue.first! {
            
            //큐의 맨앞에 있는 값의 인덱스가 내가 요청한 문서의 인덱스인지 확인한다.
            if queue.first!.0  == location {
                return result + 1
            }
            
            //우선순위의 값과 일치하므로 큐애 우선순위 큐에서 하나를 pop한다.
            result += 1
            queue.removeFirst()
            priorityQueue.removeFirst()
        } else {
            // 더 높은 우선순위의 값이 존재하므로 하나를 꺼내 맨 뒤에 push 한다.
            queue.append(queue.removeFirst())
        }
    }
    
    return result
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>자료구조</category>
      <category>level2</category>
      <category>스위프트</category>
      <category>알고리즘</category>
      <category>프로그래머스</category>
      <category>프린터</category>
      <author>밀쿄</author>
      <guid isPermaLink="true">https://milyo-codingstories.tistory.com/67</guid>
      <comments>https://milyo-codingstories.tistory.com/67#entry67comment</comments>
      <pubDate>Mon, 6 Apr 2020 18:00:06 +0900</pubDate>
    </item>
    <item>
      <title>[프로그래머스] 2016 with Swift</title>
      <link>https://milyo-codingstories.tistory.com/66</link>
      <description>&lt;p&gt;문제 요약&lt;/p&gt;
&lt;p&gt;&lt;span&gt;2016년 a월 b일이 무슨 요일인지 리턴하는 함수 작성&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;2016년은 윤년&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;2016년 a월 b일은&amp;nbsp;&lt;/span&gt;실제로 있는 날&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;접근&lt;/p&gt;
&lt;p&gt;00. a월 b일이 총 몇 일째인지 구해서 7로 나누자&lt;/p&gt;
&lt;p&gt;01. 2016년 1월 1일이 무슨 날? - 금요일&lt;/p&gt;
&lt;p&gt;-&amp;gt; 1월 1일 -&amp;gt; 총 하루 -&amp;gt; 7을 1로 나눈 나머지 즉, 1일 때 금요일&lt;/p&gt;
&lt;p&gt;-&amp;gt; 1 - 금, 2 - 토, 3 - 일, ... , -목&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;코드&lt;/p&gt;
&lt;pre id=&quot;code_1585530536831&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;func solution(_ a:Int, _ b:Int) -&amp;gt; String {
    
    var answer: String = &quot;&quot;
    var totalDay: Int = b
    var monthDay: Int = 0
    
    
    for index in 1..&amp;lt;a {
        
        if ( index &amp;lt; 8 &amp;amp;&amp;amp; index % 2 == 1 ) || ( index &amp;gt;= 8 &amp;amp;&amp;amp; index % 2 == 0 ){
            monthDay = 31
        }
        else if index == 2 {
            monthDay = 29
        } else {
            monthDay = 30
        }
        
        totalDay += monthDay
    }
    
    switch totalDay % 7 {
    case 0:
        answer = &quot;THU&quot;
        break;
    case 1:
        answer = &quot;FRI&quot;
        break;
    case 2:
        answer = &quot;SAT&quot;
        break;
    case 3:
        answer = &quot;SUN&quot;
        break;
    case 4:
        answer = &quot;MON&quot;
        break;
    case 5:
        answer = &quot;TUE&quot;
        break;
    case 6:
        answer = &quot;WED&quot;
        break;
    default:
        answer = &quot;&quot;
    }
    
    
    return answer
}
&lt;/code&gt;&lt;/pre&gt;</description>
      <category>자료구조</category>
      <category>swift</category>
      <author>밀쿄</author>
      <guid isPermaLink="true">https://milyo-codingstories.tistory.com/66</guid>
      <comments>https://milyo-codingstories.tistory.com/66#entry66comment</comments>
      <pubDate>Mon, 30 Mar 2020 18:00:41 +0900</pubDate>
    </item>
  </channel>
</rss>