241110

Regular Kim·2024년 11월 10일
0

회고

목록 보기
67/71
post-thumbnail

241110 회고 💬

따뜻했던 10월이 지나고 엄청 추운 한 주였다. 갑자기 추워진 탓에 얇게 입고 외출을 해서 고생도 했다. 요즘은 번아웃 방지를 위해서 일부러라도 밖에 나가 공부하는 중이다. 밖으로 나도니 의욕이 생겨서 요즘은 순공 시간을 많이 늘릴 수 있었다. 이력서 제작용 토이 프로젝트에 드디어 조금씩 진전이 보이기 시작한다. 아침, 저녁에는 겨울 같고, 낮에는 덥고,,, 어느 장단에 맞춰야 할지 모르겠는 11월 둘째 주를 되돌아본다.

Keep 👍

  • 알고리즘 문제 풀이를 이번 주에도 7일 연속으로 해냈다. 이번 주에는 복습 차원으로 MST, 그리디 문제들을 풀어봤다. 그래프 문제들은 코드 템플릿이 있어서 풀이 떠올리기가 쉬운데 그리디 문제들은 DP마냥 아이디어가 필요한 때가 있어서 문제 풀이가 쉽지 않다. 그래서 실버 난이도로 쉽게쉽게 접근하는 중이다. 문제 풀이 중 어려운 부분이 하나 있다. 문제 풀이를 1년 넘게 해오면서 느끼지만 입력 처리 코드가 가장 작성하기 어렵다.
    - 행성 연결 노드 별로 이동 비용이 모두 표시된 입력이 주어진다. 이 입력처리 하는 아이디어만 떠올리면 금방 풀 수 있는 문제다. 클래스로 노드를 구성한 후 (해시까지 구현하면 최적화를 더 할 수 있을지도?) 크루스칼 알고리즘으로 문제 풀이를 진행했다.
    - 별자리 만들기 별들의 거리를 구해 그 거리를 비용으로 트리를 만들면 된다. 중고등학교 수학 개념이 필요하다. 옛날에 공부했던 내용을 기억의 저편에서 끄집어내느라 한참 생각했다. 거리만 구할 수 있으면 나머지는 늘 하던대로 크루스칼 알고리즘으로 풀이했다.
  • express 프론트 + spring 백엔드 토이 프로젝트를 진행하고 있다. 백엔드는 그간 공부한 내용이 있으니 어느 정도 뚝딱뚝딱 진행되는 중이다. 그런데 문제는 프론트가 정말 너무 어렵다. html, css 작업이 너무 고돼서 템플릿 엔진에 부트스트랩을 쓰기로 했다. 프론트는 부딪혀 가면서 한참 작업을 하기보다는 쉽게쉽게 돌아가기로 방향을 잡았다. 백엔드에서 한가지 고생한 부분이 있다. 로그인 요청 경로를 따로 생성해서 거기로 요청이 왔을 때만 로그인 처리를 하고 싶었는데 프레임워크 기본 경로로만 해당 로직이 진행되는 문제가 있었다. 완전 단순한 문제였지만 관련 주제를 다룬 적이 없다 보니 정말 한참을 고생했다. 좀 더 상세한 내용은 여기에서 readme를 참고하시라~
    - 프론트
    - 부트스트랩 프론트 적용
    - 환경 변수 설정 (dotenv)
    - jwt 토큰 발급 요청
    - 인증 토큰 쿠키 저장
    - 로그인 판단 미들웨어 제작
    - 인가 요청 로직 작성
    - 백
    - 스프링 시큐리티 로그인 필터 제작
    - JWT 발급 로직 구현
    - JWT 검사 로직 구현

Try 🧚

  • 알고리즘 문제 풀이
  • 백엔드 서버 개발
    - OAuth2 JWT 로직 제작

독서 목록

서평 완료 목록

서평 예정 목록 (읽는 중)

  • 함께 자라기 애자일로 가는 길
  • 객체지향의 사실과 오해

독서 예정 목록

목록은 우선순위 큐이다. 상단에 있더라도 더 중요한 책이 들어온다면 순위가 뒤로 밀릴 수 있다.

  • 오브젝트
  • 파이브 라인스 오브 코드
  • HTTP 완벽 가이드
  • 자바/스프링 개발자를 위한 실용주의 프로그래밍
  • 모던 자바 인 액션
  • 자바 성능 튜닝 이야기
  • 자바 개발자와 시스템 운영자를 위한 트러블 슈팅 이야기 / scouter를 활용한 시스템 장애 진단 및 해결 노하우 자바 트러블슈팅
  • 헤드 퍼스트 서블릿
  • Hello Coding 그림으로 개념을 이해하는 알고리즘

Extras 😀

별자리 만들기


import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Comparator;
import java.util.List;
import java.util.stream.IntStream;

public class Main {

    public static void main(String[] args) {
        new Main().run();
    }

    private void run() {
        try (BufferedReader br = new BufferedReader(new InputStreamReader(System.in))) {

            Solution s = new Solution();
            System.out.println(s.solution(readInput(br)));

        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }

    private double[][] readInput(BufferedReader br) throws IOException {
        int len = Integer.parseInt(br.readLine());
        double[][] result = new double[len][2];
        for (int i = 0; i < len; i++) {
            result[i] = Arrays.stream(br.readLine().split(" ")).mapToDouble(Double::parseDouble).toArray();
        }
        return result;
    }
}

class Solution {

    public double solution(double[][] coordinates) {
        List<double[]> stars = new ArrayList<>();

        int len = coordinates.length;

        for (int i = 0; i < len; i++) {
            for (int j = 0; j < len; j++) {
                if(i == j) continue;
                stars.add(new double[]{i + 1, j + 1, getDistance(coordinates[i], coordinates[j])});
            }
        }
        stars.sort(Comparator.comparing(a -> a[2]));

        int[] groups = IntStream.range(0, len + 1).toArray();

        double result = 0;
        for (double[] star : stars) {
            int from = (int) star[0];
            int to = (int) star[1];

            if (isConnected(groups, from, to)) {
                continue;
            }

            connect(groups, from, to);
            result += star[2];
        }
        return result;
    }

    private double getDistance(double[] star1, double[] star2) {
        double width = star2[1] - star1[1];
        double height = star2[0] - star1[0];
        return Math.sqrt(Math.pow(width, 2) + Math.pow(height, 2));
    }

    private boolean isConnected(int[] groups, int star1, int star2) {
        return getGroup(groups, star1) == getGroup(groups, star2);
    }

    private int getGroup(int[] groups, int target) {
        if(groups[target] != target) return groups[target] = getGroup(groups, groups[target]);
        return groups[target];
    }

    private void connect(int[] groups, int star1, int star2) {
        int g1 = getGroup(groups, star1);
        int g2 = getGroup(groups, star2);
        if (g1 != g2) {
            groups[Math.max(g1, g2)] = Math.min(g1, g2);
        }
    }

}
profile
What doesn't kill you, makes you stronger

0개의 댓글