I was solving a question on Codechef and I encountered this problem.

Here is the link to the question. https://www.codechef.com/LP0TO101/problems/FLOW013

Basically we are given three angles and we need to check if their sum is 180 and therefore it is a triangle, and if it is we need to print YES or else we need to print NO.

We are given input in the following format.

3 
40 40 100
45 45 90
180 1 1

[Note: There is a blank string(" ") right after 3.]

This is my source code.

import java.util.Scanner;
import java.util.stream.IntStream;

class Codechef {
    public static void main(String[] args) throws java.lang.Exception {

        Scanner sc = new Scanner(System.in);
        int T = Integer.parseInt(sc.nextLine().split(" ")[0]);
        String[] output = new String[T];
        while (--T >= 0) {
            String arr[] = sc.nextLine().split(" ");

            System.out.println("arr[0]: " + Integer.parseInt(arr[0]));
            System.out.println("arr[1]: " + Integer.parseInt(arr[1]));
            System.out.println("arr[2]: " + Integer.parseInt(arr[2]));
            if ((Integer.parseInt(arr[0]) + Integer.parseInt(arr[1]) + Integer.parseInt(arr[2])) == 180) {
                output[T] = "YES";
            } else {
                output[T] = "NO";
            }
        }

        IntStream.range(0, output.length).forEach(h -> System.out.println(output[h]));

    }
}


The output it is returning on Codechef is:

arr[0]: 40
arr[1]: 40
arr[2]: 100
arr[0]: 45
arr[1]: 45
arr[2]: 90
arr[0]: 180
arr[1]: 1
arr[2]: 1
NO
YES
YES

What is wrong here, please help.

My question is how come arr[0]: 40 + arr[1]: 40 + arr[2]: 100 is not equal to 180, I mean 40 + 40 + 100 should be equal to 180, so what is wrong.

When in the Eclipse IDE I gave the input of:

1
40 40 100

It showed me output of:

arr[0]: 40
arr[1]: 40
arr[2]: 100
YES

But when I give the same output there, it doesn't executes fully and keeps processing while it is incomplete and shows me output of(I am inserting the image):

enter image description here

Note: The red square in the right corner of the image shows that it is still executing.

However when I have removed the printing statements and gave the same input in eclipse, it showed me an output of: (Inserting an image again)

enter image description here

I hope you have understood my problem.

My question again is how come arr[0]: 40 + arr[1]: 40 + arr[2]: 100 is not equal to 180, I mean 40 + 40 + 100 should be equal to 180, what is wrong. And when I am executing it individually it is showing me the right output but when I do the test case on Codechef it is showing the opposite answer.

What is wrong here?

3

There are 3 best solutions below

0
Turing85 On BEST ANSWER

The variable T runs "backwards"; it starts at - in the example - 2 and ends at 0. Variable T is also used to index the output array. This means that:

  • output[2] correlates with the 1st iteration (i.e. the input 40 40 100),
  • output[1] correlates with the 2nd iteration (i.e. the input 45 45 90), and
  • output[0] correlates with the 3rd iteration (i.e. the input 180 1 1).

Now we see that - in fact - the value of output[0] (being "NO") is correct since 180 + 1 + 1 = 182 != 180.

I rewrote the program such that the output is stored in the order the values are calculates:

class Ideone {
  public static void main(String[] args) {
    Scanner sc = new Scanner(System.in);
    int num = Integer.parseInt(sc.nextLine().split(" ")[0]);
    String[] output = new String[num];
    for (int index = 0; index < num; ++index) {
      String arr[] = sc.nextLine().split(" ");

      System.out.println("arr[0]: " + Integer.parseInt(arr[0]));
      System.out.println("arr[1]: " + Integer.parseInt(arr[1]));
      System.out.println("arr[2]: " + Integer.parseInt(arr[2]));
      if ((Integer.parseInt(arr[0]) + Integer.parseInt(arr[1]) + Integer.parseInt(arr[2])) == 180) {
        output[index] = "YES";
      } else {
        output[index] = "NO";
      }
    }
    System.out.println(Arrays.toString(output));
  }
}

This then gives the output:

...
[YES, YES, NO]

Ideone.com demo


Some remarks:

  • We should use descriptive names for variables (e.g. String[] arr could be String[] userInputs)

  • variable names should be writte in lowerCamelCase (int T = ... -> int t = ...)

  • Instead of parsing the Strings over and over again, I would suggest to parse them once, and then - for example - store them in a List<Integer> and work with them, e.g.:

    List<Integer> values = Arrays.stream(arr)
        .mapToInt(Integer::parseInt)
        .boxed()
        .toList();
    
  • While possible, it is uncommon to write the array-brackets ([]) after the variable name. We normally write them after the type since they influence the type (String arr[] -> String[] arr).

0
Mureinik On

The loop iterates over --T, and then you use T as the array index for the result, meaning you're getting the results in reverse order. One way to solve this is to use a straight-up ascending for loop and use its index as the array index:

for (int i = 0; i < T; ++i) {
    // The logic remains unchanged
    String arr[] = sc.nextLine().split(" ");

    System.out.println("arr[0]: " + Integer.parseInt(arr[0]));
    System.out.println("arr[1]: " + Integer.parseInt(arr[1]));
    System.out.println("arr[2]: " + Integer.parseInt(arr[2]));

    // i is used for the array index, not T
    if ((Integer.parseInt(arr[0]) + Integer.parseInt(arr[1]) + Integer.parseInt(arr[2])) == 180) {
        output[i] = "YES";
    } else {
        output[i] = "NO";
    }
}
0
Marzen On

you've assigned YES/NO into the array output with a reserved sort.when you are using --T the index of output in loop was 2,1,0 so the values in output are ["NO","YES","YES]. that's why you get a wrong result.

You can change the while loop to a simple for loop. for(int i=0;i<output.size;i++)` and assign YES/NO to output[i]