@떤떤/#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 ;
	}
}