728x90

스프링 부트로 API를 만들고 있었다.

@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 어노테이션을 붙여줘야 한다고 한다.

 

붙여줬더니

이렇게 삭제가 멀쩡히 잘 되는 것을 볼 수 있다.

 

출처

https://yoonho-devlog.tistory.com/61

 

728x90
728x90

https://www.acmicpc.net/problem/13335

 

13335번: 트럭

문제 강을 가로지르는 하나의 차선으로 된 다리가 하나 있다. 이 다리를 n 개의 트럭이 건너가려고 한다. 트럭의 순서는 바꿀 수 없으며, 트럭의 무게는 서로 같지 않을 수 있다. 다리 위에는 단��

www.acmicpc.net

#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]도 벡터에서 제거해주었다.

728x90

'알고리즘 문제' 카테고리의 다른 글

[백준] 2668번 숫자고르기  (0) 2020.08.29
[백준] 3190번 뱀  (0) 2020.08.29
[백준] 1051번 숫자 정사각형  (0) 2020.08.16
[프로그래머스] 행렬의 곱셈  (0) 2020.08.01
[프로그래머스] 기능개발  (0) 2020.07.31
728x90

https://www.acmicpc.net/problem/1051

 

1051번: 숫자 정사각형

N*M크기의 직사각형이 있다. 각 칸은 한 자리 숫자가 적혀 있다. 이 직사각형에서 꼭짓점에 쓰여 있는 수가 모두 같은 가장 큰 정사각형을 찾는 프로그램을 작성하시오. 이때, 정사각형은 행 또는

www.acmicpc.net

#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을 더해주었다. 

728x90

'알고리즘 문제' 카테고리의 다른 글

[백준] 3190번 뱀  (0) 2020.08.29
[백준] 13335번 트럭  (0) 2020.08.16
[프로그래머스] 행렬의 곱셈  (0) 2020.08.01
[프로그래머스] 기능개발  (0) 2020.07.31
[프로그래머스] 큰 수 만들기  (0) 2020.07.30
728x90

분명히 스크롤뷰로 씌우기 전에는 멀쩡했던 뷰가 ScrollView로 감싸고 나니 이렇게 화면이 찌그러지고

이렇게 뷰들이 뒤로 숨어서 보이지 않는 현상이 발생했다. 당연히 ScrollView 안에 자식은 1개였는데 말이다.

 

검색해도 잘 나오지 않았다. 그리고 이 상황을 뭐라고 검색해야 할지도 잘 몰랐다.

 

그러다가 이 글을 발견했다.

https://mrgamza.tistory.com/110

 

[Android]ScrollView가 화면에 가득차지 않을 경우

ScrollView의 height를 match_parent로 지정을 하여도 전부 차지하지 않는 문제가 발생한다. 이런 부분은 본질적으로 보면 ScrollView가 가지고 있는 자식 View의 높이가 그정도로 보이기 때문인데, 다시 말��

mrgamza.tistory.com

 

android:fillViewport="true"

이 속성만 ScrollView의 속성으로 추가해주면

이렇게 다시 멀쩡한 화면으로 되는 것을 볼 수 있다.

728x90
728x90

일단 서버에 접속을 한다.

그리고

sudo git clone 깃허브 프로젝트 URL

이렇게 입력하여 깃허브에 있는 프로젝트를 clone해 온다.

 

깃을 설치해준 적이 없다면 "bash : sudo : git command not found"라는 에러가 뜰 것이다.

 

따라서 깃을 설치해줘야 한다.

https://git-scm.com/book/ko/v2/%EC%8B%9C%EC%9E%91%ED%95%98%EA%B8%B0-Git-%EC%84%A4%EC%B9%98

 

Git - Git 설치

이 책은 Git 2.0.0 버전을 기준으로 썼다. 대부분의 명령어는 그 이전 버전에서도 잘 동작하지만, 몇 가지 기능은 아예 없거나 미묘하게 다를 수 있다. Git의 하위 호환성은 정말 훌륭하기 때문에 2.0

git-scm.com

여기 나와 있는대로

sudo dnf install git-all

이렇게 입력해서 git을 설치해준다.

 

그런데 dnf를 설치해주지 않았다면 "sudo: dnf command not found"라는 에러가 또 날 것이다.

 

그렇다면 아래 링크에서와 같이

https://www.rootusers.com/how-to-install-dnf-package-manager-in-centosrhel/

 

How To Install DNF Package Manager In CentOS/RHEL

Learn how to install the new DNF package manager in CentOS and RHEL Linux. DNF has already replaced Yum in Fedora, so it's worth learning.

www.rootusers.com

다음 명령어를 쳐서 dnf를 설치해주면 된다.

yum install epel-release -y

그 다음

yum install dnf -y

이 명령어를 입력하면 된다.

 

만약에 이 yum에서 "you need to be root to perform this command."라는 에러 메시지가 뜬다면

https://m.blog.naver.com/PostView.nhn?blogId=blindman83&logNo=110149575684&proxyReferer=https:%2F%2Fwww.google.com%2F

 

you need to be root to perform this command

you need to be root to perform this command centos 에서 yum install ~~ 하려고보니 이러한 에러 메시지...

blog.naver.com

su -

를 입력해서 root 계정으로 변경해주면 된다.

 

그러면 Password: 라는 말이 뜨면서 비밀번호를 입력하라고 할 것이다.

 

그런데 나는 비밀번호를 설정한 적이 없어서 비밀번호를 모르니까 아무 비밀번호를 치면 "su: Authentication failure"라고 뜰 것이다.

 

그렇다면 비밀번호를 설정해주면 된다. 비밀번호 초기 설정하는 방법은

https://jhnyang.tistory.com/136

 

[리눅스] 초기 root 비밀번호 설정하기, 사용자 계정 전환하기! 관리자 전환 su, sudo 명령어란, passwd

[ 리눅스 유닉스 완전정복: 리눅스 유닉스 목차 ] 개인 노트북으로 혼자서 운영체제를 사용해왔던 사람들에게는 익숙치 않은 개념일 수도 있겠지만 리눅스는 멀티유저 운영체제이기 때문에 여��

jhnyang.tistory.com

여기 나와있는대로

sudo passwd

를 입력한다.

 

그러면 "Enter new UNIX password:"라는 말이 뜰 것이다. 원하는 비밀번호를 치고 (리눅스에서 비밀번호는 쳐도 화면에 아무런 표시가 안 나타난다. ●●● 이런 동그라미도 안 뜨니까 주의하자)

"Retype new UNIX password:"에 똑같이 한 번 더 쳐주면 비밀번호 설정이 완료된다. (비밀번호는 최소 8자리여야 한다는 말이 나오는데 나는 무시하고 그냥 했다.)

 

그렇게 root 계정으로 접속을 하고 아래 두 명령어로 아까 root가 아니라서 하지 못했던 dnf 설치를 해주면 된다.

yum install epel-release -y
yum install dnf -y

 

그리고 나서 다시

sudo dnf install git-all

깃을 설치하고

sudo git clone [깃허브 프로젝트 URL]

(혹시나 하는 마음에 쓰는 것인데 대괄호는 입력하시면 안 됩니다! .git으로 끝나는 링크만 적어주세요)

이렇게 프로젝트를 다운받아 오면 된다.

 

그 다음에 아래 명령어로 자바8을 설치해준다.

yum install -y java-1.8.0-openjdk-devel.x86_64

 

이제 https://miniminis.github.io/2019/10/13/spring/springboot-deploy/

 

스프링 부트 프로젝트 Git + Maven + AWS EC2 배포하기 | Flashlog

스프링 부트 프로젝트 Git + Maven + AWS EC2 배포하기 연차 프로젝트의 마지막 배포 작업, 바로 Spring boot 서버 배포이다. 보통 구글링을 해보면 Boot 프로젝트는 Maven 이 아닌 Gradle 로 설정한 경우가 대�

miniminis.github.io

위 링크에서 처럼 하면 된다.

그 과정은 아래와 같다.

cd [프로젝트 디렉토리 이름]

명령어로 프로젝트 폴더(디렉토리) 안으로 들어간다.

 

그 다음에 ls 명령어를 입력하면 mvnw라는 파일이 있을 것이다.

 

 

이 파일이 위 사진처럼 초록색이라는 것은 실행 가능한 (실행 권한이 있는) 파일이라는 것이다.

초록색이 아니라면 실행 가능한 파일이 아니라는 뜻이므로

chmod +x mvnw

chmod 명령으로 x 권한(실행권한)을 부여한다.

 

그 다음

./mvnw

를 입력하여 mvnw를 실행시킨다. (리눅스에서는 실행파일을 실행할 때 앞에 ./를 붙여줘야 한다.)

 

이 과정은 빌드(컴파일+링크)하는 것인데 조금 시간이 걸릴 수도 있다.

 

시간이 지나고

--------------
BUILD SUCCESS
--------------

가 뜨면

cd target

으로 target 디렉토리로 이동한다.

 

target에서 ls를 해보면

 

 

이렇게 jar 파일이 생성되어 있을 것이다.

그러면 이제

java - jar [jar 파일 이름] &

위 명령어로 백그라운드로 실행시켜주면 된다. (뒤에 &를 붙이면 백그라운드에서 실행시키는 것이다.)

 

백그라운드로 실행시키는 이유는 이렇게 해줘야 PuTTY를 종료해도 서버 프로그램이 돌아간다.

 

그러면 이제 웹 브라우저를 띄우고 AWS에서 할당받은 IP주소:포트번호/페이지 주소

IP주소:포트번호/페이지 주소

를 입력해 접속해보자.

 

만약 접속이 되지 않는다면

breakcoding.tistory.com/327

 

[AWS] AWS 서버에 서버 프로그램 돌려놨는데 외부에서 접속이 안 될 때 (리눅스 포트 여는 방법)

PuTTy로 AWS 서버에 접속해서 이렇게 서버 프로그램을 실행시키고 웹 브라우저를 띄우고 [http://ip주소/페이지 주소] 를 입력했는데 이렇게 떴다. 로컬에서 테스트 했을 때는 멀쩡히 잘 됐었는데... �

breakcoding.tistory.com

이대로 하면 된다.

 

몇 시간 동안구글링해보면서 알아낸 것들인데 이 모든 것들이 한 번에 정리된 글은 없어서 이렇게 정리하게 되었다. 누군가에게 도움이 되면 좋겠다.

오늘은 정말 많은 것을 배운 하루였다.

728x90
728x90

PuTTy로 AWS 서버에 접속해서 이렇게 서버 프로그램을 실행시키고

웹 브라우저를 띄우고 [http://ip주소/페이지 주소] 를 입력했는데 이렇게 떴다.

사이트에 연결할 수 없음

로컬에서 테스트 했을 때는 멀쩡히 잘 됐었는데...

그리고 고정 IP를 쓰는 학교 연구실 컴퓨터로 서버 프로그램을 돌려놓고 다른 컴퓨터에서 웹 브라우저로 접속했을 때도 잘 됐었다. 심지어 학교 연구실 컴퓨터에 서버 돌려놓고 안드로이드 앱에서도 서버 연결 테스트 했는데 멀쩡히 잘 됐었다. 왜 그럴까...?

 

검색을 해보니 인바운드 규칙 추가를 해야 한다고 해서

8081 포트를 추가해줬다. (왜냐하면 내가 서버 프로그램의 포트번호를 8081로 지정해줬기 때문)

application.properties에 지정한 포트번호

 

그런데 이렇게 해줘도 똑같았다. 접속이 되지 않았다.

 

그러다가 내가 리눅스 서버의 포트를 열어줘야 하나? 하고 "centOS 포트 여는 방법"이라고 검색해서

https://server-engineer.tistory.com/418

여기 있는대로

iptables -I INPUT 1 -p tcp --dport 8081 -j ACCEPT

 

이렇게 명령어를 입력했다.

 

그랬더니

Initializing을 하더니

웹 브라우저에서 멀쩡히 접속이 됐다.

 

포트를 열어줘야 하는구나. 오늘도 배워간다.

728x90
728x90

build.gradle 파일에 라이브러리를 추가했는데  

AndroidX로 바꾸라는 에러메시지

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 to AndroidX

이걸 누르고 백업하고 싶다면 백업해놓을 위치를 선택하고 Migrate 한다. 그러면 아래에 Find에 뭐라고 뜰 것이다. 그 때 Do Refactor를 누르면 된다. 그러면 몇 초 안에 프로젝트가 androidX로 바뀐다.

728x90
728x90

java.lang.BootstrapMethodError:Exception from call site #4 bootstrap method okhttp

이 에러때문에 3일 정도를 삽질(?)했다.

구글에 검색해보니 다 모듈 수준의 build.gradle 파일에

compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
}

이 코드를 추가하라는 말 뿐이었다.

그래도 되지 않았다. 똑같이 저 오류가 났다.

정말 스택오버플로우를 비롯해서 중국 사이트까지 가봐도 다 이 얘기 뿐이었다.

어떤 사람은 androidX로 바꿨더니 해결됐다고 해서 다시 프로젝트를 androidx로 만들었다.

그래도 저 오류가 똑같이 났다.

 

그런데 Build>Clean Project를 눌렀더니 이 에러가 나지 않고 해결됐다.

3일동안 난 뭐한걸까... 이번 기회로 교훈을 얻었다. Gradle 파일을 수정한 뒤에는 Clean Project를 해주자.

728x90
728x90

https://programmers.co.kr/learn/courses/30/lessons/12949

 

코딩테스트 연습 - 행렬의 곱셈

[[2, 3, 2], [4, 2, 4], [3, 1, 4]] [[5, 4, 3], [2, 4, 1], [3, 1, 1]] [[22, 22, 11], [36, 28, 18], [29, 20, 14]]

programmers.co.kr

#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문이라서 약간 헷갈렸지만 공책에 표시하면서 풀었더니 금방 쉽게 풀 수 있었다.

728x90

'알고리즘 문제' 카테고리의 다른 글

[백준] 13335번 트럭  (0) 2020.08.16
[백준] 1051번 숫자 정사각형  (0) 2020.08.16
[프로그래머스] 기능개발  (0) 2020.07.31
[프로그래머스] 큰 수 만들기  (0) 2020.07.30
[프로그래머스] 땅따먹기  (0) 2020.07.30
728x90

https://programmers.co.kr/learn/courses/30/lessons/42586

 

코딩테스트 연습 - 기능개발

프로그래머스 팀에서는 기능 개선 작업을 수행 중입니다. 각 기능은 진도가 100%일 때 서비스에 반영할 수 있습니다. 또, 각 기능의 개발속도는 모두 다르기 때문에 뒤에 있는 기능이 앞에 있는 ��

programmers.co.kr

#include <string>
#include <vector>
#include <cmath>

using namespace std;

vector<int> solution(vector<int> progresses, vector<int> speeds) {
	vector<int> answer;
	int n = ceil((100 - progresses[0]) / (double)speeds[0]);
	int num = 1;
	for (int i = 1; i < progresses.size(); i++) {
		if (ceil((100 - progresses[i]) / (double)speeds[i]) <= n) {
			num++;
		}
		else {
			answer.push_back(num);
			num = 1;
			n = ceil((100 - progresses[i]) / (double)speeds[i]);
		}
	}
	answer.push_back(num);
	return answer;
}

비주얼 스튜디오에서는 <cmath> 헤더를 포함해주지 않아도 잘 돌아갔지만 프로그래머스에 제출할 때에는 돌아가지 않았다. ceil 함수를 사용할 때에는 <cmath>를 포함하자.

그냥 문제에 있는 그대로 구현해주면 된다.

728x90

+ Recent posts