본문 바로가기
C++/자료구조와 알고리듬

7. Implementation

by GameStudy 2023. 2. 7.

 

7.1 Implementation

해커랭크3DSurface)

  공간지각력 싸움.

cpp
코드 펼치기

 

해커랭크ClimbingTheLeaderboard)
  순위를 구하는 문제. 단, 중복제거 로직이 필요한 문제.
  sort() -> unique() -> erase() 순서의 로직을 통해 중복 제거. 그리고 순서 비교.

cpp
코드 펼치기

 

해커랭크FormingMagicSquare)
  미리 배열을 만들어두는 것도 문제푸는데에 중요할 수 있다.
  너무 머리를 굴려서 알고리듬화 하려기보다는 가끔은 그냥 배열로 만들어둬서 푸는게 중요할 수 있음.

cpp
코드 접기
#pragma once

#include <vector>
#include <algorithm> // sort()
#include <limits> // UINT64_MAX

bool CheckMagicSquare(std::vector<int> InDigits)
{
    static const int MagicConstant = 15;
    return (InDigits[0] + InDigits[1] + InDigits[2] == MagicConstant &&
        InDigits[3] + InDigits[4] + InDigits[5] == MagicConstant &&
        InDigits[6] + InDigits[7] + InDigits[8] == MagicConstant &&
        InDigits[0] + InDigits[3] + InDigits[6] == MagicConstant &&
        InDigits[1] + InDigits[4] + InDigits[7] == MagicConstant &&
        InDigits[2] + InDigits[5] + InDigits[8] == MagicConstant &&
        InDigits[0] + InDigits[4] + InDigits[8] == MagicConstant &&
        InDigits[2] + InDigits[4] + InDigits[6] == MagicConstant);
}

int CalculateCost(std::vector<std::vector<int>>& InSquare, std::vector<int>& InMagicSquare)
{
    int Cost = 0;
    for (size_t i = 0u; i < 3; ++i)
    {
        for (size_t j = 0u; j < 3; ++j)
        {
            Cost += std::abs(InSquare[i][j] - InMagicSquare[i * 3 + j]);
        }
    }

    return Cost;
}

int formingMagicSquare(std::vector<std::vector<int>> s) {
    std::vector<int> Digits = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
    std::sort(Digits.begin(), Digits.end()); // 순열 전에 정렬하여 모든 경우의 수를 만들어 낼 수 있게끔 함.
    size_t MinCost = UINT64_MAX;

    do {

        if (CheckMagicSquare(Digits) == true)
        {
            int CalculatedCost = CalculateCost(s, Digits);
            MinCost = MinCost < CalculatedCost ? MinCost : CalculatedCost;
        }

    } while (std::next_permutation(Digits.begin(), Digits.end())); // 순열을 계속 생성

    return MinCost;
}

 

해커랭크TheTimeInWords)
  위 문제와 마찬가지로, 알고리듬을 찾는게 아니라 미리 정의된 배열을 이용해서 푸는 문제.

cpp
코드 펼치기

 

해커랭크TheBombermanGame)
  규칙을 확인하고 패턴을 파악하는 문제.

cpp
코드 펼치기

 

해커랭크TheGridSearch)
  3중 반복문 전용문제.

cpp
코드 펼치기

 

백준10709)

cpp
코드 펼치기

 

 

7.2 문자열
백준9996)
  substr() 함수가 핵심인 문제. 접두사와 접미사 문자열을 얻고 비교하면 끝.

cpp
코드 펼치기

 

백준10988)
  펠린드롬 확인. reverse() 함수로 간단하게 가능.

cpp
코드 펼치기

 

백준11655)
  문자열을 특정 규칙에 따라 변환하는 문제. 아스키 인코딩과 문자열 append를 활용하면 끝.

cpp
코드 펼치기

 

해커랭크Encryption)
  1차원 문자열을 2차원으로 변환하는 문제. 특정 문자를 지워주는 erase() 함수도 활용 필요.
  중요한 부분은 열과 행을 구하는 로직임. sqrt()와 floor(), ceil() 함수를 활용함.

cpp
코드 펼치기

 

해커랭크HighestValuePalindrome)
  주어진 숫자형태 문자열으로 회문을 만들되, 가능한 최대값이 되게끔 만들어야하는 문제.

cpp
코드 펼치기

 

 

7.3 개수 세기

백준1213)
  각 알파벳의 등장 횟수를 배열에 저장. 홀수개 알파벳이 두 개 이상이면 실패.
  절반 문자열 + 홀수알파벳 + 역순 문자열로 펠린드롬 완성.

cpp
코드 펼치기

 

백준9375)
  의상 종류의 개수를 세고, 곱의 경우의 수를 활용하여 전체 경우의 수를 구함.

cpp
코드 펼치기

 

해커랭크SherlockAndTheValidString)
  map을 이용하여 문자의 개수를 세고, 빈도 수도 세야하는 문제.
  등장하는 빈도수가 1회인지 아닌지가 중요.

cpp
코드 펼치기

 

 

7.4 Two-Pointer

백준1940)
  투포인터를 이용해서 두 숫자의 합이 조건에 만족하는지 확인하고 푸는 문제

cpp
코드 펼치기

 

 

7.5 Sliding-Window
백준2559)
  연속적인 K일의 합을 슬라이딩 윈도우로 구하고, max() 함수로 최대값 구하면 끝.

cpp
코드 펼치기

 

해커랭크BearAndSteadyGene)
  A, C, G, T의 이상적인 개수가 뭔지 이해하고, map을 이용해서 각 문자의 개수를 구함.
  map에 있는 A, C, G, T 개수를 슬라이딩 윈도우를 통해 조정하는 식.

cpp
코드 펼치기

 

해커랭크LarryArray)
  3개 숫자를 잡고 정렬되어있는지 체크하는 문제.
  rotate() 함수를 통해 오른쪽 회전, is_sorted() 함수를 통해 정렬되어 있는지를 체크하는 식.

cpp
코드 펼치기

 

 

7.6 Line-Sweeping
백준2979)
  라인스위핑으로 각 시간대에 몇 대의 차가 있는지 체크 후 Switch-Case문으로 해결.

cpp
코드 펼치기

 

 

7.7 Greedy

코드업3301)
  거스름돈을 최소로 주는 문제라 Greedy를 떠올림. 일단 정렬하여 개수를 구하는 것이 중요.

cpp
코드 펼치기

 

프로그래머스Level01예산)

cpp
코드 펼치기

 

 

'C++ > 자료구조와 알고리듬' 카테고리의 다른 글

6. Linked list, Hash table  (0) 2022.12.30
5. Dynamic Programming, Backtracking  (0) 2022.12.01
4. Graph, DFS, BFS  (0) 2022.11.22
3. Tree, Binary Search Tree  (0) 2022.11.04
2. Sort, Search, Stack, Queue  (0) 2022.10.23

댓글