순열을 이용해 해결할 수 있는 문제다 기억해야할건 순열을 쓰기전에 정렬시키고 사용해야 한다는 것! 그걸 잊고있다가 오랜시간이 걸렸당.. 사용되는 알파벳을 찾아두고 순열로 점수를 매겨서 최댓값을 찾아보면 된다! 소스코드 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 #include #include #include #include #include using namespace std; int n; int a[11],b[111]; bool c[30]; string sa[11]; int main(){ scanf(" %d",&n); for(int i=0;i>sa[i]; ..
순열을 이용해 풀 수 있는 문제다! 숫자를 최대 10개 사용하기 때문에 다 넣어보고 부등호를 만족한다면 그 중 가장 큰것과 작은것을 찾아내면 된다! 소스코드 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 using namespace std; #define ll long long ll M = 0; ll N = 1e12; int maxn[11],minn[11]; char op[11]; int a[10]; int n; bool check(){ for(int i=0;ia[i+1])) retur..
유명한 문제다! 근데 오랜만에 dp보다가 틀렸따! 먼저 dp식을 생각해보자 d[n] = n을 마지막으로 하는 가장 긴 수열로 생각하면 된다! 처음에 d[n]은 n까지 보면 가장 긴 길이라고 생각하다가 틀렸었다 n은 1000이기 때문에 그냥 for문을 돌면서 나를 기준으로 앞으로 가면서 나보다 작은수를 만날때마다 내 앞에 올수있는 것 중에서 나보다 길이가 긴 애를 가져가면 된다! 그럼 수열은 어떻게 구하면 될까? stack을 타고간다는 생각으로 나는 내 앞에 오는 작은 수만 생각하면 된다 그럼 가장 긴 수열이 만들어졌을 때 계속 내 바로 앞 숫자만 호출하면 수열이 완성된다! 소스코드 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 ..
123더하기에서 조건이 추가되었다 바로 연속된 숫자는 사용할 수 없다는 것이다 그럼 어떻게 문제를 해결해야할까 우리는 테이블에 하나의 정보를 더 저장하면 된다! 바로 마지막 숫자다 숫자 n을 만들 때 마지막이 1이라면 n-1을 만드는 경우의 수에서 마지막이 2,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 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 #include #include using namespace std; #define ll long long const ll mod = 1e9+9; i..
처음 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 ..
이 문제는 스택의 개념으로 풀면 된다 0이 나오면 pop 아니면 push다 물론 진짜 스택을 만들 필요는 없다 배열을 이용해서 스택처럼 쓸 수 있다! 소스코드 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 package SWEA; import java.util.Scanner; public class Solution_d3_8931_제로 { public static void main(String[] args) { // TODO Auto-generated method stub Scanner sc = new Scanner(System.in); int T = sc.nextInt(); for(int test_case=1;test..
Java 마스터를 위해 SWEA d3문제를 다 풀어보도록하겠다..! 이 문제는 N이 1000이하고 2개만 고르기때문에 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 package SWEA; import java.util.Scanner; public class Solution_d3_9229_한빈이와SpotMart { public static void main(String[] args) { // TODO Auto-generated method stub Scanner sc = new Scanner(System.in); int T = sc.nextInt(); for(int tes..
문제를 잘 읽어보면 한가지 알고리즘이 떠오른다 LCA!!! 간만에 떠올라서 잠깐 다시 공부하고 오랜만에 만들어봤다! 먼저 이 문제는 1이 루트고 bfs로 나머지 정점들에 순서대로 계속 가기 때문에 정점 2개씩 잡으며 lca를 구해서 lca까지의 거리를 더해가면 답을 구할 수 있다 lca만 알면 쉽게 풀 수 있는 문제다! 근데 더 어려운건 swea에서 스택메모리가 1메가라그런지 dfs로 깊이를 매기니 런타임 에러가 났다;; 대체 어디가 틀린지 몰랐는데 이게 틀렸었다;; bfs로 바꿔서 깊이를 찾았다!! 함수였던건 다 메인으로 넣어버렸다! 소스코드 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 ..
트라이 기본 문제다. 트라이 짜는법을 마지막으로 정적으로 배웠기 때문에 정적트라이를 이용했다! 문제를 푸는 방법은 간단하다 트라이를 만들고 cnt배열을 만들어서 지나가는 정점마다 cnt를 올려주면 된다 그럼 내가 어떤 지점에서 시작한다고 할 때 그 수만큼 cnt가 올라갈 것 이다 근데 문제는 초기화가..! 문제였다 정적으로 잡기 때문에 노드의 수를 미리 max로 두고 시작한다 여기서는 100000개의 쿼리 X 10자리수 X 알파벳 26개 다 근데 바보같이 초기화 하는 부분에서 max 크기만큼 모든배열을 계속 초기화했다 시간초과가 정확히 30번 났다 혹시 오타가 났나 계속 다시 짰는데 문제는 초기화였다 생각해보면 초기화는 내가 사용한 정점까지만 해주면 된다 trie_cnt에 저장해놨기 때문에 딱 이만큼만 ..