[C] BOJ 9933번: 민균이의 비밀번호 - 성공

ㅎㅎ·2023년 1월 11일
0

BOJ

목록 보기
3/65

BOJ 9933번: 민균이의 비밀번호

문제

창영이는 민균이의 컴퓨터를 해킹해 텍스트 파일 하나를 자신의 메일로 전송했다. 파일에는 단어가 한 줄에 하나씩 적혀있었고, 이 중 하나는 민균이가 온라인 저지에서 사용하는 비밀번호이다.

파일을 살펴보던 창영이는 모든 단어의 길이가 홀수라는 사실을 알아내었다. 그리고 언젠가 민균이가 이 목록에 대해서 얘기했던 것을 생각해냈다. 민균이의 비밀번호는 목록에 포함되어 있으며, 비밀번호를 뒤집어서 쓴 문자열도 포함되어 있다.

예를 들어, 민균이의 비밀번호가 "tulipan"인 경우에 목록에는 "napilut"도 존재해야 한다. 알 수 없는 이유에 의해 모두 비밀번호로 사용 가능하다고 한다.

민균이의 파일에 적혀있는 단어가 모두 주어졌을 때, 비밀번호의 길이와 가운데 글자를 출력하는 프로그램을 작성하시오.

입력

첫째 줄에 단어의 수 N (2 ≤ N ≤ 100)이 주어진다. 다음 N개 줄에는 파일에 적혀있는 단어가 한 줄에 하나씩 주어진다. 단어는 알파벳 소문자로만 이루어져 있으며, 길이는 2보다 크고 14보다 작은 홀수이다.

출력

첫째 줄에 비밀번호의 길이와 가운데 글자를 출력한다. 항상 답이 유일한 경우만 입력으로 주어진다.


풀이 코드 - 성공

펠린드롬: 우리 말로 회문, 제대로 읽어도 거꾸로 읽어도 같은 단어를 뜻한다.

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

int main() {
  int N, len, pw;
  scanf("%d", &N);
  char word[101][16] = {0};

  for (int i = 0; i < N; i++) { // 입력 받기
    scanf("%s", word[i]);
  }

  for(int i=0; i<N; i++) {
    pw = 1;
    len = strlen(word[i]);
    for(int j=0; j<len/2; j++) { // 펠린드롬 검사
      if(word[i][j] != word[i][len-1-j]) {
        pw = 0;
        break;
      }
    }
    if(pw) {
      printf("%d %c", len, word[i][len/2]);
      return 0;
    }
  }
  
  for (int i = 0; i < N; i++) { // 검색 대상 단어
    len = strlen(word[i]);
    
    for(int j=0; j<N; j++) { // 다른 단어
      if(len == strlen(word[j])) { // 길이 검색

        pw = 1;
        for(int k=0; k<len; k++) { // 단어 검색
          if(word[i][k] != word[j][len-1-k]) {
            pw = 0;
            break;
          }
        }
        if(pw) {
          printf("%d %c", len, word[i][len/2]);
          return 0;
        }
      }
    }
  }
  
  return 0;
}

풀이 코드 - 실패

예제 입출력은 모두 맞는데 틀렸습니다?

당연함...
이 코드는 아묻따 첫번째로 입력받은 단어의 길이와 가운데 글자를 출력함...
1. reverse() 는 사용하지 않는다.
2. pw 를 매번 초기화 해줘야 한다.

#include <stdio.h>
#include <string.h>
void reverse(); // 뒤집기
int find();

int main() {
  int N, len, pw=0;
  scanf("%d", &N);
  char word[100][14] = {0};
  

  for(int i=0; i<N; i++) { // 입력 받기
    scanf("%s", word[i]);
  }

  for(int i=0; i<N; i++) {
    //reverse(word[i]);
    pw = find(N, i, word);
    if(pw!=0) {
      len = strlen(word[i]);
      printf("%d %c", len, word[i][len/2]);
      break;
    }
  }
  
  return 0;
}

void reverse(char arr[]) { 
  char temp;
  int len = strlen(arr);

  for(int i=0; i<len/2; i++) {
    temp = arr[i];
    arr[i] = arr[len-1-i];
    arr[len-1-i] = temp;
  }
}

int find(int N, int num, char arr[][14]) {
  reverse(arr[num]);

  for(int i=0; i<N; i++) {
    if(i == num) { continue; }
    if(strcmp(arr[num], arr[i])) { return 1; }
  }
  
  reverse(arr[num]);
  return 0;
}
profile
Backend

0개의 댓글