본문 바로가기

알고리즘/알고리즘 개념?부족?_4

배열 회전, (시뮬 90도회전) 알고리즘 문제를 해결할 때 배열을 회전할 경우가 매우 많다. 한번씩 헷갈린 경우가 있기에 여러번 보자. 새로운 배열 (i,j)에는 90도 회전하기전의 값들이 들어가야한다, 즉 90도 반시계 위치의 값들이 있어야한다, 우선 i, j에서 i가 0행으로 보자, 0행 0열일 경우 (n -1 - j행,i열) 값들이 순차적으로 들어오게된다. new_grid[i][j] = grid[n - 1 - j][i] void Rotate() { memset(next_grid, 0, sizeof(next_grid)); for(int i = 0 ; i < n ; i++) for(int j = 0 ; j < n ; j++) next_grid[i][j] = grid[n - j -1][i]; for(int i = 0 ; i < n ; .. 2021. 12. 28.
비트연산 - Bit Operation 비트연산 비트연산 매우매우 유용하다. 특히 전체 부분집합의 갯수를 헤아리거나, 모든 원소들의 부분합? 이렇게 구할때는 매우 유용하게 사용할 수 있다.. 일반적으로 문제를 풀거나 할때 쓰는 >> or > 1 이런식으로 해줄 수 있다 이렇게 하면 shift 연산자는 우선순위가 낮아서 괄호가 필요없다는 것이 장점! 활용 2 카카오 블라인드 후보키에서도 bit연산이 많이 필요하다 만약 해당 숫자에서 켜진 bit의 수를 알고자할 때도 비트연산이 필요하다. int countBits(int x) { int ret = 0; while(ret) { if(x & 1) ++ret; // 해당 x의 bit의 첫번째에 켜져있다. // 그후에 작업했던 bit는 지운다 x = x >> 1; // x를 오른쪽으로 1칸 shift이동.. 2021. 12. 14.
달팽이 비스무리한 것 (시뮬레이션, c++) 달팽이 비스무리 문제 n * n 격자에서 숫자 1부터 우 위 좌 우 방향으로 돌아가면서 직사각형을 채우면된다. 돌아가는 형식은 백준의 소용돌이 예쁘게 문제랑 동일하다 우측에서 좌측으로 변할때마다 이동하는 횟수가 증가한다. 관련 출처 : https://www.acmicpc.net/problem/1022 헤맨 부분 소스를 막 달려서 짜다가 실행 흐름을 생각지 않고 짰었다.. 실행의 흐름을 보자 일단 시작점을 잡고 -> 갈 수 있는지 체크 -> 현재 dirCnt만큼 움직이다가 하나 움직이고 바로 x, y 좌표를 갱신해야한다 -> 이후 해당 dirCnt만큼 다 움직인 이후에 direction을 변화시켜야한다 -> 변화 시킨 direction이 우측 좌측이면 dirCnt증가 나는 밑의 x, y갱신을 자꾸 dirC.. 2021. 12. 11.
최대 최소 나는 최대최소를 구할때 그냥 일단 숫자의 범위와 상관없이 987654321, or -987654321를 넣는 방법을 주로 이용했다 그러나 더 안전한 방법이 있었다. 최대 최소, 갯수까지 구하기 밑의 소스에서 일단 배열의 첫 원소를 minNumber로 값을 넣어둔다. 그후에 다음 원소들을 비교하면서 갱신을한다, 일단 최소 or 최대의 원소를 구할려면 값이 갱신 될때마다 cnt =1로 갱신해줘야한다 그리고 갱신이후에 현재 최대 or 최소 값이 다음 원소의 값이랑 동일 하다면 cnt++로 해주면된다. cin >> n; for(int i = 0 ; i > a[i]; } minNumber = a[0]; cnt = 1; for(int i = 1; i < n; i++) { if(minN.. 2021. 12. 10.