문제

0보다 크거나 같은 정수 N이 주어진다. 이때, N!을 출력하는 프로그램을 작성하시오.

입력

첫째 줄에 정수 N(0 ≤ N ≤ 12)가 주어진다.

출력

첫째 줄에 N!을 출력한다.

 

해당 문제는 for문이 아닌 재귀함수를 학습하기 위해 출제된 문제이기 때문에 재귀함수를 이용하여 구현함.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
using System;
 
class Program
{
    static void Main(string[] args)
    {
        int n = int.Parse(Console.ReadLine());
        Console.WriteLine(factorial(n));
    }
    
    static int factorial(int n)
    {
        if(n == 0return 1;
        return n * factorial(n-1);
    }
}
cs

 

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

 

10872번: 팩토리얼

0보다 크거나 같은 정수 N이 주어진다. 이때, N!을 출력하는 프로그램을 작성하시오.

www.acmicpc.net

 

문제

조규현과 백승환은 터렛에 근무하는 직원이다. 하지만 워낙 존재감이 없어서 인구수는 차지하지 않는다. 다음은 조규현과 백승환의 사진이다.

이석원은 조규현과 백승환에게 상대편 마린(류재명)의 위치를 계산하라는 명령을 내렸다. 조규현과 백승환은 각각 자신의 터렛 위치에서 현재 적까지의 거리를 계산했다.

조규현의 좌표 (x1, y1)와 백승환의 좌표 (x2, y2)가 주어지고, 조규현이 계산한 류재명과의 거리 r1과 백승환이 계산한 류재명과의 거리 r2가 주어졌을 때, 류재명이 있을 수 있는 좌표의 수를 출력하는 프로그램을 작성하시오.

입력

첫째 줄에 테스트 케이스의 개수 T가 주어진다. 각 테스트 케이스는 다음과 같이 이루어져 있다.

한 줄에 x1, y1, r1, x2, y2, r2가 주어진다. x1, y1, x2, y2는 -10,000보다 크거나 같고, 10,000보다 작거나 같은 정수이고, r1, r2는 10,000보다 작거나 같은 자연수이다.

출력

각 테스트 케이스마다 류재명이 있을 수 있는 위치의 수를 출력한다. 만약 류재명이 있을 수 있는 위치의 개수가 무한대일 경우에는 -1을 출력한다.

 

두 점 사이의 거리 d 를 구하고 각 원의 반지름과 길이를 비교하여 두원의 교차점을 구해야 함.

터렛(원) 좌표 기준 류재명과의 거리가 해당 원의 반지름이다.   

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
using System;
using System.Linq;
using System.Text;
 
class Program
{
    static void Main(string[] args)
    {
        int iCase = int.Parse(Console.ReadLine());
        StringBuilder sResult = new StringBuilder();
        for(int i = 0; i < iCase; i++)
        {
            int[] iArr = Console.ReadLine().Split().Select(n => int.Parse(n)).ToArray();
            int x1 = iArr[0];
            int y1 = iArr[1];
            int r1 = iArr[2];
            int x2 = iArr[3];
            int y2 = iArr[4];
            int r2 = iArr[5];
            
            double d = Math.Sqrt(Math.Pow(x2-x1,2+ Math.Pow(y2-y1,2));
            
            if(d == 0)
            {
                if( r1 == r2)
                {
                    sResult.Append("-1\n");
                }
                else
                {
                    sResult.Append("0\n");   
                }                    
            }
            else if(d < Math.Abs(r1-r2) || d > r1 + r2)
            {
                sResult.Append("0\n");
            }
            else if(d == Math.Abs(r1-r2)||== r1+r2)
            {
                sResult.Append("1\n");
            }
            else if(Math.Abs(r1-r2) < d && d < r1+r2)
            {
                sResult.Append("2\n");
            }
        }
        Console.WriteLine(sResult);
    }
}
cs

 

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

 

1002번: 터렛

각 테스트 케이스마다 류재명이 있을 수 있는 위치의 수를 출력한다. 만약 류재명이 있을 수 있는 위치의 개수가 무한대일 경우에는 -1을 출력한다.

www.acmicpc.net

 

문제

19세기 독일 수학자 헤르만 민코프스키는 비유클리드 기하학 중 택시 기하학을 고안했다.

택시 기하학에서 두 점 T1(x1,y1), T2(x2,y2) 사이의 거리는 다음과 같이 구할 수 있다.

D(T1,T2) = |x1-x2| + |y1-y2|

두 점 사이의 거리를 제외한 나머지 정의는 유클리드 기하학에서의 정의와 같다.

따라서 택시 기하학에서 원의 정의는 유클리드 기하학에서 원의 정의와 같다.

원: 평면 상의 어떤 점에서 거리가 일정한 점들의 집합

반지름 R이 주어졌을 때, 유클리드 기하학에서 원의 넓이와, 택시 기하학에서 원의 넓이를 구하는 프로그램을 작성하시오.

입력

첫째 줄에 반지름 R이 주어진다. R은 10,000보다 작거나 같은 자연수이다.

출력

첫째 줄에는 유클리드 기하학에서 반지름이 R인 원의 넓이를, 둘째 줄에는 택시 기하학에서 반지름이 R인 원의 넓이를 출력한다. 정답과의 오차는 0.0001까지 허용한다.

택시 기하학이라는걸 처음 들어봐서 관련 지식부터 공부했다.

 

https://librewiki.net/wiki/%ED%83%9D%EC%8B%9C_%EA%B8%B0%ED%95%98%ED%95%99

 

택시 기하학

Taxicab Geometry.

librewiki.net

해당 위키에서 택시 기하학이 뭔지 파악했고 택시 기하학에서 원은 마름모가 된다는걸 알았다.

마름모의 넓이를 구할 수 있다면 이번 문제는 쉽게 해결 될 것이다.

 

택시 기하학 원의 마름모는 대각선의 길이가 같기때문에 

2 * R * R = 마름모의 넓이, 해당 공식으로 넓이를 구할 수 있다.

 

코드는 다음과 같다.

 

1
2
3
4
5
6
7
8
9
10
11
using System;
class Program
{
    static void Main(string[] args)
    {
         int iR = int.Parse(Console.ReadLine());
 
         Console.WriteLine((iR * iR * Math.PI).ToString("0.######"));
         Console.WriteLine((2 * iR * iR).ToString("0.######"));
    }
}
cs

 

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

 

3053번: 택시 기하학

문제 19세기 독일 수학자 헤르만 민코프스키는 비유클리드 기하학 중 택시 기하학을 고안했다. 택시 기하학에서 두 점 T1(x1,y1), T2(x2,y2) 사이의 거리는 다음과 같이 구할 수 있다. D(T1,T2) = |x1-x2| + |

www.acmicpc.net

 

문제

과거 이집트인들은 각 변들의 길이가 3, 4, 5인 삼각형이 직각 삼각형인것을 알아냈다. 주어진 세변의 길이로 삼각형이 직각인지 아닌지 구분하시오.

입력

입력은 여러개의 테스트케이스로 주어지며 마지막줄에는 0 0 0이 입력된다. 각 테스트케이스는 모두 30,000보다 작은 양의 정수로 주어지며, 각 입력은 변의 길이를 의미한다.

출력

각 입력에 대해 직각 삼각형이 맞다면 "right", 아니라면 "wrong"을 출력한다.

 

직각 삼각형의 정수비를 이용하여 풀이함.

ex) 3:4:5 => 32 + 42 = 52

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
using System;
using System.Linq;
using System.Text;
class Program
{
    static void Main(string[] args)
    {
         StringBuilder sResult = new StringBuilder();
         for(; ;)
         {
            int[] arrValue = Console.ReadLine().Split().Select(n => int.Parse(n)).ToArray();
            Array.Sort(arrValue);
            if (arrValue[0== 0break;
            if((Math.Pow(arrValue[0],2+ Math.Pow(arrValue[1],2)) == Math.Pow(arrValue[2],2))
            {
              sResult.Append("right\n");
            }
            else
            {
              sResult.Append("wrong\n");
            }
         }
         Console.WriteLine(sResult);
    }
}
cs

 

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

 

4153번: 직각삼각형

문제 과거 이집트인들은 각 변들의 길이가 3, 4, 5인 삼각형이 직각 삼각형인것을 알아냈다. 주어진 세변의 길이로 삼각형이 직각인지 아닌지 구분하시오. 입력 입력은 여러개의 테스트케이스로

www.acmicpc.net

 

문제

세 점이 주어졌을 때, 축에 평행한 직사각형을 만들기 위해서 필요한 네 번째 점을 찾는 프로그램을 작성하시오.

입력

세 점의 좌표가 한 줄에 하나씩 주어진다. 좌표는 1보다 크거나 같고, 1000보다 작거나 같은 정수이다.

출력

직사각형의 네 번째 점의 좌표를 출력한다.

X, Y 좌표 각각 중복 없는 수가 네 번째 점이다.

비교문을 통해 중복 없는 수를 구함.

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
using System;
using System.Linq;
 
class Program
{
    static void Main(string[] args)
    {
         int[] x = new int[3];
         int[] y = new int[3];
         int iResultX;
         int iResultY;
         for(int i = 0; i < 3; i++)
         {
            string[] s = Console.ReadLine().Split().ToArray();
            x[i] = int.Parse(s[0]);
            y[i] = int.Parse(s[1]);
         }
 
        if (x[0== x[1]) iResultX = x[2];
        else if (x[0== x[2]) iResultX = x[1];
        else iResultX = x[0];
 
        if (y[0== y[1]) iResultY = y[2];
        else if (y[0== y[2]) iResultY = y[1];
        else iResultY = y[0];
 
        Console.WriteLine(iResultX + " " + iResultY);
    }
}
cs

 

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

 

3009번: 네 번째 점

문제 세 점이 주어졌을 때, 축에 평행한 직사각형을 만들기 위해서 필요한 네 번째 점을 찾는 프로그램을 작성하시오. 입력 세 점의 좌표가 한 줄에 하나씩 주어진다. 좌표는 1보다 크거나 같고,

www.acmicpc.net

 

출처 : https://cqtd.github.io/unity-editor/unity-editor-logger-basic/

 

유니티 로그 기능 소소한 팁

유니티 에디터 로깅으로 빠른 작업 실현

cqtd.github.io

특정 오브젝트 하이라이팅 하기

Debug.Log기능은 유니티 개발에 있어 빼놓을 수 없는 기능입니다. 보통 특정한 데이터를 표기하거나, 예외 발생 시 또는 Raycast 의 결과를 출력하려고 등등에 로그를 찍을 때 쓰죠.

public class TestClass : MonoBehaviour { public int myValue = 10; void Start() { Debug.Log(myValue); } }

에디터의 콘솔에는 다음 처럼 나타납니다.

그런데 Debug.Log에는 1개의 인자 외에도 추가적인 인자를 넣을 수 있습니다.

public class TestClass : MonoBehaviour { public int myValue = 10; void Start() { Debug.Log(myValue); Debug.Log(myValue, this); } }

이러한 경우 콘솔에 출력된 메시지를 클릭하는 경우, 아래와 사진과 같이 하이라이팅을 해 줍니다.

Raycast 등의 로직이 잘 동작하는지 확인하고 싶을 때, 이러한 방식으로 바로바로 어떤 오브젝트가 상호작용중인지 확인이 가능합니다.

컬러 텍스트 출력하기Permalink

콘솔에도 컬러 텍스트 출력이 가능합니다.

public class ScreenManager : MonoBehaviour { void OnScreenSizeChanged() { Debug.Log($"<color=yellow>Screen size changed! : {screenSize.x}x{screenSize.y}</color>"); } }

<color=colorname> string here </color> 와 같은 방식으로 사용하면 됩니다.

문제

한수는 지금 (x, y)에 있다. 직사각형의 왼쪽 아래 꼭짓점은 (0, 0)에 있고, 오른쪽 위 꼭짓점은 (w, h)에 있다. 직사각형의 경계선까지 가는 거리의 최솟값을 구하는 프로그램을 작성하시오.

입력

첫째 줄에 x y w h가 주어진다. w와 h는 1,000보다 작거나 같은 자연수이고, x는 1보다 크거나 같고, w-1보다 작거나 같은 자연수이고, y는 1보다 크거나 같고, h-1보다 작거나 같은 자연수이다.

출력

첫째 줄에 문제의 정답을 출력한다.

 

4개의 변중 가장 가까운 곳의 거리를 찾아내면 된다.

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
using System;
using System.Linq;
 
class Program
{
    static void Main(string[] args)
    {
        int[] arrInput = Console.ReadLine().Split().Select(n => int.Parse(n)).ToArray();
        int A;
        int B;
        if(arrInput[0<= arrInput[2/ 2)
        {
            A = arrInput[0];
        }
        else
        {
            A = arrInput[2- arrInput[0];
        }
        if(arrInput[1<= arrInput[3/ 2)
        {
            B = arrInput[1];
        }
        else
        {
            B = arrInput[3- arrInput[1];
        }
        
        Console.WriteLine(A > B ? B : A);
    }
}
cs

 

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

 

1085번: 직사각형에서 탈출

첫째 줄에 x y w h가 주어진다. w와 h는 1,000보다 작거나 같은 자연수이고, x는 1보다 크거나 같고, w-1보다 작거나 같은 자연수이고, y는 1보다 크거나 같고, h-1보다 작거나 같은 자연수이다.

www.acmicpc.net

 

문제

1보다 큰 자연수 중에서  1과 자기 자신을 제외한 약수가 없는 자연수를 소수라고 한다. 예를 들어, 5는 1과 5를 제외한 약수가 없기 때문에 소수이다. 하지만, 6은 6 = 2 × 3 이기 때문에 소수가 아니다.

골드바흐의 추측은 유명한 정수론의 미해결 문제로, 2보다 큰 모든 짝수는 두 소수의 합으로 나타낼 수 있다는 것이다. 이러한 수를 골드바흐 수라고 한다. 또, 짝수를 두 소수의 합으로 나타내는 표현을 그 수의 골드바흐 파티션이라고 한다. 예를 들면, 4 = 2 + 2, 6 = 3 + 3, 8 = 3 + 5, 10 = 5 + 5, 12 = 5 + 7, 14 = 3 + 11, 14 = 7 + 7이다. 10000보다 작거나 같은 모든 짝수 n에 대한 골드바흐 파티션은 존재한다.

2보다 큰 짝수 n이 주어졌을 때, n의 골드바흐 파티션을 출력하는 프로그램을 작성하시오. 만약 가능한 n의 골드바흐 파티션이 여러 가지인 경우에는 두 소수의 차이가 가장 작은 것을 출력한다.

입력

첫째 줄에 테스트 케이스의 개수 T가 주어진다. 각 테스트 케이스는 한 줄로 이루어져 있고 짝수 n이 주어진다. (4 ≤ n ≤ 10,000)

출력

각 테스트 케이스에 대해서 주어진 n의 골드바흐 파티션을 출력한다. 출력하는 소수는 작은 것부터 먼저 출력하며, 공백으로 구분한다.

 

에라토스테네스의 채를 이용하여 10000까지 소수를 구해놓고

 

n 의 절반부터 양쪽다 소수인 경우를 찾는다. 

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
using System;
using System.Linq;
using System.Text;
class Program
{
    static void Main(string[] args)
    {
        int iNum = int.Parse(Console.ReadLine());
        bool[] bPrime = Enumerable.Repeat(true10000+1).ToArray();
        bPrime[1= true;
        for(int i = 2; i <= Math.Sqrt(10000); i++)
        {
            if(bPrime[i])
            {
                for(int j = i*i; j <= 10000; j += i)
                {
                    bPrime[j] = false;
                }
            }
        }
        
        StringBuilder sResult = new StringBuilder();
        for(int i = 0; i < iNum; i++)
        {
            int iTC = int.Parse(Console.ReadLine());
            int iHalf = iTC / 2;
            for(int j = iHalf; j > 0; j--)
            {
                if(bPrime[j] && bPrime[iHalf])
                {
                    sResult.Append(j + " " + iHalf + "\n");
                    break;
                }
                iHalf++;
            }
        }
        Console.WriteLine(sResult);
        
    }
}
cs

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

 

9020번: 골드바흐의 추측

문제 1보다 큰 자연수 중에서  1과 자기 자신을 제외한 약수가 없는 자연수를 소수라고 한다. 예를 들어, 5는 1과 5를 제외한 약수가 없기 때문에 소수이다. 하지만, 6은 6 = 2 × 3 이기 때문에 소수

www.acmicpc.net

 

문제

베르트랑 공준은 임의의 자연수 n에 대하여, n보다 크고, 2n보다 작거나 같은 소수는 적어도 하나 존재한다는 내용을 담고 있다.

이 명제는 조제프 베르트랑이 1845년에 추측했고, 파프누티 체비쇼프가 1850년에 증명했다.

예를 들어, 10보다 크고, 20보다 작거나 같은 소수는 4개가 있다. (11, 13, 17, 19) 또, 14보다 크고, 28보다 작거나 같은 소수는 3개가 있다. (17,19, 23)

n이 주어졌을 때, n보다 크고, 2n보다 작거나 같은 소수의 개수를 구하는 프로그램을 작성하시오.

입력

입력은 여러 개의 테스트 케이스로 이루어져 있다. 각 케이스는 n을 포함하며, 한 줄로 이루어져 있다. (n ≤ 123456)

입력의 마지막에는 0이 주어진다.

출력

각 테스트 케이스에 대해서, n보다 크고, 2n보다 작거나 같은 소수의 개수를 출력한다.

 

https://kplee.tistory.com/58

 

백준 문제 번호 : 1978 - 소수찾기

문제 주어진 수 N개 중에서 소수가 몇 개인지 찾아서 출력하는 프로그램을 작성하시오. 입력 첫 줄에 수의 개수 N이 주어진다. N은 100이하이다. 다음으로 N개의 수가 주어지는데 수는 1,000 이하��

kplee.tistory.com

해당 알고리즘 응용하여 작성

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
using System;
using System.Text;
 
class Program
{
    static void Main(string[] args)
    {
        StringBuilder sResult = new StringBuilder();
        for(;;)
        {
            int n = int.Parse(Console.ReadLine());
            if(n==0break;
            bool bPrime = true;
            int iCount = 0;
            for(int i = n+1; i <= 2*n; i++)
            {
                bPrime = true;
                int j = 2;
                do
                {
                    if((i==1 || i%j==0)&& i!=j)
                    {
                        bPrime = false;
                        break;
                    }
                    j++;
                }while(j <= Math.Sqrt(i));
                if(bPrime) iCount++;
            }
            sResult.Append(iCount + "\n");
        }
        Console.WriteLine(sResult);
    }
}
cs

 

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

 

4948번: 베르트랑 공준

문제 베르트랑 공준은 임의의 자연수 n에 대하여, n보다 크고, 2n보다 작거나 같은 소수는 적어도 하나 존재한다는 내용을 담고 있다. 이 명제는 조제프 베르트랑이 1845년에 추측했고, 파프누티 ��

www.acmicpc.net

 

문제

M이상 N이하의 소수를 모두 출력하는 프로그램을 작성하시오.

입력

첫째 줄에 자연수 M과 N이 빈 칸을 사이에 두고 주어진다. (1 ≤ M ≤ N ≤ 1,000,000) M이상 N이하의 소수가 하나 이상 있는 입력만 주어진다.

출력

한 줄에 하나씩, 증가하는 순서대로 소수를 출력한다.

 

두 가지 방법으로 풀어보았다.

 

첫 번째는 

https://kplee.tistory.com/58

 

백준 문제 번호 : 1978 - 소수찾기

문제 주어진 수 N개 중에서 소수가 몇 개인지 찾아서 출력하는 프로그램을 작성하시오. 입력 첫 줄에 수의 개수 N이 주어진다. N은 100이하이다. 다음으로 N개의 수가 주어지는데 수는 1,000 이하��

kplee.tistory.com

여기서 푼 방법을 이용하여 알고리즘을 작성함.

 

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
using System;
using System.Linq;
 
class Program
{
    static void Main(string[] args)
    {
        int[] arrNum = Console.ReadLine().Split().Select(a => int.Parse(a)).ToArray();
        
        bool bSosu = true;
        for(int i = arrNum[0]; i <= arrNum[1]; i++)
        {
            bSosu = true;
            int j = 2;
            do
            {
                if((i==1 || i % j == 0&& i != j)
                {
                    bSosu = false;
                    break;
                }
                j++;
            }
            while(j <= Math.Sqrt(i));
            if(bSosu)
            {
                Console.WriteLine(i);
            }
        }
    }
}
cs

위의 방법을 사용했을때 메모리와 시간이다.

 

두 번째는 에라토스테네스의 체를 이용한 방식이다.

문제 하단에 알고리즘 분류에 에라토스테네스의 체가 적혀있어서 관련 내용을 찾아보고 그 방식을 이용하여 알고리즘을 작성함.

 

에라토스테네스의 체가 어떤건지는 구글에 검색하면 자세히 나온다.

 

 

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
using System;
using System.Linq;
 
class Program
{
    static void Main(string[] args)
    {
        int[] arrNum = Console.ReadLine().Split().Select(a => int.Parse(a)).ToArray();
        bool[] bSosu = Enumerable.Repeat(true, arrNum[1+ 1).ToArray();
        bSosu[1= false;
        
        for(int i = 2; i <= Math.Sqrt(arrNum[1]); i++)
        {
            if(bSosu[i])
            {
                for(int j = i*i; j <= arrNum[1]; j += i)
                {
                    bSosu[j] = false;
                }
            }
        }
        
        for(int i = arrNum[0]; i <= arrNum[1]; i++)
        {
            if(bSosu[i])
            {
                Console.WriteLine(i);
            }
        }
    }
}
cs

두 번째 방법을 사용했을때 사용되는 메모리와 시간이다. bool 배열 때문에 메모리의 사용량은 더 많지만 시간은 더 적게 걸린다.

+ Recent posts