<C++>반복문

긍이·2023년 10월 28일
0

C++

목록 보기
4/12
post-thumbnail

바쁜 평일을 보냈다
회사에서 신규 게임을 출시 했다! 하하 그런데 앞으로 2개가 더 남았다..
아무튼 회사 얘기는 여기까지하고

이번엔 백준 알고리즘 3단계 반복문을 풀어볼려구 한다
반복문에는 대표적으로 while문과 for문이 있다 그 외에도 do while과 foreach을 사용하기도 하지만 내가 실제 업무에서 자주 활용하는건 while문과 for문을 사용하고 있다

백준 알고리즘 3단계

📌 반복문

✔ for문과 While

for문은 횟수를 지정할 수 있을때 사용하고
while문 같은 경우는 true/false 체크할 수 있을 때 사용한다

ex) for(int i=0; i < 5; i++) - i가 5보다 작을때까지 반복 i는 1씩 증가
while(!z) - z가 false일 경우 반복

이번 시간엔 for/while문을 활용하여 백준 반복문 문제를 풀어보도록 할것

for(초기값; 조건식; 증감값)
while(조건식)

✔ 2739번 구구단

for문을 사용하여 i를 1씩 증가하며 num과 곱해줬다

#include <iostream>

using namespace std;

int main()
{ 
	int num;

	cin >> num;

	for (int i = 1; i < 10; i++)
	{
		cout << num << " * " << i << " = " << num * i << endl;
	}
}

3
3 1 = 3
3
2 = 6
3 3 = 9
3
4 = 12
3 5 = 15
3
6 = 18
3 7 = 21
3
8 = 24
3 * 9 = 27

✔ 10950번 A+B - 3

처음에 제목이 a+b-3이길래 a,b를 받아서 더하고 3을 빼는건가 했는데
문제를 읽어보니깐 3을 빼라는 내용이 없길래 뭐지했는데
A+B 문제 3이라는 뜻인가봄

T번 만큼 for문을 반복
a,b 값을 입력 받아서 출력했다

#include <iostream>

using namespace std;

int main()
{ 
	int T,a,b;

		cin >> T;
	for (int i = 0; i < T; i++)
	{
		cin >> a >> b;
		cout << a + b << endl;
	}
}

4
2 2
4
3 3
6
5 5
10
7 8
15

✔ 8393번 합

#include <iostream>

using namespace std;

int main()
{
	int num;

	cin >> num;
	int a = 0;
	for (int i = 0; i <= num; i++)
	{
		a+=i;
	}
	cout << a;
}

5
15

✔ 25304번 영수증

#include <iostream>

using namespace std;

int main()
{
	int sum, allcount;

	cin >> sum >> allcount;
	int a =0;
	for (int i = 0; i < allcount; i++)
	{
		int gold,count;
		cin >> gold >> count;
		a += gold * count;
	}

	if (a == sum)
		cout << "Yes";
	else
		cout << "No";
}

72000
3
50000 1
20000 1
2000 1
Yes

✔ 2531번 코딩은 체육과목 입니다

num을 입력 받아서
4를 나눈 몫만큼 long을 붙여주었다

#include <iostream>

using namespace std;

int main()
{
	int a;
	cin >> a;
	int num = a / 4;
	string _long;
	for (int i = 0; i < num; i++)
	{
		_long += "long ";
	}
	_long += "int";

	cout << _long;
}

12
long long long int

✔ 15552번 빠른 A+B


위에 10950번과 같아 보이지만
출력 시간을 줄이기 위해 cin.tie(NULL)과 sync_with_stdio(false)를 사용하라고 한다
어떻게 사용하는지 몰라서 cin.tie(NULL) 사용법을 찾아봤는데
다른거 없이 그냥

	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);

를 추가하라고 해서 작성해서 제출했더니 맞았다

#include <iostream>

using namespace std;

int main()
{
	int T, a, b;

	cin.tie(0);
	ios::sync_with_stdio(0);
	
	cin >> T;
	for (int i = 0; i < T; i++)
	{
		cin >> a >> b;
		cout << a + b << "\n";
	}
}

4
2 2
4
4 4
8
3 3
6
6 6
12

솔직히 직접 실행해서 보면 별차이를 못 느끼겠어서
cin.tle(0)을 지우고 제출하니깐 채점 중에서 한참 멈춰있다가 시간초과가 뜸

그래서 cin.tle(0)과 sync_with_stdio(0) 코드를 쓰고 안쓰고의 차이를 좀 더 찾아보았다
우선 알아야할 것

cout, cin은 stdio 버퍼와 동기화하는 과정 때문에 속도가 느리다
ios::sync_with_stdio() 은 stdio와 iostream을 동기화한다
(지금 내가 헤더 파일에 쓰는 'iostream' 은 C++의 입출력을 위한 라이브러리이지만
stdio는 C의 입출력 라이브러리다 stdio를 헤더파일로 사용할땐 'stdio.h'를 선언한다)

✔ cin.tle과 sync_with_stdio(false)

cin.tle(0) - cin과 cout의 묶음을 풀어준다(순서가 보장되지않는다)
sync_with_stdio(false) - iostream과 stdio의 버퍼를 모두 사용하기 때문에 딜레이가 발생하는데
stdio를 비활성화 시켜서 딜레이를 줄이기 위해 사용

sync_with_stdio(false)을 사용하는 것은 이해했다
cin과 cout의 묶음을 풀어준다는 것은 무엇일까

cin.tie(0);를 사용하지않았을때

#include <iostream>

using namespace std;

int main()
{
	int T;

	cout << "tie X";
	cin >> T;
}

tie X 2

cin.tie(0);를 사용했을때

#include <iostream>

using namespace std;

int main()
{
	int T;

	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	cout << "tie O";
	cin >> T;
}

tie O 2

흠.. 찾아봤을땐 tie(0)를 사용하게 되면 출력보다 입력이 먼저 된다고함
어째선지 결과는 똑같이 출력 후에 입력 받을 수 있었다

코드가 짧아서 그런건지 모르겠지만 백준에 tie를 제외하고 제출했을때 시간초과로 떴으니 tie를 사용하고 안하고 사람이 느낄 수 없는 차이가 있는건가..?
지인한테도 물어봤는데 그냥 출력시간의 차이라고한다

✔ 11021번 A+B - 7

#include <iostream>

using namespace std;

int main()
{
	int T,a,b;
	ios::sync_with_stdio(false);
	
	cin >> T;

	for (int i = 0; i < T; i++)
	{
		cin >> a>>b;
		cout << "Case #"<<(i+1)<<": "<<a+b<<"\n";
	}
}

3
2 1
Case #1: 3
5 3
Case #2: 8
2 2
Case #3: 4

✔ 11022번 A+B - 8

A+B - 7번에서 출력 내용에 a,b값도 같이 표출해줌

#include <iostream>

using namespace std;

int main()
{
	int T,a,b;
	ios::sync_with_stdio(false);
	
	cin >> T;

	for (int i = 0; i < T; i++)
	{
		cin >> a>>b;
		cout << "Case #"<<(i+1)<<": "<<a<<" + " <<b<<" = " << a + b << "\n";
	}
}

✔ 2438번 별 찍기 - 1

방법 1
for문을 두번 사용
t값을 받아서 for문을 돌려주고
다시 for을 i+1만큼 돌려 별을 출력한다
j가 i+1만큼 다 돌고나면 "\n"(줄바꿈)을 해주고 다시 반복

#include <iostream>

using namespace std;

int main()
{
	int T,a,b;
	
	cin >> T;

	for (int i = 0; i < T; i++)
	{
		for(int j =0; j <i+1; j++)
			cout << "*";
			cout << "\n";
	}
}

7
*
**
***
****
*****
******
*******

이거 풀고있었는데 아는 지인한테 연락이 왔다
뭐하고 있냐길래 그냥 코테 풀고있다고 하니깐 코테는 출력시간이 중요하다면서 for문 안에 for문 쓰지말라구함 for문 쓰고 있는지 어떻게 알았지 신기하다ㅋㅋㅋ

방법 2
string을 만들어 추가해주며 출력

#include <iostream>

using namespace std;

int main()
{
	int T,a,b;
	
	cin >> T;

	string set;


	for (int i = 0; i < T; i++)
	{
		set += "*";
		cout <<set<< "\n";
	}
}

✔ 2439번 별 찍기 - 2

오른쪽으로 별을 출력하는 문제

#include <iostream>

using namespace std;

int main()
{
	int T;
	cin >> T;
	string set;
	string star;

	for (int i = 0; i < T; i++)
	{
		set = "";
		for (int j = 0; j < T - i-1; j++)
			set += " ";
		star += "*";
		cout <<set<<star<< "\n";
	}
}

띄어쓰기가 안보이길래 사진으로 첨부

✔ 10952번 A+B - 5

지정횟수를 알 수 없으니 while문을 사용하여
true/false를 체크하여 반복한다

#include <iostream>

using namespace std;

int main()
{
	int a,b;

	bool check = false;

	while (!check)
	{
		cin >> a >> b;
		if (a == 0 && b == 0)
		{
			check = true;
		}
		else
		{
			cout << a + b<<"\n";
		}
	}
}

4 4
8
2 2
4
4 2
6
3 6
9
0 0

✔ 10951번 A+B - 4

cin.eof() - 파일이 종료되면 true를 반환한다
콘솔 창에선 ctrl+z를 입력

#include <iostream>

using namespace std;

int main()
{
	int a,b;

	bool check= false;
	while (!check)
	{
		cin >> a >> b;
		if (cin.eof())
			check = true;
		else
			cout << a + b << "\n";
	}
}

2 2
4
3 3
6
5 5
10
2 5
7
^Z

0개의 댓글

관련 채용 정보