<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>차가운 0과 1의 임페르노</title>
    <link>https://weloveprogramming.tistory.com/</link>
    <description>지옥에서 올라온 강인한 프로그래머</description>
    <language>ko</language>
    <pubDate>Sat, 11 Jul 2026 15:50:54 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>박준영_</managingEditor>
    <item>
      <title>[Google Play Console] keystore 패스워드 분실</title>
      <link>https://weloveprogramming.tistory.com/64</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;1. 서론 &lt;/b&gt;&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;keystore 패스워드 분실 대처를 어떻게 할 것인가?&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;500&quot; data-origin-height=&quot;167&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/KBBNq/dJMcaaZGUWQ/itNRKl7j7wwj8gko1Z6g1K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/KBBNq/dJMcaaZGUWQ/itNRKl7j7wwj8gko1Z6g1K/img.png&quot; data-alt=&quot;조치 필요 메일&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/KBBNq/dJMcaaZGUWQ/itNRKl7j7wwj8gko1Z6g1K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FKBBNq%2FdJMcaaZGUWQ%2FitNRKl7j7wwj8gko1Z6g1K%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;500&quot; height=&quot;167&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;500&quot; data-origin-height=&quot;167&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;조치 필요 메일&lt;/figcaption&gt;
&lt;/figure&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;플레이 스토어에 게임을 업로드하고 2년, 가끔 앱이 삭제되지 않도록 언제까지 정책 위반을 수정하라는 메일이 온다.&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2021.3.56f1 &amp;gt; 2021.3.45f2&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;하지만, 빌드를 진행하기 위한 keystore 비밀번호가 생각나지 않았다.&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2. 해결 과정 &lt;/b&gt;&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;keystore 재생성과 구글 개발자 콘솔 키 재설정 요청까지&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우선, keystore의 비밀번호 &lt;b&gt;재설정은 불가능&lt;/b&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;프로젝트의 keystore를 잃어버린 경우, 프로젝트의 빌드도 콘솔의 업데이트도 불가능하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그럼 keystore를 잃어버리면 프로젝트를 폐기해야 하나? 그렇지는 않다.&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;2가지 일을 순서대로 하면 된다.&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;&lt;b&gt;개발 측면)&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;keystore를 재생성하고 빌드한다.&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. Player &amp;gt; Publishing Settings &amp;gt; Keystore Manager...&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;500&quot; data-origin-height=&quot;234&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bqPJPm/dJMcabK8gEu/8Vn7CmVvyFp0pkimd2SQgk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bqPJPm/dJMcabK8gEu/8Vn7CmVvyFp0pkimd2SQgk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bqPJPm/dJMcabK8gEu/8Vn7CmVvyFp0pkimd2SQgk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbqPJPm%2FdJMcabK8gEu%2F8Vn7CmVvyFp0pkimd2SQgk%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;500&quot; height=&quot;234&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;500&quot; data-origin-height=&quot;234&quot;/&gt;&lt;/span&gt;&lt;/figure&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. Keystore... &amp;gt; Create New &amp;gt; 둘 중 원하는 옵션 선택&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;500&quot; data-origin-height=&quot;145&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ceKA7q/dJMcahxLYI2/ldE6yI4QowgmqHxOUkaXK1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ceKA7q/dJMcahxLYI2/ldE6yI4QowgmqHxOUkaXK1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ceKA7q/dJMcahxLYI2/ldE6yI4QowgmqHxOUkaXK1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FceKA7q%2FdJMcahxLYI2%2FldE6yI4QowgmqHxOUkaXK1%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;500&quot; height=&quot;145&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;500&quot; data-origin-height=&quot;145&quot;/&gt;&lt;/span&gt;&lt;/figure&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;관리 편의를 위해 keystore 이름 규칙이 있으면 좋다.&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. 양식 작성 후 Add Key&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;필수) Password, Confirm password, Alias, Password, Confirm password, Validity(years), Organization&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Alias는 이 keystore의 별명이다. 영문으로 띄어쓰기만 없으면 된다. &lt;span style=&quot;letter-spacing: 0px;&quot;&gt;보통 나는 admin으로 생성한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;나는 Organization은 Company Name과 같게 한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;500&quot; data-origin-height=&quot;485&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bMkdx3/dJMcajh0Q3R/TfdqzWD8w5t0RK39MwO110/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bMkdx3/dJMcajh0Q3R/TfdqzWD8w5t0RK39MwO110/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bMkdx3/dJMcajh0Q3R/TfdqzWD8w5t0RK39MwO110/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbMkdx3%2FdJMcajh0Q3R%2FTfdqzWD8w5t0RK39MwO110%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;500&quot; height=&quot;485&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;500&quot; data-origin-height=&quot;485&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p 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;4. 프로젝트에 재생성한 keystore 등록 및 빌드&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;500&quot; data-origin-height=&quot;172&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/pjfNo/dJMcahLiDIx/Nkuuk8046NTdXTixPPH710/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/pjfNo/dJMcahLiDIx/Nkuuk8046NTdXTixPPH710/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/pjfNo/dJMcahLiDIx/Nkuuk8046NTdXTixPPH710/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FpjfNo%2FdJMcahLiDIx%2FNkuuk8046NTdXTixPPH710%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;500&quot; height=&quot;172&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;500&quot; data-origin-height=&quot;172&quot;/&gt;&lt;/span&gt;&lt;/figure&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;Select를 누르고 keystore를 생성한 폴더에서 keystore를 선택해서 등록한다.&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;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;공개 측면)&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;개발자 콘솔에서 재생성한 keystore를 등록 요청한다.&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. 등록 요청&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;홈 &amp;gt; 재등록 필요한 패키지 &amp;gt; Google Play로 보호됨 &amp;gt; Play 스토어 보호 &amp;gt; Play 앱 서명 관리 &amp;gt; 업로드 키 재설정 요청&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;500&quot; data-origin-height=&quot;142&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nXMcH/dJMcaaZGUWP/urqh4XQK8l6DHot9DxZrDK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nXMcH/dJMcaaZGUWP/urqh4XQK8l6DHot9DxZrDK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nXMcH/dJMcaaZGUWP/urqh4XQK8l6DHot9DxZrDK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FnXMcH%2FdJMcaaZGUWP%2Furqh4XQK8l6DHot9DxZrDK%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;500&quot; height=&quot;142&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;500&quot; data-origin-height=&quot;142&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;500&quot; data-origin-height=&quot;118&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/1P20K/dJMcaa6uWMa/Kn0knLu8TWPppWEj0AJz00/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/1P20K/dJMcaa6uWMa/Kn0knLu8TWPppWEj0AJz00/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/1P20K/dJMcaa6uWMa/Kn0knLu8TWPppWEj0AJz00/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F1P20K%2FdJMcaa6uWMa%2FKn0knLu8TWPppWEj0AJz00%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;500&quot; height=&quot;118&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;500&quot; data-origin-height=&quot;118&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;500&quot; data-origin-height=&quot;154&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/X9YZl/dJMcabK8g2M/NUdOumUlu4KvDuigVYBA80/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/X9YZl/dJMcabK8g2M/NUdOumUlu4KvDuigVYBA80/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/X9YZl/dJMcabK8g2M/NUdOumUlu4KvDuigVYBA80/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FX9YZl%2FdJMcabK8g2M%2FNUdOumUlu4KvDuigVYBA80%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;500&quot; height=&quot;154&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;500&quot; data-origin-height=&quot;154&quot;/&gt;&lt;/span&gt;&lt;/figure&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. 등록 요청 준비물 : &lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;b&gt;.pem 파일&lt;/b&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;.pem 파일은 다음 명령어로 작성할 수 있다.&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;keytool&amp;nbsp;-export&amp;nbsp;-rfc&amp;nbsp;-keystore&amp;nbsp;[새로운업로드키_경로]&amp;nbsp;-alias&amp;nbsp;[키_별칭]&amp;nbsp;-file&amp;nbsp;[생성할_PEM파일명].pem&lt;/b&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;keystore가 있는 폴더에서 cmd(아니면 powershell)을 실행하고 위 명령어의 인자만 수정해서 입력하면 .pem 파일이 생성된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;keytool은 java 라이브러리이기 때문에 해당 명령어가 실행되지 않으면, 시스템 환경 변수에서 java 경로를 작성하고 실행하면 잘 생성된다.&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. .pem 첨부하여 업로드 키 재설정 요청&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;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;3. 재발 방지 &lt;/b&gt;&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;keystore 관리 문서 생성&lt;/h4&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&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;500&quot; data-origin-height=&quot;118&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/LzlDW/dJMcaa6uWMb/GlXK9PdpNlSuJch7ndlnc0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/LzlDW/dJMcaa6uWMb/GlXK9PdpNlSuJch7ndlnc0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/LzlDW/dJMcaa6uWMb/GlXK9PdpNlSuJch7ndlnc0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FLzlDW%2FdJMcaa6uWMb%2FGlXK9PdpNlSuJch7ndlnc0%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;500&quot; height=&quot;118&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;500&quot; data-origin-height=&quot;118&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>박준영/Game</category>
      <author>박준영_</author>
      <guid isPermaLink="true">https://weloveprogramming.tistory.com/64</guid>
      <comments>https://weloveprogramming.tistory.com/64#entry64comment</comments>
      <pubDate>Sat, 23 May 2026 01:50:22 +0900</pubDate>
    </item>
    <item>
      <title>[리눅스]파일 시스템_디렉토리 이동/조회</title>
      <link>https://weloveprogramming.tistory.com/63</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;디렉토리 구조&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;리눅스에서는 반드시, 루트폴더(/) 하위에 파일이 저장된다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;절대 경로와 상대 경로&lt;/b&gt;&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;절대경로&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;파일의 &lt;b&gt;루트폴더부터 파일까지&lt;/b&gt;&amp;nbsp;모든 경로를 기입해 경로를 지정하는 것을 의미한다.&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;단점) 특정 상황에서 불필요하게 긴 경로를 기입해 호출해야 하기에 비효율적일 수 있다.&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;상대 경로&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;현재 명령을 내리는 지점을 기준&lt;/b&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;단점) 경로지정을 상대적으로 간소화해서 호출할 수 있기에 효율적이다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style5&quot; data-ke-type=&quot;horizontalRule&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;디렉토리간 이동&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;$ pwd&lt;/b&gt; : 현재 경로 출력&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;$ cd '목적지&lt;/b&gt;' : '목적지'로 이동&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;$ cd&lt;/b&gt; &lt;b&gt;.&lt;/b&gt; : '현재 폴더'로 이동&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;$ cd ..&lt;/b&gt; : 한 수준 '상위 폴더'로 이동&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;$ cd 와 &amp;amp; cd ~&lt;/b&gt; : '홈 폴더'로 이동&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;amp; cd /&lt;/b&gt; : '루트 폴더'로 이동&lt;/p&gt;
&lt;hr data-ke-style=&quot;style5&quot; data-ke-type=&quot;horizontalRule&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;디렉토리 조회&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt; $ ls&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;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;옵션&lt;/h4&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;$ ls -l&lt;/b&gt; : 상세 조회&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt; $ ls -a&lt;/b&gt; : 전체(숨김 파일 포함) 조회&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt; $ ls -t&lt;/b&gt; : 생성 날짜 내림차순 조회&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt; $ ls -F&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;b&gt;/&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실행 파일&lt;b&gt;*&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;심볼릭 링크&lt;b&gt;@&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;$ ls&lt;/b&gt; &lt;b&gt;'경로'&lt;/b&gt; :경로 내부 조회&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;옵션과 파라미터&lt;/h4&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;$ ls -a /&lt;/b&gt; : 루트 폴더 내의 모든 요소 조회&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;$ ls -w 30&lt;/b&gt; : -w에 의해 파일을 최대 30개까지 출력&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;$ ls --quote-name&lt;/b&gt; : --quote 파일이름에 따옴표를 붙여서 출력&lt;/p&gt;
&lt;hr data-ke-style=&quot;style5&quot; data-ke-type=&quot;horizontalRule&quot; /&gt;
&lt;h3 style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;+) 와일드카드&lt;/b&gt;&lt;/h3&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;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;*&lt;/h4&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;*은 &lt;b&gt;0~무한대의 글자&lt;/b&gt;를 의미한다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;ex) ab* &amp;gt; ab로 시작하는 모든 파일을 조회&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;h4 style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;?&lt;/h4&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;?은 &lt;b&gt;임의의 1글자&lt;/b&gt;를 의미한다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;ex) pp? &amp;gt;pp로 시작하는 3글자 파일을 조회&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;</description>
      <category>박준영/Linux</category>
      <category>리눅스</category>
      <category>리눅스명령어</category>
      <category>파일시스템</category>
      <author>박준영_</author>
      <guid isPermaLink="true">https://weloveprogramming.tistory.com/63</guid>
      <comments>https://weloveprogramming.tistory.com/63#entry63comment</comments>
      <pubDate>Mon, 15 Jan 2024 17:36:56 +0900</pubDate>
    </item>
    <item>
      <title>Django 특정 비밀번호 에러 안 뜨게 하기</title>
      <link>https://weloveprogramming.tistory.com/61</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;흔한 비밀번호를 입력해도 괜찮게 만들고 싶었지만 자꾸 폼 에러 메시지에서 안 된다고 해서 처리할 방법이 필요했다.&amp;nbsp;&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;방법은 단순하다.&amp;nbsp;&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;django.contrib.auth.forms.py 에 들어가서 raise ValidationError부분을 지우면 된다.&amp;nbsp;&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;&amp;nbsp;&lt;/p&gt;</description>
      <category>조열심 카테고리/Backend 공부</category>
      <author>울집고양이세마리</author>
      <guid isPermaLink="true">https://weloveprogramming.tistory.com/61</guid>
      <comments>https://weloveprogramming.tistory.com/61#entry61comment</comments>
      <pubDate>Tue, 20 Dec 2022 07:46:22 +0900</pubDate>
    </item>
    <item>
      <title>Django kakao allauth 구현</title>
      <link>https://weloveprogramming.tistory.com/60</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;settings.py&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1671480151386&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;INSTALLED_APPS = [
	...
    'allauth',
    'allauth.account',
    'allauth.socialaccount',
    'allauth.socialaccount.providers.google',
    'allauth.socialaccount.providers.kakao',
	...
]

AUTHENTICATION_BACKENDS = (
	...
    'allauth.account.auth_backends.AuthenticationBackend',
)

SITE_ID = 1

SOCIALACCOUNT_LOGIN_ON_GET=True
SOCIALACCOUNT_PROVIDERS = {
    'kakao' : {
            'SCOPE': [
            'profile_nickname',
            'account_email',
        ],
        'AUTH_PARAMS': {
            'access_type': 'online',
        }
    }
}&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;위에서 kakao에서 받아올 항목이 SCOPE이다. 자세한 사항은 아래 링크의 KOE205 항목을 보면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;참고로 커스텀 모델을 사용하고 있고, 닉네임이나 이메일이 유저에게 있어서 필수적이라면 위와 같이 account_email을 적어주면 된다. 그렇다면 allauth가 알아서 커스텀 모델 안에 이메일을 저장해준다.(admin 사이트에서 쉽게 확인이 가능하다.)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://developers.kakao.com/docs/latest/ko/kakaologin/trouble-shooting&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://developers.kakao.com/docs/latest/ko/kakaologin/trouble-shooting&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1671480198499&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;Kakao Developers&quot; data-og-description=&quot;카카오 API를 활용하여 다양한 어플리케이션을 개발해보세요. 카카오 로그인, 메시지 보내기, 친구 API, 인공지능 API 등을 제공합니다.&quot; data-og-host=&quot;developers.kakao.com&quot; data-og-source-url=&quot;https://developers.kakao.com/docs/latest/ko/kakaologin/trouble-shooting&quot; data-og-url=&quot;https://developers.kakao.com/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/deMU1I/hyQYB1byqO/nbMabW9IBhLK2RGyAqkkFK/img.png?width=800&amp;amp;height=400&amp;amp;face=0_0_800_400,https://scrap.kakaocdn.net/dn/eGMbKK/hyQYCy1qCf/BzPoiOUuTng6QkIpuoRKwk/img.png?width=3840&amp;amp;height=1000&amp;amp;face=0_0_3840_1000,https://scrap.kakaocdn.net/dn/uG9U6/hyQWvBv6wc/n9i1YcCPcAYnLzGOvbGRa1/img.png?width=3840&amp;amp;height=1000&amp;amp;face=0_0_3840_1000&quot;&gt;&lt;a href=&quot;https://developers.kakao.com/docs/latest/ko/kakaologin/trouble-shooting&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://developers.kakao.com/docs/latest/ko/kakaologin/trouble-shooting&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/deMU1I/hyQYB1byqO/nbMabW9IBhLK2RGyAqkkFK/img.png?width=800&amp;amp;height=400&amp;amp;face=0_0_800_400,https://scrap.kakaocdn.net/dn/eGMbKK/hyQYCy1qCf/BzPoiOUuTng6QkIpuoRKwk/img.png?width=3840&amp;amp;height=1000&amp;amp;face=0_0_3840_1000,https://scrap.kakaocdn.net/dn/uG9U6/hyQWvBv6wc/n9i1YcCPcAYnLzGOvbGRa1/img.png?width=3840&amp;amp;height=1000&amp;amp;face=0_0_3840_1000');&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;Kakao Developers&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;카카오 API를 활용하여 다양한 어플리케이션을 개발해보세요. 카카오 로그인, 메시지 보내기, 친구 API, 인공지능 API 등을 제공합니다.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;developers.kakao.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;Django 관리 Admin사이트에서는 소셜 계정의 소셜 어플리케이션을 누르고, 카카오의 REST API 키를 클라이언트 아이디에 넣으면 된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;994&quot; data-origin-height=&quot;682&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bAYECu/btrT1G2l5D3/4u7Q7St1vxb4H2CKfesldK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bAYECu/btrT1G2l5D3/4u7Q7St1vxb4H2CKfesldK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bAYECu/btrT1G2l5D3/4u7Q7St1vxb4H2CKfesldK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbAYECu%2FbtrT1G2l5D3%2F4u7Q7St1vxb4H2CKfesldK%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;994&quot; height=&quot;682&quot; data-origin-width=&quot;994&quot; data-origin-height=&quot;682&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>조열심 카테고리/Backend 공부</category>
      <author>울집고양이세마리</author>
      <guid isPermaLink="true">https://weloveprogramming.tistory.com/60</guid>
      <comments>https://weloveprogramming.tistory.com/60#entry60comment</comments>
      <pubDate>Tue, 20 Dec 2022 05:08:21 +0900</pubDate>
    </item>
    <item>
      <title>[프로그래머스] 주차 요금 계산</title>
      <link>https://weloveprogramming.tistory.com/59</link>
      <description>&lt;pre id=&quot;code_1665562800921&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from math import ceil

def solution(fees, records):
    basic_time = fees[0]
    basic_fee = fees[1]
    additinoal_time = fees[2]
    additional_fee = fees[3]
    
    car_dict = {}
    
    for record in records:
        time, car, in_out = record.split()
        
        if car in car_dict:
            car_dict[car].append(time)
        
        else:
            car_dict[car] = [time]
    
    car_fee_dict = {}
    
    for car in car_dict.keys():
        for i in range(0, len(car_dict[car]), 2):
            if i == len(car_dict[car])-1:
                in_hour, in_minute = car_dict[car][i].split(':')
                total_minute = 23 * 60 + 59 - int(in_hour) * 60 - int(in_minute)
            
                    
            else:
                in_hour, in_minute = car_dict[car][i].split(':')
                out_hour, out_minute = car_dict[car][i+1].split(':')

                total_minute = int(out_hour) * 60 + int(out_minute) - int(in_hour) * 60 - int(in_minute)

 
            if car in car_fee_dict:
                    car_fee_dict[car] += total_minute
        
            else:
                    car_fee_dict[car] = total_minute 

        if car_fee_dict[car] &amp;lt;= basic_time:
            car_fee_dict[car] = basic_fee
        
        else:
            car_fee_dict[car] = basic_fee + ceil((car_fee_dict[car]-basic_time)/additinoal_time)*additional_fee
         
    sorted_keys  = sorted(car_fee_dict.keys())
    answer = [car_fee_dict[key] for key in sorted_keys]

    return answer&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;그래서 지금 다른 사람 코드 보고있다..&amp;nbsp;&lt;/p&gt;</description>
      <category>조열심 카테고리/알고리즘</category>
      <author>울집고양이세마리</author>
      <guid isPermaLink="true">https://weloveprogramming.tistory.com/59</guid>
      <comments>https://weloveprogramming.tistory.com/59#entry59comment</comments>
      <pubDate>Wed, 12 Oct 2022 17:20:19 +0900</pubDate>
    </item>
    <item>
      <title>[프로그래머스] 실패율</title>
      <link>https://weloveprogramming.tistory.com/58</link>
      <description>&lt;pre id=&quot;code_1665551409544&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from collections import Counter

def solution(N, stages):
    #실패율 =&amp;gt; 도달했지만 클리어 못한 플레이어의 수  / 스테이지에 도달한 플레이어수
    #스테이지의 개수 N, 현재 멈춰있는 스테이지의 번호 배열 stages
    #실패율이 높은 스테이지부터 내림차순으로 스테이지의 번호가 담긴 배열을 return하라.
    
    #현재 스테이지에 멈춘 사람들 / 전체 명수 - 전 스테이지의 명 수 빼기 =&amp;gt; 실패율 for문으로 
    #dictionary로 order 만들기. 
    stage_dict = Counter(stages) #스테이지에 따른 플레이어의 수
    total_players = len(stages) #플레이어의 수 
    failer_dict = {}
    # print(&quot;stage dict : &quot;, stage_dict)
    for stage in range(1, N+1):
        if stage in stage_dict:
            # print(&quot;stage : &quot;, stage)
            fail_score = stage_dict[stage]/total_players #현재스테이지의사람/전체플레이어의수
            failer_dict[stage] = fail_score #현재스테이지의 실패율을 dictionary에 기록 
            total_players -= stage_dict[stage] #현재 스테이지의 사람을 전체 플레이어의 수에서 제외
            
        else:
            fail_score = 0
            failer_dict[stage] = fail_score #스테이지에 도달한 유저가 없는 경우, 실패율은 0
    
    answer = sorted(failer_dict.items(), key = lambda x : (x[1], -x[0]), reverse = True)
    
    real_answer = [x for x, y in answer]
    
    return real_answer&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>조열심 카테고리/알고리즘</category>
      <author>울집고양이세마리</author>
      <guid isPermaLink="true">https://weloveprogramming.tistory.com/58</guid>
      <comments>https://weloveprogramming.tistory.com/58#entry58comment</comments>
      <pubDate>Wed, 12 Oct 2022 14:10:16 +0900</pubDate>
    </item>
    <item>
      <title>[프로그래머스] 두 큐 합 같게 만들기</title>
      <link>https://weloveprogramming.tistory.com/57</link>
      <description>&lt;pre id=&quot;code_1665549692993&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from collections import deque

def solution(queue1, queue2):
    queue1 = deque(queue1)
    queue2 = deque(queue2)
    queue1_sum = sum(queue1)
    queue2_sum = sum(queue2)
    cnt = 0 
    
    while queue1 and queue2:
        if queue1_sum == queue2_sum:
            break
            
        if cnt &amp;gt; (len(queue1) + len(queue2))*2:
            return -1
            
        if queue1_sum &amp;lt; queue2_sum:
            tmp = queue2.popleft()
            queue1.append(tmp)
            queue1_sum += tmp
            queue2_sum -= tmp
            cnt += 1
            
        elif queue1_sum &amp;gt; queue2_sum:
            tmp = queue1.popleft()
            queue2.append(tmp)
            queue1_sum -= tmp
            queue2_sum += tmp
            cnt += 1
    
    if not queue1 or not queue2:
        return -1
    
    return cnt&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>조열심 카테고리/알고리즘</category>
      <author>울집고양이세마리</author>
      <guid isPermaLink="true">https://weloveprogramming.tistory.com/57</guid>
      <comments>https://weloveprogramming.tistory.com/57#entry57comment</comments>
      <pubDate>Wed, 12 Oct 2022 14:09:48 +0900</pubDate>
    </item>
    <item>
      <title>[프로그래머스]강원도에 위치한 생산공장 목록 출력하기</title>
      <link>https://weloveprogramming.tistory.com/56</link>
      <description>&lt;pre id=&quot;code_1665497969117&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;SELECT FACTORY_ID, FACTORY_NAME, ADDRESS FROM FOOD_FACTORY
WHERE ADDRESS LIKE &quot;강원도%&quot;
ORDER BY FACTORY_ID&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;LIKE문을 어떻게만 쓰는지 알면 쉬운 문제이다.&amp;nbsp;&lt;/p&gt;</description>
      <category>조열심 카테고리/잡담</category>
      <author>울집고양이세마리</author>
      <guid isPermaLink="true">https://weloveprogramming.tistory.com/56</guid>
      <comments>https://weloveprogramming.tistory.com/56#entry56comment</comments>
      <pubDate>Tue, 11 Oct 2022 23:19:41 +0900</pubDate>
    </item>
    <item>
      <title>[프로그래머스] 3월에 태어난 여성 회원 목록 출력하기</title>
      <link>https://weloveprogramming.tistory.com/55</link>
      <description>&lt;pre id=&quot;code_1665497803958&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;SELECT MEMBER_ID, MEMBER_NAME, GENDER, DATE_OF_BIRTH FROM MEMBER_PROFILE
WHERE GENDER = 'W' AND MONTH(DATE_OF_BIRTH) = 3 AND TLNO IS NOT NULL
ORDER BY MEMBER_ID ASC&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MONTH라고 DATE에서 날짜만 리턴해주는 간편한 함수를 쓰니 좋다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;LIKE나 IN보다는 훨 나은 듯?&amp;nbsp;&amp;nbsp;&lt;/p&gt;</description>
      <category>조열심 카테고리/잡담</category>
      <author>울집고양이세마리</author>
      <guid isPermaLink="true">https://weloveprogramming.tistory.com/55</guid>
      <comments>https://weloveprogramming.tistory.com/55#entry55comment</comments>
      <pubDate>Tue, 11 Oct 2022 23:17:39 +0900</pubDate>
    </item>
    <item>
      <title>[프로그래머스] 행렬의 곱</title>
      <link>https://weloveprogramming.tistory.com/54</link>
      <description>&lt;pre id=&quot;code_1664386447468&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import numpy as np 

def solution(arr1, arr2):
    arr1 = np.array(arr1)
    arr2 = np.array(arr2)
    
    answer = arr1@arr2
    
    return answer.tolist()&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;numpy 쓰면 쉽게 해결 된다. 그리고 array는 리스트로 바꾸려면 list() 함수가 아니라 tolist() 메서드를 써야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 행렬의 곱이 n x m , m x z 같은 형식이 아닌데도 가능한 이유는 numpy가 다 알아서 해결해주기 때문이다.&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;만약 1 x 3 , 1 x 2 행렬이 있다면 3 x 1, 1 x 2로 자체 변환해 계산해준다. 아마 이걸 브로드캐스팅이라고 했던 것 같기도..&amp;nbsp;&amp;nbsp;&lt;/p&gt;</description>
      <category>조열심 카테고리/알고리즘</category>
      <author>울집고양이세마리</author>
      <guid isPermaLink="true">https://weloveprogramming.tistory.com/54</guid>
      <comments>https://weloveprogramming.tistory.com/54#entry54comment</comments>
      <pubDate>Thu, 29 Sep 2022 02:37:04 +0900</pubDate>
    </item>
  </channel>
</rss>