인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

인프런 커뮤니티 질문&답변

문예찬님의 프로필 이미지
문예찬

작성한 질문수

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

1-J

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

작성

·

78

·

수정됨

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바이트? 더 써서 안전하게 푸는게 좋다는 뜻일까요?

답변 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

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

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

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

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

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

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

문예찬님의 프로필 이미지
문예찬

작성한 질문수

질문하기