//combination 함수는 https://velog.io/@gytlr01/%EC%A1%B0%ED%95%A9-%EC%88%9C%EC%97%B4-%EB%B6%80%EB%B6%84%EC%A7%91%ED%95%A9-%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8 이곳의 함수를 보고 사용하였다.
function combination(arr, num) {
let result = [];
if(num == 1) return arr.map(e => [e]);
arr.forEach((e,i,array) => {
let rest = array.slice(i+1);
let combinations = combination(rest,num-1);
let combiArr = combinations.map(x => [e, ...x])
result.push(...combiArr);
})
return result;
}
function solution(orders, course) {
let answer=[]
for(let i=0;i<course.length;i++){
//조합을 통해 나오는 문자열과 그 문자열이 몇 번 나오는지를 확인하기 위해 Map을 사용한다.
let ans = new Map()
let chkNum = 0
for(let j=0;j<orders.length;j++){
chkNum = 0
//split을 통해 문자열을 배열로 만들고 combination 함수에 넣어 가능한 모든 조합들을 배열로 가져온다
const combinationArr = combination(orders[j].split(""), course[i])
for(let n=0;n<combinationArr.length;n++){
//여기서 sort가 필요하다. wx와 xw는 같은 것으로 보아햐하기 때문이다.
const tmpArr = combinationArr[n].sort().join("")
//Map에 tmpArr가 이미 있다면 value를 1을 증가시켜서 다시 넣는다
if(ans.has(tmpArr)){
const changeNum = ans.get(tmpArr) + 1
if(changeNum > chkNum){
chkNum = changeNum
}
ans.delete(tmpArr)
ans.set(tmpArr, changeNum)
}
//Map에 tmpArr가 없다면 value를 1로 해서 넣는다.
else{
ans.set(tmpArr, 1)
}
}
}
//가장 많이 등장한 문자열(최소 2번 이상)들을 answer 배열에 넣는다.
ans.forEach((value, key, map)=>{
if(value == chkNum && value >= 2){
answer.push(key)
}
})
}
return answer.sort()
}
일단 문제를 보았을 때 조합을 사용해야 하는 것은 쉽게 알 수 있었다. 하지만, 조합을 구현하는 것은 쉽지 않았다... 때문에 다른 분이 작성해놓은 조합 코드를 가져다가 사용했다. 이후에 조합, 순열 코드를 확실히 이해하고 나 혼자 짤 수 있는 실력을 기르는 시간이 필요하다.
오늘 map과 set을 공부한 덕분에 map을 한번 써봐야겠다는 생각이 들었고 그렇게 구현하였다. 3개의 테스트케이스들은 모두 통과했지만, 막상 제출하면 15점 밖에 얻지 못한다. 도대체 어느 부분이 잘못된건지 모르겠다.. 조금 더 생각이 필요할 것 같다.
순열과 조합을 실제로 코드로 구현하는 일은 굉장히 어려운 것 같다... 시간을 따로 내어 충분히 이해하고 공부하는 시간이 필요하다.