반응형

 

 

 

 

풀이코드

#include <string>
#include <vector>
#include <unordered_map>

using namespace std;

#define EXIST 1
#define FAIL 0

string GetAnswer(const vector<string>&, const vector<string>&);

string solution(vector<string> participant, vector<string> completion) {
    string answer = GetAnswer(participant, completion);
    return answer;
}

string GetAnswer(const vector<string>& participant, const vector<string>& completion)
{
    string returnStr = "";
    unordered_map<string, int> map;
    for (int i = 0; i < completion.size(); i++)
    {
        if (map.count(completion[i]) != EXIST)
        {
            map.insert(make_pair(completion[i], 1));
        }
        else
        {
            map[completion[i]]++;
        }
    }

    for (int i = 0; i < participant.size(); i++)
    {
        if(map.count(participant[i]) != EXIST)
        {
            returnStr = participant[i];
            break;
        }
        else
        {
            map[participant[i]]--;

            if (map[participant[i]] < FAIL)
            {
                returnStr = participant[i];
                break;
            }
        }
    }

    return returnStr;
}
  • 완주한 선수들의 목록을 map으로 묶어서, 참가한 선수들 목록 대상으로 탈락한 선수의 이름을 반환한다.
  • map에 키값이 없으면 탈락한 선수이므로 해당 선수의 이름을 반환.
  • map에 키값이 있으면 value값을 감소시킨 뒤, value가 음수가 되면 해당 이름의 선수가 탈락한 것이므로 해당 선수의 이름을 반환.

 

 

 

기타

- 없음.

 

 

 

 

 

반응형

'Stack > Coding test' 카테고리의 다른 글

[C++ / Lv2] 위장  (0) 2022.02.07
[C++ / Lv2] 전화번호 목록  (0) 2022.02.05
[C++ / Lv2] 문자열 압축  (0) 2022.02.02
[C# / Lv2] H-Index  (0) 2022.01.19
[C# / Lv2] 가장 큰 수  (0) 2022.01.18
반응형

 

 

 

 

풀이코드

#include <string>
#include <vector>

using namespace std;

int GetTotElementSize(vector<string>);
int GetAnswer(string str);

int solution(string s) {
    int answer = GetAnswer(s);
    return answer;
}

int GetAnswer(string str)
{
    int resultSize = str.length();
    vector<string> resultVector;
    string currentStr, compareStr;

    for (int i = 1; i <= str.length() / 2; i++)
    {
        currentStr = str.substr(0, i);
        int compareCount = 1;
        int compareStart = i;

        while (compareStart < str.length())
        {
            compareStr = str.substr(compareStart, i);

            if (currentStr == compareStr)
            {
                compareCount++;
            }
            else
            {
                if (compareCount > 1)
                {
                    resultVector.push_back(to_string(compareCount));
                }
                resultVector.push_back(currentStr);

                currentStr = str.substr(compareStart, i);
                compareCount = 1;
            }
            compareStart += i;
        }

        if (compareCount > 1)
        {
            resultVector.push_back(to_string(compareCount));
        }
        resultVector.push_back(currentStr);

        int tot = GetTotElementSize(resultVector);
        resultSize = resultSize > tot ? tot : resultSize;
        resultVector.clear();
    }

    return resultSize;
}

int GetTotElementSize(vector<string> vecStr)
{
    int returnValue = 0;
    for(int i = 0; i < vecStr.size(); i++)
    {
        returnValue += vecStr[i].length();
    }
    return returnValue;
}
  • 문자열의 패턴을 비교해서 수를 메기는 형태이기 때문에 첫번째 반복문에서 모든 문자열길이만큼의 루프를 돌 필요가 없다.
  • while문의 각 루프마다 이전에 패턴 비교를 위해 잘라둔 문자열과 비교해서 같으면 compareCount를 증가시키고 다르면 비교 패턴을 수정해준다.

 

 

 

 

기타

- 잠깐 C++ 못했다고 레퍼런스가 기억이나지 않아서 비주얼스튜디오 켜서 작성함.

 

 

 

 

 

반응형

'Stack > Coding test' 카테고리의 다른 글

[C++ / Lv2] 전화번호 목록  (0) 2022.02.05
[C++ / Lv1] 완주하지 못한 선수  (0) 2022.02.04
[C# / Lv2] H-Index  (0) 2022.01.19
[C# / Lv2] 가장 큰 수  (0) 2022.01.18
[C# / Lv1] k번째 수  (0) 2022.01.17
반응형

 

 

 

 

SafeArea

- 해상도가 세로로 길어지면서 생겨난 개념이다.

- 초창기에는 iPhone의 노치라는 변태 해상도(?)를 출발로 현재는 안드로이드도 펀치홀 디스플레이가 적용되서 이런 비정상적인 화면에 맞춰 UI를 정상적으로 보이게 배치해줘야한다.

- 안드로이드같은 경우 유니티 내장 기능에서 펀치홀 라인을 레터박스로 날리는 옵션지 주어져있다. (하지만 이 포스팅에서 이 옵션을 사용하지 않는다.)

 

 

 

Screen.safeArea

- 단어 뜻 그대로 화면의 안전 영역의 픽셀 단위를 반환한다.

- 기기 해상도 값과 SafeArea 해상도 값을 계산해서 UI의 anchor의 위치값을 계산해서 UI Rect의 새로운 값을 만들어낸다.

 

 

 

Hierachy 세팅

- Canvas 자식으로 빈 UI 게임오브젝트를 넣어주고 자식으로 넣은 게임오브젝트의 RectTransform AnchorPreset을 화면 전체로 세팅해준다.

- 다른 UI 요소는 위에 자식으로 넣은 게임오브젝트의 자식으로 넣어주면 된다.

- 다음 코드로 스크립트를 생성해 Safe Area를 적용할 게임오브젝트에 붙여준다.

 

 

 

코드

using UnityEngine;

public class SafeArea : MonoBehaviour
{
    private void Awake()
    {
        ApplySafeArea();
    }

    private void ApplySafeArea()
    {
        Rect safeAreaRect = Screen.safeArea;
        Vector2 anchorMin = safeAreaRect.position;
        Vector2 anchorMax = safeAreaRect.position + safeAreaRect.size;

        //Calculate anchorMin
        anchorMin.x /= Screen.width;
        anchorMin.y /= Screen.height;

        //Calculate anchorMax
        anchorMax.x /= Screen.width;
        anchorMax.y /= Screen.height;

        var rectTr = GetComponent<RectTransform>();
        //Apply anchor
        rectTr.anchorMin = anchorMin;
        rectTr.anchorMax = anchorMax;

        rectTr.offsetMin = Vector2.zero;
        rectTr.offsetMax = Vector2.zero;
    }
}
  • 먼저 anchor의 Min, Max 값을 구한다음, offset을 각각 0으로 지정해주면 화면(Rect)이 SafeArea에 맞춰진다.
  • Screen.safeArea.position의 값을 포함시키는 이유는 iPhone의 경우 Safe Area가 화면 밑부분을 더 띄워주므로 다른 위치값이 나온다.
  • Screen.safeArea 실제 기기에서만 SafeArea에 맞는 값을 반환하기 때문에 에디터에서는 SafeArea가 적용 안되서 보이는게 정상이다.

 

 

 

결과 확인 (Safe Area 스크립트 적용 차이, 유니티 내장 Safe Area 적용)

 

 

 

 

 

반응형
반응형

 

 

 

 

유니티 이벤트 함수

- 유니티는 미리 정의된 순서대로 실행되는 이벤트 함수들이 존재한다.

- 종류와 실행 순서(Life cycle)는 다음 페이지 참조

 

이벤트 함수의 실행 순서 - Unity 매뉴얼

Unity 스크립트를 실행하면 사전에 지정한 순서대로 여러 개의 이벤트 함수가 실행됩니다. 이 페이지에서는 이러한 이벤트 함수를 소개하고 실행 시퀀스에 어떻게 포함되는지 설명합니다.

docs.unity3d.com

 

 

 

 

Awake(), Start(), OnEnable()

- Awake

  • Scene이 로드될 때 스크립트가 포함된 게임오브젝트가 초기화되거나 비활성화된 게임오브젝트가 활성화 될 때, Instantiate로 생성된 게임 오브젝트가 초기화 된 후에 호출된다.
  • 스크립트가 비활성화 되어있을때도 호출이 되며, 게임 오브젝트가 초기화된 후, 단 한번 호출된다.
  • 모든 게임오브젝트가 초기화된 후 호출되기 때문에 Find와 같은 함수를 사용하여 안전하게 쿼리할 수 있다.
  • 멤버를 초기화할 때 사용된다.
  • 호출하는 순서가 정해져있지 않기 때문에 스크립트들 사이에서 Awake전이나 후에 호출되는것에 의존해서는 안된다.

- OnEnable

  • 게임오브젝트 또는 스크립트가 활성화될 때마다 호출된다. (1회성이 아님)
  • 이벤트 연결시 사용된다.

- Start

  • Update가 호출되기 전에 호출되는 함수이다.
  • Awake와 마찬가지로 단 한번 호출된다.
  • Awake와 달리 스크립트가 비활성화 되어있을때 호출이 되지 않아서 비활성화 된 스크립트에서는 Awake와 동일한 프레임에 호출되지 않을수도 있다.
  • 한 객체가 다른 객체에 의존하는 경우에 유용하게 사용할 수 있는 함수이다. (의존하는 객체 초기화는 Start에서 의존되는 객체 초기화는 Awake에서하게되면 안정성이 높아진다.)
  • 해당 함수는 코루틴으로 정의가 가능해서 yield문으로 흐름제어가 가능하다.

 

 

 

Update(), FixedUpdate(), LateUpdate()

- Update

  • 스크립트가 활성화 되어있을 때, 매 프레임마다 호출된다.
  • 게임의 핵심 로직을 작성한다.

- FixedUpdate

  • 물리 시스템 주파수에 따라 일정한 주기로 호출된다. (기본설정 기준 0.02초마다 호출됨.)
  • 프레임 속도에따라 Update보다 더 많이 호출될 수도 있고 적게 호출될 수도 있다.
  • 프레임 속도와 독립적으로 다른 타이머에서 호출되기 때문에 Time.deltaTime을 곱할 필요가 없다.

- LateUpdate

  • Update가 호출된 후 프레임마다 한 번씩 호출된다.
  • 일반적으로 Update에서 플레이어를 움직이는 계산을 하고, LateUpdate에서 카메라의 계산을 수행하기 위해 사용한다.

 

 

 

 

반응형
반응형

 

 

 

 

 

 

 

 

제작 기간

- 총 1일

 

 

 

게임 클래스 구성

 

 

 

GameManager

- 싱글톤 클래스이다. (WndProc 함수에서 인스턴스가 호출된다.)

- 클래스 멤버는 BitmapManager, Card를 가지고 있고, 화면을 그리기 위한 HDC, HWND를 멤버로 가지고 있다.

- Update 함수에서 전체 프레임 로직을 호출한다.

 

 

 

BitmapManager

- 클래스 멤버는 Bitmap을 배열로 가지고 있다.

- 비트맵 이미지를 로드해서 Bitmap 객체들에게 인수로 넘겨줘서 초기화한다.

 

 

 

Bitmap

- 비트맵 이미지를 가지고 있다.

- 해당 클래스에서 이미지를 그린다.

 

 

 

Card

- 좌표, 상태(앞, 뒷면), 카드 종류(모양), Bitmap 배열을 멤버로 가지고 있다.

- 카드 세팅, 마우스 클릭 감지, 앞 혹은 뒷면 카드를 그린다.

 

 

 

기타

- 더블 버퍼링을 적용하지 않아서 화면 깜빡임이 발생한다.

- Win API의 기능을 익히기 위한 프로젝트이기 때문에 더블 버퍼링을 적용하지 않음.

 

 

 

 

반응형

'Game > Personal development' 카테고리의 다른 글

[Unity] 모바일 전략 시뮬레이션  (0) 2022.04.16
[WIN API] 서커스 찰리 게임  (0) 2022.02.05
산성비 게임 제작 (C++)  (4) 2022.01.23
RPG 게임 제작 (C++)  (0) 2022.01.22
뱀 게임 제작 (C++)  (0) 2022.01.22

+ Recent posts