티스토리 뷰
https://www.acmicpc.net/problem/2875
2875번: 대회 or 인턴
첫째 줄에 N, M, K가 순서대로 주어진다. (0 ≤ M ≤ 100, 0 ≤ N ≤ 100, 0 ≤ K ≤ M+N),
www.acmicpc.net
🤔 해결방법
1. 팀을 만들기 위해서는 최소한 2명의 여학생과 1명의 남학생이 필요하므로 여학생 수가 2명 미만 또는 남학생 수가 1명 미만인 경우는 0 return.
2. 여학생 수가 2명 이상, 남학생 수가 1명 이상, 남녀 학생 수의 합-3이 인턴 수보다 많은 경우엔 여학생을 2명씩, 남학생을 1명씩 감소시키고 team은 1씩 증가시킨다.
🔑 풀이
function solution(n, m, k) {
let team = 0;
//여학생 수가 2명 미만 또는 남학생 수가 1명 미만인 경우
if (n < 2 || m < 1) {
return team;
}
//여학생 수가 2명 이상, 남학생 수가 1명 이상, 남녀 학생 수의 합-3이 인턴 수 이상인 경우
while (n >= 2 && m >= 1 && n + m - 3 >= k) {
n -= 2;
m--;
team++;
}
return team;
}
😭 삽질
function solution(n, m, k) {
let team = 0;
let q = 0; // 몫
if (n >= 2 && m >= 1) {
//남학생 수가 여학생 수 이상인 경우
if (m >= n) {
m -= k; // 남학생에서 인턴 수만큼 빼기
q = Math.floor(n / 2); // 여학생 수를 2로 나눈 몫
team = Math.min(q, m); // 몫과 남학생 수 중 작은 값 선택
//여학생이 남학생의 두배 이상인 경우
} else if (n >= m * 2) {
n -= k; // 여학생에서 인턴 수만큼 빼기
q = Math.floor(n / 2); // 여학생 수를 2로 나눈 몫
team = Math.min(q, m); // 몫과 남학생 수 중 작은 값 선택
//인턴의 수가 남학생 수의 절반보다 적은 경우
} else if (k < m / 2) {
m -= k;
q = Math.floor(n / 2); // 여학생 수를 2로 나눈 몫
team = Math.min(q, m); // 몫과 남학생 수 중 작은 값 선택
//인턴의 수가 남학생 수의 절반보다 큰 경우
} else {
//?????????????????????????????
}
}
return team;
}
처음 문제를 읽었을 때 경우의 수를 나눠야 한다고 생각했다.
그래서 여러 케이스로 규칙을 찾아가면서 남학생이 여학생 이상인 경우에는 인턴이 모두 남학생이어야 하고,
여학생이 남학생의 2배보다 크면 인턴이 모두 여학생이어야 하는 등 경우의 수를 나눠갔다.
그런데 마지막으로 인턴의 수가 남학생 수의 절반보다 큰 경우엔 또 경우의 수가 갈라지면서 인턴을 여자 남자 섞어서 가야하는 경우가 있었기 때문에 이 부분의 코드를 어떻게 작성해야 할 지 막막했다.
chatGPT에게 내가 삽질하던 코드의 물음표 부분에 들어갈 올바른 코드를 알려달라고 했지만 계속 정석 풀이방법만 알려줬다.
결국 다른 사람들의 풀이를 검색해보며 내가 엄청난 삽질을 하고 있었다는 것을 깨달았다.
문제에서 주어진 조건인 여2 남1이 한 팀을 이룬다는 것에 초점을 맞춰서 계속 2와 1을 빼고 team을 1씩 증가시키는 while문 하나면 바로 해결될 문제였다.
chatGPT도 외면한 내 풀이.. 약 1시간 동안의 삽질이 허무하게 느껴졌지만 이런 과정이 쌓여야 삽질을 안하고도 문제를 풀 수 있는 미래의 내가 되겠지.
'JS-algorithm > BOJ' 카테고리의 다른 글
[백준] 두 수의 합 (javascript) (0) | 2023.07.10 |
---|---|
[백준] 숫자 카드 2 (javascript) (0) | 2023.07.03 |
[백준] 바이러스 (javascript) (0) | 2023.06.25 |