목록Algorithm (35)
-
https://www.acmicpc.net/problem/1431 1431번: 시리얼 번호 첫째 줄에 기타의 개수 N이 주어진다. N은 1,000보다 작거나 같다. 둘째 줄부터 N개의 줄에 시리얼 번호가 하나씩 주어진다. 시리얼 번호의 길이는 최대 50이고, 알파벳 대문자 또는 숫자로만 이루어져 있다. 시리얼 번호는 중복되지 않는다. www.acmicpc.net #include #include #include #include using namespace std; struct info { int sum; string str; }; vector v; bool F(info a, info b) { if (a.str.length() != b.str.length()) { return a.str.length() < ..
https://www.acmicpc.net/problem/10814 10814번: 나이순 정렬 온라인 저지에 가입한 사람들의 나이와 이름이 가입한 순서대로 주어진다. 이때, 회원들을 나이가 증가하는 순으로, 나이가 같으면 먼저 가입한 사람이 앞에 오는 순서로 정렬하는 프로그램을 작성하시오. www.acmicpc.net 1. Stable Sort 라고 해서 괜히 무턱대고 병합 정렬 사용했다가는 낭패. 너무 복잡해진다. 2. Stable Sort 가 아닌 Sort 를 사용해서 똑같은 결과를 낼 수 있다. 3. 문제를 잘 읽어야함. 나이순 + 나이가 같으면 가입순이다. 이름 사전순 비교하지 않는다. 첫번째 코드 #define _CRT_SECURE_NO_WARNINGS #include #include #incl..
https://www.acmicpc.net/problem/10825 10825번: 국영수 첫째 줄에 도현이네 반의 학생의 수 N (1 ≤ N ≤ 100,000)이 주어진다. 둘째 줄부터 한 줄에 하나씩 각 학생의 이름, 국어, 영어, 수학 점수가 공백으로 구분해 주어진다. 점수는 1보다 크거나 같고, 100보다 작거나 같은 자연수이다. 이름은 알파벳 대소문자로 이루어진 문자열이고, 길이는 10자리를 넘지 않는다. www.acmicpc.net 만약 입력이 "ABC 10 20 30" 으로 들어 온다면? scanf("%s %s %s %s", a, b, c, d) or cin >> a>> b >> c >> d 로 처리 가능! //cout name >> k >> e >> m; v.push_back({ name,a..
https://www.acmicpc.net/problem/11004 11004번: K번째 수 수 N개 A1, A2, ..., AN이 주어진다. A를 오름차순 정렬했을 때, 앞에서부터 K번째 있는 수를 구하는 프로그램을 작성하시오. www.acmicpc.net C++에 sort를 사용하면 된다. 입력이 5,000,000이니 O(nlogn)이면 가능하다고 판단됨. 다만, cout / cin 대신 scanf와 printf 를 사용해야함. 입출력 속도가 차이가 많이 나기에 이것만 바꿔도 시간초과냐 통과냐가 갈림. 해당 문제는 Quick Sort 대신 Quick Selection Sort를 사용하면 O(n)에 해결할 수 있다고함 #include #include #include #include using names..
https://www.acmicpc.net/problem/2573 2573번: 빙산 첫 줄에는 이차원 배열의 행의 개수와 열의 개수를 나타내는 두 정수 N과 M이 한 개의 빈칸을 사이에 두고 주어진다. N과 M은 3 이상 300 이하이다. 그 다음 N개의 줄에는 각 줄마다 배열의 각 행을 나타내는 M개의 정수가 한 개의 빈 칸을 사이에 두고 주어진다. 각 칸에 들어가는 값은 0 이상 10 이하이다. 배열에서 빙산이 차지하는 칸의 개수, 즉, 1 이상의 정수가 들어가는 칸의 개수는 10,000 개 이하이다. 배열의 첫 번째 행과 열, 마지 www.acmicpc.net 핵심 로직은 map 에서 1이상을 가지는 값의 갯수를 저장해두고 사용한다. DFS 순회를 할 때마다 4방향을 조사하여 0의 갯수만큼 차감해주..
그냥. 노가다로 풀었다. rotate 함수를 호출할때마다 x,y의 좌표의 경계와 그 다음을 위치를 체크하여 맵의 범위를 벗어나려하면 스킵하였다. 문제를 정확히 읽어야만... 맵의 숫자를 주사위에 카피하고 맵의 숫자를 0으로 초기화 해주지 않아 한참을 고생하였다. 코드: #include using namespace std; int n, m, x, y, k, o;int map[21][21];int cube[4][3];int cp[4][3];int nx;int ny; //동쪽은 1, 서쪽은 2, 북쪽은 3, 남쪽은 4 void copy_cube(){for (int i = 0; i < 4; i++){for (int j = 0; j < 3; j++){cp[i][j] = cube[i][j];}}}int rotate..
DFS로 해결가능 한 문제이다. 하지만 다른 분들이 푼 방식을 보니 DP를 사용하였더라. DFS로 단순히 탐색을해서 푼것보다 분명 DP를 사용해 푸는것이 시간적인 면에서 훨씬 효율적일 거란 생각이 든다. 우선 내가 푼 방식은 1일째부터 차례대로 dfs로 탐색을 해준다. 표에 있는 예제대로 진행한다면, 1일에 일을 했따면 4일부터 가능하다. 4일에 일을 할 수 있는지 판단하고 다시 dfs로 진행한다. 이처럼 매번 해당 일이 N+1의 마감일을 넘지 않는지 확인해 준다. 1일부터 시작했다면 2일부터 시작을 또 해줘야한다. 그렇게 3,4,5,6,7일을 "시작으로" 탐색을 시작한다. 왜냐하면 저 예제에서는 1일부터 하는 것이 최적의 답이겠지만, 다른 경우가 충분히 있을 수 있기 때문이다 !! dfs에서 V[i]를..
설마 모든 좌표에 대해서 3개의 벽을 세운뒤 BFS로 문제가 해결될 줄 몰랐다. 맵의 크기가 작기 때문에 가능했다. DFS를 보통 x,y,len 이런식의 파라미터를 넣는게 익숙하다 보니 습관적으로 문제를 정확히 분석하기 보다는 습관대로 파라미터를 만들어 놓고 시작하는데 좋지 않은 습관인듯하다. 복습할 때 DFS 활용 방식을 꼭 눈여겨 보자. 코드: #include #include #include using namespace std;int N, M;int map[9][9];int map2[9][9]; int px[4] = { -1, 0, 1, 0 };int py[4] = { 0, -1, 0, 1 }; // up left down rightint cnt;int num_1;int num_2;int ans;st..