본문 바로가기
알고리즘/개념

[C++] C++에서 입력 받기

by Dr.섭도 2024. 7. 8.

0. Intro

<코딩테스트 합격자 되기> 스터디를 진행하며 C++을 연습할 계획입니다

 


 

1. using namespace std?

C++에서 표준 라이브러리 구성 요소를 현재 파일(scope)로 가져오는 지시문

c++ 코드를 볼 때 std:: 구문이 항상 존재했었다

cout과 같은 코드를 사용할 때에도 using namespace std를 사용하지 않으면?

std::cout과 같은 형태로 작성해야 한다

 

2. 항상 써도 될까?

using namespace std는 편리할 수 있지만, 개발에서는 사용하지 않는 것이 좋다

이름 충돌을 방지하는 기능인데

만일 내가 만든 custom_namespace가 있을 때, 여기에도 cout 함수가 있다면?

 

#include <iostream>
#include <string>

namespace my_namespace {
    void cout(const std::string& message) {
        std::cout << "my_namespace::cout: " << message << std::endl;
    }
}

using namespace std;

int main() {

    std::cout << "Hello, World!";

    return 0;
}

 

Hello, World를 출력하지 못하고 오류가 나온다

 

 

명시적으로 달아준다면?

 

 

빌드에 성공하는 모습을 볼 수 있다

 

3. 입력 받기

https://www.acmicpc.net/problem/11945

 

백준 뜨거운 붕어빵 문제를 통해 처음 C++ 입력 연습을 진행했다

5 7
0010000
0111010
1111111
0111010
0010000

 

위의 입력을 반대로 출력하는 문제였다

 

C++에서 입력을 받을 때에는 우선 #include <iostream>헤더를 입력해서

std::cin std::cout 등 입출력을 가능하게 만들어야 한다

 

조금 특이한 점은

int N, M;
cin >> N >> M;

 

이런 형태로 처음에 선언을 해주고, 연속된 입력을 받을 수 있다는 점?

 

이후는 java와 유사하다

vector<vector<int>> matrix;
string line;
    
for (int i = 0; i < N; ++i) {
    cin >> line;

    vector<int> temp;
    for (int j = 0; j < M; ++j) {
        temp.push_back(line[j] - '0');
    }
    matrix.push_back(temp);
}

1. string line을 선언한 뒤, cin >>  line을 통해 한 줄씩 입력을 총 N-1회 받는다

 

2. 이후 임시 vector를 선언하고, push_back으로 temp 뒤에 line의 인덱스 값을 하나씩 추가한다

 

3. 한 줄 입력이 끝나면 해당 temp vector를 matrix 뒤에 차례로 입력한다

 

입력은 이렇게 끝났다

남은 것은 출력

 

std::cin 작성 후 >>라는 stream 연산자 또는 추출 연산자를 통해 입력을 받는다

std::cout 의 뒤에는 << 연산이 붙는데, 이는 출력이라고 이해하면 쉬울 것 같다

 

4. 뒤집어진 내용을 출력하면 된다

 

전체 코드

#include <iostream>
#include <vector>
#include <string>

using std::vector;
using std::string;
using std::cin;
using std::cout;

int main()
{
	int N, M;
	cin >> N >> M;

	vector<std::vector<int>> matrix;
	string line;

	for (int i = 0; i < N; ++i) {
		cin >> line;
		
		vector<int> temp;
		for (int j = 0; j < M; ++j) {
			temp.push_back(line[j] - '0');
		}
		matrix.push_back(temp);
	}

	for (int i = 0; i < matrix.size(); ++i) {
		for (int j = matrix[i].size() - 1; j >= 0; --j) {
			cout << matrix[i][j];
		}
		cout << "\n";
	}

	return 0;
}

 

using namespace std의 사용을 지양하고, 명시적으로 사용할 함수를 가져오는 코드로 변경했다

물론 계속 std::를 사용하는 것은 가시성도 안좋으니 using 구문에 추가해서 실제 코드는 간소화해서 사용해보려 한다

 

4. 마무리

앞으로 연습할 때 귀찮아도 using namespace std를 사용하지 않고, 직접 치는 연습을 해야겠다

Java만 사용해서 C++로 개발할 일이 있을까? 싶기는 하지만, 혹시 모르니까

 

추가로 return 0;을 꼭 사용해야 하는지도 궁금했는데,

이 또한 명시적으로 함수가 성공했음을 반환해라 라는 의미라고 한다

 

main함수에는 return문이 없는 경우 자동으로 return 0;을 추가한다

 

C++을 학습할 때 명시성을 생각하며 학습해야겠다

'알고리즘 > 개념' 카테고리의 다른 글

[C++] 문자열 치환하기  (0) 2024.07.12
String to Char & Char to String  (3) 2023.11.29