From c515cc87eaedd18b452e7ab5444d4aec8acca662 Mon Sep 17 00:00:00 2001 From: Minsub Yun Date: Sun, 23 Aug 2026 23:09:17 +0900 Subject: [PATCH] =?UTF-8?q?[Week07]=20=EC=95=8C=EA=B3=A0=EB=A6=AC=EC=A6=98?= =?UTF-8?q?=20=ED=92=80=EC=9D=B4=20=EC=9D=B8=EC=A6=9D=20-=20minsub?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- week07/minsub.md | 97 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 97 insertions(+) create mode 100644 week07/minsub.md diff --git a/week07/minsub.md b/week07/minsub.md new file mode 100644 index 0000000..5b19e12 --- /dev/null +++ b/week07/minsub.md @@ -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 +- 집중할 유형: 완전탐색 / 그리디 / 문자열 구현 \ No newline at end of file