이번 프로젝트는 유니티 입문 프로젝트로서 zep과 비슷한 환경을 만들고 이와 미니 프로젝트를 연동하는 형식의 프로젝트 였습니다.
- 그래도 인터페이스나 추상,가상 클래스,함수 등을 이용하여 객채 지향 구조를 지키려는 노력을 꾸준히 했습니다. 특히 모든 곳에서 종료, 및 씬 이동 시점의 함수를 불러 오는 것이 아닌, 이벤트로 등록 해두고 Scene 스크립트에서 한번에 관리하는 방식을 이용해 코드 가독성을 높혔습니다.
- 필수 과제에서 부터 도전 과제까지 모두 완료하였습니다.
총 3가지 문제가 발생했었습니다.
- 탑다운 형식에서의 점프 구현 문제
- 카메라 이동시 타일맵이 흐려지는 문제
- 스크립터블 오브젝트 저장 문제
- 탑다운 형식에서의 점프 문제는 스프라이트를 최상위 객체에 붙이는게 아니라, 하위 객채로 넣어서 실제로 피격, 충돌 연산은 다른곳에서 실행하고 점프 관련된 로직만 실행하도록 변경했습니다.
- 타일맵이 흐려지는 문제는 URP 추가 후 픽셀 퍼펙트를 적용해 보완했습니다.
- 스크립터블 오브젝트 저장 문제가 가장 심각했는데, 이는 스크립터블 오브젝트는 읽기 전용이라서 중간중간 저장하는 용도로 사용하기에는 무리가 있었습니다. 따라서 이를 Json + Adressable 을 이용하는 방식으로 선회하여 구현했습니다.
- 역시나라고 해야할지 개인 프로젝트는 혼자서 진행하니까 기획 방향만 정해져 있으면 빠르게 진행할 수 있구나 싶었습니다.
- 또 다른 한편으로는 그때 튜터님이 말해주신 프로젝트 중간에 새로운 기술을 배우려 하지 말고, 원하는 기술이 있으면 다 배운 후에 프로젝트에 적용하는 것이 좋다 라는 말을 절실하게 느꼈습니다. -> 이거 스크립터블 오브젝트 때문에 꼬박 하루를 날려서 정말 뼈저립니다..
백준 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);
}
}