티스토리 뷰

TIL

[TIL] 오늘의 검색내용 2022-10-28

아몬드통 2022. 10. 28. 22:39

1. Java에서 comparable과 comparator의 차이
comparable은 interface상속 후 자기 자신과 다른 객체를 비교하는 compareTo(Object o) 메서드를 오버라이드 하고 comparator는 interface상속 후 자신과는 관계가 없고 인자로 들어오는 객체1과 객체2를 비교하는 compareTo(Object o1, Object o2)  메서드를 오버라이드 한다.

내 생각의 두개의 차이점은 comparable은 상속받는 클래스는 반드시 비교를 하는 객체여야 하지만 comparator는 2개의 객체를 받아서 비교 하기 때문에 어떤 클래스에서 상속받아도 상관이 없다고 생각이 된다.
추가적으로 정렬 대상의 클래스 코드를 직접 수정할 수 없는 경우에 comparator를 사용하면 된다고 한다.

2. 프로그래머스 문제 풀다가 검색함. js에서 Math.floor는 소수점 내림((12.34 -> 12)

추가로 Math.ceil은 소수점 올림(12.34 -> 13), Math.round는 소수점 반올림(12.50 -> 13) (12.49 -> 12)

옛날 말로 사사오입이라고 한다....

3. java나 js의 .sort 연산에서 양수는 참(두 값의 자리 바꿈), 음수는 거짓(두 값의 자리 안바꿈), 둘다 아닐 경우(보통 같을때)는 안바꿈. 을 표현하기 때문에 숫자로 비교할때는 a - b 를 하면 a가 크면 바꾸고 b가 크면 안바꾸고 같을때도 안바꾼다. 이런 방식이 기본이다. 이걸 기억해야 1번에서 작성한 comparable이나 comparator를 사용할 수 있다.

그리고 이런 방식은 굉장히 변경이 쉽기 때문에 논리적으로 이해해야한다.  asc 와 desc 일때 조건이 다르고, a와 b의 위치가 다르면 또 결과가 다르다.

4. 보통의 언어에서 비트연산자 &는 이진수의 and연산자이다. 0과1이라고 했을때 0&0=0, 0&1=0, 1&0=0, 1&1=1 이고 이 공식을 이용해서 짝수와 홀수를 구할 수 있다. 어떤 수 x와 x&1연산을 하게 되면 그 값이 1이면 홀수, 0이면 짝수이다.

이유는 직접 2진수를 만들어서 &연산을 해보면 더욱 쉽게 알 수 있다. 라고 말하고 끝내려고 했으나. 간단히 설명하자면

15 -> 1111, 1 -> 0001

1111

0001

------- and연산

0001 = 1

 

10 -> 1010, 1 -> 0001

1010

0001

------- and연산

0000 = 0

 

5. javascript에서 자료구조 Map을 사용하기 위해서는 보통 const map = new Map(); 으로 선언해줘야한다. 그냥 map은 보통 배열을 반복하는 map키워드로 사용해서 헷갈리기 쉬우니 조심해야한다.

6. javascript에서 크기가 x이고 모든 값을 0으로 된 배열을 생성하고 싶으면 const array = new Array(x).fill(0); 으로 만들면 된다.

7. javascript 의 array.indexOf(값)으로 중복제거가 가능하다. array.indexOf(값)는 해당하는 값이 존재하면 index순서상의 가장 앞의  index를 반환하므로 
const arr = ['A', 'B', 'C', 'A', 'B'];
const newArr = arr.filter((element, index) => arr.indexOf(element) === index); 
이 방식을 사용하면 index 3일떄('A') arr.indexOf(element)의 값은 0이고 이때 index는 3이기 때문에 조건이 false라서 반환하지 않는다. 그래서 최종적으로 newArr는 ['A', 'B', 'C'] 이다.

8.  프로그래머스 코딩테스트 연습 > 코딩테스트 입문 > 최빈값 구하기
내가 푼 방식 

function solution(array) {
  /** 주어진 배열에서 중복값을 제거한 배열을 만든다.**/
  const newArr = array.filter((element, index) => array.indexOf(element) === index);

  //중복값을 제거한 배열로 해당 값이 몇번 중복인지를 저장하는 배열을 만든다.
  // [1, 2, 3, 3, 3, 4] 일때 중복제거 배열 newArr는 [1,2,3,4] 이고
  // 각각의 중복횟수를 가진 배열 numberArray는[1, 2, 3, 1] 이다.
  const numberArray = newArr.map((element) => {
    return array.filter((origin) => {
      return element === origin;
    }).length;
  });

  //최대 중복값이 몇인지 구한다.
  const maxValue = Math.max(...numberArray);

  const result = [];

  //중복횟수를 가진 배열에서 최대중복값을 가진 배열을 모두 result에 저장한다.
  //이유는 최대중복값을 가진 숫자가 2개 이상이면 -1을 반환하기 위해서
  numberArray.forEach((element, index) => {
    if (element === maxValue) {
      result.push(newArr[index]);
    }
  });

  //만약 최대중복값을 가진 숫자가 2개 이상이면 -1을 반환한다.
  if (result.length > 1) {
    return -1;
  }

  //최대중복값 반환
  return result[0];
}


9. 최대공약수(gcd), 최소공배수(lcm)
최대 공약수를 쉽게 구하려면 유클리드 호제법을 사용하면 된다.
(a > b) 일때 아래와 같이 계속해서 나머지를 구하다보면 나머지가 0이 될때 나눌값(b,c,d) 가 최대공약수이다. 참고로 무조건 최대공약수는 나오게 되어있다. 이유는 나누다보면 결국 1로 나눌때가 나오기 때문에 그때는 무조건 결과가 0이고 1이 최대공약수이기 때문이다.
(a < b) 인 상황은 값을 반대로만 넣어주면 최대공약수를 구할 수 있고 값이 같다면 최대공약수와 최소공배수는 모두 해당 값이다. 
a % b = c
 b % c = d
 c % d = e
...
최소공배수는 최대공약수를 구했다면 바로 알 수 있다. 
lcm = a * b / gcd 이다.

10. javascript array.reduce
reduce()** **메서드는 배열의 각 요소에 대해 주어진 **리듀서**(reducer) 함수를 실행하고, 하나의 결과값을 반환합니다.
라고 MDN에 적혀 있다. 조금 어렵게 들리지만 내가 이해한건 map과 같이 array를 반복하는 것은 같지만 reducer함수(콜백함수) 를 실행해서 그 결과를 하나의 결과로 반환한다. 이다.
전체 배열의 합, 평균, 곱 등 하나의 결과가 필요할 때 유용하게 사용이 가능할 것 같다.
예 들어서 배열의 모든 값의 평균을 구하는 방법은 array.reduce((prevValue, curValue) => prevValue + curValue ) / array.length

 
댓글