[이코테] 2. 파이썬 문법 부수기 - (1). 수, 리스트 자료형
Algorithm/이코테2021

[이코테] 2. 파이썬 문법 부수기 - (1). 수, 리스트 자료형

반응형

 

 

자료형

파이썬의 자료형 : 정수형, 실수형, 복소수형, 문자열, 리스트, 튜플, 사전 등.

파이썬은 기본적으로 자료형이 가지고 있는 기능이 다양&강력!!

다른 프로그래밍 언어와 비교했을 때, 자료형만 정확히 이해하고 있어도 매우 다양한 종류의 프로그램을 작성할 수 있음.

파이썬의 리스트 자료형은 C++의 Vector 라이브러리, Java의 array list 라이브러리가 제공하는 기본 기능을 이미 갖고 있음. 별도의 표준 라이브러리를 불러와서 사용하지 않아도 다른 언어의 라이브러리 단에서 제공하는 강력한 기능들을 매우 쉽고 간결하게 이용할 수 있다는 장점이 있음.

코테에서 정수형, 실수형이 가장 많이 사용됨.

 

 

수 자료형

정수형(Integer)

양의 정수, 음의 정수, 0

 

실수형(Real Number)

소수부가 0이거나 정수부가 0인 소수는 0을 생략하고 작성 가능.

a = 5.
print(a)
#Output : 5.0

a = -.7
print(a)
#Output : -0.7
더보기

실수형 더 알아보기

오늘날 가장 널리 쓰이는 IEEE754 표준에서는 실수형을 저장하기 위해 4바이트, 혹은 8바이트의 고정된 크기의 메모리를 할당하므로, 컴퓨터 시스템은 실수 정보를 표현하는 정확도에 한계를 가질 수 밖에 없음.

 

예를 들어서, 10진수 체계에서는 0.3 + 0.6 = 0.9, 로 정확히 떨어짐.

2진수에서는 0.9를 정확히 표현할 방법X.

컴퓨터는 최대한 가깝게 표현하지만, 미세한 오차 발생O.

 

그래서 권장하는 방법으로는 "round() 함수"를 이용하여 (셋째 자리에서)반올림!!

123.456을 소수 셋째 자리에서 반올림하려면 round(123.456, 2 )

Output : 123.46

 

a = 0.3 + 0.6

#False
print(a)

if a == 0.9:
  print(True)
else:
  print(False)


#True
print(round(a, 5))

if round(a, 5) == 0.9:
  print(True)
else:
  print(False)

 

 

지수 표현 방식

실수형으로 처리됨.

a = 9e10
print(a)
#Output : 90000000000.0

 

그래서, 정수형으로 처리하기 위해서는 a = int(9e10) 와 같이 int로 감싸줘야함.

추가적으로  a = int(9e10)를 권장한다네, 왜? 실수 연산 오차로 인한 오류 예방 가능.

 

수 자료형의 연산

수 자료형에서는 사칙연산, 나머지 연산자 많이 사용됨.

단. 나누기 연산자(/) 결과 "실수형"으로 반환!! 하므로 꼭 기억.

다양한 로직 설계 시, 나머지 연산자(%)를 이용해야 할 때가 많음.

    ex. a가 홀수인지 체크해야하는 경우.

이외에 몫 연산자(//), 거듭 제곱 연산자(**) 등이 있음.

a = 7
b = 3

print(a/b)
#output : 2.3333333333333335

print(a%b)
#output : 1

print(a//b)
#output : 2

print(a**b)
#output : 343

print(a ** 0.5)
#output : 2.6457513110645907

 

리스트 자료형

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

C or Java에서의 배열(Array)의 기능  연결 리스트와 유사한 기능 지원.

C++의 STL vector와 기능적으로 유사.리스트 대신 "배열" 혹은 "테이블"이라고 부르기도 함.

 

리스트 자료형 초기화

대괄호([]) or list()

쉼표(,)로 원소 구분 및 인덱스(0부터 시작)를 통해서 원소 접근.

#직접 데이터를 넣어 초기화
a = [1, 2, 3, 4, 5, 6, 7]
print(a)
#output : [1, 2, 3, 4, 5, 6, 7]

#네 번째 원소만 출력
print(a[3])
#output : [4]

# 크기가 n이고, 모든 값이 0인 1차원 리스트 초기화
n = 10
a = [0] * n
print(a)
#output : [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]

 

리스트의 인덱싱과 슬라이싱

인덱싱(Indexing)이란?

  • 리스트의 특정한 원소에 접근하는 것
  • 양의 정수, 음의 정수 사용 가능.
  • 음의 정수 사용 시, 거꾸로 탐색
a = [1, 2, 3, 4, 5, 6]

print(a[1])
print(a[-1])
a[-5] = -5
print(a)

""" output
2
6
[1, -5, 3, 4, 5, 6]
"""

 

슬라이싱(Slicing)이란?

  • 리스트에서 연속적인 위치를 갖는 원소들을 가져와야할 때 사용.
  • 콜론(:)을 넣어서 시작 인덱스와 끝 인덱스를 설정할 수 있음.
  • 끝 인덱스는 실제 인덱스보다 1을 더 크게 설정해야함.
a = [1, 2, 3, 4, 5, 6, 7, 8, 9]

print(a[1:7])
#output : [2, 3, 4, 5, 6, 7]

 

리스트 컴프리헨션(List Comprehension)

리스트를 초기화 하는 방법 중 하나.

대괄호 안에 조건문과 반복문을 적용하여 리스트를 초기화 구문을 매우 간결하게 할 수 있다.

#0부터 9까지의 수를 포함하는 리스트.
array = [ i for i in range(10)]
print(array)
# output : [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

#0부터 19까지의 수 중에서 짝수만 포함하는 리스트
array = [ i for i in range(20) if i % 2 == 0]
print(array)
# output : [0, 2, 4, 6, 8, 10, 12, 14, 16, 18]

#1부터 9까지의 수들의 제곱 값을 포함하는 리스트
array = [ i * i for i in range(1, 10)]
print(array)
# output : [1, 4, 9, 16, 25, 36, 49, 64, 81]

 

리스트 컴프리헨션은 2차원 리스트를 초기화 할 때 효과적으로 사용됨.

특히 N x M 크기의 2차원 리스트를 한 번에 초기화 해야 할 때 매우 유용.

  • ex. array = [ [0] * m for _ in range(n)

만약 2차원 리스트를 초기화 할 때 다음과 같이 작성하면 예기치 않는 결과 초래..

  • ex. array = [ [0] * m ] * n
  • 전체 리스트 안에 포함된 각 리스트가 모두 같은 객체로 인식되버림.
# 올바른 방법
n = 4
m = 3

array = [ [0] * m for _ in range(n) ]
print(array)
''' output
[[0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0]]
'''


# 잘못된 방법
# N x M 크기의 2차원 리스트 초기화
n = 4 #행
m = 3 #열
array = [ [0] * m ] * n

print([0] * m)
print(array)

''' output
[0, 0, 0]
[[0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0]]
'''


array[1][1] = 5
print(array)

''' output
[[0, 5, 0], [0, 5, 0], [0, 5, 0], [0, 5, 0]]
'''

올바른 방법으로 리스트 컴프리헨션을 사용해서 만든 2차원 배열 시각화
잘못된 방법으로 만든 2차원 배열 시각화

잘못된 방법으로 만든 2차원 배열은 원소를 1개 바꿀 때도 다른 위치의 원소도 동일하게 바뀌는 상황이다.

 

 

언더바(_)는 언제 사용?

파이썬에서는, 반복을 수행하되 반복을 위한 변수의 값을 무시하고자 할 때 언더바(_)를 사용한다.

 

리스트 관련 기타 메서드

a = [1, 4, 3]
print("기본 리스트: ", a)

#리스트에 원소 삽입
a.append(2)
print("삽입: ", a)

#오름차순 정렬
a.sort()
print("오름차순 정렬: ", a)

#내림차순 정렬
a.sort(reverse=True)
print("내림차순 정렬: ", a)

########################################
a = [4, 3, 2, 1]

# 리스트 원소 뒤집기
a.reverse()
print("원소 뒤집기: ", a)

# 특정 인덱스에 데이터 추가
a.insert(2, 3)
print("인덱스 2에 3 추가: ", a)

# 특정 값인 데이터 개수 세기
print("값이 3인 데이터 개수: ", a.count(3))

# 특정 값 데이터 1개 삭제
a.remove(1)
print("값이 1인 데이터 삭제: ", a)


########################################
# 특정 값 모두 삭제
a = [1, 2, 3, 4, 5, 5, 5]
remove_set = {3, 5} #집합 자료형

# remove_list에 포함되지 않은 값만을 저장
result = [i for i in a if i not in remove_set]
print(result)

remove는 1개의 원소만 지울 수 있음.

집합을 활용하여 여러 원소도 지울 수 있다.

 

 

 

 

 

이코테 2021 시리즈 씹어먹기 by 조랭이떡

시리즈 목차

더보기
  1. 코딩테스트 출제 경향 및 알고리즘 성능 평가
  2. 파이썬 문법 부수기
    1. 수, 리스트 자료형
    2. 문자열, 튜플, 사전, 집합 자료형
    3. 기본 입출력
    4. 조건문
    5. 반복문
    6. 함수와 람다 표현식
    7. 자주 사용되는 표준 라이브러리
  3. 그리디
    1. 그리디 알고리즘이란?
    2. 거스름돈
    3. 1이 될 때 까지
    4. 곱하기 혹은 더하기
    5. 모험가 길드
  4. 구현
  5. DFS & BFS (추후링크)
  6. 정렬 알고리즘 (추후링크)
  7. 이진 탐색 (추후링크)
  8. 다이나믹 프로그래밍 (추후링크)
  9. 최단 경로 알고리즘 (추후링크)
  10. 기타 그래프 이론 (추후링크)
  11. 코딩 테스트에서 자주 출제되는 기타 알고리즘 (추후링크)
  12. 개발형 코딩 테스트 (추후링크)

 

 

반응형