오늘한것

1. 알고리즘 challenge 문제풀기 (프로그래머스) (29 ~ 36)

2. 자바스크립트 혼공스 스터디 배정

3. 잘 안풀렸던 이전 문제 2개 해결

 

오늘은 자바스크립트 스터디반이 오전에 새로 배정되고, 조도 갑자기 재편성 되었던날.

알고리즘 문제도 나름 잘 해내고 있다고 생각한다. 

 

오늘 몇가지 풀기 까다로웠던 문제와  사용했던 방법들을 복기해보고자 한다.

 

자바스크립트에서 진법 변환

n = 3
let three = n.toString(3) // 10진수 3이 3진수로 변환

// 3진수에서 10진수로 변환
// parseInt안의 매개변수 3이 원래 n이 가진 진수가 몇진수인지를 설정
let answer = parseInt(n, 3)

 

최소직사각형 문제

https://school.programmers.co.kr/learn/courses/30/lessons/86491

function solution(sizes) {
  var answer = 0;
  let maxArr = [];
  let minArr = [];

  //배열안의 두 값을 비교해서 큰값은 0번 인덱스로, 작은값은 1번인덱스로 자리를 바꿔준다.
  for (let i = 0; i < sizes.length; i++) {
    if (sizes[i][0] < sizes[i][1]) {
      sizes[i] = sizes[i].reverse();
    }
  }
  //최대값끼리(0번 인덱스끼리), 최솟값끼리(1번 인덱스끼리) 배열 만들기
  for (let i = 0; i < sizes.length; i++) {
    maxArr.push(sizes[i][0]);
    minArr.push(sizes[i][1]);
  }
  console.log(maxArr, minArr);

  // 0번 인덱스의 최댓값 과 최솟값의 곱
  // min, max 함수는 각각 () 안에 나열된 수를 비교하는 것이기 때문에 배열 그대로 넣으면 오류, 전개연산자를 이용하여 객체나 배열의 원소들을 하나씩 꺼내어서 펼쳐서 리턴시켜야 한다.
  answer = Math.max(...maxArr) * Math.max(...minArr);

  return answer;
}

이때 Math.max를 사용할때 배열을 그냥 집어넣었더니 안됐고, 찾아보니 그냥 쉼표로 나열된 수를 넣어줘야했다.

쉽게 할 수 있는 방법이 없나 찾아보던도중 전개연산자를 알게 되었고,  배열의 원소들을 하나씩 꺼내서 넘겨주기 때문에 적용할 수 있다는 것을 알게 되었다.

 

 

 

로또의 최고 순위와 최저 순위

https://school.programmers.co.kr/learn/courses/30/lessons/77484

function solution(lottos, win_nums) {
  // 포함하지 않는값
  let arr1 = lottos.filter((x) => !win_nums.includes(x));

  // 중복값 == 맞춘 최소 숫자
  let arr2 = lottos.filter((x) => win_nums.includes(x));

  // lottos에 포함된 0의 갯수
  let zero = lottos.filter((x) => x === 0);

  // 3가지 예외 경우
  if (zero.length == 6) {
    // lottos에 0이 6개면 1 or 6등이므로
    return [1, 6];
  } else if (arr2.length == 6) {
    // lottos를 전부 다 맞추면 1등만이므로
    return [1, 1];
  } else if (arr1.length == 6) {
    // lottos를 전부 다 틀릴 경우
    return [6, 6];
  } else {
    // 두 경우 다 아니라면 arr2의 갯수와 zero의 갯수로 최고, 최저 순위를 구할 수 있다.
    return [7 - arr2.length - zero.length, 7 - arr2.length];
  }
}

이것은 if문으로 예외를 만들어 처리하는것이 2개의 예외는 test에 나오는데 lottos를 전부 다 틀릴경우는 나오지 않았다. 지금보니 그렇게 생각하는게 어렵지 않은것처럼 보이는데 ㅎㅎ 그 당시에는 조금 까다로웠던것 같다. 문제도 읽고 싶지않게 길기 때문에 괜히 어려워보이기도했는데, 막상 풀어보니 그렇게 어렵지는 않은듯..?

 

 

문자열 내 마음대로 정렬하기

https://school.programmers.co.kr/learn/courses/30/lessons/12915

 

 

사실 이문제는 sort 함수를 이용해서 하면 분명 풀릴것 같은데 내부에 조건문을 제대로 못써서 고민하다가 답을 확인하였다.

 

function solution(strings, n) {
  let answer = strings.sort((a, b) => {
  	// n번째 인덱스끼리 비교하여 a[n]이 크면 1을 반환하여 a와 b의 자리를 바꾼다.
    if (a[n] > b[n]) return 1;
    // n번째 인덱스끼리 비교하여 b[n]이 크면 -1을 반환하여 a와 b의 자리를 바꾸지 않는다.
    if (a[n] < b[n]) return -1;
    // n번째 인덱스끼리 비교했을때 두값이 같다면 a와 b를 비교
    if (a[n] === b[n]) {
      if (a > b) return 1;
      if (a < b) return -1;
      return 0;
    }
  });

  return answer;
}

 

참고:

 

잘한점

- reduce, fliter, sort같은 메소드들은 어느정도 익숙해진듯하다.

- 문제를 풀며 기록을 잘 해뒀기 때문에 TIL 작성시간 감소

 

다음 목표 및 개선해야할점

- 내일 자바스크립트 스터디 준비

- 챌린지 문제 끝내기

- 못푼문제, 애매했던 문제 복기

- react 주특기 전 추천영상 시청

 

 

+ Recent posts