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
'🐣 알고리즘 삐약 > ✏️ 냅다 덤벼보는 문제풀이' 카테고리의 다른 글
[C++] UVa 750 : 8 Queens Chess Problem (0) | 2022.04.20 |
---|---|
[CSES] Road_Construction | C++ (0) | 2022.04.20 |
[codeforces 1092B ] Teams Forming (JAVA | C++) (0) | 2022.04.20 |
[CSES] Road Reparation (0) | 2022.04.19 |
[C++] UVa-11572 Unique Snowflake (0) | 2022.04.16 |