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);
}