Skip to content
Merged
Show file tree
Hide file tree
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
7 changes: 6 additions & 1 deletion 백하연/24주차/중요한 단어를 스포 방지.js
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,12 @@
*
*
*/

// 문제 요약 : 스포방지구간에 등장한 적 없고 중복되지 않은 스포 방지 단어 중 중요한 단어의 수를 찾는 문제
// 핵심 패턴 : 구간 겹침 체크
// 1. 단어의 위치(인덱스)를 뽑아서 구간과 겹치는지 여부 체크
// 2. Set으로 이미 공개된 단어 중복 추적
// 안 겹치는 두 경우의 부정 으로 겹침을 판단하는 방식. 구간/범위 관련 문제에서 자주 쓰이는 패턴
function solution(message, spoiler_ranges) {
let important = 0;

Expand All @@ -42,7 +47,7 @@ function solution(message, spoiler_ranges) {
spoiler_ranges.every(([start, end]) => word.start > end || word.end < start),
);

// 스포 방지 단어 중 3번 목록에 없고 이전에 공개된 적 없으면 중요한 단어 카운트 + 1
// 스포 방지 단어 중 목록에 없고 이전에 공개된 적 없으면 중요한 단어 카운트 + 1
const seen = new Set();

for (const [start, end] of spoiler_ranges) {
Expand Down
2 changes: 1 addition & 1 deletion 백하연/25주차/소수 찾기.js
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ function getPermutations(arr, current, set) {

if (selected.length > 0) set.add(Number(selected)); // 만들어진 숫자를 숫자로 바꿔서 Set에 넣기(중복 제거)

getPermutations(rest, selected, set); // 재귀 호출 : 남은 숫자들(newArr)과 새로 만든 문자열(newFixed)을 넘겨줌
getPermutations(rest, selected, set); // 재귀 호출 : 남은 숫자들(rest)과 새로 만든 문자열(selected)을 넘겨줌
}
}
}
Expand Down
4 changes: 3 additions & 1 deletion 백하연/26주차/금과 은 운반하기.js
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
/**
* 금과 은 운반하기
* 주어진 시간 내에 필요한 금과 은을 모두 운반할 수 있는 최소 시간을 반환
* 이분 탐색 → 매개 변수 탐색(특정 조건을 만족하는 최솟값 구하기)
*
* @param {*} a 금
* @param {*} b 은
Expand All @@ -30,9 +31,10 @@ function solution(a, b, g, s, w, t) {
let totalSilver = 0;
let totalMix = 0;

// 시간(mid) 내에 최대 운반량 계산
for (let i = 0; i < g.length; i++) {
let count = Math.floor((mid + t[i]) / (t[i] * 2));
let maxWeight = count * w[i];
let maxWeight = count * w[i]; // 트럭이 옮길 수 있는 한계치

totalGold += Math.min(g[i], maxWeight);
totalSilver += Math.min(s[i], maxWeight);
Expand Down
43 changes: 43 additions & 0 deletions 백하연/27주차/가장 가까운 같은 글자.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
/*
* [문제 설명]
* 문자열 s가 주어졌을 때, s의 각 위치마다 자신보다 앞에 나왔으면서,
* 자신과 가장 가까운 곳에 있는 같은 글자가 어디 있는지 알고 싶습니다.
* 예를 들어, s="banana"라고 할 때, 각 글자들을 왼쪽부터 오른쪽으로 읽어 나가면서 다음과 같이 진행할 수 있습니다.
* - b는 처음 나왔기 때문에 -1
* - a는 처음 나왔기 때문에 -1
* - n은 처음 나왔기 때문에 -1
* - a는 자신보다 두 칸 앞에 a가 있습니다. 2
* - n도 자신보다 두 칸 앞에 n이 있습니다. 2
* - a는 자신보다 두 칸, 네 칸 앞에 a가 있습니다. 이 중 가까운 것은 두 칸 앞이고, 2
* 따라서 최종 결과물은 [-1, -1, -1, 2, 2, 2]가 됩니다.
*
* [제한사항]
* 1 ≤ s의 길이 ≤ 10,000
* s은 영어 소문자로만 이루어져 있습니다.
*/
function solution(s) {
const result = [];
const map = new Map();

for (let i = 0; i < s.length; i++) {
const char = s[i];
if (map.has(char)) {
result.push(i - map.get(char));
} else {
result.push(-1);
}
map.set(char, i);
}
return result;
}

// 다른 사람의 풀이
function solution(s) {
[...s].map((char, index) => {
const count = s.slice(0, index).lastIndexOf(char);
return count < 0 ? count : index - count;
});
}

console.log(solution('banana')); // [-1, -1, -1, 2, 2, 2]
console.log(solution('foobar')); // [-1, -1, 1, -1, -1, -1]
16 changes: 16 additions & 0 deletions 백하연/27주차/대문자와 소문자.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
/*
* 문자열 my_string이 매개변수로 주어질 때, 대문자는 소문자로 소문자는 대문자로 변환한 문자열을 return하도록 solution 함수를 완성해주세요.
*/
function solution(my_string) {
return [...my_string].map((char) => (char === char.toUpperCase() ? char.toLowerCase() : char.toUpperCase())).join('');
}

// 풀이 2
function solution(my_string) {
return my_string
.split('')
.map((char) => (char === char.toUpperCase() ? char.toLowerCase() : char.toUpperCase()))
.join('');
}
console.log(solution('cccCCC'));
console.log(solution('abCdEfghIJ'));
51 changes: 51 additions & 0 deletions 백하연/27주차/입국심사.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
/*
* 입국심사
* n명이 입국심사를 기다리고 있습니다. 각 심사관이 한 명을 심사하는데 걸리는 시간이 담긴 배열 times가 주어질 때, 모든 사람이 심사를 받는데 걸리는 시간의 최솟값을 return 하도록 solution 함수를 작성해주세요.
*
* 제한사항:
* - 입국심사를 기다리는 사람은 1명 이상 1,000,000,000명 이하입니다.
* - 각 심사관이 한 명을 심사하는데 걸리는 시간은 1분 이상 1,000,000,000분 이하입니다.
* - 심사관은 1명 이상 100,000명 이하입니다.
*
* 입출력 예:
* n: 6, times: [7, 10] => return 28
*/
function solution(n, times) {
let answer = 0;

let min = 1; // 가장 빨리 심사할 수 있는 시간
let max = Math.max(...times) * n; // 가장 오래 걸리는 심사관 * 모든 사람의 수 = 가장 오래 걸리는 시간

while (min <= max) {
const mid = Math.floor((min + max) / 2);

const total = times.reduce((acc, time) => acc + Math.floor(mid / time), 0); // mid 시간 동안 심사할 수 있는 사람의 총 수

// 현재 시간(mid)으로 충분히 모든 사람을 심사할 수 있는지 확인
if (total >= n) {
// n명 이상 심사 가능 -> 시간을 줄여야 함
max = mid - 1;
answer = mid;
} else {
// n명 심사 불가능 -> 시간을 늘려야 함
min = mid + 1;
}
}

return answer;
}
console.log(solution(6, [7, 10]));

/*
n = 6, times = [7, 10]
min = 1, max = 10 * 6 = 60, answer = 0

회차 min max mid total total >= n answer 다음범위
1 1 60 30 4+3=7 true 30 max = 29
2 1 29 15 2+1=3 false 30 min = 16
3 16 29 22 3+2=5 false 30 min = 23
4 23 29 26 3+2=5 false 30 min = 27
5 27 29 28 4+2=6 true 28 max = 27
6 27 27 27 3+2=5 false 28 min = 28 -> 조건(28 <= 27) 거짓으로 종료

*/
28 changes: 28 additions & 0 deletions 백하연/27주차/정수 내림차순으로 배치하기.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
/*
* [문제 설명]
* 함수 solution은 정수 n을 매개변수로 입력받습니다.
* n의 각 자릿수를 큰것부터 작은 순으로 정렬한 새로운 정수를 리턴해주세요.
* 예를들어 n이 118372면 873211을 리턴하면 됩니다.
*
* [제한 조건]
* n은 1이상 8000000000 이하인 자연수입니다.
*/
function solution(n) {
return Number(
String(n)
.split('')
.sort((a, b) => b - a)
.join(''),
);
}

// 풀이 2
function solution(n) {
const result = (n + '')
.split('')
.sort((a, b) => b - a)
.join('');

return +result;
}
console.log(solution(118372)); // 873211
17 changes: 17 additions & 0 deletions 백하연/27주차/편지.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
/*
* [문제 설명]
* 머쓱이는 할머니께 생신 축하 편지를 쓰려고 합니다.
* 할머니가 보시기 편하도록 글자 한 자 한 자를 가로 2cm 크기로 적으려고 하며,
* 편지를 가로로만 적을 때, 축하 문구 message를 적기 위해 필요한 편지지의 최소 가로길이를 return 하도록 solution 함수를 완성해주세요.
*
* [제한사항]
* 공백도 하나의 문자로 취급합니다.
* 1 ≤ message의 길이 ≤ 50
* 편지지의 여백은 생각하지 않습니다.
* message는 영문 알파벳 대소문자, ‘!’, ‘~’ 또는 공백으로만 이루어져 있습니다.
*/
function solution(message) {
return message.length * 2;
}
console.log(solution('happy birthday!')); // 30
console.log(solution('I love you~')); // 22
18 changes: 12 additions & 6 deletions 백하연/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -260,14 +260,20 @@
| 260406 | LV0 | [문자 반복 출력하기](https://school.programmers.co.kr/learn/courses/30/lessons/120825) | 90% | 문자열 처리 |
| 260406 | LV0 | [배열 두 배 만들기](https://school.programmers.co.kr/learn/courses/30/lessons/120809) | 90% | 배열 순회 |
| 260406 | LV1 | [푸드 파이트 대회](https://school.programmers.co.kr/learn/courses/30/lessons/134240) | 76% | 문자열 처리 |
| 260406 | LV3 | (공통문제) [금과 은 운반하기](https://school.programmers.co.kr/learn/courses/30/lessons/86053) | 18% | 이분 탐색 |
| 260406 | LV3 | [(공통문제) 금과 은 운반하기](https://school.programmers.co.kr/learn/courses/30/lessons/86053) | 18% | 이분 탐색 |

### N주차
### 27주차

| **날짜** | **난이도** | **문제 이름** | **정답률** | **문제 유형** |
| :------: | :--------: | :-------------------------------------------------------------------------------------------: | :--------: | :-----------: |
| 260412 | LV0 | [편지](https://school.programmers.co.kr/learn/courses/30/lessons/120898) | 90% | 문자열 처리 |
| 260412 | LV0 | [대문자와 소문자](https://school.programmers.co.kr/learn/courses/30/lessons/120893) | 90% | 문자열 처리 |
| 260412 | LV1 | [정수 내림차순으로 배치하기](https://school.programmers.co.kr/learn/courses/30/lessons/12933) | 71% | 정렬 |
| 260412 | LV1 | [가장 가까운 같은 글자](https://school.programmers.co.kr/learn/courses/30/lessons/142086) | 75% | 해시(Map/Set) |
| 260413 | LV3 | [(공통문제) 입국심사](https://school.programmers.co.kr/learn/courses/30/lessons/43238) | 48% | 이분 탐색 |

### 28주차

| **날짜** | **난이도** | **문제 이름** | **정답률** | **문제 유형** |
| :------: | :--------: | :-----------: | :--------: | :-----------: |
| | LV | []() | % | |
| | LV | []() | % | |
| | LV | []() | % | |
| | LV | []() | % | |
| | LV | []() | % | |