본문 바로가기

TIL

[TIL]2024-3-18 / 58일차 - 최종 프로젝트 3주차 1일차

룰타일을 만들기 위한 과정...

1. 오늘의 기술 면접 질문 - 배열과 List, ArrayList, Dictionary 의 차이점을 설명해주세요

배열 - 연속된 메모리 공간으로 이루어져 메모리 관리가 용이하며 순서대로 되어있기에 그에 맞춰 index로 이루어져 접근을 빠르게 할 수 있다. 하지만 동적 할당이 불가하여 크기가 정적이다.

(단점 - 할당된 메모리 블록은 사용하지 않아도 고정되어 있어 메모리 낭비가 발생 가능)

(사용처 - 변경 가능성이 없는 고정된 수의 요소가 있고 비순차적인 방식으로 자주 엑세스를 해야할 때 편리)

 

리스트 - 리스트는 C#에서 제너릭 형식의 List로 제공되어 크기가 동적이다. 순차적으로 요소를 추가하고 제거하는 데에 편리하고 제너릭 형식이기에 박싱 언박싱이 일어나지 않아 이점이 있지만, 리스트는 다음 데이터의 주소값을 가지고 있어야 하여 메모리를 많이 쓰게되고 특별한 키값이 존재하지 않아 검색에 유용하지 않다.

(단점 - 내부적으로는 배열의 형태이기 때문에 동적으로 추가할 때에 성능의 저하가 발생할 수 있다. 그리고 커다란 리스트를 만들 경우 순차적으로 검색하기 때문에 굉장히 비효율적)

(사용처 - 요소를 자주 추가하고 제거할 때에 편리, 다음 주소지를 알고 있어 반복문을 사용하기에 적합)

 

배열 리스트 - 제너릭이 사용되기 전 자료구조로 object를 인자로 갖기에 어떤  타입 객체든 저장할 수 있지만, 박싱 언박싱이 일어나 성능이 떨어질 수 있다. 그렇기에 이후에는 리스트를 사용하는 것이 권장되고 있다.

 

딕셔너리 - HashTable을 기반으로 Key와 Value로 데이터를 세트로 저장하며 키값을 통해 검색할 수 있는 자료구조이다.

마찬가지로 동적으로 크기가 조절 되며 제네릭 클래스이기에 자료형의 제한이 없습니다. 키 값을 통해 특정한 데이터를 탐색하는 데에 특화되어 있습니다.

(단점 - 연속구조가 아니기에 반복문 사용이 적합하지 않고 기반인 Hashtable과 달리 여러 타입을 수용할 수 없다.)

(사용처 - 특정한 값을 검색하고 탐색하는 자료구조에 적합하다. 예시로 퀘스트 자료구조를 만든다면 해당 퀘스트의 ID값으로 찾는 것이 가능하다.)

 

   (꼬리질문) Dictionary는 어떻게 구현해야 하나요?

Dictionary 클래스는 <Key, Value> 로 되어있어 키와 데이터의 유형을 지정해주어 선언해야 합니다.

'Add'와 'Remove' 메서드를 통해 추가 및 제거하고 키의 유무를 확인하는 'ContainsKey' 메서드도 존재합니다.

 

   (꼬리질문) Dictionary 검색이 빠른 이유는 무엇인가요?

HashTable 기반으로 키를 고유한 인덱스로 변환하여 저장하여 이 값이 저장되는 데이터의 배열의 인덱스로 사용되어 키를 통해 위치를 찾기 때문에 데이터의 크기에 관계없이 일정한 시간 내에 데이터를 찾을 수 있습니다. 그렇기에 시간 복잡도도 O(1)로 되어 있습니다.


2. 오늘의 알고리즘 코드카타 - 숫자 짝꿍

답안 : 

//문제의 요구는 X,와 Y에 동시에 존재하는 수 조합 중 가장 큰 정수를 찾는 것
//또한 짝궁이 없다면 -1, 0밖에 없다면 0을 리턴하는 조건
using System;
using System.Text;

public class Solution {
    public string solution(string X, string Y) {
        string answer = "";
        int[] a = new int[10];
        int[] b = new int[10];

        for(int i = 0; i < X.Length; i++) { a[(int)(X[i] - 48)]++; }
        for(int i = 0; i < Y.Length; i++) { b[(int)(Y[i] - 48)]++; }
        
        //StringBuilder는 변형할 수 없는 string이 아닌 변형 가능한 클래스로
        //반복문으로 string을 수정하려고 할 때, 보다 성능에 저하를 막을 수 있다.
        StringBuilder sb = new StringBuilder();

        for(int i = 9; i >= 0; i--)
        {
            while(a[i] > 0 && b[i] > 0)
            {
                sb.Append(i);
                a[i]--;
                b[i]--;
            }
        }
        
        if("".Equals(sb.ToString())) 
            answer = "-1";
        else if("0".Equals(sb.ToString().Substring(0, 1))) 
            answer = "0";
        else 
            answer = sb.ToString();
        return answer;
    }
}

 

아침 졸음에 문제 설명을 이해하기 쉽지 않아졌다.
문제를 이해하기 위해서라도 인터넷을 검색해서 문제 설명을 보는 일이 많아졌다.
물론 그런 과정에서 남의 풀이를 많이 보게되니 배우는 것도 있지만
점차 시간문제로 내가 고뇌하며 푸는 것이 줄어들고 있는 느낌이 들기는 한다.
첫 작성 시 이보다 훨씬 길었는데 인터넷 내용을 바탕으로 훨씬 짧아졌다.
역시 잘하는 사람은 많다.


3. 오늘의 작업 - 룰타일 그리기부터 적용까지

룰타일을 위해 제작한 타일 팔레트

직접 그리느라 꽤나 오랜 시간 노동이 들어갔다.

 

룰타일이란

우리가 지정한 룰을 통해 타일이 모양을 변하는 건데

자세한 설명은

룰타일 설명 블로그

 

[Unity3D] Tilemap (2) - 룰 타일로 타일맵 자동 연결하기

Tilemap (2) - 룰 타일로 타일맵 자동 연결하기 작성 기준 버전 :: 2019.1-2019.2 [이 포스트의 내용은 유튜브 영상으로도 시청하실 수 있습니다] 지난 섹션에서는 간단하게 타일맵을 만들고 사용하는 방

wergia.tistory.com

 

 

 

오류가 나는지 보기위해 정시없이 깔아둔 모습

2칸일 때와 1칸일 때를 구분하여 테두리 모양을 잡아줘야 함으로 생각보다 많은 타일이 들어가야 했다.

또한 위 아래를 구분하여 그림자를 넣고자 하였더니 일부 타일이 라이팅이 맞지 않는 모습을 보이지만

급하게 수정해야될 사항은 아니다.

 

이를 위해서 조건이 들어간 타일만 50가지가 들어갔다...

꽤나 노가다지만 훨씬 편리한 작업이 가능해졌다.

이를 제작중인 에디터로 연결 시키는 방법은 다른 팀원과 상의를 해봐야 한다.

 

룰타일 까는 모습 시연