LeetCode Study Plan [LeetCode 75]

개인적으로 취준을 하면서 가장 어려움을 느끼는 코딩테스트를 어떻게 하면 쉽고 의미있게 공부할 수 있을까? 싶었다. 내가 지금까지 풀어본 문제들은 대부분 백준을 통해서 풀었는데, 알고리즘 자체가 유형으로 분류가 가능하다는 사실을 조금 알게 되면서 해당 개념들을 전부 풀어보며 감을 익히려고 했다.

그 중에서 LeetCode를 선택한 이유는 다른 문제풀이 사이트와 다르게 알고리즘 풀이에 집중할 수 있는 환경과 유형의 조상격인 문제가 많다고 생각했다. 사대주의 아님..

Study Plan중 [LeetCode 75]는 대부분의 유형을 다루고 있다고 하여 답을 보더라도 해당 유형들을 풀어보며 익숙해지는 것이 목표이다. 이외에도 해커랭크, 프로그래머스등을 같이 풀며 코테에 대비할 예정이다. 단순하게 문제를 풀지 않는 이유는 코테용이 아닌 실제로 적용할 수 있는 알고리즘을 익히기 위함이다.

LeetCode 75

{7FA274B7-BDCD-4BFD-BF9B-CC948CA351BB}

Badges 획득..!

LeetCode 75는 다음과 같은 유형으로 구성되어 있다.

  • Array/String
  • Two Pointers
  • Sliding Window
  • Prefix Sum
  • Hash Map/Set
  • Stack
  • Queue
  • Linked List
  • Binary Tree - DFS
  • Binary Tree - BFS
  • Binary Search
  • Graph - DFS
  • Graph - BFS
  • Heap/Priority Queue
  • Binary Search Tree
  • Backtracking
  • DP - 1D
  • DP - Multidimensional
  • Bit Manipulation
  • Trie
  • Interval
  • Monotonic Stack

글을 작성한 이유는 75개를 푼 기록을 하기 위함이고 이후로도 Algorithm레포에서 지속적으로 문제를 풀 예정이다. 아마 취업 이후도 시간적 여유가 된다면 꾸준하게 하며 재미를 붙이는 것이 목표이다.

LeetCode이슈에서는 0번부터 끝까지 풀기 (50개씩 묶음), 다른 스터디 플랜인 [Top Interview 150]등을 풀어볼 예정이다.

개인적으로 정말 강추한다. 내부에 솔루션이나 다른 사람들의 생각, 힌트등을 볼 수 있으며 문제 자체도 기영이, 배준이 이런 어려운 설명이 등장하지 않고 알고리즘 자체에 집중한다. 결제까지는 필요없으니 한번 해보길 추천한다.

알고리즘 풀이 자동화

현재 모든 풀이를 이슈에 저장하고 있는데, Github Action을 사용하여 Lable에 맞는 폴더로 자동으로 코드베이스에 저장되게끔 설정하였다. 매번 작성한 코드를 push하는 과정이 귀찮아서 이슈에 문제 풀이와 문제에 대한 감상을 적고 Issue를 닫게 되면 이를 bot이 감지하여 코드베이스로 자동으로 저장되게끔 설정하였다.

name: 이슈 닫힘 시 라벨별로 파일 생성

on:
  issues:
    types: [closed]

permissions:
  contents: write

jobs:
  create_files_by_label:
    runs-on: ubuntu-latest

    steps:
    - name: 레포지토리 체크아웃
      uses: actions/checkout@v3
      with:
        fetch-depth: 0 

    - name: 이슈 정보 가져오기 및 코드 추출
      id: create_file
      uses: actions/github-script@v6
      with:
        script: |
          const fs = require('fs');
          const issue = context.payload.issue;
          const issueBody = issue.body || '';
          const title = issue.title || 'untitled';
          const labels = issue.labels.map(label => label.name);

          console.log('이슈 제목:', title);
          console.log('이슈 라벨:', labels);
          console.log('이슈 본문:', issueBody);

          if (labels.length === 0) {
            console.log('이슈에 라벨이 없습니다. 작업을 종료합니다.');
            process.exit(0);
          }

          // 코드 블록 추출 (언어 정보 포함)
          const codeBlockRegex = /```(\w*)\s*([\s\S]*?)\s*```/gm;
          let match;
          while ((match = codeBlockRegex.exec(issueBody)) !== null) {
            const language = match[1] || 'cpp'; 
            let code = match[2].trim();
            console.log('추출된 코드 블록:', code);
            console.log('코드 언어:', language);

            // 파일 확장자 결정
            const fileExtension = {
              'cpp': 'cpp',
              'cs': 'cs',
              'python': 'py',
              'java': 'java',
              'js': 'js',
              'ts': 'ts',
              'rb': 'rb',
              'go': 'go',
              'php': 'php',
              'html': 'html',
              'css': 'css',
            }[language] || 'txt';

            // 파일명과 폴더명에서 한글 포함하도록 수정
            const sanitizedTitle = title.replace(/ /g, '_').replace(/[^\p{L}\p{N}_.-]/gu, '');
            for (const label of labels) {
              const sanitizedLabel = label.replace(/ /g, '_').replace(/[^\p{L}\p{N}_.-]/gu, '');
              const folderPath = `${sanitizedLabel}`;
              const filePath = `${folderPath}/${sanitizedTitle}.${fileExtension}`;
              fs.mkdirSync(folderPath, { recursive: true });
              fs.writeFileSync(filePath, code);
              console.log(`파일 생성: ${filePath}`);
            }
          }

          core.setOutput('issue_number', issue.number);

    - name: 변경 사항 커밋 및 푸시
      uses: EndBug/add-and-commit@v9
      with:
        message: "이슈 #$에서 솔루션 추가"
        add: "*/*"
        author_name: GitHub Action
        author_email: action@github.com
        committer_name: GitHub Action
        committer_email: action@github.com
        pull_strategy: NO_REBASE 
        token: $

댓글남기기