728x90

mybatis-config.xml 

<?xml version="1.0" encoding="UTF-8" ?>

<!DOCTYPE configuration

PUBLIC "-//mybatis.org//DTD Config 3.0//EN"

"http://mybatis.org/dtd/mybatis-3-config.dtd">

<configuration>태그 안에 setting할 속성 태그 입력

 

<properties resource="jdbc.properties" />

rss를 읽을 프로퍼티 파일 

jdbc에서 사용할 DataBase 설정값을 가진 properties 파일 

<settings> mapping, sql문 관련, 주요 기능에 관한 설정

<settings>

<!-- 카멜 케이스 VO 매핑 -->

<setting name="mapUnderscoreToCamelCase" value="true" />

<!-- 쿼리 결과 필드가 null인 경우, 누락이 되서 나오지 않게 설정 -->

<setting name="callSettersOnNulls" value="true" />

<!-- 쿼리에 보내는 파라미터가 null인 경우, 오류가 발생하는 것 방지 -->

<setting name="jdbcTypeForNull" value="NULL" />

</settings>

mapUnderscoreToCamelCase

자바의 domain에서는 카멜케이스를,

대소문자를 구분하지 않는 데이터베이스에서는 스네이크 케이스를 사용하면서 

바인딩할 때 스네이크 케이스를 카멜케이스로 변환하여 인식하고 바인딩 해줄지를 설정 

 

<typeAliases> 

<typeAliases>

<typeAlias alias="Student" type="com.mybatis3.domain.Student" />

</typeAliases>

도메인 타입을 기술할 때 패키지부터 풀네임을 기술해야한다.

alias를 설정하여 간단히 할 수 있다. 

 

<environments> 데이터베이스(<dataSource>), 트랜젝션(<transactionManager>) 설정

<environment>태그를 여러번 사용하여 다양한 설정 가능 

<environments default="development">

<environment id="development">

<transactionManager type="JDBC" />

<dataSource type="POOLED">

<property name="driver" value="${jdbc.driverClassName}" />

<property name="url" value="${jdbc.url}" />

<property name="username" value="${jdbc.username}" />

<property name="password" value="${jdbc.password}" />

</dataSource>

<!-- <dataSource type="POOLED">

<property name="driver" value="" />

<property name="url" value="" />

<property name="username" value="" />

<property name="password" value="" />

</dataSource>-->

</environment>

</environments>

<property>에 데이터베이스 설정 값 입력 

jdbc.properties 파일의 key값으로 value 값을 가져온다.

 

'Web' 카테고리의 다른 글

YAML Converter  (0) 2023.10.11
SPA(single page application) Handlebars 활용하기  (1) 2023.09.21
HTML5 Basic  (0) 2023.09.19
Mybatis Mapper  (0) 2023.09.19
AJAX Asynchronous Javascript And XML  (0) 2023.09.18
728x90

AJAX : 브라우저에서 제공하는 Web API인 XMLHttpRequest 객체를 기반으로한 비동기 방식 데이터 통신 
필요한 데이터만 전송받아 갱신이 필요한 부분만 갱신한다. 이러한 과정이 비동기 방식으로 진행되기 때문에 
서버에 요청을 보내고 받는 동안 Blocking 현상이 발생하지 않아 클라이언트는 자유롭게 페이지를 이용할 수 있다.
 

 


XMLHttpRequest 객체 
ㅁproperties
 - readyStatus  : http 요청의 상태를 정수로 반환 
       unsent : 0
       opened : 1
       headers_received : 2
       loading : 3
       done : 4
 - status : 요청에 대한 응답 상태를 정수로 ex) 200 
 - statusText : 요청에 대한 응답 상태를 문자열로 ex)"OK"
 - responseType : 응답 타입 ex) document, json
 - response : 응답의 바디
 - onreadystatechange 
 - onerror
 - onload
 - open() :  요청 초기화
 - send() : 요청 전송
 - abort() : 이미 전송한 요청 중단
 
 
ㅁ요청 보내기 
1. 생성 
const xhr = new XMLHttpRequest();

const  xhr=new XMLHttpRequest();

2. 요청속성설정 open( requestMethod, 서버측 Controller URL[, async 비동기 요청 여부 default true] );

method=(method)? method:'GET';

method=(method!='GET' &&method!='POST')?'GET':method;

params=(params)?params:null;

url=(method=='GET'&&params!=null)?url+'?'+params:url;

 


++requestMethod
 - get(모든, 특정 데이터 read) 페이로드 없음
 - post(데이터 create) 페이로드 있음
 - put(데이터 전체 update) 페이로드 있음
 - delete(데이터 delete) 페이로드 없음 

xhr.open('GET','user_view?id='+idStr);

++(open() 이후 필요시 HTTP 요청 헤더 설정 ex) post)  
text : text/plain; text/html; text/css; text/javascript
application : application/json; application/x-www-form-urlencode
multiple : multiple/formed-data 

//필요한 경우 HTTP 요청 헤더 설정

// 클라이언트가 서버로 전송할 데이터의 MIME 타입 지정 : json

xhr.setRequestHeader('content-type', 'application/json');

3. 응답이 도착했을 때 실행되는 콜백함수등록(이벤트프로퍼티에 함수 등록)

xhr.onload=function (){

if(xhr.readyState==4){

/*데이터 응답이 완전히 이루어졌을때*/

let jsonText=xhr.responseText;

let jsonObject= JSON.parse(jsonStr);

 

let spanE=document.getElementById('msg');

spanE.innerHTML=msgjsonObject.msg;

if(jsonObject.status==1){

spanE.style.color='green';

}else{

spanE.style.color='red';

}

}else{

/*응답이 오는 중*/

document.getElementById('msg').innerHTML='<img src="loading.gif" width="15px" height="15px" />';

}

console.log('응답');

}

;

4. 요청 전송

xhr.send();

send(요청바디)

send("param=value&param2=value2"...)

xhr.send((method=='POST')?params:null);

 

 

 

 

 

JSON

 

클라이언트와 서버간 통신에 사용되는 데이터 포맷

{

       "key" : value,

       "key" : "strValue"

       "arrayKey" : [

                                 value,

                                 value,

                                 "strValue"

                            ],

        "objectKey" : {

                                 "key" : value,

                                 "key" : value

                              }                           

}

 

JSON.stringify(obj);

obj를 json 타입의 문자열로 반환한다. 

 

JSON.parse(obj);

obj를 json 타입의 문자열을 객체 타입으로 반환한다.

 

 

 

응답받은 데이터 사용하기 예

{

"status": 1,

"msg": "성공",

"data": [{

"title": "타이틀1",

"company": "회사1",

"date": "2023-11-15"

},{

"title": "타이틀2",

"company": "회사2",

"date": "2023-11-16"

}]

}

JSON 

let responseJsonStr = xhr.responseText; //응답받은 JSON 포맷의 String 텍스트 데이터

let responseJsonObject = JSON.parse(responseJsonStr); /* JSON 문자열 -- JSON Object로 파싱*/

let newsJsonArray = responseJsonObject.data; //Array 데이터 

let htmlTemplate=`<ul>`;

for(let i=0; i<newsJsonArray.length;i++){

let title = newsJsonArray[i].title;

let company = newsJsonArray[i].company;

let date = newsJsonArray[i].date;

htmlTemplate+=`<li>${title}[${company}-${date}]</li>`;

}

htmlTemplate+=`</ul>`;

 

@RestController

RestController 맵핑 예시

@Operation(summary = "newsList", description = "news전체를 조회")

@GetMapping(value="/map/news", produces = "application/json;charset=UTF-8")

public Map<String, Object> newsTitlesMapJson() {

int status=1;

String msg = "";

Object data=new ArrayList<>();

 

data=getNewsList();

 

Map<String,Object> resultMap = new HashMap<String,Object>();

resultMap.put("status", status);

resultMap.put("msg", msg);

resultMap.put("data", data);

 

return resultMap;

}

Controller에 @RestController 어노테이션이 없다면 

method에 @ResponseBody 어노테이션을 붙여준다. 

 

@Operation() 어노테이션은 swagger의 어노테이션으로 swagger에서 확인할 수 있는 mapping 의 설명을 붙여줄 수 있다. 

 

컨트롤러에 일정한 형식을 부여하기 위해 

int status=1;

String msg = "";

Object data=new ArrayList<>();

 

data=getNewsList();

 

Map<String,Object> resultMap = new HashMap<String,Object>();

resultMap.put("status", status);

resultMap.put("msg", msg);

resultMap.put("data", data);

 

return resultMap;

 

형식을 유지해준다. 

data에는 리스트 형식으로 하고 리스트의 사이즈가 0 혹은 1 이어도 상관없다. 

 

프론트에서 데이터를 받을 때는 

xhr.responseText

{

"status":1,

"msg":"",

"data":[

        ]

}

로 받는다. 

let responseJsonObject = JSON.parse(xhr.responseText);

responseJsonObject.status==1

 

@GetMapping(value="/map/news/{no}", produces = MediaType.APPLICATION_JSON_UTF8_VALUE)

public Map<String, Object> newsTitleMapJson(@PathVariable(name="no")int no) {

RestAPI 를 적용한 Mapping 

인자를 쿼리스트링이 아닌 path 변수로 받는다. 

'Web' 카테고리의 다른 글

YAML Converter  (0) 2023.10.11
SPA(single page application) Handlebars 활용하기  (1) 2023.09.21
HTML5 Basic  (0) 2023.09.19
Mybatis Mapper  (0) 2023.09.19
MyBatis Config  (0) 2023.09.19
728x90

선택자 

1. querySelector('key')

document.querySelector('div');

 검색된 결과들 중 첫번째 결과만 반환

2. querySelectorAll('key')

document.querySelectorAll('div');

 검색된 모든 결과를 반환 (리스트로 반환)

 

키값 ==style(css)에서와 동일하게 적용

 

#id

.class

tagname

<style type="text/css">
    <!--#idSelector--.classSelector----tagSelector-->
    #title{
        color:maroon;
    }
    .contents{
        color:pink;
    }
    h2{
        color: gold;
    }
   
</style>
document.querySelector('#title').style.color='maroon'; // # : title이란 id를 가진 노드
document.querySelector('.contents').style.color='pink'; // . : contents란 class를 가진 노드 검색
document.querySelectorAll('h2')[1].style.color='tomato';// tagName : tag로 검색

 

A, B  :  A  또는 B

AB : A 그리고 B 

div,span{
    width: 100px;
}
document.querySelectorAll('span,div');

> div태그 또는 span 태그 

 

#content,div{
    border:1px solid red;
}
document.querySelectorAll('#content,div');

> id가 content인 노드 또는 div태그

 

div.myClass{
    background-color:pink;
}
querySelectorAll('div.myClass');

>div태그 중 class가 myClass인 노드 

 

 

직계자식 ( > ) : 객체의 바로 한 단계 하위의 객체들 

자손 (   ): 객체의 하위 모든 객체들

 

body > div {
    border: 3px dotted orange;
}
document.querySelectorAll('body > div');

> body 의 직계자식 중 div 인 노드들

 

body  div {
    background-color: yellow;
}
document.querySelectorAll('body div');

> body의 자손 중 모든 div 노드들

'Javascript' 카테고리의 다른 글

JQuery 이해하기  (0) 2023.09.22
Javascript defer  (0) 2023.09.21
Javascript intermediate  (0) 2023.09.18
Javascript Event  (0) 2023.09.17
Javascript Basic  (5) 2023.09.15
728x90

변수 선언 

 

전역에 선언된 var 변수는 window속성으로 생성된다. 

전역에 선언된 var 변수는 중복선언이 되어도 에러가 발생하지 않는다.  

    var a3 = 1;
    var a3 = 2;

전역에 선언된 let 변수는 window속성으로 생성되지 않는다. 

전역에 선언된 let 변수는 중복선언되면 에러가 발생한다. 

let 변수는 해당 let이 속한 블록의 범위내에서 유효하다. 

let a2 = 2;
let a2 = 'text2'; //에러발생

 

javascript에는 null 과 undefined가 있다. 

null은 말그대로 값이 없다는 뜻이고 

undefined는 값이 지정되지 않았다는 뜻으로 값이 없는지 있는지조차 모른다

 

null은 값이 없다는 것을 명시적으로 밝히기 위해 의도적으로 사용하는 것이고

undefined는 변수는 생성되었으나 변수의 값이 초기화되기 전 반환되는 값이다.

 

typeof null  ==> Object 

typeof undefined ==> undefined

 

 

Falsy & Truthy 

false로 간주되는 값과 truth로 간주되는 값 

falsy, truthy한 값은 논리형 타입으로 자동 변경되어 의도하지 않은 결과를 일으킬 수 있다. 

 

-falsy values : 0, null, undefined, '' 

let zeroNumber = 0;
let nullValue = null;
let emptyString = '';
let undefinedVar;

위 값들은 조건문과 같이 논리형을 필요로하는 곳에서 논리형으로 변경되어 반환된다. 

if(!zeroNumber){
       console.log('zeroNumber=false, !zeroNumber=true이므로 실행되는 코드');
    }

 

-truthy values : 0이 아닌 숫자, emptyStr이 아닌 문자열

let zeroNumberStr = '0';
    let boolStr = 'false';
    let spaceStr = ' ';
    let number = 213213;
    let str='이름';

String 값이 '0'이더라도 0이라는 내용과 관계없이 emptyStr이 아니므로 truthy 

 

 

 

 

Object 객체생성 

1. 생성자 함수 

let o1 = new Object();
    o1.data=1;
    o1.data2 = 2;
    o1.cm = function(){};

o1 변수에 객체를 생성하고 o1에 data 변수를 만들어 1을 초기화 해준다. 

자바에서는 객체에 필드가 있어야 값을 초기화할 수 있지만 

자바스크립트에서는 객체의 멤버필드를 동적으로 생성할 수 있기 때문에 

Object를 생성후 data, data2, cm 의 선언이 가능한 것이다.

 

이러한 방식은 같은 객체를 표현할때마다 갖는 프로퍼티가 달라질 수 있다. 

자바의 클래스와 같이 같은 객체는 같은 프로퍼티를 갖게 하기 위해서 사용할 수 있는 방법

 

-학생 객체를 생성해서 반환해주는 function을 작성

function createStudent(id,name,kor,eng,math){
        let studentObject={
        id:id,
        name:name,
        kor:kor,
        eng:eng,
        math:math,
        tot:0,
        avg:0.0,
        calculateTot:function(){this.tot=this.kor+this.eng+this.math},
        calculateAvg:function(){this.avg=this.tot/3},
        toString:function(){
            document.write(this.id+" "+this.name+" "+this.kor+" "+this.eng+" "+this.avg+" "+this.tot+" ");
        }
    };
    return studentObject;
    }

정해진 인자를 받고 정해진 프로퍼티를 갖는 student 객체를 생성해준다. 

 

-Student 생성자 함수 작성

function Student(id,name,kor,eng,math){
        this.id=id;
        this.name=name;
        this.kor=kor;
        this.eng=eng;
        this.math=math;
        this.tot=0;
        this.avg=0.0;
        this.calculateTot=function(){
            this.tot=this.kor+this.eng+this.math;
        };
        this.calculateAvg=function(){
            this.avg=this.tot/3;
        };
        this.toString=function(){
            document.write(this.id+" "+this.name+" "+this.kor+" "+this.eng+" "+this.math+" "+this.tot+" "+this.avg);
        };
    }
Student('xxx','xman',12,23,20);//student는 window에
Student('yyy','yman',14,49,39);//student는 window에 y가x를 덮어버림

생성자 함수를 사용할 때 이런식으로 생성하면 생성된 Student는

window에 등록되고 window에 다시 등록하면 기존의 Student를 덮어버린다. 

let studentObject1 = new Student('xxx','xman',12,23,20);
let studentObject2 = new Student('yyy','yman',14,49,39);

생성자함수의 생성시 new 예약어를 붙여준다. 

new 예약어는 Object객체를 생성해주고 Object객체에 속성을 추가한뒤 객체를 반환해준다. 

이러한 방식도 여전히 각 객체마다 동일한 함수를 가져야한다는 단점이 있다. 

 

-Prototype을 사용한 방식

function Student(id, name, kor, eng, math) {
   
    this.id = id;
    this.name = name;
    this.kor = kor;
    this.eng = eng;
    this.math = math;
    this.tot = 0;
    this.avg = 0.0;

}
Student.prototype = {
    calculateTot: function() {
        this.tot = this.kor + this.eng + this.math;
    },
    calculateAvg: function() {
        this.avg = this.tot / 3;
    },
    toString: function() {
        return "[" + this.id + "]" + this.name + "," + this.kor + "," + this.eng + "," + this.math + "," + this.tot + "," + this.avg;
    }

}
 
new Student('xxx', '김', 23, 56, 78).calculateTot();

Student.prototype에 function들을 정의해준다. 

function을 사용할 땐 student 객체에서 바로 .calculateTot()로 접근해주면 된다.

 

-class를 이용한 방식

class Student{
   
    constructor(id,name,kor,eng,math){
        this.id = id;
        this.name = name;
        this.kor = kor;
        this.eng = eng;
        this.math = math;
        this.tot = 0;
        this.avg = 0.0;
    }
    calculateTot(){
        this.tot = this.kor + this.eng + this.math;
    }
    calculateAvg(){
        this.avg = this.tot / 3;
    }
    toString(){
        return "[" + this.id + "]" + this.name + "," + this.kor + "," + this.eng + "," + this.math + "," + this.tot + "," + this.avg;
    }
   
}

사용법은 이전과 동일하다 

 

-자바의 객체지향을 흉내낸 패키지 개념의 생성자

com={};


com.Student= function(id, name, kor, eng, math) {

    this.id = id;
    this.name = name;
    this.kor = kor;
    this.eng = eng;
    this.math = math;
    this.tot = 0;
    this.avg = 0.0;


}

/************prototype[JSON][case 2]***********/
com.Student.prototype = {
    calculateTot: function() {
        this.tot = this.kor + this.eng + this.math;
    },
    calculateAvg: function() {
        this.avg = this.tot / 3;
    },
    toString: function() {
        return "[" + this.id + "]" + this.name + "," + this.kor + "," + this.eng + "," + this.math + "," + this.tot + "," + this.avg;
    }

}

com이라는 객체를 생성하고 

com 객체안에 Student 생성자를 만든다. 

new com.Student('j','j',1,2,3)

생성할때도 com 객체를 붙여주어야 하고 

student 객체에 접근할 때도 com을 통해 접근해야한다.

 

 

2. JSON 방식 

let o2 = {
        data:1,
        data2:2,
        cm: function(){}
    }; //json

JSON표기법으로 객체를 생성할 수 있다 

{

    변수 : 값,

    함수명 : 함수

}

 

Array 배열

1.Array객체 생성

let array1 = new Array();
    array1.a = 1;

Array() 객체를 생성하면 Array 객체의 function들을 사용할 수 있다.

2.JSON 방식 

let scoreArray=[34,56,78,90,100];

Object객체는 {...}로 

Array 객체는 [...]로 표기한다.

 

객체를 담은 배열은  [ {...}, {...}, ...];

let studentArr = [
    {
        no:1,
        name:"KIM",
        score:34
    },
    {
        no:2,
        name:"LEE",
        score:56
    }
    ];

 

객체를 상수로 생성하는 경우

const studentObject1={
        id:'xxx',
        name:'sim',
        kor:47,
        eng:89,
        math:99,
        tot:0,
        avg:0.0,
        calculateTot:function(){this.tot=this.kor+this.eng+this.math},
        calculateAvg:function(){this.avg=this.tot/3},
        toString:function(){
            document.write(this.id+" "+this.name+" "+this.kor+" "+this.eng+" "+this.avg+" "+this.tot+" ");
        }
    };

const는 상수이기 때문에 변경이 불가능하다.

여기서 상수는 studentObject1의 참조변수이지 studentObject1의 프로퍼티가 아니다. 

즉 id, name, kor, ...등은 얼마든지 변경 가능하다.

studentObject1=studentObject2; 실행결과

studentObject1은 상수이기 때문에 studentObject2로 변경이 불가능하다. 

studentObject1.id='zzz'; 실행결과

반면, studentObject1.id는 상수가 아니기 때문에 변경이 가능하다.

 

 

함수 

자바스크립트에선 함수를 인자로 받고, 변수에 대입하거나 반환하는 것이 가능하다.

function func4(functionArg,funcArg){
       let funcLet =  functionArg();
       return funcArg();
    }
 
func4(
            function(){
                ...
            },
            function(){
                ...
            }
        );

 

 

함수 선언 방법

 

이름이 존재하는 선언적 함수 선언

1. function name(param){...code...}

 

익명함수 선언 

2. function (param){...code...}

function (msg){
           ...
        };

3. (param) => {...code...}

(msg)=>{
           ...
        }

4. param => {...code...}

msg=>{
           ...
            }

익명함수의 선언과 실행

(function(){
        document.write('익명함수가 실행<br>');
    })();

(function(){...}) (); 

익명함수를 선언하고 바로 (); 실행할 수 있다. 

 

파라메터가 존재하지 않을 수 있고, 다수의 파라메터를 받을 수도 있다. 

파라메터는 변수나 함수를 받을 수 있다. 표준자바스크립트 함수 (alert, confirm...)도 파라메터로 쓸 수 있다.

var alertVar = window.alert;
    var confirmVar = confirm;

 

Closure 클로져

내부함수가 참조하는 외부함의 지역변수가 외부함수에 의해 내부함수가 반환된 이후에도 환경이 유지되는 것

 

function outer_function2(){
            let outer2_var="outer2 로컬변수데이터";
            return function(){
                let inner2_var="inner2 로컬변수데이터";
                document.write("익명 inner_function2--> outer2_var:"+outer2_var+"<br>");
                document.write("익명 inner_function2--> inner2_var:"+inner2_var+"<br>");
            };
    }
 
let return_inner_function2=outer_function2();
        return_inner_function2();
실행결과

//실행결과

//outer_function2() 실행이 끝나고 inner_function2를 반환받아서 실행하면 outer_function2의 변수와 inner_function2의 변수를 모두 사용할 수 있다.

 

 

 

 

DOM객체 찾기

-document.getElementById();

돔트리 전체에서 Id로 검색

 

-pE.getElementById();

pE노드의 하위 노드중에서 Id로 검색

 

 

DOM객체의 동적 생성

document.createElement("tagName");

let newDivE =document.createElement("div");
    newDivE.setAttribute("id","newDiv"+count);
    newDivE.setAttribute("style",`border: 1px dotted gold`);

태그 네임을 받아 원하는 객체를 생성할 수 있다. 

생성된 객체에 setAttribute("attribute","value"); function으로 객체에 속성을 설정할 수 있다.

 

document.createTextNode(textMsgStr);

   let newTextNode=document.createTextNode('textMessage');

텍스트 노드는 html의 텍스트 컨텐츠이다. 

 

parentElement.appendChild(childElement);

 let parentDivE = document.getElementById("parent");
 parentDivE.appendChild(newDivE);
newDivE.appendChild(newTextNode);

P.appendChild(C); 는 P부모객체의 마지막 자식 노드에 C자식 객체를 붙여준다.

순서에 유의해야한다. 

.insertBefore(추가할 노드, 기준노드) 메서드를 사용하면 위치를 어느정도 능동적으로 조정할 수 있다.

기준노드의 앞에 추가할 노드를 추가한다.

 

parentElement.removeChild(childElement);

parentDivE.removeChild(removeDivE);

P객체의 자식객체를 삭제한다.

 

 

'Javascript' 카테고리의 다른 글

JQuery 이해하기  (0) 2023.09.22
Javascript defer  (0) 2023.09.21
CSS 선택자를 이용한 HTML DOM 객체 Handling  (0) 2023.09.18
Javascript Event  (0) 2023.09.17
Javascript Basic  (5) 2023.09.15
728x90

주어진 수까지의 정수 중 소수의 개수 반환

 

public int solution(int n) {

int answer = (n>=2)? 1: 0;

for(int i=3; i<=n;i+=2){

if(isPrime(i)){

answer++;

}

}

return answer;

}

public boolean isPrime(int n){

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

if(n%i==0){

return false;

}

}

return true;

}

n이 2일땐 소수는 2 자신을 갖고 1이하는 답은 0 이다.

소수를 찾을 때 3부터 찾고

효율성을 위해 소수인지 확인할 때는 i^2이 해당 수까지만 계산한다.

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

공원 산책 문제풀이  (0) 2023.09.24
신고 결과 받기 문제풀이  (0) 2023.09.23
소인수분해 문제풀이  (0) 2023.09.18
치킨 쿠폰 문제풀이  (0) 2023.09.17
유한소수 판별하기 문제풀이  (0) 2023.09.17
728x90

주어진 수의 소인수를 오름차순 정렬하여 반환

 

public int[] solution(int n) {

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

for (int i = 2; i <= n; i++) {

while(n%i==0) {

n/=i;

set.add(i);

}

}

int[] a = new int[set.size()];

Iterator<Integer> it = set.iterator();

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

a[i]=it.next();

}

Arrays.sort(a);

return a;

}

2부터 n까지 수를 나누는데 

한번 나눌때 나눠질때까지 계속 나눠야 소인수만 구해진다 그렇지 않으면 소인수의 배수들이 걸러지지 않는다. 

나눌때마다 i를 set에 넣기 때문에 set은 중복을 거르는 Set으로 하였다. 

Set은 순서가 없기 때문에 오름차순 정렬을 위해 배열로 변경하였다.

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

신고 결과 받기 문제풀이  (0) 2023.09.23
소수찾기 문제풀이  (0) 2023.09.18
치킨 쿠폰 문제풀이  (0) 2023.09.17
유한소수 판별하기 문제풀이  (0) 2023.09.17
저주의 숫자 3 문제풀이  (0) 2023.09.17
728x90

치킨 10마리면 1마리 서비스 

주어진 주문 횟수로 서비스 치킨을 얼마나 더 시킬 수 있는지 반환 

public int solution(int chicken) {

int answer = 0;

int coupon = chicken;

answer = R(coupon,answer);

return answer;

}

private int R(int coupon, int answer) {

int chicken = coupon/10;

answer+=chicken;

coupon-=chicken*10;

coupon+=chicken;

if(coupon>=10) {

return R(coupon,answer);

}

return answer;

}

재귀함수를 이용하여 시킨 치킨 수를 모두 쿠폰으로 반환하고 쿠폰 10번이면 answer를 증가시키고 coupon을 감소시키고  동시에 쿠폰도 증가시켰다. 

쿠폰이 10보다 작아질때까지 계속했다. 

 

다른 풀이 보는데 그냥 while문으로 쉽게 푼듯하다..

재귀함수도 어차피 반복문으로 풀 수 있는데 재귀함수 배우고 나서 이런문제는 재귀함수로 접근해야한다는 강박이 생긴것 같다...

public int solution2(int chicken) {

int coupon = chicken;

int answer = 0;

while (coupon >= 10) {

answer += coupon / 10;

coupon = coupon % 10 + coupon / 10;

}

return answer;

}

아래 코드는 아예 계산을 해서 답을 구했다.

public int solution3(int chicken) {

int answer = chicken/9;

if(chicken>1&&chicken%9==0){

answer--;

}

return answer;

}

10번 시키고 난 후부터는 9번만 시키면 1번을 서비스로 먹을 수 있다. 

9번 시켰을 떄는 최초 10번에 달성하지 못해 치킨을 9로 나는 값이 답이 아니라 -1 해줘야 한다. 

반면 10번 시켰을 땐 answer=1이 맞고 

18번 시켰을 때도 한번이 부족해서 시키지 못하기 때문에  answer-1해줘야한다. 

19번 시켰을땐 answer=2가 맞다.

즉 9의 배수일때는 answer에서 하나 빼줘야 한다. 

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

소수찾기 문제풀이  (0) 2023.09.18
소인수분해 문제풀이  (0) 2023.09.18
유한소수 판별하기 문제풀이  (0) 2023.09.17
저주의 숫자 3 문제풀이  (0) 2023.09.17
문자열 밀기 문제풀이  (0) 2023.09.17
728x90

유한소수인지 판별하여 맞으면 1 틀리면 2 반환 

유한소수이기 위한 조건 :  기약분수일 때 분모의 소인수는 2, 5만 존재해야한다.

public int solution(int a, int b) {

int answer = 0;

while(b%2==0||b%5==0){

if(b%2==0){

b/=2;

}

if(b%5==0){

b/=5;

}

}

return (a%b==0)? 1:2;

}

b(분모)가 기약분수일 때 2와 5만 남는다는 건 a(분자)의 소인수 중 분모의 소인수와 겹치는 수가 약분되고 남는 수가 2와 5

> b에서 2와 5로 나누어떨어질때까지 계속 나누고 남은 수는 A를 나누었을때 나누어 떨어져야 한다. 

 

 

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

소인수분해 문제풀이  (0) 2023.09.18
치킨 쿠폰 문제풀이  (0) 2023.09.17
저주의 숫자 3 문제풀이  (0) 2023.09.17
문자열 밀기 문제풀이  (0) 2023.09.17
다항식 더하기 문제풀이  (0) 2023.09.17

+ Recent posts