[알고리즘/백준] 2741번 :: N 찍기 (C++)

mingguriguri·2022년 3월 21일
0

[백준] - 3. 반복문

목록 보기
5/14
post-thumbnail

문제 ✍🏻 :: [2741번] N 찍기

(초록색 글자 클릭 시 문제로 이동)

자연수 N을 입력받아 1부터 N까지 한 줄에 하나씩 출력하는 프로그램을 작성


알고리즘 (접근방법) 💻

자연수 n을 입력받아 1부터 n까지 한 줄씩 출력하는 것이다. 이는 for문 내의 i를 하나씩 출력하면 된다.

🚨주의할 점🚨

평소대로 for(i = 0; i < n; i++) 으로 했다간 틀릴 수 있다. 문제에서는 1부터 나와야 하고, n까지 다 나와야 하므로, for(i = 1; i <= n; i++) 으로 적어야 한다. (항상 문제를 잘 읽는 것이 중요하다.)

  • 참고
    줄바꿈으로 endl;을 사용하는 경우 시간초과가 뜬다!! 웬만하면 \n을 쓸 것. (이전 문제 15552번에도 설명이 나와있다)

💡1번째 시도💡

#include <iostream>
using namespace std;

int main()
{
	int n, i;
	cin >> n;

	for (i = 1; i <= n; i++) {
		cout << i << "\n";
	}

	return 0;
}

결과 : 성공!


💡2번째 시도 : 동기화 해제한 후의 코드💡

어제 배웠던 cin.tie(NULL);ios_base::sync_with_stdio(false);를 활용해서 재작성해보았다.

cin.tie(NULL);

  • 메인 함수 첫 줄에 선언
  • cin과 cout 묶음을 풀어주는 구문
  • cin으로 데이터를 읽을 때 출력 버퍼에 있는 내용을 비우는데 비우지 않고 먼저 입력

ios_base::sync_with_stdio(false);

  • C와 C++버퍼 분리 역할
#include <iostream>
using namespace std;

int main()
{
	cin.tie(NULL);
	ios_base::sync_with_stdio(false);

	int t, i, a, b;
	cin >> t;

	for (i = 0; i < t; i++) {
		cin >> a >> b;
		cout << a + b << "\n";
	}

	return 0;
}

결과 : 성공!
1번째와 다른 점이 있다면 시간이 4ms 더 줄었다!

1번째 시도 : 12ms
2번째 시도 : 8ms

💡마지막 시도 : 리뷰 후, 다시 작성💡

단순히 알고리즘 문제니까 상관없어서 아무생각없이 cin.tie(NULL);ios_base::sync_with_stdio(false);를 모두 썼다. 그런데 찾아보니까 굳이 cin.tie(NULL) 을 쓸 필요가 없었다... (오늘도 Stranger's LAB 을 참고했다!)

🧐이유

tie(): 입력과 출력의 연결을 끊어주는 것

  • 입출력이 반복적으로 있을 때는 연결을 끊어주는 게 맞지만, 이 문제는 처음 입력 후, 출력만 있다.
  • 따라서 서로 연결을 끊어주어도 의미❌ 쓸 필요 ❌
  • cin.tie(NULL); 이나 cout.tie(NULL)을 삽입하여 제출하더라도 위 코드와 성능 결과가 같게 나온다고 해서 다시 작성했다.
#include <iostream>
using namespace std;

int main()
{
	ios_base::sync_with_stdio(false);

	int t, i, a, b;
	cin >> t;

	for (i = 0; i < t; i++) {
		cin >> a >> b;
		cout << a + b << "\n";
	}

	return 0;
}

회고 🤔

cin.tie(NULL);ios_base::sync_with_stdio(false);를 어제 배웠는데 다음문제에서 활용하고 성능 차이를 보니까 어제 한 게 헛된 게 아닌 느낌이 들었다.
그래도 제대로 알고 써야겠다고 반성했다! 문제 다 풀고 넘어갔으면 모를뻔했다. 혹시나 하고 찾아본 나 자신 잘했어!


Reference

profile
To be "irreplaceable"

0개의 댓글