[TIL] 2월 27일 주말 학습

yeon·2021년 2월 27일
0

미션5

-피드백 받은부분

Piece pawn =
       color == Color.WHITE ? Piece.createWhitePawn() : Piece.createBlackPawn();
  • 할당 연산자(=) 후에 바로 등호(==)가 와있으면 가독성이 떨어져서 이 경우에는 if문을 사용하는편이 더 낫다.

-구현사항

중복되는 폰의 개수를 얻는데 groupingBy()로 map 얻어서 values()이용하는게 제일 직관적이라고 판단

public Map<Integer, Long> getPawnFileMap(Color color) {
    return board.stream()
            .map(Rank::getPieceList)
            .flatMap(List::stream)
            .filter(x -> x.getColor() == color)
            .filter(x -> x.getType() == Type.PAWN)
            .map(Piece::getPosition)
            .map(Position::getX)
            .collect(groupingBy(x -> x, counting()));
}
  • collect(groupingBy(x → x, counting());
    • map으로 반환
    • key : position의 각각 x좌표값
    • value : x좌표값의 개수

이코테 탐색알고리즘 문제 미로탈출 152p

어려워서 해설보고 학습

미로를 탈출하기 위한 최소칸의 개수

BFS를 수행하여 모든 노드의 최단거리값을 기록한다.

class Node {
    private int x;
    private int y;

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

    public int getX() {
        return x;
    }

    public int getY() {
        return y;
    }
}

public class Maze {
    public static int n, m;
    public static int[][] graph = new int[201][201];

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

    public static int bfs(int x, int y) {
        Queue<Node> q = new LinkedList<>();
        q.offer(new Node(x, y));
        // 큐가 빌때까지 반복
        while (!q.isEmpty()) {
            Node node = q.poll();
            x = node.getX();
            y = node.getY();

            for (int i = 0; i < 4; i++) {
                int nx = x + dx[i];
                int ny = y + dy[i];

                if (nx < 0 || nx >= n || ny < 0 || ny >= n) continue;

                if (graph[nx][ny] == 0) continue;
                // 해당 노드를 처음 방문하는 경우에만 최단거리 기록
                if (graph[nx][ny] == 1) {
                    graph[nx][ny] = graph[x][y] + 1;
                    q.offer(new Node(nx, ny));
                }
            }
        }
        return graph[n - 1][m - 1];
    }

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        n = sc.nextInt();
        m = sc.nextInt();
        sc.nextLine();
        for (int i = 0; i < n; i++){
            String input = sc.nextLine();
            for(int j = 0; j < m; j++){
                graph[i][j] = input.charAt(j) - '0';
            }
        }

        System.out.println(bfs(0,0));
    }

}

오늘 한일

  • 미션5 중첩되는 폰의 값 파악하는거 구현이 너무 힘들었지만 머리속에 떠오르는 로직으로 구현해보았다. 괜찮은 방법인지는 모르겠다.
  • BFS 문제 해설보고 공부했는데 풀이를 봐도 어렵다. 반복해서 풀어봐야겠다.

0개의 댓글