면접에서 만났던, 그 당시엔 너무 낯설던, 그 문제들을 복기하는 포스트
1. 잡설
2020.10.26 (월) 오프라인 면접이 두 곳 있었다. 오전 한 곳 오후 한 곳이었는데.
소소한 꿀잼은 오전에 지원자로 같이 면접에 들어갔던 한 분을 오후에 다른 회사에서 또 만났던 것이다 ㅋㅋㅋ
첫 면접지에서 면접 전에도 수다 좀 떨었고 면접 후에도 약간 대화를 나눴는데
두번째 면접지에서 또 만나서 서로 보자마자 반가웠다 ㅋㅋㅋㅋ
하지만 그 시간은 3분도 채 안돼서 바로 시험이 진행됐다 ㅋ
그리고 시험 끝나고 또 대화좀 나누고 헤어졌다 ㅋㅋ
잘생기고 키 크고 멋진 분이셨는데 느껴지는 인상이 앞으로도 잘 되실 것 같았다.
2. 요약
아 암튼.
두 회사 모두 객관식 문제가 있었는데 그건 기억이 안나니 넘기고.
첫번째 회사는 최댓값 구하기, 두 개 뽑아서 더하기, 스킬트리 이렇게 세 문제가 기억에 나고.
두번째 회사는 간단한 게시판 데이터 출력 구현이었다.
첫회사의 세 문제는 프로그래머스의 문제 그대로 나온 거였고
두번쨰 회사의 문제는 실전 코딩이었는데 테이블과 백단로직이 모두 구현되어 있어서
컨트롤러와 view만 구현하면 되는 것이었다.
준비된 서비스 객체로 데이터를 끌어와서 mav에 넣어주고 foreach 돌리면 끝나는 간단한 거였다.
그나마 까다로운 부분이 있다면 세자리 컴마와 날짜 포메팅 부분이었다.
말은 아주 쉽게 잘 본것처럼 하고 있지만...
사실 둘다 시간에 쫓겨 형편없이 제출하고 말았다;;
하지만. 소오는 잃어도. 외양간은 고쳐야 한다.
ㄱㄱ
3. 복기
코딩테스트 연습에 공개된 문제들은
1. 광고가 없는 블로그이고 2. 출처를 밝히면
포스팅이 가능하다고 한다.
출처: 프로그래머스 코딩 테스트 연습, https://programmers.co.kr/learn/challenges
3-1. 최댓값 구하기
programmers.co.kr/learn/courses/30/lessons/59415
어려운 문제에 시간을 더 투자해야 한다는 생각 때문에 후다닥 한답시고
SELECT max(datetime) FROM ANIMAL_INS;
SELECT max(datetime) FROM ANIMAL_INS;
라고 적어버렸다...
요구되는 결과는 위와 같이 시간 이라고 표기되어야 하기 때문에
FROM 절 전에 AS '시간' 이 추가되었어야 했다;;;
3-2. 두 개 뽑아서 더하기
programmers.co.kr/learn/courses/30/lessons/68644
프로그래머스에서 시험을 진행한 게 아니고
자사 웹 페이지 내에 박혀있는... 그냥 textarea에다가 적는 거라서
자동 완성기능, 테스트, 디버그가 아예 불가능했다.
그래서.. 어떻게든 조금이라도 어필해보려고
내가 접근한 방식과 논리절차들을 주석을 통해 어필하려 했다..ㅋㅋㅋ...
내 접근 방식은 이러했다.
1. 오름차순으로 정렬한다.
2. 이중 for문으로 모든 조합의 합을 배열에 담는다.
3. 2번 과정중 배열 내 마지막 인덱스 값 보다 크지 않으면 담지 않는다.(중복제거)
4. 배열을 리턴한다.
문제를 다 풀고 다른 분들의 답을 보니 정말 나의 코드가 너무 형편없다 ㅠㅠㅠ 슬프다...
Set, Iterator .... 이런거 거의 안써왔었는데...
앞으로 코테 연습도 하려면 이런거 무조건 익혀야겠다 넘나 슬프다 ㅠㅠㅠ
아름답지 못한 코드여도 일단 남겨본다... 또륵...........
아 근데 정말 코테라면... 스트림까지 좀 다룰 줄 알아야 간결해서 보기도 좋고 시간도 절약될듯....
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
|
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class 두_개_뽑아서_더하기 {
public int[] solution(int[] numbers) {
// 1. 리스트로 변환
List<Integer> _list = new ArrayList<>();
for(int num : numbers) _list.add(num);
// 2. 중복 없는 합의 조합 생성
List<Integer> list = new ArrayList<>();
for (int i = 0; i < _list.size()-1; i++) {
for (int j = i+1; j < _list.size(); j++) {
if(!list.contains(_list.get(i) + _list.get(j))) {
list.add(_list.get(i) + _list.get(j));
}
}
}
// 3. 오름차순 정렬 후 배열로 변환
Collections.sort(list);
int[] answer = new int[list.size()];
for (int i = 0; i < answer.length; i++) {
answer[i] = list.get(i);
}
return answer;
}
}
|
cs |
set을 사용해 개선해봤지만...
코드의 길이에는 큰 차이가 없당 ㅠ
더 간결하게는 아직인거같다....ㅠㅠㅠ
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
public int[] solution(int[] numbers) {
//Set은 순서도 없고, 중복도 없다.
//List는 순서도 있고, 중복도 가능하다.
// 1. 모든 합의 경우의 수를 중복 없이 Set에 저장한다
Set<Integer> set = new HashSet<>();
for (int i = 0; i < numbers.length-1; i++) {
for (int j = i+1; j < numbers.length; j++) {
set.add(numbers[i] + numbers[j]);
}
}
// 2. Set 사이즈만큼의 배열을 선언하고 set의 값들을 담는다.
int[] answer = new int[set.size()];
Iterator<Integer> it = set.iterator();
while(it.hasNext()) {
for (int i = 0; i < answer.length; i++) {
answer[i] = it.next();
}
}
// 3. 정렬 후 리턴
Arrays.sort(answer);
return answer;
}
|
cs |
3-3. 스킬트리
programmers.co.kr/learn/courses/30/lessons/49993
하아... IDE의 도움 없이는 정말 좀 힘든 것 같다...
최소 스택트레이스 정도는 읽을 수 있어야 어떻게든 짜는데...
코테 환경은 당시 그냥 plain text로 짜야하는 곳이었다.. tab 조차 안돼서 스페이스 네 칸을 복붙했다 ㅋㅋ...
거의 하루가 걸려서야 풀어냈다 하아..
Arrays 클래스에 있는 스태틱 메소드들과 리스트 관련 메소드들 정말 이해가 필요한것같다..
정규식도 그렇다.... ㅠㅠ
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
|
package Summer_Winter_Coding_2018;
import java.util.ArrayList;
import java.util.List;
public class 스킬트리 {
public int solution(String skill, String[] skill_trees) {
// 사용 가능한 스킬트리 카운터 선언
int answer = 0;
// 스킬 트리 기준을 char 배열로 변환
char[] s = skill.toCharArray();
// 검증대상 스킬트리에서 기준char의 인덱스를 담을 배열 선언
List<Integer> list = new ArrayList<>();
// 주어진 스킬트리들을 돌면서
for (int i = 0; i < skill_trees.length; i++) {
//하나를 꺼내서 char[] 배열로 변환하고
char[] target = skill_trees[i].toCharArray();
// 인덱스 담을 배열을 초기화
list = new ArrayList<>();
// 검증 여부를 체크할 boolean 객체 선언
boolean isPossible = true;
// 스킬트리 기준을 돌면서
for (int j = 0; j < s.length; j++) {
// 검증대상을 한글자씩 비교해서 같은 녀석을 찾을때마다 인덱스를 저장하되
for (int j2 = 0; j2 < target.length; j2++) {
if(target[j2] == s[j]) {
list.add(j2);
// 오름차순 정렬이 아니라면 순서가 틀린 거니까 false 검증처리
if(list.size() > 1 && list.get(list.size()-2) > list.get(list.size()-1)) {
isPossible = false;
}
// 선행스킬이 필요한데 없을 경우도 false 검증 처리
if(list.size() != j+1) isPossible = false;
}
}
}
// 검증 통과시 카운팅
if(isPossible) answer++;
}
return answer;
}
}
|
cs |
3-4. HashMap
자바스크립트에선 맵을 자주 썼는데 .. 자바에선 거의 안 썼다.
나는 DTO 나 VO를 이용해서 값 전달하는걸 선호하는 편이었다.
그래서 자바 해시맵에서 사용될만한 기본 메소드를 좀 정리해봤다.
코드보기
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
|
public static void main(String[] args) {
// Key 중복 불가, Value 중복 가능
// Value null 가능
Map<String, Object> map = new HashMap();
// K,V 추가 : put(K, V)
map.put("카페", "커피를 먹쟈");
map.put("희망연봉", 3000);
map.put("희망몸무게", 72.4);
// 키를 지정해서 밸류 하나만 꺼내기. 없는 키를 파라메타로 전달하면 null을 리턴 : get(K)
System.out.println(map.get("희망몸무게")); // 72.4
// 키, 밸류 전체 순회 : entrySet() + iterator()
Iterator it = map.entrySet().iterator();
while(it.hasNext()) {
System.out.println(it.next()); // 키=밸류 형식으로 출력됨
}
// 키 전체 순회 : keySet() + iterator()
Iterator it2 = map.keySet().iterator();
while(it2.hasNext()) {
System.out.println(it2.next());
}
// 밸류 전체 순회 : values() + iterator()
Iterator it3 = map.values().iterator();
while(it3.hasNext()) {
System.out.println(it3.next());
}
// 키 존재 검증 : containsKey(K)
System.out.println(map.containsKey("희망몸무게")); // true
System.out.println(map.containsKey("가즈아")); // false
// 밸류 존재 검증 : containsValue(V)
System.out.println(map.containsValue(3000)); // true
System.out.println(map.containsValue(3001)); // false
// 키 밸류 쌍의 확인 : size()
System.out.println(map.size()); // 3
// 키를 지정해서 밸류를 변경 : replace(K, newV)
map.replace("희망연봉", 4000);
System.out.println(map.get("희망연봉")); // 4000
// 키를 지정해서 키 밸류 쌍 제거 : remove(K)
map.remove("희망몸무게");
System.out.println(map.get("희망몸무게")); // null
System.out.println(map.size()); // 2
// 키, 현재밸류, 변경할밸류를 전달해서 변경 : replace(K, oldV, newV)
// 키와 현재 밸류가 일치하지 않을경우 변경되지 않고 false를 리턴
System.out.println(map.replace("희망연봉", 4000, 3000)); // true
System.out.println(map.get("희망연봉")); // 3000
System.out.println(map.replace("희망연봉", 4000, 3000)); // false
System.out.println(map.get("희망연봉")); // 3000
// 리스트 담기 : put(K, V)
List<String> list = new ArrayList<>();
list.add("자바");
list.add("자바스크립트");
map.put("사용언어", list);
System.out.println(map.get("사용언어")); // [자바, 자바스크립트]
// 다른 맵의 키 밸류를 모두 넣어버리기 : putAll(Map<K, V>)
Map<String, Object> map2 = new HashMap();
map2.put("치킨엔", "맥주");
map2.put("떡볶이엔", "어묵쓰");
map.putAll(map2);
// 키 밸류 모두 제거 및 비어있는지 확인 : clear(), isEmpty()
System.out.println(map.isEmpty()); // false
map.clear();
System.out.println(map.isEmpty()); // true
}
|
cs |
4. 마치며
공부할 게 참 많구낭.
시간복잡도, 공간복잡도 개념도 아직 전무하고
컬렉션 프레임워크들과 스트링, 캐릭터, 배열 다루는 법도 한참 미숙하다.
그래도. 그래도! 계속 늘고 있다.
면접도 볼수록 느는게 느껴진다.
인내심을 갖고. 조급해하지 말고. 계속 노력해보자.
조금만 더 하면 될 것만 같다...
'Algorithm' 카테고리의 다른 글
프로그래머스 소수 찾기 (0) | 2021.05.30 |
---|---|
프로그래머스 월간 코드 챌린지 시즌2 4월 후기 (1) | 2021.04.15 |
콜라츠 추측 (프로그래머스, Java, Level1) (0) | 2020.07.07 |
K번째 수 (프로그래머스, Java, Level1) (0) | 2020.07.07 |
Selection Sort 구현해보기 (0) | 2020.07.06 |