🐣 알고리즘 삐약/✏️ 냅다 덤벼보는 문제풀이

UVa / 00514 Rails [JAVA]

우주수첩 2022. 3. 11. 01:36
728x90


  • A에서 station으로 들어온 열차는 거꾸로 나가야 한다 == LIFO 구조의 Stack을 이용하여 해결한다!
  • 입력은 line의 block 형태로 받아오는데 첫 줄에는 coach의 개수, 이후에는 coach의 배열을 입력한다.
  • 입력을 완료했을 경우에는 마지막 줄에 0을 입력하여 한 블럭을 종료함을 표시한다.
  • 실행을 완전히 종료하기 위해서는 0을 한 번 더 입력하여 종료한다.

 

package chap2;

import java.util.*;
import java.io.*;

public class Rails_UVa514 {
	public static void main(String[] args) throws IOException{
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		String s;
		while(!(s=br.readLine()).equals("0")) {
			int n = Integer.parseInt(s);
			while(!(s=br.readLine()).equals("0")) {
				LinkedList<Integer> incomingTrain = new LinkedList<>();
				for(int i=1;i<=n;i++) incomingTrain.add(i);
				
				Stack<Integer> stationTrain = new Stack<>();
				
				StringTokenizer st = new StringTokenizer(s);
				boolean fail = false;
				while (st.hasMoreTokens()) {
					int queue = Integer.parseInt(st.nextToken());
					if(incomingTrain.contains(queue)) {
						while(incomingTrain.contains(queue)) {
							stationTrain.push(incomingTrain.removeFirst());
						}
					if(stationTrain.size()>0 && stationTrain.peek() == queue) {
						stationTrain.pop();
					}else {
						fail = true;
						break;
					}
					if(fail) {
						System.out.println("No");
					}else {
						System.out.println("Yes");
						
					}
					}
					System.out.println();
					
				}
			}
		}
	}
}

BufferedReader VS Scanner

  • BufferedReader : 사용자가 요청할 때마다 데이터를 읽어 오는 것이 아닌, 일정한 크기의 데이터를 한번에 읽어와 버퍼에 보관한 후, 사용자의 요청이 있을 때 버퍼에서 데이터를 읽어오는 방식으로 동작.
  • 장점 : 속도 향상 / 시간 부하 적음
  • 입력을 라인 단위로 받기 때문에 공백의 경우에도 String으로 인식하여 받아들인다.
  • 입력받은 데이터 타입이 String 타입이므로 다른 타입의 데이터로 처리하길 원한다면 이후 형 변환이 필요하다는 특징이 있다. ex) Integer.parsInt(s) => int 형으로 형 변환.
  • 기본적으로 한줄을 통째로 읽어오는 방법으로 주로 쓰임.
  • InputStreamReader : 문자열을 chracter 단위로 읽어들인다.

      - readline : 값을 읽어올 때 string값으로 개행문자(엔터값)을 포함해 한 줄을 전부 읽어오는 방식

      - read : 값을 읽어올 때 int 값으로 변형하여 읽어오는 방식. 

 

  • Scanner : Java.util 패키지 내에 포함된 class이며 공란과 줄바꿈을 모두 입력값의 경계로 인식하기에 좀 더 쉽게 데이터를 입력받을 수 있도록 해 준다. 
  • 데이터 타입이 입력받는 시점에서 결정되므로 별도의 형변환이 필요하지 않는다. (사용하는 함수에 따라 데이터 타입이 결정)

상대적으로 속도는 BufferdReader가 빠르다.

 

참고 url : https://carpediem0212.tistory.com/11

           : https://www.acmicpc.net/board/view/9744

 

줄곧 Scanner로 입력을 많이 받아왔는데, 위의 문제처럼 한 번에 여러가지의 값을 받아야 하거나 시간초과 등의 문제에 마주치면 냅다 BufferedReader로 입력 받아와야 할 것 같다.


equals VS ==

s= br.readLine().equals("0")

== 

  • int, boolean 같은 primitive type에 대해서는 값을 비교한다. (특정 상수를 참조하는 것이기 때문에 결국 주소값을 비교하는 것이라고 볼 수 있다.)
  • reference tpe에 대해서는 주소값을 비교한다.

equarls()

  • 최상위 클래스이 Object에 포함되어있기 때문에  모든 하위 클래스에서 재정의 해서 사용이 가능하다
  • String 객체에서 사용하는 equals는 주소를 비교하는 것이 아닌 내용을 비교하는 것이다.
  • 즉, String 클래스에서의 equals는 문자열의 내용을 비교하도록 재정의 되어있다.
  • StringBuffer에는 equals가 먹히지 않는다.

 

==는 주소값이 같은지 아닌지 비교하는 것이고, equals() 연산도 내부적으로 주소값을 비교하지만
String 클래스에서는 equals()를 재정의해 문자열의 내용을 비교하게 구현되어있다.

참고 url : https://go-coding.tistory.com/35

 

 


StringTokenizer

StringTokenizer st = new StringTokenizer(s);

StringTokenizer : 특정 문자를 기준으로 문자열을 분리한다.

 

생성자

  • StringTokenizer st = new StringTokenizer( str);

          => 띄어쓰기 기준으로 문자열을 분리

  • StringTokenizer st = new StringTokenizer( str , 구분자);

          => 구분자를 기준으로 문자열을 분리

  • StringTokenizer st = new StringTokenizer(str, 구분자, true/false);

          => 구분자를 기준으로 문자열을 분리할때 구분자도 토큰으로 넣을지 (T)

               구분자는 분리된 문자열에 포함시키지않을지 (F == defalt)

 

while (st.hasMoreTokens()) {
    int queue = Integer.parseInt(st.nextToken());

hasMoreToken()

  • StringTokenizer 안에 사용할 수 있는 토큰이 더 있는지 확인한다.
  • True반환 : 토큰 존재 False 반환 : 토큰 미 존재

nextToken()

  • StringTokenizer에서 다음 토큰을 불러오는 메소드이다.

LinkedList

 

생성자

  • LinkedList<Integer> L1 = new LinkedList<Integer>();  // 타입 지정
  • LinkedList<Integer> L2 = new LinkedList<>();  // 타입 생략 가능
  • LinkedList<Integer> L3 = new LinkedList<>(L1) // 다른 리스트 값으로 초기화 가능
  • LinkedList L4 = new LinkedList<>(Arrays.asList(1,2,3,4,5); // Set이나 ArrayList등을 전달하여 초기화 가능

 

추가,변경 / 삭제

  • L1.add(123);
  •    => 인덱스를 지정하지 않으면 가장 끝에 값이 추가된다.
  • L1.add(0,234); // index 지정
  • removeFirst() / remove() / removeLast

 

참고 url : https://psychoria.tistory.com/767

 

728x90