참고 지난버전 :

http://jewdri.tistory.com/5


참고 처음버전 : 

http://jewdri.tistory.com/3


기존 처음버전->2.1버전에서 전체 컨텐츠의 높이값(세로사이즈:height)을 가장 마지막 컨텐츠의 Y값으로 넣어줬떤 부분.

가장 마지막 컨텐츠로 주면, 안됐다. (오류)



그래서 저 위에 오류부분을 수정하면서 아래부분도 같이 수정함. 


수정된 2.2버전에서 추가된 내용 

masonry2.2.zip



1. 마지막줄에서 가장 긴컨텐츠의 Y값을 가져와 전체 부모박스의 높이값으로 줘야했던것을 수정.

2. 컨텐츠의 마지막줄에서 가장 짧은세로값을 가져오는것/ 가장 긴 세로값을 가져오는것 => 이부분이 중복되어서 따로 메서드화 

3. 기본 1줄을 계산해서 넣어주는 부분도 조건문안에 조건문이 들어가는 형태라 따로 메서드화  




왼쪽이 수정된 버전코드 VS. 오른쪽이 기존 2.1버전 코드 

:연두색부분이 조건문 -> 해당부분의 코드를 따로 메서드화 시켰다. 






아직 부족하지만-_-

다른것도 만들고싶지만 (딱히 아이디어도 없고...)


공부겸 수정해봄. 



큐(Queue) 

04_큐.zip



목차

큐?

  • (Queue)는 FIFO(선입선출의 약자)원리에 따라 정렬된 컬렉션
  • 새 원소는 뒤로 들어가서 앞으로 빠져나가는 구조
  • 마지막에 추가된 원소는 큐의 뒷부분에서 제일 오래기다려야 한다.
  • 예 : 줄서기, 컴퓨터(출력물 인쇄대기 - 문서5개 출력시 프린터는 도착한 순서대로 인쇄 시작)

큐 만들기

			//큐 클래스 작성
			function Queue(){
				this.items = [];
			}
		

큐에서 사용할 메소드

  • enqueue : 큐의 뒤쪽에 원소를 추가
  • dequeue : 큐의 첫번쨰 원소 반환후 큐에서 삭제
  • front : 큐의 첫번쨰 원소 반환만
  • isEmpty : 큐 비어있으면 true, 그게 아니면 false
  • size : 큐의 원소개수 반환 (length)

enqueue

			Queue.prototype.enqueue = function(element){
				this.items.push(element);
			}
		

dequeue

			Queue.prototype.dequeue = function(){
				return this.items.shift();
			}
		

front

			Queue.prototype.front = function(){
				return this.items[0];
			}
		

isEmpty

			Queue.prototype.isEmpty = function(){
				return this.items.length == 0;
			}
		

size

			Queue.prototype.size = function(){
				return this.items.length;
			}
		

디버깅용도 print

			Queue.prototype.print = function(){
				console.log(this.items.toString());
			}
		

완성된 Queue 클래스

첨부파일내 파일명 : js/queue.js

			function Queue(){
				this.items = [];
			}

			Queue.prototype.enqueue = function(element){
				this.items.push(element);
			}

			Queue.prototype.dequeue = function(){
				return this.items.shift();
			}

			Queue.prototype.front = function(){
				return this.items[0];
			}

			Queue.prototype.isEmpty = function(){
				return this.items.length == 0;
			}

			Queue.prototype.size = function(){
				return this.items.length;
			}

			Queue.prototype.print = function(){
				console.log(this.items.toString());
			}
		

Queue 클래스 사용

첨부파일내 파일명 : 02_큐클래스사용.html

Queue클래스를 사용하여 대기자명단을 출력하고, 대기자명단 순서에 따라 입장

첨부파일내 파일명 : 02_큐클래스사용_form차이.html

태그를 form사용하여 button에 이벤트를 줬는데, 폼을 전송하여 문서가 리로드 된다. submit을 사용하지 않았는데.-_-?
button태그를 쓰고 submit이라고 하지 않아도, type을 따로 써주지 않으면 디폴트로 submit!
button type="button" 으로 해결

우선순위 큐

  • 큐는 일상생활에서도 널리 활용되는 개념 -> 기본 큐를 변형해 사용
  • 대표적인 예 : 우선순위 큐 - 원소가 우선순위에 따라 추가되고 삭제
  • 우선순위큐의 예 : 비행기 1등석, 비즈니스석, 코치석 / 병원 응급실

우선순위 큐의 종류

  • 우선순위에 따라 원소를 정확한 위치에 추가하는 것
  • 추가는 순서대로 하되, 삭제만 우선순위에 따라 삭제

우선순위 큐 구현 / 첨부파일내 파일명 : js/priorityQueue.js

			function QueueElement(element, priority){
			    this.element = element;
			    this.priority = priority;
			}
			PriorityQueue.prototype.enqueue = function(element, priority){
			    var queueElement = new QueueElement(element,priority);

			    if(this.isEmpty()){ //비어있을경우 그냥추가
			        this.items.push(queueElement);
			    }else{
			        var added = false;

			        //기존에 추가된 원소들과 우선순위 비교후 자리찾아 넣기
			        for(var i=0; i < this.items.length; i++){
			            if(queueElement.priority < this.items[i].priority){
			                this.items.splice(i,0,queueElement);
			                added = true;
			                break;
			            }
			        }
			        //추가될 원소보다 우선순위높은게(숫자작은거) 없을경우 맨앞에 추가
			        if(!added){
			            items.push(queueElement);
			        }
			    }
			}
		
다른 메소드들은 똑같지만, 원소 추가될때 우선순위를 비교

우선순위 큐를 사용하여 오류사항 리포트 구현 / 첨부파일내 파일명 : 03_우선순위큐.html

위와같은 로직으로 구현한 우선순위큐를 최소 우선순위 큐 라고 부른다.
cf)최대우선순위 큐

환형 큐(뜨거운 감자 게임)

  • 기본큐의 변형
  • 원을 그리고 서 있는 아이들이 뜨거운 감자를 옆사람에게 최대한 빨리 전달
  • 일정한횟수만큼 전달하다가 멈췄을때 뜨거운 감자를 손에들고있는 아이를 퇴장
  • 최후의 1인이 남을때까지 게임은 계속

뜨거운감자 console창에서 확인 / 첨부파일내 파일명 : 04_환형큐.html

			function hotPotato(nameList, num){
			var queue = new Queue();

			for(var i = 0; i < nameList.length; i++){
				queue.enqueue(nameList[i]);
			}

			var eliminated = '';
			while(queue.size() > 1){
				for(var i=0; i < num; i++){
					queue.enqueue(queue.dequeue());
				}
				eliminated = queue.dequeue();
				console.log(eliminated+'(을)를 뜨거운 감자게임에서 퇴장시킵니다.');
			}
			return queue.dequeue();
		}

		var names = ['John','Jack','Camila','Ingrid','Carl'];
		var winner = hotPotato(names, 7);
		console.log('승자는 '+winner+'입니다');
		

뜨거운감자 응용 / 첨부파일내 파일명 : 04_환형큐.html

뜨거운 감자를 이용하여 술래찾기 -> 회사에서 이걸로 커피내기했었다. (근데 내가걸림 ㅠ)
			function CustomHotPotato(area,num){
				this.viewArea = null;
				this.turnNum = null;
				this.personList = null;
				//this.gameAuto = null;
				//this.gameTime = null;
				this.gemeTurn = null;
				this.init(area,num);
			}

			CustomHotPotato.prototype.init = function(area,num){
				this.viewArea = $(area);
				this.turnNum = num;
				//this.gameTime = 1000;
				this.gemeTurn = 0;
				this.personList = new Queue();
			}

			CustomHotPotato.prototype.addList = function(){
				for(var i =0; i < names.length; i++){
					this.personList.enqueue(names[i]);
				}
			}

			CustomHotPotato.prototype.viewList = function(){
				var cont = '
    ' var listTemplate = '
  • {name}
  • ' for(var i = 0; i < this.personList.size(); i++){ cont += listTemplate.replace('{name}',this.personList.items[i]); } cont += '
'; this.viewArea.html(cont); } CustomHotPotato.prototype.gameStart = function(){ this.srchPerson(); //this.gameAuto = setTimeout(this.srchPerson(),this.gameTime); } CustomHotPotato.prototype.srchPerson = function(){ if(this.personList.size() > 1){ if(this.gemeTurn < this.turnNum){ this.personList.enqueue(this.personList.dequeue()); this.gemeTurn += 1; this.srchPerson(); }else{ var eliminated = this.personList.front(); var myObj = this; //그사람에 해당하는 거 삭제해줘야함 this.viewArea.find('ul li').each(function(){ var srchName = $(this).html(); if(srchName == eliminated){ $(this).addClass('del').animate({opacity:0},800,function(){ //alert(eliminated+'탈출'); myObj.viewArea.prev().append('

'+eliminated+'탈출

'); myObj.personList.dequeue(); myObj.viewList(); myObj.gemeTurn = 0; }); } }); } }else{ var win = this.personList.dequeue(); this.viewArea.find('ul li').eq(0).addClass('active'); alert('술래는 '+win+'입니다'); //if(this.gameAuto) clearTimeOut(this.gameAuto); } }
			$(document).ready(function(){
			var addname = prompt('사람 이름 입력(,)구분');

			names = addname.split(',');
			var num = Math.floor(Math.random()*20+1);
			console.log('순회횟수 랜덤:'+num);
			var game = new CustomHotPotato('.person_list',num);
			game.addList();
			game.viewList();

			$('button').click(function(){
				game.gameStart();
			});
		})
		
Jewdri . 출처 : Learning Javascript Data Structures and Algorithms


http://jewdri.tistory.com/3


지난번 구현하였던, 핀터레스트 레이아웃을 플러그인화 시켰다.


옵션값을 객체형태로 전달하여, 옵션설정가능하게!!





옵션을 따로 주지않을경우, 디폴트로 옵션이 대체!!




기존에 이미 잘된 플러그인이 있지만,

플러그인화 하는 연습겸 ~만들어봄.


masonry2.zip

masonry2.zip masonry2.1.zip





+ Recent posts