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

 

2477번: 참외밭

첫 번째 줄에 1m2의 넓이에 자라는 참외의 개수를 나타내는 양의 정수 K (1 ≤ K ≤ 20)가 주어진다. 참외밭을 나타내는 육각형의 임의의 한 꼭짓점에서 출발하여 반시계방향으로 둘레를 돌면서 지

www.acmicpc.net

풀이 과정

결과를 구하는 수식 : (사각형의 넓이 - 빈 곳의 넓이) * 참외 개수

 

입력받은 데이터로 저 수식의 빈 값을 채워야 한다.

 

참외의 개수와 사각형의 넓이는 구하는 방법이 간단하다.

 

참외의 개수는 문제에도 쓰여 있듯이 제일 처음 입력받은 값이고 

입력받은 가로의 길이 중 제일 큰 값과 세로의 길이 중 제일 큰 값을 곱해주면 사각형의 넓이가 나온다.

 

문제는 빈 곳의 넓이 이다.

 

입력 받은 값에서 빨간 표시 된 곳의 길이를 구해야 하는데 

나는 아래와 같은 규칙을 사용하였다. 

가로의 길이 중 제일 큰 값(이하 A) 의 다음(반시계방향) 세로의 길이가 최대 값이면 

A 인덱스에 +3,+4 해준 값 2개를 사용 ex) A의 인덱스가 0이면 3,4번 인덱스가 빈 곳의 가로 세로 넓이

세로의 길이가 최대 값이 아니라면  A 인덱스에 +2, +3 해준 값 2개를 사용 ex) A의 인덱스가 0이면 2,3번 인덱스가 빈 곳의 가로 세로 넓이

 

 아래는 구현 소스이다.

 

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
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
using System;
class Program
{    
    static void Main(string[] args)    
    {
         int melonCount = int.Parse(Console.ReadLine());
            int[] sideLength = new int[6];
            bool StartWidth = false;
            int MaxWidthIndex = -1, MaxLengthIndex = -1;
            int X, Y, xIndex, yIndex;
 
            for(int i = 0; i < 6; i++)
            {
                string[] temp = Console.ReadLine().Split();
                if(i == 0 && int.Parse(temp[0]) < 3)
                {
                    StartWidth = true;
                }
 
                sideLength[i] = int.Parse(temp[1]);
            }
            // 최대 값 구하기
            for(int i = 0; i < 6; i++)
            {
                if(StartWidth)
                {
                    if(i % 2 == 0)
                    {
                        if (MaxWidthIndex == -1)
                        {
                            MaxWidthIndex = i;
                            continue;
                        }
                        if (sideLength[MaxWidthIndex] < sideLength[i]) MaxWidthIndex = i;
                    }
                    else
                    {
                        if(MaxLengthIndex == -1)
                        {
                            MaxLengthIndex = i;
                            continue;
                        }
                        if (sideLength[MaxLengthIndex] < sideLength[i]) MaxLengthIndex = i;
                    }
                }
                else
                {
                    if (i % 2 == 0)
                    {
                        if (MaxLengthIndex == -1)
                        {
                            MaxLengthIndex = i;
                            continue;
                        }
                        if (sideLength[MaxLengthIndex] < sideLength[i]) MaxLengthIndex = i;
                    }
                    else
                    {
                        if (MaxWidthIndex == -1)
                        {
                            MaxWidthIndex = i;
                            continue;
                        }
                        if (sideLength[MaxWidthIndex] < sideLength[i]) MaxWidthIndex = i;
                    }
                }
            }
 
            int comp = MaxWidthIndex + 1;
            if (comp > 5) comp -= 6;
 
            if (comp == MaxLengthIndex)
            {
                xIndex = MaxWidthIndex + 3;
                if (xIndex > 5) xIndex -= 6;
                yIndex = MaxWidthIndex + 4;
                if (yIndex > 5) yIndex -= 6;
            }
            else
            {
                xIndex = MaxWidthIndex + 2;
                if (xIndex > 5) xIndex -= 6;
                yIndex = MaxWidthIndex + 3;
                if (yIndex > 5) yIndex -= 6;
            }
 
            X = sideLength[xIndex];
            Y = sideLength[yIndex];
            int result = ((sideLength[MaxWidthIndex] * sideLength[MaxLengthIndex]) - (X * Y)) * melonCount;
            Console.WriteLine(result);
    }
}
 
cs

 

 

value = (보여주고 싶은칸 * 아이템크기)  / (전체영역 - 보여주는 영역) 

구한 값을 ScrollRect.horizontalNormalizedPosition 여기에 넣어주면 된다.

 

float value = (index * grid.gridItemScale.x)  / (ScrollRect.content.rect.width - ScrollRect.Rect.rect.width);

ScrollRect.horizontalNormalizedPosition = value;

문제

N개의 수가 주어졌을 때, 이를 오름차순으로 정렬하는 프로그램을 작성하시오.

입력

첫째 줄에 수의 개수 N(1 ≤ N ≤ 10,000,000)이 주어진다. 둘째 줄부터 N개의 줄에는 수가 주어진다. 이 수는 10,000보다 작거나 같은 자연수이다.

출력

첫째 줄부터 N개의 줄에 오름차순으로 정렬한 결과를 한 줄에 하나씩 출력한다.

 

이 문제는 입력받는 수의 개수 N과 메모리 제한이 핵심인 듯하다

 

처음엔 입력받은 수를 배열에 다 저장한 후에 정렬을 시도했는데 

 

최대 10,000,000 개의 수를 입력받으니 당연하게도 메모리 제한에 걸렸고

 

입력받는 최대 숫자가 10,000인 거에 힌트를 얻어서 따로 정렬하지 않고 출력하였다.

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
using System;
using System.Collections.Generic;
using System.Text; 
class Program
{
    static void Main(string[] args)
    {
            //입력 받을 수의 갯수
            int N = int.Parse(Console.ReadLine());
 
            int MAX_NUM = 10000//입력 받는 수의 최대 값
            int[] countArray = new int[MAX_NUM + 1]; //입력 받은 수 카운트 할 배열
 
             //입력 받은 수를 카운팅
            int temp = 0;
            for(int i = 0; i < N; i++)
            {
                temp = int.Parse(Console.ReadLine());
                countArray[temp]++;
            }
 
           using (var print = new System.IO.StreamWriter(Console.OpenStandardOutput()))
           {
             //카운팅 된 숫자를 출력
             for(int i = 0; i <= MAX_NUM; i++)
             {
                if (countArray[i] == 0continue;
 
                for(int j = 0; j < countArray[i]; j++)
                {
                    print.WriteLine(i);
                }          
             }
           }
 
    }
}
cs

 

배열 문제를 해결하고도 메모리 제한, 시간 초과로 계속 실패했는데 

 

출력 방식이 문제였다. 보통은 StringBuilder를 사용하면 거의 해결이 되었는데 이번 경우엔 그것 조차 안되어서 

 

C#으로 가능한가? 싶었지만 방법은 있었다. 위의 소스처럼 StreamWriter를 사용하면 해결이 가능하다.

 

참고한 출력 속도 비교 자료 

https://www.acmicpc.net/blog/view/57

 

출력 속도 비교

여러가지 언어와 출력 방법을 이용해서 시간이 얼마나 걸리는지 비교해 보았습니다. 방법: 총 N개의 줄에 1부터 10,000,000까지의 자연수를 한 줄에 하나씩 출력하는 시간을 측정. 10번 측정해서 평

www.acmicpc.net

 

 

10989 문제 링크

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

 

10989번: 수 정렬하기 3

첫째 줄에 수의 개수 N(1 ≤ N ≤ 10,000,000)이 주어진다. 둘째 줄부터 N개의 줄에는 수가 주어진다. 이 수는 10,000보다 작거나 같은 자연수이다.

www.acmicpc.net

 

+ Recent posts