Unity 개발 일지

[내일배움캠프] 배치고사 자가 피드백

ohty20012 2025. 4. 24. 19:48
  • 문제
  • 출제 의도 분석
  • 제출한 정답
  • 문제에 대한 피드백
더보기

정수형 배열을 입력받아 배열의 모든 요소의 합을 출력하는 함수를 완성해주세요.

class Program
{
    static int Sum(int[] arr)
    {
        // TODO : 배열의 모든 요소의 합을 계산하는 코드 작성

        //////////////////////////////////////////
    }

    static void Main(string[] args)
    {
        int[] ints = { 3, 6, 7, 9 };
        Console.WriteLine(Sum(ints));
    }
}

 

● 출제 의도 분석

  1. 배열과 반복문을 이해하고 있는가
  2. 메서드의 구조와 반환값 처리에 대해 이해하고 있는가

● 제출한 정답

class Program
{
    static int Sum(int[] arr)
    {
        int sum = 0;
        for (int i = 0; i < arr.Length; i++)
        {
            sum += arr[i];
        }
        return sum;
    }

    static void Main(string[] args)
    {
        int[] ints = { 3, 6, 7, 9 };
        Console.WriteLine(Sum(ints));
    }
}

 

● 자가 피드백

  • x
더보기

다음 결과를 출력하도록 아래 밑줄 친 곳들의 코드를 완성하시오.

class Program
{
    private static void Add(                      )
    {
        result += i;
    }

    static void Main(string[] args)
    {
        int total = 10;
        Console.WriteLine(total);
        Add(200,          );
        Console.WriteLine(total);
    }
}

● 출제 의도 분석

  1. 값 타입과 참조 타입의 차이를 이해하고 있는가

● 제출한 정답

class Program
{
    private static void Add(int i, ref int result)
    {
        result += i;
    }

    static void Main(string[] args)
    {
        int total = 10;
        Console.WriteLine(total);
        Add(200, ref total);
        Console.WriteLine(total);
    }
}

 

● 자가 피드백

  • ref, out, in 3가지 키워드의 결과와 차이에 대해 정확하게 이해하기
더보기

다음 코드에서는 오류가 발생합니다. 잘못된 것은 무엇인지 설명해보시오.

class Square
{
    float width;
    float height;

    float Area() { return width * height; }
}

class Program
{
    static void Main(string[] args)
    {
        Square box = new Square();
        Console.WriteLine(box.Area());
    }
}

 

● 출제 의도 분석

  1. 접근 제한자에 대해 이해하고 있는가
  2. 캡슐화에 대해 이해하고 있는가

● 제출한 정답

  • Area()의 접근 제어자가 private라서 Main 메서드에서 접근 불가

● 자가 피드백

  • 왜 Area()가 private이 됐는지 설명이 부족 → Area() 메서드에 접근 제어자를 명시하지 않아 기본적으로 private이 됨
  • 해결 방법 제안 → Area() 메서드에 접근 제어자 public을 추가한다.
더보기

다음 코드의 출력 결과를 작성하고, x의 값이 순서대로 어떻게 변화하는지 작성해주세요.

class Program
{
    static void Main(string[] args)
    {
        int x = 2;
        int y = 3;

        x += x * ++y;

        Console.WriteLine(x++);
    }
}

 

● 출제 의도 분석

  1. 전위 / 후위 연산자의 차이점을 이해하고 있는가
  2. 연산자들의 계산 순서를 이해하고 있는가

● 제출한 정답

  • 10
  • 2 → 10 → 11

● 자가 피드백

  • x
더보기

계속해서 정수를 입력받아 홀수인지 짝수인지 구분해주는 프로그램을 작성해보세요.

정수가 아닌 데이터를 입력받으면 프로그램이 종료되도록 만들어보세요.

class Program
{
    static void Main(string[] args)
    {
        while (true)
        {
            Console.WriteLine("숫자를 입력하세요.");
            string answer = Console.ReadLine();

            bool isSuccess = int.TryParse(answer, out int result);

            // TODO : 입력받은 정수가 홀수인지 짝수인지 구분하는 코드 작성하기

            ///////////////////////////////////////////////////
        }
    }
}

 

● 출제 의도 분석

  1. 반복문과 조건문을 활용하여 루프를 구성할 수 있는가
  2. TryParse() 메서드를 이용하여 입력값의 유효성을 검증할 수 있는가
  3. 프로그램 종료 조건을 명확히 구현할 수 있는가

● 제출한 정답

class Program
{
    static void Main(string[] args)
    {
        while (true)
        {
            Console.WriteLine("숫자를 입력하세요.");
            string answer = Console.ReadLine();

            bool isSuccess = int.TryParse(answer, out int result);

            if (!isSuccess) {
                Console.WriteLine("");
                break;
            }
            else
            {
                Console.WriteLine(result%2 == 0 ? "짝수입니다" : "홀수입니다");
            }
        }
    }
}

 

● 자가 피드백

  • 입력값의 유효성 검증이 출제 의도라는 점에서, 입력된 정수가 허용된 범위 내에 있는지도 함께 검증하는 것이 더 적절하다고 생각된다.
더보기

다음의 코드가 아래의 결과를 출력할 수 있도록

밑줄 부분을 채워 코드를 완성해주세요.

class Program
{
    static void Main(string[] args)
    {
        int[] intArr = { 4, 7, 2, 5, 6, 8, 3 };

        ___________________

        foreach(int i in intArr)
            Console.Write(i + " ");
    }
}

 

● 출제 의도 분석

  1. 배열의 정렬을 수행할 수 있는가
  2. 배열 내부의 데이터를 조작하고 출력할 수 있는가

● 제출한 정답

class Program
{
    static void Main(string[] args)
    {
        int[] intArr = { 4, 7, 2, 5, 6, 8, 3 };

        for (int i = 0; i < intArr.Length; i++)
        {
            for (int j = i + 1; j < intArr.Length; j++)
            {
                if (intArr[i] > intArr[j])
                {
                    int temp = intArr[j];
                    intArr[j] = intArr[i];
                    intArr[i] = temp;
                }
            }
        }

        foreach(int i in intArr)
            Console.Write(i + " ");
    }
}

 

● 자가 피드백

  • 정렬을 간단하게 구현했기 때문에 최적화 측면에서 부족 → 퀵정렬같은 고급 알고리즘으로 정렬을 구현하는게 적절하다.
더보기

다음 코드의 출력 결과를 작성하고, 왜 그렇게 되는지 이유를 설명해주세요.

class Program
{
    public class Unit
    {
        public virtual void Move()
        {
            Console.WriteLine("두발로 걷기");
        }

        public void Attack()
        {
            Console.WriteLine("Unit 공격");
        }
    }

    public class Marine : Unit
    {

    }

    public class Zergling : Unit
    {
        public override void Move()
        {
            Console.WriteLine("네발로 걷기");
        }
    }

    static void Main(string[] args)
    {
        Zergling zerg = new Zergling();
        zerg.Move();
    }
}

 

● 출제 의도 분석

  1. 가상 메서드(virtual)와 재정의(override) 개념을 이해하고 있는가
  2. 상속 구조에서 메서드 호출이 어떻게 결정되는지 이해하고 있는가

● 제출한 정답

  • 출력 결과 : 네발로 걷기
  • 이유 : Zergling 클래스가 Unit 클래스를 상속받아서 Move() 메서드를 오버라이드 했기 때문에

● 자가 피드백

  • C#의 다형성 개념으로 컴파일 타임과 런타임에 대해서 추가하면 답변이 더욱 풍성해질 수 있다.
  • [답변 예시]
    • Unit.Move() 메서드가 virtual로 선언되어 있고, Zergling 클래스가 이를 override했기 때문이다.
      C#의 다형성에서는 메서드 호출이 런타임에 객체의 실제 타입에 따라 결정되는 동적 바인딩이 이루어진다.
      반면 일반 메서드는 컴파일 타임에 변수의 선언 타입에 따라 호출 메서드가 결정되는 정적 바인딩이 적용된다.
더보기

그림과 같은 트리가 있습니다.

이 트리를 깊이우선탐색(DFS, Depth-First Search)으로 검색했을 때의 방문하는 순서와

너비우선탐색(BFS, Breadth-First Search)으로 검색했을 때 방문하는 순서를 적어주세요.

● 출제 의도 분석

  • 그래프 탐색 알고리즘을 이해하고 있는가
  • 자료구조에 알고리즘을 적용할 수 있는가

● 제출한 정답

  • 깊이 우선 탐색 : 3 → 6 → 9 → 6 → 3 → 7 → 3 → 1 → 4 → 8 → 4 → 1 → 2 → 1 → 5
  • 너비 우선 탐색 : 1 → 2 → 3 → 4 → 5 → 6 → 7 → 8 → 9

● 자가 피드백

  • 그래프 탐색 알고리즘에 대한 공부가 부족하다.
  • 각 노드는 한번만 방문.
더보기

다음 코드의 출력 결과를 작성하고, 왜 그렇게 되는지 이유를 설명해주세요.

using System.Collections.Generic;

class Program
{
    static void Main(string[] args)
    {
        Stack<int> stack = new Stack<int>();

        stack.Push(1);
        stack.Push(2);
        stack.Push(3);
        stack.Pop();
        Console.WriteLine(stack.Pop());
        stack.Push(4);
        stack.Push(5);

        while (stack.Count > 0)
            Console.WriteLine(stack.Pop());
    }
}

 

● 출제 의도 분석

  • 자료구조 Stack에 대해 이해하고 있는가
  • Push()와 Pop()이 일어날 때, 스택의 상태를 추적할 수 있는가

● 제출한 정답

  • 출력 : 2 5 4 1
  • 이유 : 스택에 1 2 3 존재 → 3 pop → 2 pop 후 출력 (스택에 1 존재) → 스택에 4 5 push (스택에 1 4 5 존재)→ top부터 하나씪 pop → 5 4 1 출력

● 자가 피드백

  • 문장의 가독성이 낮다. 한 문장씩 끊어서 구조화 하는 것이 가독성에 도움이 됨.
  • [답변예시]
    1. 스택에 1, 2, 3 순으로 push → 스택 : [1, 2, 3]
    2. 3이 pop → 스택 : [1, 2]
    3. 2가 pop 되어 출력 → 스택 : [1]
    4. 4, 5 가 차례로 push → 스택 : [1, 4, 5]
    5. while 루프에서 top 부터 pop 되어 출력 → 출력 : 5, 4, 1
  • Stack의 특징에 대한 설명 부족하다.
    • LIFO 방식에 대한 설명을 추가
더보기

유저의 숫자 입력을 받아오고 이것을 오름차순으로 정렬시키는 알고리즘을 직접 구현하세요.

(기본 제공 함수(닷넷 API) 사용 금지)

 

● 출제 의도 분석

  • 정렬 알고리즘의 구조에 대해 이해하고 있는가
  • 구현력과 흐름 설계 능력이 충분한가

● 제출한 정답

class Program
{
    static List<float> Sort(List<float> nums)
    {
        for (int i = 0; i < nums.Count; i++)
        {
            for (int j = i + 1; j < nums.Count; j++)
            {
                if (nums[i] > nums[j])
                {
                    float temp = nums[j];
                    nums[j] = nums[i];
                    nums[i] = temp;
                }
            }
        }

        return nums;
    }

    static void Main(string[] args)
    {
        List<float> nums = [];

        Console.WriteLine("숫자를 하나씩 입력해주세요. 숫자가 아닌 문자가 입력되면 종료됩니다.");

        while(true)
        {            
            string answer = Console.ReadLine();

            bool isSuccess = float.TryParse(answer, out float result);

            if (!isSuccess) {
                Console.WriteLine("");
                break;
            }
            else
            {
                nums.Add(result);
            }
        }

        foreach (float n in Sort(nums))
            Console.Write($"{n} ");
    }
}

 

● 자가 피드백

  • List 대신 Array로 구현하는게 '기본 제공 함수 사용 금지' 의도에 더욱 적절하다.
  • 상황에 따라 버블정렬은 적용이 어려울 수 있기 때문에 고급 정렬 알고리즘 구현을 익히는 것이 중요하다.

'Unity 개발 일지' 카테고리의 다른 글

Unity 조사하기  (0) 2025.03.18
Unity 트랙을 신청한 이유  (0) 2025.03.17