www.acmicpc.net/problem/12865

 

12865번: 평범한 배낭

첫 줄에 물품의 수 N(1 ≤ N ≤ 100)과 준서가 버틸 수 있는 무게 K(1 ≤ K ≤ 100,000)가 주어진다. 두 번째 줄부터 N개의 줄에 거쳐 각 물건의 무게 W(1 ≤ W ≤ 100,000)와 해당 물건의 가치 V(0 ≤ V ≤ 1,000)

www.acmicpc.net

1. 풀이방법

 

 - 처음에 떠올린 방법은 브루트 포스로 모든 경우의 수 (조합) 을 모두 계산해 보는 것 

 

 - 이렇게 짜볼까 하다가 시간초과가 매우 발생할 것 같아서 방향을 바꿨습니다.

 

 - 그냥 메모리를 사용해서 버틸 수 있는 무게 별로 최대가치를 저장하는 테이블을 선언하자 라고 생각.

 

 - N개의 물건들을 하나씩 살펴 보면서 버틸 수 있는 무게 K 밑으로 살펴보며 이 물건을 넣어가며 테이블을 갱신

 

 

 

2. 주의사항

 

 - 아직 알고리즘 문제풀이가 많이 부족해서 기존의 떠오른 생각 방향에서 다른 쪽으로 생각하는게 부족...

 

 - 열심히 풀어야겠습니다...

 

 

3. 나의코드

 

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

int N, K;
int dp[100001]; // 버틸 수 있는 무게 별로 최대가치를 저장하는 테이블
int weightarr[101];
int valuearr[101];

void dypro() {
	for (int i = 1; i <= N; i++) {
		for (int j =K; j >= 0; j--) {
			if (weightarr[i]<= j) {
				dp[j] = max(dp[j], dp[j- weightarr[i]] + valuearr[i]);
			}
		}
	}
	cout << dp[K] << "\n";
}

int main() {
	ios_base::sync_with_stdio(false);
	cin.tie(NULL);
	cin >> N >> K;
	for (int i = 1; i <= N; i++) {
		cin >> weightarr[i] >> valuearr[i];
	}
	dypro();
	return 0;
}

'알고리즘 문제풀이 > 다이나믹 프로그래밍' 카테고리의 다른 글

백준 11726 [C++]  (0) 2020.12.14
백준 7570 [C++]  (0) 2020.12.02
백준 1932  (0) 2020.03.02
백준 2579  (0) 2020.02.01
백준 9095  (0) 2020.02.01

** Pdo사용을 위해선 php 버전이 5.1.0 이상 이어야 합니다**

 

1.PDO(PHP Data Object) 란?

- PHP에서 여러종류의 데이터 베이스에 접근할 수 있게 해주는 PHP 확장 모듈이다.(클래스)

- (MySQL, MS SQL, Oracle......)

-반면, mysql 함수나 mysqli 클래스는 MySQL 서버만을 대상

- 즉, 여러종류의 데이터베이스를 같은 방식으로 사용할 수 있게 해준다.

- Pdo는 Prepared Statement를 제공하여 SQL을 미리 데이터베이스에서 컴파일 해두고

  parameter만 값만 바꿔 처리 함으로써 성능의 향상을 위해 된다. 그리고 SQL injection 방어용

  으로도 사용될 수 있는데, Pdo 역시 Prepared Statement를 제공하므로 SQL injection 방어에 사용될

  수 있습니다. <밑에 예시 코드에서 확인하시면 됩니다.>

 

 

2. 데이터베이스에 연결

- 데이터베이스에 접속하기 위해서 Pdo를 이용해보자.

- 먼저 pdo를 생성하여야 한다.

 

3.쿼리준비

- 데이터베이스와 연결후 

- prepare() 메소드를 사용.

 

4.데이터를 바인딩, 실행

- execute() 메소드의 인수로 쿼리 파라미터에 사용할 값을 넘겨준다.

 

5. 결과값 가져오기

-이는 다른 예시인데 위의 예시는 그냥 insert를 하는 기능을 수행하는 함수 였기 때문이다.

-(1) fetch()

    : 메소드를 한번 실행하면 쿼리결과에서 한행을 가지고 온다

      반복문을 통해 처리하는 경우가 많다.

-(2) fetchAll()

    : 한번에 모든 행을 가지고 올 떄 사용한다.

**fetch의 모드 구성

      -1 FETCH_BOTH

          - 가져오기 모드를 지정해주지 않으면 이 모드가 지정되는데,

             결과 값을 가지고 올떄 칼럼이름을 키로 사용하는 배열과 칼럼의 순서를 키로 사용하는

             배열 두가지 배열을 만들기 때문에 성능이 좋지않다.

      -2 FETCH_ASSOC

          - 칼럼명을 키로 사용하는 연관배열을 반환한다.

          - $row['COLUMN_NAME']와 같은 방식으로 사용한다.

      -3 FETCH_NUM

          - 컬럼의 순서를 키로 사용하는 연관배열을 반환한다.

          - 가져온 데이터는 $row[NUM]과 같은 식으로 사용한다.

       - 이 3가지 외에도 OBJ(객체) 등이 있다....

1. Redirection을 구현

 

Redirection(in) 구현 부

 

Main() 함수에서 자식 프로세스 exec을 수행하기 전에 “<”가 있는지 확인후

 

있을 경우 dup2함수를 이용하여 redirection 기능을 수행하도록 구현 하였습니다.

 

그리고 마지막 for문을 이용하여 이전 커맨드벡터에서 떙겨주었습니다

 

( 리다이렉션 명령어가 들어있던 부분)

 

 Redirection(out) 구현 부

 

마찬가지로 main()함수에서 자식프로세스가 exec을 하기 전에 redir_out함수로 들어가서

 

“>” 명령어가 있는지를 확인하고 있다면 dup2함수를 이용하여 redirection을 수행후

 

마지막 for문을 이용하여 커멘드벡터를 떙겨주었습니다.

 

( 리다이렉션 명령어가 들어있던 부분)

 

2. 파이프 처리 기능

 

받은 커맨드문장(cmdvector) 에서 파이프가 있는지 와 커맨드문장의 어느 위치에 파이프가

 

있는지를 확인합니다.

 

만약 파이프 명령어가 없다면 바로 리턴 합니다.(리턴 값 1)

 

그리고 for문을 통해서 파이프 명령어(“|”) 앞, 뒤 명령어들을 나눠줍니다.

 

그리고 파이프를 생성하여 줍니다.

 

그리고 첫 번째 받은 명령어를 리다이렉션을 이용하여 출력을 돌려줍니다.

 

그리고 함수 내에서 자식을 생성한 후 자식은 두번째 명령어를 실행하는데

 

dup함수와 리 다이렉션을 이용하여 입력을 첫 번째 명령어(cmdpipe1)로부터

 

입력을 받도록 리다이렉션을 합니다.그리고 결과의 출력이 표준출력이 아닌 파이프를

 

통해서 나가도록 파이프출력으로 내보내도록 dup함수를 통해 설정합니다.

 

그 후 exec을 실행합니다.

 

부모 프로세스는 3번째 명령어(cmdpipe3)를 수행합니다.

 

이 프로세는 입력을 파이프를 통해서 입력받도록 dup함수를 이용하여 설정해주고

 

그리고 출력을 redirection을 통하여 조절해줍니다.

 

+ Recent posts