<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>chan_7.log</title>
        <link>https://velog.io/</link>
        <description>꾸준한 사람이 되길!</description>
        <lastBuildDate>Fri, 27 Jan 2023 14:15:03 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>chan_7.log</title>
            <url>https://velog.velcdn.com/images/chan_7/profile/2ae347ea-dbef-47f5-81ce-c25d9ccde3c5/social_profile.jpeg</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. chan_7.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/chan_7" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[Discord Bot 만들때 조심...]]></title>
            <link>https://velog.io/@chan_7/Discord-Bot-%EB%A7%8C%EB%93%A4%EB%95%8C-%EC%A1%B0%EC%8B%AC</link>
            <guid>https://velog.io/@chan_7/Discord-Bot-%EB%A7%8C%EB%93%A4%EB%95%8C-%EC%A1%B0%EC%8B%AC</guid>
            <pubDate>Fri, 27 Jan 2023 14:15:03 GMT</pubDate>
            <description><![CDATA[<p>코드를 다짜고 내일 짜야지 라는 생각에 급하게 깃허브에 그냥 올렸는데
<img src="https://velog.velcdn.com/images/chan_7/post/493569c1-364c-4fd6-9285-d8dd9f81f3c4/image.png" alt=""></p>
<p>이런 DM이 왔음
처음엔 뭐지 싶었는데 내가 깃허브에 올린 코드에서 Token값을 지우지 않았던 것이였음</p>
<p>앞으로 코드좀 조심해서 올려야겠다.</p>
<p>그래도 신선한 경험이였다 ㅋㅋ</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[JS 기초 공부]]></title>
            <link>https://velog.io/@chan_7/JS-%EA%B8%B0%EC%B4%88-%EA%B3%B5%EB%B6%80</link>
            <guid>https://velog.io/@chan_7/JS-%EA%B8%B0%EC%B4%88-%EA%B3%B5%EB%B6%80</guid>
            <pubDate>Sat, 14 Jan 2023 13:34:10 GMT</pubDate>
            <description><![CDATA[<h1 id="js-기초">JS 기초</h1>
<hr>
<p><strong>내가 새로 배웠다고 생각이 드는것만 적겠음.</strong> </p>
<hr>
<h1 id="변수">변수</h1>
<h2 id="var">var</h2>
<p><strong><code>var</code> : 중복선언 가능, 재할당 가능</strong> </p>
<pre><code class="language-jsx">var name = &#39;김병찬&#39;; 
var name = &#39;홍길동&#39;;

console.log(name);

// ---------- 실행결과

&#39;홍길동&#39;</code></pre>
<p>그냥 가장 기본적이고 C에서 char과 같은 기능? 이라고 생각한다.</p>
<hr>
<h2 id="let">let</h2>
<p><strong><code>let</code></strong>  : <strong>중복선언 불가</strong> → <strong>하지만 재할당은 가능함</strong> </p>
<pre><code class="language-jsx">let name = &#39;김병찬&#39;; 
let name = &#39;홍길동&#39;;

console.log(name);

// ---------- 실행결과

Uncaught SyntaxError: Identifier &#39;name&#39; has already been declared ( 에러가 남 )
**하지만 아래와 같은 방법으로 하면 코드 실행이 가능함**</code></pre>
<pre><code class="language-jsx">let name = &#39;김병찬&#39;;
name = &#39;홍길동&#39;;

console.log(name);

// ---------- 실행결과 

&#39;홍길동&#39; 

앞에 let을 적어주지 않으면 name이 바뀌면서 실행이 잘 된다.</code></pre>
<hr>
<h2 id="const">const</h2>
<p><strong><code>const</code> : 중복 선언 불가 ( 이 부분은 let과 같음 ) 하지만 재할당 불가</strong> </p>
<pre><code class="language-jsx">const name = &#39;김병찬&#39;; 
name = &#39;홍길동&#39;;

console.log(name);

// ---------- 실행결과

Uncaught TypeError: Assignment to constant variable. ( 에러가 남 )</code></pre>
<p><strong>const는 값 재할당이 불가능하여서</strong> 위 같은 에러를 보고 싶지 않다면 const가 아닌 let으로 바꿔야함 </p>
<hr>
<h1 id="연산자">연산자</h1>
<h2 id="typeof-연산자">typeof 연산자</h2>
<pre><code class="language-jsx">console.log(typeof 3);
console.log(typeof true);
console.log(typeof &quot;xx&quot;);
console.log(typeof null);
console.log(typeof undefined);

// ---------- 실행결과 

&quot;number&quot;
&quot;boolean&quot;
&quot;string&quot;
&quot;object&quot;
&quot;undefined&quot;</code></pre>
<hr>
<h2 id="alert-prompt-confirm">alert, prompt, confirm</h2>
<p>간단히 정리를 해보자면 </p>
<p><strong>alert 알려줌
prompt 입력 받음
confirm 확인 받음</strong></p>
<h2 id="alert">alert</h2>
<pre><code class="language-jsx">const name = &#39;김병찬&#39;;

alert(name);

// ------ 실행결과 

맨 위에서 김병찬 이라는 이름이 뜬다. </code></pre>
<h2 id="prompt"><strong>prompt</strong></h2>
<pre><code class="language-jsx">const name = prompt(&#39;이름을 입력하세요&#39;);
console.log(name);

// ----- 실행결과 

처음 맨 위에서 값을 입력받는 창이 뜨고 &#39;김병찬&#39; 이라고 입력을 하면 김병찬이라고 출력이 된다.</code></pre>
<h2 id="confirm">confirm</h2>
<pre><code class="language-jsx">const isAdult = confirm(&#39;당신은 어른입니까?&#39;);
console.log(isAdult);

// ----- 실행결과

맨 위에서 처음과는 prompt, alert와는 다르게 확인, 최소만 입력을 받는다.
만약 확인을 누르면 출력값은 true
반대로 취소를 누르면 출력값은 false 이다.</code></pre>
<hr>
<h2 id="형변환">형변환</h2>
<pre><code class="language-jsx">// 다른 언어들을 하다가 js를 보면 참 신기한 언어이다.

const result = &quot;90&quot; / 2;
console.log(result); 

// ----- 실행 결과 
45 

?? 이게 뭐지 싶지만 JS는 가능하다고 한다...;;
편하긴 한데 적응은 되지 않고 거부감이 든다. 엄청</code></pre>
<hr>
<h2 id="함수">함수</h2>
<p>함수는 2가지로 나뉜다.</p>
<p><strong>함수 표현식, 화살표 함수</strong></p>
<h2 id="함수-표현식">함수 표현식</h2>
<pre><code class="language-jsx">// 일단 기본적인 함수 코드를 적어보겠다.
// 기본적인 함수 선언 방식을 **함수 선언문** 이라고 함

sayhello();

function sayhello(){
    console.log(&#39;hello&#39;);
}

sayhello();</code></pre>
<pre><code class="language-jsx">// 함수 표현식 코드 
let hello = function(){
    console.log(&#39;hello&#39;);
}

hello();</code></pre>
<h3 id="둘의-차이점은-무엇일까">둘의 차이점은 무엇일까?</h3>
<p><strong>호출 방식임</strong> </p>
<p>첫 번째 방식은 <strong>함수가 어디에 있든지 간에 바로 실행이 된다</strong>. → js의 알고리즘 때문</p>
<p>두 번째 방식은 <strong>함수가 호출되는 코드가 함수보다 위에 있으면 에러가 난다.</strong></p>
<p>이정도 차이일 것 같다.</p>
<hr>
<h1 id="객체-object">객체 Object</h1>
<p>객체는 키와 값으로 작성된다. → 파이썬의 딕셔너리와 같은 느낌?</p>
<pre><code class="language-jsx">const human = {
    weight : 50, // &lt;- 꼭 쉼표 해주어야함 
    age : 20, // 아래쪽에는 해줄 필요는 없지만 해주는게 좋다고 한다.
}</code></pre>
<p><strong>위 객체에 접근하는 방법</strong>  </p>
<pre><code class="language-jsx">console.log(human.weight); // 50
console.log(human[&#39;age&#39;]); // 20</code></pre>
<p>위처럼 <strong>key 값으로도 접근이 가능</strong>하다.</p>
<p><strong>추가하는 방법</strong></p>
<pre><code class="language-jsx">human.height = 173; // &lt;- 그냥 객체.추가하고_싶은_키_이름 = 값 해주면 된다.
console.log(human.height); // 173 </code></pre>
<p><strong>삭제하는 방법</strong></p>
<pre><code class="language-jsx">delete human.height;
console.log(human.height); // undefined</code></pre>
<p><strong>단축 프로퍼티</strong> </p>
<pre><code class="language-jsx">const human = {
    weight, // weight : weight
    age, // age : age
}</code></pre>
<p><strong>프로퍼티 존재 여부 확인</strong></p>
<pre><code class="language-jsx">console.log(human.height); // undefined

&#39;height&#39; in human; // false
&#39;age&#39; in human; // ture</code></pre>
<p><strong>객체 만드는 법</strong></p>
<pre><code class="language-jsx">function MakeObject(name, age) {
    return {
        name,
        age,    
    {
}

const chan = MakeObject(&quot;chan&quot;, 18);
console.log(chan);

// ----- 실행겱

// [object Object]
{
    &quot;name&quot; : &quot;chan&quot;,
    &quot;age&quot; : 18
}</code></pre>
<hr>
<p><strong>객체 method, this</strong></p>
<p><strong>method : 객체 프로퍼티로 할당 된 함수</strong></p>
<pre><code class="language-jsx">const human = {
    hello : function(){ // &lt;- 함수 ( 메소드 )
        console.log(&#39;안녕하세요&#39;);  
    }
}

const human = {
    hello(){ // 위와 같은 코드
        console.log(&#39;안녕하세요&#39;);  
    }
}</code></pre>
<p><strong>this : 조금 복잡하다고 함 ..? → 따로 공부 해야할듯</strong> </p>
<pre><code class="language-jsx">const user = {
  name : &#39;chan&#39;,
  hello(){
    console.log(`hello ${this.name}`);
  }
}

let human = user; // &lt;- 변수에 user을 넣어서 

human.hello(); // &lt;- 메소드 형태로 호출</code></pre>
<hr>
<h1 id="배열">배열</h1>
<p><strong>push</strong></p>
<pre><code class="language-jsx">let days = [&#39;월&#39;, &#39;화&#39;];

days.push(&#39;수&#39;); // 파이썬의 append()와 비슷한 느낌이다.

console.log(days); // [&quot;월&quot;,&quot;화&quot;,&quot;수&quot;]</code></pre>
<p><strong>pop</strong></p>
<pre><code class="language-jsx">let days = [&#39;월&#39;, &#39;화&#39;];

days.pop(); 

console.log(days); // [&#39;월&#39;]</code></pre>
<p><strong>unshift, shift</strong></p>
<pre><code class="language-jsx">// 추가 
days.unshift(&#39;금&#39;);
console.log(days) // [&#39;금&#39;, &#39;월&#39;, &#39;화&#39;]

days.shift();
console.log(days) // [&#39;월&#39;, &#39;화&#39;]</code></pre>
<p><strong>length</strong></p>
<pre><code class="language-jsx">let days = [&#39;월&#39;, &#39;화&#39;];

console.log(days.length); // 2</code></pre>
<p><strong>for</strong></p>
<pre><code class="language-jsx">let days = [&#39;월&#39;, &#39;화&#39;];

for(day of days){
    console.log(day);
}

// ---- 실행결과

&quot;월&quot;
&quot;화&quot;</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[파이썬 기초 관련]]></title>
            <link>https://velog.io/@chan_7/%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EA%B8%B0%EC%B4%88-%EA%B4%80%EB%A0%A8</link>
            <guid>https://velog.io/@chan_7/%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EA%B8%B0%EC%B4%88-%EA%B4%80%EB%A0%A8</guid>
            <pubDate>Mon, 09 Jan 2023 16:49:04 GMT</pubDate>
            <description><![CDATA[<h1 id="with-open-args-kwargs-global">with open(), <em>args, *</em>kwargs, global</h1>
<pre><code class="language-python">import os

folder_name = &quot;saved&quot;
if not os.path.exists(folder_name):
  os.makedirs(folder_name)</code></pre>
<p>folder_name = “saved” ← 폴더 이름</p>
<p>if not os.path.exists(folder_name): ← 경로에 폴더 이름과 관련된 폴더가 없다면 
  os.makedirs(folder_name) ← 폴더를 만들어라 </p>
<hr>
<h1 id="with-open"><strong>with open()</strong></h1>
<p>with open() 을 사용하면 <strong>fopen(), fclose() 를 사용하지 않아도 된다.</strong></p>
<pre><code class="language-python">with open(&quot;saved/hello.txt&quot;, &quot;w&quot;) as f:
  f.write(&quot;hello world!&quot;) # 새로 만든 hello.txt 파일에 hello world! 라는 문구를 적어줌</code></pre>
<p><strong><code>“w”</code> 를 사용하지 않고 그냥 적으면 에러가 난다.</strong> </p>
<p><strong>→ hello.txt 라는 파일이 없기 때문</strong></p>
<p>하지만 <code>**“w”**</code>를 사용한다면 <strong>파일이 없더라도 생성을 하고</strong> </p>
<p>f.write 파일에 “hello world!” 라는 <strong>문구를 작성</strong>한다.</p>
<pre><code class="language-python">with open(&quot;saved/hello.txt&quot;, &quot;r&quot;) as f:
  s = f.read()
print(s)</code></pre>
<p><code>**“r”</code> 을 하면 읽기** </p>
<p><strong>→</strong> s 변수에 f.read() hello.txt 위에서 만들었던 <strong>파일 정보를 가져옴</strong></p>
<hr>
<h1 id="args-kwargs"><strong><em>args, *</em>kwargs</strong></h1>
<pre><code class="language-python">d = {&quot;name&quot; : &quot;병찬&quot;, &quot;age&quot; : 100}
print(*d)
print({**d})</code></pre>
<p>d 라는 딕셔너리를 만들고 아래 프린트를 해준다.</p>
<p><strong>print(*d) → key 값을 출력</strong> </p>
<p><strong>print({</strong>d}) → 전체 딕셔너리를 출력** </p>
<hr>
<h1 id="global">global</h1>
<pre><code class="language-python">def f():
  global x # 안에서 글로벌 변수를 만들 수 있다.
  x = 20
  print(x)

f()
print(x)</code></pre>
<p>함수 안에서 global 을 사용하면 <strong>전역 변수로 사용이 가능함</strong></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[리눅스 - 파일과 디렉토리 관련 기초 명령어]]></title>
            <link>https://velog.io/@chan_7/%EB%A6%AC%EB%88%85%EC%8A%A4-%ED%8C%8C%EC%9D%BC%EA%B3%BC-%EB%94%94%EB%A0%89%ED%86%A0%EB%A6%AC-%EA%B4%80%EB%A0%A8-%EA%B8%B0%EC%B4%88-%EB%AA%85%EB%A0%B9%EC%96%B4</link>
            <guid>https://velog.io/@chan_7/%EB%A6%AC%EB%88%85%EC%8A%A4-%ED%8C%8C%EC%9D%BC%EA%B3%BC-%EB%94%94%EB%A0%89%ED%86%A0%EB%A6%AC-%EA%B4%80%EB%A0%A8-%EA%B8%B0%EC%B4%88-%EB%AA%85%EB%A0%B9%EC%96%B4</guid>
            <pubDate>Sat, 07 Jan 2023 11:57:16 GMT</pubDate>
            <description><![CDATA[<h1 id="linux---file--directory">Linux - file &amp; directory</h1>
<hr>
<aside>
ls -al    현재 디렉토리의 파일 목록을 출력하는 명령어

</aside>

<aside>
ls -l      pwd에 표시되는 디렉토리 아래에 있는 파일 목록을 더 자세하게 출력

</aside>

<aside>
ls         pwd에 표시되는 디렉토리 아래에 있는 파일 목록 출력

</aside>

<aside>
pwd     현재 위치하고 있는 디렉토리를 출력

</aside>

<p>ls 뒤에 - 를 붙이는 것을 <strong><code>파라미터</code></strong>라고 함</p>
<p>drwxr-xr-x 에서 앞에 <strong>d 는 디렉토리라는 뜻 →</strong> 만약 d가 아니면 파일임!</p>
<aside>
mkdir   새로 생성할 디렉토리명

</aside>

<aside>
touch   새로 생성할 파일명

</aside>

<hr>
<aside>
cd        이동할 디렉토리의 이름 ( 다 입력하기 귀찮으면 조금만 적고  tab 키를 누르면 됨 )

</aside>

<h3 id="부모-디렉토리로-이동하는-2가지-방법">부모 디렉토리로 이동하는 2가지 방법</h3>
<aside>
1. cd /home/디렉토리명      부모 디렉토리로 이동

</aside>

<aside>
2. cd ..      부모 디렉토리로 이동

</aside>

<h3 id="차이점">차이점</h3>
<p><strong>첫 번째 방법</strong>은 어디 있든 간에 home 아래있는 디렉토리를 가리키기 때문에 <code>**절대적임**</code></p>
<p>절대적으로 고정되어 있다는 뜻에서 <strong><code>절대경로</code></strong>라고 부름</p>
<p><strong>두 번째 방법</strong>은 현재 위치에 따라서 부모 디렉토리가 바뀜</p>
<p>자신의 위치에 따라서 상대적으로 경로가 달라짐 → <strong><code>상대경로</code></strong>라고 부름</p>
<hr>
<aside>
  clear      화면 정리

</aside>

<aside>
rm                파일을 지워줌

</aside>

<br>

<aside>
rm -r            디렉토리를 지워줌

</aside>


<aside>
  명령어명 --help     명령어 사용방법을 알려줌

</aside>
<aside>
rm --help     rm에 사용방법을 알려줌

</aside>

<p>앞에서 사용했던 명령어들에 대해서 사용법을 알 수 있음</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[활성화 함수 ]]></title>
            <link>https://velog.io/@chan_7/%ED%99%9C%EC%84%B1%ED%99%94-%ED%95%A8%EC%88%98</link>
            <guid>https://velog.io/@chan_7/%ED%99%9C%EC%84%B1%ED%99%94-%ED%95%A8%EC%88%98</guid>
            <pubDate>Mon, 21 Nov 2022 04:19:13 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/chan_7/post/2474f62a-d3cb-41c2-8401-65a79a41a234/image.png" alt=""></p>
<h2 id="활성화-함수">활성화 함수</h2>
<p>편향을 명시한 퍼셉트론에서 h(x)라는 함수를 썼었는데 이처럼 입력 신호의 
총합을 출력신호로 변환하는 함수를 일반적으로 
<strong>활성화</strong> 함수라고 한다.</p>
<br>

<p>활성화는 말 그대로 식이 2개로 나뉘는데, 가중치가 곱해진 입렭신호의 총합을 계산하고 그 합을 활성화 함수에 입력해 결과를 내는 2단계로 처리된다.</p>
<h3 id="활성화-함수-식">활성화 함수 식</h3>
<blockquote>
<p><img src="https://velog.velcdn.com/images/chan_7/post/be21db4f-abf9-46f9-b5cd-c79de78302f3/image.png" alt="">
a = b + w1x1 + w2x2 
y = h(a)
<br>출처 : <a href="https://url.kr/pwlcbx">https://url.kr/pwlcbx</a></p>
</blockquote>
<p>가중치가 달린 입력신호와 총합을 a라 할때, 활성화 함수의 처리과정</p>
<p>활성화 함수는 임계값을 경계로 출력이 바뀌는데, 이런 함수를 계단함수라 한다.</p>
<br>

<h2 id="계단함수">계단함수</h2>
<h3 id="시그모이드-함수">시그모이드 함수</h3>
<p>신경망에서 자주 이용하는 활성화 함수인 <strong>시그모이드 함수</strong>를 나타낸 식 </p>
<blockquote>
<p><img src="https://velog.velcdn.com/images/chan_7/post/49cd55f0-f8d1-419c-b08f-0bc2945c7760/image.png" alt=""></p>
</blockquote>
<p>e(-x)에서 e는 자연상수로 2.7182... 의 값을 가지는 실수이다. 
예를 들어 시그모이드 함수에 1.0과 2.0을 입력하면 
h(1.0) = 0.731..., h(2.0) = 0.880... 과 같은 특정 값을 출력한다.</p>
<h3 id="계단-함수-구현">계단 함수 구현</h3>
<pre><code class="language-python">import numpy as np
import matplotlib.pylab as plt


def step_function(x):
    return np.array(x &gt; 0, dtype=np.int)

X = np.arange(-5.0, 5.0, 0.1)
Y = step_function(X)
plt.plot(X, Y)
plt.ylim(-0.1, 1.1)  # y축의 범위 지정
plt.show()</code></pre>
<p><img src="https://velog.velcdn.com/images/chan_7/post/97d7b877-7a2e-48f5-8d14-96f0accb7d27/image.png" alt=""></p>
<br>

<h3 id="시그모이드-함수-구현">시그모이드 함수 구현</h3>
<pre><code class="language-python">import numpy as np
import matplotlib.pyplot as plt

def sigmoid(x):
    return 1 / (1 + np.exp(-x))

# x = np.array([-1.0, 1.0, 2.0])
# sigmoid(x)
# &gt;&gt; ([0.26894142, 0.73105858, 0.88079708])

x = np.arange(-5.0, 5.0, 0.1)
y = sigmoid(x)
plt.plot(x, y)
plt.ylim(-0.1, 1.1)
plt.show()</code></pre>
<p><img src="https://velog.velcdn.com/images/chan_7/post/4e95f232-8fe6-4388-b91e-2a84bb6f81e9/image.png" alt=""></p>
<br>

<h3 id="계단-함수와-시그모이드-함수-차이">계단 함수와 시그모이드 함수 차이</h3>
<p><img src="https://velog.velcdn.com/images/chan_7/post/01c1c249-95fa-4bb6-9433-66628f8ef70b/image.png" alt=""></p>
<p>위 그림을 보면 알겠지만 가장 큰 차이점은 매끄러움일 것이다. 
계단 함수는 0과 1 중 하나의 값만 돌려주는 반면 시그모이드 하수는 실수 (7.930, 6.001)를 돌려준다. </p>
<h3 id="계단-함수와-시그모이드-함수-공통점">계단 함수와 시그모이드 함수 공통점</h3>
<p>둘 다 입력이 작을 때의 출력은 0에 가깝고, 입력이 커지면 1에 가까워지는 구조이다. 
또한 계단 함수와 시그모이드 함수는 비선형 함수이다.</p>
<h2 id="relu-함수">ReLU 함수</h2>
<p>활성화 함수에는 ReLU라는 함수도 있다. 
최근들어 가장 많이 사용되는 함수라고 한다. </p>
<blockquote>
<p><img src="https://velog.velcdn.com/images/chan_7/post/0cd62490-6cad-4f1f-9a8c-3557e5bdc3da/image.png" alt="">
출처 : <a href="https://url.kr/naj32c">https://url.kr/naj32c</a></p>
</blockquote>
<p>ReLU 함수는 입력이 0을 넘으면 그 입력을 그대로 출력하고 0 이하이면 0을 출력하는 함수이다.</p>
<p>수식으로는 아래와 같이 쓸 수 있다.
<img src="https://velog.velcdn.com/images/chan_7/post/e62cd844-4342-4f89-a3ed-2e2f0f47f2ea/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[신경망 ]]></title>
            <link>https://velog.io/@chan_7/%EC%8B%A0%EA%B2%BD%EB%A7%9D</link>
            <guid>https://velog.io/@chan_7/%EC%8B%A0%EA%B2%BD%EB%A7%9D</guid>
            <pubDate>Mon, 21 Nov 2022 03:56:36 GMT</pubDate>
            <description><![CDATA[<p>퍼셉트론은 복잡한 함수도 표현할 수 있지만 가장 큰 단점으로는 사람이 일일이 수동으로 가중치를 설정 하는 작업이 필수라는 것이다.
하지만 신경망은 가중치를 자동으로 설정한다는 것이다.</p>
<h2 id="신경망">신경망</h2>
<blockquote>
<p><img src="https://velog.velcdn.com/images/chan_7/post/dff094f0-11b4-4cf5-a5fa-b803f502b7ef/image.png" alt="">
출처 : <a href="https://deep-learning-study.tistory.com/9">https://deep-learning-study.tistory.com/9</a></p>
</blockquote>
<p>가장 왼쪽 줄을 입력층, 중간 줄을 은닉층, 가장 오른쪽 줄을 출력층이라고 한다. </p>
<p>입력층이나 출력층과 달리 은닉층은 사람의 눈에 보이지 않는다.</p>
<br>

<h3 id="신경망과-퍼셉트론의-차이는">신경망과 퍼셉트론의 차이는?</h3>
<p>앞에서 올렸던 퍼셉트론과 신경망은 별 차이가 없어보인다. 
실제로 뉴런이 연결되는 방식은 앞의 퍼셉트론과 다를게 없다. </p>
<blockquote>
<p>그럼 신경망에서는 신호를 어떻게 전달할까?</p>
</blockquote>
<h2 id="퍼셉트론-복습">퍼셉트론 복습</h2>
<blockquote>
<p><img src="https://velog.velcdn.com/images/chan_7/post/04d5eb4d-5837-4bb2-be00-bc89006f49d7/image.png" alt="">
퍼셉트론을 식으로 나타내면 아래와 같이 나타난다.
<img src="https://velog.velcdn.com/images/chan_7/post/c105a7f6-6014-4a56-8709-e3f81738cbf5/image.png" alt="">
출처 : <a href="https://url.kr/rj63u9">https://url.kr/rj63u9</a></p>
</blockquote>
<p>여기서 b는 편향을 나타내는 매개변수로 뉴런이 얼마나 쉽게 활성화되느냐를 제어한다.
w1,w2는 각 신호의 가중치를 나타내는 매개변수로 각 신호의 영향력을 제어한다.
<br> </p>
<p>위처럼 퍼셉트론에 편향 (b) 를 명시하면 아래와 같이 나타낼 수 있다.</p>
<blockquote>
<p><img src="https://velog.velcdn.com/images/chan_7/post/fd9b804d-eba3-42a0-b4c6-7c8686fcf179/image.png" alt="">
출처 : <a href="https://url.kr/bhn5a7">https://url.kr/bhn5a7</a></p>
</blockquote>
<p>위 그림에서는 가중치가 b이고 입력이 1인 뉴런이 추가되었다. </p>
<p>위 그림을 간단하게 식으로 요약하면 아래와 같이 나타낸다.</p>
<p><img src="https://velog.velcdn.com/images/chan_7/post/4cb26a10-bc9d-4edf-8b44-df6c0ee5de42/image.png" alt=""></p>
<p>입력 신호의 총합이 h(x)라는 함수를 거쳐 변환되어, 그 변환된 값이 y의 출력값이 됨을 보여준다. 그리고 h(x) 함수는 입력이 0을 넘으면 1을 돌려주고 그렇지 않으면 0을 돌려준다. </p>
]]></description>
        </item>
        <item>
            <title><![CDATA[퍼셉트론의 한계]]></title>
            <link>https://velog.io/@chan_7/%ED%8D%BC%EC%85%89%ED%8A%B8%EB%A1%A0%EC%9D%98-%ED%95%9C%EA%B3%84</link>
            <guid>https://velog.io/@chan_7/%ED%8D%BC%EC%85%89%ED%8A%B8%EB%A1%A0%EC%9D%98-%ED%95%9C%EA%B3%84</guid>
            <pubDate>Sun, 20 Nov 2022 23:30:24 GMT</pubDate>
            <description><![CDATA[<h1 id="퍼셉트론의-한계">퍼셉트론의 한계</h1>
<blockquote>
<p>퍼셉트론의 한계로는 AND, OR, NAND와는 다르게 XOR을 표현할 수 없다. </p>
</blockquote>
<p><img src="https://velog.velcdn.com/images/chan_7/post/4879aacb-57f0-48f9-a780-d7d3554df518/image.png" alt=""></p>
<p>왜 안될까? </p>
<p>먼저 XOR게이트가 왜 안되는지 알아보기 전에 OR게이트를 시각적으로 보여주겠다.
<br></p>
<h2 id="or게이트-시각화">OR게이트 시각화</h2>
<p>OR게이트를 시각화 한다면 이와같이 나온다.</p>
<blockquote>
<p><img src="https://velog.velcdn.com/images/chan_7/post/110ca10e-4c02-4489-b746-9cdb5a3b459b/image.png" alt="">
출처 : <a href="https://url.kr/hrsi8j">https://url.kr/hrsi8j</a></p>
</blockquote>
<p>자 그럼 반대로 XOR게이트를 시각화해서 보여주겠다.</p>
<br>

<h2 id="xor게이트-시각화">XOR게이트 시각화</h2>
<p>XOR게이트를 시각화 한다면 아래와 같이 휘어진 선으로 나오게 된다.</p>
<blockquote>
<p><img src="https://velog.velcdn.com/images/chan_7/post/f885b8eb-dc9d-4743-8e7e-9f4d85c0975b/image.png" alt="">
출처 : <a href="https://kolikim.tistory.com/13">https://kolikim.tistory.com/13</a></p>
</blockquote>
<br>

<h2 id="xor을-퍼셉트론으로-표현할-수-없는-이유">XOR을 퍼셉트론으로 표현할 수 없는 이유</h2>
<blockquote>
<p>퍼셉트론은 직선 하나로 나눈 영역만 표현할 수 있다는 한계가 있다.
XOR과 같은 곡선의 영역을 <strong>비선형 영역</strong>, OR과 같은 영역을 <strong>선형 영역이</strong>이라고 한다.</p>
</blockquote>
<br>

<h3 id="비선형-영역과-선형-영역이-무엇일까">비선형 영역과 선형 영역이 무엇일까?</h3>
<p>쉽게 말해 비선형 영역은 직선 1개로 표현할 수 없는 영역을 말한다. 
반대로 선형 영역은 직선 1개로 표현할 수 있는 영역을 말한다.</p>
<h2 id="xor을-표현하는-방법">XOR을 표현하는 방법</h2>
<blockquote>
<p>다층 퍼셉트론을 활용하는 것</p>
</blockquote>
<p><em>다층 퍼셉트론이란 층이 여러개인 퍼셉트론.</em></p>
<br>

<p>XOR의 게이트를 보면 아래와 같다.</p>
<blockquote>
<p><img src="https://velog.velcdn.com/images/chan_7/post/0ffce18a-44d3-4e41-b47c-a91806e1e419/image.png" alt="">
출처 : <a href="https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&amp;blogId=cni1577&amp;logNo=221619153912">https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&amp;blogId=cni1577&amp;logNo=221619153912</a></p>
</blockquote>
<p>AND, OR, NAND를 사용하여 만든 것이다.</p>
<p>그럼 코드는 어떻게 될까?
<br></p>
<p>코드는 아래와 같으며 앞에서 사용했던 OR, AND, NAND 함수를 사용한다.</p>
<pre><code class="language-python">def XOR(x1, x2):
    s1 = NAND(x1, x2)
    s2 = OR(x1, x2)
    y = AND(s1, s2)
    return y </code></pre>
<h2 id="xor의-퍼셉트론">XOR의 퍼셉트론</h2>
<blockquote>
<p><img src="https://velog.velcdn.com/images/chan_7/post/276082d6-8e81-4ad9-91a2-fa6a415b9647/image.png" alt="">
출처 : <a href="https://url.kr/rq7xf1">https://url.kr/rq7xf1</a></p>
</blockquote>
<p>위의 XOR의 퍼셉트론은 AND, OR, NAND와는 다르게 층이 2층 퍼셉트론이다. 
이처럼 층이 여러개인 퍼셉트론을 다층 퍼셉트론이라고 한다. </p>
<br>
원리는 0층에서 1층으로 신호가 전달되고, 이어서 1층에서 2층으로 신호가 전달된다.


<h2 id="퍼셉트론-정리">퍼셉트론 정리</h2>
<ul>
<li>퍼셉트론은 입출력을 갖춘 알고리즘이다. 입력을 주면 정해진 규칙에 따른 값을 출력한다.</li>
<li>퍼셉트론에서는 &#39;가중치&#39;와 &#39;편향&#39;을 매개변수로 설정한다.</li>
<li>퍼셉트론으로 AND, OR, NAND 게이트 등의 논리 회로를 표현할 수 있다. </li>
<li>XOR 게이트는 단층 퍼셉트론으로는 표현이 불가능하며 다층 퍼셉트론으로 표현할 수 있다.</li>
<li>단층 퍼셉트론은 직선형 영역만 표시가 가능하고, 다층 퍼셉트론은 비선형 영역도 표현할 수 있다.</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[손 제스처 인식 ]]></title>
            <link>https://velog.io/@chan_7/%EC%86%90-%EC%A0%9C%EC%8A%A4%EC%B2%98-%EC%9D%B8%EC%8B%9D</link>
            <guid>https://velog.io/@chan_7/%EC%86%90-%EC%A0%9C%EC%8A%A4%EC%B2%98-%EC%9D%B8%EC%8B%9D</guid>
            <pubDate>Fri, 14 Oct 2022 04:43:42 GMT</pubDate>
            <description><![CDATA[<h2 id="심심하고-요즘-너무-지루해서-간단한-프로젝트를-해보기로-하였다">심심하고 요즘 너무 지루해서 간단한 프로젝트를 해보기로 하였다.</h2>
<h3 id="프로젝트-선정--그냥-간단하게-마우스-역할을-손으로-대신하는-프로그램을-만들기로-하였다-br">프로젝트 선정 : 그냥 간단하게 마우스 역할을 손으로 대신하는 프로그램을 만들기로 하였다. <br></h3>
<blockquote>
<h3 id="1-손을-인식하는-방법">1. 손을 인식하는 방법</h3>
<p><a href="https://google.github.io/mediapipe/solutions/hands.html">mediapipe 사이트</a>
위 사이트에서 코드를 받아서 활용을 하였습니다.  <br><br></p>
</blockquote>
<p><img src="https://mediapipe.dev/images/mobile/hand_landmarks.png" alt="인덱스 번호"></p>
<p><br><br><br></p>
<blockquote>
<h3 id="2-인덱스의-거리-구하는-방법">2. 인덱스의 거리 구하는 방법</h3>
<p><img src="https://mblogthumb-phinf.pstatic.net/MjAxODAzMjdfMTg2/MDAxNTIyMTE0NDE3Mzkx.FGE2-XvEZMJ4gRvYEoikCTVUYIiFrs58nPKoI8n41U8g.gC8WPbkNO9zoWFkCigXKJ6gIQGNsdetzU7SXwzOUNGAg.PNG.tipsware/20180327_103323_023.png?type=w800" alt="점과 점 사이의 거리 공식을 할용">
<br>점과 점 사이의 공식을 활용하였습니다.<br>왜인지는 모르겠지만 ((x1 - x2)^2 + (y1 - y2)^2)에 루트를 하지 않는게 더 코드가 복잡하지 않고 간편해서 공식을 제대로 활용하지는 않았습니다.</p>
</blockquote>
<p><br><br><br></p>
<blockquote>
<h3 id="3-클릭을-하지-않을-때">3. 클릭을 하지 않을 때</h3>
</blockquote>
<h3 id="손을-펴고-있으면-waiting-이라는-표시와-함께-사용자의-입력을-기다립니다">손을 펴고 있으면 Waiting 이라는 표시와 함께 사용자의 입력을 기다립니다.</h3>
<p><img src="https://velog.velcdn.com/images/chan_7/post/4f9d22b6-dcb8-4e81-a185-6417c9c8b389/image.png" alt=""></p>
<blockquote>
<h3 id="4-입력을-받을-때">4. 입력을 받을 때</h3>
</blockquote>
<h3 id="주먹을-쥔-상태로-있으면-click-라는-문구가-뜨며-기존-좌표-x의-값을-리스트-형태로-저장하고-다시-손을-폈을-때의-x값을-빼서-구한다">주먹을 쥔 상태로 있으면 Click 라는 문구가 뜨며 기존 좌표 x의 값을 리스트 형태로 저장하고, 다시 손을 폈을 때의 x값을 빼서 구한다.</h3>
<p><img src="https://velog.velcdn.com/images/chan_7/post/755d4bdf-de74-4eb4-9e50-148b25ac4174/image.png" alt=""></p>
<blockquote>
<h3 id="출력-값">출력 값</h3>
</blockquote>
<h3 id="오른쪽으로-움직였는지-아니면-왼쪽으로-움직였는지-알려준다">오른쪽으로 움직였는지 아니면 왼쪽으로 움직였는지 알려준다.</h3>
<p><a href="https://www.youtube.com/watch?v=B1fqY4H-08I">https://www.youtube.com/watch?v=B1fqY4H-08I</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[퍼셉트론이란?]]></title>
            <link>https://velog.io/@chan_7/%ED%8D%BC%EC%85%89%ED%8A%B8%EB%A1%A0%EC%9D%B4%EB%9E%80</link>
            <guid>https://velog.io/@chan_7/%ED%8D%BC%EC%85%89%ED%8A%B8%EB%A1%A0%EC%9D%B4%EB%9E%80</guid>
            <pubDate>Thu, 06 Oct 2022 06:18:50 GMT</pubDate>
            <description><![CDATA[<h3 id="퍼셉트론">퍼셉트론</h3>
<blockquote>
<p>다수의 신호를 입력으로 받아 하나의 신호를 출력한다.</p>
</blockquote>
<p>퍼셉트론은 두 가지의 값을 가지는데, 1과 0으로 가진다.</p>
<p>퍼셉트론은 입력 신호 x와 출력 신호 y, 가중치 W를 가진다. </p>
<p>W는 노드라고도 부르며 흔히 뉴런이라고 부른다.</p>
<p>입력 신호에 뉴런이 보내질 때는 각각의 고유한 가중치가 곱해진다. </p>
<p>뉴런에서 보내온 신호의 총 합이 정해진 한계를 넘어설 때만 1을 출력한다. </p>
<p>또한 한계를 임계값이라고 하며 (Θ 세타) 라고 표현한다.</p>
<p><img src="https://velog.velcdn.com/images/chan_7/post/76b68ba3-fff3-4503-b253-2100d2d0d4f6/image.png" alt=""></p>
<h2 id="활용">활용</h2>
<h3 id="and">AND</h3>
<p>퍼셉트론을 이용해서 AND 연산을 할 수 있다. 입력 신호 x1, x2의 값을 1과 0으로 
지정해준 다음 가중치 W1, W2( 가중치의 값은 임의로 정함 )를 곱하였을 때 임계값(한계) 을 넘어서면 1을 넘어서지 않으면 0을 출력하도록 한다. </p>
<p><img src="https://velog.velcdn.com/images/chan_7/post/9a50328b-e419-4562-b405-c55a43a6a7f1/image.png" alt=""></p>
<pre><code class="language-python">def AND(x1, x2):
    W1, W2, theta = 0.5, 0.5, 0.7 # 임의로 정한 값
    tmp = x1*W1 + x2*W2 # 가중치(W)와 입력 신호(X)를 곱해서 tmp에 저장해줌 

    if tmp &lt;= theta:
        print(0)
    else :
        print(1)

if __name__ == &#39;__main__&#39;:
    AND(0,0)
    AND(1,0)
    AND(0,1)
    AND(1,1)</code></pre>
<pre><code class="language-python">0
0
0
1</code></pre>
<p>과 같이 출력이 되게 된다. 
위의 원리는 0.5 + 0.5를 해야만 임계값(0.7)을 넘게된다.</p>
<h2 id="가중치와-편향-도입">가중치와 편향 도입</h2>
<h3 id="and-1">AND</h3>
<p>앞에서 구현한 AND함수는 정말 간단하다. 하지만 조금 있으면 나올 b(편향)을 위해서 다르게 numpy를 사용해서 벡터와 배열로 정의하여 보겠다.</p>
<p>식은 이러하다. Y = (x1W1 * x2W2) + b</p>
<p>코드는 조금 전보다 달라지긴 했지만 그래도 쉽다. </p>
<pre><code class="language-python">import numpy as np

def AND(x1, x2):
    x = np.array([x1, x2])
    W = np.array([0.5, 0.5])
    b = -0.7

    tmp = np.sum(x*W) + b

    if tmp &lt;= 0:
        print(0)
    else:
        print(1)

if __name__ == &#39;__main__&#39;:
    AND(0,0)
    AND(1,0)
    AND(0,1)
    AND(1,1)</code></pre>
<p>np.sum()을 사용하기 위해서 numpy를 불러왔다. </p>
<p>numpy는 관례적으로 np라고 쓴다. </p>
<p>또한 새로 생긴 편향값 b는 뉴런이 얼마나 쉽게 활성화를 하느냐를 조정하는 매개변수이다.</p>
<p>np.sum()은 입력한 배열에 담긴 모든 원소의 총합을 계산한다.</p>
<p>그럼 이제 편향값을 추가해서 NAND와 OR를 구현해 보겠다.</p>
<h3 id="or">OR</h3>
<pre><code class="language-python">import numpy as np

def OR(x1, x2):
    x = np.array([x1, x2])
    W = np.array([0.5, 0.5])
    b = -0.2

    tmp = np.sum(x*W) + b

    if tmp &lt;= 0:
        print(0)
    else :
        print(1)

if __name__ == &#39;__main__&#39;:
    OR(0,0)
    OR(0,1)
    OR(1,0)
    OR(1,1) </code></pre>
<pre><code class="language-python">0
1
1
1</code></pre>
<p>tmp가 1보다 작다면 0을 출력 즉, np.sum(x*W) 를 했을 때 값이 0보다 크기만 하면 1을 출력한다.
또한 OR게이트는 편향값을 -0.2로 해주어야한다. ( XOR 게이트를 만들면서 구글링을 해본 결과 거의 모든 사람들이 OR의 편향 값을 -0.2로 하였기 때문.)</p>
<h3 id="nand">NAND</h3>
<pre><code class="language-python">import numpy as np

def NAND(x1, x2):
    x = np.array([x1, x2])
    W = np.array([-0.5, -0.5])
    b = 0.7

    temp = np.sum(x*W) + b

    if temp &lt;= 0:
        print(0)
    else :
        print(1)

if __name__ == &#39;__main__&#39;:
    NAND(0,0)
    NAND(0,1)
    NAND(1,0)
    NAND(1,1)</code></pre>
<pre><code class="language-python">1
1
1
0</code></pre>
<p>가중치 W의 값을 -를 곱해준다.</p>
<p>다음은 XOR이다. 그런데 XOR은 퍼셉트론의 한계라고 볼 수 있다.  </p>
<p>XOR을 하려면 다층 퍼셉트론이 되어야 한다. 다음에는 다층 퍼셉트론에 대해서 정리하도록 하겠다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[자료구조]포인터 - 배열 입력 ]]></title>
            <link>https://velog.io/@chan_7/%EC%9E%90%EB%A3%8C%EA%B5%AC%EC%A1%B0%ED%8F%AC%EC%9D%B8%ED%84%B0-%EB%B0%B0%EC%97%B4-%EC%9E%85%EB%A0%A5</link>
            <guid>https://velog.io/@chan_7/%EC%9E%90%EB%A3%8C%EA%B5%AC%EC%A1%B0%ED%8F%AC%EC%9D%B8%ED%84%B0-%EB%B0%B0%EC%97%B4-%EC%9E%85%EB%A0%A5</guid>
            <pubDate>Sat, 01 Oct 2022 10:30:52 GMT</pubDate>
            <description><![CDATA[<p>배열을 입력받아 보겠다. ( 2차원 ) </p>
<pre><code class="language-c">#include &lt;stdio.h&gt;

void inputArr(int a[][4], int row, int col); 

int main()
{
    int arr[3][4];

    inputArr(arr, 3, 4); // arr은 배열의 특징은 시작주소값을 넘겨줌 

    for(int i=0; i&lt;3; i++){
        for(int j=0; j&lt;4; j++){
            printf(&quot;%d &quot;,arr[i][j]);
        }
        printf(&quot;\n&quot;);
    }
}

void inputArr(int a[][4], int col, int row) // arr의 시작주소를 받음 
{
    for(int i=0; i&lt;col; i++){
        for(int j=0; j&lt;row; j++){
            scanf(&quot;%d&quot;, &amp;a[i][j]);
        }
    }
}</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[[자료구조] 포인터 - 배열 ]]></title>
            <link>https://velog.io/@chan_7/Python-%ED%8F%AC%EC%9D%B8%ED%84%B0-%EB%B0%B0%EC%97%B4</link>
            <guid>https://velog.io/@chan_7/Python-%ED%8F%AC%EC%9D%B8%ED%84%B0-%EB%B0%B0%EC%97%B4</guid>
            <pubDate>Thu, 29 Sep 2022 14:38:37 GMT</pubDate>
            <description><![CDATA[<p>저번에는 포인터에 대해서 정리를 하였다. 
이번에는 포인터 배열에 대해서 복습과 정리를 해보도록 하겠다.
먼저 시작하기 전에 기초적인 것 부터 복습하고 넘어가자.</p>
<h2 id="int-arr4">int (*arr)[4]</h2>
<p>2차원 배열을 가리키는 포인터 지정 </p>
<blockquote>
<p>잘 기억해 두자.</p>
</blockquote>
<h2 id="int-arr4-1">int *arr[4]</h2>
<p>int 형 포인터 값 4개를 저장하는 배열 </p>
<blockquote>
<p>잘 기억해 두자.</p>
</blockquote>
<h2 id="1차원-배열">1차원 배열</h2>
<p>먼저 간단하게 1차원 부터 시작해보겠다.
간단하게 배열을 만들어주고 포인터 변수에 포인터의 주소값을 넣어주겠다.</p>
<blockquote>
<p>중요한 것 : 배열의 이름은 배열의 시작주소 이다.</p>
</blockquote>
<pre><code class="language-C">#include &lt;stdio.h&gt;

int main()
{
    int arr[3] = {1,2,3};
    int* a = arr;

    printf(&quot;%d&quot;,*a);

    return 0;
}</code></pre>
<p>출력값 : 1</p>
<p>이렇게 출력이 되는 이유는 arr의 주소값이 100이라고 하였을 때 a는 주소값 100을 받게 되고, 배열의 이름은 배열의 시작주소 즉 100번의 주소값을 가진 곳에는 1이 존재한다. </p>
<p>그럼 a + 1을 하면 몇이 나올까?</p>
<pre><code class="language-C">printf(&quot;%d&quot;,*a + 1); //로 수정하였다.</code></pre>
<p>2가 나온다.</p>
<p>그럼 이것을 포인터를 활용하여 모든 값을 출력시켜 보겠다.</p>
<h3 id="1차원-배열-전부-출력">1차원 배열 전부 출력</h3>
<pre><code class="language-C">#include &lt;stdio.h&gt;

int main()
{
    int arr[3] = {1,2,3};
    int* a = arr;

    for(int i=0; i&lt;3; i++){
        printf(&quot;배열 %d 번째의 값 : %d\n&quot;,i,*a + i);
    }

    return 0;
}</code></pre>
<p><img src="https://velog.velcdn.com/images/chan_7/post/146f7d4c-f69d-4550-b5eb-c783531f7450/image.png" alt=""></p>
<h3 id="1차원-배열-함수">1차원 배열 함수</h3>
<pre><code class="language-C">#include &lt;stdio.h&gt;

void print(int *a) // 포인터 변수를 만들어서 main 변수의 arr 주소값을 받아준다. 
{
    for(int i=0; i&lt;3; i++){
        printf(&quot;%d &quot;,*a + i);
    }
}

int main()
{
    int arr[3] = {1,2,3};
    print(arr);

    return 0;
}</code></pre>
<h2 id="2차원-배열">2차원 배열</h2>
<p>결국엔 오고야 말았다. 
2차원 배열은 조금 더 어렵지만 간단하게 설명하겠다.</p>
<p>앞에서 보여주었던 포인터의 값을 저장하는 포인터 배열과 2차원 배열을 가리키는 포인터를 이용하여 만들어 보겠다.</p>
<pre><code class="language-C">#include &lt;stdio.h&gt;

int main()
{
    int arr[3][3] = {{1,2,3}, {4,5,6}, {7,8,9}};

    int (*a)[3] = arr; // 2차원배열의 시작주소를 기리킨다.
    printf(&quot;%d\n&quot;, *a); // 주소가 출력이 된다. 
    printf(&quot;%d&quot;, a[0][0]); // 인덱스로 값 출력  

    return 0;
}</code></pre>
<p><img src="https://velog.velcdn.com/images/chan_7/post/ac82906b-8215-496c-be55-9b2b7799390e/image.png" alt=""></p>
<h3 id="2차원-배열-함수">2차원 배열 함수</h3>
<pre><code>#include &lt;stdio.h&gt;

void print(int a[][3], int col, int row){ // *은 필요 x  
    for(int i=0; i&lt;row; i++){
        for(int j=0; j&lt;col; j++){
            printf(&quot;%d &quot;,a[i][j]);
        }
        printf(&quot;\n&quot;);
    }
}

int main()
{
    int arr[3][3] = {{1,2,3}, 
                    {4,5,6}, 
                    {7,8,9}};

    print(arr,3,3);

    return 0;
}</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[[Python] 패키지 ]]></title>
            <link>https://velog.io/@chan_7/Python-%ED%8C%A8%ED%82%A4%EC%A7%80</link>
            <guid>https://velog.io/@chan_7/Python-%ED%8C%A8%ED%82%A4%EC%A7%80</guid>
            <pubDate>Wed, 28 Sep 2022 01:49:12 GMT</pubDate>
            <description><![CDATA[<p>전에 올린 포스트에서는 모듈에 대해서 다뤄보았다.</p>
<p>패키지는 모듈이 2개 이상 모인 것들이다. </p>
<p>먼저 간단하게 패키지 폴더를 만들고 하위폴더를 만들어 주겠다.</p>
<h2 id="폴더-만들기">폴더 만들기</h2>
<p><img src="https://velog.velcdn.com/images/chan_7/post/45158bc5-b430-4269-8444-f74c29f05e0f/image.png" alt=""></p>
<p>상위 폴더의 이름은 Travel이고, 하위폴더는 <strong><strong>init</strong></strong>.py,  Thailand.py, Vietnam.py를 만들어 준다.</p>
<p>그리고 main.py는 Travel 폴더 <strong>밖에 속한다.</strong></p>
<h2 id="init이란"><strong><strong>init</strong></strong>이란?</h2>
<p><strong><strong>init</strong></strong> .py는 현재 디렉토리를 패키지파일로 만든다는 뜻이다.
또한 <strong><strong>all</strong></strong> 을 사용할 수 있다.</p>
<h2 id="all-이란"><strong><strong>all</strong></strong> 이란?</h2>
<p>현재 패키지 Travel에는 Thailand.py와 Vietnam.py 모듈이 존재한다. 
그렇기 때문에 모듈을 불러올때 <strong><strong>all</strong></strong> 에서 모듈의 이름을 지정해주지 않으면 
Nameerror가 발생한다. 그렇기 때문에 아래와 같이 정의를 해주어야 한다.</p>
<pre><code class="language-python">__all__ = [&quot;Vietnam&quot;, &quot;Thaniland&quot;] 

# init 파일은 패키지를 초기화 시킨다. 
# __all__ 는 현재 디렉토리를 패키지로 취급하게 만들며, 코드를 실행하거나 __all__ 변수를 설정할 수 있다.</code></pre>
<h2 id="vietnam-thaniland-파이썬-파일-생성">Vietnam, Thaniland 파이썬 파일 생성</h2>
<p>코드는 아래와 같다. </p>
<pre><code class="language-python">class ThanilandPackage:
    def detail(self):
        print(&#39;[태국 패키지 3박 5일] 방콕, 파타야 여행(야시장 투어) 50만원&#39;)</code></pre>
<pre><code class="language-python">class VietnamPackage:
    def detail(self):
        print(&#39;[베트남 패키지 3박 5일] 방콕, 다냥 효도 여행 60만원&#39;)</code></pre>
<p>Class 이름은 각자 자신의 이름 + Package를, self는 자기 자신을 뜻한다는 뜻이다. 
self는 따로 정리해서 공부가 거의 다 되었다고 생각하면 복습을 잘 할수 있게끔 올리도록 하겠다.</p>
<h2 id="모듈-불러와서-값-출력하기">모듈 불러와서 값 출력하기</h2>
<p>우리는 아까 Travel 파일 안에 패키지 파일을 만들고 실행 파일은 따로 바깥에 빼두었다. 그 파일이 main.py이다.</p>
<p>main.py의 코드는 아래와 같으며, 정말 간단하다.</p>
<pre><code class="language-python">import Travel.Thailand

trip_to = Travel.Thailand.ThanilandPackage()
trip_to.detail()</code></pre>
<p>위는 import로 모듈을 가져오는 방법이고, Travel.Thailand를 통해서 모듈을 가져오고 trip_to 라는 변수에 ThanilandPackage() 클래스를 넣어준다.
그리고 마지막으로 trip_to.detail()을 하여 실행한다.
(detail)은 ThanilandPackage() 클래스 안에 있는 메서드이다.
<img src="https://velog.velcdn.com/images/chan_7/post/1b9160a6-0496-46ea-8b9d-d8e9e8221b63/image.png" alt=""></p>
<p>이렇게 잘 나온다.</p>
<p>또 from을 사용하는 방법이 있다.</p>
<pre><code class="language-python">from Travel.Thailand import ThanilandPackage
trip_to = ThanilandPackage()
trip_to.detail()</code></pre>
<p>Travel.Thailand 에서 ThanilandPackage모듈을 불러오고 ThanilandPackage에 속하는 detail() 모듈을 넣어준다.
결과는 동일하다 
<img src="https://velog.velcdn.com/images/chan_7/post/1b9160a6-0496-46ea-8b9d-d8e9e8221b63/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Python] 모듈 ]]></title>
            <link>https://velog.io/@chan_7/Python-%EB%AA%A8%EB%93%88</link>
            <guid>https://velog.io/@chan_7/Python-%EB%AA%A8%EB%93%88</guid>
            <pubDate>Wed, 28 Sep 2022 01:27:30 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>파이썬에서 모듈(module)이란 하나의 파이썬 파일(.py 파일)을 의미한다. </p>
</blockquote>
<h3 id="만약-이런-모듈이-많이-모이면-패키지가-된다">만약 이런 모듈이 많이 모이면 패키지가 된다.</h3>
<br>

<p>먼저 Module이라는 폴더를 만들어준다.
그리고 하위폴더에는 price.py, theater_module.py를 만들어준다.</p>
<p><img src="https://velog.velcdn.com/images/chan_7/post/acb98980-39b1-4d5d-8e47-aaed126ba1a6/image.png" alt=""></p>
<p><strong><strong>pycache</strong></strong>는 왜 생기는진 모르겠지만 찾아보니 컴파일을 하는데 더 좋다고 한다.</p>
<br>


<h2 id="모듈-불러오는-법">모듈 불러오는 법</h2>
<p>theater_module 파일에는 아래와 같이 넣어준다.</p>
<blockquote>
<p>import를 통해서 입력받는 법 </p>
</blockquote>
<pre><code class="language-python"># 일반 가격 
def price(people):
    print(f&#39;{people} 명 가격은 {people * 10000} 원 입니다.&#39;)

# 조조할인 가격 
def price_morning(people):
    print(f&#39;{people} 명 조조할인 가격은 {people * 6000} 원 입니다.&#39;)

# 군인 할인 가격 
def price_soldier(people):
    print(f&#39;{people} 명 군인 할인 가격은 {people * 4000} 원 입니다.&#39;)

if __name__ == &#39;__main__&#39; :
    price(30)
    price_morning(30)
    price_soldier(30)</code></pre>
<br>

<p>이제 이 모듈에서 일반, 조조, 군인에 해당하는 가격을 출력해보겠다.</p>
<pre><code class="language-python">import theater_module 

theater_module.price(3)
theater_module.price_morning(4)
theater_module.price_soldier(5)</code></pre>
<p>import_module에서 price()를 불러오고 안에 매개변수 값 3을 넣어준다.
나머지도 함수의 이름만 다르고 동일하다.</p>
<p>지금은 조금 어려울 수도 있지만 계속하고 코드도 조금씩 수정하다 보면 이해할 수 있다. </p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[자료구조] 포인터 활용]]></title>
            <link>https://velog.io/@chan_7/%EC%9E%90%EB%A3%8C%EA%B5%AC%EC%A1%B0-%ED%8F%AC%EC%9D%B8%ED%84%B0-%ED%99%9C%EC%9A%A9</link>
            <guid>https://velog.io/@chan_7/%EC%9E%90%EB%A3%8C%EA%B5%AC%EC%A1%B0-%ED%8F%AC%EC%9D%B8%ED%84%B0-%ED%99%9C%EC%9A%A9</guid>
            <pubDate>Mon, 26 Sep 2022 02:05:30 GMT</pubDate>
            <description><![CDATA[<p>어제는 포인터의 개념에 대해서만 정리를 해보았다. 
그래서 오늘은 포인터를 어떻게 사용하는지 알아보려 한다.</p>
<h3 id="기본">기본</h3>
<blockquote>
<p>포인터 변수 a 를 활용하여 변수 b의 값을 저장하여 출력시켜 보겠다.</p>
</blockquote>
<pre><code class="language-C">#include &lt;stdio.h&gt;

int main()
{
    int* a; // 포인터 변수 a (정수형) 
    int b; // 변수 b (정수형) 
    a = b;
    printf(&quot;%d %d&quot;, a, b);
    return 0;
}</code></pre>
<p><img src="https://velog.velcdn.com/images/chan_7/post/c21efd39-fa42-47fb-90bc-fa0cf2844329/image.png" alt=""></p>
<p>이렇게 하면 에러가 뜨게 된다.</p>
<p>왜일까?</p>
<blockquote>
<p>포인터 변수와 일반 변수와는 다르기 때문이다.</p>
</blockquote>
<p>그럼 이렇게 하면 된다.</p>
<p>&amp;는 주소 연산자 이것을 사용할 것이다.</p>
<pre><code class="language-C">a = &amp;b // 포인터 변수 a에 b의 주소값을 저장한다.</code></pre>
<p>이렇게 하면 a에는 b의 주소값이 담기게 된다.
주소값이 같다면 결국 같은 값을 가진 변수가 된다.</p>
<p>출력시켜 보겠다.</p>
<br>    

<pre><code class="language-C">#include &lt;stdio.h&gt;

int main()
{
    int* a; // 포인터 변수 a (정수형) 
    int b = 5; // 변수 b (정수형) 
    a = &amp;b;
    printf(&quot;%d %d&quot;, a, b);
    return 0;
}</code></pre>
<p><img src="https://velog.velcdn.com/images/chan_7/post/107058f9-1a35-471c-81ef-24a88a379b73/image.png" alt=""></p>
<p> 왜 a에는 이상한 숫자가 담기게 될까? 
 이유는 간단하다 </p>
<blockquote>
<p>b의 주소값을 넘겨주었기 때문에, b의 주소가 출력이 된다.</p>
</blockquote>
 <br>

<p> 그럼 이럴 때는 주소의 값을 나타내는 * 역참조 연산자를 사용할 수 있다.
 역참조 연산자는 주소가 가리키는 값을 가져온다.</p>
<pre><code class="language-C">#include &lt;stdio.h&gt;

int main()
{
    int* a; // 포인터 변수 a (정수형) 
    int b = 5; // 변수 b (정수형) 
    a = &amp;b;

    if(*a == b) printf(&quot;a와 b는 같습니다.&quot;);
    else printf(&quot;a와 b는 다릅니다.&quot;); 

    return 0;
}</code></pre>
<p><img src="https://velog.velcdn.com/images/chan_7/post/262caceb-faaf-47cc-84eb-e010e883dcd2/image.png" alt=""></p>
<p>이렇게 된다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[자료구조] 포인터 ]]></title>
            <link>https://velog.io/@chan_7/%EC%9E%90%EB%A3%8C%EA%B5%AC%EC%A1%B0-%ED%8F%AC%EC%9D%B8%ED%84%B0</link>
            <guid>https://velog.io/@chan_7/%EC%9E%90%EB%A3%8C%EA%B5%AC%EC%A1%B0-%ED%8F%AC%EC%9D%B8%ED%84%B0</guid>
            <pubDate>Sun, 25 Sep 2022 14:13:16 GMT</pubDate>
            <description><![CDATA[<h2 id="포인터">포인터</h2>
<br>

<h3 id="1-포인터의-개념">1. 포인터의 개념</h3>
<blockquote>
<ul>
<li>대상의 주소를 통해 대상을 가리키는 지시자 </li>
<li>주소를 나타내는 자료 또는 그러한 자료형 </li>
<li>포인터가 가리키는 데이터의 자료형 정보, 즉 참조 자료형 정보도 가지고 있다.</li>
</ul>
</blockquote>
<br>

<h3 id="포인터-선언-방법">포인터 선언 방법</h3>
<pre><code class="language-C">int* a; // a는 int(정수)형 포인터 변수이다.</code></pre>
<br>

<h3 id="2-포인터-연산자">2. 포인터 연산자</h3>
<blockquote>
<p>&amp; : Address of - 참조 연산자, 대상의 주소를 얻어오는 연산자
예)</p>
</blockquote>
<pre><code class="language-C">a = &amp;b; // 변수 b의 주소를 포인터 변수 a에 저장</code></pre>
<blockquote>
<ul>
<li>: 역참조 연산자, 주소로부터 대상 <strong>변수값</strong>을 얻어오는 연산자
예)</li>
</ul>
</blockquote>
<pre><code class="language-C">int c = *a // 변수 C는 포인터 변수 a가 가리키는 주소    </code></pre>
<br>

<h3 id="3-포인터-변수는-힙-영역에-접근하는-동적-변수이다">3. 포인터 변수는 <strong>힙 영역</strong>에 접근하는 동적 변수이다</h3>
<p><img src="https://velog.velcdn.com/images/chan_7/post/14bc257a-5b85-4a69-ac4c-1d472fead711/image.png" alt=""></p>
<br>

<h3 id="4-메모리-영역">4. 메모리 영역</h3>
<p><img src="https://velog.velcdn.com/images/chan_7/post/56f25105-e986-44b9-85ff-38740d78977a/image.png" alt=""></p>
<h3 id="포인터-변수의-용도">포인터 변수의 용도</h3>
<blockquote>
<ul>
<li>메모리에 직접 접근하기 위해 사용한다.</li>
<li>연결된 자료 구조를 구성 및 동적 할당 자료구조 저장 
포인터를 매개 변수로 전달하면 호출된 함수에서 호출한 함수의 변수 내용을 변경할 수 있다.</li>
</ul>
</blockquote>
<br>

<h3 id="포인터와-배열">포인터와 배열</h3>
<p>1) 개념 
배열을 포인터 변수에 저장한 후, 포인터를 이용하여 배열의 요소에 접근할 수 있다.</p>
<pre><code class="language-C">int a[5];
int* b;
b = a; // 배열 a의 시작 주소인 a[0]의 주소를 포인터 변수 b에 저장</code></pre>
<p><strong>배열의 이름 : 배열의 첫번째 요소의 주소</strong>
<br></p>
<p>배열 요소에 대한 주소를 지정할 때는 일반 변수와 동일하게 &amp; 연산자를 사용 </p>
<pre><code class="language-C">b = &amp;a[2]; // 배열 a의 세 번째 요소인 a[2]의 주소를 포인터 변수 b에 저장한다.</code></pre>
<p><img src="https://velog.velcdn.com/images/chan_7/post/dcab563d-9f99-4174-a0e9-eeb47d86dc40/image.png" alt=""></p>
<h3 id="포인터-변수에-대한-연산">포인터 변수에 대한 연산</h3>
<blockquote>
<ul>
<li>포인터 변수에 대해 정수 변수와 유사하게 +,-,++,-- 연산 가능</li>
<li>정수 변수와 달리 실제 더해지거나 빼지는 값은 포인터 변수가 참조하는 자료형의 크기에 따라 달라짐 </li>
</ul>
</blockquote>
<br>

<h3 id="배열의-이름과-주소">배열의 이름과 주소</h3>
<blockquote>
<ul>
<li>배열의 이름은 배열의 <strong>시작 주소</strong>를 나타내는 포인터/주소 상수 </li>
<li>배열이름은 상수이므로 <strong>값 변경 불가</strong> </li>
<li>배열 이름은 포인터이므로 + 연산 가능 </li>
</ul>
</blockquote>
<h3 id="배열을-매개변수로-사용하려면">배열을 매개변수로 사용하려면</h3>
<pre><code class="language-C">void f(int arr[] 또는 int *a)</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Flask] 기초 웹이랑 연결]]></title>
            <link>https://velog.io/@chan_7/Flask-%EA%B8%B0%EC%B4%88-%EC%9B%B9%EC%9D%B4%EB%9E%91-%EC%97%B0%EA%B2%B0</link>
            <guid>https://velog.io/@chan_7/Flask-%EA%B8%B0%EC%B4%88-%EC%9B%B9%EC%9D%B4%EB%9E%91-%EC%97%B0%EA%B2%B0</guid>
            <pubDate>Sun, 25 Sep 2022 13:19:33 GMT</pubDate>
            <description><![CDATA[<h2 id="1-web이랑-연결하는-방법">1. Web이랑 연결하는 방법</h2>
<blockquote>
<ol>
<li>먼저 main 폴더를 만들어 준다. </li>
<li>하위 폴더로 templates 폴더를 만들어 준다.</li>
<li>templates에는 html파일을 생성해주고 main폴더 아래에는 app.py를 만들어 준다.</li>
</ol>
</blockquote>
<p><img src="https://velog.velcdn.com/images/chan_7/post/9898ee27-a999-4d85-b011-85c77a272707/image.png" alt=""></p>
<br>

<h3 id="html-파일">HTML 파일</h3>
<p>html 파일부터 만들어 주겠다. </p>
<pre><code class="language-html">&lt;!DOCTYPE html&gt;
&lt;html lang=&quot;en&quot;&gt;
&lt;head&gt;
    &lt;meta charset=&quot;UTF-8&quot;&gt;
    &lt;meta http-equiv=&quot;X-UA-Compatible&quot; content=&quot;IE=edge&quot;&gt;
    &lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1.0&quot;&gt;
    &lt;title&gt;Document&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
    &lt;h1&gt;부소마&lt;/h1&gt;
&lt;/body&gt;
&lt;/html&gt;</code></pre>
<p>위처럼 html 파일은 간단하게 만들어주고, 이제 파이썬파일을 만들어 보겠다.</p>
<br>

<h3 id="python-파일">Python 파일</h3>
<p>먼저 Flask를 다운 받아준다.</p>
<pre><code class="language-cmd">pip install Flask</code></pre>
<p>코드는 아래와 같다. </p>
<pre><code class="language-python">from flask import Flask, render_template # 플라스크 모듈과 render_template(html파일을 불러오는 모듈)을 가져온다.

app = Flask(__name__)

@app.route(&#39;/&#39;) # 기본
def mainpage():
    return render_template(&#39;mainpage.html&#39;) # render_template 메서드는 templates 폴더에 있는 () 안의 파일을 실행한다. 

if __name__ == &#39;__main__&#39;: # C언어의 main과 같다.
    app.run(debug=True) # Flask를 실행한다.</code></pre>
<br>

<h3 id="실행하기">실행하기</h3>
<p>터미널을 열어서 터미널에 python ./main/app.py 를 해주었다. 그러면 아래와 같이 뜨게 된다.
<img src="https://velog.velcdn.com/images/chan_7/post/26b06e56-e602-448e-8901-d5d82add1bd2/image.png" alt="">
이렇게 뜨게 되면 Running on <a href="http://127.0.0.1:5000">http://127.0.0.1:5000</a> 을 컨트롤 좌클릭 해준다.</p>
<p><img src="https://velog.velcdn.com/images/chan_7/post/e3149aea-eae2-4253-a618-8f0afa19a3f3/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Flask] 연결 에러 해결하는 법]]></title>
            <link>https://velog.io/@chan_7/Flask-%EC%97%B0%EA%B2%B0-%EC%97%90%EB%9F%AC-%ED%95%B4%EA%B2%B0%ED%95%98%EB%8A%94-%EB%B2%95</link>
            <guid>https://velog.io/@chan_7/Flask-%EC%97%B0%EA%B2%B0-%EC%97%90%EB%9F%AC-%ED%95%B4%EA%B2%B0%ED%95%98%EB%8A%94-%EB%B2%95</guid>
            <pubDate>Sun, 25 Sep 2022 01:16:30 GMT</pubDate>
            <description><![CDATA[<p>플라스크를 사용해서 실행을 하면 호스트 에러가 뜰때가 있다.</p>
<p>이런식으로 말이다.
<img src="https://velog.velcdn.com/images/chan_7/post/3a6b3c69-fd28-4adb-9a6e-8ac340e16fd3/image.png" alt=""></p>
<br>

<h2 id="해결하는-법">해결하는 법</h2>
<blockquote>
<p>구글링을 하다가 찾은 링크인데, 이것 덕분에 해결된 사람이 많았다.
<a href="https://www.youtube.com/watch?v=kDmWy3XlaRc&amp;t=132s">플라스크 연결 에러 해결방법 영상 - 구뜨맨</a></p>
</blockquote>
<p>만약 위 영상을 보면 정말 정확하겠지만, 시간이 없거나 귀찮은 사람들은 아래 글을 보면 된다.</p>
<p><br><br></p>
<h3 id="1-제어판-실행">1. 제어판 실행</h3>
<p>제어판에 들어가준다.
<img src="https://velog.velcdn.com/images/chan_7/post/dce1c428-c7ec-4c0c-8826-a42a15c4bc94/image.png" alt="">
그런다음 오른쪽 위에 빨간색 원이 있는 곳에서 큰 아이콘을 눌러준다.
<img src="https://velog.velcdn.com/images/chan_7/post/c1c9ea61-cc74-46d5-baa6-143c0c86a4b4/image.png" alt=""></p>
<p><br><br></p>
<h3 id="2-인터넷-옵션">2. 인터넷 옵션</h3>
<p>인터넷 옵션으로 들어가준다.
<img src="https://velog.velcdn.com/images/chan_7/post/2133efa9-580f-495d-ac3a-d1a7d1dba571/image.png" alt="">
그런 다음 연결 창으로 들어가 준다.
<img src="https://velog.velcdn.com/images/chan_7/post/6b293546-faa5-4511-9d0e-8a0f56f447b4/image.png" alt=""></p>
<p><br><br></p>
<h3 id="3-lan-설정">3. LAN 설정</h3>
<p><img src="https://velog.velcdn.com/images/chan_7/post/5bfeb8fe-7b10-4dc6-9d45-ea8fcadc396a/image.png" alt="">
아래쪽에 위치한 LAN 설정을 들어가준다.</p>
<p><br><br></p>
<h3 id="4-체크박스-전부-끄기">4. 체크박스 전부 끄기</h3>
<p><img src="https://velog.velcdn.com/images/chan_7/post/6d4f65b6-a3c7-4a96-a8ba-f2cfba6bb887/image.png" alt="">
자동으로 설정 검색, 자동 구성 스크립트 사용 
사용자 LAN에 프록시 서버 사용(이 설정은 전화 연결이나 VPN 연결에는 적용되지 않음)</p>
<p>전부 다 체크를 해제한다.</p>
<h3 id="5-마지막">5. 마지막</h3>
<p>마지막은 이제 컴퓨터를 껏다가 다시 키면 된다.
그러면 에러없이 사이트가 잘 나온다.
<img src="https://velog.velcdn.com/images/chan_7/post/3ff9e9e4-e45c-4217-82ae-68ca53147e4a/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[알고리즘] Big-o 표기법]]></title>
            <link>https://velog.io/@chan_7/%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-Big-o-%ED%91%9C%EA%B8%B0%EB%B2%95</link>
            <guid>https://velog.io/@chan_7/%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-Big-o-%ED%91%9C%EA%B8%B0%EB%B2%95</guid>
            <pubDate>Thu, 22 Sep 2022 07:05:44 GMT</pubDate>
            <description><![CDATA[<h2 id="빅오표기법이란">빅오표기법이란</h2>
<blockquote>
<p>자료에 따라 알고리즘이 수행되는 최악의 경우를 표기하는 방법</p>
</blockquote>
<br>

<h3 id="예시">예시</h3>
<blockquote>
<ol>
<li>n<sup>2</sup> + 3n + 2 </li>
<li>3n<sup>3</sup> + 2n<sup>2</sup> + 9n + 10    </li>
</ol>
</blockquote>
<p>Big-o 표기법을 구하는 방법은 가장 큰 지수의 앞 숫자를 빼고 들고 오는 것이다.</p>
<p>정답 : </p>
<ol>
<li>n<sup>2</sup></li>
<li>n<sup>3</sup></li>
</ol>
<p><img src="https://velog.velcdn.com/images/chan_7/post/c02b5b49-b64a-4b2b-ba2e-ceb63f261a19/image.png" alt=""></p>
<p>가장 빠른 순서가 위고 가장 느린 순서가 아래이다.</p>
<p>빅오를 계산하는 방법은 <img src="https://velog.velcdn.com/images/chan_7/post/cb515b21-37e8-4793-abdb-1577d9f1fc45/image.jpg" alt=""></p>
<p>음.. 만약 a = 1 이렇게 변수에 값을 주는 것이 있으면 1을 더해주고 
만약 그냥 int a; 라면 1을 더해주지 않는다. 
또한 반복문에서는 처음 반복문은 n을 나머지는 n - 1로 정해주고 계속 계산해준다. 그렇게 계산을 하다보면 n^n승이 나올텐데 나온 값중에서 가장 큰 지수의 값을 정답으로 적어주면 된다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Python] 가변인자 ]]></title>
            <link>https://velog.io/@chan_7/python-%EA%B0%80%EB%B3%80%EC%9D%B8%EC%9E%90</link>
            <guid>https://velog.io/@chan_7/python-%EA%B0%80%EB%B3%80%EC%9D%B8%EC%9E%90</guid>
            <pubDate>Wed, 21 Sep 2022 01:15:36 GMT</pubDate>
            <description><![CDATA[<h2 id="가변인자란">가변인자란?</h2>
<blockquote>
<p>함수에 들어가는 인수의 개수가 변하는 것</p>
</blockquote>
<p><br><br></p>
<h3 id="1-가변인자-활용-x">1. 가변인자 활용 X</h3>
<pre><code class="language-python">def profile(name, age, lang1, lang2, lang3, lang4, lang5):
    print(f&#39;이름 : {name}\t나이 : {age}&#39;, end=&#39; &#39;)
    print(lang1, lang2, lang3, lang4, lang5)


if __name__ == &#39;__main__&#39;:
    profile(&#39;유재석&#39;, 20, &#39;python&#39;, &#39;java&#39;, &#39;c&#39;, &#39;c++&#39;, &#39;c#&#39;)
    profile(&#39;강태호&#39;, 25, &#39;kotlin&#39;, &#39;swift&#39;, &#39;&#39;, &#39;&#39;, &#39;&#39;)
    profile(&#39;김병찬&#39;, 17, &#39;python&#39;, &#39;pytorch&#39;, &#39;deep learing&#39;, &#39;c&#39;, &#39;데이터분석&#39;)</code></pre>
<p>위 처럼 lang1, lang2, lang3  . . . 이렇게 귀찮게 입력을 받아 주었다.
그런데 자세히 보면 강태호라는 사람의 이름의 기술에는 공백이 있는 것을 볼 수 있다. </p>
<blockquote>
<p>그 이유는 저렇게 하지 않으면 인수의 개수가 맞지않아서 에러가 뜨게 된다.</p>
</blockquote>
<p><br><br></p>
<p>한번 해보자 </p>
<pre><code class="language-python"># -*- coding: utf-8 -*-
# UTF-8 encoding when using korean

def profile(name, age, lang1, lang2, lang3, lang4, lang5):
    print(f&#39;이름 : {name}\t나이 : {age}&#39;, end=&#39; &#39;)
    print(lang1, lang2, lang3, lang4, lang5)


if __name__ == &#39;__main__&#39;:
    profile(&#39;유재석&#39;, 20, &#39;python&#39;, &#39;java&#39;, &#39;c&#39;, &#39;c++&#39;, &#39;c#&#39;)
    profile(&#39;강태호&#39;, 25, &#39;kotlin&#39;, &#39;swift&#39;)</code></pre>
<p><img src="https://velog.velcdn.com/images/chan_7/post/14bb662e-c824-4ecf-8c38-75a241b476d7/image.png" alt=""></p>
<h3 id="가변인자-활용-o">가변인자 활용 O</h3>
<p>가변인자의 갯수를 제한없이 하려면 인자 앞에 *을 붙이면 된다.</p>
<pre><code class="language-python">def hamsu(name, age, *lang)</code></pre>
<p>이렇게 말이다.</p>
<p><br><br></p>
<pre><code class="language-python"># -*- coding: utf-8 -*-
# UTF-8 encoding when using korean
def profile(name, age, *lang):
    print(f&#39;이름 : {name}\t나이 : {age}&#39;, end=&quot; &quot;)
    for lang in lang:
        print(lang, end=&quot; &quot;)
    print()

if __name__ == &#39;__main__&#39;:    
    profile(&#39;유재석&#39;, 20, &#39;python&#39;, &#39;java&#39;, &#39;c&#39;, &#39;c++&#39;, &#39;c#&#39;)
    profile(&#39;강태호&#39;, 25, &#39;kotlin&#39;, &#39;swift&#39;)</code></pre>
<p>그러면 공백을 입력할 필요가 없고, 귀찮게 일일이 적지않아서 손쉽게 효율적으로 가능하다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[코딩 문제] 펠린드롬 ]]></title>
            <link>https://velog.io/@chan_7/%EC%BD%94%EB%94%A9-%EB%AC%B8%EC%A0%9C-%ED%8E%A0%EB%A6%B0%EB%93%9C%EB%A1%AC</link>
            <guid>https://velog.io/@chan_7/%EC%BD%94%EB%94%A9-%EB%AC%B8%EC%A0%9C-%ED%8E%A0%EB%A6%B0%EB%93%9C%EB%A1%AC</guid>
            <pubDate>Wed, 21 Sep 2022 00:42:36 GMT</pubDate>
            <description><![CDATA[<pre><code class="language-python">def Ispalindrome(string):
    if string == string[::-1] :
        print(True)
    else :
        print(False)


if __name__ == &#39;__main__&#39; :
    moonja = input()
    Ispalindrome(moonja)</code></pre>
<p>문제 해결방법은 위와 같다.
<br><br></p>
<pre><code class="language-python">if __name__ == &#39;__main__&#39; :</code></pre>
<p>위는 C에서 int main과 비슷한 것이다.</p>
<p><br><br></p>
<h3 id="위-문제를-풀면서-알게된-점">위 문제를 풀면서 알게된 점</h3>
<blockquote>
<p>나는 처음에 reverse()를 통해서 풀려고 하였다. 그래서 시도해봤지만 왜인지 계속 에러가 뜨는 것 이였다.
그래서 왜 그런가 싶어서 에러코드를 보았더니 reverse()는 리스트에서만 쓸 수 있었다. </p>
</blockquote>
<blockquote>
<pre><code class="language-python">    name = input().split() </code></pre>
</blockquote>
<pre><code>  와 같이 입력을 받을 때 저렇게 하면 리스트 형식으로 담긴다는 것을 알게 되었다.

![](https://velog.velcdn.com/images/chan_7/post/02b985ed-8a98-4701-bb17-0218eb58424b/image.png)
</code></pre>]]></description>
        </item>
    </channel>
</rss>