: 문제를 보면 이런식으로 순서가 정해지고 있는데 여기서 규칙을 찾을 수 있다.
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.ArrayList;
import java.util.Collections;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
int n = Integer.parseInt(br.readLine());
int num = 2;
String result = "";
int count = 0;
while(count != n) {
if(num % 2 == 0) {
for(int j = num-1 ; j >= 1 ; j--) {
int k = num - j;
result = j + "/" + k;
// bw.write(result + "\n");
count++;
if(count == n) {
break;
}
}
}else {
for(int j = 1 ; j <= num -1 ; j++) {
int k = num - j;
result = j + "/" + k;
// bw.write(result + "\n");
count++;
if(count == n) {
break;
}
}
}
num++;
// bw.write(">>>" + num + "\n");
}
bw.write(result);
bw.close();
}
}
- 사용자에게 n을 입력받는다.
- 각 줄의 합이 2부터 시작하기에(1번째 값인 1,1의 합이 2다.)
num의 값, 초기값을 2로 지정해둔다.- 연산한 횟수를 기록하는 count변수를 생성하였다.
- num이 짝수라면 빼는 값이 큰 수부터 시작하기에 num-1을 초기값으로 잡고, num을 1까지 빼게 되므로 조건을 1보다 크거나 같게로 설정하였다.
ex) 4라면 3을 빼고 나온 값을 k에 담는다.- 이렇게 뺀 값을 출력형태로 result에 저장한다.
- count를 증가시키는데 이때 count가 n과 같다면 반복문을 종료하고
result를 출력한다.
이렇게 했을 때 시간초과로 오류가 발생했다..
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.ArrayList;
import java.util.Collections;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
int n = Integer.parseInt(br.readLine());
String result = "";
int i = 0;
int count = 0;
while(true) {
if(n - i > 0){
n -= i;
count++; i++;
continue;
}
break;
}
int num = count+1;
if(num % 2 == 0) {
for(int j = num-1 , p = 0; p < n ; j--, p++) {
int k = num - j;
result = j + "/" + k;
}
}else {
for(int j = 1 , p = 0; p < n ; j++, p++) {
int k = num - j;
result = j + "/" + k;
}
}
bw.write(result);
bw.close();
}
}
시간을 줄이기 위해 while문과 for문을 분리하기로 했다.
while문 : n번째에 해당하는 분자와 분모의 합(
num
)이 무엇인지 찾아내는 구문
→ 각 줄이 분자와 분모의 합의 -1개수만큼 존재하므로
n에 각 줄의 개수를 빼면서 n이 몇 번째 줄에 속하는지를 구해낸다.
ex) 7번째라면 -0 -1 -2 -3 을 통해 count는 4, 즉 n은 4번째 줄에 속하게 되고 분자와 분모의 합(num
)은 5이다.
for문 : num이 짝수인지 홀수인지에 따라 빼는 값을 다르게 한다.