C++

[C++] 6월 20일 코딩 테스트 수업

k-codestudy 2025. 6. 20. 17:48

프로그래머스 Lv.4

행렬과 연산 

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

class C_MAT
{
private:
	int**	m_ppNode;
	int		m_nColumn;
	int		m_nRow;
	std::list<int*> m_listRotate;


	void rotateList(std::list<int*> &list);

public:
	C_MAT() = default;
	void init(int nRow, int nColumn);
	void rotate();
	void print();
};

 

#include "mat.h"

//리스트를 만들어 -> 뒤에다 복사하는걸 만듬 -> 하나가 부족할꺼임 ㅇㅇ -> 
void C_MAT::init(int nRow, int nColumn)
{
	m_nColumn = nColumn;
	m_nRow = nRow;

	int nData = 1;
	m_ppNode = new int* [nRow] {};
	for (int i = 0; i < nRow; i++)
	{
		m_ppNode[i] = new int[m_nColumn] {};
		for (int j = 0; j < m_nColumn; j++)
		{
			m_ppNode[i][j] = nData;
			nData++;
		}
	}

	int arCount[4][3] = 
	{
		{nColumn - 1,0,1}, 
		{nRow - 1,1,0},
		{nColumn - 1,0,-1},
		{nRow - 1,-1,0},
	};
	
	int nY{};
	int nX{};
	for (int i = 0; i < 4; i++)
	{
		for (int j = 0; j < arCount[i][0]; j++)
		{
			m_listRotate.push_front(&m_ppNode[nY][nX]);
			nY += arCount[i][1];
			nX += arCount[i][2];
		}
	}

	//int arCount[2][3] =
	//{
	//	{nColumn - 1,0,1},
	//	{nRow - 1,1,0},
	//};

	//int nY{};
	//int nX{};
	//int nAdd = 1;
	//for (int k = 0; k < 2; k++)
	//{
	//	for (int i = 0; i < 2; i++)
	//	{
	//		for (int j = 0; j < arCount[i + k * 2][0]; j++)
	//		{
	//			m_listRotate.push_back(&m_ppNode[nY][nX]);
	//			nY += arCount[i + k * 2][1];
	//			nX += arCount[i + k * 2][2];
	//		}
	//		nAdd *= -1;
	//	}
	//}
}

void C_MAT::rotate()
{
	rotateList(m_listRotate);
	//std::list<int*>::iterator iterDst = m_listRotate.begin();
	//std::list<int*>::iterator iterSrc = m_listRotate.begin();
	//iterSrc++;

	//int nData = **iterDst;

	//while (iterSrc != m_listRotate.end())
	//{
	//	**iterDst = **iterSrc;
	//	iterDst = iterSrc;
	//	iterSrc++;
	//}
	//**iterDst = nData;
}

void C_MAT::rotateList(std::list<int*>& list)
{
	std::list<int*>::iterator iterDst = list.begin();
	std::list<int*>::iterator iterSrc = list.begin();
	iterSrc++;

	int nData = **iterDst;

	while (iterSrc != list.end())
	{
		**iterDst = **iterSrc;
		iterDst = iterSrc;
		iterSrc++;
	}
	**iterDst = nData;
}

void C_MAT::print()
{
	for (int i = 0; i < m_nRow; i++)
	{
		for (int j = 0; j < m_nColumn; j++)
		{
			printf("%2d ", m_ppNode[i][j]);
		}
		printf("\n");
	}
	printf("\n");

	//for (int* pData : m_listRotate)
	//{
	//	printf("%d ", *pData);
	//}
	//printf("\n");
}

 

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

int main()
{
	C_MAT cMat{};

	cMat.init(3, 3);
	cMat.print();
	cMat.rotate();
	cMat.print();

}