본문 바로가기

반응형

알고리즘

CLOCKSYNC(C언어) CLOCKSYNC 처음에는 CLOCK 값을 증가시키면서 , CLOCK을 12시에 맞추고 다음 CLOCK 으로 이동하고 이런 방식을 생각했었는데 이런식으로는 계속 문제가 꼬여가서 풀 수 없다고 생각해서 다시 생각해보았다. BUTTON 중심으로 접근하다 보니, 0~9번 까지의 버튼을 몇번 누르는지에 대한 재귀 접근으로 풀 수 있었다. 그리고 가장 중요한 방법은 최소값을 구하는 것이고, 한 버튼을 0번 누르나 4번 누르나 똑같다는 점이었다. 따라서 최소값을 구하기 위해서는 버튼은 최대 3번까지만 누르는 방식으로 재귀함수 코드를 구현할 수 있었다. 또 모든 버튼을 3번씩 누르면 최대 3*16=48번의 버튼을 누를 수 있기 때문에, 기존의 ans 값을 50으로 설정하였다. search_button 함수를 통해서 .. 더보기
BOARDCOVER(C언어) BOARDCOVER C++ 이 아닌 C로 코드를 짜려고 하니까 함수의 인자도 많아지고, 변수도 전부 앞에 선언하고 해서 복잡해졌다. 완전 탐색임에도 불구하고, 아이디어를 생각하고 구현하는데 좀 시간이 걸렸다. 문제를 푼 키워드는, 맨왼쪽상단의 값에서 시작한다고 생각한다는 점이었다. 맨 왼쪽 상단이 비어있는 곳에서 4가지의 블럭 경우를 생각하며 채워넣어 갔다. ㄴ 모양, ㄱ 모양, 그리고 이 두 모양의 좌우로 뒤집은 모양을 dx, dy 를 이용해서 담았다. 그리고 한칸씩 검사해나가면서 그 칸이 차있는지 그렇지 않은질르 탐색하면서, 비어있으면 채우고, 아니면 그냥 지나가도록 재귀함수를 만들었다. 가로로 쭉 탐색하였을 경우 다음 줄로 넘어가는 부분을 재귀함수의 if (y==w) 를 통해서 구현했고, 맨 마지막.. 더보기
PICNIC (C언어) PICNIC 문제를 C언어로 풀어보았다. 예전에 PS 처음할때는 정말 어려웠던 문제였다. C 연습하려고 포인터를 이용해서 문제를 풀었다. 완전탐색을 이용해서 문제해결, 단 중복되는 경우를 없애야한다. 자기보다 번호가 큰 사람만을 보는 방법으로, 한 방향을 정해서 중복을 없앨 수 있었다. 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071#include void init(int(*isfriend)[11], int* havefriend);void matching(int k, int n, int(*isfriend)[11], .. 더보기
15685번 15685번 - 드래곤 커브 규칙을 명확하게 식으로 풀어내는데 어려움을 느꼈다. 그리고 주어진 문제에서 X,Y 좌표 값이 내가 평상시에 쓰던 값이랑 달라서 헷갈렸다. 규칙은 각각의 버전을 따로 나열해서 생각해보면 찾을 수 있다. 주어진 예시의 경우 버전 0일때 오른쪽 버전 1일때 오른쪽 - 위쪽 버전 2일때 오른쪽 - 위쪽 - 왼쪽 - 위쪽 버전 3일때 오른쪽 - 위쪽 - 왼쪽 - 위쪽 - 왼쪽 - 아래쪽 - 왼쪽 - 위쪽 빨간색의 경우는 이전의 버전을 그대로 따라오고, 파란색의 경우는 빨간색을 역순으로 보았을 때 왼쪽으로 90도로 움직인 것이라 볼 수 있다. 위쪽은(↑) 왼쪽으로(←) , 왼쪽은(←) 아래쪽으로(↓) ... 따라서 이에 맞게 change 함수를 구현하고 dx,dy 배열을 이용하여 문제를.. 더보기
15686번 15686번 - 치킨 배달 삼성 상반기 기출문제로 알려져 있는 문제. 오랜만에 PS를 다시 시작하니까 뭔가 감을 잃어버린 느낌... 처음에 문제가 꽤 복잡하다고 생각해서 문제를 여러번 읽어봤다. 어떤 걸 먼저 접근해서, 고정시키고 풀어야할지를 생각하면서 풀어봤다. 그러다가 치킨집을 선택할 수 있는 제한값이 낮기 때문에, 이를 이용해서 재귀함수를 구현하고, 완전탐색을 하였다. 치킨집을 최대 M개 선택할 수 있기 때문에, 1~M까지 치킨집을 모두 구해야한다. 기본적으로. 물론 최소 거리를 구하기 때문에, 가지치기를 통해서 충분히 전부하지 않고 구할 수 있을 것이라고 생각한다. (하지만 난 구현하지는 않았다.) 그리고 치킨집이 많을 수록 그 거리를 최소화 할 확률이 높기 때문에 main 함수에서 for문은 가.. 더보기
1799번 1799번 - 비숍 처음에는 N-Queen 처럼 행으로 접근했더니 시간 초과가 발생. 그 다음에는 대각선으로 생각했으나, 시간 초과 발생. 그리고 다른 사람들 힌트를 생각했더니, 홀수번째 대각선과 짝수번째 대각선은 서로에게 영향을 미치지 않는다. 그렇기 때문에 합으로 나타내서 시간을 줄일 수 있었다.( 예를들면 1억x1억을 1억+1억으로 바꾸면 시간이 확 줄듯이) 그렇게 해서 오른쪽 위로 올라가는 대각선을 짝수번째와 홀수번째로 나누었다. 처음 dfs문에서 x,y,c를 구하는 것은 각 대각선의 첫번째 값을 구하는 방법이다. 그리고 while문을 통해서 대각선의 값들을 하나씩 넣어보는 방식으로 문제를 풀었다. 이때 chk 배열은 대각선과 직각을 이루는 대각선이 사용됐는지 여부를 판단하는데 사용했다. 즉, 처.. 더보기
1063번 1063번 - 킹 간단한 시뮬레이션 문제인데, 평상시에 사용하던 맵이랑은 뒤바뀌어 있다. 그래도 그냥 맨 왼쪽 아래를 0,0 으로 놓고 생각해서 문제를 풀었다. 평상시랑 dx 배열의 값이 반대가 되어야 한다. 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116#include#includeusing namespace std;int d.. 더보기
11559 11559번 - Puyo Puyo 시뮬레이션 문제. dfs를 돌면서, 길이가 4이상인 값들은 맵에서 전부 '.' 로 바꿔준다. era 라는 함수를 써서 dfs와 똑같이 돌면서 값을 . 으로 바꿔주는 함수를 이용했다. dfs를 이용해서는 return 을 이용해서 길이 체크하는 코딩이 생각이 나지 않아서, 값이 작아서 두번 이용했다. 그리고 다시 전체를 돌면서 이동시켜준다. 이때는 맨 밑 바닥부터 시작해서 위에 값들과 swap 시켜주는 방식으로 문제를 풀었다. 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747.. 더보기

반응형