JavaScript/알고리즘

프로그래머스 수 조작하기1 JS ( for문, if문 / reduce() )

hihiha2 2023. 5. 31. 00:24
반응형

문제 설명

정수 n과 문자열 control이 주어집니다. control은 "w", "a", "s", "d"의 4개의 문자로 이루어져 있으며, control의 앞에서부터 순서대로 문자에 따라 n의 값을 바꿉니다.

  • "w" : n이 1 커집니다.
  • "s" : n이 1 작아집니다.
  • "d" : n이 10 커집니다.
  • "a" : n이 10 작아집니다.

위 규칙에 따라 n을 바꿨을 때 가장 마지막에 나오는 n의 값을 return 하는 solution 함수를 완성해 주세요.

 

 

 

 

✅ 내 코드

function solution(n, control) {
  for(i=0; i<control.length; i++) {
      const index = control[i]
      if(index === "w") {
          n += 1;
      }
      if(index === "s") {
          n -= 1;
      }
        if(index === "d") {
          n += 10;
      }
        if(index === "a") {
          n -= 10;
      }
  }
    return n
}

 

🙋‍♀️ 내 생각

먼저 control로 들어오는 값을 어떻게 하나하나 바꾸어줄까를 생각했다.

그래서 if문을 생각했다. 

if로 "w"면 n+1을, "s"면 n-1을 해주려고 하는데 문제는 "wsdawsdassw"과 같은 값들을 어떻게 하나하나 돌면서 바꿔줄까하는 점이었다.

if문은 금방 생각할 수 있었는데, 그 부분을 어떻게 해결할까에서 제일 고민했던 것 같다.

 

고민하게 되었던 이유는 내가 자바스크립트의 string에 대한 이해가 부족했기때문이다.

처음에는 인덱스를 이용하려면 control을 배열로 바꿔야한다고 생각했다. 그래서 문제를 풀면서 조금 헤맸다.

하지만 mdn공식문서를 통해서

1. string도 배열과 같은 방식으로 인덱스에 접근할 수 있다.

2. for문을 돌릴 수 있다.

는 점을 알게 되었다.

 

그래서 string인 control을 for문을 통해서 문자열의 길이만큼 돌면서

if문을 통해서 각각의 인덱스의 값을 n+1 이나 n-1과 같이 원하는 값으로 바꿔주는 작업을 하였다.

 

위에 내가 string에 대한 이해가 부족했던 것만 미리 알고 있었다면 풀기가 어려운 문제는 아닌것 같다.

 

💻 내가 사용한 메서드

for문:  어떤 특정한 조건이 거짓으로 판별될 때까지 반복

    for ([초기문]; [조건문]; [증감문])
      문장

 

if문: 지정한 조건이 인 경우 명령문(statement)을 실행

-  괄호 안의 표현식을 평가하고 그 결과를 불린값으로 변환

- ? 로 적을수도 있다

 

if와 '?'를 사용한 조건 처리

 

ko.javascript.info

 

 

💻 학습한것

string도 대해서 아래의 2가지를 새롭게 알게 되었다. 

1. string도 배열과 같은 방식으로 인덱스에 접근할 수 있다.

2. string도 for문을 돌릴 수 있다.

 

굳이 문자열을 배열로 바꾸지 않고도 내가 하고 싶은 처리들을 바로바로 할 수 있다는 것을 알게되었다.

 

 

💻  다른사람 코드중에 배울 것

const operations = {
  w: (n) => n + 1,
  s: (n) => n - 1,
  d: (n) => n + 10,
  a: (n) => n - 10,
};

function solution(n, control) {
  return [...control].reduce((acc, cur) => operations[cur](acc), n);
}

operations라는 객체를 만들고 그 값을 이용해서 reduce로 문제를 푼 코드가 기발해서 공부했다.

(acc, cur는 내가 임의적으로 이름을 바꾸었다)

 

먼저, 객체를 만들어서 각 값들에 n+1, n-1과 같은 값들을 넣었다.

그런 다음 [...]을 이용해서 string을 배열로 만들고 reduce를 사용하였다.

reduce를 더 간단한 방법으로만 써봤지, 저런식으로 객체의 키값을 cur로 사용해서는 한번도 안써봐서 이 부분을 이해하기 위해서 노력했다.

그 앞까지는 다 이해가 되었는데  operations[cur](acc) 이 부분이 정확히 어떻게 동작하는지를 이해하는데에 오래걸렸다.

초기값이 n으로 설정되어있기때문에 일단은 n으로 출발해서 현재값cur가 객체의 키값으로 들어가는데 이전까지 쌓인값인 acc가 인자가 되어 들어간다.

 

 

reduce라는 메서드를 처음 봤던 순간이 기억난다.

엄청 어렵게 느껴졌었는데, 지금은 간단한 합이나 곱같은 식은 이제 reduce을 이용해서 쉽게 만들수있다.

이 코드에서 이해하기 어려웠던 부분은 operations[cur](acc)이 부분이다.

아마 코드를 이렇게 써본 경험이 부족해서 일것이다. 이제 알았으니 다음번에는 나도 더 빠르게 잘 이용할 수 있을거라고 믿는다.!!

뭐든 처음에는 어려운거니까 🤓

반응형