celina의 이것저것
[C++] 백준 1100번 - 하얀 칸 본문
반응형
문제
체스판은 8×8크기이고, 검정 칸과 하얀 칸이 번갈아가면서 색칠되어 있다. 가장 왼쪽 위칸 (0,0)은 하얀색이다. 체스판의 상태가 주어졌을 때, 하얀 칸 위에 말이 몇 개 있는지 출력하는 프로그램을 작성하시오.
입력
첫째 줄부터 8개의 줄에 체스판의 상태가 주어진다. ‘.’은 빈 칸이고, ‘F’는 위에 말이 있는 칸이다.
출력
첫째 줄에 문제의 정답을 출력한다.
접근
처음에는 배열을 이용해서 행과 열을 8*8로 만들어서 풀려고 했으나 복잡할 것같아서 배열을 사용하지 않았다 언듯 보면 이차 배열을 써야할 것 같지만 배열 대신 반복문을 두개 써서 풀었다
코드
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <algorithm>
#include <string>
#include <vector>
using namespace std;
int main() {
char num;
int cnt = 0;
for (int i = 0; i < 8; i++) {
for (int j = 0; j < 8; j++) {
scanf(" %c", &num);
if (i % 2 == 0 && j % 2 == 0 && num == 'F') {
cnt++;
}
if (i % 2 != 0 && j % 2 != 0 && num == 'F') {
cnt++;
}
}
}
printf("%d", cnt);
return 0;
}
리뷰
중첩 for문을 썼다 저렇게 반복문을 두개 돌리면 배열처럼 접근(?) 이용(?)을 할 수 잇다 그그 별 찍기 할때 처럼...!!!
저렇게 반복문을 두개 쓰면 가로 8줄 세로 8줄을 만들 수 있다
그런다음 scanf로 문자를 입력받았다
그리고 if문으로 문자 'F'가 어디에 위치하는지 구했다. 이건 그림을 그려서 금방 알 수 있었다
어차피 흰검흰검 이렇게 반복되니까 2로 나눈 나머지를 사용하면 금방 구할 수 있다!!
여기서 내가 틀렸던게 있다 처음 예제1에서 정답이 1이 나와야 하는데 11이 나온 것이다 다른 예제는 다 제대로 작동하는데 예제1만 답이 이상했다
그 이유는 scanf의 부분에 있다
나는 처음에 코드를 작성할 때
scanf("%c", &num);
이렇게 썼는데 여기서 공백을 한 칸 띄워줘야 한다
그 이유는 scanf함수는 입력받을 문자열 앞에 있는 공백 문자를 무시한다 그러나
%c 서식지정자는 개행문자나 공백문자까지 입력을 받을 수 있다. 그렇기 때문에 이전 입력에서 남아있는 개행 문자나 공백문자를 읽어와서 입력 값을 오작동하게 만들 수 있다 의도치 않은 입력으로 처리 될 수 있
그래서 %c앞에 공백 문자를 추가해서 이전 입력에서 남아 있는 공백 문자나 개행문자를 무시하도록 하는 것이다
공백 하나가 이렇게 중요하다니... 또 새롭게 알게되었다
출처
'자료구조&알고리즘 > 백준' 카테고리의 다른 글
[C++] 백준 1009번 - 분산처리 (거듭제곱의 분할정복) (1) | 2023.03.06 |
---|---|
[C++] 백준 2577번 - 숫자의 개수 (0) | 2023.03.05 |
[C++] 백준 2902번 - KMP는 왜 KMP일까? (0) | 2023.03.03 |
[C++] 백준 2920번 - 음계 (0) | 2023.03.03 |
[C++] 백준 2864번 - 5와 6의 차이 (1) | 2023.03.02 |
Comments