문제 풀이/Baekjoon Online Judge

[Baekjoon - 18242] 네모네모 시력검사

hibye1217 2023. 2. 13. 14:47

난이도: Silver V

 

태그

더보기
  • Implementation
  • Ad-Hoc

 

풀이

1. 일단 사각형을 찾자.

더보기

사각형의 모든 위치를 찾는 건 아무래도 어렵고, 불필요할 정도로 많은 정보입니다.

대신에, 사각형의 좌측 상단과 우측 하단의 위치만 알고 있다면,

그걸 토대로 한 사각형을 다시 만들 수 있으므로 문제없겠죠.

 

2. 구멍이 뚫릴 수 있는 부분은?

더보기

각 변의 중점입니다.

이는, 한 축은 사각형의 중심에 있고, 다른 한 축은 사각형의 끝점에 위치해있다는 소리죠.

// 예로, (중심, 왼쪽 끝)은 왼쪽 변에 뚫린 구멍을 의미합니다.

// (위쪽 끝, 중심)은 위쪽 변에 뚤린 구멍이죠.

 

그러니, 이렇게 찾을 수 있는 4개의 좌표에 대해, 진짜 구멍이 뚫렸는지 판별하고,

만약 구멍이 뚫렸다면 그 위치에 해당하는 방향을 출력해주면 됩니다.

 

3. 코드

더보기
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
char mp[120][120];
 
void Main(){
    int n, m; cin >> n >> m;
    for (int i = 1; i <= n; i++){
        for (int j = 1; j <= m; j++){ cin >> mp[i][j]; }
    }
    pi2 st = {-1-1}, ed = {-1-1};
    for (int i = 1; i <= n; i++){
        for (int j = 1; j <= m; j++){
            if (mp[i][j] == '#'){
                if (st.fr == -1){ st = {i, j}; } ed = {i, j};
            }
        }
    }
    int yst = st.fr, yed = ed.fr; int ym = yst+yed >> 1;
    int xst = st.sc, xed = ed.sc; int xm = xst+xed >> 1;
    if (mp[yst][xm] == '.'){ cout << "UP"; }
    if (mp[yed][xm] == '.'){ cout << "DOWN"; }
    if (mp[ym][xst] == '.'){ cout << "LEFT"; }
    if (mp[ym][xed] == '.'){ cout << "RIGHT"; }
}
cs