자바

고급자바 1219-1

정재화니 2022. 12. 19. 10:41

이전에 배운 ArrayList를 통한 예제문제 풀기


문제) 5명의 별명을 입력 받아  ArrayList에 저장하고 이들 중  별명의 길이가 제일 긴 별명을 출력하시오.
  (단, 별명의 길이는 모두 다르게 입력한다.)


ArrayList<String> list = new ArrayList();
		Scanner sc = new Scanner(System.in);
		
		
		System.out.println("서로 다른 길이의 별명을 5번 입력하시오!");
		for(int i = 1; i <= 5; i++) {
			System.out.println(i +"번째 별명: ");
			String nickName = sc.nextLine();
			list.add(nickName);
		}
		// 제일 긴 별명이 저장될 변수를 선언하고 이 변수에는 List의 첫번째 별명을 초기화 한다.
		
			String maxName = list.get(0);
		for(int i = 0; i < list.size(); i++) {
			
			if(list.get(0).length() < list.get(i).length() ) {
				maxName = list.get(i);
			}
		}
		System.out.println("별명이 가장 긴 사람");
		System.out.println(maxName);

여러가지 방법이 있지만 한가지 방법만 정의해봤습니다.

결과


문제2) 5명의 별명을 입력 받아  ArrayList에 저장하고 이들 중 별명의 길이가 제일 긴 별명을 출력하시오.
    (단, 별명의 길이가 같은것이 중복될 수 있다.)


ArrayList<String> list = new ArrayList();
		Scanner sc = new Scanner(System.in);
		
		
		System.out.println("별명을 5번 입력하시오!");
		for(int i = 1; i <= 5; i++) {
			System.out.print(i +"번째 별명: ");
			String nickName = sc.nextLine();
			list.add(nickName);
		}
		// 제일 긴 별명의 길이를 저장할 변수를 선언하고 첫번째 별명의 길이로 초기화 한다.
		int maxLength = list.get(0).length();
		
		for(int i = 1; i < list.size(); i++) {
			if(maxLength < list.get(i).length()) {
				maxLength = list.get(i).length();
			}
		}
		
		System.out.println("제일 긴 별명들..");
		for(int i = 0; i < list.size(); i++) {
			if(maxLength == list.get(i).length()) {
				System.out.println(list.get(i));
			}
		}

결과

다양한 방법들이 있다 ! 다른 방법들도 공부해보면 좋습니다.

 


데이터 저장장소인 Stack과 Queue에 대하여 알아보았습니다.

 Stack => 후입선출(LIFO)의 자료구조
 Queue => 선입선출(FIFO)의 자료구조 

 

Stack의 명령으로는 
   1. 자료 입력 : push(입력값)
   2. 자료 출력 : pop() ==> 자료를 꺼내온 후 꺼내온 자료를 Stack에서 삭제한다.
      peek() ==> 삭제없이 자료를 꺼내온다.

 

예시를 보면 

stack.push("홍길동");
		stack.push("일지매");
		stack.push("변학도");
		stack.push("강감찬");
		
		System.out.println("현재 stack값: " + stack);
		
		String data = stack.pop();
		System.out.println("꺼내온 값: " + data);
		System.out.println("꺼내온 값: " + stack.pop());
		System.out.println("현재 stack값: " + stack);
		
		stack.push("성춘향");
		System.out.println("추가후 stack값: " + stack);
		
		System.out.println("꺼내온 값: " + stack.pop());
		System.out.println("현재 stack값: " + stack);
		
		System.out.println("삭제 없이 꺼내온 값: " + stack.peek());
		System.out.println("현재 stack값: " + stack);

Stack의 결과값을 알 수 있다.

후입선출로 인하여 마지막에 들어온 값들이 먼저 빠져나가는 것을 알 수 있다.

 

Queue의 명령
   1. 자료입력 : offer(입력값)
   2. 자료출력 : poll() ==> 자료를 꺼내오고 꺼내온 자료를 Queue에서 삭제한다.
     peek() ==> 삭제없이 자료를 꺼내온다.

 

예시를 보자면 

Queue<String> queue = new LinkedList<String>();
		
		queue.offer("홍길동");
		queue.offer("일지매");
		queue.offer("변학도");
		queue.offer("강감찬");
		
		System.out.println("현재의 queue값: "+ queue);
		
		String temp = queue.poll();
		System.out.println("꺼내온 값: " + temp);
		System.out.println("꺼내온 값: " + queue.poll());
		System.out.println("현재 queue 값: " + queue);
		
		queue.offer("성춘향");
		System.out.println("현재 queue 값: " + queue);
		
		System.out.println("꺼내온 값 : " + queue.poll());
		System.out.println("현재 queue 값: " + queue);
		
		System.out.println("삭제 없이 꺼내온 값: " + queue.peek());
		System.out.println("현재 queue 값: " + queue);

결과값으로 선입선출이 되는것을 알 수 있다.

Queue 결과 값

Stack을 이용하여 웹브라우저의 앞으로가기, 뒤로가기 기능을 구현해보는 예시를 보도록 하겠습니다.

class Browser{
	private Stack<String> back; // 이전 방문 내역이 저장될 Stack
	private Stack<String> forward; // 다음 방문내역이 저장될 Stack
	private String currentUrl; // 현재 페이지
	
	//생성자
	public Browser(){
		back = new Stack<String>();
		forward = new Stack<String>();
		currentUrl = "";
	}

Stack을 통하여 현재 페이지, 이전 방문 내역, 다음 방문내역을 저장해주고 생성자를 만든다.


public void goURL(String url) {
		System.out.println(url +"사이트에 접속합니다...");
		if(!"".equals(currentUrl)) { // 주어진 URL로 이동하기 전 현재페이지가 있으면 
			back.push(currentUrl);	// 현재 페이지를 back스택에 추가한다. 
		}
		currentUrl = url;	// 현재 페이지 변경
	}

사이트를 방문하는 메서드를 만들어서 인수값으로 방문할 URL을 넣는다.


public void goBack() {
		// isEmpty() 메서드 ==> Collection이 비어 있으면 true, 그렇지 않으면 false
		if(! back.isEmpty()) { // 데이터가 있으면
			forward.push(currentUrl);  // 현재페이지를 forward스택에 추가
			currentUrl = back.pop();   // back스택에서 1개의 요소를 꺼내와 현재페이지로 한다. 
			
			
		}
	}

뒤로가기 기능을 만든다.


public void goForward() {
		if(!forward.isEmpty()) {
			back.push(currentUrl);		//현재 페이지를 back스택에 추가
			currentUrl = forward.pop();
		}
	}

앞으로 가기 기능을 만든다.


public void history() {
		System.out.println("----------------------------");
		System.out.println("  방  문  기  록");
		System.out.println("----------------------------");
		System.out.println("back    =>" + back);
		System.out.println("현재    =>" + currentUrl);
		System.out.println("forward =>" + forward);
		System.out.println("----------------------------");
		
		
	}

방문기록을 확인하기 위한 메서드를 작성한다.


public static void main(String[] args) {
		Browser b = new Browser();
		b.goURL("1. 네이버");
		b.history();
		
		b.goURL("2. 야후");
		b.history();
		
		b.goURL("3. 구글");
		b.goURL("4. 다음");
		b.history();
        }

메인 메서드에서 확인해본다.

접속할때마다 back에 저장이 되고 마지막 접속 사이트가 현재로 바뀌는 것을 알 수 있다.

 

System.out.println("뒤로가기 기능...");
		b.goBack();
		b.history();
		
		System.out.println("뒤로가기 후..");
		b.goBack();
		b.history();
		
		System.out.println("뒤로가기 후..");
		b.goBack();
		b.history();

뒤로가기 기능을 작동해보면

forward로 데이터가 모아지는 것을 볼 수 있다.

 

System.out.println("앞으로가기 후..");
		b.goForward();
		b.history();
		System.out.println();
		
		System.out.println("새로운 사이트 접속 후..");
		b.goURL("5. 네이트");
		b.history();

앞으로 가기 기능과 새로운 사이트에 접속해보면 

사이트를 방문하는 메서드에서

forward.clear(); 통하여 전체데이터 삭제를 해서 기록이 없어지는 것을 알 수 있다.