알고리즘 공부 6일 차 (2)

이름뭐라하지·2021년 11월 14일
0

시험 봄

시험 문제와 풀이. 답지가 없으니 맞는지 100% 확신은 없음. 입출력 예시 돌려볼 땐 맞았다. 내가 골랐던 문제는 2번

1. 행렬 음양 더하기

문제 설명

행렬이 두개 있습니다. 두 행렬의 절댓값을 차례대로 담은 정수 배열 absolutes와 행렬의 부호를 차례대로 담은 불리언 배열 signs가 매개변수로 주어집니다.
두 행렬의 부호는 같습니다.
실제 행렬 덧셈의 결과를 반환하는 함수, solution을 완성해주세요.

제한 사항

행렬 arr1, arr2의 행과 열의 길이는 500을 넘지 않습니다.

해결

처음에 TypeError: Cannot set property '0' of undefined오류가 났었는데
let answer =[[]]로 선언해 놓은 게 문제였다.

function solution(arr1, arr2, signs) {
  let answer = [[], []];
  for (let i = 0; i < arr1.length; i++) {
    for (let j = 0; j < arr1[i].length; j++) {
      answer[i][j] = signs[i][j]
        ? arr1[i][j] + arr2[i][j]
        : -arr1[i][j] - arr2[i][j];
    }
  }

  return answer;
}
solution(
  [
    [1, 2],
    [2, 3],
  ],
  [
    [3, 4],
    [5, 6],
  ],
  [
    [true, true],
    [true, false],
  ]
);
//[ [ 4, 6 ], [ 7, -9 ] ]

2. 자연수 뒤집어 더하기

문제 설명

자연수 n의 각 자리 숫자를 뒤집은 순서로 더해 출력하는 수식을 리턴해주세요. 예를들어 n이 12345이면 "5+4+3+2+1=15" 라는 문자열을 리턴합니다.

제한 사항

N의 범위 : 100,000,000 이하의 자연수

해결

function solution(n) {
  let arr = [];
  let sum = 0;
  let answer = "";
  do {
    arr.push(n % 10); //나머지 3 5 2 8 1 7
    sum += n % 10;
    n = Math.floor(n / 10); //몫 71825 7182 718 71 7 0
  } while (n > 0);
  {
  }

  answer = arr.join("+") + "=" + String(sum);
  return answer;
}
solution(718253);
//'3+5+2+8+1+7=26'

문자로 풀기

function solution(n) {
  let arr = [];
  let sum = 0;
  let answer = "";
  arr =String(n).split('').reverse()
  for(let a of arr){
    sum+=parseInt(a)
  }
  answer = arr.join('+')+`=${sum}`
  return answer;
}
solution(718253);
//'3+5+2+8+1+7=26'

3. 같은 글자는 싫어 + 문자열 내 맘대로 정렬하기

문제에서는 중복되는 단어는 '하나만' 남긴다고 하는데 입력 예시보면 중복되면 '전부'없애는 듯

문제 설명

배열 arr와 정수 n이 주어집니다. 배열 arr의 각 원소는 문자열로 이루어져 있습니다. 이때, 배열 arr에서 중복되는 단어는 하나만 남기고 전부 제거하려고 합니다. 단, 제거된 후 남은 단어들을 반환할 때는 각 문자열의 인덱스 n번째 글자를 기준으로 오름차순 정렬하려 합니다.
예를 들어 strings가 ["brush", "sun", "brush", "bed", "car"]이고 n이 1이면 중복을 제거한 배열인 ["sun", "bed", "car"]에서 각 단어의 인덱스 1의 문자 "u", "e", "a"로 strings를 정렬합니다.

제한 조건

strings는 길이 1 이상, 50이하인 배열입니다.
strings의 원소는 소문자 알파벳으로 이루어져 있습니다.
strings의 원소는 길이 1 이상, 100이하인 문자열입니다.
모든 strings의 원소의 길이는 n보다 큽니다.
인덱스 1의 문자가 같은 문자열이 여럿 일 경우, 사전순으로 앞선 문자열이 앞쪽에 위치합니다.

해결

중복되는 걸 하나만 남기는 건 많이 해봤는데 전부 없애기는 처음이라 고민했다. 이게 제일 시간을 잡아먹었다.
indexOf는 같은 값이 여럿일 때 제일 앞의 인덱스를 반환하므로, arr.indexOf(a)===arr.lastIndexOf(a)으로 첫a와 마지막a가 같은 인덱스에 있는지 검사해서 유일한 값만 answer배열에 추가하는 방법으로 중복하는 요소들을 걸러냈다.

function solution(arr, n){
    let answer=[];
    
    for(let a of arr){
      if(arr.indexOf(a)===arr.lastIndexOf(a)){
        answer.push(a)
      }
      
    }
    answer.sort(function(a,b){
      if(a[n]<b[n]) return  -1;
      if(a[n]>b[n]) return 1;
      if(a[n]===b[n])
        if(a<b) return -1;
        if(a>b) return 1;
        
      return 0;});
    return answer;
  }
  
  solution(["coke","dog", "water", "glass", "dog", "dog", "yogurt", "vitamin"],
  2)
  //[ 'glass', 'yogurt', 'coke', 'vitamin', 'water' ]
profile
뱃사공1 노질 중

0개의 댓글