본문 바로가기

반응형

공부

(145)
[알고리즘 깨알 팁] 코드와 데이터를 분리하자 (테이블 만들기) 종만북에 나오는 명언이 하나 있습니다. '코드와 데이터를 분리하라.' 저는 코드와 데이터를 분리하는 기준을 다음과 같이 두고 있습니다. 코드 : 무언가를 하는 반복적인 행위.데이터 : 반복적인 행위를 하기 위한 데이터의 집합. 반복적인 행위가 이 데이터에 따라서 다른 결과를 도출함. 종만북에서도 데이터를 배열로 선언(테이블로 만듦)해서 배열을 순회하며 처리하라고 되어있습니다! 많은 분들이 쓰고 계신 예가 하나 있습니다. 바로 BFS에서 이동을 처리하는 경우이죠. 저는 2015년에 (x,y)를 이동하는 방법을 다음과 같이 만들었습니다. 1234567891011121314151617int x,y; void move(int d){ switch(d){ case 0: x -= 1; break; case 1: x ..
[삼성 기출 문제] 백준 5373 큐빙 문제 링크 어떻게 풀까? 진정한 시뮬레이션입니다.정말... 말 그대로 3x3x3 큐브의 U D F B L R을 시계방향과 반시계방향으로 돌리는 것을 구현하면 됩니다! -끝- 이라고 하기엔 너무 힘들고 가혹한 시뮬레이션 입니다.사람에 따라서는 코드 길이도 200~300줄까지 될겁니다. if문과 else문으로 떡칠이 되어있기 때문이죠! 아는 분의 협조를 구해서 가져온 코드의 일부분 입니다! 123456789101112131415161718192021222324252627282930313233343536 if (s == "U+") { Up_cw(a); } else if (s == "U-") { Up_cw(a); Up_cw(a); Up_cw(a); } else if (s == "D+") { Down_cw(a);..
[삼성 기출 문제] 백준 16235 나무 재테크 문제 링크 어떻게 풀까? 최적화를 조금 많이하다보니 문제를 살짝 극혐으로 풀었습니다. 저는 DP, 슬라이딩 윈도도 함께 사용했습니다.만약 슬라이딩 윈도를 잘 모르신다면 여기를 참고하세요 슬라이딩 윈도를 쓰는 이유! 이 문제를 잘 보시면 이전 년도의 나무들에 대한 정보는 전혀 필요가 없습니다.따라서, 현재 년도와 다음 년도에 쓰일 공간만 필요한 것 입니다. 그림에서 보듯이 이전 년도의 나무 개수 자료는 전혀 쓰지 않습니다. 따라서 위처럼, 현재 나무들의 정보를 토대로 다음 년도의 나무를 저장하기 위해선 딱 2개의 정보 배열이 필요합니다. 2개의 나무 배열을 가지고 있다고 하면, y년 이라고 했을때, [y%2^1] 나무 배열을 현재 배열로, [y%2] 배열을 내년 배열로 쓰면 됩니닷! 그리고! 나무들의 정보..
[알고리즘 깨알 팁] BFS 짜는 법 알고리즘을 풀면 아주아주 많이 마주치는 것이 바로 이 BFS입니다.BFS는 최단거리를 찾을때 굉장히 자주쓰이죠! BFS는 보통 큐를 이용한 방식을 사용합니다!큐의 가장 앞에 있는 노드를 불러서 다음노드들을 맨 뒤에 놓으면,결국 먼저왔던 노드들은 먼저 처리되고 나중에 불러진 노드들은 나중에 처리됩니다.BFS는 이런 특징을 이용해서, 같은 거리에 있는 어떤 지점을 처리한 뒤에 다음 거리에 있는 지점을 탐색할 수 있기 때문에 최단거리로 쓸 수 있는 것이죠! BFS에서 가장 중요한 것은 무엇일까요!?바로, 방문 체크를 잘 만들어야 한다는 것입니다!방문 체크를 잘 못만들면 큐에 들어갔던 값이 또 들어가고.. 또 들어가고... 또 들어가서 메모리가 터져버리거든요! 이렇게.. 무한 루프에서 빠져나올수 없게되죠.하지만..
[삼성 기출 문제] 백준 16236 아기 상어 문제 링크 어떻게 풀까? 시뮬레이션과 BFS가 함께 공존하는 혼돈의 문제입니다. 문제의 조건에 맞게 세세하게! 아주 세세하게! 잘 만들어야 합니다.개인적으로, 시뮬레이션이면 구조체를 활용하는 방법을 추천드립니다. 문제에 굉장히 햇갈리는 조건들이 많이 있습니다. 1. 아기 상어는 입력에서 9로 주어진다. (어려운 조건은 아니지만, 이것 때문에 고생을 많이 해서 올립니다.)2. 아기 상어는 처음에 크기가 2이다.3. 아기 상어는 자기보다 작은 물고기만 먹을 수 있다.4. 아기 상어는 자기보다 크기가 큰 물고기가 있는 칸은 지나갈 수 없다.5. 아기 상어는 다음과 같은 조건에 맞춰서 이동한다.- 아기 상어가 먹을 수 있는 물고기가 없으면 엄마에게 도움을 요청한다! (귀엽..)- 먹을 수 있는 물고기가 1마리라..
[삼성 기출 문제] 백준 16234 인구 이동 문제 링크 어떻게 풀까? 굉장히 전형적인 bfs 문제입니다. 이 문제를 해결하기 위해서는 크게 세 가지의 생각이 필요합니다. 1. 인구 차이가 L명 이상, R명 미만인 인접한 국가를 묶어서 연합으로 만드는 방법2. 연합이 된 국가의 인구수를 바꾸는 방법3. 연합이 되는 국가가 없어서 수행을 종료하는 방법 일단 1, 2방법을 한 번에 묶을 수 있는 방법이 있습니다.바로 B.F.S입니다. 연합된 국가를 찾으려고 할 때마다, 2차원 배열을 모두 돌면서 인구차이가 L명 이상, R명 이하가 나는 국가를 모두 연합해서 큐에 넣습니다.그리고 큐에 들어갈때 마다 해당 국가의 인구수를 모두 더합니다. 이제 마지막에 모든 국가의 인구수와 큐에 들어있는 국가의 수를 나누면 균등하게 나눠진 인구 값이 나옵니다. 이제, 큐에서..
[삼성 기출 문제] 백준15686 치킨 배달 문제 링크 어떻게 풀까? 해당 문제는 전형적인 조합 문제입니다.생각해봐야할 과제는 다음과 같습니다. 1. 맵에서 치킨집의 개수를 추출한 후에 비트 조합을 이용해서 m개의 치킨집만을 고른다.2. 사람들이 사는 모든 집에서 현재 선택된 m개의 치킨 집 중에서 최소의 치킨집을 구한 후 더한다. (도시의 치킨 거리를 구한다.)3. 최소의 도시의 치킨 거리 값을 출력한다. 만약, 비트 조합을 만드실줄 모른다면 여기를 참조하세요! 1234567891011121314151617181920212223242526272829typedef struct Cod{ int r,c; } cod; int cNum, pNum;cod company[13];cod people[100]; int getAllDist(){ int visit ..
[알고리즘 깨알 팁] 비트로 연산하는 방법 비트로 연산하는 방법! 많은 사람들이 비트로 연산하는 것에 대한 두려움과 거부감을 가지고 있는 것 같습니다.하지만, 비트연산이란 알고보면 별 것 없습니다! 우선, 비트연산을 하기 위해서 알아야할 5가지의 연산 방법을 알아봅시다. 1. & : 비트 AND 연산. 비트마다 AND 연산을 해서 두 비트가 모두 1일 경우에 1 그 외에는 0이 됩니다. ex) 0b 1111 & 0b 0011 = 0b 0011 2. | : 비트 OR 연산. 비트마다 OR 연산을 해서 두 비트중 하나라도 1일 경우에 1 그 외에는 0이 됩니다.ex) 0b 1100 | 0b 1010 = 0b 1110 3. ~ : 모든 비트를 1이면 0으로 0이면 1로 반전합니다.ex ) ~0b 1100 = 0b 0011 4. >> : 1 비트 오른쪽..

반응형