\(@^0^@)/

[TDL] 05/08 Today's-Done-List 본문

TDL

[TDL] 05/08 Today's-Done-List

minjuuu 2022. 5. 8. 22:39
728x90

- Hello Coding 알고리즘 TIL 작성


 

- 자료구조 / 알고리즘 (Js ver.) 강의

해당 숫자의 자릿수 별 빈도수 구하기

(간단하게 정리하기 위해서 num값을 미리 지정하였음)

// 자릿수 계산

let result = [];
let num = 1234;

// 1. 배열안에 각 자릿수 별 index 생성.
for (let i = 0; i < 10; i++) {
    result[i] = 0;
}

// 2. 각 자릿수의 빈도수를 적립.
while (num != 0) {
    result[num % 10]++;
    num /= 10;
    num = parseInt(num);
}

console.log(result)        // (10) [0, 1, 1, 1, 1, 0, 0, 0, 0, 0]
  • 0부터 9까지의 총 10개인 숫자의 자릿수를 미리 생성해두고, 빈도수를 추가하기 위해
    기본값 0으로 된 index 10개의 배열을 생성.
  • num이 0이 아닐 때까지 반복문을 돌면서
    1. 해당 숫자 % 10를 하면 일의 자리 숫자를 구할 수 있다.
      => 1234 % 10으로, 4를 구해서 result [4]에 1 추가.
    2. 1234 / 10으로 123.4에서 정수만 나타내기 위해 parseInt 메서드로 소수점을 제거.
      => 123이 된다.
    3. 해당 숫자 % 10를 하면 일의 자리 숫자를 구할 수 있다.
      => 123 % 10으로, 3을 구해서 result [3]에 1 추가.
    4. 123 / 10으로 12.3에서 정수만 나타내기 위해 parseInt 메서드로 소수점을 제거.
      => 12가 된다.
    5. 해당 숫자 % 10를 하면 일의 자리 숫자를 구할 수 있다.
      => 12 % 10으로, 2를 구해서 result [2]에 1 추가.
    6. 12 / 10으로 1.2에서 정수만 나타내기 위해 parseInt 메서드로 소수점을 제거.
      => 1이 된다.
    7. 해당 숫자 % 10를 하면 일의 자리 숫자를 구할 수 있다.
      => 1 % 10으로, 1을 구해서 result [1]에 1 추가.
    8. 1 / 10으로 0.1에서 정수만 나타내기 위해 parseInt 메서드로 소수점을 제거.
      => 0이 된다.
    9. num이 0이 되었으므로, 반복문을 빠져나온다.
    10. 그렇게 되면 result [4], result [3], result [2], result [1]에 하나씩 추가된다.
      => [0, 1, 1, 1, 1, 0, 0, 0, 0, 0]가 된다.


2차원 배열 달팽이 만들기

  • 입력받은 크기(4)의 정사각형으로, 아래 그림처럼 시계방향으로 돌면서 숫자를 채워 2차원 배열을 반환.

let length = 4;
let result = [];

for (let i = 0; i < length; i++) {
    result[i] = [];
}

let direction = 1;
let x, y, num;
x = y = num = 0;
x--;
while (1) {
    for (let i = 0; i < length; i++) {
        x += direction;
        result[y][x] = ++num;
    }

    length--;

    if (length <= 0) break;

    for (let j = 0; j < length; j++) {
        y += direction;
        result[y][x] = ++num;
    }

    direction *= -1;
}

console.log(result);
/*
0: (4) [1, 2, 3, 4]
1: (4) [12, 13, 14, 5]
2: (4) [11, 16, 15, 6]
3: (4) [10, 9, 8, 7]
*/
  • 2차원 배열 생성
    => [ [ ], [ ], [ ] ]
  • 반복문 돌며 2차원 배열에 숫자 채우기.
    1. 반복문은 true로 하여, 계속 돌게 하고 예외를 줘서 break으로 빠져나가게 해 준다.
      => if (length <= 0) break;
    2. 0을 할당받는 상수 x, y, num을 생성.
      => let x, y, num;
      x = y = num = 0;
    3. 한 방향이 아니라, 시계방향으로 돌며 숫자를 채워줘야 하기 때문에 방향을 설정하기 위해 상수 direction 생성.
      상수는 1을 기본값으로 주고, 반대방향일 경우엔 -1을 할당해준다.
      => let direction;
    4. 처음에는 for문을 돌리면서 x축방향으로 입력받은 값만큼 숫자를 채운다.
      => for (let i = 0; i < length; i++) {
             x += direction;
             result [y][x] = ++num;
           }
    5. 시작 방향 : 맨 처음 x축에서 시작할 때, 입력받은 값만큼 x축으로 이동하려면 direction이 1이 아니라 0으로 시작
      (이유 : 현재 direction의 기본값이 1인 상태라서, x += direction 전에 이미 1이 들어가서 배열을 벗어나게 됨.)
      따라서 x축에 --을 줘서 0으로 만들어, 사각형 밖에서 시작하여 계산하게 한다.
      => x--;
    6. 그 뒤에 length를 하나 줄이면서, 다음 배열로 넘어간다.
      => length--;
    7. y축방향으로 입력받은 값만큼 숫자를 채운다.
      => for (let j = 0; j < length; j++) {
             y += direction;
             result [y][x] = ++num;
           }
    8. 방향을 바꿔주기 위해서 -1을 곱해준다.
      => direction *= -1;
    9. 다시 맨 위의 for문으로 돌아가서 x축에 -1 방향으로 가야 하는데, 그 의미는 반대로 추가되는 것이다.
      (예를 들어, 1, 2, 3을 추가해야 한다면, [3, 2, 1] 이런 식으로)
    10. 그 뒤에 length를 하나 줄이면서, 다음 배열로 넘어가고
    11. y축 방향에도 -1방향으로 가야 하기 때문에, 반대로 추가가 된다.
    12. 그 후, -1을 다시 곱해서 direction은 1이 되고
    13. for문으로 돌아가서 x축의 정방향 -> length를 하나 줄이고 -> y축 정방향 -> direction은 -1
    14. for문으로 돌아가서 x축 반대방향 -> length를 하나 줄이면 0이 되므로, 반복문을 빠져나오게 된다.


스택 (Stack)

  • 나중에 넣은 데이터가 먼저 나오는 LIFO(Last In First Out) 기반의 선형 자료 구조
  • 구현 메서드 (method)
    • 데이터 전체 획득 / 비어 있는지 확인 : Stack.getBuffer(), Stack.isEmpty()
    • 추가 / 삭제 / 마지막 데이터 조회 / 크기 확인 : Stack.push(), Stack.pop(), Stack.peak(), Stack.size()
    • 데이터 위치 / 존재 여부 확인 : Stack.indexOf(), Stack.includes()


 

- 주말 회고 (만족도 : 8)

[○]  1. 연결 리스트 - 대표 선출 문제 풀이
[△]  2. hello coding 알고리즘 책에서 연결 리스트 부분 읽고 정리 + 유튜브로 학습.
[○]  3. 배열 - 숫자 빈도수, 달팽이 만들기 문제 풀이
[ Χ ] 4. leetcode에서 배열, 연결 리스트 관련 문제 풀어보기
[△]  5. 스택, 큐 학습 + hello coding 알고리즘 책


연결 리스트 문제를 풀다가, 지난번에 그냥 스킵했던 배열 문제들을 풀었더니
연결 리스트가 더 어려워서 그런지 배열은 그래도 나름대로 푸는 나를 보며 뿌우듯했다... 현실은 아직 기초 문제들ㅠ

수요일에 코테에서 좌절을 맛보고 언제 공부해서 언제 그런 걸 다 풀 수 있게 되는 건가 싶었는데..
그래도 조금씩이지만 발전하고 있단 생각에 오랜만에 만족스럽고 집중도도 괜찮은 하루였다.

코테 이후로 목, 금, 토 3일 동안 중요한 일정도 있고 컨디션도 좋지 않았지만, 솔직히 나태해진 것도 있었다ㅠ
앞으로 다가오는 코테와 다른 테스트, 스터디를 위해서라도 다시 정신 차리고 열심히 해보자.
오랜만에 뽀모도로 사용하니깐 효과가 좋은 것 같아서 앞으로도 사용할 예정!


[ 출처, 참고 : 제로베이스 프런트엔드 스쿨 ]

728x90

'TDL' 카테고리의 다른 글

[TDL] 05/10 Today's-Done-List  (0) 2022.05.11
[TDL] 05/09 Today's-Done-List  (0) 2022.05.10
[TDL] 05/05 Today's-Done-List  (0) 2022.05.05
[TDL] 05/04 Today's-Done-List  (0) 2022.05.04
[TDL] 05/03 Today's-Done-List  (0) 2022.05.03