코딩굼벵이
구르는 중
코딩굼벵이
  • 분류 전체보기 (116)
    • [C_C++]이론 공부 (17)
      • 알고리즘 (11)
      • 이론+STL (6)
    • [C_C++]코딩테스트 연습 (45)
      • [프로그래머스] level 1 (26)
      • [프로그래머스] level 2 (5)
      • [백준] 일반 문제 (12)
      • 기타 (2)
    • Solana (28)
      • Documentation (9)
      • Validator - 공부 (10)
      • Validator - 실행 (devnet & te.. (6)
      • 그 외 (3)
    • React (4)
    • Linux (2)
    • Javascript (2)
    • 블록체인 기반 핀테크 및 응용 SW 개발 (8)
      • React (1)
      • Javascript (3)
      • Solidity (3)
      • 프로젝트 (1)
    • 기타 (10)

블로그 메뉴

  • 🌟 깃허브
  • 🌿 Portfolio(2021)
  • 홈
  • 태그
  • 방명록

티스토리

최근 글

태그

  • Immer #ContextAPI
  • 솔라나
  • 모니터링
  • Hooks #React
  • grafana
  • 밸리데이터

인기 글

전체 방문자
오늘
어제
hELLO · Designed By 정상우.
코딩굼벵이

구르는 중

[C_C++]코딩테스트 연습/[백준] 일반 문제

[백준] 삼성 SW 역량 테스트 기출 - 2048 (Easy) (C언어)

2022. 7. 20. 15:59
728x90

https://www.acmicpc.net/problem/12100

 

12100번: 2048 (Easy)

첫째 줄에 보드의 크기 N (1 ≤ N ≤ 20)이 주어진다. 둘째 줄부터 N개의 줄에는 게임판의 초기 상태가 주어진다. 0은 빈 칸을 나타내며, 이외의 값은 모두 블록을 나타낸다. 블록에 쓰여 있는 수는 2

www.acmicpc.net

 

문제 해석

최대 20 * 20 의 2차원 공간에 상하좌우로 보드를 이동할 수 있고, 규칙에 따라 숫자가 이동 or 합산된다.

최초 입력되는 보드에서 최대 5번만 이동해 보드에서 가장 큰 블록의 값을 출력하는 문제이다.

1회 움직임에서 선택할 수 있는 경우는 상하좌우 4가지다. 최대 5번의 움직임만 생각하면 되므로 다해보면 되는 DFS 문제.

4 ^ 5 = 1024(움직임의 경우의 수)
=> 1024 * 20 * 20 = 409600 (움직임의 발생 횟수 * 보드의 크기)

 

상하좌우 4개의 함수를 구현해 따로 처리해도 되지만,
코딩 실수와 코딩 시간을 줄이기 위해서는 한가지 방향만 구현하고, 보드를 90도 돌리는 함수를 구현하면 코딩 시간을 줄일 수 있다.

#include <stdio.h>

int n;
int ret = 0;

struct BOARD
{
    int map[20][20];

    void rotate()
    {
        int temp[20][20];

        // 보드 90도 돌리기
        for (int y = 0; y < n; ++y)
        {
            for (int x = 0; x < n; ++x)
            {
                temp[y][x] = map[n - x - 1][y];
            }
        }
        // temp에 넣은 것 map에 복사
        for (int y = 0; y < n; ++y)
        {
            for (int x = 0; x < n; ++x)
            {
                map[y][x] = temp[y][x];
            }
        }
    }

    // 최대값 저장
    int get_max()
    {

        for (int y = 0; y < n; ++y)
        {
            for (int x = 0; x < n; ++x)
            {
                if (ret < map[y][x])
                {
                    ret = map[y][x];
                }
            }
        }
        return ret;
    }

    void up()
    {
        int temp[20][20];

        for (int x = 0; x < n; ++x)
        {
            // temp에 갱신이 있었는지 체크하는 플래그
            int flag = 0, target = -1;
            for (int y = 0; y < n; ++y)
            {
                if (map[y][x] == 0)
                {
                    continue;
                }
                // temp에 값이 한번 옮겨졌었고, 옮기려는 값과 앞에서 옮겨졌던 값(타겟팅된 값)이 같으면 업데이트
                if (flag == 1 && map[y][x] == temp[target][x])
                {
                    temp[target][x] *= 2, flag = 0;
                }
                else
                {
                    temp[++target][x] = map[y][x], flag = 1;
                }
            }
            // 값이 합쳐지고 나면 target이 끝까지 돌지 않고 끝나므로 돌면서 0으로 채워주기
            for (++target; target < n; ++target)
            {
                temp[target][x] = 0;
            }
        }
        // temp에 넣은 것 map에 복사
        for (int y = 0; y < n; ++y)
        {
            for (int x = 0; x < n; ++x)
            {
                map[y][x] = temp[y][x];
            }
        }
    }
};

void dfs(BOARD cur, int count)
{
    if (count == 5)
    {
        cur.get_max();
        return;
    }

    for (int dir = 0; dir < 4; ++dir)
    {
        BOARD next = cur;
        next.up();
        dfs(next, count + 1);
        cur.rotate();
    }
}

int main()
{
    BOARD board;
    scanf("%d", &n);
    for (int y = 0; y < n; ++y)
    {
        for (int x = 0; x < n; ++x)
        {
            scanf("%d", &board.map[y][x]);
        }
    }

    ret = 0;
    dfs(board, 0);
    printf("%d\n", ret);

    return 0;
}
저작자표시 비영리 변경금지 (새창열림)

'[C_C++]코딩테스트 연습 > [백준] 일반 문제' 카테고리의 다른 글

[백준] 11726, 11727, 14852 2xn 타일링, 2133 3xn 타일링 (C, DP)  (0) 2022.08.18
[백준] 10699 오늘 날짜(C언어)  (0) 2022.07.24
[백준] 삼성 SW 역량 테스트 기출 - 구슬탈출2 (C언어)  (0) 2022.07.19
[백준] 11721 열 개씩 끊어 출력하기 - C++ 입출력  (0) 2022.01.22
[백준] 11720 숫자의 합 - C++ 입출력  (0) 2022.01.22
    '[C_C++]코딩테스트 연습/[백준] 일반 문제' 카테고리의 다른 글
    • [백준] 11726, 11727, 14852 2xn 타일링, 2133 3xn 타일링 (C, DP)
    • [백준] 10699 오늘 날짜(C언어)
    • [백준] 삼성 SW 역량 테스트 기출 - 구슬탈출2 (C언어)
    • [백준] 11721 열 개씩 끊어 출력하기 - C++ 입출력
    코딩굼벵이
    코딩굼벵이
    구르는 재주 연마 중

    티스토리툴바