시작은 0부터
7. 백준 1차원 배열 6단계(8958), 7 단계(4344) 본문
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차원 배열의 모든 단계를 끝냈다. 문제푸는 속도가 몹시 느리지만 이번 주말 안에 함수 문제는 모두 끝내는 걸 목표로 하겠다.
'C# 학습일지' 카테고리의 다른 글
9. OOP, 클래스, 메모리 개념 (0) | 2022.07.13 |
---|---|
8. 백준 함수 2단계 : 셀프 넘버(4673), 드래그 영역 주석 및 해제 (0) | 2022.07.12 |
6. 백준 1차원 배열 4단계 : 평균(1546) (0) | 2022.07.07 |
5. 상수, Switch (0) | 2022.07.06 |
4. 네임스페이스(Namespace), 메소드(Method) 개념 이해 (0) | 2022.07.05 |