

1. 문제 풀이 아이디어
- Q와 F의 모양을 판별하여 문제를 해결할 수 있다.
- 탐색 순서에 따라 결과가 달라질 수 있으므로 주의해야 한다.
2. 나의 정답 코드
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer stringTokenizer = new StringTokenizer(bufferedReader.readLine());
int n = Integer.parseInt(stringTokenizer.nextToken());
int m = Integer.parseInt(stringTokenizer.nextToken());
boolean[][] grid = new boolean[n][m];
int[][] dirF = {{0, 0}, {0, 1}, {0, 2}, {1, 0}, {2, 0}, {2, 1}, {3, 0}, {4, 0}};
int[][] dirQ = {{0, 0}, {0, 1}, {0, 2}, {1, 0}, {1, 2}, {2, 0}, {2, 1}, {2, 2}, {3, 2}, {4, 2}};
int f = 0;
int q = 0;
for (int i = 0; i < n; i++) {
String s = bufferedReader.readLine();
for (int j = 0; j < m; j++) {
if (s.charAt(j) == '.') continue;
grid[i][j] = true;
}
}
for (int j = 0; j < m - 2; j++) {
for (int i = 0; i < n - 4; i++) {
if (!grid[i][j]) continue;
if (grid[i + 3][j]) {
for (int[] dir : dirF) {
grid[i + dir[0]][j + dir[1]] = false;
}
f++;
} else {
for (int[] dir : dirQ) {
grid[i + dir[0]][j + dir[1]] = false;
}
q++;
}
}
}
System.out.println(q + " " + f);
bufferedReader.close();
}
}
3. 정리
- 입력 데이터를 받아
grid
배열에 저장한다.
grid
배열을 왼쪽 위에서 아래 방향으로 먼저 탐색하고, 이후 오른쪽 방향으로 순회한다.
grid[i][j]
가true
일 때,grid[i + 3][j]
가true
면 F 모양으로 판단하고, 아니라면 Q 모양으로 판단한다.
- 판단된 도형에 해당하는 위치의
grid
값을false
로 변경한다.
- 이 과정을 반복하여 각 도형의 개수를 계산한 뒤 결과를 출력한다.
Share article