inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트

2-C

2-C 질문있습니다

해결된 질문

52

개발

작성한 질문수 3

0

안녕하세요 강사님

2-C 문제에 대해서 강사님과

조금 다른 방법으로도 풀어보았는데

(http://boj.kr/c5ecebe551ce49c383f378461adb1d8f)

 

강사님의 방법

(http://boj.kr/cf2c8a947f5041b69efd55961657526c)

 

보다 시간이 4ms 가량 높게 나와서 궁금증에 질문드립니다.

 

unordered_set에 높이들을 담고 강수량으로 사용하여 변화가 있는 지점만 계산하였고

 

maxHeight로 모두 잠기는 경우를 제외 하여 나름대로의 반복 횟수를 줄여보았습니다

 

그런데 오히려 4ms 가량 더 높게 나와서 어떤 부분이 시간을 더 오래걸리게 만든건지 궁금합니다

 

퀄리티 높은 강의와 지속적인 피드백 늘 감사드립니다!

c++ 코딩-테스트

답변 2

1

큰돌

안녕하세요 개발님 ㅎㅎ

코드 깔끔한데요?

잘 짜셨습니다. ㅎㅎ

먼저 4ms의 수준의 속도차이는 사실 미묘한 거라 신경을 쓰지 않아도 됩니다만

제 생각에는 unordered_set으로 효율적으로 하려고 했지만 사실 범위자체가 1 ~ 100까지 작은 범위라 이범위를 효율적으로 하려고 했지만 unordered_set이라는 자료구조를 생성하는 비용이 오히려 더 든 것 같습니다.

 

나머지 부분은 다 좋습니다.

제가 실제로 개발님 코드 기반으로 함수호출도 없애보고 unordered_set은 최악의 시간복잡도가 O(N)이기 때문에 O(logN) 인 set으로도 바꿔보고 한 코드를 첨부합니다. (이렇게 해도 20ms입니다. ㅎㅎ)

#include <bits/stdc++.h>

using namespace std;

const int maxDistance = 100;
const int dx[] = { 1, 0, -1, 0 };
const int dy[] = { 0, 1, 0, -1 };

int inputDistance;
int field[maxDistance][maxDistance];
bool visited[maxDistance][maxDistance];
int maxHeight = 0;
set<int> uniqueHeights;

void CalcSafeCount(int x, int y, int waterHeight)
{
    visited[y][x] = true;

    for (int i = 0; i < 4; ++i)
    {
        int nx = x + dx[i];
        int ny = y + dy[i];

        if (nx < 0 || ny < 0)
            continue;

        if (nx >= inputDistance || ny >= inputDistance)
            continue;

        if (visited[ny][nx])
            continue;

        if (field[ny][nx] <= waterHeight)
            continue;

        CalcSafeCount(nx, ny, waterHeight);
    }
}

int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);

    cin >> inputDistance;

    for (int y = 0; y < inputDistance; ++y)
    {
        for (int x = 0; x < inputDistance; ++x)
        {
            int height;
            cin >> height;

            field[y][x] = height;
            uniqueHeights.insert(height);
            maxHeight = max(maxHeight, height);
        }
    }

    int maxSafeCount = 1;
    for (int waterHeight : uniqueHeights)
    {
        if (waterHeight == maxHeight)
            continue;

        fill(&visited[0][0], &visited[0][0] + maxDistance * maxDistance, false);

        int safeCount = 0;
        for (int y = 0; y < inputDistance; ++y)
        {
            for (int x = 0; x < inputDistance; ++x)
            {
                if (visited[y][x])
                    continue;

                if (field[y][x] <= waterHeight)
                    continue;

                CalcSafeCount(x, y, waterHeight);
                safeCount += 1;
            }
        }

        maxSafeCount = max(maxSafeCount, safeCount);
    }

    cout << maxSafeCount;
    return 0;
}
 

 


 

또 질문 있으시면 언제든지 질문 부탁드립니다.

좋은 수강평과 별점 5점은 제게 큰 힘이 됩니다. :)

감사합니다.

강사 큰돌 올림.


0

인프런 AI 인턴

안녕하세요, 인프런 AI 인턴입니다. 개발님, 질문 주셔서 감사합니다.

코드의 실행 시간 차이에 대해 궁금해 하시는데, 각기 다른 접근 방식을 사용했을 때 실행 시간 차이가 발생하는 것은 자연스러운 현상입니다. 우선, 두 가지 방법의 주요 차이점을 하나씩 확인해 볼 필요가 있습니다.

  1. unordered_set 사용: unordered_set은 평균적으로 상수 시간 복잡도를 가지지만, 해시 충돌이 발생할 경우 성능이 급격히 저하될 수 있습니다. 이로 인해 특정 테스트 케이스에서는 예상보다 시간이 더 소요될 수 있습니다.

  2. 모두 잠기는 경우 제외: maxHeight를 통해 모두 잠기는 경우를 제외하려고 하셨지만, 실제로 코드를 실행하는 시스템에서는 모든 조건을 만족하는지 여부를 실시간으로 검증해야 하고, 이런 경우가 여러 번 발생하면 오히려 계산에 소요되는 시간이 늘어나게 됩니다.

다른 알고리즘이나 자료구조의 미세한 차이가키파이 성능에 큰 영향을 미칠 수 있으니, 다양한 경우의 수에 대해 실행해 보고, 발생할 수 있는 성능 차이를 분석하는 것이 중요합니다.

질문을 해결하는 데 도움이 될 만한 다른 학생의 답변으로는 다음과 같은 사례를 참고하실 수 있습니다:
- 문제를 풀었다고 생각했는데 75%에서 틀립니다. 뭐가 문제일까요 ㅜㅜ

질문의 구체적 사례와 관련된 토론이 이 답변에 이루어졌습니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

2-I) 왜 이 문제가 그래프이론 카테고리에 있는지 잘 모르겠습니다.

0

25

2

2주차 개념#12 트리 순회

0

20

2

백준사이트가 종료된다고 합니다.

0

243

2

백준 서비스 종료

9

773

1

sk 하이닉스 코테 대비

0

359

2

3-G 최댓값 질문

0

50

1

모듈러 연산 값이 10이 아닌 경우도 있지 않나요?

0

82

2

3-I 코드 질문드립니다.

0

62

2

3-N 질문 있습니다.

0

66

2

학습방법

0

100

2

4-H 질문 있습니다 (코드 리뷰)

0

66

2

코딩테스트 어디까지 준비해야 하는지 질문이 있습니다.

0

166

2

2-O 반례가 무엇일지 어떤 부분이 틀렸는지 잘 모르겠습니다.

0

69

2

2주차 개념 #4-2. 인접행렬 질문있습니다.

0

64

2

1-A 문제풀이 후 궁금한 점이 생겨서 질문드립니다.

0

49

2

조합 재귀 풀이 확인 해주시면 감사하겠습니다.

0

67

2

함수별 시간복잡도

0

72

2

3-h 질문입니다.

0

49

1

안녕하세요 선생님. 시간 복잡도 4번 질문있습니다.

0

52

2

1-I 문제 질문 드립니다.

0

76

2

2-P 질문입니다.

0

56

1

mac에서 시작하기 관련

0

88

2

5-Q 질문

0

63

2

풀이 코드 질문

0

64

2