알고리즘 공부를 시작할때 가장 기초가 되는 알고리즘이 탐욕법이지만 막연하게 머릿속에 정리된 것이 부족하여 이번 기회에 정리해보려고 합니다.
본 교안은 "이것이 취업을 위한 코딩 테스트다 with 파이썬"을 참고하여 제작되었음을 알립니다.
[문제] 루트 노드부터 시작하여 거쳐가는 노드 값의 합을 최대로 만들고 싶습니다.
그리디 알고리즘은 이처럼 매 상황에서 가장 큰 값을 찾아가기는 방식이다.
n = 1260
count = 0
# 큰 단위의 화폐부터 차례대로 확인하기
array = [500, 100, 50, 10]
for coin in array:
count += n//coin # 해당 화폐로 거슬러 줄 수 있는 동전의 개수 세기
n %= coin # n = n % coin
print(count)
수행 시간: 2초
입력 조건: 첫째 줄에 N(1 <= N <= 100,000)과 K(2 <= K <= 100,000)가 공백을 기준으로 하여 각각 자연수로 주어집니다.
출력 조건: 첫째 줄에 N이 1이 될 때까지 1번 혹은 2번의 과정을 수행해야 하는 횟수의 최솟값을 출력합니다.
입력 예시:
25 5
출력 예시:
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로 나누기
n //= k # n = n//k
result += 1
# 마지막으로 남은 수에 대하여 1씩 빼기
result += (n-1)
print(result)
수행 시간: 1초, 기출: Facebook 인터뷰문제
입력 조건: 첫째 줄에 여러 개의 숫자로 구성된 하나의 문자열 S가 주어집니다.(1<= S의 길이 <= 20)
출력 조건: 첫째 줄에 만들어질 수 있는 가장 큰 수를 출력합니다.
입력 예시1:
02984
출력 예시1:
576
입력 예시2:
567
출력 예시2:
210
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명 있습니다. 모험가 길드에서는 N명의 모험가를 대상으로 '공포도'를 측정했는데, '공포도'가 높은 모험가는 쉽게 공포를 느껴 위험 상황에서 제대로 대처할 능력이 떨어집니다.
모헌가 길드장인 길동이는 모험가 그룹을 안전하게 구성하고자 공포도가 X인 모험가는 반드시 X명 이상으로 구성한 모험가 그룹에 참여해야 여행을 떠날 수 있도록 규정했습니다.
길동이는 최대 몇 개의 모험가 그룹을 만들 수 있는지 궁금합니다. N명의 모험가에 대한 정보가 주어졌을 때, 여행을 떠날 수 있는 그룹의 수의 최댓값을 구하는 프로그램을 작성하세요.
예를 들어 N=5이고, 각 모험가의 공포도가 다음과 같다고 가정합시다.
2 3 1 2 2
수행 시간: 1초
입력 조건:
첫쨰 줄에 모험가의 수 N이 주어집니다. (1 <= N <= 100,000)
둘째 줄에 각 모험가의 공포도의 값을 N이하의 자연수로 주어지며, 각 자연수는 공백으로 구분합니다.
출력 조건:
여행을 떠날 수 있는 그룹 수의 최댓값을 출력합니다.
입력 예시:
5
2 3 1 2 2
출력 예시:
2
n = int(input())
data = list(map(int, input().split()))
data.sort()
result = 0 # 총 그룹의 수
count = 0 # 현재 그룹에 포함된 모험가의 수
for x in data: # 공포도를 낮은 것부터 하니씩 확인하며
count += 1 # 현재 그룹에 해당 모험가를 포함시키기
if count >= x: # 현재 그룹에 포함된 모험가의 수가 현재의 공포도 이상이라면, 그룹 결성o
result += 1 # 총 그룹의 수 증가시키키
count = 0 # 현재 그룹에 모함된 모헌가의 수 초기화
print(result) # 총 그룹의 수 출력
for i in range(5): # 행
for j in range(5): # 열
print('(', i, ',', j, ')', end=' ')
print()
# 동, 북, 서, 남
dx = [0, -1, 0, 1]
dy = [1, 0, -1, 0]
#현재 위치
x, y = 2, 2
for i in range(4):
# 다음 위치
nx = x + dx[i]
ny = y + dy[i]
print(nx, ny)
여행가 A는 N x N 크기의 정사각형 공간 위에 서 있습니다. 이 공간은 1 x 1크기의 정사각형으로 나누어져 있습니다. 가장 왼쪽 위 좌표는 (1, 1)이며, 가장 오른쪽 아래 좌표는 (N, N)에 해당합니다. 여행가 A는 상, 하, 좌, 우 방향으로 이동할 수 있으며, 시작 좌표는 항상 (1, 1)입니다. 우리 앞에는 여행가 A가 이동할 계획이 적힌 계획서가 놓여 있습니다.
계획서에는 하나의 줄에 띄어쓰기를 기준으로 하여 L, R, U, D 중 하나의 문자가 반복적으로 적혀 있습니다. 각 문자의 의미는 다음과 같습니다.
이때 여행가 A가 N x N크기의 정사각형 공간을 벗어나는 움직임은 무시됩니다. 예를 들어 (1, 1)의 위치에서 L 혹은 U를 만나면 무시됩니다. 다음은 N = 5인 지도와 계획서입니다.
수행 시간: 2초
입력 조건:
출력 조건:
첫째 줄에 여행가 A가 최종적으로 도착할 지점의 좌표 (X, Y)를 공백을 기준으로 구분하여 출력합니다.
입력 예시:
5
R R R U D D
출력 예시:
3 4
# 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']
nx, ny = 0, 0 # 선언 및 초기화 과정 필수는 아님
# 이동 계획을 하나씩 확인하기
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)
수행 시간: 2초
입력 조건:
출력 조건:
입력 예시
5
출력 예시
11475
# 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):
count += 1
print(count)
이 문제는 전형적인 시뮬레이션 완전탐색 문제 유형이면서도 2차원 좌표를 이용하는 구현문제로 볼 수 있습니다.
수행 시간: 1초
입력 조건:
출력 조건:
입력 예시:
a1
출력 예시:
2
# 현재 나이트의 위치 입력받기
input_data = input()
row = int(input_data[1])
column = int(ord(input_data[0])) - int(ord('a')) + 1
# 나이트가 이동할 수 있는 8가지 방향 정의(dx, dy 따로따로 하지 않고 한 리스트로 표현하는 방법)
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_colunm = column + step[1]
# 해당 위치로 이동이 가능하다면 카운트 증가
if next_row >= 1 and next_row <= 8 and next_column >= 1 and next_column <= 8:
result += 1
print(result)
수행 시간: 1초, 기출: Facebook 인터뷰
입력 조건:
출력 조건:
입력 예시1:
K1KA5CB7
출력 예시1:
ABCKK13
입력 예시2:
AJKDLSI412K4JSJ9D
출력 예시2:
ADDIJJJKKLSS20
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))