[이코테 2021] 알고리즘 경향 분석 및 파이썬 문법 - 1

[이코테 2021] 알고리즘 경향 분석 및 파이썬 문법 - 1

모든 예시 코드는 Repl을 이용해서 확인해본다.


알고리즘 문제 해결 과정

  1. 지문 읽기 및 컴퓨터적 사고
  2. 요구사항(복잡도) 분석
  3. 문제해결을 위한 아이디어 찾기
  4. 소스코드 설계 및 코딩

아이디어 캐치 후 간결하게 소스코드를 작성할 수 있게 한다.

**수행시간 측정 코드

import time
start_time = time.time() # 측정 시작

# 프로그램 소스코드

end_time = time.time() # 측정 종료
print("time", end_time - start_time)

파이썬 - 자료형

문자열, int형, 등 C언어의 자료형을 따로 선언할 필요없이 넣을 수 있다.
파이썬의 자료형으로는 정수형, 실수형, 복소수형, 문자열, 리스트, 튜플, 사전 등이 있다.

  • 정수형
a = 1000
print(a)

a = -7
print(a)

a = 0
print(a)
  • 실수형
a = 157.93
print(a)

a = -1837.2
print(a)

a = 5.
print(a)

a = -.7
print(a)
  • 지수 표현 방식
a = 1e9 #1,000,000,000의 지수 표현 방식
print(a)

a = 75.25e1
print(a) #752.5

a = int(1e9)
print(a) #1,000,000,000의 정수 표현 방식

a = 3.141592
print(format(a, ".2f")) #소수점 둘째자리까지 반올림
  • 실수형을 표현할 때 문제점이 있는 데, 소수점 사이의 계산을 할 때 컴퓨터는 그 값을 완벽하게 표현할 수 없다. 메모리에 소수점에 ‘가깝게’ 저장할 뿐 오차는 생긴다. –> 해결법은 round()함수를 이용해서 반올림을 한다.
a = 0.3 + 0.6
print(a)

if a == 0.9:
	print(True)
else:
	print(False)
	# False가 나온다.

print (round(a, 4))
if round(a,4) == 0.9:
	print(True)
else:
	print(False)
	# True가 나온다.

연산자

  • 2**3 = 8 #거듭제곱
  • 5%3 = 2 #나머지
  • 5//3 = 1 #몫
  • 5/3 = 1.666667 #실수 (몫 + 나머지)
  • abs, pow, max, min, round ..
  • math 라이브러리 이용 가능 from math import * (floor, ceil, sqrt.. )

list 자료형

여러 개의 데이터를 연속적으로 담아 처리하기 위해 사용하는 자료형

  • C, 자바에서의 배열(Array)의 기능 및 연결 리스트와 유사한 기능
  • C++의 STL vector
  • list는 배열(array), 테이블(table)로 불리기도 한다.
  • 인덱싱과 슬라이싱

    • 초기화 방식 : list(), []
    • 원소 접근(인덱싱) : 인덱스 값 괄호에 넣기
    a = [1, 2, 3, 4, 5, 6, 7, 8, 9]
    print(a)
    
    print(a[3])
    print(a[-2])
    
    n = 10
    a = [0] * n
    print(a)
    
    • 슬라이싱 : 리스트에서 연속적인 위치를 갖는 원소들을 가져올 때 쓰는 방법
      • 대괄호 안에 콜론 (:)을 넣어서 시작 인덱스와 끝 인덱스를 설정
        끝 인덱스는 실제 인덱스보다 1을 더 크게 설정.
    a = [1, 2, 3, 4, 5, 6, 7, 8, 9]
    print(a)
    print(a[1 : 4])
    
  • 리스트 컴프리핸션 : 리스트를 초기화하는 방법 중 하나

    • 대괄호 안에 조건문과 반복문을 적용하여 리스트를 초기화
    array = [i for i in range(10)]
    
    print(array)
    
    array = [i for i in range(20) if i % 2 == 1]
    print(array) #홀수 값만 나온다.
    
    • 2차원 리스트를 초기화할 때 효과적으로 사용
    array = [[0] * m for _in range(n)]
    print(array)
    

    ** 주의할 점 : 다음과 같이 초기화 할 경우 [[0]*m] 자체를 하나의 객체로 인식됨! 쓰지말 것

    array = [[0] * m ] * n
    print(array)
    
    array[1][1] = 5  # 여기서 모든 1행 1열의 값이 5로 바뀐다.
    
    • 언더바(_)는 언제 쓰일까? : 반복을 수행하되 반복되는 변수의 값을 무시하고자 할 때 쓰인다.
    for _ in range(5):
      print("Hello World")
    
  • 리스트 관련 메소드

    append() / sort() / reverse() / insert() / count() / remove()

문자열 자료형

  • 문자열은 큰 따옴표(“”) 작은 따옴표(‘’) 모두 문자열 출력이 가능하다
    문자열 안에 큰 따옴표를 넣고 싶을 때, 작은 따옴표 이용 반대로도 가능

  • 문자열 변수에 덧셈(+)을 이용해서 문자열을 연결시킬 수 있다. 문자열에 양의 정수를 곱하는 경우, 문자열이 그 값만큼 더해진다. 인덱싱과 슬라이싱 이용 가능 but, 특정 인덱스의 값 변경 불가

  • 문자열을 아스키 코드로 바꿔 표현하는 법 : ord / 반대 : chr

    a = "Hello"
    b = "World"
    print(a+ " " + b)
    print(a, b)
    a = "String"
    print(a*3)
    a = "ABCDEF"
    print(a[2:4])
    
    a[2] = "b" # 문자열에서는 인덱스의 값 변경 불가
    

튜플 자료형

  • 튜플 자료형은 리스트와 유사하지만 문법적 차이가 있다.
    • 한 번 선언된 값을 변경할 수 없다.
    • 소괄호(())를 이용한다.
  • 튜플은 리스트에 비해 상대적으로 공간 효율적이다.
a = (1, 2, 3, 4, 5)

print(a)

print(a[2:5])

a[2] = 5 # 튜플은 변경할 수 없다.
  • 튜플의 좋은점?
    • 서로 다른 성질의 데이터를 묶어서 관리해야 할 떄
      • 최단 경로 알고리즘에서는 (비용, 노드번호)의 형태로 튜플 사용
    • 데이터의 나열을 해싱(Hashing)의 키 값으로 사용해야 할 때 (사전, 집합에서 쓰임)
      • 튜플은 변경이 불가하므로 키값으로 사용 가능
    • 리스트보다 메모리를 효율적으로 사용할 떄

사전 자료형