항해99

[항해99] TIL D+6

crab. 2022. 7. 17. 01:14

알고리즘..

  • 많이 풀었다.
  • 풀고 풀어도 끝이 없다..
  • 더 이상은 naver..

오늘 뭐했지?

  • 리액트 듣긴 했는데 영~ 기억에 안남는다..
  • 확실히 어려워서 이제는 뇌가 거부반응을 일으키나보다
  • 그래서 오히려 마음이 편할지도?..

오늘의 알고리즘

핸드폰 번호 가리기

행렬의 덧셈

x만큼 간격이 있는 n개의 숫자

부족한 금액 계산하기

2016년

나누어 떨어지는 숫자 배열

내적

문자열 내 p와 y의 개수

자세한건 프로그래머스 탭을 봐주세요!

팀원분 중 한분의 코드를 리팩토링

  • 그 분의 풀이를 최대한 존중하며 그 분의 의도대로 구현하고
  • 궁금하셨던 부분이 해소될 수 있도록 적어봤다.
  • (물론 진짜로 해소됐을지는 모르는 문제이다..)

배열 선언 이슈

  • 두가지 방법을 할 수 있습니다.
    1. 처음에 빈 배열을 만들고 push하는 방법
    2. 처음부터 new Array를 이용해 동적으로 배열의 길이를 정해주는 법
  • 차이는 처음에 Array.from을 이용하여 array를 0으로 할당하는 것 이외에는 크게 없기에
    1. 은 그냥 코드만 올리겠습니다.

1. 빈 배열과 push를 이용한 풀이

/ → %

  • 팀원분께서 의도하신 설계대로 구현하려면
  • %의 의미가 더 맞습니다.

for문 → if문

  • 팀원분의 노션공유코드기준 23 번째 라인의
    • for(div_arr[i] == 0){ → if(div_arr[i] === 0)

count 자리에 추가 기능

  • count가 들어가는 자리에 정답배열에 나머지가 0인 숫자들을 넣는 것이 바람직해 보입니다.

완성 코드

function solution(arr, divisor) {
        // 예를 들어, 주어진 배열 arr가 arr[5] = {3, 4, 1, 4, 7} 라고 하자.
        // arr의 각 원소를 divisor로 나눈 값을 원소로 갖는 배열을 div_arr[5]라고 하면,
        // 1. div_arr[5] = {3/divisor, 4/divisor, 1/divisor, 4/divisor, 7/divisor}.
        // 2. 이때 div_arr의 원소 == 0인 원소의 개수를 판별.
        // 3. 만약 그 개수가 0일 경우 -1을 리턴하고,
        // 4. 1개 이상일 경우 arr를 오름차순으로 재정렬하여 리턴.

        let div_arr = [];
        /* arr의 각 원소를 divisor로 나눈 값을 원소로 갖는 배열 */

        let re_arr = []; // 오름차순으로 재정렬된 배열 //pjs:정답 배열
        let count = 0; // div_arr의 원소 == 0인 원소의 개수 //pjs:0으로 나눠지는 
																													//수가 있는지 체크
        let i,
          j,
          temp = 0;

        for (i = 0; i < arr.length; i++) {
          // 주어진 배열 arr에 대하여
          div_arr.push(arr[i] % divisor);
          // arr의 각 원소를 divisor로 나눈 값을 div_arr에 넣음.
          if (div_arr[i] === 0) {
            count++;
            // div_arr의 원소 == 0인 원소의 개수만큼 count 값이 증가
            re_arr.push(arr[i]);
          }
        }

        if (count == 0) {
          // div_arr의 원소 == 0인 원소의 개수가 0일 경우
          re_arr.push(-1); // 최종 값으로 -1을 리턴.
        } else {
          // arr을 오름차순으로 정렬
          for (i = 0; i < re_arr.length; i++) {
            for (j = 0; j < re_arr.length - 1 - i; j++) {
              /* arr[j]와 arr[j + 1]을 비교할 예정이기 때문에
      배열의 마지막 원소를 포함하지 않아도 검색 대상에 포함되므로,
      즉 마지막 원소가 어차피 arr[j+1]에 포함되므로 1을 빼줘야 한다.
      또, 인접한 두 원소를 바꿔치기할 때마다
      배열의 마지막 원소의 위치가 고정되므로 i를 빼줘야 한다. */

              if (re_arr[j] > re_arr[j + 1]) {
                // arr의 앞쪽 원소가 뒷쪽 원소보다 값이 크면
                temp = re_arr[j]; // 더 큰 값을 갖는 앞쪽 원소를 잠시 temp에 넣어뒀다가
                re_arr[j] = re_arr[j + 1]; // 더 작은 값을 갖는 뒷쪽 원소를 앞으로 보내고
                re_arr[j + 1] = temp; // 더 큰 값이 저장되어 있던 temp를 뒤로 보냄.
              }
            }
          }
        }

        return re_arr;
      }

2. Array.from을 이용한 풀이

function solution(arr, divisor) {
        // 예를 들어, 주어진 배열 arr가 arr[5] = {3, 4, 1, 4, 7} 라고 하자.
        // arr의 각 원소를 divisor로 나눈 값을 원소로 갖는 배열을 div_arr[5]라고 하면,
        // 1. div_arr[5] = {3/divisor, 4/divisor, 1/divisor, 4/divisor, 7/divisor}.
        // 2. 이때 div_arr의 원소 == 0인 원소의 개수를 판별.
        // 3. 만약 그 개수가 0일 경우 -1을 리턴하고,
        // 4. 1개 이상일 경우 arr를 오름차순으로 재정렬하여 리턴.

        let div_arr = Array.from({ length: arr.length }, () => 0);
        let answer = [];
        /* arr의 각 원소를 divisor로 나눈 값을 원소로 갖는 배열 */

        let re_arr = []; // 오름차순으로 재정렬된 배열
        let count = 0; // div_arr의 원소 == 0인 원소의 개수
        let i,
          j,
          temp = 0;

        for (i = 0; i < arr.length; i++) {
          // 주어진 배열 arr에 대하여
          div_arr[i] = arr[i] % divisor;
          // arr의 각 원소를 divisor로 나눈 값을 div_arr에 넣음.

          if (div_arr[i] === 0) {
            // div_arr의 원소 == 0인 원소의 개수만큼 count 값이 증가
            count++;
            answer.push(arr[i]);
          }
        }

        if (count == 0) {
          // div_arr의 원소 == 0인 원소의 개수가 0일 경우
          answer.push(-1); // 최종 값으로 -1을 리턴.
        } else {
          // arr을 오름차순으로 정렬
          for (i = 0; i < answer.length; i++) {
            for (j = 0; j < answer.length - 1 - i; j++) {
              /* arr[j]와 arr[j + 1]을 비교할 예정이기 때문에
      배열의 마지막 원소를 포함하지 않아도 검색 대상에 포함되므로,
      즉 마지막 원소가 어차피 arr[j+1]에 포함되므로 1을 빼줘야 한다.
      또, 인접한 두 원소를 바꿔치기할 때마다
      배열의 마지막 원소의 위치가 고정되므로 i를 빼줘야 한다. */

              if (answer[j] > answer[j + 1]) {
                // arr의 앞쪽 원소가 뒷쪽 원소보다 값이 크면
                temp = answer[j]; // 더 큰 값을 갖는 앞쪽 원소를 잠시 temp에 넣어뒀다가
                answer[j] = answer[j + 1]; // 더 작은 값을 갖는 뒷쪽 원소를 앞으로 보내고
                answer[j + 1] = temp; // 더 큰 값이 저장되어 있던 temp를 뒤로 보냄.
              }
            }
          }
        }

        return answer;
      }

오늘의 react

  • 그래도 다시 항해 시작전의 템포를 조금씩 찾고있다.
  • 공부는 관성이다.
  • 궤도에 올려야한다.
  • 컨텍스트를 동적으로 만들기
  • 리액트 컨텍스트의 제한
    • 한 hooks안에 다른 hooks이 들어가면 안된다.
  • 입력 컴포넌트 리팩토링
    • 컨텍스트와 Refs를 이용하여 바꿀 수 있다.
    • 단, 모든 hooks에 절대적인 것은 없다.
    • 항상 적절한 hooks를 사용하자.
  • 새로운 웹서비스 만들기 돌입!
    • 다시 컴포넌트부터 차근차근 만든다.
    • 이번에는 css module까지만 쓰고있다.
    • 내일이 기대된다!

'항해99' 카테고리의 다른 글

[항해99] TIL D+8  (0) 2022.07.20
[항해99] TIL D+7  (0) 2022.07.18
[항해99] TIL D+5  (0) 2022.07.16
[항해99] TIL D+4  (0) 2022.07.15
[항해99] TIL D+3  (0) 2022.07.14