<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>joo_zero_one.log</title>
        <link>https://velog.io/</link>
        <description></description>
        <lastBuildDate>Sat, 15 Nov 2025 14:52:24 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>joo_zero_one.log</title>
            <url>https://velog.velcdn.com/images/joo_zero/profile/241b4158-bf27-4337-961a-84062ced2c9c/image.jfif</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. joo_zero_one.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/joo_zero" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[[farmsystem] 마지막 주차_]]></title>
            <link>https://velog.io/@joo_zero/farmsystem-%EB%A7%88%EC%A7%80%EB%A7%89-%EC%A3%BC%EC%B0%A8</link>
            <guid>https://velog.io/@joo_zero/farmsystem-%EB%A7%88%EC%A7%80%EB%A7%89-%EC%A3%BC%EC%B0%A8</guid>
            <pubDate>Sat, 15 Nov 2025 14:52:24 GMT</pubDate>
            <description><![CDATA[<ol>
<li>RNN의 한계
 •    문장이 길어질수록 앞 내용이 사라짐(기억 유지 어려움)
 •    한 번에 토큰 1개씩만 처리해서 느림
 •    LSTM·GRU도 근본 해결은 못함</li>
</ol>
<ol start="2">
<li>어텐션 메커니즘 등장</li>
</ol>
<p>핵심 아이디어:
“중요한 단어에 더 집중하자!”
    •    인코더의 모든 은닉 상태를 참고함
    •    중요한 단어에는 높은 가중치 부여
    •    다만, 모든 상태를 저장해야 해서 메모리 증가
    •    RNN 기반이라 여전히 느림</p>
<ol start="3">
<li>트랜스포머: RNN을 완전히 버린 모델
 •    병렬 처리 가능 → 엄청 빠름
 •    입력 문장을 전체적으로 한꺼번에 분석
 •    핵심 기술 = 셀프 어텐션(Self-Attention)
→ 각 토큰이 다른 모든 토큰과 관계를 학습</li>
</ol>
<ol start="4">
<li>추가 기술들</li>
</ol>
<p>위치 인코딩(Positional Encoding)
    •    트랜스포머는 순서를 모르기 때문에 sin·cos로 위치 정보 추가</p>
<p>잔차 연결 + 층 정규화
    •    학습 안정
    •    깊은 모델에서도 정보 손실 감소</p>
<p>인코더·디코더 블록
    •    여러 층을 쌓으면 강력한 표현 가능</p>
<ol start="5">
<li>BART / KoBART (텍스트 요약에 특화)
 •    트랜스포머 인코더-디코더 구조
 •    요약, 생성에 아주 강함
 •    KoBART는 한국어 데이터로 파인튜닝됨 → 실사용 가능</li>
</ol>
<ol start="6">
<li>HuggingFace transformers
 •    pipeline() 하나로 요약 / 번역 / 생성 다 가능
 •    모델과 토크나이저는 별도의 객체
 •    GPU 설정도 간단</li>
</ol>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Farm] 5주차_텍스트]]></title>
            <link>https://velog.io/@joo_zero/Farm-5%EC%A3%BC%EC%B0%A8%ED%85%8D%EC%8A%A4%ED%8A%B8</link>
            <guid>https://velog.io/@joo_zero/Farm-5%EC%A3%BC%EC%B0%A8%ED%85%8D%EC%8A%A4%ED%8A%B8</guid>
            <pubDate>Sun, 09 Nov 2025 05:13:01 GMT</pubDate>
            <description><![CDATA[<h2 id="1-순차-데이터--순환-신경망">1. 순차 데이터 + 순환 신경망</h2>
<h4 id="순차-데이터란">순차 데이터란?</h4>
<ul>
<li>텍스트, 시계열 데이터, 일정시간 간격으로 기록된 데이터 처럼 순서에 의미가 있는 데이터</li>
</ul>
<p>이미지 한장을 분류하는 것은 순서가 상관 없다. 모델을 만들 때 골고루 있는 더 좋을 때가 있다.
하지만 그렇지 않은 경우는 순서를 유지해야한다.)</p>
<h4 id=""></h4>
<ul>
<li>피드 포워드 신경망 :: 입력 데이터 흐름이 앞쪽으로 전달되느 신경망</li>
<li>토큰 :: 분리된 단어<ul>
<li>샘플 하나에 토큰 여러개 존재</li>
<li>1개의 토큰이 하나의 타임스텝에 해당한다.</li>
<li>0 : 패딩, 1: 문장의 시작, 2: 어휘사전에 없는 토큰</li>
</ul>
</li>
</ul>
<h4 id="순환-신경망">순환 신경망</h4>
<ul>
<li>일반적인 완전 연결 신경망과 거의 비슷하지만, 이전 데이터를 순환하도록 하는 고리를 붙인다.</li>
<li>이전 샘플에 대한 기억을 가지고 있다.</li>
</ul>
<h3 id="순환-신경망으로-imdb-리뷰-분류">순환 신경망으로 IMDB 리뷰 분류</h3>
<h4 id="imdb-리뷰-데이터셋">IMDB 리뷰 데이터셋</h4>
<pre><code class="language-python">
from tensorflow.keras.datasets import imdb

(train_input, train_target), (test_input, test_target) = imdb.load_data(
    num_words=200)
</code></pre>
<p><img src="https://velog.velcdn.com/images/joo_zero/post/cfbe1c68-49b4-4304-a53d-be6b9cbc9e6b/image.png" alt=""></p>
<h4 id="순환-신경망-만들기">순환 신경망 만들기</h4>
<p><img src="https://velog.velcdn.com/images/joo_zero/post/860fa005-a4be-426d-890f-543c98c0ae00/image.png" alt=""></p>
<h4 id="순환-신경">순환 신경</h4>
<pre><code class="language-python">rmsprop = keras.optimizers.RMSprop(learning_rate=1e-4)
model.compile(optimizer=rmsprop, loss=&#39;binary_crossentropy&#39;,
              metrics=[&#39;accuracy&#39;])

checkpoint_cb = keras.callbacks.ModelCheckpoint(&#39;best-simplernn-model.keras&#39;,
                                                save_best_only=True)
early_stopping_cb = keras.callbacks.EarlyStopping(patience=3,
                                                  restore_best_weights=True)

history = model.fit(train_oh, train_target, epochs=100, batch_size=64,
                    validation_data=(val_oh, val_target),
                    callbacks=[checkpoint_cb, early_stopping_cb])


</code></pre>
<pre><code class="language-python">
plt.plot(history.history[&#39;loss&#39;])
plt.plot(history.history[&#39;val_loss&#39;])
plt.xlabel(&#39;epoch&#39;)
plt.ylabel(&#39;loss&#39;)
plt.legend([&#39;train&#39;, &#39;val&#39;])
plt.show()
</code></pre>
<p><img src="https://velog.velcdn.com/images/joo_zero/post/7ef22526-c105-466c-8442-7abf56eac19f/image.png" alt=""></p>
<h3 id="단어-임베딩-사용하기">단어 임베딩 사용하기</h3>
<pre><code class="language-python">
model2 = keras.Sequential()

model2.add(keras.layers.Embedding(200, 16, input_shape=(100,)))
model2.add(keras.layers.SimpleRNN(8))
model2.add(keras.layers.Dense(1, activation=&#39;sigmoid&#39;))

model2.summary()
</code></pre>
<pre><code class="language-python">
plt.plot(history.history[&#39;loss&#39;])
plt.plot(history.history[&#39;val_loss&#39;])
plt.xlabel(&#39;epoch&#39;)
plt.ylabel(&#39;loss&#39;)
plt.legend([&#39;train&#39;, &#39;val&#39;])
plt.show()
</code></pre>
<p><img src="https://velog.velcdn.com/images/joo_zero/post/d636ac5d-2723-435f-9a6f-766810696b6f/image.png" alt=""></p>
<h3 id="lstm과-gru-셀">LSTM과 GRU 셀</h3>
<ul>
<li>LSTM : 장단기 메모리</li>
<li>GRU : 게이트 순환 유닛</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Farm] 4주차_ 신경망 + kaggle 따라해보기]]></title>
            <link>https://velog.io/@joo_zero/Farm-4%EC%A3%BC%EC%B0%A8-%EC%8B%A0%EA%B2%BD%EB%A7%9D-kaggle-%EB%94%B0%EB%9D%BC%ED%95%B4%EB%B3%B4%EA%B8%B0</link>
            <guid>https://velog.io/@joo_zero/Farm-4%EC%A3%BC%EC%B0%A8-%EC%8B%A0%EA%B2%BD%EB%A7%9D-kaggle-%EB%94%B0%EB%9D%BC%ED%95%B4%EB%B3%B4%EA%B8%B0</guid>
            <pubDate>Sun, 02 Nov 2025 11:54:39 GMT</pubDate>
            <description><![CDATA[<p>저번시간 끝까지 다루지 못했던 신경망 모델 훈련도 작성해보고, 우리가 하려는 프로젝트에 맞는(kaggle 에 있는) 코드도 작성해보고자 한다.
4가지 정도를 따라해봤는데, 그 중 상위 2가지만 작성해보려 한다.</p>
<h3 id="인공-신경망으로-패션-아이템-분류하기">인공 신경망으로 패션 아이템 분류하기</h3>
<ul>
<li>케라스 모델은 훈련하기 전 설정 단계가 존재</li>
<li>complite() 메서드에서 수행한다.</li>
<li>필수로 지정할 것은 손실함수의 종류이다.<pre><code class="language-python">model.compile(loss=&#39;sparse_categorical_crossentropy&#39;, metrics=[&#39;accuracy&#39;])
</code></pre>
</li>
</ul>
<pre><code>![](https://velog.velcdn.com/images/joo_zero/post/087b89e2-bf66-43cf-af47-233ee5296071/image.png)
![](https://velog.velcdn.com/images/joo_zero/post/e0a2c81f-a98d-4a6e-ad3d-a2e7a99ee836/image.png)


### kaggle Student Performance(Multiple Linear Regression)

#### 1. kaggle Student Performance

1. 데이터 불러오기 
- 기본 통계 확인(info(), describe())
``` python
import pandas as pd
df = pd.read_csv(&quot;farm/kaggle/input/students-performance-in-exams/StudentsPerformance.csv&quot;)
df.info(); df.describe()</code></pre><ol start="2">
<li>EDA</li>
</ol>
<ul>
<li>이상치 확인</li>
<li>성별 인종 부모학력 점심 등 점수 분포 시각화<pre><code class="language-python">import seaborn as sns, matplotlib.pyplot as plt
sns.countplot(x=&#39;gender&#39;, data=df)
sns.boxplot(x=&#39;test_preparation_course&#39;, y=&#39;math_score&#39;, data=df)
sns.heatmap(df.corr(), annot=True)

</code></pre>
</li>
</ul>
<pre><code>3. 데이터 전처리
- 범주형변수인코딩
- 새로운 피처 생성
- 데이터셋 분할(train_test_split)
``` python
from sklearn.preprocessing import LabelEncoder
le = LabelEncoder()
df[&#39;gender&#39;] = le.fit_transform(df[&#39;gender&#39;])
df = pd.get_dummies(df, drop_first=True)
df[&#39;average_score&#39;] = df[[&#39;math_score&#39;,&#39;reading_score&#39;,&#39;writing_score&#39;]].mean(axis=1)
</code></pre><ol start="4">
<li>모델 학습 및 평가</li>
</ol>
<ul>
<li>LinearRegression, LogisticRegression, RandomForestClassfier 등 비교</li>
<li>예측 결과 시각화 및 정확도 평가<pre><code class="language-python">from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression, LogisticRegression
from sklearn.ensemble import RandomForestClassifier
</code></pre>
</li>
</ul>
<p>X = df.drop(&#39;average_score&#39;, axis=1)
y = df[&#39;average_score&#39;]
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)</p>
<p>lr = LinearRegression().fit(X_train, y_train)
rf = RandomForestClassifier().fit(X_train, y_train.round())  # 분류형 예시</p>
<pre><code>#### 2. Student Performance ((Multiple Linear Regression)
1. 데이터 불러오기/기초 확인
``` python
import pandas as pd  
df = pd.read_csv(&quot;…Student-Performance-Multiple-Linear-Regression.csv&quot;)  
df.info(); df.describe()
</code></pre><ol start="2">
<li>EDA</li>
<li>데이터 전처리 및 특징 엔지니어링</li>
</ol>
<ul>
<li>학습용 데이터셋 / 테스트용 데이터 셋 나누어짐</li>
</ul>
<ol start="4">
<li>다변량 선형 회귀<pre><code class="language-python">from sklearn.linear_model import LinearRegression  
lr = LinearRegression()  
lr.fit(X_train, y_train)  
y_pred = lr.predict(X_test)</code></pre>
</li>
</ol>
<ul>
<li>여러 독립변수를 사용해서 종속변수 예측</li>
<li>모델의 유의성 분석이 존재.</li>
</ul>
<ol start="5">
<li>모델 평가 및 해석</li>
</ol>
<ul>
<li>회귀모형이 얼마나 잘 들어맞는지 R² 값, 잔차 분석 등을 통해 평가. 각 독립변수가 얼마나 유의미한지(p-value) 분석: 공부시간, 이전시험점수는 유의</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Farm] 3주차 _ 딥러닝 시작하기]]></title>
            <link>https://velog.io/@joo_zero/Farm-3%EC%A3%BC%EC%B0%A8-%EB%94%A5%EB%9F%AC%EB%8B%9D-%EC%8B%9C%EC%9E%91%ED%95%98</link>
            <guid>https://velog.io/@joo_zero/Farm-3%EC%A3%BC%EC%B0%A8-%EB%94%A5%EB%9F%AC%EB%8B%9D-%EC%8B%9C%EC%9E%91%ED%95%98</guid>
            <pubDate>Sun, 19 Oct 2025 09:37:06 GMT</pubDate>
            <description><![CDATA[<h2 id="인공신경망이란-">인공신경망이란 ?</h2>
<ol>
<li>가장 기본적인 인공 신경망은 확률적 경사 하강법을 사용하는 로지스틱 회귀와 같다.</li>
<li>이미지, 음성, 텍스트 분야에서 효과적인 성능</li>
</ol>
<p>패션 MNIST</p>
<pre><code class="language-python">(train_input, train_target), (test_input, test_target) = keras.datasets.fashion_mnist.load_data()

import matplotlib.pyplot as plt

fig, axs = plt.subplots(1, 10, figsize=(10,10)) 
for i in range(10):
    axs[i].imshow(train_input[i], cmap=&#39;gray_r&#39;)
    axs[i].axis(&#39;off&#39;)
plt.show()
</code></pre>
<p>unique 확인</p>
<pre><code class="language-python">    import numpy as np
    print(np.unique(train_target,return_counts=True))
</code></pre>
<p>딥러닝 라이브러리</p>
<ul>
<li>다른 머신러닝 라이브러리와 다르게 GPU사용하여 인공신경망 훈련한다.</li>
<li>(백터/행렬 연산에 최적화)</li>
</ul>
<p>심층신경망 만들기</p>
<pre><code class="language-python">dense1 = keras.layers.Dense(100, activation=&#39;sigmid&#39;, input_shape=(784,))
dense2 = keras.layers.Dense(10, activation=&#39;softmax&#39;)
</code></pre>
<ul>
<li>뉴련 개수는 직접 판단해야하는 것이다. </li>
<li>정보손실이 없도록 하기 위해 출력층의 유닛 개수보다 많은게 좋음</li>
</ul>
<p>층을 여러개 추가하는 방법도 있음 = Dense() 클래스 &gt; Sequential()에서 바로 하는 것</p>
<pre><code class="language-python">model = keras.Sequential([
    keras.layers.Dense(100, activation=&#39;sigmid&#39;, input_shape=(784,) , name=&#39;hidden&#39;),
    keras.layers.Dense(10, activation=&#39;softmax&#39;, name=&#39;output)
    ], name=&#39;패션 MNIST model&#39;)</code></pre>
<p>모델에 .add()로 원하는 만큼 추가 가능</p>
<pre><code class="language-python">model = keras.Sequential()
model.add(keras.layers.Dense(100, activation=&#39;sigmid&#39;, input_shape=(784,) , name=&#39;hidden&#39;))
model.add(keras.layers.Dense(10, activation=&#39;softmax&#39;, name=&#39;output))
model.add(keras.layers.Dense(10, activation=&#39;softmax&#39;, name=&#39;output))
</code></pre>
<p>확인해볼 명령어</p>
<pre><code class="language-python">model.summary()</code></pre>
<p>훈련하는 것은 동일</p>
<pre><code class="language-python">model.compile(loss=&#39;sparse_categorial_crossentropy&#39;, metrics=&#39;accuracy&#39;)
model.fit(tranin_scaled, train_target, epochs=5)</code></pre>
<p>Flatten()을 사용하여 추가</p>
<pre><code class="language-python">model=keras.Sequential()
model.add(keras.layers.Flatten(input_shape=(238,28), name=&#39;flatten&#39;))
model.add(keras.layers.Dense(100, activation=&#39;sigmid&#39;, input_shape=(784,) , name=&#39;hidden&#39;))
model.add(keras.layers.Dense(10, activation=&#39;softmax&#39;, name=&#39;output))
</code></pre>
<ul>
<li>.reshape() 필요가 없어진다.</li>
</ul>
<p>ps. 앙상블 알고리즘 vs 심층신경망</p>
<ol>
<li>앙상블 알고리즘</li>
</ol>
<ul>
<li>여러개의 모델로 예측을 앙상블</li>
<li>얘는 각각의 모델들이 독립적으로 훈련됨</li>
<li>정형 데이터에 적합(DB, 엑셀 등)</li>
</ul>
<ol start="2">
<li>심층 신경망</li>
</ol>
<ul>
<li>은닉층만 보면, 여러층의 뉴런을 쌓아 최종 출력값을 계산</li>
<li>뉴런들이 동시에 훈련됨</li>
<li>더 길게 층을 쌓아서 단계적 학습기능</li>
<li>비정형 데이터에 적합(이미지, 텍스트 등)</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Farm] 2주차 _ 이론학습]]></title>
            <link>https://velog.io/@joo_zero/Farm-4-5%EC%B1%95%ED%84%B0</link>
            <guid>https://velog.io/@joo_zero/Farm-4-5%EC%B1%95%ED%84%B0</guid>
            <pubDate>Sun, 12 Oct 2025 04:35:20 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/joo_zero/post/6df36084-7e07-4fea-a9ac-bb4d30f3b8b4/image.png" alt=""></p>
<h3 id="로지스틱-회귀">로지스틱 회귀</h3>
<ol>
<li>표준화 할 때 훈련세트의 통계값으로 테스트 세트를 변환해야한다.</li>
<li>로지스틱 회귀가 이진 분류에서 확률을 출력하기 위해 사용하는 것으로 선형 방정식의 출력을 0~1 사이의 값으로 하여 이진 분류를 위해 사용한다.</li>
<li>로지스틱 회귀가 이진 분류에서 확률을 출력하기 위해 쓰는 함수는 시그모이드 함수다.</li>
<li>다중분류에서는 여러개의 선형방정식 출력값을 0~1 사이로 압축하고 합이 1이 되도록 하는 소프트 맥스 함수 사용하기</li>
<li>선형 분류 알고리즘</li>
</ol>
<h3 id="과대과소-적합">과대/과소 적합</h3>
<pre><code class="language-python">import numpy as np
import matplotlib.pyplot as plt

sc = SGDClassifier(loss=&#39;log_loss&#39;, random_state=42)

train_score = []
test_score = []

classes = np.unique(train_target)

for _ in range(0, 300):
    sc.partial_fit(train_scaled, train_target, classes=classes)

    train_score.append(sc.score(train_scaled, train_target))
    test_score.append(sc.score(test_scaled, test_target))

plt.plot(train_score, label=&#39;train_score&#39;)
plt.plot(test_score, label=&#39;test_score&#39;)
plt.xlabel(&#39;epoch&#39;)
plt.ylabel(&#39;accuracy&#39;)
plt.legend(loc=&#39;lower right&#39;)
plt.title(&#39;과대/과소 적합확인&#39;)
plt.show()
</code></pre>
<ul>
<li>에포크 수를 많은 경우 과대적합</li>
<li>에포크 수가 적으면 과소적합</li>
</ul>
<h3 id="트리-알고리즘">트리 알고리즘</h3>
<h2 id="1-결정트리">1. 결정트리</h2>
<ul>
<li><p>모델 :: 스무고개와 비슷
<img src="https://velog.velcdn.com/images/joo_zero/post/370a6afe-4ad4-4f88-b056-31ce036d94a6/image.png" alt=""></p>
</li>
<li><p>출처 : Baek Kyun Shin </p>
</li>
</ul>
<h4 id="지니-불순도">지니 불순도</h4>
<ul>
<li>노드에서 데이터를 분할할 기준을 정할 때 사용</li>
<li>O :: 순수한 노드, 0.5 :: 최악의 지니 불순도</li>
<li>지니 불순도 = 1 - (음성 클래스 비율 ^2 + 양성 클래스 비율^2)</li>
</ul>
<h4 id="엔트로피">엔트로피</h4>
<ul>
<li>지니 불순도와 동일하게 결정트리의 불순도를 구하는데 사용</li>
<li>수식에서 지니는 제곱을 사용하고 엔트로피는 로그를 사용(차이점)</li>
</ul>
<h4 id="pruning">Pruning</h4>
<ul>
<li>== 가지치기</li>
<li>트리의 가지가 계속 많아지면 모델의 정확성이 떨어진다. 즉 일반화가 안된다.</li>
</ul>
<h2 id="교차-검증과-그리드-서치">교차 검증과 그리드 서치</h2>
<ul>
<li>훈련세트(약 60%), 검증세트 (약 20%), 테스트세트(약 20%)정도로 구분 (구글링)</li>
</ul>
<h4 id="cross-validation">Cross Validation</h4>
<ul>
<li>검증세트를 떼어내서 평가하는 과정을 여러번 반복</li>
<li>K-Fold Cross Validation<ul>
<li>k-1개의 훈련세트와 1개의 검증세트를 만들고 학습하고 검증. ( 이를 k 번 반복 )</li>
</ul>
</li>
</ul>
<h4 id="그리드-서치">그리드 서치</h4>
<ul>
<li>하이펄파라미터 탐색을 자동화 해주는 도구</li>
</ul>
<h4 id="랜덤-서치">랜덤 서치</h4>
<ul>
<li>그리드 서치하는 시간이 오래걸리면 사용해보기</li>
</ul>
<h3 id="트리의-앙상블">트리의 앙상블</h3>
<ul>
<li><p>정형 데이터 : 표, 그래프와 같이 정리되어 있는 것</p>
</li>
<li><p>반정형 데이터 : csv, JSON, XML</p>
</li>
<li><p>비정형 데이터 : .avi, .wav, .JPG</p>
</li>
<li><p>n_jobs를 -1로 설정</p>
</li>
</ul>
<h4 id="앙상블-학습">앙상블 학습</h4>
<ul>
<li>더 좋은 예측 결과를 만들기 위해 여러개의 모델을 훈련하는 알고리즘 (머신러닝)</li>
</ul>
<h4 id="랜덤-포레스트">랜덤 포레스트</h4>
<ul>
<li>대표적인 결정 트리 기반의 앙상블 학습 방법</li>
</ul>
<h4 id="엑스트라-트리">엑스트라 트리</h4>
<ul>
<li>랜덤 포레스트와 비슷한데 부트스트랩 샘플 사용 X</li>
<li>램덤하게 노드를 분할하여 과대적합을 방지</li>
</ul>
<hr>
<p>양도 많고 어렵다 ...</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Farm] 1주차 _ 혼공머]]></title>
            <link>https://velog.io/@joo_zero/Farm-1%EC%A3%BC%EC%B0%A8-%ED%98%BC%EA%B3%B5%EB%A8%B8</link>
            <guid>https://velog.io/@joo_zero/Farm-1%EC%A3%BC%EC%B0%A8-%ED%98%BC%EA%B3%B5%EB%A8%B8</guid>
            <pubDate>Sun, 05 Oct 2025 10:15:53 GMT</pubDate>
            <description><![CDATA[<h1 id="계획서">계획서</h1>
<p><img src="https://velog.velcdn.com/images/joo_zero/post/4d3ff159-57f9-4745-946e-dacd7126837f/image.png" alt=""></p>
<p>현재 혼자 공부하는 ~ 시리즈의 책으로 공부를 진행하려고 한다.
13주차까지 계획을 세웠는데, 회의하여 10주차에 맞춰서 다시 계획을 작성할 예정이다.</p>
<h2 id="목표">목표</h2>
<blockquote>
<p>사용자가 특정 포맷의(pdf, docx, txt) 논문, 과제를 포함한 텍스트 데이터를 입력하면 이를 AI, Human으로 분류하여 분석</p>
</blockquote>
<p>인공지능 공부 안해봐서 잘 모르는데, 지피티 킬러 같은 느낌인 것 같다.
일정 상 분석까지만 하는 걸로 하였는데, 기간이 끝나더라도 목표한 것까지 완료해보고 싶다.</p>
<p><img src="https://velog.velcdn.com/images/joo_zero/post/8d6877d9-2ba3-4eb6-b75c-2859fd70444b/image.png" alt=""></p>
<p>교재는 해당 교재이다. 
&#39;딥 러닝을 이용한 자연어 처리 입문&#39;과 위 교재를 두고 고민했는데, 팀원들의 의견에 맞춰 실습 위주인 책으로 골랐다.</p>
<h1 id="1주차-내용">1주차 내용</h1>
<p>1주차에는 1~3까지의 챕터를 진행하기로 했고, 일단 코랩 설정까지 해야한다.
그 전까지는 기본 이론 내용이여서 해당 글에는 작성하지 않겠다.
계정은 동국대 계정으로 코랩을 진행할 예정이다.</p>
<p><img src="https://velog.velcdn.com/images/joo_zero/post/2cd239fa-0b51-42e2-8ed4-9937676e3dfd/image.png" alt="">
코랩은 전에 사용했던 설정 그대로 사용하면 될 것 같다.</p>
<p><img src="https://velog.velcdn.com/images/joo_zero/post/a816cf9e-8061-4064-8eae-0fe580097d49/image.png" alt=""></p>
<hr>
<p>아직은 크게 진행된 내용이 없는데, 2주차에는 조금 더 많은 내용과 깊이있는 내용을 작성하고 싶다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[가비지컬렉션]]></title>
            <link>https://velog.io/@joo_zero/%EA%B0%80%EB%B9%84%EC%A7%80%EC%BB%AC%EB%A0%89%EC%85%98</link>
            <guid>https://velog.io/@joo_zero/%EA%B0%80%EB%B9%84%EC%A7%80%EC%BB%AC%EB%A0%89%EC%85%98</guid>
            <pubDate>Thu, 25 Sep 2025 05:44:06 GMT</pubDate>
            <description><![CDATA[<h3 id="가비지컬렉션을-왜">가비지컬렉션을 왜?</h3>
<p>가비지컬렉션이란 쓰레기 값 :: <strong>참조되지 않는 값</strong>을 의미한다.
JVM이 지워준다고 하는데, 왜 우리가 신경을 써야할까 ?</p>
<h3 id="파일은-어떻게-저장될까">파일은 어떻게 저장될까</h3>
<p><img src="https://velog.velcdn.com/images/joo_zero/post/a4e6ae44-98da-445e-b540-a706f92fed08/image.png" alt=""></p>
<p>같은 파일에 속성을 보았을 때, 왜 크기와 디스크할당크기가 나뉘어있고 크기가 다를까?</p>
<ol>
<li><p>컴퓨터는 보조기억장치와 주기억장치로 나뉘어 있다. 디스크는 어디와 더 가까운 걸까?</p>
<blockquote>
<p>보조기억장치에 더 가깝다.</p>
</blockquote>
</li>
<li><p>저장할 때는 1byte로 저장을 했는데, 사용할 때 사용되는 크기는 이제 (TLS)8kb로 사용하게 될 것이다. 
+  ssd는 하드디스크랑 다르게 덮어쓰기가 불가능하다. read/write이 8kb와같이 크다면, 어떻게 구성해야하나 ?</p>
</li>
</ol>
<h3 id="그럼-이-때-가비지컬렉션은-언제-하는걸까-">그럼 이 때 가비지컬렉션은 언제 하는걸까 ?</h3>
<p>SSD는 새로운 데이터를 쓰기 위해서 크게 3가지의 과정을 거친다.
*<em>1. 유효한 페이지 복사
2. 블록 전체 삭제
3. 새로운 데이터 쓰기
*</em></p>
<p>[쉽게 말하면,]</p>
<blockquote>
<ol>
<li>참조를 끊어놓는다. (실제 삭제하지 않음)</li>
<li>OS 자체에서 사용자가 보조기억장치만 쓰고 주기억장치가 사용되고있지 않다고 판단되면, 그때 실제로 삭제한다. 
ex ) 게임하는데 갑자기 PC가 우웅하면서 재부팅 되는 느낌이 드는 것 
=&gt; 가비지컬렉션 하는 것</li>
</ol>
</blockquote>
<ol start="3">
<li>그렇다면 예를 들어보자.
3-1.정말 꽉 찬 usb(블록) 두개가 있다고 가정하자. 
3-2. ssd 100%로 사용한다고 하자
3-3. 그럼 블록을 복사해두고 사용해야할텐데,어떻게 하나?
3-4. usb 속성을 보면,  용량이 <strong>자연수가 아닌 소수</strong>로 끝난다. 
이때, 남은 소수점자리는 뭐하나 ??</li>
</ol>
<p><img src="https://velog.velcdn.com/images/joo_zero/post/a1072566-3cc8-4468-8f0d-7ba16ebb35a5/image.png" alt="//reddit사이트의 r/Windows10님 사진"></p>
<blockquote>
<p>유효블록을 남겨둔 것이다.
<strong>1. 가비지컬렉션하기위해
2. 성능 좋게하기 위해서
3. 복원 잘 할 수 있기 위해서</strong></p>
</blockquote>
<hr>
<p>내용을 어지럽게 써둔 것 같은데 다시 공부를 하고 잘 정리해야겠다. 이제 HW의 가격을 내리고 크기를 올리는 추세라고 하는데, 이거에 대응되는 SW를 만들기 위해 저장공간/가비지컬렉션 하는 방법을 주의하면서 공부해야겠다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[이진탐색]]></title>
            <link>https://velog.io/@joo_zero/%EC%9D%B4%EC%A7%84%ED%83%90%EC%83%89-s1d3npbi</link>
            <guid>https://velog.io/@joo_zero/%EC%9D%B4%EC%A7%84%ED%83%90%EC%83%89-s1d3npbi</guid>
            <pubDate>Fri, 19 Sep 2025 08:33:42 GMT</pubDate>
            <description><![CDATA[<p>* c++ 말고 python입니다. </p>
<h1 id="이진탐색">이진탐색</h1>
<ul>
<li>정렬되어 있는 리스트에서 탐색 범위를 절반씩 나누어 데이터를 탐색하는 방법으로, 시작점, 끝점, 중간점을 이용<h3 id="순차탐색">순차탐색</h3>
</li>
<li>리스트 안에 있는 특정한 데이터를 찾기 위해 앞에서부터 데이터를 하나씩 확인하는 방법</li>
</ul>
<h1 id="특징">특징</h1>
<ul>
<li>단계마다 탐색 범위를 2로 나누는 것과 동일하기 때문에 log2N에 비례한다.</li>
<li>이진탐색은 탐색범위를 절반씩 줄어든다.</li>
<li>시간복잡도 O(logN)<h1 id="예시">예시</h1>
<h3 id="찾고자-하는-값">찾고자 하는 값</h3>
4<h3 id="1단계">1단계</h3>
</li>
<li>(인덱스) : 시작점 : 0, 끝점: 9, 중간점 4(소수점 이하 제거)</li>
<li>List : [0,2,4,6,8,10,12,14,16,18]</li>
</ul>
<ol>
<li>List[중간점:4]의 값은 8이 된다.</li>
<li>8의 값이 찾고자 하는 값보다 크기 때문에, 끝점이 9-&gt;3로 변경된다.</li>
</ol>
<ul>
<li>끝점 수식 : 중간점 - 1<h3 id="2단계">2단계</h3>
</li>
<li>(인덱스) : 시작점 : 0, 끝점 : 3, 중간점 : 1</li>
<li>List : [0,2,3,6]</li>
</ul>
<ol>
<li>List[중간점:1]의 값은 2가 된다.</li>
<li>2가 찾고자 하는 값(4) 보다 작기 때문에, 시작점이 0-&gt;2 로 변경된다.</li>
</ol>
<ul>
<li>시작점 수식 : 중간점 + 1<h3 id="3단계">3단계</h3>
</li>
<li>(인덱스) : 시작점 : 2, 끝점 : 3, 중간점 :2</li>
<li>List : [4,6]</li>
</ul>
<ol>
<li>List[중간점:2]의 값은 4가 된다.</li>
<li>4가 찾고자 하는 값 (4)와 같기 때문에 로직은 끝나게 된다.</li>
</ol>
<ul>
<li>찾고자 하는 값 수식 : 중간 == 찾고자 하는 값</li>
</ul>
<h1 id="코드">코드</h1>
<pre><code class="language-python">

def binary_search(array, target, start, end):
   while start &lt;= end:
       mid = (start+end) // 2
       if array[mid] == target:
           return mid
       elif array[mid] &gt; target:
           end = mid-1
       else:
           start = mid+1

    retrun None


n, target = list(map(int, input().split()))
array = list(map(int, input().split()))

result = binary_search(array, target, 0, n-1)

if result == None:
    print(&quot;원소가 존재하지 않습니다.&quot;)
else:
    print(result + 1)

</code></pre>
<h1 id="자주-쓰이는-python라이브러리">자주 쓰이는 Python라이브러리</h1>
<ul>
<li>bisect_left(array,x) : 정렬된 순서를 유지하면서 배열 array에 x를 삽입할 가장 왼쪽 인덱스를 반환</li>
<li>bisect_right(array, x) : 정렬된 순서를 유지하면서 배열 array에 x를 삽입할 가장 오른쪽 인덱스를 반환
<img src="https://velog.velcdn.com/images/joo_zero/post/a3ab3927-12dc-4321-9d4f-39507f4f16f7/image.png" alt=""></li>
</ul>
<pre><code class="language-python">from bisect import bisect_left, bisect_right

a= [1,2,4,4,8]
x = 4

print(bisect_left(a,x))
print(bisect_right(a,x))</code></pre>
<p>[]실행결과 
2
4</p>
<h2 id="값이-특정-범위에-속하는-데이터-개수-구하기">값이 특정 범위에 속하는 데이터 개수 구하기</h2>
<pre><code class="language-python">
from bisect import bisect_left, bisect_right

def count_by_range(a, left_value, right_value):
    right_index = bisect_right(a, right_value)
    left_index = bisect_left(a, left_value)
    return right_index - left_index


a = [1,2,3,3,3,3,4,4,8,9]

# 값이 4인 데이터 개수 출력
print(count_by_range(a,4,4))

# 값이 [-1, 3] 범위에 있는 데이터 개수 출력
print(count_by_range(a, -1, 3))
</code></pre>
<p>[]실행결과
2
6</p>
<h1 id="활용-예시">활용 예시</h1>
<ul>
<li>파라메트릭 서치</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[알고리즘 정리]]></title>
            <link>https://velog.io/@joo_zero/%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-%EC%A0%95%EB%A6%AC</link>
            <guid>https://velog.io/@joo_zero/%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-%EC%A0%95%EB%A6%AC</guid>
            <pubDate>Fri, 12 Sep 2025 14:09:37 GMT</pubDate>
            <description><![CDATA[<h3 id="현재-공부하고-있는-알고리즘-정리해보기">현재 공부하고 있는 알고리즘 정리해보기</h3>
<ol>
<li><p>주차마다 배운 내용 정리</p>
</li>
<li><p>개념은 해당 페이지에 이어서 정리</p>
</li>
<li><p>코드 정리는 주차씩 블로그 만들어서 정리</p>
</li>
<li><p>** 알고있는  개념이여도 다 적어둘 것**</p>
</li>
</ol>
<hr>
<hr>
<h2 id="1-재귀함수">1. 재귀함수</h2>
<ul>
<li>큰 문제를 부분 문제로 나눠 풀 때 사용</li>
<li>반드시 기저사례를 사용할 것</li>
<li>사이클이 있다면 사용 금지</li>
<li>반복문이 될 수 있다면, 반복문으로 구현</li>
<li><strong>이해가 가지 않는다면, 그림으로 그려보기</strong></li>
</ul>
<h3 id="ex1-팩토리얼">ex1. 팩토리얼</h3>
<p>5! = 5 x 4 x 3 x 2 x 1
---&gt; n x n-1 x n-2 x n-3 x n-4
f(n) = n(n-1)
f(n-1) = (n-1)(n-2)
f(n-2) = (n-2)(n-3)</p>
<pre><code class="language-c++">//코드

int fac(int n){
    if(n==1) return 1;
    return n * f(n-1);
}</code></pre>
<h4 id="ex2-피보나치">ex2. 피보나치</h4>
<p>0 + 1 + 1 + 2 + 3 = 5
<img src="https://velog.velcdn.com/images/joo_zero/post/ce7bacfc-2beb-48cc-a03d-6fb2b0d4dd60/image.png" alt=""></p>
<pre><code class="language-c++">//코드

int fivo(int n){
    if(n==1 || n==0) return n;
    return f(n-1) + f(n-1);
}</code></pre>
<h3 id="ex3-하노이탑-⭐">ex3. 하노이탑 ⭐</h3>
<ol>
<li>맨 마지막을 제외(n-1)을 제외하고 temp에 넣어주기</li>
<li>맨 마지막을 to(옮길 위치)에 넣어주기</li>
<li>맨 마지막을 to(옮길 위치)에 넣어주기<pre><code class="language-c"></code></pre>
</li>
</ol>
<p>void hanoi(int n, char from, char temp, char to){
    if(n==1) printf(&quot;원판 1을 %c -&gt; %c로 이동\n&quot;, from, to); // 마지막 넣는 것
    else{
        hanoi(n-1, from, to, temp);
        printf(&quot;%d를 %c -&gt; %c로 이동\n&quot;, n-1, from, to);
        hanoi(n-1, temp, from, to);
    }</p>
<p>}</p>
<p>int main(){
    hanoi(4, &#39;A&#39;, &#39;B&#39;,&#39;C&#39;);
    return 0;
}</p>
<pre><code>


## 2. 순열
-  순서와 상관 있게 뽑는 것 :: 순열
-  순서와 상관없이 뽑는 것 :: 조합
- 정렬이 되어 있어야함.

 next_permutation(시작, 끝); :: 오름차순
 ~~prev_permutation(시작, 끝); :: 내림차순~~

 &gt; [공식]
 nPr : n! / (n-r)!
 n : 몇개중에
 r : 몇개 뽑을 건지


``` c++
//코드

vector&lt;int&gt; v = {2,1,3};
int a[] = {1,2,3};

sort(v.begin(), v.end());
sort(&amp;a[0], &amp;a[0]+3);

next_permutation(v.begin(), v.end());
next_permutation(&amp;a[0], &amp;a[0]+3);
next_permutation(a, a+3);
</code></pre><h3 id="2-1-재귀함수로-만드는-순열">2-1. 재귀함수로 만드는 순열</h3>
<ol>
<li><p>기본순열</p>
<pre><code class="language-c++">//코드

next_permutation(v.begin(), v.end());</code></pre>
</li>
<li><p>재귀함수로 만드는 순열</p>
</li>
</ol>
<ul>
<li><p><strong>이해가 안된다면, 꼭 그림 그려서 파악해보기</strong></p>
<pre><code class="language-c++">
int make_permutation(int n, int r, int depth){
  if(r==depth) return;

 for(int i=depth; i&lt;n;i++){
     swap(v[r], v[depth]);
     make_permutation(n, r, depth+1);
     swap(v[r], v[depth]);
 }
 return;
}
</code></pre>
<p><img src="https://velog.velcdn.com/images/joo_zero/post/87ea59a6-4d4f-4bae-9af4-b20f93b752de/image.png" alt=""></p>
</li>
</ul>
<hr>
<h2 id="2-메모리">2. 메모리</h2>
<ul>
<li>메모리는 16진수로 이뤄져 있으며, 1byte씩 사용됨</li>
<li>포인터 변수는 자료형에 상관 없이 항상 8byte(64bit기준)</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[백준 - 18870 좌표 압축]]></title>
            <link>https://velog.io/@joo_zero/%EB%B0%B1%EC%A4%80-18870-%EC%A2%8C%ED%91%9C-%EC%95%95%EC%B6%95</link>
            <guid>https://velog.io/@joo_zero/%EB%B0%B1%EC%A4%80-18870-%EC%A2%8C%ED%91%9C-%EC%95%95%EC%B6%95</guid>
            <pubDate>Wed, 11 Sep 2024 10:05:55 GMT</pubDate>
            <description><![CDATA[<h3 id="💡문제-분석-요약">💡문제 분석 요약</h3>
<ul>
<li>N개 만큼 입력 된 좌표에 대한 촤표압축 문제</li>
<li></li>
</ul>
<h3 id="💡알고리즘-설계">💡알고리즘 설계</h3>
<ul>
<li>입력한 리스트에 대해 오름차순 정렬을 한 후 중복제거를 해준다.</li>
<li>key : 작은 좌표부터 큰 좌표 순으로 저장</li>
<li>value: 본인 좌표보다 작은 좌표의 개수 저자</li>
<li>본인 좌표보다 작은 좌표의 개수를 출력</li>
</ul>
<h3 id="💡코드">💡코드</h3>
<pre><code class="language-python">
import sys

N = int(sys.stdin.readline().strip())

X = list(map(int, sys.stdin.readline().strip().split()))

X_sort = sorted(list(set(X)))

dic = {}
for i in range(len(X_sort)):
  dic[X_sort[i]] = i

for i in X:
  print(dic[i], end=&quot; &quot;)
</code></pre>
<h3 id="💡시간복잡도">💡시간복잡도</h3>
<h3 id="💡-틀린-이유">💡 틀린 이유</h3>
<p>처음에 시간초과가 떴다.</p>
<h3 id="💡-틀린-부분-수정-or-다른-풀이">💡 틀린 부분 수정 or 다른 풀이</h3>
<p>Set을 이용하여 중복을 제거해줬더니 문제 해결 됐다.</p>
<h3 id="💡-느낀점-or-기억할정보">💡 느낀점 or 기억할정보</h3>
<p>파이썬에 내장되어 있는 라이브러리가 많다는 것을 계속 느끼게 되고 , 코테를 위해 좀 더 많이 알아둬야겠다는 생각을 했다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[백준 - 1654 랜선 자르기]]></title>
            <link>https://velog.io/@joo_zero/%EB%B0%B1%EC%A4%80-1654-%EB%9E%9C%EC%84%A0-%EC%9E%90%EB%A5%B4%EA%B8%B0</link>
            <guid>https://velog.io/@joo_zero/%EB%B0%B1%EC%A4%80-1654-%EB%9E%9C%EC%84%A0-%EC%9E%90%EB%A5%B4%EA%B8%B0</guid>
            <pubDate>Tue, 10 Sep 2024 07:53:01 GMT</pubDate>
            <description><![CDATA[<h3 id="💡문제-분석-요약">💡문제 분석 요약</h3>
<ul>
<li>랜선의 길이를 움직여 랜선 갯수를 확인하는 문제</li>
</ul>
<h3 id="💡알고리즘-설계">💡알고리즘 설계</h3>
<ul>
<li>start : 1 , end : 랜선 길이 중 가장 긴 길이</li>
<li>mid 를 start 와 end의 중간으로 두고, 모든 랜선 값을 mid로 나눠 총 몇개의 랜선이 나오는지 확인</li>
<li>랜선이 목표 이상이면 start :  mid + 1</li>
<li>랜선이 목표 이하이면 end : mid - 1
(이분탐색)</li>
<li>start == end라면 조건을 만족하는 최대의 랜선 길이를 찾는다.</li>
</ul>
<h3 id="💡코드">💡코드</h3>
<pre><code class="language-python">
import sys
K, N = map(int, input().split())
lan = [int(sys.stdin.readline()) for _ in range(K)]
start, end = 1, max(lan) #이분탐색 처음과 끝위치

while start &lt;= end: #적절한 랜선의 길이를 찾는 알고리즘
    mid = (start + end) // 2 #중간 위치
    lines = 0 #랜선 수
    for i in lan:
        lines += i // mid #분할 된 랜선 수

    if lines &gt;= N: #랜선의 개수가 분기점
        start = mid + 1
    else:
        end = mid - 1
print(end)
</code></pre>
<h3 id="💡시간복잡도">💡시간복잡도</h3>
<p>O(logN)</p>
<h3 id="💡-틀린-이유">💡 틀린 이유</h3>
<h3 id="💡-틀린-부분-수정-or-다른-풀이">💡 틀린 부분 수정 or 다른 풀이</h3>
<h3 id="💡-느낀점-or-기억할정보">💡 느낀점 or 기억할정보</h3>
<p>백트래킹이랑 dfs bfs 하다가 이진탐색 문제 나오니까 조금 쉬워진 느낌이다..
난 이진탐색도 중요하지만 그래프 탐색이 좀 더 어려우니 같이 공부 좀 해야겠다..</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[백준 - 1182 부분수열의 합]]></title>
            <link>https://velog.io/@joo_zero/%EB%B0%B1%EC%A4%80-1182-%EB%B6%80%EB%B6%84%EC%88%98%EC%97%B4%EC%9D%98-%ED%95%A9</link>
            <guid>https://velog.io/@joo_zero/%EB%B0%B1%EC%A4%80-1182-%EB%B6%80%EB%B6%84%EC%88%98%EC%97%B4%EC%9D%98-%ED%95%A9</guid>
            <pubDate>Thu, 05 Sep 2024 08:25:49 GMT</pubDate>
            <description><![CDATA[<h3 id="💡문제-분석-요약">💡문제 분석 요약</h3>
<ul>
<li>두번째 줄에 입력된 값들의 합 중 S 와 같은 값이 있다면 더하여, 합의 결과가 S와 같은 값이 몇개가 있는지 알아내는 문제.</li>
</ul>
<h3 id="💡알고리즘-설계">💡알고리즘 설계</h3>
<p>DFS에서 조금 응용하여 만약 반복문에서 돌고 있는 리스트의 인덱스 번호가 N보다 큰 값이라면 종료.</p>
<h3 id="💡변경한-코드">💡변경한 코드</h3>
<pre><code class="language-python">def dfs(i, SUM):
  global cnt
  if i &gt;= N:
      return
  SUM += n_list[i]
  if SUM == S :
    cnt += 1
  dfs(i+1, SUM-n_list[i])
  dfs(i+1, SUM)


N,S = map(int, input().split())
n_list = list(map(int, input().split()))
cnt = 0
dfs(0,0) #index 번호도 처음은 0이고, 처음 더한 값도 0이기 때문
print(cnt)
</code></pre>
<h3 id="💡시간복잡도">💡시간복잡도</h3>
<h3 id="💡-틀린-이유">💡 틀린 이유</h3>
<p>재귀함수로 처음 dfs 를 다시 호출할 때 어떻게 해야할지 막막했다.</p>
<h3 id="💡-틀린-부분-수정-or-다른-풀이">💡 틀린 부분 수정 or 다른 풀이</h3>
<p>합을 다시 구해야하기 때문에 SUM-n_list[i]를 추가함</p>
<h3 id="💡-느낀점-or-기억할정보">💡 느낀점 or 기억할정보</h3>
<p>백트래킹과 DFS의 차이점은 알았다. 하지만 백트래킹을 DFS와 다르게 어느시점에 구현해야하는지 잘 모르겠다. 
DFS로 구현했다가 시간 초과가 나면 바로 BFS 로 해보고 BFS로 해도 시간초과 오류가 뜨면 백트래킹으로 해야하는 걸까 ? 
ㅜㅜ 어렵다 </p>
]]></description>
        </item>
        <item>
            <title><![CDATA[백준 - 6987 월드컵]]></title>
            <link>https://velog.io/@joo_zero/%EB%B0%B1%EC%A4%80-6987-%EC%9B%94%EB%93%9C%EC%BB%B5</link>
            <guid>https://velog.io/@joo_zero/%EB%B0%B1%EC%A4%80-6987-%EC%9B%94%EB%93%9C%EC%BB%B5</guid>
            <pubDate>Wed, 04 Sep 2024 08:45:06 GMT</pubDate>
            <description><![CDATA[<h3 id="💡문제-분석-요약">💡문제 분석 요약</h3>
<ul>
<li>각 나라의 승패 횟수가 주어졌을때 해당 예제가 가능한지 불가능하지 판별해야함</li>
</ul>
<h3 id="💡알고리즘-설계">💡알고리즘 설계</h3>
<p>[처음]</p>
<ul>
<li>팀의 승,무,패 모든 경우를 고르는 방식으로 진행(DFS)
[이후]</li>
<li>백트래킹</li>
<li>6개의 국가가 있고, 총 18번의 경기를 한다.</li>
<li>승, 무, 패의 결과가 있으며, 승, 무, 패의 수는 6보다 작거나 같은 자연수 또는 0</li>
<li>입력은 네 줄로 들어오며, 각 줄에 대해 가능한 결과 1, 불가능한 결과 0 을출력하는 문제이다</li>
</ul>
<h3 id="💡변경한-코드">💡변경한 코드</h3>
<ul>
<li>실패를 계속 해서,, 다른 사람의 소스를 옮겨봤다.</li>
</ul>
<pre><code class="language-python">from sys import stdin
from itertools import combinations as cb


def solution(round):
    global ans
    if round == 15:
        ans = 1
        for sub in res:
            if sub.count(0) != 3:
                ans = 0
                break
        return

    t1, t2 = game[round]
    for x, y in ((0, 2), (1, 1), (2, 0)):
        if res[t1][x] &gt; 0 and res[t2][y] &gt; 0:
            res[t1][x] -= 1
            res[t2][y] -= 1
            solution(round + 1)
            res[t1][x] += 1
            res[t2][y] += 1


answer = []
game = list(cb(range(6), 2))
# 백트래킹
for _ in range(4):
    data = list(map(int, stdin.readline().split()))
    res = [data[i:i + 3] for i in range(0, 16, 3)]
    ans = 0
    solution(0)
    answer.append(ans)

print(*answer)</code></pre>
<h3 id="💡시간복잡도">💡시간복잡도</h3>
<h3 id="💡-틀린-이유">💡 틀린 이유</h3>
<p>DFS 로 하려고 하니까 시간초과 + 메모리 초과 오류가 발생했다.
백트래킹으로 다시 풀어봐야할 것 같다.</p>
<h3 id="💡-틀린-부분-수정-or-다른-풀이">💡 틀린 부분 수정 or 다른 풀이</h3>
<p>DFS 방식에서 백트래킹 방식으로 변경</p>
<h3 id="💡-느낀점-or-기억할정보">💡 느낀점 or 기억할정보</h3>
<p>DFS와 백트래킹의 차이를 잡기가 조금 어려운 것 같다.
조금 더 개념에 익숙해진 후에 소스 적용을 더 해봐야할 것 같다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[백트래킹]]></title>
            <link>https://velog.io/@joo_zero/%EB%B0%B1%ED%8A%B8%EB%9E%98%ED%82%B9</link>
            <guid>https://velog.io/@joo_zero/%EB%B0%B1%ED%8A%B8%EB%9E%98%ED%82%B9</guid>
            <pubDate>Mon, 02 Sep 2024 13:49:42 GMT</pubDate>
            <description><![CDATA[<h1 id="백트래킹">백트래킹</h1>
<ul>
<li>백트래킹이란 현재 상태에서 가능한 모든 경로를 따라 들어가 탐색하는 방법이다.</li>
<li>원하는 값이 아닐 경우 더 이상 탐색을 진행하지 않고 전 단계로 back해서 돌아가는 방법으로 이름 그대로 backtracking 알고리즘</li>
</ul>
<h1 id="관련용어">관련용어</h1>
<ul>
<li>유망함(promising): 진행중인 경로가 해답을 찾을 가능성이 있음</li>
<li>유망하지 않음(nopromising): 진행중인 경로가 해답을 찾을 가능성이 없음</li>
<li>가지치기(pruning): 유망하지 않은 하위 트리를 잘라냄</li>
</ul>
<h1 id="특징">특징</h1>
<ul>
<li>어떤 노드의 유망성을 점검한 후에 유망하지 않다고 결정되면 그 노드의 부모로 되돌아가 다음 자식 노드로 탐색</li>
<li>어떤 노드를 방문했을 때 그 노드를 포함한 경로가 해답이 될 수 없으면 그 노드는 유망하지 않음</li>
<li>해답의 가능성이 있으면 유망함</li>
<li>가지치기 사용가능 (유망하지 않은 노드가 포함되는 경로는 고려하지 않는 기법)</li>
<li>기본적으로 재귀의 성격을 띄는 형태</li>
</ul>
<h1 id="백트래킹과-dfs의-차이점">백트래킹과 DFS의 차이점</h1>
<h2 id="백트레킹">백트레킹</h2>
<ul>
<li>어떤 노드에서 출발하는 경로가 그 해결책으로 이어질 것 같지 않으면 더 이상 경로를 탐색하지 않음으로써 시도 횟수 감소</li>
<li>불필요한 경로의 조기 차단</li>
<li>N! 가지의 경우의 수를 가진 문제에 대해 백트레킹에 가하면 일반적으로 경우의 수가 줄어들지만 최악의 경우는 처리 불가능</li>
<li>모든 후보를 검사하지 않음</li>
</ul>
<h2 id="dfs">DFS</h2>
<ul>
<li>모든 경로를 추적</li>
<li>N! 가지의 경우의 수를 가진 문제에 대해 깊이 우선 탐색을 이용하면 처리 불가능
모든 후보를 검사</li>
</ul>
<h1 id="활용-예시">활용 예시</h1>
<p>해를 찾는 도중 막히면 되돌아가서 다시 해를 찾는 기법</p>
<p>최적화 문제, 결정 문제에서 많이 사용
미로 찾기 / n-Queen 문제 / Map coloring / 부분 집합의 합 등</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[백준]-11724 연결 요소의 개수]]></title>
            <link>https://velog.io/@joo_zero/%EB%B0%B1%EC%A4%80-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/@joo_zero/%EB%B0%B1%EC%A4%80-11724-%EC%97%B0%EA%B2%B0-%EC%9A%94%EC%86%8C%EC%9D%98-%EA%B0%9C%EC%88%98</guid>
            <pubDate>Mon, 26 Aug 2024 09:20:10 GMT</pubDate>
            <description><![CDATA[<h3 id="💡문제-분석-요약">💡문제 분석 요약</h3>
<ul>
<li>입력 한 값을 그래프로 만들었을 때, 만들어지는 그래프의 수를 출력</li>
</ul>
<h3 id="💡알고리즘-설계">💡알고리즘 설계</h3>
<ul>
<li>DFS 함수와 BFS 함수를 작성</li>
<li>visited =&gt; 7 까지 하는 이유 : 노드에 0이 없기 때문</li>
<li>1~7까지 방문하지 않은 노드는 방문시작하도록 dfs/bfs시작</li>
<li>dfs/bfs가 끝나면 count ++</li>
</ul>
<h3 id="💡변경한-코드">💡변경한 코드</h3>
<pre><code class="language-python">[DFS]
import sys
input = sys.stdin.readline

# dfs 함수
def dfs(graph, v, visited):
    visited[v] = True
    for i in graph[v]:
        if not visited[i]:
            dfs(graph, i, visited)

n, m = map(int, input().split()) # 정점의 개수, 간선의 개수
graph = [[] for _ in range(n+1)]
for i in range(m):
    u, v = map(int, input().split())
    graph[u].append(v)
    graph[v].append(u)

count = 0 # 연결 노드의 수
visited = [False] * (n+1)
for i in range(1, n+1):
    if not visited[i]:
        dfs(graph, i, visited)
        count += 1 # dfs 한 번 끝날 때마다 count+1

print(count)



[BFS]
from collections import deque

# bfs 함수
def bfs(graph, start, visited):
    queue = deque([start])
    visited[start] = True

    while queue:
        v = queue.popleft()
        for i in graph[v]:
            if not visited[i]:
                queue.append(i)
                visited[i] = True

n, m = map(int, input().split()) # 정점의 개수, 간선의 개수
graph = [[] for _ in range(n+1)]
for i in range(m):
    u, v = map(int, input().split())
    graph[u].append(v)
    graph[v].append(u)

count = 0 # 연결 노드의 수
visited = [False] * (n+1)
for i in range(1, n+1):
    if not visited[i]:
        bfs(graph, i, visited) # bfs 한 번 끝날 때마다 count+1
        count += 1

print(count)</code></pre>
<p><img src="https://velog.velcdn.com/images/joo_zero/post/14e09709-932c-49f7-ac72-3c14d86120f7/image.png" alt=""></p>
<h3 id="💡시간복잡도">💡시간복잡도</h3>
<p>O(N+M)</p>
<h3 id="💡-틀린-이유">💡 틀린 이유</h3>
<p>for 문을 돌면서 false였던게 true로 변경될 수도 있는데, 무작정 for문에서 false의 값을 체크하여 cnt++ 하려했다.</p>
<h3 id="💡-틀린-부분-수정-or-다른-풀이">💡 틀린 부분 수정 or 다른 풀이</h3>
<p>다시 풀어야지 ..</p>
<h3 id="💡-느낀점-or-기억할정보">💡 느낀점 or 기억할정보</h3>
<p>다시 풀어야지 ..</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[백준-1260 DFS와BFS]]></title>
            <link>https://velog.io/@joo_zero/%EB%B0%B1%EC%A4%80-1260-DFS%EC%99%80BFS</link>
            <guid>https://velog.io/@joo_zero/%EB%B0%B1%EC%A4%80-1260-DFS%EC%99%80BFS</guid>
            <pubDate>Mon, 26 Aug 2024 07:57:49 GMT</pubDate>
            <description><![CDATA[<h3 id="💡문제-분석-요약">💡문제 분석 요약</h3>
<ul>
<li>DFS, BFS 개념 요약</li>
<li>노드갯수, 간선 수, 시작 노드 를 입력 받은 후 DFS값 출력, BFS 값 출력 하는 문제</li>
<li>정점의 개수 N(1 ≤ N ≤ 1,000), 간선의 개수 M(1 ≤ M ≤ 10,000), 탐색을 시작할 정점의 번호 V</li>
<li>M개의 줄에는 간선이 연결하는 두 정점의 번호<h3 id="💡알고리즘-설계">💡알고리즘 설계</h3>
</li>
<li>DFS 함수와 BFS 함수를 작성</li>
<li>그래프의 처음은 빈 값으로 설정 &gt; 그래프는 0번이 아닌 1번부터 사용한다고 조건에 되어있기 때문</li>
<li>그래프 입력 및 구현<ol>
<li>입력 받은 두 수는 서로 연관이 되어 있기 때문에 인접리스트로 구현해줘야 한다.</li>
<li>예를 들어 1 4를 입력 받은 경우, 1번 노드에 4번 노드가 연결되어 있음을 구현하고, 4번 노드에 1번 노드가 연결되어 있음을 구현한다.
2-1. 이중 리스트의 1번 인덱스에 4를 넣고, 4번 인덱스에 1을 넣는다.
 EX) graph[a].append(b) graph[b].append(a)  graph[a].sort()    graph[b].sort()</li>
<li>DFS BFS 호출<h3 id="💡코드">💡코드</h3>
<pre><code class="language-python"># 1. 그래프 생성
# 2. dfs 생성
# 3. bfs 생성
#. dfs 출력 후 bfs 출력
</code></pre>
</li>
</ol>
</li>
</ul>
<p>def dfs(g,v,visited) :
  visited[v] = True
  print(v, end =&#39; &#39;)</p>
<p>  for i in graph[v]:
    if not visited[i] :
        dfs(g, i, visited)</p>
<p>from collections import deque
def bfs(g, start, visited):</p>
<p>  queue = deque([start])
  visited[start] = True</p>
<p>  while queue:
    v = queue.popleft()
    print(v,end =&#39; &#39;)</p>
<pre><code>for i in graph[v]:
  if not visited[i]:
    queue.append(i)
    visited[i] = True</code></pre><p>n,m,v = map(int, input().split())
graph = [[] for _ in range(n+1)]</p>
<p>for i in range(m):
    a,b = map(int,input().split())
    graph[a].append(b)
    graph[b].append(a)
    graph[a].sort()
    graph[b].sort()</p>
<p>visited = [False] * (n+1)
dfs(graph, v, visited)</p>
<p>print(&quot;&quot;)</p>
<p>visited = [False] * (n+1)
bfs(graph, v, visited)</p>
<p>```</p>
<h3 id="💡시간복잡도">💡시간복잡도</h3>
<p>O(N+M)</p>
<h3 id="💡-틀린-이유">💡 틀린 이유</h3>
<p>입력시 그래프 sort를 시켜주지 않았다.</p>
<h3 id="💡-틀린-부분-수정-or-다른-풀이">💡 틀린 부분 수정 or 다른 풀이</h3>
<p>sort부분 추가</p>
<h3 id="💡-느낀점-or-기억할정보">💡 느낀점 or 기억할정보</h3>
<p>DFS와 BFS와 같은 개념 코드를 구현하는 것은 어렵지 않은데, 응용문제는 힘든 것 같다. 잘 이해하고 하나하나 구현해봐야겠다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[DFS & BFS]]></title>
            <link>https://velog.io/@joo_zero/DFS-BFS</link>
            <guid>https://velog.io/@joo_zero/DFS-BFS</guid>
            <pubDate>Sun, 25 Aug 2024 00:20:13 GMT</pubDate>
            <description><![CDATA[<p><em>유트브 동빈나님의 개념을 활용하여 작성했습니다. 모든 출처는 유트브 동빈나님에서 가져온 것입니다.</em></p>
<h2 id="🎀기본개념">🎀기본개념</h2>
<p><strong>그래프</strong> : 정점(Node)와 간선(Edge)로 이루어져 있는 자료구조
이런 그래프를 탐색하는 방법에는 깊이우선탐색(DFS)과 너비우선탐색(BFS)가 있습니다.
노드를 하나씩 방문하여 모든 노드를 탐색하는 것을 목표로 합니다.</p>
<h2 id="🎀🎀-깊이우선탐색-dfs">🎀🎀 깊이우선탐색 DFS</h2>
<ul>
<li>시작 노드를 기준으로 하여 가장 깊은 노드까지 방문 한 후 다음 노드를 탐색하는 것
<img src="https://velog.velcdn.com/images/joo_zero/post/aefecdb0-8199-41b8-b0af-c5494486493f/image.png" alt=""></li>
</ul>
<h3 id="dfs-이해하기">DFS 이해하기</h3>
<h4 id="방법">방법</h4>
<p>[조건] 
<strong><span style="color:blue">시작 노드 1</span></strong> 
번호가 낮은 인접 노드부터 방문
stack = []</p>
<p>[방법]</p>
<ul>
<li>시작노드를 기준으로 하여 방문한 노드를 stack에 쌓는다.</li>
<li>방문하지 않은 노드 중에서 낮은 인접 노드부터 방문하여 stack에 쌓는다.</li>
</ul>
<ol>
<li><p>노드 1의 인접노드 : 2, 3 
stack =&gt; [1 2,3]</p>
</li>
<li><p>노드 2의 인접노드 : 1, 7
stack =&gt; [1,2,3,7]</p>
</li>
<li><p>노드 7의 인접노드 : 6, 8
stack =&gt; [1,2,3,7,6,8]</p>
</li>
<li><p>노드 6의 인접노드 : 7, 8
stack =&gt; [1,2,3,7,6,8]</p>
</li>
<li><p>노드 8의 인접노드 : 1, 7
stack =&gt; [1,2,3,7,6,8]</p>
</li>
<li><p>노드 3의 인접노드 : 1, 4, 5
stack =&gt; [1,2,3,7,6,8,4,5]</p>
</li>
<li><p>노드 4의 인접노드 : 3, 5
stack =&gt; [1,2,3,7,6,8,4,5]</p>
</li>
<li><p>노드 5의 인접노드 : 3, 4
stack =&gt; [1,2,3,7,6,8,4,5]</p>
</li>
</ol>
<h4 id="활용도">활용도</h4>
<ol>
<li>모든 노드를 방문하고자 할 때 방법 사용</li>
<li>DFS 가 BFS보다 코드 간결</li>
<li>BFS보다는 속도가 느림</li>
<li>Stack | 재귀함수로 구현</li>
</ol>
<h2 id="🎀🎀-너비우선탐색-bfs">🎀🎀 너비우선탐색 BFS</h2>
<ul>
<li>시작 노드를 기준으로 하여 인접한 노드를 먼저 탐색하는 방법</li>
<li>시작 노드로부터 가장 가까운 노드를 먼저 방문하고, 가장 멀리 떨어져 있는 노드를 나중에 방문하게 된다.</li>
</ul>
<p><img src="https://velog.velcdn.com/images/joo_zero/post/442fd579-b0d6-4192-b72a-1c422bd9b85a/image.png" alt=""></p>
<h3 id="bfs-이해하기">BFS 이해하기</h3>
<h4 id="방법-1">방법</h4>
<p>[조건] 
** Queue 사용(deque) **
<strong><span style="color:blue">시작 노드 1</span></strong> 
번호가 낮은 인접 노드부터 방문</p>
<p>result = []
[방법]</p>
<ol>
<li><p>시작 노드 1을 큐에 넣는다.
queue =&gt; [1]</p>
</li>
<li><p>queue 에서 노드 1을 꺼낸 후 방문하지 않은 인접한 노드 2,3,8을 queue에 넣는다.
queue =&gt;  [2,3,8]
result =&gt; [1]</p>
</li>
<li><p>queue 에서 노드 2를 꺼낸 후 방문하지 않은 7을 queue에 넣는다.
1은 이미 방문처리가 되어 있기 때문에 PASS
queue =&gt; [3,8,7]
result =&gt; [1,2]</p>
</li>
<li><p>queue 에서 노드 3을 꺼낸 뒤 방문하지 않은 4,5를 queue에 넣는다.
queue =&gt; [8,7,4,5]
result =&gt; [1,2,3]</p>
</li>
<li><p>queue에서 노드 8을 꺼낸 뒤 방문하지 않은 노드를 queue에 넣는다.
1,7 모두 방문되어 있기 때문에 PASS
queue =&gt; [7,4,5]
result =&gt; [1,2,3,8]</p>
</li>
<li><p>queue에서 노드 7을 꺼낸 뒤 방문하지 않은 6을 queue에 넣는다.
2,8은 모두 방문되어 있기 때문에 PASS
queue =&gt; [4,5,6]
result =&gt; [1,2,3,8,7]</p>
</li>
<li><p>queue에서 노드 4를 꺼낸 뒤 방문하지 않은 노드를 queue에 넣는다.
3,5는 모두 방문했기 때문에 PASS
queue =&gt; [5,6]
result =&gt; [1,2,3,8,7,4]</p>
</li>
<li><p>queue에서 노드 5를 꺼낸 뒤 방문하지 않은 노드를 queue에 넣는다.
3,4는 모두 방문했기 때문에 PASS
queue =&gt; [6]
result =&gt; [1,2,3,8,7,4,5]</p>
</li>
<li><p>queue에서 노드 6을 꺼낸 뒤 방문하지 않은 노드를 queue에 넣는다.
7,8은 모두 방문했기 때문에 PASS
queue =&gt; []
result =&gt; [1,2,3,8,7,4,5,6]</p>
</li>
</ol>
<h4 id="활용도-1">활용도</h4>
<ol>
<li>최단 경로를 찾고 싶을 때 사용</li>
<li>DFS보다 구현이 어려움</li>
<li>Queue를 사용하여 구현</li>
</ol>
<h2 id="🎀🎀-dfs와-bfs의-정리">🎀🎀 DFS와 BFS의 정리</h2>
<h3 id="시간복잡도">시간복잡도</h3>
<ul>
<li>두 방식 모두 모든 노드를 탐색했기 때문에 시간복잡도는 동일합니다.</li>
<li>N: 노드, E: 간선일 경우 <ul>
<li>인접리스트 : O(N+E)</li>
</ul>
</li>
</ul>
<h3 id="활용한-문제">활용한 문제</h3>
<ol>
<li>경로의 특징을 저장해야하는 문제 
ex ) 각 정점에 숫자가 있고 a~b까지 가는 경로를 구하는데 경로에 같은 수가 있으면 안된다는 문제등, 각각의 경로마다 특징을 저장해둬야 하는 경우 DFS를 사용. (BFS는 경로의 특징을 가지지 X)</li>
<li>최단거리를 구하는 문제
미로찾기 등 최단거리를 구해야하는 경우, BFS가 유리</li>
<li>검색 대상의 그래프가 크면 DFS사용</li>
<li>검색대상의 규모가 크지 않고, 검색 시작 점으로부터 원하는 대상이 멀지 않다면 BFS사용</li>
</ol>
<h3 id="dfs-python코드">DFS Python코드</h3>
<pre><code class="language-python">
dfs DFS(g, v, visited):
    visited[v] = True
    print(v, end =&#39; &#39;)

    for i in g[v]:
        if not visited[i]:
            dfs(g, i, visited)

--------------------------------

g =[
    [],
    [2,3,8],
    [1,7],
    [1,4,5],
    [3,5],
    [3,4],
    [7],
    [2,6,8],
    [1,7],
]

visited = [False] * 9

dfs(g, 1, visited)
</code></pre>
<blockquote>
<p>g의 1번 노드를 비워둔 이유? 
-&gt; 시작 노드는 대부분 1부터 시작하기 때문에 비워둔 것</p>
</blockquote>
<blockquote>
<p>visited에서 왜 * 9를 한 것인지? * 8하면 되는거 아닌가?
-&gt; 첫번째 노드를 비워뒀기 때문에 해당 노드 제외하고 false를 처리해야하기 때문.
그래야 인덱스 1~9번까지 false로 들어가게 된다.</p>
</blockquote>
<blockquote>
<ul>
<li>dfs(g, 1, visited) : 1번 노드부터 시작하겠다 의미</li>
</ul>
</blockquote>
<ul>
<li>visited[v] : True : 방문한 노드는 True로 설정
방문한 노드는 출력</li>
<li>for i in g[v] :그래프 도는 동안</li>
<li>if not visited[i] dfs(g, i, visited) : 방문하지 않은 노드가 있다면, 해당 노드를 탐색</li>
</ul>
<h3 id="bfs-python코드">BFS Python코드</h3>
<pre><code class="language-python">from collections import deque

def bfs(g, start, visited):
    queue = deque([start])
    visited[start] =True

    while queue:
        v = quque.popleft()
        print(v, end =&#39; &#39;)
        for i in g[v]:
            if not visited[i]:
                queue.append(i)
                visited[i]=True


----------

g =[
    [],
    [2,3,8],
    [1,7],
    [1,4,5],
    [3,5],
    [3,4],
    [7],
    [2,6,8],
    [1,7],
]
visited = [False] * 9

bfs(g,1,visited)
</code></pre>
<blockquote>
<ul>
<li>queue = deque([start]) : 기준이 되는 노드 queue에 삽입</li>
</ul>
</blockquote>
<ul>
<li>visited[start] = True : 해당 노드 방문처리</li>
<li>while queue : queue 가 빌 때까지</li>
<li>v = queue.popleft() : 노드 출력</li>
<li>for i in g[v] 
 if not visited[i] 
   queue.append(i)
   visited[i] = True
   : 인접한 노드들 중 방문하지 않은 노드들을 큐에 삽입 후 방문 처리 하기</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[백준-9093 단어뒤집기]]></title>
            <link>https://velog.io/@joo_zero/%EB%B0%B1%EC%A4%80-9093-%EB%8B%A8%EC%96%B4%EB%92%A4%EC%A7%91%EA%B8%B0</link>
            <guid>https://velog.io/@joo_zero/%EB%B0%B1%EC%A4%80-9093-%EB%8B%A8%EC%96%B4%EB%92%A4%EC%A7%91%EA%B8%B0</guid>
            <pubDate>Sat, 24 Aug 2024 11:59:19 GMT</pubDate>
            <description><![CDATA[<h3 id="💡문제-분석-요약">💡문제 분석 요약</h3>
<ul>
<li>stack 사용 </li>
<li>처음에 몇 문장을 받을지 입력</li>
<li>문장을 띄어쓰기 기준으로 입력 받기</li>
</ul>
<h4 id="💡알고리즘-설계">💡알고리즘 설계</h4>
<ul>
<li>띄어쓰기를 기준으로 하여 스택 쌓인거 출력</li>
</ul>
<h3 id="💡코드">💡코드</h3>
<pre><code class="language-python">
T = int(input())

for _ in range(T):
  str = input()
  str += &quot; &quot;
  stack = []
  for i in str:
    if i != &quot; &quot;:
      stack.append(i)
    else:
        while stack:
          print(stack.pop(), end =&#39;&#39;)
        print(&#39; &#39;, end= &#39;&#39;)
</code></pre>
<h3 id="💡시간복잡도">💡시간복잡도</h3>
<p>O(n)</p>
<h3 id="💡-틀린-이유">💡 틀린 이유</h3>
<p>처음에 밑에 else를 이중 for문 바깥에 넣어버려서 띄어쓰기가 되지 않고 출력됨</p>
<h3 id="💡-틀린-부분-수정-or-다른-풀이">💡 틀린 부분 수정 or 다른 풀이</h3>
<p>else를 이중 for문 안에 넣기</p>
<h3 id="💡-느낀점-or-기억할정보">💡 느낀점 or 기억할정보</h3>
<p>뭔가 리스트로 구현할 수 있을 것 같은데 일부러 스택사용 해봤다..
리스트로도 구현해봐야지..</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[백준 - 1966 프린터 큐]]></title>
            <link>https://velog.io/@joo_zero/%EB%B0%B1%EC%A4%80-1966-%ED%94%84%EB%A6%B0%ED%84%B0-%ED%81%90</link>
            <guid>https://velog.io/@joo_zero/%EB%B0%B1%EC%A4%80-1966-%ED%94%84%EB%A6%B0%ED%84%B0-%ED%81%90</guid>
            <pubDate>Fri, 23 Aug 2024 09:41:17 GMT</pubDate>
            <description><![CDATA[<h3 id="💡문제-분석-요약">💡문제 분석 요약</h3>
<ul>
<li>queue 사용 (deque)</li>
</ul>
<ol>
<li>입력받은 M의 중요도를 따져서 몇번째로 나오는지 확인</li>
</ol>
<h4 id="💡알고리즘-설계">💡알고리즘 설계</h4>
<ol start="0">
<li>인덱스(index)와 원소를 동시에 접근하면서 루프를 돌릴 수 있는 enumerate 사용</li>
<li>조건에 맞게 입력을 받기</li>
<li>중요도를 확인하기 위해 max 함수를 사용</li>
<li>큐의 맨 앞 문서가 현재 가장 중요한 문서인지 확인 중요한 문서라면 count += 1 &amp;&amp; 종료</li>
<li>찾는 문서가 아니면 출력되었으니까 큐에서 제거 </li>
</ol>
<h3 id="💡코드">💡코드</h3>
<pre><code class="language-python">from collections import deque

num = int(input())
for _ in range(num):
    N, M = map(int, input().split())
    queue = deque(map(int, input().split()))
    queue = deque([(i, idx) for idx, i in enumerate(queue)])

    count = 0
    while True:
        if queue[0][0] == max(queue, key=lambda x: x[0])[0]:
            count += 1
            if queue[0][1] == M:
                print(count)
                break
            else:
                queue.popleft()
        else:
            queue.append(queue.popleft())
</code></pre>
<h3 id="💡시간복잡도">💡시간복잡도</h3>
<p>O(n)</p>
<h3 id="💡-틀린-이유">💡 틀린 이유</h3>
<p>queue서 뽑지 않는 경우 뒤로 보내지 않았음</p>
<h3 id="💡-틀린-부분-수정-or-다른-풀이">💡 틀린 부분 수정 or 다른 풀이</h3>
<p>queue.append(queue.popleft()) 를 통하여 해결</p>
<h3 id="💡-느낀점-or-기억할정보">💡 느낀점 or 기억할정보</h3>
<p>스택 큐 문제 이제 익숙해질 만도 한데 아직 힘들다 ㅜㅜ </p>
]]></description>
        </item>
        <item>
            <title><![CDATA[백준 - 9012 괄호]]></title>
            <link>https://velog.io/@joo_zero/%EB%B0%B1%EC%A4%80-9012-%EA%B4%84%ED%98%B8</link>
            <guid>https://velog.io/@joo_zero/%EB%B0%B1%EC%A4%80-9012-%EA%B4%84%ED%98%B8</guid>
            <pubDate>Thu, 22 Aug 2024 03:59:10 GMT</pubDate>
            <description><![CDATA[<h3 id="💡문제-분석-요약">💡문제 분석 요약</h3>
<ol>
<li>Stack 사용</li>
<li>( 괄호와 ) 괄호의 짝이 맞는지 확인</li>
</ol>
<h4 id="💡알고리즘-설계">💡알고리즘 설계</h4>
<ol>
<li>리스트로 구현하는 것이 아닌, stack 으로 구현할 것</li>
<li>( 인경우 stack 에 쌓고, stack에 ( 이 있는 상태에서 ) 가 들어오면 (를 제거.</li>
<li>( 가 없는데 )를 stack 에 넣으려고 한다면, 해당 반복문을 다시 돌지 말고(break) 바로 NO 출력</li>
</ol>
<h3 id="💡코드">💡코드</h3>
<pre><code class="language-python">n = int(input())

for _ in range(n) :
  text = input()
  stack = []
  for i in text:
    if i == &#39;(&#39; :
      stack.append(&quot;(&quot;)
    elif i == &#39;)&#39;:
      if len(stack) == 0:
        stack.append(&quot;)&quot;)
        break
      else :
        stack.pop()

  if len(stack) == 0:
    print(&quot;YES&quot;)
  else :
    print(&quot;NO&quot;)
</code></pre>
<h3 id="💡시간복잡도">💡시간복잡도</h3>
<p>O(n * text길이)</p>
<h3 id="💡-틀린-이유">💡 틀린 이유</h3>
<p>처음을 while로 구현하려다가 컴파일 에러 발생
그래서 그냥 for문으로 변경하여 사용 </p>
<h3 id="💡-틀린-부분-수정-or-다른-풀이">💡 틀린 부분 수정 or 다른 풀이</h3>
<p>리스트로 충분히 구현할 수 있는 문제.
짝을 맞추는건 스택을 활용하자.</p>
<h3 id="💡-느낀점-or-기억할정보">💡 느낀점 or 기억할정보</h3>
<p>항상 테스트 코드는 맞는데, 시간 복잡도라던지 다른 케이스에서 틀리는건지 오류가 발생할 때가 있다.. 더 분발해야겠지</p>
]]></description>
        </item>
    </channel>
</rss>