※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※

 

이번에 볼 문제는 백준 3010번 문제인 페그이다.
문제는 아래 링크를 확인하자.

www.acmicpc.net/problem/3010

 

3010번: 페그

총 일곱 줄에 걸쳐 보드의 상태가 주어진다. 처음 두 줄과 마지막 두 줄의 첫 번째, 두 번째 문자는 항상 공백이다. 나머지는 'o' 또는 '.'이다.

www.acmicpc.net

 

보드의 주어진 상태에서 말이 움직일 수 있는 경우의 수는 크게 두 가지 방법으로 셀 수 있다.

 

1) 보드 위의 각 'o'마다 네 방향으로 'o'와 '.'이 순서대로 있는지 각각 확인하여 센다.

2) 보드 위의 각 '.'마다 네 방향으로 'o'와 'o'가 순서대로 있는지 각각 확인하여 센다.

 

이를 확인하는 과정에서, 보드를 저장한 배열을 벗어나는 오류가 나지 않게 하기 위해 글쓴이는 보드의 상하좌우에 2칸의 공백을 집어넣었다.

 

보드의 몇 줄은 공백으로 시작하는 입력이 주어짐을 유의하여 코딩하는 것이 좋다. 예를 들면, getline을 이용하거나 입력을 받은 후 앞뒤에 적절히 무의미한 문자를 넣어줄 필요가 있다.

 

아래는 제출한 소스코드이다.

#include <iostream>
#include <string>
using namespace std;

string peg[11];

int main()
{
    for (int i = 2;i < 9;i++) {
        getline(cin, peg[i]);
        peg[i] = "  " + peg[i] + "    ";
    }
    
    peg[0] = peg[1] = peg[9] = peg[10] = "           ";

    int ans = 0;
    for (int i = 2;i < 9;i++) {
        for (int j = 2;j < 9;j++) {
            if (peg[i][j] == '.') {
                if (peg[i - 1][j] == 'o' && peg[i - 2][j] == 'o') ans++;
                if (peg[i + 1][j] == 'o' && peg[i + 2][j] == 'o') ans++;
                if (peg[i][j - 1] == 'o' && peg[i][j - 2] == 'o') ans++;
                if (peg[i][j + 1] == 'o' && peg[i][j + 2] == 'o') ans++;
            }
        }
    }
    cout << ans;
}
728x90

+ Recent posts