inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

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

5-M

5-M 12100 2048 (easy) 질문

해결된 질문

166

신혁수

작성한 질문수 2

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

*/

 

c++ 코딩-테스트

답변 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점은 제게 큰 힘이 됩니다. :)

감사합니다.

강사 큰돌 올림. 


 

코딩살구클럽 문의

0

7

1

코딩살구클럽 승인

0

18

2

DP 경우의 수 설명이 이해가 되지 않습니다.

0

27

2

3-F 채점 관련 질문

0

24

1

BFS, DFS 활용이 되는 상황에서의 방향성

0

28

2

코딩살구클럽 승인

0

41

2

코딩살구클럽승인

0

33

3

코딩살구클럽 승인

0

48

2

3-D 관련 질문

0

35

2

코살구 회원가입 문의

0

43

2

코살구 로그인 문제

0

65

2

3-A 문제 풀이 관련 질문

0

53

3

2-O 질문 있습니다

0

38

2

2-T 문제에 관한 질문

0

40

2

코딩 살구 클럽 접속 및 사용방법 문의

0

61

2

안녕하세요~. 현재 코살코딩클럽 사이트가 접속이 안됩니다~

0

64

2

코딩살구클럽 로그인문제

0

78

3

코딩 살구 클럽 로그인 문제

0

82

2

2-J 채점관련 질문

0

65

3

코딩 살구 클럽 Python 지원 가능 여부

0

77

1

살구클럽 아이디 없음 문제

0

76

1

1-O 코딩살구클럽 채점관련 질문

0

60

2

히든 테스트 케이스가 사라졌습니다

0

57

1

채점서버 혹시 다른 언어 지원도 가능하게 해주실 수 있나요

1

74

2