현제의 현재이야기
[0131 TIL]HUFS 겨울방학 코테대비 캠프 본문
사방검사
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 이다.
'algorithm > HUFS 2023 -1 겨울 코테대비캠프' 카테고리의 다른 글
[0210 TIL]HUFS 겨울방학 코테대비 캠프(DP) (0) | 2023.02.10 |
---|---|
[0208 TIL]HUFS 겨울방학 코테대비 캠프(dfs, bfs) (0) | 2023.02.08 |
[0202 TIL]HUFS 겨울방학 코테대비 캠프 (0) | 2023.02.02 |
Comments