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

 

1956번: 운동

첫째 줄에 V와 E가 빈칸을 사이에 두고 주어진다. (2 ≤ V ≤ 400, 0 ≤ E ≤ V(V-1)) 다음 E개의 줄에는 각각 세 개의 정수 a, b, c가 주어진다. a번 마을에서 b번 마을로 가는 거리가 c인 도로가 있다는 의

www.acmicpc.net

접근 방법

시작점이 주어지지 않았고 종점에서 다시 시작점으로 돌아가야되니 모든 정점에서 최단거리를 찾는 플로이드-워셜 알고리즘을 사용했다.

 

문제 풀이

  • 단방향 노선에 최대 정점의 개수가 400, 최대 가중치가 10000이니 inf를 40000001로 설정
  • 입력받은 노선을 제외하고 나머지 노선들을 inf로 채우기
  • 플로이드-워셜 알고리즘을 사용하여 각 점들에서의 최소값 찾기
  • 반복문을 돌며 노선 중 inf가 아닐 때, 출발 i->j 노선과 되돌아가는 j->i 노선(사이클)의 합의 최소값을 ans에 저장
  • 만약 ans가 inf면 사이클이 없는것이니 -1, 아니면 사이클이 있으므로 ans 출력
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Baekjoon.Gold
{
    class _1965
    {
        static int inf = 4000001;
        static void Main(string[] args)
        {
            //0 - 정점, 1 - 간선
            int[] n = Array.ConvertAll(Console.ReadLine().Split(), int.Parse);
            int[][] graph = new int[n[0]+1][];
            for (int i = 1; i <= n[0]; i++)
                graph[i] = Enumerable.Repeat(inf, n[0] + 1).ToArray();

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

            //플로이드 - 워셜
            for(int mid = 1; mid <= n[0]; mid++) //거침
            {
                for(int i = 1; i <= n[0]; i++) //출발
                {
                    for(int j = 1; j <= n[0]; j++) //도착
                        graph[i][j] = Math.Min(graph[i][j], graph[i][mid] + graph[mid][j]);
                }
            }

            int ans = inf;
            for(int i = 1; i <= n[0]; i++)
            {
                for(int j =1; j <= n[0]; j++)   
                {
                    if (i == j)
                        continue;

                    if (graph[i][j] != inf && graph[j][i] != inf)
                        ans = Math.Min(ans, graph[i][j] + graph[j][i]);
                }
            }

            if (ans != inf)
                Console.WriteLine(ans);
            else
                Console.WriteLine(-1);
        }
    }
}

 

 

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

[1916] - 최소비용 구하기  (0) 2022.11.26
[1238] - 파티  (1) 2022.11.24
[17300] - 패턴  (0) 2022.11.22
[22867] - 종점  (0) 2022.11.21
[11404] - 플로이드  (0) 2022.11.19

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

 

17300번: 패턴

안드로이드 OS에는 휴대폰의 잠금을 풀기 위한 방법 중 패턴을 암호로 사용하는 방법이 있다. 3×3의 9개 점에 번호를 매겨 그중 일부로 하나의 수열을 만들었을 때, 수열에서 인접한 번호의 점을

www.acmicpc.net

접근 방법

1-9, 4-6 과 같이 연속적이지 않은 패턴들을 구별하여 하드코딩을 해주었다..

 

문제 풀이

  • 연속적이지 않은 패턴의 쌍 8개를 구분하여 입력이 들어오면 flag를 false로 변환
  • 이미 간 곳도 다시 갈 수 없고, 5-5와 같이 같은 곳에 2번도 할 수 없으니 flag를 false로 변환
  • 출력

 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Baekjoon.silver
{
    class _17300
    {
        static void Main(string[] args)
        {
            int n = int.Parse(Console.ReadLine());
            int[] arr = Array.ConvertAll(Console.ReadLine().Split(), int.Parse);
            bool[] check = new bool[10];


            (int, int) temp;
            bool flag = true;
            for(int i = 0; i< n-1; i++)
            {
                temp = (arr[i], arr[i + 1]);

                if (temp == (1, 3) || temp == (3, 1))
                {
                    if (!check[2])
                        flag = false;
                }
                else if (temp == (1, 7) || temp == (7, 1))
                {
                    if (!check[4])
                        flag = false;
                }
                else if (temp == (7, 9) || temp == (9, 7))
                {
                    if (!check[8])
                        flag = false;
                }
                else if (temp == (3, 9) || temp == (9, 3))
                {
                    if (!check[6])
                        flag = false;
                }
                else if (temp == (2, 8) || temp == (8, 2))
                {
                    if (!check[5])
                        flag = false;
                }
                else if (temp == (4, 6) || temp == (6, 4))
                {
                    if (!check[5])
                        flag = false;
                }
                else if (temp == (1, 9) || temp == (9, 1))
                {
                    if (!check[5])
                        flag = false;
                }
                else if (temp == (3, 7) || temp == (7, 3))
                {
                    if (!check[5])
                        flag = false;
                }
                //이미 간 곳 방지
                else if (check[arr[i + 1]])
                    flag = false;
                //같은 수 2번 방지
                else if (arr[i] == arr[i + 1])
                    flag = false;

                check[arr[i]] = true;
                if (!flag)
                    break;
            }

            if (flag)
                Console.WriteLine("YES");
            else
                Console.WriteLine("NO");
        }
    }
}

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

[1238] - 파티  (1) 2022.11.24
[1956] - 운동  (0) 2022.11.23
[22867] - 종점  (0) 2022.11.21
[11404] - 플로이드  (0) 2022.11.19
[13549] - 숨바꼭질 3  (0) 2022.11.18

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

 

22867번: 종점

주행을 마친 버스들이 종점에 들어온다. 종점에 들어온 버스는 버스를 정비하기 위한 자리에 들어간다. 즉, 종점에 버스 4대가 있다면 버스를 정비할 수 있는 공간이 최소 4개 이상 필요하다. 

www.acmicpc.net

접근 방법

1. 문자열을 정수로 파싱 후, arr[n][2] 배열에 저장, 0번인덱스, 1번 인덱스 순으로 정렬 후, 리스트에 0번 끝값을 넣어 현재 끝값과 다음 시작값을 비교하며 시작값이 끝값보다 작으면 리스트에 넣고 +1 -> 메모리 초과

2. 문자열 파싱 후, 들어오는 건 1, 나가는건 -1로 리스트에 튜플형으로 add. 0번 -> 1번 순으로 정렬 후 들어오고 나가는 순으로 정렬이 됬으니 실시간으로 +1 -1을 변수에 더해주며 최댓값(종점의 버스 수) 구하기 -> 맞음

 

문제 풀이

  • 입력받은 문자열을 시간에 맞게 정수형으로 파싱
  • 종점에 들어오는 것은 1, 나가는 것은 -1로 파싱한 수와 함께 튜플형으로 리스트에 추가
  • 리스트를 item1 오름차순 -> item2 오름차순으로 정렬
  • 들어오고 나가는 순이 정렬이 됬으므로 반복문으로 리스트의 item2값을 count에 계속 더해줌
  • 들어온 수가 최대일 때 -> 필요한 공간의 수 -> ans
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Baekjoon.Practice
{
    class _22867
    {
        static void Main(string[] args)
        {
            int n = int.Parse(Console.ReadLine());
            List<(int, int)> time = new List<(int, int)>();

            for(int i = 0; i< n; i++)
            {
                string[] s = Console.ReadLine().Split();
                string[] s1 = s[0].Split(':');  
                int s11 = int.Parse(s1[0]) * 3600000;
                int s12 = int.Parse(s1[1]) * 60000;
                double s13 = double.Parse(s1[2]) * 1000;

                string[] s2 = s[1].Split(':');
                int s21 = int.Parse(s2[0]) * 3600000;
                int s22 = int.Parse(s2[1]) * 60000;
                double s23 = double.Parse(s2[2]) * 1000;

                time.Add((s11+s12+(int)s13, 1)); //들어오는거 1
                time.Add((s21+s22+(int)s23, -1)); //나가는거 -1
            }

            time = time.OrderBy(x => x.Item1).ThenBy(x => x.Item2).ToList();

            int now = 0;
            int ans = 0;
            for (int i = 0; i < time.Count; i++)
            {
                now += time[i].Item2; //실시간 in out 확인
                ans = Math.Max(ans, now); //값의 최대
            }
            Console.WriteLine(ans);
        }
    }
}

들어오는 것과 나가는 시간이 같으면 출력이 0이됨..

ex)

1

0:00:000 0:00:000 -> -1 1순으로 정렬되서 필요한 공간 0개인데 정답임

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

[1956] - 운동  (0) 2022.11.23
[17300] - 패턴  (0) 2022.11.22
[11404] - 플로이드  (0) 2022.11.19
[13549] - 숨바꼭질 3  (0) 2022.11.18
[1504] - 특정한 최단 경로  (0) 2022.11.18

https://www.youtube.com/watch?v=u6RJv7f__Mg 

 

 

I remember the ocean
그 바다가 기억나네요
Memories die out too hard
이제는 잊혀져가는
We were travelling the mountains
우리는 산을 여행하곤 했죠
Just to find the loudest seas
가장 아름다운 바다를 찾기 위해

We settled down by the fire
모닥불 옆에 함께 앉아
Knowing we could aim higher
더 큰 목표를 가질 수 있다는걸 알면서도
But we didn't know that yet
그게 무엇인지 우리는 몰랐나 봐요
So if you want something to hold on to
그러니 누군가에게 기대고 싶다면
Gotta find it first
먼저 찾아보세요
But here I am
여기 제가 있지만요

'Cause I've been laying under palm trees
야자수 밑에 누워서
Waiting for the summer
여름을 기다려 왔어요
Knowing there's nowhere to go
갈 곳이 없는 걸 알아도
'Cause I am happy on this island
이 섬에서 난 행복하니까
Wanna be my funland?
저한테 섬이 되고 싶나요?
I don't ever want to leave
여기를 떠나고 싶지는 않은 걸요
I'm in a tropic love
난 뜨거운(열대와 같은) 사랑에 빠졌는 걸

x2

+ Recent posts