퇴근5분전

 

친구가 준 문제2

 

N개의 열과 M개의 행으로 구성된 사각형 맵이 있는데, 각 영역은 특정 색으로 칠해져 있다.
맵의 두 영역은 다음 조건이 만족될 때 같은 나라에 포함된다.
같은 색을 가지고 있다.
다른 색으로 칠해진 영역을 거치지 않고, 동서남북 네 방향으로만 움직여서 한 영역에서 다른 영역으로 이동할 수 있다.
맵은 인덱스 0에서 시작하는 M열과 N행으로 구성된 정수들의 매트릭스로 기술될 수 있다. 각 영역의 색은 매트릭스의 각 요소로써 기술된다.
두 영역은 매트릭스의 각 요소가 같은 값을 가질 때에만 같은 색을 가진다.
예를 들어, 7열, 3행으로 구성된 매트릭스 A를 생각해보자.
A[0][0] = 5 A[0][1] = 4 A[0][2] = 4
A[1][0] = 4 A[1][1] = 3 A[1][2] = 4
A[2][0] = 3 A[2][1] = 2 A[2][2] = 4
A[3][0] = 2 A[3][1] = 2 A[3][2] = 2
A[4][0] = 3 A[4][1] = 3 A[4][2] = 4
A[5][0] = 1 A[5][1] = 4 A[5][2] = 4
A[6][0] = 4 A[6][1] = 1 A[6][2] = 1
매트릭스 A는 5가지 색으로 칠해진 맵으로 기술된다. 맵의 영역들은 7개의 다른 나라를 포함한다.
- A[0][0] 는 한 영역으로 구성된 하나의 나라를 형성한다.
- A[0][1], A[0][2], A[1][2], A[2][2]는 네 개의 영역으로 구성된 하나의 나라를 형성한다.
- A[1][0] 는 한 영역으로 구성된 하나의 나라를 형성한다.
- A[1][1] 는 한 영역으로 구성된 하나의 나라를 형성한다.
- A[2][0] 는 한 영역으로 구성된 하나의 나라를 형성한다.
- A[2][1], A[3][0], A[3][1], A[3][2] 는 네 개의 영역으로 구성된 하나의 나라를 형성한다.
- A[4][0], A[4][1] 는 두 개의 영역으로 구성된 하나의 나라를 형성한다.
- A[4][2], A[5][1], A[5][2] 는 세 개의 영역으로 구성된 하나의 나라를 형성한다.
- A[5][0] 는 한 영역으로 구성된 하나의 나라를 형성한다.
- A[6][0] 는 한 영역으로 구성된 하나의 나라를 형성한다.
- A[6][1], A[6][2] 는 두 개의 영역으로 구성된 하나의 나라를 형성한다.
함수를 작성해라.
def solution(A: Vector[Vector[Int]]): Int = {
 // TODO:
}
함수는 주어진 N열, M행의, 인덱스 0에서 시작하는 매트릭스 A에 대해서, 매트릭스 A에 의해 기술되는 맵의 영역들이 포함되는 나라의 수를 반환한다.
다음을 가정해라.
N은 범위 [1..300,000]의 정수이다.
M은 범위 [1..300,000]의 정수이다.
매트릭스 A의 요소 수는 범위 [1..300,000] 사이의 정수이다.
매트릭스 A의 각 요소의 값은 범위 [?1,000,000,000..1,000,000,000] 사이의 정수이다.
예를 들어, 위의 예에서, 7개의 열과 3개의 행으로 구성된 매트릭스 A에 대해서, 함수는 11을 반환해야만 한다.

 

풀이 )

    소요시간은 코딩시간 2시간, 고민시간 출퇴근 2시간 + 집에서 미드보면서 1시간...

    오래 걸리네...

 

Index = Row * ColCount + Col ;

격자의 Index로 루프를 돈다.

 

for{

1. Value = 0, Value와 현재 인덱스 값과 같은지 확인. 다르면 List에 등록 & 카운트

while(){

2. List에서 Index의 값 꺼내 Map의 현재 위치에서 좌, 우, 하 에 대한 Cell값 비교

3. 값이 같으면 List에 Index값 추가.

4. List의 다음 Index 값을 꺼내어 2번 ~ 3번 반복.

}

5. 같은 값이 없으면 리스트에 등록된 Index의 Cell 값에 * -1 적용.

6. 리스트 초기화

}

 

static void Main(string[] args)

    int[,] map = new int[,] {
        { 5, 4, 4},
        { 4, 3, 4},
        { 3, 2, 4},
        { 2, 2, 2},
        { 3, 3, 4},
        { 1, 4, 4},
        { 4, 1, 1},
    };
    int RowCount = map.GetUpperBound(0) + 1;
    int ColCount = map.GetUpperBound(1) + 1;
    int cnt = 0;
    int value = 0, row = 0, col = 0;
    int xMinus = 0, xPlus = 0, yPlus = 0;
    List<int> BufferIndex = new List<int>();

    bool IsFind = false;

    for (int idx = 0; idx < map.Length; idx++)
    {
        IsFind = false;
        value = 0;
        row = idx / ColCount; col = idx % ColCount;
        BufferIndex.Clear();
        if (value != map[row, col] && 0 < map[row, col])
        {
            value = map[row, col];
            BufferIndex.Add(idx); cnt++;
            IsFind = true;
        }

        while (IsFind)
        {
            if (value == 2)
            {
                int breakValue = 0;
            }
            IsFind = false;
            for (int i = 0; i < BufferIndex.Count; i++)
            {
                row = BufferIndex[i] / ColCount; col = BufferIndex[i] % ColCount;

                xMinus = col - 1;
                xPlus = col + 1;
                yPlus = row + 1;

                // -x;
                if (xMinus >= 0 &&

value == map[row, xMinus] &&

0 < map[row, xMinus] &&

!BufferIndex.Contains(row * ColCount + xMinus))
                {
                    BufferIndex.Add(row * ColCount + xMinus);
                    IsFind |= true;
                }
                // +x;
                if (xPlus < ColCount &&

value == map[row, xPlus] &&

0 < map[row, xPlus] &&

!BufferIndex.Contains(row * ColCount + xPlus))
                {
                    BufferIndex.Add(row * ColCount + xPlus);
                    IsFind |= true;
                }
                // +y;
                if (yPlus < RowCount &&

value == map[yPlus, col] &&

0 < map[yPlus, col] &&

!BufferIndex.Contains(yPlus * ColCount + col))
                {
                    BufferIndex.Add(yPlus * ColCount + col);
                    IsFind |= true;
                }
            }
        }

        for (int loop = 0; loop < BufferIndex.Count; loop++)
        {
            map[BufferIndex[loop]/ ColCount, BufferIndex[loop] % ColCount]*= -1;
        }
        Console.WriteLine("count=" + cnt);
        Print(map);
        Console.ReadLine();
        Console.Clear();
    }

    Console.WriteLine("count=" + cnt);
    Console.ReadLine();
}

static void Print(int[,] map)
{
    int RowCount = map.GetUpperBound(0) + 1;
    int ColCount = map.GetUpperBound(1) + 1;
    for (int r = 0; r < RowCount; r++)
    {
        Console.Write(r.ToString("D2")+"행 ");
        for (int c = 0; c < ColCount; c++)
        {
            Console.Write( map[r, c] + " ");
        }
        Console.WriteLine("");
    }
}

'# 1) 프로그래밍' 카테고리의 다른 글

한글분해_결합, 오토마타...  (0) 2014.01.30
달력 컨트롤] 새로 만든 달력!!!  (0) 2014.01.26
알고리즘] 1  (0) 2013.11.14
C#] 문자열 정렬처리...  (0) 2013.11.10
.net] 모니터링 프로그램...  (0) 2012.05.13