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( ) : 토큰을 차례대로 반환함
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 |