etc/[구름] 구름톤 챌린지

구름톤 챌린지 2주차 학습 일기

1two13 2023. 8. 22. 18:37
728x90
반응형

문제


길이가 N인 문자열 S를 3개의 문자열로 나눈 후, 주어진 조건에 따라 점수를 계산하는 문제다.

점수는 문자열의 모든 부분 문자열의 순서에 따라서 결정된다. 

 

나눌 수 있는 모든 경우의 수 중에서 최대 점수를 얻을 수 있는 문자열을 찾는 문제이다.

문자열의 길이의 최대 100 정도로 짧기 때문에 가능한 모든 부분 문자열을 확인하는 완전 탐색으로 문제를 해결할 수 있습니다.

 

나의 접근 방식


1. 3개의 부분 문자열을 만들어서 배열에 push

2. 각각의 배열을 다시 배열에 push(2차원 배열 생성)

3. Set 함수 생성하여 중복 제거 후 모든 문자열 사전순으로 나열

4. 2차원 배열을 순회하면서 사전순으로 몇 번째 인덱스인지 확인 후 해당 인덱스 모두 더하기

5. 더한 인덱스 값이 가장 큰 값이 정답

 

나의 코드


const readline = require('readline');
let rl = readline.createInterface({
  input: process.stdin,
  output: process.stdout,
});
let input = [];

rl.on('line', (line) => {
  input.push(line);
});

rl.on('close', () => {
  // 3개의 부분 문자열을 만들어서 []에 push
  function getAllSubstrings(input) {
    const substrings = [];

    for (let i = 1; i < input.length - 1; i++) {
      for (let j = i + 1; j < input.length; j++) {
        substrings.push([input.slice(0, i), input.slice(i, j), input.slice(j)]);
      }
    }

    return substrings;
  }

  const combinations = getAllSubstrings(input[1]);
  let list = [];

  // list에 모든 값 push
  for (let i = 0; i < combinations.length; i++) {
    list.push(...combinations[i]);
  }

  // P: arr에서 중복 제거 후 모든 문자열 사전순으로 정렬
  let sortedList = [...new Set(list)].sort();
  let scoreArr = [];

  // arr을 순회하면서 각각의 배열 안에 있는 값의 인덱스를 모두 더하기
  for (let i = 0; i < combinations.length; i++) {
    let score = 0;

    for (let j = 0; j < 3; j++) {
      score += sortedList.indexOf(combinations[i][j]) + 1;
    }
    scoreArr.push(score);
  }

  // 문자열을 나눠서 얻을 수 있는 최대 점수
  console.log(Math.max(...scoreArr));

  rl.close();
});

 

알아두면 좋은 팁


    1. 조합을 사용하기
    조합은 순서를 고려하지 않고, 집합에서 일부 원소를 선택하는 방법이다. 
    예륻 들어 [1, 2, 3]에서 2개를 고른다면, [[1, 2], [1, 3], [2, 3]]을 고를 수 있다. 
    보통 조합은 재귀함수로 구하지만, 해당 문제에서는 크기가 작기 때문에 반복문으로 해결할 수 있다. 

 

참고자료


  • 구름톤 프로젝트 매니징 자료
728x90
반응형