본문 바로가기

코딩테스트

[이코테] Chap04 구현

상하좌우

내가 처음에 푼 풀이

n = input()
n = int(n)
move = list(input().split())

x = 1
y = 1
for m in move:
  if m == 'L':
      if y == 1:
            continue
      else:
            y -= 1
  elif m == 'R':
      if y == n:
            continue
      else:
            y += 1
  elif m == 'U':
      if x == 1:
            continue
      else:
            x -= 1
  elif m == 'D':
      if x == n:
            continue
      else:
            x += 1

print(x,y)

 

해답

# 해설

n = int(input())
x,y = 1,1
plans = input().split()

# 이동 방향
dx = [0,0,-1,1]
dy = [-1,1,0,0]
move_types = ['L','R','U','D']

nx,ny = 1,1
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)

dx, dy 배열을 만들어 L, R, U, D 각각의 방향에 대해 dx, dy 배열에 접근해 이동할 수 있도록 한다.

시각

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)

왕실의 나이트

x = 'abdefgh'
y = '12345678'
point = input()
x_point = point[0]
y_point = point[1]
x_index = x.index(x_point)
y_index = y.index(y_point)

count = 0
steps = [(-2,-1),(-2,1),(2,-1),(2,1),(1,2),(1,-2),(-1,2),(-1,-2)]
for s in steps:
  x_temp = x_index + s[0]
  y_temp = y_index + s[1]
  if x_temp < 0 or y_temp < 0 or x_temp > 7 or y_temp >7:
    continue
  else:
    count += 1

print(count)

게임 개발

방향을 설정해서 이동하는 문제 유형에서는 dx, dy라는 별도의 리스트를 만들어 방향을 정하는 것이 효과적

n,m = map(int, input().split())

# 방문한 위치를 저장하기 위한 맵을 생성하여 0으로 초기화
d = [[0] * m for _ in range(n)]

x,y,direction = map(int, input().split())
d[x][y] = 1 # 현재 좌표 방문 처리

# 전체 맵 정보 입력받기
array = []
for _ in range(n):
  array.append(list(map(int, input().split())))

# 북, 동, 남, 서 방향 정의
dx = [-1,0,1,0]
dy = [0,1,0,-1]

# 왼쪽으로 회전
def turn_left():
  global direction
  direction -= 1
  if direction == -1:
    direction = 3

# 시뮬레이션 시작
count = 1
turn_time = 0
while True:
  # 왼쪽으로 회전
  turn_left()
  nx = x + dx[direction]
  ny = y + dy[direction]
  # 회전한 이후 정면에 가보지 않은 칸이 존재하는 경우 이동
  if d[nx][ny] == 0 and array[nx][ny] == 0:
    d[nx][ny] = 1
    x = nx
    y = ny
    count += 1
    turn_time = 0
    continue
  # 회전한 이후 정면에 가보지 않은 칸이 없거나 바다인 경우
  else:
    turn_time += 1
  # 네 방향 모두 갈 수 없는 경우
  if turn_time == 4:
    nx = x - dx[direction]
    ny = y - dy[direction]
    # 뒤로 갈 수 있다면 이동
    if array[nx][ny] == 0:
      x = nx
      y = ny
    # 뒤가 바다로 막혀있는 경우
    else:
      break
    turn_time = 0

print(count)