(파이썬) 그리디 알고리즘, 구현: 시뮬레이션과 완전탐색

0Kim_jae·2023년 3월 8일
0

알고리즘

목록 보기
2/10

그리디 알고리즘 (greedy)

현재 상태에서 보는 선택지 중에서 최선의 선택지가 최선이라 가정하는 알고리즘 이다.

  • 문제를 풀기위한 최소한의 아이디어는 있어야 한다.
  • 일반적으로 최적의 해를 보장하지 못한다.
  • 선택이 최적의 해가 맞는지 정당성 분석이 필요하다.

그리디 알고리즘 예제


#https://www.youtube.com/watch?v=2zjoKjt97vQ&list=PLRx0vPvlEmdAghTr5mXQxGpHjWqSz0dgC&index=3

# N, K 를 공백을 기준으로 구분하여 입력 받기
n, k = map(int, input().split())

reslut = 0

while True:
	# N이 K로 나누어 떨어지는 수가 될 때까지 빼기
    target = (n // k) * k
    result += (n - target)
    n = target
    # N이 K보다 작을 때 (더이상 나눌 수 없을 때) 반복문 탈출
    if n < k:
    	break
    # K로 나눈기
    result +=1
    n //= k

# 마지막으로 남은 수에 대하여 1씩 빼기
print(x, y)

구현 (Implementation)

  • 풀이를 떠올리는 것은 쉽지만 소스코드로 옮기기 어려운 문제를 지칭한다.

  • 구현 유형의 예시는 다음과 같다.

 * 알고리즘은 간단한데 코드가 지나칠 만큼 길어지는 문제
 * 실수 연산을 다루고, 특정 소수점 자리까지 출력해야 하는 문제
 * 문자열을 특정한 기준에 따라서 끊어 처리해야 하는 문제
 * 적절한 라이브러리를 찾아서 사용해야 하는 문제

구현 예제(행렬, Matrix)




#https://www.youtube.com/watch?v=2zjoKjt97vQ&list=PLRx0vPvlEmdAghTr5mXQxGpHjWqSz0dgC&index=3

# N 입력
n = int(input())
x, y = 1, 1
palns = input().split()

# L, R, U, D 에 따른 이동 방향
dx = [0, 0, -1, 1]
dy = [-1, 1, 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 ofr ny < 1 or nx > 1, ny > n:
        	continue
        # 이동 수행
        x, y = nx, ny

# 도착위치 출력
print(x, y)

구현 예제 (완전 탐색)



#https://www.youtube.com/watch?v=2zjoKjt97vQ&list=PLRx0vPvlEmdAghTr5mXQxGpHjWqSz0dgC&index=3

# 현재 나이트의 위치 입력 받기
input_data = input()
row = int(input_data[1])
column = int(ord(inpuy_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 colum = column + step[1]
    # 해당 위치로 이동이 가능하다면 카운트 증가
    if next_row >= 1 and next_row <= 8 and next_colum >= 1 and next_colum <= 8:
    	result += 1

# 경우의 수 출력
print(result)

0개의 댓글