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을 추가해줌
  1. R은 열 인덱스를 반대로 탐색 후 리스트 뒤집어 주기
  2. U는 행과 열을 뒤집어서 탐색
  3. 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

https://youtu.be/gOsM-DYAEhY

 

 

 

 

Falling too fast to prepare for this
준비하는데 너무 빨리 실패했어
Tripping in the world could be dangerous
세상에서 미치면 위험할 수도 있어
Everybody circling, it's vulturous
모두가 독수리처럼 빙빙 돌고있지
Negative, nepotist
부정적이고, 이기적이게


Everybody waiting for the fall of man
모두가 타락하길 기다리고
Everybody praying for the end of times
모두가 종말이 오길 기도하며
Everybody hoping they could be the one
모두가 특별한 존재가 되고싶어하지
I was born to run, I was born for this
난 타고났어, 그럴려고 태어났거든.


Whip, whip
채찍질을 해
Run me like a racehorse
나를 경주마처럼 달리게 해줘
Pull me like a ripcord
낙하산 줄처럼 잡아당겨줘
Break me down and build me up
날 무너뜨리고, 다시 일으켜줘
I wanna be the slip, slip
나는 쪽지가 되고 싶어
Word upon your lip, lip
너의 잎술에서 나온 단어처럼
Letter that you rip, rip
너가 찢어버린 편지처럼
Break me down and build me up
날 무너뜨리고, 다시 크게해줘


Whatever it takes
그 어떤 것이라도
'Cause I love the adrenaline in my veins
내 몸에 아드레날린이 흐르는 느낌이 좋거든
I do whatever it takes
그 어떤것이라도 난 할거야
'Cause I love how it feels when I break the chains
내 한계를 뛰어넘는 기분을 잘 알거든

Whatever it takes
그게 뭐든지 간에
Yeah, take me to the top I'm ready for
날 최고로 만들어줘, 준비가 됐거든
Whatever it takes
그게 무엇이든지
'Cause I love the adrenaline in my veins
내 몸의 아드레날린이 좋거든
I do what it takes
난 뭐든지 할거야


Always had a fear of being typical
평범하게 되는게 항상 무서웠어
Looking at my body feeling miserable
비참한 나를 바라보며
Always hanging on to the visual
항상 외적인 것에만 목을 매었지
I wanna be invisible
난 보이지 않고 싶어


Looking at my years like a martyrdom
힘들었던 내 삶을 돌아보며
Everybody needs to be a part of 'em
모두가 그 삶의 일부여야만 할것 같아
Never be enough, I'm the prodigal son
난 만족을 해본적이 없어, 낭비하는 놈이어서
I was born to run, I was born for this
난 타고났어, 그럴려고 태어났거든.

Whip, whip
채찍질을 해
Run me like a racehorse
나를 경주마처럼 달리게 해줘
Pull me like a ripcord
낙하산 줄처럼 잡아당겨줘
Break me down and build me up
날 무너뜨리고, 다시 일으켜줘
I wanna be the slip, slip
나는 쪽지가 되고 싶어
Word upon your lip, lip
너의 잎술에서 나온 단어처럼
Letter that you rip, rip
너가 찢어버린 편지처럼
Break me down and build me up
날 무너뜨리고, 다시 크게해줘

Whatever it takes
그 어떤 것이라도
'Cause I love the adrenaline in my veins
내 몸에 아드레날린이 흐르는 느낌이 좋거든
I do whatever it takes
그 어떤것이라도 난 할거야
'Cause I love how it feels when I break the chains
내 한계를 뛰어넘는 기분을 잘 알거든

Whatever it takes
그게 뭐든지 간에
Yeah, take me to the top I'm ready for
날 최고로 만들어줘, 준비가 됐거든
Whatever it takes
그게 무엇이든지
'Cause I love the adrenaline in my veins
내 몸의 아드레날린이 좋거든
I do what it takes
난 뭐든지 할거야


Hypocritical, egotistical
위선적이고 이기적이야
Don't wanna be the parenthetical, hypothetical
난 가상의 인물이 되고 싶진 않아
Working onto something that I'm proud of, out of the box
내가 특별히 자랑스럽게 여기는 일들을 해
An epoxy to the world and the vision we've lost
세상과 잃어버린 미래를 다시 붙여줄 일들 말이야.
I'm an apostrophe
난 어퍼스트로피야
I'm just a symbol to remind you that there's more to see
너에게 더 많은 것을 깨닫게 해줄 상징이자
I'm just a product of the system, a catastrophe
그저 세상의 산물일뿐이야, 재앙이지
And yet a masterpiece, and yet I'm half-diseased
그런데도 걸작면서, 그럼에도 어중간이야
And when I am deceased
그러다 내가 죽으면
At least I go down to the grave and die happily
적어도 무덤에선 행복할것 같아
Leave the body and my soul to be a part of thee
내 몸과 영혼이 너의 일부가 되도록 남길게
I do what it takes
내 사명을 다하도록



Whatever it takes
그 어떤 것이라도
'Cause I love the adrenaline in my veins
내 몸에 아드레날린이 흐르는 느낌이 좋거든
I do whatever it takes
그 어떤것이라도 난 할거야
'Cause I love how it feels when I break the chains
내 한계를 뛰어넘는 기분을 잘 알거든

Whatever it takes
그게 뭐든지 간에
Yeah, take me to the top I'm ready for
날 최고로 만들어줘, 준비가 됐거든
Whatever it takes
그게 무엇이든지
'Cause I love the adrenaline in my veins
내 몸의 아드레날린이 좋거든
I do what it takes
난 뭐든지 할거야

 

 

 

19년 여름 국토종주 중 나에게 힘을 준 특별한 노래

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

 

1916번: 최소비용 구하기

첫째 줄에 도시의 개수 N(1 ≤ N ≤ 1,000)이 주어지고 둘째 줄에는 버스의 개수 M(1 ≤ M ≤ 100,000)이 주어진다. 그리고 셋째 줄부터 M+2줄까지 다음과 같은 버스의 정보가 주어진다. 먼저 처음에는 그

www.acmicpc.net

접근 방법

아주 간단한 다익스트라 문제였다. 입력받은 간선의 정보로 그래프를 그리고 다익스트라를 구현하여 가야하는 곳의 최소비용을 구하였다.

 

문제 풀이

  • 입력받은 노선들을 리스트 배열로 (다음 지점, 가중치) 그래프를 만들기
  • 탐색확인용 visited, 탐색 가중치를 넣을 distance 배열을 생성 -> distance배열의 초기값에는 버스의 개수*최대가중치값을 넣어줌
  • 우선순위 큐로 다익스트라를 구현하여, 현재 dequeue 된 지점이 탐색하지 않았을 경우 그 점에 연결된 노드 들을 탐색하며 가중치를 비교 -> 작은것을 세트 후, 우선순위 큐에 다시 넣어주기
  • 탐색이 끝나고, distance 가야할 곳의 인덱스 값 출력
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Baekjoon.Gold
{
    class _1916
    {
        static void Main(string[] args)
        {
            int n = int.Parse(Console.ReadLine());
            int m = int.Parse(Console.ReadLine());
            List<(int, int)>[] graph = new List<(int, int)>[n+1];
            for (int i = 1; i <= n; i++)
                graph[i] = new List<(int, int)>();

            for(int i = 0; i<m; i++)
            {
                int[] arr = Array.ConvertAll(Console.ReadLine().Split(), int.Parse);
                graph[arr[0]].Add((arr[1], arr[2]));
            }

            //시작, 종점
            int[] togo = Array.ConvertAll(Console.ReadLine().Split(), int.Parse);

            bool[] visited = new bool[n + 1]; //탐색했는지
            int[] distance = Enumerable.Repeat(100000000, n + 1).ToArray(); //가중치
            PriorityQueue<int, int> pq = new PriorityQueue<int, int>(); //(다음탐색점, 가중치)
            pq.Enqueue(togo[0], 0);
            distance[togo[0]] = 0;

            //다익스트라
            while(pq.Count > 0)
            {
                int point = pq.Dequeue();
                if (!visited[point])
                {
                    visited[point] = true;

                    foreach((int, int) next in graph[point])
                    {
                        distance[next.Item1] = Math.Min(distance[next.Item1], next.Item2 + distance[point]);
                        pq.Enqueue(next.Item1, distance[next.Item1]);
                    }
                }
            }

            Console.WriteLine(distance[togo[1]]);
        }
    }
}

 

'문제 풀이 > C#' 카테고리의 다른 글

[23796] - 2,147,483,648 게임  (0) 2022.11.28
[1238] - 파티  (1) 2022.11.24
[1956] - 운동  (0) 2022.11.23
[17300] - 패턴  (0) 2022.11.22
[22867] - 종점  (0) 2022.11.21

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

 

1238번: 파티

첫째 줄에 N(1 ≤ N ≤ 1,000), M(1 ≤ M ≤ 10,000), X가 공백으로 구분되어 입력된다. 두 번째 줄부터 M+1번째 줄까지 i번째 도로의 시작점, 끝점, 그리고 이 도로를 지나는데 필요한 소요시간 Ti가 들어

www.acmicpc.net

접근 방법

시작점과 일정한 종점이 주어졌으므로 다익스트라 알고리즘을 사용하였다. 학생마다 집 → 종점 + 종점→ 집의 거리를 구해 가장 오래 걸리는 것이 답.

 

문제 풀이

  • 다익스트라를 사용하기위해 리스트로 그래프 만들기
  • 우선순위 큐로 (탐색 지점, 가중치)를 넣고, 그래프 내의 현재 탐색 지점에서 갈 수 있는 곳의 가중치를 비교 후, 최솟값으로 다시 큐에 넣어주기
  • 1번 학생부터 N번 학생까지 반복문으로 다익스트라를 사용하여 집 → X, X → 집의 거리를 구한 뒤 합, 학생중 최대값을 ans 에 저장
  • ans 출력
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Baekjoon.Gold
{
    class _1238
    {
        static List<(int, int)>[] graph;
        static int v;

        static void Main(string[] args)
        {
            int[] n = Array.ConvertAll(Console.ReadLine().Split(), int.Parse);
            v = n[0];
            int x = n[2];

            graph = new List<(int, int)>[v + 1];
            for (int i = 1; i <= v; i++)
                graph[i] = new List<(int, int)>();

            for (int i = 0; i < n[1]; i++)
            {
                int[] arr = Array.ConvertAll(Console.ReadLine().Split(), int.Parse);
                graph[arr[0]].Add((arr[1], arr[2]));
            }


            int ans = 0;
            for(int i = 1; i<= v; i++)
            {
                int go = dijkstra(i, x);
                int back = dijkstra(x, i);

                ans = Math.Max(ans, go + back);
            }

            Console.WriteLine(ans);

        }

        static int dijkstra(int start, int end)
        {
            bool[] visited = new bool[v + 1];

            int[] distance = Enumerable.Repeat(1000001, v + 1).ToArray();
            PriorityQueue<int, int> pq = new PriorityQueue<int, int>();
            pq.Enqueue(start, 0);
            distance[start] = 0;

            while (pq.Count > 0)
            {
                int point = pq.Dequeue();

                if (!visited[point])
                {
                    visited[point] = true;

                    foreach ((int, int) next in graph[point])
                    {
                        distance[next.Item1] = Math.Min(distance[next.Item1], distance[point] + next.Item2);
                        pq.Enqueue(next.Item1, distance[next.Item1]);
                    }
                }
            }

            return distance[end];
        }
    }
}

'문제 풀이 > C#' 카테고리의 다른 글

[23796] - 2,147,483,648 게임  (0) 2022.11.28
[1916] - 최소비용 구하기  (0) 2022.11.26
[1956] - 운동  (0) 2022.11.23
[17300] - 패턴  (0) 2022.11.22
[22867] - 종점  (0) 2022.11.21

+ Recent posts