[알고리즘] 1, 2차원 배열 탐색

먼지·2022년 4월 26일
0
post-thumbnail

1. 큰 수 출력하기

function solution(numArr) {
  let prev = 0;
  let result = [];
  for(let i = 0; i < numArr.length; i++) {
    if(numArr[i] > prev) {
      result.push(numArr[i]);
      prev = numArr[i];
    } else {
      prev = numArr[i];
    }
  }
  return result;
}

// 강사님풀이
function solution1(arr) {
  let answer = [arr[0]];
  for(let i = 1; i < numArr.length; i++) {
    if(arr[i] > arr[i-1]) answer.push(arr[i]);
  }
  return answer;
}

// 다른 분 reduce 사용한 코드
function solution(arr) {
  let answer = [];
  arr.reduce((prev, cur) => {
    if (prev < cur) answer.push(cur);
    return cur;
  }, 0);
  return answer;
}

문제에 첫 번째 수는 무조건 출력한다 라는 말을 못 봐서 prev라는 변수를 하나 더 만들어버렸다..
그리고 reduce가 익숙하지 않고 성능적으로 좋은진 모르겠지만 깔끔한 것 같아서 연습해 봐야겠다

2. 보이는 학생

function solution(arr) {
  let result = [arr[0]];
  for(let i = 1; i < arr.length; i++) {
    if(result[result.length - 1] < arr[i]) {
      result.push(arr[i]);
    }
  }
  return result.length;
}

// 강사님 풀이
function solution1(arr) {
  let answer = 1, max = arr[0];
  for(let i = 0; i < arr.length; i++) {
    if(arr[i] > max) {
      answer++;
      max = arr[i];
    }
  }
  return answer;
}

console.log(solution([130, 135, 148, 140, 145, 150, 153])); // 5

카운트 세는 문제랑 배열을 출력하는 1, 2 문제 뭔가 서로 바꿔서 생각한 듯..?

3. 가위바위보

function solution(arrA, arrB) {
  let answer = []
  // A가 이기는 경우가 아니고 비기는 경우도 아니면 B가 이기는 경우!
  for (let i = 0; i < arrA.length; i++) {
    if (arrA[i] === arrB[i]) answer.push('D')
    else if (arrA[i] === 2 && arrB[i] === 1) answer.push('A')
    else if (arrA[i] === 1 && arrB[i] === 3) answer.push('A')
    else if (arrA[i] === 3 && arrB[i] === 2) answer.push('A')
    else answer.push('B')
  }
  return answer
}

// 다른 분 연산을 이용한 풀이
function solution(a, b) {
  let answer = [];
  for (let i = 0; i < a.length; i++) {
    if (a[i] === b[i]) answer.push('D');
    else if (a[i] - b[i] === 1 || a[i] - b[i] === -2) answer.push('A');
    else answer.push('B');
  }
  return answer;
}

const a = [2, 3, 3, 1, 3];
const b = [1, 1, 2, 2, 3];
console.log(solution(a, b)); // A B A B D

바보같이 모든 경우의 수를 생각해서 if문 다 작성할 뻔... ㅜ 경우를 따지는 문제에서는 기준을 잘 잡아야 함! 뭐로 잡아서 분류를 할지 생각해 보기

4. 점수계산

function solution(arr) {
  let cnt = 0;
  let result = 0;
  for (let x of arr) {
    if (x === 1) {
      cnt++;
      result += cnt;
    } else {
      cnt = 0;
    }
  }
  return result;
}

console.log(solution([1, 0, 1, 1, 1, 0, 0, 1, 1, 0])); // 10

5. 등수구하기

// 91점 3명이 1등이면 1 1 1 2
function solution(arr) {
  const obj = {};
  const result = [];
  const sort = [...arr].sort((a, b) => b - a);
  const unique = sort
    .filter((v, i) => sort.indexOf(v) === i)
    .map((v, i) => (obj[v] = i + 1));
  arr.map((v) => result.push(obj[v]));
  return result;
}

console.log(solution([87, 89, 92, 92, 100, 76])); // [4, 3, 2, 2, 1, 5]

강사님은 for문을 이용하셨는데 난 여전히 2중 for 문이 헷갈려서 조금 복잡한? 방법으로 풀었다. 내가 생각한 방법은 우선 큰 수 순으로 이루어진 중복이 제거된 배열로 object를 하나 만들었다.

그런데 sort를 하면 원본 배열이 변경돼서 spread operator 기존 배열을 복사하고 filter로 중복된 숫자를 제거하고 텅 빈 obj에 키는 정렬된 arr의 값으로, i는 1부터 시작해야 하므로 value는 i+1로

{
  100: 1,
  92: 2,
  87: 3,
  ...
}

이렇게 등수대로 이루어지게 만든 다음, 전달받은 arr를 돌면서 obj[arr value] 형식으로 꺼내서 result 배열에 push 되게 풀었다.

profile
꾸준히 자유롭게 즐겁게

0개의 댓글