어제 배웠던 구현 알고리즘(완전탐색
, 시뮬레이션
)유형을 다시 한번 복습해보는 시간을 가졌다.
왕실의 나이트
알고리즘은 2가지 방법으로 풀 수 있는데 오늘 중점은 책에 나와있지 않는 방법을 풀었다는 점이다.
먼저, 책에 나와있던 코드다.
cases
변수는 이동할 방향을 나타내는 코드이다.
첫번째 코드는 cases
변수를 선언하여 new_array
, new_row
를 계산할 때 dx = case[0]
, dy = case[1]
과 같은 역할을 하게햇다.
data = input()
column = int(chr(ord(data[0]) - 48))
row = int(data[1])
count = 0
cases = [(-2, -1), (-2, 1), (2, -1), (2, 1), (-1, -2), (1, -2), (-1, 2), (1, 2)]
for case in cases:
new_column = column + case[0]
new_row = row + case[1]
if new_column > 0 and new_row > 0 and new_column <= 8 and new_row <= 8:
count = count + 1
print(new_row, new_column)
print(count)
👉🏽 입력: al
👉🏽 출력: 2
두번째코드는 dx
, dy
를 넣은 코드인데, cases
를 풀어서 작성했다.
보통 dx
, dy
를 선언하는 방식으로 알고리즘에 많이 접근한다고 했다.
data = input()
column = int(chr(ord(data[0]) - 48))
row = int(data[1])
count = 0
move_types = [True for _ in range(8)]
dx = [-2, -2, 2, 2, -1, 1, -1, 1]
dy = [-1, 1, -1, 1, -2, -2, 2, 2]
for i in range(len(move_types)):
nx = column + dx[i]
ny = row + dy[i]
if nx > 0 and ny > 0 and nx <= 8 and ny <= 8:
count = count + 1
print(count)
👉🏽 입력: al
👉🏽 출력: 2
다음은 백준에 나와있는 브루트 포스
유형 문제이다.
여러가지 풀이 방법이 있겠지만, itertools -> combination
을 적용했다.
if result < sum(card) <= m:
코드에서 result
를 추가하면 출력 값을 최소값부터 출력할 수 있다.
결과적으로 제일 나중에 나온 값을 result
로 저장해서 print
하면 된다.
나중에 잘 써먹을 수 있을것 같다.
import itertools
n, m = map(int, input().split())
cards = list(map(int, input().split()))
result = 0
# 배열값을 큰 순으로 정렬하려면 result보다 크게 범위를 설정한다.
for card in itertools.combinations(cards, 3):
if result < sum(card) <= m:
result = sum(card)
print(result)
2일 동안 구현 알고리즘을 배워봤는데,
한 문제 풀때마다 시간이 엄청 오래걸렸다.
백준에서 단계별 알고리즘에 보면 관련문제는 많은데 1문제씩 풀고 있어 진도가 엄청 느리게 나간다.
하지만, 내가 완벽하게 구조를 이해해야 다음 구문으로 넘어갈 수 있기 때문에 천천히 나가더라도 완벽하게 이해하려고 한다.
문득, 알고리즘이 어려워 포기하고 싶은 마음이 들때마다 그래도 최소 30일은 해보고 그만둬야지라는 생각을 한다.
일단 30일정도는 해보자. 그럼 실력이 늘겠지. 😎