본문 바로가기

분류 전체보기

BOJ 백준 1152 단어의 개수 <문자열 처리> 이 문제는 C++의 cin과 string을 이용하면 보다 간결하고 짧은 코드로 풀 수 있는 문제이다. 맨 앞과 마지막에도 공백이 들어오므로 단어의 개수를 셀 때 띄어쓰기를 이용하는 방법으로 문제를 푼다면 맨 앞과 마지막의 공백은 고려하지 않도록 하여 문제를 풀어야 한다. C++의 표준 입력 함수인 cin은 표준 입력 버퍼에서 개행 문자를 제외한 값을 가져온다. 이 말은 space(띄어쓰기)를 기준으로 각 단어를 끊어서 입력을 받아오는 것이다. 아래와 같이 코딩을 한다면 string s; while(cin >> s){cout s) { cnt++; } cout
BOJ 백준 5719 거의 최단경로 <다익스트라> https://www.acmicpc.net/problem/5719 이 문제는 크게 한번 뻘짓(?)을 했다. 처음 문제를 잘못 이해해서, 최단경로에 사용되는 경로들을 지우지 않고 두 번째 최단경로를 구해주면 되는 줄 알고, 도착점 e와 연결된 노드들의 최단경로들 중에 2번째로 큰 수를 골라 출력해주는 형태로 하려고 했는데, 당연히 이 풀이는 틀렸다. 그 이유는 최단 경로에 사용된 경로들은 모두 제거해주어야 되기 때문이다. 따라서 이 문제는 먼저 다익스트라 알고리즘으로 최단 경로를 구해주고, 모든 최단 경로에 이용된 경로들을 제거해준 뒤 다시 다익스트라 알고리즘을 실행해서 최단경로를 출력해주면 된다. Dijkstra();DeletePath();Dijkstra(); 다익스트라 알고리즘에..
BOJ 백준 1932 정수 삼각형 <DP> https://www.acmicpc.net/problem/1932 7 7 3 8 10 15 8 1 0 -> 18 16 15 2 7 4 4 20 25 20 19 4 5 2 6 5 24 30 27 26 24 삼각형의 크기 n이 주어지고 삼각형의 안의 숫자가 주어진 뒤에 계단을 타고 내려오듯이 수들을 골랐을 때 그 합이 가장 큰 경우를 출력하면 된다. 위의 예시를 보면 크기 n은 5로 주어졌고 위에서부터 5줄 내려오면서 1씩 증가하면서 수가 입력되는 것을 알 수 있다. 위의 답은 7 -> 3 -> 8 -> 7 -> 5 로 30이 최대이고 이를 출력해주면 된다. 평범한 dp문제를 풀듯이, 각 줄에 내려오면서 그 줄의 최댓값들을 dp배열에 적어주면 된다. 점..
BOJ 백준 2589 보물섬 <BFS> https://www.acmicpc.net/problem/2589 이 문제는 바다와 육지가 주어지고 육지에 보물 두 개를 두었을 때 보물 두 개의 거리가 가장 멀게 배치하고 그 거리를 구해주는 문제이다. 두 보물을 배치한다곤 했지만 보물을 고려하지 않고, 두 육지의 거리가 가장 긴 경우를 출력해주기만 하면 된다. 배열을 for문으로 돌아가면서 'L', 즉 육지마다 BFS알고리즘을 이용하여 최대 거리들을 계산해주면 된다.#include #include #include #define SIZE 51 using namespace std; int xarr[4] = { 1,-1,0,0 }; int yarr[4] = { 0,0,1,-1 }; int n, m; char map[SIZE][SIZE]; in..
fseek과 ftell로 파일의 크기 알아보기 fseek 함수는 파일 커서의 위치를 원하는 곳으로 이동시켜주는 함수이다. fseek(FILE* stream, long offset, int origin); // 성공 시에 0 반환, 0이 아닌 수는 오류 1번째 인자는 파일포인터를 넣어주고, 2번째 인자에는 origin으로부터 몇 떨어진 곳을 가리킬 건지 양수 및 음수를 기입하고 마지막 3번째 인자에는 3가지 SEEK_SET, SEEK_CUR, SEEK_END 중 하나를 넣어주면 된다. SEEK_SET : 파일의 처음 SEEK_CUR : 현재 위치 SEEK_END : 파일의 끝 fseek(FILE* stream, 0, SEEK_END); 를 해주게 되면 파일의 커서는 파일의 끝(EOF)을 가리키게 된다. 여기에 파일 커서의 위치를 가져오는 ftell(F..
BOJ 백준 11055 가장 큰 증가 부분 수열 <LIS> https://www.acmicpc.net/problem/11055 가장 큰 증가 부분 수열 시간 제한메모리 제한제출정답맞은 사람정답 비율1 초256 MB98094414358746.603%문제수열 A가 주어졌을 때, 그 수열의 증가 부분 수열 중에서 합이 가장 큰 것을 구하는 프로그램을 작성하시오.예를 들어, 수열 A = {1, 100, 2, 50, 60, 3, 5, 6, 7, 8} 인 경우에 합이 가장 큰 증가 부분 수열은 A = {1, 100, 2, 50, 60, 3, 5, 6, 7, 8} 이고, 합은 113이다.입력첫째 줄에 수열 A의 크기 N (1 ≤ N ≤ 1,000)이 주어진다.둘째 줄에는 수열 A를 이루고 있는 Ai가 주어진다. (1 ≤ Ai ≤ 1,000)출..
BOJ 백준 11053 가장 긴 증가하는 부분 수열 <LIS> https://www.acmicpc.net/problem/11053 문제수열 A가 주어졌을 때, 가장 긴 증가하는 부분 수열을 구하는 프로그램을 작성하시오.예를 들어, 수열 A = {10, 20, 10, 30, 20, 50} 인 경우에 가장 긴 증가하는 부분 수열은 A = {10, 20, 10, 30, 20, 50} 이고, 길이는 4이다.입력첫째 줄에 수열 A의 크기 N (1 ≤ N ≤ 1,000)이 주어진다.둘째 줄에는 수열 A를 이루고 있는 Ai가 주어진다. (1 ≤ Ai ≤ 1,000)출력첫째 줄에 수열 A의 가장 긴 증가하는 부분 수열의 길이를 출력한다.예제 입력 1 복사6 10 20 10 30 20 50 예제 출력 1 복사4 문제에 써 있는 그대로, {a1, a2, a3, .., an}의 집합이..
C++ lower_bound, upper_bound 1. upper_bound 이진 탐색으로 key값을 탐색하고 [begin, end)에서 key보다 작지 않은 첫 번째 수의 iterator 반환 upper_bound(array, array + n, key); 2. lower_bound 이진 탐색으로 key값을 탐색하고 key값보다 큰 수를 찾아 iterator 반환 lower_bound(array, array + n, key); #include #include using namespace std; int main() { int arr[10] = {1,2,3,4,6,7,8,9,10,11}; printf("lower_bound : %d\n", *(lower_bound(arr ,arr + 10, 4))); printf("upper_bound : %d\n", ..