Be a developer

알고리즘 풀면서 참고할 사항들 본문

알고리즘

알고리즘 풀면서 참고할 사항들

중국고대사 2019. 3. 27. 23:01

계속 추가될 예정.

 

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
Comments