일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- 장고
- 알고리즘
- django
- 17143
- 14888
- 연산자 끼워넣기
- 16637
- 부분수열의 합
- 따라하기
- 좋아요
- Ajax
- 재귀
- 댓글
- 17136
- 구슬탈출2
- 백준
- Java
- 17144
- 인스타
- 6603
- 로또
- 17472
- 14502
- 미세먼지 안녕!
- 1182
- 괄호추가하기
- 색종이 붙이기
- 9095
- 인스타그램
- 다리 만들기2
- Today
- Total
Be a developer
알고리즘 풀면서 참고할 사항들 본문
계속 추가될 예정.
1. scanf를 잘 써보자.
scanf("%1d",&num); //101010이 입력으로 들어올 때 하나씩 int형으로 읽을 수 있다.
scanf("%d,%d",&num1, &num2); //10,10과 같이 정해진 형식으로 입력을 받을 수 있다.
2. 배열을 전역변수로 선언하면 모든 원소가 0으로 초기화 된다.
지역변수로 선언하면 dp[1001][10] = {}; 이렇게 초기화 해줘야 모든 원소가 0으로 초기화된다.
3. min, max return하는 함수 사용법
auto res = minmax_element(vector.begin(), vector.end())
/*
*res.first => min
*res.second => max
*/
res = max_element(vector.begin(), vector.end())
//*res => max
res의 자료형을 auto로 선언하는 것을 주의한다.
이름이 minmax니까 first가 min이고 max가 second다.(이것도 조심)
auto res;
res = minmax_element(vector.begin(), vector.end());
위와 같은 코드는 안된다. auto형은 선언과 동시에 초기화해야 하는 듯.
(14888번 연산자 끼워넣기 문제 참조)
4. next_permutation은 vector, array 다 된다.
주의할 점은 정렬 한 후에 사용해야 한다는 것, 그래야 모든 경우의 수를 다 돌려볼 수 있다.
5. vector에 있는 원소의 중복을 제거하기 위해서는 unique, erase를 사용하면 된다.
6. 다중 for문을 사용할 때, 그리고 결과를 오름차순으로 정렬해야 할 때는 처음에 array나 vector를
정렬한 후에 사용해라.
7. max, abs 함수를 잘 사용하자.(max함수가 키워드로 사용되므로 변수에 max를 왠만하면 사용하지 않도록 주의)
ans = max(ans, sum);
ans = abs(a-b);
8. 로또 문제에서 알 수 있듯이 next_permutation함수는 현재 순열이 다음 순열과 같은 값을 가지지 않도록 반환한다.
그래서 k개 중에서 n개를 고른다면 배열을 하나 만들어서 n개는 1로 표시하고, 나머지는 0으로 표시해서 풀 수 있다.
그렇게 하면 똑같은 값을 가지지 않도록 해서 풀 수 있다.
9. 재귀로 문제를 풀 때, 불가능한 경우와 정답이 될 수 있는 경우의 순서가 중요할 수도 있으니 주의하자.
10. 문자열을 입력받을 때, char 배열로 선언해서
char buf[100];
scanf("%s",buf);
위와 같이 입력받자.
문자열 비교는 strcmp를 이용하자.
11. memset을 사용하려면 <cstring>을 include 해야 한다.
memset은 0과 -1로만 초기화 가능하다. 그 외의 수는 초기화가 안된다.
why??
memset(d,1,sizeof(d))
위와 같이 사용하면 1byte마다 1로 초기화 해주는 것이기 때문이다. 0은 모든 bit가 0이기 때문에 상관 없다.
12. bfs에서 matrix를 사용할 때, 한 번 이동할 때마다 그 count를 세는 방법은 matrix를 하나 만들어서 이동 횟수를 저장하면 된다.(7576 토마토 문제 참고)
13. bfs에서 출발 지점이 여러 군데면 다 queue에 넣고 시작하면 된다.
14. 조건이 많을 때는 continue로 하나씩 거르는 것이 편할 수도 있다.
15. 다이나믹 프로그래밍을 할 때, 1차원 배열로만 풀 생각하지 말고, 2차원 배열과 3차원 배열도 이용할 생각을 하자.
16. 큰 수가 답이라서 %연산을 통해 답을 도출해야 하는 경우에는 long long int 배열을 만들어라
출력은 %lld로 해야 한다.(왜 틀렸는지 몰랐는데 이거 때메 매우매우매우 오래 고민함)
17. index가 음수가 되면 안되는 조건이 필요하면 좀 쉽게 적을 수 있는 방법을 생각해보자
18. 수열의 부분 수열이란 말은 sorting하면 안 된다는 말이다.(11053번 문제)
19. 자리수 검사하는 방법 2가지
- 문자열로 바꿔서 한글자씩 검사하는 방법
- 10으로 계속 나누면서 검사하는 방법
20. next_permutation은 algoritm 헤더파일을 include 해야한다.
21. do-while문에서 continue는 while문과 똑같이 동작한다.
22.
for (char x : password) {
if (x == 'a' || x == 'e' || x == 'i' || x == 'o' || x == 'u') {
mo += 1;
} else {
ja += 1;
}
}
위와 같은 for문을 까먹지 말고 사용하자.
23. string 자료형을 출력하려면 string 헤더 파일을 include 해야한다. 그 후 cout으로 출력한다.
string 자료형의 비교는 == 연산자로 가능하다.
대입도 = 연산자로 가능하다. 깊은 복사가 된다.
추가할 때는 + 연산자를 쓴다.
24. 한 줄을 통째로 읽어들이기 위해서는 getline 함수를 사용한다. string 헤더를 include해야한다.(iostream 헤더에도 있다. 사용방법이 다르다.)
'알고리즘' 카테고리의 다른 글
백준 6603 로또 (0) | 2019.04.01 |
---|---|
백준 10971 외판원 순회 2 (0) | 2019.03.29 |
백준 10819 차이를 최대로 (0) | 2019.03.27 |
백준 10972 다음 순열 (0) | 2019.03.27 |
백준 9095 1,2,3 더하기 (0) | 2019.03.27 |