미션5
-피드백 받은부분
Piece pawn =
color == Color.WHITE ? Piece.createWhitePawn() : Piece.createBlackPawn();
-구현사항
중복되는 폰의 개수를 얻는데 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()));
}
이코테 탐색알고리즘 문제 미로탈출 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));
}
}