바쁜 평일을 보냈다
회사에서 신규 게임을 출시 했다! 하하 그런데 앞으로 2개가 더 남았다..
아무튼 회사 얘기는 여기까지하고
이번엔 백준 알고리즘 3단계 반복문을 풀어볼려구 한다
반복문에는 대표적으로 while문과 for문이 있다 그 외에도 do while과 foreach을 사용하기도 하지만 내가 실제 업무에서 자주 활용하는건 while문과 for문을 사용하고 있다
for문은 횟수를 지정할 수 있을때 사용하고
while문 같은 경우는 true/false 체크할 수 있을 때 사용한다
ex) for(int i=0; i < 5; i++) - i가 5보다 작을때까지 반복 i는 1씩 증가
while(!z) - z가 false일 경우 반복
이번 시간엔 for/while문을 활용하여 백준 반복문 문제를 풀어보도록 할것
for(초기값; 조건식; 증감값)
while(조건식)
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
처음에 제목이 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
#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
#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
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
위에 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(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를 사용하고 안하고 사람이 느낄 수 없는 차이가 있는건가..?
지인한테도 물어봤는데 그냥 출력시간의 차이라고한다
#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
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";
}
}
방법 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";
}
}
오른쪽으로 별을 출력하는 문제
#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";
}
}
띄어쓰기가 안보이길래 사진으로 첨부
지정횟수를 알 수 없으니 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
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