250730

凡愚·2025년 7월 30일

개발 일지

목록 보기
248/350

✅ 한 것들


  • 백준
  • Frog on Lotus


⚔️ 백준


10830 행렬 제곱

#include"10830.h"
using namespace std;
typedef long long ll;
typedef vector<vector<int>> vvi;

namespace
{
	int N;
	ll B;
	vvi mat_origin;

	void Output(vvi mat_res)
	{
		for (int i = 0; i < N; i++) {
			for (int j = 0; j < N; j++) {
				cout << mat_res[i][j] << ' ';
			}
			cout << '\n';
		}
	}

	vvi MatMult(vvi mat1, vvi mat2)
	{
		vvi mat_res = vvi(N, vector<int>(N));
		for (int i = 0; i < N; i++)
		{
			for (int j = 0; j < N; j++)
			{
				int sum = 0;
				for (int k = 0; k < N; k++)
				{
					sum += mat1[i][k] * mat2[k][j];
				}
				mat_res[i][j] = sum % 1000;
			}
		}
		return mat_res;
	}

	vvi MatPower(vvi mat, ll B)
	{
		if (B == 1) return mat;

		vvi mat_temp = MatPower(mat, B / 2);
		mat_temp = MatMult(mat_temp, mat_temp);

		if (B % 2 == 0) return mat_temp;
		else return MatMult(mat_temp, mat);
		
	}

	void Input()
	{
		cin >> N >> B;
		mat_origin = vvi(N, vector<int>(N));
		for (int i = 0; i < N; i++) {
			for (int j = 0; j < N; j++) {
				int temp;
				cin >> temp;
				mat_origin[i][j] = temp % 1000;
			}
		}
	}
}

void B10830::Solution()
{
	Input();
	vvi mat_res;
	if (B % 2 == 0) mat_res = MatPower(mat_origin, B);
	else mat_res = MatPower(mat_origin, B);
	Output(mat_res);
}

풀긴 했는데 코드가 너무 긴 것 같기도 하다

namespace
{
	int N;
	ll B;
	vvi mat_origin;
	const int MOD = 1000;

	void Output(vvi mat_res)
	{
		for (int i = 0; i < N; i++) {
			for (int j = 0; j < N; j++) {
				cout << mat_res[i][j] % MOD << ' ';
			}
			cout << '\n';
		}
	}

	vvi MatMult(vvi mat1, vvi mat2)
	{
		vvi mat_res = vvi(N, vector<int>(N,0));
		for (int i = 0; i < N; i++)
			for (int j = 0; j < N; j++)
				for (int k = 0; k < N; k++)
					mat_res[i][j] += mat1[i][k] * mat2[k][j] % MOD;
		return mat_res;
	}

	vvi MatPower(vvi mat, ll B)
	{
		if (B == 1) return mat;

		vvi mat_temp = MatPower(mat, B / 2);
		mat_temp = MatMult(mat_temp, mat_temp);
		if (B % 2 == 1) mat_temp = MatMult(mat_temp, mat);

		return mat_temp;
		
	}

	void Input()
	{
		cin >> N >> B;
		mat_origin = vvi(N, vector<int>(N));
		for (int i = 0; i < N; i++) {
			for (int j = 0; j < N; j++) {
				cin >> mat_origin[i][j];
			}
		}
	}
}

void B10830::Solution()
{
	Input();
	Output(MatPower(mat_origin, B));
}

개선해보긴 했는데 크게 차이는 없다.

  • 1000 대신 MOD 선언. 필요한 부분에만 모듈러 연산.
  • for문 중괄호 줄이기
  • MatPower 가독성 개선
  • Output() 바로 호출

다른 코드들 봐도 딱히 구조에서 배울만한 점은 없는듯. 의미도 알 수 없게 다 생략해가면서 코딩하는 것보다 정갈하게 코딩하는게 실제 코테에서나 실무에서나 낫다고 생각...



🎮 Frog on Lotus


화면 확대 및 축소 구현

  • https://gist.github.com/jcguarinpenaranda/a9d5ad720a906bedbbaf 기반 살짝 수정
  • BuildCam의 minOrtho 값은 Awake()에서 결정됨. 문제는 PinchZoom를 초기화할 때도 이 값이 필요함. PinchZoom이 BuildCam을 필요로 하는 건데 순서 때문에 BuildCam에 PinchZoom의 의존성을 등록하는게 맞나 생각이 듦.
    • 블로그에 생명주기 관련해서 '서로 다른 오브젝트 간의 Awake(), Start() 순서는 보장되지 않는다고 잘못 적어놨었는데, 번역을 그냥 잘못 했던 거. Awake() → OnEnabled() → Start() 순으로 호출 보장된다.
    • 생각해보니 BuildCam의 PinchZoom을 하는거라 굳이 따로 만들 이유가 없었다. 그냥 BuildCam에 로직 통째로 넣음.

스테이지 기반에서 확률 기반 적 스폰으로 변경



0개의 댓글