<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>doyoungkim-code.log</title>
        <link>https://velog.io/</link>
        <description>새싹</description>
        <lastBuildDate>Tue, 24 Oct 2023 11:37:41 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>doyoungkim-code.log</title>
            <url>https://velog.velcdn.com/images/doyoungkim-code/profile/362be905-96b7-458a-8a8c-fefdea91d40a/image.jpg</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. doyoungkim-code.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/doyoungkim-code" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[필수 리눅스 터미널 명령어 정리]]></title>
            <link>https://velog.io/@doyoungkim-code/%ED%95%84%EC%88%98-%EB%A6%AC%EB%88%85%EC%8A%A4-%ED%84%B0%EB%AF%B8%EB%84%90-%EB%AA%85%EB%A0%B9%EC%96%B4-%EC%A0%95%EB%A6%AC</link>
            <guid>https://velog.io/@doyoungkim-code/%ED%95%84%EC%88%98-%EB%A6%AC%EB%88%85%EC%8A%A4-%ED%84%B0%EB%AF%B8%EB%84%90-%EB%AA%85%EB%A0%B9%EC%96%B4-%EC%A0%95%EB%A6%AC</guid>
            <pubDate>Tue, 24 Oct 2023 11:37:41 GMT</pubDate>
            <description><![CDATA[<h2 id="1-개요">1. 개요</h2>
<p>다른 게시물에서 자세히 다루겠지만, 필자는 프랑스의 소프트웨어 양성 프로그램 &#39;에꼴42(Ecole42)&#39; 의 교육 인프라를 수입한 교육과정인 &#39;42경산&#39;의 1기를 현재 준비중이다. 한국에서는 &#39;42서울&#39;로 이미 여러 기수들을 거쳐 인재들을 키우는 중인데, 이번에 지방에서도 소프트웨어 인재들을 키우기 위해 국내에서 2번째로 도입하여 &#39;42경산&#39;을 유치했다고 한다.</p>
<p>&#39;42서울&#39;이라는 선례가 있기에, 42과정에 관해 여러 정보들을 수집할 수 있었다. 우선 &#39;라피신 (La piscine)&#39;이라는 1달 집중 교육 과정을 거치는데, 이때 Linux 환경에서 C, shell 등을 다루게 된다고 하여 미리 기본을 익히고자 이 게시물을 작성하게 되었다.</p>
<p>개발자라면 어떤 플랫폼이나 프로그램을 사용하든 터미널에서 커맨드라인이 중요한 툴박스로 쓰인다고 하는데, 이 필수적인 내용들을 간단하게 다뤄보도록 하겠다.</p>
<h2 id="2-shell-개념">2. Shell 개념</h2>
<p><strong>shell</strong>은 운영체제 상에서 다양한 기능과 서비스를 구현하는 인터페이스를 제공한다. 텍스트로 script를 작성하여 컴퓨터에 명령하고, 이를 실행시킨다.</p>
<p>Unix에는 Bourne Shell, Bash, fish, zsh 등 여러 Shell 이 존재하는데, 이 중 하나만 잘 사용해도 비슷하게 익힐 수 있다. 그리고 여러 환경들 (Linux, Mac OS, Windows) 에서 사용 가능하며, 일반적으로 사용하는 windows 운영체제에서는 별도 설치없이 shell을 사용하기 위해 <strong>powershell</strong>을 사용한다.</p>
<p>unix shell에서는 텍스트로 모든게 이뤄져있다면, powershell은 오브젝트(객체)를 위주로 이뤄져 있어 매우 다른 터미널이다. 하지만 powershell에서 aliases 가 제공되어 unix에서 사용하는 명령어를 비슷하게 사용가능하다.</p>
<p>이후 42과정에서 unix에서 파생된 linux 환경에서 shell을 다룰 예정이지만, 현재 linux 환경이 준비되어 있지 않아 powershell로 다뤄보도록 하겠다. unix (linux) 환경에서의 명령어도 참고용으로 포함하여 작성하겠다.</p>
<h2 id="3-기본-명령어">3. 기본 명령어</h2>
<h3 id="1-man--clear">1) man / clear</h3>
<ul>
<li><strong>man</strong> : shell에서 man 이라는 명령어를 작성하면, 매뉴얼이 나온다. 코드에 대한 설명이 필요할 때 사용하는 명령어인데, man 뒤에 궁금한 코드를 작성하면 이에 대한 설명이 나온다. 설명과 옵션들이 나와있고, q를 누르면 manual에서 나올 수 있다. </li>
</ul>
<p><img src="https://velog.velcdn.com/images/doyoungkim-code/post/598262d7-aafe-4a3f-817e-8e3e5f11449e/image.png" alt=""></p>
<ul>
<li><strong>clear</strong> : 터미널 창을 깔끔하게 정리할 수 있는 clear 명령어가 있다. 아래와 같이 커맨드창의 텍스트들을 모두 지워주는 기능을 한다.</li>
</ul>
<p><img src="https://velog.velcdn.com/images/doyoungkim-code/post/26fb91b7-8051-44df-b5e3-b759b431c930/image.png" alt=""></p>
<h3 id="2-파일-탐색기">2) 파일 탐색기</h3>
<ul>
<li><strong>pwd</strong> : Print Working Directory의 약자로, 지금 내가 어떤 경로에 있는지 알 수 있는 명령어이다. 현재 있는 곳의 전체 경로를 표시해준다. </li>
</ul>
<p><img src="https://velog.velcdn.com/images/doyoungkim-code/post/20a9a93d-9151-428a-aead-aa3e77fba3f3/image.png" alt=""></p>
<ul>
<li><strong>ls</strong> : list의 약자로, 현재 경로에 어떤 폴더와 파일들이 존재하는지 볼 수 있는 명령어이다. 특정 폴더 안의 내용들을 보고 싶다면 ls 뒤에 폴더명을 작성하면 된다. unix와 powershell에서 옵션은 비슷하지만 차이가 있으므로 비교하여 작성하였다.</li>
</ul>
<p><strong>&lt; unix &gt;</strong>
ls : 사용 시 폴더와 파일들의 이름을 보여준다.
ls 폴더명 : 해당 폴더 내의 폴더와 파일명들을 보여준다.
ls -l : 파일의 이름과 사이즈 등 자세한 내용을 볼 수 있다.
ls -a : 숨겨진 파일이나 디렉토리도 포함하여 볼 수 있다.
ls -la : 숨겨진 파일이나 디렉토리를 포함하여 자세한 내용을 볼 수 있다.
open . : 현재 디렉토리를 파일탐색기에서 열고 싶을 때 작성한다.</p>
<p><strong>&lt; powershell &gt;</strong>
ls : 사용 시 폴더와 파일의 이름과 사이즈 등 자세한 내용을 볼 수 있다.
ls -name : 사용 시 폴더와 파일들의 이름을 보여준다.
ls 폴더명 : 해당 폴더 내의 폴더와 파일명들을 보여준다.
ls -force : 숨겨진 파일이나 디렉토리를 포함하여 자세한 내용을 볼 수 있다.
explorer . : 현재 디렉토리를 파일탐색기에서 열고 싶을 때 작성한다.</p>
<p><img src="https://velog.velcdn.com/images/doyoungkim-code/post/fc13077f-e149-4d92-88d3-481df79fcf9a/image.png" alt=""></p>
<ul>
<li><strong>cd</strong> : change directory 의 약자로, 현재있는 경로의 위치를 변경할 때 사용한다. 현재있는 경로에 있는 폴더 이름을 cd 뒤에 작성하면 해당 폴더로 들어가게 된다. 숨겨진 파일명을 보면 . 과 .. 이 존재하는데, . 은 현재위치, ..은 상위폴더를 의미한다. 따라서 cd ..을 이용하면 상위폴더로 경로가 바뀐다.</li>
</ul>
<p>cd 폴더명 : 현재있는 경로의 위치를 해당 폴더로 변경한다.
cd .. : 현재있는 경로의 바로 상위 경로로 이동한다.
cd ~ : 현재 설정된 사용자의 홈 디렉토리 (최상위 경로)로 이동한다.
cd - : 이전 경로로 이동한다. 왔다갔다 유용하게 사용 가능. (powershell 에서는 스크립트를 추가로 작성해야 사용가능 하다.)</p>
<p><img src="https://velog.velcdn.com/images/doyoungkim-code/post/47461f58-c8e4-4333-83e1-282b6fe483b4/image.png" alt=""></p>
<ul>
<li><strong>find</strong> : 특정한 파일이나 디렉토리를 찾을 때 사용한다. unix에서는 바로 사용 가능 하지만, powershell 에서는 find의 aliases가 제공되지 않아 다르게 사용한다.</li>
</ul>
<p><strong>&lt; unix &gt;</strong>
find . -type file -name &quot;*.txt&quot; : 디렉토리 내에 확장자가 txt로 끝나는 파일 찾기
find . -type file -name &quot;*.json&quot; : 디렉토리 내에 확장자가 json로 끝나는 파일 찾기
find . -type directory -name &quot;*2&quot; : 디렉토리 내에 2로 끝나는 이름의 디렉토리 찾기</p>
<p><strong>&lt; powershell &gt;</strong>
get-childitem -File -Filter &quot;*.txt&quot; -Recurse : 디렉토리 내에 확장자가 txt로 끝나는 파일 찾기 (recurse : 재귀적으로 검색이 되도록 설정)</p>
<p><img src="https://velog.velcdn.com/images/doyoungkim-code/post/4dd92726-258d-49d9-9e1b-1c3c59e89298/image.png" alt=""></p>
<ul>
<li><strong>which</strong> : 실행하고자하는 프로그램이 어디에 설치되어 있는지 실행경로를 확인할 수 있다. powershell 에서는 which의 aliases가 제공되지 않아 다르게 사용한다.</li>
</ul>
<p><strong>&lt; unix &gt;</strong>
which 파일명 : 해당 파일의 실행경로를 확인해볼 수 있다. </p>
<p><strong>&lt; powershell &gt;</strong>
get-command 파일명 : 해당 파일의 실행경로를 확인해볼 수 있다.
gcm 파일명 : 해당 파일의 실행경로를 확인해볼 수 있다. (명령어 줄여서 사용)</p>
<p><img src="https://velog.velcdn.com/images/doyoungkim-code/post/df6d2287-7a06-4f54-a550-792ea21559da/image.png" alt=""></p>
<h3 id="3-파일-생성-및-관리">3) 파일 생성 및 관리</h3>
<ul>
<li><p><strong>touch</strong> : 원하는 파일이름을 작성하면 새로운 파일을 만들 수 있다. 파일이 존재하지 않는다면 생성하고 기존에 존재하는 파일이면 수정 날짜가 업데이트 된다. powershell에서는 aliases가 제공되지 않아 new-item 으로 사용하면 된다.</p>
</li>
<li><p><strong>cat</strong> : 파일 안의 내용들을 빠르게 확인해볼 수 있다. 여러 파일 이름을 작성하면 모든 파일들의 컨텐츠를 한 번에 확인할 수 있다.</p>
</li>
<li><p><strong>echo</strong> : echo 뒤 큰따옴표 안에 문자열을 작성하면, 해당 문자열을 출력시켜준다. 문자열 작성 후 &#39;&gt; 파일명&#39;을 작성하여 파일에 덮어씌워 넣어줄 수 있고, &#39;&gt;&gt; 파일명&#39;을 작성하면 append 처럼 기존 문자열 뒤에 추가가 된다.</p>
</li>
</ul>
<p><img src="https://velog.velcdn.com/images/doyoungkim-code/post/b454d56a-0cd8-4891-803e-e9600ecaf4d0/image.png" alt=""></p>
<ul>
<li><strong>mkdir</strong> : make directory의 약자로, directory를 만들 수 있다. 뒤에 원하는 경로 이름을 작성하면 현재 있는 경로에서 새로운 경로가 만들어진다.</li>
</ul>
<p>mkdir -p 파일명1/파일명2/파일명3 ... : 한번에 필요한 모든 sub directory를 만들 수 있다. </p>
<p><img src="https://velog.velcdn.com/images/doyoungkim-code/post/2abb8515-1b80-4311-b325-47cad064da7d/image.png" alt=""></p>
<ul>
<li><p><strong>cp</strong> : copy의 약자로, 원하는 파일과 원하는 경로를 작성하면 파일이 경로로 복사가 된다. 경로에 파일이름을 작성하면 새로운 파일로 복사된다.</p>
</li>
<li><p><strong>mv</strong> : move의 약자로, 원하는 파일과 원하는 경로를 작성하면 파일이 경로로 이동이 된다. 경로에 파일이름을 작성하면 새로운 파일로 이동된다.</p>
</li>
<li><p><strong>rm</strong> : remove의 약자로, 원하는 파일이름을 작성하면 해당파일이 삭제가 된다. rm으로 directory를 그냥 삭제하려면 경고메시지가 나오는데, -r 옵션을 rm 뒤에 작성해야 directory가 제거가 가능하다. 경로 내의 또다른 경로들도 함께 삭제된다. (powershell 에서는 파일명 뒤에 -Recurse 를 작성하도록 한다.)</p>
</li>
</ul>
<p><img src="https://velog.velcdn.com/images/doyoungkim-code/post/b6f61e9c-e593-4610-b5a6-d34c50c05afd/image.png" alt=""></p>
<ul>
<li><strong>grep</strong> : Global Regular Expression Print 의 약자로, 검색하고자 하는 키워드와 특정 파일(또는 확장자)을 작성하여 찾는다.</li>
</ul>
<p><strong>&lt; unix &gt;</strong> 
grep 키워드 파일(또는 확장자) : 검색하고자 하는 키워드를 특정 파일 또는 확장자에서 찾는다.
grep -n 키워드 파일(또는 확장자) : 검색하고자 하는 키워드가 몇번째 줄인지 포함하여 특정 파일 또는 확장자에서 찾는다.
grep -ni 키워드 파일(또는 확장자) : 검색하고자 하는 키워드의 대소문자 상관없이 특정 파일 또는 확장자에서 찾는다.
grep -nir 키워드 파일(또는 확장자) : 현재 프로젝트의 모든 경로 내에서 찾고 싶을때 recurse(r)를 포함하여 특정 파일 또는 확장자에서 해당 키워드를 찾는다.</p>
<p><strong>&lt; powershell &gt;</strong>
select-string 파일(또는 확장자) -pattern 키워드 : 검색하고자 하는 키워드를 특정 파일 또는 확장자에서 찾는다.
select-string *, */* -pattern 키워드 : 현재 경로와 현재 경로 안의 모든 경로 내에서 해당 키워드를 찾는다. (recurse 옵션이 없어서 경로를 직접 구분)
select-string 파일(또는 확장자) -pattern 키워드 -CaseSensitive : 기본적으로 powershell에서는 대소문자를 구별하지 않으므로 소문자만 찾고 싶을 때 옵션을 추가하여 작성한다.</p>
<p><img src="https://velog.velcdn.com/images/doyoungkim-code/post/aa42f10d-036c-476f-a3e9-cbc638993ada/image.png" alt=""></p>
<h3 id="4-환경-변수-설정-및-관리">4) 환경 변수 설정 및 관리</h3>
<ul>
<li><strong>환경 변수</strong> : 내 컴퓨터에서 특정한 키워드가 어떠한 일을 하거나 경로를 저장할 수 있도록 한다.</li>
</ul>
<p><strong>&lt; unix &gt;</strong>
export 환경변수명(대문자) = &quot;디렉토리명&quot; : 내 컴퓨터에 환경 변수를 설정한다. 환경 변수에 해당 경로를 저장한다.
env : 내 컴퓨터의 모든 환경변수를 확인할 수 있다.
$환경변수명 : 설정해둔 환경변수를 사용할 때 $를 붙인다.
unset 환경변수명 : 설정해둔 환경변수를 삭제한다.</p>
<p><strong>&lt; powershell &gt;</strong>
$env:환경변수명 = &quot;디렉토리명&quot; : 내 컴퓨터에 환경 변수를 설정한다. 환경 변수에 해당 경로를 저장한다.
ls env: : 내 컴퓨터의 모든 환경변수를 확인할 수 있다.
$env:환경변수명 : 설정해둔 환경변수를 사용할 때 $env:를 붙인다.
$env:환경변수명 = &quot;&quot; : 설정해둔 환경변수를 삭제할 때 공백을 저장하면 된다.</p>
<p><img src="https://velog.velcdn.com/images/doyoungkim-code/post/5a7c9d72-c4f6-44bf-a729-e5a014f9b175/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/doyoungkim-code/post/2589d447-4c47-4ac5-b0c6-b01444c87ec8/image.png" alt=""></p>
<h3 id="5-vi-또는-vim-기초-사용">5) vi 또는 vim 기초 사용</h3>
<ul>
<li><strong>vi (또는 vim)</strong> : linux 터미널에서 이용되는 텍스트 에디터. </li>
</ul>
<p>vim 파일명 : 새로운 파일을 만들어 vim 에디터 모드를 실행한다. </p>
<p>&lt; vim 에디터 모드 진입 시 &gt;
i : 글자를 수정하거나 삭제할 수 있게 함.
esc 누르고 :wq : 수정사항 저장하며 종료
esc 누르고 :q! : 저장하지 않고 강제 종료</p>
<p>(linux 서버 환경에서는 간단한 텍스트 에디팅을 vi, vim으로 하지만, powershell 에서는 vi, vim이 없으므로 따로 설치하여 사용하여야 한다.)
<br><br><br><br></p>
<hr>
<p>참고자료 : <em>Youtube 드림코딩 (<a href="https://www.youtube.com/watch?v=EL6AQl-e3AQ">https://www.youtube.com/watch?v=EL6AQl-e3AQ</a>)</em></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[파이썬 문법 정리 - 자료형]]></title>
            <link>https://velog.io/@doyoungkim-code/%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EB%AC%B8%EB%B2%95-%EC%A0%95%EB%A6%AC-%EC%9E%90%EB%A3%8C%ED%98%95</link>
            <guid>https://velog.io/@doyoungkim-code/%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EB%AC%B8%EB%B2%95-%EC%A0%95%EB%A6%AC-%EC%9E%90%EB%A3%8C%ED%98%95</guid>
            <pubDate>Mon, 09 Oct 2023 08:13:09 GMT</pubDate>
            <description><![CDATA[<h2 id="1-자료형">1. 자료형</h2>
<h3 id="수-자료형">수 자료형</h3>
<ul>
<li><p>기본적인 자료형으로, 정수형과 실수형으로 사용되는데 대부분 정수형으로 출제되며 실수형을 다루는 문제는 출제빈도가 낮다.</p>
</li>
<li><p>정수형 (Integer) : 정수를 다루는 자료형. 양의 정수, 음의 정수, 0이 있다.</p>
<pre><code class="language-python">a = 100 # 양의 정수
print(a)
</code></pre>
</li>
</ul>
<p>b = -900 # 음의 정수
print(b)</p>
<p>c = 0 # 0
print(c)</p>
<pre><code>&gt;100
-900
0

- 실수형 (real number) : 소수점 아래의 데이터를 포함하는 수 자료형. 파이썬에서는 변수에 소수점을 붙인 수를 대입 시 실수형 변수로 처리.
```python
a = 123.45 # 양의 실수
print(a)

b = -543.21 # 음의 실수
print(b)

c = 3. # 소수부가 0일 때 0 생략하기 (실수형 변수로 처리)
print(c)

d = -.8 # 정수부가 0일 때 0 생략하기 (실수형 변수로 처리)
print(d)</code></pre><blockquote>
<p>123.45
-543.21
3.0
-0.8</p>
</blockquote>
<p>실수형 데이터 표현 방식으로 e 또는 E를 이용하여 지수 표현법을 이용 가능.
ex) 1e8 = 10의 8제곱 (e다음에 오는 수가 10의 지수부)
이를 이용해 큰수를 함축하여 INF(무한)을 표현하기도 한다.</p>
<pre><code class="language-python">a = 1e8 # 1억의 지수 표현 방식
print(a)

b = 25.39e1
print(b)

c = 2794e-3
print(c)</code></pre>
<blockquote>
<p>100000000.0
253.9
2.794</p>
</blockquote>
<p>컴퓨터 시스템은 수 데이터를 2진수로 처리하여 부동 소수점 방식을 이용하는데, 이로 인해 실수 정보 표현에 정확도가 한계가 있다. 2진수로 정확히 표현하지 못하는 수에 대해 미세한 오차가 발생하는 경우가 존재하고 이를 인지해둘 필요가 있다.</p>
<pre><code class="language-python">a = 0.3 + 0.6
print(a)

if a == 0.9:
    print(True)
else:
    print(False)</code></pre>
<blockquote>
<p>0.8999999999999999
False</p>
</blockquote>
<p>따라서 소수점 값을 비교하는 작업이 필요하다면, 반올림을 이용하여 필요한 결과를 얻을 수 있다. round() 함수를 이용하게 되는데, ()안에 첫 번째 인자는 실수형 데이터, 두 번째 인자는 반올림하고자 하는 위치 -1을 넣으면 된다.</p>
<p>ex) 123.456을 소수점 셋째 자리에서 반올림한다면
round(123.456, 2)이고, 결과는 123.46 이다. (두번째 인자가 없으면 소수점 첫째 자리 반올림)</p>
<p>코딩 테스트 문제에서 실수형 데이터를 비교할 때 보통 소수점 다섯 번째 자리에서 반올림한 결과가 같으면 정답으로 인정하는 식이다.</p>
<pre><code class="language-python">a = 0.3 + 0.6
print(round(a, 4))

if round(a,4) == 0.9:
    print(True)
else:
    print(False)</code></pre>
<blockquote>
<p>0.9
True</p>
</blockquote>
<ul>
<li>수 자료형의 연산
: 프로그래밍에서는 사칙연산(+, -, x, /) 으로 수를 계산한다. 
주의할 부분은 나누기 연산자는 기본적으로 결과를 실수형으로 처리하며,
나머지와 몫을 구하는 방법은 따로 존재한다.</li>
</ul>
<pre><code class="language-python">a = 7
b = 3

print(a/b) # 일반적인 나누기
print(a%b) # 나머지
print(a//b) # 몫</code></pre>
<blockquote>
<p>2.333333333333333335
1
2</p>
</blockquote>
<p>또한, 거듭제곱 연산자 ** 도 있고 그 외에 다양한 연산자들이 있다.</p>
<pre><code class="language-python">a = 4
b = 3

print(a ** b)</code></pre>
<blockquote>
<p>64</p>
</blockquote>
<h3 id="리스트-자료형">리스트 자료형</h3>
<ul>
<li>여러 개의 데이터를 연속적으로 담아 처리하기 위해 사용한다.</li>
<li>파이썬의 리스트 자료형은 C나 자바처럼 내부적으로 배열을 채택하고 있다.</li>
</ul>
<ul>
<li>리스트 만들기
: 대괄호 [ ] 안에 원소를 넣어 초기화하고, 쉼표로 원소를 구분한다.
원소에 접근할 때는 인덱 값을 괄호에 넣고, 인덱스 시작은 0 이다.
<br> 비어 있는 리스트 선언 : list() 또는 []</li>
</ul>
<pre><code class="language-python">a = [1, 2, 3, 4, 5, 6]  # 리스트 선언
print(a)

print(a[3]) # 3번 인덱스의 원소에 접근 = 4번째 원소에 접근함.

a = list()  # 비어있는 리스트 선언 시 (1)
print(a)

a = []      # 비어있는 리스트 선언 시 (2)
print(a)
</code></pre>
<blockquote>
<p>[1, 2, 3, 4, 5, 6]
4
[]<br>[]</p>
</blockquote>
<p>크기가 N인 1차원 리스트를 초기화하는 코딩 테스트 문제에서는 다음과 같이 작성한다.</p>
<pre><code class="language-python">n = 15
a = [0] * n
print(a)</code></pre>
<blockquote>
<p>[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]</p>
</blockquote>
<ul>
<li>리스트의 인덱싱 / 슬라이싱
: 인덱싱이란, 인덱스값을 입력하여 리스트의 특정 원소에 접근하는 것이다.
이 인덱스 값은 양의 정수, 음의 정수 모두 사용 가능하며 음의 정수는 거꾸로 탐색한다.
인덱싱을 활용하여 특정 원소의 값을 바꾸거나 출력할 수 있다.</li>
</ul>
<pre><code class="language-python">a = [1, 2, 3, 4, 5, 6, 7, 8]

print(a[2])   # 인덱스 2번 = 앞에서 3번째 원소 출력
print(a[-3])  # 인덱스 -3번 = 뒤에서 3번째 원소 출력

a[4] = 9      # 인덱스 4번 값 변경 = 앞에서 5번째 원소 변경
print(a)</code></pre>
<blockquote>
<p>3
6
[1, 2, 3, 4, 9, 6, 7, 8]</p>
</blockquote>
<p>다음으로 슬라이싱은 연속적인 위치를 갖는 원소들을 가져올 때 사용한다.
대괄호 내에 콜론 : 을 넣어 시작 인덱스와 끝 인덱스를 설정할 수 있다.</p>
<p>예를 들어 3번째 요소부터 5번째 요소까지라면 a[2 : 5] 이다.
인덱스의 시작이 0이므로 0, 1, 2 로 3번째부터 시작이고, 끝 인덱스는
1을 뺀 값의 인덱스까지 처리되어 5-1 = 4의 인덱스 위치까지 (2, 3, 4) 번 원소들을
슬라이싱 하게 되는 것이다.</p>
<pre><code class="language-python">a = [1, 2, 3, 4, 5, 6, 7, 8]

print(a[2:5]) # 3번째 요소부터 5번째 요소까지 출력
              # 2번 인덱스부터 5-1=4번 인덱스까지 출력</code></pre>
<blockquote>
<p>[3, 4, 5]</p>
</blockquote>
<ul>
<li>리스트 컴프리헨션
: 대괄호 안에 조건문과 반복문을 넣어서 리스트를 초기화하는 방법을 리스트 컴프리헨션이라고 한다.  한 줄의 소스코드로 리스트를 초기화하므로 일반적인 소스코드로 작성하는 것보다 간편하고 간결하다.</li>
</ul>
<pre><code class="language-python">array1 = [i for i in range(10) if i % 2 == 1] 
# if문과 for문을 [] 안에 넣어 리스트 컴프리헨션 활용 (0~9까지 수 중 홀수만 포함)

print(array1)

array2 = [i * i for i in range(1,10)]
# for문과 수식을 [] 안에 넣어 리스트 컴프리헨션 활용 (0~9까지 제곱값 포함)

print(array2)</code></pre>
<blockquote>
<p>[1, 3, 5, 7, 9]<br>[1, 4, 9, 16, 25, 36, 49, 64, 81]</p>
</blockquote>
<p> 또한 2차원 리스트 초기화에 효과적으로 사용된다.</p>
<pre><code class="language-python">n = 3
m = 5

array3 = [[0] * m for _ in range(n)]
# n * m 크기의 2차원 리스트 초기화 (n이 행, m이 열)
# 언더바(_)는 반복을 수행하되 반복을 위한 변수의 값을 무시하고자 할 때 사용
# 단순히 range만큼 반복하는 코드이므로, 변수를 따로 만들지 않고 _를 적는다.

print(array3)</code></pre>
<blockquote>
<p>[[0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0]]</p>
</blockquote>
<p>특정 크기의 2차원 리스트 초기화 시에는 반드시 리스트 컴프리헨션을 이용해야한다.
다음의 결과를 보면 원하지 않은 초기화가 되었음을 확인할 수 있다.</p>
<pre><code class="language-python">n = 3
m = 5

array = [[0] * m] * n  # 잘못된 초기화 방법
print(array)

array[1][1] = 3
print(array)</code></pre>
<blockquote>
<p>[[0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0]]
[[0, 3, 0, 0, 0], [0, 3, 0, 0, 0], [0, 3, 0, 0, 0]]</p>
</blockquote>
<p>실행결과를 보면 모든 행의 2번째 원소가 같은 값을 가지게 되는데,
이는 내부적으로 3개의 리스트가 동일 객체로 인식되었기 때문이다.
리스트 컴프리헨션으로 작성하면 각각 다른 객체로 초기화되기에 이를 이용하여야한다.</p>
<ul>
<li>리스트 관련 메서드</li>
</ul>
<pre><code class="language-python">a = [1, 5, 2]
print(&quot;기본 :&quot;, a)

a.append(3)   # append() : 리스트에 원소를 하나 삽입할 때 사용
print(&quot;원소 삽입 : &quot;, a)

a.sort()   # sort() : 오름차순으로 정렬
print(&quot;오름차순 정렬 : &quot;, a)

a.sort(reverse = True)  # 내림차순 정렬 시 sort(reverse = True) 작성
print(&quot;내림차순 정렬 : &quot;, a)

a.reverse()   # reverse() : 리스트 순서를 모두 뒤집음
print(&quot;순서 뒤집기 : &quot;, a)

a.insert(2,3)   # insert() : 특정 인덱스 위치에 원소 삽입
print(&quot;인덱스 2에 3 추가: &quot;, a)

print(&quot;값이 3인 데이터 수 : &quot;, a.count(3))
# count() : 리스트에서 특정 값을 가지는 데이터 개수 세기

a.remove(1) # remove() : 특정 값을 갖는 원소 제거 (값을 가진 원소 여러개면 하나만 제거)
print(&quot;값이 1인 데이터 삭제 : &quot;, a)
</code></pre>
<blockquote>
<p>기본 : [1, 5, 2]
원소 삽입 :  [1, 5, 2, 3]
오름차순 정렬 :  [1, 2, 3, 5]
내림차순 정렬 :  [5, 3, 2, 1]
순서 뒤집기 :  [1, 2, 3, 5]
인덱스 2에 3 추가:  [1, 2, 3, 3, 5]
값이 3인 데이터 수 :  2
값이 1인 데이터 삭제 :  [2, 3, 3, 5]</p>
</blockquote>
<p>insert() 는 원소의 개수가 N개일 때, 시간 복잡도가 O(N)이다.
원소 삽입 후 원소 위치를 조정해줘야 하기 때문이다.
append() 는 시간 복잡도가 O(1) 이므로 append()를 사용해도 되는 문제에
insert() 를 남발하게 되면 시간 초과가 될 수 있으니 주의.
(remove()도 insert()와 마찬가지로 시간 복잡도가 O(N)이다.)</p>
<p>추가로, 특정 값의 원소를 모두 제거하려면 리스트 컴프리헨션의 if문을 이용하면 된다. </p>
<pre><code class="language-python">array = [1, 2, 2, 2, 3, 4, 5, 5]
remove_set = [2, 5]    # remove 하고 싶은 값들의 리스트

result = [i for i in array if i not in remove_set]
# remove_set에 포함 되지않는 array의 값들만 result에 저장
print(result)</code></pre>
<blockquote>
<p>[1, 3, 4]</p>
</blockquote>
<h3 id="문자열-자료형">문자열 자료형</h3>
<ul>
<li>문자열 초기화
: 문자열 변수 초기화시 &quot; 나 &#39; 를 이용한다. 문자열 안에 &quot; 나 &#39; 가 있으면 이스케이프 문자인 백슬래시를 사용하여야 문자열 내부에 포함 시킬 수 있다.</li>
</ul>
<pre><code class="language-python">data = &#39;data everywhere&#39;
print(data)

data = &quot;don&#39;t you know \&quot;database\&quot;?&quot;
print(data)</code></pre>
<blockquote>
<p>data everywhere
don&#39;t you know &quot;database&quot;?</p>
</blockquote>
<ul>
<li>문자열 연산
: 파이썬은 문자열 연산도 지원한다. 덧셈을 이용하면 단순히 뒤의 문자열이 더해져서 연결되며, 양의 정수와 문자열을 곱하면 문자열이 그만큼 여러 번 더해지게 된다.</li>
</ul>
<pre><code class="language-python">a = &quot;Lovely&quot;
b = &quot;World&quot;

print(a + &quot; &quot; + b)

print(a * 3)</code></pre>
<blockquote>
<p>Lovely World
LovelyLovelyLovely</p>
</blockquote>
<p>문자열은 내부적으로 리스트와 같이 처리되므로 인덱싱, 슬라이싱이 가능하다.</p>
<pre><code class="language-python">a = &quot;ABCDEFG&quot;

print(a[2:5])</code></pre>
<blockquote>
<p>CDE</p>
</blockquote>
<h3 id="튜플-자료형">튜플 자료형</h3>
<p>튜플 자료형은 리스트와 거의 비슷하지만 한 번 선언된 값을 변경할 수 없고, 대괄호 대신 소괄호 () 를 이용한다.</p>
<p>튜플 데이터를 수정하는 코드를 작성해보면 원소의 대입이 불가능하여 선언된 값을 변경할 수 없다는 오류 메시지가 나오게 된다. </p>
<pre><code class="language-python">a = (1, 2, 3, 4, 5)
print(a)

a[1] = 6</code></pre>
<blockquote>
<p>TypeError: &#39;tuple&#39; object does not support item assignment</p>
</blockquote>
<p>따라서 다익스트라 최단 경로 알고리즘과 같은 그래프 알고리즘을 구현할 때는 한 번 들어간 우선순위 큐 값이 바뀌지 않기 때문에 튜플 자료형을 사용하여 작성하게 된다. 튜플이 리스트에 비해 공간 효율적이고 원소의 성질이 서로 다를 때 주로 사용한다. 예를 들어 비용과 노드번호를 튜플로 묶어서 관리한다.</p>
<h3 id="사전-자료형">사전 자료형</h3>
<p>사전 자료형은 키와 값의 쌍을 데이터로 가지는 자료형이다. 리스트와 튜플은 순차적으로 저장하여 순서가 있지만, 사전 자료형은 키를 통해 값을 찾고 순서가 없다. 내부적으로 해시 테이블을 이용하므로 O(1)의 시간 복잡도를 가진다. 키-값을 쌍으로 가지는 데이터 처리에는 리스트보다 훨씬 빠르게 동작한다.</p>
<pre><code class="language-python">data = dict()

data[&#39;꽃&#39;] = &#39;flower&#39;
data[&#39;괴물&#39;] = &#39;monster&#39;
data[&#39;햄스터&#39;] = &#39;hamster&#39;

print(data)

if &#39;꽃&#39; in data:  # 특정한 원소가 있는지 검사할 때, 원소 in 사전 이용
    print(&quot; &#39;꽃&#39;을 키로 가지는 데이터 존재함.&quot;)</code></pre>
<blockquote>
<p>{&#39;꽃&#39;: &#39;flower&#39;, &#39;괴물&#39;: &#39;monster&#39;, &#39;햄스터&#39;: &#39;hamster&#39;}
&#39;꽃&#39;을 키로 가지는 데이터 존재함.</p>
</blockquote>
<ul>
<li>사전 자료형 관련 함수
키와 값을 따로 뽑아서 활용하는 함수가 있다. keys() 함수는 키 데이터만 뽑아서, values() 함수는 값 데이터만 뽑아서 리스트로 사용한다.</li>
</ul>
<pre><code class="language-python">data = dict()

data[&#39;꽃&#39;] = &#39;flower&#39;
data[&#39;괴물&#39;] = &#39;monster&#39;
data[&#39;햄스터&#39;] = &#39;hamster&#39;

key_list = data.keys()     # 키 데이터를 담은 리스트
value_list = data.values() # 값 데이터를 담은 리스트

print(key_list)
print(value_list)

for key in key_list:  # 각 키에 따른 값을 하나씩 출력
  print(data[key])</code></pre>
<blockquote>
<p>dict_keys([&#39;꽃&#39;, &#39;괴물&#39;, &#39;햄스터&#39;])
dict_values([&#39;flower&#39;, &#39;monster&#39;, &#39;hamster&#39;])
flower
monster
hamster</p>
</blockquote>
<h3 id="집합-자료형">집합 자료형</h3>
<p>집합 자료형이란 집합을 처리하기 위해 제공하며 기본적으로 리스트나 문자열을 이용하여 만든다. 중복을 허용하지않으며 순서가 없다는 특징이 있다. 사전 자료형과 다른 점은 키가 존재하지 않고, 값 데이터만을 담는다.
특정한 데이터가 이미 등장한 적이 있는지 여부를 알고 싶을 때 효과적이며, 초기화 시에는 set() 함수를 이용하거나 {} 중괄호를 이용하여 초기화한다.</p>
<pre><code class="language-python">data = set([1, 1, 2, 2, 3, 4, 4, 4, 5])

print(data)

data = {1, 1, 2, 2, 3, 4, 4, 4, 5}

print(data)</code></pre>
<blockquote>
<p>{1, 2, 3, 4, 5}
{1, 2, 3, 4, 5}</p>
</blockquote>
<ul>
<li>집합 자료형의 연산
: 합집합, 교집합, 차집합 연산이 있고, 합집합은 | , 교집합은 &amp;, 차집합은 - 로 이용한다.</li>
</ul>
<pre><code class="language-python">a = set([1,2,3,4,5])
b = set([5,6,7,8,9])

print(a|b)
print(a&amp;b)
print(a-b)</code></pre>
<blockquote>
<p>{1, 2, 3, 4, 5, 6, 7, 8, 9}
{5}
{1, 2, 3, 4}</p>
</blockquote>
<ul>
<li>집합 자료형 관련 함수
: add() 함수를 통해 값을 추가하거나, update() 함수를 통해 여러 개의 값을 한꺼번에 추가하고, remove() 함수로 특정 값을 제거한다. (add()와 remove()는 시간 복잡도가 O(1))</li>
</ul>
<pre><code class="language-python">data = set([1,2,3,4])
print(data)

data.add(5)
print(data)

data.update([6, 7])
print(data)

data.remove(2)
print(data)</code></pre>
<blockquote>
<p>{1, 2, 3, 4}
{1, 2, 3, 4, 5}
{1, 2, 3, 4, 5, 6, 7}
{1, 3, 4, 5, 6, 7}</p>
</blockquote>
<p><em>참고서적 : 이것이 코딩 테스트다 with 파이썬 / 나동빈</em></p>
]]></description>
        </item>
    </channel>
</rss>