상세 컨텐츠

본문 제목

백준# 1074 - Z

C#/알고리즘

by McRobbin 2020. 5. 10. 15:02

본문

https://www.acmicpc.net/problem/1074

 

1074번: Z

한수는 2차원 배열 (항상 2^N * 2^N 크기이다)을 Z모양으로 탐색하려고 한다. 예를 들어, 2*2배열을 왼쪽 위칸, 오른쪽 위칸, 왼쪽 아래칸, 오른쪽 아래칸 순서대로 방문하면 Z모양이다. 만약, 2차원 ��

www.acmicpc.net

재귀로 분류된 1074번 Z 문제 입니다.

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
 
namespace _1074
{
    class Program
    {
        int Recur(int size, int row, int col)
        {
            if (size == 0)
                return 0;
 
            if(row < size / 2)
            {
                //왼쪽 위
                if(col < size / 2)
                {
                    return this.Recur(size / 2, row, col);
                }
 
                //오른쪽 위
                else
                {
                    return (size * size / 4)
                        + this.Recur(size / 2, row, col - size / 2);
                }
            }
 
            else
            {
                //왼쪽 아래.
                if(col < size / 2)
                {
                    return (size * size / 2)
                        + this.Recur(size / 2, row - size / 2, col);
                }
 
                //오른쪽 아래.
                else
                {
                    return (size * size / 4 * 3)
                        + this.Recur(size / 2, row - size / 2, col - size / 2);
                }
 
            }
        }
 
        static void Main(string[] args)
        {
            string[] splitInput = Console.ReadLine().Split(' ');
            int matSize = (int)Math.Pow(2int.Parse(splitInput[0]));
            int row = int.Parse(splitInput[1]);
            int col = int.Parse(splitInput[2]);
 
   
            Console.WriteLine(new Program().Recur(matSize, row, col));
        }
    }
}
 
 
cs

재귀로 풀지 않아도 괜찮을것 같았으나 재귀를 애써 써봤습니다.

 

matSize와 row, col이 주어집니다.

주어진 매트릭스 에서 중심을 기준으로 4개의 면으로 나누어 row, col이 어느 면으로 가는지 확인합니다.

그 후에 어느 면으로 가는지에 따라 4개의 실행으로 구분됩니다.

 

1번면 : row, col이 변하지 않으며 하나도 진행되지 않은 것으로 봅니다.

2번면 : col이 줄어들 사이즈길이 만큼 감소하고 1번면을 모두 진행한 것으로 보고 1번면 칸 수 만큼 더합니다.

3번면 : row만 줄어들며 1, 2번면을 모두 진행한 것으로 보고 매트릭스 사이즈의 절반 만큼 더합니다.

4번면 : row, col이 모두 줄어들며 1, 2, 3번 면을 모두 진행한 것으로 보고 그 갯수만큼 더합니다.

 

마지막 종료는 사이즈가 0으로 더이상 진행시킬 수 없을 때 0을 리턴합니다.

'C# > 알고리즘' 카테고리의 다른 글

백준# 2961 - 도영이가 만든 맛있는 음식  (0) 2020.05.13
백준# 1019 - 책 페이지  (0) 2020.05.11
백준#1377 - 버블 소트  (0) 2020.05.09
백준#2399 거리의 합  (0) 2020.05.07
백준# 1213 - 팰린드롬 만들기  (0) 2020.05.04

관련글 더보기