반응형

코딩놀이! 10 Days of Statistics(HackerRank)

 Day 1-1: Quartiles



두 번째 문제!

 Objective 

In this challenge, we practice calculating quartiles. Check out the Tutorial tab for learning materials and an instructional video!

Task 
Given an array, , of  integers, calculate the respective first quartile (), second quartile (), and third quartile (). It is guaranteed that , and  are integers.

Input Format

The first line contains an integer, , denoting the number of elements in the array. 
The second line contains  space-separated integers describing the array's elements.

Constraints

  • , where  is the  element of the array.

Output Format

Print  lines of output in the following order:

  1. The first line should be the value of .
  2. The second line should be the value of .
  3. The third line should be the value of .

Sample Input

9
3 7 8 5 12 14 21 13 18

Sample Output

6
12
16

Explanation

. When we sort the elements in non-decreasing order, we get . It's easy to see that .

As there are an odd number of data points, we do not include the median (the central value in the ordered list) in either half:

Lower half (L): 3, 5, 7, 8

Upper half (U): 13, 14, 18, 21

Now, we find the quartiles:

  •  is the . So, .
  •  is the . So, .
  •  is the . So, .


음 두번째 문제는 Quartiles!!! 사분위수 구하기 입니다.

제 1 사분위수, 제2사분위수, 제3사분위수를 구하면 되는 문제네요 ㅎㅎ

역시나 문제읽기는 대충 패스! 인풋 아웃풋! 샘플


그럼 바로 문제 해석 들어갑니닷!


문제해석!

1. 입력받을 숫자의 갯수를 n 입력받습니다.

2. n 개 만큼 입력 받는다.

3. 입력 받은 n 숫자의 중앙 값을 찾습니다. -> Q2!

4. n중앙값(Q2)을 기준으로 왼쪽에 있는 값들의 중앙값을 찾습니다.-> Q1!

5. n중앙값(Q2)을 기준으로 오른쪽에 있는 값들의 중앙값을 찾습니다. -> Q3!

계산식!!!

1. n가 짝수 인지 홀수 인지 확인!(if(n%2==0))

* (여기서 잠깐!. % 는 mod 를 나타냅니다 만약(if) n을 2로 나눠서 나머지가 0인가? 라는 질문에서 0이면 짝수!, 0이아니면 홀수 겟죠??)*

 짝수인 경우(ex.1, 2, 3, 4, 5, 6)

홀수인경우 (ex. 1,2,3,4,5)

 2.중앙(3.5)에서 왼쪽(3)+오른쪽(4) 값을 2로나누면 Q2(3.5)

 3. 3.5의 왼쪽 값 1, 2, 3 의 중앙값은 Q1(2)

 4. 3.5의 오른쪽 값 4, 5, 6 의 중앙값은 Q3(5)

 2. 중앙의 값은 Q2(3)

 3. 중앙(3) 왼쪽 값 1,2 의 중앙값은 Q1(1.5 )

 4. 중앙(3) 오른쪽 값 4,5의 중앙값은 Q3(4.5)

이렇게 풀면 되는 문제 입니다! ㅎㅎ

(제가 수학을 잊은지가 오래되서 잘 기억은안나지만 그래프! 를 보시면 조금더 어렵게 느껴지실거예요 ㅋㅋㅋ, 가 아니라 표를보는게 더 편해요ㅋ)

(출처: 위키미디어;https://upload.wikimedia.org/wikipedia/commons/1/1a/Boxplot_vs_PDF.svg)


역시나 그래프를 보면 어디서 본듯하지만 이해는 안됩니다 사.분.위.수.란...


그래서 준비한! 이해력을 위한 꿀팁!

 n이 홀수일 경우!

Example: 5, 7, 4, 4, 6, 2, 8

Put them in order: 2, 4, 4, 5, 6, 7, 8

Cut the list into quarters:

Quartiles of 2, 4, 4, 5, 6, 7, 8

And the result is:

  • Quartile 1 (Q1) = 4
  • Quartile 2 (Q2), which is also the Median, = 5
  • Quartile 3 (Q3) = 7


 n이 짝수일 경우

Example: 1, 3, 3, 4, 5, 6, 6, 7, 8, 8

The numbers are already in order

Cut the list into quarters:

Quartiles

In this case Quartile 2 is half way between 5 and 6:

Q2 = (5+6)/2 = 5.5

And the result is:

  • Quartile 1 (Q1) = 3
  • Quartile 2 (Q2) = 5.5
  • Quartile 3 (Q3) = 7

(출처:mathsisfun, http//www.mathsisfun.com/data/quartiles.html)


위 사진을 보면 바로 이해가 되실거예요 ㅎㅎ




자 이제 역시나 슈도코딩?!!!이 나름 끝났으니 끄적끄적 코딩!!!!!!

 class Solution {

    static void Main(String[] args)

        {

            /* Enter your code here. Read input from STDIN. Print output to STDOUT. Your class should be named Solution */

            int inputCount = Convert.ToInt32(Console.ReadLine());

            int[] arr_q = Array.ConvertAll(Console.ReadLine().Split(' '), int.Parse);

            if (arr_q.Length != inputCount)

            {

                Console.WriteLine("error. a lot of number");

                //여기서 사실 다시 입력을 받아야겟죠?

            }

            foreach (decimal a_temp in quartiles(arr_q))

            {

                Console.WriteLine(a_temp);

            }

        }


        static List<decimal> quartiles(int[] arr_q)

        {

            Array.Sort(arr_q);

            

            decimal q1, q2, q3;

            int n = arr_q.Length;

            int q2mid = n / 2;

            int q1mid = (q2mid - 1) / 2;

            int q3mid = n - q1mid - 1;

            if (n % 2 == 0)

            {

                q2 = (decimal)(arr_q[q2mid] + arr_q[q2mid - 1]) / 2;

                if (q2mid % 2 != 0)

                {

                    q1 = arr_q[q1mid];

                    q3 = arr_q[q3mid];

                }

                else

                {

                    q1 = (decimal)(arr_q[q1mid] + arr_q[q1mid - 1]) / 2;

                    q3 = (decimal)(arr_q[q3mid] + arr_q[q3mid - 1]) / 2; 

                }

            }

            else

            {

                q2 = arr_q[q2mid];

                if (q2mid % 2 != 0)

                {

                    q1 = arr_q[q1mid];

                    q3 = arr_q[q3mid];

                }

                else

                {

                    q1 = (decimal)(arr_q[q1mid] + arr_q[q1mid + 1]) / 2;

                    q3 = (decimal)(arr_q[q3mid] + arr_q[q3mid - 1]) / 2;

                }

            }

            return new List<decimal> { q1,q2,q3 }; 

        }

}




짜란 역시...엄청난 하드코딩의 느낌이 나죠...네 맞습니다 ㅋㅋㅋ 하드코딩이지만 나름 고뇌를...ㅠㅠ


코드짜실때 팁은!

n을 짝수인지 홀수 인지 판단하시고

Q2를 기준으로 왼쪽, 오른쪽에 남은게 홀수?짝수? 판단을 해주셔야해요

그리고 배열의 시작은 0번째 부터입니다!!

처음에는 list를쓸지 array를 쓸지 dictionary를 쓸지 고민했는데요

의식의 흐름일까요? 그냥 쓰던데로 쓰게 되더군요 ㅋㅋㅋ


후기!. 이전  Day 0: Weighted Mean 문제와는 다르게 처음 n을 입력받는걸 고민하다가

그냥 n보다 많으면 숫자를 많이 넣으셨어요 하게 쳤습니다.  물론 다시 입력받고 하는건 귀찮아서...ㅋㅋㅋ


일단 메인 Quartiles 를 구하는건 짜놧으니 알!아!서!되겟쥬 ㅋㅋ


역시 문제를 풀고나서

RunCode!!

Compilation Successful :)

Click the Submit Code button to run your code against all the test cases.

  • Custom Testcase
Input (stdin)
5
1 2 3 4 5
Your Output (stdout)
1.5
3
4.5

잘 들어갓네요 ㅎㅎㅎ


그렇타면! 자싄감을 가지고 submit!!!!!!!!!


You have earned 30.00 points!
You are now 2 challenges away from the 2nd star for your 10 days of statistics badge.
0%3/5
Congratulations
You solved this challenge. Would you like to challenge your friends?
Input (stdin)Download
9
3 7 8 5 12 14 21 13 18
Expected OutputDownload
6
12
16
Compiler Message
Success


흐흠 ㅋㅋㅋㅋ 기분이 좋네윱 오늘은 30점!! 득템입니다 ㅎㅎ



Day 1 에는 3문제가 있네요 하지만 오늘 1문제뿐.....귀차....ㄶ지는 않고요 ㅋㅋ

하루에 1개씩 풀기로했으니(?!) ㅋㅋ 그럼오늘도 이만!


(출처:https://www.hackerrank.com/challenges/s10-quartiles/problem)

반응형

+ Recent posts