https://www.acmicpc.net/problem/23796
23796번: 2,147,483,648 게임
호준이는 2048 게임을 발전시킨 2,147,483,648 게임을 하고 있다. 2,147,483,648 게임은 \(8 \times 8\) 크기의 게임판에서 키보드의 방향키를 통해 \(2^k\) (\(1 \le k \le 30\))꼴에 해당하는 정수가 쓰여 있는
www.acmicpc.net
접근 방법
입력받은 배열을 UDLR에 맞게 하나하나 비교해가며 같으면 더하고, 아니면 넘어가는 형식으로 리스트 배열에 추가하여 치우치는 곳을 기준으로 출력하였다.
문제 풀이
- L 기준
- int형으로는 2147483647까지 받을 수 있으니 long으로 배열, List배열 선언.
- choose 정수를 선언 후, 0이면 그 값으로 선정
- choose가 0이 아니면 비교할 대상이 있는 것
- 열의 값이 0이 아닐 때 choose와 값이 같으면 합칠 수 있으니 리스트에 choose*2 추가, 합쳐졌으니 choose는 0
- 같지 않으면 서로 합치지 못하니 리스트에 choose 추가, 못합쳤으니 choose는 배열의 값으로
- 한 행이 탐색이 끝나면 choose가 0이 아니면 합쳐지지 못한 값이므로 출력을 위해 리스트에 추가
- 리스트의 크기가 8이 될 때까지 0을 추가해줌
- R은 열 인덱스를 반대로 탐색 후 리스트 뒤집어 주기
- U는 행과 열을 뒤집어서 탐색
- D는 U탐색에서 행 인덱스를 반대로 탐색 후 뒤집기
- U와 D는 리스트가 가로로 되있으니 출력할 때는 세로로 출력
- L과 R은 그대로 출력
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Baekjoon.Gold
{
class _23796
{
static void Main(string[] args)
{
StringBuilder stb = new StringBuilder();
long[][] arr = new long[8][];
for (int i = 0; i < 8; i++)
arr[i] = Array.ConvertAll(Console.ReadLine().Split(), long.Parse);
string s = Console.ReadLine();// 입력
List<long>[] move = new List<long>[8];
for (int i = 0; i < 8; i++)
move[i] = new List<long>();
if(s == "U")
{
for(int i = 0; i < 8; i++)
{
long choose = 0;
for(int j = 0; j<8; j++)
{
if (choose == 0)
choose = arr[j][i];
else
{
if (arr[j][i] != 0)
{
if (choose == arr[j][i])
{
move[i].Add(choose * 2);
choose = 0;
}
else
{
move[i].Add(choose);
choose = arr[j][i];
}
}
}
}
if (choose != 0)
move[i].Add(choose);
while (move[i].Count < 8)
move[i].Add(0);
}
}
else if (s == "D")
{
for (int i = 0; i < 8; i++)
{
long choose = 0;
for (int j = 7; j >= 0; j--)
{
if (choose == 0)
choose = arr[j][i];
else
{
if (arr[j][i] != 0)
{
if (choose == arr[j][i])
{
move[i].Add(choose * 2);
choose = 0;
}
else
{
move[i].Add(choose);
choose = arr[j][i];
}
}
}
}
if (choose != 0)
move[i].Add(choose);
while (move[i].Count < 8)
move[i].Add(0);
move[i].Reverse();
}
}
else if (s == "L")
{
for(int i = 0; i < 8; i++)
{
long choose = 0;
for(int j = 0; j<8; j++)
{
if (choose == 0)
choose = arr[i][j];
else
{
if (arr[i][j] != 0)
{
if (choose == arr[i][j])
{
move[i].Add(choose * 2);
choose = 0;
}
else
{
move[i].Add(choose);
choose = arr[i][j];
}
}
}
}
if (choose != 0)
move[i].Add(choose);
while (move[i].Count < 8)
move[i].Add(0);
}
}
else
{
for(int i = 0; i<8; i++)
{
long choose = 0;
for(int j = 7; j>=0; j--)
{
if (choose == 0)
choose = arr[i][j];
else
{
if (arr[i][j] != 0)
{
if (choose == arr[i][j])
{
move[i].Add(choose * 2);
choose = 0;
}
else
{
move[i].Add(choose);
choose = arr[i][j];
}
}
}
}
if (choose != 0)
move[i].Add(choose);
while (move[i].Count < 8)
move[i].Add(0);
move[i].Reverse();
}
}
if(s == "U" || s == "D")
{
for(int i = 0; i<8; i++)
{
for(int j = 0; j<8; j++)
stb.Append($"{move[j][i]} ");
stb.AppendLine();
}
}
else
{
for(int i = 0; i< 8; i++)
stb.AppendLine(string.Join(" ", move[i]));
}
Console.WriteLine(stb);
}
}
}
'문제 풀이 > C#' 카테고리의 다른 글
[1916] - 최소비용 구하기 (0) | 2022.11.26 |
---|---|
[1238] - 파티 (1) | 2022.11.24 |
[1956] - 운동 (0) | 2022.11.23 |
[17300] - 패턴 (0) | 2022.11.22 |
[22867] - 종점 (0) | 2022.11.21 |