알고 보면 좋은 알고리즘 상식 1(lang:python)

KIM 쥬얼리 (vs0610)·2020년 12월 20일
0
post-thumbnail

SW사관학교 정글에 입문한지 벌써 만으로 2주가 되는 오늘... 개발 그리고 코딩이라는 행위를 알고 시작한 지 6개월도 채 안된 본인은 TIL(Today I Learned)이라는 단어도 알게된 지 2주가 안되었다. 이곳 정글에서 개발자들 사이에서는 블로그에 내가 공부한, 알게된 내용을 기록하고 공유하는 문화가 있다는 것을 알게되었고, 공부라고는 대학교 입시를 위한 공부, 대학교에서 보는 시험을 보기 위한 공부 정도했던게 다인 나로서는 참 새롭고 도전해보고 싶은 마음을 들게하는 단어 TIL이었다.

자주 TIL을 남기면 좋겠다고 생각했고 현재는 아직 게으르고 할 일을 뒤로 미루는 습관이 채 다 고쳐지지 않은 상태라 천천히, 하지만 잊지않고 기록을 남겨보고자 한다. 그 중 첫 시작을 '알고 보면 좋은 알고리즘 상식'이라는 테마로 해보려고 한다. 정글에서 주변 동기들을 보면 정글에 들어오기 한참 전부터 알고리즘 문제를 풀고 취직을 준비하신 분도 계시고 알고리즘 대회도 꾸준히 참가하시는 분들도 계셨다.(정말 대단하신 분들이다... 박수 짝짝) 하지만 나는 알고리즘을 알게된 것도 고작 일주일이 되었으니 아직 갈 길이 멀다. 앞날을 생각하면 눈물이...😭 다시 돌아와서 그런 초보자인 나에게 도움이 되고 또 비슷한 초보자들이 본다면 도움이 될 수 있도록 기록을 남길 예정이고, 한번 포스팅을 할 때 파이썬 문법에 관한 내용부터 알고리즘 논리에 대한 내용까지 1~10개 사이의 소주제를 가지고 올려 가독성을 높여보도록 하겠다.

알고리즘 문제를 해결하기 위해 깨달은 것은 무작정 어려운 코드를 짜는 것보다 문제의 본질을 알아내는 것이 시간 단축의 측면, 메모리 단축의 측면, 알고리즘의 단순화 측면에서 훨씬 유리하다는 생각을 했다. 결국 계산기의 역할을 해내 사람의 부담을 줄여주려고 탄생했던 컴퓨터라는 존재를 더 잘 사용하기 위해 프로그래머는 컴퓨터의 부담을 줄여주어야 하는 상부상조의 관계에 사람과 컴퓨터가 놓이게 된 것이다. 그리고 그 관계에 속한 나는 컴퓨터의 부담을 줄여주기 위해 노력할 것이고 그 고민들이 이 블로그에 올리는 포스팅에 녹아 들어갔으면 한다. 🤔

📚 오늘의 소주제 : input, 헤더와 스위트, PEP 8, 난수생성, enumerate, 역순리스트, 복사의 깊이

1 . input() 의 기본 return값과 형변환

input(문자열) 의 기본 반환값(return)은 문자열이다. 따라서 input뒤에 따라오는 괄호에 숫자 123을 넣어도 이 123의 형은 문자열로 인식된다.

1 . 그냥 정수 123의 type을 출력해보았고
2 . number 변수에 123을 대입한 뒤에
3 . number의 type을 출력해보았다.

1 . 처음에는 정수형인 int 형이 나왔고
2 . 두번째에는 같은 123이었지만 문자형인 str type으로 출력되었다.

int형으로 바로 출력받기 위해서는 문자형에서 정수형으로 바꿔주는 형변환 과정이 필요하다. 방법은 아래와 같다.

int(input())

2 . 헤더(Header)와 스위트(Suite)

if문이나 while문 같은 조건문이나 반복문은 형태가 아래와 같다.

if 조건 :suite
(header)

이때 헤더는 if 부터 콜론(:) 까지를 나타내고 콜론은 '뒤에 스위트가 이어진다'를 의미하게 된다.

3 . 파이썬 스타일 가이드 PEP 8

개발은 여러명의 개발자가 같이 작업하는 경우가 많은 일이다. 사람마다 글쓰는 스타일이 다르듯 개발자 각자의 코드를 보면 그 스타일이나 가독성에서 차이가 날 수 밖에 없다. 이에 파이썬은 PEP 8 문서를 통해 일련의 파이썬 코딩 규칙들을 제시하고 있다. Camel Case라던가 snake_case를 언제 사용하는지부터 들여쓰기는 몇 칸을 하는지까지 등을 제시하고 있다. 링크는 아래 첨부한다.

파이썬 PEP 8 문서 링크

4 . 난수 생성

파이썬에서 랜덤하게 숫자를 생성하고 싶을때 사용하는 방법이다.

import random 
random_number = random.randint(10,999) # 10<= N <= 999 사이의 수를 생성

5 . enumerate() 함수

enumerate() 함수는 인덱스와 원소를 짝지어서 튜플로 꺼내는 파이썬의 내장함수이다. 바로 예를 보자

x = ['보석', '태양', '새힘']

for i, name in enumerate(x):
	print(f'x[{i}] = {name}')

실행결과

x[0] = 보석
x[1] = 태양
x[2] = 새힘

5 . 리스트를 역순으로 바꾸는 세가지 방법

1 . x.reverse()

2 . y = list(reversed(x))

3 . y = x[::-1]

6 . 얕은 복사와 깊은 복사(copy vs deepcopy)

바로 예시를 보면서 확인해보도록 하자.

**얕은 복사**
x = [[1,2,3],[4,5,6]]
y = x.copy() # x를 y로 얕은 복사
x[0][1] = 9
x -> [[1,9,3],[4,5,6]]
y -> [[1,9,3],[4,5,6]] # 참조하는 곳까지 복사가 된 모습

py
코드를 입력하세요

**깊은 복사**
import copy
y = copy.deepcopy(x) # x를 y로 깊은 복사 단, x는 얕은 복사의 예와 같다.
x[0][1] = 9
x -> [[1,9,3],[4,5,6]]
y -> [[1,2,3],[4,5,6]] # y 배열은 영향을 받지 않음

얕은 복사는 참조값만 복사하는 방식이고 깊은 복사는 참조값을 포함하고 참조하는 객체 자체를 복사한다는 차이가 있다.

마치며

훌륭하고 멋있는 개발자가 되기 위해서는 아직 갈 길이 멀고 난 이제 시작한 사람이다. 어떤 분야든 기초와 기본이 탄탄해야 나중에 흔들리지 않는 탑을 세울 수 있다고 배웠다. 시작하는 지금 조금 더 공들여 탄탄한 기초체력을 만들어두자. 다음 포스팅에서 봅시다! 🤟

참고

📚 자료구조와 함께 배우는 알고리즘 입문 - 파이썬편 , 이지스 퍼블리싱

0개의 댓글