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

 

또 코딩문제로 블로그에 글을 쓸까하다가 문제가 생각보다 까다로워서 문제만 풀고 글은 뒷전으로 밀어버린문제...

이 문제는 결과적으로 모든 갯수를 세는 문젠데 이렇게 할까 저렇게 할까 고민하다가 시간만 날렸다.

결국엔 그냥 전부 만들고 카운트해버리는 방법으로 해버려서, 역시 직관적인 방법이 제일인거같다

 

아무튼 난 

이 단계를 거쳐서 구현을 했는데

1. 입력

2. 인접한 두개를 바꾼 배열 생성

3. 몇개인지 세기

4. 출력

처음에 이렇게 할까 저렇게할까 뭐 생각만 많아서 코드가 지저분해졌다

구조체나 반복된 배열이나 뭐 그런것들 필요없을텐데 그렇다고 다시 깔끔하게 하기엔 귀찮아서 그냥 올린다

#include <stdlib.h>
#include <stdio.h>
/**
 q3085 사탕 게임

 */


int cMax = 0, pMax = 0, zMax = 0, yMax = 0;

/// value, count
struct CandyLog {
    char value;
    int count;
};

void updateMaxValue(struct CandyLog log) {
    switch (log.value) {
        case 'C':
            if (cMax < log.count) cMax = log.count;
            break;
        case 'P':
            if (pMax < log.count) pMax = log.count;
            break;
        case 'Z':
            if (zMax < log.count) zMax = log.count;
            break;
        case 'Y':
            if (yMax < log.count) yMax = log.count;
            break;
        default:
            break;
    }
}

void swap(char * a, char * b) {
    char temp = *a;
    *a = *b;
    *b = temp;
}

void countCandy(int width, char board[][width]) {
    // 가로를 먼서 세고
    for (int i = 0; i < width; i ++) {
        struct CandyLog log = {'\0', 1};
        // 행
        for (int k = 0; k < width; k ++) {
            // 열
            struct CandyLog current = { board[i][k], 1};
            if (log.value == current.value) {
                log.count ++;
                if (k == width - 1) updateMaxValue(log);
            } else {
                updateMaxValue(log);
                log = current;
            }
        }// for 열 반복
    }
    
    // 세로를 다음에 센다
    for (int i = 0; i < width; i ++) {
        struct CandyLog log = {'\0', 1};
        // 열
        for (int k = 0; k < width; k ++) {
            // 행
            struct CandyLog current = {board[k][i], 1};
            if (log.value == current.value) {
                log.count ++;
                if (k == width - 1) updateMaxValue(log);
            } else {
                updateMaxValue(log);
                log = current;
            }
        }// for 열 반복
    }
}
 
int main(int argc, const char * argv[]) {
    // 1. 입력받고
    
    int width = 0;
    if (scanf("%d", &width) == EOF) {
        return -1;
    }
    
    char board[width][width];
    for (int i = 0; i < width; i++) {
        char temp[width];
        scanf("%s", temp);
        for (int j = 0; j < width; j ++) {
            board[i][j] = temp[j];
        }
    }
    
    /**
     5
     YCPZY
     CYZZP
     CCPPP
     YCYZC
     CPPZZ
     */
    /*
    int width = 5;
    char board[5][5] = {
        { 'Y','C','P','Z','Y' },
        { 'C','Y','Z','Z','P' },
        { 'C','C','P','P','P' },
        { 'Y','C','Y','Z','C' },
        { 'C','P','P','Z','Z' }
    };*/
    /*
    int width = 3;
    char board[3][3] = {
        {'C','C','P'},
        {'C','C','P'},
        {'P','P','C'}
    };
    */
    // 2. 가장 연속된게 긴애를 찾자 -> 1칸식 비어서 나오는거면? 어떻게 할건데 -> 그럼 다른 애들도 1칸이상씩 비어있겠지 인접한걸 찾아야할테고 그런데 그럼 무조건 1아니면 3아닌가?
    /**
     CCP
     CCP
     PPC
     빨간색은 C, 파란색은 P, 초록색은 Z, 노란색은 Y
     */
    
    // 가로끼리 스왑할때
    for (int i = 0; i < width; i ++) {
        for (int k = 0; k < width - 1; k ++) {
            if (board[i][k] == board[i][k+1]) {
                // 같은 값이면?
                continue;
            }
            swap(&board[i][k], &board[i][k+1]);
            countCandy(width, board);
            swap(&board[i][k], &board[i][k+1]);
        }
    }
    // 세로끼리 스왑할때
    for (int i = 0; i < width; i ++) {
        for (int k = 0; k < width - 1; k ++) {
            if (board[k][i] == board[k+1][i]) {
                // 같은 값이면?
                continue;
            }
            swap(&board[k][i], &board[k+1][i]);
            countCandy(width, board);
            swap(&board[k][i], &board[k+1][i]);
        }
    }
    
    int arr[4] = {cMax, pMax, zMax, yMax};
    int maxVal = arr[0];
    for (int i = 1; i < 4; i++) {
        if (arr[i] > maxVal) {
            maxVal = arr[i];
        }
    }
    
    printf("%d\n", maxVal);
    
    return EXIT_SUCCESS;
}

 

 

만사가 귀찮...

 

https://github.com/wiwi-git/c-baekjoon/tree/main/q3085

 

c-baekjoon/q3085 at main · wiwi-git/c-baekjoon

블로그 업데이트용 백준 코드. Contribute to wiwi-git/c-baekjoon development by creating an account on GitHub.

github.com

 

 

 

반응형

+ Recent posts