ABOUT ME

Today
Yesterday
Total
  • 10820. 문자열 분석
    Baekjoon 2023. 5. 2. 02:13

     문제 

    문자열 N개가 주어진다. 이때, 문자열에 포함되어 있는 소문자, 대문자, 숫자, 공백의 개수를 구하는 프로그램을 작성하시오.

    각 문자열은 알파벳 소문자, 대문자, 숫자, 공백으로만 이루어져 있다.

     

     입력 

    첫째 줄부터 N번째 줄까지 문자열이 주어진다. (1 ≤ N ≤ 100) 문자열의 길이는 100을 넘지 않는다.

     

     출력 

    첫째 줄부터 N번째 줄까지 각각의 문자열에 대해서 소문자, 대문자, 숫자, 공백의 개수를 공백으로 구분해 출력한다.

     

     입력 

    This is String
    SPACE    1    SPACE
     S a M p L e I n P u T     
    0L1A2S3T4L5I6N7E8

     

     출력 

    10 2 0 2
    0 10 1 8
    5 6 0 16
    0 8 9 0

     

     에러 

    더보기
    const fs = require("fs");
    const readFileSyncAdd = "10820.txt";
    const input = fs.readFileSync(readFileSyncAdd).toString().split('\n');
    
    var ans, str, txt = [];
    
    for(var i in input) {
        str = input[i].split('');
        ans = [0, 0, 0, 0];
        for(var j in str) {
            if(str[j] >= 'a' && str[j] <= 'z') ans[0]++;
            if(str[j] >= 'A' && str[j] <= 'Z') ans[1]++;
            if(str[j] >= '0' && str[j] <= '9') ans[2]++;
            if(str[j] === ' ') ans[3]++;
        }
        txt.splice(txt.length, 0, ans.join(' ').trim());
    }
    console.log(txt.join('\n').trim());

    에러의 원인은 입력값이 보이는 대로 들어오지 않을 수도 있다는 점이다.

    이게 무슨 뜻인가 하면... 위에 써있는 입력값은 백준에서 예시로 준 입력값이라는 것이지, 그 외에 다른 값이 들어와도 코드가 잘 돌아가야한다는 말이다.

    위 코드에서, 빈 줄이 들어온다면 어떤일이 발생할까? (이건 빈 공백과는 다르다.)

    만족하는 조건문이 없으니 0, 0, 0, 0 이 출력될 것이다.

    즉, 입력값이 아래와 같다면 어떤 일이 발생할까?

    This is String
    SPACE    1    SPACE
     S a M p L e I n P u T     
    0L1A2S3T4L5I6N7E8
    
    #한 줄이 더 입력되었음을 보여주는 주석

    출력값이 이렇게 변하고 말 것이다.

    10 2 0 2
    0 10 1 8
    5 6 0 16
    0 8 9 0
    0 0 0 0

    이러면 될까 안될까... 당연히 안된다.

    저런 빈 줄이 들어가는 것은 백준에서 흔하게 발생하는 일이라고 한다.

    예시 입력값이 들어가는 것은 맞는데, 저렇게 빈 줄이 들어가는 일이 빈번하게 생긴다고(...)

    그래서 빈 줄이 들어왔을 때 어떻게 할 지까지 코드에 포함시켜야했다.

    (모든 예외상황을 생각해서 코드를 짜는 것이 항상 좋긴하다.)

     

    그래서 최종적인 코드는 아래와 같다.

     

     코드 

    const fs = require("fs");
    const readFileSyncAdd = "10820.txt";
    const input = fs.readFileSync(readFileSyncAdd).toString().split('\n');
    
    var ans, str, txt = [];
    
    for(var i in input) {
        if(input[i] === '') continue;
        str = input[i].split('');
        ans = [0, 0, 0, 0];
        for(var j in str) {
            if(str[j] >= 'a' && str[j] <= 'z') ans[0]++;
            if(str[j] >= 'A' && str[j] <= 'Z') ans[1]++;
            if(str[j] >= '0' && str[j] <= '9') ans[2]++;
            if(str[j] === ' ') ans[3]++;
        }
        txt.splice(txt.length, 0, ans.join(' ').trim());
    }
    console.log(txt.join('\n').trim());

    'Baekjoon' 카테고리의 다른 글

    11655. ROT13  (0) 2023.05.02
    10845. 큐  (0) 2023.05.02
    1157. 단어 공부  (0) 2023.04.09
    9093. 단어 뒤집기  (0) 2023.04.09
    10828. 스택  (0) 2023.04.09
Designed by Tistory.