Notice
Recent Posts
Recent Comments
Link
«   2024/07   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31
Archives
Today
Total
관리 메뉴

시작은 0부터

7. 백준 1차원 배열 6단계(8958), 7 단계(4344) 본문

C# 학습일지

7. 백준 1차원 배열 6단계(8958), 7 단계(4344)

0base 2022. 7. 9. 02:54

6단계 : OX퀴즈 풀이

	    int a = int.Parse(Console.ReadLine());
            int score = 0;
            string[] str = new string[a];
            int overlap = 0;
            int[] result = new int[a];
            
            for (int i = 0; i < a; i++)
            {
                str[i] = Console.ReadLine();
                for (int j = 0; j < str[i].Length; j++)
                {
                    if (str[i].Substring(j, 1) == "O")
                    {
                        score++;
                        if (overlap > 0)
                        {
                            score+= overlap;
                        }
                        else if (overlap == 0)
                        { }
                        overlap++;
                    }
                    else
                    {
                        overlap = 0;
                    }
                }
                result[i] = score;
                overlap = 0;
                score = 0;
            }
            for(int i = 0; i < result.Length; i++)
            {
                Console.WriteLine(result[i]);
            }

 

string.Substring( a, b )

: 문자열에서 인덱스 a를 시작점으로 b까지 잘라서 읽는다.

 

substring을 사용해 입력받은 값을 잘라서 문자열 최대 길이를 반복문으로 돌려서 하나씩 잘라서 읽어들이는 방법을 사용했다. 순서대로 읽어들인 자른 문자가 O 이면 점수와 중복을 각각 1씩 증가시킨다. 그렇게 차례로 읽어들이면서 만일 연속으로 O이 인식되면 점수에 추가로 중복카운트만큼 증가시킨다. OO 을 읽으면, 첫번째 O에서 중복카운트 1이 증가된 상태에서 두번째 O에 기본 점수 1에 중복카운트 값인 1을 합해서 추가로 더한다. 그러므로 OO = 1 + (1+1)이 되어 점수 3을 얻는다.

결과값을 배열로 만들어 반복문안에서 문자열 인덱스 순서에 따라 점수값을 넣어 저장하고, 중복값과 점수값을 초기화시켜 다시 반복문을 돌린다.

 

7단계 : 평균은 넘겠지

 

	    int C = int.Parse(Console.ReadLine()); //배열 총 수 설정
            string[] ex = new string[C]; //총수만큼 스트링 배열 생성
            int maxcount = 0;
            double sumscore = 0.0;
            double normalline = 0.0;
            int up = 0;
            double[] winner = new double[C];
            
            for (int i = 0; i < C; i++)
            {
                ex[i] = Console.ReadLine(); // n a b c d
                string[] exsp = ex[i].Split(' '); //n a b c d를 구분해서 나눈다
                maxcount = int.Parse(exsp[0]); //각 배열의 최대 수
                int[] nn = new int[maxcount]; //경우의 수 총 개수만큼 nn 생성
                double[] f = new double[nn.Length];

                for (int j = 0; j < maxcount; j++)
                {

                    if (j+1 <= maxcount)
                    {
                        nn[j] = int.Parse(exsp[j+1]); //경우의 수에 각각 입력값 인덱스1부터 넣는다.
                    }
                }

                for (int j = 0; j < nn.Length; j++)
                {
                    sumscore += nn[j];
                }

                normalline = sumscore / nn.Length;


                for (int j = 0; j < nn.Length; j++)
                {
                    if (nn[j] > normalline)
                    {
                        up++;
                    }
                }

                winner[i] = ((up * 100.0) / nn.Length);

                sumscore = 0;
                normalline = 0;
                up = 0;
            }

            for(int a = 0; a < C; a++)
            {
            Console.WriteLine("{0:f3}" + "%", winner[a]);
            }

 

플면서 정말 많이 틀렸던 문제다. 평균값을 구하는 과정에서 기존식에  / 100 을 하고 결과값을 {0:p3} 으로 해도 출력값은 동일하게 나와서 왜 답이 틀린지 헤맸다. {0:f3} 을 써서 소수점 세자리수까지 표기를 한 뒤에 % 문자를 붙이면 평균값을 구하는 식에서 굳이 / 100을 안해도 되긴 하다. 출력값에서 반례를 찾아보기 힘들었지만, 틀린 이유는 /100을 하는 과정에서 double 값 소수점 끝자락 어딘가가 달라졌기 때문이었다. 소수를 사용하는 문제에서는 가장 많은 소수점 끝자리를 표현할 수 있는 double을 사용해야한다. 표기할 수 있는 최대 소수점 값이 다르기 때문에 double과 float 의 값은 다를 수 있다.

 

아무튼 해당 값을 퍼센테이지로 변환하는 {0:P}를 사용하는 것 보다는 그냥 {0:F3} 을 써서 부동소수점 세자리수까지 출력하고 그 뒤에 % 를 붙이는 것이 이 문제에 더 적합한 것 같다.

 

드디어 1차원 배열의 모든 단계를 끝냈다. 문제푸는 속도가 몹시 느리지만 이번 주말 안에 함수 문제는 모두 끝내는 걸 목표로 하겠다.