본문 바로가기
IT/자료구조 및 알고리즘

C 언어 <배열과 포인터> 관련 알고리즘 문제

by 세계 최고의 AI Engineer_naknak 2023. 2. 2.

알고리즘과 함께하는 C의 아름다움에 수록된 배열 포인터 관련 문제입니다.

 

Q. 알파벳과 숫자만으로 4자부터 8자까지의 암호를 만들고, 성공적으로 로그인이 이루어지는지 검사하세요.

#include <stdio.h>

int main(){

// 임의로 생성한 암호 정답 코드입니다
  char loginCode[] = "hello123";
  
  // 사용자에게 입력 받을 문자열을 받아줄 배열입니다
  char tryCode[256];
  // 아래의 변수를 통해서 사용자에게 받은 문자열과 암호 정답 코드가 동일한 지를 판단합니다
  int cnt = 0, sizeOfCode = 0;

// 문자열 뒤에는 \0 null 문자가 항상 존재하기 때문에 1을 빼주었습니다
  sizeOfCode = sizeof(loginCode) - 1;

// 사용자로부터 문자열을 입력 받습니다
  gets(tryCode);
  

// 정답 코드와 사용자에게서 받은 코드를 한자리씩 비교한 뒤 같을 경우 cnt를 1씩 증가시켜줍니다
  for (int i = 0; loginCode[i] != '\0'; i++)
  {
    if(loginCode[i] == tryCode[i]){
      cnt++;
    }else{}
    
  }

// cnt 와 sizeOfCode 가 같다는 것은 모든 문자 요소가 같았다는 뜻이기 때문에 같을 경우 성공을 
// 다를 경우 실패를 출력해줍니다
  if (cnt == sizeOfCode)
  {
    printf("Success!");
  }else{
    printf("Fail!");
  }
  
  

  return 0;
}

위 코드가 맨 처음 풀었던 코드 입니다.

성공했을 경우
실패했을 경우

#include <stdio.h>

int main(){

  char loginCode[] = "hello123";
  char tryCode[256];
  char* ploginCode = loginCode,
      * ptryCode = tryCode;
  int cnt = 0, sizeOfCode = 0;

  sizeOfCode = sizeof(loginCode) - 1;

  gets(ptryCode);
  


  while (*ploginCode)
  {
    if(*ploginCode == *ptryCode){
      cnt++;
    }
    ploginCode++;
    ptryCode++;
  }
  

  if (cnt == sizeOfCode)
  {
    printf("Success!");
  }else{
    printf("Fail!");
  }
  
  

  return 0;
}

위 코드는 동일한 알고리즘으로 배열 대신 포인터를 적용하여 푼 것입니다.

배열을 *, 포인터에 저장시킨 후 값을 불러오는 * 간접 연산자를 통해 비교하고 포인터 변수(ploginCode, ptryCode) 에 ++ 연산을 통해 주소값을 옮겨 다시 값을 비교하는 걸 확인 할 수 있습니다.

 

다음은 해설에 나온 코드입니다.

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

int main()
{
	char pPassword[256] = "hello123", pInput[256];
    
    while(1)
    {
    	printf("암호: ");
        gets ( pInput );
        
        if ( strcmp(pPassword, pInput) == 0 )
        	break;
        printf( "결과 : 로그인 실패 \n");
        printf( "\n");
        
    }
    
    
    printf( "결과 : 로그인 성공 \n");
    
    return 0;

}

 

여기서 주목할 건 strcmp 함수 입니다. 이 함수는 매개 변수로 받은 두 개의 문자열을 비교합니다.

둘이 같으면 0을 반환하고 1번이 크면 양수, 작으면 음수를 반환합니다. 그래서 0을 반환하면 암호가 일치했다는 것이고 while문을 나가 로그인 성공이라는 문자열을 출력합니다. 그렇지 못하면 로그인 실패가 출력되며 암호를 맞추지 못하면 while 문 밖으로 나가지 못하게 됩니다.

 

...strcmp() 는 몰랐는데...  여러가지를 생각하다가 두 개의 변수를 선언해서 이를 비교해서 성공인지 실패인지를 확인하자고 생각했습니다.

해설을 보면서 while 문으로 암호를 입력하지 않으면 나가지 못하는 조건을 걸 수 있다는 것과 strcmp 함수에 대해서 알게 되었습니다.

댓글