코테스터디를 시작하면서 코테 문제를 풀게 되었습니다. two pointer문제입니다!!
https://www.acmicpc.net/problem/11728
StringBuilder?
String은 기본적으로 변경 불가능한 문자열을 생성합니다. + 연산자로 문자열을 합칠 수 있으나 거기에는 엄청난 메모리 소모가 일어납니다. 이래서 변경 가능한 문자열로 만들어주는 것이 바로 StringBuilder입니다.
public class Main {
public static void main(String[] args) {
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append("문자열 ").append("연결");
// String str = stringBuilder; // String에 StringBuilder를 그대로 넣을 순 없다. toString()을 붙여야 한다
String str = stringBuilder.toString();
// 두 println()은 같은 값을 출력한다
System.out.println(stringBuilder);
System.out.println(str);
}
}
사실 이것을 먼저 배운 이유는 이번 문제를 풀다 모르겠어서 찾아보는데 모두 Stringbuilder를 사용했기 때문입니다.
문제에서 배열을 반환해라가 아닌, 정렬된 결과를 출력하라고 해서 StringBuilder로 나온 결과를 출력하는 듯 합니다. 새로운 것을 또 배웠네요 ㅎㅎ 저는 프로그래머스가 좀 더 편해서 그것만 쓰다 백준을 풀려니 처음이 너무 어렵더라고요...
실패는 성공의 어머니겠죠.... 근데 이렇게 보니 실패 많이 안 한 것 같기도 하네요.. ㅜㅜㅜㅜㅜㅜㅜㅜ 다시해볼게요
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Scanner;
import java.util.StringTokenizer;
public class Back11728 {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
int N = Integer.parseInt(st.nextToken());
int M = Integer.parseInt(st.nextToken());
int max=0, min=0;
st = new StringTokenizer(br.readLine());
int[] A = new int[N];
for(int i = 0; i < N; i++) {
A[i]=Integer.parseInt(st.nextToken());
}
st = new StringTokenizer(br.readLine());
int[] B = new int[M];
for(int i = 0; i < M; i++) {
B[i] = Integer.parseInt(st.nextToken());
}
int[] arr = new int[N+M];
int p1=0, p2=0, j=0;
while(p1 < N && p2 < M ) {
if(A[p1]<=B[p2])
arr[j++] = A[p1++];
else
arr[j++] = B[p2++];
}
while(p1 < N) {
arr[j++] = A[p1++];
}
while(p2 < M) {
arr[j++] = B[p2++];
}
for(int i=0; i<arr.length; i++) {
System.out.print(arr[i]+" ");
}
}
}
이렇게 했는데 시간초과가...띠로리
1.5초에 100만까지 데이터가 있는데 1초에 연산가능한 데이터는 1억이기 때문에.. 지금 제가 한 것은 보면 600만 아닌가? 흠 암튼 안되네요...
지피티에게 물어본 결과..! 이렇다고 합니다. 이래서 다들 StringBuilder를 썻군하고 수긍하게 되었습니다.
제출한 코드
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Scanner;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
int N = Integer.parseInt(st.nextToken());
int M = Integer.parseInt(st.nextToken());
int max=0, min=0;
st = new StringTokenizer(br.readLine());
int[] A = new int[N];
for(int i = 0; i < N; i++) {
A[i]=Integer.parseInt(st.nextToken());
}
st = new StringTokenizer(br.readLine());
int[] B = new int[M];
for(int i = 0; i < M; i++) {
B[i] = Integer.parseInt(st.nextToken());
}
int[] arr = new int[N+M];
StringBuilder sb = new StringBuilder();
int p1 = 0, p2 = 0, j = 0;
while(p1 < N && p2 < M) {
if(A[p1] <= B[p2])
sb.append(A[p1++]).append(" ");
else
sb.append(B[p2++]).append(" ");
}
while(p1 < N) {
sb.append(A[p1++]).append(" ");
}
while(p2 < M) {
sb.append(B[p2++]).append(" ");
}
System.out.println(sb);
}
}
출처
'코딩테스트 문제' 카테고리의 다른 글
[SWEA] D2 | 달팽이문제 (JAVA) (0) | 2024.05.19 |
---|---|
[SWEA] D2 | 백만장자 (JAVA) (0) | 2024.05.18 |
[백준]1940 주몽(투포인터 응용문제) (2) | 2024.05.15 |
[백준]2018_투포인터 (0) | 2024.05.15 |
[프로그래머스] 점 찍기 (0) | 2024.05.03 |