ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 프로그래머스 JS I 1단계 : 이상한 문자 만들기, 시저 암호
    문제풀이 2023. 1. 9. 18:33

     

    프로그래머스 1단계 진입~

    한 지는 꽤 됐는데 부끄럽게도 일이 많아서 미루고 미뤄버렸다....하핫.

    오늘부터 하루에 한 문제라도 꼭! 꼬박꼬박 풀겠다는 마음가짐을 다시 한 번 (ㅎ)되새기며 기록을 남긴다.

     

    저번에는 신박한 풀이가 보이면 남겨놓는 식으로 포스팅 했었는데, 

    물론 그것도 좋지만 내가 어떻게 틀렸는지 (ㅎㅎ...) 그리고 어떻게! 고쳤는 지를 남기는 게 더 좋을 것 같아서 방향을 바꿔보기로 했다.

     

     


     

     

     

    프로그래머스 1단계 문제

    이상한 문자 만들기

     

    s 라고 하는 공백이 포함된 문자열이 있다.

    각 단어의 짝수번째 알파벳 > 대문자

    각 단어의 홀수번째 알파벳 > 소문자

    로 바꾼 문자열을 return 하는 함수를 작성해야 하는 문제.

     

    첫 풀이(당연히 실패) 👇

    return s.split("").map((a, i) => (i+1) % 2 !== 0 ? a.toUpperCase() : a.toLowerCase()).join("");

    굉장히 1차원적으로 (^___^;) 생각해서 틀린 답변.

     

    주어진 테스트 케이스만 봤을 때 공백이 포함되어 있더라도 신기하게 index 번호가 맞아서(?) 이렇게 대강 풀어도 답이 맞다고 나온다.

    하지만

     

    (당연히)처참한 실패 ^👅^)/;;; 

    단어가 바뀌거나 공백이 하나만 더 추가되어도 오답이 되어버리는 풀이.

    처음에 내가 왜 이렇게 풀었을까? 를 생각해보니 "단어"를 기준으로 생각했어야 하는데 일단 쪼개고 보자라고 접근했기 때문이었다.

     

    그럼 어떻게 풀어야 할까?

    1. 모든 공백을 없애는 건 어떨까. 공백을 없애고 단어만 남기자! > 안됨. 결국 원래 있던 공백도 기억하고 있어야 하기 때문에. 아예 삭제 되어서는 안된다.

    2. 맨 앞/맨 뒤 공백을 기억하고, 단어와 단어 사이는 공백으로 이어야 한다 !!!  > split 메서드, join 메서드 이용

    3. 단어로 나눈다 > 나누어진 단어를 하나씩 돌아가며 살펴본다 > 나누어진 단어를 쪼개쪼개 변형하고 변형한 단어를 담는다 > 새로운 문자열로 만들 배열에 넣는다 (join쓰기 위해...) > 변형한 단어가 담겼던 변수를 초기화 하고 반복, 반복 반복 ... > 마지막은 배열에 담긴 문자열들을 공백으로 잇는다.

     

    완성한 풀이 👇

    성공 !!

     

    처음에는 새로운 문자열이 담길 answer 을 배열이 아니라 문자열 ""로 설정해둬서 또 틀렸었지만 (ㅎㅎ..)

    split과 join을 좀 더 잘 이해하게 되면서 고쳐, 고쳐 .. 고쳐~.. 완성했다.

     

    수확 👇

    1. split(" ")을 사용했을 때 단어와 단어 사이가 아닌, 맨 앞/맨 뒤에 있는 공백은 쪼개지면서 사라지는 게 아니라 빈 문자열로 남는다. ex) " hi my name is burger " > ["", "hi", "my", "name", "is", "burger", ""] 

    그래서 오히려 앞 뒤 공백을 어떻게 없애느냐 라는 문제도 있다 ... 분명 풀었던 거 같기도 해서 더 충격 ... 복습을 철저히 하자!! 그리고 기록을 남기자 기록을.

    2. join은 Array 메서드. (하하하.)

     

     

     


     

     

     

    프로그래머스 1단계 문제

    시저 암호

     

    쉽네!! 하다가 

    이상하게 계속 틀렸던 문제...

    근데 또 엄청 이상하게 풀어버려서 허망한(사실은 짜증남) 문제다.

     

    s에 담긴 문자열을 알파벳 순서로 n만큼 밀었을 때 어떻게 변하는 지 알아내는 문제.

    예를 들어 a 를 1만큼 밀면 알파벳 순서로 봤을 때 b가 된다.

     

    나의 풀이 👇

    조건을 먼저 생각해봤다.

    1. 공백을 그대로 가져가야 한다 (없애면 안됨)

    2. s에 담긴 문자열 즉 알파벳 순서(index)에서 n만큼 더한 수가 새로운 index가 된다.

    2-2. 대신 25를 넘어가면 index 0으로 돌아가 시작한다고 본다.

    3. s에 담긴 알파벳이 대문자라면 그대로 대문자로, 소문자라면 그대로 소문자로 출력해야 한다.

     

     

    코드를 실행했을 때 맞았다!

    오랜만에 나름 깔끔하게(?) 정리 잘 해서(?) 푼 것 같아 ... 하면서 만족하고 있을 때..

    제출하려고 했더니 ... 엥?

     

     

    런.. 런타임 에러요?

    지금까지 실패< 면 실패지 런타임 에러가 한 번도 뜬 적이 없어서 당황스러웠다.

    처음에는 그저 ... 내 코드가 너무 많이 돌아서 ㅠㅠ(ㅋ..) 그런 줄로만 알았다.

    코드를 더 간략하게 적어야 하는건가? 같은 생각으로 열심히 수정을 해봤다 ... 

     

     

    별 달라진 게 없지만 (ㅠㅠㅋㅋ)

    answer을 배열이 아니라 문자열로 바꾸고 join 메서드를 굳이 사용하지 않게 바꿨다.

    그리고 대문자/소문자 판별도 정규식으로 변경했다 ...

    하나도 소용이 없었다... 좌절할 쯤 문제와 조건을 다시 한 번 찬찬히 정독했다.

     

    그리고 찾아냈다.

    25를 넘어갈 경우 블라블라.. 가 보이는가.

    num >= 25 일 때 num - 26 을 한다.

    왜냐면 알파벳 length를 넘어가면 0으로 돌아가기 위해서다.

     

    알파벳 문자열의 length 는 26.

    ....

    25일 때 26을 빼면 -1로 index가 0이 아니라 -1라는 이상한... 맞지 않는 틀린!! 모양새가 된다.

    ..

    ......

    num > 25 로 변경했고

    이왕 하는 김에 대소문자 판별을 삼항 연산자로 변경했다.

     

     

    아름다운 통과의 파란빛... 그래서 기쁘면서 허망하면서 짜증이 났다. 

    다음부터는 더 꼼꼼히 읽어볼 것 !!! 몇 분을 여기에 허비한 건지.... 흑흑.. ㅠㅠ

    그리고 런타임에러를 그저 내 코드가 간략하지 못하고, 너무 시간을 많이 잡아먹는구나 같이 1차원적으로!!1 생각하지 말자.

     

     

    수확 👇

    1. 문제, 조건을 꼼꼼히 읽을 것. 

    2. 런타임 에러는 언제 발생할까 ? 💭 참고링크

     

     

     

    댓글

Designed by Tistory.