백준
백준 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시간 동안 풀고 있었다
문제에서 보이는 규칙들을 하나씩 나열하다가 그 규칙들을 이용해서 겨우 풀었다
문제를 다 풀고 다른 사람들 코드를 대강 확인했는데, 꽤 간결한 코드들이 많았다
내가 해괴한 방식으로 푼 것 같아 좀 아쉽다