BOJ 3495 아스키 도형

LONGNEW·2022년 2월 10일
1

BOJ

목록 보기
313/333

https://www.acmicpc.net/problem/3495
시간 1초, 메모리 128MB

input :

  • h w (2 ≤ h,w ≤ 100)
  • 창영이가 그린 다각형은 1개이고, 변과 변이 서로 교차하는 경우는 없고, 자기 자신과 접하는 경우도 없다.

output :

  • 다각형의 넓이를 출력

조건 :

  • 창영이는 메모장에 '.', '\', '/'을 이용해서 도형을 그렸다.

  • 1*1크기의 단위 정사각형을 나타낸다.


NEERC 2011 Regional Archive

위의 사이트에서 테케를 받아서 해결한다면 훨씬 수월하다.

사고 방식

1 번째 구상

예제와 같이 "/"이 나오면 "\"이 나와서 닫아준다. 그렇다면 "/"이 꼭 나와야 도형이 되니까
이를 체킹하는 방식을 사용하자.

2 번째

예제에서도 "\"이 나오고 "/"이 나오면서 닫아주는 그림이 있다. 대각선의 두 방향 모두 체킹을 해야 한다.

3번째

특정 테케에서는 "/"이 나오고 "/"이 나오는 방식도 존재한다. 생각보다 큰 그리드에서는 이와 같은 방식도 가능하다.
그래서 맨 처음 나오는 대각선을 우선 체킹 하고 어떤 대각선이 오든 간에 초기화를 하는 방식을 사용했다.
"/" -> "/" 이나 "/" -> "\"이나 어차피 계산할 때는 0.5를 더하는 방식이라 상관이 없다.

다각형

그래서 대각선으로 연결되지 않거나 하는 경우는 없다는 의미이다.
해당 row에서 열리고 결국 닫히거나 동일한 대각선이 위치할 것이다.

다음 풀이

  1. 예제 잘 읽어라.
  2. 구현의 방식?

해당 문제는 컴파일러 괄호 체킹하는 문제와 비슷하다. 그래서 변수 2개로 체킹을 해야 겠다는 생각을 우선 해야 한다.
해당 대각선이 있었다면 빈칸은 +1 하는 공간이 되고 그렇지 않다면 무시하면 되는 공간이다.

import sys

h, w = map(int, sys.stdin.readline().split())
ans = 0

for _ in range(h):
    temp = list(sys.stdin.readline().rstrip())

    left, right = None, None
    for item in temp:
        if left and item != ".":
            ans += 0.5
            left = None
            continue

        if right and item != ".":
            ans += 0.5
            right = None
            continue

        if item == "\\":
            left = 1
            ans += 0.5
            continue

        if item == "/":
            right = 1
            ans += 0.5
            continue

        if left or right:
            ans += 1
            
print(int(ans))

0개의 댓글