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

 

11053번: 가장 긴 증가하는 부분 수열

수열 A가 주어졌을 때, 가장 긴 증가하는 부분 수열을 구하는 프로그램을 작성하시오. 예를 들어, 수열 A = {10, 20, 10, 30, 20, 50} 인 경우에 가장 긴 증가하는 부분 수열은 A = {10, 20, 10, 30, 20, 50} 이고, 길이는 4이다.

www.acmicpc.net

이번 문제는 다이나믹 프로그래밍을 이용하여 푸는 문제입니다.

 

배열 A를 입력받은 수열이라고 하면

DP[i]는 A[1],A[2],....,A[i] 까지 수열이 있을 때 A[i]를 마지막으로 하는 가장 긴 증가하는 부분수열의 길이라고 둡니다.

우선 처음에는

10을 마지막으로 하는 가장 긴 증가하는 부분수열의 길이는 1입니다.

 

다음의 20은 왼쪽에 있는 수 중 자신보다 작으면서 DP[자신보다 작은 수의 위치] 가 자신의 DP[자신]의 값 보다 크면 그수에 1을 더합니다.

이것을 코드로 만들어 보면 이런식으로 나옵니다.

 

if(A[j]<A[i]&&DP[j]>=DP[i]){

    DP[i]=DP[j]+1;

}

 

다음에 나오는 10은 만족하는 조건이 없으니 자기 자신의 길이인 1이 됩니다.

 

30은 자기보다 왼쪽에 있으면서 작은 수인 20이 있고 20의 길이인 2보다 자신의 길이(1) 이 더 작기 때문에 20의 길이의 자신의 길이를 더한 3이 들어가게 됩니다.

 

이런식으로 채워나가면 다음과같은 표를 만들 수 있게됩니다.

 

 

 

아래는 코드입니다.

 

 

 

'Programming > Baekjoon' 카테고리의 다른 글

BOJ ) 1912번 연속합  (0) 2019.10.07
BOJ ) 10866번 덱  (0) 2019.06.25
BOJ ) 1158번 조세퍼스문제  (0) 2019.05.31
BOJ ) 10845_큐  (0) 2019.05.30
BOJ ) 1406 에디터  (0) 2019.05.25

q#include<string>

using namespace std;

 

*문자열 -> 정수

 -stoi(string s) : string -> int

 -stol(string s) : string -> long

 -stoll(string s) : string -> long long

 -stof(string s) : string -> float

 -stod(string s) : string -> double

 -stold(string s) : string -> long double

 -stoul(string s) : string -> unsigned long

 -stoull(string s) : string -> unsigned long long

 

*정수 -> 문자열

 -to_string(int a) : int->string

 

이것 들을 활용한 BOJ 문제 10824번 네 수 문제입니다.

 

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

 

10824번: 네 수

첫째 줄에 네 자연수 A, B, C, D가 주어진다. (1 ≤ A, B, C, D ≤ 1,000,000)

www.acmicpc.net

 

 

 

 

'Programming > 지식' 카테고리의 다른 글

C++ 11 auto 타입추론  (0) 2019.06.25

C++11 에서는 타입추론이 가능합니다.

 

auto 타입을 선언하게 되면 초기값의 형식에 맞춰 인스턴스(변수)의 형식이 자동으로 결정됩니다.

 

해당형식을 추론하도록 컴파일러에게 지시를 하는것이 됩니다.

 

 

 

auto d=10.0;
auto i=10;

위와 같은 경우에는 10.0이 double형식이므로 d변수는 double 타입이라 추론하게됩니다.

10은 integer이므로 i를 integer타입이라 추론하게됩니다.

 

auto sum(int a,int b){
return a+b;
}

이부분 처럼 함수 선언을 하여

auto answer = sum(5,6);

 

호출하게 되면 return값이 integer이기 때문에 answer의 타입은 integer로 추론하게 됩니다.

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

 

10866번: 덱

첫째 줄에 주어지는 명령의 수 N (1 ≤ N ≤ 10,000)이 주어진다. 둘쨰 줄부터 N개의 줄에는 명령이 하나씩 주어진다. 주어지는 정수는 1보다 크거나 같고, 100,000보다 작거나 같다. 문제에 나와있지 않은 명령이 주어지는 경우는 없다.

www.acmicpc.net

자료구조의 덱 문제입니다.

 

  • push_front X: 정수 X를 덱의 앞에 넣는다.
  • push_back X: 정수 X를 덱의 뒤에 넣는다.

 

  • pop_front: 덱의 가장 앞에 있는 수를 빼고, 그 수를 출력한다. 만약, 덱에 들어있는 정수가 없는 경우에는 -1을 출력한다.
  • pop_back: 덱의 가장 뒤에 있는 수를 빼고, 그 수를 출력한다. 만약, 덱에 들어있는 정수가 없는 경우에는 -1을 출력한다.

  • size: 덱에 들어있는 정수의 개수를 출력한다.
  • empty: 덱이 비어있으면 1을, 아니면 0을 출력한다.
  • front: 덱의 가장 앞에 있는 정수를 출력한다. 만약 덱에 들어있는 정수가 없는 경우에는 -1을 출력한다.
  • back: 덱의 가장 뒤에 있는 정수를 출력한다. 만약 덱에 들어있는 정수가 없는 경우에는 -1을 출력한다.

덱은 #include<deque> 후에 deque<int> dq로 선언한 후 dq.push_back(int x), dq.size() ...이렇게 사용합니다.

 

아래는 소스입니다.

 

'Programming > Baekjoon' 카테고리의 다른 글

BOJ ) 1912번 연속합  (0) 2019.10.07
BOJ ) 11053번 가장 긴 증가하는 부분 수열  (0) 2019.10.07
BOJ ) 1158번 조세퍼스문제  (0) 2019.05.31
BOJ ) 10845_큐  (0) 2019.05.30
BOJ ) 1406 에디터  (0) 2019.05.25

 

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

 

1158번: 조세퍼스 문제

첫째 줄에 N과 K가 빈 칸을 사이에 두고 순서대로 주어진다. (1 ≤ K ≤ N ≤ 5,000)

www.acmicpc.net

이번 문제는 1158번 조세퍼스 문제입니다.

이 문제는 큐를 사용하면 쉽게 풀어낼 수 있는 문제입니다.

 

1번부터 N번까지 N명의 사람이 원을 이루면서 앉아있고, 양의 정수 K(≤ N)가 주어진다. 이제 순서대로 K번째 사람을 제거한다.

 

입력이 7 3 <--이렇게 들어왔다고 가정해보면

 

1 ~ 7까지를 모두 큐에 PUSH합니다. 그다음에 3번째 숫자만 삭제 해 나갑니다.

 

위 그림과 같이 2번을 POP해주고 뒤에 PUSH해서 넣어주면 3번째 숫자가 queue의 front에 오게 됩니다.

 

그렇다면 queue의 front를 출력해주고 pop해주면 한개가 삭제되는것입니다.

 

이런 과정을 queue가 empty가 될때까지 반복하면서 POP되는 숫자들을 출력해주면 됩니다.

 

아래는 전체 소스코드입니다!

 

 

'Programming > Baekjoon' 카테고리의 다른 글

BOJ ) 11053번 가장 긴 증가하는 부분 수열  (0) 2019.10.07
BOJ ) 10866번 덱  (0) 2019.06.25
BOJ ) 10845_큐  (0) 2019.05.30
BOJ ) 1406 에디터  (0) 2019.05.25
BOJ ) 9012번 괄호  (0) 2019.05.23

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

 

10845번: 큐

첫째 줄에 주어지는 명령의 수 N (1 ≤ N ≤ 10,000)이 주어진다. 둘째 줄부터 N개의 줄에는 명령이 하나씩 주어진다. 주어지는 정수는 1보다 크거나 같고, 100,000보다 작거나 같다. 문제에 나와있지 않은 명령이 주어지는 경우는 없다.

www.acmicpc.net

  • push X: 정수 X를 큐에 넣는 연산이다.

  • pop: 큐에서 가장 앞에 있는 정수를 빼고, 그 수를 출력한다. 만약 큐에 들어있는 정수가 없는 경우에는 -1을 출력한다.

  • size: 큐에 들어있는 정수의 개수를 출력한다.

  • empty: 큐가 비어있으면 1, 아니면 0을 출력한다.

  • front: 큐의 가장 앞에 있는 정수를 출력한다. 만약 큐에 들어있는 정수가 없는 경우에는 -1을 출력한다.

  • back: 큐의 가장 뒤에 있는 정수를 출력한다. 만약 큐에 들어있는 정수가 없는 경우에는 -1을 출력한다.

간단하게 큐를 구현하는 코드입니다.

 

 

우선 push 3 그리고 push 4를 했을때의 큐의 모습입니다.

 

 

큐의 맨 앞부분이 front이고, 맨 뒷부분이 back입니다. 그리고 현재 size 는 2가됩니다.

 

 

pop을 하게되면 맨앞에 front에 있는 data가 빠져나가게 됩니다. 

 

이를 c++코드로 구현하는 것이 이번 10845번 큐 문제입니다.

 

 

'Programming > Baekjoon' 카테고리의 다른 글

BOJ ) 10866번 덱  (0) 2019.06.25
BOJ ) 1158번 조세퍼스문제  (0) 2019.05.31
BOJ ) 1406 에디터  (0) 2019.05.25
BOJ ) 9012번 괄호  (0) 2019.05.23
BOJ ) 10799번 쇠막대기  (0) 2019.05.23

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

 

1406번: 에디터

문제 한 줄로 된 간단한 에디터를 구현하려고 한다. 이 편집기는 영어 소문자만을 기록할 수 있는 편집기로, 최대 600,000글자까지 입력할 수 있다. 이 편집기에는 '커서'라는 것이 있는데, 커서는 문장의 맨 앞(첫 번째 문자의 왼쪽), 문장의 맨 뒤(마지막 문자의 오른쪽), 또는 문장 중간 임의의 곳(모든 연속된 두 문자 사이)에 위치할 수 있다. 즉 길이가 L인 문자열이 현재 편집기에 입력되어 있으면, 커서가 위치할 수 있는 곳은 L+1가지 경우가

www.acmicpc.net

이번에는 스택을 활용하여 푸는 1406번 에디터 문제입니다. C++기준으로 #include<stack>을 활용하여 풀어 보았습니다.

 

문제를 보시면 

L : 커서를 왼쪽으로 한 칸 옮김 (커서가 문장의 맨 앞이면 무시됨)

D : 커서를 오른쪽으로 한 칸 옮김 (커서가 문장의 맨 뒤이면 무시됨)

B : 커서 왼쪽에 있는 문자를 삭제함 (커서가 문장의 맨 앞이면 무시됨)

P $ : $라는 문자를 커서 왼쪽에 추가함

총 4개의 명령어가 존재합니다.

 

스택을 활용하여 푸는 방법은 다음 그림과 같습니다.

자 우선 input으로 abcd를 받았을 때는 좌측에 abcd를 모두 push 해줍니다. 위에 있는 | 부분이 커서입니다.

L명령어를 받았을 때에는 커서를 왼쪽으로 한칸 이동시켜 주어야합니다. 그러면 그림과 같이 L스택의 top 을 R스택에 push 하고, L스택을 pop 해줍니다.

D명령어를 받았을 때에는 커서를 우측으로 한칸 이동시켜 주어야 합니다. 그러면 그림과 같이 R스택의 top을 L스택에 push해주고 R스택을 pop 해줍니다.

 

이번엔 P $ 명령어 입니다. $라는 문자를 커서 왼쪽에 추가하는 명령어 인데 L 스택에 $문자를 push해주면 간단하게 끝납니다.

마지막으로 B명령어는 커서 왼쪽에 있는 문자를 삭제 하는 명령어입니다. 이것도 간단하게 L스택을 pop해주면 됩니다.

 

* 출력을 할때에는 L에 있는 스택을 모두 R로 옮겨 주어야 하나씩 pop하면서 순서대로 출력이 됩니다!!

 

간단하게 그림으로 설명을 해보았습니다. 아래에는 소스코드입니다.

 

 

'Programming > Baekjoon' 카테고리의 다른 글

BOJ ) 10866번 덱  (0) 2019.06.25
BOJ ) 1158번 조세퍼스문제  (0) 2019.05.31
BOJ ) 10845_큐  (0) 2019.05.30
BOJ ) 9012번 괄호  (0) 2019.05.23
BOJ ) 10799번 쇠막대기  (0) 2019.05.23

Gist를 사용하여 Tistory에 멋있게 자신의 소스 코드를 올리는 방법을 한번 알아보겠습니다!

 

우선 

https://gist.github.com/

 

Discover gists

GitHub Gist: instantly share code, notes, and snippets.

gist.github.com

Gist사이트에 들어가서 로그인을 합니다. (Github아이디가 있으시다면 그 아이디로 로그인하시면 됩니다.)

로그인 하시면 오른쪽 우측상단에 +버튼이 있습니다. +버튼을 누르시면 이제 Create a new Gist를 할 수 있는 창이 나옵니다.

 

저는 공개하지 않기 원하기 때문에 Create secret gist를 선택하였습니다!

 

다음화면입니다.

<script>를 사용하여 삽입하기 때문에 표시해둔 버튼을 눌러 스크립트문을 복사합니다.

 

이제 블로그 글쓰기로 돌아와서

 

HTML 을 선택해줍니다. 

 

이렇게 적당한 위치에 삽입 해준다음에 글쓰기 완료를 눌러주면 아래와 같이 코드가 나옵니다!

 

(BOJ 10828번 스택)

 

+ Recent posts