250119

Regular Kim·2025년 1월 19일
0

회고

목록 보기
75/77

250119 회고 💬

SSAFY 2주 차가 끝났다. 고된 스타트 캠프 일정이 지나고 다음 주부터는 정말로 본과정을 시작한다. 🙌 🙌 🙌 🙌 🙌 🙌 생판 모르는 내용의 활동들을 하다 보니 어색해서 심적으로 부담이 컸다. 그래도 이제 정말 끝! 앞으로는 공부만 남았다. 25년의 1월도 벌써 반 이상 지나간 셋째 주를 되돌아본다.

Keep 👍

  • 알고리즘 문제 풀이를 다시 시작했다. SSAFY 1학기 과정은 문법, 알고리즘 과정이다. 지금 내가 어느 정도 수준인지 파악할 겸 모든 내용을 초기화하고 새해 새 마음으로 새롭게 시작했다. 몇 문제 풀어봤다. 아직까지는 새로운 문제가 없어서 어느정도 다들 풀이가 떠올랐다. 나름 머리가 나쁘지 않은듯,,, 🤪
  • 스프링 시큐리티를 공부하고 있다. SSAFY 출퇴근 시간에 짬짬이 시간을 내서 강의를 듣는 중이다. 이번 주에는 인증 아키텍처, 인증 과정 등을 학습했다.
    - Security Context
    - AuthenticationManager
    - AuthenticationProvider
    - UserDetailsService
    - UserDetails
    - CORS
  • 객체지향의 사실과 오해를 다 읽고 드디어 서평까지 완료했다. 그 짧은 책을 이렇게 오래 끌고 간 건 내가 게으르기 때문이겠지,,, 😢 다음 책으로는 CS 공부할 겸 "면접을 위한 CS 전공지식 노트"로 정했다. 하루에 조금이라도 읽어서 1달에 1권 읽기를 도전 중이다. 일단 1월달 할당량은 성공!

Problem 🤢

  • 운동 좀 하자~ 스타트 캠프 끝나고 정말 운동 시작하기다. 약속 🤙

Try 🧚

  • 스프링 시큐리티 세션
  • 스프링 시큐리티 예외 처리
  • CSRF, SameSite
  • 개인 프로젝트 JWT 적용하기
  • 개인 프로젝트 OAuth2 적용하기
  • 개인 프로젝트 RefreshToken 적용하기

독서 목록

서평 완료 목록

서평 예정 목록 (읽는 중)

  • 면접을 위한 CS 전공지식 노트

독서 예정 목록

  • 오브젝트
  • HTTP 완벽 가이드
  • 자바/스프링 개발자를 위한 실용주의 프로그래밍
  • 모던 자바 인 액션
  • 자바 성능 튜닝 이야기
  • 헤드 퍼스트 서블릿
  • 파이브 라인스 오브 코드

Extras 😀

1. 토마토

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayDeque;
import java.util.Queue;
import java.util.StringTokenizer;

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 int[][] readInput(BufferedReader br) throws IOException {
        StringTokenizer st = new StringTokenizer(br.readLine());
        int width = Integer.parseInt(st.nextToken());
        int height = Integer.parseInt(st.nextToken());
        int[][] result = new int[height][width];
        for (int i = 0; i < height; i++) {
            st = new StringTokenizer(br.readLine());
            for (int j = 0; j < width; j++) {
                result[i][j] = Integer.parseInt(st.nextToken());
            }
        }
        return result;
    }
}

class Solution {

    private static final int[][] DIRECTIONS = {{0, 1}, {0, -1}, {1, 0}, {-1, 0}};

    private int[][] field;
    private boolean[][] isVisited;

    private int result = 0;
    private boolean isEverythingGood = false;

    private Queue<int[]> q = new ArrayDeque<>();

    public int solution(int[][] field) {
        init(field);
        explore();
        return isEverythingGood ? result : -1;
    }

    private void init(int[][] field) {
        this.field = field;
        this.isVisited = new boolean[field.length][field[0].length];
        for (int i = 0; i < field.length; i++) {
            for (int j = 0; j < field[i].length; j++) {
                if (field[i][j] == 1) {
                    q.offer(new int[]{i, j});
                    isVisited[i][j] = true;
                }
            }
        }
    }

    private void explore() {
        int days = -1;

        while (!q.isEmpty()) {
            int len = q.size();

            for (int i = 0; i < len; i++) {
                int[] cur = q.poll();

                for (int[] direction : DIRECTIONS){
                    int nx = cur[0] + direction[0];
                    int ny = cur[1] + direction[1];

                    if(isOutOfBound(nx, ny)) continue;
                    if(isVisited[nx][ny]) continue;
                    if(field[nx][ny] == -1 || field[nx][ny] == 1) continue;

                    isVisited[nx][ny] = true;
                    q.offer(new int[]{nx, ny});
                }
            }
            days++;
        }
        result = days;
        check();
    }

    private boolean isOutOfBound(int x, int y) {
        return x < 0 || x >= field.length || y < 0 || y >= field[0].length;
    }

    private void check() {
        for (int i = 0; i < field.length; i++) {
            for (int j = 0; j < field[i].length; j++) {
                if (field[i][j] == 0 && !isVisited[i][j]) {
                    return;
                }
            }
        }
        isEverythingGood = true;
    }
}
profile
What doesn't kill you, makes you stronger

0개의 댓글