코딩테스트

9063번 대지, 5073번 삼각형과 세 변, 14215번 세 막대, 10101번 삼각형 외우기

Cadi 2025. 1. 24. 13:11

코딩테스트 : 9063번 대지

문제

 임씨는 1950 년 한국전쟁으로 많은 손해를 본 사람들 중 하나다. 전쟁 통에 손해보지 않은 사람이 어디 있을까 만은 그는 6.25 가 일어나기 전만 해도 충청도 지방에 넓은 대지를 소유한 큰 부자였다. 전쟁이 나자 임씨는 땅문서와 값 나가는 것들만 챙겨서 일본으로 피난을 가지만 피난 중에 그만 땅문서를 잃어버리고 만다. 전쟁이 끝난 후에 임씨의 땅은 이미 다른 사람들의 논밭이 되어 있었고, 임씨는 땅을 되찾으려 했지만 문서가 없으니 생떼 쓰는 것과 다를 바 없었다. 이러다가 임씨는 길바닥에 나앉게 생겼다.

이때, 임씨에게 좋은 생각이 떠올랐으니 바로 자신이 습관처럼 땅 깊숙이 뭔가 표식을 해놓았던 사실이다. 임씨는 한적할 때마다 자신의 논밭을 거닐다가 땅속 깊은 곳에 자신의 이름이 씌어진 옥구슬을 묻어놓았던 것이다. 즉, 어떤 지점에서 그의 이름이 적힌 옥구슬이 나온다면 그 지점은 예전에 임씨의 땅이었다는 것을 증명하는 것이다.

임씨는 즉시 민사소송을 통해 자신의 땅을 찾고자 했고 논리적인 근거를 들어 옥구슬이 나오는 지점이 원래 자신의 땅의 한 지점이었다는 것을 주장하여 결국 담당판사를 설득하는 데에 성공하였다. 담당판사는 다음과 같은 판결을 내렸다. “ 6.25 이전의 개인소유 대지들은 99%가 남북, 동서 방향으로 평행한 직사각형 모양이었으므로, 임씨의 이름이 새겨진 옥구슬이 나오는 모든 지점을 포함하는 가장 작은 남북, 동서 방향으로 평행한 변을 갖는 직사각형의 대지를 임씨의 소유로 인정한다.” 임씨는 많은 손해를 보는 셈이지만 더 이상을 요구할 만한 근거가 없었기 때문에 이 판결을 따르기로 했다.

임씨의 이름이 새겨진 옥구슬의 위치 N 개가 주어질 때에, 임씨에게 돌아갈 대지의 넓이를 계산하는 프로그램을 작성하시오. 단, 옥구슬의 위치는 2 차원 정수 좌표로 주어지고 옥구슬은 같은 위치에 여러 개가 발견될 수도 있으며, x 축의 양의방향을 동쪽, y 축의 양의방향을 북쪽이라고 가정한다. 

예를 들어 위와 같이 (2, 1), (3, 2), (5, 2), (3, 4) 네 점에서 옥구슬을 발견하였다면, 임씨에게 돌아갈 대지는 (2, 1), (5, 1), (2, 4), (5, 4)를 네 꼭짓점으로 하는 직사각형이며, 넓이는 (5 - 2) × (4 - 1) = 9 가 된다. 

입력

첫째 줄에는 점의 개수 N (1 ≤ N ≤ 100,000) 이 주어진다. 이어지는 N 줄에는 각 점의 좌표가 두 개의 정수로 한 줄에 하나씩 주어진다. 각각의 좌표는 -10,000 이상 10,000 이하의 정수이다. 

출력

첫째 줄에 N 개의 점을 둘러싸는 최소 크기의 직사각형의 넓이를 출력하시오. 

public class Program
{
    public static void Main()
    {
        int minX = Int32.MaxValue;
        int minY = Int32.MaxValue;

        int maxX = Int32.MinValue;
        int maxY = Int32.MinValue;


        int s = Int32.Parse(Console.ReadLine());


        for (int i = 0; i < s; i++)
        {
            int[] number = Console.ReadLine().Split(" ").Select(int.Parse).ToArray();

            minX = Math.Min(minX, number[0]);
            minY = Math.Min(minY, number[1]);

            maxX = Math.Max(maxX, number[0]);
            maxY = Math.Max(maxY, number[1]);
        }
        
        int a = maxX - minX;
        int b = maxY - minY;

        Console.WriteLine(a * b);
    }
}

 

코딩테스트 : 10101번 삼각형 외우기 

문제

창영이는 삼각형의 종류를 잘 구분하지 못한다. 따라서 프로그램을 이용해 이를 외우려고 한다.

삼각형의 세 각을 입력받은 다음,

  • 세 각의 크기가 모두 60이면, Equilateral
  • 세 각의 합이 180이고, 두 각이 같은 경우에는 Isosceles
  • 세 각의 합이 180이고, 같은 각이 없는 경우에는 Scalene
  • 세 각의 합이 180이 아닌 경우에는 Error

를 출력하는 프로그램을 작성하시오.

입력

총 3개의 줄에 걸쳐 삼각형의 각의 크기가 주어진다. 모든 정수는 0보다 크고, 180보다 작다.

출력

문제의 설명에 따라 Equilateral, Isosceles, Scalene, Error 중 하나를 출력한다.

using System;
using System.Linq;
public class Program
{
    public static void Main()
    {
        int[] numbers = new int[3];

        for (int i = 0; i < numbers.Length; i++)
        {
            numbers[i] = int.Parse(Console.ReadLine());
        }

        if (numbers[0] + numbers[1] + numbers[2] == 180)
        {
            if (numbers[0] == numbers[1] && numbers[1] == numbers[2])
            {
                Console.WriteLine("Equilateral");
            }
            else if (numbers[0] == numbers[1] || numbers[1] == numbers[2] || numbers[2] == numbers[0])
            {
                Console.WriteLine("Isosceles");
            }
            else
            {
                Console.WriteLine("Scalene");
            }
        }
        else
        {
            Console.WriteLine("Error");
        }
        
    }
}

다른 사람의 흥미로운 풀이

 

rmsid numbers[0] 같은 것을 a로 치환해서 했으면  조금 더 깔끔하고 편했을듯 하다.

 

코딩테스트 : 5073번 삼각형과 세 변

문제

삼각형의 세 변의 길이가 주어질 때 변의 길이에 따라 다음과 같이 정의한다.

  • Equilateral :  세 변의 길이가 모두 같은 경우
  • Isosceles : 두 변의 길이만 같은 경우
  • Scalene : 세 변의 길이가 모두 다른 경우

단 주어진 세 변의 길이가 삼각형의 조건을 만족하지 못하는 경우에는 "Invalid" 를 출력한다. 예를 들어 6, 3, 2가 이 경우에 해당한다. 가장 긴 변의 길이보다 나머지 두 변의 길이의 합이 길지 않으면 삼각형의 조건을 만족하지 못한다.

세 변의 길이가 주어질 때 위 정의에 따른 결과를 출력하시오.

입력

각 줄에는 1,000을 넘지 않는 양의 정수 3개가 입력된다. 마지막 줄은 0 0 0이며 이 줄은 계산하지 않는다.

출력

각 입력에 맞는 결과 (Equilateral, Isosceles, Scalene, Invalid) 를 출력하시오.

using System;
using System.Linq;
public class Program
{
    public static void Main()
    {
        while (true)
        {
            int[] numbers = Console.ReadLine().Split().Select(int.Parse).ToArray();

            int a = numbers[0];
            int b = numbers[1];
            int c = numbers[2];
            if (a == 0 && b == 0 && c == 0)
            {
                break;
            }
            int maxNum = int.MinValue;
            int count = 0;

            for (int i = 0; i < numbers.Length; i++)
            {
                if (numbers[i] > maxNum)
                {
                    maxNum = numbers[i];
                    count = i;
                }
            }

            if (numbers.Sum() - numbers[count] > numbers[count])
            {
                if (a == b && b == c)
                {
                    Console.WriteLine("Equilateral");
                }
                else if( a == b || a == c || c == b)
                {
                    Console.WriteLine("Isosceles");
                }
                else
                {
                    Console.WriteLine("Scalene");
                }
            }
            else
            {
                Console.WriteLine("Invalid");
            }

        }
    }
}

 

조건을 좀 원시적으로 검사하는 것 같긴 한데... 흠... 

다른 사람의 흥미로운 풀이

 

Array.Distinct() 라는 '중복값 제거'의 기능을 하는 함수가 있다.

이 기능을 활용해서 중복 값들을 모두 제거하고, array 안에 들어있는 숫자들의 수로 판단하고,

Console.WriteLine도 여러번 사용할 필요 없이 한 번만 저장해서 마지막에 출력해주면 된다. 

 

 

코딩테스트 : 14215번 세 막대

문제

영선이는 길이가 a, b, c인 세 막대를 가지고 있고, 각 막대의 길이를 마음대로 줄일 수 있다.

영선이는 세 막대를 이용해서 아래 조건을 만족하는 삼각형을 만들려고 한다.

  • 각 막대의 길이는 양의 정수이다
  • 세 막대를 이용해서 넓이가 양수인 삼각형을 만들 수 있어야 한다.
  • 삼각형의 둘레를 최대로 해야 한다.

a, b, c가 주어졌을 때, 만들 수 있는 가장 큰 둘레를 구하는 프로그램을 작성하시오. 

입력

첫째 줄에 a, b, c (1 ≤ a, b, c ≤ 100)가 주어진다.

출력

첫째 줄에 만들 수 있는 가장 큰 삼각형의 둘레를 출력한다.

using System;
using System.Linq;
public class Program
{
    public static void Main()
    {
        string s = "";

        
            int[] numbers = Console.ReadLine().Split().Select(int.Parse).ToArray();

            int a = numbers[0];
            int b = numbers[1];
            int c = numbers[2];
            int max = int.MinValue;
            int count = 0;


            for (int i = 0; i < numbers.Length; i++)
            {
                if (numbers[i] > max)
                {
                    max = numbers[i];
                    count = i;
                }
            }

            if (numbers.Sum() - numbers[count] > numbers[count])
            {
                s = numbers.Sum().ToString();
            }
            else
            {
                s = ((numbers.Sum() - numbers[count]) * 2 - 1).ToString();
            }
        Console.WriteLine(s);
        
    }
}

다른 사람의 흥미로운 풀이

 

애초에 배열에 숫자를 넣을 때 , orderbyDescending으로 편하게 넣는다면 계산이 훨씬 편리해진다.

오늘 간단한 꼼수.. ? 들을 많이 배운 것 같다. 

 

 


너무 쉬운 문제들 (브론즈 문제들) 만 계속해서 나오는 것 같아서 일단은 난이도별로 실버 문제들도 중간중간 풀어볼 생각이다. 그리고 멋사측에서 제공해준 기본 자료구조 & 알고리즘 강의도 들으면서 기초를 좀 더 쌓아야겠다. 
취업 준비까지는 장기전이니 천천히 그리고 꾸준히 !