C# 코딩 문제풀이

용준·2023년 8월 4일

Study

목록 보기
2/22

직사각형 별찍기

문제: 두 개의 정수 n과 m이 주어집니다.
별(*)을 이용해 가로의 길이가 n, 세로의 길이가 m인 직사각형 형태를 출력해보세요.

using System;
namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            string[] s = Console.ReadLine().Split();
            int n = int.Parse(s[0]);
            int m = int.Parse(s[1]);
            for (int i=0; i<m; i++)
            {
                for(int j=0; j<n; j++)
                {
                    Console.Write("*");
                }
                Console.WriteLine();
            }
        }
    }
}

  • 결과는 위와 같이 작동합니다.

x만큼 간격이 있는 n개의 숫자

문제: 함수 'solution'은 정수 x와 자연수 n을 입력 받아,
x부터 시작해 x씩 증가하는 숫자를 n개 지니는 리스트를 리턴해야 합니다.
다음 제한 조건을 보고, 조건을 만족하는 함수 'solution'을 완성해주세요.
(조건1) x는 -10000000 이상, 10000000 이하인 정수입니다.
(조건2) n은 1000 이하인 자연수입니다.

public class Solution
{
    public long[] solution(int x, int n)
    {
        long[] answer = new long[n];
        for (int i = 0; i < n; i++)
        {
            answer[i] = (long)x * (i + 1);
        }
        return answer;
    }
}

  • 정수값 허용 범위가 초과되는 경우가 있어 long 형변환을 해야합니다.

더하기 사이클

using System;
namespace ConsoleApp1
{
    class Program   
    {
        static void Main(string[] args)
        {
            int input = int.Parse(Console.ReadLine());
            int start = input; //초기값
            int count = 0;
            while (true)
            {
                int a = input / 10; //앞자리
                int b = input % 10; //뒷자리
                input = (a * 10) + (a + b) % 10; //재결합
                count++;
                if (input == start)
                {
                    break;
                }
            }
            Console.WriteLine(count);
        }
    }
}

킹, 퀸, 룩, 비숍, 나이트, 폰

using System;
namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            int[] full = { 1, 1, 2, 2, 2, 8 }; //체스판 원본
            string[] get = Console.ReadLine().Split(); //얻은 체스말
            for (int i = 0; i < full.Length; i++)
            {
                full[i] -= int.Parse(get[i]); //체스판 원본에서 얻은 체스말
            }
            for (int i = 0; i < full.Length; i++)
            {
                Console.Write(full[i] + " ");
            }
        }
    }
}
  • 아래는 배열 형변환을 이용한 방법입니다. (참조)
using System;
namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            int[] full = { 1, 1, 2, 2, 2, 8 }; //체스판 원본
            string[] get = Console.ReadLine().Split(); //얻은 체스말
            int[] getParse = Array.ConvertAll(get, int.Parse); //배열을 미리 형변환해서 새로 만듦
            for (int i = 0; i < full.Length; i++)
            {
                full[i] -= getParse[i]; //체스판 원본에서 얻은 체스말
            }
            for (int i = 0; i < full.Length; i++)
            {
                Console.Write(full[i] + " ");
            }
        }
    }
}

정보처리기능사 시험문제 일부

알아야 하는 것:
return true는 함수를 진행시킵니다.
return false는 함수를 빠져나옵니다.
break는 반복문만 빠져나옵니다.

로직 이해하기:
(1) 정수 0, 1은 i보다 작기 때문에 걸러집니다.
(2) 정수 2는 허용합니다.
(3) 정수 3보다 큰 값 중, 짝수는 while문(n%i==0)에서 걸러집니다.
(4) 특정한 정수가 while문의 elif까지 문제없이 도달했을때 n이 i제곱보다 값이 크다면 i의 값을 1올리고 다시 반복합니다.

n에 5를 넣어봅시다.
i^2 4보다 크므로 break를 무시하고 i++을 실행, i는 3이되고 함수는 처음으로 돌아갑니다.
이후 elif에서 5<3*3 으로 break에 걸려 5는 while문을 성공적으로 빠져나오고 return true되어 res에 값이 추가됩니다.

이 규칙으로 20까지 실행보면 2, 3, 5, 7, 11, 13, 17, 19가 나옵니다.
이 코드는 소수를 구하는 함수이며 이 값들은 res+=i로 모두 합쳐집니다.
문제에서 요구하는 res의 값이 합인 77이 정답입니다.

코드는 대부분 규칙성을 가지고 있어 20까지 일일히 넣지 않더라도 2, 3, 5, 7 에서 대부분 알아차렸을 것 같습니다.


알아야 하는 것:
while은 0이 아닌 값이 들어오면 무한하게 반복됩니다.

로직 이해하기:
(1) while (n1 != n2)도 무한히 반복하지만 만약 두 값이 같아지면 정지하게 됩니다.
(2) n1이 크면 n1 - n2를 합니다.
(3) n2가 크면 n2 - n1을 합니다.
(4) 서로 값이 같아질 때까지 큰 값에서 작은 값을 빼다보면 n1 == n2가 되며 while문을 탈출합니다
(5) 그 때 n1의 값은 결과가 될 것입니다.

344 (n1) - 215 (n2) = 129 (n1)
215 (n2) - 129 (n1) = 86 (n2)
129 (n1) - 86 (n2) = 43 (n1)
86 (n2) - 43 (n1) = 43 (n2)

n1==n2의 값인 43이 정답입니다.


0개의 댓글