[백준] 3495. 아스키 도형 (Java)

서재·2023년 10월 18일
0

백준 JAVA 풀이

목록 보기
6/36
post-thumbnail

👨‍💻 문제

창영이는 메모장에 '.', '\', '/'을 이용해서 도형을 그렸다. 각 문자는 그림에서 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=='\\';
    }
}

profile
입니다.

0개의 댓글

관련 채용 정보