백준 3단계_ 빠른 A + B
언어_ Java
생각 정리 1️⃣
🙋♀️ 처음으로 제출한 답안은 바로 아래와 같다. 하지만 시간 초과… 입력 때 Scanner 대신에 BufferedRedaer로 받았지만 뭐가 문제일까 고민했다.
👩💻 입력 방법 ) BufferedReader
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
try {
System.out.print("정수를 입력하세요: ");
int num = Integer.parseInt(br.readLine());
System.out.println("입력한 정수: " + num);
System.out.print("문자열을 입력하세요: ");
String str = br.readLine();
System.out.println("입력한 문자열: " + str);
// 다른 타입의 입력이 필요한 경우도 유사하게 처리 가능
// 실수를 입력받는 경우
System.out.print("실수를 입력하세요: ");
double doubleNum = Double.parseDouble(br.readLine());
System.out.println("입력한 실수: " + doubleNum);
// 논리값을 입력받는 경우
System.out.print("참 또는 거짓을 입력하세요 (true 또는 false): ");
boolean boolValue = Boolean.parseBoolean(br.readLine());
System.out.println("입력한 논리값: " + boolValue);
} catch (IOException e) {
e.printStackTrace();
} catch (NumberFormatException e) {
System.err.println("잘못된 입력 형식입니다.");
}
// BufferedReader 사용 후 항상 close() 메서드로 스트림을 닫아줍니다.
try {
br.close();
} catch (IOException e) {
e.printStackTrace();
}
}
관련 개념
💡 문자열 구분) StringTokenizer
- (,) 기준으로 문자열 구분하기
public static void main(String[] args) {
String str = "apple,banana,orange,grape";
StringTokenizer st = new StringTokenizer(str, ",");
while (st.hasMoreTokens()) {
String token = st.nextToken();
System.out.println(token);
}
}
2. 공백 기준 문자열 구분하기
for(int i=0; i<num; i++) {
StringTokenizer st = new StringTokenizer(br.readLine()); // 공백 기준으로 분리
a[i] = Integer.parseInt(st.nextToken());
b[i] = Integer.parseInt(st.nextToken());
}
- StringTokenizer 객체 st를 생성하여 읽어온 문자열을 공백을 기준으로 분리
- nextToken() 메서드를 사용하여 다음 토큰(공백을 기준으로 분리된 문자열)을 가져온다.
생각 정리 2️⃣
🙋♀️ 입력 때는 BufferedReader로 입력 속도를 향상 했지만, 그러면 출력은 ? 라는 의문이 들었고 출력에 관한 속도 향상을 위해 StringBuilder 를 사용! > 한 번에 모아서 빠르게 출력하기 위함!
👩💻 출력 방법 ) StringBuilder
반복문 내에서 문자열을 여러 번 추가하는 작업을 할 때 StringBuilder를 사용하면 성능 향상
public class StringBuilderExample {
public static void main(String[] args) {
// StringBuilder 객체 생성
StringBuilder sb = new StringBuilder();
// 문자열 추가: append()
sb.append("Hello, "); // 문자열 추가
sb.append("Java"); // 문자열 추가
sb.append(" World!"); // 문자열 추가
// 문자열 삽입: insert()
sb.insert(6, "awesome "); // index 6에 "awesome " 문자열 삽입
// 문자열 삭제: delete()
sb.delete(0, 7); // index 0부터 6까지의 문자열 삭제
// 문자열 수정: replace()
sb.replace(5, 9, "is"); // index 5부터 8까지의 문자열을 "is"로 대체
// 문자열 역순으로 뒤집기: reverse()
sb.reverse();
// 문자열 길이 얻기: length()
int length = sb.length();
// 문자열 출력
System.out.println(sb.toString()); // "siaw is olleH"
// 문자열 길이 출력
System.out.println("Length: " + length); // "Length: 13"
}
}
생각 정리 3️⃣
🙋♀️ 문득 BufferdReader 의 위치에 따라 차이점이 있을까란 생각이 들었고… BufferdReader 의 위치를 try~catch 예외 처리 블록 밖에서 선언하였다.
메모리 비교 ⇒
위에 있는 것은 BufferdReader가 try~catch 블록 밖에 위치한 것이고 밑에 있는 것은 try~catch 예외 처리 블록 안에 위치한 것이다.
결론 ) 입력( BufferdReader) 역시 예외 처리 안에 위치하는 것이 속도 향상의 효과가 더 있다!!
🛠 Solution
💡 결과적으로, 성능 향상을 원한다면 입출력에 향상을 주는 메서드를 사용하자. 특히, 출력 시에 배열과 같은 반복문을 사용했다면 StringBuilder 사용 권장한다
입력 ) BufferdReader 출력) StringBuilder
'Algorithm' 카테고리의 다른 글
[프로그래머스] (181925) 수 조작하기2 (0) | 2023.12.24 |
---|---|
[프로그래머스] (181926) 수 조작하기1 (0) | 2023.12.24 |
[프로그래머스] (181927) 마지막 두 원소 (0) | 2023.12.24 |
[프로그래머스] (181928) 이어 붙인 수 (1) | 2023.12.24 |
[프로그래머스] (181932) 코드 처리하기 (0) | 2023.12.23 |