2020. 7. 20. 21:06ㆍBOJ
이 새벽시간을 틈타 한 문제씩 풀어주는 게 제맛이다.
[BOJ 2739]
한 문제만 풀려고 했는데 이건 너무 쉽잖아.
#include <stdio.h>
int main(){
int N;
scanf("%d",&N);
for(int k=1;k<=9;++k)
printf("%d * %d = %d\n", N, k, N*k);
}
[BOJ 10950]
하나만 더 풀어봐야 겠다.
#include <stdio.h>
int two_sum(){
int A, B;
scanf("%d%d",&A,&B);
printf("%d\n",A+B);
return 0;
}
int main(){
int T;
scanf("%d",&T);
for(int k=0;k<T;++k) two_sum();
}
[BOJ 8393]
새벽시간이라 그런지 채점이 눈 깜짝할 사이에 된다.
#include <stdio.h>
int consecutive_sum(int n){
int sum = 0;
for(int k=1;k<=n;++k) sum += k;
return sum;
}
int main(){
int n;
scanf("%d",&n);
printf("%d",consecutive_sum(n));
}
[BOJ 15552]
자 친구들 여기서 집중해주세요. 프로그램의 입출력은 커널을 거치기 때문에 프로그램 자체의 계산에 비해 생각보다 느립니다. 그리고 운영체제는 일반적인 상황을 상정하기 때문에 일반적인 사람은 잘 생각하지 않는 조건(constraint)을 전부 충족하게끔 프로그램을 작성합니다. 이를테면 synchronization 같은 건데, 이런 것들이 성능에 영향을 줍니다. 루틴이 느려진다는 겁니다. 그런데 이런 것들이 운영체제 작동에 오류가 없도록 하기 위해 작성되었지만, 빠름 빠름을 추구하는 백준 알고리즘에는 맞지 않습니다. 그래서 이 조건을 충족하지 않아도 되도록 설정해줄 필요가 있습니다.
각 언어별 상세한 설명은 https://www.acmicpc.net/board/view/22716 을 참고하도록 합시다.
제가 쓰는 것 몇개만 적용해보겠습니다. 저는 C, C++, Python 정도를 쓰기 때문에 3개만 하도록 하겠습니다.
C는 위의 문제를 그대로 갖다쓰면 됩니다. 백준 형님이 scanf/printf는 충분히 빠르다고 했습니다.
C++에서는 cin.tie(NULL);ios_base::sync_with_stdio(false);를 추가해주고 사용하면 됩니다. 참고로 scanf/printf를 쓰면 입출력이 꼬이기 때문에 혼용해서 사용하면 안됩니다.
#include <iostream>
using namespace std;
int two_sum(){
int A, B;
cin >> A >> B;
// do not use endl
cout << A+B << '\n';
return 0;
}
int main(){
// C++ iostream acceleration
// no synchronization with C stdio
cin.tie(NULL);
ios_base::sync_with_stdio(false);
int T;
cin >> T;
for(int k=0;k<T;++k) two_sum();
}
Python으로 하는 건 솔직히 저도 처음 해봅니다. 알고리즘으로 파이썬 잘 안 씁니다. 파이썬을 쓸 때는 빠르게 동작을 구현해야 할 때 씁니다. 먼저 sys 모듈을 받아와서 입출력에 접근할 수 있게 해줍니다. 그 다음에 sys.stdin.readline을 통해 한줄씩 받아옵니다. 출력은 그냥 print를 사용해주었습니다.
import sys
T = int(sys.stdin.readline())
for _ in range(T):
IN = sys.stdin.readline().split()
A = int(IN[0])
B = int(IN[1])
print(A+B)
보통은 이 정도만 가속하면 충분하다. 갑자기 feel 받아서 한번 극강으로 가속해보았다.
이 코드에서는 입출력을 딱 2번 쓴다. 입력 받을 때 한번, 출력할 때 한번이다. 먼저 입력을 받아서 전부 다 split을 한다. 입력의 포맷이 첫줄에 테스트케이스 개수, 그 다음부터 T 줄에 걸쳐서 숫자가 2개씩 띄어써서 나온다. 따라서 전부 split을 하면 첫번째 숫자는 테스트케이스 개수이고 두번째부터 2개씩 짝지어서 입력 숫자가 나타난다. 따라서 그 다음부터 T번 동안 2개씩 int로 바꿔서 더해주고 포맷팅을 해주면 된다. 포맷팅을 한 다음에 바로 내보내지 않고 리스트에 보관했다가 한번에 출력한다. 출력할 때는 전부 다 이어붙여서 출력한다. 참고로 새로 리스트에 넣지 않고 기존에 IO 리스트에 그 자리에 바꿔치기 해서 메모리를 아껴준다. 메모리가 굉장히 많이 들기 때문에 적당한 메모리를 찾는 오버헤드도 고려해주는 것이다.
import sys
IO = sys.stdin.read().split('\n')
T = int(IO[0])
del IO[0]
for k in range(T):
A,B = IO[k].split()
IO[k] = (f"{int(A)+int(B)}\n")
sys.stdout.write(''.join(IO))
나이따!
■ Mon Jul 20 18:11:21 KST 2020
[BOJ 2741]
쉬워
#include <stdio.h>
int main(){
int N;
scanf("%d",&N);
for(int k=1;k<=N;++k)
printf("%d\n",k);
}
[BOJ 2742]
쉬워 2
#include <stdio.h>
int main(){
int N;
scanf("%d",&N);
for(int k=N;k>=1;--k)
printf("%d\n",k);
}
[BOJ 11021]
쉬워 3
원래는 전역변수보다는 클래스로 짰을 것이나 귀찮다.
#include <stdio.h>
int casecount = 0;
int two_sum(){
int A, B;
scanf("%d%d",&A,&B);
printf("Case #%d: %d\n", ++casecount, A+B);
return 0;
}
int main(){
int T;
scanf("%d",&T);
for(int k=0;k<T;++k) two_sum();
}
[BOJ 11022]
쉬워 4
#include <stdio.h>
int casecount = 0;
int two_sum(){
int A, B;
scanf("%d%d",&A,&B);
printf("Case #%d: %d + %d = %d\n", ++casecount, A, B, A+B);
return 0;
}
int main(){
int T;
scanf("%d",&T);
for(int k=0;k<T;++k) two_sum();
}
[BOJ 2438]
쉬워 5
#include <stdio.h>
int print_star(int N){
for(int l=1;l<=N;++l){
for(int k=0;k<l;++k)
putchar('*');
putchar('\n');
}
return 0;
}
int main(){
int N;
scanf("%d",&N);
print_star(N);
}
[BOJ 2439]
쉬워 6
#include <stdio.h>
int print_star(int N){
for(int l=1;l<=N;++l){
for(int k=N;k>l;--k)
putchar(' ');
for(int k=l;k>=1;--k)
putchar('*');
putchar('\n');
}
return 0;
}
int main(){
int N;
scanf("%d",&N);
print_star(N);
}
[BOJ 10871]
수고하셨습니다.
#include <stdio.h>
#include <vector>
using namespace std;
int print_smaller(const vector<int> & v, int bound){
for(int n : v)
if(n < bound)
printf("%d ",n);
return 0;
}
int main(){
vector<int> v;
int N, X;
scanf("%d%d",&N,&X);
v.resize(N);
for(int k=0;k<N;++k)
scanf("%d",&v[k]);
print_smaller(v, X);
}
'BOJ' 카테고리의 다른 글
[BOJ] 함수 (0) | 2020.07.23 |
---|---|
[BOJ] 1차원 배열 (0) | 2020.07.21 |
[BOJ] WHILE문 (0) | 2020.07.21 |
[BOJ] 입출력과 사칙연산 (1) | 2020.07.20 |
[BOJ] IF문 (0) | 2020.07.19 |