[ 이것이 코딩테스트다 ] 3일차

안영우·2020년 12월 24일
0
post-thumbnail

[ 이 시리즈에서 작성하는 내용은 이것이 코딩 테스트다 - 나동빈 에서 발췌한 내용을 인용했습니다. ]


✏️ 서론

어제는 파이썬의 자료형에 대해서 배웠다.
그 중 코딩테스트에서 가장 많이 쓰이는 코드는
1, 2차원 배열 선언인데 다음과 같다.

## 1차원
n = 10
array = [0] * n
👉🏽 [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]

## 2차원
n = 3
m = 4
array = [[0] * m for i in range(n)]
👉🏽 [[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]]

이번 시간에는 조건문, 반복문, 함수, 입출력을 배워보자.


✏️ 본론

📍 조건문

조건문은 프로그램을 작성 할 때 프로그램의 흐름을 제어하는 문법이다.
조건문을 이용하면 조건에 따라서 프로그램의 로직을 설정 할 수 있다.

조건문을 사용할 때는 if ~ elif ~ else문을 이용한다.
elif 혹은 else 부분은 경우에 따라서 사용하지 않아도 된다.

# 성적 구간에 따른 학점 정보 출력코드
score = 85

if score >= 90:
    print("성적은 90이상입니다.")
elif score >= 80:
    print("성적은 80이상입니다.")
elif score >= 70:
    print("성적은 70이상입니다.")
else:
    print("성적은 70이하입니다.")
👉🏽 성적은 80이상 입니다.

• 비교연산자

비교연산자는 특정한 두 값을 비교할 때 사용한다.
다음 표를 참고하자.

비교연산자설명
X == YX와 Y가 서로 같을 때 참(True)이다.
X != YX와 Y가 서로 다를 때 참(True)이다.
X > YX가 Y보다 클 때 참(True)이다.
X < YX가 Y보다 작을 때 참(True)이다.
X >= YX가 Y보다 크거나 같을 때 참(True)이다.
X <= YX가 Y보다 작거나 같을 때 참(True)이다.

• 논리연산자

논리연산자는 2개의 논리 값 사이의 연산을 수행 할 때 사용한다.
다음 표를 참고하자.

논리연산자설명
X and YX와 Y가 모두 참(True)일 때 참(True)이다.
X or YX와 Y중 하나만 참이어도 참이다.
not XX가 거짓일 때 참이다.

• 기타 연산자

파이썬에서 추가적으로 in 연산자와 not in 연산자를 제공한다.

여러 개의 데이터를 담는 자료형으로 리스트, 튜플, 문자열, 사전과 같은 자료형이 존재한다.

이러한 자료형은 여러 개의 데이터를 담고 있기 때문에, 자료형 안에 어떤 값이 존재하는지 확인하는 연산이 필요할 때가 있다.

다음 표를 참고하자.

기타연산자설명
X in 리스트리스트 안에 X가 들어가 있을 때 참이다.
X not in 문자열문자열 안에 X가 들어가 있지 않을 때 참이다.

리스트에서 특정한 원소의 값만 없앤다고 해보자.
다음과 같이 일반형태와 간결하게 작성한 코드가 있다.

# 일반적인 코드
array = [1, 2, 3, 4, 5, 5, 5]
remove_set = {3, 5}
result = []

for i in array:
    if i not in remove_set:
        result.append(i)
    
print(result)
👉🏽 [1, 2, 4]

# 간결한 코드
array = [1, 2, 3, 4, 5, 5, 5]
remove_set = {3, 5}
result = [i for i in array if i not in remove_set]
print(result)
👉🏽 [1, 2, 4]

📍 반복문

• while문

while문 은 조건문이 참일 때 한해서, 반복적으로 코드가 수행된다.

i = 1
result = 0

while i <=9:
    result = result + i
    i = i + 1

👉🏽 45

• for문

리스트를 사용하는 대표적인 for문의 구조는 다음과 같은데, in 뒤에 오는 데이터로는 리스트, 튜플, 문자열 등이 사용 될 수 있다.

for문에서 수를 차례대로 나열 할 때는 range(시작 값, 끝 값 + 1)를 주로 사용한다.

result = 0

for i in range(1, 10):
    result = result + i

👉🏽 45

조금 더 응용해서 2중 반복문을 사용 할 수 있는데,

중첩된 반목문은 플로이드 워셜 알고리즘, 다이나믹 프로그래밍 등의 알고리즘 문제에서 매우 많이 사용된다.

# 구구단 알고리즘
for i in range(2, 10):
    for j in range(1, 10):
        print(f'{i} X {j} = {i*j}')

👉🏽 2~ 9단까지의 곱셈

📍 함수

함수는 프로그래밍에 있어 굉장히 중요하다.

코딩테스트에서 테스트 케이스가 입력된 뒤에 테스트 케이스만큼 특정한 알고리즘을 수행한 결과를 반복적으로 출력하도록 요구하는 문제가 출제되는 경우가 많다.

이럴 때는 문제 푸는 코드를 함수화하면 매우 효과적으로 풀 수 있다.

다음은 함수의 여러가지 풀이방법을 나열했다.

# 더하기 기능(return)
def add(a,b):
    return a + b

print(add(3,7))
👉🏽 10

# 더하기 기능(return 제거)
def add(a,b):
    print('함수의 결과: ', a + b)

add(3,7)
👉🏽 10

# 더하기 기능(변수의 순서 바꾸기)
def add(a,b):
    print('함수의 결과: ', a + b)

add(b = 7, a = 3)
👉🏽 10

# 더하기 기능(global 변수 선언)
a = 0

def func():
    global a
    a = a + 1

for i in range(10):
    func()

print(a)
👉🏽 10

# 더하기 기능(람다표현식)
def add(a,b):
    return a+b

print(add(3, 7))
👉🏽 10

print(lambda(a, b: a + b)(3, 7))
👉🏽 10

📍 입출력

알고리즘 문제 풀이의 첫 번째 단계는 데이터를 입력받는 것이다.
파이썬에서 데이터를 입력받을 때는 input()을 이용한다.

input()의 경우 한 줄의 문자열을 입력 받도록 해준다. 만약, 파이썬에서 입력받은 데이터를 정수형 데이터로 처리하기 위해서는 문자열을 정수로 바꾸는 int() 함수를 사용해야 한다.

또한, 여러개의 데이터를 받을 때는 데이터가 공백으로 구분되는 경우가 많다. 그래서 입력받은 문자열을 띄어쓰기로 구분하여 각각 정수 자료형의 데이터로 저장하는 코드의 사용 빈도가 매우 높다

이때는 list(map(int, input().split()))을 이용하면 된다.
동작과정은 다음과 같다.

  1. input()으로 입력받은 문자열을 split()을 이용해 공백으로 나눈 리스트로 바꾼다.
  2. map()을 이용하여 해당 리스트의 모든 원소에 int() 함수를 적용한다.
  3. 그 결과를 다시 list()를 바꾸면서 문자열을 띄어쓰기로 구분하여 각각 숫자 자료형으로 저장한다.

이 코드는 정말 많이 사용되므로, 반드시 외우고 있어야 한다.

코딩테스트에서 입력을 위해 사용되는 전형적인 소스코드는 다음과 같다.

n = int(input())
data = list(map(int, input().split()))

data.sort(reverse=True)
print(data)

만약, 공백으로 구분된 데이터의 개수가 많지 않다면, 단순히 map(int, input().split())을 이용하는것도 가능하다.

예를 들어, 문제에 첫째 줄에 n, m, k가 공백으로 구분되어 입력된다는 내용이 명시되어있다고 가정하자. 다음과 같이 사용할 수 있다.

n, m, k = map(int, input().split())

또한, 문제를 풀다보면 입력을 최대한 빠르게 받아야 하는 경우가 있다.
흔히 정렬, 이진 탐색, 최단경로 문제의 경우 매우 많은 수의 데이터가 연속적으로 입력이 되곤 한다.

예를 들어 1,000만 개가 넘는 라인이 입력되는 경우 입력을 받는 것만으로도 시간 초과를 받을 수 있다.

따라서, 언어별로 입력을 더 빠르게 받는 방법을 알고 있어야 한다.

  1. C++: cin()보다 scanf()를 권장한다.
  2. python: input()보다 sys.stdin.readline()을 권장한다.

sys 라이브러리를 사용 할 때는 한 줄 입력을 받고나서 rstrip() 함수를 꼭 호출해야한다. readline()으로 입력하면 입력 후 엔터가 줄 바꿈 기호로 입력되는데, 이 공백 문자를 제거하려면 rstrip() 함수를 사용해야한다. 이 또한 짧은 코드이니 관행적으로 외워 사용하자.

import sys

data = sys.stdin.readline().rstrip()
print(data)

다음은 출력 방법이다.
출력을 할 때는 print()를 이용하여 출력을 진행 할 수 있다.
print()는 변수나 상수를 매개변수로 입력받아 이를 표준 출력으로 출력한다. print()는 각 변수를 콤마(,)로 구분하여 매개변수로 넣을 수 있는데, 각 변수가 띄어쓰기로 구분되어 출력한다.

# 기본적인 사용법
a = 1
b = 1
print(a, b)
👉🏽 1 2

# 기본적인 사용법 2
a = 1
b = 1

print(a)
print(b)
👉🏽 1
👉🏽 2

# 출력시 오류가 발생하는 코드
a = 1
b = 1
add = a + b

print("a와 b를 더한값은" + add + "입니다.")

👉🏽 Traceback (most recent call last):
  File "/Users/yw_tech/codingTest/20.12.24./output_sample.py", line 5, in <module>
    print("a와 b를 더한값은" + add + "입니다.")
TypeError: can only concatenate str (not "int") to str

# 정상출력되는 코드
a = 1
b = 1
add = a + b

print("a와 b를 더한값은" + str(add) + "입니다.")
👉🏽 a와 b를 더한값은2입니다.

# 콤마(,)사용시 의도치 않은 공백주의 코드
a = 1
b = 1
add = a + b
print("a와 b를 더한값은", str(add), "입니다.")
👉🏽 a와 b를 더한값은 2 입니다.

# f-string 코드 (파이썬 3.6이상 버전)
a = 1
b = 1
add = a + b

print(f"a와 b를 더한값은{add}입니다.")
👉🏽 a와 b를 더한값은2입니다.

✏️ 결론

지금까지 조건문, 반복문, 함수, 입출력에 대해 배웠다.

오늘 배웠던 내용은 코딩테스트뿐아니라 다른 분야에서도 정말 유용하게 사용 할 수 있을 것 같다.

삼성전자 코딩테스트를 준비하며 소홀했던 입출력 파트에서부터 시작된 알고리즘 문제는 곧 나에게 감당하지 못할 쓰나미처럼 다가왔고 결국 패배란 결과로 돌아왔다.

꾸준히 기초부터 준비해서 당당히 코딩테스트에 통과하는 날까지 공부해야겠다.
😁 😁

profile
YW_Tech

0개의 댓글