링크: https://www.acmicpc.net/problem/2615

 

3년만에 풀게 됐네요..;;

가볍게 풀 수 있을 줄 알았는데 고려해야 할 부분이 좀 있습니다.

대충 짜면 통과를 못하는 문제입니다.

 

 

이 문제는 오목판 보고 누가 이겼는지, 이긴 오목의 왼쪽 위 좌표는 어디인지 찾아내는 문제입니다.

6목은 안되고요, 인덱스 다룰 때 주의해서 구현하셔야 합니다.

 

 

저는 매 칸마다 돌이 4가지 방향으로 움직여서 오목이 되는지, 육목은 아닌지 체크했습니다.

 

#define _CRT_SECURE_NO_WARNINGS
#include <bits/stdc++.h>

using namespace std;


int arr[19][19];
const int dir[][2] = { {0,1}, {1,1}, {1, 0}, {1, -1} };

bool is_ok(int y, int x) {
  return (y>=0 && x>=0 && y<19 && x<19);
}

int main(int argc, char** argv)
{
#ifndef ONLINE_JUDGE
  freopen("input.txt", "r", stdin);
#endif

  ios_base::sync_with_stdio(false);
  cin.tie(NULL);

  for (int i = 0; i < 19; ++i)
    for (int j = 0; j < 19; ++j)
      cin >> arr[i][j];
  

  for (int i = 0; i < 19; ++i) {
    for (int j = 0; j < 19; ++j) {
      if (arr[i][j] != 0) {
        for (int k = 0; k < 4; ++k) {
          int win = arr[i][j];
          int next_y = i, next_x = j;

          for (int m = 0; m < 4; ++m) {
            next_y += dir[k][0];
            next_x += dir[k][1];
            
            //boundary check
            if (!is_ok(next_y, next_x)) {
              win = 0;
              break;
            }

            if (arr[i][j] != arr[next_y][next_x]) {
              win = 0;
              break;
            }
          }

          if (win) {
            //6목체크
            int prev_y = i - dir[k][0],
              prev_x = j - dir[k][1];
            next_y += dir[k][0];
            next_x += dir[k][1];

            if (is_ok(prev_y, prev_x) && arr[prev_y][prev_x] == arr[i][j])
              continue;
            if (is_ok(next_y, next_x) && arr[next_y][next_x] == arr[i][j])
              continue;

            next_y -= dir[k][0];
            next_x -= dir[k][1];

            //가장 왼쪽에 있는 바둑알 찾기
            int lefttop_y, lefttop_x;
            if (k == 3) {
              lefttop_y = next_y;
              lefttop_x = next_x;
            }
            else {
              lefttop_y = i;
              lefttop_x = j;
            }
            
            cout << win << '\n'
              << lefttop_y + 1 << ' ' << lefttop_x + 1;
            return 0;
          }
        }
      }
    }
  }

  cout << 0;
  

  return 0;
}

 

인덱스 체크를 잘못 해서 푸는데 시간이 좀 걸렸네요 휘유

이 문제를 계기로 좀 꼼꼼하게 코딩하는 습관을 들여야겠습니다.

반응형

'Online Judge > 백준' 카테고리의 다른 글

[백준][C++] 14500: 테트로미노  (0) 2020.03.26
[백준][C++] 3190: 뱀  (0) 2020.03.26
[백준][C++] 1939: 중량제한  (0) 2020.03.26
[백준][C++] 2312: 수 복원하기  (0) 2019.08.22
[백준][C++] 17413: 단어 뒤집기 2  (0) 2019.08.22