본 내용은 "이것이 코딩 테스트다" 교재를 바탕으로 작성하였습니다.

코딩테스트를 위한 Phython 문법 - 자료형

파이썬의 자료형은 C/C++, 자바와 같은 다른 언어에서 사용되는 기본 자료형을 제공할 뿐만아니라, 사전 자료형, 집합 자료형 등 강력한 기능을 제공하는 자료형을 기본으로 내장하고 있어서 매우 편리하다.

  • 대부분의 언어에서는 HashMap과 같은 별도의 라이브러리를 이용해야 파이썬의 사전 자료형 기능을 구현할 수 있지만, 파이썬에서는 기본 자료형이 이를 지원해서 구현에 편리한 장점을 가지고 있다.

수 자료형

코딩 테스트에서 가장 기본적인 문법이다.

📍 정수형

정수형(Integer)은 말 그대로 정수를 다루는 자료형이다. 정수형에는 양의정수, 음의정수, 0dl dlTek.

a = 1000 			#양의 정수
print(a)			=> 1000

a = -7 				#음의 정수
print(a)			=> -7

a = 0 				#0
print(a)			=> 0

📍 실수형

실수형(Real Number)은 소수점 아래의 데이터를 포함하는 수 자료형이다.
파이썬에서는 변수에 소수점을 붙인 수를 대입하면 실수형 변수로 처리한다.
소수부가 0이거나, 정수부가 0인 소수는 0을 생략하고 작성이 가능하다.

a = 157.93 			#양의 실수
print(a)			=> 157.93

a = -1837.2 		#음의 실수
print(a)			=> -1837.2

a = 5. 				#소수부가 0일 때 0을 생략
print(a)			=> 5.0

a = -.7				#정수부가 0일 때 0을 생략
print(a)			=> -0.7

실수형 데이터를 표현하는 방식으로 파이썬에서는 e || E 를 이용한 지수 표현 방식을 이용할 수 있다.

a = 1e9				#10억의 지수 표현 방식
print(a)			=> 1000000000.0

a = 75.25e1			# 752.5
print(a)			=> 752.5

a = 3954e-3			# 3.954
print(a)			=> 3.954

보통 컴퓨터 시스템은 수 데이터를 처리할 때 2진수를 이용하며 실수를 처리할 때 부동 소수점(Floating-Point) 방식을 이용한다.
컴퓨터는 실수형을 저장하기 위해 4바이트, 8바이트라는 고정된 크기의 메모리를 할당하며, 이러한 이유로 컴퓨터는 실수 정보를 표현하는 정확도에 한계를 가지고 있다.
일반적으로 코딩테스트를 준비하기 위해서 컴퓨터가 실수를 정확히 표현하지 못한다는 사실을 기억해야한다.

a = 0.3 + 0.6
print(a)			=> 0.8999999...

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

0.899999와 같이 이러한 문제를 위해서 round() 함수를 사용하게 된다.

a = 0.3 + 0.6
print(round(a,4))		=> 0.9

if round(a,4) == 0.9:
	print(True)			=> True
else:
	print(false)

📍 수 자료형의 연산

프로그래밍에서는 사칙연산 (+, -, X, /)을 이용해서 계산한다.
여기서, 나누기 연산자(/)는 주의가 필요하다.
파이썬에서 나누기 연산자(/)는 나눠진 결과를 기본적으로 실수형으로 처리한다.
나머지 연산자(%)의 사용 때문인데, 특정한 변수 나머지만을 얻고자 한다면 (%), 몫만 얻고자 한다면 (//)이 된다. (이외 거듭제곱 연산자(**)를 비롯한 다양한 연산자들이 존재한다.

a = 7
b = 3

print (a / b)		#나누기		=> 2.333333333
print (a % b)		#나머지		=> 1
print (a // b)		#몫			=> 2
print (a ** b)		#거듭제곱		=> 343 (7의 3승)

리스트 자료형

리스트는 여러 개의 데이터를 연속적으로 담아 처리하기 위해 사용할 수 있다.
파이썬의 리스트 자료형은 C나 자바와 같은 프로그래밍 언어의 배열(Array) 기능을 포함하고 있다.
내부적으로 연결 리스트 자료구조를 채택하고 있기 때문에 append(), remove() 등의 메서드를 지원한다.
리스트 대신 배열 혹은 테이블이라고 부르기도 한다.

📍 리스트 만들기

리스트는 대괄호([])안에 원소를 넣어 초기화하며, 쉼표(,)로 원소를 구분한다.
리스트의 원소에 접근할 때는 인덱스(Index) 값을 괄호 안에 넣는다. 이때 인덱스는 0부터 시작한다.
그리고 비어있는 리스트를 선언하고자 할 때 list() 혹은 간단히 대괄호([])를 이용한다.

a = [1, 2, 3, 4, 5, 6, 7, 8, 9]
print(a)						=> [1, 2, 3, 4, 5, 6, 7, 8, 9]

#인덱스 4, 즉 다섯번째 원소에 접근
print(a[4])						=> 5

#빈 리스트 선언 방법(1)
a = list()
print(a)						=> []

#빈 리스트 선언 방법(2)
a = []
print(a)						=> []

코딩테스트 문제에서는 주로 크기가 N인 1차원 리스트를 초기화해야하는데 다음 방식으로 초기화하면 편리하다.

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

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

인덱스 값을 입력하여 리스트의 특정한 원소에 접근하는 것을 인덱싱(Indexing)이라고 한다.
파이썬의 인덱스 값은 양의 정수와 음의 정수를 모두 사용할 수 있으며, 음의 정수를 넣으면 원소를 거꾸로 탐색하게 된다.

a = [1, 2, 3, 4, 5, 6, 7, 8, 9]
#뒤에서 첫 번째 원소 출력
print(a[-1])					=> 9

#뒤에서 세 번째 원소 출력
print(a[-3])					=> 7

#네 번째 원소 값 변경
a[3] = 7
print(a)						=> [1, 2, 3, 7, 5, 6, 7, 8, 9]

또한 리스트에서 연속적인 위치를 갖는 원소들을 가져와야 할 때는 슬라이싱(Slicing)을 이용할 수 있다.
이때 대괄호 안에 콜론(:)을 넣어서 시작 인덱스와 끝 인덱스 -1을 설정할 수 있다.

a = [1, 2, 3, 4, 5, 6, 7, 8, 9]

#두 번째 원소부터 네번째 원소 까지
print(a[1:4])					=> [2, 3, 4]

📍 리스트 컴프리헨션

리스트 컴프리센션은 리스트를 초기화하는 방법 중 하나이다.
리스트 컴프리헨션을 이용하면 대괄호([]) 안에 조건문과 반복문을 넣는 방식으로 리스트를 초기화할 수 있다.

#0부터 19까지의 수 중에서 홀수만 포함하는 리스트
array = [i for i in range(20) if i % 2 == 1]

print(array)					=> [1, 3, 5, 7, 9, 11, 13, 15, 17, 19]

일반 적인 소스 코드

array = []
for i in range(20):
	if i % 2 == 1:
    	array.append(i)

print(array)
  • 1부터 9까지 수의 제곱값을 포함하는 리스트
array = [i * i for i in range(1, 10)]

print(array) 					=> [1, 4, 9, 16, 25, 36, 49, 64, 81]
  • N * M 크기의 2차원 리스트 초기화
#N * M 크기의 2차원 리스트 초기화
n = 3
m = 3
array = [[0] * m for_in range(n)]
print(array)					=> [[0, 0, 0], [0, 0, 0], [0, 0, 0]]

참고로 특정 크기의 2차원 리스트를 초기화 할 때 반드시 리스트 컴프리핸션을 이용해야 한다.
(N * M 크기의 2차원 리스트를 초기화 한다면, 의도 하지 않는 결과가 나올수 있다.)

n = 3
m = 4
array = [[0] * m] *n
print(array)					=>[[0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0]]

array[1][1] =5
print(array)					=>[[0, 5, 0], [0, 5, 0], [0, 5, 0], [0, 5, 0]]

특정한 크기를 가지는 2차원 리스트를 초기화할 때는 리스트 컴프리헨션을 이용해야 하는 점을 기억한다.

📍 리스트 관련 기타 메서드

리스트와 관련한 기타 메서드를 사용하면 리스트 자료형을 효과적으로 이용할 수 있다.

a = [1, 4, 3]
print("기본 리스트: ", a)			=> 기본 리스트: [1, 4, 3]
  • 🌟append()
    시간복잡도: O(1)
    리스트에 원소를 하나 삽입할 때 사용한다.
# 리스트에 원소 삽입
a.append(2)
print(a)						=> [1, 4, 3, 2]
  • sort()
    시간복잡도: O(NlogN)
    1) 기본 정렬 기능으로 오름차순으로 정렬한다.
    2) 내림차순으로 정렬한다.sort(reverse=True)
# 1) 오름차순 정렬
a.sort()
print(a)						=> [1, 2, 3, 4]

# 2) 내림차순 정렬
a.sort(reverse = True)
print(a)						=> [4, 3, 2, 1]
  • reverse
    시간복잡도: O(N)
    리스트 원소의 순서를 모두 뒤집어 놓는다.
# 리스트 원소 뒤집기
a.reverse()
print(a)						=> [1, 2, 3, 4]
  • 🌟insert()
    시간복잡도: O(N)
    특정 인덱스 위치에 원소를 삽일할 때 사용
# 특정 인덱스에 데이터 추가 (2에 3을 추가)
a.insert(2,3)
print(a)						=> [1, 2, 3, 3, 4]
  • count()
    시간복잡도: O(N)
    리스트에서 특정한 값을 가지는 데이터의 개수를 셀 때 사용
# 특정 값인 데이터 개수 세기
print(a.count(3))				=> 2
  • 🌟remove()
    시간복잡도: O(N)
    특정한 값을 갖는 원소를 제거하는데, 값을 가진 원소가 여러 개면 하나만 제거한다.
# 특정 값 데이터 삭제
a.remove(1)
print(a)						=> [2, 3, 3, 4]

# 특정한 값을 모두 제거하는 방법
a = [1, 2, 3, 4, 5, 5, 5]
remove_set = {3, 5}

#remove_set에 포함되지 않는 값만을 저장
result = [i for i in a if i not in remove_set]
print(result)					=> [1, 2, 4]

문자열 자료형

📍 문자열 초기화

data = 'Hello World'
print(data)

data = "Don'you know \"Python\"?"		=> Don't you know "Python"?
print(data)

📍 문자열 연산

# 문자열 덧셈
a = "Hello"
b = "kakao"

print(a + " " + b)				=> Hello kakao

# 문자열 변수를 양의 정수와 곱하는 경우
a = "String"
print(a*3)						=> StringStringString

# 인덱싱과 슬라이싱
a = "ABCDEF"
print(a[2 : 4])						=> StringStringString

튜플 자료형

파이썬의 튜플 자료형은 리스트와 거의 비슷하지만 아래와의 차이점이 존재한다.

  • 튜플은 한 번 선언되면 변경할 수 없다.
  • 리스트는([])를 이용하는데 튜플은 소괄호(())를 이용한다.

사전 자료형

사전 자료형은 키(Key)와 값(Value)의 쌍으로 데이터를 가지는 자료형이다.
파이썬의 사전 자료형은 내부적으로 해시테이블(Hash Table)을 이용해서 기본적으로 데이터의 검색 및 수정에 있어 O(1)의 시간에 처리할 수 있다.
키-값 쌍으로 구성된 데이터를 처리함에 있어서는 '리스트' 보다 빠르게 동작한다는 것을 기억할 필요가 있다.

data = dict()
data['Key1'] = 'Value1'
data['Key2'] = 'Value2'
data['Key3'] = 'Value3'

print(data)					=> {'Key1':'Value1','Key2':'Value2','Key3':'Value3'}

사전 자료형에 특정한 원소가 있는지 검사할 때는 '원소 in 사전'의 형태를 사용할 수 있다.

data = dict()
data['Key1'] = 'Value1'
data['Key2'] = 'Value2'
data['Key3'] = 'Value3'

if 'Key1' in data:
	print("'Key1'을 키로 가지는 데이터가 존재합니다.")

📍 사전 자료형 관련 함수

키와 값을 별도로 사용하기 위해서는 아래의 함수를 이용한다.

  • keys(): 키 데이터만 뽑아 리스트로 이용한다.
  • values(): 값 데이터만 뽑아 리스트로 이용한다.
data = dict()
data['카카오'] = 'kakao'
data['네이버'] = 'naver'

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

print(key_list)				=> dict_keys(['카카오', '네이버'])
print(value_list)			=> dict_values(['kakao', 'naver'])

# 각 키에 따른 값을 하나씩 출력
for key in key_list:		=> kakao
	print(data[key])		   naver

집합 자료형

  • 중복을 허용하지 않는다.
  • 순서가 없다.

리스트나 튜플의 경우 순서가 존재하여 인덱싱을 통해서 자료형의 값을 얻을수 있었던 반면, 사전 자료형과 집합 자료형의 경우는 순거가 존재하지 않아 인덱싱으로 값을 얻을 수 없다,
또한 집합 자료형에서는 키가 존재하지 않고 값 데이터만을 담게 된다. (시간복잡도: O(1))

# 집합 자료형 초기화 방법(1)
data = set([1, 1, 2, 3, 4, 4, 5])
print(data)

# 집합 자료형 초기화 방법(2)
data = {1, 1, 2, 3, 4, 4, 5}
print(data)

📍 집합 자료형의 연산

a = {1, 2, 3, 4, 5}
b = {3, 4, 5, 6, 7}

print(a | b) # 합집합		=> {1, 2, 3, 4, 5, 6, 7}
print(a & b) # 교집합		=> {3, 4, 5}
print(a - b) # 차집합		=> {1, 2}

📍 집합 자료형 관련 함수

  • add(): 하나의 집합 데이터에 값을 추가
  • update(): 여러 개의 값을 한꺼번에 추가하고자 할 때 사용
  • remove(): 특정한 값을 제거할 때 이용
data = {1, 2, 3}
print(data)			=> {1, 2, 3}

# 새로운 원소 추가
data.add(4)
print(data)			=> {1, 2, 3, 4}

# 여러 개 원소 추가
data.update([5, 6])	
print(data)			=> {1, 2, 3, 4, 5, 6}

# 특정한 값을 갖는 원소 삭제
data.remove(3)
print(data)			=> {1, 2, 4, 5, 6}
profile
👾ISTP의 개발자 도전기🧐

0개의 댓글

Powered by GraphCDN, the GraphQL CDN