8번 단어의 개수

문제

영어 대소문자와 공백으로 이루어진 문자열이 주어진다. 이 문자열에는 몇 개의 단어가 있을까? 이를 구하는 프로그램을 작성하시오. 단, 한 단어가 여러 번 등장하면 등장한 횟수만큼 모두 세어야 한다.

 

입력

첫 줄에 영어 대소문자와 공백으로 이루어진 문자열이 주어진다. 이 문자열의 길이는 1,000,000을 넘지 않는다. 단어는 공백 한 개로 구분되며, 공백이 연속해서 나오는 경우는 없다. 또한 문자열은 공백으로 시작하거나 끝날 수 있다.

 

출력

첫째 줄에 단어의 개수를 출력한다.

 

공백으로 이루어진 문자열에서 단어의 개수를 찾는 문제이다.

 

문자열을 공백으로 끊어서 배열에 저장하고 배열의 사이즈를 구하면 해결되지 않을까 생각이 든다.

 

문자열이 공백으로 시작하거나 끝날 수 있다고 하니 문자열 양끝의 공백을 제거해 주는 동작이 필요할 거 같다.

 

C++

#include <iostream>
#include <string>
#include <vector>
using namespace std;
int main(){
    vector<string> vec_str;
    string s;
    while(cin >> s){
        vec_str.push_back(s);
    }
    cout << vec_str.size();
    return 0;
}

 

C++의 입력은 단어 단위이다. 따라서 공백, 줄 바꿈 등의 입력이 발생하면 입력이 끊기고 다음 입력을 받게 된다.

 

따라서 이 문제의 경우 입력이 없을 때까지 받으면서 배열에 저장하고 길이만 출력하면 단어의 개수를 구할 수 있게 된다.

 

C#

using System;
class Program{
    static void Main(string[] args){
        string s = Console.ReadLine();
        string[] str_arr = s.Trim().Split(' ', StringSplitOptions.RemoveEmptyEntries);
        Console.WriteLine(str_arr.Length);
    }
}

 

Split을 옵션 없이 사용했을 경우 채점에서 틀렸다는 결과가 나왔다.

 

아마도 문제에서 문자열의 시작과 끝이 공백인 경우가 있다고 했는데 아예 공백만 있는 문자열이 입력으로 들어오는 경우도 있는 것 같다. " "

 

이 경우 그냥 Split을 하게 되면 빈 문자열이 배열에 포함되기 때문에 이를 제외시켜 주는 StringSplitoptions.RemoveEmptyEntries를 해주어야 한다.

 

Python

s = input()
arr = s.strip().split()
print(len(arr))

 

Node.js

const fs = require('fs');
const input = fs.readFileSync('/dev/stdin','utf8').trim().split(' ');
const words = input.filter(word => word !== '');
console.log(words.length);

 

js에서도 마찬가지로 split을 할 경우 빈 문자열도 배열에 추가되기 때문에 배열을 만든 다음 빈 문자열을 제거해 주는 작업을 한다.

 

9번 상수

문제

상근이의 동생 상수는 수학을 정말 못한다. 상수는 숫자를 읽는데 문제가 있다. 이렇게 수학을 못하는 상수를 위해서 상근이는 수의 크기를 비교하는 문제를 내주었다. 상근이는 세 자릿수 두 개를 칠판에 써주었다. 그다음에 크기가 큰 수를 말해보라고 했다. 

 

상수는 수를 다른 사람과 다르게 거꾸로 읽는다. 예를 들어, 734와 893을 칠판에 적었다면, 상수는 이 수를 437과 398로 읽는다. 따라서, 상수는 두 수중 큰 수인 437을 큰 수라고 말할 것이다. 

 

두 수가 주어졌을 때, 상수의 대답을 출력하는 프로그램을 작성하시오.

 

입력

첫째 줄에 상근이가 칠판에 적은 두 수 A와 B가 주어진다. 두 수는 같지 않은 세 자릿수이며, 0이 포함되어 있지 않다.

 

출력

첫째 줄에 상수의 대답을 출력한다.

 

입력된 두 수를 뒤집은 후 크기를 비교하여 큰 값을 출력해야 상근이의 대답과 동일하다.

 

C++

#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
int main(){
    string n1, n2;
    cin >> n1 >> n2;
    reverse(n1.begin(), n1.end());
    reverse(n2.begin(), n2.end());
    int i_n1 = stoi(n1);
    int i_n2 = stoi(n2);
    if (i_n1 > i_n2)
        cout << i_n1;
    else
        cout << i_n2;
    return 0;
}

 

reverse로 문자열을 뒤집고 stoi로 숫자문자를 정수형으로 변환해서 값 비교 후 큰 값을 출력한다.

 

C#

using System;
class Program{
    static void Main(string[] args){
        string[] input = Console.ReadLine().Trim().Split();
        string n1 = input[0];
        string n2 = input[1];
        char[] char_arr1 = n1.ToCharArray();
        Array.Reverse(char_arr1);
        n1 = new string(char_arr1);
        char[] char_arr2 = n2.ToCharArray();
        Array.Reverse(char_arr2);
        n2 = new string(char_arr2);
        int i_n1 = int.Parse(n1);
        int i_n2 = int.Parse(n2);
        if (i_n1 > i_n2)
            Console.WriteLine(i_n1);
        else
            Console.WriteLine(i_n2);
    }
}

 

 

문자열 뒤집기를 간단하게 처리하기 위해서 Array.Reverse 함수를 사용할 수 있다.

 

먼저 이 함수를 사용하기 위해서 배열이 아닌 불변타입인 string을 char [] 배열로 변환을 해야 한다. ToCharArray를 사용해서 문자열을 문자 배열로 변환 후 Array.Reverse로 배열을 역순으로 만든다. 그리고 뒤집어진 배열을 다시 문자열로 할당하여 원하는 문자열을 만든다.

 

 

Python

input_arr = input().split()
str_1 = input_arr[0]
str_2 = input_arr[1]
str_1 = str_1[::-1]
str_2 = str_2[::-1]
val_1 = int(str_1);
val_2 = int(str_2);
if val_1 > val_2:
    print(val_1)
else:
    print(val_2)

 

파이썬에서도 문자열은 배열이 아닌 불변 타입이다. 따라서 배열에서 사용가능한 reverse 메서드가 없기 때문에 문자열을 리스트로 바꾸고 뒤집은 다음 다시 문자열로 바꾸는 방법도 있지만 문자열에서 슬라이싱을 사용하여 역순으로 정렬할 수 있다.

 

Node.js

const fs = require('fs');
const input = fs.readFileSync('/dev/stdin','utf8').split(' ');
const val_1 = parseInt(input[0].split('').reverse().join(''), 10);
const val_2 = parseInt(input[1].split('').reverse().join(''), 10);
if (val_1 > val_2)
    console.log(val_1);
else
    console.log(val_2);

 

문자열을 바로 reverse 할 수 없기 때문에 split으로 배열로 만든 다음 뒤집고 join으로 이어 붙인다. 그리고 정수형으로 변환하여 비교 후 출력한다.

 

이렇게 이어서 쓰면 순차적으로 동작해서 한 번에 처리가 가능하다.

728x90
반응형

+ Recent posts