201009 쿠팡 코딩테스트 후기

coding test

  • 4문제에 180분.
  • 수학, 시간, map, 그래프 순회 등 다양한 분야에서 출제되었다.
  • 1, 3, 4번 문제는 꽤 쉬웠지만, 2번 문제는 많은 시간을 요했다. 코테 당락은 2번에서 결정날 듯 하다. (개인적인 난이도 : 1 < 3 < 4 < 2)
    • 보통 난이도 순으로 출제되는 코딩테스트와는 조금 달랐다. 2번 문제를 읽고, "이 문제는 빨리 못풀겠구나." 하고 바로 뒷문제로 넘어가서 다행이였다.
  • 테스트 케이스가 주어지지 않아서 내 코드가 맞는 지 틀린 지 확인할 수 없었다.

총평

  • 2020 하반기에 네이버, 라인, 쿠팡, 카카오 코테를 봤는데, 난이도 순은 카카오 >>>>> 라인 >>> 쿠팡 > 네이버 이 순서인 것 같다.
  • 사실 코딩 테스트가 어느 정도 할만 하다는 것은 "피시험자가 어느 정도 알고리즘을 알고있구나." 를 판단하기 위함인데, 쿠팡 면접이 얼마나 극악일지 상상이 안간다. 쿠팡 면접은 단 한 번 보던데, 라이브 코딩에 인성 면접에 직무 면접에... 마구마구 버무리지 않을까 싶다.

200927 네이버 코딩 테스트 후기

coding test

  • 3문제에 2시간.
  • 문제는 모두 무난했다. 앞의 두 문제는 40분만에 해결하고 3번째 문제에 1시간 정도 투자한 듯.
  • 필자는 한 문제는 파이썬, 두 문제는 C++로 풀었다.
  • 문제가 어려운 편은 아니였고, 그냥 시험 지원자에게 어느 정도 알고리즘 공부를 했구나를 판단하려는 의도였던 것 같다.
  • 테스트 케이스가 공개되지 않아서 내 코드가 맞는지 확인하는 방법은 없다.

총평

  • 문자열 문제는 파이썬으로 풀자.

200926 카카오 2차 코딩테스트 후기

이전과는 다른 코딩 테스트

  • 카카오가 인재 영입에 매우 힘쓴다는 것을 알게 되었다.
  • 문제가 너무 고급지다. 못 푼 내가 죄를 짓는 느낌.
  • 문제 형식은 다들 구글링을 통해 알 수 있듯이, REST API로부터 값을 가져와서, 일정한 처리 후 REST API로 값을 던져주는 것이다. 아래 링크는 2019 카카오 블라인드 공채 2차 문제 해설이다. 한 번 읽어보면 다음 코테 때 도움이 될 것이다.
 

2019 카카오 블라인드 공채 2차 오프라인 코딩 테스트 문제 해설

지난 10월 6일(토) 2019 블라인드 공채 오프라인 2차 코딩테스트가 진행되었습니다. 작년에는 8시간 동안 온라인으로 진행한 것과는 달리 오프라인으로 5시간 동안 치러졌는데요, 어떤 의도로 출제

tech.kakao.com

 

JSON ? JSON Parsing?

웹 프로그래밍을 공부하면서 javascript를 처음 접했고, 궁금하게 있어서 구글링 할 때 마다 짝궁 처럼 보이던 JSON들을 무시하면서 살았는데... 공부해야 할 때가 왔다 흑흑 (카카오..) 암튼암튼 #1 JS

qgqg264.tistory.com

 

 

6. requests 모듈 - REST API 사용법, curl을 python requests로 변환방법

개요 파이썬 공식에서도 인정한 인간친화적인 웹 요청 모듈인 requests의 사용법을 터득해, 웹 요청-응답 과정을 이해하고, REST API를 원활하게 사용해보자. requests 모듈 문서 requests 유저 가이드 requ

gosmcom.tistory.com

  • 필자는 원래 C++를 이용해서 알고리즘을 풀었지만, JSON Pharser 때문에 파이썬을 급하게 배웠어야 했다. 구글링을 통해 C++로는 REST API와 JSON Pharsing에 시간을 너무 많이 투자한다는 블로그 글들이 보였다. 점프 투 파이썬에서 6시간 동안 1회독하고, 시험 직전에 리스트, 딕셔너리 등 주요 함수들을 한번 훑어보았다. 아래 기본서로 아마도 2차 코테 합격에는 문제 없었을 것이다.
 

위키독스

온라인 책을 제작 공유하는 플랫폼 서비스

wikidocs.net

  • 파이썬에 서툴러서 문제를 못 푼 것이 아니라, 내가 부족해서 문제를 풀지 못했다. 카카오는 정말 대단한 사람들만 입사하나보다.

총평

  • 알고리즘 배울 때 파이썬으로 할 껄.
  • 카카오는 인재 영입에도 힘을 쓴다.
  • 카카오에는 보통 사람들이 들어가는 것이 아니다.

200925 엔테크서비스 인턴 코딩테스트 후기

coding test

  • 120분에 알고리즘 4문제, SQL 1문제가 출제되었다.
  • SQL
    • 프로그래머스 SQL 고득점 KIT 를 풀어보았다면 무난히 풀 수 있었다.
    • 요즘 SQL을 물어보는 코테도 늘어나고 있는데, 대비를 해두면 좋을 것 같다.
  • 프로그래밍
    • 앞 3문제는 쉽고, 뒤 1문제가 어려웠는데, 어려운 문제는 트리 관련 문제였다.
    • 아쉽게도 어려운 문제는 풀지 못했다. 트리 탐색에 관한 문제는 풀어보지 않았기 때문.

총평

  • 트리 문제에 도전하자

프로그래머스 SQL 고득점 KIT

출처

SELECT

59034 - 모든 레코드 조회하기

문제 링크

SELECT * FROM ANIMAL_INS ORDER BY ANIMAL_ID ASC

59035 - 역순 정렬하기

문제 링크

SELECT NAME, DATETIME FROM ANIMAL_INS ORDER BY ANIMAL_ID DESC

59036 - 아픈 동물 찾기

문제 링크

SELECT ANIMAL_ID, NAME FROM ANIMAL_INS WHERE INTAKE_CONDITION="Sick"

59037 - 어린 동물 찾기

문제 링크

SELECT ANIMAL_ID, NAME FROM ANIMAL_INS WHERE INTAKE_CONDITION!="Aged"

59403 - 동물의 아이디와 이름

문제 링크

SELECT ANIMAL_ID, NAME FROM ANIMAL_INS

59404 - 여러 기준으로 정렬하기

문제 링크

SELECT ANIMAL_ID, NAME, DATETIME FROM ANIMAL_INS ORDER BY NAME ASC, DATETIME DESC

59405 - 상위 n개 레코드

문제 링크

SELECT NAME FROM ANIMAL_INS ORDER BY DATETIME ASC LIMIT 1

SUM, MAX, MIN

59415 - 최댓값 구하기

문제 링크

SELECT MAX(DATETIME) AS 시간 FROM ANIMAL_INS

59038 - 최솟값 구하기

문제 링크

SELECT MIN(DATETIME) AS 시간 FROM ANIMAL_INS

59406 - 동물 수 구하기

문제 링크

SELECT COUNT(*) AS 동물수 FROM ANIMAL_INS

59408 - 중복 제거하기

문제 링크

SELECT COUNT(DISTINCT NAME) AS 동물수 FROM ANIMAL_INS WHERE NAME IS NOT NULL

GROUP BY

59040 - 고양이와 개는 몇 마리 있을까

문제 링크

SELECT ANIMAL_TYPE, COUNT(*) AS 'count' FROM ANIMAL_INS GROUP BY ANIMAL_TYPE ORDER BY ANIMAL_TYPE ASC 

59041 - 동명 동물 수 찾기

문제 링크

SELECT NAME, COUNT(*) AS 'COUNT' FROM ANIMAL_INS GROUP BY NAME HAVING COUNT(NAME) >= 2 ORDER BY NAME

59412 - 입양 시각 구하기 (1)

문제 링크

SELECT HOUR(DATETIME) AS 'HOUR', COUNT(*) AS 'COUNT'
FROM ANIMAL_OUTS
GROUP BY HOUR(DATETIME)
HAVING HOUR >= 9 AND HOUR <= 19
ORDER BY HOUR(DATETIME) ASC

59413 - 입양 시각 구하기 (2)

문제 링크

SET @hour := -1;

SELECT (@hour := @hour + 1) as HOUR,
    (SELECT COUNT(*) FROM ANIMAL_OUTS WHERE HOUR(DATETIME) = @hour) as COUNT
FROM ANIMAL_OUTS
WHERE @hour < 23

IS NULL

59039 - 이름이 없는 동물의 이야기

문제 링크

SELECT ANIMAL_ID FROM ANIMAL_INS WHERE NAME IS NULL

59407 - 이름이 있는 동물의 아이디

문제 링크

SELECT ANIMAL_ID FROM ANIMAL_INS WHERE NAME IS NOT NULL

59410 - NULL 처리하기

문제 링크

SELECT ANIMAL_TYPE, IF(NAME IS NULL, 'No name', NAME) AS NAME, SEX_UPON_INTAKE 
FROM ANIMAL_INS

JOIN

59042 - 없어진 기록 찾기

문제 링크

SELECT b.ANIMAL_ID, b.NAME
FROM ANIMAL_INS a RIGHT JOIN ANIMAL_OUTS b on a.ANIMAL_ID = b.ANIMAL_ID
WHERE a.ANIMAL_ID IS NULL
ORDER BY b.ANIMAL_ID

59043 - 있었는데요 없었습니다

문제 링크

SELECT b.ANIMAL_ID, b.NAME
FROM ANIMAL_INS a RIGHT JOIN ANIMAL_OUTS b on a.ANIMAL_ID = b.ANIMAL_ID
WHERE a.ANIMAL_ID IS NOT NULL AND a.DATETIME > b.DATETIME
ORDER BY a.DATETIME

59044 - 오랜 기간 보호한 동물(1)

문제 링크

SELECT ANIMAL_INS.NAME, ANIMAL_INS.DATETIME
FROM ANIMAL_INS
    LEFT OUTER JOIN ANIMAL_OUTS 
    ON ANIMAL_INS.ANIMAL_ID = ANIMAL_OUTS.ANIMAL_ID
WHERE ANIMAL_OUTS.ANIMAL_ID IS NULL
ORDER BY ANIMAL_INS.DATETIME ASC
LIMIT 3

59045 - 보호소에서 중성화한 동물

문제 링크

SELECT ANIMAL_INS.ANIMAL_ID, ANIMAL_INS.ANIMAL_TYPE, ANIMAL_INS.NAME
FROM ANIMAL_INS
    LEFT OUTER JOIN ANIMAL_OUTS 
    ON ANIMAL_INS.ANIMAL_ID = ANIMAL_OUTS.ANIMAL_ID
WHERE ANIMAL_INS.SEX_UPON_INTAKE != ANIMAL_OUTS.SEX_UPON_OUTCOME

String, Date

59046 루시와 엘라 찾기

문제 링크

SELECT ANIMAL_ID, NAME, SEX_UPON_INTAKE
FROM ANIMAL_INS
WHERE NAME = 'Lucy' OR NAME = 'Ella' OR NAME = 'Pickle' OR NAME = 'Rogan' OR NAME = 'Sabrina' OR NAME = 'Mitty'
SELECT ANIMAL_ID, NAME, SEX_UPON_INTAKE
FROM ANIMAL_INS 
WHERE NAME IN ('Lucy', 'Ella', 'Pickle', 'Rogan', 'Sabrina', 'Mitty')

59047 - 이름에 el이 들어가는 동물 찾기

문제 링크

SELECT ANIMAL_ID, NAME
FROM ANIMAL_INS
WHERE UPPER(NAME) LIKE "%EL%" AND ANIMAL_TYPE = "Dog"
ORDER BY NAME ASC

59409 - 중성화 여부 파악하기

문제 링크

SELECT ANIMAL_ID, NAME,
    IF(SEX_UPON_INTAKE LIKE "%Neutered%" OR SEX_UPON_INTAKE LIKE "%Spayed%", 'O', 'X') AS '중성화'
FROM ANIMAL_INS
ORDER BY ANIMAL_ID ASC

59411 - 오랜 기간 보호한 동물 (2)

문제 링크

SELECT ANIMAL_INS.ANIMAL_ID, ANIMAL_INS.NAME
FROM ANIMAL_INS, ANIMAL_OUTS
WHERE ANIMAL_INS.ANIMAL_ID = ANIMAL_OUTS.ANIMAL_ID
ORDER BY ANIMAL_OUTS.DATETIME - ANIMAL_INS.DATETIME DESC
LIMIT 2

59414 - DATETIME에서 DATE로 형 변환

문제 링크

SELECT ANIMAL_ID, NAME, DATE_FORMAT(DATETIME, '%Y-%m-%d') AS 날짜
FROM ANIMAL_INS
ORDER BY ANIMAL_ID ASC

기타 유용한 함수들

  • DATEDIFF(날짜1, 날짜2) : 날짜1과 날짜2의 날짜 차이를 구할 수 있음
  • ABS(숫자) : 숫자의 절댓값
  • DATE_FORMAT(날짜, '%Y-%m-%d %t') : 날짜의 형식을 바꿉니다.
  • IF(조건, 값1, 값2) : 조건이 참이면 값1, 거짓이면 값2

프로그래머스 42890 - 후보키

문제 링크

생각 및 접근

  • DB의 개념인 후보키의 갯수를 구하는 문제였다.

  • 내 수도 코드는 이렇다.

    • 조합(dfs)을 통해서 칼럼의 갯수를 1부터 칼럼의 갯수까지 칼럼의 인덱스를 고른다.
    • 인덱스를 다 골랐다면, 기존에 후보키였던 것을 포함하는지 검사한다.
      • 기존에 후보키였던 것을 포함한다면, 지금 검사하는 칼럼의 인덱스는 최소성을 만족하지 못하므로 return
      • 기존에 후보키였던 것을 포함하지 않는다면,
        • vector<vector<string>> relation의 모든 레코드에 대해 칼럼의 인덱스의 값들을 추출해서, 한 vector<string>으로 잡는다. 잡은 vector<string>vector<vector<string>>에 넣는다.
        • 모두 넣고, 일일히 대조해서 처음부터 끝까지 일치하는지 확인한다.
          • 일치하는게 있다면, 후보키가 되지 못하므로 return
          • 일치하는게 없다면, 후보키가 될 수 있다.
  • 조금 말이 어려운데, 코드를 보면서 이해해보자.

  • 아래 코드는 후보키의 가짓수를 토대로 dfs를 돌리는 함수다.

      vector<vector<string>> rel;
    
      // answer는 후보키의 vector를 저장한다.
      vector<vector<int>> answer;
      int col, row, arr[21];
    
      int solution(vector<vector<string>> relation) {
          row = relation.size();
          col = relation[0].size();
          rel = relation;
    
          // i는 후보키의 가짓수
          for(int i = 1; i <= col; i++){
              // arr은 칼럼의 인덱스를 저장할 예정.
              memset(arr, 0, sizeof(arr));
              dfs(i, 0, -1);
          }
    
          return answer.size();
      }
  • 아래 코드는 조합을 시행하는 dfs다.

      // 벡터 a와 벡터 b가 모두 같은 원소를 가지고 있는지 판단하는 함수다.
      bool vector_is_equal(vector<string> a, vector<string> b){
          int vec_size = a.size();
          for(int i = 0; i < vec_size; i++){
              if(a[i] != b[i])    return false;
          }
          return true;
      }
    
      // goal : 나는 인덱스를 goal개 만큼 집기로 했다.
      // cnt : 나는 인덱스를 cnt개 만큼 집었다.
      // idx : 나는 인덱스를 idx까지 골랐었다.
      void dfs(int goal, int cnt, int idx){
          // 조합을 통해 모두 집었다면,
          if(goal == cnt){
    
              // 기존에 찾아놓은 후보키를 포함하고 있는 지 검사
              for(auto i : answer){
                  int ans_idx = 0;
                  for(int j = 0; j < goal; j++){
                      if(i[ans_idx] == arr[j])    ans_idx++;
                      if(ans_idx >= i.size())     break;
                  }
                  if(ans_idx >= i.size()) return;
              }
    
              // 후보키가 될 수 있는지 검사할 예정
              // vector<vector<string>> relation에서 골라놓은 인덱스를 저장해놓은 arr에 존재하는 인덱스대로 하나의 tmp 벡터를 만들고, 이를 cmp 벡터에 넣어준다.
              vector<vector<string>> cmp;
              for(int i = 0; i < row; i++){
                  vector<string> tmp;
                  for(int j = 0; j < goal; j++)
                      tmp.push_back(rel[i][arr[j]]);
                  cmp.push_back(tmp);
              }
    
              // 비교하는 과정
              for(int i = 0; i < row; i++){
                  for(int j = i + 1; j < row; j++){
                      // 벡터가 하나라도 같은 게 있으면 후보키가 되지 못함
                      if(vector_is_equal(cmp[i], cmp[j]))  return;
                  }
              }
    
              // 벡터가 모두 다르므로 후보키가 될 수 있다.
              vector<int> answer_temp;
              for(int i = 0; i < goal; i++)
                  answer_temp.push_back(arr[i]);
              answer.push_back(answer_temp);
          }
    
          // 다음 조합 진행
          else {
              for(int i = idx + 1; i < col; i++){
                  arr[cnt] = i;
                  dfs(goal, cnt + 1, i);
              }
          }
      }

코드

#include <bits/stdc++.h>
using namespace std;

vector<vector<string>> rel;
vector<vector<int>> answer;
int col, row, arr[21];

bool vector_is_equal(vector<string> a, vector<string> b){
    int vec_size = a.size();
    for(int i = 0; i < vec_size; i++){
        if(a[i] != b[i])    return false;
    }
    return true;
}

void dfs(int goal, int cnt, int idx){
    if(goal == cnt){
        for(auto i : answer){
            int ans_idx = 0;
            for(int j = 0; j < goal; j++){
                if(i[ans_idx] == arr[j])    ans_idx++;
                if(ans_idx >= i.size())     break;
            }
            if(ans_idx >= i.size()) return;
        }

        vector<vector<string>> cmp;
        for(int i = 0; i < row; i++){
            vector<string> tmp;
            for(int j = 0; j < goal; j++)
                tmp.push_back(rel[i][arr[j]]);
            cmp.push_back(tmp);
        }

        for(int i = 0; i < row; i++){
            for(int j = i + 1; j < row; j++){
                if(vector_is_equal(cmp[i], cmp[j]))  return;
            }
        }

        vector<int> answer_temp;
        for(int i = 0; i < goal; i++)
            answer_temp.push_back(arr[i]);
        answer.push_back(answer_temp);
    }
    else {
        for(int i = idx + 1; i < col; i++){
            arr[cnt] = i;
            dfs(goal, cnt + 1, i);
        }
    }
}

int solution(vector<vector<string>> relation) {
    row = relation.size();
    col = relation[0].size();
    rel = relation;

    for(int i = 1; i <= col; i++){
        memset(arr, 0, sizeof(arr));
        dfs(i, 0, -1);
    }

    return answer.size();
}

채점 결과

백준 11060 - 점프 점프

문제 링크

생각 및 접근

  • 각 칸에 오른쪽으로 얼마나 갈 수 있는지 적혀있고, 그 규칙대로 마지막 칸까지 도달했을 때, 최소 몇 번 점프해야 갈 수 있는지 구하는 문제다.
  • int dp[i]
    • i번째 칸에 왔을 때, 최소 몇 번 점프해서 왔는지 기억하는 배열
  • 초기 dp는 int의 최댓값으로 잡는다. 점프 수의 최솟값을 구하기 위함이다.
  • dp 과정
      // 맨 첫 칸은 점프를 하지 않았으므로 0
      dp[1] = 0;
      for(int i = 1; i < n; i++){
          // j : i번째 칸에서 점프해서 갈 수 있는 칸(j)에 대해서 최소 점프 수 검사.
          for(int j = i + 1; j <= min(arr[i] + i, n); j++){
              dp[j] = min(dp[i] + 1, dp[j]);
          }
      }

코드

#include <bits/stdc++.h>
using namespace std;

int n, arr[1001], dp[1001];

int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);  cout.tie(NULL);

    cin >> n;
    for(int i = 1; i <= n; i++){
        cin >> arr[i];
        dp[i] = 2147000000;
    }

    dp[1] = 0;
    for(int i = 1; i < n; i++){
        for(int j = i + 1; j <= min(arr[i] + i, n); j++){
            dp[j] = min(dp[i] + 1, dp[j]);
        }
    }

    if(dp[n] == 2147000000) cout << -1;
    else cout << dp[n];
}

채점

'Coding Test > acmicpc' 카테고리의 다른 글

백준 3190 - 뱀 (c++)  (0) 2020.09.07
백준 12100 - 2048 Easy (c++)  (0) 2020.09.07
백준 2573 - 빙산 (c++)  (0) 2020.08.31
백준 7569 - 토마토 (c++)  (0) 2020.08.28
백준 2644 - 촌수계산 (c++)  (0) 2020.08.28

200913 LG CNS 코딩테스트 후기

코딩 테스트

  • 210분에 3문제.
  • 시뮬레이션, 그래프 등의 문제가 출제되었다.
  • 푸는 방식을 캐치하면 풀 수 있다. 문제 코드가 길기는 하지만, 차근히 짜서 함수끼리 잘 연결하면 풀린다.
  • 부정행위 감시가 심한 시험이였다. 노트북 웹캠에 핸드폰으로 측면 촬영, 신분증까지. 어쩌면 이게 가장 형평성 있는 코딩 테스트인 것 같다. 풍문에 의하면 비교적 오픈되어 있는 카카오나 라인 코테는 단톡방에서 해답을 공유하고 있다곤 하는데..
  • 지원하는 언어가 C, C#, PYTHON, JAVA였는데, 필자는 C++로만 코테를 준비했어서 C로 푸니 조금 답답했다. 그래도 레퍼런스는 읽을 수 있어서 다행이였다.

총평

  • LG의 부정행위 감시 방식은 코테를 시행하는 다른 기업들이 본받아야 할 것 같다.

+ Recent posts