728x90

피자를 6조각으로 나눌때 모든 사람이 피자를 남기지 않고 같은 수의 피자 조각을 먹는다면 최소 몇 판을 시켜야 하는지 반환

 

문제는 최소 공배수를 구할 수 있는지를 묻고 있다. 

 

->6의 배수 중에서 사람 수로 나누어 떨어지는 수를 구한다. 

-> 본인은 재귀함수를 이용해서 문제를 풀었다. 

n의 배수 중 6으로 나눠 떨어지는 수를 구하고 그때 6으로 나눈 값을 반환한다. 

n+=n; 코드를 실행하면서 n이 계속 바뀌어 n의 배수를 모두 계산할 수 없어 m을 따로 초기화 시켜 함수에 파라메터로 넣어주었다.

public int solution(int n) {

int m = n;

return recursiveCall(n,m);

}

public int recursiveCall(int n, int m){

if(n%6==0)return n/6;

else {

n+=m;

return recursiveCall(n,m);

}

}

이런 방식을 재귀함수를 이용하지 않고 풀면 

public int solution2(int n) {

int answer = 1;

 

while (true) {

if (6 * answer % n == 0)

break;

answer++;

}

 

return answer;

}

6에 피자 판수를 곱하고 사람수로 나누어 떨어질때까지 while문으로 체크하여 answer를 구한다.

 

->정석으로 최소 공배수를 구하여 6으로 나눈다. 

public int GCD(int num1, int num2) {

if (num1 % num2 == 0)

return num2;

return GCD(num2, num1 % num2);

}

 

public int LCM(int num1, int num2) {

return num1 * num2 / GCD(num1, num2);

}

 

public int solution3(int n) {

return LCM(n, 6) / 6;

}

 

GCD = 최대공약수 , LCM=  최소공배수 

 

LCM = num1 * num2 /GCD

> 두 수의 최소공배수는 두 수의 곱을 두 수의 최대공약수로 나누면 된다. 

 

유클리드 호제법에 따라 

자연수 a,b에 대해서 a를 b로 나눈 나머지를 r이라 한다면,

 >  a%b = r;

a,b의 최대공약수와 b,r의 최대공약수는 같다.

 > GCD(a,b) == GCD(b,r);

 

다시 b%r = r2;

GCD(b,r) == GCD(r,r2);

 

나머지가 0이 될 때의 나눈 수가 a,b의 최대공약수가 된다. 

만약 r%r2 == 0;

GCD(a,b) == GCD(b,r) == GCD(r,r2) == r2;

 

GCD(a,b)를 구하기 위해 재귀함수를 이용한다. 

'Java > Coding Test' 카테고리의 다른 글

팩토리얼  (0) 2023.09.11
숫자 찾기 문제풀이  (0) 2023.09.10
외계행성의 나이 문제풀이  (0) 2023.09.10
문자열 정렬하기(1) 문제풀이  (0) 2023.09.10
점의 위치 구하기 문제풀이  (1) 2023.09.09
728x90

 0을 a, ~ 9를 j로 표현할 때 주어진 정수를 알파벳형태로 반환

 

public String solution(int age) {

String answer = age+"";

char[] arr = answer.toCharArray();

for(int i=0; i<arr.length;i++){

arr[i] = (char) (arr[i]+49);

}

answer = String.valueOf(arr);

return answer;

}

아스키 코드표를 보면 

0은 48, a는 97로 49만큼 차이가 난다. 

> 굳이 아스키 코드를 볼 필요 없이  49대신  'a'-'0' 의 값을 더하면 된다.

주어진 정수의 각 자릿수에 49만큼 더한 후 문자열로 변환하면 된다. 

 

참고로 0= 48, ... 9=57, A=65, ... Z=90, a=97, ... z=122 이다.

728x90

주어진 문자열 중 숫자만 뽑아 오름차순 정렬한 숫자 리스트를 반환 

public int[] solution(String my_string) {

my_string = my_string.replaceAll("\\D", "");

char[] arr = my_string.toCharArray();

Arrays.sort(arr);

int[] answer = new int[arr.length];

for(int i=0; i<arr.length; i++){

answer[i] = Integer.parseInt(arr[i]+"");

}

return answer;

}

문자열 중 숫자가 아닌 모든 문자를 제거한다.

숫자만 남은 문자열을 char[]로 바꾸어 정렬한다. 

char[]로 반환해도 될 줄 알았는데 숫자 형식으로 바꾸어야 하는지 오답이 나왔다.

-> char+"" 로 String 형태로 바꾼 후 Integer.parseInt() 메서드로 숫자형태로 바꿔 주었다.

 

-> char의 '0'~'9'까지 문자에서 '0'의 값을 빼주면 int 0~9값이 나오므로 

int[] answer = new int[arr.length];

for(int i=0; i<arr.length; i++){

answer[i] = arr[i]-'0';

}

이렇게 바꿀수도 있다.

 

return Arrays.stream(myString.replaceAll("[A-Z|a-z]", "")

.split("")).

sorted().

mapToInt(Integer::parseInt).

toArray();

스트림과 정규표현식을 이용한 다른 사람의 풀이이다. 

 

replaceAll 메서드를 이용해 A~Z 또는 a~z 까지의 문자를 모두 "" null String으로 바꾸고 

.split("") 메서드로 모든 문자를 분할하고 정렬한후 Integer 배열로 바꾸었다.

 

자료구조, 알고리즘 정리한 후 스트림과 정규표현식도 정리해봐야겠다.

 

728x90

주어진 점의 좌표가 1,2,3,4분면중 어디에 속하는지 반환 

x,y의 좌표는 0과 같지 않다. 

 

public int solution(int[] dot) {

if(dot[0]>0&&dot[1]>0)return 1;

else if(dot[0]<0&&dot[1]>0)return 2;

else if(dot[0]<0&&dot[1]<0)return 3;

else return 4;

 

}

삼항연산자를 이용하여 표현할 수도 있다.

 return dot[0]>0&&dot[1]>0 ? 1: dot[0]<0&&dot[1]>0 ? 2 : dot[0]<0&&dot[1]<0 ? 3: 4;

 

'Java > Coding Test' 카테고리의 다른 글

외계행성의 나이 문제풀이  (0) 2023.09.10
문자열 정렬하기(1) 문제풀이  (0) 2023.09.10
삼각형의 완성조건  (0) 2023.09.09
순서쌍의 개수 문제풀이  (0) 2023.09.09
배열의 유사도 문제풀  (0) 2023.09.09

+ Recent posts