<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>Eunseo Park</title>
        <link>https://velog.io/</link>
        <description>Eunseo Park</description>
        <lastBuildDate>Wed, 04 Dec 2024 15:06:30 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>Eunseo Park</title>
            <url>https://velog.velcdn.com/images/pado_/profile/34a6ee85-e5cd-4695-b834-be86f11b92e0/social_profile.png</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. Eunseo Park. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/pado_" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[[SQL , 프로그래머스]  역순 정렬하기, 아픈 동물 찾기 ]]></title>
            <link>https://velog.io/@pado_/SQL-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-%EC%97%AD%EC%88%9C-%EC%A0%95%EB%A0%AC%ED%95%98%EA%B8%B0-%EC%95%84%ED%94%88-%EB%8F%99%EB%AC%BC-%EC%B0%BE%EA%B8%B0</link>
            <guid>https://velog.io/@pado_/SQL-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-%EC%97%AD%EC%88%9C-%EC%A0%95%EB%A0%AC%ED%95%98%EA%B8%B0-%EC%95%84%ED%94%88-%EB%8F%99%EB%AC%BC-%EC%B0%BE%EA%B8%B0</guid>
            <pubDate>Wed, 04 Dec 2024 15:06:30 GMT</pubDate>
            <description><![CDATA[<h2 id="1-역순-정렬하기">1. 역순 정렬하기</h2>
<p><a href="https://school.programmers.co.kr/learn/courses/30/lessons/59035">https://school.programmers.co.kr/learn/courses/30/lessons/59035</a></p>
<h3 id="문제-설명">문제 설명</h3>
<p>ANIMAL_INS 테이블은 동물 보호소에 들어온 동물의 정보를 담은 테이블입니다. ANIMAL_INS 테이블 구조는 다음과 같으며, ANIMAL_ID, ANIMAL_TYPE, DATETIME, INTAKE_CONDITION, NAME, SEX_UPON_INTAKE는 각각 동물의 아이디, 생물 종, 보호 시작일, 보호 시작 시 상태, 이름, 성별 및 중성화 여부를 나타냅니다.</p>
<table>
<thead>
<tr>
<th>NAME</th>
<th>TYPE</th>
<th>NULLABLE</th>
</tr>
</thead>
<tbody><tr>
<td>ANIMAL_ID</td>
<td>VARCHAR(N)</td>
<td>FALSE</td>
</tr>
<tr>
<td>ANIMAL_TYPE</td>
<td>VARCHAR(N)</td>
<td>FALSE</td>
</tr>
<tr>
<td>DATETIME</td>
<td>DATETIME</td>
<td>FALSE</td>
</tr>
<tr>
<td>INTAKE_CONDITION</td>
<td>VARCHAR(N)</td>
<td>FALSE</td>
</tr>
<tr>
<td>NAME</td>
<td>VARCHAR(N)</td>
<td>TRUE</td>
</tr>
<tr>
<td>SEX_UPON_INTAKE</td>
<td>VARCHAR(N)</td>
<td>FALSE</td>
</tr>
</tbody></table>
<p>동물 보호소에 들어온 모든 동물의 이름과 보호 시작일을 조회하는 SQL문을 작성해주세요. 이때 결과는 ANIMAL_ID 역순으로 보여주세요. SQL을 실행하면 다음과 같이 출력되어야 합니다.</p>
<table>
<thead>
<tr>
<th>NAME</th>
<th>DATETIME</th>
</tr>
</thead>
<tbody><tr>
<td>Rocky</td>
<td>2016-06-07 09:17:00</td>
</tr>
<tr>
<td>Shelly</td>
<td>2015-01-29 15:01:00</td>
</tr>
<tr>
<td>Benji</td>
<td>2016-04-19 13:28:00</td>
</tr>
<tr>
<td>Jackie</td>
<td>2016-01-03 16:25:00</td>
</tr>
<tr>
<td>*Sam</td>
<td>2016-03-13 11:17:00</td>
</tr>
</tbody></table>
<h3 id="코드">코드</h3>
<pre><code class="language-sql">SELECT NAME, DATETIME
FROM ANIMAL_INS
ORDER BY ANIMAL_ID DESC
</code></pre>
<h2 id="2-아픈-동물-찾기">2. 아픈 동물 찾기</h2>
<p><a href="https://school.programmers.co.kr/learn/courses/30/lessons/59036">https://school.programmers.co.kr/learn/courses/30/lessons/59036</a></p>
<h3 id="문제-설명-1">문제 설명</h3>
<p>ANIMAL_INS 테이블은 동물 보호소에 들어온 동물의 정보를 담은 테이블입니다. ANIMAL_INS 테이블 구조는 다음과 같으며, ANIMAL_ID, ANIMAL_TYPE, DATETIME, INTAKE_CONDITION, NAME, SEX_UPON_INTAKE는 각각 동물의 아이디, 생물 종, 보호 시작일, 보호 시작 시 상태, 이름, 성별 및 중성화 여부를 나타냅니다.</p>
<table>
<thead>
<tr>
<th>NAME</th>
<th>TYPE</th>
<th>NULLABLE</th>
</tr>
</thead>
<tbody><tr>
<td>ANIMAL_ID</td>
<td>VARCHAR(N)</td>
<td>FALSE</td>
</tr>
<tr>
<td>ANIMAL_TYPE</td>
<td>VARCHAR(N)</td>
<td>FALSE</td>
</tr>
<tr>
<td>DATETIME</td>
<td>DATETIME</td>
<td>FALSE</td>
</tr>
<tr>
<td>INTAKE_CONDITION</td>
<td>VARCHAR(N)</td>
<td>FALSE</td>
</tr>
<tr>
<td>NAME</td>
<td>VARCHAR(N)</td>
<td>TRUE</td>
</tr>
<tr>
<td>SEX_UPON_INTAKE</td>
<td>VARCHAR(N)</td>
<td>FALSE</td>
</tr>
</tbody></table>
<p>동물 보호소에 들어온 동물 중 아픈 동물1의 아이디와 이름을 조회하는 SQL 문을 작성해주세요. 이때 결과는 아이디 순으로 조회해주세요.</p>
<p>예시</p>
<p>예를 들어 ANIMAL_INS 테이블이 다음과 같다면</p>
<table>
<thead>
<tr>
<th>ANIMAL_ID</th>
<th>ANIMAL_TYPE</th>
<th>DATETIME</th>
<th>INTAKE_CONDITION</th>
<th>NAME</th>
<th>SEX_UPON_INTAKE</th>
</tr>
</thead>
<tbody><tr>
<td>A365172</td>
<td>Dog</td>
<td>2014-08-26 12:53:00</td>
<td>Normal</td>
<td>Diablo</td>
<td>Neutered Male</td>
</tr>
<tr>
<td>A367012</td>
<td>Dog</td>
<td>2015-09-16 09:06:00</td>
<td>Sick</td>
<td>Miller</td>
<td>Neutered Male</td>
</tr>
<tr>
<td>A365302</td>
<td>Dog</td>
<td>2017-01-08 16:34:00</td>
<td>Aged</td>
<td>Minnie</td>
<td>Spayed Female</td>
</tr>
<tr>
<td>A381217</td>
<td>Dog</td>
<td>2017-07-08 09:41:00</td>
<td>Sick</td>
<td>Cherokee</td>
<td>Neutered Male</td>
</tr>
</tbody></table>
<p>이 중 아픈 동물은 <strong>Miller</strong>와 <strong>Cherokee</strong>입니다.<br>따라서 SQL문을 실행하면 다음과 같이 나와야 합니다</p>
<table>
<thead>
<tr>
<th>ANIMAL_ID</th>
<th>NAME</th>
</tr>
</thead>
<tbody><tr>
<td>A367012</td>
<td>Miller</td>
</tr>
<tr>
<td>A381217</td>
<td>Cherokee</td>
</tr>
</tbody></table>
<h3 id="코드-1">코드</h3>
<pre><code class="language-sql">SELECT ANIMAL_ID, NAME
FROM ANIMAL_INS
WHERE INTAKE_CONDITION = &#39;Sick&#39;</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[[DE] Spark 개념 
]]></title>
            <link>https://velog.io/@pado_/DE-Spark-%EA%B0%9C%EB%85%90</link>
            <guid>https://velog.io/@pado_/DE-Spark-%EA%B0%9C%EB%85%90</guid>
            <pubDate>Tue, 03 Dec 2024 15:57:32 GMT</pubDate>
            <description><![CDATA[<h3 id="1-apache-spark란">1. Apache Spark란?</h3>
<p><strong>Spark</strong>는 대규모 데이터 처리를 빠르고 효율적으로 수행할 수 있는 오<strong>픈 소스 분산 처리 시스템</strong>이다.</p>
<h4 id="spark의-주요-특징">Spark의 주요 특징:</h4>
<p>1) 빠른 속도: 메모리 기반 연산으로 디스크 I/O를 최소화해 빠른 데이터 처리 가능
2) 다양한 언어 지원: Python, Scala, Java, R 등 다수의 언어를 지원
3) 유연성: 배치, 스트리밍, SQL, 머신러닝, 그래프 처리 등 다양한 워크로드 지원
4) 확장성: 클러스터 환경에서 대규모 데이터 처리 가능</p>
<h3 id="2-spark의-아키텍처">2. Spark의 아키텍처</h3>
<p>1) <strong>Driver</strong>:
애플리케이션을 실행하고, 작업(Job)을 나누어 Executor에 분배하는 역할</p>
<p>2) <strong>Executor</strong>:
각 노드에서 할당된 작업(Task)을 수행하고 결과를 반환하는 역할</p>
<p>3) <strong>Cluster Manager</strong>:
자원을 관리하며, Spark가 클러스터에 접근할 수 있도록 지원 (예: YARN, Mesos, Standalone)</p>
<h3 id="3-rdd-resilient-distributed-dataset">3. RDD (Resilient Distributed Dataset)</h3>
<p><strong>RDD는</strong> Spark의 핵심 데이터 구조로, 불변(Immutable)하며 분산된 데이터 셋을 처리하는 데 최적화된 구조다.</p>
<h4 id="rdd의-주요-특징">RDD의 주요 특징:</h4>
<p>1) 불변성: 생성된 RDD는 변경할 수 없음. 새로운 RDD를 생성해야 함
2) 분산성: 데이터를 클러스터 노드에 분산 저장 및 처리
3) 내결함성: 노드 장애 발생 시 데이터 복구 가능</p>
<h4 id="4-rdd의-생성-방법">4. RDD의 생성 방법</h4>
<p>기존 데이터에서 생성:
파일 시스템(HDFS, 로컬 파일)이나 데이터베이스에서 데이터를 읽어 RDD 생성</p>
<p>컬렉션에서 생성:
Python이나 Scala의 리스트 등 컬렉션을 RDD로 변환</p>
<h4 id="5-rdd의-주요-연산">5. RDD의 주요 연산</h4>
<p><strong>Transformation</strong>: 기존 RDD에서 새로운 RDD를 생성하는 연산</p>
<p>*<em>map(), filter(), flatMap() *</em>등이 대표적
Action: RDD에서 결과를 반환하거나 출력하는 연산</p>
<p><strong>collect(), count(), first()</strong> 등이 대표적</p>
<h4 id="6-spark의-데이터-처리-방식">6. Spark의 데이터 처리 방식</h4>
<p>Batch Processing: 대량의 정적 데이터를 한 번에 처리
Stream Processing: 실시간 데이터 스트림을 지속적으로 처리</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[DE] ETL, ELT가 뭘까? ]]></title>
            <link>https://velog.io/@pado_/DE-ETL-ELT%EA%B0%80-%EB%AD%98%EA%B9%8C</link>
            <guid>https://velog.io/@pado_/DE-ETL-ELT%EA%B0%80-%EB%AD%98%EA%B9%8C</guid>
            <pubDate>Mon, 02 Dec 2024 14:58:33 GMT</pubDate>
            <description><![CDATA[<p>데이터 엔지니어링에서 흔히 등장하는 ETL과 ELT, 과연 어떤 차이가 있을까?
데이터 파이프라인 구축에서 필수적인 두 프로세스를 비교해보자</p>
<p><img src="https://velog.velcdn.com/images/pado_/post/e2a2576c-d173-42b7-9bdd-03a692dc1dbf/image.png" alt="">
출처: Blog de Bismart</p>
<h2 id="1-e-t-l-이란">1. E, T, L 이란?</h2>
<ul>
<li><strong>Extract</strong>(추출) : 원시 데이터에서 데이터 소스를 가져오는 것이다.  </li>
<li><strong>Transformation</strong>(변환) : 데이터 구조를 변경하는 프로세스다. 용도에 맞는 필터링, Resahping, 정재 등의 단계를 통해 필요한 형태로 변환한다.</li>
<li><strong>Loading</strong>(적재) : 데이터를 스토리지에 저장하는 프로세스다. </li>
</ul>
<h2 id="2-etlelt를-진행하는-이유">2. ETL/ELT를 진행하는 이유</h2>
<p>우리가 원하는 건 <strong>쓸모있는</strong> 데이터다. 데이터를 그냥 쌓아두기만 하면 무의미한 숫자 덩어리에 불과하다. 회사마다, 시스템마다 제각각인 데이터를 하나로 통합하고, 그 과정에서 중복된 값, 오류, 불필요한 데이터들을 걸러내는 정제 과정이 필요하다. 이 정제된 데이터가 있어야만 비로소 의미 있는 분석과 인사이트 도출이 가능해진다. 그렇기 때문에 ETL이나 ELT 같은 데이터 처리 과정이 데이터 파이프라인 구축에서 중요한 역할을 한다.</p>
<h2 id="3-데이터-웨어하우스data-warehouse와-etl">3. 데이터 웨어하우스(Data Warehouse)와 ETL</h2>
<p><img src="https://velog.velcdn.com/images/pado_/post/b03ee2e7-1e94-4e03-90ac-55e196613f33/image.png" alt="">
출처 : Modern Data Architecture (Source: Beyond &ldquo;Modern&rdquo; Data Architecture, Jeremiah Hansen, 2020.04.09.)</p>
<p><strong>데이터 웨어하우스</strong>는 정제된 정형 데이터를 저장하는 시스템으로 분석 및 보고 목적으로 설계되었다. 데이터는 구조화된 형태로 저장되며, BI(Business Intelligence) 도구와 통합되어 빠르고 효율적인 분석을 가능하게 한다. 주로 SQL 기반으로 데이터를 쿼리한다.</p>
<p>ex) 매출 보고서, 고객 분석, 재고 관리 데이터.</p>
<h2 id="4-데이터-레이크-data-lake와-elt">4. 데이터 레이크 (Data Lake)와 ELT</h2>
<p><img src="https://velog.velcdn.com/images/pado_/post/0e55c12b-8d40-4011-9b5e-afe42cfeaee9/image.png" alt=""></p>
<p><strong>데이터 레이크</strong>는 정형, 반정형, 비정형 데이터를 <strong>원본 그대로 저장</strong>하는 시스템으로 데이터의 형태와 구조에 구애받지 않는다. 다양한 분석 기법과 머신러닝 모델을 활용하기 위한 데이터를 저장하며 대규모 데이터를 빠르게 저장하고 처리할 수 있는 유연성을 제공한다.</p>
<p>ex) IoT 센서 데이터, 소셜 미디어 피드, 이미지나 영상 데이터</p>
<h2 id="5-etl과-elt의-차이">5. ETL과 ELT의 차이</h2>
<table>
<thead>
<tr>
<th>구분</th>
<th>ETL (Extract, Transform, Load)</th>
<th>ELT (Extract, Load, Transform)</th>
</tr>
</thead>
<tbody><tr>
<td><strong>프로세스 순서</strong></td>
<td>데이터 추출 → 변환 → 적재</td>
<td>데이터 추출 → 적재 → 변환</td>
</tr>
<tr>
<td><strong>변환 위치</strong></td>
<td>ETL 도구 또는 별도 서버에서 데이터 변환</td>
<td>데이터 웨어하우스 내부에서 변환</td>
</tr>
<tr>
<td><strong>데이터 적재 형태</strong></td>
<td>변환된 데이터만 적재</td>
<td>원본 데이터 그대로 적재</td>
</tr>
<tr>
<td><strong>장점</strong></td>
<td>데이터가 정제된 상태로 적재되므로 즉시 사용 가능</td>
<td>빠른 데이터 적재, 유연한 변환 및 분석 가능</td>
</tr>
<tr>
<td><strong>단점</strong></td>
<td>복잡한 변환 로직이 많으면 속도 저하 및 유지보수 어려움</td>
<td>대용량 원본 데이터 저장 시 스토리지 비용 증가 가능</td>
</tr>
<tr>
<td><strong>주요 도구</strong></td>
<td>Informatica, Talend, SSIS 등</td>
<td>Snowflake, BigQuery, Redshift 등</td>
</tr>
<tr>
<td><strong>적합한 환경</strong></td>
<td>데이터가 정형적이고 변환 규칙이 명확한 경우</td>
<td>대용량 데이터, 실시간 분석, 클라우드 환경</td>
</tr>
</tbody></table>
<p>참고 
<a href="https://dining-developer.tistory.com/50">https://dining-developer.tistory.com/50</a>
<a href="https://spidyweb.tistory.com/263">https://spidyweb.tistory.com/263</a>
<a href="https://blog.bizspring.co.kr/%ED%85%8C%ED%81%AC/etl-vs-elt/">https://blog.bizspring.co.kr/%ED%85%8C%ED%81%AC/etl-vs-elt/</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[SQL] SELECT, WHERE, HAVING]]></title>
            <link>https://velog.io/@pado_/SQL-SELECT-WHERE-HAVING</link>
            <guid>https://velog.io/@pado_/SQL-SELECT-WHERE-HAVING</guid>
            <pubDate>Sat, 30 Nov 2024 15:38:17 GMT</pubDate>
            <description><![CDATA[<p>한국 사람과 대화하려면 한국어를 알아야 하고 일본 사람과 대화하려면 일본어를 알아야 한다. 데이터베이스와 대화하려면? SQL 언어를 할 줄 알아야 한다.
그러니 SQL 공부를 차근차근 해보자 
<img src="https://velog.velcdn.com/images/pado_/post/b26b008c-88c3-4602-a78e-ac335299d64f/image.png" alt="sql meme"></p>
<p>SQL 연습은  무료 사이트인 <a href="https://www.w3schools.com/mysql/trymysql.asp?filename=trysql_select_all">이곳</a>에서 진행했다.</p>
<p>아래의 코드는 SQL에서 가장 기초가 되는 코드이다. 
<strong>SELECT, WHERE, HAVING</strong>절이 어떤 역할을 하는지 설명해보겠다. </p>
<pre><code class="language-sql">SELECT 열
FROM 데이터셋
WHERE
GROUP BY
HAVING
ORDER BY</code></pre>
<h3 id="1-select절--데이터-선택">1. SELECT절 : 데이터 선택</h3>
<ul>
<li>DB에서 <strong>특정 column</strong>을 조회할 때 사용하는 명령어다.
예를 들어 내가 Customers 데이터셋에서 전체 데이터를 보고 싶을 수도, 고객의 이름과 주소만 보고 싶을 수도 있다. 이럴 때 사용하는 것이** select **절이다.</li>
</ul>
<ol>
<li>Customers 데이터셋에서 모든(*) 열 조회 </li>
</ol>
<pre><code class="language-sql">SELECT * FROM Customers; 
</code></pre>
<p><img src="https://velog.velcdn.com/images/pado_/post/96cdbb1d-b8a6-4780-b5ad-d536dd0beeb6/image.png" alt="예제1"></p>
<ol start="2">
<li>Customers 데이터셋에서 Address 열만 조회 <pre><code class="language-sql">SELECT Address FROM Customers;</code></pre>
</li>
</ol>
<img src="https://velog.velcdn.com/images/pado_/post/be93540d-d486-4d4f-a322-d3f908465a99/image.png" alt="alt text" width="400" height="200">

<ol start="3">
<li>Address 열 이름을 Ad 열 이름으로 변경하여 조회 (AS)<pre><code class="language-sql">SELECT Address AS Ad FROM Customers;</code></pre>
</li>
</ol>
<h3 id="2-where절--조건에-따른-데이터-필터링">2. WHERE절 : 조건에 따른 데이터 필터링</h3>
<ul>
<li><strong>특정 조건</strong>을 만족하는 데이터만 조회한다. 
예를 들어 사장인 내가 10개 이상 팔린 물품 목록 리스트를 보고 싶거나 이름이 A로 시작하는 고객 리스트만 보고 싶을 때 <strong>where</strong> 절을 사용한다. </li>
</ul>
<ol>
<li><p>수량이 40개 이상 팔린 물품만 조회</p>
<pre><code class="language-sql">SELECT * 
FROM OrderDetails
WHERE Quantity &gt;= 40;</code></pre>
<p><img src="https://velog.velcdn.com/images/pado_/post/4fc695a7-cac9-4da7-bfe6-8fa9a09aaf2d/image.png" alt=""></p>
</li>
<li><p>이름이 A로 시작하는 고객 리스트 조회 </p>
<pre><code class="language-sql">SELECT * 
FROM Customers
WHERE CustomerName LIKE &#39;A%&#39; ;</code></pre>
<p><img src="blob:https://velog.io/af4a6ad1-ceb3-4757-8b70-4ccfc9e639d4" alt=""></p>
</li>
</ol>
<p>✅ WHERE 절 조건 연산자</p>
<table>
<thead>
<tr>
<th>연산자</th>
<th>설명</th>
<th>예시</th>
</tr>
</thead>
<tbody><tr>
<td><code>AND</code></td>
<td>두 개 이상의 조건이 모두 참일 경우 선택</td>
<td><code>SELECT * FROM users WHERE age &gt; 18 AND city = &#39;Seoul&#39;;</code></td>
</tr>
<tr>
<td><code>OR</code></td>
<td>두 개 이상의 조건 중 하나라도 참일 경우 선택</td>
<td><code>SELECT * FROM users WHERE age &lt; 18 OR city = &#39;Busan&#39;;</code></td>
</tr>
<tr>
<td><code>LIKE</code></td>
<td>문자열 패턴 매칭 (<code>%</code> )</td>
<td><code>SELECT * FROM products WHERE name LIKE &#39;Samsung%&#39;;</code></td>
</tr>
<tr>
<td><code>NOT</code></td>
<td>조건이 참이 아닌 경우 선택</td>
<td><code>SELECT * FROM users WHERE NOT city = &#39;Seoul&#39;;</code></td>
</tr>
<tr>
<td><code>%</code></td>
<td>임의의 여러 문자를 대체하는 와일드카드</td>
<td><code>SELECT * FROM products WHERE name LIKE &#39;S%g&#39;;</code></td>
</tr>
<tr>
<td><code>_</code></td>
<td>단일 문자를 대체하는 와일드카드</td>
<td><code>SELECT * FROM products WHERE code LIKE &#39;A_123&#39;;</code></td>
</tr>
</tbody></table>
<h3 id="3-having-절-집계-함수-결과에-조건-적용">3. HAVING 절: 집계 함수 결과에 조건 적용</h3>
<ul>
<li>집계 함수(SUM, AVG, COUNT 등)를 사용한 결과에 조건을 걸 때 활용한다. </li>
<li>WHERE과 다른 점은 집계된 결과를 조건에 적용한다는 점이다. 
예를 들어 1년 중 총 매출이 1000만원이 넘는 달이 어느 달인지 볼 때 <strong>Having</strong> 절이 사용된다. </li>
</ul>
<ol>
<li>카테고리별 판매 금액이 300 이상인 경우<pre><code class="language-sql">SELECT category, SUM(amount) AS total_amount
FROM sales
GROUP BY category
HAVING SUM(amount) &gt;= 300;
</code></pre>
</li>
</ol>
<pre><code>
2. 특정 지역에서 판매된 제품 수가 2개 이상인 경우
```sql
SELECT region, COUNT(product) AS product_count
FROM sales
GROUP BY region
HAVING COUNT(product) &gt;= 2;</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[자료구조(2) : 선형 자료구조 (배열, 연결 리스트) ]]></title>
            <link>https://velog.io/@pado_/%EC%9E%90%EB%A3%8C%EA%B5%AC%EC%A1%B02-%EC%84%A0%ED%98%95-%EC%9E%90%EB%A3%8C%EA%B5%AC%EC%A1%B0-%EB%B0%B0%EC%97%B4-%EC%97%B0%EA%B2%B0-%EB%A6%AC%EC%8A%A4%ED%8A%B8</link>
            <guid>https://velog.io/@pado_/%EC%9E%90%EB%A3%8C%EA%B5%AC%EC%A1%B02-%EC%84%A0%ED%98%95-%EC%9E%90%EB%A3%8C%EA%B5%AC%EC%A1%B0-%EB%B0%B0%EC%97%B4-%EC%97%B0%EA%B2%B0-%EB%A6%AC%EC%8A%A4%ED%8A%B8</guid>
            <pubDate>Thu, 28 Nov 2024 14:09:44 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/pado_/post/1c337e12-110c-412f-a424-88c645b65ed9/image.png" alt="자료구조">
출처: 한빛출판네트워크 </p>
<p>자료구조에는 선형 자료구조와 비선형 자료구조가 있으며 자료를 순차적으로 나열한 구조를 선형 자료구조라 말한다. 이번 글에서는 선형 자료구조 중 배열과, 링크드 리스트에 대해 공부해 보고자 한다. </p>
<h3 id="1-배열-array">1. 배열 (Array)</h3>
<h4 id="💡-배열의-개념">💡 배열의 개념</h4>
<p><strong>배열</strong>은 연속된 메모리 공간에 <strong>순차적</strong>으로 데이터를 저장한다. 
배열은 선언할 때 크기를 저장하면 <strong>고정</strong>이 된다. 따라서 크기를 변경하고 싶다면 재선언을 해야 한다.</p>
<p>배열은 인덱스로 접근이 가능하며 인덱스는 0 부터 시작한다. </p>
<pre><code class="language-python"># 예시
array = [ &#39;지수&#39;, &#39;제니&#39;, &#39;리사&#39; , &#39;로제&#39;]
for i in range(len(array)):
    print(f&#39;index {i} 번째는 {array[i]}입니다.&#39;)

출력값 : 
index 0 번째는 지수입니다.
index 1 번째는 제니입니다.
index 2 번째는 리사입니다.
index 3 번째는 로제입니다.</code></pre>
<h4 id="💡-배열의-시간-복잡도">💡 배열의 시간 복잡도</h4>
<table>
<thead>
<tr>
<th><strong>연산</strong></th>
<th><strong>시간 복잡도</strong></th>
<th><strong>설명</strong></th>
</tr>
</thead>
<tbody><tr>
<td><strong>접근 (Access)</strong></td>
<td>O(1)</td>
<td>인덱스를 사용해 특정 위치의 요소를 바로 참조 가능.</td>
</tr>
<tr>
<td><strong>탐색 (Search)</strong></td>
<td>O(n)</td>
<td>배열 전체를 순회해야 하므로, 최악의 경우 모든 요소를 확인해야 함.</td>
</tr>
<tr>
<td><strong>삽입 (Insert)</strong></td>
<td>O(n)</td>
<td>배열 중간에 삽입 시 나머지 요소를 이동해야 하기 때문에 최악의 경우 O(n).</td>
</tr>
<tr>
<td><strong>삭제 (Delete)</strong></td>
<td>O(n)</td>
<td>배열 중간에서 삭제 시 나머지 요소를 이동해야 함.</td>
</tr>
<tr>
<td><strong>추가 (Append)</strong></td>
<td>O(1)</td>
<td>배열 끝에 요소를 추가하는 경우(크기 조정이 필요하지 않다면) O(1).</td>
</tr>
</tbody></table>
<h4 id="💡-배열의-장단점">💡 배열의 장단점</h4>
<p>1) 장점</p>
<ul>
<li>탐색 시 접근이 O(1)로 빠르다.</li>
</ul>
<p>2) 단점</p>
<ul>
<li>크기 변경이 불가능해 메모리 낭비나 부족 현상이 일어날 수 있다. </li>
<li>삽입/삭제 시 많은 데이터 이동이 필요하다. </li>
</ul>
<h3 id="2-연결-리스트-linked-list">2. 연결 리스트 (Linked List)</h3>
<h4 id="💡-연결-리스트의-개념">💡 연결 리스트의 개념</h4>
<p><img src="https://velog.velcdn.com/images/pado_/post/16995796-1de2-4962-80e7-a8792a155859/image.png" alt="연결 리스트">
출처: Find Todays Notes</p>
<p><strong>연결 리스트</strong>는 <strong>노드</strong>가 포인터로 연결된 구조로, 데이터와 다음 노드의 주소를 저장한다.</p>
<p>쉽게 예시를 들자면 우리가 전국 여행을 할 때 지도에다가 방문할 도시를 선으로 연결한 것도 연결 리스트가 될 수 있다. </p>
<p>ex) 1일차 : 서울 -&gt; 2일차 : 대전 -&gt; 3일차 : 부산 -&gt; 4일차 : 제주도 </p>
<p>연결 리스트는 <strong>노드구조</strong>로 되어 있다. <strong>노드(Node)</strong>는 <strong>데이터</strong>와 <strong>링크</strong>로 이루어져있다. </p>
<h4 id="💡-단순-연결리스트">💡 단순 연결리스트</h4>
<ol>
<li>노드 정의 </li>
</ol>
<pre><code class="language-python">class Node():
    def __init__(self):
        self.data = None # 노드 
        self.link = None # 링크 </code></pre>
<ol start="2">
<li><p>데이터 삽입 </p>
<pre><code class="language-python">def insertNode(findData, insertData):
 global memory, head, current, pre

 # case 1: head 앞에 삽입 (맨 앞에 삽입)
 if head.data == findData:
     node = Node()
     node.data = insertData
     node.link = head
     head = node
     return 

 #case 2: 중간에 삽입
 current = head 
 while (current.link != None ):
     pre = current
     current = current.link
     if (current.data == findData ) :
         node = Node()
         node.data = insertData
         node.link = current
         pre.link = node
         return

 #case 3: 찾는 데이터가 없을 때 = 마지막에 추가 
 node = Node()
 node.data = insertData
 current.link = node
 return
</code></pre>
</li>
</ol>
<pre><code>
3. 데이터 삭제
```python
def deleteNode(deleteData):
    global memory, head, current, pre

    #case1 : head를 삭제할 때 
    if (head.data == deleteData) : 
        current = head
        head = head.link
        del(current)
        return

    #case2 : 중간 데이터 삭제
    current = head
    while (current.link != None ):
        pre = current
        current = current.link
        if (current.data == deleteData):
            pre.link = current.link
            del(current)
            return 

    #case3 : 지울 데이터가 없을 때
    return </code></pre><ol start="4">
<li><p>데이터 검색 </p>
<pre><code class="language-python">def findNode(findData):
 global memory, head, current, pre
 current = head
 if current.data == findData : 
     return current #노드 형태로 반환 
 while(current.link != None ):
     current = current.link
     if current.link == findData:
         return current

 return Node()
</code></pre>
</li>
</ol>
<p>```</p>
<h4 id="💡-연결리스트-시간복잡도">💡 연결리스트 시간복잡도</h4>
<table>
<thead>
<tr>
<th><strong>연산</strong></th>
<th><strong>시간 복잡도</strong></th>
<th><strong>설명</strong></th>
</tr>
</thead>
<tbody><tr>
<td><strong>접근 (Access)</strong></td>
<td>O(n)</td>
<td>특정 인덱스로 직접 접근 불가, 첫 노드부터 순차 탐색 필요.</td>
</tr>
<tr>
<td><strong>탐색 (Search)</strong></td>
<td>O(n)</td>
<td>원하는 값을 찾기 위해 모든 노드를 순회해야 함.</td>
</tr>
<tr>
<td><strong>삽입 (Insert)</strong></td>
<td>O(1) (노드 위치 알고 있을 때) / O(n) (탐색 포함)</td>
<td>노드 위치를 알고 있다면 O(1), 중간 위치 삽입 시 탐색 필요하므로 O(n).</td>
</tr>
<tr>
<td><strong>삭제 (Delete)</strong></td>
<td>O(1) (노드 위치 알고 있을 때) / O(n) (탐색 포함)</td>
<td>노드 위치를 알고 있다면 O(1), 삭제할 노드를 찾기 위해 O(n) 탐색 필요.</td>
</tr>
<tr>
<td><strong>추가 (Append)</strong></td>
<td>O(1) (단일 연결 리스트, 마지막 노드 포인터가 있을 경우) / O(n)</td>
<td>마지막 노드에 접근해야 하므로 O(n), 포인터가 있다면 O(1).</td>
</tr>
</tbody></table>
<h4 id="💡-연결리스트-장단점">💡 연결리스트 장단점</h4>
<p>1) 장점</p>
<ul>
<li>크기 변경이 자유롭고, 삽입/삭제가 O(1)로 빠르다(노드를 직접 참조할 경우).</li>
</ul>
<p>2) 단점</p>
<ul>
<li>인덱스 접근이 O(n)으로 느리다.</li>
<li>추가 메모리(포인터) 사용으로 공간 낭비 가능하다.</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[자료구조 (1) : 왜 알아야 하는데? , 자료구조 종류 ]]></title>
            <link>https://velog.io/@pado_/%EC%9E%90%EB%A3%8C%EA%B5%AC%EC%A1%B0-1-%EC%99%9C-%EC%95%8C%EC%95%84%EC%95%BC-%ED%95%98%EB%8A%94%EB%8D%B0-%EC%9E%90%EB%A3%8C%EA%B5%AC%EC%A1%B0-%EC%A2%85%EB%A5%98</link>
            <guid>https://velog.io/@pado_/%EC%9E%90%EB%A3%8C%EA%B5%AC%EC%A1%B0-1-%EC%99%9C-%EC%95%8C%EC%95%84%EC%95%BC-%ED%95%98%EB%8A%94%EB%8D%B0-%EC%9E%90%EB%A3%8C%EA%B5%AC%EC%A1%B0-%EC%A2%85%EB%A5%98</guid>
            <pubDate>Wed, 27 Nov 2024 14:21:40 GMT</pubDate>
            <description><![CDATA[<img src="https://velog.velcdn.com/images/pado_/post/1b939ad8-dc17-454c-808b-7522725abc07/image.png" width="400" height="400">
출처: Dev Genius


<blockquote>
<p>자료구조(Data structure) 꼭 알아야 하나? </p>
</blockquote>
<p>데이터를 다루는 직업이라면 <strong>자료구조</strong>는 꼭 알아야 한다. </p>
<p>우리는 하루에 얼마나 많은 데이터를 생성하고 있을까? </p>
<p>카톡을 보내고, 구글에서 검색하고, 쿠팡에서 쇼핑할 때, 출근길에 버스 카드를 찍고, 캐치테이블에서 웨이팅을 걸 때마다 끊임없이 쌓이는 데이터들을 어떻게 관리하는지 생각해 본 적이 있는가?  </p>
<p>이러한 방대한 데이터를 효과적으로 관리하는데 &#39;<strong>자료구조</strong>&#39;가 기반이 된다. </p>
<h3 id="그래서-자료구조가-뭔데-🤔">그래서 자료구조가 뭔데? 🤔</h3>
<h4 id="자료구조-데이터를-효과적으로-보관하고-관리하기-위한-방법이다">자료구조: 데이터를 효과적으로 보관하고 관리하기 위한 방법이다.</h4>
<p>자료구조는 크게 <strong>선형 구조 (Linear)</strong>와 <strong>비선형 구조(Non Linear)</strong>로 나뉘어져 있다. </p>
<p><img src="https://velog.velcdn.com/images/pado_/post/5f70006a-1ce1-4748-a94b-2d148c015145/image.png" alt="자료구조 사진">
출처: :BaseClass</p>
<h3 id="1-선형-구조">1. 선형 구조</h3>
<p><strong>선형 구조</strong>는 데이터가 <strong>일렬로 나열된 형태</strong>다. 
각 원소가 <strong>순서대로</strong> 연결되어 있어, 앞뒤 관계가 명확하다(1:1 관계). </p>
<p>종류 : 배열, 링크드리스트, 스택 , 큐</p>
<p>예시)</p>
<p>배열 - 담은 순서대로 나열되어 있는 쇼핑몰 장바구니
링크드리스트 - 중간에 곡을 추가, 삭제가 가능한 음악 재생 목록
스택 - 브라우저의 뒤로 가기 기능
큐 - 레스토랑 대기 명단 </p>
<h3 id="2-비선형-구조">2. 비선형 구조</h3>
<p><strong>비선형 구조</strong>는 데이터들이 <strong>계층적</strong>이거나 복잡하게 연결된 형태다.
각 원소 간의 관계가 1:n 혹은 n:n 로 이루어질 수 있어 계층적 혹은 망형 구조를 가진다.</p>
<p>종류: 트리, 그래프 </p>
<p>예시)</p>
<p>트리 - 웹 사이트 네비게이션 메뉴 
그래프 - 지하철 노선도</p>
]]></description>
        </item>
    </channel>
</rss>