BOJ 1193
2020-01-31
위 문제는 백준 사이트의 알고리즘 1193 문제에 관한 설명입니다.
문제
무한히 큰 배열에 다음과 같이 분수들이 적혀있다.
1/1 | 1/2 | 1/3 | 1/4 | 1/5 | … |
2/1 | 2/2 | 2/3 | 2/4 | … | … |
3/1 | 3/2 | 3/3 | … | … | … |
4/1 | 4/2 | … | … | … | … |
5/1 | … | … | … | … | … |
이와 같이 나열된 분수들을 1/1 -> 1/2 -> 2/1 -> 3/1 -> 2/2 -> … 과 같은 지그재그 순서로 차례대로 1번, 2번, 3번, 4번, 5번, … 분수라고 하자.
X가 주어졌을 때, X번째 분수를 구하는 프로그램을 작성하시오.
입력
첫째 줄에 X(1 ≤ X ≤ 10,000,000)가 주어진다.
출력
첫째 줄에 분수를 출력한다.
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc= new Scanner(System.in);
int X =sc.nextInt();
int Line = checkLine(X);
int Num = checkNum(X);
printX(Line,Num);
sc.close();
}
public static int checkLine(int X) {
int temp = X;
int Line = 0;
for(int i = 0; temp>0;i++)
{
temp-=i;
Line=i;
}
return Line;
}
public static int checkNum(int X)
{
int tempX= X;
int Num=0;
for(int i = 0; tempX>0;i++)
{
Num = tempX;
tempX-=i;
}
return Num;
}
public static void printX(int Line,int Num)
{
int A = 1;
int B = 1;
if(Line %2 == 0)
{
B = Line;
for(int i = 1;i<Num;i++)
{
A++;
B--;
}
System.out.println(A +"/"+ B);
}
else
{
A = Line;
for(int i = 1;i<Num;i++)
{
A--;
B++;
}
System.out.println(A +"/"+ B);
}
}
}
제가 푼 소스코드입니다.
최대한 함수를 활용하려 노력했습니다.
코드 설명
public static int checkLine(int X) 에서는 Line의 수를 나타내려 했습니다.
왜?
1/1은 1의 Line
2/1, 1/2는 2의 Line
3/1, 2/2, 1/3는 3의 Line이라고 생각했습니다.
*참고로 Line은 개인적으로 정했을 뿐 정해진 이름은 아닙니다.
public static int checkNum(int X)
Line을 알고 나면 그 Line에서 몇번 째의 숫자인지를 확인하는 함수입니다.
public static void printX(int Line,int Num)
출력을 담당하는 함수입니다.
1/1은 1의 Line
2/1, 1/2는 2의 Line
3/1, 2/2, 1/3는 3의 Line
각라인에서 A를 분자, B를 분모라고 생각한 후
짝수 Line에서는 A = Line의 값
홀수 Line에서는 B = Line의 값
그리고 짝수에서는 A를 1씩 늘려주고 B를 1씩 줄여줍니다
홀수에서는 그 반대입니다.
그리고 출력을 하면됩니다.
#include <stdio.h>
int main()
{
int n, cnt = 0;
scanf("%d", &n);
while(n > 0)
{
cnt++;
n -= cnt;
}
if(cnt % 2 == 0)
{
printf("%d/%d", cnt +n, 1 + (-n));
}
else
{
printf("%d/%d", 1 + (-n), cnt +n);
}
return 0;
}
다른분이 푸신 코드입니다.
상당히 쉽게 풀어내신 것 같아 대단하다는 생각이 듭니다.
조금 더 깔끔한 코드, 안전성과 성능을 증가시키기 위한 코드를 더욱 공부해야할 것 같습니다.