Level 2 코딩 문제풀이 - 다음 입사 문제, 숫자 사이클 길이

728x90

다음 입사문제 - 두 점의 차이가 제일 적은 두개의 점 출력

문제:

1차원의 점들이 주어졌을 때, 그 중 가장 거리가 짧은 것의 쌍을 출력하는 함수를 작성하시오.
(단 점들의 배열은 모두 정렬되어있다고 가정한다.)
예를들어 S={1, 3, 4, 8, 13, 17, 20} 이 주어졌다면, 결과값은 (3, 4)가 될 것이다.

 

순서:

  1. 최초의 배열 뺀 값을 변수(prevtmp)에 저장하고 새로운 값(tmp)을 받아서 계속 연산하여 prevtmp랑 비교
  2. 만약 새 값(tmp)이 저장변수(prevtmp)보다 작다면 값을 대입하여 result 값에 저장
  3. 만약 더 작은값이 있다면 prevtmp값에 값을 새로 저장함으로써 그 작은값으로 연산을 함
  4. 연산 값이 prevtmp 보다 크다면 연산을 하지 않으므로(else가 없음) result값을 보존하여 출력일단 string 배열을 scanner로 입력받아서 .split("")으로 개별로 분할한다

 

출력문:

(17,18)

//1차원의 점들이 주어졌을 때, 그 중 가장 거리가 짧은 것의 쌍을 출력하는 함수를 작성하시오.
//(단 점들의 배열은 모두 정렬되어있다고 가정한다.)
//예를들어 S={1, 3, 4, 8, 13, 17, 20} 이 주어졌다면, 결과값은 (3, 4)가 될 것이다.

public class ShortDistance {
	public static void main(String[] args) {
		
		int[] s={1, 13, 17, 18, 22, 25};
		System.out.println(findmin(s));
	}
//	==================== 정리 ==================== 
//	최초의 배열 뺀 값을 변수(prevtmp)에 저장하고 새로운 값(tmp)을 받아서 계속 연산하여 prevtmp랑 비교
//	만약 새 값(tmp)이 저장변수(prevtmp)보다 작다면 값을 대입하여 result 값에 저장
//	만약 더 작은값이 있다면 prevtmp값에 값을 새로 저장함으로써 그 작은값으로 연산을 함
//	연산 값이 prevtmp 보다 크다면 연산을 하지 않으므로(else가 없음) result값을 보존하여 출력
	static String findmin(int[] arr) {
	int tmp = 0; //1
	int prevtmp = 0; //9
	String result = null;

	for(int i = 0; i<arr.length-1; i++) {
		tmp = arr[i+1] - arr[i]; //9
			if(result != null) {
				if(tmp < prevtmp) { //9<2
//				이 때 if를 두번 넣는 이유는 tmp가 prevtmp보다 작을 경우 아래를 출력하여 result 값을 보존하고
//				작지 않을 경우 else문을 의도적으로 없애서 result 값 overriding이 되는 것을 방지
					prevtmp = tmp;
//					작을 경우 prevtmp 값을 tmp값으로 덮어씌워서 더욱 작은 값만 prevtmp으로 대체하고
//					구하는 새로운 값(tmp)이랑 작은값을 대조하도록 프로그래밍
					result = "(" + arr[i] + "," + arr[i+1] + ")";
				}
			}
			else {
//				처음에 할당해줄 prevtmp 값이 필요하므로 result 값을 null로 주어서 아래 else문을 먼저 실행
				prevtmp = tmp;
				System.out.println(prevtmp);
				result = "(" + arr[i] + "," + arr[i+1] + ")";
			}
		}
	return result;
	}
}

2개의 사이클 길이 구하여 차이 구하기

문제:

코드 블럭 아래 참조

 

순서:

  1. 최초의 배열 뺀 값을 변수(prevtmp)에 저장하고 새로운 값(tmp)을 받아서 계속 연산하여 prevtmp랑 비교
  2. 만약 새 값(tmp)이 저장변수(prevtmp)보다 작다면 값을 대입하여 result 값에 저장
  3. 만약 더 작은값이 있다면 prevtmp값에 값을 새로 저장함으로써 그 작은값으로 연산을 함
  4. 연산 값이 prevtmp 보다 크다면 연산을 하지 않으므로(else가 없음) result값을 보존하여 출력일단 string 배열을 scanner로 입력받아서 .split("")으로 개별로 분할한다

 

출력문:

1000(112) : 900(55) = 57개 만큼 차이

//어떤 정수 n에서 시작해, n이 짝수면 2로 나누고, 홀수면 3을 곱한 다음 1을 더한다.
//이렇게 해서 새로 만들어진 숫자를 n으로 놓고, n=1 이 될때까지 같은 작업을 계속 반복한다.
//예를 들어, n=22이면 다음과 같은 수열이 만들어진다.
//22 11 34 17 52 26 13 40 20 10 5 16 8 4 2 1
//
//n이라는 값이 입력되었을때 1이 나올때까지 만들어진 수의 개수(1을 포함)를 n의 사이클 길이라고 한다.
//위에 있는 수열을 예로 들면 22의 사이클 길이는 16이다.

//i와 j라는 두개의 수가 주어졌을때, i와 j사이의 모든 수(i, j포함)에 대해 최대 사이클 길이를 구하라.
public class Problem3nplus1 {
	public static void main(String[] args) {
		cyclemax(1000, 900);

	}
	static void cyclemax(int i, int j) {
		if(cyclecount(i)>cyclecount(j)) {
			System.out.println(i + "(" + cyclecount(i) + ") : " + j + "(" + cyclecount(j) + ")" + " = " + (cyclecount(i)-cyclecount(j)) +"개 만큼 차이");
		}
		else {
			System.out.println(j + "(" + cyclecount(j) + ") : " + i + "(" + cyclecount(i) + ")" + " = " + (cyclecount(j)-cyclecount(i)) +"개 만큼 차이");
		}
	}
	static int cyclecount(int i) {
		int count1 = 0;
		while(i>1) {
			if(i % 2 == 0) {
				count1++;
				i/=2;
			}
			else {
				count1++;
				i=(i*3)+1;
			}
		}
		return count1+1;
	}
}

 

 

728x90