저번 주에 집 이사로 신경쓸게 많아서 진도가 지지부진했다.

 

이번 주 부터 다시 속도를 붙혀야겠다.


[ 연습 문제 ( 달팽이 ) ]

- 강의 중에 강사님도 코딩 테스트때 나왔던 문제라고 했었는데, 나도 OO기업 코딩 테스트에 나왔던 문제였다

 ( 유명 게임회사 코딩테스트 문제였다고 하는데... 나는 유명하지 않는 기업 코테에서 봤던거 같다. 코테 문제들이 많이 상향 평준화 되었구나를 느낄 수 있었다. )

나는 그때도 못 풀었고, 지금도 못풀었다.. 반성 하고 다시 감좀 잡아야겠다. ( 코테 손 놓은지 너무 오래된거 같다... )

#include <iostream>
using namespace std;
#include <iomanip>


const int MAX = 100;
int board[MAX][MAX];
int N;

enum DIR {
	RIGHT,
	DOWN,
	LEFT,
	UP
};

void PrintBoard() {
	for (int x = 0; x < N; x++) {
		for (int y = 0; y < N; y++) {
			cout << setfill('0') << setw(2) << board[x][y] << " ";
		}
		cout << '\n';
	}
}

bool CanGo(int nx ,int ny) {
	if (nx < 0 || nx >= N) {
		return false;
	}
	if (ny < 0 || ny >= N) {
		return false;
	}
	if (board[nx][ny] != 0)
		return false;
	return true;
}

void SetBoard() {
	int dir = RIGHT;
	int num = 1;
	int x = 0, y = 0;

	int dx[] = {0,1,0,-1};
	int dy[] = {1,0,-1,0};

	while (1) {

		board[x][y] = num;

		int next_x = x + dx[dir];
		int next_y = y + dy[dir];
		
		if (num >= N * N) {
			break;
		}

		if (CanGo(next_x, next_y)) {
			x = next_x;
			y = next_y;
			num++;
		}
		else {
			dir = (dir + 1) % 4;
		}
	}
}

int main() {

	cin >> N;

	SetBoard();
	PrintBoard();

	return 0;
}

 


[ 파일 분할 관리 ]

 

.h (헤더파일) 에서 선언부만 넣지 않고, 정의도 같이 해줘도 된다. (선언만 하라는 법은 없다. 우리 편하라고 하는것이다)

 

 => 다만 선언부에서 함수를 정의하게 되면 나중에 헤더파일 include 헤서 사용할때 함수가 두번 정의되는 링킹 에러가 발생한다.

 

그래서 어지간하면 헤더부에 선언만 해주는게 좋다.

 

#pragma once 

 

헤더파일에 포함 된 부분중에 겹치면 안되는 부분이 있는데 ( 함수 선언의 경우 여러번 선언되도 상관 없지만 ) 

만약에 헤더파일에 Struct 같은걸 정의했다면,

한번 include 되고, 다시 include 된다면, 재정의 됐다고 에러가 뜬다.

 

그래서 #pragma once  로 한번만 정의되게 해준다.

 

 

결론 : 헤더 파일은 최대한 간단 간단하게 유지시키는게 좋다.

선언만 하게끔 ( Test.h , Test.cpp ) 

 


[ 객체지향의 시작 ]

 

 보통 멤버 변수는 m_변수이름 혹은 _변수이름 이런식으로 표기하는게 룰이다.

 


[ 생성자와 소멸자 #1 ]

 

 소멸자는 오직 한개만 존재. ( 생성자는 여러개 존재 가능 )

 

- 복사 생성자 : 자기 자신의 클래스 ref 타입을 인자로 받는 생성자 

Knight(const Knight& knight);

 


[ 생성자와 소멸자 #2 ]

 

생성자 중에서 인자를 단 1개 받는 생성자는 생성자의 역할도 하지만 타입 변환의 역할도 수행한다.

디어셈블리로 까보면 타입변환의 경우 인자를 1개 받는 생성자가 실행되는것을 알 수 있다.

 

컴파일러가 암시적으로 생성자를 통해 타입을 변환을 하는게 싫으면 explicit 키워드를 붙혀주면 된다.

 

 

 

이럴 경우

 

생성자 앞에 

 

을 붙혀준다.

 

 

이렇게 되면 명시적으로 생성자의 역할만하고 암시적인 생성자 처리는 막는것이다.

 

하지만 그렇다고 타입 변환하는게 없어진게 아니라 암시적으로 하는것만 막은것이다.

 

 

 


 

'C++과 언리얼로 만드는 게임 개발 > Part1. C++ 문법' 카테고리의 다른 글

Day7 ( 54.46% )  (0) 2022.03.30
Day6 ( 52.67% )  (0) 2022.03.30
Day4 ( 42.85% )  (0) 2022.03.25
Day3 ( 37.50% )  (0) 2022.03.24
Day2 ( 29.46% )  (0) 2022.03.24

+ Recent posts