테크타카 면접 후기

가연우·2022년 5월 13일
0

카카오벤처스

목록 보기
2/3

✨ 5/12 학교에서 진행한 테크타카 면접 후기입니다.

테크타카는 자기소개나 이런 것 하나 없이 먼저 문제를 풀고 그 문제를 어떻게 풀었는지에 대해 얘기를 나누었습니다.

문제 1.

문자열이 주어지면 문자열의 Segment의 수를 반환하면 됩니다. Segment는 연속한 것으로 정의됩니다. (공백문자 제외)

예 1)
입력 : s = "Hello, my name is Argo"
출력 : 5

예 2)
입력 : s = "Hello"
출력 : 1

예 3)
입력 : s = ""
출력 : 0

예 4)
입력 : s = "my sister-in-law's mother"
출력 3

메소드를 구현해주세요.

public int countSegments(String s){
	
}

작성한 답안 1

public int countSegments(String s){
	String[] seg = s.trim().split(" ");
    return seg.length;
}

문제 풀이
먼저 문자열에 trim메서드를 사용하여 앞뒤 공백을 지웠습니다. 그후 split을 사용하여 공백을 기준으로 나누어 배열에 저장한 후 해당되는 배열의 길이를 반환하였습니다.

질문 1) split을 사용하면 시간 복잡도가 어떻게 될까요? split은 어떻게 동작할까요?
split은 문자열의 길이만큼 반복하여 해당되는 매개변수를 찾아 나눈다고 생각합니다. O(n)이라고 생각합니다.

질문 2) 그럼 3번 예시와 같은 경우에는 어떨까요?
동작하지 않을 것 같습니다. 그래서 다른 방법을 구현하였습니다.

작성한 답안 2

public int countSegments(String s){
	int answer = 0;
    for(int i=0; i<s.length(); i++){
    	if(s.charAt(i) == ' ') answer++; 
    }
    if(s.length()!=0) return answer+1;
    else return 0;
}

문제 풀이
문자열의 길이만큼 반복문을 돌려 공백이 나올 때마다 answer를 증가하였습니다. 단어의 수는 공백+1이므로 공백의 수에 1을 더한 값을 반환하였습니다. 아까 말씀하신대로 만약 문자열의 길이가 0인 경우는 0을 반환하였습니다.

훨씬 잘 푸셨네요.
감사합니다


문제 2.

정렬되지 않은 정수 배열이 있다. 두 수의 합(정수) 어떤 수가 주어지면 이 수가 배열에 있는 수로 구성할 수 있으면 true 아니면 false를 리턴하는 함수입니다. 즉, 배열 [3,5,1,12,13,15,19,22,-33,...4] 가 있고 두수의 합이 9가 주어지면 함수는 true를 반환됩니다.(단, 배열에 중복된 숫자는 없습니다.)
아래 코드를 검토하시고 시간 복잡도를 개선해보세요.

O(n^2)

public boolean solution(int[] nums, int target){
	for(int i=0; i<nums.length; i++){
    	for(int j=i+1; j<nums.length; j++){
        	if(target == (nums[i]+nums[j])){
            	return true;
            }
        }
    }
    return false;
}

개선코드

public boolean solution(int[] nums, int target){
	
}

여러가지 답안을 썼지만 가장 얘기를 많이 나눈 답안입니다.

작성한 답안

public boolean solution(int[] nums, int target){
	ArrayList<Integer> numList = Arrays.asList(nums);
    for(int i=0; i<nums.length; i++){
    	int val = target - nums[i];
        if(numList.contains(val)) return true;
    }
    return false;
}

문제 풀이
nums를 arrayList로 변환하여 contains 메서드를 사용하였습니다. val은 target에서 nums[i]를 뺐는데 val가 target이 될 수 있는 수를 뜻합니다. 만약 배열 안에 값이 있다면 target이 될 수 있는 수가 있다는 뜻이므로 true를 반환합니다. 만약 반복문을 돌아도 없다면 false를 반환합니다.

질문 1) contains는 어떻게 작동할까요?
해당되는 배열을 돌며 값을 찾을 것 같습니다.

질문 2) 그럼 루프 안에 루프여서 똑같지 않을까요?
맞는 것 같습니다..

질문 3) 혹시 다른 자료구조 알고 계신 거 있으실까요?
queue와 stack, map과 set을 알고 있습니다.

질문 4) 그럼 map이나 set을 사용하면 어떻게 될까요?
어.. 잘 모르겠습니다. 혹시 힌트를 주실 수 있으신가요?

질문 5) set의 특징이 뭔가요?
set은 중복된 값을 가지지 않습니다.

질문 6) 그럼 한번 다시 생각해보실까요?
(고민을 많이 했지만ㅜㅜ) 생각 나지 않습니다.

질문 7) hashset에도 contains가 있습니다. 이 contains를 사용하면 어떻게 될까요?
음...

질문 8) hash가 어떻게 동작하시는지 아시나요?
해시는 들어온 값을 치환하는 것으로 알고 있습니다.

질문 9) 네 맞는 말입니다. 그래서 hash의 contains를 쓰면 시간 복잡도가 O(n^1)이 됩니다. 왜 그럴까요?
잘 모르겠습니다.

질문 10) 해시는 변환된 값을 주소값으로 하여 저장하기 때문에 바로 가져올 수 있습니다.
(중간에 맞장구)

질문 11) 그렇다면 왜 시간복잡도를 줄여야할까요?
실행 속도가 빨라지기 때문입니다.

질문 12) 맞는 말이지만 다른 이유가 하나 더 있습니다. 무엇일까요?
어...

질문 13) cpu나 다른 자원의 사용량을 줄일 수 있기 때문입니다. 그럼 혹시 질문이 있으실까요?
면접 진행 후 코딩테스트를 진행할까요?

질문 14) 오늘 면접 후 코딩테스트와 면접을 더 진행할 예정입니다. 또 다른 질문이 있으실까요?
(서비스와 관련된 질문)

수고하셨습니다.
수고하셨습니다.



사실 테크타카 면접 분위기 자체는 되게 부드럽고 편했다. 다만 내가 자료구조에 대해 잘 알지 못하여 제대로 대답을 못해서 너무 싫었다. 끝부분은 거의 대답을 못하다시피해서 면접이 끝나자마자 망했다를 직감했다. 근데 놀랍게도 1차 면접을 합격했다!! contains를 사용한 사람이 나밖에 없었다는 듯한 다른 친구들의 말을 들어보니 그게 상당히 큰 역할을 한 것 같다. 정말 운이 좋았던 것 같다. 당장 16일에 라이브 코딩과 리더십 면접이 있으니 열심히 준비해야겠다!! 자료구조 부셔!!

다시 풀어본 문제 2 - ArrayList 사용

import java.util.*;

class Main{
    public static void main(String[] args){
        int arr[] = new int[]{1,2,3,4,5};
        System.out.println(improveSolution(arr, 9));
    }
    
    static boolean improveSolution(int[] nums, int target){
        List<Integer> arrayList = new ArrayList<>();
        for (int ele : nums) {
            arrayList.add(ele);
        }
        
        for(int i=0; i<arrayList.size(); i++){
            int val = target-arrayList.get(i);
            if(arrayList.contains(val)) return true;
        }
        return false;
    }
}

다시 풀어본 문제 2 - HashSet 사용

import java.util.*;

class Main{
    public static void main(String[] args){
        int arr[] = new int[]{1,2,3,4,5};
        System.out.println(improveSolution(arr, 9));
    }
    
    static boolean improveSolution(int[] nums, int target){
        Set<Integer> set = new HashSet<>();
        for (int element : nums) {
            set.add(element);
        }
        
        Iterator iter = set.iterator();	// Iterator 사용
        while(iter.hasNext()) {//값이 있으면 true 없으면 false
            int val = target-(int)iter.next();
            if(set.contains(val)) return true;
        }
        return false;
    }
}
profile
헐 제가 회사를 다니면서 개발을 하고 있어요 이게 무슨 일이죠?

1개의 댓글

comment-user-thumbnail
2022년 8월 31일

잘봤습니다!

답글 달기