c++문제풀이

문제

알파벳 소문자로만 이루어진 단어 S가 주어진다. 각각의 알파벳에 대해서, 단어에 포함되어 있는 경우에는 처음 등장하는 위치를, 포함되어 있지 않은 경우에는 -1을 출력하는 프로그램을 작성하시오.

입력

첫째 줄에 단어 S가 주어진다. 단어의 길이는 100을 넘지 않으며, 알파벳 소문자로만 이루어져 있다.

출력

각각의 알파벳에 대해서, a가 처음 등장하는 위치, b가 처음 등장하는 위치, … z가 처음 등장하는 위치를 공백으로 구분해서 출력한다.

만약, 어떤 알파벳이 단어에 포함되어 있지 않다면 -1을 출력한다. 단어의 첫 번째 글자는 0번째 위치이고, 두 번째 글자는 1번째 위치이다.

find() 함수 C++11
std::string::find.

#include <iostream>
#include <cstdio>
#include <string>
using namespace std;
int array[26];
int main()
{
	string str;
	getline(cin, str);
	string alphabet = "abcdefghijklmnopqrstuvwxyz";
	
	for(int i = 0; i<26; ++i)
	{
		array[i] = -1; //initialize all value as -1
	}
	
	for(int i = 0; i <26; ++i)
	{
		string str_2;
		str_2 = alphabet[i];
		size_t found = str.find(str_2);
		if(found != string::npos)
		{
			array[i] = found;
		}
	}
	
	for(int i = 0; i<26; ++i)
	{
		printf("%d ", array[i]) ;
	}
		
	return 0;
}

1. C++ String

문자열 (C style vs. C++ style)
문자열 입력
2차원 char 배열과 포인터 배열
문자열 관련 함수 C++ 11

  1. 문자열
    1. C style
    2.    #include <stdio.h>
         
         int main()
         {
      	   char name1[6] = { 'h','e','l','l','o', '\0' };
      
      	   const char name2[] = "Hello World1!"; 
      	   const char* name3 = "Hello World2!";
      
      	   return 0;
         }
         
    3. C++ Style
    4.    #include <iostream>
         #include <string>  //string 헤더 파일
      
         int main()
         {
      	   std::string name4 = "Hello World3";
      	   return 0;
         }
         
      • string has a constructor that actually takes in char pointer or const char pointer.
      • So, when compiling above code in visual studio and move the cursor to "Hello World3", we can check the above code is actually compiled as (const char[13]"Hello World3").
      • null termination : we can check end point of string by the null termination. string data starts from the name of the array(memory address of the array). and it ends at null termination point.
  2. 문자열 입력
    1. char 데이터 입력
    2.  char s [LENGTH];
       scanf("%s", s);
       
      • %s : (argument type - char*)공백문자가 나오는 부분까지 입력받음.
      • If width specifier is used, matches up to width or until the first whitespace character, whichever appears first. Always stores a null character in addition to the characters matched (so the argument array must have room for at least width+1 characters)
      • (C++) 문자열을 입력받는 방법
    3. string 입력
    4.   std::string name1;
        //scanf("%s", &str); 
        std::getline(std::cin, name1);
        std::string name2
        cin >> name2;
       
      • scanf 는 인자로 string 클래스 타입을 받을 수 없다. scanf()
      • string 타입의 데이터를 입력받는 함수 getline : getline()
    5. 공백, 띄어쓰기를 무시하고 입력받는방법
    6.   char line1[100];
        scanf("%[^\n]",line1);
       
        string line2; 
        getline(cin, line2);
       
      • scanf() 접근지정자 활용 - "%[^\n]" : \n (enter key) 까지 입력받음
      • getline() - 공백, 띄어쓰기를 무시하고 ‘\n’까지의 string데이터를 input으로 받음
  3. 2차원 char 배열과 포인터 배열
    1. 2차원 char 배열
    2. 2차원 배열은 1차원 배열을 배열 요소로 갖는 새로운 배열이다.
       char dataset[][7] = {"apple", "banana", "cocoa"};
       int numArr[3][4] = {    // 세로 크기 3, 가로 크기 4인 int형 2차원 배열 선언
      		{ 11, 22, 33, 44 },
      		{ 55, 66, 77, 88 },
      		{ 99, 110, 121, 132 }
        };
       
      • 2차원 배열을 선언할 때 크기를 생략하고 싶다면 첫번째 부분배열의 요소의 개수를 표기하는 부분을 생략함
      • 행첨자 생략 가능
      • 열 첨자는 생략 불가능
      • 여러 개의 문자열을 저장하기 위해서는 2차원 문자배열이 필요
        char animal [][10] = { "monkey", "elephant", "dog", "sheep", "pig",
         						 "lion", "tiger", "puma", "turtle", "fox" };
      						 
        int count=sizeof(animal)/sizeof(animal[0]);  
        printf("%d\n", sizeof(animal)); //100
        printf("%d\n", sizeof(animal[0])); //10
        
        for(int i=0; i<count; i++)
        {
         	printf("%s\n", animal[i]);   
        }
       
        sizeof(animal) 전체 배열의 크기
        sizeof(animal[0]) 부분배열 하나의 크기
        animal[i] i 값이 변하면서 각각의 부분배열 명이 된다
    3. 포인터 배열
      • 포인터 배열은 포인터 변수들을 배열요소로 갖는 배열이다.
      • 모든 배열 요소가 포인터 변수가된다.
       char animal [5][10] = { "monkey", "elephant", "dog", "sheep", "pig" };
       for(int i=0; i<5; i++)
       {
      	 printf("%s\n", animal[i]); 
       }
      
       char* animal_ptr[5] =  { "monkey", "elephant", "dog", "sheep", "pig" };
       for(int i=0; i<5; i++)
       {
      	 printf("%s\n", *(animal_ptr + i)); 
       }
       
  4. from C++11 string library
  5. string Header
    • stoi() - converts a string to a signed integer
    • to_string() - converts an integral or floating point value to string
    • copy() - copies characters
    • rbegin() - returns a reverse iterator to the beginning
    • rend() - returns a reverse iterator to the end

c++문제풀이

문제

N개의 숫자가 공백 없이 쓰여있다. 이 숫자를 모두 합해서 출력하는 프로그램을 작성하시오.

입력

첫째 줄에 숫자의 개수 N (1 ≤ N ≤ 100)이 주어진다. 둘째 줄에 숫자 N개가 공백없이 주어진다.

출력

입력으로 주어진 숫자 N개의 합을 출력한다.

C++ string stoi() 함수
접근지정자 활용
ASCII code 활용

  • C++ string
#include <iostream>
#include <string>
using namespace std;

int main()
{
	int n;
	scanf("%d", &n);

	string input_str;
	getchar(); //while (getchar() != '\n') {} --> clear the buffer
	getline(cin, input_str);
	 
	string single_str;
	int num = 0;
	
	for (int i = 0; i < n; i++)
	{
		single_str = input_str[i];
		num += stoi(single_str);
	}
	printf("%d", num);

	return 0;
}

Defined in header <cstdio>

getchar(): Reads the next character from stdin until EOF
scanf 혹은 cin으로 데이터를 입력받을 때 엔터키 때문에 버퍼에 ‘\n’이 남아있게 된다.
따라서 get char(); 호출하면서 버퍼를 비워준다.

Defined in header <string>

getline(): 공백, 띄어쓰기를 무시하고 ‘\n’까지의 string데이터를 input으로 받는다
stoi(): int stoi( const std::string& str, std::size_t* pos = 0, int base = 10 ) // string to integer from C++11

  • 접근지정자 활용
#include <stdio.h>

int main()
{
	int n;
	scanf("%d", &n);

    int value;
	int num = 0;
	for (int i = 0; i < n; i++)
	{
		scanf("%1d", &value);  //1개씩 입력받음
		num += value;
	}
	printf("%d", num);

	return 0;
}
  • ASCII code 활용
#include <stdio.h>

int main()
{
	int n;
	scanf("%d", &n);
	
	int num = 0;
	
    char ch[100];
	scanf("%s", ch);
	
	for (int i = 0; i < n; i++)
	{
		num += ch[i] - '0';
	}
	printf("%d", num);

	return 0;
}

ASCII code 에 대응되는 10진법 값을 활용하여 풀이
‘1’ - ‘0’ = 49 - 48 = 1
‘2’ - ‘0’ = 50 - 48 = 2
‘3’ - ‘0’ = 51 - 48 = 3

ASCII TABLE.