반응형

java api 중에서 SecureRandom은 기본 적으로 랜덤값을 생성할때 CPU온도 및 하드웨어 정보를 가지고

엔트로피값을 생성한다고 합니다.

그래서 가상환경에서 톰캣이 기본 옵션일 경우 java의 heap이 꽉차게 되어서 톰캣이 느려지는 경우가 발생한다.

가상환경의 경우에는 톰캣 옵션으로 하드웨어 정보를 가지고 엔드로피를 생성하지 못하도록 설정합니다.

1) 톰캣 설치 경로 이동

2) bin/catalina.sh 파일 수정

3) 다음 부분으로 이동

JAVA_OPTS="$JAVA_OPTS$JSSE_OPTS"

4) 다음과 같이 수정

JAVA_OPTS="$JAVA_OPTS$JSSE_OPTS-Djava.security.egd=file:/dev/./urandom"
728x90

'[개발관련] > OS' 카테고리의 다른 글

serverless framework  (0) 2019.12.12
Microsoft Office 365 설치  (0) 2019.04.01
Bash Shell 환경 설정  (0) 2019.04.01
반응형

 

programmers.co.kr/learn/courses/30/lessons/42587

 

코딩테스트 연습 - 프린터

일반적인 프린터는 인쇄 요청이 들어온 순서대로 인쇄합니다. 그렇기 때문에 중요한 문서가 나중에 인쇄될 수 있습니다. 이런 문제를 보완하기 위해 중요도가 높은 문서를 먼저 인쇄하는 프린

programmers.co.kr

퇴근후 시간 날때마다 풀었습니다. 

가능하면 답을 안보고 풀기위해서 노력했습니다.

제일 중요한 것은 `문제를 완벽히 이해하는 것이다`라는 것을 깨달았습니다. 

문제의 의도를 파악하지 못해 계속 통과를 5일째 못하다가 아이패드에 그림을 그려가면서 이해하다보니

제가 놓친부분을 발견하고 결국 풀게되었습니다.(아이패드짱_구글 Jamboard짱)

package com.ji.study;

import static org.junit.Assert.assertEquals;

import java.util.ArrayList;
import java.util.List;

import org.junit.jupiter.api.Test;

public class PrinterTest {

	@Test
	void test() {

		Printer test = new Printer();

		assertEquals(5, test.solution(new int[] { 1, 1, 9, 1, 1, 1 }, 0));
		assertEquals(1, test.solution(new int[] { 2, 1, 3, 2 }, 2));
		assertEquals(6, test.solution(new int[] { 2,2,2,1,3,4 }, 3));

	}

}
package com.ji.study;

import java.util.ArrayList;
import java.util.List;

public class Printer {

	public static void main(String[] args) {

		int[] priori = { 1, 1, 9, 1, 1, 1 };
		int location = 0;
		System.out.println("result : " + solution(priori, location));

	}

	public static int solution(int[] priorities, int location) {
		int answer = 0;

		List<int[]> list = new ArrayList<int[]>();
		for (int i = 0; i < priorities.length; i++) {
			list.add(new int[] {i, priorities[i]});
		}

		List<int[]> result = getCompareNum(list);
		for (int j = 0; j < result.size(); j++) {
			if (result.get(j)[0] == location)
				answer = j;
		}

		return answer + 1;
	}

	public static List<int[]> getCompareNum(List<int[]> list) {

		for (int i = 0; i < list.size() - 1; i++) {
			for (int k = i + 1; k < list.size(); k++) {
				// 중요도가 높은 인쇄물이 있을 경우
				if (list.get(i)[1] < list.get(k)[1]) {
					return getCompareNum(shiftLastIndex(list, i));
				}
			}
		}
		
		return list;
		
	}

	// 가장 앞에 있는 대기 목록을 뒤로 이동
	public static List<int[]> shiftLastIndex(List<int[]> list, int moveIndex) {
		list.add(list.get(moveIndex));
		list.remove(moveIndex);
		return list;
	}

}

 

아이패드로 작성한 풀이

728x90

'[개발관련] > 코테준비' 카테고리의 다른 글

[프로그래머스] [1차] 캐시  (0) 2021.06.13
동적계획법(Dynamic Programming)  (0) 2021.06.13
[백준] DFS와 BFS  (0) 2021.05.01
[프로그래머스] 주식 가격  (0) 2021.04.29
[프로그래머스] 타겟 넘버  (0) 2021.04.25
반응형

www.acmicpc.net/problem/1260

 

1260번: DFS와 BFS

첫째 줄에 정점의 개수 N(1 ≤ N ≤ 1,000), 간선의 개수 M(1 ≤ M ≤ 10,000), 탐색을 시작할 정점의 번호 V가 주어진다. 다음 M개의 줄에는 간선이 연결하는 두 정점의 번호가 주어진다. 어떤 두 정점 사

www.acmicpc.net

dfs와 bfs를 이해하기에 정말 좋은 문제였다. 

문제의 핵심은 각 알고리즘을 이해하고 이를 구현하는 방법을 이해 하는것이었다. 

dfs = stack 이고, 크게 재귀함수를 이용하거나, java에서 제공하는 stack 컬렉션을 사용한다. 

일반적으로는 재귀를 쓰는 것이 코드가 깔끔하여 재귀를 많이 쓴다. 

bfs = queue 이고, queue는 보통 java에서 제공하는 queue 인터페이스 사용하여 많이 사용한다. 

 

package com.ji.beakjoon;

import java.util.ArrayList;
import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;

public class DfsAndBfs02 {
	
	static int nodeNum, edgeNum, startNode;
	static int[][] graph;
	static boolean[] DFSisVisited, BFSisVisited;
	static ArrayList<Integer> DFSvisitArr, BFSvisitArr ;
	static Queue<Integer> queue;

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		nodeNum = sc.nextInt(); // 점갯수
		edgeNum = sc.nextInt(); // 선갯수
		startNode = sc.nextInt(); // 시작노드
		graph = new int[nodeNum + 1][nodeNum +1];
		
		DFSisVisited = new boolean[nodeNum +1];
		BFSisVisited = new boolean[nodeNum +1];
		DFSvisitArr = new ArrayList();
		BFSvisitArr = new ArrayList();
		queue = new LinkedList<Integer>();
		
		for( int i = 0 ; i < edgeNum ; i++ ) {
			int a = sc.nextInt();
			int b = sc.nextInt();
			graph[a][b] = 1;
			graph[b][a] = 1;
		}
		
		for( int i = 0 ; i < nodeNum+1 ; i++) {
			DFSisVisited[i] = false;
			BFSisVisited[i] = false;
		}
		
		dfs(startNode);
		bfs(startNode);

		for( int i = 0 ; i < DFSvisitArr.size() ; i++ ) {
			System.out.print(DFSvisitArr.get(i) + " ");
		}
		System.out.println();
		for( int i = 0 ; i < BFSvisitArr.size() ; i++ ) {
			System.out.print(BFSvisitArr.get(i) + " ");
		}

	}
	
	static void bfs(int node) {
		// 방문한 노드 처리
		BFSisVisited[node] = true;
		// 방문한 노드 번호 리스트 저장
		BFSvisitArr.add(node);
		for( int i = 1 ; i <= nodeNum ; i++) {
			//간선이면서, 방문한 노드가 아니고, 검색해야할 노드 큐에 저장해준다.
			if( graph[node][i] == 1 && BFSisVisited[i] == false && queue.contains(i)==false) {
				queue.add(i);
			}
		}
		
		//검색 큐가 비어있지 않으면 검색 큐에서 삭제해준 후 제 검색
		if(!queue.isEmpty())
			bfs(queue.poll());
	}
	
	static void dfs(int node) {
		//방문한 노드 번호에 대한 boolean 처리
		DFSisVisited[node] = true;
		//방문한 순서에 대한 노드 정보 리스트 저장
		DFSvisitArr.add(node);
		for( int i = 1 ; i <= nodeNum ; i++ ) {
			if(graph[node][i] == 1 && DFSisVisited[i] == false) {
				dfs(i);
			}
		}
	}

}

728x90

+ Recent posts