창영이는 메모장에 '.', '\', '/'을 이용해서 도형을 그렸다. 각 문자는 그림에서 1*1크기의 단위 정사각형을 나타낸다.
'.'은 빈 칸을 나타내며, '/'는 정사각형의 왼쪽 아래 꼭짓점과 오른쪽 위 꼭짓점이 연결된 선분을, '\'은 왼쪽 위 꼭짓점과 오른쪽 아래 꼭짓점이 연결된 선분을 나타낸다.
창영이가 그린 도형의 넓이를 출력하는 프로그램을 작성하시오.
첫째 줄에 h와 w가 주어진다. h는 그림의 높이, w는 너비이다. (2 ≤ h,w ≤ 100)
다음 h개 줄에는 창영이가 메모장에 그린 다각형이 주어진다.
창영이가 그린 다각형은 1개이고, 변과 변이 서로 교차하는 경우는 없고, 자기 자신과 접하는 경우도 없다.
첫째 줄에 다각형의 넓이를 출력한다.
입력
4 4 /\/\ \../ .\.\ ..\/
출력
8
List<String>
형태로 입력받았다.
private static void input() throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
h = Integer.parseInt(st.nextToken());
w = Integer.parseInt(st.nextToken());
for (int i=0; i<h; i++) {
shape.add(br.readLine());
}
}
해당 문제는 무조건 하나의 다각형으로 이루어지는 경우만 입력으로 주어진다.
/
혹은 \
을 외곽선
이라 칭하겠다.
좌측에서 우측으로 선형으로 탐색 시 외곽선
이 시작되는 순간부터 끝나는 순간까지는 도형 내부에 속하게 된다.
외곽선
이 위치한 도형의 넓이는 0.5
이므로 외곽선
의 시작과 끝을 합쳐 1
로 생각할 수 있다.
이 방법으로 배열을 모두 탐색하면 도형의 넓이를 구할 수 있다.
private static int getArea() {
int result = 0;
for (String str : shape) {
boolean isArea = false;
for (int i=0; i<w; i++) {
char value = str.charAt(i);
if (isOutLine(value)) {
isArea = !isArea;
}
if (isArea) {
result++;
}
}
}
return result;
}
import java.io.*;
import java.util.*;
public class Main {
private static int h;
private static int w;
private static List<String> shape = new ArrayList<>();
public static void main(String[] args) throws IOException {
input();
System.out.println(getArea());
}
private static void input() throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
h = Integer.parseInt(st.nextToken());
w = Integer.parseInt(st.nextToken());
for (int i=0; i<h; i++) {
shape.add(br.readLine());
}
}
private static int getArea() {
int result = 0;
for (String str : shape) {
boolean isArea = false;
for (int i=0; i<w; i++) {
char value = str.charAt(i);
if (isOutLine(value)) {
isArea = !isArea;
}
if (isArea) {
result++;
}
}
}
return result;
}
private static boolean isOutLine(char c) {
return c=='/' || c=='\\';
}
}