일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 카니발대학교 공대강국
- i자형 인재
- 브루트포스 알고리즘
- 이진 탐색
- 2025 대한민국 채용박람회
- 그래픽 디자인
- vrm posing desktop
- VRoid Studio
- URP
- 시작
- 영어
- blender
- 라자냐
- 병역일터
- 자료구조
- 코딩테스트
- 닌텐도 스위치 2
- 잴다의 전설 티어스 오브 더 킹덤
- 마인크래프트
- 그리디 알고리즘
- 스택
- 택시 기하학
- 배열 리스트
- 큐
- 다이나믹프로그래밍
- c#
- unity engine
- Probuilder
- 빅오 표기법
- windows 12
Archives
- Today
- Total
WalkerJei's Lifelog
백준알고리즘 1100번 하얀 칸 C# 본문
세부 정보
- 사이트: 백준알고리즘
- 번호: 1100
- 문제명: 하얀 칸
- 언어: C#
- 분류: 구현, 문자열
- 비고:
문제
체스판은 8×8크기이고, 검정 칸과 하얀 칸이 번갈아가면서 색칠되어 있다. 가장 왼쪽 위칸 (0,0)은 하얀색이다. 체스판의 상태가 주어졌을 때, 하얀 칸 위에 말이 몇 개 있는지 출력하는 프로그램을 작성하시오.
입력
첫째 줄부터 8개의 줄에 체스판의 상태가 주어진다. ‘.’은 빈 칸이고, ‘F’는 위에 말이 있는 칸이다.
출력
첫째 줄에 문제의 정답을 출력한다.
풀이
체스판에서 가장 왼쪽 위칸 (0, 0)이 하얀색이고 검정 칸과 하얀 칸이 번갈아가며 칠해져 있다는 특성을 다음과 같이 활용하면 된다.
(0, 0): 하양
(0, 1): 검정
(1, 0): 검정
(1, 1): 하양
여기서 괄호 안의 수 2개의 나머지를 구해서 둘 다 같으면 하양 칸, 다르면 검정 칸이다.
StreamReader sr = new StreamReader(Console.OpenStandardInput());
StreamWriter sw = new StreamWriter(Console.OpenStandardOutput());
// 체스판
string[] chessPlate = new string[8];
// 하얀 칸 위에 있는 말의 개수
int whiteF = 0;
// 체스판에 빈 칸과 말이 있는 칸 입력 (빈칸: ., 말: F)
for (int i = 0; i < 8; i++)
chessPlate[i] = sr.ReadLine();
for (int i = 0; i < 8; i++)
{
// 하얀 칸은 0, 0부터 시작하며 i와 j 둘 다 홀수이거나 짝수이다.
// 하얀 칸 위에 말이 있는 지 판별
for (int j = 0;j < 8; j++)
{
if (i % 2 == 0 && j % 2 == 0 && chessPlate[i][j] == 'F')
whiteF++;
if (i % 2 == 1 && j % 2 == 1 && chessPlate[i][j] == 'F')
whiteF++;
}
}
// 하얀 칸 위의 말 개수 출력
sw.WriteLine(whiteF);
sr.Close();
sw.Close();
후기
이 문제는 어제보다 더 순조롭게 풀렸다. 겉으로 보기에는 어려워 보일 수 있지만 실력이 쌓이니까 이러한 문제의 해결 방법이 떠오르는 자신을 발견했다. 거기다가 20분도 안 걸려서 풀어냈고 단번에 정답이 나왔다.
심지어 풀다 보니까 보다 더 간결하게 만드는 방법도 떠올랐다.
StreamReader sr = new StreamReader(Console.OpenStandardInput());
StreamWriter sw = new StreamWriter(Console.OpenStandardOutput());
// 체스판
string[] chessPlate = new string[8];
// 하얀 칸 위에 있는 말의 개수
int whiteF = 0;
// 체스판에 빈 칸과 말이 있는 칸 입력 (빈칸: ., 말: F)
for (int i = 0; i < 8; i++)
chessPlate[i] = sr.ReadLine();
for (int i = 0; i < 8; i++)
{
// 하얀 칸은 0, 0부터 시작하며 i와 j를 2로 나눈 나머지가 같다.
// 하얀 칸 위에 말이 있는 지 판별
for (int j = 0;j < 8; j++)
if (i % 2 == j % 2 && chessPlate[i][j] == 'F') whiteF++;
}
// 하얀 칸 위의 말 개수 출력
sw.WriteLine(whiteF);
sr.Close();
sw.Close();
아예 i % 2와 j % 2의 값이 같으면 하얀 칸이라는 의미다. 코드의 길이가 확 줄어들었다. 이렇게 최적화를 선보였다. 앞으로도 이런 페이스로 쭉 나아가야 한다.
'소프트웨어 개발 > 코딩테스트(기성 문제)' 카테고리의 다른 글
백준알고리즘 2455번 지능형 기차 C# (0) | 2025.04.20 |
---|---|
백준알고리즘 5597번 과제 안 내신 분..? C# (1) | 2025.04.19 |
백준알고리즘 11656번 접미사 배열 C# (0) | 2025.04.17 |
백준알고리즘 1427번 소트인사이드 C# (1) | 2025.04.17 |
백준알고리즘 7785번 회사에 있는 사람 C# (0) | 2025.04.15 |