문제
문제 해결 전략
- 최다 패턴이 아닌 최다 패턴을 뺀 문자열을 구하는 문제임
- 최다 패턴의 개수 == 최다 패턴을 구성하는 문자들의 문자열 내 개수
- 즉, 최다 알파벳을 하나씩 지우면 됨
코드 및 설명
내코드
function solution(call) { var maxIdx = []; var maxCnt = 0; var lowerCall = call.toLowerCase(); //최다 등장 문자 인덱스 구하기 for (let i = 0; i < lowerCall.length; i++) { var count = 1; for (let j = i + 1; j < lowerCall.length; j++) { if (lowerCall[i] === lowerCall[j]) { count += 1; } } if (maxCnt === count) { maxIdx.push(i); } else if (maxCnt < count) { maxIdx = [i]; maxCnt = count; } } //문자열에서 최다 문자를 공백으로 바꾼다 str = call; for (var idx of maxIdx) { str = str.replaceAll(call[idx].toLowerCase(), ""); str = str.replaceAll(call[idx].toUpperCase(), ""); } return str; } solution("ABCabcA");
모범코드
문자열.split(문자).length-1
로 해당 문자의 개수를 구함
- 최다 문자들을 저장
- 문자열에서 최다 문자가 아닌 것만 정답 문자열에 넣음
function solution(call) { var answer = ''; const alpas=new Set(call.toLowerCase()) let maxAlp=new Set([]) let maxCnt=0 //최다 문자 구하기 for (let alpa of alpas) { const count = call.toLowerCase().split(alpa).length-1 if (maxCnt<count) { maxAlp=new Set([alpa]) maxCnt=count } else if (maxCnt===count) { maxAlp.add(alpa) maxCnt=count } } //최다 문자가 아닌 것만 정답 문자열에 차례로 포함 for (let c of call) { if (!maxAlp.has(c.toLowerCase())) { answer+=c } } return answer; }
시간복잡도
O(문자열길이)