BOJ
BOJ::1333 부재중 전화
BOJ Bronze 3
BOJ::1333 부재중 전화
- Link : BOJ::1333
- Level : Bronze 3
시사점
- 난이도에 상관없이 실수는 어디서든 발생하는 것 같습니다.
- 문제를 정확히 이해하고, 복잡도는 얼마나 나오고, 문제에서 얘기하는 특정 단어는 무슨 뜻인지 모두 파악한 후에 문제를 풀어야 합니다.
- 해당 문제에서는 아래와 같이 잘못 생각하였습니다.
- 모든 앨범 수록곡을 다 듣고 난 후에는 전화벨을 들을 수 있습니다.
- 따라서, 다 듣고 나자마자 바로 전화벨을 들을 수 있다고 생각했습니다.
- 하지만, 문제에도 명시가 되어있듯이, 전화벨은 일정시간 간격으로 울립니다.
- 모든 수록곡을 다 들었다고 해도 아직 전화벨이 울릴 시간이 안 되었으면 전화벨을 들을 수 없는 것입니다.
- 캐치가 하나 더 있습니다.
- 만약, 전화벨이 노래가 시작되는 순간 울린다면, 강토는 전화를 받지 못한다.
- 또, 전화벨이 노래가 끝나는 순간 같이 끝난다면, 강토는 전화를 받을 수 없다.
- 간과하고 넘어갈 수 있지만, 전화가 시작되는 순간/끝나는 순간이 있습니다.
- 즉 노래가 L = 5라고 하면, 전화를 들을 수 있는 첫번째 구간은 [5,10)이라는 것입니다.
- 처음엔 (5,10)이라고 생각했습니다.
- 하지만, 전화벨을 1초가 지속됩니다.
- 따라서, 전화벨이 끝나는 순간이라면 울리기 시작한 시간 +1이겠지요.
키
이해(x)
- 총 N곡의 음악이 존재합니다.
- 각 음악은 L만큼의 길이를 가집니다.
- 각 음악 사이에 간격은 5초입니다.
- D초마다 벨소리가 울립니다.
- 음악이 나오는 동안 벨소리를 듣지 못 합니다.
- 전화벨을 들을 수 있는 가장 빠른 시간을 출력합니다.
설계, 손 코딩(x)
- 손으로 중심이 되는 코드를 구현합니다.
시간 복잡도
공간 복잡도
손 코딩 후 문제 리뷰(x)
- 빼먹고 손 코딩 한 것이 있는지 확인합니다.
구현(x)
함수 List
업데이트 되는 변수
- 대부분의 디버깅 문제는 업데이트 되는 변수에서 발생합니다.
실제 구현
#include<bits/stdc++.h>
#define endl '\n'
#define rep(i,a,b) for(int i=a;i<b;i++)
#define r_rep(i,a,b) for(int i=a;i>b;i--)
using namespace std;
int visited[1000 * 10000];
int main(){
//freopen("input.txt", "r", stdin);
ios_base::sync_with_stdio(false);
cin.tie(0);
int N, L, D;
cin >> N >> L >> D;
// songs, length, rigs
// (1L+0) ~ (1L+5*1)
// (2L+5*1) ~ (2L+5*2)
// (3L+5*2) ~ (3L+5*3)
long long itr = 0, sx = 0, ex = 0;
while (++itr <= N){
sx = itr*L + 5 * (itr - 1);
ex = itr*L + 5 * itr;
rep(i, sx, ex) visited[i] = 1;
}
bool Found = false;
long long possible = D;
itr = 1;
rep(i, 0, 1000 * 10000){
if (i%D == 0 && visited[i]){
cout << i << endl;
return 0;
}
if (i%D == 0 && i >= ex){
cout << i << endl;
return 0;
}
}
return 0;
}
구현 후 코드리뷰 + 예제 돌려보기(x)
- 바로 예제를 넣어서 테스트 해보기 전에, 코드를 한 번 리뷰하고, 예제의 입력이 이런식으로 왔을때 전체 코드가 어떤 식으로 순차적으로 진행되는지 답은 잘 도출될 것 같은지 확인합니다.