Computer/Coding Test
B145:ビンゴゲームの判定 - 2중 For 문 LINQ
안녕도라
2025. 5. 12. 12:05
문제요약
빙고 줄 개수 세기
https://paiza.jp/works/challenges/721/retry
ログイン
ログイン画面です。|ITエンジニア・プログラマ向け総合求職・学習サイト【paiza】
paiza.jp
抽選(ちゅうせん) |
K 回の抽選が行われます | 추첨 |
排出(はいしゅつ) | 抽選では数字がランダムに排出されます | 배출 |
縦(たて) | 세로 | |
横(よこ) | 가로 | |
斜め(ななめ) | 대각선 |
난이도
Rank B
풀이 포인트
- LINQ 사용 리팩토링
// 横(よこ)
for(int i = 0; i < n; i++){
bool isWidthBingo = true;
for(int j = 0; j < n; j++)
{
if(bingoGrid[i,j] != 0){
isWidthBingo = false;
break;
}
}
if(isWidthBingo) cnt++;
}
for(int i = 0; i < n; i++)
{
if(Enumerable.Range(0,n).All(j => bingoGrid[i,j] == 0)) cnt++;
if(Enumerable.Range(0,n).All(j => bingoGrid[j,i] == 0)) cnt++;
}
요렇게 한줄로 2중 for문 대체할 수 있음
REVIEW
간단히 2중 for문 순회 순서(?)바꾸는 걸로 가로, 세로, 대각선 빙고를 판정했다.
이 문제야 말로 링크를 사용해 코드를 간결하게 할 수 있을 것 같아서 지피티에게 링크 사용해 풀어달라고 부탁해보았다.
링크 문법는 언제쯤 익숙해지려나.
CODE
차력 for문 풀이
using System;
class Program
{
static void Main()
{
var line = Console.ReadLine().Split();
int n = int.Parse(line[0]);
int k = int.Parse(line[1]);
int[,] bingoGrid = new int[n,n];
for(int i = 0; i < n; i++)
{
var line2 = Console.ReadLine().Split();
for(int j = 0; j < n; j++)
{
bingoGrid[i,j] = int.Parse(line2[j]);
}
}
var line3 = Console.ReadLine().Split();
for( int i = 0; i < k; i++)
{
int a = int.Parse(line3[i]);
for(int j = 0; j < n; j++)
{
for(int m = 0; m < n; m++)
{
if(bingoGrid[j,m] == a)
{
bingoGrid[j,m] = 0;
}
}
}
}
int cnt = 0;
// 横(よこ)
for(int i = 0; i < n; i++){
bool isWidthBingo = true;
for(int j = 0; j < n; j++)
{
if(bingoGrid[i,j] != 0){
isWidthBingo = false;
break;
}
}
if(isWidthBingo) cnt++;
}
// 縦(たて)
for(int i = 0; i < n; i++){
bool isLengthBingo = true;
for(int j = 0; j < n; j++)
{
if(bingoGrid[j,i] != 0){
isLengthBingo = false;
break;
}
}
if(isLengthBingo) cnt++;
}
bool isDiagonalBingo = true;
// 対角線(たいかくせん)
for(int i = 0; i < n ; i++)
{
if(bingoGrid[i, i] != 0) {isDiagonalBingo =false; break; }
}
if(isDiagonalBingo) cnt++;
isDiagonalBingo = true;
for(int i = 0; i < n; i++)
{
if(bingoGrid[i,n-1-i]!= 0){isDiagonalBingo =false; break; }
}
if(isDiagonalBingo) cnt++;
Console.WriteLine(cnt);
}
}
LINQ사용한 리팩토링
using System;
using System.Linq;
class Program
{
static int n;
static int[,] bingoGrid;
static void Main()
{
var line = Console.ReadLine().Split();
n = int.Parse(line[0]);
int k = int.Parse(line[1]);
bingoGrid = new int[n,n];
for(int i = 0; i < n; i++)
{
var row = Console.ReadLine().Split().Select(int.Parse).ToArray();
for(int j = 0; j < n; j++)
{
bingoGrid[i,j] = row[j];
}
}
var numbers = Console.ReadLine().Split().Select(int.Parse).ToArray();
for(int i = 0; i < n; i++)
{
for(int j = 0; j < n; j++)
{
if(numbers.Contains(bingoGrid[i,j])) bingoGrid[i,j] = 0;
}
}
int cnt = CountBingo();
Console.WriteLine(cnt);
}
static int CountBingo()
{
int cnt = 0;
for(int i = 0; i < n; i++)
{
if(Enumerable.Range(0,n).All(j => bingoGrid[i,j] == 0)) cnt++;
if(Enumerable.Range(0,n).All(j => bingoGrid[j,i] == 0)) cnt++;
}
if(Enumerable.Range(0,n).All(i => bingoGrid[i,i] == 0)) cnt++;
if(Enumerable.Range(0,n).All(i => bingoGrid[i,n-1-i] == 0)) cnt++;
return cnt;
}
}