algorithm challenge__24.03.04

석원·2024년 3월 4일

algorithm_challenge

목록 보기
1/3
post-thumbnail

오늘 문제는 프로그래머스에서 3가지를 선정했습니다.
1. 직사각형 별찍기
2. 문자열 내맘대로 정렬하기
3. 멀리뛰기
위 세가지 문제를 풀어봤습니다.


직사각형 별찍기

/**
 * 
 * @param {number} n 가로 길이
 * @param {number} m 세로 길이
 * 
 * 가로길이 세로의 길이를 알 때, * 을 이용하여 직사각형 만들기
 */
const 직사각형별찍기 = (n, m) => {
    let result = "";

    for(let i =0  ; i < m; i++) {
        for(let j = 0 ; j < n; j++) {
            result += "*";
        }
        result += "\n";
    }

    return result;
}

module.exports = { 직사각형별찍기 };

단순히 사각형 모양으로 별찍는문제라 어렵지 않게 해결 할 수 있었습니다.


문자열 내맘대로 정렬하기

/**
 * 
 * @param {string[]} strings 정렬하려는 문자열 배열
 * @param {number} n 정렬기준이 될 인덱스
 * 
 * strings를 map(), split()을 활용하여 2차원 배열로 변경시키고
 * 변경된 배열의 n 번째 문자를 기준으로 정렬한 후 다시 map(), join() 을 이용해서
 * 문자열 형태 배열로 반환한다.
 * 
 * 
 */
const incorrect_내맘대로정렬 = (strings, n) => {
  strings.sort();

  return strings
  .map(str => str.split(""))
  .sort((a, b) =>  a[n].charCodeAt() - b[n].charCodeAt())
  .map(str => str.join(""));
}

/**
 * 
 * @param {string[]} strings 
 * @param {number} n 
 * @returns {string[]} sorted strings
 * 
 * 입력받은 문자열배열을 사전순으로 우선 정렬을 한 후에,
 * 문자열의 n번째 문자의 유니코드를 반환 한다.
 * 
 * c.charCodeAt() c의 유니코드
 * str[2].charCodeAt() str의 2번째 문자의 유니코드
 * str.charCodeAt(2) str의 2번째 문자의 유니코드
 */
const correct_내맘대로정렬 = (strings, n) => {
  strings.sort();
  return strings.sort((a, b) => a.charCodeAt(n) - b.charCodeAt(n))
}


module.exports = {incorrect_내맘대로정렬, correct_내맘대로정렬};

지금 위 incorrect_내맘대로 정렬함수는 기존에 문제를 정확히 파악하지 못하여
처음에 sort() 해주는 부분이 없었고, 첫번째 map() 함수 후에 sort()에서 a[n] - b[b] 과 같이 비교를 해서 오답을 냈습니다. charCodeAt()을 이용해서 유니코드 값을 비교하여 정렬되게 하는 코드를 보고 정답을 수정할 수 있었습니다.


멀리 뛰기

/**
 * 
 * @param {number} n 총 칸수
 * 
 * 1칸, 2칸 뛸 수 있다.
 * 총 칸수를 입력받았을 때, 몇가지 방법으로 끝에 도달할수 있는지 구하기.
 */
const 멀리뛰기 = (n) => {
  const diff = new Array(n).fill(0);

  diff[0] = 1n;
  diff[1] = 1n;
  diff[2] = 2n;  
  
  for(let i = 3; i <= n ; i++) {
    diff[i] = diff[i - 1 ] + diff[i - 2];
  }
  
  
  return Number(diff[n] % 1234567n);
}

module.exports = {멀리뛰기};

위 문제를 풀면서 알게된 점은 정수 범위 내의 숫자는 1234567로 나눈 나머지는 각 연산을 수행할 때마다 1234567로 나누는 것과 완벽하게 동일한 숫자가 나온다는 것을 처음 알게 되었습니다.

규칙성을 발견하고 바텀업 방식의 dp를 적용하여 문제 해결할 수 있겠다고 생각했으나 작성한 답변이 오답처리가 되는걸 확인하고, BigInt를 이용하여 처리하면문제를 해결할수 있다는 것을 알게 되었습니다.


3가지 다른 난이도의 문제를 풀면서 확실히 생각을 좀 더 깊게 수학적으로 해야겠다는걸 느꼈고,
모르는 부분을 알게되어서 흥미로운 시간을 보냈습니다.

0개의 댓글