diff --git a/week05/seoyoung.md b/week05/seoyoung.md new file mode 100644 index 0000000..b094f83 --- /dev/null +++ b/week05/seoyoung.md @@ -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 +* 집중할 유형: 그래프 최단거리 / 상태 탐색