
최근 IT 기업의 채용과정에서 코딩테스트 비중이 커지고 있으며, 문제해결 능력을 요구하는 알고리즘 문제 풀이에 대한 관심이 증가하고 있다.
가장 빠르게 증가하는 항만 고려하는 표기법
- 함수의 상한(차수가 가장 큰 항)만 고려
- 예) 연산횟수가
인 알고리즘의 경우 빅오표기법에서는 으로 표현됨
시간복잡도 계산 예제
연산 : 사칙연산뿐만 아니라, 비교 연산등과 같은 기본 연산을 의미

N에 따른 연산획수 BigO복잡도

# 2중 반복문을 이용하는 예제
a = [1,2,3,4,5] #(N=5)
for i in a:
for j in a:
temp = i * j
print(temp)

[<생성할 값> <for문> (<조건문>)]
[[0] * m for _ in range(n)]
- 반복을 수행하되, 반복을 위한 변수의 값을 무시하고자 할때 언더바(_)를 사용
알고리즘에서 튜플을 사용하면 좋은 경우
사전 자료형/집합 자료형

map(<함수>, <데이터>)
# 입력된 값을 공백을 기준으로 나누어 정수형으로 데이터 타입 변경
list(map(int, input().split()))
# lambda 함수 적용 가능
map(lambda <인자>:<연산>,<입력 인자>)





문제설명
당신은 음식점의 계산을 도와주는 점원입니다. 카운터에는 거스름돈으로 사용한 500원, 100원, 50원, 10원짜리 동전이 무한히 존재한다고 가정합니다. 손님에게 거슬러 주어야 할 돈이 N원일때 거슬러 주어야 할 동전의 최소 개수를 구하세요.
입력조건 : 거슬러주어야 할 돈 N(10≤N)의 자연수가 주어지며, 항상 10의 배수 (예시: 1260)
출력조건 : 거슬러주어야 할 동전의 최소개수를 출력합니다. (예시: 6)
문제해결 아이디어 : 가장 큰 화폐단위부터 돈을 거슬러 준다.
정당성 분석 : 가지고 있는 동전 중에서 큰 단위가 항상 작은 단위의 배수이므로 작은 단위의 동전들을 종합해 다른 해가 나올 수 없음
# 거스름돈
n = 1260
count = 0
# 큰화폐단위로 정렬
coin_types = [500, 100, 50, 10]
for c in coin_types:
count += n // c
n %= c
print(count)
6
문제 설명
어떠한 수 N이 1이 될 때까지 다음의 두 과정 중 하나를 반복적으로 수행하려고 합니다. 단, 두번째 연산은 N이 K로 나누어 떨어질 때만 선택할 수 있습니다. N과 K가 주어질 때 N이 1이 될때까지 1번 혹은 2번 과정을 수행해야 하는 최소 횟수를 구하세요.
1. N에서 1을 뺍니다.
2. N을 K로 나눕니다.
입력조건 : N(1≤N≤100,000)과 K(2≤K≤100,000)가 공백을 기준으로 하여 각각 자연수로 주어집니다. (예시: 25 5)
출력조건: N이 1이 될때까지 1번 혹은 2번 과정을 수행해야 하는 최소 횟수를 출력합니다. (예시: 2)
문제해결 아이디어
정당성 분석
# N, K공백을 기준으로 구분하여 입력 받기
n, k = map(int, input().split())
result = 0
while True:
# N이 K로 나누어 떨어지는 수가 될 때까지 빼기
target = (n // k) * k #target은 k의 배수
result += (n - target) #해당 배수가 될때까지 1씩 빼기
n = target
# N이 K보다 작을 때 (더 이상 나눌 수 없을 때) 반복문 탈출
if n < k:
break
# K로 나누기(K로 나누는 과정의 횟수 추가, 몫을 N으로 변경)
result += 1
n //= k
# 마지막으로 남은 수에 대하여 1씩 빼기 (1이 되어야 하므로 n-1만큼 반복)
result += (n - 1)
print(result)
25 5
2
문제설명
각 자리가 숫자(0부터 9)로만 이루어진 문자열 S가 주어졌을 때, 왼쪽부터 오른쪽으로 하나씩 모든 문자를 확인하며 숫자 사이에 'X' 혹은 '+' 연산자를 넣어 결과적으로 만들어질 수 있는 가장 큰수를 구하세요. (단, +보다 x를 먼저 계산하는 일반적인 방식과 달리, 모든 연산은 왼쪽부터 순서대로 이루어진다고 가정합니다.)
입력조건: 각 자리가 숫자로만 이루어진 문자열 S(1≤S의 길이≤20)가 주어집니다. 또한 만들어진 가장 큰수가 20억 이하의 정수가 되도록 입력이 주어집니다. (예시: 02984)
출력조건: 곱하기 또는 더하기 연산으로 만들수 있는 가장 큰수를 출력합니다. (예시: 576)
문제해결 아이디어
정당성 분석
data = input()
# 첫번째 문자를 숫자로 변경하여 대입
result = int(data[0])
# 왼쪽부터 순서대로 연산하므로 입력된 문자열을 순서대로 가져와서 계산
for i in range(1, len(data)):
# 두 수 중에서 하나라도 '0'또는 '1'인 경우, 더하기 수행
num = int(data[i])
if num <= 1 or result <= 1:
result += num
else:
result *= num
print(result)
02945 -> 360
문제설명
한 마을에 모험가가 N명 있습니다. 모험가 길드에서는 N명의 모험가를 대상으로 '공포도'를 측정했는데 '공포도'가 높은 모험가는 쉽게 공포를 느껴 위험상황에서 제대로 대처할 능력이 떨어집니다. 모험가 길드장인 제임스는 모험가 그룹을 안전하게 구성하고자 공포도가 X인 모험가는 반드시 X명 이상으로 구성한 모험가 그룹에 참여해야 여행을 떠날 수 있도록 규정했습니다. N명의 모험가에 대한 정보가 주어졌을때, 여행을 떠날 수 있는 그룹 수의 최대값을 구하세요.
입력조건
5
2 3 1 2 2출력조건 : 여행을 떠날 수 있는 그룹 수의 최대값을 출력합니다. (예시: 2)
문제해결 아이디어
정당성 분석
n = int(input())
data = list(map(int, input().split()))
data.sort()
result = 0 # 총 그룹의 수
count = 0 # 현재 그룹에 포함된 모험가의 수
for i in data: # 공포도를 낮은 것부터 하나씩 확인하며
count += 1 # 현재 그룹에 해당 모험가를 포함시키기
if count >= i: # 현재 그룹에 포함된 모험가의 수가 현재의 공포도 이상이라면, 그룹 결성
result += 1 # 총 그룹의 수 증가시키기
count = 0 # 현재 그룹에 포함된 모험가의 수 초기화
print(result) # 총 그룹의 수 출력
5
2 1 3 2 2
2
문제설명
숫자카드게임은 여러개의 숫자 카드 중에서 가장 높은 숫자가 쓰인 카드 한장을 뽑는 게임입니다. 단, 게임의 룰을 지키며 카드를 뽑아야 하고 룰은 다음과 같습니다.
숫자가 쓰인 카드들이 N x M형태로 높여있다. N은 행의 길이, M은 열의 길이를 의미한다.
먼저 뽑고자 하는 카드가 포함되어 있는 행을 선택한다.
선택된 행에 포함된 카드들 중 가장 숫자가 낮은 드를 뽑아야 한다.
입력조건
3 3
3 1 2
4 1 4
2 2 2출력조건: 게임의 룰에 맞게 선택한 카드에 적힌 숫자를 출력합니다. (예시: 2)
문제해결 아이디어
정당성 분석
# N, M을 공백을 기준으로 구분하여 입력 받기
n, m = map(int, input().split())
result = 0
# 한 줄씩 입력 받아 확인하기
for i in range(n):
data = list(map(int, input().split()))
# 현재 줄에서 '가장 작은 수' 찾기
min_value = 10001
for a in data:
min_value = min(min_value, a)
# '가장 작은 수'들 중에서 가장 큰 수 찾기
result = max(result, min_value)
print(result) # 최종 답안 출력
6 6
1 2 7
2 5 6
3 1 0
8 7 9
6 3 4
7 1
7
문제설명
한 개의 회의실이 있는데 이를 사용하고자 하는 N개의 회의에 대하여 회의실 사용표를 만들려고 합니다. 각 회의 I에 대해 시작시간과 끝나는 시간이 주어져 있고, 각 회의가 겹치지 않게 하면서 회의실을 사용할 수 있는 회의의 최대 개수를 찾아보자. 단, 회의는 한번 시작하면 중간에 중단될 수 없으며 한 회의가 끝나는 것과 동시에 다음 회의가 시작될 수 있습니다. 회의의 시작시간과 끝나는 시간이 같을 수도 있다. 이 경우에는 시작하자마자 끝나는 것으로 생각하면 된다.
입력조건
3
1 3
2 4
3 5출력조건 : 최대 사용할 수 있는 회의실의 최대 개수를 출력한다. (예시: 2)
문제해결 아이디어
# N과 회의의 시작과 끝나는 시간 정보 입력 받기
n = int(input()) # 회의의 수
meetings = [tuple(map(int, input().split())) for _ in range(n)]
result = 0 #회의실의 개수
# 회의들을 끝나는 시간 기준으로 오름차순 정렬
meetings.sort(key=lambda x: x[1])
# 회의실 사용을 위한 초기 설정
end_time = -1 # 마지막으로 선택한 회의의 끝나는 시간
for start, end in meetings:
# 현재 회의의 시작시간이 끝나는 시간 이후에 시작하면 선택
if start >= end_time:
result += 1
end_time = end # 끝나는 시간을 갱신
# 최대 회의실 개수 출력
print(result)
3
1 2
3 5
2 6
2