c++ boj 1890번 문제를 통해서 알게된 간략하게 표현한 변수의 중요성.

처음 내가 생각하게 된 방향으로 정답 코드를 찾아보고 그 코드를 보았을때 내가 생각한 첫 번째 코드 구현 방향으로 수정을 해보았더니 확실하게 더 이해하기 힘들어졌다. 

#include <bits/stdc++.h>
using namespace std;

long long board[105][105];
long long d[105][105];

int main() {
	ios::sync_with_stdio(0);
	cin.tie(0);

	int n; 
	cin >> n;

	for (int i = 0; i < n; i++)
		for (int j = 0; j < n; j++)
			cin >> board[i][j];

	d[0][0] = 1;
	for (int i = 0; i < n; i++) {
		for (int j = 0; j < n; j++) {
			//int jump = board[i][j];
			if (i != n - 1 && i + board[i][j] < n)
				d[i + board[i][j]][j] = d[i + board[i][j]][j] + d[i][j];
			if (j != n - 1 && j + board[i][j] < n)
				d[i][j + board[i][j]] = d[i][j + board[i][j]]+d[i][j];
		}
	}
	cout << d[n - 1][n - 1];
}

위와 같이 int jump=board[i][j]; 형태로 값을 써놓지 않고 그냥 그대로 바로 board[i][j];값이 들어가는 곳마다 전부 board[i][j] 값을 사용하니까 아주 코드가 복잡해져보이게 되었다. 머리속에서 이걸 시험 시간 내에 풀면서 자꾸 헷갈리게 된 배경에도 이런식으로 표현했을때 이해하기 힘들어지는 부분이 충분히 영향을 미쳤을 수 있다고 생각된다. 

 

근데 내가 참고한 정답 코드에서는 지속적으로 사용하는 board[i][j] 값을 int jump=board[i][j]; 형태로 jump라는 변수를 선언하고 board[i][j]값을 복사해서 넣어주고 그 이후부터 지속적으로 jump라는 표현으로 사용해주니까 가독성도 훨씬 좋아지고 코드를 읽어가면서 논리를 전개시킬때 길을 잃지 않고 지속적으로 파악하기에 좋은 상황을 보게 되었다. 

#include <bits/stdc++.h>
using namespace std;

long long board[105][105];
long long d[105][105];

int main() {
	ios::sync_with_stdio(0);
	cin.tie(0);

	int n; 
	cin >> n;

	for (int i = 0; i < n; i++)
		for (int j = 0; j < n; j++)
			cin >> board[i][j];

	d[0][0] = 1;
	for (int i = 0; i < n; i++) {
		for (int j = 0; j < n; j++) {
			int jump = board[i][j];
			if (i != n - 1 && i + board[i][j] < n)
				d[i + jump][j] = d[i + jump][j] + d[i][j];
			if (j != n - 1 && j + board[i][j] < n)
				d[i][j + jump] = d[i][j + jump]+d[i][j];
		}
	}
	cout << d[n - 1][n - 1];
}

이런식으로 int jump=board[i][j]라는 형태로 복잡해보이면서 지속적으로 사용해야 할 값 자체를 보기 편한 이름으로 새로 선언한 변수에 복사해서 넣어줘서 사용하면 코드의 가독성도 증가시키고 더욱 보기 편해지고 틀릴 일이 적어질것이다.

앞으로는 이런 방향으로 이러한 형태의 문제를 풀때 참고해서 풀이방법을 설정해보도록 하자. 

 

  Comments,     Trackbacks