본문 바로가기
Problem Solving/AtCoder

AtCoder Beginner Contest #247

by 사향낭 2022. 4. 12.
 

Tasks - AtCoder Beginner Contest 247

AtCoder is a programming contest site for anyone from beginners to experts. We hold weekly programming contests online.

atcoder.jp

 

 

A. Move Right

 

 

A - Move Right

AtCoder is a programming contest site for anyone from beginners to experts. We hold weekly programming contests online.

atcoder.jp

 

0과 1로만 되어있는 길이 4의 문자열이 주어진다.

 

오른쪽으로 한 칸 움직였을 때의 문자열을 구하여라

 

4칸을 벗어나는 경우 사라지고 빈 칸의 경우 0으로 채워진다.

 

 

0을 출력한 다음 0, 1, 2번째 문자를 차례대로 출력하면 된다.

 

 

 

B. Unique Nicknames

 

 

B - Unique Nicknames

AtCoder is a programming contest site for anyone from beginners to experts. We hold weekly programming contests online.

atcoder.jp

 

\( N \) 사람의 성과 이름이 주어진다.

 

그 사람들의 nickname을 각각 부여하려고 한다.

 

\( i \)번째 사람의 nickname은 그 사람의 성 또는 이름이어야하고 다른 사람의 성이나 이름이면 안된다.

 

모든 사람들에게 nickname을 부여할 수 있는지 구하여라.

 

 

\( N \leq 100 \)으로 그냥 brute force를 사용하여도 된다.

 

아니면 map을 만들어서 성과 이름을 counting한 뒤 i번째 사람의 nickname을 고를 때 성과 이름을 counting에서 제외한 뒤 성과 이름 둘다 count가 1 이상이면 불가능하다.

 

 

 

C. 1 2 1 3 1 2 1

 

 

C - 1 2 1 3 1 2 1

AtCoder is a programming contest site for anyone from beginners to experts. We hold weekly programming contests online.

atcoder.jp

 

sequence \( S_n \)을 다음과 같이 정의하자.

 

- \( S_1 \)은 1만 가지고 있는 길이가 1인 sequence다.

 

- \( S_n \) ( \( n \geq 2 \) )은 \( S_{n - 1} \), n, \( S_{n - 1} \)을 순서대로 concatenating하여 얻은 sequence다.

 

예를 들어 \( S_3 \)은 \( S_2 \), 3, \( S_2 \) = \( S_1 \), 2 \( S_1 \), 3, \( S_1 \), 2, \( S_1 \) = 1, 2, 1, 3, 1, 2, 1 이다.

 

\( N \) ( \( 1 \leq N \leq 16 \) ) 이 주어질 때, \( S_N \)을 출력하여라.

 

 

dynamic programming을 이용하여 구하면 된다.

 

 

 

D. Cylinder

 

 

D - Cylinder

AtCoder is a programming contest site for anyone from beginners to experts. We hold weekly programming contests online.

atcoder.jp

 

원통 하나가 있을 때 주어진 query를 순서대로 수행하여라.

 

query의 종류는 다음과 같다.

 

- "1 x c": x라고 적혀진 공을 c개 원통의 오른쪽 끝에 넣는다.

 

- "2 c": 왼쪽 끝에서 공 c개를 꺼내 합을 출력한다.

 

 

deque를 이용하면 된다.

 

 

 

E. Max Min

 

 

Tasks - AtCoder Beginner Contest 247

AtCoder is a programming contest site for anyone from beginners to experts. We hold weekly programming contests online.

atcoder.jp

 

길이 \( N \) sequence \( A \)와 정수 \( X \), \( Y \)가 주어진다.

 

다음 조건을 만족하는 pair ( \( L \), \( R \) )의 갯수를 구하시오.

 

- \( 1 \leq L \leq R \leq N \)

 

- \( A_L, A_{L + 1}, ..., A_R \)의 최댓값은 \( X \), 최솟값은 \( Y \)다.

 

 

상당히 구현을 더럽게 했었는데 맞아서 신기했다.

 

잘 구현한 코드를 찾아서 링크를 걸어본다.

 

 

Submission #30857197 - AtCoder Beginner Contest 247

AtCoder is a programming contest site for anyone from beginners to experts. We hold weekly programming contests online.

atcoder.jp

 

진짜 이런식으로 짜야하는데,,

 

 

 

F. Cards

 

 

F - Cards

AtCoder is a programming contest site for anyone from beginners to experts. We hold weekly programming contests online.

atcoder.jp

 

카드 \( N \)개가 있다.

 

각각의 카드 앞, 뒷면에는 \( P_i \), \( Q_i \)라는 수가 적혀있다.

 

\( P_1, P_2, ..., P_N \)과 \( Q_1, Q_2, ..., Q_N \)은 \( 1, 2, ..., N \)의 permutation이다.

 

다음과 같은 조건을 만족시키는 카드 고르는 방법은 몇 가지인가.

 

- 모든 수 \( 1, 2, ..., N \)이 고른 카드들 중 적어도 하나에 적혀있어야 한다.

 

 

각 숫자 \( 1, 2, ..., N \)을 vertex로, 카드를 쓰여진 두 숫자를 잇는 edge로 봤을 때 결국 그래프로 나타낼 수 있다.

 

그래프의 모양을 대충 생각해보자면 cycle으로 이루어진 여러 component 형태를 띌 것이다.

 

따라서 각 cycle마다 모든 vertex를 cover하는 edge들을 선택하는 경우의 수를 구해서 곱해주면 된다.

 

한 cycle에 대하여 길이가 \( k \)라고 했을 때, cycle을 모두 cover하는 edge의 경우의 수를 dp로 구해보자.

 

cycle을 도는 순서대로 edge를 정렬했다고 가정하였을 때,

 

- dp[k][0]: \( k \) 길이의 cycle에서 첫 번째 edge를 선택하지 않고 마지막 edge를 선택한 경우

 

- dp[k][1]: \( k \) 길이의 cycle에서 첫 번째 edge를 선택하고 마지막 edge를 선택하지 않은 경우

 

- dp[k][2]: \( k \) 길이의 cycle에서 첫 번째 edge와 마지막 edge 모두 선택한 경우

 

 

점화식은 다음과 같이 나온다.

 

- dp[k][0] = dp[k - 2][0] + dp[k - 1][0]

 

- dp[k][1] = dp[k - 1][2]

 

- dp[k][2] = dp[k - 1][1] + dp[k - 1][2]

 

 

이를 이용하여 답을 계산해주면 된다.

'Problem Solving > AtCoder' 카테고리의 다른 글

AtCoder Regular Contest #138  (0) 2022.04.11
AtCoder Regular Contest #137  (0) 2022.03.20
AtCoder Beginner Contest #241  (0) 2022.03.03

댓글