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
반응형
'C,C++' 카테고리의 다른 글
| [C]백준 Q.1476 날짜 계산 (0) | 2026.01.13 |
|---|---|
| [C]백준 Q.2309 일곱난장이 (1) | 2026.01.05 |
| [C]백준 Q.6588 골드바흐의 추측 (0) | 2026.01.03 |
| [C]백준 Q.2609,1978,1929 최대공약수 ~ 소수 문제 (0) | 2025.12.18 |
| [C]백준 Q.17425 약수의 합 1 (0) | 2025.12.14 |