[백준] 1411번. 비슷한 단어 (C언어)

윤라이트·2023년 10월 19일

백준 코딩테스트

목록 보기
7/25

하이루.

실버 1 문제이다.



[백준] 1411번. 비슷한 단어




문제를 이해하고 입출력을 분석하는데까지약 30분이 소요 됐었다;;
나만 이런 건가....
문제가 처음엔 이해하기 어려웠음.


1중 if가 아닌 3중 if문에 break를 하면 2중 if문만 빠져 나오는지
아니면 for문 자체를 빠져 나오는 건지 헷갈려서 검색 하다가
원하는 답을 찾지 못 함.

그래서 charGPT한테 물어봤는데 내가 이해를 못 한 건지
얘가 이상하게 답변을 한 건지 모르겠어서 그냥 코드 간단하게 짜서
돌려봄.

이제서야 이해함.
gpt 왜 저래;;;



하.. 무튼 그렇게 많은 고난과 역경 끝에
출력 값이 원하는 대로 나타나게 되었는데....

아니.. 출력값이 잘 나오는데 왜 틀렸다고 나오는 거지...

일단 12시가 지나기 전에 잔디를 만들어 줘야 하기에
구글링 해서 파이썬으로 작성한 사람의 코드를 올렸음.

아니 그래서...
왜 틀렸다고 나오는 거지?
출력은 같은데.. 시간 초과도 아니고...

일단 나의 코드를 보여주겠다.
다소 좀 비효율적일 수도 있다.
주석은 거의 끝물에 대충 복붙했는데
수정을 하지 않아 이상할 수도 있다는 점을 염려해 두길 바란다.



! 출력 결과는 잘 맞는....것 같은 코드 !

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

int main(void) {

    int N, col, num[26][2] = { 0 }, bk = 5678, countA = 0, count = 0, R = 0;
    char word[100][50] = { 0 };
    int C = 0;
    
    scanf("%d", &N); // 단어 개수 입력 받기.

    for (int i = 0; i < N; i++) { // 2차원 배열에 단어 입력 받기
        scanf("%s", word[i]);
    }
    col = strlen(word);
     
    for (int i = 1; i < N; i++) {
        for (int j = 0; j < col; j++) {
            if (word[C][j] != word[i][j]) { // i행 j열과 i + 1행과 j행 비교하고 같지 않으면
                for (int k = -1; k <= R; k++) {
                    if (num[k + 1][0] == word[C][j]) {// 이미 바뀐 알파벳이랑 동일한 값인지 확인
                        if (num[k + 1][1] != word[i][j]) { // 동일한 알파벳으로 바뀌지 않았다면
                            bk = 1234;
                            break;
                        } 
                    }
                    else if (num[k + 1][0] != word[C][j]) {
                        if (num[k + 1][1] == word[i][j]) { // 동일한 알파벳으로 바뀌지 않았다면
                            bk = 1234;
                            break;
                        }
                    }
                } 
                if (bk == 1234) {
                    break;
                }
                num[R][0] = word[C][j]; // k행에 바뀔 알파벳 저장
                num[R][1] = word[i][j]; // 1열에 바뀐 알파벳 저장
                R++;
            }
            else if (word[C][j] == word[i][j]) { // i행 j열과 i + 1행과 j행 비교하고 같다면
                for (int k = -1; k <= R; k++) {
                    if (num[k + 1][0] == word[C][j]) {// 이미 바뀐 알파벳이랑 동일한 값인지 확인
                        if (num[k + 1][1] != word[i][j]) { // 동일한 알파벳으로 바뀌지 않았다면
                            bk = 1234;
                            break;
                        }
                    }
                    else if (num[k + 1][0] != word[C][j]) {
                        if (num[k + 1][1] == word[i][j]) { // 동일한 알파벳으로 바뀌지 않았다면
                            bk = 1234;
                            break;
                        }
                    }
                }
                if (bk == 1234) {
                    break;
                }
                
                num[R][0] = word[C][j]; // 값을 저장
                num[R][1] = word[i][j]; // 안 바뀐 알파벳 저장
                R++;
            }
            countA++; // 열은 문제 없어서 증가.
        }
        if (countA == col) {
            count++; // 비슷한 단어 순서쌍 찾음
            countA = 0;
            for (int p = 0; p <= R; p++) {
                for (int o = 0; o < 2; o++) {
                    num[p][o] = 0;           // 배열 초기화
                }
            }
            R = 0;
        }

        // 다음 행부터 비교
        if (bk == 1234) { 
            bk = 5678;
            countA = 0;
            for (int p = 0; p <= R; p++) {
                for (int o = 0; o < 2; o++) {
                    num[p][o] = 0;           // 배열 초기화
                }
            }
            R = 0;
        } 
        if (i == N - 1) {
            C++;
            i = C; 
        }
        
    }

    printf("%d\n", count);

    return 0;
}

와... 정말 지저분 하죠..?
근데 정말 최선을 다했어요.....
결국 출력은 같게 나오는데 무엇이 문제일까요..?
혹시 아시는 분은 댓글을 부탁합니다...ㅠㅠㅠㅠㅠㅠㅠㅠ

profile
끝까지 가보자9~!!!🔥✨💡

0개의 댓글