728x90
▶문제 : 2048게임 2 (codeup.kr)
2048게임 2
4*4의 판이 입력된다. (게임 방법은 앞의 문제를 참고 바람)
codeup.kr
▶코드 작성
#include <stdio.h>
int main()
{
int arr[4][4];
for (int i = 0; i < 4; i++) {
for (int j = 0; j < 4; j++) {
scanf("%d", &arr[i][j]);
}
}
int n;
for (int i = 0; i < 4; i++)//세로로 한줄씩 살펴보기
{
//합치는 부분
for (int j = 0; j < 3; j++)
{
if (arr[j][i] > 0)//0이 아닌 값들 골라내기
{
for (int l = j + 1; l < 4; l++)
{
if (arr[l][i] > 0)//0이 아닌 값들 골라내기
{
if (arr[j][i] == arr[l][i])
{//0이 아닌 값들 중 처음으로 찾은 값이 같다면
arr[j][i] *= 2;
arr[l][i] = 0;//합쳤으므로 0
}
break;//가까운 값들끼리 비교가 가능하므로 찾자마자 종료
}
}
}
}
//0값은 뒤로 미는 부분
n = 0;
for (int j = 0; j < 4; j++)
{
if (arr[j][i] > 0)//0이 아닌 값들은 앞에서부터 차곡차곡 대입한다
{
arr[n++][i] = arr[j][i];
}
}
for (int j = n; j < 4; j++)
{//대입하고 남은 공간은 0으로 채워준다
arr[j][i] = 0;
}
}
for (int i = 0; i < 4; i++) {
for (int j = 0; j < 4; j++) {
printf("%d ", arr[i][j]);
}
printf("\n");
}
return 0;
}
▶해석
세로로 첫 째줄부터 차근차근 반복하였다. 먼저 합치는 부분으로 0이 아닌 값을 배열의 위에서부터 찾고, 그 값과 가장 근접한 값이 합치기가 가능하므로 근접한 값 중 0이 아닌 값을 찾았다. 찾은 값이 전에 찾은 값과 같다면 합치기를 해주었고 합쳐진 후의 배열 빈 공간은 0을 대입하였다. 그리고 합치든 말든 0이 아닌 값을 찾으면 뒤에 남은 값들은 볼 이유가 없으므로 반복문을 종료해준다.
합치는 부분이 끝나면 0값을 뒤로 밀어줘야 하므로 변수 n을 이용하여 0이 아닌 값들은 앞에서부터 채워주고 남은 자리는 0으로 채워줬다. 이렇게 한 줄씩 반복해주면 값이 나온다.
처음에는 한 번에 계산이 가능할 줄 알고 몇 번 시도 끝에 포기하고 확실하게 가는 방향으로 코드를 작성하였다. 생각보다 시간이 오래 걸려서 , 코드가 더러워서 아쉽다.
728x90
'코드업(codeup) > C' 카테고리의 다른 글
코드업(codeup) 3129 : 올바른 괄호 2 C언어 (0) | 2022.01.17 |
---|---|
코드업(codeup) 2050 : 2048게임 3 C언어 (0) | 2022.01.16 |
코드업(codeup) 2048 : 2048게임 1 C언어 (0) | 2022.01.15 |
코드업(codeup) 3109 : 정올 참여 학생 리스트 만들기 2 C언어 (0) | 2022.01.14 |
코드업(codeup) 3170 : 기억력 테스트 9 C언어 (0) | 2022.01.10 |
댓글