백준: Silver⑧ - 1337, 1347, 1485, 1543

2 분 소요


</br> 계속 계속
</br>

1337: 올바른 배열

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

5개 이상 연결된 수열 있게 만들기

    sort(v.begin(), v.end());
    v.push_back(1000000005);
    v.push_back(1000000010);
    v.push_back(1000000015);
    v.push_back(1000000020);
    int ans = 0;
    for(int i = 0; i < v.size()-4; i++){
        int cnt = 0;
        for(int j = 0; j < 5; j++){
            if( v[i+j] <= v[i]+4 ) cnt++;
        }
        ans = max(ans, cnt);
    }
    cout << 5 - ans <<endl;

그 슬라이딩 윈도우? 처럼 5개씩 끊어서 보는데,
윈도우의 처음 수 + 4 이내의 것들이 몇 개 있는 지 세고, 그게 최대인 걸 5에서 빼면 추가할 것들의 개수가 된다.

ex) 1 2 5 6 8 9 15
1. 1 2 5 6 8 -> 1 ~ 6 개수 4개, 3 중간에 추가
2. 2 5 6 8 9 -> 2 ~ 7 개수 3개, 3 4 추가
3. 5 6 8 9 15 -> 5 ~ 10 개수 4개, 7 중간에 추가

윈도우의 크기를 5로 하면서 배열을 전부 탐색하기 위해서, 뒤에 4개 정도 쓰레기값(답에는 영향을 미치지 않는)을 넣었다.
</br>

1347: 미로 만들기

https://www.acmcpc.net/problem/1347

미로를 전부 탐색한 입력을 받고 지도 만들기

int mmap[101][101];
int movei[4] = {1, 0, -1, 0};
int movej[4] = {0, 1, 0, -1};

// in main()
    int minX = 50, maxX = 50, minY = 50, maxY = 50;
    int x = 50, y = 50;
    mmap[x][y] = 1;
    int cmd = 0;
    for(int i = 0; i < s.size(); i++){
        if( s[i] == 'F' ){
            x += movei[cmd];
            y += movej[cmd];
            mmap[x][y] = 1;
            minX = min(minX, x);
            maxX = max(maxX, x);
            minY = min(minY, y);
            maxY = max(maxY, y);
        }
        if( s[i] == 'L' ) cmd = (cmd+1) % 4;
        if( s[i] == 'R' ) cmd = (cmd+3) % 4;
    }
    for(int i = minX; i <= maxX; i++){
        for(int j = minY; j <= maxY; j++){
            if( mmap[i][j] ) cout << '.';
            else cout << '#';
        }
        cout << endl;
    }

뭔가… 이 문제는 재밌네 게임 같기도 하고
입력이 50보다 작으므로 미로 크기를 가로 세로 100으로 잡고 가운데인 (50, 50)에서 시작하게 했다.
‘L’, ‘R’이 들어올 경우 방향만 틀어준다. cmd가 0이면 남쪽, 1이면 동쪽 등으로
mmap[][]에 지나간 곳을 다 표시한다. 이들을 포함하는 최소의 직사각형이 미로의 전체 크기이고, 그 직사각형 내에서 지나가지 않은 곳은 벽이 된다.
최소의 직사각형을 minX, maxX, minY, maxY로 알 수 있다.
</br>

1485: 정사각형

https://www.acmcpc.net/problem/1485

점 4개 입력 받고 정사각형인지 확인하기

    while( n-- > 0){
        vector<int> v;
        for(int i = 0; i < 4; i++){
            cin >> sq[i][0] >> sq[i][1];
        }
        v.push_back(dist(sq[0][0], sq[0][1], sq[1][0], sq[1][1]));
        v.push_back(dist(sq[2][0], sq[2][1], sq[1][0], sq[1][1]));
        v.push_back(dist(sq[2][0], sq[2][1], sq[3][0], sq[3][1]));
        v.push_back(dist(sq[0][0], sq[0][1], sq[3][0], sq[3][1]));
        v.push_back(dist(sq[0][0], sq[0][1], sq[2][0], sq[2][1]));
        v.push_back(dist(sq[1][0], sq[1][1], sq[3][0], sq[3][1]));
        sort(v.begin(), v.end());
        if( (v[0] == v[3] && v[4] == v[5]) || v[0] == v[1] && v[2] == v[5] ){
            cout << 1 << endl;
        }
        else cout << 0 << endl;
    }

ㅋㅋ무지성 복붙 코드
정사각형은 4변의 길이가 같고, 대각선 2개의 길이도 같다.
대충 모든 점끼리의 변의 길이들을 구하고, 그 중의 4개가 같고 2개가 또 같으면 답
</br>

1543: 문서 검색

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

문서 내에서 단어 찾기

    getline(cin, s);
    getline(cin, f);
    if( s.size() < f.size() ){
        cout << 0 << endl;
        return 0;
    }
    int cnt = 0;
    for(int i = 0; i < s.size()-f.size()+1; i++){
        if( s[i] == f[0] ){
            int j = 0;
            for( ; j < f.size(); j++){
                if( s[i+j] != f[j] ) break;
            }
            if( j == f.size() ){
                cnt++;
                i += j -1;
            }
        }
    }
    cout << cnt << endl;

겹치지 않게 찾아야 하므로 그냥 앞에서부터 보이는 대로 찾고, 그 단어 크기만큼 건너 뛰어 주면 된다
</br>


콤보를 다시 쌓고 있다
</br>

댓글남기기