프로그래머스 탑 문제

배열의 끝부터 봅니다. 배열의 끝부터 하나씩 자기보다 왼쪽에 있는 것중에 값이 보다 큰 곳의 인덱스를 저장하면 됩니다. 만약 자기보다 큰게 없다면 0을 저장하면 됩니다.

탑.cpp

#include <string>
#include <vector>

using namespace std;

vector<int> solution(vector<int> heights) {
    int heights_size = heights.size();
    vector<int> answer(heights_size, 0);

    for(int i=heights_size-1 ; i>=0; --i)
    {
        int iter = i;
        while(iter--) 
        {
            if(heights[iter] > heights[i])
            {
                answer[i] = iter+1;
                break;
            }
        }
    }
    return answer;
}

프로그래머스 문자열 압축 문제

1 ~ i번째의 문자열씩 끊어가면서 모든 문자를 확인한다. 같은 문자열일 경우 반복 횟수(count)를 1씩 증가시키고, 다른 문자열일 경우 여태 반복된 문자열 정보를 추가한 뒤(반복 횟수 + 문자열) 반복 횟수를 1로 초기화한 후 다시 같은 작업을 반복한다.

문자열 압축.cpp

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

int solution(string s) {
    int answer = s.length();
    int len = s.size();

    // i는 부분 문자열의 길이
    // 문자열 길이의 절반까지 반복
    for(int i=1; i <= len / 2; ++i)
    {
        int count = 1; // 반복 횟수, 초기화를 1회로
        string temp_answer = "";
        string pre_sub = s.substr(0, i); // i번째 글자까지

        for(int j=i; j<len; j+=i)
        {
            string now_sub = s.substr(j, i);
            if(pre_sub == now_sub) // 반복되는 경우
            {
                count++;
            }
            else // 반복되지 않을 경우
            {
                if(count == 1)
                {
                    temp_answer = temp_answer + pre_sub;
                }
                else
                {
                    temp_answer = temp_answer + to_string(count) + pre_sub;
                    count = 1; // 다시 반복횟수 1로
                }
                pre_sub = now_sub; // 새로운 문자열이 반복되는지 체크하기 위해
            }
            if(j+i >= len)
            {
                if(count == 1)
                {
                    temp_answer = temp_answer + s.substr(j);
                }
                else
                {
                    temp_answer = temp_answer + to_string(count) + pre_sub + s.substr(j);
                }
                break;
            }
        }
        answer = (answer < temp_answer.length()) ? answer : temp_answer.length();
    }
    return answer;
}

프로그래머스 완주하지 못한 선수 문제

두 가지 방법이 생각났습니다. 하나는 participant, completion을 각각 sort하고 위에서부터 하나씩 비교하는 것과 map을 이용하는 것이였는데 map을 사용하여 풀었습니다.

이름(key)이 들어오면 1씩 증가시키고, 완주했을 경우 1씩 감소시킨 뒤 0이 아닌 값을 출력하는 간단한 방법입니다.

완주하지 못한 선수.cpp

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

string solution(vector<string> participant, vector<string> completion) {
    string answer = "";
    map<string, int> m;

    for(auto name : participant)
    {
        m[name]++;
    }

    for(auto name : completion)
    {
        m[name]--;
    }

    for(auto kv : m)
    {
        if(kv.second != 0)
        {
            answer = kv.first;
            break;
        }
    }

    return answer;
}

'알고리즘 & SQL > 프로그래머스' 카테고리의 다른 글

프로그래머스 탑 C++  (0) 2020.01.20
프로그래머스 문자열 압축 C++  (0) 2020.01.20

DATE_FORMAT(DATE, 형식)을 통해 DATE의 형식을 바꿀 수 있습니다.
형식에는 %Y(4자리 연도), %y(2자리 연도), %m(월), %d(일), %H(24시간), %h(12시간), %i, %s가 있습니다.

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

출처: 프로그래머스 코딩 테스트 연습, https://programmers.co.kr/learn/courses/30/lessons/59414

DATEDIFF(DATE1, DATE2)를 사용해서 풀 수 있었습니다. DATEDIFF는 Day의 차이를 반환하고, TIMESTAMPDIFF(단위, DATE1, DATE2)는 단위별로 차이를 구할 수 있습니다.

  • 단위
    SECOND : 초
    MINUTE : 분
    HOUR : 시
    DAY : 일
    WEEK : 주
    MONTH : 월
    QUARTER : 분기
    YEAR : 연
```sql
SELECT  
  A.ANIMAL_ID,  
  A.NAME  
FROM     
  ANIMAL_INS A,  
  ANIMAL_OUTS B  
WHERE  
  A.ANIMAL_ID = B.ANIMAL_ID  
ORDER BY  
  DATEDIFF(A.DATETIME, B.DATETIME)   
LIMIT   
  2
```

출처: 프로그래머스 코딩 테스트 연습, https://programmers.co.kr/learn/courses/30/lessons/59411

CASE ~ WHEN ~ THEN ~ ELSE END 문을 써야했던 문제였습니다.

SELECT 
    ANIMAL_ID, 
    NAME, 
    CASE  
        WHEN SEX_UPON_INTAKE LIKE "%Neutered%" OR SEX_UPON_INTAKE LIKE "%Spayed%" 
            THEN "O" 
        ELSE 
            'X' 
    END AS "중성화" 
FROM     
    ANIMAL_INS

출처: 프로그래머스 코딩 테스트 연습, https://programmers.co.kr/learn/courses/30/lessons/59409

 

코딩테스트 연습 - 중성화 여부 파악하기 | 프로그래머스

ANIMAL_INS 테이블은 동물 보호소에 들어온 동물의 정보를 담은 테이블입니다. ANIMAL_INS 테이블 구조는 다음과 같으며, ANIMAL_ID, ANIMAL_TYPE, DATETIME, INTAKE_CONDITION, NAME, SEX_UPON_INTAKE는 각각 동물의 아이디, 생물 종, 보호 시작일, 보호 시작 시 상태, 이름, 성별 및 중성화 여부를 나타냅니다. NAME TYPE NULLABLE ANIMAL_ID VARCHAR(N) FALS

programmers.co.kr

 

IFNULL을 사용해야 하는 문제였습니다. IFNULL(A, B)은 A가 NULL이면 B를, 그렇지 않다면 A가 나옵니다.

SELECT 
    ANIMAL_TYPE, 
    IFNULL(NAME, "No name") AS NAME, 
    SEX_UPON_INTAKE 
FROM 
    ANIMAL_INS

출처: 프로그래머스 코딩 테스트 연습, https://programmers.co.kr/learn/courses/30/lessons/59410

 

코딩테스트 연습 - NULL 처리하기 | 프로그래머스

ANIMAL_INS 테이블은 동물 보호소에 들어온 동물의 정보를 담은 테이블입니다. ANIMAL_INS 테이블 구조는 다음과 같으며, ANIMAL_ID, ANIMAL_TYPE, DATETIME, INTAKE_CONDITION, NAME, SEX_UPON_INTAKE는 각각 동물의 아이디, 생물 종, 보호 시작일, 보호 시작 시 상태, 이름, 성별 및 중성화 여부를 나타냅니다. NAME TYPE NULLABLE ANIMAL_ID VARCHAR(N) FALS

programmers.co.kr

 

+ Recent posts