728x90

출처: 프로그래머스

https://programmers.co.kr/learn/courses/30/lessons/43162?language=cpp 

 

코딩테스트 연습 - 네트워크

네트워크란 컴퓨터 상호 간에 정보를 교환할 수 있도록 연결된 형태를 의미합니다. 예를 들어, 컴퓨터 A와 컴퓨터 B가 직접적으로 연결되어있고, 컴퓨터 B와 컴퓨터 C가 직접적으로 연결되어 있

programmers.co.kr

#include <string>
#include <vector>
using namespace std;
bool visited[201]; //방문검사

void dfs(vector<vector<int>> &arr, int idx){
    visited[idx] = true;
    for(int i=0; i<arr[idx].size(); i++){
        if(arr[idx][i] == 1 && visited[i] == false){ //1이고 아직 방문하지 않은 컴
            // arr[idx][i] = 0;
            // visited[i] = true;
            dfs(arr, i); //dfs 진행
        }
    }
}

int solution(int n, vector<vector<int>> computers) {
    int answer = 0;
    for(int i=0; i<n; i++){
        if (visited[i]==false){
            dfs(computers,i); //dfs 진행
            answer++;
        }
    }
    return answer;
}

dfs로 풀이했다.

 

연결되어 있는 것이 1로 표시되어 있다.

dfs로 computers 벡터를 돌면서 인접한 1을 찾고 dfs진행이 끝나면 인접한 1 찾는 과정이 끝난 것이다.

끝날 때마다 answer++해준다.

728x90

출처: 프로그래머스

https://programmers.co.kr/learn/courses/30/lessons/43165?language=cpp 

 

코딩테스트 연습 - 타겟 넘버

n개의 음이 아닌 정수들이 있습니다. 이 정수들을 순서를 바꾸지 않고 적절히 더하거나 빼서 타겟 넘버를 만들려고 합니다. 예를 들어 [1, 1, 1, 1, 1]로 숫자 3을 만들려면 다음 다섯 방법을 쓸 수

programmers.co.kr

#include <string>
#include <vector>

using namespace std;
int answer = 0;
void dfs(vector<int> numbers, int target, int total, int index){
    if (index == numbers.size()){
        if (total == target){
            answer ++ ;
        }
        return;
    }
    
    dfs(numbers, target, total + numbers[index], index + 1);
    dfs(numbers, target, total - numbers[index], index + 1);
}
int solution(vector<int> numbers, int target) {
    dfs(numbers, target, numbers[0], 1);
    dfs(numbers, target, -numbers[0], 1);
    return answer;
}
728x90

https://programmers.co.kr/learn/courses/30/lessons/42842

출처 : 프로그래머스

 

코딩테스트 연습 - 카펫

Leo는 카펫을 사러 갔다가 아래 그림과 같이 중앙에는 노란색으로 칠해져 있고 테두리 1줄은 갈색으로 칠해져 있는 격자 모양 카펫을 봤습니다. Leo는 집으로 돌아와서 아까 본 카펫의 노란색과

programmers.co.kr

#include <string>
#include <vector>
using namespace std;

vector<int> solution(int brown, int yellow) {
    vector<int> answer;
    int carpet = brown + yellow;
    
    //carpet의 약수 구하기 (n가로, m세로)
    for (int m=3; m<carpet/2; m++){
        if (carpet % m == 0){
            int n = carpet / m;
            
            //노란색 개수와 맞는지 확인
            if((m-2)*(n-2) == yellow){
                answer.push_back(n);
                answer.push_back(m);
                break;
            }
        }
    }
    return answer;
}

그림을 그리며 생각해보면 규칙을 찾을 수 있다.

테두리가 갈색이어야하고 가운데에 노란색이 있어야하니까 세로의 최소 길이는 3이다.

3이상부터 가로가 세로보다 같거나 길어야하니까 이 조건을 주의해서 약수를 찾는다.

찾은 약수 쌍 중, 만들 수 있는 노란색의 개수가 네오가 본 노란색의 개수와 같다면 answer에 가로, 세로 추가하고 break

아니면 다른 약수 찾는다.

728x90

https://programmers.co.kr/learn/courses/30/lessons/42839

출처:프로그래머스

 

코딩테스트 연습 - 소수 찾기

한자리 숫자가 적힌 종이 조각이 흩어져있습니다. 흩어진 종이 조각을 붙여 소수를 몇 개 만들 수 있는지 알아내려 합니다. 각 종이 조각에 적힌 숫자가 적힌 문자열 numbers가 주어졌을 때, 종이

programmers.co.kr

 

#include <string>
#include <vector>
#include <cmath>
#include <set>
#include <iostream>
using namespace std;

set<int> numberSet;
//에라토스테네스의 체
bool isPrime(int n){
    if (n<2)
        return false;
    for (int i=2; i<=sqrt(n); i++){
        if (n%i == 0)
            return false;
    }
    return true;
}
//numbers로 숫자조합 만들기 -> numberSet 셋에 삽입
void makeCombination(string comb, string others){
    if (comb != "")
        numberSet.insert(stoi(comb)); //string to int
    
    for (int i=0; i<others.size(); i++)
        //재귀함수
        makeCombination(comb + others[i], others.substr(0,i) + others.substr(i+1));
}
int solution(string numbers) {
    int answer = 0;
    //numbers로 가능한 숫자 조합 만들기
    makeCombination("", numbers);

    set<int>::iterator iter;
    for(iter = numberSet.begin(); iter!=numberSet.end(); iter++){
        if(isPrime(*iter))
            answer++;
    }
    return answer;
}

 

python으로 준비하다가 c++하니까 너무 헷갈린다..ㅋㅋㅋㅋㅋ ㅠㅠ

728x90

https://programmers.co.kr/learn/courses/30/lessons/42840

출처: 프로그래머스

 

코딩테스트 연습 - 모의고사

수포자는 수학을 포기한 사람의 준말입니다. 수포자 삼인방은 모의고사에 수학 문제를 전부 찍으려 합니다. 수포자는 1번 문제부터 마지막 문제까지 다음과 같이 찍습니다. 1번 수포자가 찍는

programmers.co.kr

 

#include <string>
#include <vector>
#include <algorithm>
using namespace std;

//수포자 3명 규칙
int p1[5] = {1,2,3,4,5};
int p2[8] = {2,1,2,3,2,4,2,5};
int p3[10] = {3,3,1,1,2,2,4,4,5,5};
    
vector<int> solution(vector<int> answers) {
    vector<int> answer;
    vector<int> score = {0,0,0};
    int max_score = 0;
    
    //완전 탐색
    for(int i=0; i<answers.size();i++){
        if (answers[i] == p1[i%5])
            score[0]++;
        if (answers[i] == p2[i%8])
            score[1]++;
        if (answers[i] == p3[i%10])
            score[2]++;
    }
    //max_score = max(max(score[0],score[1]), score[2]);
    max_score = *max_element(score.begin(), score.end());
    for(int i=0; i<score.size();i++){
        if (score[i] == max_score){
            answer.push_back(i+1);
        }
    }
    
    return answer;
}

 

728x90

출처: 프로그래머스

https://programmers.co.kr/learn/courses/30/lessons/62284

 

코딩테스트 연습 - 우유와 요거트가 담긴 장바구니

CART_PRODUCTS 테이블은 장바구니에 담긴 상품 정보를 담은 테이블입니다. CART_PRODUCTS 테이블의 구조는 다음과 같으며, ID, CART_ID, NAME, PRICE는 각각 테이블의 아이디, 장바구니의 아이디, 상품 종류, 가

programmers.co.kr

 

1) join 사용

SELECT A.CART_ID 
FROM CART_PRODUCTS AS A
INNER JOIN CART_PRODUCTS AS B
ON A.CART_ID = B.CART_ID
WHERE A.NAME = 'Milk' AND B.NAME = 'Yogurt'
ORDER BY A.ID;

2) 서브쿼리

SELECT CART_ID
FROM CART_PRODUCTS
WHERE CART_ID IN (
    SELECT CART_ID
    FROM CART_PRODUCTS
    WHERE NAME = 'Milk'
)
AND NAME = 'Yogurt'
ORDER BY ID;

3) 서브쿼리 2

SELECT DISTINCT(CART_ID) AS CART_ID
FROM CART_PRODUCTS
WHERE CART_ID IN (
    SELECT CART_ID
    FROM CART_PRODUCTS
    WHERE NAME = 'Milk'
)
AND CART_ID IN (
    SELECT CART_ID
    FROM CART_PRODUCTS
    WHERE NAME = 'Yogurt'
)
ORDER BY ID;
728x90

출처: 프로그래머스

https://programmers.co.kr/learn/courses/30/lessons/77487

 

코딩테스트 연습 - 헤비 유저가 소유한 장소

PLACES 테이블은 공간 임대 서비스에 등록된 공간의 정보를 담은 테이블입니다. PLACES 테이블의 구조는 다음과 같으며 ID, NAME, HOST_ID는 각각 공간의 아이디, 이름, 공간을 소유한 유저의 아이디를

programmers.co.kr

 

1. 서브쿼리 사용

SELECT *
FROM PLACES
WHERE HOST_ID IN (
    SELECT HOST_ID
    FROM PLACES
    GROUP BY HOST_ID
    HAVING COUNT(HOST_ID)>=2
)
ORDER BY ID;

2. INNER JOIN 사용

SELECT ID, NAME, A.HOST_ID
FROM PLACES A
INNER JOIN(
    SELECT HOST_ID, COUNT(HOST_ID)
    FROM PLACES
    GROUP BY HOST_ID
    HAVING COUNT(HOST_ID)>=2
)AS B 
ON A.HOST_ID = B.HOST_ID
ORDER BY A.ID;

+ Recent posts