인프런 커뮤니티 질문&답변

신혁수님의 프로필 이미지
신혁수

작성한 질문수

10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트

5-M

5-M 12100 2048 (easy) 질문

해결된 질문

작성

·

88

·

수정됨

0

안녕하세요 큰돌님 강의 잘 듣고 있습니다!
다름이 아니라 구조체로 하지 않고 할 수 있을 것 같아서 다음과 같이 했는데 주석에 있는 반례에 직면하게 되어 왜 이러한 잘못된 결과가 나오는 지 궁금합니다.

 #include<iostream>

#include<algorithm>

#include<string.h>

#include<vector>

#include<map>

#include<queue>

#include<math.h>

#include<stack>

using namespace std;

int N;

int sum = 0;

void print(int board[41][41]) {

for (int i = 0; i < N; i++) {

for (int j = 0; j < N; j++) {

cout << board[i][j] << " ";

}

cout << "\n";

}

cout << "\n";

}

void rotate(int board[41][41]) {

int temp[41][41] = { 0 };

for (int i = 0; i < N; i++) {

for (int j = 0; j < N; j++) {

temp[i][j] = board[N - 1 - j][i];

}

}

memcpy(board, temp, sizeof(temp));

}

void slide(int board[41][41]) {

int temp[41][41] = { 0 };

for (int i = 0; i < N; i++) {

int cnt = 0;

for (int j = 0; j < N; j++) {

if (board[i][j] == 0)

continue;

if (cnt == 0) {

temp[i][cnt] = board[i][j];

cnt++;

}

else {

if (temp[i][cnt - 1] == board[i][j]) {

temp[i][cnt - 1] = board[i][j] * 2;

}

else {

temp[i][cnt] = board[i][j];

cnt++;

}

}

}

}

memcpy(board, temp, sizeof(temp));

}

void counting(int board[41][41]) {

for (int i = 0; i < N; i++) {

for (int j = 0; j < N; j++) {

sum = max(sum, board[i][j]);

}

}

}

void game(int here, int board[41][41]) {

if (here == 5) {

counting(board);

//print(board);

return;

}

for (int i = 0; i < 4; i++) {

int cpy[41][41] = { 0 };

memcpy(cpy, board, sizeof(cpy));

slide(cpy);

game(here + 1, cpy);

rotate(board);

}

return;

}

int main() {

ios_base::sync_with_stdio(0);

cin.tie(0);

cout.tie(0);

int board[41][41] = { 0 };

cin >> N;

for (int i = 0; i < N; i++) {

for (int j = 0; j < N; j++) {

cin >> board[i][j];

}

}

game(0, board);

cout << sum;

}

/*

4

2 4 16 8

8 4 0 0

16 8 2 0

2 8 2 0

답 32

*/

 

답변 1

0

큰돌님의 프로필 이미지
큰돌
지식공유자

안녕하세요 혁수님 ㅎㅎ

slide부분에서 약간의 문제가 있었던 것 같습니다.

나머지 부분은 너무나 잘 짜셨습니다.

제가 다듬은 코드는 다음과 같습니다. 다음과 같이 slide부분만 좀 고치시면 됩니다.

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

int N;
int sum = 0;

void rotate(int board[41][41]) {
    int temp[41][41] = { 0 };
    for (int i = 0; i < N; i++) {
        for (int j = 0; j < N; j++) {
            temp[i][j] = board[N - 1 - j][i];
        }
    }
    memcpy(board, temp, sizeof(temp));
}

void slide(int board[41][41]) {
    int temp[41][41] = { 0 };
    for (int i = 0; i < N; i++) {
        int cnt = 0;
        for (int j = 0; j < N; j++) {
            if (board[i][j] == 0) continue;
            if (temp[i][cnt] == 0) {
                temp[i][cnt] = board[i][j];
            } else if (temp[i][cnt] == board[i][j]) {
                temp[i][cnt] *= 2;
                cnt++;
            } else {
                cnt++;
                temp[i][cnt] = board[i][j];
            }
        }
    } 
    memcpy(board, temp, sizeof(temp));
}


void counting(int board[41][41]) {
    for (int i = 0; i < N; i++) {
        for (int j = 0; j < N; j++) {
            sum = max(sum, board[i][j]);
        }
    }
}

void game(int here, int board[41][41]) {
    if (here == 5) {
        counting(board);
        return;
    }

    for (int i = 0; i < 4; i++) {
        int cpy[41][41];
        memcpy(cpy, board, sizeof(cpy));

        slide(cpy);
        game(here + 1, cpy);
        rotate(board);
    }
}

int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);

    cin >> N;
    int board[41][41] = { 0 };

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

    game(0, board);

    cout << sum;
    return 0;
}

그리고 다음에 주실 땐 들여쓰기해서 주세요 ㅎㅎ 디버깅 하기가 너무 힘듭니다. ㅠㅠ



또 질문 있으시면 언제든지 질문 부탁드립니다.

좋은 수강평과 별점 5점은 제게 큰 힘이 됩니다. :)

감사합니다.

강사 큰돌 올림. 


 

신혁수님의 프로필 이미지
신혁수

작성한 질문수

질문하기