Game Develop

[Algorithm] Baekjoon 1025번 : 제곱수 찾기 본문

Algorithm/Baekjoon

[Algorithm] Baekjoon 1025번 : 제곱수 찾기

MaxLevel 2023. 9. 23. 02:39

https://www.acmicpc.net/problem/1025

 

1025번: 제곱수 찾기

첫째 줄에 N, M이 주어진다. 둘째 줄부터 N개의 줄에는 표에 적힌 숫자가 1번 행부터 N번 행까지 순서대로 한 줄에 한 행씩 주어진다. 한 행에 적힌 숫자는 1번 열부터 M번 열까지 순서대로 주어지

www.acmicpc.net

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
int n, m;
vector<string> arr;
unordered_map<intbool> sqrNums;
 
int dirs[8][2= {
                {-1,0}, {1,0}, {0,-1}, {0,1},
                {-1,-1}, {-1,1}, {1,1}, {1,-1}  
                };
 
bool checkInRange(int y, int x)
{
    if (y < 0 || y >= n || x < 0 || x >= m) return false;
    return true;
}
 
bool checkSqrNum(int num)
{
    int temp = sqrt(num);
    return temp * temp == num;
}
 
int main(void)
{
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
 
    cin >> n >> m;
 
    for (int i = 0; i < n; ++i)
    {
        string s;
        cin >> s;
        arr.push_back(s);
    }
 
    int maxNum = -1;
 
    for (int i = 0; i < n; ++i)
    {
        for (int j = 0; j < m; ++j)
        {
            string s = "";
            s += arr[i][j];
            int sNum = stoi(s);
 
            if (checkSqrNum(sNum)) maxNum = max(maxNum, sNum);
 
            for (int d = 0; d < 8++d)
            {
                for (int offY = 1; offY <= 8++offY) // offset값 
                {
                    for (int offX = 1; offX <= 8++offX)
                    {
                        int curY = i + dirs[d][0* offY;
                        int curX = j + dirs[d][1* offX;
                        string ts = s;
 
                        while (1)
                        {
                            if (!checkInRange(curY, curX)) break;
                            ts += arr[curY][curX];
                            int num = stoi(ts);
 
                            if (checkSqrNum(num)) maxNum = max(maxNum, num);
 
                            curY += dirs[d][0* offY;
                            curX += dirs[d][1* offX;
                        }
                    }
                }
            }
        }
    }
 
    cout << maxNum;
}
cs

깔끔한 완전탐색문제이다.

모든 원소에 대해 8방향(상하좌우,각 대각선 총 4개)에 대해서 뻗어나가면서 숫자를 만들고 완전제곱수인지 검사할 건데, +1씩 뻗어나가는게 아니라 행과 열에 대해 '등차'를 유지만 하면 숫자를 만들 수 있다.

즉 행값은 +1, 열값은 +2씩 증가...하는 형태도 될 수 있다. (해당 백준링크의 맨 마지막 테스트케이스를 꼭 보기를 바란다)