728x90

명예의 전당에는 최대 n개의 수가 들어갈 수 있으며, n개 이후부터 추가될 때에는 

명예의 전당에 있는 수보다 큰 수가 들어오면 가장 작은 수는 빠진다. 

명예의 전당에 수가 추가될 때마다 명예의 전당에 있는 수 중 가장 작은 수를 배열로 반환 

 

public int[] solution(int k, int[] score) {

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

ArrayList<Integer> honors = new ArrayList<Integer>();

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

if (i < k) {

honors.add(score[i]);

Collections.sort(honors);

} else if (score[i] >= honors.get(0)) {

honors.add(score[i]);

Collections.sort(honors);

honors.remove(0);

}

answer[i] = honors.get(0);

}

return answer;

}

리스트에 수를 넣는데 매번 가장 작은 수를 찾아서 제거한다. 

가장 작은 수를 찾기 위해 매 반복마다 정렬을 수행하는데 

대신 priority Queue 를 사용하면 가장 작은 수를 찾아서 poll 할 수 있다. 

public int[] solution2(int k, int[] score) {

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

 

PriorityQueue<Integer> priorityQueue = new PriorityQueue<>();

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

priorityQueue.add(score[i]);

if (priorityQueue.size() > k) {

priorityQueue.poll();

}

answer[i] = priorityQueue.peek();

}

return answer;

}

k일 이전까지는 계속 추가하고 가장 앞의 값을 answer 배열에 추가하고 

k일 이후부터는 원소 추가 이후 가장 작은 값을 없애고 answer 배열에 남은 수 중 가장 작은 값을 추가한다.

 

priorityQueue는 가장 작은 수를 우선순위로 둔다. 

만약 가장 큰 수를 우선순위로 두고 싶다면 

PriorityQueue<Integer> priorityQueue = new PriorityQueue<>(Collections.reverseOrder());

Collections.reverseOrder()로 queue의 순서를 뒤집어준다. 

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

과일 장수 문제 풀이  (0) 2023.09.28
2016년 문제 풀이  (0) 2023.09.28
가장 가까운 같은 글자 문제풀이  (0) 2023.09.26
시저 암호 문제풀이  (0) 2023.09.25
삼총사 문제풀이  (0) 2023.09.25
728x90

문자열의 각 글자를 확인하여

 처음 나온 글자는 -1, 

앞에 나온 글자는 그 글자와의 거리를  배열로 반환

 

public int[] solution(String s) {

int[] answer = new int[s.length()];

Arrays.fill(answer, -1);

for (int i = 1; i < s.length(); i++) {

int index = 0;

for (int j = i-1; j >= 0; j--) {

index++;

if(s.charAt(i)==s.charAt(j)) {

answer[i] = index;

break;

}

}

 

}

return answer;

}

 

최초 나온 숫자는 -1 이고 그 이외에 중복되는 모든 수는 이후에 초기화되므로 배열을 -1로 초기화시켜놓는다. 

거리를 계산하기 편하게 index 변수를 만들어 체크 

 

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

2016년 문제 풀이  (0) 2023.09.28
명예의 전당(1) 문제풀이  (0) 2023.09.27
시저 암호 문제풀이  (0) 2023.09.25
삼총사 문제풀이  (0) 2023.09.25
문자열 내 마음대로 정렬하기 문제풀이  (0) 2023.09.25
728x90

문자열의 알파벳을 일정거리n 씩 밀어서 다른 알파벳으로 바꾼 값을 반환 

public String solution(String s, int n) {

String answer = "";

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

if(Character.isLowerCase(s.charAt(i))&&s.charAt(i)+n>'z') {

char temp=(char) (s.charAt(i)-26+n);

answer+=temp;

}else if(Character.isUpperCase(s.charAt(i))&&s.charAt(i)+n>'Z') {

char temp = (char) (s.charAt(i)-26+n);

answer+=temp;

}else if(s.charAt(i)==' '){

answer+=" ";

}else {

char temp = (char)(s.charAt(i)+n);

answer+=temp;

}

 

}

return answer;

}

밀었을때 알파벳의 범위를 초과하면 -26하여 A혹은 a부터 시작하게 해준다.

공백은 밀리지 않는다. 

 

728x90

배열이 주어질 때 세 원소의 합이 0이 되는 경우의 수 반환

public int solution(int[] number) {

int answer=0;

int sum = 0;

Stack<Integer> stack = new Stack<>();

int fi = 0;

int si = 1;

int li = 2;

while(fi<=number.length-3) {

sum+=stack.push(number[fi]);

while(si<=number.length-2) {

sum+=stack.push(number[si]);

while(li<=number.length-1) {

sum+=stack.push(number[li]);

if(sum==0)answer++;

sum-=stack.pop();

li++;

}

if(li==number.length) {

sum-=stack.pop();

si++;

li=si+1;

}

}

if(si==number.length-1) {

sum-=stack.pop();

fi++;

si=fi+1;

li=si+1;

}

}

return answer;

}

괜히 어렵게 생각해서 stack으로 123 124 125 134 135 ... 계산했다.... 

정답률 높은 문제였는데 알고보니까 그냥 배열 그대로 두고 삼중for문으로 풀 수 있었다.

사실 내가 푼것도 3중 반복문이라 .........................................................

public int solution2(int[] number) {

int answer = 0;

for(int i=0; i<number.length-2; i++){

for(int j=i+1; j<number.length-1; j++){

for(int k=j+1; k<number.length; k++){

if(number[i]+number[j]+number[k]==0) answer++;

}

}

}

return answer;

}

+ Recent posts