728x90
반응형
다음 입사문제 - 두 점의 차이가 제일 적은 두개의 점 출력
문제:
1차원의 점들이 주어졌을 때, 그 중 가장 거리가 짧은 것의 쌍을 출력하는 함수를 작성하시오.
(단 점들의 배열은 모두 정렬되어있다고 가정한다.)
예를들어 S={1, 3, 4, 8, 13, 17, 20} 이 주어졌다면, 결과값은 (3, 4)가 될 것이다.
순서:
- 최초의 배열 뺀 값을 변수(prevtmp)에 저장하고 새로운 값(tmp)을 받아서 계속 연산하여 prevtmp랑 비교
- 만약 새 값(tmp)이 저장변수(prevtmp)보다 작다면 값을 대입하여 result 값에 저장
- 만약 더 작은값이 있다면 prevtmp값에 값을 새로 저장함으로써 그 작은값으로 연산을 함
- 연산 값이 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개의 사이클 길이 구하여 차이 구하기
문제:
코드 블럭 아래 참조
순서:
- 최초의 배열 뺀 값을 변수(prevtmp)에 저장하고 새로운 값(tmp)을 받아서 계속 연산하여 prevtmp랑 비교
- 만약 새 값(tmp)이 저장변수(prevtmp)보다 작다면 값을 대입하여 result 값에 저장
- 만약 더 작은값이 있다면 prevtmp값에 값을 새로 저장함으로써 그 작은값으로 연산을 함
- 연산 값이 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
반응형
'알고리즘 풀이 > Java' 카테고리의 다른 글
Level 2 코딩 문제풀이 - 짝수번째 숫자 치환 & 배수 특정 숫자 찾기 (0) | 2022.02.15 |
---|---|
Level 2 코딩 문제풀이 - 구글입사문제, 하위 디렉토리 파일 찾기 (0) | 2022.02.09 |
겹치는 숫자 제거 & OX 프린트 & 버전 크기 비교 - 코딩 문제 풀이 (0) | 2022.01.28 |
피보나치 & 숫자곱셈 - 코딩 문제 풀이 (0) | 2022.01.27 |