<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>chan_e22.log</title>
        <link>https://velog.io/</link>
        <description>chan</description>
        <lastBuildDate>Wed, 08 Apr 2026 05:18:20 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>chan_e22.log</title>
            <url>https://velog.velcdn.com/images/chan_e22/profile/e8a43d59-c6c1-4b8d-a67b-a88c228b3b3b/image.png</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. chan_e22.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/chan_e22" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[N8N 가지고 놀아보기 ]]></title>
            <link>https://velog.io/@chan_e22/N8N-%EA%B0%80%EC%A7%80%EA%B3%A0-%EB%86%80%EC%95%84%EB%B3%B4%EA%B8%B0</link>
            <guid>https://velog.io/@chan_e22/N8N-%EA%B0%80%EC%A7%80%EA%B3%A0-%EB%86%80%EC%95%84%EB%B3%B4%EA%B8%B0</guid>
            <pubDate>Wed, 08 Apr 2026 05:18:20 GMT</pubDate>
            <description><![CDATA[<p>써 보고 싶어서</p>
<p>클로드한테 N8N이랑 바이브 코딩 연습 할 수 있는 기획 물어보고 관심 분야 알려 주었더니 기획을 해줌</p>
<blockquote>
<p>경제/ 주식 프로젝트
&quot;나만의 주식 브리핑 봇&quot;</p>
</blockquote>
<ol>
<li>관심 종복 뉴스 + 시세 매일 수집</li>
<li>AI가 요약해서 아침에 카톡/ 이메일 전송
결과 : N8N 크롤링,API 연동, 스케줄링 다 익힐수 있음</li>
</ol>
<p>국내주식보다는 데이터가 많은 미국 주식으로 해보려고 함. </p>
<p>나중에 고도화 때 국내주식 가지고 해보기 </p>
<p>종목은 미국 ETF
브리핑 방식 이메일
주기 매주 월요일 아침
내용 지난주 ETF 수익률 + 경제이슈 + AI 요약 코멘트</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[파이썬 반복문]]></title>
            <link>https://velog.io/@chan_e22/%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EB%B0%98%EB%B3%B5%EB%AC%B8</link>
            <guid>https://velog.io/@chan_e22/%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EB%B0%98%EB%B3%B5%EB%AC%B8</guid>
            <pubDate>Wed, 26 Feb 2025 01:54:15 GMT</pubDate>
            <description><![CDATA[<p>반복문</p>
<ul>
<li>특정 작업을 반복해서 수행</li>
<li>&quot;다른 값&quot;에 대한 &quot;동일한 연산&quot;을 수행</li>
<li>자동적이고 효율적으로 반복 수행할 수 잇음.</li>
</ul>
<p>for</p>
<ul>
<li><p>시퀀스(리스트,튜플, 문자열 등)을 순회할 수 있음
  시퀀스: 반복 가능한 (next 요소가 있는)저장공간</p>
</li>
<li><p>for을 통해 시퀀스 요소들에 동일한 연산을 수행</p>
</li>
<li><p>고정된 수행 횟수
  반복하여 수행될 명령은 indent(들여쓰기)로 구분(Tab/4spaces)</p>
<blockquote>
</blockquote>
<pre><code>for{변수명} in {시퀀스}
else -&gt; 조건문의 else와 반복문의 else는 다름// 반복문의 else는 반복이 모두 완료되고 반드시 그다음에 실행되는 것이 이 else 임

numbers =[1,2,3,4,5]

for number in numbers:
   print(number)
else:
   print(&quot;출력이 완료되었습니다.&quot;)
</code></pre><p>range() -&gt; 특정한 규칙을 가지는 숮자 목록을 반환하고 그 반환된 숫자 목록을 반복문에 사용할수 있도록 하는 </p>
<ul>
<li>range([start,],stop[,step])</li>
<li>{start} 부터 {step}만큼 증가, {stop}까지의 숫자 목록을 생성</li>
<li>5회 반복 (0~4),i 값은 1씩 증가</li>
<li>range(n) : 0 ~ (n-1)까지의 정수</li>
<li>range(i,n): i부터(n-1)까지의 정수</li>
<li>range(i,n,x):i부터 (n-1)까지, x간격으로</li>
</ul>
<pre><code></code></pre></li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[파이썬 조건문]]></title>
            <link>https://velog.io/@chan_e22/%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EC%A1%B0%EA%B1%B4%EB%AC%B8</link>
            <guid>https://velog.io/@chan_e22/%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EC%A1%B0%EA%B1%B4%EB%AC%B8</guid>
            <pubDate>Tue, 25 Feb 2025 04:59:39 GMT</pubDate>
            <description><![CDATA[<p>조건문</p>
<ul>
<li><p>if 와 else로 구성</p>
</li>
<li><p>if 뒤에는 참/거짓을 가지는 조건문</p>
</li>
<li><p>else 뒤에는 조건이 작성되지 않음</p>
</li>
<li><p>if{}:
  조건에 의해 수행될 명령은 들여쓰기로 구분(탭/4스페이스)</p>
<pre><code>  num =11
  if (num % 2 == 0):
       print(&quot;Enen&quot;)
   else:
       print(&quot;odd&quot;)

   choice = input(&quot;선택:&quot;)

   if choice == &quot;1&quot;:
       todo = input (&quot;추가할 일:&quot;)
      todo_list.append(todo)
      print(f&quot;{todo} 할 일이 추가 되었습니다.&quot;)
</code></pre><p>복합 조건문</p>
</li>
<li><p>여러 조건들을 중첩하여 체크 하는 겨우</p>
</li>
<li><p>한 if  에서 필터링이 되지 않는 경우</p>
</li>
<li><p>여러 조건을 동시에 만족해야 하는 경우</p>
</li>
<li><p>계층 구조에 따른 조건문을 만들고 싶은 경우 </p>
</li>
</ul>
<elif>
  - if 조건이 성립하지 않으며, 새로운 새로운 조건을 만족 할때 수행됨



<pre><code>   score = 8
  if score == 10:
      print(&quot;you&#39;re the Best!&quot;)
  elif score &gt; 5:
      print(&quot; you passed!&quot;)
  else:
      print(&quot; you Failde...&quot;)</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[파이썬 자료구조_코딩테스트]]></title>
            <link>https://velog.io/@chan_e22/%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EC%9E%90%EB%A3%8C%EA%B5%AC%EC%A1%B0%EC%BD%94%EB%94%A9%ED%85%8C%EC%8A%A4%ED%8A%B8</link>
            <guid>https://velog.io/@chan_e22/%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EC%9E%90%EB%A3%8C%EA%B5%AC%EC%A1%B0%EC%BD%94%EB%94%A9%ED%85%8C%EC%8A%A4%ED%8A%B8</guid>
            <pubDate>Fri, 21 Feb 2025 06:55:29 GMT</pubDate>
            <description><![CDATA[<p>그냥 강의가 코드만 따라치면 도저히 늘지 가 않을것 같다서 자료 구조에 관련된 문제 찾아봄</p>
<p><img src="https://velog.velcdn.com/images/chan_e22/post/5f70f095-17ee-4c75-944c-73a4d336514e/image.png" alt=""></p>
<p>이문제를 보고 어떤 자료구조를 써야 할까 했을때 첫번째 </p>
<p>값을 할당한다고 했으니까 튜플?
c에서 1의 값이 변하면 안될것 같은데? 였음 </p>
<blockquote>
<p>Q. 어떤 자료구조로 해야되는 것인가? //
음을 숫자로 바꾸어 표현을 한다고 하고 그값은 지정을 해놓으면 바뀌지 않는 값이다. 그러면 불변성인 튜플이지 않을까?
=&gt; 근데 값을 할당하고 정렬하고 하려면,, 튜플은 못쓴다고 함 리스트?
 튜플은 자료를 못 변하기 때문에 연주 인 무작이 배열을 하지 못할것 같음 그럼 딕셔너리가 가장 좋은것 같기도..?</p>
</blockquote>
<pre><code> #튜플로 해본거
scale = (1,2,3,4,5,6,7,8)
c,d,e,f,g,a,b,C = scale
scale_t = sorted(scale)
scale_t = sorted(scale,reverse=True) # 리스트로 반환


# 배열을 무작위로 하는 것 은? while true?

if scale_t == [1,2,3,4,5,6,7,8] :
    print(&quot;ascending&quot;)
elif scale_t == [8,7,6,5,4,3,2,1] :
    print(&quot;descending&quot;)
else:
    print(&quot;mixed&quot;)
</code></pre><p> 여기서 무작위로 배열하는 것을 아직 못하였고 그냥 튜플을 리스트로 정렬했을때
 조건이 맞아서 해당 문구가 프린트가 되긴 함</p>
<p> 그래서 해봤는데 </p>
<p> 당연히 틀림...ㅎㅎ</p>
<p> <img src="https://velog.velcdn.com/images/chan_e22/post/c50de0dc-50d8-4048-9f41-d72e84bafbd8/image.png" alt=""></p>
<p>너무 단호박이라서 뭔 말도 못했지만 
그래서 구글링 해봄 ㄱㄱ</p>
<p>다들... 나처럼 어떤 자료 구조를 쓸지 생각을 하지 않는다...
당연하게 리스트를 쓰는데?</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[파이썬 흐름제어]]></title>
            <link>https://velog.io/@chan_e22/%ED%8C%8C%EC%9D%B4%EC%8D%AC-%ED%9D%90%EB%A6%84%EC%A0%9C%EC%96%B4</link>
            <guid>https://velog.io/@chan_e22/%ED%8C%8C%EC%9D%B4%EC%8D%AC-%ED%9D%90%EB%A6%84%EC%A0%9C%EC%96%B4</guid>
            <pubDate>Mon, 17 Feb 2025 07:23:42 GMT</pubDate>
            <description><![CDATA[<p>-조건문
-반복문
-예외처리</p>
<h2 id="조건문">조건문</h2>
<ul>
<li><p>프로그램은 다양한 명령문들의 집합</p>
</li>
<li><p>언제 어떠한 명령문을 사용할 것 인가?</p>
</li>
<li><p>다양한 분기와 선택,&quot; 논리 구조 의 구현
&lt;복합 조건문&gt;
  여러조건들을 중첩하여 체크하는 경우
  한 if에서 필터링이 되지 않는 경우
  여러 조건을 동시에 만족해야 하는 경우
  계층 구조에 따른 조건문을 만들고 싶은 경우 </p>
<ul>
<li><p>elif{boolean statement}:
if 조건이 성립하지 않으며, 새로운 조건을 만족할때 수행됨</p>
<p><img src="https://velog.velcdn.com/images/chan_e22/post/dc8414b0-d458-4198-8d45-9f5afc3006d6/image.png" alt=""></p>
</li>
<li><p>if{][and /or]{}:
   논리연산을 거친 결과가 true 인 경우 </p>
</li>
</ul>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[파이썬 자료 구조 활용 실습]]></title>
            <link>https://velog.io/@chan_e22/%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EC%9E%90%EB%A3%8C-%EA%B5%AC%EC%A1%B0-%ED%99%9C%EC%9A%A9-%EC%8B%A4%EC%8A%B5</link>
            <guid>https://velog.io/@chan_e22/%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EC%9E%90%EB%A3%8C-%EA%B5%AC%EC%A1%B0-%ED%99%9C%EC%9A%A9-%EC%8B%A4%EC%8A%B5</guid>
            <pubDate>Mon, 17 Feb 2025 07:01:06 GMT</pubDate>
            <description><![CDATA[<h2 id="할일-목록-관리자">할일 목록 관리자</h2>
<p>간단한 todo 메모 프로그램
사용자로부터 입력을 받아,할 일 목록을 정리한다.
추가, 삭제, 목록 조회하기</p>
<pre><code># 투루리스트를 어떻게 저장할 것인가?
# 여러개의 데이터를 저장하려면 리스트 튜플 딕셔너리 세트 &gt;&gt; 가벼운 데이터를 추가하고 삭제하기 때문에  튜플은 사용할수 없음 &gt;&gt; 리스트 또는 세트를 이용하는 것이 적당해 보임

todo_list = []

while True:
    print(&quot;&quot;)
    print(&quot;할 일 목록 관리자&quot;)
    print(&quot;1. 할 일 추가&quot;)
    print(&quot;2. 할 일 삭제&quot;)
    print(&quot;3. 할 일 목록 보기&quot;)
    print(&quot;4. 종료&quot;)


    choice = input(&quot;선택:&quot;)

    if choice == &quot;1&quot;:
        todo = input(&quot;추가할일:&quot;)
        todo_list.append(todo)
        print(f&quot;{todo} 할일이 추가 되었습니다.&quot;)
    elif choice == &quot;2&quot;:
        todo = input(&quot;삭제할 일:&quot;)
        todo_list.remove(todo)
        print(f&quot;{todo} 할일이 삭제 되었습니다.&quot;)
    elif choice == &quot;3&quot;:
        print(todo_list)
    elif choice == &quot;4&quot;:
        break
    else:
        print(&quot;올바른 선택이 아닙니다. 다시 시도해보세요&quot;)</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[파이썬 자료구조 _2]]></title>
            <link>https://velog.io/@chan_e22/%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EC%9E%90%EB%A3%8C%EA%B5%AC%EC%A1%B0-2</link>
            <guid>https://velog.io/@chan_e22/%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EC%9E%90%EB%A3%8C%EA%B5%AC%EC%A1%B0-2</guid>
            <pubDate>Mon, 17 Feb 2025 06:12:12 GMT</pubDate>
            <description><![CDATA[<h2 id="딕셔너리">딕셔너리</h2>
<ul>
<li>매핑 자료구조</li>
<li>키와 이에 해당하는 값로 구성</li>
<li>해시 테이블과 유사 </li>
</ul>
<p>&lt;딕셔너리 정의&gt;</p>
<ul>
<li>중괄호{} 를 사용하고, 각 요소의 키와 값은 콜론 : 으로 구분하며, 요소간에는 쉼표 , 로 구분</li>
<li>비어있는 딕셔너리 만들기 
<img src="https://velog.velcdn.com/images/chan_e22/post/b634b1cc-7251-458a-8f73-f3d7afe42675/image.png" alt=""></li>
</ul>
<p>&lt;딕셔너리 요소에 접근하기&gt;</p>
<ul>
<li>dictionary[key]로 접근</li>
<li>정의되지 않는 key로 접근 시, KeyEroor 발생</li>
</ul>
<p>&lt;딕셔너리 활용&gt;</p>
<ul>
<li><p>다양한 타입 저장하기
  key는 불변 타입만 사용할수 있음 =&gt; 문자나 튜플만 가능 // 리스트 불가능
  value에는 다양한 타입을 사용할 수 있음
  <img src="https://velog.velcdn.com/images/chan_e22/post/33e6eb64-bcf2-4095-8739-fe78e125f1e3/image.png" alt=""></p>
</li>
<li><p>복합 구조체
  딕셔너리 내부에 다양한 형태로 구조화 할 수 있음
  복잡한 데이터를 구조화 하여 관리
  <img src="https://velog.velcdn.com/images/chan_e22/post/7fff1f88-3bf7-47d9-8c30-f7c69b4b2e03/image.png" alt=""></p>
</li>
<li><p>저장된 내용 가져오기
  keys() : 저장된 key 목록 얻어오기
  values() : 저장된 value 목록 얻어오기
  items() : 저장된 (key , value)쌍 얻어오기</p>
</li>
<li><p>요소 탐색
  get(key[,default]) : key 값에 저장된 value 가져오기
  =&gt; default 값을 지정한 경우, key가 없을때 default 값을 반환
  key in dict : dict 내에 key가 있는지 조회 하기
  pop(key[,default]) : key 값에 저장된 value를 가져오고, key값 삭제
  =&gt; default 값을 지정한 경우, key가 없을때 default 값을 반환</p>
<h2 id="세트">세트</h2>
<ul>
<li>집합 자료구조</li>
<li>중복 불가능한 요소들로 구성</li>
<li>각 요소들이 해싱되어 저장되며, 순서를 가지지 않음
  인덱스를 통한 요소 조회, 슬라이싱이 불가능함.</li>
</ul>
</li>
</ul>
<p>&lt;세트 정의하기&gt;
    - {} 또는 set() 을 통해 정의
    - 비어있는 세트 만들기 
    <img src="https://velog.velcdn.com/images/chan_e22/post/ebb3cd86-bfa1-4ce7-a64a-3f45ef3ae757/image.png" alt=""></p>
<p>&lt;세트에 값 추가/삭제하기&gt;</p>
<ul>
<li>add(): 세트에 값 하나 추가하기</li>
<li>update(): 세트에 여러값 추가하기</li>
<li>remove(): 세트에 값 삭제하기 
&lt;세트 다양한 집합 연산&gt;</li>
<li>set는 집합에 관한 것을 처리하기 위한 데이터 타입
   합집합 : set1|set2,set1.union(set2)
   교집합 : set1&amp;set2,set1.intersection(set2)
   차집합 : set1-set2,set1.difference(set2)
   하위 집합 여부 :set1.issubset(set2)</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[파이썬 자료구조]]></title>
            <link>https://velog.io/@chan_e22/%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EC%9E%90%EB%A3%8C%EA%B5%AC%EC%A1%B0-9b6not20</link>
            <guid>https://velog.io/@chan_e22/%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EC%9E%90%EB%A3%8C%EA%B5%AC%EC%A1%B0-9b6not20</guid>
            <pubDate>Fri, 14 Feb 2025 07:24:50 GMT</pubDate>
            <description><![CDATA[<p>-리스트
-튜플
-딕셔너리
-세트</p>
<h2 id="리스트">리스트</h2>
<pre><code>열거형 자료구조
순서대로 값을 저장
배열과 유사 
++ 파이썬의 언어적 특징으로 인해 각 요소들이 다른 데이터 타입으로 구성되어도 상관 없음 

&lt;리스트 정의&gt;</code></pre><p><img src="https://velog.velcdn.com/images/chan_e22/post/06017e18-ccbb-4754-9198-1d6a74858087/image.png" alt=""></p>
<p>&lt;리스트 요소 에 접근하기&gt;
요소: 리스트의 각 항목
문자열에서 처럼, 리스트[인덱스]로 접ㄱㄴ
문자열에서 처럼, 슬라이싱도 가능
<img src="https://velog.velcdn.com/images/chan_e22/post/b6b22794-0176-4cd5-9183-56a61b53c7ae/image.png" alt=""></p>
<p>&lt;리스트 화ㄹ용&gt;
복합 리스트: 리스트의 요소로 리스트를 사용 가능</p>
<p>기본함수</p>
<ul>
<li><p>리스트 길이 구하기 : len([&#39;l&#39;,&#39;f&#39;])</p>
</li>
<li><p>최대 값 구하기 : max([1,2,3,4])</p>
</li>
<li><p>최소값 구하기 : min([1,2,3,4])</p>
<p>요소찾기</p>
<pre><code>s = [&#39;l&#39;,&#39;i&#39;,&#39;s&#39;,&#39;t&#39;]

s.index(&#39;i&#39;)
#1
&#39;t&#39; in s //특정 인덱스가 있는지 없는지 여부를 불리언 값으로 
#true
&#39;x&#39; not in s
#true
s.count(&#39;l&#39;) // 특정 엘리먼트가 해당 리스트에 몇개가 있는지 갯수 세는거 
#1
</code></pre><p>요소 수정하기</p>
<pre><code>append() :  요소 추가하기 
insert() : 요소 삽입하기
extend() : 요소 확장하기
del,remove() : 요소 제거하기
pop() : 요소 꺼내고 제거하기 
sort() :오름 차순 정렬
reverse() : 원래 리스트 반대로 정렬</code></pre><p><img src="https://velog.velcdn.com/images/chan_e22/post/70e60a06-b365-40d3-8500-f221c8ac7b1c/image.png" alt=""></p>
</li>
</ul>
<h2 id="튜플">튜플</h2>
<p>열거형 자료구조
순서대로 값을 저장
배열과 유사
불변속성(변경을 가할수 없음)</p>
<h3 id="가변-불변">&lt;가변? 불변?&gt;</h3>
<p>가변 데이터 타입
     -정의된 이후에도 변경이 자유로움
    -데이터의 유연성을 제공
    -열거형 가변 데이터 타입:list 
불변 데이터 타입
    - 변수의 값을 변경 할 수 없음
    -데이터의 무결성을 보장함
    - 열거형 불변 데이터타입 :str,tuple</p>
<p>Q. 문자열은 왜 불변인가?
문자열을 직접 변경할수는 없지만, 새로운 문자열을 만들어 변경된 것 처럼 보이게 할 수는 있음
문자열이 불변 하기 때문에 원래 문자열을 수정하는 것이 아니라 새로운 문자열 객체를 생성하여 할당하는 방식으로 동작</p>
<p> &lt;튜플 정의하기&gt;
 -괄호&#39;()&#39;를 사용하고, 각 항목은 쉼표 &#39;,&#39;로 구분</p>
<ul>
<li>비어있는 튜플 만들기</li>
<li>한개의 요소만 가지는 튜플 만들기 
<img src="https://velog.velcdn.com/images/chan_e22/post/1798cdae-fbc6-4ae3-a3cf-a02f87392e92/image.png" alt=""></li>
</ul>
<p>&lt;튜플 요소에 접근하기&gt;</p>
<ul>
<li>리스트/문자열에서 처럼, 튜플[인덱스]로 접근</li>
<li>리스트/문자열에서 처럼, 슬라이싱도 가능
<img src="https://velog.velcdn.com/images/chan_e22/post/81fbbc70-01e6-4de8-bda1-7f9ba5809caf/image.png" alt=""></li>
</ul>
<p>&lt;튜플 활용&gt;
-기본함수 활용 가능( ex)len,max,min
-요소 찾기 가능</p>
<p>&lt;튜플의 아주 큰 특징!!!!&gt;
-패킹 : 여러값을 하나의 튜플로 묶는것
 ex) tp = 1,2,3
-언패킹 :  하나의 튜플의 값을 여러 변수에 할당 하는 것
 ex) tp = (1,2,3)
 x,y,z = tp =&gt; x 값은 1 ,y값은 2 ,z값은 3 할당</p>
<p> &lt;튜플의 언패킹 활용하기&gt;</p>
<ul>
<li>언패킹 시, 불필요한 값들은 <em>을 사용해 생략할 수 있음
ex) x,</em>,_,y,z =(1,-1,0,2,5)</li>
<li>언패킹시, 변수 중 하나에 *을 붙이면 남은 요소 전체를 리스트에 담아 대입
<img src="https://velog.velcdn.com/images/chan_e22/post/ba6fbf73-c7fa-4e70-80c4-eb9b54baefed/image.png" alt=""></li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[자료구조 선택의 기준]]></title>
            <link>https://velog.io/@chan_e22/%EC%9E%90%EB%A3%8C%EA%B5%AC%EC%A1%B0-%EC%84%A0%ED%83%9D%EC%9D%98-%EA%B8%B0%EC%A4%80</link>
            <guid>https://velog.io/@chan_e22/%EC%9E%90%EB%A3%8C%EA%B5%AC%EC%A1%B0-%EC%84%A0%ED%83%9D%EC%9D%98-%EA%B8%B0%EC%A4%80</guid>
            <pubDate>Fri, 14 Feb 2025 06:57:49 GMT</pubDate>
            <description><![CDATA[<p>자료 구조 선택의 기준</p>
<p>-데이터의 종류와 형태
-주요 연산의 종류
-시간 복잡도와 공간 복잡도
-애플리케이션의 활용 분야
-효율성 및 성능</p>
<blockquote>
<p>Q1. 어떤 자료 구조가 적합할까요?
    데이터의 크기가 고정되어있지 않습니다.
    데이터 중간에 새로운 요소를 삽입하거나, 삭제하는 일이 잦습니다.
    데이터 외의 다른 정보들이 추가로 필요합니다.</p>
</blockquote>
<p>   &lt;내생각&gt;
   이것을 보았을때 해시테이블 구조가 가장 좋을것 같다
   키와 버킷 엔티티로 중간 새로운 요소를 삽입 삭제가 부담스럽지 않고
   다른 정보들도 함께 할수 있을 것 같아서</p>
<p>   &lt;정답&gt;
   연결리스트(링크 리스트)
   왜?
   데이터가 아무리 늘었다가 줄어들었다가 하더라도 불필요한 연산이 발생하지 않으며
   데이터의 삽입과 삭제 다른 정보들의 추가도 자유롭게 쓸 수 있는 것</p>
<blockquote>
<p>Q2.어떤 자료구조가 적합할까요?
          빠른 검색 결과가 필요합니다.
       파일과 디렉토리 구조와 같이, 계층화 됨 데이터 구조로 저장되어야 합니다. </p>
</blockquote>
<p>   &lt;내생각&gt;
    트리 구조 
    근데 빠른 검색 결과면 바이너리 트리가 더 좋을것 같긴 한데,,
    계층화 된 데이터 구조면 </p>
<p>   &lt;정답&gt;
   트리요~~</p>
<blockquote>
<p>Q3. 어떤 자료구조가 적합할까요?
           각 데이터에 매칭되는 키가 존재합니다.
        데이터들 간에 키는 중복 사용되지 않습니다.
        매우 빠른 검색 속도(낮은 시간 복잡도)가 요구됩니다.</p>
</blockquote>
<p>   &lt;내생각&gt;
   이거야말로 해시 테이블이다.
   키 중복사용 안됨 왜냐면 키 충돌됨
   시간 복잡도 오1 임 
   키 존재 맞음</p>
<p>   &lt;정답&gt;
   해시테이블~~</p>
<blockquote>
<p>Q4. 어떤 자료 구조가 적합할까요?
           값이 들어온 순서대로 처리하고 싶습니다.
        처리된 데이터는 저장되지 않아도 됩니다.</p>
</blockquote>
<p>   &lt;내생각&gt;
   줄서기 인 큐?</p>
<p>   &lt;정답&gt;
   큐
   ++ 큐에서 디큐한 밸류에 대한건 큐가 더이상 책임 지지 않는다는 것 필요하다면 이걸 다시 인큐하는 건 그 바깥에 있는 프로그래머가 할일이라는 의미</p>
<blockquote>
<p>Q5. 어떤 자료 구조가 적합할까요?
           가장 최근에 입력된 값부터 처리하고 싶습니다.
        처리된 데이터는 저장되지 않아도 됩니다.</p>
</blockquote>
<p>  &lt;내생각&gt;
  가장 최근에 입력된 값 스택
  후입선출</p>
<p>  &lt;정답&gt;
  스택</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[파이썬 자료구조]]></title>
            <link>https://velog.io/@chan_e22/%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EC%9E%90%EB%A3%8C%EA%B5%AC%EC%A1%B0</link>
            <guid>https://velog.io/@chan_e22/%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EC%9E%90%EB%A3%8C%EA%B5%AC%EC%A1%B0</guid>
            <pubDate>Fri, 14 Feb 2025 06:03:36 GMT</pubDate>
            <description><![CDATA[<p>자료구조란?
 데이터에 효율적으로 접근 하기 위한 자료의 구조, 관리, 저장 규격</p>
<p> 데이터의 저장 구간을 효율적으로 설계 하기 위해서 
 다양한 자료구조를 알고 이해 할수 있으면 데이터를 보다 효율적으로 설계 하여
 더 좋은 프로그램을 만들수 있다</p>
<p> 시간 복잡도?
 특정 알고리즘이 실행 되는데에 필요한 연산 시간의 총량</p>
<p> 빅 오 표기법으로 표현됨(최악의 경우로 측정), n은 입력의 크기</p>
<p> 공간 복잡도
알고리즘, 프로그램을 수행하는데 필요한 메모리 공간의 총량</p>
<p> &lt;대표적인 자료구조&gt;</p>
<h2 id="-배열array">-배열(array)</h2>
<pre><code> 동일한 요소들이 나열된 자료형
인텍스를 통해 특정 위치의 값을 지정할 수 잇음
연속된 메모리 공간에 할당
++ 중간의 요소 하나를 지우는것이 어려움
++ 배열이 할당되는 시점에 전체 용량을 확보해야됨 </code></pre><h2 id="-연결-리스트linked-list">-연결 리스트(linked list)</h2>
<pre><code> 데이터 요소들을 노드 라는 단위로 연결하여, 저장하는 방식
노드는 데이터와 다음 노드를 가리키는 링크로 구성
추가와 삭제가 용이하며, 길이를 유동적으로 조절할 수 있음
++ 중간에 있는 어떤 값을 한번에 즉시 찾아낼 수가 없다고 함(링크를 하나씩 타고 넘어와야함)</code></pre><h2 id="-스택stack">-스택(stack)</h2>
<pre><code>순서를 가지는 자료형 
LIFO(후입선출), 최근 들어온 데이터 순서대로 조회
push(현재 스택에 쌓아서 저장하는 과정) &amp; pop(스택에 저장된 가장 마지막것을 꺼낸 행위)
실행취소, 인터넷 방문기록등
ex)웹페이지에서 뒤로가기를 하면 링크를 누르기 직전에 마지막 페이지로 이동하는 저장 메커니즘</code></pre><h2 id="-큐queue-줄서기">-큐(Queue) //줄서기</h2>
<pre><code>순서를 가지는 자료형
FIFO(선입선출),입력된 순서대로 조회
enqueue(큐에 새로운 요소를 집어 넣은 행위-&gt; 데이터가 큐에 하나씩 적재됨)&amp;dequeue(저장된 데이터 중에 가장 먼저 저장된 데이터를 꺼냄)
줄서기,예약 작업등</code></pre><h2 id="-해시테이블hash-table--검색이-중요한-저장-할때-사용되는-자료-구조">-해시테이블(hash table) : 검색이 중요한 저장 할때 사용되는 자료 구조</h2>
<pre><code>key,value(키와 값)로 구성되는 자료구조
key는 별도의 연상(해싱)을 거쳐, 특정값으로 변환됨
이에 대한 값 저장소가 1:1로 매칭 -O(1)
키 충돌 문제가 발생할 수 있음. 
시간 복잡도는 오더 숫자 1(데이터 양과 무관)
++ 핵심은 해시 알고리즘 // 해시: 주어진 키를 특정한 연산을 거쳐서 1대 1로 매칭되는 복잡한 값으로 만드는 연산
![](https://velog.velcdn.com/images/chan_e22/post/c223af46-8820-4dfc-a059-89059ab45b50/image.png)
키: 데이터를 저장하고 찾기 위한 키
버킷: 각키의 해시결과와 실제 데이터가 연결되는 메모리 주소를 가지고 있는버킷
엔트리: 실제 데이터가 저장되는 엔트리

왜 이렇게 저장?
배열에서 있었던 중간에 요소를 추가하거나 제거하는 것에 더 유연하게 
기존 버킷 사이즈와 새로 데이터가 얼마나 들어왔는지 무관하게 운영이 되기 때문에 </code></pre><h2 id="-트리tree">-트리(Tree)</h2>
<pre><code>계층 및 분기 구조를 가지는 자료구조
루트(root):맨 위의 노드를 칭함,parent/children(부모/자식): 계층 구조를 가지는 두 노드 간의 관계
디텍토리/ 파일 구조</code></pre><p><img src="https://velog.velcdn.com/images/chan_e22/post/e0150d7d-cde5-4aa4-b54f-cb94174d1bcd/image.png" alt=""></p>
<h2 id="-이진-트리binary-tree--원래-트리구조를-검색-목적으로-변경한-형태">-이진 트리(binary Tree) : 원래 트리구조를 검색 목적으로 변경한 형태</h2>
<pre><code>자식 노드가 최대 2개로 구성된 트리
이진 탐색 트리: 왼쪽자식은 부모보다 작고, 오른쪽 자식은 부모보다 큼
O(logn) : 전체 데이터를 순회할 필요가 없음
균형잡힌 이진 트리
++ 잘 짜여진 이진 탐색 트리를 통해서 우리는 검색에 대한 성능을 보다 크게 가져갈수 있음 
![](https://velog.velcdn.com/images/chan_e22/post/94744f58-3971-49ff-ae32-44f10759022a/image.png)</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[논문 1 [순환 신경망을 사용하여 연속적인 데이터를 생성하는 방법]-Generating sequences with recurrent neural networks (2013) - A. Graves]]></title>
            <link>https://velog.io/@chan_e22/%EB%85%BC%EB%AC%B8-1-%EC%88%9C%ED%99%98-%EC%8B%A0%EA%B2%BD%EB%A7%9D%EC%9D%84-%EC%82%AC%EC%9A%A9%ED%95%98%EC%97%AC-%EC%97%B0%EC%86%8D%EC%A0%81%EC%9D%B8-%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%A5%BC-%EC%83%9D%EC%84%B1%ED%95%98%EB%8A%94-%EB%B0%A9%EB%B2%95-Generating-sequences-with-recurrent-neural-networks-2013-A.-Graves</link>
            <guid>https://velog.io/@chan_e22/%EB%85%BC%EB%AC%B8-1-%EC%88%9C%ED%99%98-%EC%8B%A0%EA%B2%BD%EB%A7%9D%EC%9D%84-%EC%82%AC%EC%9A%A9%ED%95%98%EC%97%AC-%EC%97%B0%EC%86%8D%EC%A0%81%EC%9D%B8-%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%A5%BC-%EC%83%9D%EC%84%B1%ED%95%98%EB%8A%94-%EB%B0%A9%EB%B2%95-Generating-sequences-with-recurrent-neural-networks-2013-A.-Graves</guid>
            <pubDate>Thu, 06 Feb 2025 04:30:08 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/chan_e22/post/1b5550c4-7c1d-4b47-adb4-2d7aca4f1927/image.png" alt=""></p>
<blockquote>
<p>초록
이 논문은 단순히 단일측정값 을 한번에 예측함으로써, 장거리 구조를 가진 복잡한 연산을 생성하는데 장단기 순환신경망을 사용할수 있다는 것을 보여준다.
온라인 필기(실수값에 대한)과 텍스트(이산적인)것에 대하여 증명하는 접근방식이다.
문자열 데이터 시퀀스를 기반으로 네트워크 예측을 조정하는 것을 허락함으로써 수기합성은 확장되었다.
이결과 시스템은 생성할수 있다 놓고 실제적인 흘림체의 수기와 다양한 스타일을 </p>
</blockquote>
<p>챗지피티 해석
이 논문에서는 <strong>장단기 메모리(Long Short-Term Memory, LSTM) 순환 신경망(RNN)</strong>이 어떻게 복잡한 시퀀스를 생성할 수 있는지를 보여줍니다. 이는 단순히 하나의 데이터 포인트를 예측하는 방식으로 이루어집니다.</p>
<p>이 접근법은 두 가지 데이터 유형에 대해 실험되었습니다.</p>
<p>텍스트 생성 - 이 경우 데이터는 <strong>이산적(discrete)</strong>인 값입니다.
온라인 손글씨 생성 - 이 경우 데이터는 연속적인(real-valued) 값입니다.
또한 이 방법을 <strong>손글씨 합성(handwriting synthesis)</strong>으로 확장하여, 네트워크가 주어진 텍스트 시퀀스를 기반으로 예측할 수 있도록 하였습니다.</p>
<p>그 결과, 이 시스템은 <strong>다양한 스타일의 매우 현실적인 필기체(cursive handwriting)</strong>를 생성할 수 있음을 보여줍니다.
LSTM을 이용하여 텍스트 및 손글씨 데이터를 학습하고, 이를 활용하여 자연스러운 필기체를 생성하는 방법을 연구한 논문입니다</p>
<ol>
<li>논문 제목과 초록 도표를 먼저 봐라 </li>
<li>도입, 결론, 도표 를 읽고 필요 없는 부분 생략</li>
<li>수식은 과감히 생략!</li>
<li>이해가 안되는 부분은 빼고 전체적으로 읽어라 &gt;&gt; 논문에서 이해가 안되는 부분(잘 안쓰이는)은 처음에 생략 해도 좋음 </li>
</ol>
<blockquote>
<p>질문</p>
</blockquote>
<ol>
<li>저자가 뭘 해내고 싶어했는가?</li>
<li>이 연구의 접근에서 중요한 요소는 무엇인가?</li>
<li>저자는 스스로 이 논문을 이용할 수 있는가?</li>
<li>당신이 참고하고 싶은 다른 레퍼런스에는 어떤 것이 있는가?</li>
</ol>
<p><img src="https://velog.velcdn.com/images/chan_e22/post/220a62a2-ce42-42aa-b1ce-54314ad1e9b6/image.png" alt=""></p>
<hr>
<p><a href="https://www.ibm.com/kr-ko/topics/recurrent-neural-networks">https://www.ibm.com/kr-ko/topics/recurrent-neural-networks</a></p>
<p>Q. 순환 신경망이란?
RNN? -&gt; 순차적 데이터 또는 시계열 데이터로 훈련된 심층 신경망으로, 순차적 입력을 기반으로 순차적 예측 또는 결론을 내릴수 있는 머신 러닝 모델
활용? 과거의 일일 홍수, 기상데이터를 기반으로 홍수수준 예측// 자연어 처리, 음성인식, 이미지캡션과 같은 순서적 또는 시간적 문제해결</p>
<p>CNN(전통적인 신경망)-&gt; 입력데이터가 서로 독립적이라고 가정하고 각각 처리
RNN(순환 신경망)-&gt; 입력 데이터가 연속적이고 상호 의존적임을 가정하며, 이전 입력 데이터를 기억하고 현재 예측에 반영 
Q. 작동방식?</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[논문 읽기]]></title>
            <link>https://velog.io/@chan_e22/%EB%85%BC%EB%AC%B8-%EC%9D%BD%EA%B8%B0</link>
            <guid>https://velog.io/@chan_e22/%EB%85%BC%EB%AC%B8-%EC%9D%BD%EA%B8%B0</guid>
            <pubDate>Thu, 06 Feb 2025 02:09:26 GMT</pubDate>
            <description><![CDATA[<p><a href="https://media-ai.tistory.com/7">https://media-ai.tistory.com/7</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[파이썬 자료구조] List]]></title>
            <link>https://velog.io/@chan_e22/%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EC%9E%90%EB%A3%8C%EA%B5%AC%EC%A1%B0-List</link>
            <guid>https://velog.io/@chan_e22/%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EC%9E%90%EB%A3%8C%EA%B5%AC%EC%A1%B0-List</guid>
            <pubDate>Wed, 05 Feb 2025 05:22:48 GMT</pubDate>
            <description><![CDATA[<h2>자료구조란?</h2>

<p>자료구조는 데이터를 저장하고 관리하며 처리하는 방법을 체계적으로 설꼐한 것,
자료구조를 잘 이해하면 데이터를 효율적으로 처리하고, 알고리즘의 성능을 최적화 할수 있음.</p>
<p>파이썬의 자료구조에서는</p>
<p>내장 자료구조/ 사용자 정의 자료구조가 있음. </p>
<p><img src="https://velog.velcdn.com/images/chan_e22/post/5467f3d4-1c04-4a5b-bf45-efbf36dbbbfc/image.png" alt=""></p>
<h3>내장 데이터 구조</h3>
<h5>에서 리스트를 알아보려고 한다.</h5>

<p><br>리스트는 다양한 데이터 타임을 한 리스트에 저장할 수 있음. <br>
크기는 동적으로 조정가능
<br>인텍싱<br>
<br>슬라이싱<br></p>
<blockquote>
<p>리스트 관련 함수
-append (리스트 맨마지막에 요소 추가)
-sort(오름차순 순서대로 정렬)// 어떤 순서?
-reverse(현재리스트를 그대로 거꾸로 뒤집음)
-index(리스트 인액스값(위치 값을 리턴함) 
ex) <code>a= [1,2,3]
a.index(1)
0</code>
-insert(a.b) //리스트의 a번째 위치에 b를 삽입하는 함수이다. 
-remove (리스트에서 첫 번째로 나오는 요소를 삭제하는 함수) &gt;&gt; 리스트에 같은 요소의 값이 여러개가 있으면 첫번째 요소만 제거
-pop() (리스트의 맨 마지막 요소를 리턴하고 그 요소를 삭제)
-pop(x) (리스트의 x번째(자리값) 요소를 리턴하고 그 요소는 삭제)
-count(x) (리스트안에 x가 몇개 있는지 조사하여 그 개수를 리턴하는 함수)
-extend(x) (x에는 리스트만 올수 있음 원래 의 a리스트에 x리스트를 더하게 됨)    </p>
</blockquote>
<p>리스트 변수 이름뒤에 &quot;.&quot;을 붙여 여러가지 리스트 관련 함수를 사용가능 </p>
]]></description>
        </item>
        <item>
            <title><![CDATA[딥러닝& 인공지능 - 선수지식1(통계)]]></title>
            <link>https://velog.io/@chan_e22/%EB%94%A5%EB%9F%AC%EB%8B%9D-%EC%9D%B8%EA%B3%B5%EC%A7%80%EB%8A%A5-%EC%84%A0%EC%88%98%EC%A7%80%EC%8B%9D1%ED%86%B5%EA%B3%84</link>
            <guid>https://velog.io/@chan_e22/%EB%94%A5%EB%9F%AC%EB%8B%9D-%EC%9D%B8%EA%B3%B5%EC%A7%80%EB%8A%A5-%EC%84%A0%EC%88%98%EC%A7%80%EC%8B%9D1%ED%86%B5%EA%B3%84</guid>
            <pubDate>Thu, 02 Jan 2025 11:26:18 GMT</pubDate>
            <description><![CDATA[<p>모델을 만들때 데이터의 특성을 파악해서 확률적으로 접근할 필요가 있다고 함. </p>
<p>기계학습 모델을 확률적으로 이해하기 
<img src="https://velog.velcdn.com/images/chan_e22/post/fa9593e2-5c85-4ddc-a757-633812608682/image.png" alt=""></p>
<p>경우의 수를 알아야 확률을 알 수 있음.</p>
<p>&lt;경우의 수를 계산 하는 방법&gt;</p>
<ul>
<li>순열
: 서로 다른 n에서 r개를 중복 없이 뽑아 특정한 순서로 나열하는 것을 의미한다.
: 모든 순열의 수(경우의 수)의 공식
1) 순열의 수 공식(n=r 일때)
<img src="https://velog.velcdn.com/images/chan_e22/post/e8597a24-fd9c-420a-be1e-cb398ea2be4c/image.png" alt="">
2) 순열의 수 공식( n=r이 아닐때)</li>
</ul>
<p><img src="https://velog.velcdn.com/images/chan_e22/post/54e77313-4362-42fd-b560-43ae207705da/image.png" alt=""></p>
<p>&lt;순열의 예시&gt;</p>
<p>기계 학습 모델 학습을 위해 n개의 학습 데이터로 학습을 진행 하려고 함
이때 매번(에포크) 모델에 학습 데이터를 넣을 순서를 섞어서 학습을 진행한다.
에포크 : 학습 데이터 세트에 포함된 모든 데이터가 한번씩 통과한 횟수를 말한다. </p>
<ul>
<li>조합</li>
</ul>
<h2 id="파이썬을-이용한-순열-계산">파이썬을 이용한 순열 계산</h2>
<p>from itertools import permutations</p>
<p>arr = [ &#39;a&#39;,&#39;b&#39;,&#39;c&#39;]</p>
<p>원소 중에서 2개를 뽑는 모든 순열 계산 
result = list(permutations(arr,2))
print(result)</p>
<p> itertools: 파이썬에서 반복 가능한 데이터구조(리스트, 튜플 등)에서 조합, 순열 등 다양한 반복 작업을 쉽게 수행할 수 있도록 도와주는 표준 라이브러리 이다.
 permutations: itertools 에서 제공하는 함수로, 주어진 리스트 등에서 순열(순서가 다른 경우의 수)을 생성한다. 
 permutations(arr, 2):
 arr에서 2개의 원소를 선택해 나올 수 있는 모든 순열을 생성합니다.
 순서가 다르면 다른 경우로 간주됩니다.</p>
<p> list(): permutations는 이터레이터(iterator) 형태로 결과를 반환하기 때문에, 이를 보기 쉽게 리스트로 변환합니다.
 result에는 모든 경우의 수가 튜플 형태로 저장됩니다.</p>
<p> 추가 설명 – 순열과 조합의 차이
 순열 (Permutation): 순서가 중요 → (&#39;a&#39;, &#39;b&#39;) ≠ (&#39;b&#39;, &#39;a&#39;)
 조합 (Combination): 순서가 중요하지 않음 → (&#39;a&#39;, &#39;b&#39;) = (&#39;b&#39;, &#39;a&#39;)</p>
<hr>
<p> 조합 예시
 샴 네트워크: 투이미지를 받아서 같은지 다른지 판단하는 방식으로 동작하는 네트워크 =&gt; 두개의 이미지의 순서는 바뀌어도 상관이 없다는 점  </p>
<h2 id="파이썬을-이용한-조합-계산">파이썬을 이용한 조합 계산</h2>
<p>from itertools import combinations</p>
<p>arr =[&#39;a&#39;,&#39;b&#39;,&#39;c&#39;]
원소 중에서 2개를 뽑는 모든 조합 계산
result = list(combinations(arr,2))
print(result)</p>
<p> 중복 순열 
서로 다른 n개에서 중복을 포함해 r개를 뽑아 특정한 순서로 나열하는 것을 의미한다.</p>
<h2 id="파이썬을-이용한-중복-순열-계산">파이썬을 이용한 중복 순열 계산</h2>
<p>from itertools import product</p>
<p>arr2 =[&#39;a&#39;,&#39;b&#39;,&#39;c&#39;]
 원소 중에서 2개를 뽑는 모든 중복 순열 계산
result2 = list(product(arr2,repeat=2))
print(result2)</p>
<p> product: 데카르트 곱(cartesian product)을 구하는 함수로, 중복을 허용한 순열을 생성합니다.
 product(arr2, repeat=2):
 arr2에서 2개의 원소를 뽑아 중복을 허용해 모든 가능한 조합을 생성합니다.
 중복을 허용하기 때문에, 같은 요소가 반복해 나올 수 있습니다.
 repeat=2는 두 번 선택하는 것을 의미합니다.</p>
<p> 중복 조합 : 서로 다른 n개에서 중복을 포함해 순서를 고려하지 않고 r개를 뽑는 것을 의미<br> 중복 조합 예시 
 딥러닝에서 학습된 모델의 결과를 활용하여 최종적인 결과를 생성하는 앙상블 방법이 존재 </p>
<p>from itertools import combinations_with_replacement</p>
<p>arr3 = [&#39;a&#39;,&#39;b&#39;,&#39;c&#39;]
원소 중에서 2개를 뽑는 모든 중복 조합 계산
result3 = list(combinations_with_replacement(arr3,2))
print(result3)</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[데이터분석 3 - 기초통계 계산]]></title>
            <link>https://velog.io/@chan_e22/%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%B6%84%EC%84%9D-3-%EA%B8%B0%EC%B4%88%ED%86%B5%EA%B3%84-%EA%B3%84%EC%82%B0</link>
            <guid>https://velog.io/@chan_e22/%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%B6%84%EC%84%9D-3-%EA%B8%B0%EC%B4%88%ED%86%B5%EA%B3%84-%EA%B3%84%EC%82%B0</guid>
            <pubDate>Thu, 02 Jan 2025 10:46:50 GMT</pubDate>
            <description><![CDATA[<p>통계를 하는 이유는?
많은 정보들 속에서 해당하는 정보를 정확하게 파악하기 위하여
&lt;기초 통계량 계산&gt;</p>
<ol>
<li>데이터 파악</li>
</ol>
<ul>
<li>관측수 = COUNT // 데이터가 몇개인지 확인 하는 카운트 함수</li>
<li>합 =  SUM</li>
</ul>
<p>2.데이터의 중심</p>
<ul>
<li>평균 = AVERAGE</li>
<li>최빈값 = MODE.sngl</li>
<li>중앙값 = MEDIAN</li>
<li>최대값 = MAX</li>
<li>최소값 = MIN</li>
<li>0~4분위 = QUARTILE.INC(범위)</li>
</ul>
<ol start="3">
<li>분산 정도</li>
</ol>
<ul>
<li>분산= var.s</li>
<li>표준 편차 = stdev.s</li>
</ul>
<p>이걸 가지고 데이터를 구하면 
데이터가 대충 어떻게 생겼는지 파악 할수 있다고 한다.</p>
<p>난 잘 모르겠음 ㅎㅎ</p>
<p><img src="https://velog.velcdn.com/images/chan_e22/post/903b9710-b993-46df-9f72-849f40a9f1a4/image.png" alt="">
<img src="https://velog.velcdn.com/images/chan_e22/post/c82adad6-23d9-49c8-9a6f-68ec14f4a2c9/image.png" alt=""></p>
<p>평균이 199, 중앙값이 220 이니 평균이랑 중앙값이 꽤 차이가 난다고 한다.</p>
<p>평균이 중앙 값보다 작으니까 왼쪽으로 긴 데이터가 된다고 한다. </p>
<p>최댓값이 370, 중앙, 평균이 220,199
표준편차가 94 분산이 8778이면 굉장히 큰 것 같다고 한다.</p>
<blockquote>
<blockquote>
<p>꽤나 음식 메뉴 별로 가격 편차가 큰 것을 알 수 있다.</p>
</blockquote>
</blockquote>
<p>이게 기본이어서 잘 외워두시라고 하신다...
센세.. 저는 조금 어려울지도..?</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[데이터 분석2- 엑셀]]></title>
            <link>https://velog.io/@chan_e22/%EB%8D%B0%EC%9D%B4%ED%84%B0-%EB%B6%84%EC%84%9D2-%EC%97%91%EC%85%80</link>
            <guid>https://velog.io/@chan_e22/%EB%8D%B0%EC%9D%B4%ED%84%B0-%EB%B6%84%EC%84%9D2-%EC%97%91%EC%85%80</guid>
            <pubDate>Thu, 02 Jan 2025 10:22:50 GMT</pubDate>
            <description><![CDATA[<p>수식: 사칙연산/논리연산
참조: 연산에 다른 셀을 이용하는 것</p>
<p>&lt;참조의 종류&gt;</p>
<ol>
<li>상대 참조(A1) : 상대 값에 따라 상대 참조를 따라감</li>
<li>절대 참조($A$1) :절대 바뀌지 않는다. A1 참조를 할때 에프4 누르면 달러표시가 나옴</li>
<li>혼합 참조(A$1) : 1만 고정으로 해 놓았음 </li>
</ol>
<p>엑셀 표 가지고 실습 하는데</p>
<p><img src="https://velog.velcdn.com/images/chan_e22/post/2860dbce-9e8b-49ec-891e-827b3eb1385c/image.png" alt=""></p>
<p>이익 = 총 합계 * 확률(몇퍼센트인지)
분기 판매비율 = 1월달(구분이 다름)/전체비율
전체비율을 열을 고정으로 하고 숫자는 다르게 하니까 F4 누르면 달러가 생김</p>
<p>한번 누르면 열과 숫자 다 고정
두번,세번은 열과 숫자 각각 다르게 고정이어서
나는 숫자는 다르게 하고 열의 총합계는 같은 걸로 하니까</p>
<p>분기 판매비율 =  1월달(구분)G8/$D8 </p>
<p>이 수식 붙여넣기 하면 다른 고정된 값만 고정되고 다른 건 알맞게 바뀜</p>
<p>완전 알잘딱깔센임</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[HOHO - <KIOSK> 240416 키오스크 메뉴화면 결제금액렌더링]]></title>
            <link>https://velog.io/@chan_e22/HOHO-KIOSK-240416-%ED%82%A4%EC%98%A4%EC%8A%A4%ED%81%AC-%EB%A9%94%EB%89%B4%ED%99%94%EB%A9%B4-%EA%B2%B0%EC%A0%9C%EA%B8%88%EC%95%A1%EB%A0%8C%EB%8D%94%EB%A7%81</link>
            <guid>https://velog.io/@chan_e22/HOHO-KIOSK-240416-%ED%82%A4%EC%98%A4%EC%8A%A4%ED%81%AC-%EB%A9%94%EB%89%B4%ED%99%94%EB%A9%B4-%EA%B2%B0%EC%A0%9C%EA%B8%88%EC%95%A1%EB%A0%8C%EB%8D%94%EB%A7%81</guid>
            <pubDate>Mon, 29 Jul 2024 05:57:39 GMT</pubDate>
            <description><![CDATA[<p>장바구니에있는 배열객체의 price를 다 더해야 되는 거잖아 </p>
<p>그러면 배열의 객체를 다 순회 해야 갰네</p>
<p>그리고 객체의 price만 가지고 오고 </p>
<pre><code class="language-html">&lt;div class=&quot;w-[1920px] flex justify-center&quot;&gt;
  &lt;div class=&quot;w-[1080px] h-[1920px]&quot;&gt;
    &lt;header class=&quot;flex h-[140px] justify-center items-center bg-slate-200&quot;&gt;
      &lt;a routerLink=&quot;/initialscreen&quot;&gt;
        &lt;img
          id=&quot;home_button&quot;
          class=&quot;w-[62px] h-[62px] ml-[38px] mr-[256px]&quot;
          src=&quot;https://w7.pngwing.com/pngs/839/365/png-transparent-computer-icons-hamburger-button-home-home-angle-triangle-black-and-white-thumbnail.png&quot;
          alt=&quot;home&quot;
      /&gt;&lt;/a&gt;

      &lt;img
        id=&quot;koisk_logo&quot;
        class=&quot;w-[400px] h-[140px] mr-[380px]&quot;
        src=&quot;00 &quot;
      /&gt;
    &lt;/header&gt;
    &lt;nav&gt;
      &lt;ul class=&quot;flex justify-center space-x-28&quot;&gt;
        @for (item of categories; track item.category_id) {
          &lt;li
            (click)=&quot;upLoad_categories1()&quot;
            class=&quot;font-bold text-4xl text-center block p-6 w-[300px] h-[105px] bg-white rounded-lg border border-gray-200 shadow-md hover:bg-blue-100&quot;
          &gt;
            &lt;a&gt;{{ categories[0].name }}&lt;/a&gt;
          &lt;/li&gt;
          &lt;li
            class=&quot;font-bold text-4xl text-center block p-6 w-[300px] h-[105px] bg-white rounded-lg border border-gray-200 shadow-md hover:bg-blue-100&quot;
          &gt;
            &lt;a&gt;{{ categories[1].name }}&lt;/a&gt;
          &lt;/li&gt;
        }
        &lt;!-- &lt;li
          class=&quot;font-bold text-4xl text-center block p-6 w-[300px] h-[105px] bg-white rounded-lg border border-gray-200 shadow-md hover:bg-blue-100&quot;
        &gt;
          &lt;a&gt;{{ categories[2].name }}&lt;/a&gt;
        &lt;/li&gt; --&gt;
      &lt;/ul&gt;
    &lt;/nav&gt;
    &lt;main class=&quot;h-[1048px]&quot;&gt;
      &lt;!-- //만약 입력창으로 추가 한다고 하면 //- 폼으로 배열 만들수 있는? 추가
        할수 있는
        &lt;input type=&quot;text&quot; placeholder=&quot;&quot; /&gt; --&gt;
      //옵션창 들어갈수 있게 해야되긴 하는데 우선 장바구니 담는것부터
      &lt;ul class=&quot;grid grid-cols-3 row-span-3 place-items-center my-[74px]&quot;&gt;
        @for (item of food; track item.id) {
          &lt;li
            class=&quot;w-[300px] h-[300px] flex-col text-center font-bold&quot;
            (click)=&quot;putOnMenu(item)&quot;
          &gt;
            &lt;img src=&quot;#&quot; hrf=&quot;#&quot; class=&quot;h-[220px] bg-blue-400&quot; /&gt;
            &lt;p class=&quot;h-[40px] text-3xl&quot;&gt;{{ item.name }}&lt;/p&gt;

            &lt;p class=&quot;h-[40px] text-red-500 text-2xl&quot;&gt;{{ item.price }}원&lt;/p&gt;
          &lt;/li&gt;
        }
      &lt;/ul&gt;
    &lt;/main&gt;

    &lt;footer class=&quot;h-[560px] bg-amber-200 flex items-center&quot;&gt;
      &lt;div
        id=&quot;shop_basket&quot;
        class=&quot;w-[680px] h-[480px] bg-amber-700 rounded-3xl flex flex-col py-4 px-8 mx-7 my-7&quot;
      &gt;
        &lt;div class=&quot;space-y-4&quot;&gt;
          &lt;img
            class=&quot;w-[74px] h-[74px]&quot;
            src=&quot;https://png.pngtree.com/png-clipart/20191120/original/pngtree-shopping-cart-icon-png-image_5060874.jpg&quot;
          /&gt;

          @for (selectItem of shop_basket; track $index) {
            &lt;li class=&quot;text-2xl font-bold list-none space-y-4&quot;&gt;
              {{ selectItem.name }} | {{ selectItem.price }} |
              &lt;button (click)=&quot;plus(selectItem)&quot;&gt;+&lt;/button&gt;
              {{ selectItem.quantity }}
              &lt;button (click)=&quot;minus(selectItem)&quot;&gt;-&lt;/button&gt;
            &lt;/li&gt;
          }
        &lt;/div&gt;
      &lt;/div&gt;

      &lt;div
        id=&quot;shop_payment&quot;
        class=&quot;font-bold text-4xl w-[320px] h-[480px] bg-amber-700 rounded-3xl flex flex-col justify-center text-center&quot;
      &gt;
        &lt;div class=&quot;flex&quot;&gt;
          &lt;p&gt;
            남은시간 &lt;br /&gt;
            초
          &lt;/p&gt;
          &lt;button
            (click)=&quot;totalRemove()&quot;
            class=&quot;w-[140px] h-[130px] bg-amber-400 rounded-3xl&quot;
          &gt;
            전체삭제
          &lt;/button&gt;
        &lt;/div&gt;
        &lt;p class=&quot;&quot;&gt;결제금액 {{ payTotal() }}&lt;/p&gt;
      &lt;/div&gt;
    &lt;/footer&gt;
  &lt;/div&gt;
&lt;/div&gt;
</code></pre>
<pre><code class="language-tsx">import { Component } from &#39;@angular/core&#39;;
import { InitialscreenComponent } from &#39;../0initialscreen/initialscreen.component&#39;;
import { RouterLink } from &#39;@angular/router&#39;;
import { FormsModule } from &#39;@angular/forms&#39;;
// import { Foods } from &#39;./2main_models/foods.model&#39;

type Mainmenu = {
  //주메뉴 데이터 
  name: string,
  category_id: number
}
type Cart = {
  id: number,
  name: string,
  description: string,
  price: number,
  discount_rate: boolean,
  is_available: boolean,
  image: string,
  quantity: number
}

type Foods = {
  id: number,
  name: string,
  description: string,
  price: number,
  discount_rate: boolean,
  is_available: boolean
  image: string
  quantity: number
}

@Component({
  selector: &#39;app-mainmenu&#39;,
  standalone: true,
  imports: [RouterLink, FormsModule],
  templateUrl: &#39;./mainmenu.component.html&#39;,

})
export class MainmenuComponent {

  categories: Mainmenu[] = [

    {
      name: &#39;요리&#39;,
      category_id: 1
    },
    {
      name: &#39;음료&#39;,
      category_id: 2
    }
  ];
  shop_basket: Cart[] = [];

  food: Foods[] = [{
    id: 0,
    name: &#39;국밥&#39;,
    description: &#39;국과밥&#39;,
    price: 8000,
    discount_rate: false,
    is_available: false,
    image: &#39;이미지&#39;,
    quantity: 1
  },
  {
    id: 1,
    name: &#39;젤리&#39;,
    description: &#39;국과밥&#39;,
    price: 8000,
    discount_rate: false,
    is_available: false,
    image: &#39;이미지&#39;,
    quantity: 1

  }, {
    id: 2,
    name: &#39;과자&#39;,
    description: &#39;국과밥&#39;,
    price: 8000,
    discount_rate: false,
    is_available: false,
    image: &#39;이미지&#39;,
    quantity: 1
  },
  {
    id: 3,
    name: &#39;떡볶이&#39;,
    description: &#39;국과밥&#39;,
    price: 4000,
    discount_rate: false,
    is_available: false,
    image: &#39;이미지&#39;,
    quantity: 1
  },
  {
    id: 4,
    name: &#39;마라탕&#39;,
    description: &#39;국과밥&#39;,
    price: 12000,
    discount_rate: false,
    is_available: false,
    image: &#39;이미지&#39;,
    quantity: 1
  }, {
    id: 5,
    name: &#39;피자&#39;,
    description: &#39;국과밥&#39;,
    price: 8000,
    discount_rate: false,
    is_available: false,
    image: &#39;이미지&#39;,
    quantity: 1
  },
  {
    id: 6,
    name: &#39;비빔밥&#39;,
    description: &#39;국과밥&#39;,
    price: 7500,
    discount_rate: false,
    is_available: false,
    image: &#39;이미지&#39;,
    quantity: 1
  },
  {
    id: 7,
    name: &#39;육회&#39;,
    description: &#39;국과밥&#39;,
    price: 10000,
    discount_rate: false,
    is_available: false,
    image: &#39;이미지&#39;,
    quantity: 1
  },
  {
    id: 8,
    name: &#39;족발&#39;,
    description: &#39;국과밥&#39;,
    price: 8000,
    discount_rate: false,
    is_available: false,
    image: &#39;이미지&#39;,
    quantity: 1
  }

  ]

  upLoad_categories1() {

    console.log(&#39;확인&#39;)
    //데이터중 찾아서 정해진 카테고리에 따라 음료 정보를 랜더한다. 
  }

  putOnMenu(food: Foods) {
    // 고객이 선택했을때 선택한 음식과 동일한 음식이 있는지 찾고
    //있다면 해당음식의 갯수를 업데이트
    //없다면 새로운 장바구니 배열에 추가 
    const selectedItem = this.shop_basket.find((item) =&gt; item.id === food.id)

    // 이미 리스트에 있는 아이템이면 숫자만 증가시키고 아니면 장바구니 배열에 넣는다 
    if (selectedItem) {

      selectedItem.quantity += 1;

      // console.log(`${selectedItem.quantity} `)
      // //백틱 사용함 중요!!
      // console.log(this.shop_basket.length)
    }
    else {
      this.shop_basket.push({
        ...food,
        quantity: 1
      });

      // console.log(this.shop_basket?.values)

    }

  }

  plus(food: Foods) {
    const selectedItem = this.shop_basket.find((item) =&gt; item.id === food.id)
    if (selectedItem) { // 같은거 선택하면 숫자 증가 배열추가 근데 리스트엔 추가 안되는 
      selectedItem.quantity += 1;
      console.log();

    }
  }
  minus(food: Foods) {
    const selectedItem = this.shop_basket.find((item) =&gt; item.id === food.id)
    if (selectedItem) { // 같은거 선택하면 숫자 증가 
      selectedItem.quantity -= 1;
      // 작아지는데 1까지만 작아질수 있도록 
      selectedItem.quantity = selectedItem.quantity &gt; 1 ? selectedItem.quantity - 1 : 1;
    }
  }

  // total: number = this.payTotal();

  // 총 합산 값
  payTotal(): number {
    const total = this.shop_basket.reduce((acc, item) =&gt; acc + (item.price * item.quantity), 0);

    console.log(&#39;payTotal:&#39;, total); return total;
  }

  totalRemove() {
    // 버튼 누르면 전부다 삭제 하기 
    this.shop_basket.length = 0;
  }

  // else {
  //   console.log(&#39;죄송합니다. 재고소진으로 이용하기 어렵습니다. &#39;)
  // }

  // console.log(&#39;${shop_basket.name}가 장바구니에 추가 되었습니다. &#39;)
  //

  // plus(shop_basket: Cart) {
  //   const selectedItem = this.food.find((item) =&gt; item.id === shop_basket.id)
  //   if (selectedItem) { // 같은거 선택하면 숫자 증가 
  //     selectedItem.quantity + 1;
  //   }
  // }

  // Cart[]= new Foods[]
  // 메뉴 선택할때 장바구니에 알맞은 메뉴가 생성되고
  //이름과 가격이 나옴 선택한 메뉴를 새로운 장바구니 배열을 새로 추가 생성할수는
  // 없나? 

}

--------------------
import { Injectable } from &#39;@angular/core&#39;;

@Injectable({
  providedIn: &#39;root&#39;
})
export class ProductService {
  private products: Product[] = [
    { id: 1, name: &#39;Product A&#39;, price: 100, imageUrl: &#39;path/to/image1.jpg&#39;, category: &#39;category1&#39; },
    { id: 2, name: &#39;Product B&#39;, price: 150, imageUrl: &#39;path/to/image2.jpg&#39;, category: &#39;category2&#39; },
    // more products...
  ];

  getProductsByCategory(category: string): Product[] {
    return this.products.filter(product =&gt; product.category === category);
  }
}
</code></pre>
<p><img src="https://velog.velcdn.com/images/chan_e22/post/5c047861-14c8-4698-8518-7f5f70ba1dd8/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[HOHO - <KIOSK> 240416 메뉴 화면>> 메뉴 사진 배열 및 장바구니 추가 기능 ]]></title>
            <link>https://velog.io/@chan_e22/HOHO-KIOSK-240416-%EB%A9%94%EB%89%B4-%ED%99%94%EB%A9%B4-%EB%A9%94%EB%89%B4-%EC%82%AC%EC%A7%84-%EB%B0%B0%EC%97%B4-%EB%B0%8F-%EC%9E%A5%EB%B0%94%EA%B5%AC%EB%8B%88-%EC%B6%94%EA%B0%80-%EA%B8%B0%EB%8A%A5</link>
            <guid>https://velog.io/@chan_e22/HOHO-KIOSK-240416-%EB%A9%94%EB%89%B4-%ED%99%94%EB%A9%B4-%EB%A9%94%EB%89%B4-%EC%82%AC%EC%A7%84-%EB%B0%B0%EC%97%B4-%EB%B0%8F-%EC%9E%A5%EB%B0%94%EA%B5%AC%EB%8B%88-%EC%B6%94%EA%B0%80-%EA%B8%B0%EB%8A%A5</guid>
            <pubDate>Mon, 29 Jul 2024 05:56:12 GMT</pubDate>
            <description><![CDATA[<p>이미지를 데이터 타입을 어떻게 지정해야 되나?</p>
<p>url 로 하면 됨</p>
<p><img src="https://velog.velcdn.com/images/chan_e22/post/66efbc10-f05e-4a87-92c8-c92fbb062101/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/chan_e22/post/d61050d7-b467-4467-bf88-dae08296eed1/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/chan_e22/post/3135f814-9323-4681-9083-a7a9a476acb1/image.png" alt=""></p>
<pre><code class="language-tsx">putOnMenu(food: Foods) {
    // 고객이 선택한 메뉴를 찾고
    const selectedItem = this.food.find((item) =&gt; item === food)
    this.food[1].is_available = true;
    this.food[5].is_available = true;

    if (selectedItem &amp;&amp; selectedItem.is_available) {

      this.shop_basket.push(selectedItem);
      console.log(`${selectedItem.name}를 추가합니다. `)
      //백틱 사용함 중요!!
      console.log(this.shop_basket.length - 1)
    }
    else {
      console.log(&#39;죄송합니다. 재고소진으로 이용하기 어렵습니다. &#39;)
    }
</code></pre>
<blockquote>
<blockquote>
<blockquote>
<p>메뉴를 클릭 하였을때 메뉴가 장바구니에 추가 되는 기능 </p>
</blockquote>
</blockquote>
</blockquote>
<p><img src="https://velog.velcdn.com/images/chan_e22/post/aecd67a2-116f-4b14-b206-395ecc90973d/image.png" alt=""></p>
<p>화면 구성은 grid </p>
<p>장바구니에 추가 하려면 food 배열에[ 있는 객체 하나를 선택 했으면 그 객체를 </p>
<p>장바구니 배열에 추가 시켜서 새로 배열을 생성하려고 함 </p>
<p>그래서 우선 선택한 객체와  food 배열객체를 찾고 </p>
<p>그 찾은 것을 장바구니 배열에 넣음 </p>
<p>이것을 화면에 나오게 하기 </p>
<p><img src="https://velog.velcdn.com/images/chan_e22/post/a80d650f-f1e8-4536-af12-17e3e7b04d9e/image.png" alt=""></p>
<p>마진이 왜 이렇게 넘어서는 거지?</p>
<p>푸터에서 플래스 줘서 아이템 센터 함</p>
<footer class="h-[560px] bg-amber-200 flex items-center">

<h1 id="고객이-메뉴선택을-똑같은-메뉴를-선택했을때-그-객체를-배열에-추가하는-거랑-그냥-옆에-있는-플러스-마이너스-버튼을-누를때-수량이-줄고-추가-되는-기능">&lt;고객이 메뉴선택을 똑같은 메뉴를 선택했을때 그 객체를 배열에 추가하는 거랑 그냥 옆에 있는 플러스 마이너스 버튼을 누를때 수량이 줄고 추가 되는 기능 &gt;</h1>
<p>&lt;수정전</p>
<pre><code class="language-html"> &lt;ul class=&quot;grid grid-cols-3 row-span-3 place-items-center my-[74px]&quot;&gt;
        @for (item of food; track item.id) {
          &lt;li
            class=&quot;w-[300px] h-[300px] flex-col text-center font-bold&quot;
            (click)=&quot;putOnMenu(item)&quot;
          &gt;
            &lt;img src=&quot;#&quot; hrf=&quot;#&quot; class=&quot;h-[220px] bg-blue-400&quot; /&gt;
            &lt;p class=&quot;h-[40px] text-3xl&quot;&gt;{{ item.name }}&lt;/p&gt;

            &lt;p class=&quot;h-[40px] text-red-500 text-2xl&quot;&gt;{{ item.price }}원&lt;/p&gt;
          &lt;/li&gt;
        }
      &lt;/ul&gt;
    &lt;/main&gt;

    &lt;footer class=&quot;h-[560px] bg-amber-200 flex items-center&quot;&gt;
      &lt;div
        id=&quot;shop_basket&quot;
        class=&quot;w-[680px] h-[480px] bg-amber-700 rounded-3xl flex flex-col py-4 px-8 mx-7 my-7&quot;
      &gt;
        &lt;div class=&quot;space-y-4&quot;&gt;
          &lt;img
            class=&quot;w-[74px] h-[74px]&quot;
            src=&quot;https://png.pngtree.com/png-clipart/20191120/original/pngtree-shopping-cart-icon-png-image_5060874.jpg&quot;
          /&gt;

          @for (select of shop_basket; track $index) {
            &lt;li class=&quot;text-2xl font-bold list-none space-y-4&quot;&gt;
              {{ select.name }} | {{ select.price }} | {{ select.quantity }}
              &lt;!-- &lt;button (click)=&quot;plus(select)&quot;&gt;+&lt;/button&gt;{{ select.quantity
              }}&lt;button (click)=&quot;minus(select)&quot;&gt;-&lt;/button&gt; --&gt;
            &lt;/li&gt;
          }
        &lt;/div&gt;</code></pre>
<pre><code class="language-tsx">putOnMenu(newFood: Foods) {
    // 고객이 선택한 메뉴를 찾고
    const selectedItem = this.food.find((item) =&gt; item.id === newFood.id)

    // 이미 리스트에 있는 아이템이면 숫자만 증가시키고 아니면 장바구니 배열에 넣는다 
    if (selectedItem) {

      selectedItem.quantity + 1 = newFood.quantity;
      // newFood.quantity = selectedItem.quantity + 1  ;
      this.shop_basket.push(newFood);
      console.log(`${newFood.quantity} `)
      //백틱 사용함 중요!!
      console.log(this.shop_basket.length)
    }
    // else {
    //   this.shop_basket.push(newFood);
    // }
</code></pre>
<p>&lt;수정후 </p>
<p><img src="https://velog.velcdn.com/images/chan_e22/post/d8820b04-348d-4918-84d6-64c7b54f76e7/image.png" alt=""></p>
<pre><code class="language-html">&lt;div class=&quot;w-[1920px] flex justify-center&quot;&gt;
  &lt;div class=&quot;w-[1080px] h-[1920px]&quot;&gt;
    &lt;header class=&quot;flex h-[140px] justify-center items-center bg-slate-200&quot;&gt;
      &lt;a routerLink=&quot;/initialscreen&quot;&gt;
        &lt;img
          id=&quot;home_button&quot;
          class=&quot;w-[62px] h-[62px] ml-[38px] mr-[256px]&quot;
          src=&quot;https://w7.pngwing.com/pngs/839/365/png-transparent-computer-icons-hamburger-button-home-home-angle-triangle-black-and-white-thumbnail.png&quot;
          alt=&quot;home&quot;
      /&gt;&lt;/a&gt;

      &lt;img
        id=&quot;koisk_logo&quot;
        class=&quot;w-[400px] h-[140px] mr-[380px]&quot;
        src=&quot;https://cdn.imweb.me/upload/S202207147cbe647790c85/64312be32a9ff.png&quot;
      /&gt;
    &lt;/header&gt;
    &lt;nav&gt;
      &lt;ul class=&quot;flex justify-center space-x-28&quot;&gt;
        @for (item of categories; track item.category_id) {
          &lt;li
            (click)=&quot;upLoad_categories1()&quot;
            class=&quot;font-bold text-4xl text-center block p-6 w-[300px] h-[105px] bg-white rounded-lg border border-gray-200 shadow-md hover:bg-blue-100&quot;
          &gt;
            &lt;a&gt;{{ categories[0].name }}&lt;/a&gt;
          &lt;/li&gt;
          &lt;li
            class=&quot;font-bold text-4xl text-center block p-6 w-[300px] h-[105px] bg-white rounded-lg border border-gray-200 shadow-md hover:bg-blue-100&quot;
          &gt;
            &lt;a&gt;{{ categories[1].name }}&lt;/a&gt;
          &lt;/li&gt;
        }
        &lt;!-- &lt;li
          class=&quot;font-bold text-4xl text-center block p-6 w-[300px] h-[105px] bg-white rounded-lg border border-gray-200 shadow-md hover:bg-blue-100&quot;
        &gt;
          &lt;a&gt;{{ categories[2].name }}&lt;/a&gt;
        &lt;/li&gt; --&gt;
      &lt;/ul&gt;
    &lt;/nav&gt;
    &lt;main class=&quot;h-[1048px]&quot;&gt;
      &lt;!-- //만약 입력창으로 추가 한다고 하면 //- 폼으로 배열 만들수 있는? 추가
        할수 있는
        &lt;input type=&quot;text&quot; placeholder=&quot;&quot; /&gt; --&gt;
      //옵션창 들어갈수 있게 해야되긴 하는데 우선 장바구니 담는것부터
      &lt;ul class=&quot;grid grid-cols-3 row-span-3 place-items-center my-[74px]&quot;&gt;
        @for (item of food; track item.id) {
          &lt;li
            class=&quot;w-[300px] h-[300px] flex-col text-center font-bold&quot;
            (click)=&quot;putOnMenu(item)&quot;
          &gt;
            &lt;img src=&quot;#&quot; hrf=&quot;#&quot; class=&quot;h-[220px] bg-blue-400&quot; /&gt;
            &lt;p class=&quot;h-[40px] text-3xl&quot;&gt;{{ item.name }}&lt;/p&gt;

            &lt;p class=&quot;h-[40px] text-red-500 text-2xl&quot;&gt;{{ item.price }}원&lt;/p&gt;
          &lt;/li&gt;
        }
      &lt;/ul&gt;
    &lt;/main&gt;

    &lt;footer class=&quot;h-[560px] bg-amber-200 flex items-center&quot;&gt;
      &lt;div
        id=&quot;shop_basket&quot;
        class=&quot;w-[680px] h-[480px] bg-amber-700 rounded-3xl flex flex-col py-4 px-8 mx-7 my-7&quot;
      &gt;
        &lt;div class=&quot;space-y-4&quot;&gt;
          &lt;img
            class=&quot;w-[74px] h-[74px]&quot;
            src=&quot;https://png.pngtree.com/png-clipart/20191120/original/pngtree-shopping-cart-icon-png-image_5060874.jpg&quot;
          /&gt;

          @for (select of shop_basket; track $index) {
            &lt;li class=&quot;text-2xl font-bold list-none space-y-4&quot;&gt;
              {{ select.name }} | {{ select.price }} | {{ select.quantity }}
              &lt;!-- &lt;button (click)=&quot;plus(select)&quot;&gt;+&lt;/button&gt;{{ select.quantity
              }}&lt;button (click)=&quot;minus(select)&quot;&gt;-&lt;/button&gt; --&gt;
            &lt;/li&gt;
          }
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/footer&gt;
  &lt;/div&gt;
&lt;/div&gt;
</code></pre>
<pre><code class="language-tsx">import { Component } from &#39;@angular/core&#39;;
import { InitialscreenComponent } from &#39;../0initialscreen/initialscreen.component&#39;;
import { RouterLink } from &#39;@angular/router&#39;;
import { FormsModule } from &#39;@angular/forms&#39;;
// import { Foods } from &#39;./2main_models/foods.model&#39;

type Mainmenu = {
  //주메뉴 데이터 
  name: string,
  category_id: number
}
type Cart = {
  id: number,
  name: string,
  description: string,
  price: number,
  discount_rate: boolean,
  is_available: boolean,
  image: string,
  quantity: number
}

type Foods = {
  id: number,
  name: string,
  description: string,
  price: number,
  discount_rate: boolean,
  is_available: boolean
  image: string
  quantity: 1
}

@Component({
  selector: &#39;app-mainmenu&#39;,
  standalone: true,
  imports: [RouterLink, FormsModule],
  templateUrl: &#39;./mainmenu.component.html&#39;,

})
export class MainmenuComponent {

  categories: Mainmenu[] = [

    {
      name: &#39;요리&#39;,
      category_id: 1
    },
    {
      name: &#39;음료&#39;,
      category_id: 2
    }
  ];
  shop_basket: Cart[] = [{
    id: 0,
    name: &#39;국밥&#39;,
    description: &#39;국과밥&#39;,
    price: 8000,
    discount_rate: false,
    is_available: false,
    image: &#39;이미지&#39;,
    quantity: 1
  }];

  food: Foods[] = [{
    id: 0,
    name: &#39;국밥&#39;,
    description: &#39;국과밥&#39;,
    price: 8000,
    discount_rate: false,
    is_available: false,
    image: &#39;이미지&#39;,
    quantity: 1
  },
  {
    id: 1,
    name: &#39;국밥&#39;,
    description: &#39;국과밥&#39;,
    price: 8000,
    discount_rate: false,
    is_available: false,
    image: &#39;이미지&#39;,
    quantity: 1

  }, {
    id: 2,
    name: &#39;국밥&#39;,
    description: &#39;국과밥&#39;,
    price: 8000,
    discount_rate: false,
    is_available: false,
    image: &#39;이미지&#39;,
    quantity: 1
  },
  {
    id: 3,
    name: &#39;떡볶이&#39;,
    description: &#39;국과밥&#39;,
    price: 4000,
    discount_rate: false,
    is_available: false,
    image: &#39;이미지&#39;,
    quantity: 1
  },
  {
    id: 4,
    name: &#39;마라탕&#39;,
    description: &#39;국과밥&#39;,
    price: 12000,
    discount_rate: false,
    is_available: false,
    image: &#39;이미지&#39;,
    quantity: 1
  }, {
    id: 5,
    name: &#39;국밥&#39;,
    description: &#39;국과밥&#39;,
    price: 8000,
    discount_rate: false,
    is_available: false,
    image: &#39;이미지&#39;,
    quantity: 1
  },
  {
    id: 6,
    name: &#39;비빔밥&#39;,
    description: &#39;국과밥&#39;,
    price: 7500,
    discount_rate: false,
    is_available: false,
    image: &#39;이미지&#39;,
    quantity: 1
  },
  {
    id: 7,
    name: &#39;육회&#39;,
    description: &#39;국과밥&#39;,
    price: 10000,
    discount_rate: false,
    is_available: false,
    image: &#39;이미지&#39;,
    quantity: 1
  },
  {
    id: 8,
    name: &#39;국밥&#39;,
    description: &#39;국과밥&#39;,
    price: 8000,
    discount_rate: false,
    is_available: false,
    image: &#39;이미지&#39;,
    quantity: 1
  }

  ]

  upLoad_categories1() {

    console.log(&#39;확인&#39;)
    //데이터중 찾아서 정해진 카테고리에 따라 음료 정보를 랜더한다. 
  }

  putOnMenu(newFood: Foods) {
    // 고객이 선택한 메뉴를 찾고
    const selectedItem = this.food.find((item) =&gt; item.id === newFood.id)

    // 이미 리스트에 있는 아이템이면 숫자만 증가시키고 아니면 장바구니 배열에 넣는다 
    if (selectedItem) {

      selectedItem.quantity += 1;

      this.shop_basket.push({
        ...newFood,
        quantity: 1
      });
      console.log(`${selectedItem.quantity} `)
      //백틱 사용함 중요!!
      console.log(this.shop_basket.length)
    }
    else {

      console.log(this.shop_basket?.values)

    }

    // else {
    //   console.log(&#39;죄송합니다. 재고소진으로 이용하기 어렵습니다. &#39;)
    // }

    // console.log(&#39;${shop_basket.name}가 장바구니에 추가 되었습니다. &#39;)
    //

  }
  // plus(shop_basket: Cart) {
  //   const selectedItem = this.food.find((item) =&gt; item.id === shop_basket.id)
  //   if (selectedItem) { // 같은거 선택하면 숫자 증가 
  //     selectedItem.quantity + 1;
  //   }
  // }
  // minus(shop_basket: Cart) {
  //   const selectedItem = this.food.find((item) =&gt; item.id === shop_basket.id)
  //   if (selectedItem) { // 같은거 선택하면 숫자 증가 
  //     selectedItem.quantity - 1;
  //   }

  // Cart[]= new Foods[]
  // 메뉴 선택할때 장바구니에 알맞은 메뉴가 생성되고
  //이름과 가격이 나옴 선택한 메뉴를 새로운 장바구니 배열을 새로 추가 생성할수는
  // 없나? 

}
</code></pre>
<p>수정후 장바구니 각 메뉴에 맞게 수량 증가하고 장바구니 배열에 넣게 해놓음</p>
<p>근데 화면상에서 반복되는건 숫자만 증가해야 되는데</p>
<p>리스트 그대로가 추가 되어서 됨</p>
<p>배열이 추가 되는데 같은건 그냥 숫자만 증가하게끔 해야 할것 같음</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[HOHO - <KIOSK> 240412- sign 홈 서비스 파일 api 통신 ]]></title>
            <link>https://velog.io/@chan_e22/HOHO-KIOSK-240412-sign-%ED%99%88-%EC%84%9C%EB%B9%84%EC%8A%A4-%ED%8C%8C%EC%9D%BC-api-%ED%86%B5%EC%8B%A0-ln2pxgmx</link>
            <guid>https://velog.io/@chan_e22/HOHO-KIOSK-240412-sign-%ED%99%88-%EC%84%9C%EB%B9%84%EC%8A%A4-%ED%8C%8C%EC%9D%BC-api-%ED%86%B5%EC%8B%A0-ln2pxgmx</guid>
            <pubDate>Mon, 29 Jul 2024 05:52:23 GMT</pubDate>
            <description><![CDATA[<p>Angular의 </p>
<pre><code class="language-jsx">this.signService.createProfile(this.formGroup.value).subscribe({
next: (response) =&gt; {
console.log(&#39;Profile created:&#39;, response);
},
error: (err) =&gt; {
console.error(&#39;Error creating profile:&#39;, err);</code></pre>
<p>이 코드 조각은 Angular에서 HTTP 통신을 구현하는 일반적인 방식을 보여줍니다. <strong><code>this.signService.createProfile(this.formGroup.value).subscribe()</code></strong> 구문은 <strong><code>SignService</code></strong>의 <strong><code>createProfile</code></strong> 메서드를 호출하여 폼 그룹의 값을 서버에 전송하고, 그 결과를 구독합니다. 이 메서드는 <strong><code>Observable</code></strong>을 반환하며, 이를 통해 비동기 방식으로 서버 응답을 처리할 수 있습니다. 구체적으로 코드의 각 부분이 의미하는 것은 다음과 같습니다:</p>
<ol>
<li><p><strong><code>this.signService.createProfile(this.formGroup.value)</code></strong>:</p>
<ul>
<li><strong><code>this.signService</code></strong>: <strong><code>SignService</code></strong> 인스턴스로, 컴포넌트에서 서비스를 주입받아 사용합니다.</li>
<li><strong><code>createProfile</code></strong>: 서비스 내의 메서드로, 인자로 <strong><code>this.formGroup.value</code></strong> (폼에 입력된 데이터)를 받아 서버에 사용자 프로필을 생성하는 POST 요청을 보냅니다.</li>
<li>이 메서드는 서버의 응답을 <strong><code>Observable</code></strong> 객체로 반환합니다. <strong><code>Observable</code></strong>은 RxJS 라이브러리의 일부로, 비동기 데이터 스트림을 처리할 수 있는 매커니즘을 제공합니다.</li>
</ul>
</li>
<li><p><strong><code>.subscribe({ next: (response) =&gt; ..., error: (err) =&gt; ... })</code></strong>:</p>
<ul>
<li><strong><code>.subscribe()</code></strong>: <strong><code>Observable</code></strong>에서 데이터를 받기 위해 사용하는 메서드입니다. 이 메서드는 서버로부터 응답이 도착하거나 에러가 발생했을 때 콜백 함수를 실행합니다.</li>
<li><strong><code>next: (response) =&gt; { console.log(&#39;Profile created:&#39;, response); }</code></strong>: 서버로부터 성공적인 응답을 받았을 때 실행됩니다. <strong><code>response</code></strong> 변수에는 서버로부터 반환된 데이터가 포함되어 있습니다. 여기서는 성공적으로 프로필이 생성되었다는 메시지와 함께 응답 내용을 콘솔에 로깅합니다.</li>
<li><strong><code>error: (err) =&gt; { console.error(&#39;Error creating profile:&#39;, err); }</code></strong>: 요청이 실패했을 때 실행됩니다. <strong><code>err</code></strong> 변수에는 오류에 대한 정보가 포함되어 있으며, 이를 콘솔에 로깅하여 오류 내용을 확인할 수 있습니다.</li>
</ul>
</li>
</ol>
<p>이 코드는 Angular에서 서비스를 사용하여 서버와의 통신을 관리하는 방법의 기본적인 예제를 보여주며, 폼 데이터를 서버로 보내고 그 결과를 비동기적으로 처리하는 일반적인 패턴을 따릅니다. 서버로부터의 응답이나 오류 처리를 통해 사용자 인터페이스에 적절한 피드백을 제공하거나 추가적인 로직을 수행할 수 있습니다.</p>
<pre><code class="language-tsx">
//app.config.ts 에 provideHttpclient() 넣으니까 연결 되었음 
import { ApplicationConfig } from &#39;@angular/core&#39;;
import { provideRouter } from &#39;@angular/router&#39;;

import { routes } from &#39;./app.routes&#39;;
import { provideClientHydration } from &#39;@angular/platform-browser&#39;;
import { provideHttpClient } from &#39;@angular/common/http&#39;;

export const appConfig: ApplicationConfig = {
  providers: [provideRouter(routes), provideClientHydration(), provideHttpClient()]
};
</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[HOHO - <KIOSK> 240412-회원가입 서비스 파일 작성]]></title>
            <link>https://velog.io/@chan_e22/HOHO-KIOSK-240412-%ED%9A%8C%EC%9B%90%EA%B0%80%EC%9E%85-%EC%84%9C%EB%B9%84%EC%8A%A4-%ED%8C%8C%EC%9D%BC-%EC%9E%91%EC%84%B1</link>
            <guid>https://velog.io/@chan_e22/HOHO-KIOSK-240412-%ED%9A%8C%EC%9B%90%EA%B0%80%EC%9E%85-%EC%84%9C%EB%B9%84%EC%8A%A4-%ED%8C%8C%EC%9D%BC-%EC%9E%91%EC%84%B1</guid>
            <pubDate>Mon, 29 Jul 2024 05:51:24 GMT</pubDate>
            <description><![CDATA[<h2 id="html">HTML</h2>
<pre><code class="language-html">//html
&lt;form [formGroup]=&quot;formGroup&quot; (ngSubmit)=&quot;onSubmit()&quot;&gt;
  &lt;input
    type=&quot;text&quot;
    placeholder=&quot;아이디를 입력해주세요&quot;
    formControlName=&quot;brandId&quot;
  /&gt;
  &lt;!-- &lt;button type=&quot;button&quot; (click)=&quot;back()&quot;&gt;&amp;larr;&lt;/button&gt; --&gt;
  &lt;input
    type=&quot;password&quot;
    formControlName=&quot;brandPw&quot;
    placeholder=&quot;비밀번호를 입력해주세요.&quot;
    class=&quot;py-6 mx-auto flex items-center placeholder: text-slate-400 space-y-2 w-[465px] h-[56px] rounded-2xl placeholder: pl-4&quot;
  /&gt;

  &lt;h6&gt;*비밀번호는 영어, 숫자, 특수문자를 포함한 6자리로 설정해주세요&lt;/h6&gt;
  @if((formGroup.dirty &amp;&amp; formGroup.touched)){
  @if(passwordCtrl?.errors?.[&#39;required&#39;]){
  &lt;h6 class=&quot;font-black&quot;&gt;비밀번호 입력해 주세요.&lt;/h6&gt;
  }@else if(passwordCtrl?.errors?.[&#39;minlength&#39;]){
  &lt;h6 class=&quot;font-black&quot;&gt;비밀번호 최소6자리 이상 입력해 주세요.&lt;/h6&gt;
  } }
  &lt;label&gt;&lt;input type=&quot;checkbox&quot; /&gt;비밀번호 보기 &lt;/label&gt;
  &lt;button
    class=&quot;ml-5 p-2 rounded-sm bg-lime-950 text-white text-center justify-items-center w-[400px]&quot;
  &gt;
    제출
  &lt;/button&gt;
&lt;/form&gt;
</code></pre>
<pre><code class="language-tsx">//ts
import { Component, Output, inject, EventEmitter, OnInit } from &#39;@angular/core&#39;;
import { FormControl, FormControlName, FormsModule } from &#39;@angular/forms&#39;;
import {
  FormBuilder,
  FormGroup,
  ReactiveFormsModule,
  Validators,
} from &#39;@angular/forms&#39;;
import { SignService } from &#39;../../signup.services/sign.service&#39;;
import { CommonModule } from &#39;@angular/common&#39;;

const PW_PATTERN = /^(?=.*[A-Za-z])(?=.*\d)(?=.*[@$!%*#?&amp;])[A-Za-z\d@$!%*#?&amp;]{4,12}$/;

interface userData {
  brandId: string;
  brandPw: string;
}
@Component({
  selector: &#39;app-home-singup&#39;,
  standalone: true,
  imports: [FormsModule, ReactiveFormsModule, CommonModule],
  templateUrl: &#39;./home-singup.page.html&#39;,

})
export class HomeSingupComponent implements OnInit {
  private readonly signService = inject(SignService);
  formGroup!: FormGroup;
  customer: userData[] = [];

  constructor(private readonly formBuilder: FormBuilder) { }
  ngOnInit(): void {
    this.formGroup = this.formBuilder.group({
      brandId: [&#39;&#39;, [Validators.required]],
      brandPw: [
        &#39;&#39;,
        [
          Validators.required,
          Validators.pattern(PW_PATTERN),
          Validators.minLength(4),
          Validators.maxLength(12),
        ],
      ],

    }
    );
  }
  get passwordCtrl() {
    return this.formGroup.get(&#39;brandPw&#39;);
  }

  onSubmit() {

    const { brandId, brandPw } = this.formGroup.value;
    this.customer.push({ brandId, brandPw });
    this.signService.createProfile({ brandId, brandPw });
    if (this.formGroup.invalid) {
      alert(&#39;폼을 다 채워주세요 &#39;)
      console.log(this.formGroup.get(&#39;brandPw&#39;)?.value);
      return;

    }
    else {
      const lastValue = this.customer[this.customer.length - 1];
      return console.log(lastValue.brandId, lastValue.brandPw);
    }

  }
</code></pre>
<h2 id="ts">TS</h2>
<pre><code class="language-tsx">//sign.service.ts
import { Injectable, Input } from &#39;@angular/core&#39;;
import { userData } from &#39;../pages/model/signup.model&#39;;
import { FormGroup } from &#39;@angular/forms&#39;;

@Injectable({
  providedIn: &#39;root&#39;
})
export class SignService {
  @Input() formGroup!: FormGroup;
  profiles: userData[] = [];
  id = 1
  //사용자등록&gt;&gt; 사용자 정보를 추가하는 메서드
  createProfile(profile: {
    brandId: string;
    brandPw: string;
  }) {
    const newProfile: userData = {
      id: this.id++,
      brandId: profile.brandId,
      brandPw: profile.brandPw
    };
    this.profiles.push(newProfile);

  }
</code></pre>
]]></description>
        </item>
    </channel>
</rss>