https://programmers.co.kr/learn/courses/30/lessons/60057
문자열을 다루는 문제이다.
필자는 문자열 중에서도 모든 경우의 수를 해본 후 최선의 결과값을 반환하는 문제라고 판단했다.
문제의 내용은 이렇다.
문자열의 길이를 압축하기 위해 1개~n개의 단위로 잘라 압축한다.
거기서 연속되는 문자열이 있다면 2ab 이런식으로 나타낸다.
표현한 문자열 중 가장 짧은 것의 길이를 return하는 문제다.
📃 조건
처음 필자가 푼 문제풀이
function solution(s) {
const words = [];
const counts = [];
const totalCounts = [];
let N = s.length;
let lastWord = "";
for (let i = 1; i <= N; i++) {
words.length = 0;
let totalCount = 0;
counts.length = 0;
for (let j = 0; j <= N; j += i) {
let word = s.slice(j, j + i);
if (lastWord === word) {
counts[words.lastIndexOf(word)] += 1;
} else {
words.push(word);
counts.push(1);
}
lastWord = word;
}
counts.map((count) => {
if (count !== 1 && count < 10) {
totalCount += 1;
}
if (count > 9 && count < 100) {
totalCount += 2;
}
});
words.map((x) => {
totalCount += x.length;
});
totalCounts.push(totalCount);
}
return Math.min.apply(null, totalCounts);
}
짧게 잘라서 보자면
const words = [];
const counts = [];
const totalCounts = [];
let N = s.length;
let lastWord = "";
압축한 문자와 그 숫자를 저장하는 words, counts 빈 배열을 만든다.
n개 단위로 나눈 문자열의 최소 길이를 저장하는 totalCounts 빈 배열을 만든다.
앞의 자른 문자열과 현재 문자열을 비교하기 위해 lastWord라는 빈 string 객체를 만든다.
for (let i = 1; i <= N; i++) {
s 문자열 길이만큼 반복하는 for문을 만든 후
for (let j = 0; j <= N; j += i) {
let word = s.slice(j, j + i);
if (lastWord === word) {
counts[words.lastIndexOf(word)] += 1; // 같은 문자열이 있을 경우 배열 가장 뒤에 있는 문자열 위치를 지정
} else {
words.push(word);
counts.push(1);
}
lastWord = word;
}
0번째부터 문자열을 잘라 앞에서 잘랐던 문자와 비교하고 있다면 counts는 1을 더하고 없다면 words와 counts에 문자와 1을 대입한다.
counts.map((count) => {
if (count !== 1 && count < 10) {
totalCount += 1;
}
if (count > 9 && count < 100) {
totalCount += 2;
}
});
words.map((x) => {
totalCount += x.length;
});
totalCounts.push(totalCount);
총 문자열의 길이를 더하였다.
⭐ 문자열의 갯수가 한자리 숫자를 넘어가는 경우는 totalCount를 2를 더하고 나머지는 1로 하였다.
return Math.min.apply(null, totalCounts);
마지막으로 totalCounts배열에서 가장 작은 수를 반환하면서 끝을 내었다.
function solution(s) {
if(s.length === 1 ) return 1;
let min = 1000;
for (let i = 1; i <= s.length / 2; i++) {
let str1 = '';
let str2 = '';
let ans = '';
let count = 1;
for (let j = 0; j < s.length; j += i) {
if( j === 0 ) {
str1 = s.slice(j, j + i);
}else{
str2 = s.slice(j, j + i)
if(str1 === str2){
count++;
if(j+i === s.length) ans += `${count}${str1}`;
}else{
if( count > 1 ){
ans += `${count}${str1}`
}else{
ans += str1;
}
count = 1;
if(str1.length > str2.length){
ans += str2;
}
str1 = str2;
if(j+i === s.length) ans += str2;
}
}
}
min = Math.min(ans.length, min);
}
return min;
}
문자열만을 가지고 하기 때문에 필자보다 시간복잡도가 휠씬 빠를 것 같다..
다시 한 번 공부를 해봐야겠다😂
프로젝트 때문에 멈췄었던 코딩 테스트를 다시 시작해볼까한다..
꼭 오래가면 좋겠다!
2022.01.25