PS/프로그래머스

둘만의 암호

MQTT 2023. 8. 25. 22:19

문제출처:

https://school.programmers.co.kr/learn/courses/30/lessons/155652

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

 

문제 설명: 주어진 값은 s와 skip, index 이다. s는 문자열이지만 index만큼 각 문자를 1씩 올려서 나온 answer 문자열을 출력하는 문제이다. 단, skip에 있는 단어들이 s에 있다면 skip에 해당 s에서 1씩 올린 문자가 없을 때까지 반복한다. 이때 index의 순환갯수는 올라가지 않는다. 

 

로직:

1. checked 배열에 skip 문자들을 인덱스로 설정, 값을 1로 설정한다. 목적은 s를 index만큼 1씩 증가하면서 skip에 나오는 문자가 있는지 여부를 O(1)로 검사하려는 목적이다.

2. index만큼 s의 각 문자를 증가시키는데 해당 문자가 checked의 인덱스로 값이 1이면 해당 문자를 1나 씩 추가한다. checked 인덱스의 값이 0이 아닐 때까지 반복한다. 단, 'z'를 벗어나면 'a'-1에서 벗어낫값의 offset값을 추가하여 'a'로 시작하게 만든다.

3. index값 까지 +1로 올라간 알파벳을 answer에 추가해준다. 

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

int checked[28];
// 파라미터로 주어지는 문자열은 const로 주어집니다. 변경하려면 문자열을 복사해서 사용하세요.
char* solution(const char* s, const char* skip, int index) {
  // return 값은 malloc 등 동적 할당을 사용해주세요. 할당 길이는 상황에 맞게 변경해주세요.
  char* answer = (char*)malloc(strlen(s));
  for (int x = 0; x <= strlen(s); ++x) {  // + 1 한 이유는 answer 마지막에 널값추가.
    *(answer+x) = NULL;
  }
  for (int x = 0; x < strlen(skip); ++x) {
    checked[skip[x]-'a'] = 1; // skip인덱스 알파벳 값들을 checked의 인덱스로 설정 및 값을 1로 설정. 탐색 시 O(1) 목적 
  }
  char tmp = NULL;
  for (int y = 0; y < strlen(s); ++y) {
    tmp = s[y];
    for (int x = 1; x <= index; ++x) {
      tmp += + 1;  //index만큼 알파벳 1씩 증가.
      if (tmp > 'z') { // z를 넘을 경우
        tmp = tmp - 'z' + 'a' - 1;  // a로 시작.
      }
      while (checked[tmp - 'a']) { // skip의 알파벳에 tmp 단어가 있는지 체크, 있으면 while문 안에서 tmp를 +1 씩. 
        tmp += 1;  
        if (tmp > 'z') { // tmp가 z를 벗어나면 a부터 offset값 줌.
          tmp = tmp - 'z' + 'a' - 1;
        }
      }
    }
    *(answer + y) += tmp; // index 추가 과정이 끝나면 answer에 tmp 저장.
  }
  return answer;
}

int main(void) {
  solution("y", "baz", 1);
}