<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>uwol-is-june.log</title>
        <link>https://velog.io/</link>
        <description>어린이입니다.</description>
        <lastBuildDate>Mon, 04 May 2026 13:33:55 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>uwol-is-june.log</title>
            <url>https://velog.velcdn.com/images/uwol-is-june/profile/64e40980-c1b3-43ac-99c2-3f407379a2cc/social_profile.jpeg</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. uwol-is-june.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/uwol-is-june" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[그래서 님 티어가? (1)]]></title>
            <link>https://velog.io/@uwol-is-june/%EA%B7%B8%EB%9E%98%EC%84%9C-%EB%8B%98-%ED%8B%B0%EC%96%B4%EA%B0%80-1</link>
            <guid>https://velog.io/@uwol-is-june/%EA%B7%B8%EB%9E%98%EC%84%9C-%EB%8B%98-%ED%8B%B0%EC%96%B4%EA%B0%80-1</guid>
            <pubDate>Mon, 04 May 2026 13:33:55 GMT</pubDate>
            <description><![CDATA[<h1 id="그래서-님-티어가---github-잔디로-개발자-전투력-측정하기">그래서 님 티어가? - GitHub 잔디로 개발자 전투력 측정하기</h1>
<p>백준 온라인 저지가 2026년 4월 28일에 종료됐다.
<img src="https://velog.velcdn.com/images/uwol-is-june/post/6cc5e932-cbef-49ec-8625-577b6cc92e61/image.png" alt=""></p>
<p>코테가 점점 없어지나?
<em><del>(그럴리는 없음)</del></em>
그럼 난 뭘 준비해야하지?</p>
<blockquote>
<p>&quot;GitHub 잔디..?&quot;</p>
</blockquote>
<p>그렇게 <strong>DevTier</strong>가 시작됐다.
GitHub 로그인하면 잔디 데이터를 분석해서 티어를 뽑아주는 서비스다.
<img src="https://velog.velcdn.com/images/uwol-is-june/post/2daa1b78-1a50-42df-a9d2-433d88b4d8e2/image.png" alt=""></p>
<p>🚀 <strong><a href="https://devtier-brown.vercel.app">DevTier 링크</a></strong></p>
<hr>
<h2 id="1-전투력-점수는-어떻게-계산하나">1. 전투력 점수는 어떻게 계산하나</h2>
<p>핵심은 GitHub contribution 데이터를 숫자로 만드는 것이다.
단순히 잔디 개수만 세면 재미없으니까, 여러 지표를 조합해서 &quot;전투력 점수&quot;를 뽑는 공식을 만들었다.</p>
<pre><code>score = 총잔디×1 + 현재스트릭×3 + 최대스트릭×2 + 잔디밀도(%)×100 + 피크강도×0.5 + log2(레포스타+1)×10</code></pre><p>처음엔 감으로 잡고, AI한테 물어보면서 다듬었다.</p>
<table>
<thead>
<tr>
<th>지표</th>
<th>가중치</th>
<th>이유</th>
</tr>
</thead>
<tbody><tr>
<td>총 잔디 수</td>
<td>×1</td>
<td>기본 활동량</td>
</tr>
<tr>
<td>현재 스트릭</td>
<td>×3</td>
<td>지금 이 순간 불타고 있는지</td>
</tr>
<tr>
<td>최대 스트릭</td>
<td>×2</td>
<td>역대 최고 기록</td>
</tr>
<tr>
<td>잔디 밀도</td>
<td>×100</td>
<td>꾸준함의 핵심</td>
</tr>
<tr>
<td>피크 강도</td>
<td>×0.5</td>
<td>하루 최대 커밋 수</td>
</tr>
<tr>
<td>레포 스타</td>
<td>log2(n+1)×10</td>
<td>오픈소스 영향력, 로그 스케일로 스타 부자 억제</td>
</tr>
</tbody></table>
<p>티어는 롤처럼 브론즈부터 챌린저까지 티어별 4단계로 나눴다.
챌린저는 절대 상위 100명으로 고정했다.
<del><em>(나때는 브5 부터 있었음)</em></del>
<img src="https://velog.velcdn.com/images/uwol-is-june/post/92638244-b500-4920-a2e5-763f3a718d4c/image.png" alt=""></p>
<hr>
<h2 id="2-기술-스택">2. 기술 스택</h2>
<ul>
<li><strong>Next.js 16</strong> App Router (Vercel 배포)</li>
<li><strong>Supabase</strong> (PostgreSQL + Auth)</li>
<li><strong>GitHub GraphQL API</strong> - contribution 데이터 수집</li>
<li><strong>SVG 동적 생성</strong> - README에 꽂는 뱃지</li>
</ul>
<p>뱃지가 핵심이다. GitHub README에 이런 식으로 박힌다.</p>
<pre><code class="language-markdown">&lt;a href=&quot;https://devtier-brown.vercel.app/result/username&quot;&gt;
  &lt;img width=&quot;240&quot; src=&quot;https://devtier-brown.vercel.app/api/badge/username&quot; /&gt;
&lt;/a&gt;</code></pre>
<p>뱃지를 보고 클릭하는 사람이 생기면 자연스럽게 유입이 일어나는 구조다.</p>
<hr>
<h2 id="3-한국-개발자-데이터를-어떻게-모았나">3. 한국 개발자 데이터를 어떻게 모았나</h2>
<p>티어가 의미 있으려면 &quot;전체 중 몇 퍼센트&quot;라는 상대적인 기준이 있어야 한다.
그래서 한국 개발자 데이터를 직접 긁어오는 배치 스크립트를 만들었다.</p>
<pre><code class="language-bash">npm run collect:users   # GitHub Search API로 한국 유저 수집
npm run collect:scores  # 전체 유저 점수 계산
npm run recalc:tiers    # 백분위·티어 전체 재산출</code></pre>
<p>처음엔 이걸 Supabase Edge Function으로 돌리려고 했는데, 3,000명 점수 계산에 37분이 걸렸다. Edge Function 타임아웃에 계속 걸렸고, 중간에 끊기면 어디까지 됐는지도 몰랐다.</p>
<p>결국 로컬 스크립트로 바꾸고, <strong>GitHub Actions로 매주 월요일 새벽 3시에 자동 실행</strong>되도록 루틴화했다. rate limit 걸리면 스킵하지 않고 재시도 큐로 처리해서 빠진 유저 없이 돌아간다.</p>
<hr>
<h2 id="4-svg-뱃지-삽질기">4. SVG 뱃지 삽질기</h2>
<p>뱃지에 애니메이션을 넣고 싶었다. 티어별로 다른 느낌으로.</p>
<ul>
<li>챌린저: 왕관 shimmer + border pulse</li>
<li>다이아: 젬 rotate-shimmer</li>
<li>플래티넘~브론즈: 메달 glow-pulse</li>
</ul>
<p>근데 문제가 있었다. GitHub은 SVG를 camo 프록시를 통해 서빙하는데, 여기서 <code>&lt;animate&gt;</code> 태그를 <strong>전부 제거</strong>해버린다. 열심히 만든 SMIL 애니메이션이 README에서 싹 죽었다.</p>
<p>해결책은 <strong>CSS <code>@keyframes</code>로 전환</strong>하는 것이었다. camo 프록시는 CSS는 건드리지 않는다. 이걸로 갈아엎고 나서야 GitHub README에서도 애니메이션이 제대로 살았다.</p>
<hr>
<h2 id="5-도전과제-시스템">5. 도전과제 시스템</h2>
<p>점수·티어와 별개로 절대 마일스톤 시스템도 붙였다. Common / Rare / Epic / Legendary 4단계 희귀도로 나뉜다.</p>
<p>잔디 1,000개 달성하면 &quot;잔디 컬렉터(Rare)&quot;, 최대 스트릭 365일이면 &quot;불꽃 개발자(Legendary)&quot; 같은 식이다. 특이한 패턴도 잡아낸다. 평소엔 안 하다가 폭발하는 스타일이면 &quot;몰아치기 스타일&quot;, 밀도랑 스트릭 둘 다 높으면 &quot;마라토너&quot;.</p>
<p>결과 페이지에서 잠긴 도전과제에는 현재 진행률도 표시된다. &quot;42 / 100&quot; 이런 식으로 보이면 괜히 더 커밋하고 싶어진다.</p>
<hr>
<h2 id="마무리">마무리</h2>
<p>백준이 사라진 것은 꽤 충격이 크다.
하지만 다들 힘내자 화이팅.
<em><del>(코테를 변기에 넣고서 내려)</del></em></p>
<p>🚽 <strong><a href="https://devtier-brown.vercel.app">그래서 님 티어가? - DevTier</a></strong></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Baekjoon Online Judge (2010 ~ 2026)]]></title>
            <link>https://velog.io/@uwol-is-june/Baekjoon-Online-Judge-2010-2026</link>
            <guid>https://velog.io/@uwol-is-june/Baekjoon-Online-Judge-2010-2026</guid>
            <pubDate>Sun, 03 May 2026 13:56:31 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/uwol-is-june/post/0e97465e-8c0d-4886-a9c6-23f6687bdc90/image.png" alt="">
4월 28일
백준 온라인 저지가 서비스를 종료했다
<img src="https://velog.velcdn.com/images/uwol-is-june/post/34b60239-b014-42e6-8871-3ba06f336ac5/image.png" alt=""></p>
<p>솔직히 좀 충격이었음
코테 준비했둔 사람 중에 백준 모르는 사람도 없고
<del><em>(프로그래머스가 좀 더 예쁘긴 했음)</em></del></p>
<p>근데 확실히 요즘은 AI가 너무 잘되어있기도 해서
좀 분위기가 달라지긴 한 것 같음
<img src="https://velog.velcdn.com/images/uwol-is-june/post/9e99c354-49b1-4416-96b5-c87dbafe92b1/image.png" alt="">
<em><del>(대 딸깍의 시대)</del></em></p>
<p>코테가 당장 없어지진 않겠지만
코테 포지션이 확실히 애매해진 듯</p>
<p>결국 남은건 프젝인데
그래서 그런가 요즘 확실히 깃헙 열심히 꾸미는 사람들이 많아진 듯
깃허브 관리 잘하는 사람들은 진짜 잘하더라</p>
<p>나도 깃헙 좀 꾸며보려고
대충 한국 개발자들 깃허브 긁어봤음
<em><del>(딸깍)</del></em></p>
<p><img src="https://velog.velcdn.com/images/uwol-is-june/post/aaaddad8-b58c-4a99-b30b-47a327a01b46/image.png" alt="">
요런느낌으로 리스트업하고 하나씩 둘러봄</p>
<p><img src="https://velog.velcdn.com/images/uwol-is-june/post/7e9c71c1-e1d7-4499-b062-591eadbb819f/image.png" alt="">
내껀 아니고 찾다 나온 사람인데
밀도도 중요하긴 하지만
레포 스타가 15000개가 말도 안되긴하네..</p>
<p>뭐 어쨌든 모든 개발자분들 화이팅입니다</p>
<p>관심있으신분들은 편히 둘러보십셔</p>
<p><a href="https://devtier-brown.vercel.app/">https://devtier-brown.vercel.app/</a></p>
<p><em><del>(돈없어서 버셀 배포)</del></em></p>
<p>굿-밤</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[빅데이터 분석기사 실기 3유형]]></title>
            <link>https://velog.io/@uwol-is-june/%EB%B9%85%EB%8D%B0%EC%9D%B4%ED%84%B0-%EB%B6%84%EC%84%9D%EA%B8%B0%EC%82%AC-%EC%8B%A4%EA%B8%B0-3%EC%9C%A0%ED%98%95</link>
            <guid>https://velog.io/@uwol-is-june/%EB%B9%85%EB%8D%B0%EC%9D%B4%ED%84%B0-%EB%B6%84%EC%84%9D%EA%B8%B0%EC%82%AC-%EC%8B%A4%EA%B8%B0-3%EC%9C%A0%ED%98%95</guid>
            <pubDate>Mon, 17 Jun 2024 07:29:06 GMT</pubDate>
            <description><![CDATA[<h3 id="독립성-검정">독립성 검정</h3>
<ul>
<li>변수가 두개 이상 범주로 분할되어 있고, 독립적인지 연관성이 있는지 검정</li>
<li>귀무가설(H0) : 서로 독립</li>
<li>대립가설(H1) : 연관성이 있다</li>
<li>p-value &lt; 0.05 이면 대립가설 채택</li>
</ul>
<h4 id="검정방법-순서">검정방법 순서</h4>
<ol>
<li>패키지 추가 (from scipy.stats import chi2_contingency)</li>
<li>데이터 table 변환 (범주형 - pd.crosstab / 수치형 - np.array)</li>
<li>chi2 검정 (chi2, p_val, dof(자유도), ex(기대치))</li>
</ol>
<h4 id="패키지">패키지</h4>
<pre><code>from scipy.stats import chi2_contingency
from statsmodels.formula.api import logit</code></pre><h4 id="독립성-검정-1">독립성 검정</h4>
<pre><code>import pandas as pd

df = pd.read_csv(&quot;data/Titanic.csv&quot;)

#1번 문제
from scipy.stats import chi2_contingency

table = pd.crosstab(df.Gender, df.Survived)
chi2, p_val, dof, exp = chi2_contingency(table)

print(round(chi2, 3))     # 260.717
print(p_val)             # 매우 작으므로 대립가설 채택</code></pre><h4 id="로지스틱-회귀">로지스틱 회귀</h4>
<pre><code>from statsmodels.formula.api import logit
result1 = logit(&#39;Survived ~ Gender+SibSp+Parch+Fare&#39;, data=df).fit().summary()
print(result1)</code></pre><h4 id="오즈비-구하기">오즈비 구하기</h4>
<pre><code>import numpy as np
result2 = logit(&#39;Survived ~ Gender+SibSp+Parch+Fare&#39;, data=df).fit().params
print(np.exp(result2))</code></pre><h4 id="상관계수">상관계수</h4>
<pre><code>df.corr()</code></pre><h4 id="shapiro-wilk-정규분포">Shapiro-Wilk (정규분포)</h4>
<pre><code>from scipy import stats
statistic, p_val = stats.shapiro(data)</code></pre><h3 id="출처---datamanimcom">출처 - datamanim.com</h3>
<h3 id="stats-주요-모듈">stats 주요 모듈</h3>
<h4 id="01-t-test">01 T-test</h4>
<ul>
<li>ttest_1samp    (단일표본 t검정)</li>
<li>ttest_ind        (독립표본 t검정)</li>
<li>ttest_rel        (대응표본 t검정)</li>
</ul>
<h4 id="02-비모수-검정">02 비모수 검정</h4>
<ul>
<li>manwhitneyu    (맨-휘트니 U검정-중위수, 윌콕슨 순위합 검정과 동일)</li>
<li>ranksums        (윌콕슨 순위합 검정 - 중위수)</li>
<li>wilcoxon        (윌콕슨 부호 순위합 검정)</li>
</ul>
<h4 id="03-정규성-검정">03 정규성 검정</h4>
<ul>
<li>anderson        (Anderson-Darling, 데이터 수가 상대적으로 많을 때)</li>
<li>kstest        (Kolmogorov-smirnov, 데이터 수가 상대적으로 많을 때)</li>
<li>mstats.normaltest</li>
<li>shapiro        (shapiro, 노말분포, 데이터 수가 상대적으로 적을 때)</li>
</ul>
<h4 id="04-등분산-검정">04 등분산 검정</h4>
<ul>
<li>bartlett</li>
<li>fligner</li>
<li>levene</li>
</ul>
<h4 id="05-카이제곱-검정">05 카이제곱 검정</h4>
<ul>
<li>chi2_contingency    (카이제곱독립검정, 독립성 검정)</li>
<li>chisquare            (카이제곱검정, 적합도 검정)</li>
<li>fisher_exact        (피셔 정확 검정 - 빈도수가 5개 이하 셀의 수가 전체 셀의 20%이상일 경우)</li>
</ul>
<h4 id="06-anova-일원분산분석">06 ANOVA (일원분산분석)</h4>
<ul>
<li>f_oneway</li>
</ul>
<h2 id="예시">예시</h2>
<h3 id="1-정규성-검정">#1 정규성 검정</h3>
<h4 id="01-다음-데이터의-정규성을-검증하라">01 다음 데이터의 정규성을 검증하라</h4>
<pre><code>import pandas as pd 
df = pd.read_csv(&#39;https://raw.githubusercontent.com/Datamanim/datarepo/main/scipy/normal1.csv&#39;)

from scipy.stats import shapiro
print(shapiro(df))</code></pre><ul>
<li>결과
ShapiroResult(statistic=0.9981444478034973, pvalue=0.34849318861961365)</li>
<li><blockquote>
<p>통계랑이 1에 가까우므로 정규분포에 가까움</p>
</blockquote>
</li>
<li><blockquote>
<p>p-value가 0.05보다 크므로 귀무가설 기각X -&gt; 정규 분포를 따름</p>
</blockquote>
</li>
<li><blockquote>
<p>통계량이 1에 가깝더라도, p-value가 0.05보다 작으면 정규성X</p>
</blockquote>
</li>
</ul>
<h4 id="02-다음-데이터를-log변환-후-정규성을-확인하라">02 다음 데이터를 log변환 후 정규성을 확인하라</h4>
<pre><code>import pandas as pd
import numpy as np
df = pd.read_csv(&#39;https://raw.githubusercontent.com/Datamanim/datarepo/main/scipy/normal3.csv&#39;)

log_df = np.log1p(df)

from scipy.stats import shapiro
print(shapiro(log_df))</code></pre><ul>
<li>결과
ShapiroResult(statistic=0.9976889491081238, pvalue=0.17540602385997772)</li>
<li><blockquote>
<p>0.05보다 크므로 정규성 O</p>
</blockquote>
</li>
<li><blockquote>
<p>log변환 시 너무 작은 값이거나, 0, 음수를 포함하는 값들이 있을때 사용</p>
</blockquote>
</li>
</ul>
<h4 id="03-다음-데이터의-정규성을-검증하라">03 다음 데이터의 정규성을 검증하라</h4>
<pre><code>import pandas as pd
df = pd.read_csv(&#39;https://raw.githubusercontent.com/Datamanim/datarepo/main/scipy/normal6.csv&#39;)

from scipy.stats import shapiro
#shapiro(df)

from scipy.stats import anderson
anderson(df[&#39;data&#39;].values)</code></pre><ul>
<li>결과
AndersonResult(statistic=0.8266993530405671, critical_values=array([0.576, 0.656, 0.786, 0.917, 1.091]), significance_level=array([15. , 10. ,  5. ,  2.5,  1. ]), fit_result=  params: FitParams(loc=299.95980319533163, scale=5.031806887885131)
success: True
message: &#39;<code>anderson</code> successfully fit the distribution to the data.&#39;)</li>
<li><blockquote>
<p>5000개 이상일 경우 shapiro 말고 anderson 사용</p>
</blockquote>
</li>
<li><blockquote>
<p>5% : 0.786 &lt; 통계량 : 0.827 &lt; 2.5% : 0.917</p>
</blockquote>
</li>
<li><blockquote>
<p>따라서 유의수준 5% 이하이므로, 정규성 X</p>
</blockquote>
</li>
</ul>
<h3 id="2-단일-표본-t검정one-sample">#2 단일 표본 t검정(one-sample)</h3>
<h4 id="01-100명의-키-정보가-들어있는-데이터가-있다-데이터가-정규성을-만족하는지-확인하라-그리고-평균키는-165라-판단할-수-있는지-귀무가설과-대립가설을-설정한-후-유의수준-5로-검정하라">01 100명의 키 정보가 들어있는 데이터가 있다. 데이터가 정규성을 만족하는지 확인하라. 그리고 평균키는 165라 판단할 수 있는지 귀무가설과 대립가설을 설정한 후 유의수준 5%로 검정하라</h4>
<pre><code>import pandas as pd 
df = pd.read_csv(&#39;https://raw.githubusercontent.com/Datamanim/datarepo/main/scipy/height1.csv&#39;)

from scipy.stats import shapiro

shapiro(df)
# ShapiroResult(statistic=0.9872668981552124, pvalue=0.4558176100254059)
# 정규성 O -&gt; 단일 표본 t 검정

from scipy.stats import ttest_1samp
ttest_1samp(df[&#39;height&#39;], 165)</code></pre><ul>
<li>결과
TtestResult(statistic=3.2017884987150644, pvalue=0.0018367171548080209, df=99)</li>
<li><blockquote>
<p>p-value 0.05이하 이므로, 100명 키의 평균은 165가 아니다.</p>
</blockquote>
</li>
</ul>
<h4 id="02-100명의-키-정보가-들어있는-데이터가-있다-데이터가-정규성을-만족하는지-확인하라-그리고-평균키는-165라-판단할-수-있는지-귀무가설과-대립가설을-설정한-후-유의수준-5로-검정하라">02 100명의 키 정보가 들어있는 데이터가 있다. 데이터가 정규성을 만족하는지 확인하라. 그리고 평균키는 165라 판단할 수 있는지 귀무가설과 대립가설을 설정한 후 유의수준 5%로 검정하라</h4>
<pre><code>import pandas as pd 
df = pd.read_csv(&#39;https://raw.githubusercontent.com/Datamanim/datarepo/main/scipy/height2.csv&#39;)

from scipy.stats import shapiro

shapiro(df) 
# ShapiroResult(statistic=0.9672006368637085, pvalue=0.013552471995353699)
# 정규성 X -&gt; 비모수 검정 (윌콕슨)

from scipy.stats import wilcoxon

wilcoxon(df)</code></pre><ul>
<li>결과
WilcoxonResult(statistic=array([0.]), pvalue=array([3.87726172e-18]))</li>
<li><blockquote>
<p>p-value가 0.05보다 작으므로, 대립가설 채택</p>
</blockquote>
</li>
<li><blockquote>
<p>100명 키의 평균은 165가 아니다.</p>
</blockquote>
</li>
</ul>
<h3 id="3-등분산-검정">#3 등분산 검정</h3>
<h4 id="01-두-개-학급의-시험성적에-대한-데이터이다-그룹간-등분산-검정을-시행하라">01 두 개 학급의 시험성적에 대한 데이터이다. 그룹간 등분산 검정을 시행하라.</h4>
<pre><code>import pandas as pd 
df = pd.read_csv(&#39;https://raw.githubusercontent.com/Datamanim/datarepo/main/scipy/scipy2.csv&#39;)

from scipy.stats import bartlett
from scipy.stats import fligner
from scipy.stats import levene

a = df[df[&#39;class&#39;] == &#39;A&#39;].score
b = df[df[&#39;class&#39;] == &#39;B&#39;].score

print(bartlett(a, b))
print(fligner(a, b, center = &#39;median&#39;))
print(fligner(a, b, center = &#39;mean&#39;))
print(levene(a, b, center = &#39;median&#39;))
print(levene(a, b, center = &#39;mean&#39;))</code></pre><ul>
<li>결과
BartlettResult(statistic=0.26035880448930865, pvalue=0.609873758447687)
FlignerResult(statistic=0.7281251154135562, pvalue=0.39349158741002765)
FlignerResult(statistic=0.8272211734319945, pvalue=0.36307728836821906)
LeveneResult(statistic=0.3145466542912649, pvalue=0.5751662820554713)
LeveneResult(statistic=0.5086970687685527, pvalue=0.4760514837800255)</li>
<li><blockquote>
<p>0.05보다 크므로, 각 그룹은 등분산이다.</p>
</blockquote>
</li>
</ul>
<h4 id="02-두-개-학급의-시험성적에-대한-데이터이다-그룹간-등분산-검정을-시행하라">02 두 개 학급의 시험성적에 대한 데이터이다. 그룹간 등분산 검정을 시행하라.</h4>
<pre><code>import pandas as pd 
df = pd.read_csv(&#39;https://raw.githubusercontent.com/Datamanim/datarepo/main/scipy/scipy3.csv&#39;)
from scipy.stats import bartlett
from scipy.stats import fligner
from scipy.stats import levene

a = df[df[&#39;class&#39;] ==&#39;A&#39;].score
b = df[df[&#39;class&#39;] ==&#39;B&#39;].score

print(bartlett(a,b))
print(fligner(a,b,center=&#39;median&#39;)) #default
print(fligner(a,b,center=&#39;mean&#39;)) 

print(levene(a,b, center=&#39;median&#39;)) #default
print(levene(a,b,center=&#39;mean&#39;))</code></pre><ul>
<li>결과
BartlettResult(statistic=1.5116783794562305, pvalue=0.2188831590902503)
FlignerResult(statistic=4.960366756026232, pvalue=0.025934706256615564)
FlignerResult(statistic=4.94724457924667, pvalue=0.026132286002684912)
LeveneResult(statistic=4.307122424591436, pvalue=0.03848734007752694)
LeveneResult(statistic=4.342327020297874, pvalue=0.0377066528874248)</li>
<li><blockquote>
<p>fligner, levene 는 bartlett에 비해 robust하다</p>
</blockquote>
</li>
<li><blockquote>
<p>정규분포를 따르지 않는다면 bartlett은 신뢰하기 어렵다</p>
</blockquote>
</li>
<li><blockquote>
<p>따라서 등분산 X</p>
</blockquote>
</li>
</ul>
<h4 id="03-두-개-학급의-시험성적에-대한-데이터이다-그룹간-등분산-검정을-시행하라">03 두 개 학급의 시험성적에 대한 데이터이다. 그룹간 등분산 검정을 시행하라.</h4>
<pre><code>import pandas as pd 
df = pd.read_csv(&#39;https://raw.githubusercontent.com/Datamanim/datarepo/main/scipy/scipy6.csv&#39;)

from scipy.stats import bartlett
from scipy.stats import fligner
from scipy.stats import levene

print(bartlett(df.A, df.B))
print(fligner(df.A, df.B))
print(levene(df.A, df.B))</code></pre><ul>
<li>결과
BartlettResult(statistic=2.3832178811043527, pvalue=0.12264468401745829)
FlignerResult(statistic=5.124831619122788, pvalue=0.023585858890699054)
LeveneResult(statistic=5.147914610463281, pvalue=0.023868975493455683)</li>
</ul>
<h4 id="04-두-개-학급의-시험성적에-대한-데이터이다-그룹간-등분산-검정을-시행하라">04 두 개 학급의 시험성적에 대한 데이터이다. 그룹간 등분산 검정을 시행하라.</h4>
<pre><code>import pandas as pd 
df = pd.read_csv(&#39;https://raw.githubusercontent.com/Datamanim/datarepo/main/scipy/scipy5.csv&#39;)

print(bartlett(df.A, df.B.dropna()))
print(fligner(df.A, df.B.dropna()))
print(levene(df.A, df.B.dropna()))</code></pre><ul>
<li>결과
BartlettResult(statistic=3.024072692680794, pvalue=0.08203720607748438)
FlignerResult(statistic=7.710320541528441, pvalue=0.005490600130793619)
LeveneResult(statistic=8.008595918808284, pvalue=0.004851565077063284)</li>
<li><blockquote>
<p>nan 값이 포함될 경우 없애고 등분산 검정을 시행해야 한다</p>
</blockquote>
</li>
</ul>
<h3 id="4-독립-표본-검정independent---정규성에-따라-다름">#4 독립 표본 검정(Independent) - 정규성에 따라 다름</h3>
<h4 id="01-두-개-학급의-시험성적에-대한-데이터이다-두-학급의-시험-평균비모수검정의-경우-중위값은-동일하다-말할-수-있는지-확인하라">01 두 개 학급의 시험성적에 대한 데이터이다. 두 학급의 시험 평균(비모수검정의 경우 중위값)은 동일하다 말할 수 있는지 확인하라.</h4>
<pre><code>import pandas as pd 
df1 = pd.read_csv(&#39;https://raw.githubusercontent.com/Datamanim/datarepo/main/scipy/ind1.csv&#39;)
df2 = pd.read_csv(&#39;https://raw.githubusercontent.com/Datamanim/datarepo/main/scipy/ind2.csv&#39;)

from scipy.stats import shapiro

print(shapiro(df1)) # 정규성 O
print(shapiro(df2)) # 정규성 O

from scipy.stats import levene
print(levene(df1[&#39;data&#39;], df2[&#39;data&#39;])) # 등분산 O

from scipy.stats import ttest_ind
print(ttest_ind(df1, df2, equal_var = True))</code></pre><ul>
<li>결과
ShapiroResult(statistic=0.9860946536064148, pvalue=0.379673033952713)
ShapiroResult(statistic=0.990182638168335, pvalue=0.6793646216392517)
LeveneResult(statistic=2.5337683795339547, pvalue=0.11302904824469093)
TtestResult(statistic=array([2.76719074]), pvalue=array([0.00619015]), df=array([198.]))</li>
<li><blockquote>
<p>대립가설 채택</p>
</blockquote>
</li>
<li><blockquote>
<p>각 그룹 평균은 동일하지 않다</p>
</blockquote>
</li>
</ul>
<h4 id="02-두-개-학급의-시험성적에-대한-데이터이다-두-학급의-시험-평균비모수검정의-경우-중위값은-동일하다-말할-수-있는지-확인하라">02 두 개 학급의 시험성적에 대한 데이터이다. 두 학급의 시험 평균(비모수검정의 경우 중위값)은 동일하다 말할 수 있는지 확인하라.</h4>
<pre><code>import pandas as pd 
df = pd.read_csv(&#39;https://raw.githubusercontent.com/Datamanim/datarepo/main/scipy/scipy5.csv&#39;)

from scipy.stats import shapiro
print(shapiro(df.A))          # 정규성 X
print(shapiro(df.B.dropna())) # 정규성 X

from scipy.stats import mannwhitneyu, ranksums
print(mannwhitneyu(df.A, df.B.dropna()))  # 귀무가설 채택
print(ranksums(df.A, df.B.dropna()))      # 귀무가설 채택</code></pre><ul>
<li>결과
ShapiroResult(statistic=0.93753981590271, pvalue=6.175894240456614e-10)
ShapiroResult(statistic=0.9639433026313782, pvalue=0.00013568344002123922)
MannwhitneyuResult(statistic=27036.0, pvalue=0.9807458376150018)
RanksumsResult(statistic=0.02446942170858557, pvalue=0.9804781743503561)</li>
<li><blockquote>
<p>귀무가설 채택</p>
</blockquote>
</li>
<li><blockquote>
<p>평균은 같다</p>
</blockquote>
</li>
</ul>
<h4 id="03-두개-그룹에-대한-수치형-데이터이다-두-그룹은-평균이-동일하다-말할-수-있는가">03 두개 그룹에 대한 수치형 데이터이다. 두 그룹은 평균이 동일하다 말할 수 있는가</h4>
<pre><code>import pandas as pd 
df = pd.read_csv(&#39;https://raw.githubusercontent.com/Datamanim/datarepo/main/scipy/ind3.csv&#39;)

from scipy.stats import shapiro
a = df[df[&#39;group&#39;] == &#39;a&#39;].data
b = df[df[&#39;group&#39;] == &#39;b&#39;].data
print(shapiro(a)) # 정규성 O
print(shapiro(b)) # 정규성 O

from scipy.stats import levene
print(levene(a, b))   # 등분산 X

from scipy.stats import ttest_ind
print(ttest_ind(a, b, equal_var = False))</code></pre><ul>
<li>결과
ShapiroResult(statistic=0.9834123253822327, pvalue=0.1473984718322754)
ShapiroResult(statistic=0.9831852316856384, pvalue=0.4701973497867584)
LeveneResult(statistic=6.185601018015722, pvalue=0.013750484571911342)
TtestResult(statistic=-2.1949470315829265, pvalue=0.029512802991767898, df=171.25282465005142)</li>
<li><blockquote>
<p>귀무가설 기각</p>
</blockquote>
</li>
<li><blockquote>
<p>평균 동일 X</p>
</blockquote>
</li>
</ul>
<h4 id="04-두개-그룹에-대한-수치형-데이터이다-두-그룹은-평균이-동일하다-말할-수-있는가">04 두개 그룹에 대한 수치형 데이터이다. 두 그룹은 평균이 동일하다 말할 수 있는가</h4>
<pre><code>import pandas as pd 
df = pd.read_csv(&#39;https://raw.githubusercontent.com/Datamanim/datarepo/main/scipy/ind6.csv&#39;)

from scipy.stats import shapiro
print(shapiro(df.a)) # 정규성 O
print(shapiro(df.b.dropna())) # 정규성 O

from scipy.stats import levene
print(levene(df.a, df.b.dropna()))  # 등분산 X

from scipy.stats import ttest_ind
print(ttest_ind(df.a, df.b.dropna(), equal_var = False))</code></pre><ul>
<li>결과
ShapiroResult(statistic=0.9865895509719849, pvalue=0.28390026092529297)
ShapiroResult(statistic=0.9854326844215393, pvalue=0.5937624573707581)
LeveneResult(statistic=3.9862856894158347, pvalue=0.04731495612868527)
TtestResult(statistic=0.0015963310698567184, pvalue=0.9987289046092704, df=122.72255248639058)</li>
<li><blockquote>
<p>귀무가설 기각X</p>
</blockquote>
</li>
<li><blockquote>
<p>평균값은 동일</p>
</blockquote>
</li>
</ul>
<h3 id="5-대응-표본-t-검정-paired">#5 대응 표본 t 검정 (paired)</h3>
<h4 id="01-특정-질병-집단의-투약-전후의-혈류량-변화를-나타낸-데이터이다-투약-전후의-변화가-있는지-검정하라">01 특정 질병 집단의 투약 전후의 혈류량 변화를 나타낸 데이터이다. 투약 전후의 변화가 있는지 검정하라</h4>
<pre><code>import pandas as pd 
df = pd.read_csv(&#39;https://raw.githubusercontent.com/Datamanim/datarepo/main/scipy/rel2.csv&#39;)

from scipy.stats import shapiro

print(shapiro(df.before)) # 정규성 O
print(shapiro(df.after))  # 정규성 O

from scipy.stats import levene
print(levene(df.before, df.after))  # 등분산 O

from scipy.stats import ttest_rel
print(ttest_rel(df.before, df.after))</code></pre><ul>
<li>결과
ShapiroResult(statistic=0.9907895922660828, pvalue=0.6065835952758789)
ShapiroResult(statistic=0.9916961193084717, pvalue=0.6923638582229614)
LeveneResult(statistic=0.06427968690211128, pvalue=0.8000741651677987)
TtestResult(statistic=-2.5535473487670677, pvalue=0.011926744724546513, df=119)</li>
<li><blockquote>
<p>p-value 0.05이내</p>
</blockquote>
</li>
<li><blockquote>
<p>대립가설 채택</p>
</blockquote>
</li>
<li><blockquote>
<p>평균은 같지 않다</p>
</blockquote>
</li>
</ul>
<h4 id="02-특정-질병-집단의-투약-전후의-혈류량-변화를-나타낸-데이터이다-투약-전후의-변화가-있는지-검정하라">02 특정 질병 집단의 투약 전후의 혈류량 변화를 나타낸 데이터이다. 투약 전후의 변화가 있는지 검정하라</h4>
<pre><code>import pandas as pd 
df = pd.read_csv(&#39;https://raw.githubusercontent.com/Datamanim/datarepo/main/scipy/rel3.csv&#39;)

from scipy.stats import shapiro
print(shapiro(df.before)) # 정규성 O
print(shapiro(df.after))  # 정규성 O

from scipy.stats import levene
print(levene(df.before, df.after))  # 등분산 O

from scipy.stats import ttest_rel
print(ttest_rel(df.before, df.after))</code></pre><ul>
<li>결과
ShapiroResult(statistic=0.9920631051063538, pvalue=0.7270199656486511)
ShapiroResult(statistic=0.992019534111023, pvalue=0.7229290008544922)
LeveneResult(statistic=1.3463330638203617, pvalue=0.24708279045237214)
TtestResult(statistic=0.188900575991026, pvalue=0.8504925317234707, df=119)</li>
<li><blockquote>
<p>귀무가설 채택</p>
</blockquote>
</li>
<li><blockquote>
<p>평균은 같다</p>
</blockquote>
</li>
</ul>
<h4 id="03-특정-집단의-학습-전후-시험-성적-변화를-나타낸-데이터이다-시험-전과-후에-차이가-있는지-검정하라">03 특정 집단의 학습 전후 시험 성적 변화를 나타낸 데이터이다. 시험 전과 후에 차이가 있는지 검정하라.</h4>
<pre><code>import pandas as pd
df = pd.read_csv(&#39;https://raw.githubusercontent.com/Datamanim/datarepo/main/scipy/rel1.csv&#39;)

from scipy.stats import shapiro

print(shapiro(df.before))   # 정규성 X
print(shapiro(df.after))    # 정규성 X

from scipy.stats import levene
print(levene(df.before, df.after))  # 등분산 O

from scipy.stats import wilcoxon
print(wilcoxon(df.before, df.after))</code></pre><ul>
<li>결과
ShapiroResult(statistic=0.9173730611801147, pvalue=0.0018974003614857793)
ShapiroResult(statistic=0.9448966979980469, pvalue=0.021140215918421745)
LeveneResult(statistic=0.14329522146179022, pvalue=0.7058456563194881)
WilcoxonResult(statistic=437.0, pvalue=0.12098409484052809)</li>
<li><blockquote>
<p>p-value 0.05보다 높으므로, 귀무가설 채택</p>
</blockquote>
</li>
<li><blockquote>
<p>전 후 평균 일치</p>
</blockquote>
</li>
</ul>
<h4 id="04-한-기계-부품의-rpm-수치를-두-가지-다른-상황에서-측정했다-총-70세트-b상황이-a상황보다-rpm값이-높다고-말할-수-있는지-검정하라">04 한 기계 부품의 rpm 수치를 두 가지 다른 상황에서 측정했다. (총 70세트) b상황이 a상황보다 rpm값이 높다고 말할 수 있는지 검정하라.</h4>
<pre><code>import pandas as pd 
df = pd.read_csv(&#39;https://raw.githubusercontent.com/Datamanim/datarepo/main/scipy/rel4.csv&#39;)

a = df[df[&#39;group&#39;] == &#39;a&#39;].rpm
b = df[df[&#39;group&#39;] == &#39;b&#39;].rpm

from scipy.stats import shapiro

print(shapiro(a))   # 정규성 O
print(shapiro(b))   # 정규성 O

from scipy.stats import levene
print(levene(a, b)) # 등분산 O

from scipy.stats import ttest_rel
print(ttest_rel(a, b, alternative = &#39;greater&#39;))</code></pre><ul>
<li>결과
ShapiroResult(statistic=0.9907217025756836, pvalue=0.8884284496307373)
ShapiroResult(statistic=0.984674870967865, pvalue=0.5505106449127197)
LeveneResult(statistic=0.06716114122680159, pvalue=0.7959020864923277)
TtestResult(statistic=-1.9018108294460812, pvalue=0.9693143365355352, df=69)</li>
<li><blockquote>
<p>a&gt;b 가 대립가설, a&lt;=b 가 귀무가설</p>
</blockquote>
</li>
<li><blockquote>
<p>0.05보다 크므로 귀무가설 채택</p>
</blockquote>
</li>
</ul>
<h3 id="6-카이제곱-검정-교차분석">#6 카이제곱 검정 (교차분석)</h3>
<h4 id="01-144회-주사위를-던졌을-때-각-눈금별로-나온-횟수를-나타낸다-이-데이터는-주사위의-분포에서-나올-가능성이-있는지-검정하라">01 144회 주사위를 던졌을 때, 각 눈금별로 나온 횟수를 나타낸다. 이 데이터는 주사위의 분포에서 나올 가능성이 있는지 검정하라</h4>
<pre><code>import pandas as pd 
df = pd.read_csv(&#39;https://raw.githubusercontent.com/Datamanim/datarepo/main/scipy/dice.csv&#39;)

from scipy.stats import chisquare

df[&#39;expected&#39;] = (df[&#39;counts&#39;].sum()/6).astype(&#39;int&#39;)
print(chisquare(df.counts, df.expected))</code></pre><ul>
<li>결과
Power_divergenceResult(statistic=2.333333333333333, pvalue=0.8013589222076911)</li>
<li><blockquote>
<p>귀무가설 채택</p>
</blockquote>
</li>
<li><blockquote>
<p>각 주사위 눈금 발생 비율은 동일함</p>
</blockquote>
</li>
</ul>
<h4 id="02-다음-데이터는-국민-기초체력을-조사한-데이터이다-성별과-등급이-독립적인지-검정하라">02 다음 데이터는 국민 기초체력을 조사한 데이터이다. 성별과 등급이 독립적인지 검정하라.</h4>
<pre><code>import pandas as pd 
df = pd.read_csv(&#39;https://raw.githubusercontent.com/Datamanim/datarepo/main/body/body.csv&#39;)

cdf = pd.crosstab(df[&#39;측정회원성별&#39;], df[&#39;등급&#39;])

from scipy.stats import chi2_contingency
chi2, p, dof, exp = chi2_contingency(cdf)
print(p)</code></pre><ul>
<li>결과</li>
</ul>
<p>7.481892813401677e-26
-&gt; 귀무가설 기각
-&gt; 두 항목은 연관이 있다</p>
<h4 id="03-성별에-따른-동아리-활동-참석-비율을-나타낸-데이터이다-성별과-참석간에-관련이-있는지-검정하라">03 성별에 따른 동아리 활동 참석 비율을 나타낸 데이터이다. 성별과 참석간에 관련이 있는지 검정하라.</h4>
<pre><code>import pandas as pd 
df = pd.read_csv(&#39;https://raw.githubusercontent.com/Datamanim/datarepo/main/scipy/fe2.csv&#39;,index_col=0)

cdf = df.iloc[:-1, :-1]

from scipy.stats import chi2_contingency
chi2, p, dof, exp = chi2_contingency(cdf)
print(p)  # 귀무가설 채택 -&gt; 하지만 5보다 작은 셀이 20%가 넘어가므로 피셔의 정확검정을 사용해야함

from scipy.stats import fisher_exact
print(fisher_exact(cdf))</code></pre><ul>
<li>결과</li>
</ul>
<p>0.07023259819117404
SignificanceResult(statistic=18.0, pvalue=0.03571428571428571)
-&gt; 대립가설 채택
-&gt; 관련이 있다</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[빅데이터 분석기사 실기 1유형]]></title>
            <link>https://velog.io/@uwol-is-june/%EB%B9%85%EB%8D%B0%EC%9D%B4%ED%84%B0-%EB%B6%84%EC%84%9D%EA%B8%B0%EC%82%AC-%EC%8B%A4%EA%B8%B0-1%EC%9C%A0%ED%98%95</link>
            <guid>https://velog.io/@uwol-is-june/%EB%B9%85%EB%8D%B0%EC%9D%B4%ED%84%B0-%EB%B6%84%EC%84%9D%EA%B8%B0%EC%82%AC-%EC%8B%A4%EA%B8%B0-1%EC%9C%A0%ED%98%95</guid>
            <pubDate>Sat, 15 Jun 2024 06:35:16 GMT</pubDate>
            <description><![CDATA[<h3 id="출처---dip-대구-빅데이터-활용센터-강의">출처 - DIP 대구 빅데이터 활용센터 강의</h3>
<h3 id="문제-1">문제 1</h3>
<ul>
<li>alchol(음주수치) 상위 10번째 값으로 상위 1~10위의 범위의 값을 변경한 후 speeding(속도)가 7이상의 alchol(음주수치) 데이터들의 평균 산출<pre><code>data = df.sort_values(by = &#39;alcohol&#39;, ascending = False)
ten = data.iloc[9, 2]
data.iloc[:10, 2] = ten
</code></pre></li>
</ul>
<p>result = data[(data[&#39;speeding&#39;] &gt;= 7)]
result1 = result.alcohol.mean()
result1</p>
<pre><code>
### 문제 2
- 데이터 첫번째 행부터 70% 까지의 데이터를 추출한 후 distance(거리)의 결측값을 distance(거리)의 중앙값으로 대체하고 결측값 전처리 전과 후의 표준편차를 비교</code></pre><p>data_len = int(len(df)*0.7)
df_1 = df[:data_len]
df_2 = df_1.copy()
df_2[&#39;distance&#39;] = df_1[&#39;distance&#39;].fillna(df_1.distance.median())
print(np.std(df_1[&#39;distance&#39;]))
print(np.std(df_2[&#39;distance&#39;]))</p>
<pre><code>
### 문제 3
- orbital_period열의 이상치를 IQR기법으로 제거하여 이상치들의 합을 계산</code></pre><p>Q1 = df[&#39;orbital_period&#39;].quantile(0.25)
Q3 = df[&#39;orbital_period&#39;].quantile(0.75)
IQR = Q3 - Q1</p>
<p>result = df[(df[&#39;orbital_period&#39;] &gt; Q3+1.5<em>IQR)|(df[&#39;orbital_period&#39;] &lt; Q1-1.5</em>IQR)]
result[&#39;orbital_period&#39;].sum()</p>
<pre><code>
### 정리</code></pre><p>df.iloc[3, 2]    # df 데이터 프레임의 4행, 3열 추출 (인덱스 기준)
.mean()            # 평균
.median()        # 중앙값
.mode()            # 최빈값
.copy()            # 데이터 프레임 복사
.var()            # 분산
.std()            # 표준편차
np.ceil()        # 올림
np.floor()        # 내림
np.trunc()        # 버림
df[&#39;col1&#39;].quantile(0.25)    </p>
<h1 id="df-데이터-프레임의-col1-기준-25까지의-값을-추출">df 데이터 프레임의 col1 기준 25%까지의 값을 추출</h1>
<p>&amp;    # and 연산
|    # or 연산
.dropna()        # 결측치 제거
```</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[빅데이터 분석기사 실기 2유형]]></title>
            <link>https://velog.io/@uwol-is-june/%EB%B9%85%EB%8D%B0%EC%9D%B4%ED%84%B0-%EB%B6%84%EC%84%9D%EA%B8%B0%EC%82%AC-%EC%8B%A4%EA%B8%B0-2%EC%9C%A0%ED%98%95</link>
            <guid>https://velog.io/@uwol-is-june/%EB%B9%85%EB%8D%B0%EC%9D%B4%ED%84%B0-%EB%B6%84%EC%84%9D%EA%B8%B0%EC%82%AC-%EC%8B%A4%EA%B8%B0-2%EC%9C%A0%ED%98%95</guid>
            <pubDate>Thu, 13 Jun 2024 05:53:40 GMT</pubDate>
            <description><![CDATA[<h3 id="2유형-코드-작성-순서">2유형 코드 작성 순서</h3>
<ol>
<li>데이터 수집</li>
<li>데이터 정규화 - 훈련 데이터, 테스트 데이터 정규화</li>
<li>정답 데이터 지정 - 학습 데이터와 함께 해당 데이터 정답 지정</li>
<li>모델 생성 - RandomForest 사용</li>
<li>모델 훈련</li>
<li>모델 예측</li>
<li>정답 제출</li>
</ol>
<h3 id="종류">종류</h3>
<ol>
<li>분류 - 목표변수가 카테고리로 나뉘어지는 결과(성공, 실패)</li>
</ol>
<ul>
<li>성능평가 - accuracy_score, f1_score, roc_auc_score</li>
</ul>
<ol start="2">
<li>회귀 - 목표변수가 수치형</li>
</ol>
<ul>
<li>성능평가 - RMS, 결정계수</li>
</ul>
<h3 id="분류모델">분류모델</h3>
<h4 id="1-info-print">1. .info() print</h4>
<ul>
<li>결측값 확인</li>
<li>Object 변수 확인</li>
</ul>
<h4 id="2-결측값-처리">2. 결측값 처리</h4>
<pre><code>train.fillna(train[&#39;환불금액&#39;].mode()[0], inplace = True)
test.fillna(test[&#39;환불금액&#39;].mode()[0], inplace = True)</code></pre><ul>
<li>.info() 다시 print해서 결측값 처리 되었는지 체크<h4 id="3-object-변수-라벨-인코딩">3. Object 변수 라벨 인코딩</h4>
<pre><code>from sklearn.preprocessing import LabelEncoder
</code></pre></li>
</ul>
<p>le = labelEncoder()
train[&#39;주구매상품&#39;] = le.fit_transform(train[&#39;주구매상품&#39;])
train[&#39;주구매지점&#39;] = le.fit_transform(train[&#39;주구매지점&#39;])
test[&#39;주구매상품&#39;] = le.fit_transform(test[&#39;주구매상품&#39;])
test[&#39;주구매지점&#39;] = le.fit_transform(test[&#39;주구매지점&#39;])</p>
<pre><code>- .info() 다시 print해서 정수형태로 변환되었는지 체크
#### 4. 데이터 분할
- 학습용 독립변수(X), 테스트용 독립변수(X), 학습용 종속변수(Y), 테스트용 종속변수(Y)
- 데이터를 분할해서 써야한다</code></pre><p>from sklearn.model_selection import train_test_split</p>
<p>X = train.drop(columns = [&#39;성별&#39;, &#39;회원ID&#39;]
Y = train[&#39;성별&#39;]</p>
<p>X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.2, random_state = 2024)</p>
<pre><code>
#### 5. 모델링</code></pre><p>from sklearn.ensemble import RandomForestClassifier</p>
<p>rfc = RandomForestClassifier(n_estimators = 150, max_depth = 20, random_state = 2024)</p>
<pre><code>
#### 6. 모델학습</code></pre><p>rfc.fit(X_train, y_train)</p>
<pre><code>
#### 7. 예측값 도출</code></pre><p>pred1 = rfc.predict(X_test)</p>
<pre><code>
#### 8. 성능평가</code></pre><p>from sklearn.metrics import roc_auc_score, accuracy_score
roc = roc_auc_score(y_test, pred)
acc = accuracy_score(y_test, pred)</p>
<pre><code>- print 해서 roc, acc 지표 체크

#### 9. 테스트 데이터 예측</code></pre><p>test_X = test.drop(columns = [&#39;회원ID&#39;])
pred2 = rfc.predict(test_X)</p>
<pre><code>
#### 10. 결과 데이터 제출 및 확인</code></pre><p>pd.DataFrame({&#39;pred&#39; : pred2}).to_csv(&#39;result.csv&#39;, index = False)</p>
<pre><code>
### 회귀모델
문제
1. 전체 데이터 목록 4,009행 중 3,800행을 학습용 데이터로 사용하고, 나머지를 테스트 데이터로 사용할 수 있도록 데이터를 슬라이싱한다.
2. 학습용 데이터를 활용하여 모델을 모델링하고, 테스트 데이터를 적용하여 목표변수를(price) 예측하고, 예측결과를 제출한다. (단, 제출 결과는 테스트 데이터의 개수인 209행이 될 수 있도록 한다.)
3. 모델 평가 지표는 RMSE로 한다.
4. 모델 예측 결과는 price 컬럼을 갖고, 예측 결과를 나타내며, index는 표시하지 않는다.
5. 예측 결과 파일명은 다음과 같이 하여 제출한다. (파일명 : result.csv)
#### 1. 데이터 확인</code></pre><p>import pandas as pd</p>
<p>df = pd.read_csv(&#39;<a href="https://raw.githubusercontent.com/JEunJin/BigData_python/master/bigdata_csvfile/used_cars_price_data.csv&#39;">https://raw.githubusercontent.com/JEunJin/BigData_python/master/bigdata_csvfile/used_cars_price_data.csv&#39;</a>)
print(df.info())
print(df.head())</p>
<pre><code>- info()를 통해 결측값을 확인하고, LabelEncoding할 항목 판별

#### 2. 결측값 처리 - 최빈값 대체</code></pre><p>df[&#39;fuel_type&#39;].fillna(df[&#39;fuel_type&#39;].mode()[0], inplace = True)
df[&#39;accident&#39;].fillna(df[&#39;accident&#39;].mode()[0], inplace = True)
df[&#39;clean_title&#39;].fillna(df[&#39;clean_title&#39;].mode()[0], inplace = True)</p>
<pre><code>- mode()[0] - 최빈값은 여러개일 수 있음

#### 3. 라벨 인코딩</code></pre><p>from sklearn.preprocessing import LabelEncoder
le = LabelEncoder()</p>
<p>df[&#39;brand&#39;] = le.fit_transform(df[&#39;brand&#39;])
df[&#39;model&#39;] = le.fit_transform(df[&#39;model&#39;])
df[&#39;milage&#39;] = le.fit_transform(df[&#39;milage&#39;])
df[&#39;fuel_type&#39;] = le.fit_transform(df[&#39;fuel_type&#39;])
df[&#39;engine&#39;] = le.fit_transform(df[&#39;engine&#39;])
df[&#39;transmission&#39;] = le.fit_transform(df[&#39;transmission&#39;])
df[&#39;ext_col&#39;] = le.fit_transform(df[&#39;ext_col&#39;])
df[&#39;int_col&#39;] = le.fit_transform(df[&#39;int_col&#39;])
df[&#39;accident&#39;] = le.fit_transform(df[&#39;accident&#39;])
df[&#39;clean_title&#39;] = le.fit_transform(df[&#39;clean_title&#39;])
df[&#39;price&#39;] = le.fit_transform(df[&#39;price&#39;])</p>
<pre><code>
#### 4. 데이터 분할
1) train-test 분할</code></pre><h1 id="트레인-3800-테스트-209">트레인 3800, 테스트 209</h1>
<p>train = df.iloc[:3800, :]
test = df.iloc[-209:, :]</p>
<pre><code>
2) 독립-종속 (X-y) 분할</code></pre><p>from sklearn.model_selection import train_test_split</p>
<p>X = train.drop(columns = [&#39;price&#39;])
y = train[&#39;price&#39;]</p>
<p>X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.2, random_state = 10)</p>
<pre><code>
#### 5. 모델링</code></pre><p>from sklearn.ensemble import RandomForestRegressor</p>
<p>rfr = RandomForestRegressor(n_estimators = 120, max_depth = 15, random_state = 10)
rfr.fit(X_train, y_train)
pred1 = rfr.predict(X_test)</p>
<pre><code>- random_state 는 동일하게 설정해야함

#### 6. 성능평가</code></pre><p>from sklearn.metrics import mean_squared_error
import numpy as np</p>
<p>mse = mean_squared_error(y_test, pred1)
rmse = np.sqrt(mse)
print(rmse)</p>
<pre><code>
#### 7. 최종 결과 예측</code></pre><p>test_X_data = test.drop(columns = [&#39;price&#39;])
pred2 = rfr.predict(test_X_data)</p>
<pre><code>
#### 8. CSV 파일 저장</code></pre><p>pd.DataFrame({&#39;price&#39; : pred2}).to_csv(&#39;result.csv&#39;, index = False)
result = pd.read_csv(&#39;result.csv&#39;)</p>
<pre><code>
#### 9. 추가
- 원-핫 인코딩 : 순서가 없는 범주형 변수
- 라벨 인코딩 : 순서가 있는 범주형 변수</code></pre><p>pd.get_dummies(df, columns = [&#39;col1&#39;, &#39;col2&#39;]</p>
<pre><code></code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[Pandas 관련 사용법 정리]]></title>
            <link>https://velog.io/@uwol-is-june/Pandas-%EA%B4%80%EB%A0%A8-%EC%82%AC%EC%9A%A9%EB%B2%95-%EC%A0%95%EB%A6%AC</link>
            <guid>https://velog.io/@uwol-is-june/Pandas-%EA%B4%80%EB%A0%A8-%EC%82%AC%EC%9A%A9%EB%B2%95-%EC%A0%95%EB%A6%AC</guid>
            <pubDate>Wed, 12 Jun 2024 08:54:09 GMT</pubDate>
            <description><![CDATA[<h3 id="01-pandas-import">01 Pandas Import</h3>
<pre><code>import pandas as pd</code></pre><h3 id="02-csv-파일-불러오기">02 csv 파일 불러오기</h3>
<pre><code>import pandas as pd
test_csv = pd.read_csv(&quot;CSV 파일경로&quot;)</code></pre><h3 id="03-col열-추출하기">03 col(열) 추출하기</h3>
<pre><code>import pandas as pd
test_csv = pd.read_csv(&quot;CSV 파일경로&quot;)

test_csv[[&#39;col1&#39;, &#39;col2&#39;, &#39;col3&#39;]]</code></pre><ul>
<li>원하는 col에 대해서 전부 추출 가능</li>
</ul>
<h3 id="04-특정-조건-검색">04 특정 조건 검색</h3>
<pre><code>import pandas as pd
test_csv = pd.read_csv(&quot;CSV 파일경로&quot;)

test_csv[[&#39;col1&#39;, &#39;col2&#39;, &#39;col3&#39;]][test_csv[&#39;col2&#39;]==&#39;hello&#39;]</code></pre><ul>
<li>col2가 hello인 행의 col1, col2, col3만 추출해서 출력</li>
<li>비교연산자 전부 사용 가능(&gt;, ==, &lt; 등)</li>
</ul>
<h3 id="05-비교연산자-종류">05 비교연산자 종류</h3>
<pre><code>==    // 똑같으면 True, 다르면 False
&lt;    // 오른쪽이 크면 True, 아니면 False
&gt;    // 왼쪽이 크면 True, 아니면 False
&lt;=    // 오른쪽이 크거나 같으면 True, 아니면 False
&gt;=    // 왼쪽이 크거나 같으면 True, 아니면 False
!=    // 다르면 True, 같으면 False
</code></pre><h4 id="1-pandas-비교-연산-종류">1) Pandas 비교 연산 종류</h4>
<pre><code>test_csv[&#39;col1&#39;].between(1, 10)    // col1의 1~10 사이인 row 선택 
test_csv[&#39;col1&#39;].isin([1, 2])    // col1이 1, 2인 row 선택
test_csv[&#39;col1&#39;].isnull()        // col1이 numm인 row 선택
test_csv[&#39;col1&#39;].apply(lamda)    // lamda 함수를 활용해 row 선택</code></pre><ul>
<li>between은 시작과 끝 값을 포함<h4 id="2-not-연산-예시">2) not 연산 예시</h4>
<pre><code>test_csv[[&#39;col1&#39;, &#39;col2&#39;, &#39;col3&#39;]][~file[&#39;col2&#39;].between(1, 10)]</code></pre></li>
<li>col2가 1~10사이가 아닌 row 선택<h4 id="3-모든-col을-전부-선택하고-싶을-때">3) 모든 col을 전부 선택하고 싶을 때</h4>
<pre><code>test_csv[:][test_csv[&#39;col2&#39;].between(1, 10)]
test_csv[test_csv[&#39;col2&#39;].between(1, 10)]</code></pre></li>
<li>두개 다 가능</li>
</ul>
<h4 id="4-not-연산-적용-예시">4) not 연산 적용 예시</h4>
<pre><code>test_csv[:][~test_csv[&#39;col2&#39;].between(1, 10)]
test_csv[~test_csv[&#39;col2&#39;].between(1, 10)]</code></pre><h3 id="06-한글-데이터-인코딩">06 한글 데이터 인코딩</h3>
<pre><code>test_csv = pd.read_csv(&quot;CSV 파일경로&quot;, encoding = &quot;euckr&quot;)</code></pre><ul>
<li>EUCKR : Extended Unix Code KR</li>
</ul>
<h3 id="07-lambda-함수를-활용한-선택">07 lambda 함수를 활용한 선택</h3>
<pre><code>test_csv[[&#39;col1&#39;, &#39;col2&#39;, &#39;col3&#39;]][file[&#39;col2&#39;].apply(lambda x : x[0] == &#39;A&#39;)]</code></pre><ul>
<li>col2의 0번 인덱스가 A인 row 선택</li>
</ul>
<h3 id="08-데이터-정렬">08 데이터 정렬</h3>
<pre><code>test_csv[[&#39;col1&#39;, &#39;col2&#39;, &#39;col3&#39;]].sort_values( by =&#39;col2&#39;,  ascending=True)</code></pre><ul>
<li>ascending = True - 오름차순 정렬</li>
<li>ascending = Flase - 내림차순 정렬</li>
</ul>
<h3 id="09-데이터-프레임-구조-확인">09 데이터 프레임 구조 확인</h3>
<pre><code>test_csv.info()</code></pre><h4 id="1-dtype-data-type">1) Dtype (Data Type)</h4>
<ul>
<li>int64 - 정수</li>
<li>object - 문자</li>
<li>float64 - 실수</li>
</ul>
<h3 id="10-데이터-타입-변환-문자-날짜">10 데이터 타입 변환 (문자-날짜)</h3>
<pre><code>test_csv[&#39;date&#39;] = pd.to_datetime(csv_test[&#39;date&#39;])</code></pre><h4 id="1-날짜형-데이터-선택">1) 날짜형 데이터 선택</h4>
<pre><code>test_csv[[&#39;col1&#39;, &#39;col2&#39;, &#39;date&#39;]][test_csv[&#39;date&#39;] == &#39;1999-12-09&#39;]</code></pre><ul>
<li>between()을 사용하면 구간 단위 선택도 가능</li>
</ul>
<h3 id="11-데이터-중복-제거">11 데이터 중복 제거</h3>
<pre><code>test_csv[&#39;col2&#39;].unique()</code></pre><ul>
<li>대괄호 2개 -&gt; Data frame</li>
<li>대괄호 1개 -&gt; Series (unique()는 Series 함수)</li>
</ul>
<h3 id="12-문자-함수">12 문자 함수</h3>
<h4 id="1-upper-lower">1) .upper(), .lower()</h4>
<pre><code>test_csv[&#39;name&#39;].str.upper()
test_csv[&#39;name&#39;].str.lower()</code></pre><ul>
<li>Series에서는 upper(), lower()등이 사용 불가 하므로 str로 바꿔준 뒤 써야함</li>
<li>upper() : 전체 문자열을 대문자로 변환</li>
<li>lower() : 전체 문자열을 소문자로 변환</li>
</ul>
<h4 id="2-capitalize---첫번째-철자-대문자로-변환">2) .capitalize() - 첫번째 철자 대문자로 변환</h4>
<pre><code>test_csv.col1.str.capitalize()</code></pre><h4 id="3-slicestart---stop-----문자열-자르기">3) .slice(start = , stop = ) - 문자열 자르기</h4>
<pre><code>test_csv.col1.str.slice(start = 0, stop = 3)</code></pre><ul>
<li>0번째 부터 2번째 까지 자르기</li>
<li>.apply(lambda = )를 사용해서 체크할 수도 있지만 .slice()로 잘라서 체크도 가능</li>
</ul>
<h4 id="4-len---문자열-길이">4) .len() - 문자열 길이</h4>
<pre><code>test_csv[&#39;col1_len&#39;] = test_csv.col1.str.len()</code></pre><ul>
<li>이런식으로 새로운 col 추가도 가능</li>
</ul>
<h4 id="5-lstrip-rstrip-strip---공백-제거">5) .lstrip(), .rstrip(), .strip() - 공백 제거</h4>
<pre><code>test_csv.col1.str.strip()</code></pre><h4 id="6-replace---문자-대체">6) .replace() - 문자 대체</h4>
<pre><code>test_csv.col1.str.replace(&#39;a&#39;, &#39;b&#39;)</code></pre><ul>
<li>a를 b로 대체<h4 id="7-find---특정-문자-위치-인덱스">7) .find() - 특정 문자 위치 인덱스</h4>
<pre><code>test_csv[[&#39;col1&#39;, &#39;col2&#39;]][test_csv.col2.str.find(&#39;a&#39;) != -1]</code></pre></li>
<li>없으면 -1 출력</li>
</ul>
<h3 id="13-pdconcat">13 pd.concat()</h3>
<pre><code>pd.concat([test_csv.col1, test_csv.col2], axis = 1)</code></pre><ul>
<li>axis = 1 - 옆으로 붙이기</li>
<li>axis = 0 - 아래로 붙이기<pre><code>test_csv.col2.str.lower()</code></pre></li>
<li>이런식의 접근도 가능</li>
</ul>
<h3 id="14-데이터-형-변환">14 데이터 형 변환</h3>
<pre><code>test_csv[&#39;co1&#39;] = test_csv[&#39;co1&#39;].astype(str)</code></pre><ul>
<li>col1을 str type으로 변환</li>
</ul>
<h3 id="15-re---데이터-전처리-모듈">15 re - 데이터 전처리 모듈</h3>
<h4 id="1-resub">1) re.sub</h4>
<pre><code>test_csv[&#39;col1_mask&#39;] = test_csv.col1.apply( lambda x : re.sub(&#39;[0-2]&#39;, &#39;*&#39;, x))</code></pre><ul>
<li>0~2의 문자를 * 로 바꿈</li>
</ul>
<h3 id="16-각종-연산">16 각종 연산</h3>
<h4 id="1-max-min---최대-최소-선택">1) max(), min() - 최대, 최소 선택</h4>
<pre><code>test_csv[&#39;col1&#39;].max().reset_index()
test_csv[&#39;col1&#39;].max().reset_index()</code></pre><h4 id="2-groupby-reset_index---col로-묶기">2) groupby, reset_index() - col로 묶기</h4>
<pre><code>test_csv.groupby(&#39;col1&#39;)[&#39;col2&#39;].max().reset_index()</code></pre><ul>
<li>job별로 묶은 뒤 money col의 max를 출력<h4 id="3-groupby-2개로-하기">3) groupby() 2개로 하기</h4>
<pre><code>test_csv.groupby([&#39;col1&#39;, &#39;col2&#39;])[&#39;col3&#39;].sum().reset_index()</code></pre><h4 id="4-sum-mean---합-평균값">4) sum(), mean() - 합, 평균값</h4>
<pre><code>test_csv[&#39;col1&#39;].sum().reset_index()
test_csv[&#39;col1&#39;].mean().reset_index()</code></pre><h4 id="5-count---개수-세기">5) count() - 개수 세기</h4>
<pre><code>test_csv.groupby(&#39;col1&#39;)[&#39;col2&#39;].count().reset_index()</code></pre></li>
<li>결측치가 없는 columns을 사용해야 한다<h3 id="17-col-이름-변경">17 col 이름 변경</h3>
<pre><code>test_csv.columns = [&#39;이름&#39;, &#39;나이&#39;]</code></pre></li>
<li>차례로 변경</li>
</ul>
<h3 id="18-datetime">18 DateTime</h3>
<h4 id="1-date-time으로-변환">1) Date Time으로 변환</h4>
<pre><code>test_csv[&#39;col1&#39;] = pd.to_datetime(test_csv[&#39;col1&#39;])</code></pre><h4 id="2-정보-추출">2) 정보 추출</h4>
<pre><code>test_csv.col1.dt.year    // 년도
test_csv.col1.dt.month    // 월
test_csv.col1.dt.day    // 일</code></pre><h3 id="19-rank">19 Rank()</h3>
<pre><code>test_csv[&#39;순위&#39;] = test_csv[&#39;col1&#39;].rank(method = &#39;dense&#39;, ascending = False).astype(int)
test_csv[[&#39;col1&#39;, &#39;col2&#39;, &#39;순위&#39;]].sort_values(by = &#39;순위&#39;, ascending = True)</code></pre><ul>
<li>dense 설정    : 1등 -&gt; 공동 2등 -&gt; 3등</li>
<li>dense 설정X : 1등 -&gt; 공동 2등 -&gt; 4등</li>
</ul>
<h3 id="20-qcut">20 qcut()</h3>
<pre><code>cuts = 5
test_csv[&#39;grade&#39;] = pd.qcut(test_csv.순위, q = cuts, labels=range(1, cuts+1))</code></pre><ul>
<li>cuts : 몇개로 나눌 건지 선택</li>
</ul>
<h3 id="21-round---반올림">21 round() - 반올림</h3>
<pre><code>round(3.14)    // 3이 나옴</code></pre><h3 id="22-fillna---결측지-대체">22 .fillna() - 결측지 대체</h3>
<pre><code>test_csv[&#39;col1&#39;].fillna(mean_value, inplace = True)</code></pre><h3 id="23-그룹별-가로-출력">23 그룹별 가로 출력</h3>
<pre><code>test_csv.groupby(&#39;col1&#39;)[&#39;col2&#39;].apply(list).reset_index(name = &#39;test_name&#39;)</code></pre><h3 id="24-행-이동">24 행 이동</h3>
<pre><code>test_csv[&#39;col1&#39;] = test_csv[&#39;col2&#39;].shift(1).fillna(0).astype(int)</code></pre><h3 id="25-pivot---데이터-회전">25 pivot() - 데이터 회전</h3>
<pre><code>result = test_csv.pivot_table(columns=&#39;num&#39;, values = &#39;col1&#39;, aggfunc = &#39;sum&#39;)</code></pre><ul>
<li>index = &#39;col2&#39; : 세로로 구분 열 추가</li>
</ul>
<h3 id="26-merge---join함수">26 merge - join함수</h3>
<pre><code>result = pd.merge(test_csv1, test_csv2, on = &#39;col1&#39;, how = &#39;inner&#39;)</code></pre><ul>
<li>on은 동일한 col을 선택</li>
<li>inner : equi join</li>
<li>outer : full outer joint</li>
<li>right : 우측 테이블 데이터</li>
<li>left     : 좌측 테이블 데이터</li>
</ul>
<h3 id="27-drop_duplicates---중복제거">27 .drop_duplicates() - 중복제거</h3>
<pre><code>pd.concat([x1, x2], axis = 0).drop_duplicates()</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[프로그래머스 Lv.1 모의고사]]></title>
            <link>https://velog.io/@uwol-is-june/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-Lv.1-%EB%AA%A8%EC%9D%98%EA%B3%A0%EC%82%AC</link>
            <guid>https://velog.io/@uwol-is-june/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-Lv.1-%EB%AA%A8%EC%9D%98%EA%B3%A0%EC%82%AC</guid>
            <pubDate>Sun, 09 Jul 2023 13:23:56 GMT</pubDate>
            <description><![CDATA[<h3 id="1-문제">1. 문제</h3>
<p>수포자는 수학을 포기한 사람의 준말입니다. 수포자 삼인방은 모의고사에 수학 문제를 전부 찍으려 합니다. 수포자는 1번 문제부터 마지막 문제까지 다음과 같이 찍습니다.</p>
<p>1번 수포자가 찍는 방식: 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, ...
2번 수포자가 찍는 방식: 2, 1, 2, 3, 2, 4, 2, 5, 2, 1, 2, 3, 2, 4, 2, 5, ...
3번 수포자가 찍는 방식: 3, 3, 1, 1, 2, 2, 4, 4, 5, 5, 3, 3, 1, 1, 2, 2, 4, 4, 5, 5, ...</p>
<p>1번 문제부터 마지막 문제까지의 정답이 순서대로 들은 배열 answers가 주어졌을 때, 가장 많은 문제를 맞힌 사람이 누구인지 배열에 담아 return 하도록 solution 함수를 작성해주세요.</p>
<ul>
<li><p>제한사항
시험은 최대 10,000 문제로 구성되어있습니다.
문제의 정답은 1, 2, 3, 4, 5중 하나입니다.
가장 높은 점수를 받은 사람이 여럿일 경우, return하는 값을 오름차순 정렬해주세요.</p>
<h3 id="2-풀이">2. 풀이</h3>
<h4 id="1차-시도-성공">1차 시도 (성공)</h4>
<pre><code>def solution(answers):
  first_std = 0
  second_std = 0
  third_std = 0
  f_std_list = [1, 2, 3, 4, 5] * 8
  s_std_list = [2, 1, 2, 3, 2, 4, 2, 5] * 5
  t_std_list = [3, 3, 1, 1, 2, 2, 4, 4, 5, 5] * 4
  answer = []
  idx = 0
  for i in range(0, len(answers)):
      if (i % 40 == 0) and (i != 0) :
          idx += 1
      if f_std_list[i-(idx*40)] == answers[i]:
          first_std += 1
      if s_std_list[i-(idx*40)] == answers[i]:
          second_std += 1        
      if t_std_list[i-(idx*40)] == answers[i]:
          third_std += 1        

  if first_std &gt; second_std :
      if first_std &gt; third_std:
          answer.append(1)
      elif first_std &lt;third_std:
          answer.append(3)
      else:
          answer.append(1)
          answer.append(3)
  elif first_std &lt; second_std:
      if second_std &gt; third_std:
          answer.append(2)
      elif second_std &lt;third_std:
          answer.append(3)
      else:
          answer.append(2)
          answer.append(3)
  else :
      if first_std &gt; third_std:
          answer.append(1)
          answer.append(2)
      elif first_std &lt; third_std:
          answer.append(3)
      else:
          answer.append(1)
          answer.append(2)
          answer.append(3)
  return answer</code></pre></li>
<li><p>너무 복잡하게 푼 것 같다...</p>
<h3 id="3-lvup">3. Lv.up</h3>
<h3 id="4-ref">4. Ref.</h3>
<pre><code>def solution(answers):
  pattern1 = [1,2,3,4,5]
  pattern2 = [2,1,2,3,2,4,2,5]
  pattern3 = [3,3,1,1,2,2,4,4,5,5]
  score = [0, 0, 0]
  result = []

  for idx, answer in enumerate(answers):
      if answer == pattern1[idx%len(pattern1)]:
          score[0] += 1
      if answer == pattern2[idx%len(pattern2)]:
          score[1] += 1
      if answer == pattern3[idx%len(pattern3)]:
          score[2] += 1

  for idx, s in enumerate(score):
      if s == max(score):
          result.append(idx+1)

  return result</code></pre><ul>
<li>이해가 좀 어렵지만... 그래도 대충은 알것 같다..</li>
</ul>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[네이버 부스트 캠프 8기 2차 코딩테스트 후기 (탈락)]]></title>
            <link>https://velog.io/@uwol-is-june/%EB%84%A4%EC%9D%B4%EB%B2%84-%EB%B6%80%EC%8A%A4%ED%8A%B8-%EC%BA%A0%ED%94%84-8%EA%B8%B0-2%EC%B0%A8-%EC%BD%94%EB%94%A9%ED%85%8C%EC%8A%A4%ED%8A%B8-%ED%9B%84%EA%B8%B0-%ED%83%88%EB%9D%BD</link>
            <guid>https://velog.io/@uwol-is-june/%EB%84%A4%EC%9D%B4%EB%B2%84-%EB%B6%80%EC%8A%A4%ED%8A%B8-%EC%BA%A0%ED%94%84-8%EA%B8%B0-2%EC%B0%A8-%EC%BD%94%EB%94%A9%ED%85%8C%EC%8A%A4%ED%8A%B8-%ED%9B%84%EA%B8%B0-%ED%83%88%EB%9D%BD</guid>
            <pubDate>Tue, 04 Jul 2023 13:48:03 GMT</pubDate>
            <description><![CDATA[<h3 id="2차-코딩테스트-후기">2차 코딩테스트 후기</h3>
<ul>
<li>일단 1번 문제부터 말렸다.. 뭐가 문제였는지는 모르겠다.</li>
<li>총 세문제가 나왔는데.. 솔직히 말해서 실력이 많이 부족했다는 걸 느꼈다!</li>
<li>앞으로 공부해야할 부분들이 많이 보였다.</li>
<li>세문제중 두번째 문제만 해결하고 나머지 두 문제는 건드리지 못했다..</li>
<li>화이팅합시다..!
<img src="https://velog.velcdn.com/images/uwol-is-june/post/754a92ed-9473-4b8a-ac90-3e497f01f3e8/image.png" alt=""></li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[프로그래머스 Lv.1 K번째수]]></title>
            <link>https://velog.io/@uwol-is-june/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-Lv.1-K%EB%B2%88%EC%A7%B8%EC%88%98</link>
            <guid>https://velog.io/@uwol-is-june/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-Lv.1-K%EB%B2%88%EC%A7%B8%EC%88%98</guid>
            <pubDate>Sat, 01 Jul 2023 14:33:49 GMT</pubDate>
            <description><![CDATA[<h3 id="1-문제">1. 문제</h3>
<p>배열 array의 i번째 숫자부터 j번째 숫자까지 자르고 정렬했을 때, k번째에 있는 수를 구하려 합니다.</p>
<p>예를 들어 array가 [1, 5, 2, 6, 3, 7, 4], i = 2, j = 5, k = 3이라면</p>
<p>array의 2번째부터 5번째까지 자르면 [5, 2, 6, 3]입니다.
1에서 나온 배열을 정렬하면 [2, 3, 5, 6]입니다.
2에서 나온 배열의 3번째 숫자는 5입니다.
배열 array, [i, j, k]를 원소로 가진 2차원 배열 commands가 매개변수로 주어질 때, commands의 모든 원소에 대해 앞서 설명한 연산을 적용했을 때 나온 결과를 배열에 담아 return 하도록 solution 함수를 작성해주세요.</p>
<ul>
<li>제한사항
array의 길이는 1 이상 100 이하입니다.
array의 각 원소는 1 이상 100 이하입니다.
commands의 길이는 1 이상 50 이하입니다.
commands의 각 원소는 길이가 3입니다.<h3 id="2-풀이">2. 풀이</h3>
<h4 id="1차-시도-성공">1차 시도 (성공)</h4>
<pre><code>def solution(array, commands):
  answer = []
  cut = []
  for i in range(0, len(commands)):
      cut = array[commands[i][0]-1:commands[i][1]]
      cut.sort()
      answer.append(cut[commands[i][2]-1])
  return answer</code></pre><h3 id="3-lvup">3. Lv.up</h3>
<h3 id="4-ref">4. Ref.</h3>
<pre><code>def solution(array, commands):
  return list(map(lambda x:sorted(array[x[0]-1:x[1]])[x[2]-1], commands))</code></pre></li>
<li>람다식을 사용해서 한줄로 정리했다. </li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[프로그래머스 Lv.3 이중우선순위큐]]></title>
            <link>https://velog.io/@uwol-is-june/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-Lv.3-%EC%9D%B4%EC%A4%91%EC%9A%B0%EC%84%A0%EC%88%9C%EC%9C%84%ED%81%90</link>
            <guid>https://velog.io/@uwol-is-june/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-Lv.3-%EC%9D%B4%EC%A4%91%EC%9A%B0%EC%84%A0%EC%88%9C%EC%9C%84%ED%81%90</guid>
            <pubDate>Sun, 25 Jun 2023 15:41:06 GMT</pubDate>
            <description><![CDATA[<h3 id="1-문제">1. 문제</h3>
<p>이중 우선순위 큐는 다음 연산을 할 수 있는 자료구조를 말합니다.
<img src="https://velog.velcdn.com/images/uwol-is-june/post/a2e20101-c73b-49a2-a99a-c474f894dbb0/image.png" alt="">
이중 우선순위 큐가 할 연산 operations가 매개변수로 주어질 때, 모든 연산을 처리한 후 큐가 비어있으면 [0,0] 비어있지 않으면 [최댓값, 최솟값]을 return 하도록 solution 함수를 구현해주세요.</p>
<ul>
<li>제한사항
operations는 길이가 1 이상 1,000,000 이하인 문자열 배열입니다.
operations의 원소는 큐가 수행할 연산을 나타냅니다.
원소는 “명령어 데이터” 형식으로 주어집니다.- 최댓값/최솟값을 삭제하는 연산에서 최댓값/최솟값이 둘 이상인 경우, 하나만 삭제합니다.
빈 큐에 데이터를 삭제하라는 연산이 주어질 경우, 해당 연산은 무시합니다.</li>
</ul>
<h3 id="2-풀이">2. 풀이</h3>
<h4 id="1차-시도성공">1차 시도(성공)</h4>
<pre><code>import heapq

def solution(operations):
    answer = []
    min_heap = []
    max_heap = []

    for i in operations:
        if i[0] == &#39;I&#39;:
            heapq.heappush(min_heap, int(i[2:]))
            heapq.heappush(max_heap, -int(i[2:]))
        elif i == &quot;D 1&quot;:
            if len(max_heap) != 0:
                min_heap = list(min_heap)
                min_heap.remove(-heapq.heappop(max_heap))
                heapq.heapify(min_heap)
            else :
                continue
        elif i == &quot;D -1&quot;:
            if len(min_heap) != 0:
                max_heap = list(max_heap)
                max_heap.remove(-heapq.heappop(min_heap))
                heapq.heapify(max_heap)
            else :
                continue

    if len(max_heap) == 0:
        answer = [0, 0]
    else:
        answer.append(-heapq.heappop(max_heap))
        answer.append(heapq.heappop(min_heap))
    return answer</code></pre><ul>
<li>최대, 최소를 처리하기 위해 힙을 2개 사용하였다.<h3 id="3-lvup">3. Lv.up</h3>
<h3 id="4-ref">4. Ref.</h3>
<pre><code>from heapq import heappush, heappop
</code></pre></li>
</ul>
<p>def solution(arguments):
    max_heap = []
    min_heap = []
    for arg in arguments:
        if arg == &quot;D 1&quot;:
            if max_heap != []:
                heappop(max_heap)
                if max_heap == [] or -max_heap[0] &lt; min_heap[0]:
                    min_heap = []
                    max_heap = []
        elif arg == &quot;D -1&quot;:
            if min_heap != []:
                heappop(min_heap)
                if min_heap == [] or -max_heap[0] &lt; min_heap[0]:
                    max_heap = []
                    min_heap = []
        else:
            num = int(arg[2:])
            heappush(max_heap, -num)
            heappush(min_heap, num)
    if min_heap == []:
        return [0, 0]
    return [-heappop(max_heap), heappop(min_heap)]</p>
<pre><code>- 똑같은 알고리즘으로 구성한 것 같다!


</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[프로그래머스 Lv.2 더 맵게]]></title>
            <link>https://velog.io/@uwol-is-june/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-Lv.2-%EB%8D%94-%EB%A7%B5%EA%B2%8C</link>
            <guid>https://velog.io/@uwol-is-june/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-Lv.2-%EB%8D%94-%EB%A7%B5%EA%B2%8C</guid>
            <pubDate>Fri, 23 Jun 2023 11:33:01 GMT</pubDate>
            <description><![CDATA[<h3 id="1-문제">1. 문제</h3>
<p>매운 것을 좋아하는 Leo는 모든 음식의 스코빌 지수를 K 이상으로 만들고 싶습니다. 모든 음식의 스코빌 지수를 K 이상으로 만들기 위해 Leo는 스코빌 지수가 가장 낮은 두 개의 음식을 아래와 같이 특별한 방법으로 섞어 새로운 음식을 만듭니다.</p>
<ul>
<li>섞은 음식의 스코빌 지수 = 가장 맵지 않은 음식의 스코빌 지수 + (두 번째로 맵지 않은 음식의 스코빌 지수 * 2)</li>
</ul>
<p>Leo는 모든 음식의 스코빌 지수가 K 이상이 될 때까지 반복하여 섞습니다.
Leo가 가진 음식의 스코빌 지수를 담은 배열 scoville과 원하는 스코빌 지수 K가 주어질 때, 모든 음식의 스코빌 지수를 K 이상으로 만들기 위해 섞어야 하는 최소 횟수를 return 하도록 solution 함수를 작성해주세요.</p>
<ul>
<li>제한사항
scoville의 길이는 2 이상 1,000,000 이하입니다.
K는 0 이상 1,000,000,000 이하입니다.
scoville의 원소는 각각 0 이상 1,000,000 이하입니다.
모든 음식의 스코빌 지수를 K 이상으로 만들 수 없는 경우에는 -1을 return 합니다.<h3 id="2-풀이">2. 풀이</h3>
<h4 id="1차-시도실패">1차 시도(실패)</h4>
<pre><code>import heapq
</code></pre></li>
</ul>
<p>def solution(scoville, K):
    answer = 0
    heapq.heapify(scoville)
    for i in range(len(scoville)):
        if len(scoville) == 1:
            answer = -1
            break
        if scoville[0] &gt;= K:
            flag = 0
            break
        food1 = heapq.heappop(scoville)
        food2 = heapq.heappop(scoville)
        mix_food = food1 + (food2*2) 
        heapq.heappush(scoville, mix_food)
        answer += 1</p>
<pre><code>return answer</code></pre><pre><code>- heap 사용해서 풀었으나.. 자꾸 2-3개 케이스에서만 오류가 뜬다.. 뭐가 문제인지 모르겠다..

#### 2차 시도 (성공)</code></pre><p>import heapq</p>
<p>def solution(scoville, K):
    answer = 0
    heapq.heapify(scoville)
    while len(scoville) &gt;= 2:
        if scoville[0] &gt;= K:
            break
        food1 = heapq.heappop(scoville)
        food2 = heapq.heappop(scoville)
        mix_food = food1 + (food2*2) 
        heapq.heappush(scoville, mix_food)
        answer += 1</p>
<pre><code>if len(scoville) == 1 and scoville[0] &lt; K:
    answer = -1

return answer</code></pre><pre><code>- -1이 되는 경우의 수를 밖으로 빼주고, while문을 통해 list가 0으로 들어올 수 있을 만한 case를 분류해주었더니 성공했다!
### 3. Lv.up
1. 힙 사용</code></pre><p>import heapq
list = [1, 2, 3, 4, 5]
heapq.heapify(list)</p>
<pre><code>2. max heap 사용</code></pre><p>import heapq
list = [1, 2, 3, 4, 5]
heap = [-num for num in list]
heap.heapify(heap)
max_val = -heapq.heappop(heap)</p>
<pre><code>### 4. Ref.</code></pre><p>import heapq as hq</p>
<p>def solution(scoville, K):</p>
<pre><code>hq.heapify(scoville)
answer = 0
while True:
    first = hq.heappop(scoville)
    if first &gt;= K:
        break
    if len(scoville) == 0:
        return -1
    second = hq.heappop(scoville)
    hq.heappush(scoville, first + second*2)
    answer += 1  

return answer</code></pre><pre><code>- 그냥 while True해도 되는구나.. 이걸보니 내가 해결해주지못한건 처음에list값에 아무것도 안들어왔을 때 이구나 라는 걸 알 수 있다. 


</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[Priority Queue & Heap]]></title>
            <link>https://velog.io/@uwol-is-june/Priority-Queue-Heap</link>
            <guid>https://velog.io/@uwol-is-june/Priority-Queue-Heap</guid>
            <pubDate>Fri, 23 Jun 2023 10:43:17 GMT</pubDate>
            <description><![CDATA[<h3 id="priority-queue">Priority Queue?</h3>
<ul>
<li>우선순위가 가장 높은 데이터를 가장 먼저 삭제하는 자료구조.</li>
</ul>
<h3 id="구현방법">구현방법</h3>
<h4 id="1-list-이용">1. List 이용</h4>
<ul>
<li>insert time : O(1)</li>
<li>delete time : O(N)<h4 id="2-heap-이용">2. Heap 이용</h4>
</li>
<li>insert time : O(logN)</li>
<li>delete time : O(logN)</li>
</ul>
<h3 id="heap">Heap</h3>
<ul>
<li>max heap, min heap 으로 나뉨</li>
<li>완전 이진 트리 (왼쪽에서 오른쪽으로 데이터 insert)</li>
</ul>
<h3 id="python-라이브러리-사용">Python 라이브러리 사용</h3>
<pre><code>import heapq

def heap(res):
    h = []
    result = []

    for value in res:
        heapq.heappush(h, value)
    for i in range(len(h)):
        result.append(heap.heappop(h))
    return result</code></pre><ul>
<li>파이썬의 기본 heap 은 min heap</li>
<li>max heap은 - 붙어야 함</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[프로그래머스 Lv.1 [1차] 비밀지도]]></title>
            <link>https://velog.io/@uwol-is-june/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-Lv.1-1%EC%B0%A8-%EB%B9%84%EB%B0%80%EC%A7%80%EB%8F%84</link>
            <guid>https://velog.io/@uwol-is-june/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-Lv.1-1%EC%B0%A8-%EB%B9%84%EB%B0%80%EC%A7%80%EB%8F%84</guid>
            <pubDate>Wed, 21 Jun 2023 15:09:38 GMT</pubDate>
            <description><![CDATA[<h3 id="1-문제">1. 문제</h3>
<p>네오는 평소 프로도가 비상금을 숨겨놓는 장소를 알려줄 비밀지도를 손에 넣었다. 그런데 이 비밀지도는 숫자로 암호화되어 있어 위치를 확인하기 위해서는 암호를 해독해야 한다. 다행히 지도 암호를 해독할 방법을 적어놓은 메모도 함께 발견했다.</p>
<ol>
<li>지도는 한 변의 길이가 n인 정사각형 배열 형태로, 각 칸은 &quot;공백&quot;(&quot; &quot;) 또는 &quot;벽&quot;(&quot;#&quot;) 두 종류로 이루어져 있다.</li>
<li>전체 지도는 두 장의 지도를 겹쳐서 얻을 수 있다. 각각 &quot;지도 1&quot;과 &quot;지도 2&quot;라고 하자. 지도 1 또는 지도 2 중 어느 하나라도 벽인 부분은 전체 지도에서도 벽이다. 지도 1과 지도 2에서 모두 공백인 부분은 전체 지도에서도 공백이다.</li>
<li>&quot;지도 1&quot;과 &quot;지도 2&quot;는 각각 정수 배열로 암호화되어 있다.</li>
<li>암호화된 배열은 지도의 각 가로줄에서 벽 부분을 1, 공백 부분을 0으로 부호화했을 때 얻어지는 이진수에 해당하는 값의 배열이다.
<img src="https://velog.velcdn.com/images/uwol-is-june/post/74be2cac-ac73-46ab-b6a4-43899a8a8fc8/image.png" alt="">
<img src="https://velog.velcdn.com/images/uwol-is-june/post/9311399c-3926-4ad1-bd73-5d4ec232fb17/image.png" alt="">
네오가 프로도의 비상금을 손에 넣을 수 있도록, 비밀지도의 암호를 해독하는 작업을 도와줄 프로그램을 작성하라.</li>
</ol>
<ul>
<li><p>입력형식
입력으로 지도의 한 변 크기 n 과 2개의 정수 배열 arr1, arr2가 들어온다.
1 ≦ n ≦ 16
arr1, arr2는 길이 n인 정수 배열로 주어진다.
정수 배열의 각 원소 x를 이진수로 변환했을 때의 길이는 n 이하이다. 즉, 0 ≦ x ≦ 2n - 1을 만족한다.</p>
</li>
<li><p>출력형식
원래의 비밀지도를 해독하여 &#39;#&#39;, 공백으로 구성된 문자열 배열로 출력하라.</p>
<h3 id="2-풀이">2. 풀이</h3>
<h4 id="1차-시도성공">1차 시도(성공)</h4>
<pre><code>def solution(n, arr1, arr2):
  answer = []
  bin_arr1 = 0
  bin_arr2 = 0
  bin_arr = 0
  line_str = &quot;&quot;
  for i in range(0, n):
      for j in range(0, n):
          bin_arr1 = arr1[i] % 2
          bin_arr2 = arr2[i] % 2
          arr1[i] = arr1[i] // 2
          arr2[i] = arr2[i] // 2
          if bin_arr1 + bin_arr2 == 0:
              line_str = &#39; &#39;+line_str
          else :
              line_str = &#39;#&#39;+line_str
          bin_arr1 = 0
          bin_arr2 = 0
      answer.append(line_str)
      line_str = &#39;&#39;

  return answer</code></pre></li>
<li><p>역시 실전 코테 문제들은 다 빡구현... 쉽지 않다..</p>
<h3 id="3-lvup">3. Lv.up</h3>
</li>
</ul>
<ol>
<li>2진수 변환<pre><code>bin(x)</code></pre></li>
</ol>
<h3 id="4-ref">4. Ref.</h3>
<pre><code>def solution(n, arr1, arr2):
    answer = []
    for i,j in zip(arr1,arr2):
        a12 = str(bin(i|j)[2:])
        a12=a12.rjust(n,&#39;0&#39;)
        a12=a12.replace(&#39;1&#39;,&#39;#&#39;)
        a12=a12.replace(&#39;0&#39;,&#39; &#39;)
        answer.append(a12)
    return answer</code></pre><ul>
<li>와... rjust() 오른쪽 정렬해서 출력하는 함수가 있었구나.. 진짜 어지럽다.</li>
<li>str로 바꿔서 그냥 replace했네... 대단하다..</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[프로그래머스 Lv.1 숫자 문자열과 영단어]]></title>
            <link>https://velog.io/@uwol-is-june/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-Lv.1</link>
            <guid>https://velog.io/@uwol-is-june/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-Lv.1</guid>
            <pubDate>Wed, 21 Jun 2023 14:13:27 GMT</pubDate>
            <description><![CDATA[<h3 id="1-문제">1. 문제</h3>
<p>네오와 프로도가 숫자놀이를 하고 있습니다. 네오가 프로도에게 숫자를 건넬 때 일부 자릿수를 영단어로 바꾼 카드를 건네주면 프로도는 원래 숫자를 찾는 게임입니다.</p>
<p>다음은 숫자의 일부 자릿수를 영단어로 바꾸는 예시입니다.</p>
<p>1478 → &quot;one4seveneight&quot;
234567 → &quot;23four5six7&quot;
10203 → &quot;1zerotwozero3&quot;
이렇게 숫자의 일부 자릿수가 영단어로 바뀌어졌거나, 혹은 바뀌지 않고 그대로인 문자열 s가 매개변수로 주어집니다. s가 의미하는 원래 숫자를 return 하도록 solution 함수를 완성해주세요.</p>
<p>참고로 각 숫자에 대응되는 영단어는 다음 표와 같습니다.
<img src="https://velog.velcdn.com/images/uwol-is-june/post/8a32cb22-9478-40a2-98e5-b3a4200deb3b/image.png" alt=""></p>
<ul>
<li>제한사항
1 ≤ s의 길이 ≤ 50
s가 &quot;zero&quot; 또는 &quot;0&quot;으로 시작하는 경우는 주어지지 않습니다.
return 값이 1 이상 2,000,000,000 이하의 정수가 되는 올바른 입력만 s로 주어집니다.</li>
</ul>
<h3 id="2-풀이">2. 풀이</h3>
<h4 id="1차-시도성공">1차 시도(성공)</h4>
<pre><code>def solution(s):
    answer = &quot;&quot;
    all_len = len(s)
    for i in range(0, all_len):
        if all_len == 0:
            break
        if s.startswith(&#39;ze&#39;):
            answer += &#39;0&#39;
            s = s[4:]
            all_len -= 4
        elif s.startswith(&#39;on&#39;):
            answer += &#39;1&#39;
            s = s[3:]
            all_len -= 3
        elif s.startswith(&#39;tw&#39;):
            answer += &#39;2&#39;
            s = s[3:]
            all_len -= 3
        elif s.startswith(&#39;th&#39;):
            answer += &#39;3&#39;
            s = s[5:]
            all_len -= 5
        elif s.startswith(&#39;fo&#39;):
            answer += &#39;4&#39;
            s = s[4:]
            all_len -= 4
        elif s.startswith(&#39;fi&#39;):
            answer += &#39;5&#39;
            s = s[4:]
            all_len -= 4
        elif s.startswith(&#39;si&#39;):
            answer += &#39;6&#39;
            s = s[3:]
            all_len -= 3
        elif s.startswith(&#39;se&#39;):
            answer += &#39;7&#39;
            s = s[5:]
            all_len -= 5
        elif s.startswith(&#39;ei&#39;):
            answer += &#39;8&#39;
            s = s[5:]
            all_len -= 5
        elif s.startswith(&#39;ni&#39;):
            answer += &#39;9&#39;
            s = s[4:]
            all_len -= 4
        else  :
            answer += str(s[0])
            s = s[1:]
            all_len -= 1

    ans_int = int(answer)
    return ans_int</code></pre><h3 id="3-lvup">3. Lv.up</h3>
<h3 id="4-ref">4. Ref.</h3>
<pre><code>num_dic = {&quot;zero&quot;:&quot;0&quot;, &quot;one&quot;:&quot;1&quot;, &quot;two&quot;:&quot;2&quot;, &quot;three&quot;:&quot;3&quot;, &quot;four&quot;:&quot;4&quot;, &quot;five&quot;:&quot;5&quot;, &quot;six&quot;:&quot;6&quot;, &quot;seven&quot;:&quot;7&quot;, &quot;eight&quot;:&quot;8&quot;, &quot;nine&quot;:&quot;9&quot;}

def solution(s):
    answer = s
    for key, value in num_dic.items():
        answer = answer.replace(key, value)
    return int(answer)</code></pre><ul>
<li>와.. 해시 만들어서 replace 썼네.. 이런 생각들은 참 대단하다.. </li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[네이버 부스트 캠프 8기 1차 코딩 테스트 후기]]></title>
            <link>https://velog.io/@uwol-is-june/%EB%84%A4%EC%9D%B4%EB%B2%84-%EB%B6%80%EC%8A%A4%ED%8A%B8-%EC%BA%A0%ED%94%84-8%EA%B8%B0-1%EC%B0%A8-%EC%BD%94%EB%94%A9-%ED%85%8C%EC%8A%A4%ED%8A%B8-%ED%9B%84%EA%B8%B0</link>
            <guid>https://velog.io/@uwol-is-june/%EB%84%A4%EC%9D%B4%EB%B2%84-%EB%B6%80%EC%8A%A4%ED%8A%B8-%EC%BA%A0%ED%94%84-8%EA%B8%B0-1%EC%B0%A8-%EC%BD%94%EB%94%A9-%ED%85%8C%EC%8A%A4%ED%8A%B8-%ED%9B%84%EA%B8%B0</guid>
            <pubDate>Wed, 21 Jun 2023 08:44:16 GMT</pubDate>
            <description><![CDATA[<h3 id="1차-코딩테스트-후기">1차 코딩테스트 후기</h3>
<ul>
<li>본인은 비전공자로 시험을 치뤘다.</li>
<li>정확히 하자면 완전 비전공자는 아님.(로봇공학 전공)</li>
<li>문제는 일단 알고리즘 두문제랑  CS 10문제가 나왔다.</li>
<li>본인은 CS를 거의 모르기에 대충 찍어 넘기고, 알고리즘 풀이를 진행했다.</li>
<li>첫번째문제 하다가, 30분정도 지나서 막히길래 CS 먼저 풀고 나니  1시간정도가 남았었다. 그렇게 진입한 두번째 문제.</li>
<li>내용 이해가 조금 어려웠지만..(내가 능지가 부족한가..) 이해하고 나니 구현은 쉬웠던 문제였다. </li>
<li>다만 예외 처리 할게 좀 많아서 시간이 좀 걸렸다.</li>
<li>그래서 대충 내 능지 선에서... 두번째 문제는 예외처리까지 다 한것 같다.. 아마..?</li>
<li>몰라... 코딩 어려워...</li>
<li>다행히...... 합격....!
<img src="https://velog.velcdn.com/images/uwol-is-june/post/52c97477-53eb-48f4-83e0-0e815f549501/image.png" alt=""></li>
<li>다른 후기 찾아보니 2차는 거의 다풀어야 붙는다고 하니까 의욕이 점점 떨어진다.. 시간상 프로그래머스 1, 2단계 문제도 다 못풀고 들어갈 것같은데.. 일단 그래도 다행인건 나같은 비전공자도 코드 짤 수 있도록 알고리즘 공부가 필요한 요소는 많이 없었다! </li>
<li>거의 그냥 구현..? 아님 다른 쉬운 알고리즘 방법이 있었을 수도... 쨋든...! 2차 고생합시다..! </li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[프로그래머스 Lv.1 크기가 작은 부분문자열]]></title>
            <link>https://velog.io/@uwol-is-june/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-Lv.1-%ED%81%AC%EA%B8%B0%EA%B0%80-%EC%9E%91%EC%9D%80-%EB%B6%80%EB%B6%84%EB%AC%B8%EC%9E%90%EC%97%B4</link>
            <guid>https://velog.io/@uwol-is-june/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-Lv.1-%ED%81%AC%EA%B8%B0%EA%B0%80-%EC%9E%91%EC%9D%80-%EB%B6%80%EB%B6%84%EB%AC%B8%EC%9E%90%EC%97%B4</guid>
            <pubDate>Mon, 19 Jun 2023 03:54:31 GMT</pubDate>
            <description><![CDATA[<h3 id="1-문제">1. 문제</h3>
<p>숫자로 이루어진 문자열 t와 p가 주어질 때, t에서 p와 길이가 같은 부분문자열 중에서, 이 부분문자열이 나타내는 수가 p가 나타내는 수보다 작거나 같은 것이 나오는 횟수를 return하는 함수 solution을 완성하세요.</p>
<p>예를 들어, t=&quot;3141592&quot;이고 p=&quot;271&quot; 인 경우, t의 길이가 3인 부분 문자열은 314, 141, 415, 159, 592입니다. 이 문자열이 나타내는 수 중 271보다 작거나 같은 수는 141, 159 2개 입니다.</p>
<ul>
<li><p>제한사항
1 ≤ p의 길이 ≤ 18
p의 길이 ≤ t의 길이 ≤ 10,000
t와 p는 숫자로만 이루어진 문자열이며, 0으로 시작하지 않습니다</p>
<h3 id="2-풀이">2. 풀이</h3>
<h4 id="1차-시도성공">1차 시도(성공)</h4>
<pre><code>def solution(t, p):
  answer = 0
  cut_len = len(p)
  answer_list = []
  for i in range(0, len(t) - len(p)+1):
      if int(t[i:i+cut_len]) &lt;= int(p):
          answer_list.append(int(t[i:i+cut_len]))
  answer = len(answer_list)
  return answer</code></pre></li>
<li><p>단순 구현...</p>
<h3 id="3-lvup">3. Lv.up</h3>
<h3 id="4-ref">4. Ref.</h3>
<pre><code>def solution(t, p):
  answer = 0

  for i in range(len(t) - len(p) + 1):
      if int(p) &gt;= int(t[i:i+len(p)]):
          answer += 1

  return answer</code></pre></li>
<li><p>조금더 간단하게 구현했지면 결국 똑같음</p>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[프로그래머스 Lv.1 최소직사각형]]></title>
            <link>https://velog.io/@uwol-is-june/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-Lv.1-%EC%B5%9C%EC%86%8C%EC%A7%81%EC%82%AC%EA%B0%81%ED%98%95</link>
            <guid>https://velog.io/@uwol-is-june/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-Lv.1-%EC%B5%9C%EC%86%8C%EC%A7%81%EC%82%AC%EA%B0%81%ED%98%95</guid>
            <pubDate>Mon, 19 Jun 2023 03:35:35 GMT</pubDate>
            <description><![CDATA[<h3 id="1-문제">1. 문제</h3>
<p>명함 지갑을 만드는 회사에서 지갑의 크기를 정하려고 합니다. 다양한 모양과 크기의 명함들을 모두 수납할 수 있으면서, 작아서 들고 다니기 편한 지갑을 만들어야 합니다. 이러한 요건을 만족하는 지갑을 만들기 위해 디자인팀은 모든 명함의 가로 길이와 세로 길이를 조사했습니다.</p>
<p>아래 표는 4가지 명함의 가로 길이와 세로 길이를 나타냅니다.
<img src="https://velog.velcdn.com/images/uwol-is-june/post/6f4c6813-16e3-4a0c-b90d-987fe303bb72/image.png" alt="">
가장 긴 가로 길이와 세로 길이가 각각 80, 70이기 때문에 80(가로) x 70(세로) 크기의 지갑을 만들면 모든 명함들을 수납할 수 있습니다. 하지만 2번 명함을 가로로 눕혀 수납한다면 80(가로) x 50(세로) 크기의 지갑으로 모든 명함들을 수납할 수 있습니다. 이때의 지갑 크기는 4000(=80 x 50)입니다.</p>
<p>모든 명함의 가로 길이와 세로 길이를 나타내는 2차원 배열 sizes가 매개변수로 주어집니다. 모든 명함을 수납할 수 있는 가장 작은 지갑을 만들 때, 지갑의 크기를 return 하도록 solution 함수를 완성해주세요.</p>
<ul>
<li>제한사항
sizes의 길이는 1 이상 10,000 이하입니다.
sizes의 원소는 [w, h] 형식입니다.
w는 명함의 가로 길이를 나타냅니다.
h는 명함의 세로 길이를 나타냅니다.
w와 h는 1 이상 1,000 이하인 자연수입니다.<h3 id="2-풀이">2. 풀이</h3>
<h4 id="1차-시도성공">1차 시도(성공)</h4>
<pre><code>def solution(sizes):
  max_arr = []
  min_arr = []
  answer = 0
  for i in range(0, len(sizes)):
      if sizes[i][0] &gt;= sizes[i][1]:
          max_arr.append(sizes[i][0])
          min_arr.append(sizes[i][1])
      else:
          max_arr.append(sizes[i][1])
          min_arr.append(sizes[i][0])
  answer = max(max_arr) * max(min_arr)
  return answer</code></pre></li>
<li>가벼운 구현 문제<h3 id="3-lvup">3. Lv.up</h3>
<h3 id="4-ref">4. Ref.</h3>
<pre><code>def solution(sizes):
  return max(max(x) for x in sizes) * max(min(x) for x in sizes)</code></pre></li>
<li>한줄..</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[프로그래머스 Lv.1 시저 암호]]></title>
            <link>https://velog.io/@uwol-is-june/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-Lv.1-%EC%8B%9C%EC%A0%80-%EC%95%94%ED%98%B8</link>
            <guid>https://velog.io/@uwol-is-june/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-Lv.1-%EC%8B%9C%EC%A0%80-%EC%95%94%ED%98%B8</guid>
            <pubDate>Fri, 16 Jun 2023 14:58:15 GMT</pubDate>
            <description><![CDATA[<h3 id="1-문제">1. 문제</h3>
<p>어떤 문장의 각 알파벳을 일정한 거리만큼 밀어서 다른 알파벳으로 바꾸는 암호화 방식을 시저 암호라고 합니다. 예를 들어 &quot;AB&quot;는 1만큼 밀면 &quot;BC&quot;가 되고, 3만큼 밀면 &quot;DE&quot;가 됩니다. &quot;z&quot;는 1만큼 밀면 &quot;a&quot;가 됩니다. 문자열 s와 거리 n을 입력받아 s를 n만큼 민 암호문을 만드는 함수, solution을 완성해 보세요.</p>
<ul>
<li>제한사항
공백은 아무리 밀어도 공백입니다.
s는 알파벳 소문자, 대문자, 공백으로만 이루어져 있습니다.
s의 길이는 8000이하입니다.
n은 1 이상, 25이하인 자연수입니다.<h3 id="2-풀이">2. 풀이</h3>
<h4 id="1차-시도실패">1차 시도(실패)</h4>
<pre><code>def solution(s, n):
  answer = &#39;&#39;
  # ASCII 저장할 변수
  tmp = 0
  for i in range(0, len(s)):
      # 공백일때
      if s[i] == &#39; &#39;:
          answer += &#39; &#39;
          continue
      # 소문자 일때
      if s[i].islower:
          tmp = ord(s[i]) + n
          # z를 넘어가면 a로 돌리기
          if tmp &gt; 122:
              tmp -= 26
          answer += chr(tmp)
      elif s[i].isupper:
          tmp = ord([i]) + n
          # Z를 넘어가면 A로 돌리기
          if tmp &gt; 90:
              tmp -= 26
          answer += chr(tmp)
  return answer</code></pre></li>
<li>테스트 케이스 일부에서 계속 실패가 뜬다.<h4 id="2차-시도-성공">2차 시도 (성공)</h4>
<pre><code>def solution(s, n):
  answer = &#39;&#39;
  # ASCII 저장할 변수
  tmp = 0
  for i in range(0, len(s)):
      # 공백일때
      if s[i] == &#39; &#39;:
          answer += &#39; &#39;
          continue
      # 소문자 일때
      if s[i].islower():
          tmp = ord(s[i]) + n
          # z를 넘어가면 a로 돌리기
          if tmp &gt; 122:
              tmp -= 26
          answer += chr(tmp)
      elif s[i].isupper():
          tmp = ord(s[i]) + n
          # Z를 넘어가면 A로 돌리기
          if tmp &gt; 90:
              tmp -= 26
          answer += chr(tmp)
  return answer</code></pre></li>
<li>억장 무너지네. islower()이렇게 선언해야한다.</li>
<li>()이거 꼭 있어야한다.</li>
<li>근데 왜 에러가 안떴지?<h3 id="3-lvup">3. Lv.up</h3>
</li>
</ul>
<ol>
<li>문자 to ASCII
<code>ord(&#39;A&#39;)</code></li>
<li>ASCII to 문자
<code>chr(45)</code></li>
</ol>
<h3 id="4-ref">4. Ref.</h3>
<pre><code>def caesar(s, n):
    s = list(s)
    for i in range(len(s)):
        if s[i].isupper():
            s[i]=chr((ord(s[i])-ord(&#39;A&#39;)+ n)%26+ord(&#39;A&#39;))
        elif s[i].islower():
            s[i]=chr((ord(s[i])-ord(&#39;a&#39;)+ n)%26+ord(&#39;a&#39;))

    return &quot;&quot;.join(s)</code></pre><ul>
<li>내가 고민했던 부분도 추가되어있다. 만약 반복횟수가 여러번일때의 예외처리를 해놓았다. </li>
<li>내가 고민만하고 구현은 안한 이유는 제한사항에서 n을 25로 제한했기 때문이다.</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[프로그래머스 Lv.1 삼총사]]></title>
            <link>https://velog.io/@uwol-is-june/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-Lv.1-%EC%82%BC%EC%B4%9D%EC%82%AC</link>
            <guid>https://velog.io/@uwol-is-june/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-Lv.1-%EC%82%BC%EC%B4%9D%EC%82%AC</guid>
            <pubDate>Thu, 15 Jun 2023 06:57:39 GMT</pubDate>
            <description><![CDATA[<h3 id="1-문제">1. 문제</h3>
<p>한국중학교에 다니는 학생들은 각자 정수 번호를 갖고 있습니다. 이 학교 학생 3명의 정수 번호를 더했을 때 0이 되면 3명의 학생은 삼총사라고 합니다. 예를 들어, 5명의 학생이 있고, 각각의 정수 번호가 순서대로 -2, 3, 0, 2, -5일 때, 첫 번째, 세 번째, 네 번째 학생의 정수 번호를 더하면 0이므로 세 학생은 삼총사입니다. 또한, 두 번째, 네 번째, 다섯 번째 학생의 정수 번호를 더해도 0이므로 세 학생도 삼총사입니다. 따라서 이 경우 한국중학교에서는 두 가지 방법으로 삼총사를 만들 수 있습니다.</p>
<p>한국중학교 학생들의 번호를 나타내는 정수 배열 number가 매개변수로 주어질 때, 학생들 중 삼총사를 만들 수 있는 방법의 수를 return 하도록 solution 함수를 완성하세요.</p>
<ul>
<li><p>제한사항
3 ≤ number의 길이 ≤ 13</p>
</li>
<li><p>1,000 ≤ number의 각 원소 ≤ 1,000
서로 다른 학생의 정수 번호가 같을 수 있습니다.</p>
<h3 id="2-풀이">2. 풀이</h3>
<h4 id="1차-시도실패">1차 시도(실패)</h4>
</li>
<li><p>for문 하나로 해보려고했으나, 실패함</p>
</li>
<li><p>쉬운 문제니까 3중 for문,,?</p>
<h4 id="2차-시도성공">2차 시도(성공)</h4>
<pre><code>def solution(number):
  answer = 0

  for i in range(0, len(number)-2):
      for j in range(i+1, len(number)-1):
          for k in range(j+1, len(number)):
              if number[i] + number[j] + number[k] == 0:
                  answer += 1
  return answer</code></pre></li>
<li><p>시간제한이 없는 간단한 문제였다.</p>
</li>
<li><p>허무하다</p>
<h3 id="3-lvup">3. Lv.up</h3>
<h3 id="4-ref">4. Ref.</h3>
<pre><code>def solution (number) :
  from itertools import combinations
  cnt = 0
  for i in combinations(number,3) :
      if sum(i) == 0 :
          cnt += 1
  return cnt</code></pre></li>
<li><p>와,, combinations가 있다니.... 참... 허무하다... 알아두자</p>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[프로그래머스 Lv.1 예산]]></title>
            <link>https://velog.io/@uwol-is-june/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-Lv.1-%EC%98%88%EC%82%B0</link>
            <guid>https://velog.io/@uwol-is-june/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-Lv.1-%EC%98%88%EC%82%B0</guid>
            <pubDate>Thu, 15 Jun 2023 06:05:21 GMT</pubDate>
            <description><![CDATA[<h3 id="1-문제">1. 문제</h3>
<p>S사에서는 각 부서에 필요한 물품을 지원해 주기 위해 부서별로 물품을 구매하는데 필요한 금액을 조사했습니다. 그러나, 전체 예산이 정해져 있기 때문에 모든 부서의 물품을 구매해 줄 수는 없습니다. 그래서 최대한 많은 부서의 물품을 구매해 줄 수 있도록 하려고 합니다.</p>
<p>물품을 구매해 줄 때는 각 부서가 신청한 금액만큼을 모두 지원해 줘야 합니다. 예를 들어 1,000원을 신청한 부서에는 정확히 1,000원을 지원해야 하며, 1,000원보다 적은 금액을 지원해 줄 수는 없습니다.</p>
<p>부서별로 신청한 금액이 들어있는 배열 d와 예산 budget이 매개변수로 주어질 때, 최대 몇 개의 부서에 물품을 지원할 수 있는지 return 하도록 solution 함수를 완성해주세요.</p>
<ul>
<li>제한사항
d는 부서별로 신청한 금액이 들어있는 배열이며, 길이(전체 부서의 개수)는 1 이상 100 이하입니다.
d의 각 원소는 부서별로 신청한 금액을 나타내며, 부서별 신청 금액은 1 이상 100,000 이하의 자연수입니다.
budget은 예산을 나타내며, 1 이상 10,000,000 이하의 자연수입니다.<h3 id="2-풀이">2. 풀이</h3>
<h4 id="1차-시도성공">1차 시도(성공)</h4>
<pre><code>def solution(d, budget):
  d.sort()
  answer = 0
  summ = 0
  # sort한 d를 for로 돈다
  for i in range(0, len(d)):
      # summ에 d를 더한다
      summ += d[i]
      # 만약 더했는데, budget보다 넘어가면 그 개수로 반복문을 탈출한다.
      if summ &gt; budget:
          answer = i
          break
      # 더했는데 안넘어가면 개수를 answer에 넣고 반복문을 계손 돈다.
      else :
          answer = i+1
  return answer</code></pre></li>
<li>큰 기교없이 구현으로 풀어낸 문제이다.</li>
<li>생각을 정리하기위해 주석을 적으면서 진행했다.<h3 id="3-lvup">3. Lv.up</h3>
<h3 id="4-ref">4. Ref.</h3>
<pre><code>def solution(d, budget):
  d.sort()
  while budget &lt; sum(d):
      d.pop()
  return len(d)</code></pre></li>
<li>d에서 원소를 제거한 후 sum으로 budget과 비교했다.</li>
<li>sort해서 작은 수부터 카운트 하자는 건 내가 짠 생각과 똑같지만 이후에 활용도에서 차이가 났다.</li>
</ul>
]]></description>
        </item>
    </channel>
</rss>