[프로그래머스] 문자열압축- javascript

김지원·2022년 1월 25일
0

coding-test

목록 보기
9/25
post-thumbnail
post-custom-banner

📖 문제링크

https://programmers.co.kr/learn/courses/30/lessons/60057

문제 설명

문자열을 다루는 문제이다.

필자는 문자열 중에서도 모든 경우의 수를 해본 후 최선의 결과값을 반환하는 문제라고 판단했다.

문제의 내용은 이렇다.

문자열의 길이를 압축하기 위해 1개~n개의 단위로 잘라 압축한다.
거기서 연속되는 문자열이 있다면 2ab 이런식으로 나타낸다.
표현한 문자열 중 가장 짧은 것의 길이를 return하는 문제다.

📃 조건

  • s의 길이는 1이상 1000이하이다.
  • 마지막에 남는 문자열은 그대로 붙여주면 된다.

👨‍💻 문제풀이

처음 필자가 푼 문제풀이


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

profile
backend-developer
post-custom-banner

0개의 댓글