코딩테스트 36일차
3진법 뒤집기
자연수 n이 매개변수로 주어집니다. n을 3진법 상에서 앞뒤로 뒤집은 후, 이를 다시 10진법으로 표현한 수를 return 하도록 solution 함수를 완성해주세요.
function solution(n) {
var ternary = [];
var answer = 0;
while (n > 0) {
ternary.push(n % 3);
n = Math.floor(n / 3);
}
for (var i = 0; i < ternary.length; i++) {
answer += ternary[i] * Math.pow(3, ternary.length - 1 - i);
}
return answer;
}
✏️풀이
function solution(n): 주어진 자연수 n을 3진법으로 변환하여 10진법으로 다시 표현하는 함수를 정의합니다.
var ternary = [];: 변환한 3진법 숫자를 저장할 빈 배열 ternary를 선언합니다.
var answer = 0;: 10진법으로 표현된 결과를 저장할 변수 answer를 초기화합니다.
while (n > 0): 주어진 자연수 n이 0보다 큰 동안 반복합니다.
ternary.push(n % 3): n을 3으로 나눈 나머지를 ternary 배열에 추가합니다. 이렇게 하면 n의 가장 낮은 자릿수부터 3진법 표현이 배열에 저장됩니다.
n = Math.floor(n / 3): n을 3으로 나눈 몫을 n으로 업데이트합니다. 이렇게 하면 n의 다음 자릿수를 처리할 수 있습니다.
for (var i = 0; i < ternary.length; i++): 3진법 표현이 저장된 ternary 배열을 반복하여 10진법으로 변환합니다.
answer += ternary[i] * Math.pow(3, ternary.length - 1 - i): ternary 배열의 각 원소에 대해, 해당 원소를 3의 거듭제곱으로 곱한 값을 answer에 더합니다. ternary.length - 1 - i는 배열을 뒤집기 위해 사용되는 인덱스로, 뒤집힌 배열에서의 해당 원소의 위치를 나타냅니다.
return answer;: 최종적으로 계산된 answer를 반환합니다. 이는 주어진 자연수 n을 3진법으로 뒤집은 후 10진법으로 표현한 결과입니다.
체육복
점심시간에 도둑이 들어, 일부 학생이 체육복을 도난당했습니다. 다행히 여벌 체육복이 있는 학생이 이들에게 체육복을 빌려주려 합니다. 학생들의 번호는 체격 순으로 매겨져 있어, 바로 앞번호의 학생이나 바로 뒷번호의 학생에게만 체육복을 빌려줄 수 있습니다. 예를 들어, 4번 학생은 3번 학생이나 5번 학생에게만 체육복을 빌려줄 수 있습니다. 체육복이 없으면 수업을 들을 수 없기 때문에 체육복을 적절히 빌려 최대한 많은 학생이 체육수업을 들어야 합니다.
전체 학생의 수 n, 체육복을 도난당한 학생들의 번호가 담긴 배열 lost, 여벌의 체육복을 가져온 학생들의 번호가 담긴 배열 reserve가 매개변수로 주어질 때, 체육수업을 들을 수 있는 학생의 최댓값을 return 하도록 solution 함수를 작성해주세요.
function solution(n, lost, reserve) {
var answer = 0;
var clothes = Array(n).fill(1);
// 체육복 도난당한 학생들
for (var i = 0; i < lost.length; i++) {
var idx = lost[i] - 1;
clothes[idx] = 0;
}
// 여벌의 체육복 가져온 학생들
for (var i = 0; i < reserve.length; i++) {
var idx = reserve[i] - 1;
clothes[idx] += 1;
}
// 체육복 빌려주기
for (var i = 0; i < n; i++) {
if (clothes[i] === 0) {
if (i > 0 && clothes[i - 1] === 2) {
clothes[i] = 1;
clothes[i - 1] = 1;
} else if (i < n - 1 && clothes[i + 1] === 2) {
clothes[i] = 1;
clothes[i + 1] = 1;
}
}
}
// 체육수업 가능한 학생 수 계산
for (var i = 0; i < n; i++) {
if (clothes[i] > 0) {
answer++;
}
}
return answer;
}
✏️풀이
function solution(n, lost, reserve): 학생 수 n, 체육복을 도난당한 학생들의 번호가 담긴 배열 lost, 여벌의 체육복을 가져온 학생들의 번호가 담긴 배열 reserve를 매개변수로 받는 solution 함수를 정의합니다.
var answer = 0;: 체육수업을 들을 수 있는 학생의 수를 저장할 변수 answer를 초기화합니다.
var clothes = Array(n).fill(1);: 모든 학생들의 체육복 상태를 나타내는 배열 clothes를 생성하고, 모든 학생들의 체육복 상태를 1로 초기화합니다.
for (var i = 0; i < lost.length; i++): 체육복을 도난당한 학생들을 반복하여 처리합니다.
var idx = lost[i] - 1;: 도난당한 학생의 번호에서 1을 뺀 값을 idx 변수에 저장합니다. (인덱스는 0부터 시작하기 때문에 1을 뺍니다.)
clothes[idx] = 0;: 해당 학생의 체육복 상태를 0으로 설정합니다.
for (var i = 0; i < reserve.length; i++): 여벌의 체육복을 가져온 학생들을 반복하여 처리합니다.
var idx = reserve[i] - 1;: 여벌의 체육복을 가져온 학생의 번호에서 1을 뺀 값을 idx 변수에 저장합니다.
clothes[idx] += 1;: 해당 학생의 체육복 상태에 1을 더합니다.
for (var i = 0; i < n; i++): 모든 학생들을 반복하여 체육복을 빌려주는 과정을 처리합니다.
if (clothes[i] === 0): 체육복이 없는 학생인 경우에만 빌려줄 수 있습니다.
if (i > 0 && clothes[i - 1] === 2): 현재 학생의 바로 앞번호 학생이 여벌의 체육복을 가지고 있는 경우에 체육복을 빌려줄 수 있습니다.
clothes[i] = 1; clothes[i - 1] = 1;: 체육복을 빌려주는 과정입니다. 현재 학생과 바로 앞번호 학생의 체육복 상태를 1로 설정합니다.
else if (i < n - 1 && clothes[i + 1] === 2): 현재 학생의 바로 뒷번호 학생이 여벌의 체육복을 가지고 있는 경우에 체육복을 빌려줄 수 있습니다.
clothes[i] = 1; clothes[i + 1] = 1;: 체육복을 빌려주는 과정입니다. 현재 학생과 바로 뒷번호 학생의 체육복 상태를 1로 설정합니다.
for (var i = 0; i < n; i++): 체육수업 가능한 학생의 수를 계산하기 위해 모든 학생들을 반복합니다.
if (clothes[i] > 0): 체육복이 있는 학생인 경우에만 수업에 참여할 수 있습니다.
answer++;: 수업에 참여할 수 있는 학생의 수를 1 증가시킵니다.
return answer;: 최종적으로 계산된 answer를 반환합니다. 이는 체육수업을 들을 수 있는 학생의 최댓값입니다.