[알고리즘] 가장짧은문자거리, K번째큰수, 대표값

먼지·2022년 10월 2일
0
post-thumbnail

자바스크립트 알고리즘 문제풀이
가장 짧은 문자 거리
이건 두 번째 푸는데도 못 풀어서 다시 풀고 정리

function solution(str, t) {
  let answer = [];
  let p = 1000;
  for (let x of str) {
    if (x === t) {
      p = 0;
      answer.push(p);
    } else {
      p++;
      answer.push(p);
    }
  }
  p = 1000;
  for (let i = str.length - 1; i >= 0; i--) {
    if (str[i] === t) {
      p = 0;
    } else {
      p++;
      answer[i] = Math.min(answer[i], p);
    }
  }
  return answer;
}

console.log(solution('teachermode', 'e'));
// [ 1, 0, 1, 2, 1, 0, 1, 2, 2, 1, 0 ]

/* 
p=1000, e를 만나면 0 아니면 +1 & answer에 push
------------------------>
  t   e a c h e r m o d e
[1001|0|1|2|3|0|1|2|3|4|0]
↳ 이것은 자기의 "왼쪽"에 있는 e로부터 떨어진 거리인데
"t"는 왼쪽에 e가 없어서 큰 숫자로 초기화?
"c"는 왼쪽에 있는 e로부터 거리가 2

이제 오른쪽으로부터 떨어진 거리 구하기
첫 번째에 e가 있으니까 바로 p=0 바꾸기 & e가 아니면 ++
<------------------------
     t   e a c h e r m o d e
   [1001|0|1|2|3|0|1|2|3|4|0]
=> [1   |0|1|2|1|0|1|2|2|1|0]
기존 값을 더 작은 값으로 교체
*/

파이썬 알고리즘 문제풀이 입문
1. K 번째 큰 수

function solution(input = '10 3\n13 15 34 23 45 65 33 11 26 42') {
  const [_, nums] = input.split('\n');
  const [N, K] = _.split(' ');
  const arr = nums.split(' ').map(Number);
  let set = new Set();

  // 각+1해야함 => i=0, j=i+1, k=j+1
  for (let i = 0; i < N; i++) {
    for (let j = i + 1; j < N; j++) {
      for (let k = j + 1; k < N; k++) {
        set.add(arr[i] + arr[j] + arr[k]);
      }
    }
  }

  // Array.from() 함수는 유사배열객체나 반복가능객체를 얕은 복사하여 새로운 배열을 만듦
  // 유사배열객체(array-like object) : length 속성과 index element를 가지는 객체
  // 반복가능객체(iterable object) : 배열을 일반화한 객체 ex)Map, Set
  return Array.from(set).sort((a, b) => b - a)[K - 1];
}

console.log(solution()); // 143
  1. 대푯값
    직님 풀이 외웠는데 다른 방법으로도 풀어봐야겠음 ㅜㅜ
function solution(input) {
  const [first, second] = input.split('\n');
  const N = parseInt(first);
  const [...scores] = second.split(' ').map((e) => parseInt(e));

  const average = Math.round(scores.reduce((acc, cur) => acc + cur) / N);
  const diff = [];
  for (let i = 0; i < N; i++) {
    diff.push(scores[i] - average);
  }
  const diffAbs = [];
  for (let i = 0; i < N; i++) {
    diffAbs.push(Math.abs(diff[i]));
  }

  const minDiffAbs = Math.min(...diffAbs);
  // obj = {} # {'12': 36, '22': 34, '32': 36, '42': 34, '52': 36}
  const obj = {};

  for (let i = 0; i < N; i++) {
    if (diffAbs[i] == minDiffAbs) {
      obj[i + 1] = scores[i];
    }
  }
  const sortDict = Object.entries(obj).map((e) => parseInt(e[0])); // key값 형변환
  // .sort((a,b)=> a[1] - b[1])
  // [
  //   [ 22, 34 ],
  //   [ 42, 34 ],
  //   [ 12, 36 ],
  //   [ 32, 36 ],
  //   [ 52, 36 ]
  // ]

  return [average, sortDict[0]].join(' ');
}

const input = `60
25 60 17 60 11 15 27 42 39 31 25 36 32 25 17 45 67 89 24 65 13 34 17 6 11 15 27 42 39 31 25 36 32 25 17 45 67 89 24 65 13 34 17 6 11 15 27 42 39 31 25 36 32 25 17 45 67 89 24 65`;
console.log(solution(input)); // 35 12
profile
꾸준히 자유롭게 즐겁게

0개의 댓글