[ํ๋ก๊ทธ๋๋จธ์ค] ๋ฉ๋ด ๋ฆฌ๋ด์ผ (js)
https://programmers.co.kr/learn/courses/30/lessons/72411?language=javascript#
function solution(orders, course) {
orders = orders.map(v => v.split("").sort().join(""));
const ordersMap = orders.map(v => v.split(""));
const permutationResult = course.map(v => {
const courseArr = ordersMap.map(v1 => getCombinations(v1,v));
return courseArr;
}).flat(2);
const uniqueResult = [...new Set([...permutationResult])];
const answer = uniqueResult.map(v => {
let count = 0;
permutationResult.forEach(v1 => {
if(v1 === v) count++;
})
if(count > 1) return [count,v];
else return 1;
}).sort((a,b) => b[0]-a[0]);
let stack = [];
for(let i = 0; i < course.length; i++){
let arr = [];
let max = 0;
for(let j = 0; j < answer.length; j++){
if(answer[j] !== 1 && answer[j][1].length === course[i]){
max = Math.max(max, answer[j][0]);
if(answer[j][0] >= max) arr.push(answer[j][1]);
}
}
stack.push(...arr);
}
return stack.sort();
}
function getCombinations(arr, selectNumber) {
const results = [];
if (selectNumber === 1) return arr.map((el) => [el]);
arr.forEach((fixed, index, origin) => {
const rest = origin.slice(index + 1);
const combinations = getCombinations(rest, selectNumber - 1);
const attached = combinations.map((el) => [fixed, ...el].join(""));
results.push(...attached);
});
return results;
}
์ฝ๋ ์ค๋ช ์ ํ๋ฉด 6 ~ 9๋ผ์ธ์ ๊ฑฐ์น๋ฉด ํด๋น ๋ฐฐ์ด์ ๋ชจ๋ ๊ฐ์ ์กฐํฉ์ 1์ฐจ์ ๋ฐฐ์ด๋ก ์ป์ ์ ์๋ค.(flat์ฌ์ฉ)
ex) [ "ABC", "DEF"] , [2, 3] => ["AB". "AC", "BC", "DE", "DF", "EF", "ABC", "DEF"]
๊ทธ ํ ์ค๋ณต๋๋ ๊ฐ์ SET์ผ๋ก ์ ์ธ์ํค๊ณ uniqueResult ๋ณ์์ ๋ฃ๋๋ค.
๊ทธ ํ 13~19๋ผ์ธ์์ uniqueResult๋ฅผ ์ํํ๋ฉฐ ๋ชจ๋ ์กฐํฉ์ด ๋ค์ด์๋ 1์ฐจ์ ๋ฐฐ์ด์์ ๊ฐ์ ๊ฐ์๋ฅผ ๊ตฌํ ํ
answer๋ฐฐ์ด์ ์ ์ฅํ๋ค. ๊ทธ ํ ๊ทธ๋ฅ ๊ฐ์์ ๋ง์ถฐ ์ต๋๊ฐ์ ๊ตฌํด stack ๋ฐฐ์ด์ ์ ์ฅํ ํ ์ ๋ ฌํด์ returnํ๋ ์ฝ๋์ด๋ค.
๊ทธ๋ฌ๋ ์ ์ฝ๋๋ก ํ ์คํธ์ผ์ด์ค, ์ง๋ฌธ์ ์๋ ํ๋ ์ผ์ด์ค ๋ค ๋ง์์ง๋ง ์ ์ถ๋ง ํ๋ฉด 50์ ์ด ๋์๋ค.
์ง๋ฌธ์๋ ๋์ ๊ฐ์ ํ์์ ์์๊ณ , ๊ฒ์ํด๋ ์ฐพ์ ์ ์์๋ค. ๊ฒฐ๊ตญ ํด๊ฒฐ์ง๋ง ๋ญ๊ฐ ๋ฌธ์ ์ธ์ง๋ ๋ชจ๋ฅด๊ฒ ๋ค.
18,19๋ผ์ธ์์ count๊ฐ 1๋ณด๋ค ํฌ๋ฉด [count, v] ํ์์ผ๋ก returnํ๊ณ , 1์ดํ์ด๋ฉด ๊ทธ๋ฅ ํด๋น ์ธ๋ฑ์ค๋ 1๋ก ๋ฆฌํดํ๋ค.
(์๋ํ๋ฉด ์ต์ 2๋ช ์ ์์ผ์ผ ๋ฉ๋ด ๋ฆฌ๋ด์ผ์ ํด๋น๋๋ฏ๋ก count > 1์ ๊ธฐ๋ณธ์ด์๊ณ , 1๊ฐ๋ง ์๋ ๋ฉ๋ด๋ ํด๋น์ด ์๋๋ค.)
๊ทธ ํ 28๋ผ์ธ์์ ๊ฐ์ด 1์ด ์๋์ฌ์ผ ํ๋ค๋ ์กฐ๊ฑด์ ๊ฑธ์๊ณ , ์ํํ๋ค.
function solution(orders, course) {
orders = orders.map(v => v.split("").sort().join(""));
const ordersMap = orders.map(v => v.split(""));
const permutationResult = course.map(v => {
const courseArr = ordersMap.map(v1 => getCombinations(v1,v));
return courseArr;
}).flat(2);
const uniqueResult = [...new Set([...permutationResult])];
const answer = uniqueResult.map(v => {
let count = 0;
permutationResult.forEach(v1 => {
if(v1 === v) count++;
})
return [count,v];
}).sort((a,b) => b[0]-a[0]);
let stack = [];
for(let i = 0; i < course.length; i++){
let arr = [];
let max = 0;
for(let j = 0; j < answer.length; j++){
if(answer[j][1].length === course[i] && answer[j][0] > 1){
max = Math.max(max, answer[j][0]);
if(answer[j][0] >= max) arr.push(answer[j][1]);
}
}
stack.push(...arr);
}
return stack.sort();
}
function getCombinations(arr, selectNumber) {
const results = [];
if (selectNumber === 1) return arr.map((el) => [el]);
arr.forEach((fixed, index, origin) => {
const rest = origin.slice(index + 1);
const combinations = getCombinations(rest, selectNumber - 1);
const attached = combinations.map((el) => [fixed, ...el].join(""));
results.push(...attached);
});
return results;
}
์ ์ฝ๋๋ก ๋ฐ๊พธ๋ ๊ฐ์๊ธฐ ๋ต์ด ๋๋ค...
18๋ผ์ธ์์ ๊ทธ๋ฅ count๊ฐ 1์ด๋ ๋ช์ด๋ ๊ทธ๋ฅ map์ [count, v] ํํ๋ก ์ ์ฅํ๊ณ ,
27๋ฒ์งธ ๋ผ์ธ์์ answer[j][0] > 1 ์ฆ ์นด์ดํธ๊ฐ 2 ์ด์์ธ ๊ฒ๋ง ์ํํ๋๋ก ํ๋ค.
์ ์ฝ๋์ ์ฌ์ค ๋ ผ๋ฆฌ๊ฐ ๋๊ฐ์๋ฐ ์ ์๋๋ ์ง ๋ชจ๋ฅด๊ฒ ๋ค...
map์ ๋ฐ๋ณต๋ฌธ์ฒ๋ผ ์ฌ์ฉํ๋ฉด ์๋๋ ๊ฑด์ง ์ฐพ์๋ด์ผ๊ฒ ๋ค