본문 바로가기

코딩테스트 문제

[코테스터디]백준 11728 : 배열합치기 | two pointer

코테스터디를 시작하면서 코테 문제를 풀게 되었습니다. 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);
	}
}

 

출처

https://onlyfor-me-blog.tistory.com/317

'코딩테스트 문제' 카테고리의 다른 글

[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