<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>east_huni.log</title>
        <link>https://velog.io/</link>
        <description>성실함 한스쿱</description>
        <lastBuildDate>Sun, 03 Aug 2025 06:07:45 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>east_huni.log</title>
            <url>https://velog.velcdn.com/images/east_huni/profile/373c1a4b-affe-438e-8304-b88726f341b1/image.jpg</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. east_huni.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/east_huni" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[LG Aimers - 팀원들을 위한 가이드라인]]></title>
            <link>https://velog.io/@east_huni/LG-Aimers-%ED%8C%80%EC%9B%90%EB%93%A4%EC%9D%84-%EC%9C%84%ED%95%9C-%EA%B0%80%EC%9D%B4%EB%93%9C%EB%9D%BC%EC%9D%B8</link>
            <guid>https://velog.io/@east_huni/LG-Aimers-%ED%8C%80%EC%9B%90%EB%93%A4%EC%9D%84-%EC%9C%84%ED%95%9C-%EA%B0%80%EC%9D%B4%EB%93%9C%EB%9D%BC%EC%9D%B8</guid>
            <pubDate>Sun, 03 Aug 2025 06:07:45 GMT</pubDate>
            <description><![CDATA[<p>지금 당장은 어떤 모델 사용해서 앙상블 할지, 뭐 Xgboost + lstm 모델 앙상블 하자 뭐 이런 모델 관련 이야기는 <strong>전체 데이터 셋을 구성하고 나서</strong> 모델을 나눠서 돌려보고 더 성능 좋은 걸로 제출하면 될 거 같고요. 사실상 어떤 시계열모델 쓰고, 하이퍼 파라미터 최적화해서 성능 높이는 건 <strong>데이터가 어느 정도 갖춰진 상태여야 전체 모델 성능이 어느 정도 좋아집니다</strong>. 그냥 데이터 전처리 안 하고 그대로 갖다 써서 <strong>모델만 바꿔서 하이퍼 파라미터 최적화 하면, 성능 개미 눈곱 정도 차이</strong>밖에 없어요.</p>
<p>제가 방향 제시 드리는건, 결국 <strong>데이터를 어떻게 가공하냐</strong>가 <strong>성능에 제일 중요한 지표</strong>라는 점이고.</p>
<p>예를 들어서 아래 그래프를 보시면 파란색(4번 쇼핑몰의 판매량) , 빨간색(10번 쇼핑몰의 판매량) 입니다.</p>
<p>Y 축은 판매금액(판매량) 이라고 보시면 될거 같고, X 축은 Date 라고 보시면 될거같아요.</p>
<p><img src="https://velog.velcdn.com/images/east_huni/post/256fabc9-64b1-4f9b-ae6a-54e2ac7afdf9/image.png" alt=""></p>
<p>실제로 이 팀은 시계열 데이터를 다루는데 4번 쇼핑몰 매출이 있었다가 400일 이후엔 아예 없어진 부분과</p>
<p>10번 쇼핑몰에는 그전에는 매출이 하나도 없었다가 400일 기준으로 매출이 생긴 걸 고려해서</p>
<p>생각해낸 <strong>Insight</strong>가 <strong>특정 제품을 판매하는 쇼핑몰이 4번 쇼핑몰에서 10번 쇼핑몰로 바뀌었다</strong>.</p>
<p><strong>라는 가설을 세워</strong>서 두 쇼핑몰을 합쳐서 하나의 쇼핑몰로 생각해 데이터 프레임을 만들었어요. </p>
<p><strong>데이터 전처리 방법</strong>은 다양해요. 지금 적은 거 외에도 더 있을걸요? (찾아보시길)</p>
<p>결측치 처리 → 0 값을 제거할 수도 있고, 최빈값, 평균값 등등으로 값을 바꿀 수도 있어요</p>
<p>이상치 처리 → 튀는 값들을 제거하거나. 결측치처리와 비슷하게 값을 처리하는 방법</p>
<p>파생 변수 생성 → 제가 앞서 말씀드린 것처럼 저희 데이터의 ‘영업 일자’ 칼럼을 활용해서 1번 DF에 독립변수를 추가해서 2번처럼 만드는 거예요. ex) 공휴일, 요일 칼럼 추가</p>
<p><img src="https://velog.velcdn.com/images/east_huni/post/d7dea4da-c9ea-40d9-85bb-539008e7a36c/image.png" alt=""></p>
<p>데이터 프레임을 다루기 힘드시면 gpt한테 코드 짜달라고 하고 결과만 보시고 여러분들의 생각만 넣으면 됩니다. ex) 나 이 데이터 셋으로 월별 매출량 보고 싶어, 일별 매출량 보고 싶어, 매출 수량이 0 인 게 얼마나 있는지 확인하고 싶어</p>
<p>해보진 않았지만 아마 단계별로 설명 잘해줄 거예요.</p>
<p>이번 해커톤으로 치면,</p>
<p><img src="https://velog.velcdn.com/images/east_huni/post/c0b3c164-fd9c-48cb-b0f2-f8d735fa4b03/image.png" alt=""></p>
<p>각 업장별 일별 매출량을 그래프로 한눈에 볼 수 있고요.</p>
<p>제일 좋은 방법은 저렇게 시각화해서 자기가 생각하는 인사이트를 찾는 게 중요할 거 같아요.</p>
<p>시간별로 한눈에 보기 편하니까?</p>
<p>화이팅입니다.</p>
<p><strong>아 그리고 너무 힘드시면, 굳이 코드로 안 만들어와도 돼요.</strong></p>
<p><strong>그냥 생각하는 거 이렇게 가공해서 이런 칼럼 만들면 어때요?</strong> </p>
<ul>
<li><strong>Insight</strong> 가 젤 중요해요 ..</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[GitHub] 깃허브 명령어 정리]]></title>
            <link>https://velog.io/@east_huni/GitHub-%EA%B9%83%ED%97%88%EB%B8%8C-%EB%AA%85%EB%A0%B9%EC%96%B4-%EC%A0%95%EB%A6%AC</link>
            <guid>https://velog.io/@east_huni/GitHub-%EA%B9%83%ED%97%88%EB%B8%8C-%EB%AA%85%EB%A0%B9%EC%96%B4-%EC%A0%95%EB%A6%AC</guid>
            <pubDate>Thu, 10 Jul 2025 12:38:14 GMT</pubDate>
            <description><![CDATA[<h3 id="git-bash-에서-환경설정-하기">git bash 에서 환경설정 하기</h3>
<ol>
<li><p>유저이름 설정</p>
<blockquote>
<p>git config --global user.name &quot;name&quot;</p>
</blockquote>
</li>
<li><p>유저 이메일 설정</p>
<blockquote>
<p>git config --global user.email &quot;email&quot; // </p>
</blockquote>
<p>GitHub 가입시 사용한 이메일로</p>
</li>
<li><p>정보 확인하기</p>
<blockquote>
<p>git config --list</p>
</blockquote>
</li>
</ol>
<h3 id="github에-처음-코드-입력">GitHub에 처음 코드 입력</h3>
<ol>
<li><p>초기화</p>
<blockquote>
<p>git init</p>
</blockquote>
</li>
<li><p>추가할 파일 더하기</p>
<blockquote>
<p>git add . </p>
</blockquote>
<p><strong>.(점)</strong> 은 모든파일을 의미, 선택적으로 하려면 add 뒤에 파일명 붙여주면됨.</p>
</li>
<li><p>상태 확인</p>
<blockquote>
<p>git status</p>
</blockquote>
</li>
<li><p>히스토리 만들기</p>
<blockquote>
<p>git commit -m &quot;message&quot; </p>
</blockquote>
<p>-m 은 메시지를 뜻함, &quot;&quot;안에 히스토리 이름 주면됨.</p>
</li>
<li><p>GitHub repository 랑 내 로컬 프로젝트랑 연결 </p>
<blockquote>
<p>git remote add origin &quot;<a href="https://github.com/&quot;">https://github.com/&quot;</a></p>
</blockquote>
<p>GitHub에서 복사해서 붙여넣기하면됨.</p>
</li>
<li><p>잘 연결됐는지 확인</p>
<blockquote>
<p>git remote -v</p>
</blockquote>
<p>내가 연결한 주소값이 잘 뜨면 성공!</p>
</li>
<li><p>GitHub로 올리기</p>
<blockquote>
<p>git push origin master</p>
</blockquote>
<p>master 자리에는 branch 이름이 들어가면 됨.</p>
</li>
</ol>
<h3 id="github에-계속-업데이트">GitHub에 계속 업데이트</h3>
<ol>
<li><p>추가할 파일 더하기</p>
<blockquote>
<p>git add .</p>
</blockquote>
</li>
<li><p>히스토리 만들기</p>
<blockquote>
<p>git commit -m &quot;commit&quot;</p>
</blockquote>
</li>
<li><p>GitHub로 올리기</p>
<blockquote>
<p>git push origin master</p>
</blockquote>
</li>
</ol>
<p>내 컴퓨터에 소스코드를 업데이트 하고 싶으면 이 <strong>세개의 스텝</strong>만 계속 반복하면 됨.</p>
<h3 id="github로-팀프로젝트-하기">GitHub로 팀프로젝트 하기</h3>
<ol>
<li><p>Github에서 소스코드 다운로드</p>
<blockquote>
<p>git clone 주소 폴더이름</p>
</blockquote>
</li>
<li><p>Github에서 내 브랜치(branch)만들기</p>
<blockquote>
<p>git checkout -b 브렌치이름</p>
</blockquote>
</li>
<li><p>내 브랜치에 소스코드 업데이트하기</p>
<blockquote>
<p>git add .
git commit -m &quot;commit&quot;
git push origin 브렌치이름</p>
</blockquote>
</li>
<li><p>마스터 브랜치에 소스 가져오기(pull)</p>
<blockquote>
<p>git pull origin master</p>
</blockquote>
</li>
<li><p>브랜치끼리 이동하는 법</p>
<blockquote>
<p>git checkout 브렌치이름</p>
</blockquote>
</li>
</ol>
<p>이렇게 쉬운데 이전에는 어려워 보여서 그냥 따로 정리하고 그랬었는데.. 미리미리 좀 하는법을 익혀둘 걸...
<strong>내 잔디</strong>.. 지금부터라도 1일 1 커밋 실천해봐야겠다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[빅데이터분석기사] 실기기출 6회(작업형2)]]></title>
            <link>https://velog.io/@east_huni/%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%EA%B8%B0%EC%B6%9C-6%ED%9A%8C%EC%9E%91%EC%97%85%ED%98%952</link>
            <guid>https://velog.io/@east_huni/%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%EA%B8%B0%EC%B6%9C-6%ED%9A%8C%EC%9E%91%EC%97%85%ED%98%952</guid>
            <pubDate>Tue, 24 Jun 2025 03:54:22 GMT</pubDate>
            <description><![CDATA[<h2 id="다중-분류-문제">다중 분류 문제</h2>
<ul>
<li><p>난방 부하 단계를 예측해주세요!</p>
</li>
<li><p>예측할 값(y): Heat_Load (Very Low, Low, Medium, High, Very High)</p>
</li>
<li><p>평가: f1-macro</p>
</li>
<li><p>data: train.csv, test.csv</p>
</li>
<li><p>제출 형식: result.csv파일을 아래와 같은 형식으로 제출</p>
<pre><code>pred
Very Low
Low
High
...
Very High</code></pre></li>
</ul>
<h3 id="답안-제출-참고">답안 제출 참고</h3>
<ul>
<li>pd.read_csv(&#39;result.csv&#39;) 로 제출 코드 확인<pre><code class="language-python"># 데이터 불러오기
import pandas as pd
train = pd.read_csv(&quot;&quot;)
test = pd.read_csv(&quot;&quot;)
</code></pre>
</li>
</ul>
<h1 id="데이터-크기-확인">데이터 크기 확인</h1>
<p>train.shape, test.shape</p>
<h1 id="train-샘플-확인">train 샘플 확인</h1>
<p>train.head(2)</p>
<h1 id="test-샘플-확인">test 샘플 확인</h1>
<p>test.head(1)</p>
<h1 id="type-확인">type 확인</h1>
<p>train.info()</p>
<p>train[&#39;Roof&#39;].value_counts()</p>
<h1 id="기초통계-trainobject">기초통계 train(object)</h1>
<p>train.describe(include=&#39;O&#39;)</p>
<h1 id="기초통계-testobject">기초통계 test(object)</h1>
<p>test.describe(include=&#39;O&#39;)</p>
<h1 id="결측치-확인train">결측치 확인(train)</h1>
<p>train.isnull().sum()</p>
<h1 id="결측치-확인test">결측치 확인(test)</h1>
<p>test.isnull().sum().sum()</p>
<h1 id="target-확인">target 확인</h1>
<p>train[&#39;Heat_Load&#39;].value_counts()</p>
<h1 id="target컬럼-처리">target컬럼 처리</h1>
<p>target = train.pop(&#39;Heat_Load&#39;)</p>
<h1 id="원핫-인코딩판다스">원핫 인코딩(판다스)</h1>
<p>print(train.shape, test.shape)
train = pd.get_dummies(train)
test = pd.get_dummies(test)
print(train.shape, test.shape)</p>
<p>from sklearn.model_selection import train_test_split
X_tr, X_val, y_tr, y_val = train_test_split(train,
                                            target,
                                            test_size=0.2,
                                            random_state=0)
X_tr.shape, X_val.shape, y_tr.shape, y_val.shape</p>
<h1 id="평가-함수">평가 함수</h1>
<p>from sklearn.metrics import f1_score</p>
<h1 id="랜덤포레스트">랜덤포레스트</h1>
<p>from sklearn.ensemble import RandomForestClassifier
rf = RandomForestClassifier(random_state=0)
rf.fit(X_tr, y_tr)
pred = rf.predict(X_val)</p>
<p>f1_score(y_val, pred, average=&#39;macro&#39;)</p>
<h1 id="lightgbm">LightGBM</h1>
<p>import lightgbm as lgb
lg = lgb.LGBMClassifier(random_state=0, verbose=-1)
lg.fit(X_tr, y_tr)
pred = lg.predict(X_val)</p>
<p>f1_score(y_val, pred, average=&#39;macro&#39;)</p>
<h1 id="test-예측">test 예측</h1>
<p>pred = rf.predict(test)
submit = pd.DataFrame({
    &#39;pred&#39;:pred
})
submit.to_csv(&#39;result.csv&#39;, index=False)</p>
<p>pd.read_csv(&quot;result.csv&quot;)
```</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[빅데이터분석기사] 실기기출 6회(작업형1)]]></title>
            <link>https://velog.io/@east_huni/%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%EA%B8%B0%EC%B6%9C-6%ED%9A%8C%EC%9E%91%EC%97%85%ED%98%951</link>
            <guid>https://velog.io/@east_huni/%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%EA%B8%B0%EC%B6%9C-6%ED%9A%8C%EC%9E%91%EC%97%85%ED%98%951</guid>
            <pubDate>Tue, 24 Jun 2025 03:50:33 GMT</pubDate>
            <description><![CDATA[<ol>
<li>주어진 데이터는 각 소방서의 출동/도착 시간데이터이다.
출동시간과 도착시간 차이가 평균적으로 가장 오래 걸린 소방서의 시간을 분으로 변환해 출력하시오. (반올림 후 정수 출력)<pre><code class="language-python">import pandas as pd
df = pd.read_csv()
df.head(2)
</code></pre>
</li>
</ol>
<h1 id="1-datetime">1. datetime</h1>
<p>df[&#39;출동시간&#39;] = pd.to_datetime(df[&#39;출동시간&#39;])
df[&#39;도착시간&#39;] = pd.to_datetime(df[&#39;도착시간&#39;])
df.info()</p>
<h1 id="2-도착---출동-분">2. 도착 - 출동 (분)</h1>
<p>df[&#39;diff&#39;] = df[&#39;도착시간&#39;] - df[&#39;출동시간&#39;]
df[&#39;diff&#39;] = df[&#39;diff&#39;].dt.total_seconds() / 60
df.head(2)</p>
<h1 id="3-소방서별-차이-평균">3. 소방서별 차이 평균</h1>
<p>result = df.groupby(&#39;소방서&#39;)[&#39;diff&#39;].mean()</p>
<h1 id="4-차이가-가장-큰-값">4. 차이가 가장 큰 값</h1>
<p>result.sort_values(ascending = False)[0]</p>
<pre><code>
2. 학교에서 교사 한 명당 맡은 학생 수가 가장 많은 학교를 찾고, 그 학교의 전체 교사 수를 구하시오. (정수 출력)
```python
import pandas as pd
df = pd.read_csv()
df.head(2)

# 1. 전체 학생수
df[&#39;전체&#39;] = df.iloc[:, 2:].sum(axis=1)
df.head(2)

# 2. 교사 한 명당 맡은 학생 수 (전체/교사)
df[&#39;전체/교사&#39;] = df[&#39;전체&#39;]/df[&#39;교사수&#39;]
df.head(2)

# 3. 전체 / 교사가 가장 큰 값을 가진 학교의 교사수
df[&#39;전체/교사&#39;].idxmax()

print(int(df.loc[7, &#39;교사수&#39;]))</code></pre><ol start="3">
<li>연도별로 총 범죄 건수(범죄유형의 총합)의 월평균 값을 구한 후 그 값이 가장 큰 연도를 찾아, 해당 연도의 총 범죄 건수의 월평균 값을 출력하시오. (반올림하여 정수로 출력)<pre><code class="language-python">import pandas as pd
df = pd.read_csv()
df.head(2)
</code></pre>
</li>
</ol>
<h1 id="1-총-범죄-건수">1. 총 범죄 건수</h1>
<p>df[&#39;총범죄&#39;] = df.iloc[:,1:-1].sum(axis=1)
df.head(2)</p>
<h1 id="2-연도">2. 연도</h1>
<p>df[&#39;연도&#39;] = df[&#39;날짜&#39;].str[:4]
df.head(2)</p>
<h1 id="3-연도별-그룹핑총범죄sum">3. 연도별 그룹핑(총범죄).sum()</h1>
<p>result = df.groupby(&quot;연도&quot;)[&#39;총범죄&#39;].sum()/12</p>
<h1 id="4-가장-큰-값">4. 가장 큰 값</h1>
<p>print(round(result.max()))
```</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[빅데이터분석기사] 실기기출 5회(작업형2)]]></title>
            <link>https://velog.io/@east_huni/%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%EA%B8%B0%EC%B6%9C-5%ED%9A%8C%EC%9E%91%EC%97%85%ED%98%952</link>
            <guid>https://velog.io/@east_huni/%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%EA%B8%B0%EC%B6%9C-5%ED%9A%8C%EC%9E%91%EC%97%85%ED%98%952</guid>
            <pubDate>Tue, 24 Jun 2025 03:45:51 GMT</pubDate>
            <description><![CDATA[<h1 id="작업형2">작업형2</h1>
<h2 id="가격-예측-중고-자동차">[가격 예측] 중고 자동차</h2>
<ul>
<li>자동차 가격을 예측해주세요!</li>
</ul>
<ul>
<li>예측할 값(y): price</li>
<li>평가: RMSE (Root Mean Squared Error)</li>
<li>data: train.csv, test.csv</li>
<li>제출 형식: result.csv파일을 아래와 같은 형식(수치형)으로 제출<pre><code>pred
11000
20500
19610
...
11995</code></pre></li>
</ul>
<h3 id="답안-제출-참고">답안 제출 참고</h3>
<ul>
<li>pd.read_csv(&#39;result.csv&#39;) 로 제출 코드 확인</li>
</ul>
<pre><code class="language-python"># 데이터 불러오기
import pandas as pd

train = pd.read_csv(&quot;&quot;)
test = pd.read_csv(&quot;&quot;)

# 데이터 크기 확인
train.shape, test.shape

# 샘플 확인 (시험환경에서는 display 대신 print 활용)
display(train.head(3))
display(test.head(3))

train.info()

# 기초 통계값 확인
train.describe()
test.describe()

train.describe(include=&#39;O&#39;)
test.describe(include=&#39;O&#39;)

test[&#39;transmission&#39;].value_counts()
train[&#39;price&#39;].hist()

display(train.isnull().sum())
display(test.isnull().sum())

y_train = train.pop(&quot;price&quot;)

cols = [&#39;year&#39;, &#39;mileage&#39;, &#39;tax&#39;, &#39;mpg&#39;, &#39;engineSize&#39;]
train = train[cols]
test = test[cols]

from sklearn.model_selection import train_test_split
X_tr, X_val, y_tr, y_val = train_test_split(train, y_train, test_size=0.2, random_state=2022)
X_tr.shape, X_val.shape, y_tr.shape, y_val.shape

from sklearn.ensemble import RandomForestRegressor
rf = RandomForestRegressor()
rf.fit(X_tr, y_tr)
pred = rf.predict(X_val)

from sklearn.metrics import mean_squared_error
def rmse(y_true, y_pred):
    return mean_squared_error(y_true, y_pred)**0.5

    rmse(y_val, pred)


pred = rf.predict(test)
result = pd.DataFrame({
    &#39;pred&#39;:pred
})
result.to_csv(&quot;result.csv&quot;, index=False)
pd.read_csv(&#39;result.csv&#39;)</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[[빅데이터분석기사] 실기기출 5회(작업형1)]]></title>
            <link>https://velog.io/@east_huni/%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%EA%B8%B0%EC%B6%9C-5%ED%9A%8C%EC%9E%91%EC%97%85%ED%98%951</link>
            <guid>https://velog.io/@east_huni/%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%EA%B8%B0%EC%B6%9C-5%ED%9A%8C%EC%9E%91%EC%97%85%ED%98%951</guid>
            <pubDate>Tue, 24 Jun 2025 03:39:08 GMT</pubDate>
            <description><![CDATA[<p><strong>1. 종량제 봉투 종류가 &#39;규격봉투&#39;이고, 종량제 봉투 용도가 &#39;음식물쓰레기&#39;인 2L가격 평균을 출력하시오 (단, 가격0 제외, 반올림 후 정수 출력)</strong></p>
<pre><code class="language-python">import pandas as pd
df = pd.read_csv()
# your code
cond1 = (df[&#39;종량제봉투종류&#39;] == &#39;규격봉투&#39;) &amp; (df[&#39;종량제봉투용도&#39;] == &#39;음식물쓰레기&#39;)
df = df[cond1]
cond2 = df[&#39;2ℓ가격&#39;] == 0
df = df[~cond2]
print(int(round(df[&#39;2ℓ가격&#39;].mean(),0)))</code></pre>
<p><strong>2. bmi를 계산하고, 수치가 정상인 사람 수와 위험체중인 사람 수의 차이를 절대값으로 구하시오 (정수로 출력)</strong></p>
<ul>
<li>bmi(체질량지수): 몸무게(kg) / 키(m)의 제곱
단위<ul>
<li>Height: cm</li>
<li>Weight: kg</li>
</ul>
</li>
</ul>
<ul>
<li>저체중: BMI 18.5미만</li>
<li>정상체중: BMI 18.5이상 ~ 23미만</li>
<li>과체중 또는 위험체중: BMI 23 이상 ~ 25미만</li>
<li>비만체중: 25이상<pre><code class="language-python">import pandas as pd
df = pd.read_csv()
# your code
df
df[&#39;bmi&#39;] = df[&#39;Weight&#39;] / ((df[&#39;Height&#39;]/100) ** 2)
cond1 = sum((df[&#39;bmi&#39;] &gt;= 18.5) &amp; (df[&#39;bmi&#39;] &lt; 23))
cond2 = sum((df[&#39;bmi&#39;] &gt;= 23) &amp; (df[&#39;bmi&#39;] &lt; 25))
answer = abs(cond1 - cond2)
print(int(answer))</code></pre>
</li>
<li><em>3. 순전입학생(순전입 학생 = 전입 학생 - 전출 학생)이 가장 많은 학교의 전체학생수를 정수로 출력하시오*</em><pre><code class="language-python">import pandas as pd
df = pd.read_csv()
# your code
df[&#39;순전입 학생&#39;] = df[&#39;전입학생수(계)&#39;] - df[&#39;전출학생수(계)&#39;]
df = df.sort_values(&#39;순전입 학생&#39;, ascending = False)[&#39;전체학생수(계)&#39;]
print(int(df.iloc[0]))</code></pre>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[빅데이터분석기사] 실기기출 4회(작업형1)]]></title>
            <link>https://velog.io/@east_huni/%EB%B9%85%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%B6%84%EC%84%9D%EA%B8%B0%EC%82%AC-%EA%B8%B0%EC%B6%9C%EC%9C%A0%ED%98%95-4%ED%9A%8C%EC%9E%91%EC%97%85%ED%98%951</link>
            <guid>https://velog.io/@east_huni/%EB%B9%85%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%B6%84%EC%84%9D%EA%B8%B0%EC%82%AC-%EA%B8%B0%EC%B6%9C%EC%9C%A0%ED%98%95-4%ED%9A%8C%EC%9E%91%EC%97%85%ED%98%951</guid>
            <pubDate>Tue, 24 Jun 2025 03:34:59 GMT</pubDate>
            <description><![CDATA[<p><strong>1-1. age 컬럼의 3사분위수와 1사분위수의 차를 절대값으로 구하고, 소수점 버려서, 정수로 출력</strong></p>
<pre><code class="language-python">import pandas as pd
df = pd.read_csv()
# print(&quot;1사분위: &quot;,df[&#39;age&#39;].quantile(0.25))
# print(&quot;3사분위: &quot;,df[&#39;age&#39;].quantile(0.75))

result = abs(df[&#39;age&#39;].quantile(0.25) - df[&#39;age&#39;].quantile(0.75))
# print(&quot;절대값 차이: &quot;,result)

print(int(result))</code></pre>
<p><strong>1-2.(loves반응+wows반응)/(reactions반응) 비율이 0.4보다 크고 0.5보다 작으면서, status_type==&#39;video&#39;인 데이터의 갯수</strong></p>
<pre><code class="language-python">import pandas as pd
df = pd.read_csv()
cond1 = (df[&#39;loves&#39;] + df[&#39;wows&#39;])/ df[&#39;reactions&#39;] &gt; 0.4
cond2 = (df[&#39;loves&#39;] + df[&#39;wows&#39;])/ df[&#39;reactions&#39;] &lt; 0.5
cond3 = df[&#39;type&#39;] == &#39;video&#39;

print(len(df[cond1 &amp; cond2 &amp; cond3]))</code></pre>
<p><strong>1-3. date_added가 2018년 1월 이면서 country가 United Kingdom 단독 제작인 데이터의 갯수</strong></p>
<pre><code class="language-python">import pandas as pd
df = pd.read_csv()

cond1 = df[&#39;country&#39;] == &quot;United Kingdom&quot;

df[&#39;date_added&#39;] = pd.to_datetime(df[&#39;date_added&#39;])
df[&#39;year&#39;] = df[&#39;date_added&#39;].dt.year
df[&#39;month&#39;] = df[&#39;date_added&#39;].dt.month


cond2 = df[&#39;year&#39;] == 2018
cond3 = df[&#39;month&#39;] == 1

print(len(df[cond1 &amp; cond2 &amp; cond3]))</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[[빅데이터분석기사] 실기기출 4회(작업형 2)]]></title>
            <link>https://velog.io/@east_huni/%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%EA%B8%B0%EC%B6%9C-4%ED%9A%8C%EC%9E%91%EC%97%85%ED%98%95-2</link>
            <guid>https://velog.io/@east_huni/%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%EA%B8%B0%EC%B6%9C-4%ED%9A%8C%EC%9E%91%EC%97%85%ED%98%95-2</guid>
            <pubDate>Tue, 24 Jun 2025 03:31:04 GMT</pubDate>
            <description><![CDATA[<h2 id="q-마케팅-자동차-시장-세분화">Q. [마케팅] 자동차 시장 세분화</h2>
<ul>
<li>자동차 회사는 새로운 전략을 수립하기 위해 4개의 시장으로 세분화했습니다.</li>
<li>기존 고객 분류 자료를 바탕으로 신규 고객이 어떤 분류에 속할지 예측해주세요!</li>
</ul>
<ul>
<li>예측할 값(y): &quot;Segmentation&quot; (1,2,3,4)</li>
<li>평가: Macro f1-score</li>
<li>data: train.csv, test.csv</li>
<li>제출 형식:<pre><code>ID,Segmentation
458989,1
458994,2
459000,3
459003,4</code></pre></li>
</ul>
<h3 id="답안-제출-참고">답안 제출 참고</h3>
<ul>
<li>아래 코드 예측변수와 수험번호를 개인별로 변경하여 활용</li>
<li>pd.DataFrame({&#39;ID&#39;: test.ID, &#39;Segmentation&#39;: pred}).to_csv(&#39;003000000.csv&#39;, index=False)</li>
</ul>
<h3 id="노트북-구분">노트북 구분</h3>
<ul>
<li>basic: 수치형 데이터만 활용 -&gt; 학습 및 test데이터 예측</li>
<li>intermediate: 범주형 데이터도 활용 -&gt; 학습 및 test데이터 예측</li>
<li>advanced: 학습 및 교차 검증(모델 평가) -&gt; 하이퍼파라미터 튜닝 -&gt; test데이터 예측<pre><code class="language-python"># 라이브러리 불러오기
import pandas as pd
</code></pre>
</li>
</ul>
<h1 id="데이터-불러오기">데이터 불러오기</h1>
<p>train = pd.read_csv()
test = pd.read_csv()</p>
<p>#target = &#39;Segmentation&#39;
print(train.shape, test.shape)
train.info()</p>
<p>train.head()</p>
<p>test.describe(include = &#39;O&#39;)</p>
<p>train[&#39;Segmentation&#39;].value_counts()</p>
<h1 id="전처리-및-인코딩-및-스케일링">전처리 및 인코딩 및 스케일링</h1>
<p>#one-hot</p>
<p>from sklearn.preprocessing import LabelEncoder
cols = train.select_dtypes(include = &#39;object&#39;).columns
le = LabelEncoder()
for col in cols:
  train[col] = le.fit_transform(train[col])
  test[col] = le.transform(test[col])</p>
<p>print(train.shape, test.shape)
target = train.pop(&#39;Segmentation&#39;)
train.drop(&#39;ID&#39;, axis = 1 , inplace = True)
test_id = test.pop(&#39;ID&#39;)
print(train.shape, test.shape)</p>
<h1 id="범주형-수치형-분할">범주형 수치형 분할</h1>
<h1 id="train_oh--trainselect_dtypesinclude--object">train_oh = train.select_dtypes(include = &#39;object&#39;)</h1>
<h1 id="train_sc--trainselect_dtypesexclude--object">train_sc = train.select_dtypes(exclude = &#39;object&#39;)</h1>
<h1 id="test_oh--testselect_dtypesinclude--object">test_oh = test.select_dtypes(include = &#39;object&#39;)</h1>
<h1 id="test_sc--testselect_dtypesexclude--object">test_sc = test.select_dtypes(exclude = &#39;object&#39;)</h1>
<p>#train.select_dtypes(exclude = &#39;object&#39;).columns
#스케일링 minmax</p>
<h1 id="cols-age-work_experience-family_size">cols =[&#39;Age&#39;, &#39;Work_Experience&#39;, &#39;Family_Size&#39;]</h1>
<h1 id="from-sklearnpreprocessing-import-minmaxscaler">from sklearn.preprocessing import MinMaxScaler</h1>
<h1 id="scaler--minmaxscaler">scaler = MinMaxScaler()</h1>
<h1 id="train_sccols--scalerfit_transformtrain_sccols">train_sc[cols] = scaler.fit_transform(train_sc[cols])</h1>
<h1 id="test_sccols--scalertransformtest_sccols">test_sc[cols] = scaler.transform(test_sc[cols])</h1>
<h1 id="train_oh--pdget_dummiestrain_oh">train_oh = pd.get_dummies(train_oh)</h1>
<h1 id="test_oh--pdget_dummiestest_oh">test_oh = pd.get_dummies(test_oh)</h1>
<h1 id="train--pdconcattrain_oh-train_sc-axis--1">train = pd.concat([train_oh, train_sc], axis = 1)</h1>
<h1 id="test--pdconcattest_oh-test_sc-axis--1">test = pd.concat([test_oh, test_sc], axis = 1)</h1>
<h1 id="printtrainshape-testshape">print(train.shape, test.shape)</h1>
<h1 id="모델링">모델링</h1>
<p>from sklearn.model_selection import train_test_split
X_tr, X_val, y_tr, y_val = train_test_split(train, target, test_size = 0.2, random_state = 2022)
print(X_tr.shape, X_val.shape, y_tr.shape, y_val.shape)</p>
<h1 id="분류-랜덤포레스트-로지스틱회귀">분류 랜덤포레스트, 로지스틱회귀</h1>
<p>from sklearn.metrics import accuracy_score</p>
<p>#랜덤포레스트
from sklearn.ensemble import RandomForestClassifier
rf = RandomForestClassifier(random_state = 2022, max_depth = 7, n_estimators = 1000)
rf.fit(X_tr, y_tr)
rf_pred = rf.predict(X_val)
print(accuracy_score(y_val, rf_pred))</p>
<h1 id="05393848462115529">0.5393848462115529</h1>
<p>#로지스틱회귀
from sklearn.linear_model import LogisticRegression
lo = LogisticRegression()
lo.fit(X_tr, y_tr)
lo_pred = lo.predict(X_val)
print(accuracy_score(y_val, lo_pred))</p>
<p>pred= rf.predict(test)
answer = pd.DataFrame({&#39;ID&#39; : test_id,
                       &#39;Segmentation&#39; : pred}).to_csv(&quot;result.csv&quot;, index = False)
```</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[AICE Associate]  딥러닝]]></title>
            <link>https://velog.io/@east_huni/zz</link>
            <guid>https://velog.io/@east_huni/zz</guid>
            <pubDate>Fri, 24 Jan 2025 00:57:58 GMT</pubDate>
            <description><![CDATA[<ul>
<li>첫번째 Hidden Layer : unit 64 , activation=&#39;relu&#39;</li>
<li>두번째 Hidden Layer : unit 32 , activation=&#39;relu&#39;</li>
<li>세번째 Hidden Layer : unit 16 , activation=&#39;relu&#39;</li>
<li>각 Hidden Layer 마다 Dropout 0.2 비율로 되도록 하세요.</li>
<li>EarlyStopping 콜백을 적용하고 ModelCheckpoint 콜백으로 validation performance가 좋은 모델을 best_model.keras 모델로 저장하세요.</li>
<li>batch_size는 10, epochs는 10으로 설정하세요.<pre><code class="language-python"># 여기에 답안코드를 작성하세요.
</code></pre>
</li>
</ul>
<p>import tensorflow as tf
from tensorflow import keras
from tensorflow.keras.models import Sequential, load_model
from tensorflow.keras.layers import Dense, Dropout
from tensorflow.keras.callbacks import EarlyStopping, ModelCheckpoint</p>
<p>try:
    model = Sequential()</p>
<pre><code>model.add(Dense(64, activation=&#39;relu&#39;, input_shape=(X_train.shape[1],)))
model.add(Dropout(0.2))
model.add(Dense(32, activation=&#39;relu&#39;))
model.add(Dropout(0.2))
model.add(Dense(16, activation=&#39;relu&#39;))
model.add(Dropout(0.2))
model.add(Dense(1, activation=&#39;sigmoid&#39;))

model.compile(optimizer=&#39;adam&#39;, loss=&#39;binary_crossentropy&#39;, metrics=[&#39;acc&#39;])

es = EarlyStopping(monitor=&#39;val_loss&#39;, patience=4, mode=&#39;min&#39;, verbose=1)
mc = ModelCheckpoint(&#39;best_model.keras&#39;, monitor=&#39;val_loss&#39;, save_best_only=True, verbose=1)


history = model.fit(X_train, y_train, 
                    batch_size=10, 
                    epochs=10, 
                    callbacks=[es, mc],
                    validation_data=(X_test, y_test), 
                    verbose=1)</code></pre><p>except ModuleNotFoundError:
    print(&quot;필요한 모듈이 설치되어 있지 않습니다.&quot;)</p>
<pre><code>&lt;br&gt;
&lt;font color=blue&gt;9-2. y_train, y_test를 원핫 인코딩 후 다중 분류하는 딥러닝 모델을 만드세요. 9-1과 동일한 가이드 적용&lt;/font&gt;

```python
# 여기에 답안코드를 작성하세요.

from keras.utils import to_categorical
y_train_ohe = to_categorical(y_train)
y_test_ohe = to_categorical(y_test)



model = Sequential()
model.add(Dense(64,activation=&#39;relu&#39;,input_shape=(X_train.shape[1],)))
model.add(Dropout(0.2))
model.add(Dense(32,activation=&#39;relu&#39;))
model.add(Dropout(0.2))
model.add(Dense(16,activation=&#39;relu&#39;))
model.add(Dropout(0.2))
model.add(Dense(2,activation=&#39;softmax&#39;))

model.compile(optimizer=&#39;adam&#39;, loss=&#39;categorical_crossentropy&#39;,metrics=[&#39;acc&#39;])

history = model.fit(X_train, y_train_ohe, batch_size=10, epochs=10, callbacks=[es,mc], validation_data=(X_test, y_test_ohe), verbose=1)

model.save(&#39;voc_model.keras&#39;)</code></pre><br>
<font color=blue>9-3. 모델 성능을 평가해서 그래프로 표현하세요. 학습 정확도와 검증정확도를 그래프로 표시하고 xlabel에는 Epochs, ylabel에는 Accuracy, 범례에는 Train과 Validation으로 표시하세요..</font>

<pre><code class="language-python"># 여기에 답안코드를 작성하세요.

plt.figure(figsize=(10,5))
plt.plot(history.history[&#39;acc&#39;])
plt.plot(history.history[&#39;val_acc&#39;])
plt.title(&#39;Model Accuracy&#39;)
plt.xlabel(&#39;Epochs&#39;)
plt.ylabel(&#39;Accuracy&#39;)
plt.legend([&#39;Train&#39;,&#39;Validation&#39;], loc=&#39;lower right&#39;)</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[[AICE ASSOCIATE] 고객 이탈 여부]]></title>
            <link>https://velog.io/@east_huni/AICE-ASSOCIATE-%EA%B3%A0%EA%B0%9D-%EC%9D%B4%ED%83%88-%EC%97%AC%EB%B6%80</link>
            <guid>https://velog.io/@east_huni/AICE-ASSOCIATE-%EA%B3%A0%EA%B0%9D-%EC%9D%B4%ED%83%88-%EC%97%AC%EB%B6%80</guid>
            <pubDate>Thu, 23 Jan 2025 18:37:02 GMT</pubDate>
            <description><![CDATA[<p><strong>AIVLE School 미니프로젝트</strong></p>
<h3 id="통신-서비스-이용-고객의-span-stylecolordarkgreen이탈-여부span-예측-문제"><strong>통신 서비스 이용 고객의 <span style="color:darkgreen">이탈 여부</span> 예측 문제</strong></h3>
<hr>
<h4 id="span-stylecolorred미션-안내span"><strong><span style="color:red">[미션 안내]</span></strong></h4>
<ul>
<li>고객 관련 데이터를 분석한 후 고객의 서비스 중단 또는 경쟁업체로의 이탈 여부를 예측하는 머신러닝, 딥러닝 모델을 만들고 결과를 예측하세요.</li>
</ul>
<h4 id="span-stylecolorred미션-안내span-1"><strong><span style="color:red">[미션 안내]</span></strong></h4>
<ul>
<li>고객 관련 데이터를 분석한 후 고객의 서비스 중단 또는 경쟁업체로의 이탈 여부를 예측하는 머신러닝, 딥러닝 모델을 만들고 결과를 예측하세요.</li>
</ul>
<h3 id="1-scikit-learn-패키지는-머신러닝-교육을-위한-최고의-파이썬-패키지입니다">1. scikit-learn 패키지는 머신러닝 교육을 위한 최고의 파이썬 패키지입니다.</h3>
<h3 id="scikit-learn를-별칭alias-sk로-임포트하는-코드를-작성하고-실행하세요">scikit-learn를 별칭(alias) sk로 임포트하는 코드를 작성하고 실행하세요.</h3>
<pre><code class="language-python"># 여기에 답안코드를 작성하세요.
import sklearn as sk</code></pre>
<h3 id="2-pandas를-사용할-수-있도록-별칭alias을-pd로-해서-불러오세요">2. Pandas를 사용할 수 있도록 별칭(alias)을 pd로 해서 불러오세요.</h3>
<pre><code class="language-python"># 여기에 답안코드를 작성하세요.
import pandas as pd</code></pre>
<h3 id="3-모델링을-위해-분석-및-처리할-데이터-파일을-읽어오려고-합니다">3. 모델링을 위해 분석 및 처리할 데이터 파일을 읽어오려고 합니다.</h3>
<h3 id="pandas함수로-데이터-파일을-읽어-데이터프레임-변수명-df에-할당하는-코드를-작성하세요">Pandas함수로 데이터 파일을 읽어 데이터프레임 변수명 df에 할당하는 코드를 작성하세요.</h3>
<ul>
<li>churn_data.csv 파일을 읽어 데이터 프레임 변수명 df에 할당하세요.</li>
</ul>
<pre><code class="language-python"># 여기에 답안코드를 작성하세요.
df = pd.read_csv(&quot;churn_data.csv&quot;)
df</code></pre>
<h3 id="4-df에서-불필요한-customerid-컬럼을-삭제하고-df1에-저장하세요">4. df에서 불필요한 customerID 컬럼을 삭제하고 df1에 저장하세요.</h3>
<pre><code class="language-python"># 여기에 답안코드를 작성하세요.

df1 = df.drop(&#39;customerID&#39;, axis=1)</code></pre>
<h3 id="5-df1의-totalcharges-컬럼의-타입을-float로-변경하세요">5. df1의 TotalCharges 컬럼의 타입을 float로 변경하세요.</h3>
<ul>
<li>TotalCharge의 컬럼 타입을 확인하는 코드를 작성하세요.</li>
<li>&#39; &#39; 값을 0으로 변환하고 컬럼 타입을 float로 변경하세요.</li>
<li>전처리 후 데이터를 df2에 저장하세요.<pre><code class="language-python"># 여기에 답안코드를 작성하세요.
</code></pre>
</li>
</ul>
<p>df1[&#39;TotalCharges&#39;].dtype
df1[&#39;TotalCharges&#39;].replace([&#39; &#39;], [&#39;0&#39;], inplace=True)
df1[&#39;TotalCharges&#39;] = df1[&#39;TotalCharges&#39;].astype(float)
df2=df1.copy()</p>
<pre><code>### 6. df2에서 churn 컬럼의 데이터별 개수를 확인하는 코드를 작성하고 df2를 df3에 저장하세요.
### df2의 churn 컬럼의 Yes, No를 각각 1, 0으로 변환한 후 df3의 churn컬럼에 저장하세요.
```python
# 여기에 답안코드를 작성하세요.

df2[&#39;Churn&#39;].value_counts()
df3 = df2.copy()
df3[&#39;Churn&#39;] = df2[&#39;Churn&#39;].replace([&#39;Yes&#39;, &#39;No&#39;], [1, 0])
</code></pre><h3 id="7-df3의-모든-컬럼에-대해-결측치를-확인하는-코드를-작성하고-결측치를-처리하세요">7. df3의 모든 컬럼에 대해 결측치를 확인하는 코드를 작성하고 결측치를 처리하세요.</h3>
<ul>
<li>df3을 df4에 저장하세요.</li>
<li>df4의 결측치가 40% 이상인 컬럼은 컬럼을 삭제하세요.</li>
<li>df4의 결측치가 40% 미만인 컬럼은 결측치가 있는 row를 삭제하세요.<pre><code class="language-python"># 여기에 답안코드를 작성하세요.
</code></pre>
</li>
</ul>
<p>print(df3.isnull().sum())
df4 = df3.copy()
df4.drop(&#39;DeviceProtection&#39;, axis=1, inplace=True)
df4.dropna(inplace=True)
df4.info()</p>
<pre><code>### 8. df4에서 SeniorCitizen 컬럼을 bar 차트로 확인해보고 불균형을 확인해보세요. 
### SeniorCitizen 컬럼은 불균형이 심하므로 삭제하세요.

```python
# 여기에 답안코드를 작성하세요.
df4[&#39;SeniorCitizen&#39;].value_counts().plot(kind=&#39;bar&#39;)
df4.drop(&#39;SeniorCitizen&#39;, axis=1, inplace=True)
df4.info()</code></pre><h3 id="9-df4에서-다음의-가이드에-따라-데이터를-시각화-해보세요">9. df4에서 다음의 가이드에 따라 데이터를 시각화 해보세요.</h3>
<ul>
<li>tenure (서비스 사용기간)에 대해 히스토그램으로 시각화 하세요.</li>
<li>tenure를 x 값으로 churn을 hue 값으로 사용하여 kdeplot으로 시각화 하고 &#39;서비스 사용기간이 길어질 수록 이탈이 적다&#39;에 대해 &#39;O&#39;인지 &#39;X&#39;인지 출력하세요.</li>
<li>&#39;tenure&#39;,&#39;MonthlyCharges&#39;,&#39;TotalCharges&#39; 컬럼간의 상관관계를 확인하여 heatmap으로 시각화하고 가장 높은 상관계수 값을 출력하세요.<pre><code class="language-python"># 여기에 답안코드를 작성하세요.
</code></pre>
</li>
</ul>
<p>import seaborn as sns
import matplotlib.pyplot as plt
sns.histplot(data=df4, x=&#39;tenure&#39;)
plt.show()</p>
<p>sns.kdeplot(data=df4, x=&#39;tenure&#39;, hue=&#39;Churn&#39;)
plt.show()
print(&#39;O&#39;)</p>
<p>sns.heatmap(df4[[&#39;tenure&#39;,&#39;MonthlyCharges&#39;,&#39;TotalCharges&#39;]].corr(), annot=True)
print(0.83)</p>
<pre><code>
### 10. df4에서 컬럼의 데이터 타입이 object인 컬럼들을 원-핫 인코딩하세요.
* 컬럼의 데이터 타입이 object인 컬럼들을 object_cols 변수에 저장하세요.
* object_cols 변수의 컬럼들을 원-핫 인코딩하세요.
* 전처리된 데이터를 df5에 저장하세요.
```ptyhon
# 여기에 답안코드를 작성하세요.

object_cols = df4.select_dtypes(&#39;object&#39;).columns.values
df5 = pd.get_dummies(data=df4, columns=object_cols)</code></pre><h3 id="11-df5에-대해-scikit-learn의-train_test_split-함수로-훈련-검증-데이터를-분리하세요">11. df5에 대해 Scikit-learn의 train_test_split 함수로 훈련, 검증 데이터를 분리하세요.</h3>
<ul>
<li>입력 : X, y (y에는 churn을 저장하고 X에는 churn을 제외한 나머지를 저장하세요)</li>
<li>Train : Test 비율 = 8:2</li>
<li>y Class 비율에 맞게 나누는 옵션을 추가하세요.</li>
<li>random_state=42 로 설정하세요.</li>
<li>결과 : X_train, X_valid, y_train, y_valid에 저장하세요.<pre><code class="language-python"># 여기에 답안코드를 작성하세요.
from sklearn.model_selection import train_test_split
</code></pre>
</li>
</ul>
<p>X = df5.drop(&#39;Churn&#39;, axis=1).values
y = df5[&#39;Churn&#39;].values</p>
<p>X_train, X_valid, y_train, y_valid = train_test_split(X, y, 
                                                    test_size=0.2, 
                                                    stratify=y,
                                                    random_state=42)</p>
<pre><code>### 12. MinMaxScaler 함수를 &#39;scaler&#39;로 정의하고 데이터를 정규화하세요.

```python
# 여기에 답안코드를 작성하세요.

from sklearn.preprocessing import MinMaxScaler
scaler = MinMaxScaler()
X_train = scaler.fit_transform(X_train)
X_valid = scaler.transform(X_valid)</code></pre><h3 id="13-고객-이탈-여부를-예측하는-머신러닝-모델을-만들려고-합니다">13. 고객 이탈 여부를 예측하는 머신러닝 모델을 만들려고 합니다.</h3>
<h3 id="아래-가이드에-따라-모델링하고-학습을-진행하세요">아래 가이드에 따라 모델링하고 학습을 진행하세요.</h3>
<ul>
<li>LogisticRegression 모델 정의하고 학습시키세요. </li>
<li>KNN으로 모델을 정의하고 학습시키세요. (n_neighbors=5)</li>
<li>Decision Tree로 모델을 정의하고 학습시키세요. (max_depth=10, random_state=42)</li>
<li>RandomForest로 모델을 정의하고 학습시키세요. (n_estimators=3, random_state=42)</li>
<li>XGBoost로 모델을 정의하고 학습시키세요. (n_estimators=3, random_state=42)  </li>
<li>Light GBM으로 모델을 정의하고 학습시키세요. (n_estimators=3, random_state=42)  </li>
<li>각각 다른 셀에 답안코드를 작성하세요.<pre><code class="language-python"># 여기에 답안코드를 작성하세요.
</code></pre>
</li>
</ul>
<p>from sklearn.linear_model import LogisticRegression
lg = LogisticRegression()
lg.fit(X_train, y_train)</p>
<p>from sklearn.neighbors import KNeighborsClassifier
knn = KNeighborsClassifier(n_neighbors=5)
knn.fit(X_train, y_train)</p>
<p>from sklearn.tree import DecisionTreeClassifier
dt = DecisionTreeClassifier(max_depth=10, random_state=42)
dt.fit(X_train, y_train)</p>
<p>from sklearn.ensemble import RandomForestClassifier
rfc = RandomForestClassifier(n_estimators=3, random_state=42)
rfc.fit(X_train, y_train)</p>
<p>!pip install xgboost
from xgboost import XGBClassifier
xgb = XGBClassifier(n_estimators=3, random_state=42)<br>xgb.fit(X_train, y_train)</p>
<p>!pip install lightgbm
from lightgbm import LGBMClassifier
lgbm = LGBMClassifier(n_estimators=3, random_state=42)<br>lgbm.fit(X_train, y_train)</p>
<pre><code>### 14. 바로 위 Light GBM 모델의 성능을 평가하려고 합니다. 
### y값을 예측하여 confusion matrix를 구하고 heatmap 그래프로 시각화하세요. 
### 그리고 Scikit-learn의 classification_report를 활용하여 성능을 출력하세요.
```python
# 여기에 답안코드를 작성하세요.

from sklearn.metrics import confusion_matrix
from sklearn.metrics import classification_report

y_pred = lgbm.predict(X_valid)
cm = confusion_matrix(y_valid, y_pred)
sns.heatmap(cm, annot=True)

print(classification_report(y_valid, y_pred, zero_division=1))
</code></pre><h5 id="span-stylecolorred다음-문항을-풀기-전에span-아래-코드를-실행하세요"><strong><span style="color:red">다음 문항을 풀기 전에</span> 아래 코드를 실행하세요.</strong></h5>
<pre><code class="language-python">import tensorflow as tf
from tensorflow.keras.models import Sequential, load_model
from tensorflow.keras.layers import Dense, Activation, Dropout, BatchNormalization
from tensorflow.keras.callbacks import EarlyStopping, ModelCheckpoint
from tensorflow.keras.utils import to_categorical

tf.random.set_seed(1)</code></pre>
<h3 id="15-고객-이탈여부를-예측하는-딥러닝-모델을-만들려고-합니다">15. 고객 이탈여부를 예측하는 딥러닝 모델을 만들려고 합니다.</h3>
<h3 id="아래-가이드에-따라-모델링하고-학습을-진행하세요-1">아래 가이드에 따라 모델링하고 학습을 진행하세요.</h3>
<ul>
<li>Tensoflow framework를 사용하여 딥러닝 모델을 만드세요.</li>
<li>히든레이어(hidden layer) 2개이상으로 모델을 구성하세요.</li>
<li>dropout 비율 0.2로 Dropout 레이어 1개를 추가해 주세요.</li>
<li>하이퍼파라미터 epochs: 30, batch_size: 16으로 설정해주세요.</li>
<li>각 에포크마다 loss와 metrics 평가하기 위한 데이터로 X_valid, y_valid 사용하세요.</li>
<li>학습정보는 history 변수에 저장해주세요<pre><code class="language-python"># 여기에 답안코드를 작성하세요.
</code></pre>
</li>
</ul>
<p>model = Sequential()
model.add(Dense(64, activation=&#39;relu&#39;, input_shape=(X_train.shape[1],)))
model.add(Dropout(0.2))
model.add(Dense(32, activation=&#39;relu&#39;))
model.add(Dense(16, activation=&#39;relu&#39;))
model.add(Dense(1, activation=&#39;sigmoid&#39;))</p>
<p>model.compile(optimizer=&#39;adam&#39;, 
              loss=&#39;binary_crossentropy&#39;, 
              metrics=[&#39;accuracy&#39;]) </p>
<p>es = EarlyStopping(monitor=&#39;val_loss&#39;, patience=5) </p>
<p>checkpoint_path = &#39;best_model.keras&#39;
mc = ModelCheckpoint(checkpoint_path, monitor=&#39;val_loss&#39;, verbose=1, save_best_only=True)</p>
<p>history = model.fit(X_train, y_train, epochs=30, batch_size=16,
                   validation_data = (X_valid, y_valid),
                    callbacks=[es, mc]
                    )</p>
<pre><code>### 16. 위 딥러닝 모델의 성능을 평가하려고 합니다.
### Matplotlib 라이브러리 활용해서 학습 accuracy와 검증 accuracy를 그래프로 표시하세요.
* 1개의 그래프에 학습 accuracy와 검증 accuracy 2가지를 모두 표시하세요.
* 위 2가지 각각의 범례를 &#39;acc&#39;, &#39;val_acc&#39;로 표시하세요.
* 그래프의 타이틀은 &#39;Accuracy&#39;로 표시하세요.
* X축에는 &#39;Epochs&#39;라고 표시하고 Y축에는 &#39;Acc&#39;라고 표시하세요.

```python
# 여기에 답안코드를 작성하세요.
plt.plot(history.history[&#39;accuracy&#39;])
plt.plot(history.history[&#39;val_accuracy&#39;])
plt.title(&#39;Accuracy&#39;)
plt.xlabel(&#39;Epochs&#39;)
plt.ylabel(&#39;Acc&#39;)
plt.legend([&#39;acc&#39;, &#39;val_acc&#39;])
plt.show()</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[[AICE ASSOCIATE] 네비도착시간]]></title>
            <link>https://velog.io/@east_huni/AICE-ASSOCIATE-%EB%84%A4%EB%B9%84%EB%8F%84%EC%B0%A9%EC%8B%9C%EA%B0%84</link>
            <guid>https://velog.io/@east_huni/AICE-ASSOCIATE-%EB%84%A4%EB%B9%84%EB%8F%84%EC%B0%A9%EC%8B%9C%EA%B0%84</guid>
            <pubDate>Thu, 23 Jan 2025 18:34:33 GMT</pubDate>
            <description><![CDATA[<h3 id="4-address1주소1에-대한-분포도를-알아-보려고-합니다">4. Address1(주소1)에 대한 분포도를 알아 보려고 합니다.</h3>
<h3 id="address1주소1에-대해-countplot그래프로-만들고-아래-가이드에-따라-답하세요">Address1(주소1)에 대해 countplot그래프로 만들고 아래 가이드에 따라 답하세요.</h3>
<ul>
<li>Seaborn을 활용하세요.</li>
<li>첫번째, Address1(주소1)에 대해서 분포를 보여주는 countplot그래프 그리세요.</li>
<li>두번째, 지역명이 없는 &#39;-&#39;에 해당되는 row(행)을 삭제하세요.<pre><code class="language-python"># 여기에 답안코드를 작성하세요.
!pip install seaborn
import seaborn as sns
import matplotlib.pyplot as plt
sns.countplot(x = &#39;Address1&#39;, data = df)
plt.show()
</code></pre>
</li>
</ul>
<p>df.drop(df[df[&#39;Address1&#39;] == &#39;-&#39;].index, inplace = True)</p>
<pre><code>
### 5. 실주행시간과 평균시속의 분포를 같이 확인하려고 합니다.
### Time_Driving(실주행시간)과 Speed_Per_Hour(평균시속)을 jointplot 그래프로 만드세요.
* Seaborn을 활용하세요.
* X축에는 Time_Driving(실주행시간)을 표시하고 Y축에는 Speed_Per_Hour(평균시속)을 표시하세요.

```python
# 여기에 답안코드를 작성하세요.
sns.jointplot(x = &quot;Time_Driving&quot;, y = &quot;Speed_Per_Hour&quot;, data = df)
plt.show()</code></pre><h3 id="6-위의-jointplot-그래프에서-시속-300이-넘는-이상치를-발견할-수-있습니다">6. 위의 jointplot 그래프에서 시속 300이 넘는 이상치를 발견할 수 있습니다.</h3>
<h3 id="jointplot-그래프에서-발견한-이상치-1개를-삭제하세요">jointplot 그래프에서 발견한 이상치 1개를 삭제하세요.</h3>
<ul>
<li>대상 데이터프레임: df</li>
<li>jointplot 그래프를 보고 시속 300 이상되는 이상치를 찾아 해당 행(Row)을 삭제하세요.</li>
<li>전처리 반영 후에 새로운 데이터프레임 변수명 df_temp에 저장하세요.</li>
</ul>
<pre><code class="language-python"># 여기에 답안코드를 작성하세요.
df_temp = df.drop(df[df[&#39;Speed_Per_Hour&#39;] &gt; 300].index)</code></pre>
<h3 id="7-모델링-성능을-제대로-얻기-위해서-결측치-처리는-필수입니다">7. 모델링 성능을 제대로 얻기 위해서 결측치 처리는 필수입니다.</h3>
<h3 id="아래-가이드를-따라-결측치-처리하세요">아래 가이드를 따라 결측치 처리하세요.</h3>
<ul>
<li>대상 데이터프레임: df_temp</li>
<li>결측치를 확인하는 코드를 작성하세요.</li>
<li>결측치가 있는 행(raw)를 삭제 하세요.</li>
<li>전처리 반영된 결과를 새로운 데이터프레임 변수명 df_na에 저장하세요.<pre><code class="language-python"># 여기에 답안코드를 작성하세요.
print(df_temp.isnull().sum())
df_na = df_temp.dropna()
df_na.isnull().sum()</code></pre>
<h3 id="8-모델링-성능을-제대로-얻기-위해서-불필요한-변수는-삭제해야-합니다">8. 모델링 성능을 제대로 얻기 위해서 불필요한 변수는 삭제해야 합니다.</h3>
<h3 id="아래-가이드를-따라-불필요-데이터를-삭제-처리하세요">아래 가이드를 따라 불필요 데이터를 삭제 처리하세요.</h3>
</li>
<li>대상 데이터프레임: df_na</li>
<li>&#39;Time_Departure&#39;, &#39;Time_Arrival&#39; 2개 컬럼을 삭제하세요.</li>
<li>전처리 반영된 결과를 새로운 데이터프레임 변수명 df_del에 저장하세요.<pre><code class="language-python"># 여기에 답안코드를 작성하세요.
df_del = df_na.drop(columns = [&#39;Time_Departure&#39;, &#39;Time_Arrival&#39;])</code></pre>
<h3 id="9-원-핫-인코딩one-hot-encoding은-범주형-변수를-1과-0의-이진형-벡터로-변환하기-위하여-사용하는-방법입니다">9. 원-핫 인코딩(One-hot encoding)은 범주형 변수를 1과 0의 이진형 벡터로 변환하기 위하여 사용하는 방법입니다.</h3>
<h3 id="원-핫-인코딩으로-아래-조건에-해당하는-컬럼-데이터를-변환하세요">원-핫 인코딩으로 아래 조건에 해당하는 컬럼 데이터를 변환하세요.</h3>
</li>
<li>대상 데이터프레임: df_del</li>
<li>원-핫 인코딩 대상: object 타입의 전체 컬럼</li>
<li>활용 함수: pandas의 get_dummies</li>
<li>해당 전처리가 반영된 결과를 데이터프레임 변수 df_preset에 저장해 주세요.</li>
</ul>
<pre><code class="language-python"># 여기에 답안코드를 작성하세요.
df_del.info()
oh_cols = [&#39;Address1&#39;, &#39;Address2&#39;]
df_preset = pd.get_dummies(df_del, columns = oh_cols, drop_first = True)</code></pre>
<h3 id="10-훈련과-검증-각각에-사용할-데이터셋을-분리하려고-합니다">10. 훈련과 검증 각각에 사용할 데이터셋을 분리하려고 합니다.</h3>
<h3 id="time_driving실주행시간-컬럼을-label값-y로-나머지-컬럼을-feature값-x로-할당한-후-훈련데이터셋과-검증데이터셋으로-분리하세요">Time_Driving(실주행시간) 컬럼을 label값 y로, 나머지 컬럼을 feature값 X로 할당한 후 훈련데이터셋과 검증데이터셋으로 분리하세요.</h3>
<ul>
<li>대상 데이터프레임: df_preset</li>
<li>훈련 데이터셋 label: y_train, 훈련 데이터셋 Feature: X_train</li>
<li>검증 데이터셋 label: y_valid, 검증 데이터셋 Feature: X_valid</li>
<li>훈련 데이터셋과 검증데이터셋 비율은 80:20</li>
<li>random_state: 42</li>
<li>Scikit-learn의 train_test_split 함수를 활용하세요.</li>
</ul>
<pre><code class="language-python"># 여기에 답안코드를 작성하세요.
from sklearn.model_selection import train_test_split
x = df_preset.drop(columns = [&#39;Time_Driving&#39;])
y = df_preset[&#39;Time_Driving&#39;]
X_train, X_valid, y_train, y_valid = train_test_split(x, y, test_size = 0.2, random_state = 42)</code></pre>
<h3 id="11-time_driving실주행시간을-예측하는-머신러닝-모델을-만들려고-합니다">11. Time_Driving(실주행시간)을 예측하는 머신러닝 모델을 만들려고 합니다.</h3>
<h3 id="의사결정나무decision-tree는-여러-가지-규칙을-순차적으로-적용하면서-독립-변수-공간을-분할하는-모형으로">의사결정나무(decision tree)는 여러 가지 규칙을 순차적으로 적용하면서 독립 변수 공간을 분할하는 모형으로</h3>
<h3 id="분류classification와-회귀-분석regression에-모두-사용될-수-있습니다">분류(classification)와 회귀 분석(regression)에 모두 사용될 수 있습니다.</h3>
<h3 id="의사결정나무decision-tree로-학습을-진행하세요">의사결정나무(decision tree)로 학습을 진행하세요.</h3>
<ul>
<li>트리의 최대 깊이: 5로 설정</li>
<li>노드를 분할하기 위한 최소한의 샘플 데이터수(min_samples_split): 3로 설정</li>
<li>random_state: 120로 설정<pre><code class="language-python"># 여기에 답안코드를 작성하세요.
from sklearn.tree import DecisionTreeRegressor
tree = DecisionTreeRegressor(max_depth = 5, min_samples_split = 3, random_state=120)
tree.fit(X_train, y_train)</code></pre>
<h3 id="12-위-의사결정나무decision-tree-모델의-성능을-평가하려고-합니다">12. 위 의사결정나무(decision tree) 모델의 성능을 평가하려고 합니다.</h3>
<h3 id="예측-결과의-maemean-absolute-error를-구하세요">예측 결과의 mae(Mean Absolute Error)를 구하세요.</h3>
</li>
<li>성능 평가는 검증 데이터셋을 활용하세요.</li>
<li>11번 문제에서 만든 의사결정나무(decision tree) 모델로 y값을 예측(predict)하여 y_pred에 저장하세요.</li>
<li>검증 정답(y_valid)과 예측값(y_pred)의 mae(Mean Absolute Error)를 구하고 dt_mae 변수에 저장하세요.<pre><code class="language-python"># 여기에 답안코드를 작성하세요.
from sklearn.metrics import  mean_absolute_error
y_pred = tree.predict(X_valid)
dt_mae = mean_absolute_error(y_valid, y_pred)
print(dt_mae)</code></pre>
<h3 id="13-time_driving실주행시간을-예측하는-딥러닝-모델을-만들려고-합니다">13. Time_Driving(실주행시간)을 예측하는 딥러닝 모델을 만들려고 합니다.</h3>
<h3 id="아래-가이드에-따라-모델링하고-학습을-진행하세요">아래 가이드에 따라 모델링하고 학습을 진행하세요.</h3>
</li>
<li>Tensoflow framework를 사용하여 딥러닝 모델을 만드세요.</li>
<li>히든레이어(hidden layer) 2개이상으로 모델을 구성하세요.</li>
<li>dropout 비율 0.2로 Dropout 레이어 1개를 추가해 주세요.</li>
<li>손실함수는 MSE(Mean Squared Error)를 사용하세요.</li>
<li>하이퍼파라미터 epochs: 30, batch_size: 16으로 설정해주세요.</li>
<li>각 에포크마다 loss와 metrics 평가하기 위한 데이터로 X_valid, y_valid 사용하세요.</li>
<li>학습정보는 history 변수에 저장해주세요<pre><code class="language-python"># 여기에 답안코드를 작성하세요.
model = Sequential()
model.add(Dense(64, activation=&#39;relu&#39;, input_shape=(87,))) #input_shape = (X_train.shape[1], 
model.add(Dropout(0.2))
model.add(Dense(32, activation=&#39;relu&#39;))
model.add(Dense(16, activation=&#39;relu&#39;))
model.add(Dense(1))
</code></pre>
</li>
</ul>
<p>model.compile(loss=&#39;mse&#39;, optimizer=&#39;adam&#39;, metrics=[&#39;mae&#39;, &#39;mse&#39;])</p>
<p>es = EarlyStopping(monitor=&#39;val_loss&#39;, patience=5) </p>
<p>checkpoint_path = &#39;best_model.keras&#39;  # 파일 경 로를 수정
mc = ModelCheckpoint(checkpoint_path, monitor=&#39;val_loss&#39;, verbose=1, save_best_only=True)</p>
<p>history = model.fit(X_train, y_train, epochs=30, batch_size=16,
                   validation_data=(X_valid, y_valid),
                   callbacks=[es, mc]
                   )</p>
<pre><code>### 14. 위 딥러닝 모델의 성능을 평가하려고 합니다.
### Matplotlib 라이브러리 활용해서 학습 mse와 검증 mse를 그래프로 표시하세요.
* 1개의 그래프에 학습 mae과 검증 mse 2가지를 모두 표시하세요.
* 위 2가지 각각의 범례를 &#39;mae&#39;, &#39;mse&#39;로 표시하세요.
* 그래프의 타이틀은 &#39;Model MSE&#39;로 표시하세요.
* X축에는 &#39;Epochs&#39;라고 표시하고 Y축에는 &#39;MSE&#39;라고 표시하세요.

```python
# 여기에 답안코드를 작성하세요.
plt.plot(history.history[&quot;mae&quot;], label=&quot;mae&quot;)
plt.plot(history.history[&quot;mse&quot;], label=&quot;mse&quot;)
plt.title(&quot;Model MSE&quot;)
plt.xlabel(&quot;Epochs&quot;)
plt.ylabel(&quot;MSE&quot;)
plt.legend()
plt.show()</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[BOJ) 11724 - 연결 요소의 개수]]></title>
            <link>https://velog.io/@east_huni/BOJ-11724-%EC%97%B0%EA%B2%B0-%EC%9A%94%EC%86%8C%EC%9D%98-%EA%B0%9C%EC%88%98</link>
            <guid>https://velog.io/@east_huni/BOJ-11724-%EC%97%B0%EA%B2%B0-%EC%9A%94%EC%86%8C%EC%9D%98-%EA%B0%9C%EC%88%98</guid>
            <pubDate>Sun, 10 Nov 2024 16:55:28 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/east_huni/post/103c8b02-4d96-4d6a-869d-297636ab86b2/image.png" alt=""><img src="https://velog.velcdn.com/images/east_huni/post/9d213a15-e2a2-4e66-b9df-bd5d2c8ac7e0/image.png" alt=""></p>
<p>dfs 로 순열 문제만 풀다가 그래프 들어가니까 방식의 차이때문에 재귀함수에 대해서 제대로 이해했는지에 대한 의문이 들기시작한다 .. 구분 잘하고 더 공부해보자</p>
<h3 id="풀이">풀이</h3>
<p>리스트배열 연결 노드들을 입력하고, dfs를 통해 start 노드가 연결되어 있는 노드들을 다 방문하고, 아직 방문이 안된 노드가 있으면 for문을 통해 다시 도는데 그때마다 answer값을 추가해주면 된다.</p>
<pre><code class="language-java">package study;

import javax.swing.plaf.synth.SynthOptionPaneUI;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.StringTokenizer;

public class B_11724 {
    static boolean [] visited;
    static ArrayList&lt;Integer&gt; [] arr;
    static int N, M;
    static int answer = 0;;
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st;
        st = new StringTokenizer(br.readLine());
        N = Integer.parseInt(st.nextToken());
        M = Integer.parseInt(st.nextToken());
        arr = new ArrayList[N+1];
        visited = new boolean[N+1];
        for (int i = 1; i &lt; N+1; i++) {
            arr[i] = new ArrayList&lt;Integer&gt;();
        }
        int a,b;
        for (int i = 0; i &lt; M; i++) {
            st = new StringTokenizer(br.readLine());
            a = Integer.parseInt(st.nextToken());
            b = Integer.parseInt(st.nextToken());
            arr[a].add(b);
            arr[b].add(a);
        }

        for (int i = 1; i &lt;= N; i++) {
            if (!visited[i]){
                dfs(i);
                answer++;
            }
        }
        System.out.println(answer);
    }
    public static void dfs(int start){
        visited[start] = true;
        for(int i : arr[start]){
            if (!visited[i]){
                dfs(i);
            }
        }
    }
}
</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[BOJ) 1260 - DFS와 BFS]]></title>
            <link>https://velog.io/@east_huni/BOJ-1260-DFS%EC%99%80-BFS</link>
            <guid>https://velog.io/@east_huni/BOJ-1260-DFS%EC%99%80-BFS</guid>
            <pubDate>Sun, 10 Nov 2024 14:22:55 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/east_huni/post/1d8f8350-98ed-433d-bcf8-a4022d184dc4/image.png" alt=""><img src="https://velog.velcdn.com/images/east_huni/post/c3cb6094-2fdd-459a-9582-88ef58fb5f28/image.png" alt="">
DFS 는 계속 했던 부분이었는데도 문제 이해를 잘 못한거지 출력에 약간 어려움이 있었고, BFS 는 이제 입문단계라 천천히 계속 풀어나가서 감을 잡아봐야겠다. 지금 느낌으로는 DFS 보다 BFS 가 쉬워 보인다는 느낌이 강하게든다. 익숙한 자료구조 Queue를 사용해서 그런거 같기도</p>
<h3 id="풀이">풀이</h3>
<p>노드 경로를 그대로 출력하는 느낌이라 따로 어려운 건 없어 보이고,
일반 dfs 같은 경우에는 시작에 depth 에 따른 종료 조건이 있어야하는데 이 문제는 그것과 다르게 시작 노드를 방문하고 부터 시작해야 한다는 점만 조심하면 될 것 같다.</p>
<pre><code class="language-java">package study;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;

public class B_1260 {
    static int N, M, V;
    static boolean [] visited;
    static boolean [][] arr;
    static StringBuilder sb = new StringBuilder();
    static Queue&lt;Integer&gt; q = new LinkedList&lt;&gt;();
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st;
        st = new StringTokenizer(br.readLine());
        N = Integer.parseInt(st.nextToken());
        M = Integer.parseInt(st.nextToken());
        V = Integer.parseInt(st.nextToken());
        arr = new boolean[N+1][N+1];
        visited = new boolean[N+1];
        int a, b;
        for (int i = 0; i &lt; M; i++) {
            st = new StringTokenizer(br.readLine());
            a = Integer.parseInt(st.nextToken());
            b = Integer.parseInt(st.nextToken());
            arr[a][b] = arr[b][a] = true;
        }
        dfs(V);
        sb.append(&quot;\n&quot;);
        visited = new boolean[N+1];
        bfs(V);
        System.out.println(sb);
    }
    public static void dfs(int start){
        visited[start] = true;
        sb.append(start).append(&quot; &quot;);
        for (int i = 1; i &lt; N+1; i++) {
            if (!visited[i] &amp;&amp; arr[start][i]){
                dfs(i);
            }
        }
    }
    public static void bfs(int start){
        q.add(start);
        visited[start] = true;
        while (!q.isEmpty()){
            start = q.poll();
            sb.append(start).append(&quot; &quot;);

            for (int i = 1; i &lt; N+1; i++) {
                if (arr[start][i] &amp;&amp; !visited[i]){
                    q.add(i);
                    visited[i] = true;
                }
            }
        }
    }
}
</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[BOJ) 부등호 - 2529]]></title>
            <link>https://velog.io/@east_huni/BOJ-%EB%B6%80%EB%93%B1%ED%98%B8-2529</link>
            <guid>https://velog.io/@east_huni/BOJ-%EB%B6%80%EB%93%B1%ED%98%B8-2529</guid>
            <pubDate>Sun, 10 Nov 2024 11:55:42 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/east_huni/post/d51966c2-75e5-48e9-ab49-f80ef7108569/image.png" alt="">
<img src="https://velog.velcdn.com/images/east_huni/post/a013a2d0-cb75-4803-95fa-9badf3327f77/image.png" alt="">
DFS 를 사용해서 탐색하고, 백트래킹 조건으로 풀면되는 문제</p>
<p>ArrayList 는 String 으로 sort 해도, Integer sort 처럼 정렬이 되는 사실을 알게되었다. </p>
<p>조건을 어떻게 넣어야하는지 몰라서 찾아보고 문제를 풀었지만, 조금만 더 생각해보면 간단하게 풀 수있는 문제라고 생각한다. 머리 좀 쓰자 ..</p>
<pre><code class="language-java">package study;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Collections;
import java.util.StringTokenizer;

public class B_2529 {
    static boolean  [] visited;
    static int K;
    static String [] str;
    static ArrayList &lt;String&gt; arr;
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in);
        K = Integer.parseInt(br.readLine());
        arr = new ArrayList&lt;&gt;();
        str = new String[K];
        answer = new int [K+1];
        StringTokenizer st = new StringTokenizer(br.readLine());
        for (int i = 0; i &lt; K; i++) {
            str[i] = st.nextToken();
        }
        for (int i = 0; i &lt; 10; i++) {
            visited = new boolean[10];
            visited[i] = true;
            dfs(i, 0, i+ &quot;&quot;);
            visited[i] = false;
        }
        Collections.sort(arr);
        System.out.println(arr.getLast());
        System.out.println(arr.getFirst());

    }
    public static void dfs(int start, int depth, String a){
        if (a.length() == K+1){
            arr.add(a);
            return;
        }
        for (int i = 0; i &lt; 10; i++) {
            if (!visited[i]){
                if (str[depth].equals(&quot;&lt;&quot;)){
                    if (start &lt; i){
                        visited[i] = true;
                        dfs(i, depth + 1, a+i);
                        visited[i] = false;
                    }
                }
                else {
                    if (start &gt; i){
                        visited[i] = true;
                        dfs(i, depth + 1, a+i);
                        visited[i] = false;
                    }
                }
            }
        }
    }
}
</code></pre>
<p>ps - 제가 쓰는 개발툴이 업데이트가 좀 빨라서 getLast, getFirst 함수를 사용해서 최댓값, 최솟값을 출력했는데 
System.out.println(arr.get(arr.size()-1));
        System.out.println(arr.get(0)); 으로 작성하시면 백준에서 통과 됩니다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[해야할 일이 넘쳐나는 중..]]></title>
            <link>https://velog.io/@east_huni/%ED%95%B4%EC%95%BC%ED%95%A0-%EC%9D%BC%EC%9D%B4-%EB%84%98%EC%B3%90%EB%82%98%EB%8A%94-%EC%A4%91</link>
            <guid>https://velog.io/@east_huni/%ED%95%B4%EC%95%BC%ED%95%A0-%EC%9D%BC%EC%9D%B4-%EB%84%98%EC%B3%90%EB%82%98%EB%8A%94-%EC%A4%91</guid>
            <pubDate>Fri, 30 Aug 2024 15:48:07 GMT</pubDate>
            <description><![CDATA[<p>▷ 우선순위를 알고 효율적으로 일하는 지혜를</p>
<p>▷ 한번에 제대로 일하는 꼼꼼함을</p>
<p>▷ 계획을 제대로 실현하는 책임감을</p>
<p>▷ 생각던 것보다 더 잘할 수 있는 능력을</p>
<p>▷ 내 안에서 혼자하는 생각을 명쾌하게 설명하고 전달하는 현명함을</p>
<p>결국 모든 것은 다 잘될 것이라는 근거없는 자신감은 일을 망칠 뿐이고
제대로 해야 중간도 갈까말까라는 마음으로 겸손하게 임하기</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[java] 프로그래머스 - 정수 제곱근 판별]]></title>
            <link>https://velog.io/@east_huni/java-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-%EC%A0%95%EC%88%98-%EC%A0%9C%EA%B3%B1%EA%B7%BC-%ED%8C%90%EB%B3%84</link>
            <guid>https://velog.io/@east_huni/java-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-%EC%A0%95%EC%88%98-%EC%A0%9C%EA%B3%B1%EA%B7%BC-%ED%8C%90%EB%B3%84</guid>
            <pubDate>Sat, 29 Jun 2024 05:11:14 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/east_huni/post/43b9f867-815f-4ad8-9ff1-8900ec1a6ac/image.png" alt=""></p>
<pre><code class="language-java">import java.lang.Math;
class Solution {
    public long solution(long n) {
        long answer = 0;
        double sqrt = Math. sqrt(n);
        if(sqrt % 1 == 0){
            answer = (long) Math.pow(sqrt + 1, 2);
        }else answer = -1;
        return answer;
    }
}</code></pre>
<p>Math 함수 정리하기 백준으로 문제를 풀다보면, 인텔리제이로 문제를 풀었어서
자동완성 덕에 import 또는 전체 문장을 일일이 적지 않았었는데.. 프로그래머스로 문제를 풀다보니 length() 괄호 이런거 하나로 오류가 발생하기도 한다. 이게 프로그래머스의 장점인거 같기는한듯 ?</p>
<p>Math 함수를 사용하려면 </p>
<pre><code class="language-java">import java.lang.Math;</code></pre>
<p>기억하고 이번 문제에서 사용한 함수만 정리해보자면
Math.sqrt() : 제곱근 구하는 함수 
Math.pow() : 제곱을 구하는 함수
그 외에도 max min 정도 
문제를 풀다가 새로운 함수를 알게되면 다시 정리하러 오겠습니다. </p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[java] SWEA - 19003 팰린드롬 문제]]></title>
            <link>https://velog.io/@east_huni/java-SWEA-19003-%ED%8C%B0%EB%A6%B0%EB%93%9C%EB%A1%AC-%EB%AC%B8%EC%A0%9C</link>
            <guid>https://velog.io/@east_huni/java-SWEA-19003-%ED%8C%B0%EB%A6%B0%EB%93%9C%EB%A1%AC-%EB%AC%B8%EC%A0%9C</guid>
            <pubDate>Thu, 09 May 2024 15:46:32 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/east_huni/post/8ab53027-c9cd-449b-9df9-150eacf398b1/image.png" alt="">
문제해석을 해보자면 
입력받은 문자열이 반대로봐도 똑같은 문자열이라면 팰린드롬이다.
문자열 N 개를 입력받고 문자열 끼리 붙혔을 때도 팰린드롬이 된다면 그 최대길이를 구하는 문제
예를 들어서 #1 예시를 보면 racecar 는 앞으로 보나 뒤로보나 racecar 가되니까 팰린드롬이다.
#2 예시를 보면 abb , bba 자체는 팰린드롬이 아니지만 두문자열을 붙혔을때 
abbbba 는 팰린드롬이 되는것을 볼 수 있다.
즉, 들어와있던 문자열을 뒤집어서 다음 문자열과 비교하는 방식으로 코드를 구현해보았다.</p>
<p>일단 팰린드롬 인지 아닌지의 여부를 알아야하고, 팰린드롬일때 최대 길이가 몇인지를 알아야한다.</p>
<pre><code class="language-java">package SWEA_24_05_09;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.HashSet;
import java.util.Set;
import java.util.StringTokenizer;

public class D3_19003 {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int T = Integer.parseInt(br.readLine());
        for (int test_case = 1; test_case &lt;= T; test_case++) {
            StringTokenizer st = new StringTokenizer(br.readLine());
            int N = Integer.parseInt(st.nextToken());
            int M = Integer.parseInt(st.nextToken());
            int result = 0;
            boolean check = false;
            Set &lt;String&gt; set = new HashSet&lt;&gt;();
            for (int i = 0; i &lt; N; i++) {
                String str = br.readLine();
                if (set.contains(str)){ 
                    result += M * 2;
                }else {
                    if (!check &amp;&amp; pal(str)){
                        check = true;
                        result += M;
                    }else {
                        StringBuilder sb = new StringBuilder(str);
                        set.add(sb.reverse().toString());
                    }
                }
            }
            System.out.println(&quot;#&quot; + test_case + &quot; &quot; + result);
        }
    }
    static boolean pal(String str){
        for (int i = 0; i &lt; str.length()/2; i++) {
            if (str.charAt(i) != str.charAt(str.length()-1 -i)){
                return false;
            }
        }
        return true;
    }

}</code></pre>
<p>check = 팰린드롬인지 여부를 확인하는 용도 
문자열을 입력받고 , 이미 set에 있는 문자열이라면 그냥 result 값에 문자열길이를 2배해서 넣고,
pal 함수를 통해 그 자체가 팰린드롬인게 확인이 되었다면,  문자열길이만큼만 더해준다.
만약 그게 아니라면 StringBuilder 의 reverse 함수를 통해 뒤집은 문자열을 set 에 넣어준다 
그래야 다음 문자열과 비교했을때 같다면 이라는 조건으로 넘어가기 때문</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[java] SWEA - 1928 Base64 Decoder]]></title>
            <link>https://velog.io/@east_huni/java-SWEA-1928-Base64-Decoder</link>
            <guid>https://velog.io/@east_huni/java-SWEA-1928-Base64-Decoder</guid>
            <pubDate>Mon, 29 Apr 2024 13:23:25 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/east_huni/post/53755e9f-4b9e-4444-8e6a-9dbcb8b2e028/image.png" alt="">
<img src="https://velog.velcdn.com/images/east_huni/post/f85227a5-0637-4a91-995e-3392bc90c791/image.png" alt="">
<img src="https://velog.velcdn.com/images/east_huni/post/b29b5a88-333b-41dc-ae65-fd9f62e71566/image.png" alt="">
Base64 함수를 처음봐서 정리하는 글 ..</p>
<p>위의 문제와 출력값을 보면 엄청 번거로운 코딩을 해야한다 ..</p>
<ol>
<li>문자를 입력받고 그 문자에 해당하는 숫자를 반환 </li>
<li>반환 받은 숫자를 6자리 이진수를 일렬로 나열 </li>
<li>나열한 이진수를 8자리씩 끊음.</li>
<li>8자리씩 십진수로 변환</li>
<li>십진수를 아스키코드로 변환 </li>
</ol>
<p>하지만 ?
자바에는 인코딩/디코딩 시에 사용할 수 있는 라이브러리인 java.util.Base64 가 있다.</p>
<pre><code class="language-java">package SWEA_24_04_29;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Base64;

public class D2_1928 {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int T = Integer.parseInt(br.readLine());

        for (int test_case = 1; test_case &lt;= T; test_case++) {
            String str = br.readLine();
            String result = new String(Base64.getDecoder().decode(str));
            System.out.println(&quot;#&quot; + test_case + &quot; &quot; + result);
        }
    }
}</code></pre>
<p>Base64.getDecoder().decode(str)
입력받은 str을 디코딩한 문자열을 가져와서 result에 저장</p>
<pre><code class="language-java">package SWEA_24_04_29;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Base64;

public class D2_1928 {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int T = Integer.parseInt(br.readLine());

        for (int test_case = 1; test_case &lt;= T; test_case++) {
            String str = br.readLine();
            String result = new String(Base64.getEncoder().encode(str.getBytes()));
            System.out.println(&quot;#&quot; + test_case + &quot; &quot; + result);
        }
    }
}</code></pre>
<p>반대로 인코딩한 문자열을 가져와서 result 로 출력도 가능한걸 확인했다.
디코딩/인코딩 = Base64 기억하자</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[java] SWEA - 1954 달팽이 숫자]]></title>
            <link>https://velog.io/@east_huni/java-SWEA-1954-%EB%8B%AC%ED%8C%BD%EC%9D%B4-%EC%88%AB%EC%9E%90</link>
            <guid>https://velog.io/@east_huni/java-SWEA-1954-%EB%8B%AC%ED%8C%BD%EC%9D%B4-%EC%88%AB%EC%9E%90</guid>
            <pubDate>Fri, 26 Apr 2024 02:49:17 GMT</pubDate>
            <description><![CDATA[<p>D1 문제는 다풀었고 D2 문제를 푸는데 한번에 풀리는 문제들도 많고 생각을 많이해봐야하는 문제들도 많았다. 점점 내가 D3는 풀 수 있을지 의문이 들기시작한다.. 알고리즘 공부 더 열심히해야지 
<img src="https://velog.velcdn.com/images/east_huni/post/1f25d34a-f449-4a7b-a405-ce1b6448b7fa/image.png" alt="">
<img src="https://velog.velcdn.com/images/east_huni/post/415b954f-28b4-40a6-b547-3c3b7b71ca30/image.png" alt="">
<img src="https://velog.velcdn.com/images/east_huni/post/947f45a0-d01d-4e20-857c-71ebe8dbd871/image.png" alt="">
위 문제는 혼자서 풀기어려워서 유튜브 풀이를 보고 공부했다. 생각할게 은근 많은 문제여서 정리해봄.</p>
<p>문제내용은 1~N*N 까지 달팽이 모양으로 숫자를 증가해서 2차원 배열에 집어넣는 문제</p>
<p>규칙은 1부터 보면, 배열 크기까지 오른쪽으로 이동 (j 값 1 증가) -&gt; 아래로 이동 (i 값 1 증가) -&gt; 왼쪽으로 이동 (j 값 1 감소) -&gt; 위쪽으로 이동 ( i 값 1 감소)  이게 핵심이라고 생각한다.</p>
<p>이동방향으로 생각하면 
우 하 좌 상 
int [] di = {0, 1, 0, -1} 
int [] dj = {1, 0, -1, 0}</p>
<pre><code class="language-java">package SWEA_24_04_26;

import java.util.Scanner;

public class D2_1954Ref {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int T = sc.nextInt();
        for (int test_case = 1; test_case &lt;= T ; test_case++) {
            int N = sc.nextInt();
            int [][] arr = new int[N][N];
            int [] di = {0, 1, 0, -1};
            int [] dj = {1, 0, -1, 0};
            int i = 0; int j = 0; int dr = 0;
            int count = 1;
            arr[i][j] = count;
            count += 1;
            while (count &lt;= N*N){
                int si = i + di[dr];
                int sj = j + dj[dr];
                if (0 &lt;= si &amp;&amp; si&lt; N &amp;&amp; 0&lt;= sj &amp;&amp; sj &lt;N &amp;&amp; arr[si][sj] == 0){
                    i = si;
                    j = sj;
                    arr[i][j] = count;
                    count += 1;
                }else dr = (dr+1) % 4;
            }
            System.out.println(&quot;#&quot; + test_case);
            for (int k = 0; k &lt; N; k++) {
                for (int l = 0; l &lt; N; l++) {
                    System.out.print(arr[k][l]);
                    System.out.print(&quot; &quot;);
                }
                System.out.println(&quot; &quot;);
            }
        }
    }
}
</code></pre>
<p>if 문을 보면 들어갈 i 와 j 가 범위 안에 들어가 있어야 하고, 들어갈 칸이 값이 없을때 
count 값을 추가하고 그게 아니라면, 방향전환을 해야하기 때문에 dr 값 수정</p>
<p>며칠 있다가 다시 풀어볼 예정이다. 내가 지금 코드를 암기를 한건지 이해를 한건지 나도 잘 모르겠다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[java] 백준 - 큐 10845]]></title>
            <link>https://velog.io/@east_huni/java-%EB%B0%B1%EC%A4%80-%ED%81%90-10845</link>
            <guid>https://velog.io/@east_huni/java-%EB%B0%B1%EC%A4%80-%ED%81%90-10845</guid>
            <pubDate>Fri, 05 Apr 2024 11:45:21 GMT</pubDate>
            <description><![CDATA[<p><img src="blob:https://velog.io/e968d3fe-b951-446a-9e7c-6bae9f27aeab" alt="업로드중..">
자료구조 中 큐에 대해서 공부해보았다.</p>
<pre><code class="language-java">import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.LinkedList;
import java.util.Queue;
import java.util.StringTokenizer;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringBuilder sb = new StringBuilder();
        Queue&lt;Integer&gt; que = new LinkedList&lt;&gt;();
        int last = 0;
        int N = Integer.parseInt(br.readLine());
        for (int i = 0; i &lt; N; i++) {
            StringTokenizer st = new StringTokenizer(br.readLine());
            String str = st.nextToken();
            switch (str){
                case &quot;push&quot;:
                    last = Integer.parseInt(st.nextToken());
                    que.add(last);
                    break;
                case &quot;pop&quot;:
                    if (que.isEmpty()){
                        sb.append(-1).append(&#39;\n&#39;);
                    }
                    else sb.append(que.poll()).append(&#39;\n&#39;);
                    break;
                case &quot;size&quot;:
                    sb.append(que.size()).append(&#39;\n&#39;);
                    break;
                case &quot;empty&quot;:
                    if (que.isEmpty()) sb.append(1).append(&#39;\n&#39;);
                    else sb.append(0).append(&#39;\n&#39;);
                    break;
                case &quot;front&quot;:
                    if (que.isEmpty()){
                        sb.append(-1).append(&#39;\n&#39;);
                    }
                    else sb.append(que.peek()).append(&#39;\n&#39;);
                    break;
                case &quot;back&quot;:
                    if (que.isEmpty()){
                        sb.append(-1).append(&#39;\n&#39;);
                    }
                    else sb.append(last).append(&#39;\n&#39;);
                    break;


            }
        }
        System.out.println(sb);
    }
}</code></pre>
<p>직접 Queue 를 구현해보기도 했음 스택을 공부하고 나니까 훨씬 이해가 쉬워지는 느낌
first 값 last 값 만 기억하면 쉬웠던거 같다.</p>
<pre><code class="language-java">import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class Main {
    public static int[] queue = new int[10001];
    public static int first = 0;
    public static int last = 0;

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringBuilder sb = new StringBuilder();
        int N = Integer.parseInt(br.readLine());
        for (int i = 0; i &lt; N; i++) {
            StringTokenizer st = new StringTokenizer(br.readLine());
            String str = st.nextToken();
            switch (str) {
                case &quot;push&quot;:
                    push(Integer.parseInt(st.nextToken()));
                    break;
                case &quot;pop&quot;:
                    sb.append(pop()).append(&#39;\n&#39;);
                    break;
                case &quot;size&quot;:
                    sb.append(size()).append(&#39;\n&#39;);
                    break;
                case &quot;empty&quot;:
                    sb.append(empty()).append(&#39;\n&#39;);
                    break;
                case &quot;front&quot;:
                    sb.append(front()).append(&#39;\n&#39;);
                    break;
                case &quot;back&quot;:
                    sb.append(back()).append(&#39;\n&#39;);
                    break;
            }

        }
        System.out.println(sb);

    }

    public static void push(int item) {
        queue[last] = item;
        last++;
    }

    public static int pop() {
        if (last - first == 0) {
            return -1;
        } else {
            int value = queue[first];
            first++;
            return value;
        }
    }

    public static int size() {
        return last - first;
    }

    public static int empty() {
        if (last - first == 0) {
            return 1;
        } else return 0;
    }

    public static int front() {
        if (last - first == 0) {
            return -1;
        } else {
            int F = queue[first];
            return F;
        }
    }

    public static int back() {
        if (last - first == 0) {
            return -1;
        } else {
            int B = queue[last - 1];
            return B;
        }
    }
}</code></pre>
]]></description>
        </item>
    </channel>
</rss>