코딩테스트/BOJ

[BOJ] 1024 수열의 합 - JAVA

5월._. 2022. 6. 4.
728x90

1. 문제

 

1024번: 수열의 합

첫째 줄에 N과 L이 주어진다. N은 1,000,000,000보다 작거나 같은 자연수이고, L은 2보다 크거나 같고, 100보다 작거나 같은 자연수이다.

www.acmicpc.net

N과 L이 주어질 때, 합이 N이면서, 길이가 적어도 L인 가장 짧은 연속된 음이 아닌 정수 리스트를 구하는 프로그램을 작성하시오.

첫째 줄에 N과 L이 주어진다. N은 1,000,000,000보다 작거나 같은 자연수이고, L은 2보다 크거나 같고, 100보다 작거나 같은 자연수이다.

만약 리스트의 길이가 100보다 작거나 같으면, 연속된 수를 첫째 줄에 공백으로 구분하여 출력한다. 만약 길이가 100보다 크거나 그러한 수열이 없을 때는 -1을 출력한다.


2. 풀이

1.  숫자와 현재 값(split)을 나눠서 divide에 저장한다. 

2.  짝수라면 divide-split/2+1, 홀수라면 1을 더하지 않고 start를 정한다.

3.  만약 split이 100 초과거나 start가 0보다 작다면 끝낸다.

4.  짝수면서 x.5로 끝나거나, 홀수면서 나누어떨어진다면 가능한 split이다. 앞서 구한 start부터 split개수번만큼 더해가면서 출력한다.

5.  3이나 4에 해당하지 않는다면 split에 +1하고 다시 1번부터 반복한다.

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class BOJ_1024_수열의합 {
   public static void main(String[] args) throws IOException {
      StringTokenizer st = new StringTokenizer(new BufferedReader(new InputStreamReader(System.in)).readLine());
      int num = Integer.parseInt(st.nextToken());
      int split = Integer.parseInt(st.nextToken());

      int divide, start;
      StringBuilder sb = new StringBuilder();
      while(true){
         divide = num/split;
         start = split%2==0? divide-split/2+1:divide-split/2;
         if(split>100 || start<0){
            sb.append("-1\n");
            break;
         }
         else if((split%2==0 && (double)num/split-divide==0.5)|| (split%2==1 && (double)num/split-divide==0)){
            for(int i=0;i<split;i++){
               sb.append(start+i).append(' ');
            }
            break;
         }
         split++;
      }
      System.out.print(sb);
   }
}

3. 결과

역대급으로 많이 틀렸다. 타입체크 + 조건문 = 환장의 콜라보..

'코딩테스트 > BOJ' 카테고리의 다른 글

[BOJ] 1049 기타줄 - JAVA  (0) 2022.06.06
[BOJ] 1058 친구 - JAVA  (0) 2022.06.05
[BOJ] 1120 문자열 - JAVA  (0) 2022.05.31
[BOJ] 13458 시험감독 - JAVA  (0) 2022.05.23
[BOJ] 11559 PuyoPuyo - JAVA  (0) 2022.05.22

댓글