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
97 changes: 97 additions & 0 deletions week07/minsub.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,97 @@
# N주차 문제 풀이 인증

## 기본 정보

- 이름: 윤민섭
- 목표 문제 수: 3
- 실제 풀이 문제 수: 3

---

# 오답노트

## 문제 1

- **문제명:** 모의고사
- **문제 링크:** https://school.programmers.co.kr/learn/courses/30/lessons/42840
- **알고리즘 / 자료구조:** 완전탐색, 구현, 배열

### 접근 및 시행착오

각 수포자의 찍는 패턴이 정해져 있기 때문에, 정답 배열을 순회하면서 각 사람의 패턴과 비교하면 된다고 생각했다. 처음에는 패턴 길이가 서로 다르다는 점을 어떻게 처리할지 고민했는데, 문제 번호를 각 패턴 배열의 길이로 나눈 나머지를 사용하면 반복되는 패턴을 자연스럽게 비교할 수 있었다.

### 최종 풀이

1번, 2번, 3번 수포자의 찍는 방식을 각각 배열로 저장했다. 이후 `answers`를 처음부터 끝까지 순회하면서 현재 문제 번호 `i`에 대해 `i % 패턴길이`를 사용해 각 수포자의 답안 패턴과 실제 정답을 비교했다.

정답을 맞힌 경우 각 수포자의 count를 증가시켰고, 순회가 끝난 뒤 세 count 중 최댓값을 구했다. 이후 최댓값과 같은 점수를 받은 수포자를 번호 순서대로 리스트에 추가하고, 이를 int 배열로 변환해 반환했다.

### 복잡도

- 시간복잡도: O(n)
- 공간복잡도: O(1)

### 핵심 포인트

반복되는 패턴은 배열로 저장한 뒤 인덱스를 패턴 길이로 나눈 나머지를 사용하면 쉽게 순회할 수 있다. 또한 동점자가 여러 명일 수 있으므로 최댓값을 구한 뒤 1번부터 순서대로 비교해 결과 배열에 넣으면 오름차순 조건도 자연스럽게 만족할 수 있다.

---

## 문제 2

- **문제명:** 예산
- **문제 링크:** https://school.programmers.co.kr/learn/courses/30/lessons/12982?language=java
- **알고리즘 / 자료구조:** 그리디, 정렬

### 접근 및 시행착오

최대한 많은 부서에 예산을 지원해야 하므로, 한 부서에 큰 금액을 먼저 지원하는 것보다 적은 금액을 신청한 부서부터 지원하는 것이 유리하다고 생각했다. 처음부터 모든 조합을 확인할 필요 없이, 신청 금액을 오름차순으로 정렬한 뒤 작은 금액부터 차례대로 선택하면 가장 많은 부서를 지원할 수 있다.

### 최종 풀이

부서별 신청 금액 배열 `d`를 오름차순으로 정렬했다. 이후 앞에서부터 순회하면서 현재 남은 예산이 해당 부서의 신청 금액 이상이면 예산에서 그 금액을 차감하고 지원한 부서 수를 증가시켰다.

남은 예산이 현재 신청 금액보다 작으면 해당 부서를 지원할 수 없고, 이후 부서들은 정렬상 같거나 더 큰 금액을 요구하므로 더 이상 지원할 수 없다. 따라서 이 경우 반복을 종료해도 된다.

### 복잡도

- 시간복잡도: O(n log n)
- 공간복잡도: O(1)

### 핵심 포인트

“최대한 많은 개수”를 선택해야 하는 문제에서는 작은 비용부터 선택하는 그리디 접근을 먼저 생각해볼 수 있다. 이 문제에서는 각 부서에 신청 금액 전액을 지원해야 하므로, 작은 금액부터 지원하는 것이 지원 가능한 부서 수를 최대화하는 방법이다.

---

## 문제 3

- **문제명:** 숫자 문자열과 영단어
- **문제 링크:** https://school.programmers.co.kr/learn/courses/30/lessons/81301
- **알고리즘 / 자료구조:** 문자열, 구현

### 접근 및 시행착오

문자열 안에 숫자와 영단어가 섞여 있기 때문에, 영단어로 표현된 숫자를 실제 숫자 문자로 바꾸면 최종적으로 정수로 변환할 수 있다고 생각했다. 직접 문자열을 한 글자씩 탐색하면서 단어를 조립하는 방법도 가능하지만, 숫자 영단어가 0부터 9까지 고정되어 있으므로 `replace`를 사용하면 더 단순하게 해결할 수 있었다.

### 최종 풀이

입력 문자열 `s`에 대해 `zero`부터 `nine`까지 각 영단어를 대응되는 숫자 문자로 차례대로 치환했다. 모든 치환이 끝나면 문자열에는 숫자 문자만 남게 되므로, `Integer.parseInt()`를 사용해 정수로 변환해 반환했다.

예를 들어 `one4seveneight`는 `one`이 `1`로, `seven`이 `7`로, `eight`이 `8`로 치환되어 최종적으로 `1478`이 된다.

### 복잡도

- 시간복잡도: O(n)
- 공간복잡도: O(n)

### 핵심 포인트

변환 대상이 고정되어 있고 개수가 많지 않다면, 복잡하게 파싱하기보다 문자열 치환을 이용해 간단하게 해결할 수 있다. 다만 Java의 String은 불변 객체이므로 `replace`를 호출할 때마다 새로운 문자열이 만들어진다는 점도 함께 알고 있어야 한다.

---

# 다음 주 목표

- 목표 문제 수: 3
- 집중할 유형: 완전탐색 / 그리디 / 문자열 구현