본문 바로가기

알고리즘

ICEBERG

이슈: 맵을 수정할때, 바로 수정 해서 이슈가 있었다. 

안전하게 map에서 숫자 몇을 뺄지 저장하는 임시 map을 만들어서 했어야 했는데, 안일했다. 

import java.util.Scanner;
public class Main{
    public static int[] dx = new int[]{0,1,0,-1};
    public static int[] dy = new int[]{1,0,-1,0};
    public static int sero,garo;
    public static boolean[][] v;
    public static int[][] map,cntMap;
    public static void main(String[] args)
    {
      Scanner scan = new Scanner(System.in);
      input(scan);
      iceberg();
      
    
      scan.close();
    }
    
    public static void iceberg()
    {
      int ans=0;
      for(int time=1;time<=5000;time++)
      {
        modifyMap();
        if(checkMap()){ans=0;break;}
        int cnt=0;
        //dfs 수행 
        for(int i=0;i<sero;i++)
        {
          for(int j=0;j<garo;j++)
          {
            if(map[i][j]!=0 && v[i][j]==false)
            {
              v[i][j]=true;
              dfs(i,j);
              cnt+=1;
            }
          }
        }
        initV();
        if(cnt>=2){ans=time;break;}
        cnt=0;
      } 
      System.out.println(ans);
    }
    
    public static void dfs(int a,int b)
    {
      
      for(int i=0;i<4;i++)
      {
        int cx = a+dx[i];
        int cy = b+dy[i];
        
        if(cx>=0 && cy>=0 && cx<sero && cy<garo)
        {
          if(v[cx][cy]==false && map[cx][cy]!=0)
          {
            v[cx][cy]=true;
            dfs(cx,cy);
          }
        }
      }
      
      
    }
    
    public static void modifyMap()
    {
      for(int i=0;i<sero;i++)
      {
        for(int j=0;j<garo;j++)
        {
          if(map[i][j]!=0)
          {
            int cnt=0;
            for(int k=0;k<4;k++)
            {
              int nx = i+dx[k];
              int ny = j+dy[k];
              if(nx>=0 && nx<sero && ny>=0 && ny<garo)
              {
                if(map[nx][ny]==0)
                {
                  cnt+=1;
                }
              }
            }
            cntMap[i][j]=cnt;
          }
        }
      }
      
      for(int i=0;i<sero;i++)
      {
        for(int j=0;j<garo;j++)
        {
          map[i][j] = map[i][j]-cntMap[i][j];
          if(map[i][j]<0)map[i][j]=0;
          cntMap[i][j]=0;
        }
      }
      
    }
    
    public static void input(Scanner scan)
    {
      sero = scan.nextInt();garo = scan.nextInt();
      map = new int[sero][garo];
      cntMap = new int[sero][garo];
      v = new boolean[sero][garo];
      for(int i=0;i<sero;i++)
      {
        for(int j=0;j<garo;j++)
        {
          map[i] [j] = scan.nextInt();
        }
      }
    }
    
    public static boolean checkMap()
    {
      for(int i=0;i<sero;i++)
      {
        for(int j=0;j<garo;j++)
        {
          if(map[i][j]!=0)return false;
        }
      }
      return true;
    }
    
    
    public static void initV()
    {
      for(int i=0;i<sero;i++)
      {
        for(int j=0;j<garo;j++)
        {
          v[i][j]=false;
        }
      }
    }
    
    
}

'알고리즘' 카테고리의 다른 글

DAM  (0) 2019.09.26
SAFETYZONE  (0) 2019.09.26
LETTER  (0) 2019.09.26
Area  (0) 2019.09.26
TREASURE  (0) 2019.09.26