'전체 글'에 해당되는 글 384건

  1. 2020.02.06 전자정부프레임워크
  2. 2020.01.21 호이스팅(Hoisting)
  3. 2020.01.21 Margin vs. Padding
  4. 2020.01.21 코딩을 잘하는 사람들의 특징
  5. 2020.01.12 JSON
  6. 2020.01.12 변수 선언 방법
  7. 2020.01.10 코딩도장 Lv.2
  8. 2020.01.09 코딩도장 Lv.1
  9. 2020.01.08 Server에서 Tomcat 클린하기
  10. 2020.01.03 DB모델링 - Entity, Attribute, Identifier, Relation

전자정부프레임워크

|

MyBatis 예제 안에서 사용된 설정파일의 주요내용 출처 : http://micropilot.tistory.com/2780

WEB-INF/

  └ web.xml ( WEB-INF/ )

       - 일반 스프링 프로젝트와 동일

       - 스프링 설정파일 2개의 xml (contextConfigLocation과 서블릿 컨텍스트 파일)의 경로 지정

       - contextConfigLocation: classpath*:META-INF/spring/context-*.xml

       - 서블릿 컨텍스트 파일 : /WEB-INF/spring/dispatcher-*.xml

 

WEB-INF/spring/

  └ dispatcher-servlet.xml ( /WEB-INF/spring/ )

       - 일반 스프링 프로젝트와 동일

       - Pagination 기능을 위한 2개의 빈 설정

       - PaginationManager, imageRender

 

META-INF/spring/

  └ context-common.xml ( META-INF/spring/ )

       - db.properties 경로 지정

 

  └ context-datasource.xml ( META-INF/spring/ )

       - dataSource 빈 설정 ( ddl.sql, dml.sql 경로 지정 )

       - jdbc dataSource, 아파치 dbcp dataSource 중에서 한 가지를 선택하여 설정

 

  └ context-idgen.xml ( META-INF/spring/ )

       - 자동증가필드에 값을 삽입할 때 사용될 아이디 생성 빈 등록

       - 사원번호, 부서번호를 새로 삽입할 때 등록된 빈을 코드에서 사용함

 

  └ context-mybatis.xml ( META-INF/spring/ )

       - sqlSession 빈 설정 (속성으로 dataSource 참조, sql-myabtis-config.xml 경로참조, mappers/*.xml 경로참조)

       - @Mapper("deptMapper")으로 선언된 인터페이스 경로(패키지) 지정 -> DI을 이용하여 코드에서 인스턴스 사용가능

 

  └ context-properties.xml  ( /WEB-INF/spring/ )

       - propertiesService 빈( EgovPropertyServiceImpl) 등록 (pageUnit, pageSize 정보 설정)

 

META-INF/sqlmap/mappers/

  └ employee.xml      ( employee 테이블 SQL 문장 )

  └ department.xml    ( department 테이블 SQL 문장 )

 

META-INF/sqlmap/config/

  └ sql-mybatis-config.xml ( META-INF/sqlmap/config/ )

       - EmpVO, DeptVO, SearchVO 에 대한 각 alias 선언

 

META-INF/property/

  └ db.properties ( META-INF/property/ )

       - driver, url, username, password 등

 

META-INF/db/

  └ ddl.sql ( META-INF/db/ ) : 예제에 사용될 테이블을 생성하는 create table ~ 문장

       - IDS, EMPLOYEE, DEPARTMENT 테이블 생성 

       - IDS 테이블은 각 테이블의 다음 id (숫자)가 저장됨, 즉 한 행이 추가될 때마다 다음에 추가될 행의 id(숫자)를 저장해두는 역할을 함

 

  └ dml.sql ( META-INF/db/ ) : 예제로 사용될 테이블에 샘플 데이터 입력

       - IDS, EMPLOYEE, DEPARTMENT 테이블에 샘플 레코드 입력



출처: https://ddo-o.tistory.com/125 [공순이의 블로그]

 

[ SPRING ] 전자정부프레임워크 Mybatis연동하기

전자정부 프레임워크 & Mybatis 연동하기 전자정부 프레임워크? 등장배경 및 목적 개발프레임워크는 정보시스템 개발을 위해 필요한 기능 및 아키텍처를 미리 만들어 제공함으로써 효율적인 어플리케이션 구축을..

ddo-o.tistory.com

 

 

ServiceImpl 에서 주석 해제, 처리도 필요

ibatis 사용시 -> SampleDAO, sample/EgovSample_Sample_SQL.xml, sql-map-config.xml 사용

mybatis 사용시 -> SampleMapper, mappers/EgovSample_Sample_SQL.xml, sql-mapper-config.xml 사용

'DevTools' 카테고리의 다른 글

UML - 관련 정리  (0) 2020.03.30
Tomcat 프로세스 강제종료  (0) 2020.03.19
Server에서 Tomcat 클린하기  (0) 2020.01.08
Maven 설치, Jenkins 설치  (0) 2019.10.14
DB 개발환경 구축  (0) 2019.08.31
And

호이스팅(Hoisting)

|

자바스크립트의 변수는 다른 언어들과 조금 다르게 동작합니다. 이는 때때로 개발자로 하여금 의도하지 않은 결과를 발생시키기도 합니다.

es2015 이후로 let이나 const를 사용하여 예방할 수 있지만 Closure같은 문법들의 효용성을 이해하기 위해서 고전 자바스크립트가 가졌던 특징을 다지고 가는것이 좋겠습니다.

 

var 변수의 의도치 않은 현상   

if(true){
  var name = 'yuddomack';
}
console.log(name);

--------------------------

for(var i=0; i<5; i++){
  // do something
}
console.log(i);

일반적인 프로그래밍 언어에서 변수는 블록 스코프{ } 안에서 유효하기 때문에, 블록이 종료된 시점에서 console.log를 호출하면 정상적으로 동작하지 않을거라고 생각됩니다.

 

하지만 'yuddomack'과 '5'가 콘솔에 출력되는 것을 볼 수 있습니다.

 

이러한 현상은 var 변수가 호이스팅 되기 때문에 발생합니다.

 

 

호이스팅(Hoisting)  

 

호이스팅은 var을 통해 정의된 변수의 선언문을 유효 범위의 최상단으로 끌어올리는 행위를 말합니다.

'선언과 할당의 분리'라고 생각하면 기억하기 좋을 것 같습니다.

<개발자가 작성한 코드>

if(true){
  var name = 'yuddomack';
}
console.log(name);


위 코드는 호이스팅에 의해 아래와 같은 모양으로 바뀌게 됩니다.

<호이스팅으로 변환된 코드>
var name; // 선언
if(true){
  name = 'yuddomack'; // 할당
}
console.log(name);

var name = 'yuddomack'이라고 정의한 변수가 실제로는 선언(var name)과 할당(name = 'yuddomack')이 분리되는 것 입니다.

때문에 여전히 name이라는 변수를 사용할 수 있는 것 입니다.

 

 

var의 유효범위  

 

호이스팅 시 선언문은 유효 범위의 최상단으로 올라간다고 했습니다.

자바스크립트의 var는 단순한 블록{ }이 아닌 함수 블록function{ } 안에서 유효합니다. 이를 var는 함수 스코프에서 유효하다 라고 합니다.

<개발자가 작성한 코드>
function ho1(){
  if(true){
    var name = 'yuddomack';
  }
  console.log(name);
}

function ho2(){
  for(var i=0; i<5; i++){
    // do something
  }
  console.log(i);
}

if(true){
  var score = 100;
}
console.log(score);


위 코드는 호이스팅에 의해 아래와 같은 모양으로 바뀌게 됩니다.

<호이스팅으로 변환된 코드>
var score; // 선언

function ho1(){
  var name; // 선언

  if(true){
    name = 'yuddomack'; // 할당
  }
  console.log(name);
}

function ho2(){
  var i; // 선언

  for(i=0; i<5; i++){ // 할당
    // do something
  }
  console.log(i);
}

if(true){
  score = 100; // 할당
}
console.log(score);

 

var는 함수 스코프에서 유효하기 때문에 호이스팅 시, 선언문은 글로벌 스코프가 아닌 유효범위(함수) 내부의 최상단에 위치하게 됩니다.

글로벌 스코프 또한 하나의 함수 스코프 처럼 동작하기 때문에 호이스팅이 일어납니다.

 

함수 호이스팅  

 

함수의 선언 역시 호이스팅의 대상입니다. 때문에 스코프 내에서 어떤 위치에서 함수 선언을 하든지 호출할 수 있습니다.

<개발자가 작성한 코드>
sayName();

function sayName(){
  console.log('yuddomack');
}

<호이스팅으로 변환된 코드>
function sayName(){
  console.log('yuddomack');
}

sayName();

함수 선언 역시 최상단으로 끌어올려지기 때문에 sayName()을 먼저 호출하고 함수 정의를 이후에 하여도 정상적으로 동작하게 됩니다.

그렇다면 아래의 경우는 어떨까요?

<개발자가 작성한 코드>
sayName();

var sayName = function(){
  console.log('yuddomack');
}

선언 방식이 약간 다르지만, 두 방식 모두 함수를 선언한 것 입니다.

function sayName(){}는 함수 선언식, var sayName = function(){}은 함수 표현식 이라고 합니다.

 

글을 계속 읽기 전에 잠시만 결과를 예상해 보실까요?

 

어떤 결과를 예상하셨을지 모르겠지만 에러가 발생하게 됩니다.

<호이스팅으로 변환된 코드>
var sayName;

sayName();

sayName = function(){
  console.log('yuddomack');
}

var sayName은 변수이기 때문이죠. 그렇기에 '선언과 할당'의 분리가 발생합니다. 

순서를 보자면 sayName이 선언되고 sayName()이 호출되지만 거기엔 아무것도 없습니다. 그 이후에 sayName에 함수가 정의되는 것이지요.

 

 

함수, 변수 우선순위   

 

지금까지 var 변수, 함수 선언식을 사용한 함수의 선언부가 유효범위의 최상단으로 호이스팅 된다는 것을 알아봤습니다.

그렇다면 호이스팅에서 변수가 우선일까요? 함수가 우선일까요?

 

변수 '할당'이 함수 선언보다 우선 순위이고, 함수 선언이 변수 선언보다 우선 순위입니다.

함수 선언문과 변수 할당문이 존재할경우, 변수 a선언 -> 함수 a선언 -> a에 값할당 순으로 실행되겠습니다.

<사용자가 작성한 코드>
var myName = "hi";

function myName() {
  console.log("yuddomack");
}
function yourName() {
  console.log("everyone");
}

var yourName = "bye";

console.log(typeof myName);
console.log(typeof yourName);

/**
*위 코드에서 콘솔에는 "function" 혹은 "string"이 나오게됩니다.
*결과가 어떨지 예상되시나요?
**/

<호이스팅으로 변환된 코드>
var myName;
var yourName;
function myName() {
  console.log("yuddomack");
}
function yourName() {
  console.log("everyone");
}

myName = "hi";
yourName = "bye";

console.log(typeof myName);
console.log(typeof yourName);

결과는 둘 다 "string"을 출력합니다.

 

호이스팅이 일어나면 실질적으로 위와 같은 순서로 실행되기 때문입니다.

변수가 선언되고, 함수가 할당되지만 다시 String 값이 들어가게 됩니다.

'JavaScript' 카테고리의 다른 글

Function, Method, Property 의 차이 및 정의  (0) 2020.03.25
객체 얕은 복사(shallow copy)와 깊은 복사(deep copy)  (0) 2020.03.18
JSON  (0) 2020.01.12
변수 선언 방법  (0) 2020.01.12
정규표현식의 개념과 기초 문법  (4) 2019.09.18
And

Margin vs. Padding

|

And

코딩을 잘하는 사람들의 특징

|

세상에는 코딩을 잘하는 사람들이 참 많다. 그중에서는 얼마 배우지도 않았는데 이해력이 남들보다 훨씬 빠른 사람들, 흔히들 코딩에 재능이 있다고 하는 사람들도 있다. 나는 코딩을 잘하고 싶어 하는 사람 중 한 명이었으나 아쉽게도 재능이 있는 사람은 아니었다. 코딩을 잘하는 사람들이 무척 부러웠다. 그래서 그들을 관찰하고 따라 해보려 노력하고 있다. 오늘은 내가 지금까지 그들을 관찰하며 느꼈던 코딩을 잘하는 방법에 대해 이야기해보려 한다.

 

 

혼자서 해결하는 능력

프로그래밍이란 끊임없이 오류와 마주치고 그 오류를 해결하는 과정의 연속이다. 이 오류들을 혼자서 해결할 수 있느냐 없느냐에서 실력이 갈린다. 가끔 『모르면 물어봐야지』라는 생각을 가진 개발자들이 있다. 나는 이 생각에는 동의하지 않는다. 이러한 생각은 사람을 의존적으로 만들어 문제를 스스로 해결할 수 있는 능력의 발전을 막기 때문이다. 영화를 제대로 보려면 중간중간 스킵 하지 않고 처음부터 끝까지 다 보아야 한다. 중간중간 내용이 영화의 결말을 이해하는데 중요한 단서가 되기 때문이다. 코딩도 그렇다. 중간중간 문제 해결을 위해 여러 가지 방법을 시도하는 것 자체가 자신의 실력의 밑거름이 된다. 또 기어코 그 문제를 해결했을 때 얻는 깨달음도 더욱 크고 기억에도 오래 남는다. 문제 해결을 위한 여러 가지 시도 없이 능력 있는 사람들에게 도움부터 받는다면 영화를 처음부터 보지 않고 결말만 보는 것과 같다. 이렇게 되면 왜 이런 현상이 발생되었고 어떻게 해결했는지 잘 설명을 해준다 한들 와닿지도 않을뿐더러 설명을 들어도 제대로 이해하지 못한다. 결국에는 또 다른 문제가 생겼을 때 또다시 도움을 요청해야 하는 악순환에 빠지게 된다. 의존적인 사람은 결코 좋은 개발자가 될 수 없다.

 

스스로 하는 습관

코딩에 재능이 있는 사람들은 뭐든지 스스로 해결하려고 노력하는 습관을 가진 사람들이다. 그들은 일상에서마저 스스로 하는 습관을 가지고 있다. 그것이 어떤 것이든, 사소한 것 하나라도 혼자서 문제 해결을 위해 탐구한다. 컴퓨터가 고장 나더라도 AS 센터에 맡기기보다는 혼자 고쳐보려고 애를 쓴다. 이렇게 스스로 하는 습관이 쌓여 뭐든지 잘하는 사람을 만든다. 스스로 하는 습관을 가진 사람들은 뭐든지 빨리 배운다. 빨리 배운다는 것은 개발자의 역량을 판별하는데 매우 중요한 요소이다.

 

빨리 배우는 능력

하루하루 다이내믹하게 바뀌는 IT업계에서 빨리 배운다는 것은 매우 큰 의미가 있다. 기업에서도 점점 잘하는 사람보다 빨리 배울 수 있는 사람을 선호하는 추세이다. 최근 취업시장에서 알고리즘 능력이 중요도가 높아지는 이유가 여기에 있다. 종종 여기저기 움직이며 신기술을 배우는 개발자들이 있다. 마치 그 신기술을 알아야만 더 좋은 개발자가 될 것이라 생각한다. 하지만 나는 이것이 비효율적인 공부 방법이라고 생각한다. 하루하루 수많은 신기술이 쏟아져 나오는 IT 업계에서 그 신기술 중에 훗날 어떤 것이 살아남을지 알 수 없으며 사람은 망각의 동물이라 신기술을 배웠다 한들 써먹을 곳이 없으면 빠르게 머릿속에서 잊어버리게 되기 때문이다. 우리는 신기술이 필요로 할 때 필요한 것만 빠르게 습득할 수 있는 빨리 배우는 사람이 되어야 한다.

 

많이 해보는 것

코딩은 학문이 아니라 기술이다. 학문은 책으로 공부하는 것이지만 기술은 직접 해보고 배워야 한다. 코딩을 수영에 비유할 수 있을 것 같다. 수영은 책으로만 배워서는 결코 실력이 늘 수 없다. 수영장에 가서 팔도 저어보고 다리도 저어보고 해야 실력이는다. 코딩도 마찬가지다. 코딩 실력을 늘리고 싶다면 코드를 계속 짜봐야 한다. 수영실력이 물에 뜨는 원리를 깨닫는 순간 실력이 급격히 느는 것처럼 코딩도 특정 원리만 깨닫게 되면 실력이 부쩍는다. 코딩을 잘하려면 많이 해보아야 한다.

 

경험이 많은 사람

코딩을 많이 하면 경험이 쌓인다. 직장인이 되고 가장 밑에서 선배들을 보는 순간 확실히 느낀다. 경력이 올라갈수록 실력도 정비례한다는 것을 말이다. 개발자에 있어 경험은 매우 중요하다. 나 역시 누군가 나에게 이 기능이 되는지, 이 방법이 되는지 물어볼 때면 내 경험에 기인하여 대답한다. 내가 해본 적이 있다면 그것은 되는 것이고 아니라면 확신 없는 대답을 할 수밖에 없다. 경험은 판단의 확실한 근거가 된다. 우리는 다양한 경험을 해보아야 한다. 개발자들의 이직이 필요한 이유도 여기에 있다. 다양한 경험이 필요한 개발자의 인생에 있어 이직이란 새로운 경험을 해볼 수 있는 기회가 될 수 있기 때문이다. 새로운 경험을 할 기회가 있다면 어릴수록 좋다. 우리의 두뇌도 나이를 먹는다. 어릴 적 배우는 영어와 지금 배우는 영어의 배우는 속도가 차이나듯 나이 든 사람이 새로운 경험을 하는 것과 젊은 사람이 새로운 경험을 하는 것은 배움의 효율이 다르기 때문이다.

 

출처 : https://coding-factory.tistory.com/464

'etc' 카테고리의 다른 글

끄적3  (0) 2020.10.28
끄적2  (0) 2020.10.15
고쳐야할것, 실수 끄적여놓은 것들  (0) 2020.06.23
경로 표기법  (0) 2020.04.17
트러블 슈팅이란?  (0) 2020.04.07
And

JSON

|

JavaScript Object Notation

  • "네트워크를 통해 데이터를 주고받는 데 자주 사용되는 경량의 데이터 형식"
  • Javascript에서 객체를 만들 때 사용하는 표현식을 의미한다.
  • JSON 표현식은 사람과 기계 모두 이해하기 쉬우며 용량이 작아서, 최근에는 JSON이 XML을 대체해서 데이터 전송 등에 많이 사용한다.
  • 특정 언어에 종속되지 않으며, 대부분의 프로그래밍 언어에서 JSON 포맷의 데이터를 핸들링 할 수 있는 라이브러리를 제공한다.

1. name - value 형태의 쌍

  • name인 애들은 무조건 String이기때문에 반드시 큰따옴표로 묶어줘야한답니다. 
  • 여러 가지 언들에서 object, hashtable, struct로 실현되었다.
  • { String key : String Value}
 { // 중괄호 -> 객체(Object)가 나올거야! 

    "이름": "테스트",

    "나이": 25,

    "성별": "여",

    "주소": "서울특별시 양천구 목동",

    "특기": ["농구", "도술"], // 배열 -> string, 배열, 객체 여도 상관 x

    "가족관계": {"#": 2, "아버지": "홍판서", "어머니": "춘섬"},

    "회사": "경기 수원시 팔달구 우만동"

 }



2. 값들의 순서화된 리스트 형식

  • 여러 가지 언어들에서 배열(Array), 리스트(List)로 실현되었다.
  • [ value1, value2, ….. ]
{
  "firstName": "Kwon",
  "lastName": "YoungJae",
  "email": "kyoje11@gmail.com",
  "hobby": ["puzzles","swimming"]
}

3. @ResponseBody를 사용하여 JSON형태로 응답하기

  • Controller를 통해 View로 넘어가지 않고 데이터(JSON OR XML)를 넘겨 줄 수 있다.
  • Spring 3.1에서부터 을 사용하면 HttpMessageConverter가 자동으로 등록된다.
  • @ResponseBody : Return 값은 View를 통해서 출력되는 것이 아니라 HTTP Response Body에 직접쓰여진다.

  • annotation-driven 활성화 하기
<mvc:annotation-driven></mvc:annotation-driven>
  • RestfulController의 getUserList 코드
@RequestMapping(value = "/users", method = RequestMethod.GET)
@ResponseBody
public Map getUserList(){
  List<Offer> userList = offersService.getCurrent(); // DB에 등록된 User List를 받아온다.
  Map result = new HashMap();

  result.put("result",Boolean.TRUE);
  result.put("data",userList);

  return result;
}

4. 주의사항

  • JSON은 순수히 데이터 포맷입니다. 오직 프로퍼티만 담을 수 있습니다. 메서드는 담을 수 없습니다.
  • JSON은 문자열과 프로퍼티의 이름 작성시 큰 따옴표만을 사용해야 합니다. 작은 따옴표는 사용불가합니다.
  • 콤마나 콜론을 잘못 배치하는 사소한 실수로 인해 JSON파일이 잘못되어 작동하지 않을 수 있습니다. JSONLint같은 어플리케이션을 사용해 JSON 유효성 검사를 할 수 있습니다.
  • JSON은 JSON내부에 포함할 수 있는 모든 형태의 데이터 타입을 취할 수 있습니다. 즉, 배열이나 오브젝트 외에도 단일 문자열이나 숫자또한 유효한 JSON 오브젝트가 됩니다.
  • 자바스크립트에서 오브젝트 프로퍼티가 따옴표로 묶이지 않을 수도 있는 것과는 달리, JSON에서는 따옴표로 묶인 문자열만이 프로퍼티로 사용될 수 있습니다.

5. 중요 메소드

JSON.parse()

인자로 전달된 문사열을 자바스크립트의 데이터로 변환한다.

JSON.stringify()

인자로 전달된 자바스크립트의 데이터를 문자열로 변환한다.

 

상단은 JSON 형식 / 하단은 stringfy 한 형식

 

6. JSON이 필요한 이유

'JavaScript' 카테고리의 다른 글

객체 얕은 복사(shallow copy)와 깊은 복사(deep copy)  (0) 2020.03.18
호이스팅(Hoisting)  (0) 2020.01.21
변수 선언 방법  (0) 2020.01.12
정규표현식의 개념과 기초 문법  (4) 2019.09.18
innerHTML과 outerHTML 차이  (0) 2019.09.18
And

변수 선언 방법

|

'모든 변수는 함수의 맨 위에 선언해라'

(function () {
    var subjects = ["1st subject", "2nd subject", "3rd subject"],  
        el, i,
        xhr = null;    // 해당 scope에 해당하는 function의 위에 정리해서 작성
    for (i = 0 ; i < 3 ; i++) {
        el = document.getElementById("subject" + i);
        el.innerHTML = el.value = subjects[i];
        el.addEventListener("click", function () {
            alert(this.value + " pressed!");
        });
    };

    xhr = new XMLHttpRequest();
    xhr.open("GET", "http://unikys.tistory.com/list/");
    xhr.onload = function () {
        var contents = JSON.parse(xhr.responseText), 
            i, el;    // 해당 scope에 해당하는 function의 위에 정리해서 작성
        for (i = 0 ; i < 3 ; i++) {
            el = document.getElementById("content" + i);
            el.innerHTML = "contents";
        };
    };
    xhr.send();
}());

 

1. 초기화 실수 최소화

상단에 모든 변수를 나열하고 필요한 변수들에 대하여 초기화 체크를 할 수 있다는 점이다. 이는 일단 변수를 정의했다면 null이나 0 등과 같은 기본값으로 설정을 해주고, 해당하는 변수가 생성되었는지 아닌지를 먼저 체크하는 것이 검증(validation) 로직을 수행하는데 있어서 조금 더 확실한 정보를 얻을 수 있기 때문이기도 하다.


2. 해당 scope에서 사용하는 변수에 대한 관리 용이

위의 초기화를 관리하는 것 또한 이 범주와 비슷하기도 하고, 이전 글에서 살펴봤듯이, 자바스크립트는 '선언을 안했다고 해서 에러를 내지 않기 때문에' 어떠한 변수를 선언했는지 관리하는 것이 매우 중요하다. 위의 AJAX를 사용하는 예제를 살펴보면, 외부에서 사용하는 i와 el이 있고, xhr 내부에서 사용하는 i와 el이 있다. 이러한 일반적으로 같은 이름을 가질 수 있는 변수를 사용할 때, 어느 scope에 딸려 있는 i, el 변수인지, 파악할 때 이렇게 변수들을 정리해두면 유용하게 체크할 수 있을 것이다. 게다가 추가적으로 특정 'scope'가 생성될 때 그 위치에 현재 scope에서 사용되고 있는 변수명들을 쭉 나열하고 초기화 값들만 봐도 현재 scope에서 어떠한 작업을 할 것인지 대충 파악 하는 것 또한 가능하다.

3. minification의 최적화

소스의 사이즈를 줄여서 사용자가 다운로드 받아야 하는 양을 최소화 시키는 프로세스이다.

출처: https://unikys.tistory.com/329 [All-round programmer]

 

'JavaScript' 카테고리의 다른 글

호이스팅(Hoisting)  (0) 2020.01.21
JSON  (0) 2020.01.12
정규표현식의 개념과 기초 문법  (4) 2019.09.18
innerHTML과 outerHTML 차이  (0) 2019.09.18
자바스크립트에서 replace를 replaceAll 처럼 사용하기  (0) 2019.09.18
And

코딩도장 Lv.2

|
문제는 다음과 같다:

6 6 ( 입력 값 )

  0   1   2   3   4   5
 19  20  21  22  23   6
 18  31  32  33  24   7
 17  30  35  34  25   8
 16  29  28  27  26   9
 15  14  13  12  11  10
 
위처럼 6 6이라는 입력을 주면 6 X 6 매트릭스에 나선형 회전을 한 값을 출력해야 한다.

// javaScript 풀이
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<!DOCTYPE html>
<html lang="ko">

<head>
    <script>
        function solution() {
            var m, n; // 배열의 크기
            var k = 0; // 출력 값
            var flag = 1; // 회전 값

            var m = parseInt(prompt('첫번째 숫자를 입력 하세요.'));
            console.log("첫번째 입력값 : " + m);
            var n = parseInt(prompt('두번째 숫자를 입력 하세요.'));
            console.log("두번째 입력값 : " + n);
            var answer = new Array(); // 출력값이 들어갈 배열

            for(var i=0; i<m; i++){
                answer[i] = new Array();
                for(var j=0; j<n; j++){
                    answer[i][j] = k;
                    k++;
                }
            }
            // 배열을 출력
            for(var i=0; i<answer.length; i++){
                document.write('<br/>')
                for(j=0; j<answer[i].length; j++){
                    document.write(answer[i][j] + ", ");
                }
            }
        }
    </script>
</head>

<body>
    <input type="button" value="알고리즘 부시기" onClick="solution()">
</body>


</html>

// JAVA 풀이
import java.util.Scanner;

public class go {

    public static void main(String args[]) {

        Scanner sc = new Scanner(System.in);
        System.out.print("숫자를 입력하세요  ex) 6 6 : ");
        int num1 = sc.nextInt();
        int num2 = sc.nextInt();

        spiralArray(num1, num2);

    }

    public static void spiralArray(int x, int y) {

        int[][] copy = new int[x][y]; 
        int count = 0;      // 0  ~  x*y-1 값
        int flag = 0;       // 진행방향
        int i = 0, j = 0;   

        while (true) {
            switch (flag) {                         //  진행방향    -> 
            case 0:                                 //  방에 값을 넣고 1 증가 시킴
                copy[i][j++] = count++;             //  다음 방향으로 한칸 이동
                if (j == y || copy[i][j] != 0) {    //  이동한 방에 값이 있거나 방이 없으면
                    j--;                            //  이전 방으로 돌아온다
                    i++;                            //  다음 진행할 방향으로 한칸이동
                    flag = 1;                       //  진행방향 설정
                }
                break;
            case 1:                                 //  진행방향    ↓
                copy[i++][j] = count++;
                if (i == x || copy[i][j] != 0) {
                    i--;
                    j--;
                    flag = 2;
                }
                break;
            case 2:                                 //  진행방향    <-
                copy[i][j--] = count++;
                if (j == -1 || copy[i][j] != 0) {
                    i--;
                    j++;
                    flag = 3;
                }
                break;
            case 3:                                 //  진행방향    ↑
                copy[i--][j] = count++;
                if (i == 0 || copy[i][j] != 0) {
                    i++;
                    j++;
                    flag = 0;
                }
                break;
            }

            if (count == x * y)    // 모든방에 값이 들어가면 나가기
                break;
        }

        for (i = 0; i < x; i++) {
            for (j = 0; j < y; j++) {
                System.out.print(copy[i][j] + "\t");
            }
            System.out.println();
        }
    }

}

// 풀이중

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<!DOCTYPE html>
<html lang="ko">

<head>
    <script>
        function solution() {
            var m, n; // 배열의 크기
            var k = 0; // 출력 값
            var flag = 1; // 회전 값

            var m = parseInt(prompt('첫번째 숫자를 입력 하세요.'));
            console.log("첫번째 입력값 : " + m);
            var n = parseInt(prompt('두번째 숫자를 입력 하세요.'));
            console.log("두번째 입력값 : " + n);
            var answer = new Array(); // 출력값이 들어갈 배열

            for(var i=0; i<m; i++){
                answer[i] = new Array();
                if(flag == 1){
                    for(var a=0; a<n; a++){ // -> 진행 채우기
                        answer[i][a] = k;
                        k++;
                    }
                    flag *= (-1);
                }

                var temp = m;
                if(flag == -1){
                    for(var b=1; b<temp; b++){ // 아래 진행 채우기
                        answer[b] = new Array();
                        answer[b][temp-1] = k;
                        k++;
                    }
                    flag *= (-1);
                }

                var temp1 = n;
                if(flag == 1){
                    for(var c=1; c<temp1; c++){ // <- 진행 채우기
                        answer[temp1] = new Array();
                        answer[temp1][temp1-c] = k;
                        k++;
                    }
                    flag *= (-1);
                }

                /*
                for(var j=0; j<n; j++){ // 위 진행 채우기
                    answer[i][j] = k;
                    k++;
                }
                */
            }
            // 배열을 출력
            for(var i=0; i<answer.length; i++){
                document.write('<br/>')
                for(j=0; j<answer[i].length; j++){
                    document.write(answer[i][j] + ", ");
                }
            }
        }
    </script>
</head>

<body>
    <input type="button" value="알고리즘 부시기" onClick="solution()">
</body>


</html>

'Algorithm Study' 카테고리의 다른 글

재귀함수? rescursive? 이진함수트리?  (0) 2022.02.10
코딩도장 Lv.1  (0) 2020.01.09
And

코딩도장 Lv.1

|

<!-- 문제
어떤 자연수 n이 있을 때, d(n)을 n의 각 자릿수 숫자들과 n 자신을 더한 숫자라고 정의하자.

예를 들어

d(91) = 9 + 1 + 91 = 101
d(100) = 1 + 0 + 0 + 100 = 101

이 때, n을 d(n)의 제네레이터(generator)라고 한다. 위의 예에서 91은 101의 제네레이터이다.

어떤 숫자들은 하나 이상의 제네레이터를 가지고 있는데, 101의 제네레이터는 91 뿐 아니라 100도 있다.

그런데 반대로, 제네레이터가 없는 숫자들도 있으며, 이런 숫자를 인도의 수학자 Kaprekar가
셀프 넘버(self-number)라 이름 붙였다. 예를 들어 1,3,5,7,9,20,31 은 셀프 넘버 들이다.

1 이상이고 5000 보다 작은 모든 셀프 넘버들의 합을 구하라.

d(1) = 1 + 1 = 2 '1은 2의 제네레이터'
d(2) = 2 + 2 = 4 '2은 4의 제네레이터'
d(3) = 3 + 3 = 6 '3은 6의 제네레이터'
d(4) = 4 + 4 = 8 '4은 8의 제네레이터'
~
d(9) = 9
d(10) = 1 + 0 + 10 = 11 '10은 11의 제네레이터'
d(11) = 1 + 1 + 11 = 13 '11은 13의 제네레이터'
~
d(20) = 2 + 0 + 20 = 22 '20은 22의 제네레이터'
~
d(91) = 9 + 1 + 91 = 101
d(100) = 1 + 0 + 0 + 100 = 101
~
d(5000) = 5 + 0 + 0 + 0 + 5000 = 5005 '5000은 5005의 제네레이터'

셀프 넘버 = x의 제네레이터 에서 x가 없는 경우 ( ex. 1, 3, 5, 7, 9, 20, 31....)

-->

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<!DOCTYPE html>
<html lang="ko">

<head>
<script>
	// 멍멍
    function solution(){                                              

        var generator = 0;
        var b_sum = 0;
        for(var list=1; list<5000; list++){ // 1 ~ 5000 사이의 제네레이터의
          var flag = false;
          for(var i=1; i<list; i++){
                generator = 0;
                var j = i.toString().split(""); // 9 9 9
                for(let k=0; k<j.length; k++){
                    generator += parseInt(j[k]); // 9+9+9
                }
                generator += i; // 1026
                 if(generator==list){
                  flag = true;
                  break;
                 }
          }
          if(!flag){
            b_sum += parseInt(list);
          }
       }              
       console.log(b_sum); 
    }
    // 왈왈
    function solution1(){
        
        var hap = 0;
        for(var i=1; i<5000; i++){
          var notselfNumber= false;
        
          for(let c=1; c < i; c++){
            var sum = parseInt((c % 10000)/1000) + parseInt((c % 1000) / 100) + parseInt((c % 100) / 10) + parseInt(c % 10) + c;
            if(sum == i ){
              notselfNumber = true;
              break;
            }
          }
          if(!notselfNumber)
            hap += parseInt(i);
       }
       console.log("셀프넘버의 합 : " + hap);
    }                         

</script>
</head>

<body>
    <input type="button" value="알고리즘 부시기" onClick="solution()"> // 1227365
    <input type="button" value="알고리즘 부시기" onClick="solution1()"> // 1227365
</body>


</html>

'Algorithm Study' 카테고리의 다른 글

재귀함수? rescursive? 이진함수트리?  (0) 2022.02.10
코딩도장 Lv.2  (0) 2020.01.10
And

Server에서 Tomcat 클린하기

|

\tomcat\work\Catalina\localhost\_ 하위  *_jsp.java / *_jsp.class 삭제

 

-> json 파일의 경우 새로고침 안될시

(Chrome -> 새로고침 오른쪽 버튼 클릭 -> 캐시 비우기 및 강력 새로고침 으로 진행하면 먹힌다)

'DevTools' 카테고리의 다른 글

Tomcat 프로세스 강제종료  (0) 2020.03.19
전자정부프레임워크  (0) 2020.02.06
Maven 설치, Jenkins 설치  (0) 2019.10.14
DB 개발환경 구축  (0) 2019.08.31
이클립스의 기본 사용법  (0) 2019.05.16
And

DB모델링 - Entity, Attribute, Identifier, Relation

|

1. Entity : 명사, 관리하고자 하는 집합. key or main or action

 

2. Attribute : 원자단위, 유일, 근원값

 

3. Identifier : 식별자 - 실질/ 본질 / 인조

 UID Bar(인조식별자 있으면 넣을 필요x) - 선언O시 식별자로 상속 / 선언X시 정보

 

4. 관계표현

- 오리발 : many

- 실선 : 필수

- 점선 : 선택

 

5. | 자로 보는 관계(속성은 多에 만들어짐)

6. 관계의 종류

1) 1:多관계-> 속성이 만들어짐(필수인 쪽에)

2) 多:多관계-> Entity가만들어짐

- 다중관계 : 병렬식(SQL간단) / 직렬식(추가속성가능)

- 순환관계 : 1:M 순환관계(항상 점선) / M:N 순환관계(BOM)

- Arc관계 : 베타적관계, 관계통합(두개이상의 다른 Entity의 합집합과의 관계)

- Entity통합 : 비즈니스 유연성 증가

 

 

And