본문 바로가기
코딩테스트/네이버 부스트캠프 2021(웹·모바일 6기)

네이버 부스트캠프2021 웹/모바일 자가 진단 풀이(정답)

by 옹구스투스 2021. 6. 17.
반응형

문제 출처 : https://blog.naver.com/boostcamp_official/221978031932

 

부스트캠프 웹 · 모바일 자가 진단

스스로 그리고 동료와 함께 성장할 수 있는 새로운 방식의 개발자들을 위한 학습 커뮤니티, 부스트캠프 지...

blog.naver.com

자가 진단만 풀 수 있으면 코딩 테스트는 어렵지 않을 거라고 하는데,

부스트 캠프를 준비하는 오픈 채팅방의 얘길 들어보면 백준, 프로그래머스의 레벨2 정도로

공부를 계속 해야 할 것 같고, c++의 경우는 algorithm 등의 라이브러리를 사용하지 못한다고 하니,

정렬 등의 기본 알고리즘을 복습해야겠다.

아래의 풀이와 답은 정답이 아닐 수도 있다.

2명이 진실을 말하고

1명이거짓말을 하고 있습니다.

이 때, 경우의 수는

A false A true A true

B true B false B true

C true C true C false

로 3가지 중에 말이 되는 경우를 찾으면 된다.

따라서 거짓말을 한 사람은 A이고

빵을 먹은 사람은 B이다.

주어진 숫자의 차이 값은 2, 3, 5, 8, 12, 17순으로 증가했다.

이 차이 값들은 1,2,3,4,5순으로 증가했으니 다음엔 6이 증가할 차례이다.

따라서 48뒤에 증가할 차이 값은 23으로 48+23 =71 이 답이다.

7을 14번 더하면 98이다.

반복문은 1부터 시작하니 7을 14번 더하면 i는 99이고,

반복문은 총 15번 돌았으니 count는 15이다.

while의 조건문에 들어갈 변수는 count이고 count는 1부터 시작한다.

1부터 100까지의 합을 구해야 하니 1이상 100이하의 조건을 만족해야 하니

답은 5번이다.

1, 2, 4번은 100을 포함하지 않고,

3번은 반복 조건이 성립하지 않는다.

평면이면 0을 리턴하기 때문에 if() 안에 들어갈 조건문은 평년을 찾는 조건문이다.

평년의 조건은

년도를 4로 나누어서 떨어지면서, 100으로 나눠떨어져야 하고, 400으로 나눠떨어지면 안 된다.

식은 (year%4==0 && year%100 ==0) && year%400 !=0 이어야 한다.

보기에는 이런 식이 없으므로, 같은 결과가 나오는 식을 찾아야 한다.

year가 100으로 나누어떨어진다면, 4로도 무조건 나누어떨어지기 때문에

(year%4 != 0 || year%100 ==0)은 (year%4==0 && year%100 ==0) 식과 같은 결과가 나온다.

따라서 답은 5번이다.

맘에 안 드는 문제다.

2중 for문으로 풀면 시간 복잡도는 O(N^2)이고

map을 이용하면 시간 복잡도는 O(N)이다.

 

주어진 배열의 앞에 있는 숫자들부터 중복 횟수를 계산해야 하므로,

요소들을 자동적으로 정렬해 주지 않는 unordered_map을 사용해서

중복 횟수를 계산해 줬다.

arr에 3,2,1,3,2의 숫자가 있을 때

map을 사용하면

ma[1]==1

ma[2]==2

ma[3]==2

순으로 정렬되어 저장되고,

 

unordered_map을 사용하면

ma[3]==2

ma[2]==2

ma[1]==1

순으로 저장된다.

 

#include <iostream>
#include <vector>
#include <unordered_map>
using namespace std;

vector<int> findDup(int arr[], int size) {
    unordered_map<int,int> ma;

    vector<int> dup;
    for (int i = 0; i < size; i++) {
        ma[arr[i]]++;
    }
    for(auto o : ma){
        if (o.second > 1) {
            dup.push_back(o.second);
        }
    }
    if (dup.empty()) {
        dup.push_back(-1);
        return dup;
    }
    else {
        return dup;
    }
}

int main() {
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);

    int arr1[] = { 1,2,3,3,3,3,4,4, };
    int arr2[] = { 3,2,4,4,2,5,2,5,5 };
    int arr3[] = { 3,5,7,9,1 };
    vector<int> vt;
    vt= findDup(arr1,sizeof(arr1)/sizeof(int));
    for (auto o : vt) {
        cout << o << ' ';
    }
    cout << '\n';
    vt= findDup(arr2, sizeof(arr2) / sizeof(int));
    for (auto o : vt) {
        cout << o << ' ';
    }
    cout << '\n';
    vt = findDup(arr3, sizeof(arr3) / sizeof(int));
    for (auto o : vt) {
        cout << o << ' ';
    }

}

 

 

 

반응형

댓글