빈 병 a개를 가져다주면 콜라 b병을 주는 마트가 있을 때, 빈 병 n개를 가져다주면 몇 병을 받을 수 있는지 계산하는 문제입니다. 기존 콜라 문제와 마찬가지로, 보유 중인 빈 병이 a개 미만이면, 추가적으로 빈 병을 받을 순 없습니다. 상빈이는 열심히 고심했지만, 일반화된 콜라 문제의 답을 찾을 수 없었습니다. 상빈이를 도와, 일반화된 콜라 문제를 해결하는 프로그램을 만들어 주세요.
콜라를 받기 위해 마트에 주어야 하는 병 수 a, 빈 병 a개를 가져다 주면 마트가 주는 콜라 병 수 b, 상빈이가 가지고 있는 빈 병의 개수 n이 매개변수로 주어집니다. 상빈이가 받을 수 있는 콜라의 병 수를 return 하도록 solution 함수를 작성해주세요.
function solution(a, b, n) {
let answer = 0, leftover = parseInt(n/a) * b;
while(true) {
leftover = n - (parseInt(n / a) * a) + (parseInt(n/a) * b);
answer += parseInt(n/a) * b;
if(leftover < a) break;
else n = leftover;
}
return answer;
}
입출력 예
부분을 자세히 읽어보면 수학적 규칙도 이미 알려주기 때문에, 이에 맞게 단순히 코드만 작성하면 되는 문제이다.문제에서 주어지는 예시들의 경우 모두 빈병 a
개당 돌려주는 병 수b
가 모두 1이었다. 처음엔 문제에 제공된 예시들에만 집중하다보니 b
의 역할의 중요성을 느끼지 못했다. 그러다 보니 코드를 제출할 때마다 에러가 떴고, 코드에 b
값을 한번도 호출하지 않았다는 점을 깨닫고 나서야 고칠 수 있었다.
여러 언론사에서 쏟아지는 뉴스, 특히 속보성 뉴스를 보면 비슷비슷한 제목의 기사가 많아 정작 필요한 기사를 찾기가 어렵다. Daum 뉴스의 개발 업무를 맡게 된 신입사원 튜브는 사용자들이 편리하게 다양한 뉴스를 찾아볼 수 있도록 문제점을 개선하는 업무를 맡게 되었다.
개발의 방향을 잡기 위해 튜브는 우선 최근 화제가 되고 있는 "카카오 신입 개발자 공채" 관련 기사를 검색해보았다...(전체 읽기)
str1 | str2 | answer |
---|---|---|
FRANCE | french | 16384 |
handshake | shake hands | 65536 |
aa1+aa2 | AAAA12 | 43690 |
E=M*C^2 | e=m*c^2 | 65536 |
function solution(str1, str2) {
let arr1 = [],
arr2 = [];
str1 = str1.toUpperCase();
str2 = str2.toUpperCase();
for (let i = 0; i < str1.length - 1; i++) {
const str = str1.substr(i, 2);
if (str[0] >= "A" && str[0] <= "Z" && str[1] >= "A" && str[1] <= "Z") arr1.push(str);
}
for (let i = 0; i < str2.length - 1; i++) {
const str = str2.substr(i, 2);
if (str[0] >= "A" && str[0] <= "Z" && str[1] >= "A" && str[1] <= "Z") arr2.push(str);
}
let intersection = [],
union = [];
for (let i = 0; i < arr2.length; i++) {
if (arr1.indexOf(arr2[i]) >= 0) intersection.push(arr1.splice(arr1.indexOf(arr2[i]), 1));
union.push(arr2[i]);
}
for (let i = 0; i < arr1.length; i++) {
union.push(arr1[i]);
}
if (intersection.length === 0 && union.length === 0) return 65536;
return parseInt(65536 * (intersection.length / union.length));
};
str1
, str2
모두 대문자로 바꿔준다.65536
만 반환해주도록 한거나 or 제대로 교집합의 길이와 합집합의 길이를 나눠 제대로 된 값을 계산 및 반환하도록 한다. 스파이들은 매일 다른 옷을 조합하여 입어 자신을 위장합니다.
예를 들어 스파이가 가진 옷이 아래와 같고 오늘 스파이가 동그란 안경, 긴 코트, 파란색 티셔츠를 입었다면 다음날은 청바지를 추가로 입거나 동그란 안경 대신 검정 선글라스를 착용하거나 해야 합니다.
종류 | 이름 |
---|---|
얼굴 | 동그란 안경, 검정 선글라스 |
상의 | 파란색 티셔츠 |
하의 | 청바지 |
겉옷 | 긴 코트 |
스파이가 가진 의상들이 담긴 2차원 배열 clothes가 주어질 때 서로 다른 옷의 조합의 수를 return 하도록 solution 함수를 작성해주세요.
function solution(clothes) {
let outfit = 0,
type = [];
for(let i = 0; i < clothes.length; i++) {
type.push(clothes[i][1]);
}
let counts = {};
type.forEach(function (x) { counts[x] = (counts[x] || 0) + 1; });
let arr = [];
for(let key in counts) {
counts[key] += 1;
arr.push(counts[key]);
}
for(let i = 0; i < arr.length; i++) {
if(i === 0) outfit += arr[i];
else {
outfit *= arr[i];
}
}
return outfit - 1;
}
상의 2벌, 하의 1벌, 모자 1벌이 있다고 쳤을 때 옷의 조합의 수는 (2 + 1) x (1 + 1) x (1 + 1) - 1 으로 볼 수 있다. 종류별 갯수에 1을 더해주는 이유는 해당 종류의 의상을 입지 않을 수도 있기 때문이고, 마지막에 1을 빼주는 이유은 문제에 스파이는 최소 한 벌의 옷은 입어야 된다고 명시되어 있기 때문이다. 즉 스파이가 옷을 하나라도 입지 않은 경우는 없다.
counts
객체 안에 각 의상 종류를 key로, 각 key의 count를 value로 저장한다. arr
라는 배열을 새로 만들었다. 문제풀이 자체에는 큰 지장이 되지 않았지만 조금 더 간결하게 풀이할 수 있는 문제를 굳이 저렇게 길게 늘어놓고 나니 찝찝한 느낌이 드는 것은 사실이다.