Skip to content
Merged
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
116 changes: 116 additions & 0 deletions week10/donghee.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,116 @@
# 10주차 문제 풀이 인증

## 기본 정보

* 이름: 원동희
* 목표 문제 수: 3
* 실제 풀이 문제 수: 3

---

# 오답노트

## 문제 1

* **문제명:** 완주하지 못한 선수
* **문제 링크:** https://school.programmers.co.kr/learn/courses/30/lessons/42576
* **알고리즘 / 자료구조:** 해시(HashMap)

### 접근 및 시행착오

처음에는 participant와 completion 배열을 하나씩 비교하면서 완주하지 못한 선수를 찾으려고 했다.

하지만 참가자 중에는 동명이인이 있을 수 있기 때문에 단순히 이름의 존재 여부만 확인하면 정확하게 처리할 수 없었다.

따라서 참가자의 이름별 등장 횟수를 저장해야 한다고 생각했고, HashMap을 사용해 각 이름의 인원수를 관리하는 방식으로 변경했다.

### 최종 풀이

1. participant 배열을 순회하면서 HashMap에 선수 이름과 등장 횟수를 저장한다.
2. completion 배열을 순회하면서 해당 선수의 등장 횟수를 1씩 감소시킨다.
3. 최종적으로 등장 횟수가 1 남아 있는 선수를 찾는다.
4. 해당 선수가 완주하지 못한 선수이다.

### 복잡도

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

### 핵심 포인트

중복 데이터가 존재하면서 각 값의 개수를 비교해야 하는 문제에서는 HashMap을 이용해 빈도수를 저장하는 방법을 생각해볼 수 있다.

---

## 문제 2

* **문제명:** K번째수
* **문제 링크:** https://school.programmers.co.kr/learn/courses/30/lessons/42748
* **알고리즘 / 자료구조:** 배열 / 정렬

### 접근 및 시행착오

처음에는 인덱스가 0부터 시작한다는 점 때문에 문제에서 주어진 i번째부터 j번째까지의 범위를 코드의 인덱스로 변환하는 부분이 헷갈렸다.

문제의 i, j, k는 모두 1부터 시작하지만 배열의 인덱스는 0부터 시작하기 때문에 범위를 잘못 지정하면 원하는 값과 다른 결과가 나왔다.

각 command마다 배열의 필요한 부분만 잘라낸 후 정렬하는 방식으로 접근했다.

### 최종 풀이

1. commands를 하나씩 순회한다.
2. 각 command에서 i, j, k 값을 가져온다.
3. array의 i번째부터 j번째까지 잘라 새로운 배열을 만든다.
4. 잘라낸 배열을 오름차순으로 정렬한다.
5. 정렬된 배열의 k번째 값을 결과 배열에 추가한다.
6. 모든 command를 처리한 결과를 반환한다.

### 복잡도

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

### 핵심 포인트

문제에서 사용하는 순서가 1부터 시작하는지, 실제 배열의 인덱스가 0부터 시작하는지를 잘 구분해야 한다.

---

## 문제 3

* **문제명:** 같은 숫자는 싫어
* **문제 링크:** https://school.programmers.co.kr/learn/courses/30/lessons/12906
* **알고리즘 / 자료구조:** 배열 / 스택

### 접근 및 시행착오

처음에는 Set을 사용하면 중복 숫자를 쉽게 제거할 수 있다고 생각했다.

하지만 이 문제는 모든 중복을 제거하는 것이 아니라 **연속해서 나타나는 같은 숫자만 제거해야 하는 문제**였다.

예를 들어 `[1, 2, 1]`에서는 마지막 1을 제거하면 안 되기 때문에 Set으로는 해결할 수 없었다.

따라서 현재 숫자와 직전에 저장한 숫자를 비교하는 방식으로 접근했다.

### 최종 풀이

1. arr 배열을 처음부터 순회한다.
2. 결과 배열이 비어 있거나, 마지막으로 저장된 값과 현재 값이 다른 경우에만 현재 값을 추가한다.
3. 마지막 값과 현재 값이 같다면 추가하지 않고 넘어간다.
4. 모든 원소를 확인한 뒤 결과 배열을 반환한다.

### 복잡도

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

### 핵심 포인트

중복 제거라고 다 Set을 사용해야한다는 생각 버리기!

---

# 다음 주 목표

* 목표 문제 수: 3
* 집중할 유형: