[Python] 코딩테스트를 위한 파이썬 문법(1) 자료형

jinjoo-jung·2023년 7월 22일
0

CodingTest

목록 보기
1/9
  • 파이썬으로 프로그램을 개발할 때는 각 모듈을 구분하여 소스코드를 작성하지만, 코딩테스트용 코드는 클래스를 작성하지 않고 함수만드로 문제 풀이에 필요한 기능을 모듈화하는 경우가 많다.
  • 이 정리는 클래스와 같은 문법은 제외하고 코딩테스트 합격에 필요한 문법 위주로 설명한다.

자료형

수 자료형

  • 정수형(Integer) : 정수를 다루는 자료형이며 정수형에는 양의 정수, 음의 정수, 0이 있다. 코딩테스트에서 출제되는 알고리즘 문제는 대부분 입력과 출력 데이터가 정수이다.
a = 100   # 양의 정수
print(a)
 
a = -7     # 음의 정수
print(a)

a = 0      # 0
print(a)

실수형

  • 실수형(Real Number) : 소수점 아래의 데이터를 포함하는 수 자료형으로 파이썬에서는 변수에 소수점을 붙인 수를 대입하면 실수형 변수로 처리한다. 소수부가 0이거나, 정수부가 0인 소수는 0을 생략하고 작성할 수 있다.
# 소수부가 0일 때 0을 생략
a = 5.
print(a) // 5.0

# 정수부가 0일때 0을 생략
a = -.7
print(a) // 0.7
  • 실수형 데이터를 표현하는 방식으로 파이썬에서는 e나 E를 이용한 지수 표현 방식을 이용할 수 있다. e 다음에 오는 수는 10의 지수부를 의미한다. 예를 들어 1e9라고 입력하게 되면, 10의 9제곱(1,000,000,000)이 된다.

  • ex) 최단 경로 문제에서는 도달할 수 없는 노드에 대하여 최단 거리를 '무한(INF)'으로 설정되곤한다. 최단 경로로 가능한 최댓값이 10억 미만이라면 무한(INF)을 표현할 때 1e9로 표현할 수 있는 것이다. 또한 큰 수를 표현할 때, 0의 개수가 많아지게 되면 자릿수가 헷갈리게 되는 경우가 많다. (혹은 987,654,321)이라고 적으면 이게 1e9와 유사할 정도로 크므로 이렇게 적기도 한다.

  • 10진수 체계에서는 0.3과 0.6을 더한 값이 0.9로 정확히 떨어지지만, 2진수에서는 0.9를 정확히 표현할 수 있는 방법이 없다. 최대한 0.9와 가깝게 표현하지만 표현한 값이 정확히 0.9가 아닌(0.899999999999)미세한 오차가 발생한다.
    => 이럴 때 소수점 값을 비교하는 작업이 필요한 문제라면 실수 값을 비교하지 못 해서 원하는 결과를 얻지 못 할 수 있따, 이럴때는 round()함수를 이용할 수 있다,

round() 함수

  • round() 함수를 호출할 때는 인자(Argument)를 넣는데 첫 번째 인자는 실수형 데이터이고, 두 번째 인자는(반올림하고자 하는 위치 -1)이다.
  • ex) 123.456을 소수점 셋째 자리에서 반올림하려면 round(123.456,2)라고 작성하면 결과는 123.46이다. (두번째 인자 없이) 인자를 하나만 넣을 때는 소수점 첫째 자리에서 반올림.

수 자료형의 연산

  • 나누기 : /
  • 나머지 : %
  • 몫: //
  • 거듭제곱 연산자 : **

리스트나 자료형

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

리스트 만들기

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

* 코딩 테스트 문제에서는 주로 크기가 N인 1차원 리스트를 초기화해야 하는데 다음 방식으로 초기화 하면 편리하다. 아래 코드는 크기가 N이고 모든 값이 0인 1차원 리스트를 초기화 하는 소스코드

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

print(a) // [0,0,0,0,0,0,0,0,0.0]

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

  • 인덱스값을 입력하여 리스트의 특정한 원소에 접근하는 것을 인덱싱(Indexing)이라고 한다.

  • 파이썬의 인덱스값은 정수를 모두 사용 가능

  • 음의 정수를 넣으면 원소를 거꾸로 탐색

  • ex) 인덱스에 -1을 넣으면 가장 마지막 원소가 출력된다.

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

  • ex) a라는 리스트의 두 번째 원소부터 네 번째 원소까지의 모든 데이터를 갖는 리스트를 가져오고 싶다면 a[1: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]

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

print(array) // [1,4,9,16,25,36, 49,64,81]
  • 이러한 리스트 컴프리헨션은 코딩 테스트에서 2차원 리스트를 초기화 할 때 매우 효과적으로 사용
  • ex) N x M 크기의 2차원 리스트를 초기화 할 때는 다음과같이 사용한다.
n = 3
m = 4

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

언더바(_)는 어떤 역할?
-> 파이썬 자료구조/알고리즘에서는 반복을 수행하되 반복을 위한 변수의 값을 무시하고자할 때 언더바()를 자주 사용한다. 단순히 'Hello world'를 5번 출력할 때는 오른쪽처럼 언더바()를 이용하여 무시할 수 있다.

for _ in range(5)
    print("Hello world")
  • 참고로, 특정 크기의 2차원 리스트를 초기화할 때는 반드시 리스트 컴프리헨션을 이용
    만약에 N x M 크기의 2차원 리스트를 초기화한다면, 의도하지 않은 결과가 나올 수 있다.

리스트 관련 기타 메서드

메서드명 | 사용법 | 설명 | 시간 복잡도

append() | 변수명.append() | 리스트에 원소를 하나 삽입할 때 사용 | O(1)

sort() | 변수명.sort() | 기본 정렬 기능으로 오름차순으로 정렬 | O(NlogN)
| 변수명.sort(reverce = True) 내림차순으로 정렬

reverse() | 변수명.reverse() | 리스트의 원소의 순서를 모두 뒤집어 놓는다 | O(N)

insert() | 변수명.insert(삽입할 위치 인덱스, 삽입할 값) |특정한 인덱스 위치에 원소를 삽입할 때 사용한다. | O(N)

count() | 변수명.count(특정값) | 리스트에서 특정한 값을 가지는 데이터의 개수를 셀 때 사용 | O(N)

remove() | 변수명.remove(특정값) | 특정한 값을 갖는 원소를 제거하는데, 값을 가진 원소가 여러 개면 하나만 제거한다.
| O(N)
-> 특정한 값의 원소를 모두 제거하려면 어떻게?

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 = "Don't you know \"python\"?"

  • 문자열 변수를 양의 정수와 곱하는 경우, 문자열이 그 값만큼 여러 번 더해진다.

  • 파이썬의 문자열을 내부적으로 리스트와 같이 처리되므로 문자열을 여러 개의 문자가 합쳐킨 리스트라고 볼 수 있다 따라서 문자열 데이터에 대해서도 마찬가지로 인덱싱과 슬라이싱을 이용할 수 있다.

프로그래밍 문법에서는 백슬래시와 같은 문자를 '이스케이프 문자'로 정해두고 큰따옴표를 출력하는 등의 특별한 목적으로 사용한다.

튜플 자료형

  • 파이썬의 튜플 자료형은 리스트와 거의 비슷한데 다음과 같은 차이가 있다.

    • 튜플은 한 번 선언된 값을 변경할 수 없다.
    • 리스트는 대괄호([])를 이용하지만 튜플은 소괄호(())를 이용한다.
  • 튜플 자료형은 그래프 알고리즘을 구현할 때 자주 사용된다. 예를들어 다익스트라 최단 경로 알고리즘처럼 최단 경로를 찾아주는 알고리즘 내부에서는 우선순위 큐를 이용하는데 해당 알고리즘에서 우선순위 큐에 한 번 들어간 값은 변경되지 않는다. 그래서 그 우선순위 큐에 들어가는 데이터를 튜플로 구성하여 소스코드를 작성한다. -> 이렇게 알고리즘을 구현하는 과정에서 일부러 튜플을 이용하게 되면 혹여나 자신이 알고리즘을 잘못 작성함으로써 변경하면 안되는 값이 변경되고 있지는 않은지 체크할 수 있다.

  • 튜플은 리스트에 비해 상대적으로 공간 효율적

  • 일반적으로, 각 원소의 성질이 서로 다를 때 주로 사용

사전 자료형

  • 사전 자료형은 키(key)와 값(value)의 쌍을 데이터로 가지는 자료형
  • 앞서 다룬 리스트나 튜플은 값을 순차적으로 저장한다는 특징이 있다.
  • 변경 불가능한 자료형이란 수 자료형, 문자열 자료형, 튜플 자료형과 같이 한 번 초기화되면 변경이 불가능한 자료형을 의미한다. 흔히 사용되지는 않지만, 튜플 자료형이 사전 자료형의 키로 사용되기도 한다.
  • 사전 자료형에서 특정한 원소가 있는지 검사할 때는 '원소 in 사전'의 형태를 사용할 수 있다. 이는 릿트나 튜플에 대해서도 사용할 수 있는 문법이다.
  • 사전 자료형을 잘 이용하기 위해서는 이와 관련한 다양한 함수에 대해서 알아야 한다. 대표적으로는 키와 값을 별도로 뽑아내기 위한 함수가 있다. 키 데이터만 뽑아서 리스트로 이용할 때는 Keys() 함수를 이용하며, 값 데이터만을 뽑아서 리스트로 이용할 때는 values()함수를 이용한다.

집합 자료형

  • 파이썬에서는 집합(Set)을 처리하기 위한 집합 자료형을 제공한다
  • 집합은 기본적으로 리스트 혹은 문자열을 이용해서 만들 수 있는데, 집합은 다음과 같은 특징이 있다.
    • 중복을 허용하지 않는다
    • 순서가 없다
  • 리스트나 튜플은 순서가 있기 때문에 인덱싱을 통해 자료형의 값을 얻을 수 있었다. 반면에 사전 자료형과 집합 자료형은 순서가 없기 때문에 인덱싱으로 값을 얻을 수 없다
  • 집합 자료형에서는 키가 존재하지 않고, 값 데이터만을 담에 된다.
  • 특정 원소가 존재하는지를 검사하는 연산의 시간 복잡도는 사전 자료형과 마찬가지로 O(1)이다.

** 특히, '특정한 데이터'가 이미 등장한 적이 있는지 여부 를 체크할 때 매우 효과적

  • 집합 자료형을 초기화할 때는 set()함수를 이용하거나, 중괄호({}) 안에 각 원소를 콤마(,)를 기준으로 구분해서 넣으면 된다.
data = set([1,1,2,3,4,4,5])
print(data)

data = {1,1,2,3,4,4,5}
print(data)

위 코드 모두 {1,2,3,4,5}가 출력이 나온다.

집합 자료형의 연산

  • 기본적인 집합 연산 : 합집합, 교집합, 차집합
  • 집합 자료형 데이터 사이에서 합집합을 계산할 때 : '|'
  • 교집합 : '&'
  • 차집합 : '-'

집합 자료형 관련 함수

  • 집합 자료형 또한 다른 자료형과 마찬가지로 다양한 함수가 존재
  • add() : 하나의 집합 데이터에 값을 추가하고자 할 때
  • update() : 여러 개의 값을 한꺼번에 추가하고자 할 때
  • remove() : 특정한 값을 제거할 때

add(), remove() 함수 모두 시간복잡도는 O(1)이다.

profile
개인 개발 공부, 정리용 🔗

0개의 댓글

관련 채용 정보