백준) 1193번

Bak·2024년 2월 19일
0

백준

목록 보기
3/4

처음 설계

: 문제를 보면 이런식으로 순서가 정해지고 있는데 여기서 규칙을 찾을 수 있다.

  • 한 줄에서 각각의 합은 모두 같다.
  • 각 줄에서 요소의 개수는 각각의 합에서 -1을 뺀 값이다.
  • 홀수의 경우 작은 수부터 시작하고 짝수의 경우 큰 수부터 시작한다.
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();
	}

}
  1. 사용자에게 n을 입력받는다.
  2. 각 줄의 합이 2부터 시작하기에(1번째 값인 1,1의 합이 2다.)
    num의 값, 초기값을 2로 지정해둔다.
  3. 연산한 횟수를 기록하는 count변수를 생성하였다.
  4. num이 짝수라면 빼는 값이 큰 수부터 시작하기에 num-1을 초기값으로 잡고, num을 1까지 빼게 되므로 조건을 1보다 크거나 같게로 설정하였다.
    ex) 4라면 3을 빼고 나온 값을 k에 담는다.
  5. 이렇게 뺀 값을 출력형태로 result에 저장한다.
  6. 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이 짝수인지 홀수인지에 따라 빼는 값을 다르게 한다.

0개의 댓글