요즈음 매일 1곳 정돈 이력서를 지원하며 지내다가 난생처음 장염에 걸려서 1주일을 넘게 앓아누웠다. 스트레스 탓인지, 아니면 뭘 잘못 먹었는데 나이가 들어서 몸에서 바로 반응이 온 건지는 모르겠으나 진짜 죽는 줄 알았다. 이제는 어느 정도 회복되어 다시 이력서를 조금씩 작성하기 시작하면서 SSAFY 9기 모집 광고를 보게 되었다.
좀 쉬어갈 겸(사실 지금도 공부 내용은 포스팅을 안하고있지만..) 기억 속에서 SSAFY 면접 내용이 완전히 사라지기 전에 글로 남겨볼까 해서 글을 작성한다.
사실 나는 SAFFY에 총 3번을 지원했고 면접까지 간 건 한 번밖에 안되긴 한다. 3기, 7기, 8기에 지원했으며 3기는 대학 졸업 후 지원했고 7, 8기는 퇴사 후 지원했다. 3기에 처음 지원하여 서류 광탈 후 서울로 올라와 국비 지원교육을 듣고 회사에 다니게 되었다.
이후 1년이 넘도록 실제 서비스로 이루어진 프로젝트도 없다 보니 성취감도 느끼지 못하고 있었고 내가 생각하던 개발자와는 거리가 너무 멀어져 있어 늘 이직에 대해 고민을 하게 되었다.
결정적으로 부서장의 사실상 부서 정리나 다름없는 결정으로 인해 사측에 퇴사 의사를 밝히게 되었고, 이때 클라우드 부서에서 일해보지 않겠냐는 제안을 받았다. 이쪽의 부서장분은 현업 개발자로 일한 적은 없어도 전공이 컴퓨터공학 쪽이셔서 개발자에 대한 이해가 있으신 분이셨으나 마찬가지로 신설 부서였단 점이 마음에 걸려 거절하고 그렇게 나는 준비도 되지 않은 채 퇴사하게 되었다.
퇴사 후엔 마침 시기가 맞아떨어져 입사 전부터 가고 싶었던 SAFFY 7기에 지원하게 되었고 이때 면접까지 가게 되었다.
보안서약서를 작성했기에 자세하겐 말할 수 없으나 밖에 알려진 내용대로 간단히 설명하자면 면접을 보러 가면 간이 검증 CBT를 한 번 보고, 트렌드와 관련된 주제의 질문을 받아 그에 대한 내용으로 PT 형태, 그리고 자소서에 관한 질문들로 면접을 보게 된다.
돌이켜보면 이때 면접을 못 봐도 너무 못 봤었다. 현업에서 일했었는데 바로 취업하면 좋지 않겠느냐는 질문을 받았다. 지금 생각하면 어떤 쪽으로 일을 해나가고 싶고 해당 일을 하기 위해선 어떤 식으로 커리어 개발을 해야 하는데 ~한 부분에서 SAFFY가 도움이 많이 될 것 같다 라는 식으로 답했을 것 같다. 하지만 당시 자신감이 바닥나있던 상태라 단순히 제가 부족해서 실력적으로 보완하고 싶다 말하였고 그렇게 나는 떨어졌다.
당시엔 기술 기반 질문들은 그런대로 답하였기에 자소서 기반 질문을 망친 건 생각지도 않고 근자감에 차 있다가 떨어졌단 충격과 그동안의 번아웃으로 인해 바로 구직활동을 시작하지 않고 휴식 기간을 가졌다. (주로 게임을 하며..)
이후 마지막으로(나이제한) SAFFY 8기에 지원했다. 이때는 면접까지 가진 못했고, 삼성에 다니는 주변지인에 의하면 95년생을 위주로 뽑았단 말을 들었다. 아쉽긴 하지만 이미 맘을 다 비우고 지원했어서 그런지 별 감흥은 없었고 그렇게 현재 취준중이다.
불합격한 사람의 말이 신빙성이 있을진 모르겠으나..
사설이 길었지만 요약하면 최신 트렌드와 관련한 기술에 대해 깊이 이해하고 있어 남들에게 설명할 수 있을정도, 자소서 기반으로 꼬리를 무는 질문에 대한 답이 가능하면 충분히 좋은 결과를 받을 수 있을것같다.
자연수가 들어있는 배열에서 숫자 K개를 선택하려 합니다. 이때, 선택한 숫자 중 가장 큰 수와 가장 작은 수의 차이가 최소가 되도록 해야합니다.
예를 들어 배열에 들어있는 숫자가 [9, 11, 9, 6, 4, 19] 이고, K = 4 라면
숫자 4개를 [9, 11, 9, 6]로 뽑으면 (가장 큰 수 - 가장 작은 수) = (11 - 6) = 5가 됩니다.
[9, 9, 6, 4] 와 같이 숫자를 뽑아도 (가장 큰 수 - 가장 작은 수) = (9 - 4) = 5가 됩니다.
그러나 가장 큰 수와 가장 작은 수의 차이가 5보다 작아지도록 숫자 4개를 선택하는 방법은 없습니다.
자연수가 들어있는 배열 arr, 선택해야 하는 숫자 개수 K가 매개변수로 주어질 때, 선택한 숫자중 가장 큰 수와 가장 작은 수의 차이가 최소가 되록 arr에서 숫자 K개를 선택했을 때, 그때의 가장 큰 수와 가장 작은 수의 차이를 return 하도록 solution 메소드를 완성해주세요.
매개변수 설명
자연수가 들어있는 배열 arr, 선택해야 하는 숫자 개수 K가 solution 메소드의 매개변수로 주어집니다.
arr 배열의 길이는 5 이상 1,000 이하입니다.
arr의 원소는 1 이상 10,000 이하인 자연수입니다.
K 는 4 이상 50 이하인 자연수입니다.
return 값 설명
선택한 숫자중 가장 큰 수와 가장 작은 수의 차이가 최소가 되도록 arr에서 숫자 K개를 선택했을 때, 그때의 가장 큰 수와 가장 작은 수의 차이를 return 해주세요.
예제
arr
K
return
[9, 11, 9, 6, 4, 19]
4
5
예제 설명
예제 #1 문제의 예제와 같습니다.
문제 풀이
1. 입력받은 배열을 정렬한다.
2. 정렬된 배열에서 K개씩 뽑아서 가장 큰 수 - 작은 수의 차이를
3. 현재 answer와 비교해서 작은 수를 answer에 담아준다.
4. 이를 for 문을 통해 계속 비교해준다.
// 다음과 같이 import를 사용할 수 있습니다.
import java.util.*;
class Solution {
public int solution(int[] arr, int K) {
// 여기에 코드를 작성해주세요.
Arrays.sort(arr);
int answer = arr[arr.length-1];
for(int i = 0 ; i < arr.length-K+1 ; i++){
answer = Math.min(answer,arr[i+K-1]-arr[i]);
}
return answer;
}
// 아래는 테스트케이스 출력을 해보기 위한 main 메소드입니다.
public static void main(String[] args) {
Solution sol = new Solution();
int[] arr = {9, 11, 9, 6, 4, 19};
int K = 4;
int ret = sol.solution(arr, K);
// [실행] 버튼을 누르면 출력 값을 볼 수 있습니다.
System.out.println("solution 메소드의 반환 값은 " + ret + "입니다.");
}
}
1부터 n까지 숫자가 적힌 카드 뭉치를 다음 규칙에 따라 카드 뭉치를 섞었을 때, 아래에서부터 k번째에 있는 카드에 적힌 숫자를 알아내려합니다. 카드 뭉치 가장 아래에는 1이 쓰여있으며, 위로 갈수록 숫자가 커집니다. 카드 뭉치를 섞는 규칙은 다음과 같습니다.
1. 카드 뭉치를 정확히 반으로 나눕니다.
2. 두 개로 나뉜 카드 뭉치를 교차로 섞어서 카드 뭉치 하나를 만듭니다. 이때, 항상 1이 적힌 카드가 있는 뭉치를 아래로 놓고 섞습니다.
3. 위 과정을 반복합니다.
예를 들어, 1부터 6까지 숫자가 적힌 카드 뭉치를 3번 섞는다면 과정별로 아래에서부터 적힌 숫자는 다음과 같습니다.
횟수
카드 뭉치
1
[1, 4, 2, 5, 3, 6]
2
[1, 5, 4, 3, 2, 6]
3
[1, 3, 5, 2, 4, 6]
이때, 아래에서 3번째에 있는 카드에 적힌 숫자는 5입니다.
처음에 가장 위에 있는 카드에 적힌 숫자 n, 섞는 횟수 mix, 알고 싶은 카드의 위치 k가 매개변수로 주어질 때, 아래에서부터 k번째에 있는 카드에 적힌 숫자를 return 하도록 solution 메소드를 작성했습니다. 그러나, 코드 일부분이 잘못되어있기 때문에, 몇몇 입력에 대해서는 올바르게 동작하지 않습니다. 주어진 코드에서한 줄만 변경해서 모든 입력에 대해 올바르게 동작하도록 수정하세요.
매개변수 설명
처음에 가장 위에 있는 카드에 적힌 숫자 n, 섞는 횟수 mix, 알고 싶은 카드의 위치 k가 solution 메소드의 매개변수로 주어집니다.
n은 10 이상 50 이하인 짝수입니다.
카드는 0회 이상 10회 이하로 섞습니다.
k는 1 이상 n 이하인 자연수입니다.
return 값 설명
아래에서 k번째에 있는 카드에 적힌 숫자를 return 해주세요.
예제
n
mix
k
return
6
3
3
5
예제 설명
문제에 나온 예와 같습니다.
소스 코드
문제 풀이
소스 코드의 흐름을 살펴보면 카드 셔플을 위해 반씩 나누어 담기위한 배열로 cardA, cardB를 n의 절반 값으로 선언해주었다. 이후 짝수 홀수에 따라 번갈아가며 cardA와 cardB에 담고 이를 card에 담아주는 과정인데 cardA와 cardB에 담아주는 과정에서 cardB의 index에 오류가 있다. 이를 고쳐주면 된다.
class Solution {
public int solution(int n, int mix, int k) {
int answer = 0;
int[] card = new int[n];
for(int i = 0; i < n; i++)
card[i] = i+1;
while((mix--) != 0) {
int[] cardA = new int[n/2];
int[] cardB = new int[n/2];
for(int i = 0; i < n; i++) {
if(i < n/2)
cardA[i] = card[i];
else
cardB[i-(n/2)] = card[i];
}
for(int i = 0; i < n; i++) {
if(i % 2 == 0)
card[i] = cardA[i/2];
else
card[i] = cardB[i/2];
}
}
answer = card[k-1];
return answer;
}
A 게임은 4x4 격자 모양의 보드의 가장 왼쪽 위에서 가장 오른쪽 아래로 말을 이동시키면서 각 구역에 있는 코인을 획득하는 게임입니다. 이때, 말은 오른쪽 또는 아래쪽으로만 이동할 수 있습니다.
예를 들어, 보드가 아래와 같다면
아래의 경우가 코인을 최대로 획득할 수 있는 경우이고 이때 획득하는 코인은 38입니다.
각 구역에서 획득할 수 있는 코인 양을 담은 2차원 배열 board가 매개변수로 주어질 때, 최대로 획득할 수 있는 코인의 양을 return 하도록 solution 메소드를 작성했습니다. 그러나, 코드 일부분이 잘못되어있기 때문에, 몇몇 입력에 대해서는 올바르게 동작하지 않습니다. 주어진 코드에서 한 줄만 변경해서 모든 입력에 대해 올바르게 동작하도록 수정하세요.
매개변수 설명
각 구역에서 획득할 수 있는 코인 양을 담은 2차원 배열 board가 solution 메소드의 매개변수로 주어집니다.
4 x 4 크기인 정사각형 종이가 1 x 1 크기인 격자 칸으로 나누어져 있습니다. 이 종이를 가로축 혹은 세로축에 평행한 격자 선을 따라 한 번 접었을 때, 만나는 격자 칸에 적힌 숫자의 합이 최대가 되도록 하려 합니다. 종이를 접을 때는 만나는 격자 칸이 정확히 일치하도록 해야 합니다.
예를 들어 다음과 같이 4 x 4 크기인 종이가 있을 때,
종이는 점선 중 하나를 따라서 접을 수 있습니다. 이때, 붉은색 점선을 따라 종이를 접으면 36과 19가 적힌 칸이 정확히 만납니다. 두 숫자의 합은 55이며, 이때가 최댓값입니다.
4 x 4 크기인 정사각형 종이의 각 격자 칸에 적힌 숫자가 담긴 배열 grid가 매개변수로 주어질 때, 종이를 접었을 때 만나게 되는 격자 칸에 적힌 숫자의 합 중 최댓값을 return 하도록 solution 메소드를 작성했습니다. 그러나, 코드 일부분이 잘못되어있기 때문에, 몇몇 입력에 대해서는 올바르게 동작하지 않습니다. 주어진 코드에서한 줄만 변경해서 모든 입력에 대해 올바르게 동작하도록 수정하세요.
매개변수 설명
4 x 4 크기인 정사각형 종이의 각 격자 칸에 적힌 숫자가 담긴 배열 grid가 solution 메소드의 매개변수로 주어집니다.
각 격자칸에 적힌 수는 1 이상 100 이하인 자연수입니다.
return 값 설명
격자 선을 따라 종이를 한 번 접었을 때 만나는 격자 칸에 적힌 숫자의 합 중 최댓값을 return 해주세요.
직업에 아르바이트, 판매사원이 있습니다. 직원들 급여의 총합을 계산하기 위해 아래와 같이 Job, PartTimeJob, SalesJob 클래스를 작성했습니다.
Job :
Job : 직업을 나타내는 클래스입니다.
salary : 직업의 급여를 나타냅니다. 초기 급여는 0입니다.
getSalary : 직업의 급여를 return 합니다.
PartTimeJob :
PartTimeJob : 아르바이트를 나타내는 클래스이며 Job을 상속합니다.
workHour : 아르바이트를 한 시간입니다.
payPerHour : 아르바이트의 시간 당 급여입니다.
getSalary : 아르바이트 급여를 계산하여 return 합니다.
SalesJob :
SalesJob : 판매사원을 나타내는 클래스이며 Job을 상속합니다.
salesResult : 판매사원의 판매실적입니다.
payPerSale : 판매실적 당 급여입니다.
getSalary : 판매사원의 급여를 계산하여 return 합니다.
주어진 아르바이트, 판매사원 급여의 총합을 계산하려 합니다.
아르바이트는 기본적으로아르바이트를 한 시간 X 시간 당 급여를 받으며 40시간 이상 근무시 8시간만큼의 급여를 추가로 받습니다.
판매사원은 기본적으로판매실적 * 판매실적 당 급여를 받으며 판매실적이 10건이 넘으면 급여를 2배로, 20건이 넘으면 급여를 3배로 받습니다.
아르바이트의 정보가 담긴 2차원 배열 partTimeJobs, 판매사원의 정보가 담긴 2차원 배열 salesJobs가 매개변수로 주어질 때, 모든 직원들 급여의 총합을 return 하도록 solution 메소드를 작성하려 합니다. 위 클래스 구조를 참고하여 주어진 코드의 빈칸을 적절히 채워 전체 코드를 완성해주세요.
매개변수 설명
아르바이트의 정보가 담긴 2차원 배열 partTimeJobs, 판매사원의 정보가 담긴 2차원 배열 salesJobs가 solution 메소드의 매개변수로 주어집니다.
partTimeJobs는 길이가 1이상10이하인 2차원 배열입니다.
partTimeJobs의 각 원소는 [아르바이트를 한 시간, 시간 당 급여]입니다.
아르바이트를 한 시간은 1이상100이하입니다.
시간 당 급여는 1,000이상20,000이하입니다.
salesJobs은 길이가 1이상10이하인 2차원 배열입니다.
salesJobs의 각 원소는 [판매실적, 판매실적 당 급여]입니다.
판매실적은 1이상30이하입니다.
판매실적 당 급여는 1,000이상20,000이하입니다.
return 값 설명
모든 직원들 급여의 총합을 return 합니다.
입출력 예
partTimeJobssalesJobsreturn
[[10, 5000], [43, 6800], [5, 12800]]
[[3, 18000], [12, 8500]]
718800
입출력 예 설명
첫번째 아르바이트에게 50,000(10 * 5,000)을 지급합니다. 두번째 아르바이트에게 346,800(43 * 6,800 + 8 * 6,800)을 지급합니다. 세번째 아르바이트에게 64,000(5 * 12,800)을 지급합니다. 첫번째 영업사원에게 54,000(3 * 18,000)을 지급합니다. 두번째 영업사원에게 204,000(12 * 8,500 * 2)을 지급합니다. 따라서 급여의 총합은 718,800입니다.
소스 코드
문제 풀이
문제 설명을 보면 아르바이트와 판매사원이 Job class를 상속받으므로
extends Job을 넣어주면 된다.
그리고 급여 계산은 오버라이딩 형태로 이미 구현이 되어있으니 선언만 해주면 된다.
class PartTimeJob extends Job {
public int workHour, payPerHour;
public PartTimeJob(int workHour, int payPerHour) {
this.workHour = workHour;
this.payPerHour = payPerHour;
}
public int getSalary() {
salary = workHour * payPerHour;
if(workHour >= 40)
salary += (payPerHour * 8);
return salary;
}
}
class SalesJob extends Job {
public int salesResult, payPerSale;
public SalesJob(int salesResult, int payPerSale) {
this.salesResult = salesResult;
this.payPerSale = payPerSale;
}
public int getSalary() {
if(salesResult > 20)
salary = salesResult * payPerSale * 3;
else if(salesResult > 10)
salary = salesResult * payPerSale * 2;
else
salary = salesResult * payPerSale;
return salary;
}
}