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);
}