목록알고리즘 (29)
-
최대값과 최소값https://www.acmicpc.net/problem/2357 세그먼트트리를 활용하여 푸는 문제이다.세그먼트트리를 모른다면 구글을 활용해 검색해보자. 자세한 설명들이 많이 올라와있다. [문제 풀이]먼저, 2열부터 11열까지 숫자를 입력받아 tree 배열에 집어넣는다. 인덱스를 신경써야 한다.idx12345678910111213141516171819202122232425262728293031 75301003850515220815XXXXXX 세그먼트 트리를 완성시키면 다음과 같은 모습이 된다.(문제는 최솟값, 최댓값을 구하라고 했지만, 편의상 지금은 최솟값만 구했다.) idx12345678910111213141516171819202122232425262728293031 520530205X3..
Pi 구하기!int형 pi 배열과 char형 c배열이 있을 때 pi 구하기!!1234for(int i = 1; i 0 && c[i] != c[j]) j = pi[j-1]; if(c[i] == c[j]) pi[i] = ++j;}Colored by Color Scriptercs kmp 알고리즘에 대한 자세한 설명은http://bowbowbow.tistory.com/6여기에 잘 되어 있다.
LRH 식물https://www.acmicpc.net/problem/2934 식물의 이름이 희한하다. LRH.......예전에 한번 도전해봤는데 무슨말인지 하나도 이해가 가지 않아..시간이 지나고 다시 도전했다.물론 지금도 제대로 알고 푼 것 같지는 않다.알고리즘 분류에는 비트마스크, 펜윅트리라고 분류가 되어 있지만 나는 조금 어거지로 푼 느낌...??다른 분들 코드 보고 다시 공부해야겠다! 이 문제에 펜윅트리를 어떻게 적용할까 한참 고민하다 굳이 펜윅트리를 적용하지 않아도 풀 수 있겠다는 생각이 들었다.풀이법을 생각해낸 아이디어는 다음과 같다.LRH식물은 기둥 두 개와 줄기로 이루어져 있다.상근이는 매일 LRH 식물을 심는데, 그 높이가 전날보다 항상 1이 높다.(식물의 높이는 1씩 증가한다)다시 말해..
여러 직사각형의 전체 면적 구하기https://www.acmicpc.net/problem/2672 문제를 푸는것도 어렵지만 자릿수 맞춰 출력하는 것도 조금 까다로운 것 같다..123456 long ans = (long)(chk(x, y)*100); if(ans%100 == 0){ System.out.println(ans/100); }else{ System.out.printf("%.2f", ((double)ans)/100); }Colored by Color Scriptercs요렇게 했을 때 백준 사이트의 테스트케이스와 codeup에서는 맞았지만 채점 결과 틀렸다고 나왔다. 123456 double ans = (chk(x, y)); if((long)ans == ans){ System.out.println((..
암호코드https://www.acmicpc.net/problem/2011 언뜻 보면 쉬운 dp문제처럼 보이는데.. 예외로 처리해줘야 할 사항들이 몇가지 있다.나는 그 사항들을 체크하지 않아 엄청 많이 틀렸다. 주어진 입력이 해석 가능한 숫자조합인지 꼭!!! 체크한 뒤 제거해 줘야 한다.체크해줘야할 사항들로는1. 0으로 시작하는 경우2. 0이 연속으로 나오는 경우3. 0 앞에 3~9의 숫자가 나오는 경우4. 그리고!! 출력은 10000000으로 나눈 나머지를 출력할것! 잊지말자. 이 모든 예외들을 처리해 준 후 dp[i] = dp[i-1] + dp[i-2](S.charAt(i) > '0' && (S.charAt(i-1) == '1' || ( S.charAt(i-1) == '2' && S.charAt(i) ..
캔디캔디https://www.acmicpc.net/problem/2878 아.. 어렵다 처음에 생각한 풀이법은50 1011062534789이런 입력이 주어졌다고 할 때, list[]에 저장한 뒤 sort를 하고 이분탐색으로 left mid right 12345678910 50 -> 16 left mid right 0000123456 16 -> 1 left mid right 0000000123 위의 그림과 같이 왼쪽 범위의 숫자들을 0으로, 오른 쪽 범위의 숫자들은 list[mid]의 숫자만큼 빼주며 이분탐색을 진행하려 했으나숫자가 작을 때, 과연 어느 숫자를 줄여줘야 할지...이 경우에는 3을 1 줄이는 것이 최선이라는 것을 딱 알 수 있지만 다른 복잡한 경우는 어떻게 처리해야 할지 고민하다 결국 해결하..
밑변을 공유하는 두 개의 직각삼각형의 빗변 a, b와, 빗변이 교차하는 지점의 높이 h가 주어졌을 때밑변의 길이 w를 구하고 싶다? A = Math.sqrt(a*a-w*w);B = Math.sqrt(b*b-w*w);이라고 할 때 h = (A*B)/(A+B)를 만족하는 w를 찾으면 된다! =>다른 풀이...두 삼각형을 좌표평면으로 가져왔을 때,빗변을 직선의 방정식으로 나타내면빗변 b는 빗변 a는 이렇게 나타낼 수 있다. 여기서 적절한 x값(binary search로 찾아갈 수 있다.)을 통해 w를 구할 수 있음
불https://www.acmicpc.net/problem/5427 예외사항 : 13 3* . .@ * .* . . 위와 같은 상황을 처리하지 못했음.12345678910111213141516171819for(int i = 0; i
일곱 난쟁이https://www.acmicpc.net/problem/2309 어렵지 않게 풀 수 있는 문제라고 생각한다.왜냐하면 입력도 9개로 정해져 있고, 조건도 까다롭지 않기 때문이다. [문제 풀이]9개의 입력을 받고 정렬이중for문으로 9개의 합 - 2개의 합 = 100 이 되는 인덱스 2개를 찾는다.출력할 때 그 2개 빼놓고 출력하면 됨.
역사https://www.acmicpc.net/problem/1613 [문제 풀이]첫 줄에 있는 사건의 개수 n과 전후관계 개수 k을 입력받는다.map[n][n] 배열을 생성한 후전후관계 k개(row, col 형태)를 입력받는데map[row][col] = -1map[col][row] = 1이렇게 설정한다. 예제로 입력된 정보를 토대로 맵을 생성해보면 -1-1 1 -1 -1 1 1 -1 11 이런 형태의 맵이 나오게 된다.이 상태에서 플로이드 와샬 알고리즘을 사용하여 완전탐색을 하면 된다. if(map[row][k] != 0 && map[row][k] == map[l][col]){map[row][col] = map[row][k];} 0-1-1-1010-1-10110-101110000000 탐색결과 위와 같..