C++ 12

[도서/스프링 입문] #1 사람을 사랑한 기술

✔️ 이 글은 [스프링 입문을 위한 자바 객체 지향의 원리와 이해 - 김종민] 도서를 바탕으로 정리한 글입니다. 신기술은 이전 기술의 어깨를 딛고 스프링을 이해 하기 전 필요한 개념 SOA(서비스 지향 아키텍처) CBD(컴포넌트 기반 개발) OOP(객체 지향 프로그램) 절차적/구조적 프로그래밍 기계어나 어셈블리어 기계어에서 객체 지향 프로그래밍 언어로 어셈블리어 - 0과 1의 행진을 벗어나 인간 지향으로 / 기계어 니모닉 어셈블리 : 니모닉(Mnemonic)과 기계어의 일대일 매칭 코드표 어셈블리어(Assembly Language) : 니모닉과 기계어의 일대일 매칭 언어, CPU 별로 각자의 어셈블리어가 달랐음 어셈블러(Assembler) : 어셈블리어를 기계어로 번역해주는 소프트웨어 니모닉(Mnemon..

[백준/C++] 12015번 가장 긴 증가하는 부분 수열 2

🤔문제 이해 LCS(longest common sequence)문제로 11053번과 유사하지만 n과 Ai의 크기가 훨씬 큰 버전의 문제이다. 🔥풀이🔥 lower_bound를 이용하면 되는 문제이다. 수열이 저장되어 있는 arr과 가장 긴 부분 수열을 찾아 넣어줄 벡터 v를 선언해주었다 가장 먼저 v에 arr[0] 원소를 넣어주고 arr의 1번째 원소부터 마지막까지 for문을 돌려주었다. for문에서는 v의 가장 마지막 원소보다 arr[i]번째 원소가 더 큰 경우엔 v.push_back(arr[i])를 해주었다. 그렇지 않은 경우는 v에서 arr[i]보다 크거나 같은 원소 중에서 index가 가장 작은 원소의 iterator를 탐색하고 그 위치에 arr[i]를 넣어주었다. 이 부분이 조금 이해가 안되었는데..

백준/C++ 2022.11.17

[백준/C++] 6087번 레이저 통신

🤔문제 이해 하나의 C에서 다른 C까지 가는 경로 중 방향을 가장 적게 바꾸면서 가는 방법을 찾아 방향을 바꾼 횟수를 출력하는 문제이다. 🔥풀이🔥 첫번째 C에서 갈 수 있는 경로를 먼저 탐색하여 각 방향별로 cnt를 0으로 queue에 넣어준다. 그 뒤에는 queue가 빌때까지 각 방향대로 돌면서 이전과 같은 방향인 경우 cnt는 그대로 두고, 다른 방향인 경우 cnt에 +1을 해주었다. 그렇게 처리한 cnt값이 dp의 값보다 작거나 같으면 dp를 업데이트해주고 queue에도 넣어주었다. queue에서 pop될 때 dp의 값이 cnt보다 작으면 continue을 해주어서 불필요한 연산을 줄여주었고, dp값이 cnt보다 큰 경우는 cnt로 업데이트 해주었다. ✍️ 후기 처음엔 단순히 BFS를 해서 방향이 ..

백준/C++ 2022.11.15

[백준/C++] 15927번 회문은 회문아니야!!

🤔문제 이해 팰린드롬이 아닌 가장 긴 부분문자열을 구하는 문제이다. 🔥풀이🔥 구글링을 통한 문제 풀이이다. 주어진 문자열 전체가 회문이거나 회문이 아닌 경우로 나뉜다. 문자열 전체가 회문이 아닌 경우는 문자열의 왼쪽과 오른쪽 각각 하나씩 확인해서 알 수 있다. 문자열 전체가 회문인 경우는 또 두가지로 나뉘는데 문자열 전체가 같은 문자이면 -1을 출력하고, 처음이나 끝 문자 하나를 제외하면 팰린드롬인 경우는 원래 문자열에 -1을 한 값을 출력한다. ✍️ 후기 처음에는 첫번째 문자와 마지막 문자가 다르면 바로 그 길이를 출력하고, 그렇지 않다면 다시 for문을 돌면서 팰린드롬인지 아닌지 check하는 방식으로 풀었다. 이는 문자열의 길이 제한이 50만까지이므로 시간초과가 계속 났다. 결국 구글링을 해서 해답..

백준/C++ 2022.11.15

[백준/C++] 11656번 접미사 배열

🤔문제 이해 문자열의 앞 문자를 하나씩 차례로 없앤 문자열들을 사전순으로 정렬하여 출력하는 문제이다. 🔥풀이🔥 So Easy한 문제 ! 이중 for문으로 앞에서부터 문자를 하나씩 지운 문자열을 vector에 넣어주고 sort함수로 그 vector 배열을 정렬해주면 자동으로 사전순으로 정렬된다. 그러고 나서 배열에 저장된 문자열들을 차례대로 출력해주면 끝! #include #include #include using namespace std; vector strs; string s; int main() { cin.tie(nullptr); cout.tie(nullptr); ios::sync_with_stdio(false); cin >> s; for (int i = 0; i < s.size(); i++) { s..

백준/C++ 2022.11.14

[백준/C++] 17396번 백도어

🤔문제 이해 말은 거창하지만 전형적인 다익스트라 문제에 방문할 수 없는 구간이 존재한다는 것만 추가된 문제이다. 🔥풀이🔥 다익스트라로 구현을 하고 상대의 시야에 보이는 분기점은 방문하지 않도록 해주기만 하면 된다. 넥서스의 경우는 시야가 보이지만 갈 수 있어야 하므로 따로 0으로 처리해주었다. #include #include #include using namespace std; #define INF 10000000000 int n, m, a, b, t; bool sight[100001]; vector edge(100001); long long dist[100001]; int main() { cin.tie(nullptr); cout.tie(nullptr); ios::sync_with_stdio(false)..

백준/C++ 2022.11.11

[백준/C++] 20040번 사이클 게임

🤔문제 이해 선분을 긋다가 사이클이 발생하는 지점을 찾는 문제이다. 점의 위치를 정확히 몰라도 선분으로 이어져있는 경우를 찾으면 된다. 🔥풀이🔥 Find-Union 문제로 두 점을 이어줄 때마다 그 점들의 집합의 번호를 갱신해준다. 그러다가 어떤 두 점을 이을 때 한 점의 집합과 다른 한 점의 집합의 번호가 같다는 것은 이미 어떠한 경로로 연결되어 있는 상태에서 또 선분을 그어주는 것 즉, 사이클이 생기는 것이므로 그 때의 차례 번호를 ans 변수에 저장해둔다. m번까지의 차례는 모두 입력받아야 하기 때문에 flag를 통해 ans를 구한 경우엔 두 점을 입력받기만 하고 이외의 연산은 하지 않는다. 마지막으로 ans를 출력해주면 된다. #include using namespace std; int n, m,..

백준/C++ 2022.11.03

[백준/C++] 17404번 RGB거리 2

🤔문제 이해 1149번 RGB거리 문제의 변형이다. 이 문제에선 첫번째 선택한 집의 색과 마지막에 선택한 집의 색이 달라야 한다. 💡첫번째 아이디어 처음 선택한 색에 따라 dp 배열이 다르게 설정되어야 한다고 생각했다. 그래서 dp0, dp1, dp2 배열을 각각 선언해서 구현하였지만 왜 때문인지 4%에서 자꾸 틀렸다고 떴다 ㅠㅠ 다시 생각해보니 dp 배열이 다를 필요가 없었다!! 설명은 풀이 참조 ㄱㄱ 🔥풀이🔥 첫번째에 고를 색을 하나로 픽스해두고 1149번 RGB거리처럼 dp를 통해 가장 비용이 적게 드는 경우를 구하면 된다. dp[i][j] : i번째 집을 칠하는 j색 (j = 0 : red / 1 : green / 2 : blue) dp[i][0]은 dp[i-1][1]과 dp[i-1][2]중에서 ..

백준/C++ 2022.11.02

[백준/C++] 4889번 안정적인 문자열

🤔문제 이해 괄호의 짝을 맞추기 위해 최소한으로 바꾸는 괄호의 개수를 구하는 문제이다. 🔥풀이🔥 짝이 맞는 괄호는 stack을 이용해 여는 괄호면 넣고 닫는 괄호면 stack의 top이 여는 괄호면 pop을 해주고, 닫는 괄호면 그냥 push해주는 식으로 처리해주었다. 바로 짝을 지어주나 나중에 짝을 지어주나 바꾸는 괄호의 개수는 변하지 않는다. 예를 들어 앞서 든 예시 }{{{의 경우 첫번째와 두번째, 네번째를 바꿔 {}{}을 만드는 것과 첫번째 세번째 네번째를 바꿔 {{}}을 만드는 경우에서 바꾸는 괄호의 개수가 동일함을 알 수 있다. 따라서 그리디 알고리즘을 사용해 처음 괄호는 무조건 여는 괄호로 만들어주고, 다음 괄호는 닫는 괄호로 만들어 주면서 문자 2개씩 처리해주었다. #include #inc..

백준/C++ 2022.10.27

[백준/C++] 15558번 점프 게임

💡첫번째 아이디어 일단 보자마자 BFS임을 알았다! 일단 갈 수 있는데는 다 가보는데 안되면 끝인거니까 간단하게 map이라는 2차원 배열을 사용하여 두개의 지도를 표현해 주었고, BFS의 큐에는 몇초가 지났는지를 의미하는 cnt, 현재 지도의 위치를 나타내는 idx, 어떤 지도인지를 나타내주는 map_num의 정보를 담고 있는 pair 형태로 구성해주었다. 간단하게 +1, -1, 반대편 +k이므로 해당 지도의 값이 1이고, 사라지지 않은 idx일 경우에 큐에 넣어주고 idx가 n보다 커졌을 때 1을 출력하고 그렇지 않고 큐가 다 비게 되면 0을 출력한다. ❌첫번째 제출(4%에서 틀렸습니다) 예제 출력은 잘 나왔는데 제출해보니 틀렸다고 떴다. 문제를 다시 읽어보니 지도에서 먼저 이동하고 cnt가 커지는 방..

백준/C++ 2022.07.07
728x90