처음 dp를 배우면 풀게되는 문제다 많이 틀리는 이유는 mod때문이 아닐까 싶다..! 수가 커질수있으니 매번 더하고 mod를 해줬다! 1,2,3으로 표현해야하므로 현재수 d[n]을 표현하는 방법은 1. d[n-1] 에 1더하기 2. d[n-2] 에 2더하기 3. d[n-3] 에 3더하기 이렇게 3가지 방법이 있다 결국 d[n] = d[n-1]+d[n-2]+d[n-3] 이다! 소스코드 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 #include #include using namespace std; #define ll long long ll n; ll d[1000002]; const ll mod = 1e9+9; int mai..
간단한 완전탐색 문제다 경우의수가 적기 때문에 연산자가 있는대로 다 넣어보면 된다 op배열에 연산자를 넣고 해당연산자가 남아있으면 수를 줄이고 넣어서 다음 숫자로 넘어가고 다시 수를 처음처럼 늘려준다 재귀를 타고 들어가기 때문에 연산한 결과를 계속 가져갔다가 원래대로 돌려준다 소스코드 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 32 33 34 35 36 37 38 39 40 #include #include #include using namespace std; int n; int op[4]; //+,-,x,/; int a[22],b[22]; int maxn = -1000000005; int minn ..
도수를 mid값으로 생각해보자 최대 32번 봐야하고 볼때마다 NlogN연산을 한다고 생각해보자 mid값까지의 도수 중 선호도가 높은 N개를 정해보는 것이다 이분탐색을 통해 찾으면 되지만 오래걸린다! 다른사람들은 pq를 통해 풀었는데 그럼 빠르다..!! 소스코드 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 32 33 34 35 36 37 38 39 40 #include #include #include #include using namespace std; #define ll long long ll n,m,k; vector vt; bool check(ll mid){ vector temp; for(int i..
거꾸로 생각하면 쉽게 풀 수 있다 시프트게 전체가 되므로 그냥 시작점을 옮겨보면 된다 시작점을 기준으로 k칸 뒤에 값을 더해주면 되고 오른쪽 왼쪽 시프트를 할때는 시작점을 움직여보자! 소스코드 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 #include #include using namespace std; #define ll long long int n,q,s; ll arr[200020]; int main(){ cin>>n>>q; for(int i=0;i>arr[i]; for(int i=0;i>x; int a,b; if(x==1){ cin>>a>>b; a--; arr[(s+a)%n]+=b; } else if(x==2){ ..
DP로 풀 수 있는 문제다! d[N*M]로 테이블을 잡아보자 d[pos] = 계산값 + d[pos+|d|]로 칸에서의 최대값을 저장하며 풀어나가보자 이 때 최대값이 음수값으로 나올 수 있으므로 inf값을 잘 설정해야한다 소스코드 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 32 33 34 35 36 37 38 39 40 41 42 43 44 #include #include #include #include using namespace std; #define ll long long const int SIZE = 200005; ll inf = 1e12; ll d[SIZE]; ll arr[SIZE]; int..
생각을 결국 떠올리지 못한 문제다!! 한번 2진수로 생각을 해보자 N -> 0까지 갈 예정이다 그럼 내가 0번째 비트가 1이라면 사라지게 할 방법이 없다 그래서 뒤로 한칸 밀어버려야한다(곱하기) 만약 1번째 비트가 1이라면 결국 2라는 값이 포함된다는 말이고 2를 빼면 된다는 말이다(빼기) 만약 0,1비트가 다 0이면 계속 앞으로 땡겨오자(나누기) 그럼 결론적으로 10^13 => 2^45승 정도의 비트를 이런식으로 다 처리하면 된다 N부터 거꾸로 보기때문에 반대로 연산자를 담아주자 0번째 비트가 1인경우,0인경우를 다 생각해보면 어떻게해도 99번을 넘지 않는다 신기하고 쉬워보이지만 나에게는 처음에 어려운 문제였따..!! 소스코드 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 ..
기업 코딩테스트에서 떨어지면 아마 마음아픈 구현력 때문에 떨어지지 않을까 싶다.. 이 문제는 원숭이들이 한번씩은 무조건 같은팀이 안되도록 7일간의 팀을 출력하면 된다! 왜 7 일인지를 생각해보면 2^7 = 128 이고 n=r 까지!! 이걸 구현을 계속 틀렸다 굿... 싸늘하다.... 극망의 기운이 날아와 가슴에 꽂힌다.. 구현은 잘하자..!! 소스코드 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 32 33 34 35 36 #include #include using namespace std; char ans[7][111]; int n,cnt; void solve(int l,int r,int dep){ ..
최적화란 무엇일까.. BFS로 풀면 되는 문제이다.. 나만 시간이 꼴찌다.. 슬프다.. BFS로 하면 되는데 생각해야할 부분은 빙판에서 미끄러질 때다 첨에는 그냥 빙판에서 미끄러질때 똑같이 check하고 풀었는데 그럼 빙판을 4방향에서 전부 미끄러지는 경우를 생각하면 예외가 나올 수 있다 그래서 빙판미끄러지는 경우를 그냥 하나하나 다 코딩해버려따 헷갈릴 때는 우선 하고 생각하자..!! 소스코드 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 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62..
쉬운건줄 알고 하다가 틀리고 털렸다 이 문제는 수학적으로 k=1 or k=2로 풀 수 있다고 한다 k=1이라면 중앙을 잘라보고 확인하면 된다 k=2라면 절반 한조각과 나머지 절반을 만들 2조각이 나온다 그럼 1부터 N까지 보다 절반이 될 한조각을 찾으면 된다 과일 2개가 정확히 반반씩 있기 때문에 1~N까지 보다보면 길이가 N/2이고 과일을 반반씩 갖는 구간이 무조건 나온다고 한다..!! 나는 몰랐는데..!! 수학이란... 배워간다.. 소스코드 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 #include #include #include using namespace std; int n; string s; int ..