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;

}

728x90

최대공약수

두 수의 공약수 중 가장 큰 수

 

최소공배수

두 수의 공배수 중 가장 작은 수

==  (두 수의 곱)/ (최대공약수) 

 

유클리드 호제법

최대공약수 구하기 

 

두 수의 최대공약수는 두 수를 나눈 나머지와 나눈 수의 최대공약수와 같다. 

A/B = C 

GCD(A,B) = GCD(B,C)

B/C = D

GCD(A,B) = GCD(B,C) = GCD(C,D)

...

나머지가 0이 될 때, 나누는 수가 최대공약수이다. 

만약 

C/D = 0이라면 

D가 최대공약수이다.

 

이것을 알고리즘으로 보면 

GCD(A,B) = GCD(B,A%B)

if( A%B==0) return B

else GCD(B,A%B)

 

 

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

int[] answer = new int[2];

answer[0]= GCD(n,m); //최대공약수

answer[1] =n*m/ GCD(n,m); //최소공배수

return answer;

}

int GCD(int a, int b) { //최대공약수 구하기

if(a%b==0)return b;

else return GCD(b,a%b);

}

728x90

이전에 만들었던 버전은 핸들바의 script 태그를 이용해 메인 html에 여러 페이지의 템플릿을 숨겨두고 요청에 따라 템플릿을 보여주었는데 이번에는 네비게이터를 만들었다. 

href의 #해시 요청과 button의 클릭 이벤트 발생시 hash를 바꿔주어 hashchange 이벤트가 발생하면 

navigator에서 hash의 url을 확인하고 템플릿을 꺼내고 필요한 AJAX 요청을 한다. 

 

function navigate() {

const hash = window.location.hash;

const path = hash.substring(1);

let html = "";

hash는 #로 시작하므로 지저분한 #을 떼주고 path만 남도록 substring으로 정리해주었다. 

템플릿을 받을 html 변수를 생성

if (path == '/guest_main') {

html = guest_main();

} else if (path == '/guest_list') {

ajaxRequest(GUEST_LIST.method,GUEST_LIST.url,function(responseJsonObject){

html = guest_list(responseJsonObject);

$('#content').html(html);//????

});

}

이런식으로 path를 구분하여 main으로 보낼지 list로 보낼지 결정한다. 

문제는 list의 ajax 요청이다. 

ajax 요청이라하면 요청을 하고 응답을 받는 동안 쓰레드가 계속 돌아야하는데 

ajax 요청의 콜백함수에서 guest_list의 템플릿에 json 데이터를 핸들바로 바인딩하여 완성된 템플릿을 받아 html에 초기화 시킬때까지 기다리게 된다. 

이문제는 추후 promise 객체로 해결한다. 

 

여기서 guest_main, guest_list 함수는 

import { guest_main } from "./template-guest-main.js";

import { guest_write_form } from "./template-guest-write-form.js";

import { guest_list } from "./template-guest-list.js";

import { ajaxRequest } from "./request.js";

import {GUEST_DETAIL,GUEST_MODIFY_ACTION,GUEST_MODIFY_FORM,

GUEST_REMOVE_ACTION,GUEST_LIST,GUEST_WRITE_ACTION} from "./request-url.js";

template을 반환하는 함수를 가진 js 모듈을 import한 것이다.

 

템플릿 함수는 대략 이런 구조를 가진다.

let htmlTemplate = `

<table >

<tbody>

<tr>

<td>번호</td>

<td>제목</td>

<td>이름</td>

<td>날짜</td>

</tr>

{{#each data}}

<tr class="guest_item">

<td>{{guest_no}}</td>

<td>

<a href="#/guest_detail/{{guest_no}}" class="user guest_item_a">{{guest_title}}

</a>

</td>

<td>{{toUpper guest_name}}</td>

<td>{{substring guest_date 0 10}}</td>

</tr>

{{/each}}

</tbody>

</table>`;

let bindTemplate = Handlebars.compile(htmlTemplate);

let resultTemplate = bindTemplate(responseJsonObject);

return resultTemplate;

html 템플릿 텍스트를 Handlebars.compile 하여 만들 bindTemplate 함수에 Ajax 요청에 대한 응답으로 받은 responseJsonObject를 넣어준뒤 완성된 템플릿인 resultTemplate을 만들어반환한다.

 

else if(path.startsWith('/guest_modify_form/')){

const guest_no = path.substring(path.lastIndexOf('/')+1);

ajaxRequest(GUEST_MODIFY_FORM.method,GUEST_MODIFY_FORM.url.replace('@guest_no',guest_no),function(responseJsonObject){

html = guest_modify_form(responseJsonObject);

$('#content').html(html);

})

}

수정폼에선 기존의 데이터를 가져와야하기 때문에 guest_no가 필요하다 

guest_no는 view(detail)에서 가져온다.

<input type="button" data-navigate="/guest_modify_form/{{data.[0].guest_no}}" value="수정" >

view 버튼 중에 수정 버튼은 data-navigate라는 custom attribute를 가지고 있다. 

버튼을 클릭하면 클릭이벤트가 발생하는데 이 클릭이벤트가 발생하면 해쉬체인지 이벤트가 발생하도록 해준다.

$(document).on('click',function(e){

if(e.target.getAttribute('data-navigate')){

window.location.hash=e.target.getAttribute('data-navigate');

}

});

data-navigate의 /guest_modify_form/guest_no 를 가져올수 있게된다.

navigate에서는 여기서 가져온 guest_no로 restController의 guests/guest_no에 필요한 guest_no를 채울수 있게된다.

else if(path.startsWith('/guest_modify_action/')){

const guest_no = path.substring(path.lastIndexOf('/')+1);

데이터 검증 생략

let sendJsonObject = {

guest_no: $('#guest_modify_form [name="guest_no"]').val(),

guest_date: "",

guest_name: $('#guest_modify_form [name="guest_name"]').val(),

guest_email: $('#guest_modify_form [name="guest_email"]').val(),

guest_homepage: $('#guest_modify_form [name="guest_homepage"]').val(),

guest_title: $('#guest_modify_form [name="guest_title"]').val(),

guest_content: $('#guest_modify_form [name="guest_content"]').val()

};

 

ajaxRequest(GUEST_MODIFY_ACTION.method,GUEST_MODIFY_ACTION.url.replace('@guest_no',guest_no),function(responseJsonObject){

if (responseJsonObject.status == 1) {

//쓰기 성공시 HashChange 이벤트 발생

window.location.hash='/guest_detail/'+guest_no;

} else {

alert(responseJsonObject.msg);

}

},sendJsonObject)

}

ajax request가 성공하면 

window.location.hash를 변경해주어 guest_detail 템플릿을 뿌리도록 이벤트를 발생시킨다.

'Javascript' 카테고리의 다른 글

Intersection Observer 무한스크롤 구현하기  (0) 2023.11.24
js 모듈 의존성 줄이기  (0) 2023.09.24
AJAX using JQuery  (0) 2023.09.24
JQuery event  (0) 2023.09.23
Javascript this  (0) 2023.09.23
728x90

n이 주어지면 n번째 인덱스의 문자를 기준으로 정렬하되 같은 문자일 경우 사전순 정렬

public String[] solution(String[] strings, int n) {

 

for (int i = 0; i < strings.length-1; i++) {

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

if(compareTo(strings[j],strings[j+1],n)>0) {

String temp =strings[j];

strings[j]=strings[j+1];

strings[j+1]=temp;

}

}

}

return strings;

}

public int compareTo(String a, String b, int n) {

if(a.charAt(n)>b.charAt(n)) {

return 1;

}else if(a.charAt(n)==b.charAt(n)) {

return a.compareTo(b); //??

}else {

return -1;

}

}

비교하는 메서드를 만들어서 버블 정렬 

 

다른 사람 풀이 보는데 시간은 오래걸리지만 신박한 방법이 있었다. 

비교할 n번째 인덱스를 문자열의 맨 앞으로 가져와서 전체 사전순 정렬해주면 

n번째 인덱스로 일차 비교하고 다음 원래 문자열의 사전순 정렬을 실행할 수 있게된다. 

public String[] solution2(String[] strings, int n) {

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

strings[i] = strings[i].charAt(n)+strings[i];

}

Arrays.sort(strings);

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

strings[i] = strings[i].substring(1);

}

return strings;

}

 

아래 방법은 원래 시도해봤는데 compare함수를 오버라이딩 하려면 n을 넣을 수 없어서 포기했었는데

그냥 sort()함수 안에서 Comparator를 생성하면서 정의해주면 solution() 내의 n을 사용할 수 있었다.

public String[] solution3(String[] strings, int n) {

Arrays.sort(strings, new Comparator<String>(){

@Override

public int compare(String s1, String s2){

if(s1.charAt(n) > s2.charAt(n)) return 1;

else if(s1.charAt(n) == s2.charAt(n)) return s1.compareTo(s2);

else if(s1.charAt(n) < s2.charAt(n)) return -1;

else return 0;

}

});

return strings;

}

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

시저 암호 문제풀이  (0) 2023.09.25
삼총사 문제풀이  (0) 2023.09.25
성격 유형 검사하기 문제풀이  (0) 2023.09.25
약수의 개수와 덧셈 문제풀이  (0) 2023.09.24
달리기 경주 문제풀이  (0) 2023.09.24
728x90

4개의 지표가 있고

지표에 관한 설문이 주어질 때 답안에 따라 점수를 부여하여 높은 점수를 가진 성격 유형을 가진다

이때 동점일 경우 사전순으로 빠른 유형을 선택한다. 

 

public String solution(String[] survey, int[] choices) {

String answer = "";

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

 

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

String before =survey[i].charAt(0)+"";

String after =survey[i].charAt(1)+"";

if(choices[i]==1) {

map.put(before, map.getOrDefault(before, 0)+3);

}else if(choices[i]==2) {

map.put(before, map.getOrDefault(before, 0)+2);

}else if(choices[i]==3) {

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

}else if(choices[i]==4) {

 

}else if(choices[i]==5) {

map.put(after, map.getOrDefault(after, 0)+1);

}else if(choices[i]==6) {

map.put(after, map.getOrDefault(after, 0)+2);

}else if(choices[i]==7) {

map.put(after, map.getOrDefault(after, 0)+3);

}

}

if(map.getOrDefault("T",0)>map.getOrDefault("R",0)) {

answer+="T";

}else {

answer+="R";

}

if(map.getOrDefault("F",0)>map.getOrDefault("C",0)) {

answer+="F";

}else {

answer+="C";

}

if(map.getOrDefault("M",0)>map.getOrDefault("J",0)) {

answer+="M";

}else {

answer+="J";

}

if(map.getOrDefault("N",0)>map.getOrDefault("A",0)) {

answer+="N";

}else {

answer+="A";

}

 

return answer;

}

map에 각 유형과 점수를 저장한다. 

점수가 같으면 사전순으로 빠른 유형이 answer에 더해진다.

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

삼총사 문제풀이  (0) 2023.09.25
문자열 내 마음대로 정렬하기 문제풀이  (0) 2023.09.25
약수의 개수와 덧셈 문제풀이  (0) 2023.09.24
달리기 경주 문제풀이  (0) 2023.09.24
공원 산책 문제풀이  (0) 2023.09.24

+ Recent posts