본 포스팅은 (이코테 2021) 이것이 취업을 위한 코딩 테스트다 with 파이썬을 참고하여 공부하고 정리한 글임을 밝힙니다.
Q. 루트 노드부터 시작하여 거쳐 가는 노드 값의 합을 최대 만들고 싶을 때, 최적의 해는 무엇일까요?
이때 단순히 매 상황에서 가장 큰 값만 고른다면 어떻게 될까? 5->10->4
일반적인 상황에서 그리디 알고리즘은 최적의 해를 보장할 수 없을 때가 ㅁ낳음
코테에서는 대부분의 그리디 문제는 탐욕법으로 얻은 해가 최적의 해가 되는 상황에서, 이를 추론할 수 있어야 풀리도록 출제됨 ➡️ 즉, 탐욕법으로 얻은 해가 최적의 해가 되는 경우에 한해서 문제 출제됨
문제 설명:
당신은 음식점의 계산을 도와주는 직원. 카운터에는 거스름돈으로 사용할 500원, 100원, 50원, 10원짜리 동전이 무한히 존재한다고 가정할 때, 손님에게 거슬러 주어야 할 돈이 N원일 때 거슬러 줘야 할 동전의 최소 개수를 구하세요. (단, 거슬러 줘야 할 돈 N은 항상 10의 배수)
n = 1260
count = 0
# 큰 단위의 화폐부터 차례대로 확인
array = [500, 100, 50, 10]
for coin in array:
count += n // coin # 해당 화폐로 거슬러 줄 수 있는 동전 개수
n %= coin # 나머지 값으로 대체
print(count)
문제 설명:
- 어떠한 수 N이 1이 될 때까지 다음의 두 과정 중 하나를 반복적으로 선택 및 수행하려고 한다. 단, 두 번째 연산은 N이 K로 나누어 떨어질 때만 선택 가능하다.
1. N에서 1을 뺀다
- N을 K로 나눈다.
- ex) N=17, K=4 일 때 1번의 과정 한번만 수행하면 N=16. 이후에 2번의 과정 2번 수행하면 N=1이 됨. 즉 전체 과정을 실행한 횟수는 3
- N과 K가 주어질 때 N이 1이 될 때까지 1번 혹은 2번의 과정을 수행해야 하는 최소 횟수를 구하는 프로그램 작성하세요.
# N, K 공백 기준으로 구분 하여 입력 받기
n, k = map(int, input().split())
result = 0
while True:
# N이 K로 나누어 떨어지는 수가 될 때까지 빼기
target = (n // k) * k
result += (n - target) # 나누어 떨어지지 않는 나머지 수만큼 연산 횟수 카운트됨
n = target
# N이 K보다 작을 때 (더 이상 나눌 수 없을 때) 반복문 탈출
if n < k:
break
# K로 나누기
result += 1 # 나눌 때 연산 횟수 1번 카운트
n //= k
# 마지막으로 남은 수에 대하여 1씩 빼기
result += (n-1)
print(result)
target = (n // k) * k
: N이 K로 나누어 떨어지지 않는다 했을 때 가장 가까운 K로 나누어 떨어지는 수가 어떤 건지 찾을 때 사용문제 설명:
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)
문제 설명:
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) # 총 그룹 수 출력
문제 설명:
# N 입력 받기
n = int(input()
x, y = 1, 1
plans = input().split()
# L, R, U, D에 따른 이동 방향
dx = [0, 0, -1, 1]
dy = [-1, 1, 0, 0]
move_types = ['L', 'R', 'U', 'D']
# 이동 계획 하나씩 확인하기
for plan in plans:
# 이동 후 좌표 구하기
for i in range(len(move_types)):
if plan == move_types[i]:
nx = x + dx[i]
ny = y + dy[i]
# 공간을 벗어나는 경우 무시
if nx < 1 or ny < 1 or nx > n or ny > n:
continue
x, y = nx, ny
print(x, y)
문제 설명:
# H 입력 받기
h = int(input())
count = 0
for i in range(h+1):
for j in range(60):
for k in range(60):
# 매 시각 안에 '3'이 포함되어 있다면 카운트 증가
if '3' in str(i) + str(j) + str(k): # 시분초를 나열한 문자열 안에 3이 포함되는지
count += 1
print(count)
문제 설명:
# 현재 나이트의 위치 입력받기
input_data = input()
row = int(input_data[1])
column = int(ord(input_data[0])) - int(ord('a')) + 1
# 나이트가 이동할 수 있는 8가지 방향 정의
steps = [(-2, -1), (-1, -2), (1, -2), (2, -1), (2, 1), (1, 2), (-1, 2), (-2, 1)]
# 8가지 방향에 대하여 각 위치로 이동이 가능한지 확인
result = 0
for step in steps:
# 이동하고자 하는 위치 확인
next_row = row + step[0]
next_column = colum + step[1]
# 해당 위치로 이동 가능하다면 카운트 증가
if next_row >= 1 and next_row <= 8 and next_column >= 1 and next_column <= 8:
result += 1
print(result)
ord
: 문자로 들어온 값을 아스키코드로 바꾸고, 그 값을 문자 'a'의 아스키코드로 바꾼 값을 뺀 후 + 1을 더해줌으로써 위치 찾기 가능(문자 'a'에 대한 상대적 위치)문제 설명:
data = input()
result = []
value = 0
# 문자 하나씩 확인하며
for x in data:
# 알파벳이면 결과 리스트에 삽입
if x.isalpha():
result.append(x)
# 숫자면 따로 더하기
else:
value += int(x)
# 알파벳 오름차순 정렬
result.sort()
# 숫자가 하나라도 존재하는 경우 가장 뒤에 삽입
if value != 0:
result.append(str(value))
# 최종 결과 출략 (리스트를 문자열로 변환하여 출력)
print(''.join(result))