728x90
참고자료: 이것이 코딩테스트다
구현(Implementation)
📌머릿속에 있는 알고리즘을 소스코드로 바꾸는 과정
👉🏻풀이를 떠올리는 것은 쉽지만 소스코드로 옮기는 과정이 어려운 문제를 칭한다.
- 완전탐색
- 시뮬레이션
👉🏻파이썬으로 코딩테스트를 치를 때 리스트 메모리 제한을 주의해야 한다. 리스트를 여러 개 선언할 수록 메모리 용량을 차지한다. 일반적인 코딩테스트에서 적은 크기의 메모리를 사용하는 것이 중요하다.
👉🏻1초에 2,000만번의 연산을 수행한다면 안정적인 코드라고 생각할 수 있다.
👉🏻PyPy가 Python3의 문법을 그대로 지원하며 실행 속도는 더 빠르다. 때문에 코딩 테스트 환경이 PyPy를 지원해준다면 이를 사용하자!
예제 - 상하좌우
def RLUD():
location = [1, 1]
num = int(input())
direction_list = input().split()
for direction in direction_list:
if direction == 'R':
if location[1] < num:
location[1] += 1
elif direction == 'L':
if location[1] > 1:
location[1] -= 1
elif direction == 'U':
if location[0] > 1:
location[0] -= 1
else:
if location[0] < num:
location[0] += 1
print(location)
👉🏻 방향에 따라 이동하도록 하드코딩했다.
- 미리 출발점 좌표를 location 리스트에 선언한다.
- direction_list에 입력되는 방향을 저장하고 for문을 돌리면서 location 좌표를 옮겼다.
예제 - 시각
👉🏻하루의 모든 초를 세어도 86,400초이므로 경우의 수가 100,000개 이하이므로 문자열 연산을 이용해도 2초 안에 해결할 수 있다.
def book():
h = int(input())
count = 0
for i in range(h+1):
for j in range(60):
for k in range(60):
if '3' in str(i) + str(j) + str(k):
count += 1
print(count)
✍🏻때문에 3중 for문을 이용하면 풀 수 있다.
실전 - 왕실의 나이트
#실패 코드
def getLocationOfNight():
current_location = input()
direction_list = ['vertical', 'horizontal']
movement_list = [1, 2]
count = 0
for direction_idx, direction in enumerate(direction_list):
for movement in movement_list:
if direction == 'vertical':
pass
👉🏻수평과 수직 이동을 알파벳 그대로 받아들이려고 하니 어려웠다.. 책을 보니 책은 알파벳도 바로 좌표로 나타내서 푸는 것에 영감을 받아 다시 코드를 짜보았다.
def getLocationOfNight2():
input_data = input()
current_location = [int(ord(input_data[0])) - int(ord('a')) + 1, int(input_data[1])]
movement_list = [(-2, -1), (-2, 1), (-1, -2), (-1, 2), (1, -2), (1, 2), (2, -1), (2, 1)]
count = 0
for movement in movement_list:
location_x = current_location[0] + movement[0]
location_y = current_location[1] + movement[1]
if location_x < 1 or location_x > 8:
pass
elif location_y < 1 or location_y > 8:
pass
else:
count += 1
print(count)
- current_location에 Input값을 리스트로 저장했다. 이때 알파벳은 ord함수를 이용해 숫자로 변환해 저장했다.
- movement_list에 움직임을 저장했다. 첫 번째 인덱스가 수평으로 이동할 때, 두 번째 인덱스가 수직으로 이동할 때이다.
- for문을 돌리면서 움직였을 때 위치를 각각 location_x와 location_y에 저장했다. 그리고 이 값들이 1 이상, 8 이하인지 확인하고 맞다면 count에 1씩 더했다.
실전 - 게임 개발
#왼쪽으로 회전
def turn_left():
global direction
direction -= 1
if direction == -1:
direction = 3
def book():
n, m = map(int, input().split())
d = [[0] * m for _ in range(n)] #4*4 육지를 만듦
x, y, direction = map(int, input().split())
d[x][y] = 1 #캐릭터의 좌표를 방문 처리
array = []
for i in range(n):
array.append(list(map(int, input().split())))
#북 동 남 서 방향 정의
dx = [-1, 0, 1, 0]
dy = [0, 1, 0, -1]
count = 1
turn_time = 0
while True:
turn_left()
nx = x + dx[direction]
ny = y + dy[direction]
book()
👉🏻일반적으로 방향을 설정해서 이동하는 문제 유형에서는 dx, dy라는 별도의 리스트를 만들어 방향을 만드는 것이 효과적이다.
728x90
'그 땐 Algorithm했지 > 그 땐 Python했지' 카테고리의 다른 글
[TAVE/이코테] ch06 정렬 | 개념 정리 (0) | 2022.03.27 |
---|---|
[TAVE/이코테] ch05 DFS/BFS | 개념 정리 | 실전 문제 (0) | 2022.03.26 |
[TAVE/이코테] ch03 그리디 | 개념 정리 | 실전 문제 (0) | 2022.03.22 |
[TAVE/파이썬 알고리즘] Ch9 | 스택, 큐 - 24번 스택을 이용한 큐 구현 (0) | 2022.03.13 |
[TAVE/파이썬 알고리즘] Ch10 | 데크, 우선순위 큐 - 개념 정리 (0) | 2022.03.08 |