[25.05.07] TIL( 개인 프로젝트 회고 & 백준 1874번 )

설민우·2025년 5월 7일

내일배움캠프 - Unity

목록 보기
36/85

1. 프로젝트 설명

이번 프로젝트는 유니티 입문 프로젝트로서 zep과 비슷한 환경을 만들고 이와 미니 프로젝트를 연동하는 형식의 프로젝트 였습니다.

2. KPT 작성

Keep : 잘한점

  • 그래도 인터페이스나 추상,가상 클래스,함수 등을 이용하여 객채 지향 구조를 지키려는 노력을 꾸준히 했습니다. 특히 모든 곳에서 종료, 및 씬 이동 시점의 함수를 불러 오는 것이 아닌, 이벤트로 등록 해두고 Scene 스크립트에서 한번에 관리하는 방식을 이용해 코드 가독성을 높혔습니다.
  • 필수 과제에서 부터 도전 과제까지 모두 완료하였습니다.

Problem : 발생한 문제

총 3가지 문제가 발생했었습니다.

  • 탑다운 형식에서의 점프 구현 문제
  • 카메라 이동시 타일맵이 흐려지는 문제
  • 스크립터블 오브젝트 저장 문제

Try : 해결 방법 / 피드백

  • 탑다운 형식에서의 점프 문제는 스프라이트를 최상위 객체에 붙이는게 아니라, 하위 객채로 넣어서 실제로 피격, 충돌 연산은 다른곳에서 실행하고 점프 관련된 로직만 실행하도록 변경했습니다.
  • 타일맵이 흐려지는 문제는 URP 추가 후 픽셀 퍼펙트를 적용해 보완했습니다.
  • 스크립터블 오브젝트 저장 문제가 가장 심각했는데, 이는 스크립터블 오브젝트는 읽기 전용이라서 중간중간 저장하는 용도로 사용하기에는 무리가 있었습니다. 따라서 이를 Json + Adressable 을 이용하는 방식으로 선회하여 구현했습니다.

3. 느낀점

  • 역시나라고 해야할지 개인 프로젝트는 혼자서 진행하니까 기획 방향만 정해져 있으면 빠르게 진행할 수 있구나 싶었습니다.
  • 또 다른 한편으로는 그때 튜터님이 말해주신 프로젝트 중간에 새로운 기술을 배우려 하지 말고, 원하는 기술이 있으면 다 배운 후에 프로젝트에 적용하는 것이 좋다 라는 말을 절실하게 느꼈습니다. -> 이거 스크립터블 오브젝트 때문에 꼬박 하루를 날려서 정말 뼈저립니다..

백준 1874번

using System.Collections.Generic;
using System;
using System.Linq.Expressions;
using System.Text;
using System.Linq;
using System.Text;
class Program
{
    static void Main(string[] args)
    {
        //  push 할때는 반드시 오름차순을 지키도록 해야 한다
        // 임의의 수열 스택을 이용하여그 수열을 만들 수 있는지 없는지.
        // 있다면 어떤 순서로 Push pop을 해야하는지
        // 같은 정수가 두번나오는 일은 없다

        //-> 들어올것도 나갈것도 없는 시점에서 안맞으면 NO임
        // 1번만 수행하고, 반복하지 않고, 어차피 행동 과정을 출력해야 하므로, 완전탐색을 사용하면 될듯?

        int n = int.Parse(Console.ReadLine());
        int[] targetArr = new int[n];
        StringBuilder sb = new StringBuilder();
        Stack<int> stack = new Stack<int>();
        int number = 1;
        int targetCusor = 0;

        // 초기화
        for (int i = 0; i < n; i++)
            targetArr[i] = int.Parse(Console.ReadLine());



        // 모든 요소를 만족 할 수 있는지 체크, 안된다면 중도 탈출 후 NO 출력
        while(targetCusor < n)
        {

            // 1. 요소를 확인했다면 해당 요소에 도달할때까지 Stack에 넣기
            while (number <= n && number != targetArr[targetCusor])
            {
                stack.Push(number);
                sb.AppendLine("+");
                number++;
            }
            // 탈출했으면 일단 같은거 찾은거니까 + - 연산 둘다 들어가 줘야함
            // 커서가 n이 되기 전에 값이 일치한다면
            if (number <= n && number == targetArr[targetCusor])
            {
                sb.AppendLine("+");
                sb.AppendLine("-");
                number++;
                targetCusor++;
            }
            // 2. 이제 커서랑 같아졌으니까, 그 녀석은 탈출, 다음 좌표를 확인해야함.
            // 다음 올 녀석이 Peek 한 녀석과 같은가? 
            while (targetCusor < n && stack.Count > 0 && stack.Peek() == targetArr[targetCusor])
            {
                stack.Pop();
                sb.AppendLine("-");
                targetCusor++;
            }
            // 이제 NO가 나오는 부분을 체크.
            // 범위 조건 체크 후, 이미 스택이 비어있거나 peak 값이 확인값과 다르다면 더 이상 진행 불가
            if (targetCusor < n && number > n && (stack.Count == 0 || stack.Peek() != targetArr[targetCusor]))
            {
                Console.WriteLine("NO");
                return;
            }
        }
        Console.WriteLine(sb);
    }
}

  • 솔직히 말해서 설명이 이상하다고 생각 했습니다... 힌트랑 출력 사항 확인 안했으면 무슨 말인지 평생 몰랐을지도요
  • 처음에는 NO가 나오는 조건을 찾아 Break를 시키고 갈 생각이었는데 문제를 다시보니 한번만 찾는 과정이고, 또한 중간에 어차피 실행 기록을 스트링빌더에 저장해야 하므로 완전탐색을 이용해도 큰 문제가 없구나 싶었습니다.
  • 조건이 앞에 덕지덕지 붙어서 더러운것은 조금 거슬리지만 그래도 문제를 풀어낼 수 있었습니다. (조건 때문에 아웃오브인덱스 6번은 본 거 같습니다..)
  • 문제가 어떤 것인지만 이해 할 수 있다면 그렇게 어렵지 않게 풀어낼 수 있으리라 봅니다.
profile
클라이언트 개발자를 지망하고 있습니다.

0개의 댓글