@GetMapping, @PutMapping, @PostMapping 어노테이션을 붙여서 조회, 삽입, 수정하는 API는 잘 만들었고 Postman을 이용하여 API 테스트까지 완료했다.
이렇게 필요한 거의 모든 API 구현이 거의 끝나가고 이제 삭제하는 API도 넣어야겠다 하고
이렇게 Get, Put, Post 하던 방식과 같은 방식으로 @DeleteMapping을 붙이고 삭제하는 API를 구현했다.
그 다음에 하던대로 Postman을 이용해서 API 테스트를 하는데
이런 에러가 났다.
Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.springframework.dao.InvalidDataAccessApiUsageException: No EntityManager with actual transaction available for current thread - cannot reliably process 'remove' call; nested exception is javax.persistence.TransactionRequiredException: No EntityManager with actual transaction available for current thread - cannot reliably process 'remove' call] with root cause
javax.persistence.TransactionRequiredException: No EntityManager with actual transaction available for current thread - cannot reliably process 'remove' call
찾아봤더니 delete 하는 메소드에 @Transactional 어노테이션을 붙여줘야 한다고 한다.
#include <string>
#include <vector>
#include <algorithm>
#include <iostream>
#include <queue>
using namespace std;
int main() {
cin.tie(NULL);
int n, w, l;
cin >> n >> w >> l;
vector<int> v(n);
queue<int> q;
vector<int> count;
for (int i = 0; i < n; i++) {
cin >> v[i];
}
q.push(v[0]);
count.push_back(w);
int index = 1;
int time = 1;
int totalWeight = v[0];
int weight;
while (!q.empty()) {
for (int i = 0; i < count.size(); i++) {
count[i]--;
}
if (count[0] == 0) {
weight = q.front();
q.pop();
totalWeight -= weight;
count.erase(count.begin());
}
if (index < n && totalWeight + v[index] <= l) {
q.push(v[index]);
count.push_back(w);
totalWeight += v[index];
index++;
}
time++;
}
cout << time;
return 0;
}
q라는 이름으로 큐를 하나 만들어놓고 다리에 진입한 트럭들은 큐에 집어넣었다. 그리고 큐에 들어간 트럭들의 무게들은 totalWeight에 더해주었다. 트럭이 다리에서 벗어나면 즉, 큐에서 빠지게 되면 totalWeight에서도 트럭의 무게만큼 빼주었다.
그리고 트럭이 단위시간에 단위길이만큼만 이동하기 때문에 다리에 진입한 트럭 하나마다 얼마나 더 가야하는지 남은 길이(남은 시간)를 count라는 벡터에 저장해주었다. 당연히 처음에는 다리의 길이이고 단위시간이 지날 때마다 count[i]--로 1씩 빼주었다. count[i]가 0이 되는 순간 큐에서 트럭을 빼고 count[i]도 벡터에서 제거해주었다.
#include <string>
#include <vector>
#include <algorithm>
#include <iostream>
using namespace std;
int main() {
cin.tie(NULL);
int n, m;
cin >> n >> m;
vector<vector<int>> v(n, vector<int>(m));
int length = min(n, m) - 1;
string s;
for (int i = 0; i < n; i++) {
cin >> s;
for (int j = 0; j < m; j++) {
v[i][j] = stoi(s.substr(j, 1));
}
}
bool flag = false;
while (true) {
for (int row = 0; row + length < n; row++) {
for (int col = 0; col + length < m; col++) {
if (v[row][col] == v[row + length][col] && v[row][col] == v[row][col + length] && v[row][col] == v[row + length][col + length]) {
flag = true;
break;
}
}
if (flag)
break;
}
if (flag) break;
length--;
}
cout << (length + 1) *(length + 1);
return 0;
}
네모칸을 점점 줄여가면서 이동시키면서 네 꼭짓점의 값이 같은 정사각형을 발견해나가면 된다.
변의 길이는 가로, 세로의 길이 중 짧은 것으로 시작한다. (그것을 length로 뒀다)
기준이 되는 점인 (row, col)을 왼쪽에서 오른쪽으로, 위에서 아래로 옮겨가면서 네 칸의 값이 같을 때까지 반복한다.
끝까지 갔는데 발견되지 않으면 length를 줄이고 그것을 반복한다.
주의할 점은 변의 길이가 3이면 세 칸을 차지하는 것이니까 0~3이 아니라 0~2라는 것이다. 따라서 변의 길이가 3이면 length를 2가 되게 했다. row + length 했을 때 두 칸을 더해야 되니까. 그리고나서 나중에 크기를 구할 때에는 length에 1을 더해주었다.
version 28 (intended for Android Pie and below) is the last version of the legacy support library, so we recommend that you migrate to AndroidX libraries when using Android Q and moving forward. The IDE can help with this: Refactor > Migrate to AndroidX... more... (Ctrl+F1)
이런 에러가 뜬다.
애초에 프로젝트를 만들 때 androidX로 만들었어야 하는데... 프로젝트를 새로 만들기는 귀찮다면 간단히 androidX로 바꿀 수 있는 방법이 있다.
저기 에러 메시지에 나와 있듯이 Refactor>Migrate to androidX...를 누르면 간단히 androidX로 바꿀 수 있다.
이걸 누르고 백업하고 싶다면 백업해놓을 위치를 선택하고 Migrate 한다. 그러면 아래에 Find에 뭐라고 뜰 것이다. 그 때 Do Refactor를 누르면 된다. 그러면 몇 초 안에 프로젝트가 androidX로 바뀐다.
#include <string>
#include <vector>
using namespace std;
vector<vector<int>> solution(vector<vector<int>> arr1, vector<vector<int>> arr2) {
int row = arr1.size();
int col = arr2[0].size();
int t = arr1[0].size();
int n;
vector<vector<int>> answer(row, vector<int>(col));
for (int i = 0; i < row; i++) {
for (int j = 0; j < col; j++) {
n = 0;
for (int k = 0; k < t; k++) {
n += (arr1[i][k] * arr2[k][j]);
}
answer[i][j] = n;
}
}
return answer;
}
행렬의 곱셈을 그대로 구현하면 된다. 3중 for문이라서 약간 헷갈렸지만 공책에 표시하면서 풀었더니 금방 쉽게 풀 수 있었다.