<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>jean_deluge.log</title>
        <link>https://velog.io/</link>
        <description></description>
        <lastBuildDate>Thu, 11 May 2023 10:17:24 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>jean_deluge.log</title>
            <url>https://velog.velcdn.com/images/jean_deluge/profile/808257a8-0dd8-4caa-b9ac-44ddb95272b8/social_profile.png</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. jean_deluge.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/jean_deluge" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[Rails과 MySQL, docker-compose로 연결하기 ]]></title>
            <link>https://velog.io/@jean_deluge/Rails%EA%B3%BC-MySQL-docker-compose%EB%A1%9C-%EC%97%B0%EA%B2%B0%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@jean_deluge/Rails%EA%B3%BC-MySQL-docker-compose%EB%A1%9C-%EC%97%B0%EA%B2%B0%ED%95%98%EA%B8%B0</guid>
            <pubDate>Thu, 11 May 2023 10:17:24 GMT</pubDate>
            <description><![CDATA[<h1 id="전제">전제</h1>
<p>docker-compose.yml과
rails앱 프로젝트 루트의 config/database.yml에서 설정해야한다.</p>
<p>MySQL에 따로 사용자를 생성하지 않고, root 계정으로 접속하도록 했다.</p>
<h2 id="docker-composeyml">docker-compose.yml</h2>
<pre><code class="language-yml">version: &quot;3.9&quot;
services:
  web:
    build: .
    command: bundle exec rails s -p 3000 -e development -b &#39;0.0.0.0&#39;
    ports:
      - 3001:3000
    volumes:
      - .:/usr/src/app
    depends_on:
      - database
      - redis
    environment:
      - MYSQL_ROOT_PASSWORD=password
      - MYSQL_DATABASE=basic
      - MYSQL_USERNAME=root
      - MYSQL_HOST=db

  redis:
    image: redis

  db:
    image: mysql:5.7
    restart: always
    environment:
      - MYSQL_ROOT_PASSWORD=password
      - MYSQL_DATABASE=basic
    ports:
      - 3307:3306
    volumes:
      - db:/var/run/mysqld

volumes:
  db:
</code></pre>
<hr>
<h3 id="레일즈앱에서-필요한-mysql환경변수는">레일즈앱에서 필요한 MYSQL환경변수는</h3>
<ol>
<li>MYSQL_ROOT_PASSWORD :  root 계정의 비밀번호 설정</li>
<li>MYSQL_DATABASE :  레일즈앱에서 사용할 데이터베이스이름</li>
<li>MYSQL_HOST : MYSQL 호스트명 =&gt; docker-compose.yml에서 db이름을 입력. 여기서는 &quot;db&quot;임</li>
<li>MYSQL_USERNAME: root (이유는 현재 컨테이너에서 root로 접속하기 위함)</li>
</ol>
<h3 id="db에서-필요한-mysql-환경-변수는">DB에서 필요한 MYSQL 환경 변수는</h3>
<ol>
<li>DB_ROOT_PASSWORD : mySQL root 를 만들때 사용할 비밀번호</li>
<li>DB_DATABASE: 최초에 생성할 DB이름 -&gt; 레일즈앱에서 필요한 데이터베이스 이름. MYSQL_DATABASE로 설정해준다.</li>
</ol>
<h3 id="volumes-설정">volumes 설정</h3>
<p>mysql서버와 연결하기 위해서 필요한 소켓파일을 위치를 지정해줘야한다.
mysql에서 소켓 파일 위치를 못찾으면 다음과 같은 에러를 띄운다. 가끔 다른 위치를 가르키는 경우가 있지만, 다음과 같은 오류에서 가르키는 위치를 확인하면 된다.</p>
<blockquote>
</blockquote>
<p>can&#39;t connect to local mysql server through socket &#39;/run/mysqld/mysqld.sock&#39; (2)</p>
<p>여기서 중요한건 &#39;/run/mysqld/&#39;에서 mysqld.sock을 찾는다는 것이므로 다음과 같이 위치를 지정해준다.</p>
<pre><code class="language-yml">    volumes:
      - db:/var/run/mysqld</code></pre>
<h2 id="configdatabaseyml">config/database.yml</h2>
<pre><code class="language-yml">default: &amp;default
  adapter: mysql2
  encoding: utf8mb4
  pool: &lt;%= ENV.fetch(&quot;RAILS_MAX_THREADS&quot;) { 5 } %&gt;
  host: &lt;%= ENV[&#39;MYSQL_HOST&#39;] %&gt; ##db
  username: &lt;%= ENV[&#39;MYSQL_USERNAME&#39;] %&gt; ## root
  password: &lt;%= ENV[&#39;MYSQL_ROOT_PASSWORD&#39;] %&gt; ## password
  socket: /var/run/mysqld/mysqld.sock
  timeout: 5000

development:
  &lt;&lt;: *default
  database: developmentdb

# Warning: The database defined as &quot;test&quot; will be erased and
# re-generated from your development database when you run &quot;rake&quot;.
# Do not set this db to the same as development or production.
test:
  &lt;&lt;: *default
  database: testdb

production:
  &lt;&lt;: *default
  database: productiondb</code></pre>
<p>default에서 
소켓위치를 다음과 같이 명시해준다.
  socket: /var/run/mysqld/mysqld.sock</p>
<p>여기서 각 환경에 맞는 database이름을 지정해준다.</p>
<pre><code class="language-yml">development:
  &lt;&lt;: *default
  database: developmentdb</code></pre>
<hr>
<h1 id="실행">실행</h1>
<pre><code>docker-compose run /&lt;레일즈 웹 컨테이너 이름&gt;/ run rails db:setup
</code></pre><p>을 해주어 각 환경에 맞는 데이터베이스가 mysql 서버에 생성되도록 한다.</p>
<p>그 후 다음 명령어로 이미지를 빌드하고 컨테이너를 모두 실행시킨다.</p>
<pre><code>docker-compose up -d --build
</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[3월 17일의 삽질]]></title>
            <link>https://velog.io/@jean_deluge/%EC%98%A4%EB%8A%98</link>
            <guid>https://velog.io/@jean_deluge/%EC%98%A4%EB%8A%98</guid>
            <pubDate>Fri, 17 Mar 2023 11:48:58 GMT</pubDate>
            <description><![CDATA[<p>어제 까지만 해도  안드로이드 에뮬레이터에서 잘 되던 appinstall이, </p>
<blockquote>
<p>Execution failed for task &#39;:react-native-gradle-plugin:compileKotlin&#39;. </p>
</blockquote>
<p>라는 에러를 발생시키고 안드로이드 앱이 실행되지 않았다.
방법을 찾다가 
<a href="https://github.com/facebook/react-native/issues/34410">https://github.com/facebook/react-native/issues/34410</a> 여기서
gradle 버전을 바꾸면 되었다고 하는 부분이 있어서 다음과 같이 적용해주었다.</p>
<p><code>root &gt; android &gt; gradle/wrapper &gt; gradlewrapper.properties</code> 경로에서 다음 값을 바꾸어주었더니 설치가 잘 되었다.</p>
<p><code>distributionUrl=https\://services.gradle.org/distributions/gradle-7.4.2-bin.zip</code></p>
<p><code>distributionUrl=https\://services.gradle.org/distributions/gradle-7.5.1-all.zip</code></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[SWEA 1959. 두 개의 숫자열
]]></title>
            <link>https://velog.io/@jean_deluge/SWEA-1959.-%EB%91%90-%EA%B0%9C%EC%9D%98-%EC%88%AB%EC%9E%90%EC%97%B4</link>
            <guid>https://velog.io/@jean_deluge/SWEA-1959.-%EB%91%90-%EA%B0%9C%EC%9D%98-%EC%88%AB%EC%9E%90%EC%97%B4</guid>
            <pubDate>Sun, 12 Mar 2023 07:46:21 GMT</pubDate>
            <description><![CDATA[<h3 id="풀이과정">풀이과정</h3>
<ol>
<li><p>서로 크기가 다르거나 같은 배열, 하나는 3 크기, 하나는 5 크기라고 했을때, 서로 마주보는 위치의 숫자를 곱하는 방법은 다음과 같다.</p>
</li>
<li><p>총 3번의 연산이 이루어지는데,
1) 3크기 배열의 첫 원소와, 5크기 배열의 첫 원소 부터 매칭하여 연산
2) 3크기의 배열 첫 원소와, 5크기 배열의 두 번째 원소
3) 3크기의 배열 첫 원소와, 5크기의 배열 세 번재 원소를 매칭하면 된다.</p>
</li>
<li><p>결론은 매칭 횟수는 5-3+1 가 되고,
매칭하는 원소끼리는 한 번 매칭될때마다 
긴 배열쪽의 시작원소는 하나씩 커진다.</p>
</li>
</ol>
<pre><code class="language-python"> a_len, b_len   = map(int, input().split())
    a_arr = list(map(int, input().split()))
    b_arr = list(map(int, input().split()))

    longer = []
    shorter = []

    if a_len &gt;= b_len:
        longer = a_arr
        shorter =b_arr
    else:
        longer = b_arr
        shorter = a_arr

    total_arr = []
    for i in range(len(longer)- len(shorter)+1):
        total = 0
           for j in range(len(shorter)):
               total += shorter[j] * longer[i+j]
        total_arr.append(total)</code></pre>
<h3 id="리뷰">리뷰</h3>
<p>25분 걸렸다.
예저에 이런 비슷한 문제를 푼적이 있는 것 같아서 빨리 풀 수 있었던 것 같다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[2. Figma 로 프로토타입 만들기(1)]]></title>
            <link>https://velog.io/@jean_deluge/2.-Figma-%EB%A1%9C-%ED%94%84%EB%A1%9C%ED%86%A0%ED%83%80%EC%9E%85-%EB%A7%8C%EB%93%A4%EA%B8%B01</link>
            <guid>https://velog.io/@jean_deluge/2.-Figma-%EB%A1%9C-%ED%94%84%EB%A1%9C%ED%86%A0%ED%83%80%EC%9E%85-%EB%A7%8C%EB%93%A4%EA%B8%B01</guid>
            <pubDate>Wed, 08 Mar 2023 12:39:44 GMT</pubDate>
            <description><![CDATA[<p>RN을 안드로이드, 아이폰에서 구동가능하게 설정해놓고 바로 시작하려니 되지 않았다. 오히려 혼란스러워서 요구사항 명세서를 적고, 내가 뭐가 필요한지 확인하기로 했다.
나중에 프론트엔드와 백엔드 서로 연동할 때, 누락되는 데이터나 API가 없는 편이 골치가 덜 아플것같았다.</p>
<p>figma로 현재 다음과 같이 삽질 중이다.
화면 구성을 하면서 요구사항을 정리해볼예정이다.
<img src="https://velog.velcdn.com/images/jean_deluge/post/d7d69f6a-b9fe-4d38-926c-be44cf7b1964/image.png" alt=""></p>
<p>깃 주소: <a href="https://github.com/jeanDeluge/record_calendar_client">https://github.com/jeanDeluge/record_calendar_client</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[SWEA 1954. 달팽이 숫자]]></title>
            <link>https://velog.io/@jean_deluge/SWEA-1954.-%EB%8B%AC%ED%8C%BD%EC%9D%B4-%EC%88%AB%EC%9E%90</link>
            <guid>https://velog.io/@jean_deluge/SWEA-1954.-%EB%8B%AC%ED%8C%BD%EC%9D%B4-%EC%88%AB%EC%9E%90</guid>
            <pubDate>Wed, 08 Mar 2023 12:10:53 GMT</pubDate>
            <description><![CDATA[<h3 id="풀이-과정">풀이 과정</h3>
<ol>
<li>주어진 N으로 N X N 이차원 배열을 만든다. </li>
<li>숫자의 갯수는 N X N 개 이므로, count가 N x N개 일때까지만 다음을 반복한다.</li>
<li>rowStart = 0, rowEnd = n, columnStart = 0, columnEnd = n 로 한다.
 이때 rowEnd, columnEnd 를 n-1로 설정하지 않은 이유는 range함수에서 범위 체크때문이다.</li>
<li>먼저 <strong>첫번째</strong> 행을 채운다.rowStart = 0 일때, columnStart = 0, columnEnd = n 이다.
그렇다면 현재 첫번째 행의 인덱스는 (0, 0), (0, 1), (0, 2) , ... (0, n)으로 
snail[i][j] 중 행을 뜻하는 i 는 rowStart =0으로 고정한다.열의 인덱스 j는 수학적 변수로, columnStart 에서 columnEnd -1 까지 한 칸씩 이동하며 각각 0,1,2,3,..., n-1 으로 변화해야한다.</li>
<li>첫번째 행을 모두 채웠으면, 이제 첫번째 행에서 할 내용은 없으므로 rowStart + 1을 해준다.</li>
<li><strong>두번째로</strong> 인덱스 (i, n-1) (i은 수학적 변수) 로, 인덱스 1번 행에서 n-1 행에 각각 n+1, n+2 ..., 2n-1 숫자를 대입한다. </li>
<li><strong>세번째로는</strong> (n-1, i) (i는 n-1 ~ 0 까지) 마지막 행, 즉 rowEnd 에서, 각각의 열에 2n ~ 3n-1 숫자를 넣어야한다.
모두 채우면 rowEnd - 1로 변화한다. 이유는 현재의 rowEnd에서의 마지막 행은 모두 찼기 때문이다.</li>
<li><strong>네번째로는</strong> (0, n-2) 에서 (0, 1) 까지 채워야한다.
이 곳을 모두 채우면 columnStart + 1 을 한다. 이유는 현재 첫번재 열은 다 채워졌기 때무에 두번째 열부터 채여야한다.</li>
</ol>
<p>이때부터는 2~8번의 내용을 반복해야한다.</p>
<pre><code class="language-python">    while n * n &gt;= count and rowStart &lt;= rowEnd :
        for i in range(rowStart, columnEnd):
            snail[rowStart][i]  = count
            count = count + 1
        # 열을 바꿔주기 위해서
        rowStart  = rowStart + 1
        for i in range(rowStart, rowEnd):
            snail[i][columnEnd-1] = count
            count = count + 1
        columnEnd = columnEnd - 1
        for i in range(columnEnd-1, columnStart-1, -1):
            snail[rowEnd -1][i] = count
            count = count + 1
        rowEnd = rowEnd -1
        for i in range(rowEnd-1, rowStart-1, -1):
            snail[i][columnStart] = count
            count = count + 1
        columnStart = columnStart +1
    print(&quot;#{}&quot;.format(test_case))
    for row in snail:
        for column in row:
            print(column, end=&quot; &quot;)
        print()</code></pre>
<h3 id="리뷰">리뷰</h3>
<p>2시간 소요 : row, column 변화를 수기로 체크해가면서 하느라 늦었다.</p>
<p>나선형 순회 알고리즘 공부로 늦었다. 나선형 순회알고리즘은 너무 어려워서 이해한 다음, 그 다음 포스팅에서 공부한 내용을 정리하고자한다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[ 1. 기술스택선택의 고민]]></title>
            <link>https://velog.io/@jean_deluge/1.-%EA%B8%B0%EC%88%A0%EC%8A%A4%ED%83%9D%EC%84%A0%ED%83%9D%EC%9D%98-%EA%B3%A0%EB%AF%BC</link>
            <guid>https://velog.io/@jean_deluge/1.-%EA%B8%B0%EC%88%A0%EC%8A%A4%ED%83%9D%EC%84%A0%ED%83%9D%EC%9D%98-%EA%B3%A0%EB%AF%BC</guid>
            <pubDate>Tue, 07 Mar 2023 13:29:18 GMT</pubDate>
            <description><![CDATA[<h1 id="1-왜-시작하게되었나">1. 왜 시작하게되었나</h1>
<p>요가를 하다가 문득 pl@y 2처럼 사진을 캘린더 형식으로 저장하여 습관트래커처럼 사용하고 싶어졌다.</p>
<p>혼자 인증사진을 찍다가 문득 이걸 포트폴리오로 만들어 볼까? 하는 생각 겸,
친구랑 같이 인증사진으로 챌린저스처럼 인증사진을 서로 공유하는걸 해보고 싶었다.</p>
<h1 id="2-기술-스택의-선택">2. 기술 스택의 선택</h1>
<h2 id="front">Front</h2>
<p>스마트폰으로 바로바로 입력하고 싶어서 네이티브 밖에 선택지가 없었다.
그런데 나는 아이패드와 갤럭시폰을 쓰는 하이브리드(?) 유저다.</p>
<p>그래서 리액트 네이티브와 플러터를 고민했는데,
내가 아는 언어는 JS, python, JAVA가 전부다. 심지어 JAVA는 아직 익숙치 않았다.
또 플러터를 쓰면 Dart언어를 봐야하는데, 그걸 공부하기에는 시간이 부족하다고 판단했다.
그래서 JS를 이용한 RN으로 사용하기로 했다.</p>
<h2 id="back">Back</h2>
<h3 id="왜-굳이-백엔드서버-구현을-하려-하는가">왜 굳이 백엔드서버 구현을 하려 하는가</h3>
<p>나 혼자 쓰면 그냥 구글 드라이브랑 연동해서 쓸까 생각했다. 그런데, 친구랑 같이 쓰고 싶다면 백엔드가 필요하지 않을까? </p>
<h3 id="언어와-프레임워크">언어와 프레임워크</h3>
<ul>
<li>Java, SpringBoot</li>
<li>Java를 이미 알고 있는 상태에다가, 객체지향에 대해 공부하고 있었기 때문에 선택했다.</li>
<li>RN에서 안드로이드 환경에는 Java를 건드려야하는 때가 온다. 이전 사이드프로젝트로 RN에서 디바이스 기능을 사용하려 Java를 건드려야했던 적이 있었다. 그래서 그 때를 대비해 Java를 공부하는 겸해서 사용해보려고한다. 솔직히 Kotlin도 한번  사용해보고 싶었는데 처음부터 시작하는 것보다 나을 것 같아서 자바를 선택했다.</li>
<li>검색 기능이 필요할 것 같다. 그래서 ElasticSearch 외부라이브러리 자동설정을 할 수 있다고 해서 선택하기도했다.</li>
</ul>
<h1 id="3-서버환경">3. 서버환경</h1>
<p>지금 더 고민이 필요한데, 대략적으로 생각하기로는 다음과 같이 생각하고 있다.</p>
<ol>
<li><p>데이터베이스 NoSQL, mongoDB 호스팅. 512MB까지 무료이기 때문에 선택했다. </p>
</li>
<li><p>오브젝트 스토리지 사용여부 : AWS S3 
표준스토리지가 5GB까지 무료니까 해볼만해서 선택했다.
차선택으로는 네이버 Object Storage</p>
</li>
<li><p>웹 서버  : AWS Lambda
일단 개인 프로젝트니까 작게 시작하고 싶었다. 
차선택으로는 역시 네이버 Cloud Function </p>
</li>
<li><p>CDN : jsdelivr - 무료</p>
</li>
</ol>
<p>서버환경은 내일 더 생각하기로 했다 ;) 
공부할게 생각보다 더 많네...</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[SWEA 1948. 날짜 계산기]]></title>
            <link>https://velog.io/@jean_deluge/SWEA-1948.-%EB%82%A0%EC%A7%9C-%EA%B3%84%EC%82%B0%EA%B8%B0</link>
            <guid>https://velog.io/@jean_deluge/SWEA-1948.-%EB%82%A0%EC%A7%9C-%EA%B3%84%EC%82%B0%EA%B8%B0</guid>
            <pubDate>Thu, 02 Mar 2023 10:48:07 GMT</pubDate>
            <description><![CDATA[<h3 id="풀이과정">풀이과정</h3>
<ol>
<li>각 월에 맞는 일 수에 맞게 딕셔너리 만들어 놓는다.</li>
<li>첫달에서부터 끝달까지 for문을 사용하여 일자를 더한다.
 2-1. 첫달의 경우에는 전체 일수 - 현재 날짜 + 1 을 더하여 남은 한달의 일수를 계산하여 더한다.
 2-2. 마지막달의 경우에는 전체 일수를 더하는게 아니라 현재 날짜를 더하면 마지막 달의 일자만큼 더할 수 이싿.
 2-3. 위 두 경우가 아닌 경우에는, 1번의 딕셔너리에 맞는 일수를 더한다.</li>
</ol>
<pre><code class="language-python">for test_case in range(1, T + 1):
    # ///////////////////////////////////////////////////////////////////////////////////
    first_m, first_d, second_m, second_d = map(int, input().split())
    monthly = {1: 31, 2: 28, 3:31, 4:30, 5:31, 6:30, 7:31, 8:31, 9:30, 10:31, 11:30, 12:31 }

    day = 0
    for month in range(first_m, second_m+1):
        if month == first_m:
            day += monthly[month] - first_d + 1
        elif month == second_m:
            day += second_d
        else:
            day += monthly[month]

    print(&#39;#{}&#39;.format(test_case), day)</code></pre>
<h3 id="리뷰">리뷰</h3>
<p>13분 걸렸다.
일 수를 딕셔너리로 저장하는 방법말고 다른 방법이 있는지 보았다.
datetime 라이브러리를 사용하면,
datetime.date(year, month, date) - dateime.date(year, month, date)
로 일수를 계산할 수 있다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[1946. 간단한 압축 풀기]]></title>
            <link>https://velog.io/@jean_deluge/1946.-%EA%B0%84%EB%8B%A8%ED%95%9C-%EC%95%95%EC%B6%95-%ED%92%80%EA%B8%B0</link>
            <guid>https://velog.io/@jean_deluge/1946.-%EA%B0%84%EB%8B%A8%ED%95%9C-%EC%95%95%EC%B6%95-%ED%92%80%EA%B8%B0</guid>
            <pubDate>Wed, 01 Mar 2023 10:59:48 GMT</pubDate>
            <description><![CDATA[<h3 id="풀이과정">풀이과정</h3>
<p>처음에는 문자를 한줄에 10개씩 넣어서 풀어보자고 했었는데, stack overflow가 자주 발생하고,
느려서 다시 풀었다. 실수로 새로고침하는 바람에 오답풀이를 날렸다 ㅠㅠ</p>
<p>모든 문자를 한 문자열로 만든 다음에, 10번째에 하나씩 끊어서 프린트해본다고 생각했다.</p>
<pre><code class="language-python">    input_type_num = int(input())
    input_values = {}
    #모든 앞축을 한 줄에 다 넣는다
    # 10번째에 끊어 표시하기로한다.
    answer = &quot;&quot;
    for num in range(0, input_type_num) :
        key, value = input().split()
        answer = answer + key * int(value)

    count = 0

    print(&quot;#{}&quot;.format(test_case))
    for char in answer:
        if count % 10 == 0 and count != 0:
            count += 1
            print(&quot;&quot;, end=&quot;\n&quot;)
            print(char, end=&quot;&quot;)
        else:
            print(char, end=&quot;&quot;)
            count += 1

    print(&quot;&quot;)
</code></pre>
<p>다음은 위의 조잡한 프린트 내용을 좀 더 깔끔하게 만들려고 했다.</p>
<pre><code class="language-python">    input_type_num = int(input())
    input_values = {}
    #모든 앞축을 한 줄에 다 넣는다
    # 10번째에 끊어 표시하기로한다.
    answer = &quot;&quot;
    for num in range(0, input_type_num) :
        key, value = input().split()
        answer = answer + key * int(value)

    count = 0

    print(&quot;#{}&quot;.format(test_case))
    for i in range(0, len(answer) ,10):
        print(answer[i:i+10])</code></pre>
<h3 id="리뷰">리뷰</h3>
<p>풀이 시간은 총 59분
처음 오답에서 한 47분 썼다. 
문제를 좀 더 단순하게 생각하도록 해야 빨리 풀 것 같다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[SWEA 1945. 간단한 소인수분해]]></title>
            <link>https://velog.io/@jean_deluge/SWEA-1945.-%EA%B0%84%EB%8B%A8%ED%95%9C-%EC%86%8C%EC%9D%B8%EC%88%98%EB%B6%84%ED%95%B4</link>
            <guid>https://velog.io/@jean_deluge/SWEA-1945.-%EA%B0%84%EB%8B%A8%ED%95%9C-%EC%86%8C%EC%9D%B8%EC%88%98%EB%B6%84%ED%95%B4</guid>
            <pubDate>Tue, 28 Feb 2023 09:09:30 GMT</pubDate>
            <description><![CDATA[<h3 id="풀이과정">풀이과정</h3>
<ol>
<li>문제에서 주어진 소수들만으로 구성된 리스트 작성 <code>primes</code></li>
<li>소수 리스트의 각 소수로 나누어지는 횟수를 저장하는 리스트 작성 <code>powers</code></li>
<li>각 소수가 나누어떨어질 때마다 각 소수의 제곱횟수를 센다.</li>
<li>해당 소수로 나누어떨어진다면 피제수의 숫자를 그 소수로 나누어서 갱신 시킨다.</li>
<li>더 이상 나누어떨어지지 않을때, 총 제곱횟수를 <code>powers</code>에 저장시킨다.</li>
</ol>
<pre><code class="language-python">for test_case in range(1, T + 1):
    num = int(input())
    primes = [ 2, 3, 5, 7, 11]
    powers = []
    for prime in primes:
        count = 0
        while(num % prime == 0):
            num = int( num / prime )
            count += 1
        powers.append(count)

    print(&quot;#%d&quot; % test_case, &quot; &quot;.join(map(str, powers)))</code></pre>
<h3 id="리뷰">리뷰</h3>
<p>23분 소요.</p>
<p>print(&quot;#{}&quot;.format(test_case)) 
과 
print(&quot;#%d&quot; % test_case ) 의 결과가 동일하다는 걸 알았다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[SWEA 1940. 가랏! RC카!]]></title>
            <link>https://velog.io/@jean_deluge/SWEA-1940.-%EA%B0%80%EB%9E%8F-RC%EC%B9%B4</link>
            <guid>https://velog.io/@jean_deluge/SWEA-1940.-%EA%B0%80%EB%9E%8F-RC%EC%B9%B4</guid>
            <pubDate>Mon, 27 Feb 2023 10:53:14 GMT</pubDate>
            <description><![CDATA[<h3 id="풀이과정">풀이과정</h3>
<ol>
<li>주어진 테스트케이스 중 해당 회차의 커맨드만 골라올 수 있도록 한다.</li>
<li>현재 거리, 현재 속도를 계속 확인하여 거리를 구한다.</li>
<li>초당 거리 = 속도(m/s) * 1초</li>
<li>만약 현재 속도보다 감속할 속도가 더 클 경우, 현재 속도를 0m/s 으로 조정한다.<h4 id="통과">통과</h4>
<pre><code class="language-python">T = int(input())
# 여러개의 테스트 케이스가 주어지므로, 각각을 처리합니다.
for test_case in range(1, T + 1):
 num_of_command = int(input())
 command_and_speed = []
 for command in range(0, num_of_command):
     command = list(map(int, input().split()))
     command_and_speed.append(command)
 distance = 0
 current_speed = 0
 for c in command_and_speed:
     current_command = c[0]
     if current_command == 1 :
         current_speed += c[1]
         distance += current_speed
     elif current_command == 2 :
         current_speed -= c[1]
         distance += current_speed
     else :
         distance += current_speed 
 print(&quot;#%d %d&quot; % (test_case, distance))</code></pre>
</li>
</ol>
<h3 id="오늘-풀이-시간">오늘 풀이 시간</h3>
<p>49분 
현재로써는 레벨 2의 10문제만 목표는 1시간 안에 풀기, 이후에는 30분 안에 풀 수 있도록 하기</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[SWEA 1928. Base64 Decoder]]></title>
            <link>https://velog.io/@jean_deluge/SWEA-1928.-Base64-Decoder</link>
            <guid>https://velog.io/@jean_deluge/SWEA-1928.-Base64-Decoder</guid>
            <pubDate>Sun, 26 Feb 2023 08:45:05 GMT</pubDate>
            <description><![CDATA[<h3 id="풀이과정">풀이과정</h3>
<ol>
<li>먼저 문자와 숫자를 맵핑 시킬 dictonary 선언 후, 표와 일치하게 문자와 숫자를 맵핑한다.</li>
<li>받은 문자에 맞게 맵핑된 숫자를 가져와 이진수로 변환 시켜 하나의 이진문자열을 만들어준다.
 2-1. 이진수로 변환 시켰을 시 &quot;0b000&quot; 의 형태로 변환된다. 그렇기때문에 0b를 제거해준다.
 2-2. 6 bit 로 끊어서 변환시켰던 것이기 때문에 이 이진수를 6자리로 만드는 작업을 해준다.</li>
<li>변환한 이진문자열을 8자리씩 끊어서 다시 2진수로 만들어준다.</li>
<li>만들어준 2진수를 char 형으로 변환시킨다</li>
</ol>
<pre><code class="language-python">
 incoded = input()
    upper = list(map(chr, range(ord(&#39;A&#39;), ord(&#39;Z&#39;)+1)))
    lower = list(map(chr, range(ord(&#39;a&#39;), ord(&#39;z&#39;) +1)))
    nums = list(map(str, range(0, 10)))
    dict_code = {}
    for k in upper :
        dict_code[k] = ord(k) -65
    for k in lower :
        dict_code[k] = ord(k) - 71
    for k in nums :
        dict_code[k] = ord(k) + 3
    dict_code[&#39;+&#39;] = 62
    dict_code[&#39;/&#39;] = 63

    decode = &quot;&quot;
    quote = &quot;&quot;
    for s in incoded:
        abyte =  bin(dict_code[s])[2:]
        if len(abyte) &lt; 6:
            abyte = &quot;0&quot;*(6-len(abyte)) + abyte
        decode += abyte
    for i in range(0, len(decode), 8):
        quote += chr(int(decode[i:i+8], 2))

    print(quote)
</code></pre>
<p>답이 비슷하게 나오긴했는데 다음과 같았다</p>
<pre><code>Life itself is a quo3atio]î</code></pre><p>아무래도 dict_code 에서 알파벳과 숫자 맵핑을 잘못한 것 같았다.</p>
<p>그래서 확인해보니 숫자형 문자에서 숫자가 잘 못 맵핑되었다.</p>
<pre><code class="language-python">for test_case in range(1, T + 1):
    # ///////////////////////////////////////////////////////////////////////////////////
    incoded = input()
    upper = list(map(chr, range(ord(&#39;A&#39;), ord(&#39;Z&#39;)+1)))
    lower = list(map(chr, range(ord(&#39;a&#39;), ord(&#39;z&#39;) +1)))
    nums = list(map(str, range(0, 10)))
    dict_code = {}
    for k in upper :
        dict_code[k] = ord(k) -65
    for k in lower :
        dict_code[k] = ord(k) - 71
    for k in nums :
        dict_code[k] = ord(k) + 4
    dict_code[&#39;+&#39;] = 62
    dict_code[&#39;/&#39;] = 63

    decode = &quot;&quot;
    quote = &quot;&quot;
    for s in incoded:
        abyte =  bin(dict_code[s])[2:]
        if len(abyte) &lt; 6:
            abyte = &quot;0&quot;*(6-len(abyte)) + abyte
        decode += abyte
    for i in range(0, len(decode), 8):
        quote += chr(int(decode[i:i+8], 2))

    print(&quot;#%d %s&quot; % (test_case , quote))</code></pre>
<h3 id="오늘-찾으면서-배운-함수">오늘 찾으면서 배운 함수</h3>
<p><strong>range(A,B,C)</strong> : B만큼동안 A숫자부터 C씩 끊는다
<strong>int(A, B)</strong> : 십진수 A를 B진수로 만든다.
<strong>array[A:B]</strong> : 앞에서 A번째부터 B번째 배열 엘리먼트까지를 반환한다.
<strong>ord(A)</strong> : ascii 코드 번호를 반환한다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[SWEA 1288. 새로운 불면증 치료법 ]]></title>
            <link>https://velog.io/@jean_deluge/SWEA-1288.-%EC%83%88%EB%A1%9C%EC%9A%B4-%EB%B6%88%EB%A9%B4%EC%A6%9D-%EC%B9%98%EB%A3%8C%EB%B2%95</link>
            <guid>https://velog.io/@jean_deluge/SWEA-1288.-%EC%83%88%EB%A1%9C%EC%9A%B4-%EB%B6%88%EB%A9%B4%EC%A6%9D-%EC%B9%98%EB%A3%8C%EB%B2%95</guid>
            <pubDate>Wed, 22 Feb 2023 11:54:53 GMT</pubDate>
            <description><![CDATA[<h4 id="내가-첫번째로-푼-방법">내가 첫번째로 푼 방법</h4>
<p>답이 나오기 했지만, 제한 시간 초과가 되었다.
그래서 시간복잡도를 생각해보니, N² 의 복잡도가 나온다고 생각되었다.
이유는 while 문k에 자연수를 계속 곱할 때마다 <code>digits</code> 배열을 탐색하고,
while 문 안에서 또 한번 kN의 자릿수 만큼 탐색하게 탐색하게되므로 N² 의 복잡도 가 나온다고 생각했다.</p>
<pre><code class="language-python">for test_case in range(1, T + 1):
    n = int(input())
    digits = [ 0 ] * 10;

    answer = 1
    while 0 in digits:
        kn =  str(n * answer)
        for i in kn:
            nth = int(i) -1
            if digits[nth] == 0:
                digits[nth] = 1
                answer+= 1
    print(answer)
</code></pre>
<h4 id="새로-푸는-방법">새로 푸는 방법</h4>
<p>그렇다면, 탐색을 적게해야되지 않을까라는 생각을 하게 되었다.</p>
<p>그래서 while 의 조건에서 탐색하지 않도록 하기 위해 while(True)로 변경.
while 문 안에서 탐색을 2번 각각 독립적으로 하도록 만들었다.</p>
<pre><code class="language-python">for test_case in range(1, T + 1):
    n = int(input())
    digits = [ 0 ] * 10;

    answer = 1
    while True:
        kn =  str(n * answer)
        for digit in kn:
            if digits[int(digit)] == 0:
                digits[int(digit)] = 1
        answer += 1
        if 0 not in digits:
            break;
    print(&quot;#%d %d&quot; % (test_case, answer))



</code></pre>
<p>이번에는 시간이 통과되었으나, 답이 맞지 않았다.
그래서 문제를 다시보니 &quot;숫자를 센 횟 수가 아니라, 0~9 까지 모두 나오게 되는 수를 원하는 거였으므로,
다음과 같이 고쳤다.</p>
<p>```python
for test_case in range(1, T + 1):</p>
<pre><code>n = int(input())
digits = [ 0 ] * 10;
cnt = 1
while True:
    kn =  str(n * cnt)
    for digit in kn:
        if digits[int(digit)-1] == 0:
            digits[int(digit)-1] = 1
    if 0 not in digits:
        break
    cnt += 1
answer = n * cnt
print(&quot;#%d %d&quot; % (test_case, answer))
```</code></pre>]]></description>
        </item>
    </channel>
</rss>