-
[프로그래머스] 자바로 배우는 자료구조 후기@떤떤/#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