[코드트리 챌린지] dx dy technique_연습문제 1

HKTUOHA·2023년 9월 18일
0

코드트리

목록 보기
2/15
post-thumbnail

⭐실력진단 결과



dx, dy 테크닉을 이용해 격자에서의 이동을 간결하게 구현하는 방법을 배우게 됩니다.

🟢되돌아오기

📌문제


📌나의 코드

Runtime: 79ms, Memory: 29MB (정답 - Runtime: 69ms, Memory: 29MB)

dxs, dys = [-1, 0, 0, 1], [0, -1, 1, 0]  # W, S, N, E

# 서, 남, 북, 동 
mapper = {
    'W': 0,
    'S': 1,
    'N': 2,
    'E': 3
}

n = int(input())
x, y = 0, 0       # 시작 위치
cnt = 0           # 걸린 시간 count

for _ in range(n):
    _dir, move_dis = input().split()
    move_dis = int(move_dis)
    dir_num = mapper[_dir]
    for _ in range(move_dis):                      # 이동 거리만큼
        x, y = x + dxs[dir_num], y + dys[dir_num]  # 이동 방향으로 이동
        cnt += 1                                   # 이동하면 count 1 증가
        if x == 0 and y == 0:                      # 시작 위치에 오면
            break                                  # 나가기
    if x == 0 and y == 0:                          
        break                                      # 나가기
    
if x == 0 and y == 0:  # 시작 위치면 
    print(cnt)         # 시간 출력
else:                  # 아니면
    print(-1)          # -1 출력

✏️개선점

  • 함수 이용하기!
  • 함수를 이용하면 코드를 더 깔끔하게 작성할 수 있고, 시간도 단축된다.



🟢되돌아오기 2

📌문제


📌나의 코드

Runtime: 98ms, Memory: 30MB (정답 - Runtime: 77ms, Memory: 30MB)

# 시작
x, y = 0, 0

# 동, 남, 서, 북
dxs, dys = [1, 0, -1, 0], [0, -1, 0, 1]

# 시작은 북쪽
dir_num = 3

ans = -1
time = 0

# 시작점으로 돌아왔는지 확인
def check(x, y):
    if x == 0 and y == 0:
        return True
    return False

for n in input():
	# 직진
    if n == 'F':
        x, y = x + dxs[dir_num], y + dys[dir_num]  # 이동하면서
        time += 1                                  # 시간 1 증가
    # 왼쪽으로 90' 회전    
    elif n == 'L':
        dir_num = (dir_num - 1 + 4) % 4            # 회전하면서
        time += 1                                  # 시간 1 증가
    # 오른쪽으로 90' 회전
    elif n == 'R':                 
        dir_num = (dir_num + 1) % 4                # 회전하면서
        time += 1                                  # 시간 1 증가

	# 시작점으로 돌아왔으면
    if check(x, y):
        ans = time      # 답에 시간 저장
        break
    
# 시작점으로 안 돌아왔으면 그대로 -1 출력
# 시작점으로 돌아왔으면 시간 출력
print(ans)

✏️ 개선점

  • flag와 인덱스를 사용하기!
  • 함수를 사용하면 효율적인 게 언제인지 잘 모르겠다...
  • mapping을 해야 하는 경우 함수 사용, 공식으로 해결할 수 있으면 함수 미사용(?)



🟠격자 위의 편안한 상태

📌문제


📌나의 코드

n, m = map(int, input().split())
grid = [[0] * n for _ in range(n)]

# 위, 아래, 오른쪽, 왼쪽
dxs, dys = [-1, 1, 0, 0], [0, 0, 1, -1] 

# 계산한 좌표가 범위 내에 있는지 확인
def in_range(x, y):
    if 0 <= x and x < n and 0 <= y and y < n:
        return True
    return False

# 위, 아래, 양옆으로 색칠 확인
def check(x, y):
    color = 0
    for dx, dy in zip(dxs, dys):
        nx, ny = x + dx, y + dy
        if in_range(nx, ny) and grid[nx][ny] == 1:
            color += 1

    # 색칠된 부분이 3개이면 true 반환
    if color == 3:
        return True
    return False

for _ in range(m):
    r, c = map(int, input().split())
    r -= 1
    c -= 1
    grid[r][c] = 1

    # 3개이면 1 출력, 아니면 0 출력
    if check(r, c):
        print(1)
    else:
        print(0)

🔓풀이

  1. 0으로 초기화된 격자에서 색칠되는 부분은 1로 저장
  2. 색칠 여부를 상하좌우 모두 구해야 하기 때문에 zip 함수를 이용한 check 함수 선언
  3. 좌표가 범위 내에 있는지 확인하기 위해 in_range 함수 선언
  4. color가 3인 조건은 check 함수 내에 넣어도 되고, 색칠하면서 넣어도 됨

⇒ 챌린지 시작하고 다른 참고 없이 정답 코드랑 가장 유사하게 작성함! 뿌듯😄


✏️개선점

문제를 잘 읽자...
모든 격자를 확인하는 줄 알았고...
처음에 3개 이상인줄 알고 왜 틀리지 했다...

profile
공부 기록

0개의 댓글