행복을 담는 블로그

[TIL] 240104(목) 알고리즘 문제 풀기 / 문자열 내 마음대로 정렬하기 본문

TIL

[TIL] 240104(목) 알고리즘 문제 풀기 / 문자열 내 마음대로 정렬하기

hyun0zin 2024. 1. 4. 21:09

오늘의 공부📖

  1. 09-11시 [특강] 알고리즘 세션 2일차
  2. JS 문법 2주차 강의 복습 + 정리하기
  3. JS 문법 3주차 강의 수강
  4. 개인 과제 진행

 

오늘 공부한 내용 정리💁🏻‍♀️

 

1. 복습한 내용

1) Map

📌 Map 이란?

  • key-value pair를 저장
  • 객체와 비슷. BUT 객체는 key에 문자 형태만 가능하다.
  • Map은 key에 어떤 데이터 타입(유형)도 다 들어올 수 있다.
  • Map은 key가 정렬된 순서로 저장된다.
  • Map 생성
const myMap = new Map();
  • set() method : Map에 값을 추가
myMap.set('key', 'value'); // {'key' => 'value'}
  • get() method : Map에 값을 검색
console.log(myMap.get('key')); // 'value' 출력
  • Map의 반복
    : keys(), values(), entries() 메소드를 사용하여, key, value, key-value pair를 반복 할 수 있다.
const myMap = new Map();
myMap.set('one',1);
myMap.set('two',2);
myMap.set('three',3);

// keys()
for (const key of myMap.keys()) {
    console.log(key);
} 

// values()
for(const value of myMap.values()){
    console.log(value);
}

// entries()
for (const entry of myMap.entries()){
    console.log(entry);
}
  • Map의 크기 및 존재 여부 확인
console.log(myMap.size); //map의 사이즈
console.log(myMap.has("two")); // key 기반 검색

2) Set

📌 Set 이란?

  • 고유한 값을 저장하는 자료구조다.
  • 값만 저장한다. - value (o)
  • 키를 저장하지는 않는다. - key (x)
  • 값이 중복되지 않는 유일한 요소로만 구성된다.
  • Set 생성
const mySet = new Set();
  • Set 사용
  • const mySet = new Set(); mySet.add('value1'); mySet.add("value2"); mySet.add("value2"); // 중복되는 값은 제거하고 출력



2. 새롭게 배운 내용

1) JS 문법 종합반 강의 2주차 연습문제

function solution(strings,n) {
    var answer = [];
    // 1. 문자열의 가장 앞 글자를 붙인 배열 만들기
    for(var i=0; i<strings.length; i++) {
        strings[i] = strings[i][n] + strings[i];
        // car -> a + car -> acar
    }


    // 2. 해당 배열을 사전순으로 정렬(sort)
    strings.sort(); //자동으로 오름차순으로 정렬


    // 3. 앞 글자 제거 후 리턴
    for(var j=0; j<strings.length; j++){
        strings[j]=strings[j].replace(strings[j][0], '');
        answer.push(strings[j]);
    } 
    console.log(answer);
    return answer;
}

▶️ 알고리즘 문제를 풀 때 어떤 방식으로 풀어 나가야 하는지, 1,2,3 순서를 먼저 작성해 볼 것.
이후 각 순서에 맞는 코드를 작성하고 하나하나의 로직 단위로 쪼개어 잘 실행 되는지 확인해보고 다음 코드로 넘어가자.



3. 알고리즘 코드카타

1) [특강] 알고리즘 세션 2일차

: 문제를 먼저 해석하자!

1️⃣ 뼈대를 먼저 작성하기 (글로 풀어서 적어보기)
2️⃣ 작성된 뼈대를 토대로 어떤 로직을 써야하는지 먼저 생각해보자
▶️ 연습장 + 손필기로 먼저 생각해보기
3️⃣ 로직이 정상적이다라고 생각이 들면, 그때 코드로 하나씩 구현하자
4️⃣ 처음부터 코드를 짠다고 생각하지마라

🧐항상 문제가 어떻게 구현이 될 것인지 먼저 생각하고 이후에 코드 구현하자

2) 알고리즘 문제 #1

문제 1.
문자열 내에서 각 문자가 몇 번 등장하는지 세는 프로그램을 작성하세요.
예를 들어, 문자열 'spartan'이 주어지면, 결과는 다음과 같아야 합니다 : { s: 1, p: 1, a: 2, r: 1, t: 1, n: 1 }”

▶️ 우선 문제에 어떤 로직을 써야 하는지 먼저 생각해보자. 💡

  • 일단 문자열을 앞에서부터 하나하나 읽어 나가야겠다. (= 반복문 이용해서 Counting 하자!)
  • 해당 객체에 카운트가 이미 있으면 -> +1 / 카운트가 없으면 -> 1로 세팅
  • 그럼 카운트가 있는지 없는지는 어떻게 알 수 있지? 조건문 활용!
function countCharacters(str) {
  let charCount = {}; //빈 객체 생성

  //char의 값을 기반으로 카운팅을 해야함!
  for (let i=0; i < str.length; i++) {
    const char = str[i];
    if (charCount[char]){
        charCount[char]++; 
    } else {
        charCount[char] = 1;
    }
  }
  return charCount;
}

3) 알고리즘 문제 #2

문제 2.
주어진 문자열을 뒤집어서 반환하는 함수를 작성해주세요!
예를 들어, 문자열 'spartan'이 주어지면, 결과는 다음과 같아야 합니다: ‘natraps’

▶️ 생각해보자.

  • 처음에는 얘를 split해서 다시 뒤집어 배열 해야하나? 생각함
  • 하지만 배열이 아닌 문자열. 문자열의 순서를 뒤에서부터 순서대로 나열해보자!
  • for(i=str.length-1; i>=0; i--){} 를 이용하여 'i--' 역순으로 추가하기!!
function reverseString(str){
  let reversed = " "; // 빈 문자열 생성 : 역순 문자열 추가할 공간이 필요하므로!
  for(i=str.length-1; i>=0; i--){
          reversed += str[i]; // 빈 문자열에 문자 하나씩 추가
  }
  return reversed; // 뒤집힌 문자열 반환
}

 

하루를 마치며...🤔

오늘도 알고리즘 2일차 세션으로 하루를 시작하며 알고리즘 문제를 풀었다. 역시나 단번에 문제를 풀어 나가는 과정이 쉽지만은 않았다. 어떻게 풀어야 하나 생각은 해 봤지만, 코드로 구현해 내는 것이 결코 쉽지 않았고, 해설 혹은 설명을 들으니 충분히 이해가 갔고 해결 가능한 문제들이라고 생각이 들었다. 오늘 배운 것 처럼 처음부터 코드를 짜려고 시도하지 말고 전체적인 뼈대를 먼저 구성하고, 순서에 맞게 로직을 생각해 본 뒤에 그에 맞는 코드를 하나씩 짜나가는 연습을 꾸준히 해야겠다! 이미 배운 내용도 있고 또는 처음보는 내용들도 많아서 알고리즘 문제를 꾸준히 풀기만 해보 복습 + 학습이 충분될 것이라고 생각이 든다. 앞으로 매일 알고리즘 코드카타 시간을 이용해 새로운 문제들을 풀고, 또 새롭게 배운 개념이 있다면 잘 정리해 놓도록 하자.

또한 개인과제를 얼른 시작 해야겠다는 생각이 들어서 다시 과제를 진행하고자 하였는데, 기본적인 html, css 뼈대만 잡을 수 있었고, 순수 자바스크립트 문법만 이용하여 오픈 api를 이용해 data 가져오는 것은 아직 진행하기가 어려웠다. 얼른 강의를 마저 수강하고 직접 페이지를 만들어가면서 모르겠는 부분들을 다시 복습해가며 차근차근 익혀 나가야겠다.

 

한 줄 회고😎

강의를 잘 이해하고 넘어가는 것도 중요하지만, 직접 실습을 진행하면서 부딪히면서 배우는 것이 더 빠르게 성장하고 코드를 익힐 수 있는 방법인 것 같다. 강의를 너무 오랫동안 붙잡고 있지 말자.

내일 해야 할 일

  • JS 강의 4,5 주차 수강하기 + 정리하기
  • Github 에 개인과제 업로드