대회 날짜 : 2024년 3월 10일
문제 수 : 9문제
등수 : 118/186
A. 시계탑 ( 00:51 ) Bronze IV
시간 제한 1초 / 메모리 제한 1024 MB
근성은 공대 7호관 옆 카페에서 자바칩 프라푸치노를 주문하려다 문득 생각이 나 카페 직원에게 물어보았다.
C++칩 프라푸치노는 없나요?
근성의 황당한 질문을 들은 카페 직원은 화가 나서 근성을 바로 앞에 있는 시계탑 분침에 묶어버렸다.
그러자 시계탑의 분침이 근성의 무게로 인해 이상하게 돌아가기 시작했다. 분침은 정확히 다음 순서를 매시간 반복한다.
- 매시간 정각에 분침은 12시 방향을 가리킨다.
- 매시간 정각부터 15분까지 분침은 시계 방향으로 정상적인 분침의 회전 속도의 배로 움직인다. 즉, 분 간 분침은 12시 방향에서 시계 방향으로 6시 방향까지 움직인다.
- 매시간 15분에 분침은 6시 방향을 가리킨다.
- 매시간 15분부터 다음 시간 정각까지 분침은 시계 방향으로 정상적인 분침의 회전 속도의 ⅔배로 움직인다. 즉, 45분 간 분침은 6시 방향에서 시계 방향으로 12시 방향까지 움직인다.
정상적인 시계탑의 분침은 매시간 정각에 정확히 12시 방향을 가리키며, 시간에 한 바퀴를 시계 방향으로 일정한 회전 속도로 움직인다.
바뀐 시계탑의 시침은 정상적인 시계탑과 똑같이 돌아가기 때문에 문제가 없었으나, 사람들은 지금이 몇 분인지 헷갈리기 시작했다.
바뀐 시계탑을 보고 올바른 시각을 구해 사람들에게 알려주자.
나의 코드
#include <iostream>
using namespace std;
int main(){
float A;
cin >> A;
cout << fixed;
cout.precision(1);
if (A<=30){
cout << A/2;
}
else {
cout << 15+(A-30)*3/2;
}
return 0;
}
이 문제는 M이 30보다 작으면 2를 나누고 30보다 크다면 15분 + (M-30)에 ⅔을 나누어주면 해결이 가능하다.
B. 전주 듣고 노래 맞히기 ( 01:07 ) Bronze I
시간 제한 1초 / 메모리 제한 1024 MB
윤수와 정환은 「전주 듣고 노래 맞히기」라는 게임을 할 예정이다. 「전주 듣고 노래 맞히기」는 주어진 노래의 전주를 듣고 먼저 제목을 맞히는 사람이 점수를 얻어 최종적으로 점수가 더 많은 사람이 이기는 게임이다. 절대 음감을 가진 윤수는 노래의 첫 네 음만 듣고도 어떤 노래든 바로 맞힐 수 있다. 따라서, 정환은 윤수를 이기기 위해 첫 세 음만으로 노래를 맞히게 해주는 프로그램을 만들려고 한다. 우선 정환이 알고 있는 노래 제목, 음이름 등을 데이터로 만든 뒤 프로그램을 구현하기 시작했다. 예를 들어, 다음은 TwinkleStar(반짝반짝 작은 별)의 악보 중 일부이다.
위 악보를 박자와 관계없이 음이름으로 표현하면 CCGGAAG가 된다.
윤수를 이기기 위해서는 이 프로그램이 첫 세 음인 CCG만으로 노래 제목인 TwinkleStar를 출력할 수 있어야 한다. 또한, 세상의 모든 노래를 아는 윤수와 다르게 정환은 음을 아는 노래가 개뿐이다. 그래서 프로그램에 개의 노래의 정보를 저장해 놓을 것이다. 만약 저장된 노래 중 입력한 첫 세 음으로 시작하는 노래가 여러 개 있어 무슨 노래인지 정확히 알 수 없는 경우 ?를 출력하고, 입력한 첫 세 음에 맞는 저장된 노래가 없을 경우 !를 출력한다.
정환을 도와서 첫 세 음만으로 본인이 음을 아는 노래를 맞히는 프로그램을 완성하자. 이 프로그램은 대문자와 소문자를 구분한다.
나의 코드
#include <iostream>
#include <vector>
using namespace std;
int main(){
vector<string> A,B;
int n,m;
cin >> n >> m;
while(n--){
int s;
string a,b;
cin >> s >> a;
getline(cin,b);
A.push_back(a);
B.push_back(b);
}
while(m--){
int s=0,index=0;
string a;
getline(cin,a);
for (int i=0;i<B.size();i++){
if (B[i].substr(1,a.length())==a){
s++;
index=i;
}
}
if (s>1) cout << "?\n";
else if (s<1) cout << "!\n";
else cout << A[index] << "\n";
}
return 0;
}
이 문제는 N개의 노래 이름, 7개의 음을 입력받고 M개의 줄에 음 3개를 입력받아 노래가 겹치면 특정 문자열을 출력하는 문제다. 나는 이 문제를 빨리 푸려고 getline으로 띄어쓰기를 포함해서 입력을 받았다. 멜로디의 문자열인 B를 돌면서 입력받은 문자열과 처음 멜로디 3개가 같다면 s변수를 더해주고 s변수의 개수에 따라서 출력을 해주면 풀 수 있다.
'Algorithm > Beakjoon' 카테고리의 다른 글
2024 UNIST-DGIST-POSTECH 연합 프로그래밍 경진대회 (2024 UDPC) (0) | 2024.04.01 |
---|---|
GEC-Cup 2024 (0) | 2024.03.31 |
제4회 고려대학교 MatKor Cup : 2024 Winter/Spring (0) | 2024.03.11 |
카툰컵 Zero: ~Prologue~ (0) | 2024.03.04 |
2024 신촌지역 대학생 프로그래밍 대회 동아리 연합 겨울 대회 (SUAPC 2024 Winter) (0) | 2024.02.19 |