ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 백준 3085 - 사탕 게임
    백준 algorithm 2020. 5. 31. 23:50

     

    문제 설명

     

     

     

     

     

    -> 오랜만에 푸는 알고리즘 문제입니다. 

    -> 그동안 스프링 공부하느라 포스팅을 못했습니다.......

    => 브루트 포스를 통해 풀어야 하는 문제입니다. 

    => BFS DFS로 접근을 하려했지만 도저히 생각이 안 납니다. 

     

     

    • 배열의 오른쪽과 바꾸는 것과 배열의 아래쪽과 바꾸는 것 두 가지의 경우를 생각해야 합니다. 

    • 바꾼 다음에 check라는 함수를 만들어 위아래로 했을 때 길게 나오는 배열의 수와 옆으로 했을 때 길게 나오는 배열의 수를 확인해야 합니다.

    • 위의 두 가지의 경우를 확인하고 각자 나온 결과값 중 가장 긴 값을 출력합니다.

    • 배열의 길이보다 긴 최댓값은 없으므로, 배열의 길이만큼의 값이 나온다면 도중에 멈출 수 있습니다. 

     

     

     

     

     

    //
    //  main.cpp
    //  Baekjoon
    //
    //  Created by 이준후
    //  Copyright © 2020 이준후. All rights reserved.
    //
    
    #include <iostream>
    #include <algorithm>
    #include <string>
    
    using namespace std;
    
    int check(string Candy[], int size)
    {
        int ans = 1;
        for(int i=0; i<size; i++)
        {
            int tmp = 1;
            for(int j=1; j<size; j++) //오른쪽으로 가는 경우
            {
                if( Candy[i][j] == Candy[i][j-1]) // 연속된다면
                {
                    tmp++;
                }
                else
                {
                    tmp =1;
                }
                if(ans < tmp) ans = tmp;
            }
            tmp = 1;//다시 셀거므로 reset
            for(int j=1; j<size; j++) //오른쪽으로 가는 경우
            {
                if( Candy[j][i] == Candy[j-1][i]) // 연속된다면
                {
                    tmp++;
                }
                else
                {
                    tmp =1;
                }
                if(ans < tmp) ans = tmp;
            }
        }
        return ans;
    }
    
    int main()
    {
        
        ios_base::sync_with_stdio(false);
        cin.tie(nullptr);
        cout.tie(nullptr);
        
        int N;
        cin >> N;
        
        string Candy[50];
        
        int high=0;
        
        for(int i=0; i<N; i++)
        {
            cin >> Candy[i];
        }
        
        for(int i=0; i<N; i++)
        {
            for(int j=0; j<N; j++)
            {
                if((j+1) <N) // 오른쪽 부분과 바꾸는 경우
                {
                    swap(Candy[i][j],Candy[i][j+1]);
                    int tmp = check(Candy, N);
                    high = max(high, tmp);
                    swap(Candy[i][j],Candy[i][j+1]); //원상복구
                }
                
                if( (i+1) < N)
                {
                    swap(Candy[i][j],Candy[i+1][j]);
                    int tmp = check(Candy, N);
                    high = max(high, tmp);
                    swap(Candy[i][j],Candy[i+1][j]);
                }
            }
            if( high == N) break;
        }
        
        
        cout << high <<'\n';
        return 0;
    }
    

     

     

     

    실행장면
    실행 장면 2

     

     

     


    ***처음에는 char형 이중 배열로 받을 생각을 하였습니다. 그런 식으로 접근하는 것보다 string의 배열 형식으로 접근하면 자동으로 2차원 배열 형식임을 해당 문제의 다른 포스팅을 보고 알게 되었습니다. 

     

     

     

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

    백준 1107 - 리모컨  (0) 2020.06.02
    백준 1476 - 날짜 계산  (0) 2020.06.01
    백준 2309 - 일곱난쟁이  (0) 2020.05.16
    백준 11053 - 가장 긴 증가하는 부분 수열  (0) 2020.05.09
    백준 2193 - 이친수  (0) 2020.04.23

    댓글

Designed by Who.