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;
    }
}