πŸ•οΈ ICPC Sinchon/Simulation

[BOJ S2][C++] λ°±μ€€ 3085번: 사탕 κ²Œμž„

선달 2022. 11. 7. 16:49
λ°˜μ‘ν˜•

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

 

3085번: 사탕 κ²Œμž„

예제 3의 경우 4번 ν–‰μ˜ Y와 Cλ₯Ό λ°”κΎΈλ©΄ 사탕 λ„€ 개λ₯Ό 먹을 수 μžˆλ‹€.

www.acmicpc.net

 

문제

μƒκ·Όμ΄λŠ” 어렸을 적에 "λ΄„λ³΄λ‹ˆ (Bomboni)" κ²Œμž„μ„ μ¦κ²¨ν–ˆλ‹€.

κ°€μž₯ μ²˜μŒμ— N×N크기에 사탕을 μ±„μ›Œ λ†“λŠ”λ‹€. μ‚¬νƒ•μ˜ 색은 λͺ¨λ‘ 같지 μ•Šμ„ μˆ˜λ„ μžˆλ‹€. μƒκ·Όμ΄λŠ” μ‚¬νƒ•μ˜ 색이 λ‹€λ₯Έ μΈμ ‘ν•œ 두 칸을 κ³ λ₯Έλ‹€. κ·Έ λ‹€μŒ κ³ λ₯Έ 칸에 λ“€μ–΄μžˆλŠ” 사탕을 μ„œλ‘œ κ΅ν™˜ν•œλ‹€. μ΄μ œ, λͺ¨λ‘ 같은 μƒ‰μœΌλ‘œ 이루어져 μžˆλŠ” κ°€μž₯ κΈ΄ 연속 λΆ€λΆ„(ν–‰ λ˜λŠ” μ—΄)을 κ³ λ₯Έ λ‹€μŒ κ·Έ 사탕을 λͺ¨λ‘ λ¨ΉλŠ”λ‹€.

사탕이 μ±„μ›Œμ§„ μƒνƒœκ°€ μ£Όμ–΄μ‘Œμ„ λ•Œ, 상근이가 먹을 수 μžˆλŠ” μ‚¬νƒ•μ˜ μ΅œλŒ€ 개수λ₯Ό κ΅¬ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜μ‹œμ˜€.

μž…λ ₯

첫째 쀄에 λ³΄λ“œμ˜ 크기 N이 주어진닀. (3 ≤ N ≤ 50)

λ‹€μŒ N개 μ€„μ—λŠ” λ³΄λ“œμ— μ±„μ›Œμ Έ μžˆλŠ” μ‚¬νƒ•μ˜ 색상이 주어진닀. 빨간색은 C, νŒŒλž€μƒ‰μ€ P, μ΄ˆλ‘μƒ‰μ€ Z, λ…Έλž€μƒ‰μ€ Y둜 주어진닀.

μ‚¬νƒ•μ˜ 색이 λ‹€λ₯Έ μΈμ ‘ν•œ 두 칸이 μ‘΄μž¬ν•˜λŠ” μž…λ ₯만 주어진닀.

좜λ ₯

첫째 쀄에 상근이가 먹을 수 μžˆλŠ” μ‚¬νƒ•μ˜ μ΅œλŒ€ 개수λ₯Ό 좜λ ₯ν•œλ‹€.

 

풀이

// Authored by : seondal
// Co-authored by : -

// #include <bits/stdc++.h>
#include <iostream>
#include <vector>

using namespace std;

int n;
vector<vector<char>> candy;

int dx[] = {0, 1};
int dy[] = {1, 0};

int countCandy() {
    // κ°€μž₯ κΈ΄ 연속 μ‚¬νƒ•μ˜ 갯수 λ°˜ν™˜ ν•¨μˆ˜
    int max_candy = 0;
    
    // i번째 ν–‰μ˜ κ°€μž₯ κΈ΄ 연속 갯수 κ΅¬ν•˜κΈ°
    for(int i=0; i<n; i++) {
        char prev = candy[i][0];
        int cnt = 1;

        for(int j=1; j<n; j++) {
            if(prev == candy[i][j]) { // 연속
                cnt++;
                max_candy = max(max_candy, cnt);
            } else { // λΆˆμ—°μ†
                prev = candy[i][j];
                cnt = 1;
            }
        }
    }
    
    // i번째 μ—΄μ˜ κ°€μž₯ κΈ΄ 연속 갯수 κ΅¬ν•˜κΈ°
    for(int j=0; j<n; j++) {
        char prev = candy[0][j];
        int cnt = 1;

        for(int i=1; i<n; i++) {
            if(prev == candy[i][j]) {
                cnt++;
                max_candy = max(max_candy, cnt);
            } else {
                prev = candy[i][j];
                cnt = 1;
            }
        }
    }
    
    return max_candy;
}

int solution() {
    int ans = countCandy();
    
    // λͺ¨λ“  사탕에 λŒ€ν•΄μ„œ
    for(int i=0; i<n; i++) {
        for(int j=0; j<n; j++){
            
            // 였λ₯Έμͺ½μ΄λ‚˜ μ•„λž˜μͺ½ 사탕과 κ΅ν™˜
            for(int dir=0; dir<2; dir++) {
                int x = i + dx[dir];
                int y = j + dy[dir];
                
                if(x>=n || y>=n)
                    continue;
                if(candy[i][j] == candy[x][y])
                    continue;
                
                swap(candy[i][j], candy[x][y]);
                ans = max(ans, countCandy());
                swap(candy[i][j], candy[x][y]); // μ—°μ†κ°―μˆ˜ μ €μž₯ν•΄μ£Όκ³  되돌리기
            }
        }
    }
    
    return ans;
}

int main() {
    ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);
    
    cin >> n;
    candy.assign(n, vector<char>(n));
    for(int i=0; i<n; i++)
        for(int j=0; j<n; j++)
            cin >> candy[i][j];
    
    cout << solution();
    
    return 0;
}

/*
 */
λ°˜μ‘ν˜•