인프런 커뮤니티 질문&답변

ti4884님의 프로필 이미지
ti4884

작성한 질문수

자바(Java) 알고리즘 문제풀이 입문: 코딩테스트 대비

2. 공통원소구하기(two pointers algorithm)

조건문에 의한 시간초과

작성

·

231

·

수정됨

0

package 인프런;

import java.io.*;
import java.util.*;

public class i0302 {
	
	public static ArrayList<Integer> solution (int N, int M, int[] arrN, int[] arrM) {
		ArrayList<Integer> answer = new ArrayList<>();
		
		Arrays.sort(arrN);
		Arrays.sort(arrM);

		int p1 = 0;
		int p2 = 0;
		
		while(p1 < N && p2 < M) {
			
			if (arrN[p1] == arrM[p2]) {
				answer.add(arrN[p1]);
				p1++;
				p2++;
			} else if (arrN[p1] > arrM[p2]) {
				p2++;
			} else if (arrN[p1] < arrM[p1]) {
				p1++; // 여기가 문제
			}
		}
		
		
		return answer;
	}

	public static void main(String[] args) throws Exception {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st;
		
		st = new StringTokenizer(br.readLine());
		int N = Integer.parseInt(st.nextToken());
		int[] arrN = new int[N];

		st = new StringTokenizer(br.readLine());
		for (int i = 0; i < N; i++) {
			arrN[i] = Integer.parseInt(st.nextToken());
		}

		st = new StringTokenizer(br.readLine());
		int M = Integer.parseInt(st.nextToken());
		int[] arrM = new int[M];

		st = new StringTokenizer(br.readLine());
		for (int i = 0; i < M; i++) {
			arrM[i] = Integer.parseInt(st.nextToken());
		}
		
		ArrayList<Integer> answer = solution(N, M, arrN, arrM);
		
		for(int x: answer) {
			System.out.print(x + " ");
		}
		
	}

}

 

안녕하세요. 강의 학습 전에 코드를 작성했는데 자꾸 시간초과가 나서 확인해보니 강사님 강의에서 14번째 라인(else p2++)를 저는 else if를 사용해서 나는 문제였던 것 같습니다.

 

마지막에 else if를 else로 바꾸는 것이 크리티컬하게 성능 차이를 낼 수 있는 것인가가 궁금합니다. 감사합니다.

 

답변 1

0

안녕하세요, 인프런 AI 인턴입니다.

ti4884님의 질문에 답변 드리겠습니다.

코드의 14번째 라인에서 else if를 사용하는 대신 else를 사용하라는 조언을 받으셨군요. 실제로 이 조건문이 크리티컬한 성능 차이를 만들 수 있는지 여부에 대한 궁금증은 매우 타당합니다.

else if 대신 else를 사용하는 것은 한 가지 가능성에 대한 처리를 명시적으로 범위를 정하는 대신 나머지 모든 경우를 포괄하는 방식으로 바꾸는 것입니다. 주어진 상황에서 arrN[p1]arrM[p2]가 같지 않고 arrN[p1]arrM[p2]보다 크지 않다면, 마지막 남은 경우의 수는 arrN[p1]arrM[p2]보다 작은 것밖에 없습니다. 따라서 이 마지막 조건을 체크하기 위해 else if 대신 단순히 else를 사용하면 조건을 평가하는 데 걸리는 시간을 절약할 수 있습니다.

하지만, 일반적인 상황에서는 이러한 조건문 변경이 큰 성능 차이를 만들지는 않습니다. 그럼에도 불구하고, 매우 많은 데이터를 처리하거나, 반복문 내에서 수행되는 조건문에서 else if 대신 else를 사용하면, 그 반복의 횟수가 많을수록 성능 개선이 될 수 있습니다.

물론, 시간 초과의 주된 원인은 보통 알고리즘의 시간 복잡도와 관련이 있는 경우가 훨씬 많습니다. 주어진 코드에서 조건문의 최적화보다는 다른 부분에서의 개선이 필요할 수도 있습니다.

간단하게 말씀드리면, elseelse if의 성능 차이가 크게 나타날 수 있는 상황은 대량의 데이터 처리나 반복문 내 빈번한 조건 체크 등 특정 조건에서만 발생합니다. 문제의 근본적인 원인을 해결하기 위해서는 전체적인 알고리즘의 효율성을 고려해야 합니다.

코딩 테스트를 준비하시며 더 좋은 성과를 내실 수 있기를 바라며, 추가적으로 궁금한 점이 있다면 언제든 질문 주세요.

ti4884님의 프로필 이미지
ti4884

작성한 질문수

질문하기