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