10월의 PS 주제는 SFPC(School Friends Programming Challenge)의 기출 문제를 풀어보고자 합니다. 정보 선생님들이라면 한 번쯤 들어보셨을 수도 있는데요.
SFPC이란?
한국정보교사연합회 주관하여 2021년부터 진행해 왔던 프로그래밍 챌린지로 프로그래밍에 대한 진입 장벽을 낮춰 프로그래밍에 관심 있는 보통 학생이라면 누구나 프로그래밍으로 문제 해결을 할 수 있는 장을 제공하는 목적을 갖고 있습니다.
일반고 수준을 대상으로 중학생, 특목/특성화/자사고 등 학생뿐만 아니라 교사 및 예비 교원까지 참여할 수 있는 다양한 기회를 제공합니다. 올해도 마찬가지로 2024년 1월에 진행 예정이라고 하네요~ 많은 학생과 선생님이 참여할 수 있으면 좋지 않을까요?
SFPC의 지난 기출 문제와 정답은 아래 사이트에서 확인할 수 있습니다.
문제 설명
DNA는 4가지 염기 아데닌(A), 티민(T), 사이토신(C), 구아닌(G)으로 구성되고, RNA는 4가지 염기인 아데닌(A), 우라실(U), 사이토신(C), 구아닌(G)으로 구성된다.
DNA로부터 RNA가 만들어지는 과정에서 아래와 같이 대응되어 전사된다.
•
아데닌(A) → 우라실(U)
•
티민(T) → 아데닌(A)
•
사이토신(C) → 구아닌(G)
•
구아닌(G) → 사이토신(C)
DNA 염기서열이 입력될 때, 전사된 RNA 염기서열을 출력해 보자.
입력 설명
DNA (n) . 첫 번째 줄에 어떠한 DNA를 구성하는 염기의 개수가 입력된다.
DNA . 두 번째 줄에 염기서열이 한 줄로 입력된다.
(1 <= n <= 100000)
출력 설명
전사된 RNA의 염기서열을 한 줄로 출력한다.
문제 이해 및 분석
문제에서 해결하고자 하는 것은?
→ 입력된 DNA의 짝이 되는 RNA 값 출력
문제의 현재 상태와 목표 상태는?
•
현재 상태 : 어떤 DNA를 구성하는 염기의 개수가 정수의 형태로 입력되고 A, T, C, G로 이뤄진 문자열이 입력된다.
•
목표 상태: 전사된 RNA의 염기서열을 한 줄로 출력한다.
알고리즘 설계 및 프로그래밍 코드
num = int(input())
DNA = input()
i=0
while(i<num):
if(DNA[i] == 'A'):
print("U", end="")
elif(DNA[i] == 'G'):
print("C", end="")
elif(DNA[i] == 'C'):
print("G", end="")
else:
print("A", end="")
i = i+1
Python
복사
보너스 문제 서로 악수하는 경우의 수
A학교와 B학교 학생들은 함께 동아리 활동을 하기로 했다. 처음 만나는 자리에서 서로 협력하자는 의미로 악수를 하려고 한다.
악수의 규칙은 다음과 같다.
[1] 학교 구분 없이 한 번씩 모두 악수를 해야 한다.
[2] 서로의 팔이 엇갈리게 악수하지 않는다.
[3] 악수를 하지 않은 사람이 없도록 악수한다.
예를 들면, 학생 수(n)가 2와 4일 때의 악수하는 경우는 아래 그림과 같다.
[입력]
악수를 하는 학생의 수, 짝수 입력
6
[출력]
조건에 맞게 악수하는 경우의 수
5
프로그래밍 코드
#include <stdio.h>
int D[50];
int f(int n)
{
int temp = 0;
if (n == 0)
return 1;
else if (n == 2)
return A[2] = 1;
else if (A[n] > 0)
return A[n];
else {
for (int i = 1; i < n; i += 2)
temp += f(i - 1) * f(n - (i + 1));
return A[n] = temp;
}
}
int main()
{
int n;
scanf("%d", &n);
printf("%d\n", f(n));
}
C
복사