[acmicpc] 백준 1018 체스판 다시 칠하기 정답 코드
2020. 4. 12. 03:50ㆍ알고리즘/acmicpc 코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
|
#include <stdio.h>
#include <limits.h>
#define MIN(a,b) ((a > b) ? b : a)
char g_arrBoard[52][52];
unsigned int fnGetMinFill(unsigned int nX, unsigned int nY)
{
unsigned int nMinCount = INT_MAX;
unsigned int nTestCase1 = 0;
for(int i = 0; i < 8; i++)
{
for(int j = 0; j < 8; j++)
{
if((i%2)^(j%2))
{
if(g_arrBoard[nX+i][nY+j] != 'B') nTestCase1++;
}
else
{
if(g_arrBoard[nX+i][nY+j] != 'W') nTestCase1++;
}
}
}
nMinCount = MIN(nMinCount, nTestCase1);
unsigned int nTestCase2 = 0;
for(int i = 0; i < 8; i++)
{
for(int j = 0; j < 8; j++)
{
if((i%2)^(j%2))
{
if(g_arrBoard[nX+i][nY+j] != 'W') nTestCase2++;
}
else
{
if(g_arrBoard[nX+i][nY+j] != 'B') nTestCase2++;
}
}
}
nMinCount = MIN(nMinCount, nTestCase2);
return nMinCount;
}
int main(void)
{
unsigned int nHeight, nWidth;
scanf("%u %u", &nHeight, &nWidth);
for(unsigned int i = 0; i < nHeight; i++)
{
for(unsigned int j = 0; j < nWidth; j++)
{
scanf(" %c", &g_arrBoard[i][j]);
}
}
unsigned int nMinCount = INT_MAX;
for(unsigned int i = 0; i < nHeight - 7; i++)
{
for(unsigned int j = 0; j < nWidth - 7; j++)
{
nMinCount = MIN(nMinCount, fnGetMinFill(i, j));
}
}
printf("%u", nMinCount);
return 0;
}
|
cs |
56번째 줄의 scanf("%c"), scanf("%c "), scanf(" %c") 이 3개가 뭔 차이가 있을까?
본인의 경험에 의하면, 첫 째를 사용하면 값이 완전 다르게 나온다. 둘 째는 마지막에 아무 문자를 한번 더 입력해줘야 값이 나오고, 셋 째는 위 소스코드에 적용돼있는 걸 볼 수 있다시피, 아무 제약 없이 올바른 값이 잘 출력된다.
세 번째 방법처럼 앞에 스페이스바로 한 개 띄어주면, 입력 받을 필요 없는 \n를 지워준다고 한다.
나름 꿀팁인 듯 하니 나중에 비슷한 문제를 겪는다면 이 방법으로 해결하는 것을 추천한다.
'알고리즘 > acmicpc 코드' 카테고리의 다른 글
[acmicpc] 10814 나이순 정렬 정답 코드 (0) | 2020.04.13 |
---|---|
[acmicpc] 11650 좌표 정렬하기 정답 코드 (0) | 2020.04.12 |
[acmicpc] 백준 7568 덩치 C언어 정답 코드 (0) | 2020.04.12 |
[acmicpc] 백준 2446번: 별 찍기 - 9 (피라미드 출력하기) (0) | 2020.04.09 |
[어셈블리어] 백준 2557번 Hello World 런타임 오류 해결법 (0) | 2020.01.29 |