today is test
영어는 이제 치우고 다시 하던 대로 하겠다.
보는 바와 같이 오늘은 시험이다. 이번 시험에서는 제시한 알고리즘을 해결하는 문제로 행렬의 계산(하), 별 찍기(중), 같은 단어 제외하기 (상)으로 나눠진 시험이다.
이 시험은 3점 이상을 얻으면 패스하는 시험이기 때문에 2문제를 해결한다면 패스는 받을 수 있는 시험이다.
원래의 계획은 그래도 3문제를 모두 찍어먹어 봐야지 했는데 계획과 다른 2번문제의 이상한 오류로 인하여 추가적인 시간을 많이 잡아먹게 되었다.
ex: *** => * > * | end 와 같은 느낌으로 별이 증가하여야 하는 부분에서 값이 변형되거나 유지되어 반복 횟수가 하나 줄어드는 일이 생겼다.
String star_Line = "";
int size = star*2 -1;
for (int i = 0 ; i < star*2 -1 ; i++) {
star_Line += "*";
}
char[] ch = star_Line.toCharArray();
int[] num = new int[star_Line.length()];
for (int j = 0 ; j < ch.length ; j++) num[j] = (int)ch[j];
for (int k = 0 ; k < star ; k++) {
star_Line = new String(ch);
System.out.println(star_Line);
// * = 42 " " ==32 ;
if (k < star - 1) {
num[k] -= 10;
num[size - 1 - k] -= 10;
}
for (int l = 0; l < size; l++) {
ch[l] = (char) num[l];
}
}
for (int l = 1 ; l <star ; l++){
num[star -1 +l] += 10;
num[star -1 -l] += 10;
for ( int i = 0; i < size; i++) {
if (num[i] > 42) num[i] = 42;
ch[i] = (char) num[i];
}
star_Line = new String(ch);
System.out.println(star_Line);
대강 이런 느낌의 코드이다. 이 문제를 해결할 때 가장 중요한 포인트는 별들을 가운데 정렬하여야 하는 점이었다. 때문에 이를 위해 기존의 별을 공백으로 변형해 처리하는 것을 요구하는 문제였다.
나는 이 문제를 아스키 코드를 활용하여 해결하고자 했다. 우선 *의 코드는 42, " "의 코드는 32이다. 이 점을 활용하여 별을 줄이는 법은 -10 늘리는 방법은 +10의 값을 할당하여 풀었다.
그러나 오류의 시작은 여기서 부터였다. 나름대로 잘 운영되는 가 하면서 풀었으나 계속 별이 하나 있는 값에서는 중복되는 경우의 수가 나와버리는 것이다. 즉, 5 > 3> 1 >3 >5를 요구하는 문제에서 5> 3> 1> 1> 3의 출력이 나오는 것이다.
이 원인은 위의 코드를 보면 여러 가지 for 문이 있지만, 크게 별을 찍어주는 for 문은 2가지이다.
증가하는 별과 감소하는 별 두 가지인데 처음엔 이 두 가지를 하나의 코드에서 구현하려고 하니 예시의 결과를 지속적으로 얻었다. 이를 해결하기 위해 +1~ -2 이런 식으로 여러 가지 방법을 시도하고 시험 시간의 대부분을 소모하여 결국 두 개로 분할하여 코드를 작성하였다.
이로 인해 오늘도 머리 아픈 코딩이었지만 나름 내가 원하는 방식으로 표현하는 것이 재미있었던 하루이다.