현제의 현재이야기

[0131 TIL]HUFS 겨울방학 코테대비 캠프 본문

algorithm/HUFS 2023 -1 겨울 코테대비캠프

[0131 TIL]HUFS 겨울방학 코테대비 캠프

현재의 현제 2023. 1. 31. 12:14

사방검사

if  0 <= x < n and 0 <= y < n 

def in_range(x, y):
	return 0 <= x < n and 0 <= y < n
  • 범위를 검사할 때 if 문을 만드는 것 보다 따로 함수를 만드는 것이 더 현명하다.
  • and의 순서를 잘 보아라. 배열의 범위가 벗어날 것 같으면 if 문의 and 앞에 범위를 검사하는 장치를 달아라.

| 문제

숫자 0과 1로만 이루어진 n * n 크기의 격자 상태가 주어집니다. 각 칸 중 상하좌우로 인접한 칸 중 숫자 1이 적혀 있는 칸의 수가 3개 이상인 곳의 개수를 세는 프로그램을 작성해보세요. 단, 인접한 곳이 격자를 벗어나는 경우에는 숫자 1이 적혀있지 않은 것으로 생각합니다.

| 내 풀이

n = int(input())
arr = [
    list(map(int, input().split()))
    for _ in range(n)
]
dxs, dys = [1, 0, -1, 0], [0, -1, 0, 1]


def in_index(x, y):
    return 0 <= x < n and 0 <= y < n

cnt = 0
result = 0

for x in range(n):
    for y in range(n):
        for dx, dy in zip(dxs, dys):
            nx, ny = x + dx, y + dy
            if in_index(nx, ny) and arr[nx][ny] == 1:
                cnt += 1
        if cnt >= 3:
            result += 1
        cnt = 0
print(result)
  • zip 함수는 리스트 두 개를 합쳐서 [1, 0], [0, -1], [-1, 0], [0, 1]로 만들어준다.
for dx, dy in (0, 1), (0, -1), (-1, 0), (1, 0):
  • 이것 보다는 dxs, dys를 만들어서 zip함수를 쓰는 것이 나중에 8방향이나 가독성 측면에서 훨씬 좋다.
  • 90도 도는 문제가 아니면 dxs, dys를 [1, -1, 0, 0], [0, 0, 1, -1]로 빠르게 작성할 수 있다.

 

 

90도 돌기

| 문제

좌표평면 위 (0, 0)에서 북쪽을 향한 상태에서 움직이는 것을 시작하려 합니다. N개의 명령에 따라 총 N번 움직이며, 명령 L이 주어지면 왼쪽으로 90도 방향 전환을, 명령 R이 주어지면 오른쪽으로 90도 방향전환을 하고, 명령 F가 주어지면 바라보고 있는 방향으로 한칸 이동하려고 합니다. 이동 이후 최종 위치를 출력하는 프로그램을 작성해보세요.

| 내 풀이

x, y = 0, 0
order = input()
dir_num = 0
dx, dy = [0, 1 , 0, -1], [1, 0, -1, 0]
for i in order:
    if i == 'L':
        dir_num = (dir_num + 3) % 4
    elif i == 'R':
        dir_num = (dir_num + 1) % 4
    else:
        x += dx[dir_num]
        y += dy[dir_num]
print(x, y)
  • 북을 0, 90도로 돌아가면서 북, 서, 남, 동으로 dir_num으로 0 ,1 ,2 ,3으로 지정한다.
  • 그에 맞게 dx, dy를 작성한다.
  • 왼쪽으로 도는 것, 즉 반시계 방향으로 90도면 0 -> 3, 1 -> 0, 2 -> 1, 3 -> 2로 된다. 이것을 한줄 코드로 만든다면 (dir_num -1 + 4) % 4 이다.
  • 반대로 오른쪽으로 도는 것은 (dir_num + 1) % 4 이다.

 

Comments