반응형

 

 

 

 

풀이코드

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

using namespace std;

#define CLOTH_KIND 1

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

int solution(vector<vector<string>> clothes) {
    int answer = GetAnswer(clothes);
    return answer;
}

int GetAnswer(const vector<vector<string>>& clothes)
{
    int returnValue = 1;
    unordered_map<string, int> map;
    for(int i = 0; i < clothes.size(); i++)
    {
        auto iter = map.find(clothes[i][CLOTH_KIND]);
        if(iter == map.end())
        {
            map.insert(make_pair(clothes[i][CLOTH_KIND], 1));
        }
        else
        {
            iter->second++;
        }
    }

    for(auto iter = map.begin(); iter != map.end(); iter++)
    {
        returnValue *= iter->second + 1;
    }

    return returnValue - 1;
}
  • map을 만들어 옷 종류별로 나눈 뒤, 경우의 수를 계산하여 반환한다.

 

 

 

기타

- 처음에는 map<string, vector<string>>으로 선언해서 접근했으나, 하다보니 수학으로 해결해야 할 것 같아서 map<string, int>로 변경했다.

- 코드 자체는 작성하기 쉬웠으나 경우의 수에서 많이 헤맸다.

- 경우의 수와 같은 경우, 각 옷의 종류마다 입지 않는다는 경우를 하나더 추가해서 모든 경우의 수를 계산하게 되면 마지막의 경우는 모든 옷을 입지 않는다는 수가 나오게 되는데, 지문에서 무조건 1개 이상 입도록 되어있으니 해당 경우의 수를 제외해서 반환하면 된다.

- 다른 사람 풀이를 보니 굳이 find로 키를 찾을 필요없이 operator[]로 바로 접근해도 됐었다.

- operator[]의 경우, 맵 안에서 키를 탐색하고 저장된 값의 참조를 반환하며, 키가 없을 경우 기본 초기화를 사용하여 해당 키에 새 요소를 만든 뒤 참조를 반환한다.

 

 

 

 

 

반응형

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

[C++ / Lv2] 기능개발  (0) 2022.02.15
[C++ / Lv3] 베스트 앨범  (0) 2022.02.10
[C++ / Lv2] 전화번호 목록  (0) 2022.02.05
[C++ / Lv1] 완주하지 못한 선수  (0) 2022.02.04
[C++ / Lv2] 문자열 압축  (0) 2022.02.02
반응형

 

 

 

 

풀이코드

#include <string>
#include <vector>
#include <algorithm>

using namespace std;

bool GetAnswer(const vector<string>&);

bool solution(vector<string> phone_book) {
    sort(phone_book.begin(), phone_book.end());

    bool answer = GetAnswer(phone_book);
    return answer;
}

bool GetAnswer(const vector<string>& pb)
{
    for(int i = 0; i < pb.size() - 1; i++)
    {
        if(pb[i] == pb[i + 1].substr(0, pb[i].size()))
        {
            return false;
        }
    }
    return true;
}
  • 문자열이라 정렬을 한 뒤 반복문으로 현재 원소와 다음 원소를 비교해서 bool값을 반환한다.

 

 

 

기타

- 풀긴 했는데 해시와는 거리가 먼 코드같아서 다른사람 풀이를 보다가 문제 의도대로 풀린 코드를 봤다.

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

using namespace std;

bool solution(vector<string> phone_book) {

    unordered_map<string, int> hash_map;
    for(int i = 0; i < phone_book.size(); i++)
    {
        hash_map[phone_book[i]] = 1;
    }

    for(int i = 0; i < phone_book.size(); i++) 
    {
        string phone_number = "";
        for(int j = 0; j < phone_book[i].size(); j++) 
        {
            phone_number += phone_book[i][j];
            if(hash_map[phone_number] && phone_number != phone_book[i])
            {
                return false;
            }
        }
    }

    return true;
}
  • map을 써서 해시 값을 확인하고 전화번호 문자열(phone_number)을 vector의 원소 문자열과 비교해서 다르면 맵의 해시가 vector 원소 문자열의 접두사가 된다.
반응형

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

[C++ / Lv3] 베스트 앨범  (0) 2022.02.10
[C++ / Lv2] 위장  (0) 2022.02.07
[C++ / Lv1] 완주하지 못한 선수  (0) 2022.02.04
[C++ / Lv2] 문자열 압축  (0) 2022.02.02
[C# / Lv2] H-Index  (0) 2022.01.19
반응형

 

 

 

 

풀이코드

#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
반응형

 

 

 

 

 

 

 

제작 기간

- 총 4일

 

 

 

게임 클래스 구성

 

 

 

 

GameManager

- 클래스 멤버는 WordManager, Player, Rank를 가지고있고, 베네치아 이야기를 스크롤링하기 위해 string vector를 멤버로 가지고 있다.

- Main 함수에서 GameManager의 객체를 생성한 뒤, 게임을 실행한다.

- 게임 시작 시, 베니치아 스토리 데이터를 로드해서 저장한다.

- 각 화면은 정적 클래스(Draw)에 화면을 그리는 함수를 정의해서 GameManager에서 호출하여 그린다.

 

 

 

WordManager

- 게임에 사용할 단어들을 로드해서 배열로 저장하고, 게임 중에 사용하기 위한 Word 클래스의 List를 멤버로 가지고 있다.

- 일정 시간을 주기로, 랜덤 확률 체크를 하여 Word 객체를 만들어서 List에 넣는다.

- 단어를 입력하면 맞는 객체의 포인터를 반환한다.

 

 

 

Word

- 좌표, 단어, 아이템 정보를 멤버로 가지고 있다.

- 객체가 생성될 때, 아이템 효과를 랜덤하게 부여한다.

- 아이템 효과는 속도 조절, 숨기기, 화면 비우기 등이 있다.

 

 

 

Rank

- Player 클래스의 List를 멤버로 가지고 있다.

- 랭킹 데이터를 파일 입출력으로 관리한다.

- 랭킹의 순서는 내림차순으로 10개만 보여지지만, 데이터는 플레이한 모든 유저의 데이터를 관리한다.

 

 

 

Player

- 유저 이름, 라이프, 최고 기록(스테이지, 점수)을 멤버로 가지고 있다.

 

 

 

Draw

- 게임 화면을 그리기 위한 함수를 정의해 놓았다.

- 문자열 중앙 정렬로 그리기, 박스 그리기, 지우기 등이 정의되어있다.

 

 

 

저장되어 있는 데이터 구조

- 랭킹, 게임에 사용될 단어 데이터

 

 

 

겪은 문제

- 화면을 그릴때 프레임이 지연되는 문제

- 원인 : 화면의 정보를 반복문으로 문자 1개씩 print하는게 원인.

- 해결 : 문자열로 모든 화면의 정보를 더한 뒤, 문자열을 한번에 그려서 해결.

          특정 구역만 지워야 할 때는 화면 전체를 새로 그리지 않고 해당 구역만 지워서 해결.

 

 

 

 

반응형

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

[WIN API] 서커스 찰리 게임  (0) 2022.02.05
[WIN API] 카드 맞추기 게임  (0) 2022.01.30
RPG 게임 제작 (C++)  (0) 2022.01.22
뱀 게임 제작 (C++)  (0) 2022.01.22
오목 게임 제작 (C++)  (0) 2022.01.21

+ Recent posts