프로그래밍/백준 알고리즘

백준 알고리즘 풀이 6359번 - 만취한 상범

good programmer 2019. 10. 7. 14:43

https://www.acmicpc.net/problem/6359

 

6359번: 만취한 상범

문제 서강대학교 곤자가 기숙사의 지하에는 n개의 방이 일렬로 늘어선 감옥이 있다. 각 방에는 벌점을 많이 받은 학생이 구금되어있다. 그러던 어느 날, 감옥 간수인 상범이는 지루한 나머지 정신나간 게임을 하기로 결정했다. 게임의 첫 번째 라운드에서 상범이는 위스키를 한 잔 들이키고, 달려가며 감옥을 한 개씩 모두 연다. 그 다음 라운드에서는 2, 4, 6, ... 번 방을 다시 잠그고, 세 번째 라운드에서는 3, 6, 9, ... 번 방이 열려있으면 잠그고

www.acmicpc.net

 

- dp 문제. 

 

- 알고리즘 -

입력받은 방의 수에서 가장 큰 걸 골라서 그 방수까지 dp를 수행.

dp 수행 식

1
2
3
if ((int)sqrt( i+1) * (int)sqrt(i+1) == (i+1))  ans[i+1]=ans[i]+1.
 
else ans[i+1]=ans[i] 
cs

 

-시간 복잡도-

가장 큰 방 수를 고르는 시간복잡도 = O(N). 

dp식 시간복잡도 = O(N)

따라서 총 시간 복잡도 = O(N) 

- 예외 조건 -

1. sqrt() 함수는 반환값이 double형이다. 따라서 int형으로 type casting 할 경우 소숫점 뒷자리들을 다 날려버린다.

 

쉽게 풀 수 있는 문제였다.

 

-소스 코드-

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include <iostream>
#include <cmath>
 
using namespace std;
int arr[101];
int main() 
{
    int testCase;
    int num=0;
    cin>>testCase;
    for(int i=1;i<=testCase;i++){
        cin>>arr[i];
        if(num<arr[i]) num=arr[i];
    }
    int counts[101];
    counts[1]=1;
    for(int i=1;i<=num;i++){
        if((int)sqrt(i+1)*(int)sqrt(i+1)==(i+1)){
            counts[i+1]=counts[i]+1;
        }
        else{
            counts[i+1]=counts[i];
        }
    }
    for(int i=1;i<=testCase;i++){
        cout<<counts[arr[i]]<<endl;
    }
}
cs

 

 

틀린 내용이나 지적 언제나 환영입니다.

도움이 되었다면 하트 한번씩 눌러주세요:)