Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
171 changes: 171 additions & 0 deletions week05/seoyoung.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,171 @@
# 5주차 문제 풀이 인증

## 기본 정보

- 이름: 이서영
- 목표 문제 수: 3
- 실제 풀이 문제 수: 3

## 푼 문제 목록

| 번호 | 문제 이름 | 난이도 | 링크 | 풀이 여부 |
| -- | ------- | ---- | --------------------------------------------------------------- | ----- |
| 1 | 리코쳇 로봇 | Lv.2 | https://school.programmers.co.kr/learn/courses/30/lessons/169199 | o |
| 2 | 아이템 줍기 | Lv.3 | https://school.programmers.co.kr/learn/courses/30/lessons/87694 | o |
| 3 | 블록 이동하기 | Lv.3 | https://school.programmers.co.kr/learn/courses/30/lessons/60063 | o |

---

# 오답노트

> 오답노트는 AI 답변이나 블로그 풀이를 그대로 복사하지 않고, 본인의 언어로 직접 작성해주세요.
> 문제별로 아래 양식을 복사해서 필요한 만큼 반복 작성하시면 됩니다.

## 문제 1

### 문제 정보

* 문제명: 리코쳇 로봇
* 문제 링크: https://school.programmers.co.kr/learn/courses/30/lessons/169199
* 사용한 알고리즘 / 자료구조: BFS, Queue, 2차원 배열, 상태 탐색

### 처음 접근 방식

일반 미로 문제처럼 현재 위치에서 상, 하, 좌, 우로 한 칸씩 이동하면서 목표 지점까지의 최단거리를 구하면 된다고 생각했다.

### 풀이 방법

1. 보드에서 시작 위치 `R`과 목표 위치 `G`를 찾는다.
2. 시작 위치와 이동 횟수 `0`을 큐에 넣고 방문 처리한다.
3. 큐에서 현재 위치를 꺼낸다.
4. 현재 위치가 목표 위치라면 지금까지의 이동 횟수를 반환한다.
5. 상, 하, 좌, 우 네 방향에 대해 로봇을 한 칸씩 움직이는 것이 아니라, 장애물 `D`나 보드 끝을 만나기 직전까지 계속 미끄러뜨린다.
6. 멈춘 위치가 아직 방문하지 않은 위치라면 방문 처리하고 이동 횟수를 1 증가시켜 큐에 넣는다.
7. 큐가 빌 때까지 목표 위치에 도달하지 못하면 `-1`을 반환한다.

### 어려웠던 지점

로봇이 원하는 위치에서 바로 멈출 수 없고, 장애물이나 벽을 만나기 전까지 계속 이동한다는 조건을 놓치기 쉬웠다.

그래서 한 칸 단위 이동으로 BFS를 하면 실제 문제의 이동 횟수와 전혀 다른 값이 나올 수 있었다.

### 해결 방법

이 문제에서 하나의 이동은 한 칸 이동이 아니라 한 방향으로 끝까지 미끄러진 뒤 멈추는 것이라고 다시 정의했다.

BFS의 정점은 로봇이 멈출 수 있는 위치이고, 간선은 한 방향으로 미끄러져 다음 정지 위치까지 가는 행동이라고 생각했다.

### 시간복잡도 / 공간복잡도

* 시간복잡도: O(N * M * (N + M))
* 공간복잡도: O(N * M)

각 위치에서 네 방향으로 끝까지 이동할 수 있으므로 한 번의 상태 탐색에 최대 `N + M`만큼 확인할 수 있다.

### 새롭게 알게 된 점

BFS를 사용할 때는 단순히 좌표만 보는 것이 아니라, 문제에서 정의한 한 번의 이동이 무엇인지 먼저 정확히 정해야 한다. 같은 격자 문제라도 이동 규칙이 달라지면 다음 상태를 만드는 방식도 달라진다.

---

## 문제 2

### 문제 정보

* 문제명: 아이템 줍기
* 문제 링크: https://school.programmers.co.kr/learn/courses/30/lessons/87694
* 사용한 알고리즘 / 자료구조: BFS, Queue, 좌표 확장, 2차원 배열

### 처음 접근 방식

직사각형의 테두리를 표시한 뒤, 캐릭터 위치에서 아이템 위치까지 BFS로 최단거리를 구하면 된다고 생각했다.

### 풀이 방법

1. 좌표를 그대로 사용하지 않고 모든 좌표를 2배로 확장한다.
2. 각 직사각형 영역을 배열에 표시한다.
3. 직사각형 내부는 이동할 수 없도록 제외하고, 테두리에 해당하는 칸만 이동 가능한 경로로 남긴다.
4. 캐릭터 시작 좌표와 아이템 좌표도 2배로 바꾼다.
5. 시작 좌표를 큐에 넣고 방문 처리한다.
6. 현재 위치에서 상, 하, 좌, 우로 이동할 수 있는 테두리 칸을 탐색한다.
7. 아이템 위치에 도착하면 지금까지 이동한 거리를 2로 나누어 반환한다.
8. 이동 가능한 칸만 큐에 넣으면서 최단거리 탐색을 마친다.

### 어려웠던 지점

직사각형들이 겹쳐 있을 때 어떤 선이 실제 외곽 테두리인지 구분하는 것이 어려웠다.

특히 좌표를 그대로 사용하면 대각선으로 붙어 있는 것처럼 보이는 지점이나 모서리에서, 실제로는 지나갈 수 없는 길을 지나갈 수 있다고 잘못 판단할 수 있었다.

### 해결 방법

좌표를 2배로 확장해서 모서리와 선분 사이에 여유 공간을 만들었다.

먼저 전체 직사각형 영역을 표시한 뒤, 내부에 해당하는 칸을 제거하고 외곽 테두리만 남겼다. 이렇게 하면 BFS가 실제로 캐릭터가 걸을 수 있는 둘레만 따라가게 된다.

### 시간복잡도 / 공간복잡도

* 시간복잡도: O(R * K + S)
* 공간복잡도: O(S)

`R`은 직사각형 개수, `K`는 직사각형을 칠하는 데 필요한 좌표 범위, `S`는 확장된 격자의 전체 칸 수이다.

### 새롭게 알게 된 점

좌표 기반 문제에서는 실제 이동 경로를 배열로 옮기는 과정이 중요하다. 특히 테두리 이동처럼 경계가 핵심인 문제에서는 좌표를 확장하면 모서리에서 생기는 애매한 이동을 깔끔하게 처리할 수 있다.

---

## 문제 3

### 문제 정보

* 문제명: 블록 이동하기
* 문제 링크: https://school.programmers.co.kr/learn/courses/30/lessons/60063
* 사용한 알고리즘 / 자료구조: BFS, Queue, Set, 상태 탐색

### 처음 접근 방식

로봇의 왼쪽 칸이나 위쪽 칸 하나만 대표 좌표로 잡고, 그 좌표가 도착점에 가까워지도록 이동시키면 된다고 생각했다.

### 풀이 방법

1. 로봇이 차지하는 두 칸의 좌표를 하나의 상태로 저장한다.
2. 시작 상태는 `(0, 0)`과 `(0, 1)` 두 칸으로 둔다.
3. 현재 상태와 시간을 큐에 넣고 BFS를 시작한다.
4. 현재 로봇의 두 칸 중 하나라도 도착 칸에 도달하면 시간을 반환한다.
5. 상, 하, 좌, 우로 평행 이동할 수 있는지 확인한다.
6. 로봇이 가로로 놓여 있으면 위쪽 또는 아래쪽 두 칸이 비어 있을 때 회전 상태를 만들 수 있다.
7. 로봇이 세로로 놓여 있으면 왼쪽 또는 오른쪽 두 칸이 비어 있을 때 회전 상태를 만들 수 있다.
8. 새로 만든 상태는 두 좌표의 순서를 정렬해서 같은 상태가 중복 방문되지 않도록 관리한다.
9. 아직 방문하지 않은 상태라면 방문 처리하고 시간을 1 증가시켜 큐에 넣는다.

### 어려웠던 지점

로봇이 한 칸짜리 점이 아니라 두 칸을 차지하는 블록이라는 점 때문에 방문 처리가 헷갈렸다.

또 회전할 때 축이 되는 칸만 비어 있으면 되는 것이 아니라, 회전하면서 지나가는 대각선 방향의 칸도 비어 있어야 한다는 조건을 함께 확인해야 했다.

### 해결 방법

좌표 하나가 아니라 로봇이 차지하는 두 좌표의 묶음을 하나의 상태로 보았다.

이동과 회전을 모두 “현재 상태에서 1초 뒤 갈 수 있는 다음 상태”로 만들어 BFS에 넣었다. 방문 처리는 두 좌표의 순서를 정규화해서 같은 위치에 놓인 로봇을 중복으로 탐색하지 않도록 했다.

### 시간복잡도 / 공간복잡도

* 시간복잡도: O(N^2)
* 공간복잡도: O(N^2)

로봇이 놓일 수 있는 위치와 방향의 수가 격자 크기에 비례하므로 전체 상태 수는 대략 `N^2`개이다.

### 새롭게 알게 된 점

최단거리 문제에서 위치뿐 아니라 방향, 차지하는 칸, 회전 가능 여부처럼 여러 조건이 붙으면 상태를 더 넓게 정의해야 한다. BFS는 그대로 사용하되, 어떤 값을 방문 상태로 저장할지가 문제의 핵심이 된다.

---

# 다음 주 목표

* 목표 문제 수: 3
* 집중할 유형: 그래프 최단거리 / 상태 탐색