C언어/백준

[백준 1010] 다리 놓기

슈슈버거 2023. 8. 14. 16:22

문제

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

 

1010번: 다리 놓기

입력의 첫 줄에는 테스트 케이스의 개수 T가 주어진다. 그 다음 줄부터 각각의 테스트케이스에 대해 강의 서쪽과 동쪽에 있는 사이트의 개수 정수 N, M (0 < N ≤ M < 30)이 주어진다.

www.acmicpc.net


내가 작성한 코드

<1차 코드>

#include <stdio.h>
#include <string.h>
#include <math.h>
#include <stdlib.h>

int main() {
    int t;

    scanf("%d", &t); //테스트케이스의 개수 t에 저장해주기

    //t만큼 반복문 실행
    for(int i = 0; i<t; i++){
        long long N, M;

        scanf("%lld %lld", &N, &M); //서쪽, 동쪽 개수 각각 N, M에 저장하기

        if(N == 0){ //서쪽에 다리가 없을 경우
            printf("0\n");
        }
        else{ //나머지 경우
            long long u= 1, d = 1;

            for(int j = 0; j<N; j++){ //분자 구하기
                u *= M;
                M -= 1;
            }

            for(int j = N; j>0; j--){ //분모 구하기
                d *= j;
            }

            long long result = u/d; //조합의 수 구하기
            printf("%lld %lld\n", u, d);
            printf("%lld\n", result); //경우의 수 출력하기
        }
    }
    return 0;
}

long long을 썼는데도 수의 범위를 초과하나 보더라... 음수가 뜨는 걸 보니 다른 해결책을 찾아야겠다

그리고 애초에 조건에 N, M이 0일 수는 없더라 그래서 그거 빼고 코드짜기로 했다

 

<2번째 코드>

#include <stdio.h>
#include <string.h>
#include <math.h>
#include <stdlib.h>

int main() {
    int t;

    scanf("%d", &t); //테스트케이스의 개수 t에 저장해주기

    //t만큼 반복문 실행
    for(int i = 0; i<t; i++){
        int N, M;

        scanf("%d %d", &N, &M); //서쪽, 동쪽 개수 각각 N, M에 저장하기

        long long result = 1; //경우의 수

        //바로바로 계산해주기
        for(int j = 1; j<=N; j++){
            result *= M;
            result /= j;
            M--;
        }

        printf("%lld", result);
    }
    return 0;
}

바로바로 계산해주는 시스템이다

testcase는 다 통과했는데... 왜 25%에서 틀리지 여전히

 

허허... 바본가 개행 안 해줬네

#include <stdio.h>
#include <string.h>
#include <math.h>
#include <stdlib.h>

int main() {
    int t;

    scanf("%d", &t); //테스트케이스의 개수 t에 저장해주기

    //t만큼 반복문 실행
    for(int i = 0; i<t; i++){
        int N, M;

        scanf("%d %d", &N, &M); //서쪽, 동쪽 개수 각각 N, M에 저장하기

        long long result = 1; //경우의 수

        //바로바로 계산해주기
        for(int j = 1; j<=N; j++){
            result *= M;
            result /= j;
            M--;
        }

        printf("%lld\n", result);
    }
    return 0;
}

느어엉 long long에 집중한다고 \n에 신경을 안 썼다... 암튼 해결!!

 

전체 풀이 과정!!

확실히 적으면서 풀어야 해

'C언어 > 백준' 카테고리의 다른 글

[백준 9655] 돌 게임  (0) 2023.08.18
[백준 1475] 방 번호  (0) 2023.08.17