백준

백준 1193번 c#

대왕군 2024. 1. 27. 19:27

 

using System;

namespace Baekjoon
{
    internal class Program
    {
        static void Main(string[] args)
        {
            //그냥 콘솔창 예쁘게 꾸미는 코드(심심해서 넣음)
            Console.BackgroundColor = ConsoleColor.DarkCyan;

            //원하는 칸 받아옴
            int input = int.Parse(Console.ReadLine());

            //규칙 1 : 대각선으로 선을 그었을때 칸의 개수가 대각선 별로 1씩 늘어난다
            //규칙 2 : 대각선 기준 진행방향은 홀수번째 대각선은 위방향으로, 짝수번째 대각선은 아래방향으로 향한다
            //규칙 3 : 대각선 기준 홀수번째 대각선은 진행방향(우측상단으로) 기준 분자가 1씩 줄어들고, 분모는 1씩 늘어난다
            //규칙 4 : 대각선 기준 짝수번째 대각선은 진행방향(좌측하단으로) 기준 분자가 1씩 늘어나고, 분모는 1씩 줄어든다
            //규칙 5 : 대각선 기준 줄이 바뀔때 짝수번째 대각선은 분모가 1 늘어나고, 홀수번째 대각선은 분자가 1 늘어난다
            //규칙 6 : 제일 왼쪽줄은 무조건 (그 줄의 번호 / 1)이다 ex) 2번째줄 제일 왼쪽칸의 값은 2/1
            //규칙 7 : 제일 윗줄은 무조건 (1 / 그 줄의 번호)이다 ex) 3번째줄 제일 윗줄칸의 값은 1/3

            //분자 변수
            int x = 1;
            //분모 변수
            int y = 1;

            //칸 개수
            int room = 1;
            //내가 원하는 칸이 몇번째 대각선에 있는지 기록할 변수(좌측 상단 1/1칸부터 첫번째 대각선임)
            int count = 1;

            //내가 원하는 칸과 현재 만들어진 칸을 비교
            //내가 원하는 칸이 현재 만들어진 칸 내에 있으면 칸 만드는 거 중지
            //내가 원하는 칸이 몇번째 대각선에 있는지 확인하는 코드임
            while (room < input)
            {
                //현재방 개수 = 이전방 개수 + (이전방 개수 + 1)
                //규칙 1번 참조
                room = room + count + 1;
                //현재 만들어진 칸의 대각선 순서를 +1 해줌
                count++;
            }

            //만약 내가 찾는 값이 짝수값 순서의 대각선에 위치할 때
            if (count % 2 == 0)
            {
                //x(분자)를 대각선 순서로 대입해줌
                //규칙 6번 참조
                x = count;

                //전체칸 - 내가 원하는 칸만큼 반복함
                //이 공식은 내가 원하는 값이 있는 대각선줄의 마지막칸과 내가 원하는 값의 칸의 차이임
                //규칙 4번을 참조했을때 그 대각선줄의 마지막칸은 좌측하단칸임
                //규칙 4번을 반대로 하면 내가 원하는 값의 칸 번호를 알 수 있음
                for (int i = 0; i < room - input; i++)
                {
                    x--;
                    y++;
                }
            }
            //만약 내가 찾는 값이 홀수값 순서의 대각선에 위치할 때
            else
            {
                //y(분모)를 대각선 순서롤 대입해줌
                //규칙 7번 참조
                y = count;

                //전체칸 - 내가 원하는 칸만큼 반복함
                //이 공식은 내가 원하는 값이 있는 대각선줄의 마지막칸과 내가 원하는 값의 칸의 차이임
                //규칙 3번을 참조했을때 그 대각선줄의 마지막칸은 우측상단칸임
                //규칙 3번을 반대로 하면 내가 원하는 값의 칸 번호를 알 수 있음
                for (int i = 0; i < room - input; i++)
                {
                    x++;
                    y--;
                }
            }

            //결과 출력
            Console.WriteLine($"{x}/{y}");

        }

    }
}

 

 

이 문제를 머리가 나빠서 약 2시간 동안 풀고 있었다

문제에서 보이는 규칙들을 하나씩 나열하다가 그 규칙들을 이용해서 겨우 풀었다

 

문제를 다 풀고 다른 사람들 코드를 대강 확인했는데, 꽤 간결한 코드들이 많았다

내가 해괴한 방식으로 푼 것 같아 좀 아쉽다