<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>DEVELOPER NOTE</title>
    <link>https://lsmin3388.tistory.com/</link>
    <description>공부한거 정리하려고 만들었습니다. 필요한 자료 있으면 가져가서 쓰세요.</description>
    <language>ko</language>
    <pubDate>Sun, 14 Jun 2026 11:19:07 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>상 민</managingEditor>
    <image>
      <title>DEVELOPER NOTE</title>
      <url>https://tistory1.daumcdn.net/tistory/5776773/attach/ea9f24eef572448d9591bf294129e7e0</url>
      <link>https://lsmin3388.tistory.com</link>
    </image>
    <item>
      <title>(한국어 번역) RFC6749 - The OAuth 2.0 Authorization Framework</title>
      <link>https://lsmin3388.tistory.com/22</link>
      <description>&lt;h1&gt;&lt;span style=&quot;color: #000000;&quot;&gt;들어가기에 앞서&lt;/span&gt;&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;다음 문서는 RFC6749 공식문서를 읽고 한국어로 정리 및 재구성한 글입니다. 공식문서 본문과 100% 동일하지 않으므로 유의해주세요.&lt;/span&gt;&lt;/p&gt;
&lt;h1&gt;&lt;span style=&quot;color: #000000;&quot;&gt;용어 정리&lt;/span&gt;&lt;/h1&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;클라이언트: 웹, 앱 어플리케이션을 이용하는 주체(사용자)&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;자격 증명: 인증(Authorization) 및 인가(Authentication)를 포함한 개념&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;리로스 소유자: 소셜 로그인 제공하는 서비스&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;제3자 응용 프로그램: 클라이언트가 자격 증명을 시도하려는 서비스&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;&lt;span style=&quot;color: #000000;&quot;&gt;소개&lt;/span&gt;&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;전통적인 클라이언트-서버 인증 모델에서, 클라이언트가 제한된 리소스(보호된 리소스)에 접근하기 위해 타사 응용프로그램에서 서버에 자격 증명을 제공하는 방식은 몇 가지 문제들이 있습니다. 문제는 다음과 같습니다:&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;1. 제3자 응용 프로그램은 리소스 소유자의 자격 증명(일반적으로 암호)을 평문으로 저장해야 함.
    ㄴ 이것은 보안적으로 매우 위험하며, 암호가 노출되면 악의적인 공격자에 의해 악용될 수 있습니다.

2. 서버는 암호 인증을 지원 함.
    ㄴ 암호 인증은 암호의 보안 취약성 때문에 위험합니다. 비밀번호를 보호하는 것이 어렵고, 사용자도 취약한 암호를 설정하여 해킹의 위험이 커질 수 있습니다.

3.  제3자 응용 프로그램은 리소스 소유자의 보호된 리소스(개인정보)에 대한 너무 많은 권한을 얻음.
    ㄴ 이로 인해 리소스 소유자는 권한을 제한하거나 특정 리소스에 대한 액세스를 제어할 수 있는 능력이 없게 됩니다.

4.  리소스 소유자는 특정 제3자에 대한 액세스를 쉽게 철회할 수 없으며, 철회하고자 할 경우 모든 제3자에 대한 액세스를 철회해야 하며, 이는 제3자의 암호를 변경함으로써 수행해야 함.
    ㄴ 이것은 UX 및 보안 측면에서 비효율적입니다. 특정 제3자에 대한 액세스를 취소하려면 다른 모든 제3자에 대한 액세스도 취소해야 하므로 사용자에게 불편을 유발합니다.

5.  제3자 응용 프로그램이 노출되면 사용자의 암호와 해당 암호로 보호되는 모든 데이터가 노출됨.
    ㄴ 만약 제3자 응용 프로그램이 침해당하면, 해당 응용 프로그램을 사용하는 사용자의 암호와 그 암호로 보호된 모든 데이터가 공격자에게 노출됩니다.&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;OAuth 2.0는 이러한 문제를 해결하기 위한 보다 안전하고 효율적인 인증 및 권한 부여 방법을 사용했습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;보호된 리소스에 액세스하기 위해 리소스 소유자의 자격 증명을 사용하는 대신, 클라이언트는 액세스 토큰을 얻습니다. 이 토큰은 특정 범위, 수명 및 다른 액세스 속성을 나타내는 문자열입니다. 액세스 토큰은 리소스 소유자의 승인을 얻은 인증 서버에 의해 타사 클라이언트에게 발급됩니다. 클라이언트는 액세스 토큰을 사용하여 리소스 서버에 호스팅되는 보호된 리소스에 액세스합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;예를 들어, 최종 사용자(리소스 소유자)는 자신의 보호된 사진을 포함한 사진 공유 서비스(리소스 서버)에 대한 프린팅 서비스(클라이언트)에 액세스 권한을 부여할 수 있습니다. 이때 최종 사용자는 프린팅 서비스와 자신의 사용자 이름 및 암호를 공유하지 않습니다. 대신, 사용자는 사진 공유 서비스에서 신뢰하는 서버(인가 서버)와 직접 인증을 수행하고 프린팅 서비스에게 특정한 위임 자격 증명(액세스 토큰)을 발급합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;역할(Roles)&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;OAuth은 네 가지 역할을 정의합니다:&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre class=&quot;markdown&quot;&gt;&lt;code&gt;1.  리소스 소유자 (Resource Owner)
    -   보호된 리소스에 대한 액세스 권한을 부여할 수 있는 주체입니다.
    -   리소스 소유자가 개인일 때, 그 개인을 최종 사용자(end-user)라고 합니다.
2.  리소스 서버 (Resource Server)
    -   보호된 리소스를 호스팅하는 서버로, 액세스 토큰을 사용하여 보호된 리소스 요청을 수락하고 응답할 수 있는 역할을 합니다.
3.  클라이언트 (Client)
    -   리소스 소유자를 대신하여 보호된 리소스 요청을 수행하고 리소스 소유자의 승인을 받는 응용 프로그램입니다.
    -   &quot;클라이언트&quot;라는 용어는 특정한 구현 특성을 나타내지 않습니다. (예: 응용 프로그램이 서버, 데스크톱 또는 다른 장치에서 실행되는지 여부)
4.  인가 서버 (Authorization Server)
    -   리소스 소유자를 성공적으로 인증하고 승인을 받은 후 클라이언트에게 액세스 토큰을 발급하는 서버입니다.&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;인가 서버와 리소스 서버 간의 상호작용은 이 명세서의 범위를 벗어납니다. 인가 서버는 리소스 서버와 동일한 서버일 수도 있고 별도의 엔터티일 수도 있습니다. 하나의 인가 서버는 여러 리소스 서버에서 수락하는 액세스 토큰을 발급할 수 있습니다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;액세스 토큰을 얻기 위해 Client가 사용하는 Resource owner의 권한 ( 보호된 리소스에 접근하기 위한 )을 보여주는 자격 증명이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;프로토콜 흐름&lt;/span&gt;&lt;/h2&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt; +--------+                               +---------------+
 |        |--(A)-       인증 요청         -&amp;gt;|   Resource    |
 |        |                               |     Owner     |
 |        |&amp;lt;-(B)--      승인 그랜트       ---|               |
 |        |                               +---------------+
 |        |
 |        |                               +---------------+
 |        |--(C)--      승인 그랜트       --&amp;gt;| Authorization |
 | Client |                               |     Server    |
 |        |&amp;lt;-(D)-----  Access 토큰  -------|               |
 |        |                               +---------------+
 |        |
 |        |                               +---------------+
 |        |--(E)-----  Access 토큰  ------&amp;gt;|    Resource   |
 |        |                               |     Server    |
 |        |&amp;lt;-(F)-- 보호된 리소스(개인정보 등) --|               |
 +--------+                               +---------------+

                 Figure 1: Abstract Protocol Flow&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;(A) 클라이언트는 리소스 소유자로부터 승인을 요청합니다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;(B) 클라이언트는 승인 그랜트(인가 그랜트)를 받습니다. 이는 &lt;b&gt;&lt;u&gt;리소스 소유자의 승인을 나타내는 자격 증명&lt;/u&gt;&lt;/b&gt;으로, 이 명세서에서 정의된 네 가지 그랜트 유형 또는 확장 그랜트 유형 중 하나를 사용하여 표현됩니다. 인가 그랜트 유형은 클라이언트가 승인을 요청하는 방법과 인가 서버에서 지원하는 유형에 따라 다릅니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;(C) 클라이언트는 인가 서버와 인가 그랜트를 제시하여 액세스 토큰을 요청합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;(D) 인가 서버는 클라이언트를 인증하고 인가 그랜트를 유효성 검사하며 유효한 경우 액세스 토큰을 발급합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;(E) 클라이언트는 액세스 토큰을 제시하여 리소스 서버에서 보호된 리소스를 요청하고 인증합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;(F) 리소스 서버는 액세스 토큰을 유효성 검사하고, 유효한 경우 요청을 처리합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;클라이언트가 리소스 소유자로부터 인가 그랜트를 획득하는 선호되는 방법(단계 (A)와 (B)에 표시됨)은 중개자로써 인가 서버를 사용하는 것입니다. 이 방법은 섹션 4.1의 그림 3에서 설명되어 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;* 인가 그랜트(Authorization Grant): &lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;액세스 토큰을 얻기 위해 Client가 사용하는 Resource owner의 권한 ( 보호된 리소스에 접근하기 위한 )을 보여주는 자격 증명이다.&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;인가 그랜트(Authorization Grant)&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;인가 그랜트(Authorization Grant)는 클라이언트가 액세스 토큰을 획득하기 위해 사용하는, 리소스 소유자의 승인을 나타내는 자격 증명(보호된 리소스에 액세스하기 위한 승인)입니다. 권한 부여의 네 가지 자격 유형 :&lt;/span&gt;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;1.&amp;nbsp;Authorization&amp;nbsp;Code&amp;nbsp;(인가&amp;nbsp;코드):&lt;/b&gt; 클라이언트가&amp;nbsp;리소스&amp;nbsp;소유자의&amp;nbsp;승인을&amp;nbsp;얻기&amp;nbsp;위해&amp;nbsp;사용하는&amp;nbsp;유형.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;2.&amp;nbsp;Implicit&amp;nbsp;(암시적&amp;nbsp;타입):&lt;/b&gt; 클라이언트가&amp;nbsp;액세스&amp;nbsp;토큰을&amp;nbsp;직접&amp;nbsp;받는&amp;nbsp;유형.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;3.&amp;nbsp;Resource&amp;nbsp;Owner&amp;nbsp;Password&amp;nbsp;Credentials&amp;nbsp;(리소스&amp;nbsp;소유자&amp;nbsp;암호&amp;nbsp;자격&amp;nbsp;증명):&lt;/b&gt; 클라이언트가&amp;nbsp;리소스&amp;nbsp;소유자의&amp;nbsp;사용자&amp;nbsp;이름&amp;nbsp;및&amp;nbsp;암호를&amp;nbsp;사용하여&amp;nbsp;직접&amp;nbsp;액세스&amp;nbsp;토큰을&amp;nbsp;요청하는&amp;nbsp;유형.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;4.&amp;nbsp;Client&amp;nbsp;Credentials&amp;nbsp;(클라이언트&amp;nbsp;자격&amp;nbsp;증명):&lt;/b&gt;&amp;nbsp;클라이언트&amp;nbsp;자체의&amp;nbsp;자격&amp;nbsp;증명을&amp;nbsp;사용하여&amp;nbsp;액세스&amp;nbsp;토큰을&amp;nbsp;요청하는&amp;nbsp;유형.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;이 외에도 다양한 권한 부여 유형이 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;인가 코드 - 권한 부여 코드 승인 타입&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;인가 코드는 클라이언트와 리소스 소유자 사이의 중개자로 인가 서버를 사용하여 얻습니다. 리소스 소유자에게 직접 승인을 요청하는 대신, 클라이언트는 리소스 소유자를 인가 서버로 안내합니다. 그리고 인가 서버는 리소스 소유자를 클라이언트에게 인가 코드와 함께 되돌려 보냅니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;인가 서버가 인가 코드와 함께 리소스 소유자를 클라이언트로 돌려 보내기 전에 인가 서버는 리소스 소유자를 인증하고 승인을 얻습니다. 리소스 소유자는 인가 서버와만 인증하기 때문에 리소스 소유자의 자격 증명은 클라이언트와 공유되지 않습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;인가 코드는 클라이언트를 인증하는 능력과 액세스 토큰을 리소스 소유자의 사용자 에이전트를 통과시키지 않고 직접 클라이언트로 전송하는 등 몇 가지 중요한 보안 이점을 제공합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;암시적 타입&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;암시적 그랜트는 JavaScript와 같은 스크립팅 언어를 사용하여 브라우저에서 구현된 클라이언트에 최적화된 간소화된 인가 코드 플로우입니다. 암시적 플로우에서 클라이언트는 인가 코드 대신에 액세스 토큰을 직접 받습니다. 이 그랜트 유형은 중간 자격 증명(예: 인가 코드)이 발급되지 않습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;암시적 그랜트 플로우 중에 액세스 토큰을 발급할 때, 인가 서버는 클라이언트를 인증하지 않습니다. 경우에 따라 클라이언트 식별 정보는 액세스 토큰을 클라이언트에게 전달하는 데 사용되는 리디렉션 URI를 통해 확인될 수 있습니다. 액세스 토큰은 리소스 소유자나 리소스 소유자의 사용자 에이전트에 노출될 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;리소스 소유자 비밀번호 자격 증명 - 암호 자격 증명 타입&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;리소스 소유자 암호 자격 증명(즉, 사용자 이름과 암호)은 액세스 토큰을 얻기 위한 인가 그랜트로 직접 사용될 수 있습니다. 이 자격 증명은 리소스 소유자와 클라이언트 사이에 높은 신뢰 수준이 있을 때 사용해야 합니다(예: 클라이언트가 기기 운영 체제의 일부이거나 고도로 특권이 부여된 응용 프로그램인 경우), 그리고 다른 인가 그랜트 유형이 사용 불가능한 경우(예: 인가 코드).&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;이 그랜트 유형은 클라이언트가 리소스 소유자 자격 증명을 한 번 요청에 사용하고 액세스 토큰과 교환함으로써, 클라이언트가 리소스 소유자 자격 증명을 미래 사용을 위해 저장할 필요를 없애줄 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;클라이언트 자격 증명 - Client 자격 증명 타입&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;클라이언트 자격 증명(또는 다른 형태의 클라이언트 인증)은 인가 범위가 클라이언트의 제어하에 있는 보호된 리소스로 제한되거나 인가 서버와 사전에 정의된 보호된 리소스로 제한되는 경우에 인가 그랜트로 사용될 수 있습니다. 클라이언트 자격 증명은 일반적으로 클라이언트가 자체를 위해(클라이언트가 리소스 소유자인 경우) 작동하거나 인가 서버와 사전에 정의된 보호된 리소스에 대한 액세스를 요청할 때 사용됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;액세스 토큰&lt;/span&gt;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;리프레시 토큰&lt;/span&gt;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;TLS&lt;/span&gt;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;HTTP 리다&lt;/span&gt;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;상호&lt;/span&gt;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;표기 관습&lt;/span&gt;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;</description>
      <category>STUDY</category>
      <author>상 민</author>
      <guid isPermaLink="true">https://lsmin3388.tistory.com/22</guid>
      <comments>https://lsmin3388.tistory.com/22#entry22comment</comments>
      <pubDate>Thu, 12 Oct 2023 23:48:44 +0900</pubDate>
    </item>
    <item>
      <title>[GDSC] Spring Boot Study - OAuth, OAuth 1.0, OAuth 2.0</title>
      <link>https://lsmin3388.tistory.com/21</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;들어가기 앞서&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음은 GDSC 백엔드 직렬 1팀에서 진행하는 Spring Boot Study 중 &quot;이상민(23)&quot;이 작성한 포스팅입니다. 공식 문서 및 다양한 참고자료를 바탕으로 해당 글을 작성했습니다. 참고 자료 주소는 본문 하단에 명시되어 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;OAuth의 사용과 의미&lt;/b&gt;&lt;/h2&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;OAuth is an open-standard authorization protocol or framework that provides applications the ability for &amp;ldquo;secure designated access.&amp;rdquo; For example, you can tell Facebook that it&amp;rsquo;s OK for ESPN.com to access your profile or post updates to your timeline without having to give ESPN your Facebook password. This minimizes risk in a major way: In the event ESPN suffers a breach, your Facebook password remains safe.&lt;br /&gt;OAuth doesn&amp;rsquo;t share password data but instead uses authorization tokens to prove an identity between consumers and service providers. OAuth is an authentication protocol that allows you to approve one application interacting with another on your behalf without giving away your password.&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;&lt;b&gt;OAuth&lt;/b&gt;는 응용 프로그램에 &quot;지정된 안전한 액세스&quot; 기능을 제공하는 개방형 표준 인증 프로토콜 또는 프레임워크입니다. 예를 들어, tistory.com 에서 tistory에 카카오톡 비밀번호를 알려줄 필요 없이 카카오 인증으로 tistory의 인가를 처리할 수 있습니다. 이러한 방법은 다양한 보안적 위험을 줄일 수 있습니다. (tistory 웹사이트가 해킹당해도 계정 정보 탈취와 같은 문제가 발생하지 않습니다)&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-10-02 오후 1.51.13.png&quot; data-origin-width=&quot;988&quot; data-origin-height=&quot;840&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/LZW6O/btsv8UouUFL/7Zr35pxXZlH8pN0pNCsSI0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/LZW6O/btsv8UouUFL/7Zr35pxXZlH8pN0pNCsSI0/img.png&quot; data-alt=&quot;tistory에서 OAuth를 활용하는 예시&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/LZW6O/btsv8UouUFL/7Zr35pxXZlH8pN0pNCsSI0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FLZW6O%2Fbtsv8UouUFL%2F7Zr35pxXZlH8pN0pNCsSI0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;440&quot; height=&quot;374&quot; data-filename=&quot;스크린샷 2023-10-02 오후 1.51.13.png&quot; data-origin-width=&quot;988&quot; data-origin-height=&quot;840&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;tistory에서 OAuth를 활용하는 예시&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;즉,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;OAuth&lt;/b&gt;는 암호 데이터를 공유하지 않고 인증 토큰을 사용하여 소비자와 서비스 제공자 간의 동일성을 증명합니다.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;OAuth&lt;/b&gt;는 사용자가 자신의 암호를 전달하지 않고 자신을 대신하여 한 애플리케이션이 다른 애플리케이션과 상호 작용하는 것을 승인할 수 있는&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;인증 프로토콜&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;입니다.&lt;/span&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;(OAuth) Open Authorization&lt;br /&gt;인터넷 사용자들이 비밀번호를 제공하지 않고, 다른 웹사의트 상의 자신들의 정보에 대해 웹사이트나 애플리케이션의 접근권한을 부여할 수 있는 공통적인 수단으로 사용되는, 접근 위임을 위한 개방형 표준이다.&lt;/blockquote&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;OAuth 1.0&lt;/b&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1064&quot; data-origin-height=&quot;768&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bbg3sn/btswpXqERgZ/5WIC5YfNCKpPrk2jSE6WwK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bbg3sn/btswpXqERgZ/5WIC5YfNCKpPrk2jSE6WwK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bbg3sn/btswpXqERgZ/5WIC5YfNCKpPrk2jSE6WwK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbbg3sn%2FbtswpXqERgZ%2F5WIC5YfNCKpPrk2jSE6WwK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;558&quot; height=&quot;403&quot; data-origin-width=&quot;1064&quot; data-origin-height=&quot;768&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Client ( 사용자, 로그인을 하려고 하는 주체 )&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;Server ( 백엔드 서버 )&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;Kakao ( 소셜 서비스 )&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;Step 1. 로그인 요청&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;Client가 소셜 로그인을 시도하려고 할 경우, Server은 해당 응답을 받고 Kakao 로그인 화면으로 redirect 해줍니다&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;Step 2. 로그인&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;소셜 서비스 웹 사이트에서 직접 로그인을 시도합니다. 로그인이 성공할 경우 인증 토큰을 Server으로 전송합니다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;Step 3. 사용자 로그인 처리&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;인증 토큰을 Kakao에 요청하면 Client의 개인정보를 가져옵니다. 그리고 로그인 성공 신호를 Client에게 보냅니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;OAuth 2.0&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;&lt;b&gt;OAuth 2.0&lt;/b&gt;은 &lt;b&gt;OAuth 1.0&lt;/b&gt;에서 완전히 재설계된 것으로, 서로 호환되지 않습니다. (현재는 &lt;b&gt;OAuth 1.0&lt;/b&gt;을 지원하지 않습니다.)&lt;/span&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;&lt;b&gt;OAuth 1.0&lt;/b&gt;은 복잡한 암호화 요구 사항과 확장성이 없다는 점에서 만들고 설계하기가 번거로웠습니다.&lt;/span&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;반면 &lt;b&gt;OAuth 2.0&lt;/b&gt;에는 다양한 유형의 애플리케이션과 요구사항에 대해 6개의 플로우가 있으며 HTTPS 적용도 가능합니다. &lt;b&gt;OAuth&lt;/b&gt; 토큰은 전송 중에 암호화되므로 따로 암호화를 할 필요도 없습니다. 즉 &lt;b&gt;OAuth 1.0&lt;/b&gt;보다 보안적 측면에서도 뛰어나고 확장성 뿐만 아니라 만들기도 쉬워졌습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;1699&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/SAeX7/btsv9QTL0Tg/TrM1CBTpGnM19wbUdnUQOK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/SAeX7/btsv9QTL0Tg/TrM1CBTpGnM19wbUdnUQOK/img.png&quot; data-alt=&quot;출처: https://developers.kakao.com/docs/latest/ko/kakaologin/rest-api&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/SAeX7/btsv9QTL0Tg/TrM1CBTpGnM19wbUdnUQOK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FSAeX7%2Fbtsv9QTL0Tg%2FTrM1CBTpGnM19wbUdnUQOK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;546&quot; height=&quot;725&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;1699&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;출처: https://developers.kakao.com/docs/latest/ko/kakaologin/rest-api&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Client ( 사용자, 로그인을 하려고 하는 주체 )&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Server ( 백엔드 서버 )&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Auth Server ( 소셜 로그인을 제공하는 서버 )&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;Step 1. 인가코드 받기&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Client가 소셜 로그인을 시도하려고 할 경우, Auth Server에서는 사용자가 로그인을 할 수 있도록 페이지와 개인정보 동의를 요구합니다. 성공적으로 로그인이 진행되면 Auth Server에서는 Server로 인가 코드를 전달해줍니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;Step 2. 토큰 발급&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Server에서는 인가코드를 다시 Auth Server에게 전달해주면 암호화된 Token을 발급해서 Server로 전달합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;Step 3. 사용자 로그인 처리&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;암호화 된 토큰을 다시 Auth Server에게 전달해주면 Client의 개인정보(동의가 된)를 Server에게 전송해줍니다. Server은 Client의 정보를 이용해 로그인을 처리하고 Client에게 로그인 성공/실패 신호를 전달합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;참고자료&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://velog.io/@hyg8702/OAuth란-OAuth1-vs-OAuth2&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://velog.io/@hyg8702/OAuth란-OAuth1-vs-OAuth2&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.varonis.com/blog/what-is-oauth&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://www.varonis.com/blog/what-is-oauth&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #0070d1; text-align: start;&quot;&gt;&lt;a href=&quot;https://oauth.net/2/&quot;&gt;https://oauth.net/2/&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;</description>
      <category>STUDY</category>
      <category>OAuth</category>
      <category>Oauth2</category>
      <category>OAuth2.0</category>
      <category>Spring</category>
      <category>Spring Boot</category>
      <category>spring security</category>
      <author>상 민</author>
      <guid isPermaLink="true">https://lsmin3388.tistory.com/21</guid>
      <comments>https://lsmin3388.tistory.com/21#entry21comment</comments>
      <pubDate>Mon, 2 Oct 2023 14:37:22 +0900</pubDate>
    </item>
    <item>
      <title>GET IT 해커톤 후기</title>
      <link>https://lsmin3388.tistory.com/20</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;이번에&amp;nbsp;우리&amp;nbsp;멋쟁이&amp;nbsp;사자처럼&amp;nbsp;팀원들과&amp;nbsp;함께&amp;nbsp;GET&amp;nbsp;IT&amp;nbsp;해커톤에&amp;nbsp;참여했습니다.&lt;br /&gt;&lt;br /&gt;아직&amp;nbsp;갓&amp;nbsp;고등학교를&amp;nbsp;졸업한&amp;nbsp;새내기라&amp;nbsp;선배들로만&amp;nbsp;구성된&amp;nbsp;팀을&amp;nbsp;이끌어&amp;nbsp;나가야&amp;nbsp;한다는&amp;nbsp;것이&amp;nbsp;조금&amp;nbsp;두려움이&amp;nbsp;있었지만...&amp;nbsp;그걸&amp;nbsp;조금&amp;nbsp;극복해보고&amp;nbsp;싶은&amp;nbsp;마음에&amp;nbsp;멋쟁이&amp;nbsp;사자처럼&amp;nbsp;공식&amp;nbsp;대회가&amp;nbsp;시작하기&amp;nbsp;전에&amp;nbsp;사전예행연습(?)&amp;nbsp;느낌으로다가&amp;nbsp;GET&amp;nbsp;IT&amp;nbsp;해커톤에&amp;nbsp;참여해&amp;nbsp;봤습니다.&lt;br /&gt;&lt;br /&gt;스타트업이라는&amp;nbsp;드라마에서&amp;nbsp;나온&amp;nbsp;장면인&amp;nbsp;해커톤&amp;nbsp;대회를&amp;nbsp;보고&amp;nbsp;정말로&amp;nbsp;해보고&amp;nbsp;싶다는&amp;nbsp;생각을&amp;nbsp;많이&amp;nbsp;했는데,&amp;nbsp;실제로&amp;nbsp;해보니깐&amp;nbsp;보기와는&amp;nbsp;다르게&amp;nbsp;하루&amp;nbsp;밤새워서&amp;nbsp;코딩을&amp;nbsp;한다는&amp;nbsp;것이&amp;nbsp;정말로&amp;nbsp;끔찍하고&amp;nbsp;힘들더라고요...&amp;nbsp;특히&amp;nbsp;잠&amp;nbsp;오는&amp;nbsp;것보다도&amp;nbsp;몸이&amp;nbsp;너무&amp;nbsp;찝찝하고&amp;nbsp;감기에&amp;nbsp;걸려서&amp;nbsp;기침,&amp;nbsp;인후통,&amp;nbsp;두통&amp;nbsp;등&amp;nbsp;온몸이&amp;nbsp;아프더라고요.&amp;nbsp;하지만&amp;nbsp;저만&amp;nbsp;힘든&amp;nbsp;게&amp;nbsp;아니라는&amp;nbsp;생각에&amp;nbsp;열심히&amp;nbsp;하고자&amp;nbsp;노력했던&amp;nbsp;것&amp;nbsp;같습니다.&lt;br /&gt;&lt;br /&gt;이번&amp;nbsp;대회에서&amp;nbsp;팀원&amp;nbsp;구성이&amp;nbsp;4명으로&amp;nbsp;프론트&amp;nbsp;1명&amp;nbsp;백&amp;nbsp;3명이라&amp;nbsp;가지고&amp;nbsp;우리&amp;nbsp;프론트를&amp;nbsp;맡으신&amp;nbsp;대건님...&amp;nbsp;진짜&amp;nbsp;혼자서&amp;nbsp;그&amp;nbsp;웹사이트&amp;nbsp;구성을&amp;nbsp;다&amp;nbsp;하고&amp;nbsp;완전&amp;nbsp;빡&amp;nbsp;집중&amp;nbsp;모드로&amp;nbsp;진짜...&amp;nbsp;와...&amp;nbsp;엄청&amp;nbsp;고생하셨습니다...&amp;nbsp;그리고&amp;nbsp;우리&amp;nbsp;스프링&amp;nbsp;설계를&amp;nbsp;정말&amp;nbsp;열심히&amp;nbsp;해주신&amp;nbsp;최정식&amp;nbsp;님이랑&amp;nbsp;시험&amp;nbsp;기간&amp;nbsp;직전에&amp;nbsp;참여해&amp;nbsp;주고&amp;nbsp;발표할&amp;nbsp;때도&amp;nbsp;알바까지&amp;nbsp;1시간&amp;nbsp;뒤로&amp;nbsp;당겨서&amp;nbsp;와주신&amp;nbsp;은주연&amp;nbsp;님도&amp;nbsp;정말로&amp;nbsp;고생&amp;nbsp;많았습니다.&amp;nbsp;그리고&amp;nbsp;저&amp;nbsp;자신도&amp;nbsp;정말&amp;nbsp;일정이&amp;nbsp;끝날&amp;nbsp;때까지&amp;nbsp;안&amp;nbsp;자고&amp;nbsp;메인&amp;nbsp;로직&amp;nbsp;구성하거나&amp;nbsp;인공지능,&amp;nbsp;데이터&amp;nbsp;파싱&amp;nbsp;등을&amp;nbsp;만들고...&amp;nbsp;(spring&amp;nbsp;-&amp;nbsp;react&amp;nbsp;사이에서&amp;nbsp;조금&amp;nbsp;이슈가&amp;nbsp;있었지만)&amp;nbsp;발표까지&amp;nbsp;열심히&amp;nbsp;준비한&amp;nbsp;나도&amp;nbsp;대단하고&amp;nbsp;이&amp;nbsp;과정에서&amp;nbsp;많은&amp;nbsp;공부가 되었습니다.&lt;br /&gt;&lt;br /&gt;진짜&amp;nbsp;정말&amp;nbsp;배운&amp;nbsp;게&amp;nbsp;많다고&amp;nbsp;생각한&amp;nbsp;거는&amp;nbsp;마지막&amp;nbsp;발표날인&amp;nbsp;거&amp;nbsp;같습니다.&amp;nbsp;마지막&amp;nbsp;날에&amp;nbsp;실제로&amp;nbsp;창업을&amp;nbsp;하시는&amp;nbsp;두&amp;nbsp;분이&amp;nbsp;오셔서&amp;nbsp;심사를&amp;nbsp;해주시고&amp;nbsp;피드백도&amp;nbsp;해주셨는데&amp;nbsp;저한테&amp;nbsp;해준&amp;nbsp;피드백뿐만&amp;nbsp;아니라&amp;nbsp;다른&amp;nbsp;분들한테&amp;nbsp;해준&amp;nbsp;날카로운&amp;nbsp;말&amp;nbsp;한마디&amp;nbsp;한&amp;nbsp;마디가&amp;nbsp;정말&amp;nbsp;도움이&amp;nbsp;되었습니다.&lt;br /&gt;비즈니스&amp;nbsp;모델에&amp;nbsp;대해서나,&amp;nbsp;이해관계자나&amp;nbsp;창업과&amp;nbsp;장사의&amp;nbsp;차이,&amp;nbsp;문제를&amp;nbsp;해결하는&amp;nbsp;방법&amp;nbsp;등&amp;nbsp;배운&amp;nbsp;것이&amp;nbsp;많고&amp;nbsp;더&amp;nbsp;배우고&amp;nbsp;싶습니다 !&lt;br /&gt;&lt;br /&gt;부족함이&amp;nbsp;많은&amp;nbsp;팀장이지만&amp;nbsp;모두&amp;nbsp;잘&amp;nbsp;따라와&amp;nbsp;주시고&amp;nbsp;그래도&amp;nbsp;나름&amp;nbsp;성공적인(?)&amp;nbsp;발표를&amp;nbsp;끝낼&amp;nbsp;수&amp;nbsp;있어서 엄청 최고였습니다. 앞으로&amp;nbsp;더&amp;nbsp;성장해서 지금보다 더욱 뛰어난 최고의 개발자가&amp;nbsp;되고&amp;nbsp;싶습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;마지막으로 저희 프로젝트 깃헙입니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://github.com/lsmin3388/getitHT&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://github.com/lsmin3388/getitHT&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1685285482512&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;object&quot; data-og-title=&quot;GitHub - lsmin3388/getitHT: GET IT Hackathon&quot; data-og-description=&quot;GET IT Hackathon. Contribute to lsmin3388/getitHT development by creating an account on GitHub.&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/lsmin3388/getitHT&quot; data-og-url=&quot;https://github.com/lsmin3388/getitHT&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bcpz18/hySLDkARBC/E2sowdpLTmFLAb31XIqLXk/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600&quot;&gt;&lt;a href=&quot;https://github.com/lsmin3388/getitHT&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://github.com/lsmin3388/getitHT&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bcpz18/hySLDkARBC/E2sowdpLTmFLAb31XIqLXk/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;GitHub - lsmin3388/getitHT: GET IT Hackathon&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;GET IT Hackathon. Contribute to lsmin3388/getitHT development by creating an account on GitHub.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;github.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;+ fly io 로 인공지능이라고 부르기에는 조금 부족한 api서버를 열었는데 &lt;a style=&quot;color: #000000; text-align: start;&quot; href=&quot;https://alcoapi.fly.dev/&quot;&gt;alcoapi.fly.dev/recommend&lt;/a&gt;로 POST요청 파라미터 넣어서 보내시면 됩니다. (필요할 일은 없겠지만..)&lt;/p&gt;</description>
      <category>STUDY/대학교</category>
      <author>상 민</author>
      <guid isPermaLink="true">https://lsmin3388.tistory.com/20</guid>
      <comments>https://lsmin3388.tistory.com/20#entry20comment</comments>
      <pubDate>Sun, 28 May 2023 23:55:42 +0900</pubDate>
    </item>
    <item>
      <title>실습문제 정답</title>
      <link>https://lsmin3388.tistory.com/19</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;실습문제 정답입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 1이랑 자기자신을 제외하고 소인수를 출력하는 코드를 작성하시오.&lt;/p&gt;
&lt;pre id=&quot;code_1681717207913&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;num = int(input())

for i in range(2, int(num/2) + 1):
    if num % i == 0:
        print(i, end=' ')&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 숫자 여러개를 입력하고 마지막에 0을 입력, 0을 제외하고 최댓값과 최솟값 그리고 평균을 구하시오.&lt;/p&gt;
&lt;pre id=&quot;code_1681717223825&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;num = list(map(int, input().split()))

for i in range(len(num)):
    for j in range(len(num) - i - 1):
        if num[j] &amp;gt; num[j+1]:
            num[j], num[j+1] = num[j+1], num[j]

sum = 0
for i in num:
    sum += i
average = sum / (len(num)-1)

print(num[len(num)-1], num[1], average)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 휘문을 구하는 프로그램을 작성하시오.&lt;/p&gt;
&lt;pre id=&quot;code_1681717258774&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;num = int(input())

while str(num) != str(num)[::-1]:
    num += int(str(num)[::-1])
    
print('휘문:', num)&lt;/code&gt;&lt;/pre&gt;</description>
      <category>STUDY/대학교</category>
      <author>상 민</author>
      <guid isPermaLink="true">https://lsmin3388.tistory.com/19</guid>
      <comments>https://lsmin3388.tistory.com/19#entry19comment</comments>
      <pubDate>Mon, 17 Apr 2023 16:43:26 +0900</pubDate>
    </item>
    <item>
      <title>컴사SW 파이썬 정리본</title>
      <link>https://lsmin3388.tistory.com/18</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;고대의 컴퓨터&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 컴퓨터의 역사는 주판, 계산자, 계산판 등에서 시작&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 가장 오래된 기계적인 아날로그 컴퓨터: &amp;nbsp;Antikythera(고대 그리스)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;소프트웨어 등장&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 직조기 (최초의 프로그램이 가능했음)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 찰스 배비지: 해석기관(총 4가지의 핵심적인 컴포넌트: 중앙처리장치, 메모리, 출력장치, 입력장치)&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; &amp;nbsp;feat. &lt;span style=&quot;text-align: left;&quot;&gt;해석기관은 영국의 수학 교수 찰스 배비지가 고안한 기계적 범용 컴퓨터의 설계이다. 1837년에 처음으로 발표되었으며, 설계는 1871년 그가 죽기 전까지 계속되었다. 해석기관은 경제적, 정치적, 법적 문제로 인해 실제 만들어지지는 않았다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;현대적인 컴퓨터&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(1) 기계보다도 전자장치를 사용해서 계산&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(2) 아날로그가 아닌 디지털 방식&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(3) 내장 프로그래밍 방식&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;전자식 숫자 적분 및 계산기&lt;/b&gt;&lt;span style=&quot;text-align: left;&quot;&gt;(Electronic Numerical Integrator And Computer; ENIAC, 에니악)는 1943년에서 3년에 걸쳐서 1946년 2월 14일에 펜실베이니아 대학의 모클리와 에커트가 제작한 전자 컴퓨터이다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;현대 컴퓨터의 프로그램 실행 방법&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;1. &lt;b&gt;Fetch&lt;/b&gt; : CPU의 레지스터로&amp;nbsp;명령어를 가져온다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;2. &lt;b&gt;Decode&lt;/b&gt; : 가져온 명령어를 컨트롤 유닛에서 해석한다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;3. &lt;b&gt;Execution&lt;/b&gt; : 해석된 명령어대로 ALU에서 CPU가 실행한다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;ALU&amp;nbsp;&lt;/b&gt;: CPU에서 논리연산이나 산술연산과 같은 실제 연산을 담당하는 부분&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;컨트롤 유닛&lt;/b&gt;&amp;nbsp;: ALU는 명령어 자체 이해 및 수행 X, &amp;nbsp;명령어를 해석 -&amp;gt; &amp;nbsp;ALU에게 알려줌&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;레지스터&lt;/b&gt;&amp;nbsp;: CPU에 명령어가 왔지만, ALU와 컨트롤유닛이 다른 작업 중일 수 있음. 이때 임시로&amp;nbsp;데이터를 저장하는 CPU내의 작은 메모리(CPU에 여러 개 존재)&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Bus Interface(Adapter)&amp;nbsp;&lt;/b&gt;: I/O Bus의 통신을 가능하게 해주는 장치,&amp;nbsp;CPU가 데이터를 버스에 주거나 버스로부터 데이터를 받고 오게 해 줌.&amp;nbsp;(통신방식에 맞게 데이터의 입출력을 도와줌)&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&quot;하드웨어&quot; 때문에 2진수 사용&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;- 전자공학 관점에서 볼 때, 10개의 전압레벨보다 2개의 전압레벨을 구별하는 회로를 설계하는 것이 더욱 쉬움&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;- 컴퓨터 내부에 데이터를 저장하려면 10진수 보다 2진수가 더욱 효율적&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;bit(binary digit)&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;- 1 or 0&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;- 8 bit = 1 byte&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;컴퓨팅적 사고를 통한 문제해결&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 1단계: 컴퓨팅적 사고기법&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 2단계: 컴퓨터처럼 생각하기&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 3단계: 컴퓨터를 사용한 문제 해결&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;컴퓨팅적 사고&lt;/b&gt;: 문제를 해결할 때, 필요한 자료를 추출하고 분석하고 일정한 경향을 파악해 컴퓨터로 문제를 해결하기 위한 절차를 만드는 것&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;컴퓨팅적 사고의 6가지 개념&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;(1) &lt;b&gt;논리&lt;/b&gt;: 논리적으로 사고하는 것&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;(2) &lt;b&gt;분해&lt;/b&gt;: 복잡한 문제를 좀 더 작고 처리가 가능하도록 부분 문제로 분해&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; (2-1) 분석: 주어진 문제를 작은 부분으로 어떻게 분해할 것인지에 초첨을 맞추는 과정&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; (2-2) 합성: 부분을 모아서 주어진 문제에 대한 해답을 만드는 과정&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; (2-3) 병렬처리: 작은 문제들을 해결하는데 다중작업을 사용하는 것&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;(3) &lt;b&gt;패턴인식&lt;/b&gt;: 부분 문제들 중 유사성(패턴) 탐색&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; (3-1) 중요성: 패턴 발견-&amp;gt; 문제해결을 도와줌 &amp;amp;&amp;amp; 동일한 문제 발생 -&amp;gt; 동일한 해결책 사용가능&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;(4) &lt;b&gt;추상화&lt;/b&gt;: 오직 중요한 정보에만 집중, 관련 세부사항은 무시, 복잡한 시스템의 구체적인 예로부터 공통적인 특성을 추려내 일반적인 개념을 형성&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; (4-1) 데이터를 목적에 맞게 사용: 자료구조 사용&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; (4-2) 눈에 띄는 특징을 찾아서 표현: 일반화, 공식화, 모델화, 함수 만들기&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;(5) &lt;b&gt;알고리즘&lt;/b&gt;:&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; (5-1) 분할된 작은 문제의 해법을 찾고, 이러한 해법을 모아서 알고리즘으로 만드는 작업&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; (5-2) 알고리즘을 작성할 때 자세하게 컴퓨터의 수준에서 생각&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;알고리즘의 요구사항&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; - 명령은 순차적으로 잘 정렬되어야 함&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; - 명령에는 모호함이 없어야 함&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; - 실행 가능&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; - 요구되는 결과물을 생산&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; - 명령에는 끝이 있어야 함&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;알고리즘의 조건&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; - &lt;b&gt;입력&lt;/b&gt;: 외부에서 제공하는 0개 이상의 입력 존재&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; - &lt;b&gt;출력&lt;/b&gt;: 1개 이상의 출력 존재&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; - &lt;b&gt;명백성&lt;/b&gt;: 각 명령어의 의미가 모호하지 않고 명확할 것&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; - &lt;b&gt;유한성&lt;/b&gt;: 무한하지 않고 한정된 명령어가 실행된 후에는 반드시 종료될 것&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; - &lt;b&gt;유효성&lt;/b&gt;: 각 명령어는 실행가능하며 유한한 시간 안에 수행할 정도로 단순할 것&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; - 올바른 순서 정의&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;알고리즘을 구성하는 핵심요소&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; - 처리&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; - 순서&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; - 결정&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; - 반복&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;알고리즘을 기술하는 방식&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &lt;b&gt;① 순서도(flowchart)&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; - 알고리즘 작업 순서를 그림으로 표현&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; - 단순한 기하학적 기호 사용&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2211&quot; data-origin-height=&quot;905&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dGSlVZ/btsagr9IzCd/KIDOgV6tbfKNhZpnKkGFK0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dGSlVZ/btsagr9IzCd/KIDOgV6tbfKNhZpnKkGFK0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dGSlVZ/btsagr9IzCd/KIDOgV6tbfKNhZpnKkGFK0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdGSlVZ%2Fbtsagr9IzCd%2FKIDOgV6tbfKNhZpnKkGFK0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2211&quot; height=&quot;905&quot; data-origin-width=&quot;2211&quot; data-origin-height=&quot;905&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &lt;b&gt;② 의사코드(수도코드)&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;- 기존 프로그래밍 언어와 유사한 형태&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;- 프로그래밍 언어와 상관없이 독립적 작성가능&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;- 자연어보다는 더 체계적이고 프로그래밍 언어보단 덜 엄격한 언어&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;- 주로 알고리즘의 표현에 사용, 알고리즘을 기술하는데 선호되는 표기법&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;- 사전 정의된 키워드를 숙지하고 있어야 함&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;(6) &lt;b&gt;평가&lt;/b&gt;: 개발된 알고리즘의 정확도나 효율성을 평가&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; - 처리속도나 정확도 평가&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; - 알고리즘 이해가 쉬운가(가독성)&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; - 알고리즘의 모든 면을 해결했는가&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; - 가능한 자원을 최대한 활용해 문제를 해결했는가&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; - 주어진 설계 기준을 충족했는가&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;컴퓨팅 사고가 아닌 경우&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; - 소프트웨어를 사용하는 방법을 배우는 것&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; - &quot;프로그래밍&quot; 자체를 배우는 것&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;프로그래밍 언어&lt;/b&gt;: 프로그램을 작성하는 도구의 일종&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;컴파일 언어&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; - 모든 명령을 일괄 번역, 실행&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; - 속도 빠름, 구조 복잡&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;인터프리터 언어&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; - 명령 -&amp;gt; 즉시 번역&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; - 속도 느림, 단순하고 쉬움&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;파이썬&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; - 1991년 귀도 반 로섬 이 개발&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; - 현재는 2.x와 3.x 세대 공존&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; - 여러 가지 변형 존재&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;파이썬의 특징&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; - (매우) 고급 언어(추성화 정도가 매우 높음) -&amp;gt; no static typing language, 최적화 용이 x (성능저하 발생)&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; - no static typing 언어(묵시적 타입 언어 &amp;nbsp; (&amp;lt;-&amp;gt; 명시적 타입 언어, static typing language))&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; - 스크립트 언어 -&amp;gt; 쉽고 기능 많고 특정 용도가 있는 경우가 많음 -&amp;gt; 성능이 중요한 큰 프로그램을 만들 때는 잘 쓰이지 않음&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; - C언어와의 접착성이 좋아 혼합 프로그래밍 가능&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; - 범용적으로 사용하는 고수준 언어, 읽기 쉽게 설계&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; - 객체지향적, 클래스 지원&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; - 쉬움&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; - 호환성 좋음&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; - 비용 x&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; - 기본패키지로도 많은 걸 할 수 있음&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; - 모든 컴퓨터에 설치 x, 계산이 많을 경우 속도가 느림&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; -&amp;gt; 알고리즘을 단계적으로 개선, C로 확장해 개선, 다른 언어로 개발(C, C++, Java 또는 파이썬과 비슷한 Go, 러스트 등)&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;파이썬 실행 모드&lt;/b&gt;: 대화식 모드(Interactive Mode) , 스크립트 모드(Script Mode)&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;선형탐색 알고리즘&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; - 앞에서부터 순차적으로 탐색&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; - 숫자들이 정렬되어 있을 필요 X&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;이진탐색 알고리즘&lt;/b&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; - 숫자들의 리스트를 반으로 나눠가면서 탐색&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; - 숫자들이 크기순으로 정렬되어 있어야 함&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; - 총 시행 횟수의 최댓값 k에 대하여 k=log2N이다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; - 여기서 k는 탐색 횟수로 N에 따른 시행 횟수는 logN. 즉 시간 복잡도는 big-O표기법에 따라 O(logN)으로 나타냄.&lt;span style=&quot;background-color: #121212; color: #ececec; text-align: start;&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;해시탐색 알고리즘&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; - &lt;span style=&quot;text-align: start;&quot;&gt;값과 index를 미리 연결해 둠으로써 짧은 시간에 탐색할 수 있는 알고리즘&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; - 숫자들을 특정 알고리즘에 의해 그룹으로 나누어져 저장되어 있음&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; - 해당하는 숫자가 속한 그룹을 순차적으로 비교해 원하는 숫자를 찾음&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;버블정렬&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;sol 1)&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1681630372360&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;l = [5, 7, 1, 3, 9, 2, 6, 8, 4]
k = 0


while k+1 &amp;lt; len(l):
    if l[k] &amp;gt; l[k+1]:
        l[k], l[k+1] = l[k+1], l[k]
        k = 0
        continue
    k += 1

print(l)&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;설명&lt;/b&gt;: 자리를 바꿀 필요가 있는 인덱스를 발견할 때마다 자리 바꾼 후 다시 처음부터 탐색한다. 처음부터 끝까지 즉 배열의 크기가 n이라고 했을 때 최대로 탐색해야 하는 횟수는 n-1번이고, 해당 알고리즘은 0부터 시작하므로 k가 7일 때 마지막으로 확인하며, k가 7일 때 자리를 바꿀 필요가 없다고 생각되면 k가 8이 되며 반복문을 마무리한다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;sol2)&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1681630514121&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;l = [5, 7, 1, 3, 9, 2, 6, 8, 4]

for i in range(len(l)):
    for j in range(len(l) - 1 - i):
        if l[j] &amp;gt; l[j+1]:
            l[j], l[j+1] = l[j+1], l[j]

print(l)&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;설명&lt;/b&gt;: 처음부터 끝까지 큰 수를 오른쪽 작은 수를 왼쪽으로 나열했을 때, 한번 시행 시 가장 큰 수는 맨 오른쪽에 온다. 이를 이용해 처음에는 (배열의 크기)-1만큼 자리를 바꾸고, 다음 시행에서는 맨 오른쪽에 있는 수는 어차피 가장 큰 수이기 때문에 확인할 필요가 없으므로 (배열의 크기)-2만큼 자리를 바꾼다.&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;피보나치수열&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;sol1) 재귀함수 이용&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1681632979800&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import time as t
k = 35

ssv = t.time()

def fibo(n):
    return fibo(n-2) + fibo(n-1) if n &amp;gt;= 2 else n

print(f&quot;함숫값: {fibo(k)}&quot;)
print(f&quot;걸린시간: {t.time() - ssv:.5f}&quot;)


&amp;lt;result&amp;gt;
함숫값: 9227465
걸린시간: 2.12638&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;설명&lt;/b&gt;: 다음 소스는 아주 전형적인 방법으로, 피보나치수열을 재귀함수로 나타낸 것이다. 이 경우 정말로 많은 경우의 수를 계산해야 하기 때문에 코드가 정말로 비효율적이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;sol2) 재귀함수 이용 X&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1681633007813&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import time as t
k = 35

ssv = t.time()

def fibo(n):
    if n &amp;lt; 2: return n

    a, b = 0, 1
    for _ in range(n-1):
        a, b = b, a+b

    return b

print(f&quot;함숫값: {fibo(k)}&quot;)
print(f&quot;걸린시간: {t.time() - ssv:.5f}&quot;)


&amp;lt;result&amp;gt;
함숫값: 9227465
걸린시간: 0.00004&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;설명&lt;/b&gt;: 다음은 재귀함수를 이용하지 않고 반복문을 이용해 피보나치수열 정의 그대로 이용해 함숫값을 구하는 것이다. 변수 a, b를 각각 피보나치 함수 F에 대하여 F(0)과 F(1)을 뜻한다. 한번 반복이 진행됨에 따라 a는 F(0)에서 F(1)로, b는 F(0)과 F(1)을 합친 F(2)를 갖는다. 이 과정을 반복함으로써 피보나치수열을 구현했다. 해당 방법은 재귀함수를 이용하는 것보다 계산이 정말로 최소화되었기 때문에 프로그램 작동시간이 가장 짧다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;sol3) 재귀함수 + 딕셔너리 저장&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1681633048658&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import time as t
k = 35

def fibo(n, memory = dict()):
    if n == 1 or n == 2:
        return 1
    if n in memory:
        return memory[n]
    
    memory[n] = fibo(n-1, memory) + fibo(n-2, memory)
    
    return memory[n]


print(f&quot;함숫값: {fibo(k)}&quot;)
print(f&quot;걸린시간: {t.time() - ssv:.5f}&quot;)


&amp;lt;result&amp;gt;
함숫값: 9227465
걸린시간: 0.00006&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;설명&lt;/b&gt;: 다음은 교수님이 칭하신 &quot;메모라이제이션(?)&quot;을 이용한 방법이다. memory = dict()는 디폴트 인자로 해당 파라미터가 매개변수로 전달받지 않을 경우 비어있는 딕셔너리 형태로 전달받는다. 두 번째 조건문에서 n값의 피보나치 함숫값이 있는지 없는지 판단하고 없을 경우 그 값을 구하기 위해 재귀함수를 계속 돌린다. 즉 사실상 n부터 가감되면서 구해지는 느낌으로 보일지라도 사실은 n이 3일 때부터 딕셔너리가 차곡차곡 쌓이게 되며, 한 번 쌓인 값들은 저장되기 때문에 쓸데없는 계산 과정을 생략한다. 즉 속도가 매우 향상되어 sol2와 거의 비슷한 속도가 나타남을 알 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>CODING/Python</category>
      <author>상 민</author>
      <guid isPermaLink="true">https://lsmin3388.tistory.com/18</guid>
      <comments>https://lsmin3388.tistory.com/18#entry18comment</comments>
      <pubDate>Sun, 16 Apr 2023 19:04:24 +0900</pubDate>
    </item>
    <item>
      <title>[컴퓨터 공학/소프트웨어/인공지능 관련 생기부 주제 추천] Python 딥러닝을 이용해 연예인 닮은 꼴 분석 프로그램 보고서</title>
      <link>https://lsmin3388.tistory.com/17</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;text-align: start;&quot;&gt;안녕하세요. 이번에는 제가 고등학교 생기부를 만들고, 특기자 전형을 준비하면서 직접 작성한 보고서입니다. 해당 내용을 참고하시든 사용하시든&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;text-align: start;&quot;&gt;상관없으니 자유롭게 사용해 주세요. 보고서 내용만 첨부하겠습니다.&lt;/span&gt;&lt;span style=&quot;text-align: start;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;text-align: start;&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/6kpjQ/btr4G80jnO4/niMtKz5aeWvvjy1qKKt1rk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/6kpjQ/btr4G80jnO4/niMtKz5aeWvvjy1qKKt1rk/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;992&quot; data-origin-height=&quot;1403&quot; data-filename=&quot;edited_edited_edited_edited_개인활동실적004.png&quot; data-widthpercent=&quot;50&quot; style=&quot;width: 49.418605%; margin-right: 10px;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/6kpjQ/btr4G80jnO4/niMtKz5aeWvvjy1qKKt1rk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F6kpjQ%2Fbtr4G80jnO4%2FniMtKz5aeWvvjy1qKKt1rk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;992&quot; height=&quot;1403&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dwLKN3/btr4LFcrfg3/daluo4jhvxgyk8mJIxViU1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dwLKN3/btr4LFcrfg3/daluo4jhvxgyk8mJIxViU1/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;992&quot; data-origin-height=&quot;1403&quot; data-filename=&quot;edited_edited_edited_edited_개인활동실적005.png&quot; data-widthpercent=&quot;50&quot; style=&quot;width: 49.418605%;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dwLKN3/btr4LFcrfg3/daluo4jhvxgyk8mJIxViU1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdwLKN3%2Fbtr4LFcrfg3%2Fdaluo4jhvxgyk8mJIxViU1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;992&quot; height=&quot;1403&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;caret-color: #1c1c26;&quot;&gt;개발 동기&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;caret-color: #1c1c26;&quot;&gt;'Find&amp;nbsp;similar&amp;nbsp;celebrities.py&amp;rsquo; 프로그램은&amp;nbsp;사용자가&amp;nbsp;입력한&amp;nbsp;얼굴&amp;nbsp;이미지와&amp;nbsp;가장&amp;nbsp;닮은&amp;nbsp;연예인을&amp;nbsp;찾아주는&amp;nbsp;프로그램입니다.&amp;nbsp;SNS에서&amp;nbsp;퍼지고&amp;nbsp;있는&amp;nbsp;&amp;rsquo;닮은&amp;nbsp;연예인&amp;nbsp;찾기&amp;nbsp;필터&amp;lsquo;에&amp;nbsp;관심이&amp;nbsp;생겨&amp;nbsp;탐구하였습니다.&amp;nbsp;이&amp;nbsp;과정에서&amp;nbsp;해당&amp;nbsp;필터는&amp;nbsp;인공지능&amp;nbsp;기술을&amp;nbsp;사용하지&amp;nbsp;않고,&amp;nbsp;인간의&amp;nbsp;심리적&amp;nbsp;특성인&amp;nbsp;&amp;rsquo;성급한&amp;nbsp;일반화의&amp;nbsp;오류&amp;lsquo;를&amp;nbsp;이용한&amp;nbsp;것이라는&amp;nbsp;점을&amp;nbsp;알게&amp;nbsp;되었습니다.&amp;nbsp;그래서&amp;nbsp;저는&amp;nbsp;이를&amp;nbsp;좀&amp;nbsp;더&amp;nbsp;정확하고&amp;nbsp;근거&amp;nbsp;있는&amp;nbsp;결과를&amp;nbsp;도출해내고&amp;nbsp;싶어&amp;nbsp;CNN을&amp;nbsp;학습하고&amp;nbsp;이를&amp;nbsp;적용해&amp;nbsp;직접&amp;nbsp;구현해 봤습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;caret-color: #1c1c26;&quot;&gt;개발 과정&lt;/span&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;caret-color: #1c1c26;&quot;&gt;데이터 수집&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;caret-color: #1c1c26;&quot;&gt;데이터&amp;nbsp;학습을&amp;nbsp;시키기&amp;nbsp;위해&amp;nbsp;가장&amp;nbsp;먼저&amp;nbsp;해야&amp;nbsp;할&amp;nbsp;작업은&amp;nbsp;데이터&amp;nbsp;수집입니다.&amp;nbsp;연예인의&amp;nbsp;얼굴을&amp;nbsp;수집하기&amp;nbsp;위해&amp;nbsp;처음에는&amp;nbsp;구글의&amp;nbsp;검색엔진을&amp;nbsp;이용했습니다.&amp;nbsp;하지만&amp;nbsp;구글의&amp;nbsp;검색엔진은&amp;nbsp;검색한&amp;nbsp;내용&amp;nbsp;외의&amp;nbsp;사진이&amp;nbsp;많이&amp;nbsp;나와서&amp;nbsp;원하는&amp;nbsp;연예인&amp;nbsp;사진만&amp;nbsp;수집하기는&amp;nbsp;쉽지&amp;nbsp;않았습니다.&amp;nbsp;이에&amp;nbsp;저는&amp;nbsp;정확도가&amp;nbsp;높은&amp;nbsp;네이버&amp;nbsp;검색엔진을&amp;nbsp;이용했고,&amp;nbsp;selenium을&amp;nbsp;이용해&amp;nbsp;이미지&amp;nbsp;다운을&amp;nbsp;위한&amp;nbsp;웹&amp;nbsp;크롤링을&amp;nbsp;성공적으로&amp;nbsp;할&amp;nbsp;수&amp;nbsp;있었습니다.&amp;nbsp;서로&amp;nbsp;다른&amp;nbsp;연예인&amp;nbsp;이름의&amp;nbsp;폴더를&amp;nbsp;20개&amp;nbsp;만든&amp;nbsp;후&amp;nbsp;해당&amp;nbsp;연예인의&amp;nbsp;폴더에&amp;nbsp;각각&amp;nbsp;250장씩&amp;nbsp;다운로드가&amp;nbsp;되도록&amp;nbsp;했습니다.&amp;nbsp;인터넷을&amp;nbsp;통해&amp;nbsp;수집한&amp;nbsp;데이터는&amp;nbsp;얼굴이&amp;nbsp;살짝&amp;nbsp;돌아가기만&amp;nbsp;하더라도&amp;nbsp;다른&amp;nbsp;사람으로&amp;nbsp;취급하기&amp;nbsp;때문에&amp;nbsp;다시&amp;nbsp;한번&amp;nbsp;분류작업을&amp;nbsp;거치고자&amp;nbsp;했습니다.&amp;nbsp;Opencv의&amp;nbsp;face_cascade를&amp;nbsp;이용하여&amp;nbsp;모든&amp;nbsp;이미지에&amp;nbsp;얼굴을&amp;nbsp;인식&amp;nbsp;후&amp;nbsp;얼굴&amp;nbsp;영역만&amp;nbsp;자른&amp;nbsp;후&amp;nbsp;얼굴만&amp;nbsp;남은&amp;nbsp;이미지는&amp;nbsp;수작업을&amp;nbsp;통해&amp;nbsp;불필요한&amp;nbsp;이미지를&amp;nbsp;제거하였고&amp;nbsp;총&amp;nbsp;한&amp;nbsp;연예인당&amp;nbsp;200장의&amp;nbsp;얼굴&amp;nbsp;자료를&amp;nbsp;수집했습니다.&amp;nbsp;하지만&amp;nbsp;200장은&amp;nbsp;터무니없는&amp;nbsp;터무니없이&amp;nbsp;부족한&amp;nbsp;양이라고&amp;nbsp;생각했기에&amp;nbsp;이미지를&amp;nbsp;좌우&amp;nbsp;반전,&amp;nbsp;이미지&amp;nbsp;기울이기,&amp;nbsp;밝기&amp;nbsp;조절,&amp;nbsp;노이즈&amp;nbsp;생성을&amp;nbsp;함으로써&amp;nbsp;연예인별로&amp;nbsp;약&amp;nbsp;1000장의&amp;nbsp;데이터를&amp;nbsp;만들&amp;nbsp;수&amp;nbsp;있었습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;데이터 학습&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock floatRight&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;edited_edited_edited_blob&quot; data-origin-width=&quot;852&quot; data-origin-height=&quot;874&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dfJ4t1/btr4LG3uIx1/YquKPs6Bba2yKfBcNttfY1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dfJ4t1/btr4LG3uIx1/YquKPs6Bba2yKfBcNttfY1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dfJ4t1/btr4LG3uIx1/YquKPs6Bba2yKfBcNttfY1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdfJ4t1%2Fbtr4LG3uIx1%2FYquKPs6Bba2yKfBcNttfY1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;220&quot; height=&quot;226&quot; data-filename=&quot;edited_edited_edited_blob&quot; data-origin-width=&quot;852&quot; data-origin-height=&quot;874&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;수집한&amp;nbsp;1000장의&amp;nbsp;이미지를&amp;nbsp;128x128의&amp;nbsp;이미지로&amp;nbsp;전처리합니다.&amp;nbsp;ImageDataGenerator을&amp;nbsp;이용하여&amp;nbsp;target_size는&amp;nbsp;이미지의&amp;nbsp;크기만큼&amp;nbsp;(128,&amp;nbsp;128)로&amp;nbsp;설정했고,&amp;nbsp;배치&amp;nbsp;사이즈는&amp;nbsp;100으로&amp;nbsp;함으로써&amp;nbsp;10번의&amp;nbsp;배치를&amp;nbsp;수행하면&amp;nbsp;하나의&amp;nbsp;epoch가&amp;nbsp;수행되도록&amp;nbsp;했습니다.&amp;nbsp;class_mode는&amp;nbsp;다중&amp;nbsp;클래스&amp;nbsp;분류이기&amp;nbsp;때문에&amp;nbsp;categorical로&amp;nbsp;지정했습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;caret-color: #1c1c26;&quot;&gt;CNN 모델 구성&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;edited_edited_edited_edited_스크린샷 2023-03-19 오후 2.36.42.png&quot; data-origin-width=&quot;2210&quot; data-origin-height=&quot;326&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/doUhyN/btr4FnpJDdv/E3cpkmos21ksLKTKlv9kk0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/doUhyN/btr4FnpJDdv/E3cpkmos21ksLKTKlv9kk0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/doUhyN/btr4FnpJDdv/E3cpkmos21ksLKTKlv9kk0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdoUhyN%2Fbtr4FnpJDdv%2FE3cpkmos21ksLKTKlv9kk0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2210&quot; height=&quot;326&quot; data-filename=&quot;edited_edited_edited_edited_스크린샷 2023-03-19 오후 2.36.42.png&quot; data-origin-width=&quot;2210&quot; data-origin-height=&quot;326&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이미지를&amp;nbsp;전처리하는&amp;nbsp;과정에서&amp;nbsp;모든&amp;nbsp;이미지를&amp;nbsp;128x128&amp;nbsp;사이즈로&amp;nbsp;설정했기&amp;nbsp;때문에&amp;nbsp;1st&amp;nbsp;Convolution&amp;nbsp;Layer에서는&amp;nbsp;input_shape의&amp;nbsp;값은&amp;nbsp;(128,&amp;nbsp;128,&amp;nbsp;3)&amp;nbsp;(채널&amp;nbsp;3개),&amp;nbsp;필터의&amp;nbsp;크기는&amp;nbsp;3x3&amp;nbsp;크기의&amp;nbsp;32개로&amp;nbsp;설정했습니다.&amp;nbsp;이후&amp;nbsp;2nd&amp;nbsp;Convolution&amp;nbsp;Layer&amp;nbsp;안에서&amp;nbsp;3x3&amp;nbsp;크기의&amp;nbsp;64개&amp;nbsp;필터를&amp;nbsp;더&amp;nbsp;추가하고,&amp;nbsp;풀&amp;nbsp;사이즈가&amp;nbsp;2x2인&amp;nbsp;MaxPooling&amp;nbsp;Layer은&amp;nbsp;추가합니다.&amp;nbsp;풀&amp;nbsp;사이즈가&amp;nbsp;2x2이므로&amp;nbsp;stride가&amp;nbsp;2일만큼&amp;nbsp;124x124&amp;nbsp;이미지에서&amp;nbsp;최댓값&amp;nbsp;데이터를&amp;nbsp;뽑아오므로&amp;nbsp;output은&amp;nbsp;62x62&amp;nbsp;크기로&amp;nbsp;출력되고,&amp;nbsp;채널의&amp;nbsp;두께에는&amp;nbsp;영향이&amp;nbsp;없으므로&amp;nbsp;그대로&amp;nbsp;64개가&amp;nbsp;출력됩니다.&amp;nbsp;다음으로는&amp;nbsp;overfitting(과적합)을&amp;nbsp;방지하기&amp;nbsp;위한&amp;nbsp;작업&amp;nbsp;dropout&amp;nbsp;작업을&amp;nbsp;거칩니다.&amp;nbsp;이&amp;nbsp;작업이&amp;nbsp;완료되면&amp;nbsp;지금까지&amp;nbsp;추출한&amp;nbsp;특징들을&amp;nbsp;신경망의&amp;nbsp;각&amp;nbsp;층에&amp;nbsp;전달하고자&amp;nbsp;Flatten&amp;nbsp;Layer를&amp;nbsp;거칩니다.&amp;nbsp;마지막으로&amp;nbsp;모델의&amp;nbsp;프레임을&amp;nbsp;설정함으로써&amp;nbsp;모델을&amp;nbsp;완성했습니다.&amp;nbsp;모델을&amp;nbsp;학습하고자&amp;nbsp;손실함수를&amp;nbsp;categorical_crossentropy로&amp;nbsp;설정하고&amp;nbsp;경사하강법&amp;nbsp;알고리즘&amp;nbsp;중&amp;nbsp;하나인&amp;nbsp;adam,&amp;nbsp;그리고&amp;nbsp;분류&amp;nbsp;문제에서&amp;nbsp;일반적으로&amp;nbsp;사용되는&amp;nbsp;accuracy로&amp;nbsp;설정했고,&amp;nbsp;fit_generator를&amp;nbsp;이용해&amp;nbsp;모델을&amp;nbsp;학습시켰습니다.&amp;nbsp;학습&amp;nbsp;후&amp;nbsp;모델을&amp;nbsp;평가해 보니&amp;nbsp;약&amp;nbsp;96%를&amp;nbsp;얻을&amp;nbsp;수&amp;nbsp;있었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;caret-color: #1c1c26;&quot;&gt;모델 사용하기&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock floatRight&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;edited_edited_edited_edited_스크린샷 2023-03-19 오후 2.37.32.png&quot; data-origin-width=&quot;1324&quot; data-origin-height=&quot;530&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/2HCd9/btr4JMirHny/bbqNQCMJse1u9tJBms5NF1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/2HCd9/btr4JMirHny/bbqNQCMJse1u9tJBms5NF1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/2HCd9/btr4JMirHny/bbqNQCMJse1u9tJBms5NF1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F2HCd9%2Fbtr4JMirHny%2FbbqNQCMJse1u9tJBms5NF1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;383&quot; height=&quot;153&quot; data-filename=&quot;edited_edited_edited_edited_스크린샷 2023-03-19 오후 2.37.32.png&quot; data-origin-width=&quot;1324&quot; data-origin-height=&quot;530&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;text-align: start;&quot;&gt;마지막으로&amp;nbsp;학습한&amp;nbsp;모델을&amp;nbsp;바탕으로&amp;nbsp;사용자가&amp;nbsp;지정한&amp;nbsp;이미지를&amp;nbsp;이용해&amp;nbsp;가장&amp;nbsp;닮은&amp;nbsp;연예인을&amp;nbsp;구하는&amp;nbsp;작업입니다.&amp;nbsp;사용자가&amp;nbsp;지정한&amp;nbsp;이미지를&amp;nbsp;가져와서&amp;nbsp;①-데이터수집에서&amp;nbsp;사용한&amp;nbsp;얼굴&amp;nbsp;인식방법을&amp;nbsp;똑같이&amp;nbsp;적용하여&amp;nbsp;얼굴을&amp;nbsp;가져옵니다.&amp;nbsp;인식된&amp;nbsp;얼굴을&amp;nbsp;데이터에&amp;nbsp;있는&amp;nbsp;이미지와&amp;nbsp;똑같은&amp;nbsp;방식으로&amp;nbsp;전처리&amp;nbsp;작업을&amp;nbsp;거칩니다.&amp;nbsp;그&amp;nbsp;후&amp;nbsp;predict를&amp;nbsp;이용하여&amp;nbsp;어느&amp;nbsp;얼굴과&amp;nbsp;가장&amp;nbsp;유사한지&amp;nbsp;결과를&amp;nbsp;출력합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;caret-color: #1c1c26;&quot;&gt;개발을 마치고&amp;hellip;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;caret-color: #1c1c26;&quot;&gt;이번&amp;nbsp;활동에서&amp;nbsp;저는&amp;nbsp;CNN에&amp;nbsp;대한&amp;nbsp;전반적인&amp;nbsp;이해를&amp;nbsp;할&amp;nbsp;수&amp;nbsp;있었고&amp;nbsp;이미지&amp;nbsp;데이터에&amp;nbsp;대한&amp;nbsp;전처리&amp;nbsp;등을&amp;nbsp;공부하게&amp;nbsp;된&amp;nbsp;계기가&amp;nbsp;되었습니다.&amp;nbsp;모델의&amp;nbsp;예측결과는&amp;nbsp;생각보다&amp;nbsp;높게&amp;nbsp;나왔지만&amp;nbsp;실제로&amp;nbsp;프로그램을&amp;nbsp;돌리면&amp;nbsp;이게&amp;nbsp;맞는지&amp;nbsp;싶을&amp;nbsp;정도로&amp;nbsp;가끔&amp;nbsp;엉뚱한&amp;nbsp;결과가&amp;nbsp;나오곤&amp;nbsp;했습니다.&amp;nbsp;데이터과학과&amp;nbsp;머신러닝&amp;nbsp;수업&amp;nbsp;시간에는&amp;nbsp;CNN뿐만&amp;nbsp;아니라&amp;nbsp;DNN,&amp;nbsp;ANN&amp;nbsp;등의&amp;nbsp;딥러닝&amp;nbsp;분야에&amp;nbsp;대해서도&amp;nbsp;학습했습니다.&amp;nbsp;개인적으로&amp;nbsp;CNN이&amp;nbsp;이미지를&amp;nbsp;이용하여&amp;nbsp;시각적인&amp;nbsp;변화를&amp;nbsp;볼&amp;nbsp;수&amp;nbsp;있다는&amp;nbsp;점에서&amp;nbsp;가장&amp;nbsp;마음에&amp;nbsp;들었고,&amp;nbsp;이를&amp;nbsp;계기로&amp;nbsp;앞으로&amp;nbsp;딥러닝에&amp;nbsp;대한&amp;nbsp;더욱&amp;nbsp;깊은&amp;nbsp;공부를&amp;nbsp;해보고&amp;nbsp;싶은&amp;nbsp;생각을&amp;nbsp;가졌습니다.&lt;/span&gt;&lt;/p&gt;</description>
      <category>CODING/Python</category>
      <author>상 민</author>
      <guid isPermaLink="true">https://lsmin3388.tistory.com/17</guid>
      <comments>https://lsmin3388.tistory.com/17#entry17comment</comments>
      <pubDate>Sun, 19 Mar 2023 14:56:21 +0900</pubDate>
    </item>
    <item>
      <title>[컴퓨터 공학/소프트웨어/인공지능 관련 자소서 예시] 2023 입시 경희대 KSW 특기자 전형 서류 1차 합격 자소서</title>
      <link>https://lsmin3388.tistory.com/16</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;2차에서 떨어졌지만 1차는 통과했는 자소서입니다. 작성은 제가 했고, 첨삭은 학교 선생님을 통해 했습니다. 아마 2024 입시부터는 자기소개서가 폐지된 걸로 알고 있지만, 꼭 대학교 입시가 아니더라도 필요하거나 참고할 내용이 있으시면 참고하셔도 좋습니다. 그대로 사용하셔서 생기는 불이익은 책임지지 않습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;1.&amp;nbsp;고등학교&amp;nbsp;재학&amp;nbsp;기간&amp;nbsp;중&amp;nbsp;자신의&amp;nbsp;진로와&amp;nbsp;관련하여&amp;nbsp;어떤&amp;nbsp;노력을&amp;nbsp;해왔는지&amp;nbsp;본인에게&amp;nbsp;의미&amp;nbsp;있는&amp;nbsp;학습&amp;nbsp;경험과&amp;nbsp;교내&amp;nbsp;활동을&amp;nbsp;중심으로&amp;nbsp;기술해&amp;nbsp;주시기&amp;nbsp;바랍니다.(띄어쓰기&amp;nbsp;포함&amp;nbsp;1,500자&amp;nbsp;이내)&amp;nbsp;*검정고시&amp;nbsp;출신자는&amp;nbsp;중학교&amp;nbsp;졸업&amp;nbsp;후&amp;nbsp;고등학교&amp;nbsp;재학&amp;nbsp;기간에&amp;nbsp;준하는&amp;nbsp;기간의&amp;nbsp;경험&amp;nbsp;기술&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;양자컴퓨터에&amp;nbsp;관한&amp;nbsp;탐구에서&amp;nbsp;RSA암호를&amp;nbsp;접해&amp;nbsp;RSA암호의&amp;nbsp;뛰어난&amp;nbsp;보안성에&amp;nbsp;대해&amp;nbsp;호기심이&amp;nbsp;생겨&amp;nbsp;탐구하였고,&amp;nbsp;이&amp;nbsp;암호체계는&amp;nbsp;큰&amp;nbsp;숫자를&amp;nbsp;소인수분해하기&amp;nbsp;어렵다는&amp;nbsp;특징을&amp;nbsp;이용한&amp;nbsp;것임을&amp;nbsp;알게&amp;nbsp;되었습니다.&amp;nbsp;킷값을&amp;nbsp;만드는&amp;nbsp;과정에서&amp;nbsp;먼저&amp;nbsp;서로&amp;nbsp;다른&amp;nbsp;두&amp;nbsp;소수를&amp;nbsp;정하고&amp;nbsp;각&amp;nbsp;소수에&amp;nbsp;1만큼&amp;nbsp;뺀&amp;nbsp;값을&amp;nbsp;곱하는데&amp;nbsp;이것은&amp;nbsp;오일러&amp;nbsp;파이&amp;nbsp;함수의&amp;nbsp;성질을&amp;nbsp;활용한&amp;nbsp;것이었습니다.&amp;nbsp;임의의&amp;nbsp;소수가&amp;nbsp;이보다&amp;nbsp;작은&amp;nbsp;수&amp;nbsp;중&amp;nbsp;서로소인&amp;nbsp;수는&amp;nbsp;p-1개이고,&amp;nbsp;이는&amp;nbsp;RSA암호를&amp;nbsp;증명하는&amp;nbsp;과정에서&amp;nbsp;원문&amp;nbsp;m과&amp;nbsp;두&amp;nbsp;소수의&amp;nbsp;곱&amp;nbsp;N이&amp;nbsp;서로소가&amp;nbsp;아닐&amp;nbsp;때&amp;nbsp;페르마의&amp;nbsp;작은&amp;nbsp;정리로&amp;nbsp;해결된다는&amp;nbsp;실마리를&amp;nbsp;제공한다는&amp;nbsp;점이&amp;nbsp;놀라웠습니다.&amp;nbsp;탐구한&amp;nbsp;내용을&amp;nbsp;바탕으로&amp;nbsp;c를&amp;nbsp;이용한&amp;nbsp;RSA암호&amp;nbsp;프로그램을&amp;nbsp;개발하고자&amp;nbsp;하니,&amp;nbsp;문자를&amp;nbsp;암호화하는&amp;nbsp;방법에&amp;nbsp;대한&amp;nbsp;고민이&amp;nbsp;생겼습니다.&amp;nbsp;고민&amp;nbsp;끝에&amp;nbsp;정보시간에&amp;nbsp;배운&amp;nbsp;문자&amp;nbsp;인코딩&amp;nbsp;ASCII를&amp;nbsp;이용함으로써&amp;nbsp;성공적으로&amp;nbsp;프로그램을&amp;nbsp;완성할&amp;nbsp;수&amp;nbsp;있었습니다.&amp;nbsp;탐구활동을&amp;nbsp;통해&amp;nbsp;암호학에&amp;nbsp;큰&amp;nbsp;재미를&amp;nbsp;느꼈고,&amp;nbsp;장차&amp;nbsp;대학원에&amp;nbsp;진학해&amp;nbsp;암호학을&amp;nbsp;공부하여&amp;nbsp;양자컴퓨터도&amp;nbsp;해결하지&amp;nbsp;못하는&amp;nbsp;암호체계를&amp;nbsp;구축해보고&amp;nbsp;싶습니다. &lt;br /&gt;모&amp;nbsp;대학&amp;nbsp;교수님의&amp;nbsp;뇌파를&amp;nbsp;이용한&amp;nbsp;집중도&amp;nbsp;향상&amp;nbsp;AI&amp;nbsp;시스템의&amp;nbsp;연구성과를&amp;nbsp;봤는데,&amp;nbsp;AI&amp;nbsp;기술이&amp;nbsp;학습에&amp;nbsp;도움을&amp;nbsp;준다는&amp;nbsp;점이&amp;nbsp;인상적이었습니다.&amp;nbsp;뇌파가&amp;nbsp;아닌&amp;nbsp;방법으로도&amp;nbsp;집중도를&amp;nbsp;측정할&amp;nbsp;수&amp;nbsp;없을까&amp;nbsp;하는&amp;nbsp;호기심에&amp;nbsp;탐구하여&amp;nbsp;홍채의&amp;nbsp;움직임을&amp;nbsp;이용할&amp;nbsp;수&amp;nbsp;있다는&amp;nbsp;것을&amp;nbsp;알게&amp;nbsp;되었습니다.&amp;nbsp;그래서&amp;nbsp;저는&amp;nbsp;한번&amp;nbsp;구현해보고자&amp;nbsp;파이썬을&amp;nbsp;이용해&amp;nbsp;학습에&amp;nbsp;도움을&amp;nbsp;줄&amp;nbsp;수&amp;nbsp;있는&amp;nbsp;프로그램을&amp;nbsp;계획했습니다.&amp;nbsp;먼저&amp;nbsp;얼굴&amp;nbsp;주변의&amp;nbsp;좌표를&amp;nbsp;쉽게&amp;nbsp;조작하고자&amp;nbsp;dlib학습모델을&amp;nbsp;이용해&amp;nbsp;얼굴의&amp;nbsp;특징점을&amp;nbsp;표현했습니다.&amp;nbsp;한편&amp;nbsp;얼굴을&amp;nbsp;회전하면&amp;nbsp;얼굴을&amp;nbsp;인식하지&amp;nbsp;못하는&amp;nbsp;결함을&amp;nbsp;발견하여,&amp;nbsp;넘파이의&amp;nbsp;arctan()&amp;nbsp;함수로&amp;nbsp;얼굴의&amp;nbsp;기울어진&amp;nbsp;각도를&amp;nbsp;구해&amp;nbsp;이미지를&amp;nbsp;회전시켜&amp;nbsp;인식률을&amp;nbsp;높였습니다.&amp;nbsp;다음으로&amp;nbsp;홍채의&amp;nbsp;위치를&amp;nbsp;알아내는&amp;nbsp;방법을&amp;nbsp;모색했고,&amp;nbsp;홍채의&amp;nbsp;명도를&amp;nbsp;이용하는&amp;nbsp;방법을&amp;nbsp;채택하게&amp;nbsp;되었습니다.&amp;nbsp;하지만&amp;nbsp;명도를&amp;nbsp;이용하는&amp;nbsp;것이&amp;nbsp;잡음이&amp;nbsp;많아&amp;nbsp;엉뚱한&amp;nbsp;곳에&amp;nbsp;인식이&amp;nbsp;되곤&amp;nbsp;했습니다.&amp;nbsp;해결&amp;nbsp;방법을&amp;nbsp;고민한&amp;nbsp;끝에&amp;nbsp;가우시안&amp;nbsp;필터를&amp;nbsp;적용해&amp;nbsp;임계처리를&amp;nbsp;하고,&amp;nbsp;눈과&amp;nbsp;가장&amp;nbsp;가까운&amp;nbsp;윤곽선&amp;nbsp;영역을&amp;nbsp;가져옴으로써&amp;nbsp;해결했습니다.&amp;nbsp;&amp;nbsp;캠에&amp;nbsp;비친&amp;nbsp;저의&amp;nbsp;홍채가&amp;nbsp;잘&amp;nbsp;인식되는&amp;nbsp;것을&amp;nbsp;보면서&amp;nbsp;뿌듯했고&amp;nbsp;한편으로는&amp;nbsp;집중도를&amp;nbsp;어떻게&amp;nbsp;구할지&amp;nbsp;고민이&amp;nbsp;생겼습니다.&amp;nbsp;그래서&amp;nbsp;저는&amp;nbsp;집중집단과&amp;nbsp;비집중집단으로&amp;nbsp;나눈&amp;nbsp;학생&amp;nbsp;100명을&amp;nbsp;대상으로&amp;nbsp;직접&amp;nbsp;만든&amp;nbsp;홍채인식&amp;nbsp;프로그램을&amp;nbsp;배포하여&amp;nbsp;눈의&amp;nbsp;움직임&amp;nbsp;데이터를&amp;nbsp;구축했습니다.&amp;nbsp;데이터&amp;nbsp;분석을&amp;nbsp;통해&amp;nbsp;집중할&amp;nbsp;때는&amp;nbsp;좌우로&amp;nbsp;홍채가&amp;nbsp;움직이는&amp;nbsp;주기가&amp;nbsp;짧아진다는&amp;nbsp;결론을&amp;nbsp;도출했고,&amp;nbsp;분석한&amp;nbsp;데이터를&amp;nbsp;적용하여&amp;nbsp;성공적인&amp;nbsp;프로그램을&amp;nbsp;완성했습니다.&amp;nbsp;이후&amp;nbsp;파이썬을&amp;nbsp;공부하는&amp;nbsp;친구들에게&amp;nbsp;도움을&amp;nbsp;주고자&amp;nbsp;완성한&amp;nbsp;프로그램을&amp;nbsp;오픈소스&amp;nbsp;형식으로&amp;nbsp;배포해&amp;nbsp;큰&amp;nbsp;호응을&amp;nbsp;얻을&amp;nbsp;수&amp;nbsp;있었습니다.&amp;nbsp;이번&amp;nbsp;활동에서&amp;nbsp;저는&amp;nbsp;난관에&amp;nbsp;부딪힐&amp;nbsp;때마다&amp;nbsp;해결책을&amp;nbsp;찾아가는&amp;nbsp;과정에서&amp;nbsp;사고력과&amp;nbsp;문제해결&amp;nbsp;능력같은&amp;nbsp;개발자의&amp;nbsp;기초역량을&amp;nbsp;함양할&amp;nbsp;수&amp;nbsp;있었습니다.&amp;nbsp;이러한&amp;nbsp;능력을&amp;nbsp;더욱&amp;nbsp;길러&amp;nbsp;차세대&amp;nbsp;기술의&amp;nbsp;선구자,&amp;nbsp;더&amp;nbsp;나아가&amp;nbsp;한국&amp;nbsp;기술&amp;nbsp;발전에&amp;nbsp;한&amp;nbsp;획을&amp;nbsp;그을&amp;nbsp;개발자가&amp;nbsp;되고&amp;nbsp;싶다는&amp;nbsp;꿈을&amp;nbsp;가지게&amp;nbsp;되었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;2.&amp;nbsp;고등학교&amp;nbsp;재학&amp;nbsp;기간&amp;nbsp;중&amp;nbsp;타인과&amp;nbsp;공동체를&amp;nbsp;위해&amp;nbsp;노력한&amp;nbsp;경험과&amp;nbsp;이를&amp;nbsp;통해&amp;nbsp;배운&amp;nbsp;점을&amp;nbsp;기술해&amp;nbsp;주시기&amp;nbsp;바랍니다.(띄어쓰기&amp;nbsp;포함&amp;nbsp;800자&amp;nbsp;이내) &lt;/b&gt;&lt;br /&gt;&lt;b&gt;*&amp;nbsp;검정고시&amp;nbsp;출신자는&amp;nbsp;중학교&amp;nbsp;졸업&amp;nbsp;후&amp;nbsp;고등학교&amp;nbsp;재학&amp;nbsp;기간에&amp;nbsp;준하는&amp;nbsp;기간의&amp;nbsp;경험&amp;nbsp;기술&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;코로나19&amp;nbsp;팬데믹&amp;nbsp;상황으로&amp;nbsp;인해&amp;nbsp;학교생활에&amp;nbsp;적응하기&amp;nbsp;힘들어하는&amp;nbsp;학생이&amp;nbsp;많았습니다.&amp;nbsp;'취미로&amp;nbsp;배운&amp;nbsp;코딩으로&amp;nbsp;친구들에게&amp;nbsp;도움을&amp;nbsp;줄&amp;nbsp;수&amp;nbsp;없을까?'&amp;nbsp;하는&amp;nbsp;마음에&amp;nbsp;IT팀을&amp;nbsp;직접&amp;nbsp;꾸려&amp;nbsp;학급&amp;nbsp;앱&amp;nbsp;개발을&amp;nbsp;계획했습니다.&amp;nbsp;컴퓨터에&amp;nbsp;관심&amp;nbsp;있는&amp;nbsp;친구들이&amp;nbsp;함께하고자&amp;nbsp;했지만,&amp;nbsp;서로&amp;nbsp;간의&amp;nbsp;역량이&amp;nbsp;달라&amp;nbsp;이를&amp;nbsp;조율하는&amp;nbsp;과정부터&amp;nbsp;차질이&amp;nbsp;있었습니다.&amp;nbsp;그래서&amp;nbsp;저는&amp;nbsp;회의를&amp;nbsp;주최해&amp;nbsp;팀원들의&amp;nbsp;의견을&amp;nbsp;받아들였고,&amp;nbsp;JSP기반의&amp;nbsp;웹과&amp;nbsp;웹&amp;nbsp;뷰를&amp;nbsp;띄우는&amp;nbsp;앱을&amp;nbsp;만들자는&amp;nbsp;결론을&amp;nbsp;내렸습니다.&amp;nbsp;처음으로&amp;nbsp;협업을&amp;nbsp;해보는&amp;nbsp;경험이기에&amp;nbsp;많은&amp;nbsp;걱정이&amp;nbsp;있었지만,&amp;nbsp;모두가&amp;nbsp;그런&amp;nbsp;마음이라고&amp;nbsp;생각하니&amp;nbsp;쉽게&amp;nbsp;극복할&amp;nbsp;수&amp;nbsp;있었습니다.&amp;nbsp;한편,&amp;nbsp;초반에는&amp;nbsp;잘&amp;nbsp;진행되던&amp;nbsp;개발이&amp;nbsp;시간이&amp;nbsp;지체될수록&amp;nbsp;지치는&amp;nbsp;친구들이&amp;nbsp;늘었습니다.&amp;nbsp;&amp;lsquo;시작한&amp;nbsp;것은&amp;nbsp;끝까지&amp;nbsp;하자&amp;rsquo;라는&amp;nbsp;신념을&amp;nbsp;지키기&amp;nbsp;위해&amp;nbsp;팀장으로서&amp;nbsp;어려워하는&amp;nbsp;친구들을&amp;nbsp;돕고&amp;nbsp;모르는&amp;nbsp;것은&amp;nbsp;서적과&amp;nbsp;인터넷을&amp;nbsp;통해&amp;nbsp;학습하면서&amp;nbsp;솔선수범하는&amp;nbsp;자세로&amp;nbsp;임했습니다.&amp;nbsp;저를&amp;nbsp;따라&amp;nbsp;열심히&amp;nbsp;해주는&amp;nbsp;팀원들의&amp;nbsp;모습을&amp;nbsp;보고&amp;nbsp;팀장의&amp;nbsp;역할이&amp;nbsp;매우&amp;nbsp;중요하다는&amp;nbsp;것을&amp;nbsp;깨달았습니다.&amp;nbsp;성공적으로&amp;nbsp;완성한&amp;nbsp;앱과&amp;nbsp;웹을&amp;nbsp;1년&amp;nbsp;동안&amp;nbsp;운영했지만,&amp;nbsp;점점&amp;nbsp;사용자가&amp;nbsp;줄어들었고&amp;nbsp;팀은&amp;nbsp;해체되었습니다.&amp;nbsp;그&amp;nbsp;이유를&amp;nbsp;알고자&amp;nbsp;설문조사를&amp;nbsp;진행했고,&amp;nbsp;접근성에&amp;nbsp;문제가&amp;nbsp;있다는&amp;nbsp;사실을&amp;nbsp;알게&amp;nbsp;되었습니다.&amp;nbsp;이에&amp;nbsp;저는&amp;nbsp;카카오봇이라는&amp;nbsp;아이디어에&amp;nbsp;착안해&amp;nbsp;파이썬을&amp;nbsp;이용하여&amp;nbsp;다시&amp;nbsp;개발했습니다.&amp;nbsp;이번에는&amp;nbsp;잘&amp;nbsp;활용될지&amp;nbsp;우려가&amp;nbsp;컸지만,&amp;nbsp;출시하고&amp;nbsp;보니&amp;nbsp;생각보다&amp;nbsp;많은&amp;nbsp;호응을&amp;nbsp;얻어&amp;nbsp;큰&amp;nbsp;성취감을&amp;nbsp;느꼈습니다.&amp;nbsp;저의&amp;nbsp;취미가&amp;nbsp;누군가에게&amp;nbsp;도움이&amp;nbsp;될&amp;nbsp;수&amp;nbsp;있다는&amp;nbsp;생각이&amp;nbsp;개발&amp;nbsp;활동에&amp;nbsp;원동력이&amp;nbsp;됐으며,&amp;nbsp;완성한&amp;nbsp;프로그램을&amp;nbsp;보면서&amp;nbsp;개발의&amp;nbsp;즐거움을&amp;nbsp;느낄&amp;nbsp;수&amp;nbsp;있었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;경희대&amp;nbsp;자율문항.&amp;nbsp;해당&amp;nbsp;모집단위에&amp;nbsp;지원하게&amp;nbsp;된&amp;nbsp;동기와&amp;nbsp;준비&amp;nbsp;과정에서&amp;nbsp;배운&amp;nbsp;점을&amp;nbsp;기술해&amp;nbsp;주시기&amp;nbsp;바랍니다.&amp;nbsp;(띄어쓰기&amp;nbsp;포함&amp;nbsp;800자&amp;nbsp;이내)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;어렸을&amp;nbsp;때&amp;nbsp;게임&amp;nbsp;핵(치트)을&amp;nbsp;만들어보고&amp;nbsp;싶어&amp;nbsp;처음으로&amp;nbsp;코딩을&amp;nbsp;접했고,&amp;nbsp;그&amp;nbsp;과정에서&amp;nbsp;코드만으로&amp;nbsp;하여금&amp;nbsp;무언가를&amp;nbsp;창조한다는&amp;nbsp;것이&amp;nbsp;매력적으로&amp;nbsp;다가와&amp;nbsp;꾸준히&amp;nbsp;독학했습니다.&amp;nbsp;처음으로&amp;nbsp;정보&amp;nbsp;수업을&amp;nbsp;들었을&amp;nbsp;때,&amp;nbsp;혼자서&amp;nbsp;학습한&amp;nbsp;내용이&amp;nbsp;수업주제로&amp;nbsp;다뤄졌기&amp;nbsp;때문에&amp;nbsp;다른&amp;nbsp;교과목보다도&amp;nbsp;더욱&amp;nbsp;적극적으로&amp;nbsp;참여할&amp;nbsp;수&amp;nbsp;있었습니다.&amp;nbsp;또한,&amp;nbsp;독학하면서&amp;nbsp;해결하지&amp;nbsp;못한&amp;nbsp;버그나&amp;nbsp;문제를&amp;nbsp;선생님과의&amp;nbsp;질의응답을&amp;nbsp;통해&amp;nbsp;선생님의&amp;nbsp;오랜&amp;nbsp;경험에&amp;nbsp;쌓인&amp;nbsp;노하우를&amp;nbsp;엿볼&amp;nbsp;수&amp;nbsp;있었습니다.&amp;nbsp;더불어&amp;nbsp;정보&amp;nbsp;수업&amp;nbsp;시간에&amp;nbsp;코딩을&amp;nbsp;어려워하는&amp;nbsp;친구들에게&amp;nbsp;도움을&amp;nbsp;줌으로써&amp;nbsp;의사소통&amp;nbsp;능력을&amp;nbsp;기르고,&amp;nbsp;내향적인&amp;nbsp;성격을&amp;nbsp;극복한&amp;nbsp;계기가&amp;nbsp;되었습니다.&amp;nbsp;이것이&amp;nbsp;복습&amp;nbsp;효과의&amp;nbsp;시너지가&amp;nbsp;되어&amp;nbsp;교내&amp;nbsp;c&amp;nbsp;프로그래밍&amp;nbsp;대회에서도&amp;nbsp;최우수상이라는&amp;nbsp;결과를&amp;nbsp;만들&amp;nbsp;수&amp;nbsp;있었습니다.&amp;nbsp;한편,&amp;nbsp;다른&amp;nbsp;교과목&amp;nbsp;시간에는&amp;nbsp;고전소설&amp;nbsp;&amp;lsquo;엔트로피&amp;rsquo;를&amp;nbsp;읽고&amp;nbsp;개발자들이&amp;nbsp;과학기술&amp;nbsp;발전에&amp;nbsp;있어서&amp;nbsp;갖춰야&amp;nbsp;할&amp;nbsp;태도를&amp;nbsp;확립할&amp;nbsp;뿐만&amp;nbsp;아니라&amp;nbsp;반도체&amp;nbsp;공정,&amp;nbsp;CPU와&amp;nbsp;어셈블리어의&amp;nbsp;관계와&amp;nbsp;같은&amp;nbsp;하드웨어적인&amp;nbsp;부분도&amp;nbsp;융합하여&amp;nbsp;학습했습니다.&amp;nbsp;고등학교&amp;nbsp;3년&amp;nbsp;동안&amp;nbsp;'프로그래밍'이라는&amp;nbsp;일련의&amp;nbsp;작업을&amp;nbsp;하나의&amp;nbsp;분야에&amp;nbsp;국한되지&amp;nbsp;않는&amp;nbsp;학습을&amp;nbsp;통해&amp;nbsp;고수준의&amp;nbsp;설계적&amp;nbsp;결정을&amp;nbsp;수행하는&amp;nbsp;훌륭한&amp;nbsp;소프트웨어&amp;nbsp;아키텍트가&amp;nbsp;되는&amp;nbsp;구체적인&amp;nbsp;목표가&amp;nbsp;생겼습니다.&amp;nbsp;대학교에&amp;nbsp;진학해&amp;nbsp;우수한&amp;nbsp;자질을&amp;nbsp;갖춘&amp;nbsp;사람들로부터&amp;nbsp;많은&amp;nbsp;것을&amp;nbsp;보고&amp;nbsp;배워&amp;nbsp;실무적&amp;nbsp;소프트웨어&amp;nbsp;능력을&amp;nbsp;기르고자&amp;nbsp;경희대학교&amp;nbsp;컴퓨터공학과에&amp;nbsp;지원하게&amp;nbsp;되었습니다.&amp;nbsp;대학교라는&amp;nbsp;공동체&amp;nbsp;속에서&amp;nbsp;컴퓨터에&amp;nbsp;대한&amp;nbsp;열정으로&amp;nbsp;저만의&amp;nbsp;삶을&amp;nbsp;완성하고,&amp;nbsp;능률적이고&amp;nbsp;능동적인&amp;nbsp;개발자의&amp;nbsp;기본소양을&amp;nbsp;두루&amp;nbsp;갖춘&amp;nbsp;인재로&amp;nbsp;성장할&amp;nbsp;것이라고&amp;nbsp;확신합니다.&lt;/p&gt;</description>
      <category>CODING/Etc.</category>
      <author>상 민</author>
      <guid isPermaLink="true">https://lsmin3388.tistory.com/16</guid>
      <comments>https://lsmin3388.tistory.com/16#entry16comment</comments>
      <pubDate>Tue, 7 Mar 2023 17:15:49 +0900</pubDate>
    </item>
    <item>
      <title>[컴퓨터 공학/소프트웨어/인공지능 관련 생기부 주제 추천] Python 딥러닝을 이용해 공부 집중도를 분석하는 프로그램 보고서</title>
      <link>https://lsmin3388.tistory.com/14</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;안녕하세요. 이번에는 제가 고등학교 생기부를 만들고, 특기자 전형을 준비하면서 직접 작성한 보고서입니다. 해당 내용을 참고하시든 사용하시든 &lt;b&gt;&lt;u&gt;(이미지 제외)&lt;/u&gt;&lt;/b&gt; 상관없으니 자유롭게 사용해 주세요.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lK0Bz/btr0NNe7Tbv/aKo9ufWSDdTrGMgIgvLVR1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lK0Bz/btr0NNe7Tbv/aKo9ufWSDdTrGMgIgvLVR1/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;992&quot; data-origin-height=&quot;1403&quot; data-filename=&quot;edited_edited_개인활동실적006.png&quot; width=&quot;287&quot; data-widthpercent=&quot;50&quot; style=&quot;width: 49.418605%; margin-right: 10px;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lK0Bz/btr0NNe7Tbv/aKo9ufWSDdTrGMgIgvLVR1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlK0Bz%2Fbtr0NNe7Tbv%2FaKo9ufWSDdTrGMgIgvLVR1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;992&quot; height=&quot;1403&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/OXBgk/btr0HRCPKB3/Ld2i2j93qXDMmuT4YkzfDk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/OXBgk/btr0HRCPKB3/Ld2i2j93qXDMmuT4YkzfDk/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;992&quot; data-origin-height=&quot;1403&quot; data-filename=&quot;edited_edited_개인활동실적007.png&quot; width=&quot;328&quot; height=&quot;464&quot; data-widthpercent=&quot;50&quot; style=&quot;width: 49.418605%;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/OXBgk/btr0HRCPKB3/Ld2i2j93qXDMmuT4YkzfDk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FOXBgk%2Fbtr0HRCPKB3%2FLd2i2j93qXDMmuT4YkzfDk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;992&quot; height=&quot;1403&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;개발 동기&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;'StudyHelper.py'는&amp;nbsp;실시간으로&amp;nbsp;웹캠에&amp;nbsp;비친&amp;nbsp;사용자의&amp;nbsp;얼굴에서&amp;nbsp;홍채를&amp;nbsp;인식해&amp;nbsp;집중도&amp;nbsp;측정,&amp;nbsp;졸음&amp;nbsp;방지&amp;nbsp;기능을&amp;nbsp;제공하여&amp;nbsp;학습에&amp;nbsp;도움을&amp;nbsp;주는&amp;nbsp;프로그램입니다.&amp;nbsp;모&amp;nbsp;대학&amp;nbsp;교수님의&amp;nbsp;뇌파를&amp;nbsp;이용한&amp;nbsp;집중도&amp;nbsp;향상&amp;nbsp;AI&amp;nbsp;시스템의&amp;nbsp;연구성과를&amp;nbsp;보고&amp;nbsp;AI&amp;nbsp;기술이&amp;nbsp;학습에&amp;nbsp;도움을&amp;nbsp;준다는&amp;nbsp;점이&amp;nbsp;인상&amp;nbsp;깊었습니다.&amp;nbsp;&quot;뇌파가&amp;nbsp;아닌&amp;nbsp;다른&amp;nbsp;방법으로&amp;nbsp;집중도를&amp;nbsp;측정할&amp;nbsp;수&amp;nbsp;없을까?&quot;&amp;nbsp;하는&amp;nbsp;호기심에&amp;nbsp;탐구하였고,&amp;nbsp;집중&amp;nbsp;여부에&amp;nbsp;따라&amp;nbsp;홍채의&amp;nbsp;움직임에&amp;nbsp;변화를&amp;nbsp;준다는&amp;nbsp;사실을&amp;nbsp;알게&amp;nbsp;되었습니다.&amp;nbsp;이러한&amp;nbsp;방법을&amp;nbsp;이용해&amp;nbsp;학습에&amp;nbsp;도움을&amp;nbsp;주는&amp;nbsp;프로그램을&amp;nbsp;개발했습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;개발과정&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;얼굴&amp;nbsp;인식&amp;nbsp;(+&amp;nbsp;인식률을&amp;nbsp;높이는&amp;nbsp;방법)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;얼굴을&amp;nbsp;인식하는&amp;nbsp;방법에&amp;nbsp;대해&amp;nbsp;여러&amp;nbsp;가지&amp;nbsp;고민했고,&amp;nbsp;고민&amp;nbsp;끝에&amp;nbsp;눈까지&amp;nbsp;인식하여&amp;nbsp;눈&amp;nbsp;주변&amp;nbsp;좌표를&amp;nbsp;가져오고&amp;nbsp;조작하기에&amp;nbsp;적합한&amp;nbsp;학습모델인&amp;nbsp;'dlib&amp;nbsp;안면&amp;nbsp;랜드&amp;nbsp;마킹&amp;nbsp;라이브러리'를&amp;nbsp;이용했습니다.&amp;nbsp;학습모델을&amp;nbsp;통해&amp;nbsp;성공적으로&amp;nbsp;얼굴에&amp;nbsp;특징점을&amp;nbsp;나타낼&amp;nbsp;수&amp;nbsp;있었지만,&amp;nbsp;얼굴이&amp;nbsp;옆으로&amp;nbsp;기울어지게&amp;nbsp;되면&amp;nbsp;인식을&amp;nbsp;거의&amp;nbsp;하지&amp;nbsp;못하는&amp;nbsp;문제를&amp;nbsp;발견했습니다.&amp;nbsp;이를&amp;nbsp;해결하고자&amp;nbsp;강구하던&amp;nbsp;끝에&amp;nbsp;얼굴의&amp;nbsp;움직임에&amp;nbsp;맞추어&amp;nbsp;화면을&amp;nbsp;회전하자는&amp;nbsp;생각을&amp;nbsp;떠올렸고,&amp;nbsp;이를&amp;nbsp;실행시켰습니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1677423261727&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;rot_mat = []
theta = 0

# while True:
ret, frame = cap.read() # 캠의 이미지를 받는 부분
if rot_mat != []: # 최초 실행의 경우 회전을 하지 않도록 설정
    frame = cv2.warpAffine(frame, rot_mat, frame.shape[1::-1], flags=cv2.INTER_LINEAR,borderValue=(255,255,255)) # 지난 사진에서 받아온 어파인 변환 행렬을 받아와 이미지를 회전한다.

# 얼굴 특이점 인식 부분(생략됨)
tan_theta = (land_list[30][0]-land_list[27][0])/(land_list[30][1]-land_list[27][1])
theta += np.arctan(tan_theta) # 이전에 기울어진 정도의 각도 + 현재 구한 각도
angle =-(theta *180)/math.pi # 호도법을 일반각으로 변환시키는 작업

image_center = tuple(np.array(deframe.shape[1::-1]) /2) 
rot_mat = cv2.getRotationMatrix2D(image_center, angle, 1.0) 
# 회전 중심좌표(image_center)와 회전각도(angle)를 받아와 2x3의 어파인 변환 행렬을 출력
# 어파인 변환 행렬은 이후 warpAffine() 함수에서 인자로 넣어 이미지를 회전시키기 위해 구하는 것&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현재&amp;nbsp;이미지에서&amp;nbsp;얼굴의&amp;nbsp;기울어진&amp;nbsp;정도만큼&amp;nbsp;회전하는&amp;nbsp;것이&amp;nbsp;아닌,&amp;nbsp;왜&amp;nbsp;지난&amp;nbsp;이미지에서&amp;nbsp;구한&amp;nbsp;각도만큼&amp;nbsp;회전하는&amp;nbsp;것일지&amp;nbsp;의문을&amp;nbsp;가질&amp;nbsp;수도&amp;nbsp;있습니다.&amp;nbsp;얼굴의&amp;nbsp;인식률을&amp;nbsp;높이기&amp;nbsp;위해&amp;nbsp;이미지를&amp;nbsp;회전시키는&amp;nbsp;것이기&amp;nbsp;때문에&amp;nbsp;얼굴을&amp;nbsp;인식하기&amp;nbsp;전&amp;nbsp;이미지를&amp;nbsp;회전해야만&amp;nbsp;합니다.&amp;nbsp;하지만&amp;nbsp;회전하기&amp;nbsp;위해&amp;nbsp;기울어진&amp;nbsp;정도를&amp;nbsp;구하기&amp;nbsp;위해서는&amp;nbsp;얼굴을&amp;nbsp;인식해야&amp;nbsp;하는&amp;nbsp;모순이&amp;nbsp;발생하므로,&amp;nbsp;얼굴을&amp;nbsp;두&amp;nbsp;번&amp;nbsp;인식하는&amp;nbsp;것은&amp;nbsp;비효율적이라고&amp;nbsp;판단하고&amp;nbsp;매우&amp;nbsp;작은&amp;nbsp;오차가&amp;nbsp;생길지언정&amp;nbsp;지난&amp;nbsp;이미지에서&amp;nbsp;가져온&amp;nbsp;어파인&amp;nbsp;변환&amp;nbsp;행렬을&amp;nbsp;통해&amp;nbsp;이미지를&amp;nbsp;회전시켰습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;홍채인식&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;홍채를&amp;nbsp;정확히&amp;nbsp;인식하는&amp;nbsp;방법을&amp;nbsp;고민했고,&amp;nbsp;홍채가&amp;nbsp;주변보다&amp;nbsp;어둡다는&amp;nbsp;특성을&amp;nbsp;이용해&amp;nbsp;thresholding을&amp;nbsp;통해&amp;nbsp;검출한&amp;nbsp;외곽선이&amp;nbsp;눈의&amp;nbsp;중심과&amp;nbsp;가장&amp;nbsp;가까운&amp;nbsp;영역을&amp;nbsp;가져오자는&amp;nbsp;생각을&amp;nbsp;했습니다.&amp;nbsp;그래서&amp;nbsp;저는&amp;nbsp;먼저&amp;nbsp;이미지의&amp;nbsp;얼굴&amp;nbsp;영역만을&amp;nbsp;잘라서&amp;nbsp;가져왔습니다.&amp;nbsp;가져온&amp;nbsp;얼굴&amp;nbsp;이미지를&amp;nbsp;thresholding을&amp;nbsp;하기&amp;nbsp;위해&amp;nbsp;먼저&amp;nbsp;cvtColor()&amp;nbsp;함수를&amp;nbsp;이용해&amp;nbsp;GrayScale로&amp;nbsp;변환하고,&amp;nbsp;노이즈를&amp;nbsp;줄이고자&amp;nbsp;Gaussian&amp;nbsp;필터를&amp;nbsp;씌웁니다.&amp;nbsp;작업을&amp;nbsp;마친&amp;nbsp;이미지를&amp;nbsp;thresholding을&amp;nbsp;적용하고,&amp;nbsp;findConours를&amp;nbsp;통해&amp;nbsp;외곽선을&amp;nbsp;찾은&amp;nbsp;다음&amp;nbsp;labda&amp;nbsp;x:-contourArea(x)를&amp;nbsp;통해&amp;nbsp;넓이가&amp;nbsp;큰&amp;nbsp;영역부터&amp;nbsp;내림차순으로&amp;nbsp;정렬합니다.&amp;nbsp;이&amp;nbsp;배열을&amp;nbsp;반복문을&amp;nbsp;돌려&amp;nbsp;눈의&amp;nbsp;중심과&amp;nbsp;가장&amp;nbsp;가까운&amp;nbsp;외곽선을&amp;nbsp;검출하여&amp;nbsp;홍채를&amp;nbsp;인식합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;눈&amp;nbsp;감는&amp;nbsp;횟수,&amp;nbsp;졸음&amp;nbsp;감지&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;눈을&amp;nbsp;감는&amp;nbsp;것을&amp;nbsp;측정하기&amp;nbsp;위해&amp;nbsp;저는&amp;nbsp;눈&amp;nbsp;주변에&amp;nbsp;새긴&amp;nbsp;랜드마크를&amp;nbsp;이용했습니다.&amp;nbsp;실시간으로&amp;nbsp;눈의&amp;nbsp;위쪽과&amp;nbsp;아래쪽&amp;nbsp;마크의&amp;nbsp;좌표를&amp;nbsp;받아온&amp;nbsp;후&amp;nbsp;두&amp;nbsp;마크&amp;nbsp;간의&amp;nbsp;거리가&amp;nbsp;가까워질&amp;nbsp;때&amp;nbsp;눈을&amp;nbsp;감는&amp;nbsp;것으로&amp;nbsp;간주했습니다.&amp;nbsp;그리고&amp;nbsp;눈을&amp;nbsp;다시&amp;nbsp;뜨기&amp;nbsp;전에는&amp;nbsp;눈을&amp;nbsp;감는&amp;nbsp;횟수가&amp;nbsp;카운트되지&amp;nbsp;않도록&amp;nbsp;변수를&amp;nbsp;조작했습니다.&amp;nbsp;또한,&amp;nbsp;조작한&amp;nbsp;변수를&amp;nbsp;이용해&amp;nbsp;일정&amp;nbsp;시간&amp;nbsp;이상&amp;nbsp;동안&amp;nbsp;다시&amp;nbsp;눈을&amp;nbsp;뜨지&amp;nbsp;않으면&amp;nbsp;졸고&amp;nbsp;있다고&amp;nbsp;판단하고&amp;nbsp;알람&amp;nbsp;소리를&amp;nbsp;울리게&amp;nbsp;했습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;눈의&amp;nbsp;움직임을&amp;nbsp;통한&amp;nbsp;집중도&amp;nbsp;측정&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;홍채의&amp;nbsp;움직임을&amp;nbsp;분석하기에&amp;nbsp;적당한&amp;nbsp;지표를&amp;nbsp;찾는&amp;nbsp;과정에서&amp;nbsp;확률과&amp;nbsp;통계&amp;nbsp;시간에&amp;nbsp;배운&amp;nbsp;표준편차를&amp;nbsp;이용하면&amp;nbsp;눈이&amp;nbsp;좌우로&amp;nbsp;얼마나&amp;nbsp;움직였는지&amp;nbsp;나타내기에&amp;nbsp;적당하다고&amp;nbsp;생각했습니다.&amp;nbsp;표준편차를&amp;nbsp;구하고자,&amp;nbsp;먼저&amp;nbsp;오른쪽&amp;nbsp;눈을&amp;nbsp;기준&amp;nbsp;잡고&amp;nbsp;눈의&amp;nbsp;중심좌표를&amp;nbsp;가져옵니다.&amp;nbsp;그&amp;nbsp;후&amp;nbsp;1초마다&amp;nbsp;홍채의&amp;nbsp;위치와&amp;nbsp;눈의&amp;nbsp;중심좌표까지의&amp;nbsp;거리를&amp;nbsp;벡터값으로&amp;nbsp;나타냅니다(오른쪽&amp;nbsp;+,&amp;nbsp;왼쪽&amp;nbsp;-).&amp;nbsp;이&amp;nbsp;값을&amp;nbsp;넘파이&amp;nbsp;배열에&amp;nbsp;넣어&amp;nbsp;std()&amp;nbsp;함수를&amp;nbsp;통해&amp;nbsp;표준편차를&amp;nbsp;구합니다.&amp;nbsp;실제로&amp;nbsp;집중하고&amp;nbsp;있을&amp;nbsp;때와&amp;nbsp;집중하고&amp;nbsp;있지&amp;nbsp;않을&amp;nbsp;때&amp;nbsp;홍채의&amp;nbsp;움직임에&amp;nbsp;대한&amp;nbsp;표준편차의 값을&amp;nbsp;알아보고자&amp;nbsp;학생&amp;nbsp;100명을&amp;nbsp;대상으로&amp;nbsp;집중집단과&amp;nbsp;비집중집단으로&amp;nbsp;나눠&amp;nbsp;프로그램을&amp;nbsp;배포했고,&amp;nbsp;초&amp;nbsp;단위로&amp;nbsp;표준편차가&amp;nbsp;어떻게&amp;nbsp;변화하는지&amp;nbsp;데이터를&amp;nbsp;쌓을&amp;nbsp;수&amp;nbsp;있었습니다.&amp;nbsp;이&amp;nbsp;데이터를&amp;nbsp;바탕으로&amp;nbsp;집중도를&amp;nbsp;구할&amp;nbsp;수&amp;nbsp;있었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;개발을&amp;nbsp;마치고&amp;hellip;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;완성한&amp;nbsp;프로그램을&amp;nbsp;교내&amp;nbsp;공모전에&amp;nbsp;실어&amp;nbsp;가장&amp;nbsp;많은&amp;nbsp;인기를&amp;nbsp;받을&amp;nbsp;수&amp;nbsp;있었고,&amp;nbsp;파이썬을&amp;nbsp;공부하고&amp;nbsp;있는&amp;nbsp;친구들에게&amp;nbsp;도움을&amp;nbsp;주고자&amp;nbsp;소스&amp;nbsp;전문에&amp;nbsp;주석처리를&amp;nbsp;하여&amp;nbsp;오픈소스&amp;nbsp;형식으로&amp;nbsp;배포하였습니다.&amp;nbsp;이번&amp;nbsp;활동은&amp;nbsp;dlib&amp;nbsp;라이브러리를&amp;nbsp;이용했기&amp;nbsp;때문에&amp;nbsp;원하는&amp;nbsp;위치에&amp;nbsp;랜드마크를&amp;nbsp;새길&amp;nbsp;수&amp;nbsp;없다는&amp;nbsp;한계가&amp;nbsp;있었습니다.&amp;nbsp;Human&amp;nbsp;skeleton&amp;nbsp;detection처럼&amp;nbsp;원하는&amp;nbsp;위치에&amp;nbsp;랜드&amp;nbsp;마킹이&amp;nbsp;가능한&amp;nbsp;모델이나&amp;nbsp;YOLO와&amp;nbsp;같은&amp;nbsp;객체&amp;nbsp;탐지&amp;nbsp;모델을&amp;nbsp;응용하면&amp;nbsp;좋은&amp;nbsp;결과물을&amp;nbsp;만들&amp;nbsp;수&amp;nbsp;있다고&amp;nbsp;생각했지만,&amp;nbsp;더욱&amp;nbsp;최적화된&amp;nbsp;모델을&amp;nbsp;가지고&amp;nbsp;싶다는&amp;nbsp;생각에&amp;nbsp;모델을&amp;nbsp;직접&amp;nbsp;구축하고&amp;nbsp;커스텀하는&amp;nbsp;방식을&amp;nbsp;주제로&amp;nbsp;공부할&amp;nbsp;예정입니다.&lt;/p&gt;</description>
      <category>CODING/Python</category>
      <author>상 민</author>
      <guid isPermaLink="true">https://lsmin3388.tistory.com/14</guid>
      <comments>https://lsmin3388.tistory.com/14#entry14comment</comments>
      <pubDate>Mon, 27 Feb 2023 00:09:03 +0900</pubDate>
    </item>
    <item>
      <title>경북대 예비대학 파이썬교육 (기말고사 전 마지막정리)</title>
      <link>https://lsmin3388.tistory.com/13</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;기말고사를 앞두고 교수님이 강조하신 문자열과 함수 부분에 대해 정리하도록 하겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;문자열&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(+) 기호를 통해 문자열을 합칠 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(*) 기호를 통해 문자열을 반복할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(-), (/) 기호는 사용 불가능&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;len() 함수를 통해 문자열의 길이를 얻을 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특정 문자(korStr)가 한글인지 확인하는법&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;if 'ㄱ' &amp;lt;= korStr and korStr &amp;lt;= '힣':&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 489px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 13.21699%; text-align: center; height: 20px;&quot;&gt;이름&lt;/td&gt;
&lt;td style=&quot;width: 49.26351%; text-align: center; height: 20px;&quot;&gt;설명&lt;/td&gt;
&lt;td style=&quot;width: 28.7599%; text-align: center; height: 20px;&quot;&gt;사용법&lt;/td&gt;
&lt;td style=&quot;width: 8.75973%; text-align: center; height: 20px;&quot;&gt;반환값&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;width: 13.21699%; text-align: center; height: 19px;&quot;&gt;&lt;b&gt;upper&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 49.26351%; height: 19px;&quot;&gt;소문자를 대문자로 변환합니다.&lt;/td&gt;
&lt;td style=&quot;width: 28.7599%; height: 19px;&quot;&gt;대상.upper()&lt;/td&gt;
&lt;td style=&quot;width: 8.75973%; height: 19px; text-align: center;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 13.21699%; text-align: center; height: 17px;&quot;&gt;&lt;b&gt;lower&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 49.26351%; height: 17px;&quot;&gt;대문자를 소문자로 변환합니다.&lt;/td&gt;
&lt;td style=&quot;width: 28.7599%; height: 17px;&quot;&gt;대상.lower()&lt;/td&gt;
&lt;td style=&quot;width: 8.75973%; height: 17px; text-align: center;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 13.21699%; text-align: center; height: 17px;&quot;&gt;&lt;b&gt;swapcase&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 49.26351%; height: 17px;&quot;&gt;소문자를 대문자로, 대문자를 소문자로 변환합니다.&lt;/td&gt;
&lt;td style=&quot;width: 28.7599%; height: 17px;&quot;&gt;대상.swapcase()&lt;/td&gt;
&lt;td style=&quot;width: 8.75973%; height: 17px; text-align: center;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 13.21699%; text-align: center; height: 17px;&quot;&gt;&lt;b&gt;title&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 49.26351%; height: 17px;&quot;&gt;각 단어의 앞 글자를 대문자로 변환합니다.&lt;/td&gt;
&lt;td style=&quot;width: 28.7599%; height: 17px;&quot;&gt;대상.title()&lt;/td&gt;
&lt;td style=&quot;width: 8.75973%; height: 17px; text-align: center;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 13.21699%; text-align: center; height: 17px;&quot;&gt;&lt;b&gt;count&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 49.26351%; height: 17px;&quot;&gt;찾을 문자열의 개수를 셉니다.&lt;/td&gt;
&lt;td style=&quot;width: 28.7599%; height: 17px;&quot;&gt;대상.count(찾을 문자열)&lt;/td&gt;
&lt;td style=&quot;width: 8.75973%; height: 17px; text-align: center;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 13.21699%; text-align: center; height: 17px;&quot;&gt;&lt;b&gt;find&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 49.26351%; height: 17px;&quot;&gt;왼쪽에서부터 시작과 끝 범위 사이에 있는 문자를 찾습니다.&lt;br /&gt;(최초 발견 문자를 대상으로 index값 출력)&lt;/td&gt;
&lt;td style=&quot;width: 28.7599%; height: 17px;&quot;&gt;대상.find(찾을 문자열, 시작, 끝)&lt;/td&gt;
&lt;td style=&quot;width: 8.75973%; height: 17px; text-align: center;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 13.21699%; text-align: center; height: 17px;&quot;&gt;&lt;b&gt;rfind&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 49.26351%; height: 17px;&quot;&gt;&lt;span style=&quot;background-color: #f9f9f9;&quot;&gt;오른쪽에서부터 시작과 끝 범위 사이에 있는 문자를 찾습니다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #f9f9f9;&quot;&gt;(최초 발견 문자를 대상으로 index값 출력)&lt;br /&gt;(찾을 문자열이 없을 경우 -1 출력)&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 28.7599%; height: 17px;&quot;&gt;대상.rfind(&lt;span style=&quot;background-color: #f9f9f9;&quot;&gt;찾을 문자열, 시작, 끝&lt;/span&gt;)&lt;/td&gt;
&lt;td style=&quot;width: 8.75973%; height: 17px; text-align: center;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 13.21699%; text-align: center; height: 17px;&quot;&gt;&lt;b&gt;index, rindex&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 49.26351%; height: 17px;&quot;&gt;find, rfind와 동일하지만 찾을 문자열이 없을 경우 오류 발생&lt;/td&gt;
&lt;td style=&quot;width: 28.7599%; height: 17px;&quot;&gt;대상.&lt;span style=&quot;background-color: #efefef;&quot;&gt;index&lt;/span&gt;(&lt;span style=&quot;background-color: #f9f9f9;&quot;&gt;찾을 문자열, 시작, 끝&lt;/span&gt;)&lt;br /&gt;대상.r&lt;span style=&quot;background-color: #efefef;&quot;&gt;index&lt;/span&gt;(&lt;span style=&quot;background-color: #f9f9f9;&quot;&gt;찾을 문자열, 시작, 끝&lt;/span&gt;)&lt;/td&gt;
&lt;td style=&quot;width: 8.75973%; height: 17px; text-align: center;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 10px;&quot;&gt;
&lt;td style=&quot;width: 13.21699%; text-align: center; height: 10px;&quot;&gt;&lt;b&gt;startswith&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 49.26351%; height: 10px;&quot;&gt;대상 문자열에서 시작하는 문자열이 입력 받은 시작 문자열과 일치여부 판단&lt;/td&gt;
&lt;td style=&quot;width: 28.7599%; height: 10px;&quot;&gt;대상.startswith(시작 문자열)&lt;/td&gt;
&lt;td style=&quot;width: 8.75973%; height: 10px; text-align: center;&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;Boolean&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 15px;&quot;&gt;
&lt;td style=&quot;width: 13.21699%; text-align: center; height: 15px;&quot;&gt;&lt;b&gt;endswith&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 49.26351%; height: 15px;&quot;&gt;대상 문자열에서 끝나는 문자열이 입력 받은 끝 문자열과 일치여부 판단&lt;/td&gt;
&lt;td style=&quot;width: 28.7599%; height: 15px;&quot;&gt;대상.endswith(끝 문자열)&lt;/td&gt;
&lt;td style=&quot;width: 8.75973%; height: 15px; text-align: center;&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;Boolean&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 13.21699%; text-align: center; height: 17px;&quot;&gt;&lt;b&gt;strip&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 49.26351%; height: 17px;&quot;&gt;문자열의 앞뒤(좌우) 공백을 모두 삭제합니다.&lt;/td&gt;
&lt;td style=&quot;width: 28.7599%; height: 17px;&quot;&gt;대상.strip()&lt;/td&gt;
&lt;td style=&quot;width: 8.75973%; height: 17px; text-align: center;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 13.21699%; text-align: center; height: 17px;&quot;&gt;&lt;b&gt;rstrip&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 49.26351%; height: 17px;&quot;&gt;문자열의 뒤(오른쪽) 공백을 삭제합니다.&lt;/td&gt;
&lt;td style=&quot;width: 28.7599%; height: 17px;&quot;&gt;대상.rstrip()&lt;/td&gt;
&lt;td style=&quot;width: 8.75973%; height: 17px; text-align: center;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 13.21699%; text-align: center; height: 17px;&quot;&gt;&lt;b&gt;lstrip&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 49.26351%; height: 17px;&quot;&gt;문자열의 앞(왼쪽) 공백을 삭제합니다.&lt;/td&gt;
&lt;td style=&quot;width: 28.7599%; height: 17px;&quot;&gt;대상.lstrip()&lt;/td&gt;
&lt;td style=&quot;width: 8.75973%; height: 17px; text-align: center;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 13.21699%; text-align: center; height: 17px;&quot;&gt;&lt;b&gt;replace&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 49.26351%; height: 17px;&quot;&gt;기존 문자열을 새 문자열로 변환합니다.&lt;/td&gt;
&lt;td style=&quot;width: 28.7599%; height: 17px;&quot;&gt;대상.replace(기존 문자열, 새 문자열)&lt;/td&gt;
&lt;td style=&quot;width: 8.75973%; height: 17px; text-align: center;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 13.21699%; text-align: center; height: 17px;&quot;&gt;&lt;b&gt;split&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 49.26351%; height: 17px;&quot;&gt;문자열을 공백이나 다른 문자로 분리해 리스트로 반환합니다.&lt;/td&gt;
&lt;td style=&quot;width: 28.7599%; height: 17px;&quot;&gt;대상.split(분리할 문자)&lt;/td&gt;
&lt;td style=&quot;width: 8.75973%; height: 17px; text-align: center;&quot;&gt;list&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 13.21699%; text-align: center; height: 17px;&quot;&gt;&lt;b&gt;splitlines&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 49.26351%; height: 17px;&quot;&gt;문자열을 행 단위로 분리해 리스트로 반환합니다.&lt;/td&gt;
&lt;td style=&quot;width: 28.7599%; height: 17px;&quot;&gt;대상.splitlines()&lt;/td&gt;
&lt;td style=&quot;width: 8.75973%; height: 17px; text-align: center;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 13.21699%; text-align: center; height: 17px;&quot;&gt;&lt;b&gt;join&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 49.26351%; height: 17px;&quot;&gt;대상 문자열 사이에 구분자를 대입합니다.&lt;/td&gt;
&lt;td style=&quot;width: 28.7599%; height: 17px;&quot;&gt;구분자.join(대상)&lt;/td&gt;
&lt;td style=&quot;width: 8.75973%; height: 17px; text-align: center;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 13.21699%; text-align: center; height: 17px;&quot;&gt;&lt;b&gt;map&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 49.26351%; height: 17px;&quot;&gt;리스트 값들을 각각 함수에 대입합니다.&lt;/td&gt;
&lt;td style=&quot;width: 28.7599%; height: 17px;&quot;&gt;map(함수, 리스트명)&lt;/td&gt;
&lt;td style=&quot;width: 8.75973%; height: 17px; text-align: center;&quot;&gt;map&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 13.21699%; text-align: center; height: 17px;&quot;&gt;&lt;b&gt;center&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 49.26351%; height: 17px;&quot;&gt;문자열을 길이의 중앙에 정렬하고 나머지는 채울 문자로 채웁니다.&lt;/td&gt;
&lt;td style=&quot;width: 28.7599%; height: 17px;&quot;&gt;대상.center(길이, 채울 문자)&lt;/td&gt;
&lt;td style=&quot;width: 8.75973%; height: 17px; text-align: center;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 13.21699%; text-align: center; height: 17px;&quot;&gt;&lt;b&gt;ljust&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 49.26351%; height: 17px;&quot;&gt;문자열을 지정 길이 왼쪽에 정렬하고 나머지는 채울 문자로 채웁니다.&lt;/td&gt;
&lt;td style=&quot;width: 28.7599%; height: 17px;&quot;&gt;대상.ljust(길이, 채울 문자)&lt;/td&gt;
&lt;td style=&quot;width: 8.75973%; height: 17px; text-align: center;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 13.21699%; text-align: center; height: 17px;&quot;&gt;&lt;b&gt;rjust&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 49.26351%; height: 17px;&quot;&gt;문자열을 지정 길이 오른쪽에 정렬하고 나머지는 채울 문자로 채웁니다.&lt;/td&gt;
&lt;td style=&quot;width: 28.7599%; height: 17px;&quot;&gt;대상.rjust(길이, 채울 문자)&lt;/td&gt;
&lt;td style=&quot;width: 8.75973%; height: 17px; text-align: center;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 13.21699%; text-align: center; height: 17px;&quot;&gt;&lt;b&gt;zfill&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 49.26351%; height: 17px;&quot;&gt;문자열을 지정 길이 &lt;u&gt;&lt;b&gt;오른쪽&lt;/b&gt;&lt;/u&gt;에 정렬하고 나머지는 문자 0으로 채웁니다.&lt;/td&gt;
&lt;td style=&quot;width: 28.7599%; height: 17px;&quot;&gt;대상.zfill(길이)&lt;/td&gt;
&lt;td style=&quot;width: 8.75973%; height: 17px; text-align: center;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 13.21699%; text-align: center; height: 17px;&quot;&gt;&lt;b&gt;isdigit&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 49.26351%; height: 17px;&quot;&gt;숫자로만 구성되었는지 판단&lt;/td&gt;
&lt;td style=&quot;width: 28.7599%; height: 17px;&quot;&gt;대상.isdigit()&lt;/td&gt;
&lt;td style=&quot;width: 8.75973%; height: 17px; text-align: center;&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;Boolean&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 13.21699%; text-align: center; height: 17px;&quot;&gt;&lt;b&gt;isalpha&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 49.26351%; height: 17px;&quot;&gt;글자(한글, 영어)로만 구성되었는지 판단&lt;/td&gt;
&lt;td style=&quot;width: 28.7599%; height: 17px;&quot;&gt;대상.isalpha()&lt;/td&gt;
&lt;td style=&quot;width: 8.75973%; height: 17px; text-align: center;&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;Boolean&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 13.21699%; text-align: center; height: 17px;&quot;&gt;&lt;b&gt;isalnum&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 49.26351%; height: 17px;&quot;&gt;글자와 숫자가 섞여 있는지 판단&lt;/td&gt;
&lt;td style=&quot;width: 28.7599%; height: 17px;&quot;&gt;대상.isalnum()&lt;/td&gt;
&lt;td style=&quot;width: 8.75973%; height: 17px; text-align: center;&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;Boolean&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 13.21699%; text-align: center; height: 17px;&quot;&gt;&lt;b&gt;islower&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 49.26351%; height: 17px;&quot;&gt;대문자로만 구성되었는지 판단&lt;/td&gt;
&lt;td style=&quot;width: 28.7599%; height: 17px;&quot;&gt;대상.islower()&lt;/td&gt;
&lt;td style=&quot;width: 8.75973%; height: 17px; text-align: center;&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;Boolean&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 13.21699%; text-align: center; height: 17px;&quot;&gt;&lt;b&gt;isupper&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 49.26351%; height: 17px;&quot;&gt;소문자로만 구성되었는지 판단&lt;/td&gt;
&lt;td style=&quot;width: 28.7599%; height: 17px;&quot;&gt;대상.isupper()&lt;/td&gt;
&lt;td style=&quot;width: 8.75973%; height: 17px; text-align: center;&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;Boolean&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 13.21699%; text-align: center; height: 17px;&quot;&gt;&lt;b&gt;isspace&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 49.26351%; height: 17px;&quot;&gt;공백 문자로만 구성되었는지 판단&lt;/td&gt;
&lt;td style=&quot;width: 28.7599%; height: 17px;&quot;&gt;대상.isspace()&lt;/td&gt;
&lt;td style=&quot;width: 8.75973%; height: 17px; text-align: center;&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;Boolean&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;함수&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;함수:&lt;/b&gt; '무엇'을 넣으면, '어떤 것'을 돌려주는 요술 상자&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;( = 블랙박스라고 불림. 함수가 만들어지면 내부를 신경쓸 필요 없기 때문)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;함수는 외부에 별도로 존재, 메서드는 클래스 안에 존재&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;함수 안에서 전역변수를 사용하려고 할 경우 global 예약어를 이용한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>CODING/Python</category>
      <author>상 민</author>
      <guid isPermaLink="true">https://lsmin3388.tistory.com/13</guid>
      <comments>https://lsmin3388.tistory.com/13#entry13comment</comments>
      <pubDate>Tue, 21 Feb 2023 22:19:28 +0900</pubDate>
    </item>
    <item>
      <title>경북대 예비대학 파이썬교육 (6일차) (문자열, 함수와 모듈, 클래스)</title>
      <link>https://lsmin3388.tistory.com/12</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;문자열&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;쉽다. &lt;b&gt;dir(str)&lt;/b&gt;을 이용해 모르는 것이 나오면 찾아서 해결하자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;함수와 모듈&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;매개변수 미리 지정&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;함수를 선언할 때 매개변수의 기본값을 지정할 수 있다. 기본값을 지정함으로써 해당 매개변수를 생략하더라도 오류를 발생시키지 않는다.&lt;/p&gt;
&lt;pre id=&quot;code_1676899966094&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;def para_func(v1, v2, v3=0):
	return v1 + v2 + v3
    
print(para_func(10, 20))       # 30
print(para_func(10, 20, 30))   # 60&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;매개변수의 개수를 지정하지 않고 전달하는 방법&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;먼저 튜플 형식으로 받을 경우,&lt;/p&gt;
&lt;pre id=&quot;code_1676900317284&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;def para_func(*para):
    result = 0
    for i in para:
        result += i
    return result
    
print(para_func(10, 20, 30, 40))  # 매개변수는 튜플 형식으로 전달, 100&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;매개변수 앞에 *을 입력한다&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;딕셔너리로 매개변수를 받고자 원할 경우 **을 입력한다.&lt;/p&gt;
&lt;pre id=&quot;code_1676900453677&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;def para_func(**para):
    result = 0
    for i in para:
        result += para[i]
    return result
    
print(para_func(사자=10, 물고기=20, 고라니=30, 나비=40))  # 매개변수는 딕셔너리 형식으로 전달, 100&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;모듈에 대해&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;모듈&lt;/b&gt;은 함수의 집합으로 별도의 파일에 함수들을 모아 놓은 것&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;패키지(모듈 여러 개, 폴더 형태) &amp;gt; 모듈(함수 여러 개) &amp;gt; 함수&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;모듈&lt;/b&gt;은 &lt;u&gt;표준 모듈, 사용자 정의 모듈, 서드 파티 모듈&lt;/u&gt;로 나뉜다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;클래스&lt;/h2&gt;
&lt;pre id=&quot;code_1676901951647&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class Car: # 슈퍼 클래스
    
    #############################
    #########  필드 부분  #########
    #############################
    
    name = ''  # 인스턴스 변수
    speed = 0  # 인스턴스 변수
    count = 0  # 클래스 변수



    ##############################
    #########  메서드 부분  #########
    ##############################
    
    def __init__(self, value):  # 생성자 (인스턴스를 생성하면 무조건 호출되는 메서드)
                                # 매개변수가 있는 생성자, self만 있는 생성자는 기본 생성자라고 부름
        self.name = value  # 매개변수를 받아와서 인스턴스 변수에 대입 -&amp;gt; 초기값 설정
        self.speed = 40  # 초기값 설정
        Car.count += 1  # 클래스 변수 조작

        print('\n&quot;%s&quot; 이름의 자동차가 생성되었습니다!\n' % self.name)
    
    def SpeedUP(self, value):
        self.speed += value

    def SpeedDOWN(self, value):
        self.speed -= value

class Sedan(Car):  # 클래스의 상속 =&amp;gt; class 서브_클래스(슈퍼_클래스)

    def SpeedUP(self, value):  # 메서드 오버라이딩 또는 재정의 (일부 내용을 수정하기 위해 사용)
        self.speed += value
        
        if self.speed &amp;gt; 100:
            print('&quot;%s&quot; 이름의 자동차가 최고속도 규정을 위반했습니다.' % self.name)

class Truk(Car):  # 클래스의 상속 =&amp;gt; class 서브_클래스(슈퍼_클래스)

    def SpeedUP(self, value):  # 메서드 오버라이딩 또는 재정의 (일부 내용을 수정하기 위해 사용)
        self.speed += value
        
        if self.speed &amp;gt; 120:
            print('&quot;%s&quot; 이름의 자동차가 최고속도 규정을 위반했습니다.' % self.name)
            
    def SpeedDOWN(self, value):  # 메서드 오버라이딩 또는 재정의 (일부 내용을 수정하기 위해 사용)
        self.speed -= value
        
        if self.speed &amp;lt; 30:
            print('&quot;%s&quot; 이름의 자동차가 최저속도 규정을 위반했습니다.' % self.name)

class Ben(Car):
    pass # 슈퍼 클래스 메서드를 그대로 상속



    ###############################
    #########  메인코드 부분  #########
    ###############################

MyCar1 = Sedan('1호 자동차') # 인스턴스 생성
print('현재 속도:', MyCar1.speed) # MyCar1.speed : 필드 값 불러오기
MyCar1.SpeedUP(100) # 메서드의 호출
print('현재 속도:', MyCar1.speed)
MyCar1.SpeedDOWN(130) # 메서드의 호출
print('현재 속도:', MyCar1.speed)

print()
print('현재 자동차 개수:', MyCar1.count) # MyCar1.count : 클래스 변수에 접근
print()

MyCar2 = Truk('2호 자동차')
print('현재 속도:', MyCar1.speed)
MyCar2.SpeedUP(100)
print('현재 속도:', MyCar1.speed)
MyCar2.SpeedDOWN(130)
print('현재 속도:', MyCar1.speed)

print()
print('현재 자동차 개수:', MyCar1.count) # 2
print('현재 자동차 개수:', MyCar2.count) # 2. =&amp;gt; 클래스 변수는 각각의 인스턴스에 독립적으로 작용x 전체로 작용함!
print()&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>CODING/Python</category>
      <author>상 민</author>
      <guid isPermaLink="true">https://lsmin3388.tistory.com/12</guid>
      <comments>https://lsmin3388.tistory.com/12#entry12comment</comments>
      <pubDate>Mon, 20 Feb 2023 23:26:42 +0900</pubDate>
    </item>
  </channel>
</rss>