BOJ 16929번 Two Dots

|


import java.util.Scanner;

public class BOJ_16929 {

    static String[][] colors;
    static boolean[][] visited;
    static int[][] dist;
    static int n, m;

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String[] split = sc.nextLine().split("\\s");
        n = Integer.parseInt(split[0]);
        m = Integer.parseInt(split[1]);
        colors = new String[n][m];
        visited = new boolean[n][m];
        dist = new int[n][m];

        for (int i = 0; i < n; i++) {
            char[] line = sc.nextLine().toCharArray();
            for (int j = 0; j < m; j++) {
                colors[i][j] = line[j] + "";
            }
        }
        solve(n, m);
    }

    private static void solve(int n, int m) {
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < m; j++) {
                if (!visited[i][j]){
                    if(dfs(i, j, 0, colors[i][j])){
                        System.out.println("Yes");
                        return;
                    }
                }
            }
        }
        System.out.println("No");

    }

    static int[] goX = new int[]{-1, 1, 0, 0};
    static int[] goY = new int[]{0, 0, -1, 1};

    private static boolean dfs(int x, int y, int count, String color) {
        if (visited[x][y]) {
            if (colors[x][y].equals(color) && (count - dist[x][y]) >= 4) {
                return true;
            } else
                return false;
        }

        visited[x][y] = true;
        dist[x][y] = count;

        for (int i = 0; i < 4; i++) {
            int nextX = x + goX[i];
            int nextY = y + goY[i];

            if (nextX >= 0 && nextX < n && nextY >= 0 && nextY < m) {
                if (color.equals(colors[nextX][nextY])) {
                    if(dfs(nextX, nextY, count + 1, color))
                        return true;
                }
            }
        }
        return false;
    }
}

BOJ 11403번 경로찾기

|


import java.util.ArrayDeque;
import java.util.Arrays;
import java.util.Queue;
import java.util.Scanner;

public class BOJ_11403 {


    static int[][] adj;
    static int n;

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        n = Integer.parseInt(sc.nextLine());
        adj = new int[n][n];

        for (int i = 0; i < n; i++) {
            adj[i] = Arrays.stream(sc.nextLine().split("\\s")).mapToInt(Integer::parseInt).toArray();
        }

        solve();

        for (int i = 0; i < n; i++) {
            for (int j = 0; j < n; j++) {
                System.out.print(adj[i][j] + " ");
            }
            System.out.println();
        }
    }

    private static void solve() {
        Queue<Integer> queue = new ArrayDeque<>();
        int tmp;
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < n; j++) {
                if (adj[i][j] == 1) {
                    queue.add(j);
                }
            }

            while (!queue.isEmpty()) {
                int next = queue.poll();
                bfs(i, next, queue);
            }
        }
    }

    private static void bfs(int root, int next, Queue<Integer> queue) {
        for (int i = 0; i < n; i++) {
            if (adj[next][i] == 1 && adj[root][i] != 1) {
                queue.add(i);
                adj[root][i] = 1;
            }
        }

    }


}

20200414_TIL

|

2020_04_14

  • @Autowired 방법별 비교

    필드 인젝션

    • 스프링 컨테이너에 의해서만 주입받을 수 있기 때문에 제약이 있다

    세터 인젝션

    • 보통 스프링 로딩 시점에 객체 생성과 주입이 완료되므로 굳이 세터 인젝션을 사용할 필요가 없다.
    • 생성 시점에 의존관계가 있는 객체를 세팅 하지 않기 때문에 NPE가 발생할 여지가 있다

    생성자 인젝션

    • 의존관계가 있는 객체를 생성 시점에 주입하지 않으면 객체를 생성할 수 없다. 즉, 컴파일 시점에 오류를 잡아낼 수 있다

    • 장점

      • NPE 방지
      • 주입받을 필드를 final로 선언가능하다

    final 키워드 사용 하는 이유?

    1. 불변성을 보장하므로 의도를 명확히 드러낼 수 있다(ex 상속 금지, 불변 객체).
    2. 불변성을 가진 객체는 항상 하나의 상태를 가지므로 에러 발생의 여지가 적고 디버깅할 때 유리하다.
    3. 스레드 세이프하다.

    JPA

    1. entityManager.persist() 호출하면 JPA가 바로 DB에 insert문을 호출하지 않고 트랜잭션이 커밋될 때 flush한다.

    2. 웹서버가 여러 개 띄워져 있고, 회원가입 메서드에 동시에 접근한다면 ?

      • 동시성 문제가 발생할 수 있다 -> member.name을 unique 키로 잡아놓으면 디비에서 막을 수 있다

BOJ 7576번 토마토

|


import java.util.ArrayDeque;
import java.util.Arrays;
import java.util.Queue;
import java.util.Scanner;

public class BOJ_7576 {

    static int[][] adj;
    static int n;
    static int m;

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String[] s = sc.nextLine().split("\\s");
        m = Integer.parseInt(s[0]);
        n = Integer.parseInt(s[1]);

        adj = new int[n][m];
        for (int i = 0; i < n; i++) {
            adj[i] = Arrays.stream(sc.nextLine().split("\\s")).mapToInt(Integer::parseInt).toArray();
        }
        solve();
    }

    static int[] dx = {-1, 1, 0, 0};
    static int[] dy = {0, 0, -1, 1};

    private static void solve() {
        Queue<Tomato> tomatoes = new ArrayDeque<>();

        for (int i = 0; i < n; i++) {
            for (int j = 0; j < m; j++) {
                if (adj[i][j] == 1)
                    tomatoes.add(new Tomato(i, j));
            }
        }

        while (!tomatoes.isEmpty()) {
            Tomato tomato = tomatoes.poll();

            for (int i = 0; i < 4; i++) {
                int nextX = tomato.x + dx[i];
                int nextY = tomato.y + dy[i];

                if (nextX < 0 || nextY < 0 || nextX >= n || nextY >= m) {
                    continue;
                }

                if (adj[nextX][nextY] != 0) {
                    continue;
                }

                adj[nextX][nextY] = adj[tomato.x][tomato.y] + 1;
                tomatoes.add(new Tomato(nextX, nextY));
            }
        }

        int max = 0;
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < m; j++) {
                if(adj[i][j] == 0){
                    System.out.println(-1);
                    return;
                }
                max = Math.max(max,adj[i][j]);
            }
        }
        System.out.println(max-1);
    }

    static class Tomato {
        int x;
        int y;

        Tomato(int x, int y) {
            this.x = x;
            this.y = y;
        }
    }

}

Til

|
layout: post
title:  " 20200413_TIL "
category: TIL (Today I Learned)
tags: [TIL]
comments: true

2020_04_13

Network Layer

  • 데이터를 목적지까지 전달하는 계층
  • Network Layer에 속한 계층은 ICMP, IP, ARP 등이 있다
    • IP
      • 최종 목적지로 전송이 목적
    • ARP
      • 최종 목적지(IP 주소)에 접근할 때 물리적 주소를 찾기 위해 사용된다
      • 최종 목적지로 향하는 쪽에 존재하는 라우터의 MAC주소를 MAC헤더에 덮어씌워 라우팅할 수 있게 한다
    • ICMP
      • IP가 데이터그램 전달 시 발생할 수 있는 에러를 호스트에서 알리기 위한 목적 또는 테스트 목적으로 사용된다
      • 데이터그램 전달 시 발생할 수 있는 에러의 종류
        • 목적지 접근 불가
        • 송신 속도 낮춤
        • 리다이렉트
        • 시간초과
        • 인자 문제

Transport Layer

  • 계층 구조의 네트워크 구성요소와 프로토콜 내에서 송신자와 수신자를 연결하는 통신 서비스를 제공한다
  • Transport Layer에 속한 계층은 TCP, UDP 등이 있다
    • TCP
      • three way handshake
      • 신뢰성 보장, 흐름 제어
        • ACK로 수신여부 확인 및 미수신 세그먼트 재전송
        • 수신자 여유공간에 따라 세그먼트 전송량 조절

PDU (Protocol Data Unit)

  • TCP - 세그먼트
  • IP - 데이터그램
  • 데이터 링크 - 프레임