C#

[프로그래머스 힌트/답/해석] 안전지대

Guk-blog 2024. 1. 30. 22:07
728x90
반응형

힌트

더보기
- 폭탄 1개에 최대 9개의 안전지대가 사라짐
- 1 모서리 위치한다면 4개만 사라짐
- 한쪽면에 맞닿아 있다면 6개만 사라짐
- 폭탄이 인접해 있다면 겹친 만큼 고려해야함

정답

더보기
public static int Solution75(int[,] board)
{
	var safeArea = GetNewAreaData(board);

    int answer = 0;
    for(int i = 0 ; i < board.GetLength(0); i++)
    {
        for(int j = 0; j < board.GetLength(1); j++)
        {
            if(safeArea[i,j] != 1)answer++;
        }
    }
    return answer;
}
static int[,] GetNewAreaData(int[,] board){
    int[,] safeArea = (int[,])board.Clone();

    for (int i = 0; i < board.GetLength(0); i++)
    {
        for (int j = 0; j < board.GetLength(1); j++)
        {
            if(board[i, j] == 1)
            {
                if(i - 1 >= 0)
                {
                    safeArea[i - 1, j] = 1;
                    if(j - 1 >= 0)
                    {
                        safeArea[i - 1, j - 1] = 1;
                    }
                    if(j + 1 < board.GetLength(1))
                    {
                        safeArea[i - 1, j + 1] = 1;
                    }
                }
                if(i + 1 < board.GetLength(0))
                {
                    safeArea[i + 1, j] = 1;
                    if(j - 1 >= 0)
                    {
                        safeArea[i + 1, j - 1] = 1;
                    }
                    if(j + 1 < board.GetLength(1))
                    {
                        safeArea[i + 1, j + 1] = 1;
                    }
                }
                if(j + 1 < board.GetLength(1))
                {
                    safeArea[i, j + 1] = 1;
                }
                if(j - 1 >= 0){
                    safeArea[i, j - 1] = 1;
                }
            }
        }
    }
    return safeArea;
}

해석

더보기
int[,] safeArea = (int[,])board.Clone();

 board의 클론을 생성

if(board[i, j] == 1)

 폭탄의 위치를 찾아내고

상, 하,  좌, 우, 좌상, 좌하, 우상, 우하를 모두 위험지대 표시(1)로 변경해야한다

if(i - 1 >= 0)

 왼쪽 모서리가 아닐 때

if(i + 1 < board.GetLength(0))

 오른쪽 모서리가 아닐 때

if(j - 1 >= 0)

위쪽 모서리가 아닐 때

if(j + 1 < board.GetLength(1))

아래쪽 모서리가 아닐 때

해당 항을 1로 변경해준 후 1이 아닌 개수를 세면 안전지대의 개수가 나온다.

 

728x90
반응형