본문 바로가기

백준

16113 시그널

 

일단 숫자의 왼쪽 상단이 전부 #이므로 이 위치가 . 이면 쭉쭉쭉 패스하다가 #을 만나면 숫자를 확인한다

 

확인하는 조건은 아래와 같은데.. 음.. 틀렸음 

 

 

 

#include <iostream>
#include <algorithm>
#include <vector>
#include <string>
#include <functional>
#include <string>
#include <queue>
#include <stack>
#include <set>
#include <map>
#include <cmath>
#include <cstring>
#include <bitset>

#define xx first
#define yy second
#define all(x) (x).begin(), (x).end()

using namespace std;
using i64 = long long int;
using ii = pair<int, int>;
using ii64 = pair<i64, i64>;

bool v[5][20000];

int     main()
{
    int n; string str;
    cin >> n >> str;

    n /= 5;
    for (int i = 0, k = 0; i < 5; i++)
    {
        for (int j = 0; j < n; j++, k++)
        {
            if (str[k] == '#')
                v[i][j] = true;
            else
                v[i][j] = false;
        }
    }

    string ans = "";
    for (int i = 0; i < n; i++)
    {
        if (!v[0][i])
            continue;

        if (v[0][i])
        {
            if (v[0][i] && v[1][i] && v[2][i] && v[3][i] && v[4][i])
            {
                if (!v[0][i + 1] && !v[1][i + 1] && !v[2][i + 1] && !v[3][i + 1] && !v[4][i + 1])
                {
                    ans += "1";
                    i -= 2;
                }
                else if (v[0][i + 2] && v[1][i + 2] && v[2][i + 2] && v[3][i + 2] && v[4][i + 2])
                {
                    if (v[2][i + 1])
                        ans += "8";
                    else
                        ans += "0";
                }
                else
                    ans += "6";
            }
            else if (v[0][i] && v[1][i] && v[2][i] && !v[3][i] && v[4][i])
            {
                if (v[1][i + 2])
                    ans += "9";
                else
                    ans += "5";
            }
            else if (v[0][i] && !v[1][i] && v[2][i] && v[3][i] && v[4][i])
                ans += "2";
            else if (v[0][i] && !v[1][i] && v[2][i] && !v[3][i] && v[4][i])
                ans += "3";
            else if (v[0][i] && v[1][i] && v[2][i] && !v[3][i] && !v[4][i])
                ans += "4";
            else
                ans += "7";
            i += 2;
        }

    }

    cout << ans << endl;

    return 0;
}

 

지금 잠이 와서 그런지 어디가 틀린지 모르겠다

 

0 1 2 3 4 5 6 7 8 9 전부 숫자 나오는거 확인했는데 어디가 문제지

 

예상 1) 조건 어디가 틀렸음

 

예상2) 왼쪽 상단 하나만 확인하냐? 한 줄 전부 공백인지 확인해라

 

이 두개 중 하나 같은데.. 이거 다시 보고 숫자 다시 확인해야지

 

잠와죽겠음 자야지 

 

 


엥???? 예???? 예상 2가 맞았음

 

일어나서 예상1 확인했는데 예상1은 문제가 없었고 예상2를 고치니 맞았다..

 

설마 이거겠어 싶었는데 이게 문제라고????????

 

#include <iostream>
#include <algorithm>
#include <vector>
#include <string>
#include <functional>
#include <string>
#include <queue>
#include <stack>
#include <set>
#include <map>
#include <cmath>
#include <cstring>
#include <bitset>

#define xx first
#define yy second
#define all(x) (x).begin(), (x).end()

using namespace std;
using i64 = long long int;
using ii = pair<int, int>;
using ii64 = pair<i64, i64>;

bool v[5][20005];

int     main()
{
    int n; string str;
    cin >> n >> str;

    n /= 5;
    for (int i = 0, k = 0; i < 5; i++)
    {
        for (int j = 0; j < n; j++, k++)
        {
            if (str[k] == '#')
                v[i][j] = true;
            else
                v[i][j] = false;
        }
    }

    string ans = "";
    for (int i = 0; i < n; i++)
    {
        if (!v[0][i] && !v[1][i] && !v[2][i] && !v[3][i] && !v[4][i])
            continue;

        if (v[0][i])
        {
            if (v[0][i] && v[1][i] && v[2][i] && v[3][i] && v[4][i])
            {
                if (!v[0][i + 1] && !v[1][i + 1] && !v[2][i + 1] && !v[3][i + 1] && !v[4][i + 1])
                {
                    ans += "1";
                    i -= 2;
                }
                else if (v[0][i + 2] && v[1][i + 2] && v[2][i + 2] && v[3][i + 2] && v[4][i + 2])
                {
                    if (v[2][i + 1])
                        ans += "8";
                    else
                        ans += "0";
                }
                else
                    ans += "6";
            }
            else if (v[0][i] && v[1][i] && v[2][i] && !v[3][i] && v[4][i])
            {
                if (v[1][i + 2])
                    ans += "9";
                else
                    ans += "5";
            }
            else if (v[0][i] && !v[1][i] && v[2][i] && v[3][i] && v[4][i])
                ans += "2";
            else if (v[0][i] && !v[1][i] && v[2][i] && !v[3][i] && v[4][i])
                ans += "3";
            else if (v[0][i] && v[1][i] && v[2][i] && !v[3][i] && !v[4][i])
                ans += "4";
            else
                ans += "7";
            i += 2;
        }

    }

    cout << ans << endl;

    return 0;
}

 

 

 

왜지???? 내 생각에는 숫자는 항상 저 왼쪽 위칸이 차있으니깐 이 칸이 비었다면 공백이고 차있다면 그 때 숫자 시작이라서 숫자 확인하게 했는데 왜지???

 

아니 왜지????

 

정답은~~ 다른 부분도 수정했기 때문이죠~~~

 

생각해보니 어제 밤에 찜찜하다고 전역변수 딱 맞게 만든거 5 키워났었다..

 

아마 배열이 [i+2] 접근할 때 배열 크기 넘어가서 잘못된 값에 접근했던 것 같다

 

(왜 예외 안 알려줘 ㅠㅠ)

 

항상 5 더하다가 딱 맞춰 했더니 이런 문제가 발생하는구나

'백준' 카테고리의 다른 글

14699 관악산 등산  (0) 2020.09.24
2961 도영이가 만든 맛있는 음식  (0) 2020.09.24
12847 꿀 아르바이트  (0) 2020.09.23
2217 로프  (0) 2020.09.23
10814 나이순 정렬  (0) 2020.09.21