inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

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

1-J

안녕하세요 1-J long long 선언 관련 질문드립니다.

106

문예찬

작성한 질문수 17

0

- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요!
- 먼저 유사한 질문이 있었는지 검색해보세요.
- 서로 예의를 지키며 존중하는 문화를 만들어가요.
- 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.

 

http://boj.kr/b83ac67345ca4ddc920bf59bf488a427

혼자서 풀다가 하도 안 돼서 강의를 봤는 데 답이 되는 변수의 범위가 커서 long long으로 선언되야 하는걸 놓친 걸 알고 고쳤지만 그래도 틀리더라구요.

선생님과 다른 부분이었던 map에 추가할 문자열 b(제 코드에서는 wearKind)를 구하는 과정을 선생님 코드처럼 바꾸니까 맞더라구요.

이 부분의 제 코드가 안 되는 반례가 있는거 같아 보이는데 도움 부탁드립니다..

 

다시 확인해보니 제 코드에서 m == 0 인 경우 그 뒤 로직수행을 해도 되지만 굳이 안하게 하기 위해 0을 출력하는 로직을 추가했는데 이때 '\n' 출력을 빼먹었네요.. 해결 되었습니다.

'\n'을 안넣은 것도 잘못했지만 m==0일 때 0을 출력하는 로직은 뒤에 로직에서 다 포함해서 해결해준다는 걸 문제 풀때 확인했는데도 굳이 해당 로직을 넣은게 아쉽네요. 문제를 풀때는 m=0일때의 계산량을 줄여줄 수 있다고 생각해서 추가했는데 지금 생각해보면 굳이? 느낌이네염..

 

 

1-J 관련해서 다른 질문이 생겨서 글 수정해 질문드립니다.

답이 될 변수 ret이 long long으로 선언되어야 한다는 점에 대해 생각해보면서 ret의 최댓값을 생각해봤습니다.

언뜻 생각해봤을 때 해빈이가 가질 수 있는 의상의 수는 최대 30이므로 모든 의상의 종류가 다를 때의 경우의 수인 2^30-1 정도가 최댓값이 될거 같았습니다. 좀 더 생각해서 의상의 종류가 30개에서 조금 줄어든다면 답에서 지수 30이 29,28 줄어들고 대신 3, 4..가 곱해질텐데 그러면 값이 더 작아지는 것으로 생각되어 최댓값은 2^30 근처인 것으로 생각이 됩니다.

하지만 int는 최대 2^31-1 까지 되는 것으로 알고 있어서 이 문제에서 가능할 거 같습니다.

선생님께서 말씀하신 바는 경우의 수 문제처럼 한 변수에 계속 숫자를 곱해나가는 경우 팩토리얼처럼 매우 쉽게 숫자가 급격하게 커질 수 있고 이 문제에서처럼 가능하더라도 정확하게 범위를 생각하는 것보다 맘편하게 4바이트? 더 써서 안전하게 푸는게 좋다는 뜻일까요?

c++ 코딩-테스트

답변 2

1

큰돌

안녕하세요 예찬님 ㅎㅎ

언뜻 생각해봤을 때 해빈이가 가질 수 있는 의상의 수는 최대 30이므로 모든 의상의 종류가 다를 때의 경우의 수인 2^30-1 정도가 최댓값이 될거 같았습니다.

-> 네 맞습니다. 이 문제의 경우 int로도 풀 수 있습니다. 예리하시네요 ㅎㅎ 다만, 보통의 "경우의 수" 문제는 long long으로 푸는게 좋습니다. 보통은 long long 수준으로 나오기도 하고 이 타입 하나로 맞왜틀에 걸리는 것보다는 좀 더 넓은 범위의 타입을 써서 해결하는게 안전합니다.

 

참고로 int로 푼 풀이입니다.

#include <bits/stdc++.h>
using namespace std;
int t, n;
string a, b;
int main(){
    cin >> t;
    while(t--){
        map<string, int> _map;
        cin >> n;
         for(int i = 0; i < n; i++){
            cin >> a >> b;
            _map[b]++;
        }
        int ret = 1;
        for(auto c : _map){
            ret *= ((int)c.second + 1);
        }
        ret--;
        cout << ret << "\n";
    }
    return 0;
}

 

감사합니다.

0

문예찬

친절한 답변 감사합니다~!

0

인프런 AI 인턴

안녕하세요, 인프런 AI 인턴입니다. 문예찬님.

C++ 코딩테스트를 준비하면서 변수의 자료형 때문에 생기는 문제는 흔합니다. 특히 문제에서 다루는 숫자가 매우 클 경우 long long을 사용해야 하는 상황이 종종 발생하죠. 여기에 더해 map을 활용한 코드가 예상대로 작동하지 않았을 경우, 추가된 값이 예상과 다를 수 있어 좀 더 신중한 접근이 필요합니다.

문제의 핵심은 입력된 데이터를 어떻게 처리하여 map에 추가하는가에 달려 있는데, 기존의 수강생들이 유사한 상황에 대해 질문한 사례를 참고해보세요:
- 문자열을 map에 추가할 때, 대소문자 구분이나 중복 제거 등이 영향을 미칠 수 있습니다. 추가하는 로직을 다시 한번 철저히 검사해 보시기 바랍니다.
- 질문에 포함된 링크 http://boj.kr/b83ac67345ca4ddc920bf59bf488a427와 관련된 자료가 없지만, 이러한 문제의 해결 사례를 다룬 질문 예시에서 도움을 받을 수 있을 것입니다.

질문들을 통해 비슷한 종류의 문제나 반례에 대한 논의를 찾을 수 있습니다. 또한 고려사항으로는:
1. map 키 생성 과정에서 로직의 불일치
2. 인덱스 범위 초과 가능성 점검
3. 자료형 변환 부분에서 생길 수 있는 불일치

문제 상황에 대한 구체적인 코드 보여주시면, 해결에 좀 더 직접적인 도움을 드릴 수 있을 것입니다. 제가 드리는 안내가 유익하길 바라며, 추가적인 질문이 있다면 언제든지 해주세요.

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

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

0

41

2

2주차 개념#12 트리 순회

0

22

2

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

0

266

2

백준 서비스 종료

9

840

1

sk 하이닉스 코테 대비

0

366

2

3-G 최댓값 질문

0

50

1

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

0

82

2

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

0

62

2

3-N 질문 있습니다.

0

66

2

학습방법

0

101

2

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

0

66

2

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

0

167

2

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

0

69

2

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

0

64

2

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

0

50

2

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

0

67

2

함수별 시간복잡도

0

72

2

3-h 질문입니다.

0

49

1

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

0

53

2

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

0

76

2

2-P 질문입니다.

0

56

1

mac에서 시작하기 관련

0

91

2

5-Q 질문

0

63

2

풀이 코드 질문

0

64

2