갓비니

2020/04/09 코딩 문제 연습 (6단계 / 백준 8958,4344번) C++ fixed, precision, setf(ios::showpoint) (자리수 고정, 정수->소수 0으로 채우기 표현!) 본문

Programming/코딩 문제 풀이

2020/04/09 코딩 문제 연습 (6단계 / 백준 8958,4344번) C++ fixed, precision, setf(ios::showpoint) (자리수 고정, 정수->소수 0으로 채우기 표현!)

갓비니 2020. 4. 9. 03:38

ㄱ오늘로서 6단계  완료!

4/10에는 5단계에서 풀지못한, 마지막 문제!

별 표시 문제를 풀고, 7단계로 넘어가보려고 한다.

 

 

오늘 푼 문제.

 

 

<8958번>

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
#include <iostream>
#include <string>
 
using namespace std;
 
int main() {
    int num;
    cin >> num;
 
    int *save_total = new int[num];
 
    for (int i = 0; i < num; i++) {
        string answer;
        int count = 0;
        int total = 0;
        cin >> answer;
 
 
        for (int j = 0; j < answer.size(); j++) {
            if (answer.at(j) == 'O')count++;
            else count = 0;
            total += count;
        }
        save_total[i] = total;
    }
    for (int i = 0; i < num; i++) {
        cout << save_total[i]<<"\n";
    }
}
 
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4ftext-decoration:none">Colored by Color Scripter
 

이것도 푸는데 몇시간은걸린 것 같다.. 너무 헤맸다 ㅠㅠ

힘들게 char로 문자열로 한개씩 받을필요가 없다.

string클래스를 활용해서 size()함수, at(원하는 인덱스)로 값을 뽑아낼 수 있기 때문이다.

에효 어렵다 ㅠ...

 

 

 

string에서 유용한 함수

1) str.size() -> string의 size 반환

2) str.at(원하는 인덱스) // (str[원하는 인덱스] 이것도 가능한데 at와 다르게 범위를 넘어가도 예외를 내보내지 않는다.)

3) str.back() // 스트링의 맨 마지막 문자를 반환해준다

 

아 바보였다.... 각 테스트 케이스마다 점수를 출력하라는건

한줄 입력 / 한줄 출력

한줄 입력/ 한줄 출력

이래도 된다는건데....아......굳이 save_total을 만들어서 값을 배열로 저장할 필요가 없었다는 것이다.

물론 배열로 저장해도 정답, 그렇지 않고 바로 출력해도 정답이다.

그렇지만 save_total을 지정해서 하게된다면 코드는 조금 더 길어질 수 있으나

실행시간은 4초나 더 빨랐다는 점!!! 이건 좋네 ㅎㅎㅎㅎㅎㅎ 괜히 뿌듯하다 ㅎㅎㅎ

 

 

 

<4344번>

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
#include <iostream>
using namespace std;
 
int main() {
    
    int test_case;
    cin >> test_case;
    int stu_num;
    double *save_rate = new double[test_case];
    
    
    for (int i = 0; i < test_case; i++) {
        cin >> stu_num;
        int *grade=new int[stu_num];
        double sum = 0;
        double rate = 0;
        double avg = 0;
        
        for (int j = 0; j < stu_num; j++) {
            cin >> grade[j];
            sum += grade[j];
        }
        avg = sum / stu_num;
    
        for (int j = 0; j < stu_num; j++) {
            if ((grade[j]) > avg) {
                rate++;
            }
        }
    
        save_rate[i] = (rate / stu_num) * 100;
        
 
    }
    
    for (int i = 0; i < test_case; i++) {
        cout<<fixed; //이것도 중요
        cout.precision(3);
        cout.setf(ios::showpoint); //와 중요!!!!
        cout << (save_rate[i]) << "%"<<"\n";
    }
 
 
}
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4ftext-decoration:none">Colored by Color Scripter
 

 

소수점이 들어가는 문제에서는... 당연히 double, float를 써줘야 했던 것..

안그러면 int형으로 인식돼서 답이 0으로 나오고 만다.

 

여태 몰랐던 것.

 

 

cout.setf(ios::showpoint); 함수.

이것은 정수도 소수점으로 출력하게 해준다.

cout.precision(5);

cout.setf(ios::showpoint); 

 

이 두 줄이었다면 40% --> 40.000%으로 출력되게 해준다.

 

그렇지만... 여기서 계속 답이 안나와서 생각해보니

 

만일 모든 이의 점수가 같아 평균값 이상인 사람이 없다면?

그럼 0%인데

0.0000% 라고 표현될 것이다.

 

그럼... 출력 조건에 어긋나잖아!! (소수점 아래 셋째자리까지 표현이 조건이었으므로)

 

 

이를 방지하기 위해 필요한 코드.

 

cout<<fixed;

 

이것이다.

 

cout<<fixed를 쓴 후

cout.precision(1)을 사용하게 된다면

 

소수점 아래 한자리까지만 고정적으로 표현하게 되는것이다.