공원 산책
아이디어
두더지 문제로 유명한 2차원 배열의 경로탐색 문제의 변형이다.
최단거리 찾기 보다는 난이도가 낮은 편으로, DFS나 BFS 없이 경로의 유효성을 따져 이동거리를 반환하기만 하면 된다.
풀이
def solution(park, routes):
height, width = len(park), len(park[0])
obstacles = {(y, x) for y in range(height) for x in range(width) if park[y][x] == 'X'}
dog_position = {'y': 0, 'x': 0}
# 강아지의 시작 위치 찾기
for y in range(height):
for x in range(width):
if park[y][x] == 'S':
dog_position = {'y': y, 'x': x}
move = {'E': (0, 1), 'S': (1, 0), 'W': (0, -1), 'N': (-1, 0)}
for route in routes:
direction, steps = route.split()
steps = int(steps)
dy, dx = move[direction]
original_position = (dog_position['y'], dog_position['x'])
for step in range(steps):
new_y = dog_position['y'] + dy
new_x = dog_position['x'] + dx
# 범위 및 장애물 확인
if 0 <= new_y < height and 0 <= new_x < width:
if (new_y, new_x) in obstacles:
# 장애물을 만났을 때 해당 명령을 무시하고 원래 위치로 되돌림
dog_position['y'], dog_position['x'] = original_position
break
else:
dog_position['y'], dog_position['x'] = new_y, new_x
else:
# 경계를 벗어난 경우도 해당 명령 무시
dog_position['y'], dog_position['x'] = original_position
break
return [dog_position['y'], dog_position['x']]
코드도 훨씬 단순한 것을 확인 할 수 있다.
이런 문제는 이동 방향을 배열이나 딕셔너리로 미리 저장해 두면 코드 가독성을 크게 높일 수 있다.
예상 대진표
아이디어
- A번 참가자와 B번 참가자는 서로 붙게 되기 전까지 항상 이긴다고 가정합니다.
- 2의 지수 승으로 주어지므로 부전승은 발생하지 않습니다.
두 조건 덕분에 선수의 번호가 어떻게 업데이트 되는지 규칙만 찾으면 되는 간단한 문제다.
풀이
def solution(N, A, B):
round_count = 1 # 첫 번째 라운드부터 시작
while True:
# A와 B가 같은 경기에 참여하는지 확인 (다음 라운드 번호가 같아지는 순간)
if (A + 1) // 2 == (B + 1) // 2:
return round_count
# A와 B를 다음 라운드 번호로 업데이트
A = (A + 1) // 2
B = (B + 1) // 2
# 다음 라운드로 넘어가므로 라운드 카운트 증가
round_count += 1
'학습 노트 > 알고리즘 (Python)' 카테고리의 다른 글
99클럽 - 행렬 테두리 회전하기 (0) | 2024.04.22 |
---|---|
99클럽 - 큰 수 만들기 (0) | 2024.04.20 |
99클럽 - 전력망을 둘로 나누기 (0) | 2024.04.18 |
99클럽 - 연속된 부분 수열의 합 (0) | 2024.04.17 |
99클럽 - 신고 결과 받기, 개인정보 수집 유효기간 (0) | 2024.04.16 |