본문 바로가기

과거공부모음

나의 개발일지 TIL(Today I learned) - 파이썬, 자바스크립트, 자료구조와 알고리즘

 

Today I learned

  • 파이썬
  • 자바스크립트
  • 자료구조와 알고리즘

 

파이썬

코딩 테스트를 위한 파이썬 공부

 

파이썬의 변수 선언

a = 5
b = false
c = "안녕"

 

자바스크립트처럼 let const 없이 자바처럼 int boolean 자료형 없이 변수이름 = 값 매우 간단하다

자료형은 숫자, bool, 문자열이 있다

a = 5
b = false
c = "안녕" #작은 따옴표 또는 큰 따옴표로 감싸준다

 

문자열 간의 연산도 가능하다

a = "안녕"
b = "하세요"
a + b # "안녕하세요"

 

문자열 사용하기 인덱싱

a = "안녕하세요"
a[0] # 안
a[1] # 녕
a[0:2] # 안녕

 

 

리스트는 순서가 있는 다른 자료형들의 모임

a = [1, 2, 3, 4, 5]
b = [1, 2, 3, "안녕", 4] # 다른 자료형도 들어갈 수 있다
c = []
d = [1, 2, 3, 4, [1, 2, 3]] # 중복 리스트도 가능하다
e = list()

# 리스트 사용법
a[0] # 1
d[4][0] # 1

 

딕셔너리는 키(key)와 밸류(value)의 쌍으로 이루어진 자료의 모임

a = {"name":"Bob", "age": 21}
a = {}
a = dict()

# 디셔너리 사용법
a["name"] # Bob

 

if else elif 조건문

age = 27
if age < 20:
    print("청소년입니다.")
elif age < 65:
    print("성인입니다.")
else:
    print("무료로 이용하세요!")

 

for 반복문

fruits = ['사과', '배', '감', '귤']

for fruit in fruits:
    print(fruit)


for i in range(10):
	print(i)

 

함수란? 어떠한 작업을 하는 코드의 모임

def hello():
	print("안녕!")

hello()

function calculateAvg(priceA, priceB, priceC) {
    return (priceA + priceB + priceC) / 3;
}

//함수로 구한 평균값을 템플릿 리터럴을 이용해서 출력
const price = calculateAvg(2000, 3000, 4000);
console.log(`평균가격: ${price}`);

 

튜플과 집합

튜플은 변하지 않는 리스트다

a = (1,2,3)
print(a[0]) # 1

a = (1,2,3)
a[0] = 99 # 불가능하다!

 

집합은 중복을 제거한다

student_a = ['물리2','국어','수학1','음악','화학1','화학2','체육']
student_b = ['물리1','수학1','미술','화학2','체육']

set_a = set(student_a)
set_b = set(student_b)

print(set_a & set_b)  # 교집합
print(set_a | set_b)  # 합집합
print(set_a-set_b) # 차집합

 

f-string 변수를 사용해서 문자열을 더 직관적이 만든다

name = "홍길동"

print(f"{name}의 직업은 의적이다")

 

예외처리 try - except 

try:
    x = int(input('나눌 숫자를 입력하세요: '))
    y = 10 / x
    print(y)
except:    # 예외가 발생했을 때 실행됨
    print('예외가 발생했습니다.')

0을 입력하면 예외가 발생한다

 

한 줄 프로그래밍

조건문

num = 3

result = "짝수" if num%2 == 0 else "홀수"

print(f"{num}은 {result}입니다.")

 

반복문

a_list  = [1, 3, 2, 5, 1, 2]

b_list = [a*2 for a in a_list]

print(b_list)

 

map, filter

people = [
    {'name': 'bob', 'age': 20},
    {'name': 'carry', 'age': 38},
    {'name': 'john', 'age': 7},
    {'name': 'smith', 'age': 17},
    {'name': 'ben', 'age': 27},
    {'name': 'bobby', 'age': 57},
    {'name': 'red', 'age': 32},
    {'name': 'queen', 'age': 25}
]

# 1번
def check_adult(person):
    if person['age'] > 20:
        return '성인'
    else:
        return '청소년'
# 2번 if문 한 줄 쓰기
def check_adult(person):
    return '성인' if person['age'] > 20 else '청소년'

result = map(check_adult, people)
print(list(result))
result = map(check_adult, people)
print(list(result))

# 3번 람다식 사용
result = map(lambda x: ('성인' if x['age'] > 20 else '청소년'), people)
print(list(result))
result = filter(lambda x: x['age'] > 20, people)
print(list(result))

 

함수와 매개변수

함수 매개변수에는 값을 지정할 수 있다

def cal(a, b):
    return a + 2 * b

print(cal(3, 5))
print(cal(5, 3))
print(cal(a=3, b=5))
print(cal(b=5, a=3))

 

매개변수에 디폴트 값을 지정할 수 있다

def cal2(a, b=3):
    return a + 2 * b

print(cal2(4))
print(cal2(4, 2))
print(cal2(a=6))
print(cal2(a=1, b=7))

 

입력값의 개수를 정하지 않고 모두 받을 수 있다

def call_names(*args):
    for name in args:
        print(f'{name}야 밥먹어라~')

call_names('철수','영수','희재')

 

클래스!

여러 개의 물체를 다루기 위해 클래스를 이용해 인스턴스를 만들어 조작한다

class Monster():
    hp = 100
    alive = True

    def damage(self, attack):
        self.hp = self.hp - attack
        if self.hp < 0:
            self.alive = False

    def status_check(self):
        if self.alive:
            print('살아있다')
        else:
            print('죽었다')

m = Monster()
m.damage(120)

m2 = Monster()
m2.damage(90)

m.status_check()
m2.status_check()

자바스크립트

변수 선언

let은 변수 값을 재할당해야 한다면 사용하고 const는 상수라 재할당이 필요 없을 때 사용한다

let name = 'Sinok Kim' // name이라는 변수에 Sinrok Kim 이라는 값을 할당
console.log(name) // 변수 name이 가리키고 있는 값 Sinrok Kim 을 출력

name = 'William' // 위에서 선언했던 name이라는 변수에 "William"이라는 값을 재할당
console.log(name) // 변수 name이 가리키고 있는 값 "William"을 출력

const name = "Sinok Kim" // name이라는 변수에 "Sinrok Kim"이라는 값을 할당
console.log(name) // 변수 name이 가리키고 있는 값 "Sinrok Kim"을 출력

name = "William" // 위에서 선언했던 name이라는 변수에 "William"이라는 값을 다시 재할당하려는 것이지만 실패. 에러 발생!

 

데이터 타입

숫자(Number), 문자열(String), Boolean, null, undifined

console.log(10) // 10을 출력

const myAge = 37
const yourAge = 25

console.log(myAge) // 37을 출력
console.log(yourAge) // 25를 출력


const firstName = 'Sinrok'
const lastName = 'Kim'

console.log(firstName) // Sinrok을 출력
console.log(lastName) // Kim을 출력

const isMan = true
const isWoman = false

console.log(isMan)
console.log(isWoman)

let name1 = null
console.log(name) // null을 출력

let name2
console.log(name2) // undefined를 출력

 

문자열 붙이기

+연산자로 문자열을 붙일 수 있다 그리고 문자열과 숫자가 연산되면 문자열이 된다

console.log('My' + ' car') // My car를 출력
console.log('1' + 2) // 12를 출력

 

템플릿 리터럴 파이썬의 f-string처럼 문자열을 더 직관적이게 만든다

const shoesPrice = 200000
console.log(`이 신발의 가격은 ${shoesPrice}원입니다`) 
// console.log('이 신발의 가격은 ' + shoesPrice + '원입니다') 와 동일
// + 를 활용한 문자열 붙이기보다 간결하게 표현할 수 있다는 게 보이시나요?

 

산술 연산자 숫자 데이터에 대한 여러 가지 연산

console.log(2 + 1) // 3을 출력
console.log(2 - 1) // 1을 출력
console.log(4 / 2) // 2를 출력
console.log(2 * 3) // 6을 출력
console.log(10 % 3) // 나머지(remainder) 연산자. 1을 출력
console.log(10 ** 2) // exponentiation. 10의 2승인 100을 출력

 

증감 연산자 자기 자신의 값을 증가 혹은 감소시킨다

let count = 1
const postIncrement = count++
// 증감연산자를 뒤에 놓게 되면 아래 주석으로 처리한 두 줄의 코드와 같은 내용입니다.
// postIncrement에 자기 자신의 값을 먼저 할당하고, 이후에 1을 더해서 재할당합니다. 
// const postIncrement = count
// count = count + 1
console.log(`count: ${count}, postIncrement: ${postIncrement}`) // count: 2, postIncrement: 1

 

대입 연산자 어떤 값은 변수에 할당한다

const shirtsPrice = 100000
const pantsPrice = 80000
let totalPrice = 0

totalPrice += shirtsPrice // totalPrice = totalPrice + shirtsPrice 와 동일
console.log(totalPrice)
totalPrice += pantsPrice // totalPrice = totalPrice + pantsPrice 와 동일 
console.log(totalPrice)

totalPrice -= shirtsPrice // totalPrice = totalPrice - shirtsPrice 와 동일
console.log(totalPrice)

 

비교 연산자 값을 비교해서 boolean을 리턴해준다

console.log(1 < 2) // 1이 2보다 작은가? true
console.log(2 <= 2) // 2가 2보다 작거나 같은가? true
console.log(1 > 2) // 1이 2보다 큰가? false
console.log(1 >= 2) // 1이 2보다 크거나 같은가? false

 

논리 연산자 and or not 같은 연사자들

let isOnSale = true
let isDiscountItem = true

console.log(isOnSale && isDiscountItem) // true && true 이므로 true
console.log(isOnSale || isDiscountItem) // true || true 이므로 true

isOnSale = false
console.log(isOnSale && isDiscountItem) // false && true 이므로 false
console.log(isOnSale || isDiscountItem) // false || true 이므로 true

isDiscountItem = false
console.log(isOnSale && isDiscountItem) // false && false 이므로 false
console.log(isOnSale || isDiscountItem) // false || false 이므로 false

console.log(!isOnSale) // !false 이므로 true

 

일치 연산자 두 값이 일치하는지 비교하고 boolean을 리턴해준다

console.log(1 === 1) // true
console.log(1 === 2) // false
console.log('Javascript' === 'Javascript') // true
console.log('Javascript' === 'javascript') // 대소문자나 띄워쓰기도 다 정확히 일치해야 해요. 따라서 false

 

조건문 if 조건이 맞으면 실행한다 아니면 다음 조건을 보고 아니면 else를 실행한다

const shoesPrice = 50000
if (shoesPrice < 40000) { 
	console.log('신발을 사겠습니다.')
} else if (shoesPrice <= 50000) {
	console.log('고민을 해볼게요...')  // 신발 가격이 50000원보다 작거나 같으므로 않으므로 해당 코드가 실행됨
} else {
	console.log('너무 비싸요. 신발을 사지 않겠습니다.')
}

 

반복문 while 조건이 만족하면 실행 break와 같이 써야 무한루프에 빠지지 않는다

let temperature = 20
while (temperature < 25) {
	console.log(`${temperature}도 정도면 적당한 온도입니다.`)
	temperature++ // 증감연산자를 활용해서 온도를 변화시킵니다.
}

 

반목문 for 조건 만큼 반복한다

for (let temperature = 20; temperature < 25; temperature++) {
	console.log(`${temperature}도 정도면 적당한 온도입니다.`)
}

 

함수는 특정작업을 수행하는 코드의 모음이다

// 함수의 선언
function calculateAvg(price1, price2) {
	const sum = price1 + price2 // 매개변수인 price1, price2을 변수처럼 활용!
	console.log(`두 상품의 합계는 ${sum}입니다.`)
	const avg = sum / 2
	return avg // 평균가격을 리턴!
}

 

객체는 물리적으로 존재하거나 추상적으로 생각할 수 있는 것 중에서 자신의 속성을 갖고 있고 다른 것과 식별 가능한 것

클래스를 배우고 객체를 만들어보자

클래스는 객체를 만드는 기계 공장 설계도라고 생각하자

class Notebook {
	constructor(name, price, company) {
		this.name = name
		this.price = price
		this.company = company
	}
}

클래스를 선언하고 이 클래스를 이용해 객체를 만들어보자

const notebook1 = new Notebook('MacBook', 2000000, 'Apple')

이런 식으로 클래스를 이용해 notebook1이 자신의 속성을 가진 객체가 만들어진다 클래스를 이용해 만들어진 객체는

인스턴스라고 부른다

 

메서드는 클래스 안에서 정의되어있는 함수다

// 클래스 선언
class Product {
	constructor(name, price) {
		this.name = name
		this.price = price
	}
	
    // 메서드 선언
	printInfo() {
		console.log(`상품명: ${this.name}, 가격: ${this.price}원`)
	}
}

// 객체 생성 및 메서드 호출
const notebook = new Product('Apple Macbook', 2000000)
notebook.printInfo() // 상품명: Apple Macbook, 가격: 2000000원

 

객체 리터럴 자바스크립트는 클래스를 통하지 않고 바로 객체를 만들 수 있다

const computer = {
	name: 'Apple Macbook',
	price: 20000,
	printInfo: function () {
		console.log(`상품명: ${this.name}, 가격: ${this.price}원`)
	}
}

computer.printInfo()

 

배열(Array) 순서대로 데이터를 저장할 때 쓴다 파이썬의 리스트다

// 1번째 방법
const arr1 = new Array(1, 2, 3, 4, 5)

// 2번째 방법
const arr2 = [1, 2, 3, 4, 5]

 

배열 인덱싱 배열 안의 데이터 사용하기

const rainbowColors = ['red', 'orange', 'yellow', 'green', 'blue', 'indigo', 'violet']

console.log(rainbowColors[0]) // o번 인덱스를 통해서 데이터에 접근. red
console.log(rainbowColors[1]) // 1번 인덱스를 통해서 데이터에 접근. orage
console.log(rainbowColors[2]) // 2번 인덱스를 통해서 데이터에 접근. yellow
console.log(rainbowColors[3]) // 3번 인덱스를 통해서 데이터에 접근. green
console.log(rainbowColors[4]) // 4번 인덱스를 통해서 데이터에 접근. blue
console.log(rainbowColors[5]) // 5번 인덱스를 통해서 데이터에 접근. indigo
console.log(rainbowColors[6]) // 6번 인덱스를 통해서 데이터에 접근. violet

자료구조와 알고리즘

알고리즘이란? 특정 문제를 해결하기 위한 여러 동작들의 모임 어떤 동장이 가장 효율적인가!?

알고리즘을  공부해야 하는 이유란?

1. 좋은 개발자가 되고 싶다!

좋은 개발자는 좋은 프로그램을 구현할 줄 알아한다

좋은 프로그램은 적은 공간을 이용해 빠른 속도로 수행되는 효율적인 프로그램이다

자료구조와 알고리즘을 공부해 좋은 프로그램을 만들어보자

 

2. 좋은 회사에 취직을 하고 싶다!

최근 수많은 IT기업들은 코딩 테스트를 개발자의 필수 관문으로 만들고 있다

기초적인 지식과 해결책으로 적절한 사고를 하는지 검증하기 위한 테스트

 

시간 복잡도

시간복잡도는 입력값과 문제를 해결하는 데 걸리는 시간과의 상관관계

input = [3, 5, 6, 1, 2, 4]


def find_max_num(array):
    for num in array:
        for compare_num in array:
            if num < compare_num:
                break
        else:
            return num


result = find_max_num(input)
print("정답 = 6 / 현재 풀이 값 = ", find_max_num([3, 5, 6, 1, 2, 4]))
print("정답 = 6 / 현재 풀이 값 = ", find_max_num([6, 6, 6]))
print("정답 = 1888 / 현재 풀이 값 = ", find_max_num([6, 9, 2, 7, 1888]))

이 코드로 시간 복잡도를 확인해보자 find_max_num의 함수가 시간이 얼마나 걸리는지 분석해보자

각 줄이 실행되는걸 1번의 연산이라고 생각하고 계산하자

for num in array:              # array 의 길이만큼 아래 연산이 실행
	for compare_num in array:  # array 의 길이만큼 아래 연산이 실행
		if num < compare_num:  # 비교 연산 1번 실행
			break
		else:
			return num

array 길이 * array 길이 * 1 만큼 시간이 걸린다 보통 입력값인 array의 길이는 N이라고 표현한다 이 시간을

$$ N \times N $$

으로 표현할 수 있고

그러면 우리는

$$ N^2 $$

만큼 시간이 걸리겠구나라고 생각하면 된다

 

다음 코드도 시간복잡도를 계산해 보자

def find_max_num(array):
    max_num = array[0]        
    for num in array:      
        if num > max_num:  
            max_num = num
    return max_num

result = find_max_num(input)
print("정답 = 6 / 현재 풀이 값 = ", find_max_num([3, 5, 6, 1, 2, 4]))
print("정답 = 6 / 현재 풀이 값 = ", find_max_num([6, 6, 6]))
print("정답 = 1888 / 현재 풀이 값 = ", find_max_num([6, 9, 2, 7, 1888]))
max_num = array[0] # 연산 1번 실행
for num in array:      # array 의 길이만큼 아래 연산이 실행
	if num > max_num:  # 비교 연산 1번 실행
		max_num = num  # 대입 연산 1번 실행

대입 연산 1번 + array길이 * 비교 연산 1 + 대입 연산 1

$$ 1 + 2 \times N $$

이리가 표현하고 우리는

$$ 2N + 1 $$

만큼의 시간이 걸리겠구나라고 생각하면 된다

 

두 가지 코드를 비교해보자

N의 길이 N^2 2N + 1
1 1 3
10 100 21
100 10000 201
1000 1000000 2001
10000 100000000 20001

표를 보면 앞뒤에 붙어있는 상수는 시간의 큰 영향을 주지 않는다 그래서 우리는 N만 보고 비교를 하면 된다

N^2은 N^2만큼 연산량이 필요하다 2N + 1은 N만큼의 연산량이 필요하다 만약 상수의 연산량이 필요하면 1 만큼 연산량이 필요하다라고 생각하면 된다