diff --git a/백준/Bronze/1952. 달팽이2/README.md b/백준/Bronze/1952. 달팽이2/README.md new file mode 100644 index 0000000..e5e97c1 --- /dev/null +++ b/백준/Bronze/1952. 달팽이2/README.md @@ -0,0 +1,92 @@ +# [Bronze I] 달팽이2 - 1952 + +[문제 링크](https://www.acmicpc.net/problem/1952) + +### 성능 요약 + +메모리: 32544 KB, 시간: 40 ms + +### 분류 + +구현, 수학, 시뮬레이션 + +### 제출 일자 + +2025년 4월 7일 19:52:58 + +### 문제 설명 + +
M줄 N칸으로 되어 있는 표 위에, 달팽이 모양으로 선을 그리려고 한다.
+ +| ㅇ | ++ | + |
| + | + | + |
| + | + | + |
| + | + | + |
| + | + | + |
위의 그림은 M=5, N=3의 예이다. 이제 표의 왼쪽 위 칸(ㅇ)에서 시작하여, 오른쪽으로 선을 그려 나간다. 표의 바깥 또는 이미 그려진 칸에 닿아서 더 이상 이동할 수 없게 되면, 시계방향으로 선을 꺾어서 그려나간다.
+ +| ㅇ | +→ | +↘ | +
| ↗ | +↘ | +↓ | +
| ↑ | +↓ | +↓ | +
| ↑ | +끝 | +↓ | +
| ↖ | +← | +↙ | +
위의 표는 선을 그려 나간 모양을 나타낸 것이다. 선이 꺾어진 부분은 대각선으로 나타내었다. 표의 모든 칸이 채워질 때까지, 선을 몇 번 꺾게 될까?
+ +### 입력 + +첫째 줄에 M과 N이 빈 칸을 사이에 두고 주어진다. (2 ≤ M, N ≤ 100)
+ +### 출력 + +첫째 줄에 표의 모든 칸이 채워질 때까지 선이 꺾어지는 횟수를 출력한다.
+ diff --git a/백준/Bronze/1952. 달팽이2/달팽이2.py b/백준/Bronze/1952. 달팽이2/달팽이2.py new file mode 100644 index 0000000..e87c444 --- /dev/null +++ b/백준/Bronze/1952. 달팽이2/달팽이2.py @@ -0,0 +1,40 @@ +# 입력 +M, N = map(int, input().split()) + +# 방문 표시용 배열 +visited = [[False] * N for _ in range(M)] + +# 방향: 오른쪽 → 아래 → 왼쪽 → 위 +dx = [0, 1, 0, -1] +dy = [1, 0, -1, 0] + +# 시작점 +x, y = 0, 0 +visited[x][y] = True + +# 초기 방향: 오른쪽 (0) +dir = 0 + +# 꺾은 횟수 +turn_count = 0 + +# 총 칸 수 +total_cells = M * N +visited_cells = 1 + +while visited_cells < total_cells: + nx = x + dx[dir] + ny = y + dy[dir] + + # 이동할 수 없는 경우 (벽이거나 이미 방문) + if nx < 0 or nx >= M or ny < 0 or ny >= N or visited[nx][ny]: + dir = (dir + 1) % 4 # 방향 전환 + turn_count += 1 + continue # 방향만 바꾸고 다시 시도 + + # 이동 + x, y = nx, ny + visited[x][y] = True + visited_cells += 1 + +print(turn_count)