대회 날짜 : 2024년 3월 10일
문제 수 : 3/14문제
등수 : 54/161
A. 핑크빈 레이드 ( 00:22 ) Bronze Ⅲ
시간 제한 1초 / 메모리 제한 1024 MB
UNIST, DGIST, POSTECH의 마스코트 윤이, 달구, 포닉스는 초등학생 시절부터 메이플스토리를 즐겨 했다.
메이플스토리는 2003년 4월 29일부터 상용 서비스를 시작했으며, 2023년 4월 29일에 20주년을 맞이한 넥슨의 대표 게임 중 하나이다.
메이플스토리 월드는 메이플스토리와 그 외 IP를 사용하여 누구나 변형 게임을 제작할 수 있는 창작 플랫폼이다. 메이플스토리 월드에서 플레이할 수 있는 메이플랜드는, 빅뱅 업데이트 이전 메이플스토리를 구현한 '과거로의 회귀' 컨셉의 팬 게임이다.
세 마스코트는 밀린 과제에서 벗어나 옛 추억을 되살리기 위해 메이플랜드를 시작했다. 셋은 매일같이 함께 사냥하면서 성장해 나갔다. 어느 날, 세 마스코트는 충분히 성장했다고 판단해서 악명 높은 보스 몬스터 핑크빈을 사냥하러 나섰다.
세 마스코트가 핑크빈을 사냥하는 방법은 다음과 같다. 핑크빈이 등장하여 사냥이 시작되는 시점을 0 초라고 하면, 셋은 0 초 시점에 일제히 자신의 스킬을 사용한다. 그 후 각 마스코트는 일정 주기마다 반복해서 스킬을 사용한다. 스킬을 사용하면 스킬의 대미지 수치만큼 핑크빈의 체력이 감소한다. 핑크빈의 체력이 0 이하가 되는 순간 사냥이 종료된다. 각 마스코트가 스킬을 사용하는 주기와 스킬의 대미지는 서로 다를 수 있다.
세 마스코트가 스킬을 사용하는 주기와 스킬의 대미지, 그리고 핑크빈의 체력이 주어질 때, 셋이 핑크빈을 사냥하는 데에 몇 초가 걸릴지 예상해 보자.
나의 코드
#include <iostream>
using namespace std;
int main(){
int A,a,B,b,C,c,H;
cin >> A >> a >> B >> b >> C >> c >> H;
for (int i=0;;i++){
if (i%A==0){
H-=a;
}
if (i%B==0){
H-=b;
}
if (i%C==0){
H-=c;
}
if (H<=0){
cout << i;
break;
}
}
return 0;
}
이 문제는 A, B, C의 데미지와 주기와 체력을 입력받아 언제 죽는지를 구하는 문제다. 그냥 for문으로 주기와 i를 나눠서 나누어 떨어지면 체력에서 데미지를 빼면 간단하게 풀린다.
B. 행운을 빌어요 ( 00:36 ) Silver IV
시간 제한 1초 / 메모리 제한 1024 MB
윤이, 달구, 포닉스는 UDPC에 참가하는 여러분을 위해 클로버를 만들어 선물하기로 했다. 클로버는 줄기와 잎으로 이루어져 있으며, 하나의 줄기에 3개 또는 4개의 잎이 달려야 한다.
클로버 조립을 맡은 포닉스는 윤이로부터 개의 클로버 줄기를, 달구로부터 개의 클로버 잎을 받았다. 포닉스는 클로버를 조립하다 문득 이대로라면 쓰지 못한 줄기나 잎이 남을 수 있다는 사실을 깨닫고 말았다. 포닉스는 재료가 남는 것을 막기 위해 클로버 줄기 또는 잎을 더 가져오려 한다. 줄기와 잎을 남김없이 모두 써서 클로버를 만들기 위해 포닉스가 더 가져와야 하는 클로버 줄기와 잎 개수의 합의 최솟값을 구해주자.
나의 코드
#include <iostream>
using namespace std;
int main(){
int t;
cin >> t;
while(t--){
int A,B,m=0;
cin >> A >> B;
while(A*3>B || A*4<B){
if (A*4<B){
A++;
m++;
}
else {
m+=A*3-B;
B+=A*3-B;
}
}
cout << m << "\n";
}
return 0;
}
이 문제는 클로버의 줄기와 잎의 개수가 주어지면 총 몇 개의 잎 또는 줄기가 필요한지 구하는 문제다. 줄기가 부족하면 추가하고 잎이 부족하면 최소인 3잎을 만든다고 가정하고 3 * 줄기수 - 현재 잎수로 구하는 게 가능하다.
C1. 지정좌석 배치하기 1 ( 00:42 ) Silver IV
시간 제한 1초 / 메모리 제한 1024 MB
이 문제는 지정좌석 배치하기 2 문제와 마지막 문단 및 출력만 다릅니다. 지정좌석 배치하기 2 문제의 코드로 이 문제를 해결할 수 없음에 유의하세요.
UDP대학교의 인기 교수 달구 교수님의 이번 학기 강의실은 정원이 명인 강의실로 배정되었으며, 행 열의 직사각형 모양으로 좌석이 배치되어 있다. 해당 강의실은 뒤에 앉은 학생도 원활히 강의를 수강할 수 있도록 각 행의 좌석 높이가 씩 차이가 나며, 가장 앞에 위치한 행부터 뒤에 위치한 행까지 순서대로 행, 행, ⋯, 행이라고 할 때 행의 좌석 높이는 이다.
달구 교수님은 원활한 출석체크를 위해 지정좌석제를 실시하기 때문에, 명의 모든 학생은 한 학기 동안 동일한 좌석에만 앉을 수 있다. 달구 교수님은 학생들이 최대한 본인이 원하는 좌석에 앉을 수 있도록 각 학생이 희망하는 좌석의 행을 조사하였고, 그 결과 각 행에 앉기를 희망하는 학생들을 선정하였다. 그중 명씩 행의 좌석을 희망하는 학생의 키는 각각 ℎi1,ℎi2,⋯, 이다.
학생들의 원활한 강의 수강을 위해, 각 학생의 시야가 같은 열에 앉은 다른 학생에 의해 가려지는 경우가 없도록 좌석을 배치하고자 한다. 구체적으로, 각 학생의 (좌석 높이 + 키)는 자신보다 앞 행의 같은 열에 있는 모든 학생의 (좌석 높이 + 키)보다 커야 한다.
좌석을 배치하던 달구 교수님은, 학생들의 시야를 확보하면서 모든 학생을 희망하는 행에 앉히는 것이 불가능할 수도 있다는 것을 깨달았다. 각 행에 앉고자 하는 학생의 키가 주어졌을 때, 주어진 조건에 맞게 모든 학생을 원하는 행의 좌석에 배치할 수 있는지 여부를 구해주자.
나의 코드
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main(){
int n,m,k;
cin >> n >> m >> k;
vector<vector<int>> A(n,vector<int>(m,0));
for (int i=0;i<n;i++){
for (int j=0;j<m;j++){
cin >> A[i][j];
A[i][j]+=i*k;
}
sort(A[i].begin(),A[i].end());
}
for (int i=1;i<n;i++){
for (int j=0;j<m;j++){
if (A[i][j]<=A[i-1][j]){
cout << "NO";
return 0;
}
}
}
cout << "YES";
return 0;
}
이 문제는 학생들을 앉히고 다 앞이 보이는지 확인하는 문제다. 각 줄에서는 어떻게 배치해도 상관이 없으니까 입력을 받고 정렬을 해준다. 그리고 계단의 높이는 입력과 동시에 더해주면 된다. 그리고 2번째 줄부터 i-1번째 줄과 계속 비교하면서 크거나 같다면 NO를 출력하고 아무것도 없다면 YES를 출력하면 된다.
'Algorithm > Beakjoon' 카테고리의 다른 글
2024 부산대학교 프로그래밍 대회 (PNUPC) - UPSOLVING (0) | 2024.05.29 |
---|---|
2024 POSTECH Programming Contest (0) | 2024.05.08 |
GEC-Cup 2024 (0) | 2024.03.31 |
2024 상반기 전남대학교 PIMM 알고리즘 파티 (3) | 2024.03.12 |
제4회 고려대학교 MatKor Cup : 2024 Winter/Spring (0) | 2024.03.11 |