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

 

코딩테스트 연습 - 주식가격

초 단위로 기록된 주식가격이 담긴 배열 prices가 매개변수로 주어질 때, 가격이 떨어지지 않은 기간은 몇 초인지를 return 하도록 solution 함수를 완성하세요. 제한사항 prices의 각 가격은 1 이상 10,00

programmers.co.kr

문제를 처음 확인할 때 생각해볼 수 있는 가장 쉬운 방법으로는 O(n^2) 시간 복잡도를 가지고 있는 완전 탐색이다.

 

그러나 문제를 읽어보면 다음 인덱스 시점의 시간에서 가격이 떨어지느냐 안 떨어지느냐에 따라 return값이 결정된다는 것을 확인할 수 있다.

 

한 가지 주의해야 할 점은 다음 인덱스가 이전 인덱스보다 작다는 것을 알기 전 시간은 이미 1초가 흘렀다고 생각하는 것이고

 

전부 다 돌아보는 것이 아닌 두 번째 for문부터는 바로 앞 인덱스부터 탐색을 시작하면 해결할 수 있다.

 

문제의 분류로는 스택과 큐 카테고리에 존재하지만 오히려 스택과 큐를 활용하여 해결방법을 생각해보더라도 오히려 코드가 더 길어질 것 같으며 큰 차이가 없을 것 같아 다음과 같이 완전 탐색과 같은 방법으로 해결하였다.

 

3 언어의 코드 방식도 전부 동일하며 문제 예시에 대한 이해를 빠르게 한다면 빠른 시간 내에 해결할 수 있을 것 같다.

 

C++

#include <string>
#include <vector>

using namespace std;

vector<int> solution(vector<int> prices) 
{
    vector<int> answer;
    for(int i=0;i<prices.size();i++)
    {
        int cnt=0;
        for(int j=i+1;j<prices.size();j++)
        {
            cnt++;
            if (prices[i] > prices[j])
                break;
        }
        answer.push_back(cnt);
    }
    return answer;
}

Java

class Solution 
{
    public int[] solution(int[] prices) 
    {
        int[] answer = new int[prices.length];
        for(int i=0;i<prices.length;i++)
        {
            for (int j=i + 1;j<prices.length;j++)
            {
                answer[i]++;
                if (prices[i]>prices[j])
                    break;
            }
        }
        return answer;
    }
}

Python3

def solution(prices):
    answer = [0] * len(prices)
    # prices 크기만큼 빈 리스트를 할당.
    for i in range(0,len(prices)):
        for j in range(i + 1, len(prices)):
            answer[i] += 1
            if prices[i]>prices[j]:
                break;
    return answer

 

큐는 FIFO(First In First Out)특징을 가지는 자료구조입니다.

 

다음 사진과 같이 터널을 자동차가 지나간다고 이야기했을 때 가장 처음 들어간 자동차는 그대로 터널을 통과해서 나올겁니다.

 

즉 데이터를 삽입하고 출구앞에서부터 데이터가 쌓이기시작하기 때문에 데이터를 꺼낼 때 마다 데이터를 넣었던 순서대로 데이터를 삭제하거나 활용할 수 있습니다.

 

이러한 큐는 너비 우선 탐색(Breadth First Search)알고리즘에서 활용될 수 있습니다. 이러한 큐의 응용법은 BFS알고리즘 게시글에서 다시한번 확인하실 수 있습니다.

 

C++공식 홈페이지를 확인해보겠습니다.

https://www.cplusplus.com/reference/queue/queue/?kw=queue 

 

queue - C++ Reference

container_typeThe second template parameter (Container)Type of the underlying container

www.cplusplus.com

 

큐는 다음과같이 6개의 operations를 가지고있으며 스택과 동일하게 template구조로써 선언시 이용할 데이터의 자료형을 명시해주고 사용해야합니다.

 

앞서 스택게시글의 존재하는 함수와 동일하기 때문에 size, empty push_back 함수는 생략하겠습니다.

 

특별하게 다른점은 back, front라 명시되어있는데 이 부분은 현재로써는 입구와 출구가 서로 반대방향에 존재한다는 것으로 이해하시면 될것 같습니다. 이어서 push_back은 데이터를 삽입, pop_front는 데이터 제거, front는 가장 앞에 존재하는 데이터의 원소를 불러오는 함수가 되겠습니다.

 

큐 자료구조는 이후 덱(Double Ended Queue)자료구조에서 더 응용되어 사용될 수 있습니다.

 

이것으로 큐 자료구조에 대한 설명을 마치겠습니다.

'자료구조' 카테고리의 다른 글

Stack(스택)이란?  (0) 2021.12.06

Stack이란?

 

스택은 LIFO(Last In First Out) 구조를 가지고 있는 자료구조입니다.

 

자료구조를 처음 공부하는 입장에서는 이러한 구조가 이해하기 어려울 수 있기 때문에 그림을 보며 설명을 이어가겠습니다.

 

일상생활에서 이러한 LIFO구조인 물건을 생각해 보겠습니다.

 

 

다음사진과 같이 옷을 갠다고 생각해보겠습니다.

 

옷장서랍에 이 옷들을 전부 넣을 때 처음 넣은 옷은 가장 밑으로가게되며 마지막으로 넣은 옷을 가장 위에 있을겁니다.

 

이러한 방식으로 사용하는 데이터에 따라 스택이란 저장공간(자료구조)를 이용함으로 써 문제를 해결하거나 효율적으로 데이터를 활용할 수 있습니다.

 

알고리즘과 관련해서 스택을 사용하는 알고리즘은 깊이 우선 탐색(Depth First Search)가 존재하며 알고리즘탭에서 다시한번 스택을 이용하는 방법을 확인하실 수 있습니다.

 

이제 스택이란 저장공간이 이러한 특징을 가지고있다는 것을 알았으니 내부 구현은 어떤방식으로 되어있는지 라이브러리를 살펴보겠습니다.

 

C++공식 사이트를 참고하였습니다.

https://www.cplusplus.com/reference/stack/stack/?kw=stack 

 

stack - C++ Reference

container_typeThe second template parameter (Container)Type of the underlying container

www.cplusplus.com

 

template으로 선언되어 있으며 자신이 저장하고자하는 데이터타입에 맞게 선언해준 후 사용하는 방식으로 이용할 수 있으며 앞서 말했던 내용과 동일하게 LIFO에 대한 이야기와 5가지의 operations 를 확인할 수 있습니다.

 

생성자와 C++11버전의 함수를 제외하고 말해드리면

 

empty - 현재 스택이 비어있는지 확인하기

size - 현재 스택의 사이즈 확인하기

top - 스택의 가장 위에 있는 데이터를 확인하기.

push - 스택의 데이터를 추가하기.

pop - 스택의 데이터(top에 존재하는) 제거하기.

 

로 구성되어있으며 언어에따라 함수의 반환값이나 함수구성의 차이가 존재할 수 있기 때문에 사용하는 언어에 맞춰 다시한번 검색해보시는 걸 추천드립니다.

 

이것으로 간단하게 스택 자료구조에 대한 설명을 마치겠습니다.

'자료구조' 카테고리의 다른 글

큐(Queue)란?  (0) 2021.12.06

https://github.com/ukjinlee66/BOJ/blob/master/17406.cpp

 

ukjinlee66/BOJ

baekjoon Online Judge problem. Contribute to ukjinlee66/BOJ development by creating an account on GitHub.

github.com

https://www.acmicpc.net/problem/17406

 

17406번: 배열 돌리기 4

크기가 N×M 크기인 배열 A가 있을때, 배열 A의 값은 각 행에 있는 모든 수의 합 중 최솟값을 의미한다. 배열 A가 아래와 같은 경우 1행의 합은 6, 2행의 합은 4, 3행의 합은 15이다. 따라서, 배열 A의 값은 4이다. 1 2 3 2 1 1 4 5 6 배열은 회전 연산을 수행할 수 있다. 회전 연산은 세 정수 (r, c, s)로 이루어져 있고, 가장 왼쪽 윗 칸이 (r-s, c-s), 가장 오른쪽 아랫 칸이 (r+s, c+s)인 정사각형을 시계

www.acmicpc.net

문제에서 시키는 방법대로만 구현하면 되는 문제였다. 다만 배열을 돌리기 위해서 가장 바깥 단계부터 안쪽으로 몇 단계까지 돌려야 하는지는 s라는 변수를 생각하여 코딩하였고 3번의 시도 끝에 풀게 되었는데 next_permutaion 사용 시 vector라던지 배열이 sort 되어있는 상태에서 사용되어야 한다는 것을 다시 한번 생각하는 시간이 되었다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
typedef pair<intint> P;
vector<pair<intpair<intint>>> turn;
int map[51][51];
int copmap[51][51];
int n, m, k;
int res = 987654321;
void print_map()
{
    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < m; j++)
            cout << map[i][j] << " ";
        puts("");
    }
    puts("");
}
void recover_map()
{
    for (int i = 0; i < n; i++)
        for (int j = 0; j < m; j++)
            map[i][j] = copmap[i][j];
}
void copy_map()
{
    for (int i = 0; i < n; i++)
        for (int j = 0; j < m; j++)
            copmap[i][j] = map[i][j];
}
void check_minnum_sum()
{
    for (int i = 0; i < n; i++)
    {
        int num = 0;
        for (int j = 0; j < m; j++)
        {
            num += map[i][j];
        }
        res = min(res, num);
    }
}
void turning(int r, int c, int s)
{
    while (s!=0
    {
        int temp = map[r - s][c - s];
        for (int i = r - s; i < r + s; i++)
            map[i][c - s] = map[i + 1][c - s];
        for (int j = c - s; j < c + s; j++)
            map[r + s][j] = map[r + s][j + 1];
        for (int i = r + s; i > r - s; i--)
            map[i][c + s] = map[i - 1][c + s];
        for (int j = c + s; j > c - s; j--)
            map[r - s][j] = map[r - s][j - 1];
        map[r - s][c - s + 1= temp;
        s--;
    }
}
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    cin >> n >> m >> k;
    for (int i = 0; i < n; i++)
        for (int j = 0; j < m; j++)
            cin >> map[i][j];
    for (int i = 0; i < k; i++)
    {
        int a, b, c; cin >> a >> b >> c;
        turn.push_back(make_pair(a-1,make_pair(b-1,c)));
    }
    copy_map();//맵을복사.
    sort(turn.begin(), turn.end());//permutation 을사용하기위한 sort.
    do 
    {
        for (int i = 0; i < turn.size(); i++)
        {
            int r = turn[i].first;
            int c = turn[i].second.first;
            int s = turn[i].second.second;
            turning(r, c, s);
        }
        check_minnum_sum();
        recover_map();//원본을가져옴.
    } while (next_permutation(turn.begin(), turn.end()));
    //벡터에담긴 회전연산의 순서를 전부돌아본다 ->next_permutation
    //각연산은 한번씩적용.
    cout << res;
    return 0;
}
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4ftext-decoration:none">Colored by Color Scripter
http://colorscripter.com/info#e" target="_blank" style="text-decoration:none;color:white">cs

'Problem Solving > 삼성 역량테스트' 카테고리의 다른 글

BOJ-14500 테트로미노  (0) 2019.11.07
BOJ-17837 새로운 게임2  (0) 2019.11.06
BOJ-12100 2048(Easy)  (0) 2019.11.06
BOJ-17144 미세먼지 안녕  (0) 2019.11.06
BOJ-17780 새로운 게임  (0) 2019.11.05

+ Recent posts