문제
딸기가 좋아! 딸기가 좋아!
앙중대학교 신입생 환영회에 참석한 해강이는 술게임에서 살아남아야 한다. 순간 이진딸기가 시작되고, 이진딸기의 규칙을 모르는 해강이는 곤란해졌다! 해강이에게 어떻게 말해야 하는지 알려주어 해강이를 구해주자!
이진딸기의 규칙은 다음과 같다. 4박자(한박에 1비트)를 사용하며, 1~15의 수를 이진법으로 나타내어 0에서는 박자를 비우고 1에서만 딸기를 외치게 된다. 비는(침묵하는) 박자는 "V"를 사용하여 나타낸다. 1부터 5까지는 다음과 같이 외치게 된다.
- VVV딸기
- VV딸기V
- VV딸기딸기
- V딸기VV
- V딸기V딸기
15 이후 다시 14, 13으로 내려오고 1에 도달하면 다시 2, 3으로 올라가게 되며 이를 반복한다.
입력
첫 줄에 테스트 케이스의 개수 T(1 ≤ T ≤ 1,000)가 주어진다.
이후 T개의 줄에 걸쳐 이진 딸기를 처음 시작한 사람으로부터 몇 차례 후에 해강이가 말해야 하는지 N (1 ≤ N ≤ 1,000,000,000) 이 정수로 주어진다.
출력
해강이가 해야하는 말을 출력한다. 쉬는 박자는 V로 한다.
예제 입력 1
2
3
16
예제 출력 1
VV딸기딸기
딸기딸기딸기V
(15 - 딸기딸기딸기딸기 이후 VVV딸기 도달 전까지 하나씩 줄어든다)
<Code>
//22970] 문제 재탕
#include <iostream>
#include <algorithm>
#include <string>
using namespace std;
int main() {
//freopen("input.txt","rt", stdin);
ios::sync_with_stdio(false);
cin.tie(NULL); cout.tie(NULL);
int T, num;
long long N; //(1 ≤ N ≤ 1,000,000,000)
string s1, s2;
string s[16];
scanf("%d", &T);
//1~15를 이진수로 바꿔서 string 배열(s)에 저장
for(int i=1; i<=15; i++){
num=i;
int res=0;
for(int j=1; num>0; j*=10){
res=res+(num%2)*j;
num/=2;
}
s[i]=to_string(res);
}
//4자리로 채우기 위한 노가다
for(int i=1; i<=7; i++){
if(s[i].size()==1) s[i]="000"+s[i];
else if(s[i].size()==2) s[i]="00"+s[i];
else if(s[i].size()==3) s[i]="0"+s[i];
}
//0->'V', 1->'딸기' 변환
for(int i=1; i<=15; i++){
s2="";
for(int j=0; j<s[i].size(); j++){
if(s[i].substr(j,1).compare("0")==0){
s2+="V";
}else{
s2+="딸기";
}
}
s[i]=s2;
}
//N이 15이하라면 배열에서 N번째를 바로 출력
//16이상이라면 14->1로 내려가고 2-> 15로 올라가면서 14개씩 반복
//14로 나눈 몫이 짝수면 내려가는 구간, 홀수면 올라가는 구간
for(int i=0; i<T; i++){
scanf("%d", &N); //3
if(N<=15){
cout<<s[N]<<'\n';
}else{
int N2=N-16;
int a=N2/14;
int b=N2%14;
if(a%2==0){ //내려가는 구간
cout<<s[14-b]<<'\n';
}else{ //올라가는 구간
cout<<s[b+2]<<'\n';
}
}
}
return 0;
}
//22935] 이진 딸기
#include <iostream>
#include <string>
using namespace std;
int main() {
freopen("input.txt","rt", stdin);
string strawberryGame[28]={
"0001", "0010", "0011","0100",
"0101", "0110", "0111","1000",
"1001", "1010", "1011","1100",
"1101", "1110", "1111","1110",
"1101", "1100", "1011","1010",
"1001","1000","0111","0110",
"0101", "0100", "0011","0010"
};
string res;
int n, tc;
scanf("%d", &n);
for(int i=0; i<n; i++){
scanf("%d", &tc);
res=strawberryGame[(tc-1) % 28];
//출력
for(int j=0; j<res.size(); j++){
if(res[j]=='0') printf("V");
else printf("딸기");
}
puts("");
}
return 0;
}
https://www.acmicpc.net/problem/22935
22935번: 이진 딸기
첫 줄에 테스트 케이스의 개수 T(1 ≤ T ≤ 1,000)가 주어진다. 이후 T개의 줄에 걸쳐 이진 딸기를 처음 시작한 사람으로부터 몇 차례 후에 해강이가 말해야 하는지 N (1 ≤ N ≤ 1,000,000,000) 이 정
www.acmicpc.net
<Comment>
다른 사람의 풀이를 보다가 정말 인상적(?)인 풀이였어서 아카이브해둔다. 훨씬 이해하기 쉽고 가독성도 좋다.
- 총 28개의 수가 반복적으로 출력되므로 이걸 strawberryGame이라는 string 배열에 모두 넣어놓고,
- 반복문을 이용해 tc를 입력받으면서 동시에 strawberryGame[(tc-1) % 28] 으로 출력해야 하는 이진수를 찾아 res에 넣고,
- 또다른 j-for문에서 res.size()만큼 돌면서 0이면 'V', 1이면 "딸기" 출력.
'Problem Solving > 백준' 카테고리의 다른 글
[백준-1789] 수들의 합 (0) | 2021.09.04 |
---|---|
[백준-14888] 연산자 끼워넣기 (0) | 2021.08.27 |
[백준-22971] 증가하는 부분 수열의 개수 (0) | 2021.08.27 |
[백준-1935] 후위 표기식 2 (0) | 2021.08.25 |
[백준-22970] 문제 재탕 (0) | 2021.08.23 |