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
728x90

세 변의 길이가 배열로 주어질 때 주어진 배열로 삼각형을 만들 수 있는 경우 1, 아닌 경우 2를 반환 

 

삼각형을 만들 수 있는 조건

/ *가장 긴 변의 길이가 다른 두 변의 길이의 합보다 작아야 한다.*/

 

public int solution(int[] sides) {

Arrays.sort(sides);

if(sides[2]<sides[0]+sides[1])

return 1;

return 2;

}

 

삼항연산자를 사용하면 더 좋았을텐데 익숙하지가 않다... 

public int solution(int[] sides) {

Arrays.sort(sides);

int answer = (sides[2]<sides[0]+sides[1]) ? 1: 2;

return answer;

}

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

문자열 정렬하기(1) 문제풀이  (0) 2023.09.10
점의 위치 구하기 문제풀이  (1) 2023.09.09
순서쌍의 개수 문제풀이  (0) 2023.09.09
배열의 유사도 문제풀  (0) 2023.09.09
문자열 뒤집기 문제풀이  (1) 2023.09.09
728x90

두 자연수의 곱이 n이 되는 자연수 순서쌍의 개수 구하기 

 

-i의 제곱이 n과 같거나 작을때 까지 구하고 

i가 정확히 n의 제곱근인 경우, 구한 answer의 2배에서 1을 빼고 아니면 그냥 2배를 반환하면 된다.

public int solution(int n) {

int answer = 0;

boolean isSquare = false;

for (int i = 1; i * i <= n; i++) {

if (i * i == n)

isSquare = true;

if (n % i == 0) {

answer++;

}

}

answer *= 2;

if (isSquare)

answer--;

return answer;

}

- 다른 사람의 풀이를 보다가 boolean을 선언할 필요가 없어서 조금 개선해보았다. 

나중에 2배를 곱하지 않고 처음 answer를 증가시킬때부터 2배로 증가시키고 제곱근인 경우만 1 증가시켰다.

public int solution2(int n) {

int answer = 0;

for (int i = 1; i * i <= n; i++) {

if (i * i == n) answer++;

else if (n % i == 0) {

answer+=2;

}

}

return answer;

}

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

문자열 정렬하기(1) 문제풀이  (0) 2023.09.10
점의 위치 구하기 문제풀이  (1) 2023.09.09
삼각형의 완성조건  (0) 2023.09.09
배열의 유사도 문제풀  (0) 2023.09.09
문자열 뒤집기 문제풀이  (1) 2023.09.09
728x90

문자열 s1, s2의 원소들 중 동일한 원소의 개수 구하기 

 

-s1,s2의 원소들을 각각 하나씩 비교하기 

public int solution(String[] s1, String[] s2) {

int answer = 0;

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

for (int j = 0; j < s1.length; j++) {

if(s1[j].equals(s2[i])) {

answer++;

}

}

}

return answer;

}

-set의 특성(중복 허용x)을 이용하여 set의 사이즈와 두 배열의 크기의 합을 비교하여 구하기 

public int solution2(String[] s1, String[] s2) {

int answer = 0;

Set<String> set = new HashSet<String>();

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

set.add(s1[i]);

}

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

set.add(s2[i]);

}

answer =s1.length+s2.length-set.size();

 

return answer;

}

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

문자열 정렬하기(1) 문제풀이  (0) 2023.09.10
점의 위치 구하기 문제풀이  (1) 2023.09.09
삼각형의 완성조건  (0) 2023.09.09
순서쌍의 개수 문제풀이  (0) 2023.09.09
문자열 뒤집기 문제풀이  (1) 2023.09.09
728x90

입력받은 문자열을 뒤집어 출력하는 문제 

 

> 입력받은 문자열을 문자 배열로 바꾸어 문자의 배열 순서를 바꿔준 후 다시 문자열로 바꾸어 반환

public String solution(String my_string) {

String answer = "";

char[] arr = my_string.toCharArray();

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

char temp = arr[i];

arr[i] = arr[arr.length-i-1];

arr[arr.length-1-i]=temp;

}

answer = String.valueOf(arr);

return answer;

}

 

다른 사람 풀이 

- StringBuilder클래스의 reverse 메소드 이용 

public String solution2(String my_string) {

return new StringBuilder(my_string).reverse().toString();

}

- 입력받은 문자열의 가장 뒤 문자부터 String answer에 더해주는 방식

public String solution3(String my_string) {

String answer = "";

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

answer+=my_string.charAt(my_string.length()-1-i);

}

return answer;

}

 

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

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

+ Recent posts