https://www.acmicpc.net/problem/1074
재귀로 분류된 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(2, int.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을 리턴합니다.
백준# 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 |