본문 바로가기

Programming

(89)
[C++ STL] unique함수와 erase함수를 통한 문자열 중복제거 중복문자를 제거하기 위해 unique와 erase 함수를 사용할 수 있다. 1. 필요한 라이브러리 #include #include #include #include 2. vector input받기 int N; cin >> N; for (int i = 0; i > tmp; v.push_back(tmp); } 3. sort하기 (sort를 꼭 해줘야함) sort(v.begin(), v.end(), comp_length); 4. erase하기 unique의 return값은 유일한 원소들이 끝나고 첫번째 쓰레기 원소가 나오는 곳의 위치이다. 예를 들면, 112335가 존재할 때 unique를 통해서 123513이 나오는데. 이때 빨간표시한 자리를 나타낸다. 그래..
[백준/C++] 1181번: 단어정렬 풀이방향 1. string vector를 만든다. 2. 문장들을 입력받으면서 문장의 길이에 해당하는 배열 index에 갯수 추가 (이 과정을 통해 문장길이가 같은 애들끼리만 사전순 정렬가능) 3. 문장 길이순 정렬 4. while문을 돌면서 vector 내부에서 문장길이마다 사전순 정렬 5. 출력 시 바로 앞 문장과 같다면 출력을 하지 않는 식으로 중복없이 출력 왜 틀렸나 계속 고민하고 있었는데 while문 종료조건을 50으로 했다. 그럼 길이가 50인 문장은 처리를 못하잖아...^^ 오래 고민해서 슬프다. 그래도 문자열 관련 공부하기 좋은 문제! #include #include #include #include using namespace std; int cnt[52] = { 0 }; vector v;;..
[백준/C++] 14868번: 문명 뭔지 모르게 서핑하다가 union-find문제를 발견하였는데 아직 한번도 풀어본 적이 없어서 경험삼아 한번 풀어보았다. 생각보다 개념은 어렵지 않다. 두 개의 다른 집단이 인접하였고 또 서로 index가 다르다면 합치면 된다. 종료조건은 집단이 하나만 남았을 때로 하면 된다. (www.youtube.com/watch?v=_N0hk13QM6w) #include #include using namespace std; int N, K, civ[2002][2002], year; queue q, qq; int p[1000002], Rank[1000002]; int root(int x) { if (x == p[x]) return x; // x라는 값이 해당 부모의 값과 동일하다면 x를 return return roo..
[백준/C++] 13460번: 구슬 탈출2 (어려워) 삼성가기 어렵다... 하루종일 붙잡고 있었다. 유튜브보고 따라 품.... 다시 정리해야겠다. #include #include #include using namespace std; //얘가 큐에 넣는애 struct INFO { int rx, ry, bx, by, cnt; }; INFO start; string map[11]; int dx[] = { 1,0,0,-1 }; int dy[] = { 0,1,-1,0 }; int bfs() { int visit[10][10][10][10] = { 0 }; queue q; q.push(start); visit[start.rx][start.ry][start.bx][start.by] = 1; int ret = -1; while (!q.empty()) { INFO cur ..
[백준/C++] 14923번: 미로탈출 이 문제같은 경우 map이 굉장히 컸다. 사실 바로 이전에 풀었던 문제인 연구소(sanghyu.tistory.com/72?category=1139260)와 유사해보여서 풀었는데, 연구소문제처럼 부르트포스로 풀었더니 시간초과가 났다. 사실 예상했던 결과긴 하지만 다른 방식이 생각나지 않아 그렇게 해봤던 것이다.. 그래서 내 힘으로 도저히 못풀겠어서 다른 분들이 풀었던 답안을 참고해서 공부하였다. ** 가중치1, 최단경로이므로 BFS로 풀어야함 아 그리고 또 실수 했던 부분은 시작점이 (1,1)부터여서 나도 1부터 for문을 돌려놓고 map은 1000을 limit으로 줬더니 당연히 틀린다... 1부터 시작할 거면 1001을 limit으로 했었어야 했는데^^ 그래서 풀이 방법은 다음과 같다. 1) visit배..
[백준/C++] 14502번: 연구소 17년도 삼성기출이다. 그리 어렵지 않을 줄 알았는데 머리 좀 써야된다..흑ㅠㅠ map이 크지 않기 때문에 어디에 벽을 둘 지를 부르트포스로 찾으면 되는데 나는 이 부분이 어려웠다. 3개의 벽을 찾았을 때마다 바이러스를 퍼트리도록 하도록 코딩하면 된다. 처음에는 3개의 벽을 다 배열에 담은 다음 그 후에 각 요소에 바이러스를 퍼트리도록 짜려고 했었는데 풀고보니 배열에 굳이 담을 필요없이 그때마다 처리해주면 된다는 것을 배웠다. 문제 풀이 순서 1) 3개의 벽의 자리를 선택해 벽을 세운다. 2) 바이러스를 퍼트린다. 3) 안전구역의 갯수를 센다. 4) 이를 vector에 담는다. 5) 이를 모든 조합에 대해 반복한다. 6) vector에서 최댓값을 찾아 출력한다. #include #include #incl..
[C++ STL] C++ 입출력 속도 향상 입출력 sync 끊기 ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); endl 대신 \n 사용하기 cout
[백준/C++] 2589번: 보물섬 이문제는 딱히 까다롭지 않고 모든 시작점에 대해서 bfs를 진행해서 모든 depth를 담고 max value를 print했다. 끝~ #include #include #include #include #include #include using namespace std; int N, M; string map[51]; int visit[51][51] = { 0 }; int temp[51][51] = { 0 }; vector findMax; int dx[] = { 1,0,0,-1 }; int dy[] = { 0,1,-1,0 }; void bfs(int x, int y) { int out; queue q; q.push(make_pair(make_pair(x, y), 0)); while (!q.empty()) { i..