C++

[C++] 5월 28일 코딩 테스트 수업

k-codestudy 2025. 5. 29. 04:15

프로그래머스 LV.5 방의 개수

완성본

#pragma once
#include <set>
#include <map>

class C_ROOM
{

private:
	std::map<long long, int> m_mapNode;
	int m_nCount;
	int m_nX;
	int m_nY;

private:
	long long makeId(int nX, int nY);
	void loadId(long long llId, int& nX, int& nY);
	void inputMoveData(long long llId, int nWay);
	void createNode(int nX, int nY);
	bool isMove(long long llId, int nWay);

public:
	C_ROOM() = default;
	void init();
	void move(int nWay);
	void result();
};

 

#include "room.h"

long long C_ROOM::makeId(int nX, int nY)
{
    return (long long)nX + (long long)nY * 200000;
}

void C_ROOM::loadId(long long llId, int& nX, int& nY)
{
    nX = (int)(llId % 200000);
    nY = (int)(llId / 200000);
}

void C_ROOM::inputMoveData(long long llId, int nWay)
{
    int nDst = m_mapNode[llId];
    nDst = nDst | (1 << nWay);
    m_mapNode[llId] = nDst;
}

void C_ROOM::createNode(int nX, int nY)
{
    long long llId = makeId(nX, nY);

    m_mapNode.insert({ llId, 0 });
    inputMoveData(llId, 9);
}

// []를 사용하기 떄문에 무조건 존재한다는 전제하에 사용하는것 
bool C_ROOM::isMove(long long llId, int nWay)
{
    int nDst = m_mapNode[llId];

    if ((1 << nWay) & nDst)
        return true;

    return false;
}

void C_ROOM::init()
{
    createNode(m_nX, m_nY);
    m_mapNode.insert({ makeId(m_nX,m_nY), 0 });
    inputMoveData(makeId(m_nX, m_nY), 9);
}

void C_ROOM::move(int nWay)
{
    int arMove[8][2]{
        {0, -1}, {1, -1}, {1, 0}, {1, 1}, { 0, 1 },
        {-1, -1}, {-1, 0}, {-1, -1} };

    for (int i = 0; i < 2; i++)
    {
        int nXnew = m_nX + arMove[nWay][0];
        int nYnew = m_nY + arMove[nWay][1];

        auto iterFind = m_mapNode.find(makeId(nXnew, nYnew));

        //if (iterFind == m_mapNode.end())
        //{
        //    createNode(nXnew, nYnew);
        //    inputMoveData(makeId(nXnew, nYnew), nWay);
        //    inputMoveData(makeId(m_nX, m_nY), (nWay + 4) % 8);
        //}
        //else
        //{
        //    if (!isMove(makeId(nXnew, nYnew), nWay))
        //    {
        //        printf("카운트\n");
        //        inputMoveData(makeId(nXnew, nYnew), nWay);
        //        inputMoveData(makeId(m_nX, m_nY), (nWay + 4) % 8);
        //    }
        //}

        bool bCreate{};

        if (iterFind == m_mapNode.end())
        {
            createNode(nXnew, nYnew);
            bCreate = true;
        }

        if (!isMove(makeId(nXnew, nYnew), nWay))
        {
            if (!bCreate)
            {
                m_nCount++;
                printf("카운트\n");
            }
            inputMoveData(makeId(nXnew, nYnew), nWay);
            inputMoveData(makeId(nXnew, nYnew), nWay);
        }
            


        m_nX = nXnew;
        m_nY = nYnew;
        // 찾아서 없으면 생성
        // 있으면 int분석... 
        // 생성할때 방향값 입력 해야하고...
        // 비트연산으로 검출하기로 했고..
        // 분석해서 비트연산값이 같으면 중복이니까 카운팅 X
        // 결론 : 존재하고 비트값이 다르면 비트값을 바꾸고 카운팅..
    }
}

void C_ROOM::result()
{
    printf("%d\n", m_nCount);
}

 

#include <iostream>
#include "room.h"

int main()
{
    C_ROOM cRoom{};

    cRoom.init();

    //cRoom.move(1);
    //cRoom.move(1);
    //cRoom.move(4);
    //cRoom.move(4);
    //cRoom.move(6);
    //cRoom.move(6);
    //cRoom.move(1);
    //cRoom.move(7);
    //cRoom.move(3);

    //cRoom.move(2);
    //cRoom.move(7);
    //cRoom.move(2);
    //cRoom.move(5);
    //cRoom.move(0);

    cRoom.move(6);
    cRoom.move(6);
    cRoom.move(6);
    cRoom.move(4);
    cRoom.move(4);
    cRoom.move(4);
    cRoom.move(2);
    cRoom.move(2);
    cRoom.move(2);
    cRoom.move(0);
    cRoom.move(0);
    cRoom.move(0);
    cRoom.move(1);
    cRoom.move(6);
    cRoom.move(5);
    cRoom.move(5);
    cRoom.move(3);
    cRoom.move(6);
    cRoom.move(0);

    cRoom.result();
}

 

 

프로그래머스 LV.5 미로 주행 테스트

( 과제 : 이거 다이아몬드 채워오기 )

#pragma once
#include <stdio.h>
#include <stdlib.h>

class C_MAGE
{
private:
	char m_arMap[300][100];

private:
	void fillBuffer(int nX, int nY, int nLength, int nFlag);

public:
	C_MAGE() = default;
	void fill(int nX, int nY, int nD, int nFlag);
	void print();
};

 

#include "mage.h"

void C_MAGE::fillBuffer(int nX, int nY, int nLength, int nFlag)
{
	if (nY >= 300 || nY < 0)
		return;


}

void C_MAGE::fill(int nX, int nY, int nD, int nFlag)
{
	int nDx{};
	int nDy = nY - nD;
	int nLength = 1;
	for (int i = 0; i < nD ; i++)
	{
		fillBuffer(nDx, nDy, nLength, nFlag);
		nDx--;
		nDy++;
		nLength += 2;
	}

	for (int i = 0; i < nD + 1; i++)
	{
		fillBuffer(nDx, nDy, nLength, nFlag);
		nDx++;
		nDy++;
		nLength -= 2;
	}
	
}

void C_MAGE::print()
{
	for (int i = 0; i < 10; i++)
	{
		for (int j = 0; j < 10; j++)
		{
			printf("%d ", m_arMap[i][j]);
		}
		printf("\n");
	}
}

 

내가 해본 코드 

void C_MAZE::fillBuffer(int nX, int nY, int nLength, int nFlag)
{
    if (nY < 0 || nY >= 300)
        return;

    int nStartX = nX - (nLength / 2);

    for (int i = 0; i < nLength; i++)
    {
        int x = nStartX + i;
        if (x >= 0 && x < 100) // 가로 범위 체크
        {
            m_arMap[nY][x] = nFlag;
        }
    }
}

void C_MAZE::fill(int nX, int nY, int nD, int nFlag)
{
    int nDy = nY - nD;
    int nLength = 1;

    // 상부 삼각형
    for (int i = 0; i < nD; i++)
    {
        fillBuffer(nX, nDy, nLength, nFlag);
        nDy++;
        nLength += 2;
    }

    // 하부 삼각형
    for (int i = 0; i < nD + 1; i++)
    {
        fillBuffer(nX, nDy, nLength, nFlag);
        nDy++;
        nLength -= 2;
    }
}

void C_MAZE::print()
{
	for (int i = 0; i < 10; i++)
	{
		for (int j = 0; j < 10; j++)
		{
			printf("%d ", m_arMap[i][j]);
		}
		printf("\n");
	}
}

 

#include <iostream>
#include "mage.h"

int main()
{
    C_MAGE cMage{};

    cMage.fill(2, 2, 3, 1);
}