728x90

정수 n을 기준으로  n과 가까운 수부터 정렬, 

만약 거리가 같다면 더 큰 수를 앞에 배치한다.

 

이 문제에서 더 가깝다는 것은 n과의 차이가 더 작다는 뜻이다. 

n과의 차이를 구해서 절댓값의 오름차순으로 차이가 아닌 원래 데이터를 정렬을 하되 같은 값은 본래 값을 비교할 수 있어야 한다.

즉, 정렬 기준은 n과의 차이이고, 필요시 본래 값을 비교할 수도 있지만 정렬은 원래 배열을 정렬해야한다.

 

이 문제를 풀기 위해 처음엔 n과의 차이와 본래 값을 동시에 가질 수 있는 타입인

Map, 2차 배열을 고민했지만 정렬하기 불편한 한부분이 있었고

두가지 값을 가지면서 정렬이 용이하게하기 위해 클래스를 만드는 방법을 선택 했다. 

Number 클래스를 만들고 클래스는 Comparable 인터페이스를 상속해 비교자를 만들어주면 Arrays.sort() 메소드를 사용할 수 있다 .   

public int[] solution(int[] numlist, int n) {

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

// n과의 차이

Number[] nums = new Number[numlist.length];

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

Number num = new Number(numlist[i], numlist[i] - n);

nums[i] = num;

}

Arrays.sort(nums);

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

answer[i] = nums[i].data;

}

return answer;

}

 

class Number implements Comparable<Number> {

int data;

int diff;

 

public Number(int data, int diff) {

super();

this.data = data;

this.diff = diff;

}

 

@Override

public int compareTo(Number o) {

if (Math.abs(o.diff) < Math.abs(this.diff))

return 1;

else if (Math.abs(o.diff) == Math.abs(this.diff)) {

if (o.diff < this.diff) {

return -1;

} else {

return 1;

}

} else

return -1;

}

}

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

숨어있는 숫자 덧셈(2) 문제풀이  (0) 2023.09.13
외계어 사전  (0) 2023.09.12
A로 B 만들기 문제풀이  (0) 2023.09.11
팩토리얼  (0) 2023.09.11
숫자 찾기 문제풀이  (0) 2023.09.10
728x90

두개의 문자열이 주어질 때, 문자열의 순서를 바꿨을 때 문자열이 같아진다면 1을 반환 아니라면 0 반환

 

>map으로 각 문자들을 key값으로 문자의개수를 value값으로 저장하고 다른 문자열과 같은지 비교  

public int solution(String before, String after) {

Map<Character,Integer> map = new HashMap<Character, Integer>();

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

map.put(before.charAt(i), map.getOrDefault(before.charAt(i), 0)+1);

}

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

if(!(map.containsKey(after.charAt(i)))||map.size()==0) {

return 0;

}

if(map.get(after.charAt(i))==1) {

map.remove(after.charAt(i));

}else {

map.put(after.charAt(i), map.get(after.charAt(i))-1);

}

}

return 1;

}

map에넣은 데이터를 after의 char들을 키 값으로 remove하면서 비교하였다. 

 

>map을 before의 map, after의 map 2개를 만들어서 .equals 함수로 같은지 비교하는게 더 편하다.    

public int solution(String before, String after) {

Map<Character,Integer> map = new HashMap<Character, Integer>();

Map<Character,Integer> map2 = new HashMap<Character, Integer>();

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

map.put(before.charAt(i), map.getOrDefault(before.charAt(i), 0)+1);

}

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

map2.put(after.charAt(i), map2.getOrDefault(after.charAt(i), 0)+1);

}

if(map.equals(map2))

return 1;

else return 0;

}

다른사람의 풀이 중 생각지 못한 방법을 발견했다. 

> 두 문자열을 정렬하여 같은지 비교하면 된다.

public int solution3(String before, String after) {

char[] arr = before.toCharArray();

char[] arr2 = after.toCharArray();

Arrays.sort(arr);

Arrays.sort(arr2);

if(arr.equals(arr2))return 1;

return 0;

}

 

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

외계어 사전  (0) 2023.09.12
특이한 정렬 문제풀이  (1) 2023.09.12
팩토리얼  (0) 2023.09.11
숫자 찾기 문제풀이  (0) 2023.09.10
피자 나눠먹기(2) 문제풀이 (with.유클리드 호제법)  (0) 2023.09.10
728x90

 정수 n이 주어질 때  i!<=n 을 만족하는 가장 큰 정수 i를 반환 

 

>1부터 i까지 1씩 증가하는 수를 곱해가며 n과 비교하여 i를 구한다. 

public int solution(int n) {

if (n == 0)

return 0;

int answer = 1;

int f = 1;

/*-*/

return factorial(n, answer, f);

}

 

public int factorial(int n, int answer, int f) {

f *= answer;

if (n < f) {

return answer - 1;

} else if (n == f)

return answer;

return factorial(n, answer + 1, f);

}

f= answer! 

> f는answer의 팩토리얼값

f와 n을 비교하여  n과 같으면 answer반환, n 보다 크면 answer-1 반환

f가 n보다 작으면 answer를 1 증가시켜 다시 반복한다.  

 

>while문으로 표현

public int solution2(int n) {

int answer = 1;

int m = 1;

while (true) {

m = m * answer;

if (m < n) {

answer++;

} else if (m == n) {

return answer;

} else if (m > n) {

return answer - 1;

}

}

}

m ==answer!;

m 이 n보다 작으면 answer를 증가시키고 다시 반복한다. 

728x90

주어진 숫자에서 특정값이 첫번째로 나오는 인덱스 반환, 특정 값이 없다면 -1 반환

public int solution(int num, int k) {

int answer = -1;

char[] arr = (num+"").toCharArray();

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

if(arr[i]==k+'0') {

return 1+i;

}

}

return answer;

}

평소처럼 charArray로 하나하나 비교해서 k값을 만나면 그 인덱스를 반환하고 아니면 -1을 반환하게 했다. 

 

다른 사람의 풀이를 보다가 훨씬 간결한 방법을 찾았다... 

public int solution2(int num, int k) {

return ("-" + num).indexOf(k+"");

}

찾은 인덱스 값에 1을 더해주는 대신 "-"를 더하면서 동시에 문자열로 바꾸고

"k"가 있는 인덱스를 찾아 반환한다. 

 

여기서 -1을 반환해야하는 경우가 문젠데 

 

indexOf의 API를 찾아보면 

 

Returns the index within this string of the first occurrence of the specified substring.

The returned index is the smallest value k for which:

 this.startsWith(str, k)

If no such value of k exists, then -1 is returned.

 

존재하지 않을 때 -1을 반환해준단다... 

+ Recent posts