ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [프로그래머스] 자바로 배우는 자료구조 후기
    @떤떤/#Study 2020. 4. 6. 17:16

    https://programmers.co.kr/learn/courses/17#curriculum

     

    프로그래머스

    코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

    programmers.co.kr

    자바로 자료구조를 공부해야지 하던 참에 혼자 하기엔 시간이 너무 많이 걸릴 거 같아서

    강의를 찾아봤다. 요즘 프로그래머스를 많이 보는데 마침 있길래 강의를 봤다.

     

    설명 정말 잘해주시는데 ArrayList만 있어서 좀 아쉬웠다.

    더 공부하고 싶어요..

     

    강의를 보면서 학교다닐 때 배웠던 것들이 생각이 나서 재밌었다.

    다 잊어버린줄만 알았는데 깊은 곳에 숨어있었던 것이었다. 이제 자바를 자바볼까 ㅎ;

     

     

    강의 마지막 실습문제 푼 거 올려보겠다.

    이고잉님이 99% 코딩하신 건데 사이즈 추가하는 것만 내가 했다.

    나중에 공부할 때 참고하려고 올립니다.

     

    실습 마지막 문제 : 원소를 무한히 저장하는 ArrayList구현하기

     

    extendSize() 추가했습니다

    package arraylist;
    
    import java.util.Iterator;
    
    public class ArrayList {
    	//object 배열을 생성해서 elementData라고 하는 비공개 접근자를 갖고 있는 인스턴트 변수에 할당
    	//그리고 그 배열에 수용할 수 있는 값의 숫자는 100개
    	//자바에 내장되어 있는 컬렉션 arraylist는 100이 넘어도 자동으로 커지도록 되어있다.
    	//본질적인 기능이 아니고 편의를 위해서 되어있는 것이다.
    	private Object[] elementData =  new Object[100];
    	private int size=0; //list의 크기 카운트할 변수
    	
    	public ArrayList(){
    		
    	}
    	
    	public void extendSize(){ //동적인 배열을 처리하기 위해서 새로운 배열을 생성, 배열 swap하기
    		if(size>=elementData.length){
    			Object[] tmpData = elementData;
    			elementData = new Object[size*10];
                //배열 복사하는 방법 2가지 for문과 arraycopy를 이용하는 것, arraycopy가 더 심플하기 때문에 이걸 이용하자
    			/*for(int i=0;i<tmpData.length;i++){ 
    				elementData[i]=tmpData[i];
    			}
    			*/
    			System.arraycopy(tmpData, 0, elementData, 0, tmpData.length);
    		}
    	}
    	
    	public boolean add(int index, Object element){
    		extendSize();
    		//엘리먼트 중간에 데이터를 추가하기 위해서는 끝의 엘리먼트부터 index의 노드까지 뒤로 한칸식 이동시켜야 함.
    		for(int i=size-1;i>=index;i--){
    			elementData[i+1]=elementData[i];
    		}
    		elementData[index]=element;
    		size++;
    		return true;
    	}
    	
    	public boolean addLast(Object element){
    		extendSize();
    		elementData[size]=element;
    		size++;
    		return true;
    	}
    	
    	public boolean addFirst(Object element){
    		extendSize();
    		return add(0,element);
    	}
    	
    	public Object remove(int index){
    		//엘리먼트를 삭제하기 전에 삭제할 데이터를 removed변수에 저장
    		Object removed = elementData[index];
    		//삭제된 엘리먼트 다음 엘리먼트부터 마지막 엘리먼트까지 순차적으로 이동해서 빈자리 채우기
    		for(int i=index+1;i<=(size-1);i++){
    			elementData[i-1]=elementData[i];
    		}
    		//크기 줄이기
    		size--;
    		//마지막 위치의 엘리먼트를 명시적으로 삭제해준다.
    		elementData[size]=null;
    		return removed;
    	}
    	
    	public Object removeFist(){
    		return remove(0);
    	}
    	
    	public Object removeLast(){
    		return remove(size-1);
    	}
    	
    	//엘리먼트 가져오기
    	public Object get(int index){
    		return elementData[index];
    	}
    	
    	//문자열로 출력하기
    	@Override
    	public String toString(){
    		String str="[";
    		for(int i=0;i<size;i++){ 
    			str += elementData[i];
    			if(i<(size-1) ){
    				str += ",";
    			}
    		}
    		return str+"]";
    	}
    	
    	public int size(){
    		return size;
    	}
    	
    	//엘리먼트의 index 검색
    	public int indexOf(Object o) {
    		for(int i=0;i<size;i++){
    			if(o.equals(elementData[i])){
    				return i;
    			}
    		}
    		return -1; //-1인 이유는 찾는 값이 없다는 뜻
    	}
    	
    	public ListIterator listIterator(){
    		//ListIterator 인스턴스를 생성해서 리턴합니다.
    		return new ListIterator();
    	}
    	
    	class ListIterator{
    		
    		//현재 탐색하고 있는 순서를 가르키는 인덱스 값
    		private int nextIndex = 0;
    		
    		//next 메소드를 호출할 수 있는지를 체크
    		public boolean hasNext(){
    			//nextIndex가 엘리먼트의 숫자보다 적다면 next를 이용해서 탐색할 엘리먼트가 존재하는 것이기 때문에 true를 리턴합니다.
    			return nextIndex<size();
    		}
    		
    		//순차적으로 엘리먼트를 탐색해서 리턴합니다.
    		public Object next(){
    			//nextIndex에 해당하는 엘리먼트를 리턴하고 nextIndex의 값을 1증가 시킵니다.
    			return elementData[nextIndex++];
    		}
    		
    		//previous메소드를 호출해도 되는지를 체크합니다.
    		public boolean hasPrevious(){
    			//nextIndex가 0보다 크다면 이전 엘리먼트가 존재한다는 의미.
    			return nextIndex>0;
    		}
    		
    		//순차적으로 이전 노드를 리턴.
    		public Object previous(){
    			//이전 엘리먼트를 리턴하고 nextIndex의 값을 1감소.
    			return elementData[--nextIndex];
    		}
    		
    		//현재 엘리먼트를 삭제
    		public void remove(){
    			ArrayList.this.remove(nextIndex-1);
    			nextIndex--;
    			
    		}
    	}
    }

     

    package arraylist;
    
    
    public class Main {
    
    	public static void main(String[] args) {
    		// TODO Auto-generated method stub
    		/*ArrayList numbers=new ArrayList();
    		numbers.addLast(10);
    		numbers.addLast(20);
    		numbers.addLast(30);
    		numbers.addLast(40);
    		numbers.add(1,15); //numbers가 데이터 타입을 정의하지 않았기 때문에 따로 함수 설정해야됨.
    		numbers.addFirst(5);
    		System.out.println(numbers); //numbers 출력하기 (toString되어있음)
    		System.out.println(numbers.indexOf(20));//20이 어디에 있는지
    		*/
    		//원소를 무한히 저장하는 ArrayList 구현하기
    		ArrayList arraylist=new ArrayList();
    		for(int i=0;i<1000;i++){
    			arraylist.addLast(i);
    		}
    		System.out.println(arraylist);
    		return ;
    	}
    }

    '@떤떤 > #Study' 카테고리의 다른 글

    [프로그래머스/JAVA] 다트 게임  (0) 2020.04.16

    댓글

Designed by Tistory.