언어 공부 내용 정리/백준

백준 자바 2884, 1152 / split() , StringTokenizer() 비교

wosrn 2023. 6. 9. 22:12

2284

import java.util.Scanner;

public class Main {
	
	public static void main(String [] args) {

	Scanner input = new Scanner(System.in);
	Byte H = input.nextByte();
	Byte M = input.nextByte();
	
	if(H==0) {
		if(M>=45 && M<=59 ) {
			System.out.println(H+" "+(M-45));
		}
		else {
			System.out.println(23+" "+(M+15));
		}
		
	}
	
	else {
	if(M>=45 && M<=59 ) {
		System.out.println(H+" "+(M-45));
	}
	else {
		System.out.println((H-1)+" "+(M+15));
	}
	
	}
       input.close();
	}
}

내가 처음 풀었던 방식은 우선 시간이 바뀌지 않는 45-59분 사이와 나머지로 분류해서 출력문을 작성하고, H가 아예 달라지는 0시는 별도 IF문으로 빼서 작성해주었다

 

import java.util.Scanner;

public class Main2 {
	
	public static void main(String [] args) {

	Scanner input = new Scanner(System.in);
	Byte H = input.nextByte();
	Byte M = input.nextByte();
	
	if(M>44) System.out.println(H + " " + (M- 45));
	else if ( M < 45 && H >0) System.out.println((H-1) + " " + (M+15));
	else System.out.println(23 + " " + (M + 15));



	
	input.close();
	}
  }

더 짧고 좋은 코드가 없나 하고 서치를 해보다가 더 짧은 코드를 발견하게 되었다

우선 분이 44분보다 크면 시간이 아예 바뀌지 않으니 이 부분을 먼저 작성해주고, 그 후 ELSE로 h가 0일때와 아닐때를 구분해서 코드를 작성할 수 있었다. 그런데 백준 제출시엔 두 코드가 시간은 똑같고 메모리는 후자의 코드가 커서 약간 엥스럽다

코드의 절대적 길이가 짧다고 무조건 좋은건 아닌걸까

 

1152

package Baekjoon;
import java.util.Scanner;

public class Main2 {
	
	public static void main(String [] args) {
	Scanner input = new Scanner(System.in);
	String a = input.nextLine();
	String aa = a.trim();
	String [] array = aa.split("\\s"); // \\s는 공백을 나타내는 정규표현식

	if(aa.isEmpty()) System.out.println(0);
	else System.out.println(array.length);
	}
}

시행착오를 몇번 겪었던 문제

깨달은 점들은

 

1) 문자열을 입력받은 뒤 이를 trim() 메소드로 앞뒤 공백을 잘라주지 않으면 앞에 공백이 있을 때, 예를들어 " hi hi hi"일 때 출력이 3이 아닌 4로 된다 ..! 그래서 trim으로 앞뒤 공백을 잘라줘야 이런 오류가 없어진다

 

2)split 메소드에서 공백을 구분자로 할 때는 \\s 를 사용

 

3)아무것도 입력하지 않아도 엔터는 입력하기 때문에 배열의 길이가 1로 출력된다 ! 그래서 isempty 부분을 작성해주어야한다

 

4)isEmpty() 와 isBlank()

  • isEmpty()메소드는 공백이면 false를 반환하는 메소드
  • isBlank() 메소드는 공백이면 true를 반환하는 메소드

 

 

split() , StringTokenizer() 비교 : 모두 문자열을 분리하는 메소드

 

1) string 클래스 - split()

  • String 클래스의 메소드이다
  • 구분자를 문자가 아닌 정규식으로 받는다
  • 정규식으로 구분자를 받기 때문에 or, ~로 끝나는 단어 등 다양한 기준으로 문자열을 자를 수 있다
  • 문자열을 매개변수의 문자를 기준으로 문자열을 잘라서 배열에 넣는 메소드이다

2)StringTokenizer 클래스 - StringTokenizer()

  • java.util에 포함된 클래스라서 사용하고자 한다면 코드 위에 import.java.util.StringTokenizer 입력
  • 문자 혹은 문자열을 구분자로 사용하여 문자열을 자른다
  • split()은 결과값이 문자열 배열인 반면 StringTokenizer()은 결과값이 문자열
  • StringTokenizer 클래스에 소속된 메소드이기 때문에 이를 사용하려면 StringTokenizer 타입의 객체를 생성해야 하고, 생성시에 매개변수로 구분자를 넘겨준다 / 구분자를 넣지 않으면 기본 공백으로 설정되어 문자열을 자른다
  • split은 빈 문자열을 토큰으로 인식하지만 이 메소드는 그렇지 않음
  • split은 결과값이 빈 문자열까지 포함하여 배열에 넣지만 이 메소드는 빈 문자열을 결과에 포함하지 않음
  • 객체 생성 시에 매개변수로 분리할 문자열과 구분자를 차례로 입력

. 내장된 메소드 종류

1) int countTokens( ) : 토큰의 수 반환

2) boolean hasMoreTokens( ) : 토큰이 남아있으면 true, 없으면 false 반환

3) String nextToken( ) : 토큰을 차례대로 반환함

 
 
StringTokenizer() 을 이용한 1152
package Baekjoon;
import java.util.Scanner;
import java.util.StringTokenizer;
public class Main2 {
	
	public static void main(String [] args) {
	Scanner input = new Scanner(System.in);

	String a = input.nextLine();
	StringTokenizer st = new StringTokenizer(a);
	System.out.println(st.countTokens());
	}
}

StringTokenizer() 메소드를 이용하니 객체를 하나 더 생성해야하긴 했지만, 이 메소드는 공백을 토큰으로 인식하지 않기때문에 trim()을 사용하지 않아도 되고 isEmpty()도 필요가 없는 이점이 있었다

'언어 공부 내용 정리 > 백준' 카테고리의 다른 글

백준 자바 10988  (0) 2023.06.16
백준 자바 문자열 : 27866, 9086, 11654, 10809  (0) 2023.06.05
백준 자바 10952,10951  (0) 2023.05.24
백준 자바 10807, 10871, 10818, 10813  (0) 2023.05.23
백준 자바 10172  (0) 2023.05.18