정수형 배열이 주어지면, 중복되지 않는 쌍(pair)을 만들어

각 쌍에서 원소들 간의 차이 값에 대한 절대값이 가장 최소인 값이 얼마인지 반환하는 문제이다. 

 

 

간단한 문제라 아래와 같이 풀이 후 Submit을 눌렀는데...

static int minimumAbsoluteDifference(int[] arr) {
    int min = Integer.MAX_VALUE;

    for(int i=0; i<arr.length-1; i++){
        for(int j=i+1; j<arr.length; j++){
            min = Math.min(min, Math.abs(arr[i]-arr[j]));
        }
    }
    return min;
}

 

두 개의 Test Case에서 Fail이 났고, Fail 사유는 시간초과. 

 

이중 for문으로 시간복잡도가 O(n^2)이다.

 

그래서 한번의 for문을 이용해 풀어야한다.. 

정렬 후에 인접한 값을 빼주는 방법을 이용하면 한번의 for문으로 가능.

static int minimumAbsoluteDifference(int[] arr) {
    int min = Integer.MAX_VALUE;

    Arrays.sort(arr);

    for(int i=0; i<arr.length-1; i++){
        min = Math.min(min, Math.min(min, Math.abs(arr[i]-arr[i+1])));
    }
    return min;
}

 

문자열과 숫자를 순서대로 입력받아,

문자열의 길이가 두번째 인자로 받은 숫자만큼 길이가 될때 까지 문자열을 붙인후, 

'a'문자의 갯수를 파악하는 문제이다. 

 

단순히 생각하고 접근하면 테스트케이스에서 두번째 숫자가 커질경우, OutOfMemory 에러가 발생한다..

 

 

static long repeatedString(String s, long n) {
     long multipleNum =0;
     int aCnt = 0;
     long result = 0 ;

	 //먼저 문자열에서 a개수를 세고,
     //문자열을 붙인 수 만큼 곱해서 몫을 구한다.
     for(int i=0; i<s.length(); i++){
         if('a' == s.charAt(i))
             aCnt++;
     }

     multipleNum = n/s.length();
     result =  aCnt*multipleNum;

	 //나머지 문자열에서 a의 개수를 구해서 더한다.
     long remainder = n%s.length();

     for(int i=0; i<remainder; i++){
         if('a' ==s.charAt(i))
             result++;
     }
     return result;
}

 

 

배열이 주어지면 0 으로만 점프할 수 있으며, 최대 i+2인덱스 씩 점프가 가능하다. 

만약 i+2번째 인덱스의 숫자가 1이라면 i+1번째 인덱스로 점프해야 한다.

 

배열의 마지막 인덱스까지의 최소 점프 횟수를 구하는 문제.

static int jumpingOnClouds(int[] c) {
	int jumping = 0;
	int i = 0;

	try{
		while(true){
			if(i+1 >= c.length) break;

			if(c[i+2] == 0){
				jumping++;
				i+=2;
			}else{
				jumping++;
				i++;
			}
		}
	}catch(java.lang.ArrayIndexOutOfBoundsException e){
		jumping++;
	}

	return jumping;
}

 

 

편법이다.. 

ArrayIndexOutOfBoundsException이 발생하는 Case가 있기때문에 해당 Exception발생시, 점프횟수를 +1 해주었다.

검색좀 해보니 동적계획법을 이용해 푸는방법이 있는데, 다음번에 포스팅해야겠다..

John works at a clothing store. He has a large pile of socks that he must pair by color for sale. Given an array of integers representing the color of each sock, determine how many pairs of socks with matching colors there are.

For example, there are  socks with colors . There is one pair of color  and one of color . There are three odd socks left, one of each color. The number of pairs is .

 

Sample Input

9

10 20 20 10 10 30 50 10 20

Sample Output

3

 

 

배열안에 숫자들이 들어오는데 양말처럼 짝을 지어서 몇 짝이 나오는지 반환하는 문제이다.

 

 

static int sockMerchant(int n, int[] ar) {
	int result = 0;
	HashSet<Integer> colors = new HashSet<Integer>();

	for(int i = 0; i < ar.length ; i++){
		if(!colors.contains(ar[i])){
			colors.add(ar[i]);
		}else{
			result++;
			colors.remove(ar[i]);
		}
	}
	return result;
}

HashSet에 하나씩 담으면서 중복데이터가 있을경우 수량을 ++ 하고, 해당 요소를 제거하는 방법이다. 

시간복잡도 O(1)

- df: `/root/.gvfs': 허가 거부

리눅스 시스템에서 마운트 상태를 확인하기 위한 df명령어 입력 시, 허가 거부일 경우 

 

아래 명령어로 해결

 

df -x fuse.gvfs-fuse-daemon 

- tomcat 로그파일 위치

 

tomcat 로그파일은 catalina.out파일로 일반적으로

tomcat/logs 디렉토리에 위치한다. 

 

tomcat은 기동 되었고,

'ps -ef | grep tomcat' 으로 정상적으로 start되어 있는데도, 

서비스가 안되거나 비정상적이라면 해당 파일을 열어 Error내용을 찾아보면된다.

 

 

> 실시간 출력

tail -f catalina.out

 

> 마지막 1000라인 출력

tail -1000 catalina.out

 

> vi 편집기로 오픈

vi catalina.out 으로 오픈 후  (G: 문서 맨 마지막으로 이동, ctrl+B : 이전페이지, ctrl+F : 다음페이지, 찾기 : /word)

'Linux' 카테고리의 다른 글

배포 Job생성시 Web Service Check 단계 추가하는 법  (0) 2020.10.20
df 명령어 허가 거부  (0) 2020.02.04

1. TypeScript란 ?

 

자바스크립트와 전혀 다른 언어겠지 라는 생각에 JavaScript부터 마스터 한 후에 다른걸 파봐야지 하면서 생각조차 하지 않고 있었는데, 리액트와 더불어 굉장히 각광받고 있는 것이 요 TypeScript라고 한다. 

 

TypeScript는 자바스크립트와 다른 언어가 아니며, 자바스크립트이다.

그러나, 개선사항이 있을 뿐.

 

개발자를 위한 개선점들일뿐.. 그게 다 라고한다. 

TypeScript는 MS(마이크로소프트)에서 나왔고, 때문에 visual studio code를 사용하면 호환성이 좋다고한다.

자동완성도 지원하고 type이 argument인지 function인지도 알 수 있는 장점이 있다고 한다.

버그프리(bug-free)한 언어로, 디버깅도 필요 없다고하는데, 좀 더 자세한 내용은 TypeScript 강의를 들은 후 포스팅 할 예정이다.

'Web개발' 카테고리의 다른 글

리다이렉트(redirect)와 인터셉트(intercept)  (0) 2020.04.15
세션(Session)과 쿠키(Cookie)  (0) 2020.04.15
시맨틱 마크업  (0) 2020.01.28
servlet 버전 별 web.xml 스키마 예제  (0) 2020.01.19
robots.txt 파일  (0) 2020.01.19

10.JavaScript 개발자가 알아야할 33개 컨셉 10. setTimeout, setInterval and requestAnimationFrame


1. setTimeout

set timeout은 자바스크립트에서 나온 개념이 아니라 브라우저와 노드js에서 가져온 개념이다. 

하는 일은 일정 시간이 흐른후에 함수를 실행시킬 때 사용한다.

좀더 세부적인 설명을 하자면, setTimeout은 시간이 지난 후에 기능을 메시지큐에 붙여준다.

함수를 자동으로 부르는 것이 아니라, 함수를 메시지 큐에 넣고, 스택이 비게되면, 자바스크립트가 실행하는 것이다.

바로 이뤄질 수도 있고, 자바스크립트가 바쁘면 천천히 실행 할 수도있다.. 그래서 time specific하다고 볼 수 없다.

 

사용법은 매우 간단하다. 첫번째 인자가 함수이고, 세번째 인자로 시간을 넣어주면된다.  3초 후 실행시킨다면 3000을 두번째 인자로 전달하면된다. 

 

기억해야 할 것은 저 3000(3초)이라는 숫자는 함수를 큐에 올리기 까지 최소한의 대기시간이며,

준비가되면 자바스크립트가 부르는 것이다.

즉, 확실한 시간이 아니고 브라우저 상황 자바스크립트 상황에 따라 지연이 될 수 있다.

하지만 뭐 그리 큰 지연은 아니니 무시해도 된다고한다..

 

setTimeout( () => console.log("Hi"), 3000)

setTimeout( console.log, 3000, 'Hi') 도 위와 동일하게 동작한다.

 

중요한 것은 우리가 직접 함수를 부르지 않고, 함수를 setTimeout에게 주고, 그 다음 setTimeout이 함수를 부르는 것이다.


그리고 떄로는 setTimeout에게 맏겨놓은 작업을 취소하고 싶을 때가 있다.

 

그럴때는 setTimeout을 변수 안에 넣으면 된다. 

 

timeout 변수에 setTimeout함수를 셋팅하고, console.log로 timeout함수를 실행시켜보면 숫자가 리턴되는데,

 선언한 timeout에 대한 ID 값이 리턴된 것이다. 

위 코드는 10초 후에 Hi를 출력하는 것이고, ID를 가지고 있는것을 확인할 수 있다.

 

생성한 타임아웃 작업을 취소하고 싶을 때는 clearTimeout에 해당 setTimeout변수를 셋팅해주면된다.

clearTimeout(timeout);

 

2. setInterval

일정 시간마다 함수를 실행시킬 때 사용하며, setTimeout과 동일한 인자를 사용한다. 

const timeout = setInterval(console.log, 10000, 'Hi');

이렇게 하면 10초 마다 Hi가 출력되는 것이다.

 

setInterval함수도 마찬가지로 clearInterval 함수에 변수를 인자로 넘겨줌으로써 실행을 종료시킬 수 있다.

clearInterval(timeout);

 

setTimeout과 setInterval모두 함수를 직접 사용하지 말고 함수의 이름을 넣어준다는 것이 중요하다.

그것들을 취소하고 싶을 때 clear을 이용하면 되기 때문이다.

 

3. requestAnimationFrame

 

이전에 화면에서 뭔가 움직이게 하려면 사람들은 setInterval을 사용했다. 

그러나 interval에 의지할 수 없고(time specific이 아니니까) 또한 CPU나 그래픽카드가 느리면 interval이 느려질 수 있다는 단점이 존재한다. 

그래서 requestAnimationFrame이 나온 것이라 한다.

 

requestAnimationFrame은 브라우저 화면이 렌더링 되기 전에 함수를 실행시키기 떄문에, 따로 시간 값을 인자로 넘길 필요가 없으며 오직 CallBack Fn만을 인자로 넘겨서 사용한다. 

애니메이션 작업을 많이 하지 않는이상 자주 쓸 일은 없는 함수이다..

const sayHi = () => {
	console.log('Hi');
    requestAnimationFrame(sayHi);
};

requestAnimationFrame(sayHi);

위 코드를 실행하면 Hi가 console에 아주 빠르게 출력이 되기 시작하고, 다른 탭으로 이동하면 크롬은 그걸 실행시키지 않는다. 해당 스크린을 리페인팅하는 것이 아니기 때문이다. 

다시 해당 탭으로 돌아가면 다시 실행이 시작되는 것을 확인 할 수 있다. 

 

무언가 최대한 빠르게 실행하고 싶을 때, requetAnimationFrame을 사용해보면 될것이다.

 

+ Recent posts