본문 바로가기
다이어리/내일배움 개발일지

게임개발캠프 - 개인과제(C) 2일차

by E.Clone 2024. 2. 2.

과정명 : 내일배움캠프 Unity 게임개발 3기

전체진행도 : 29일차

부분진행도 : Chapter4.1 - 2일차

작성일자 : 2024.02.02(금)

개발일지 목록 : 클릭


1. 진행중인 과정에 대해

오는 주 수요일까지, 개인과제 및 지급된 강의를 흡수하고 있다.

우선 지급된 유티니 3D 프로젝트 강의를 보고 있는데, 보면서 조금이라도 의문이 드는 점은 매번 찾아 주석으로 남기고 있기 때문에, 무척 시간이 지체되고 있다.

대충 이런 느낌으로 주석을 작성해가며 진행중

주말도 열심히 활용해서 진도를 빼야 될 것 같다.

2일차인데 과제까지 다 끝냈다는 수강생들도 많다는 게 괴담이다.

2. 오늘 학습에 대해

인코딩 문제 해결

유니티 강의를 들으며 기능 구현을 할 때마다 커밋을 하며 진행중인데, 잠깐 지나치며 File Changes 내용을 보니 아래와 같이 인코딩 문제가 있었다.

한글로 작성한 부분이 Github Desktop엥서 깨져보인다.

유니티 프로젝트를 시작할 때 아래와 같은 에디터 설정을 해 주었어야 했는데 잊고있었다.

프로젝트 루트 폴더에 .editorconfig 파일 마련

.sin 폴더가 있는 루트 폴더에 위와 같은 내용을 가진 .editorconfig 파일을 마련해주고, 스크립트 파일을 다시 저장(Ctrl+S) 해 주면 해결이지만

Github Desktop에서 파일 Changes를 확인 할 수 있다

기능적으로 바뀐 부분 이외에 한글 주석을 달았던 부분이 모두 바뀌기 때문에 커밋 내용이 지저분해진다.

가능한 빠른 시점에 .editorconfig 파일을 마련하도록 하는 것이 좋다.

Code Solve

매 문제를 풀 때마다 검색을 다섯 번 이상 한다. 마찬가지로 주석부분에 내용을 정리하였다.

코딩테스트 연습 > 연습문제 > 공원 산책

using System;
using System.Collections.Generic;

public class Solution {
    public int[] solution(string[] park, string[] routes) {
        int[] answer = new int[2];

        // 솔루션 : 주어진 내용을 정말 그대로 수행만 하면 될 것으로 보임
        // 0-1. NSWE의 튜플값 마련
        // 1. park를 한차례 순회하며(최대 2500회) S의 위치 찾기
        // 2. routes의 원소를 foreach순회
        // 2-1. 현재자리 기억
        // 2-2. for 반복문으로 0-1에서 마련한 튜플값만큼 이동 
        // 2-2-1. 이동 불가조건 만족 시 원래자리로 복귀
        // 3. 현재 자리(index) 반환

        // 0-1. NSWE의 튜플값 마련
        // 찾아보기. 제네릭으로 튜플값 사용하는 방법
        Dictionary<char,(int X,int Y)> going = new Dictionary<char, (int, int)>(){
            {'N',(0,-1)}, // (x, y) 순
            {'S',(0,1)},
            {'W',(-1,0)},
            {'E',(1,0)}
        };
        // 1. park를 한차례 순회하며(최대 2500회) S의 위치 찾기
        // 찾아보기. 튜플 변수 선언과 초기화
        // 찾아보기. (int, int) index와 같이 사용하는것은 불가능
        //          (int X, int Y) 로 수정
        //          이후 코드에서도 Item1 -> X, Item2 -> Y로 수정
        (int X, int Y) index = (-1,-1);
        for(int y=0;y<park.Length;y++)
            for(int x=0;x<park[0].Length;x++)
                if(park[y][x]=='S'){
                    index = (x,y);
                    x = park[0].Length;
                    y = park.Length;
                }
        // 2. routes의 원소를 foreach순회
        foreach(string directionInfo in routes){
            // 찾아보기: char로의 형변환
            char direction = char.Parse(directionInfo.Split(' ')[0]);
            int moveNum = int.Parse(directionInfo.Split(' ')[1]);
            // 2-1. 현재자리 기억
            // 찾아보기: 튜플값은 값 형식으로 다른 튜플에 할당하면 내용복사
            (int X, int Y) preIndex = index;
            // 2-2. for 반복문으로 0-1에서 마련한 튜플값만큼 이동 
            for(int i=0;i<moveNum;i++){
                // 찾아보기: 튜플은 아래와 같이 +=는 사용 할 수 없다.
                //index += going[direction];
                index = (index.X + going[direction].X, index.Y + going[direction].Y);
                // 2-2-1. 이동 불가조건 만족 시 원래자리로 복귀
                // 찾아보기: 튜플 요소에 접근
                if(
                    index.X<0 ||
                    index.Y<0 ||
                    index.X>= park[0].Length ||
                    index.Y>= park.Length
                ){
                    index = preIndex;
                    break;
                }
                else if(park[index.Item2][index.Item1] == 'X'){
                    index = preIndex;
                    break;
                }
                // 이동 확인 구문
                // Console.WriteLine($"{i}:({index.X}, {index.Y})");
            }
        }

        // 3. 현재 자리(index) 반환
        // 아래 구문은 왠지 잘 되지 않음.
        // (answer[0], answer[1]) = index;
        // 배열의 인덱스 위치에 직접 값을 할당하는 형태는 
        // 지원이 되는경우도 있고 안되는 경우도 있다는 듯
        answer[0] = index.Y;
        answer[1] = index.X;

        return answer;
    }
}
  • 제네릭 형태로 튜플 값을 사용
    • 처음 시도 해 본 내용인데, 이게 되네 싶어서 놀랐다.
    • Dictionary<char,(int X,int Y)> going = new Dictionary<char, (int, int)>();
  • 튜플 변수
    • 마찬가지로 튜플 변수라는 것도 처음 사용 해 보았다. 배우거나 찾아본 거 없이 적은 구문이 맞는 구문이라 놀랐다..
    • (int, int) index = ... 형태는 C# 7.0 버전 이상에서 사용할 수 있다고 하고, 프로그래머스의 컴파일러도 이를 만족하지만 어째서인지 되지 않았다. 대신 아래와 같은 형태는 사용 가능했다.
    • (int X, int Y) index = ... 는 사용 가능. index.X 와 같이 사용 가능
    • 위와 같은 경우 값 참조이기 때문에, (int X, int Y) preIndex = index; 의 경우 값이 복사되며 두 튜플은 별개로 작동한다.
    • 튜플끼리 덧셈 연산자는 사용할 수 없다. index += going[direction];
    • 튜플 내부 변수명으로도 튜플 내의 값을 사용할 수도 있지만 .Item1, .Item2... 로도 사용 가능하다.
  • 한 글자로 된 문자열의 char 로의 형 변환
    • 왠지 사용했던 기억이 없어 익숙하지 않아 찾아보았다.
    • char direction = char.Parse("C"); 와 같이 char.Parse()를 사용 가능하고, "C"[0]과 같이 사용도 가능하다.

3. 과제에 대해

  • 강의 흡수 및 개인 과제 수행(남은시간 주말 포함 5일)
반응형