컴공댕이 공부일지

[ 우선순위 큐 ] 구현 과제 (백준 2607 비슷한 단어 c++) +멘토 코멘트 본문

기록/알고리즘 스터디 알튜비튜 5기✨

[ 우선순위 큐 ] 구현 과제 (백준 2607 비슷한 단어 c++) +멘토 코멘트

은솜솜솜 2023. 9. 20. 01:27
728x90

하아아아아........... 진짜 존나모르겠다개열받네이새벽에이것만몇시간째야진짜하앙아아아ㅏ아

내일1교시인데 새벽 3시인데 안풀려

나는 개멍청이야

실버 구현도 못푸는 개 허접이야

하아...............

 

ㅎㅎㅎ... 결국 해내다.

맑은 정신에 푸니 금방 풀렸던... 멘탈 잘 잡아....

#include <iostream>

using namespace std;

bool similarWord(string word, string str) {
        
        
    //두 단어의 알파벳 갯수 저장
    int alpW[26]={0};
    int alpS[26]={0};
    
    //두 단어의 알파벳 갯수 카운트
    for(int i=0; i<word.length(); i++) {
        //만약 word의 i번째 문자가 A면 alpW의 0번 인덱스가 +1
        alpW[(int)word[i]-65]++; //'A'=65 
    }
    
    for(int i=0; i<str.length(); i++) {
        //만약 str의 i번째 문자가 B면 alpS의 1번 인덱스가 +1
        alpS[(int)str[i]-65]++; //'A'=65 
    }
    
    
    
    
    int sameAlp=0;
    for(int i=0; i<26; i++) {
        if(alpS[i]==alpW[i]) {
            sameAlp++;
        }
    }
    
    //아예 구성 같은 경우
    if(sameAlp==26) {
        return true;
    }
        
        
    //하나 바꿔서 같아지는 경우
    else if(sameAlp==24) {
        int swap[2]; //서로 바꿀 두 변수
        int j=0;
        
        for(int i=0; i<26; i++) {
            if(alpS[i]!=alpW[i]) {
                swap[j++]=i;
                if(j==2) {
                    break;
                }
            }
        }
        
        if((alpW[swap[0]]-alpS[swap[0]]) ==1 && (alpW[swap[1]]-alpS[swap[1]]) ==-1) {
            return true; //스와핑 가능
        } else if((alpW[swap[0]]-alpS[swap[0]]) ==-1 && (alpW[swap[1]]-alpS[swap[1]]) ==1) {
            return true; //스와핑 가능
        }
    }
        
        
    //하나 더하거나 빼서 같아지는 경우
    else if(sameAlp==25) {
        
        int difAlp=0;
        
        for(int i=0; i<26; i++) {
            if(alpS[i]!=alpW[i]) {
                difAlp=i;
                break;
            }
        }
        
        if(abs(alpW[difAlp]-alpS[difAlp])==1) {
            return true; 
            //25개가 같은데 하나만 갯수가 1 차이나면 더하거나 빼면 돼.
        }
    }     
    
    
    
    
    return false; //위에서 안걸리면 비슷해질 수 없어
}

int main()
{
    
    ios_base::sync_with_stdio(false);
    cin.tie(0); 
    cout.tie(0);
    
    int n;
    string word; //기준 단어
    int cnt=0; //비슷한 단어 개수
    
    cin >> n >> word;
    
    while(n>1) {
        
        string str;
        cin >> str;
        
        if(similarWord(word, str)) {
            cnt++;
        }
        
        n--;
    }
    
    cout<<cnt;

    return 0;
}

 

 

 

+) 멘토님의 코멘트!

 

아주 고민해서 문제를 풀어주신 흔적이 보입니다. 꼼꼼하게 경우를 나줘 주셨어요! 다만, sameAlp 변수를 이용해 개수에 차이가 있는 알파벳의 개수를 세고, 그 다음 구체적인 개수를 고려해 주셨는데 작성해주신 코드에선 불필요하게 한 번 더 두 배열의 원소를 처음부터 끝까지 비교하는 부분이 포함됩니다. 처음부터 각 알파벳의 개수의 차의 총합을 구하고, 그를 바탕으로 비슷한 단어인지를 판별한다면 더 간결하고 쉬운 코드가 될 것 같습니다.😊

 

(int)word[i] - 65

이렇게 형변환을 해주지 않아도 word[i]는 자동으로 정수형으로 들어갑니다!

 

 

항상 코멘트를 보거나, 멘토님의 풀이를 보면 내 풀이는 너무도 하찮은 것 같다 ...ㅋㅋㅋ ㅠㅠ

나는 아직 갈 길이 멀구나.. 파이팅!!

728x90
Comments