코딩테스트

코딩 테스트 : 25206 너의 평점은, 2566번 최댓값, 2738 행렬 덧셈

Cadi 2025. 1. 17. 20:09

코딩테스트 :  25206 너의 평점은

문제

인하대학교 컴퓨터공학과를 졸업하기 위해서는, 전공평점이 3.3 이상이거나 졸업고사를 통과해야 한다. 그런데 아뿔싸, 치훈이는 깜빡하고 졸업고사를 응시하지 않았다는 사실을 깨달았다!

치훈이의 전공평점을 계산해주는 프로그램을 작성해보자.

전공평점은 전공과목별 (학점 × 과목평점)의 합을 학점의 총합으로 나눈 값이다.

인하대학교 컴퓨터공학과의 등급에 따른 과목평점은 다음 표와 같다.

A+ 4.5
A0 4.0
B+ 3.5
B0 3.0
C+ 2.5
C0 2.0
D+ 1.5
D0 1.0
F 0.0

P/F 과목의 경우 등급이 P또는 F로 표시되는데, 등급이 P인 과목은 계산에서 제외해야 한다.

과연 치훈이는 무사히 졸업할 수 있을까?

입력

20줄에 걸쳐 치훈이가 수강한 전공과목의 과목명, 학점, 등급이 공백으로 구분되어 주어진다.

출력

치훈이의 전공평점을 출력한다.

정답과의 절대오차 또는 상대오차가 10−4 이하이면 정답으로 인정한다.

제한

  • 1 ≤ 과목명의 길이 ≤ 50
  • 과목명은 알파벳 대소문자 또는 숫자로만 이루어져 있으며, 띄어쓰기 없이 주어진다. 입력으로 주어지는 모든 과목명은 서로 다르다.
  • 학점은 1.0,2.0,3.0,4.0중 하나이다.
  • 등급은 A+,A0,B+,B0,C+,C0,D+,D0,F,P중 하나이다.
  • 적어도 한 과목은 등급이 P가 아님이 보장된다.
namespace ConsoleApp1
{
    public class Program
    {
        public static void Main()
        {
            double Aggregate = 0;
            float num = 0;
            Dictionary<String, double> dict = new Dictionary<String, double>();
            dict.Add("A+", 4.5);
            dict.Add("A0",4.0);
            dict.Add("B+", 3.5);
            dict.Add("B0", 3.0);
            dict.Add("C+", 2.5);
            dict.Add("C0", 2.0);
            dict.Add("D+", 1.5);
            dict.Add("D0", 1.0);
            dict.Add("F", 0);
            
            for (int i = 0; i < 20; i++)
            {
                var a = Console.ReadLine();
                string[] s = a.Split(' ');
                // 지금까지 s0은 과목 명 , s1은 배수, S2는 학점(알파벳)
                if (s[2] == "P")
                { 
                }
                if (dict.ContainsKey(s[2]))
                {
                    float c = float.Parse(s[1]);
                    Aggregate +=  dict[s[2]]* c;
                    num += c;
                }
            }
            Console.WriteLine(Aggregate/num);
        }
    }
}

처음에 문제를 살짝 잘못 이해해서 평균 학점이 10이 넘게 나오길래 당황하고 문제 다시 읽고 풀었다.

 

다른 사람의 흥미로운 풀이

A,B,C 를 조금 더 편하게 넣을 방법을 찾아봤는데 Add 안쓰고  {}로 쓰는 방법도 있구나.. 하고 알았다. 

 

 

 

코딩테스트 :  2738 행렬 덧셈

문제

N*M크기의 두 행렬 A와 B가 주어졌을 때, 두 행렬을 더하는 프로그램을 작성하시오.

입력

첫째 줄에 행렬의 크기 N 과 M이 주어진다. 둘째 줄부터 N개의 줄에 행렬 A의 원소 M개가 차례대로 주어진다. 이어서 N개의 줄에 행렬 B의 원소 M개가 차례대로 주어진다. N과 M은 100보다 작거나 같고, 행렬의 원소는 절댓값이 100보다 작거나 같은 정수이다.

출력

첫째 줄부터 N개의 줄에 행렬 A와 B를 더한 행렬을 출력한다. 행렬의 각 원소는 공백으로 구분한다.

namespace ConsoleApp1
{
    public class Program
    {
        public static void Main()
        {
            string[] s = Console.ReadLine().Split(' ');
            
            int x = int.Parse(s[0]);
            int y = int.Parse(s[1]);
            int[,] arr = new int[x,y];
            
            for (int i = 0; i < x; i++)
            {
                string a = Console.ReadLine();
                string[] b = a.Split(' ');
                for (int j = 0; j < y; j++)
                {
                    arr[i, j] = int.Parse(b[j]);
                }
            }
            for (int i = 0; i < x; i++)
            {
                string a = Console.ReadLine();
                string[] b = a.Split(' ');
                for (int j = 0; j < y; j++)
                {
                    arr[i, j] += int.Parse(b[j]);
                }
            }
            for (int i = 0; i < x; i++)
            {
                for (int j = 0; j < y; j++)
                {
                    Console.Write(arr[i, j] + " ");
                }
                Console.WriteLine();
            }
        }
    }
}

 

처음에 X,Y를  혼동해서 사용해서 Out of Index가 나왔었다. 

X 는 row고, Y가 column이다 ! 한 다섯 번째 혼동하고 있는 듯...

다른 사람의 흥미로운 풀이

린큐로 간편하게 라인 하나하나를 읽어서 배열의 리스트 (List<int[]>) 로 저장해서 더하는 방법도 있었다. 

 

 

 

코딩테스트 : 2566번 최댓값

<그림 1>과 같이 9×9 격자판에 쓰여진 81개의 자연수 또는 0이 주어질 때, 이들 중 최댓값을 찾고 그 최댓값이 몇 행 몇 열에 위치한 수인지 구하는 프로그램을 작성하시오.

예를 들어, 다음과 같이 81개의 수가 주어지면

 1열2열3열4열5열6열7열8열9열1행2행3행4행5행6행7행8행9행
3 23 85 34 17 74 25 52 65
10 7 39 42 88 52 14 72 63
87 42 18 78 53 45 18 84 53
34 28 64 85 12 16 75 36 55
21 77 45 35 28 75 90 76 1
25 87 65 15 28 11 37 28 74
65 27 75 41 7 89 78 64 39
47 47 70 45 23 65 3 41 44
87 13 82 38 31 12 29 29 80

이들 중 최댓값은 90이고, 이 값은 5행 7열에 위치한다.

입력

첫째 줄부터 아홉 번째 줄까지 한 줄에 아홉 개씩 수가 주어진다. 주어지는 수는 100보다 작은 자연수 또는 0이다.

출력

첫째 줄에 최댓값을 출력하고, 둘째 줄에 최댓값이 위치한 행 번호와 열 번호를 빈칸을 사이에 두고 차례로 출력한다. 최댓값이 두 개 이상인 경우 그 중 한 곳의 위치를 출력한다.

namespace ConsoleApp1
{
    public class Program
    {
        public static void Main()
        {
          int[,] array = new int[9, 9];
          int max = int.MinValue;
          int[] count = new int[2];
          

          for (int i = 0; i < array.GetLength(0); i++)
          {
              string[] s = Console.ReadLine().Split(' ');
              for (int j = 0; j < array.GetLength(1); j++)
              {
                  array[i, j] = int.Parse(s[j]);
                  if (array[i, j] > max)
                  {
                      max = array[i, j];
                      count[0] = i+1;
                      count[1] = j+1;
                  }
              }
          }
          Console.WriteLine(max);
          Console.WriteLine(count[0] + " " + count[1]);
        }
    }
}

 

보니까 중등...고등학교 정보 올림피아드 '1번' 문제..ㅎ