<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>Where who wants to meet someone</title>
    <link>https://llimental.tistory.com/</link>
    <description>기본기를 채우기 위해 학습 내용을 정리하고자 블로그 다시 시작해봅니다!</description>
    <language>ko</language>
    <pubDate>Tue, 7 Jul 2026 06:29:21 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>Lust3r</managingEditor>
    <image>
      <title>Where who wants to meet someone</title>
      <url>https://tistory1.daumcdn.net/tistory/1699137/attach/6b280d5847cf4141944abdb6513459c4</url>
      <link>https://llimental.tistory.com</link>
    </image>
    <item>
      <title>[Flutter] Firebase에 사용할 SHA1, SHA-256 확인하기</title>
      <link>https://llimental.tistory.com/356</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;너무 삽질을 했어서 나중에 이런 상황이 발생하거나 도움이 필요한 사람들을 위해 메모&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;환경:&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Macbook Pro (M3 Pro) 14.6.1&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- VS Code&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1. 문제&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Firebase 전화 인증을 위해 구성하던 중, 안드로이드는 디지털 지문 추가를 해야 했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 이를 위해 터미널에서 ./gradlew signingReport 를 사용했으나 java가 없다는 오류가 발생&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- java 홈페이지에서 m시리즈용 8버전을 받았으나 'Could not resolve all files for configuration 'classpath'. 오류가 발생&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 이에 최신 버전인 23을 설치했으나 'Execution failed for task ':gradle:compileGroovy' 오류가 발생&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 오류 코드 중에 11버전이 있어 8과 23을 제거하고 11버전 설치했으나 'Build failed with an exception' 오류가 발생&lt;br /&gt;&amp;nbsp; &amp;nbsp;- Android Gradle plugin이 Java 17을 필요로 한다고 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;2. 해결&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- (Homebrew가 설치되어 있다는 가정 하에) 터미널에서 다음 코드 입력&lt;/p&gt;
&lt;pre id=&quot;code_1727346505841&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;brew install openjdk@17&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 설치가 끝나면 기본 버전 설정 및 환경 변수 설정 가이드가 나오는데 해당 코드 입력&lt;/p&gt;
&lt;pre id=&quot;code_1727346651536&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo ln -sfn /opt/homebrew/opt/openjdk@17/libexec/openjdk.jdk /Library/Java/JavaVirtualMachines/openjdk-17.jdk

echo 'export PATH=&quot;/opt/homebrew/opt/openjdk@17/bin:$PATH&quot;' &amp;gt;&amp;gt; ~/.zshrc&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(위는 예시일 뿐 터미널에 표기된 코드를 복붙하자)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이후 VS Code에서 터미널을 열고 cd android로 프로젝트의 android 폴더로 이동,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;./gradlew signingReport&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;코드를 입력하면 잠시 뒤 결과가 출력되는데 스크롤을 조금 내리면 SHA1과 SHA-256을 확인할 수 있다.&lt;/p&gt;</description>
      <category>Flutter</category>
      <category>Firebase</category>
      <category>firebase sms</category>
      <category>Flutter</category>
      <category>gradlew</category>
      <category>SHA-256</category>
      <category>SHA1</category>
      <category>signingreport</category>
      <category>vs code</category>
      <category>디지털지문</category>
      <category>맥북 java 17</category>
      <author>Lust3r</author>
      <guid isPermaLink="true">https://llimental.tistory.com/356</guid>
      <comments>https://llimental.tistory.com/356#entry356comment</comments>
      <pubDate>Thu, 26 Sep 2024 19:33:48 +0900</pubDate>
    </item>
    <item>
      <title>[Flutter] Firebase 인증 상태에 따른 GoRouter redirect 구현하기</title>
      <link>https://llimental.tistory.com/355</link>
      <description>&lt;figure id=&quot;og_1727142056047&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;go_router | Flutter package&quot; data-og-description=&quot;A declarative router for Flutter based on Navigation 2 supporting deep linking, data-driven routes and more&quot; data-og-host=&quot;pub.dev&quot; data-og-source-url=&quot;https://pub.dev/packages/go_router&quot; data-og-url=&quot;https://pub.dev/packages/go_router&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/b136oS/hyW6C8FClg/tz150hM28QfcRR7wuUIJsK/img.png?width=1280&amp;amp;height=640&amp;amp;face=0_0_1280_640,https://scrap.kakaocdn.net/dn/ckj2jN/hyW6E6wpwB/4KFkFedSFErKked7MS35Kk/img.png?width=1280&amp;amp;height=640&amp;amp;face=0_0_1280_640&quot;&gt;&lt;a href=&quot;https://pub.dev/packages/go_router&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://pub.dev/packages/go_router&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/b136oS/hyW6C8FClg/tz150hM28QfcRR7wuUIJsK/img.png?width=1280&amp;amp;height=640&amp;amp;face=0_0_1280_640,https://scrap.kakaocdn.net/dn/ckj2jN/hyW6E6wpwB/4KFkFedSFErKked7MS35Kk/img.png?width=1280&amp;amp;height=640&amp;amp;face=0_0_1280_640');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;go_router | Flutter package&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;A declarative router for Flutter based on Navigation 2 supporting deep linking, data-driven routes and more&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;pub.dev&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;로그인 기능을 구현하다보니, 로그인 / 로그아웃을 할 때 context.go 메서드를 통해 화면을 전환하는 것이 아니라 자동으로 상태 반영이 되면 어떨까 하는 생각이 들게 되었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure id=&quot;og_1727142194807&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Flutter에서 Firebase 인증 시작하기 &amp;nbsp;|&amp;nbsp; Firebase 문서&quot; data-og-description=&quot;Google I/O 2022에서 Firebase의 새로운 기능을 확인하세요. 자세히 알아보기 의견 보내기 Flutter에서 Firebase 인증 시작하기 컬렉션을 사용해 정리하기 내 환경설정을 기준으로 콘텐츠를 저장하고 분류&quot; data-og-host=&quot;firebase.google.com&quot; data-og-source-url=&quot;https://firebase.google.com/docs/auth/flutter/start?hl=ko#auth-state&quot; data-og-url=&quot;https://firebase.google.com/docs/auth/flutter/start?hl=ko&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://firebase.google.com/docs/auth/flutter/start?hl=ko#auth-state&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://firebase.google.com/docs/auth/flutter/start?hl=ko#auth-state&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; data-ke-size=&quot;size16&quot;&gt;Flutter에서 Firebase 인증 시작하기 &amp;nbsp;|&amp;nbsp; Firebase 문서&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Google I/O 2022에서 Firebase의 새로운 기능을 확인하세요. 자세히 알아보기 의견 보내기 Flutter에서 Firebase 인증 시작하기 컬렉션을 사용해 정리하기 내 환경설정을 기준으로 콘텐츠를 저장하고 분류&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;firebase.google.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현재 인증 상태 확인을 위해서는 다음의 3가지 메서드를 사용할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1. authStateChanges()&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 리스너가 등록된 직후&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 사용자가 로그인한 경우&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 현재 사용자가 로그아웃한 경우&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2. idTokenChanges()&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 리스너가 등록된 직후&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;- 사용자가 로그인한 경우&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;- 현재 사용자가 로그아웃한 경우&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;- 현재 사용자의 토큰이 변경된 경우&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;3. userChanges()&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 리스너가 등록된 직후&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;- 사용자가 로그인한 경우&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;- 현재 사용자가 로그아웃한 경우&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;- 현재 사용자의 토큰이 변경된 경우&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;- FirebaseAuth.instance.currentUser에서 제공하는 다음 메서드가 호출되는 경우:&lt;br /&gt;&amp;nbsp; - reload()&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; - unlink()&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; - updateEmail()&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; - updatePassword()&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; - updatePhoneNumber()&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; - updateProfile()&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;지금 프로젝트의 상황에서는 토큰을 사용하거나 currentUser의 메서드 감지 목적이 아닌 로그인/로그아웃에 의한 상태 변화만 원하기 때문에 &lt;b&gt;authStateChanges&lt;/b&gt;를 사용하기로 했다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;처음에는 authStateChanges()가 Stream&amp;lt;User?&amp;gt;이기 때문에 RootPage를 만들고, StreamBuilder로 해당 메서드에 따라 Auth() 혹은 Home() 위젯을 반환하면 되지 않을까 했지만..&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;실제로 구현을 해보니 첫 순간에만 화면이 변하고(Auth -&amp;gt; Home || Home -&amp;gt; Auth) 두 번째 부터는 변화가 없었다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;중단점을 찍어본 결과, 로그인/로그아웃 시 해당 코드가 실행되긴 하지만 화면이 변하지 않아 Hot Reload를 하거나 Restart를 해야 변한 것을 확인할 수 있었다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;stateless -&amp;gt; state, WidgetsBinding.instance.addPostFrameCallback(이는 혹시 몰라 router로 이동해볼까 했던 것인데, 위젯이 그려지기 전 router를 호출하는 이슈가 있어 위젯이 그려진 이후 메서드를 사용하고자) 등 다양한 방법을 써보았으나 원하는 방식으로 동작하지 않았다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;그러던 중, 라우팅에 사용했던 &lt;b&gt;GoRouter&lt;/b&gt;에 &lt;b&gt;redirect&lt;/b&gt; 기능이 있다는 것을 알게 되었고 이를 사용해 보기로 했다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;결과는? 실패.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;redirect에 똑같이 조건문과 분기를 넣어도, 로그인과 로그아웃 시 트리거가 되지 않았다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure id=&quot;og_1727143121030&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;go_router&quot; data-og-description=&quot;Multiple redirections It's possible to redirect multiple times w/ a single navigation, e.g. / =&amp;gt; /foo =&amp;gt; /bar. This is handy because it allows you to build up a list of routes over time and not to worry so much about attempting to trim each of them to thei&quot; data-og-host=&quot;docs.page&quot; data-og-source-url=&quot;https://docs.page/csells/go_router/redirection&quot; data-og-url=&quot;https://docs.page/csells/go_router/redirection&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cEDmkV/hyW6IHNGk8/wk0VgpjkSXKaLrf2KihAZ1/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/UlesX/hyW6Jmr4nH/KMuEakHDM4HZhjyZI3tSM1/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630&quot;&gt;&lt;a href=&quot;https://docs.page/csells/go_router/redirection&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://docs.page/csells/go_router/redirection&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cEDmkV/hyW6IHNGk8/wk0VgpjkSXKaLrf2KihAZ1/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/UlesX/hyW6Jmr4nH/KMuEakHDM4HZhjyZI3tSM1/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; data-ke-size=&quot;size16&quot;&gt;go_router&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Multiple redirections It's possible to redirect multiple times w/ a single navigation, e.g. / =&amp;gt; /foo =&amp;gt; /bar. This is handy because it allows you to build up a list of routes over time and not to worry so much about attempting to trim each of them to thei&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;docs.page&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;go_router의 redirection 문서를 보니, go_router는 앱의 상태 변화를 모르기 때문에 redirect만으로는 변화를 줄 수 없어 수동으로 라우팅을 해야 했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;대신, 앱의 상태에 따라 go_router가 자동으로 redirect를 하기 위해서는 &lt;b&gt;refreshListenable&lt;/b&gt;을 사용할 수 있다고 한다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;If you'd like to have the app's state cause go_router to automatically redirect, you can use the refreshListenable&lt;br /&gt;&amp;nbsp;argument of the GoRouter&amp;nbsp;constructor:&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 생성자에는 Listenable 타입이 들어가야 하는데, 이건 무엇인가 하니&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure id=&quot;og_1727144005835&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Listenable class - foundation library - Dart API&quot; data-og-description=&quot;An object that maintains a list of listeners. The listeners are typically used to notify clients that the object has been updated. There are two variants of this interface: Many classes in the Flutter API use or implement these interfaces. The following su&quot; data-og-host=&quot;api.flutter.dev&quot; data-og-source-url=&quot;https://api.flutter.dev/flutter/foundation/Listenable-class.html&quot; data-og-url=&quot;https://api.flutter.dev/flutter/foundation/Listenable-class.html&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://api.flutter.dev/flutter/foundation/Listenable-class.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://api.flutter.dev/flutter/foundation/Listenable-class.html&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; data-ke-size=&quot;size16&quot;&gt;Listenable class - foundation library - Dart API&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;An object that maintains a list of listeners. The listeners are typically used to notify clients that the object has been updated. There are two variants of this interface: Many classes in the Flutter API use or implement these interfaces. The following su&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;api.flutter.dev&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;공식문서에 따르면 객체가 업데이트되었음을 클라이언트에 알리는데 사용하는 리스너 목록을 관리하는 객체라고 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ChangeNotifier와 ValueNotifer를 통해 이 인터페이스를 사용할 수 있는데 User 값을 사용할 것이 아니기 때문에 ChangeNotifier를 써보기로 했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;Since the loginInfo is a&amp;nbsp;ChangeNotifier, it will notify listeners when it changes. By passing it to the GoRouter&amp;nbsp;constructor, go_router will automatically refresh the route when the login info changes. This allows you to simplify the login logic in your app:&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1727144267451&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;final class _AuthChangeNotifier extends ChangeNotifier {
  late final StreamSubscription&amp;lt;User?&amp;gt; _authSubscription;

  _AuthChangeNotifier() {
    _authSubscription = FirebaseAuth.instance.authStateChanges().listen((_) {
      notifyListeners();
    });
  }

  @override
  void dispose() {
    _authSubscription.cancel();
    super.dispose();
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;StreamSubscription&amp;lt;User?&amp;gt; 에 FirebaseAuth.instance.authStateChanges().listen을 할당하고, 상태 변경이 일어날 때마다 notifiyListeners를 사용하여 변경이 일어났음을 알려주도록 했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또한 상태 변경에 사용한 _authSubscription이 StreamSubscription 타입이기 때문에 dispose시 cancel로 구독을 취소하도록 했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 트리거를 해줄 refreshListenable과 redirect가 구성되었으므로 실제로 테스트만 해보면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1727144831769&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;final GoRouter router = GoRouter(
  redirect: (context, state) {
    final user = FirebaseAuth.instance.currentUser;

    if (user == null &amp;amp;&amp;amp; state.fullPath == '/home') {
      return '/auth';
    } else if (user != null &amp;amp;&amp;amp; state.fullPath == '/auth') {
      return '/home';
    }
    return null;
  },
  refreshListenable: _authChangeNotifier,
  routes: &amp;lt;RouteBase&amp;gt;[
    GoRoute(
      path: '/auth',
      builder: (context, state) =&amp;gt; const Auth(),
    ),
    GoRoute(
      path: '/home',
      builder: (context, state) =&amp;gt; const Home(),
    ),
  ]
)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아. refreshListenable에서 _AuthChangeNotifier()로 인스턴스화 해서 넣었었는데, router가 리빌드되는 경우를 생각하면 매번 새로운 인스턴스가 생성되고 불필요한 구독이 생길 수 있으므로 다른 방법이 필요했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Riverpod을 사용했기 때문에 ChangeNotiferProvider를 써야하나 했지만 router가 ConsumerWidget 내부에 있는 것이 아니라 전역적으로 생성 후 MaterialApp.router에 전달되는 구조기 때문에 ref를 사용할 수 없었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(이는 좀 더 생각해보고자 한다)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이에 _AuthChangeNotifier를 인스턴스화 한 것을 router에 전달하는 방식을 사용했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1727145181800&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;final _AuthChangeNotifier _authChangeNotifier = _AuthChangeNotifier();

final class _AuthChangeNotifier extends ChangeNotifier {
  late final StreamSubscription&amp;lt;User?&amp;gt; _authSubscription;

  _AuthChangeNotifier() {
    _authSubscription = FirebaseAuth.instance.authStateChanges().listen((_) {
      notifyListeners();
    });
  }

  @override
  void dispose() {
    _authSubscription.cancel();
    super.dispose();
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 하면 로그인 버튼에서는 signIn 메서드만, 로그아웃 버튼에서는 signOut 메서드만 호출하면 바뀐 사용자 상태에 따라 router가 자동으로 트리거되어 라우팅해주게 된다.&lt;/p&gt;</description>
      <category>Flutter</category>
      <category>authstatechanges</category>
      <category>ChangeNotifier</category>
      <category>Firebase</category>
      <category>FIrebase Auth</category>
      <category>Flutter</category>
      <category>go_router</category>
      <category>redirect</category>
      <category>refreshlistenable</category>
      <category>플러터</category>
      <author>Lust3r</author>
      <guid isPermaLink="true">https://llimental.tistory.com/355</guid>
      <comments>https://llimental.tistory.com/355#entry355comment</comments>
      <pubDate>Tue, 24 Sep 2024 12:00:53 +0900</pubDate>
    </item>
    <item>
      <title>이상한 문자 만들기</title>
      <link>https://llimental.tistory.com/354</link>
      <description>&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;문제&lt;/span&gt;&lt;/h3&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/12930&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://school.programmers.co.kr/learn/courses/30/lessons/12930&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1716603708041&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&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://school.programmers.co.kr/learn/courses/30/lessons/12930&quot; data-og-url=&quot;https://programmers.co.kr/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bbEk8d/hyV9SSoxQ3/wDFQ1WIxM940FpggWmAbBK/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/gcxGE/hyV9R6ZbcO/W1k664YMz1aN3L6Dcn561K/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630&quot;&gt;&lt;a href=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/12930&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/12930&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bbEk8d/hyV9SSoxQ3/wDFQ1WIxM940FpggWmAbBK/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/gcxGE/hyV9R6ZbcO/W1k664YMz1aN3L6Dcn561K/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; data-ke-size=&quot;size16&quot;&gt;프로그래머스&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;programmers.co.kr&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;내 답안 / 다른 사람들의 답안&lt;/span&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1704940612643&quot; class=&quot;swift&quot; style=&quot;background-color: #f8f8f8; color: #383a42; text-align: start;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;swift&quot;&gt;&lt;code&gt;func solution(_ s:String) -&amp;gt; String {
    var index = 0
    var result = [String]()

    s.forEach { character in
        if character == &quot; &quot; {
            result.append(String(character))

            index = 0
        } else {
            index % 2 == 0 ? result.append(character.uppercased()) : result.append(character.lowercased())

            index += 1
        }
    }

    return result.joined()
}&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;- 처음에는 enumerated와 map을 사용하면 변환이 쉽지 않을까 생각했는데 문제가 발생했다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;- 공백처리인가 싶어서 공백을 따로 처리해줬는데, 문제를 제대로 파악을 안해서 생긴 문제였다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;- 문자열 전체의 짝/홀수 인덱스가 아니라 각 단어별이기 때문에 인덱스를 매 단어마다 새로 판단해야 했다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;- 이에 s.forEach로 각 단어를 돌면서 공백이라면 공백을 추가하고 index를 초기화 시켜줬으며, 공백이 아니라면 인덱스에 따라 대소문자 변환을 해주고 index를 증가시켜주는 방식을 쓸 수 있었다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1704940720822&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 풀이 1
import Foundation
func solution(_ s:String) -&amp;gt; String {
    let a = s.components(separatedBy: &quot; &quot;).map { $0.enumerated().map { $0.offset % 2 == 0 ? $0.element.uppercased() : $0.element.lowercased() } }
    return a.map{ $0.map { $0 }.joined() }.joined(separator: &quot; &quot;)
}&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;- 기존에 실패했었던 방법을 성공시켰던 풀이라서 눈길이 더 갔다.&lt;br /&gt;&amp;nbsp; &amp;nbsp;s를 공백을 기준으로 나누고, 그 각각에 대해서 enumerated와 map을 사용하여 문자를 변환시켜주었고,&lt;br /&gt;&amp;nbsp; &amp;nbsp;그 각각 변환된 것을 joined로 합쳐준 후, 그 합쳐진 단어들을 공백을 주어 합치는 방법을 사용했다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;- 다만 마지막 return에서 a.map{ $0.map { $0 }.joined() }로 되어있는데 a.map { $0.joined() } 로 해도 같은 결과를 내기 때문에&lt;br /&gt;&amp;nbsp; &amp;nbsp;좀 더 다듬을 수 있을 것 같았다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2396&quot; data-origin-height=&quot;2122&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Kfb8T/btsHCyUwC9J/SHkZ5kOc3KHkMSaa6PF3D1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Kfb8T/btsHCyUwC9J/SHkZ5kOc3KHkMSaa6PF3D1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Kfb8T/btsHCyUwC9J/SHkZ5kOc3KHkMSaa6PF3D1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FKfb8T%2FbtsHCyUwC9J%2FSHkZ5kOc3KHkMSaa6PF3D1%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;2396&quot; height=&quot;2122&quot; data-origin-width=&quot;2396&quot; data-origin-height=&quot;2122&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;점수:&lt;span&gt; +6&lt;/span&gt;&lt;/span&gt;&lt;/h3&gt;</description>
      <category>프로그래머스 알고리즘 문제 기록/Lv. 1</category>
      <category>Swift</category>
      <category>알고리즘</category>
      <category>프로그래머스</category>
      <author>Lust3r</author>
      <guid isPermaLink="true">https://llimental.tistory.com/354</guid>
      <comments>https://llimental.tistory.com/354#entry354comment</comments>
      <pubDate>Sat, 25 May 2024 11:53:12 +0900</pubDate>
    </item>
    <item>
      <title>3진법 뒤집기</title>
      <link>https://llimental.tistory.com/353</link>
      <description>&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;문제&lt;/span&gt;&lt;/h3&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/68935?language=swift&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://school.programmers.co.kr/learn/courses/30/lessons/68935?language=swift&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1716602407894&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&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://school.programmers.co.kr/learn/courses/30/lessons/68935?language=swift&quot; data-og-url=&quot;https://programmers.co.kr/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/R1Jse/hyV9P2o5hw/vfhn4KknTxDyze9Q49HgG0/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/HtCGv/hyV9V2Cp3z/swBsKcbJESJG6IKKc21zT0/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630&quot;&gt;&lt;a href=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/68935?language=swift&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/68935?language=swift&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/R1Jse/hyV9P2o5hw/vfhn4KknTxDyze9Q49HgG0/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/HtCGv/hyV9V2Cp3z/swBsKcbJESJG6IKKc21zT0/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; data-ke-size=&quot;size16&quot;&gt;프로그래머스&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;programmers.co.kr&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;내 답안 / 다른 사람들의 답안&lt;/span&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1704940612643&quot; class=&quot;swift&quot; style=&quot;background-color: #f8f8f8; color: #383a42; text-align: start;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;swift&quot;&gt;&lt;code&gt;import Foundation

func solution(_ n:Int) -&amp;gt; Int {
    return Int(String(String(n, radix: 3).reversed()), radix: 3) ?? 0
}&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;- String(n, radix: 3)으로 3진법 수로 n을 나타내고, 그것을 reversed()한 값은 &lt;a style=&quot;color: #000000; text-align: left;&quot; data-v-16d388ce=&quot;&quot; data-v-b03d0ea4=&quot;&quot; data-v-cb125254=&quot;&quot;&gt;&lt;span data-v-88c637be=&quot;&quot; data-v-cb125254=&quot;&quot;&gt;ReversedCollection&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;a style=&quot;color: #000000; text-align: left;&quot; data-v-16d388ce=&quot;&quot; data-v-b03d0ea4=&quot;&quot; data-v-cb125254=&quot;&quot;&gt;&lt;span data-v-88c637be=&quot;&quot; data-v-cb125254=&quot;&quot;&gt;String&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;&amp;gt; 이기 때문에 String으로 형변환을 해줬다. 이후 다시 10진수로 나타내기 위해 Int(_, radix:)를 사용하여 변환과정을 거친 뒤 반환했다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;caret-color: #000000; background-color: #ffffff;&quot;&gt;- 이 문제에서의 중요한 점은, radix를 통해 각 진수를 변환하는 것으로 보인다. 10진수에서 다른 진수로 표현하기 위해서는 String(10진수, radix)를 사용하여 변환을 하고, 다른 진수에서 10진수로 표현하기 위해서는 Int(n진수, radix)를 이용할 수 있다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1704940720822&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import Foundation

  func solution(_ n:Int) -&amp;gt; Int {
        let flipToThree = String(n,radix: 3)
        let answer = Int(String(flipToThree.reversed()),radix:3)!
        return answer

    }&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;점수:&lt;span&gt; +1&lt;/span&gt;&lt;/span&gt;&lt;/h3&gt;</description>
      <category>프로그래머스 알고리즘 문제 기록/Lv. 1</category>
      <category>Swift</category>
      <category>알고리즘</category>
      <category>프로그래머스</category>
      <author>Lust3r</author>
      <guid isPermaLink="true">https://llimental.tistory.com/353</guid>
      <comments>https://llimental.tistory.com/353#entry353comment</comments>
      <pubDate>Sat, 25 May 2024 11:15:23 +0900</pubDate>
    </item>
    <item>
      <title>직사각형 별찍기</title>
      <link>https://llimental.tistory.com/352</link>
      <description>&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;문제&lt;/span&gt;&lt;/h3&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/12969&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://school.programmers.co.kr/learn/courses/30/lessons/12969&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1716084652856&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&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://school.programmers.co.kr/learn/courses/30/lessons/12969&quot; data-og-url=&quot;https://programmers.co.kr/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bfJbOP/hyV57hTuk3/rnQwzkUd0IivBWi6igRnvk/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/bhjt1x/hyV6d3ucQh/DK7vQCcWVLSKKmwKvZK1H0/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630&quot;&gt;&lt;a href=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/12969&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/12969&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bfJbOP/hyV57hTuk3/rnQwzkUd0IivBWi6igRnvk/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/bhjt1x/hyV6d3ucQh/DK7vQCcWVLSKKmwKvZK1H0/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; data-ke-size=&quot;size16&quot;&gt;프로그래머스&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;programmers.co.kr&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;내 답안 / 다른 사람들의 답안&lt;/span&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1704940612643&quot; class=&quot;swift&quot; style=&quot;background-color: #f8f8f8; color: #383a42; text-align: start;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;swift&quot;&gt;&lt;code&gt;import Foundation

let n = readLine()!.components(separatedBy: [&quot; &quot;]).map { Int($0)! }
let (a, b) = (n[0], n[1])

for i in 1...b {
    print(String(repeating: &quot;*&quot;, count: a))
}&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;- b만큼 a길이의 *String을 반복하는 방법을 사용했다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1704940720822&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 풀이 1
import Foundation

let n = readLine()!.components(separatedBy: [&quot; &quot;]).map { Int($0)! }
let (a, b) = (n[0], n[1])

for _ in 0..&amp;lt;b {
    print(Array(repeating: &quot;*&quot;, count: a).joined())
}

// 풀이 2
import Foundation

let n = readLine()!.components(separatedBy: [&quot; &quot;]).map { Int($0)! }
let (a, b) = (n[0], n[1])

for _ in 1...b {
    for _ in 1...a {
        print(&quot;*&quot;, terminator: &quot;&quot;)
    }
    print(&quot;&quot;)
}&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;- String으로 했을 때 시간이 오래 걸리는 것을 볼 수 있었는데(40ms 이상), Array로 사용하면 평균 10ms 아래로 나오는 것을 알 수 있었다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;점수:&lt;span&gt; +1&lt;/span&gt;&lt;/span&gt;&lt;/h3&gt;</description>
      <category>프로그래머스 알고리즘 문제 기록/Lv. 1</category>
      <category>Swift</category>
      <category>알고리즘</category>
      <category>프로그래머스</category>
      <author>Lust3r</author>
      <guid isPermaLink="true">https://llimental.tistory.com/352</guid>
      <comments>https://llimental.tistory.com/352#entry352comment</comments>
      <pubDate>Sun, 19 May 2024 11:16:09 +0900</pubDate>
    </item>
    <item>
      <title>행렬의 덧셈</title>
      <link>https://llimental.tistory.com/351</link>
      <description>&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;문제&lt;/span&gt;&lt;/h3&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/12950&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://school.programmers.co.kr/learn/courses/30/lessons/12950&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1715844372068&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&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://school.programmers.co.kr/learn/courses/30/lessons/12950&quot; data-og-url=&quot;https://programmers.co.kr/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bm996F/hyV6ll4H99/dLZu6NyfkKN2tM53Fhwwek/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/ci6Cvw/hyV6cJqLEF/pCog4I4Rfi9adMZ0ZMegzk/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630&quot;&gt;&lt;a href=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/12950&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/12950&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bm996F/hyV6ll4H99/dLZu6NyfkKN2tM53Fhwwek/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/ci6Cvw/hyV6cJqLEF/pCog4I4Rfi9adMZ0ZMegzk/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; data-ke-size=&quot;size16&quot;&gt;프로그래머스&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;programmers.co.kr&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;내 답안 / 다른 사람들의 답안&lt;/span&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1704940612643&quot; class=&quot;swift&quot; style=&quot;background-color: #f8f8f8; color: #383a42; text-align: start;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;swift&quot;&gt;&lt;code&gt;func solution(_ arr1:[[Int]], _ arr2:[[Int]]) -&amp;gt; [[Int]] {
    var result = Array(repeating: Array(repeating: 0, count: arr1[0].count), count: arr1.count)

    for i in 0..&amp;lt;arr1.count {
        for j in 0..&amp;lt;arr1[i].count {
            result[i][j] = arr1[i][j] + arr2[i][j]
        }
    }

    return result
}&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;- 각 행과 열의 항목을 더한 배열을 반환하는 방법을 사용했다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1704940720822&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 풀이 1
import Foundation

func solution(_ arr1:[[Int]], _ arr2:[[Int]]) -&amp;gt; [[Int]] {
    return zip(arr1, arr2).map{zip($0,$1).map{$0+$1}}
}

// 풀이 2
func solution(_ arr1:[[Int]], _ arr2:[[Int]]) -&amp;gt; [[Int]] {
    var arr: [[Int]] = []

    for n in 0..&amp;lt;arr1.count {
        var temp:[Int] = []
        for m in 0..&amp;lt;arr1[n].count {
            temp.append(arr1[n][m] + arr2[n][m])
        }
        arr.append(temp)
    }

    return arr
}&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;- zip을 사용해보려 했지만 단순히 배열을 합치는 정도여서 반복문을 사용했는데, 풀이 1과 같은 방법으로 사용하면 됨을 알 수 있었다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;점수:&lt;span&gt; +1&lt;/span&gt;&lt;/span&gt;&lt;/h3&gt;</description>
      <category>프로그래머스 알고리즘 문제 기록/Lv. 1</category>
      <category>Swift</category>
      <category>알고리즘</category>
      <category>프로그래머스</category>
      <author>Lust3r</author>
      <guid isPermaLink="true">https://llimental.tistory.com/351</guid>
      <comments>https://llimental.tistory.com/351#entry351comment</comments>
      <pubDate>Sun, 19 May 2024 11:10:29 +0900</pubDate>
    </item>
    <item>
      <title>문자열 다루기 기본</title>
      <link>https://llimental.tistory.com/350</link>
      <description>&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;문제&lt;/span&gt;&lt;/h3&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/12918?language=swift&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://school.programmers.co.kr/learn/courses/30/lessons/12918?language=swift&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1715843932335&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&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://school.programmers.co.kr/learn/courses/30/lessons/12918?language=swift&quot; data-og-url=&quot;https://programmers.co.kr/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/tSlOa/hyV55KiZ2w/R1gpdKSryk4lTJiJYCkHKK/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/bxOezT/hyV56vFrVr/grjY84IIkuXzeaXWoXyE8K/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630&quot;&gt;&lt;a href=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/12918?language=swift&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/12918?language=swift&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/tSlOa/hyV55KiZ2w/R1gpdKSryk4lTJiJYCkHKK/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/bxOezT/hyV56vFrVr/grjY84IIkuXzeaXWoXyE8K/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; data-ke-size=&quot;size16&quot;&gt;프로그래머스&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;programmers.co.kr&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;내 답안 / 다른 사람들의 답안&lt;/span&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1704940612643&quot; class=&quot;swift&quot; style=&quot;background-color: #f8f8f8; color: #383a42; text-align: start;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;swift&quot;&gt;&lt;code&gt;func solution(_ s:String) -&amp;gt; Bool {
    return (s.count == 4 || s.count == 6) &amp;amp;&amp;amp; Int(s) != nil ? true : false
}&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;- 주어진 조건으로 삼항연산자를 만들면 좋겠다는 생각이 들었고, count를 통해 4자리 혹은 6자리인지 확인하고, 둘 중에 하나라면 Int로 타입캐스팅 했을 때(Int(String)은 옵셔널 값이다) nil이 아니라면(숫자라면) true를, 자리수가 맞지 않거나 nil이라면 false를 반환했다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1704940720822&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 풀이 1
func solution(_ s:String) -&amp;gt; Bool {
    return (Int(s) != nil &amp;amp;&amp;amp; (s.count == 4 || s.count == 6)) ? true : false
}

// 풀이 2
func solution(_ s:String) -&amp;gt; Bool {
    if s.count == 4 || s.count == 6 {
        if Int(s) != nil {
            return true
        }
    }
    return false
}&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;점수:&lt;span&gt; +6&lt;/span&gt;&lt;/span&gt;&lt;/h3&gt;</description>
      <category>프로그래머스 알고리즘 문제 기록/Lv. 1</category>
      <category>Swift</category>
      <category>알고리즘</category>
      <category>프로그래머스</category>
      <author>Lust3r</author>
      <guid isPermaLink="true">https://llimental.tistory.com/350</guid>
      <comments>https://llimental.tistory.com/350#entry350comment</comments>
      <pubDate>Thu, 16 May 2024 16:25:48 +0900</pubDate>
    </item>
    <item>
      <title>부족한 금액 계산하기</title>
      <link>https://llimental.tistory.com/349</link>
      <description>&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;문제&lt;/span&gt;&lt;/h3&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/82612&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://school.programmers.co.kr/learn/courses/30/lessons/82612&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1715786777439&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&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://school.programmers.co.kr/learn/courses/30/lessons/82612&quot; data-og-url=&quot;https://programmers.co.kr/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bHxyVl/hyV6bXTgMd/W9FD2xHzOzUW47lzs3vFz0/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/b1sCa9/hyV2raecKl/RocJtNeont4HYjkLdgsUI1/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630&quot;&gt;&lt;a href=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/82612&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/82612&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bHxyVl/hyV6bXTgMd/W9FD2xHzOzUW47lzs3vFz0/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/b1sCa9/hyV2raecKl/RocJtNeont4HYjkLdgsUI1/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; data-ke-size=&quot;size16&quot;&gt;프로그래머스&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;programmers.co.kr&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;내 답안 / 다른 사람들의 답안&lt;/span&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1704940612643&quot; class=&quot;swift&quot; style=&quot;background-color: #f8f8f8; color: #383a42; text-align: start;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;swift&quot;&gt;&lt;code&gt;import Foundation

func solution(_ price:Int, _ money:Int, _ count:Int) -&amp;gt; Int64{
    let usageFee = (1...count).map { $0 * price }.reduce(0, +) - money

    return usageFee &amp;lt; 0 ? 0 : Int64(usageFee)
}&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;- 횟수만큼 곱한 값들을 더한 것이 이용금액이기 때문에 그 값에서 money를 뺀 값을 가지고 결과를 도출할 수 있었다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1704940720822&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 풀이 1
import Foundation

func solution(_ price:Int, _ money:Int, _ count:Int) -&amp;gt; Int{
    return max((count + 1) * count / 2 * price - money , 0)
}

// 풀이 2
import Foundation

func solution(_ price:Int, _ money:Int, _ count:Int) -&amp;gt; Int64{
    let totalPrice = price * (count * (count+1)/2)

    if money &amp;gt;= totalPrice {
        return 0
    }

    return Int64(totalPrice - money)
}&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;- (count * (count + 1) / 2) 는 1부터 count까지의 합이고 여기에 price를 곱하면 총 이용금액이 됨을 알 수 있었다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;점수:&lt;span&gt; +5&lt;/span&gt;&lt;/span&gt;&lt;/h3&gt;</description>
      <category>프로그래머스 알고리즘 문제 기록/Lv. 1</category>
      <category>Swift</category>
      <category>알고리즘</category>
      <category>프로그래머스</category>
      <author>Lust3r</author>
      <guid isPermaLink="true">https://llimental.tistory.com/349</guid>
      <comments>https://llimental.tistory.com/349#entry349comment</comments>
      <pubDate>Thu, 16 May 2024 00:42:13 +0900</pubDate>
    </item>
    <item>
      <title>문자열 내림차순으로 배치하기</title>
      <link>https://llimental.tistory.com/348</link>
      <description>&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;문제&lt;/span&gt;&lt;/h3&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/12917&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://school.programmers.co.kr/learn/courses/30/lessons/12917&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1715786585969&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&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://school.programmers.co.kr/learn/courses/30/lessons/12917&quot; data-og-url=&quot;https://programmers.co.kr/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/R9qgp/hyV6bDz2y5/NCIUb0EHszssIZKmKdDMZ0/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/csaj0h/hyV581aUIP/ttp1Zu5bNvHgz4GUHK5tj1/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630&quot;&gt;&lt;a href=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/12917&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/12917&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/R9qgp/hyV6bDz2y5/NCIUb0EHszssIZKmKdDMZ0/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/csaj0h/hyV581aUIP/ttp1Zu5bNvHgz4GUHK5tj1/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; data-ke-size=&quot;size16&quot;&gt;프로그래머스&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;programmers.co.kr&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;내 답안 / 다른 사람들의 답안&lt;/span&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1704940612643&quot; class=&quot;swift&quot; style=&quot;background-color: #f8f8f8; color: #383a42; text-align: start;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;swift&quot;&gt;&lt;code&gt;func solution(_ s:String) -&amp;gt; String {
    return String(s.sorted(by: &amp;gt;))
}&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;- 내림차순으로 정렬하는 것으로 보고, sorted(by: &amp;gt;)를 사용해 나온 [Character]를 String으로 형변환해 반환했다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1704940720822&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 풀이 1
func solution(_ s:String) -&amp;gt; String {
    return String(s.sorted { $0 &amp;gt; $1 })
}

// 풀이 2
func solution(_ s:String) -&amp;gt; String {
    return String(s.sorted().reversed())
}&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;점수:&lt;span&gt; +1&lt;/span&gt;&lt;/span&gt;&lt;/h3&gt;</description>
      <category>프로그래머스 알고리즘 문제 기록/Lv. 1</category>
      <category>Swift</category>
      <category>알고리즘</category>
      <category>프로그래머스</category>
      <author>Lust3r</author>
      <guid isPermaLink="true">https://llimental.tistory.com/348</guid>
      <comments>https://llimental.tistory.com/348#entry348comment</comments>
      <pubDate>Thu, 16 May 2024 00:25:51 +0900</pubDate>
    </item>
    <item>
      <title>약수의 개수와 덧셈</title>
      <link>https://llimental.tistory.com/347</link>
      <description>&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;문제&lt;/span&gt;&lt;/h3&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/77884&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://school.programmers.co.kr/learn/courses/30/lessons/77884&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1715784516777&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&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://school.programmers.co.kr/learn/courses/30/lessons/77884&quot; data-og-url=&quot;https://programmers.co.kr/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/u3cDH/hyV57BbDbo/OGiflWMFIUB6Xj1oXlFsjk/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/mUTKg/hyV2yf884V/osPjWlh0gBTPxeiH6qyOw1/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630&quot;&gt;&lt;a href=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/77884&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/77884&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/u3cDH/hyV57BbDbo/OGiflWMFIUB6Xj1oXlFsjk/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/mUTKg/hyV2yf884V/osPjWlh0gBTPxeiH6qyOw1/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; data-ke-size=&quot;size16&quot;&gt;프로그래머스&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;programmers.co.kr&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;내 답안 / 다른 사람들의 답안&lt;/span&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1704940612643&quot; class=&quot;swift&quot; style=&quot;background-color: #f8f8f8; color: #383a42; text-align: start;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;swift&quot;&gt;&lt;code&gt;import Foundation

func solution(_ left:Int, _ right:Int) -&amp;gt; Int {
    var result = [Int]()

    for i in left...right {
        let miniNum = Int(sqrt(Double(i)))

        miniNum * miniNum == i ? result.append(-i) : result.append(i)
    }

    return result.reduce(0, +)
}&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;- 규칙을 봤을 때, 약수의 개수가 홀수개인 수는 제곱으로 가능한 수인 것 같았다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;- sqrt로 제곱수를 구하고 그 수를 제곱했을 때 원래 수와 같다면 음수를, 다르다면 양수를 result에 담아 reduce로 결과를 반환했다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1704940720822&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 풀이 1
func solution(_ left: Int, _ right: Int) -&amp;gt; Int {
    return (left...right).map { i in (1...i).filter { i % $0 == 0 }.count % 2 == 0 ? i : -i }.reduce(0, +)
}

// 풀이 2
import Foundation

func solution(_ left:Int, _ right:Int) -&amp;gt; Int {
    var answer = 0

    for number in left...right{
        if floor(sqrt(Double(number))) == sqrt(Double(number)) {
            answer -= number
        } else {
            answer += number
        }
    }
    return answer
}&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;점수:&lt;span&gt; +1&lt;/span&gt;&lt;/span&gt;&lt;/h3&gt;</description>
      <category>프로그래머스 알고리즘 문제 기록/Lv. 1</category>
      <category>Swift</category>
      <category>알고리즘</category>
      <category>프로그래머스</category>
      <author>Lust3r</author>
      <guid isPermaLink="true">https://llimental.tistory.com/347</guid>
      <comments>https://llimental.tistory.com/347#entry347comment</comments>
      <pubDate>Thu, 16 May 2024 00:22:25 +0900</pubDate>
    </item>
  </channel>
</rss>