JavaScript/알고리즘

프로그래머스 세로읽기 JS ( 가로 m글자씩, 세로 c번째 적힌값찾기 )

hihiha2 2023. 6. 21. 17:09
반응형

문제 설명

문자열 my_string과 두 정수 mc가 주어집니다. my_string을 한 줄에 m 글자씩 가로로 적었을 때 왼쪽부터 세로로 c번째 열에 적힌 글자들을 문자열로 return 하는 solution 함수를 작성해 주세요.

 

 

🙋‍♀️ 내 생각

가로로 m글자씩 적고, 세로의 c번째값들만 추출해서 하나의 문자열을 만드는 것이 목표이다.

 

위의 첫번째예시를 기준으로 예를 들어서 이해한 것을 정리하면,

4글자씩 가로로 적고 2열의 값들만 추출한다. (결과값: "happy")

규칙을 찾아보면, 인덱스는 m만큼씩 차이가 난다

(h와 a의 인덱스는 m만큼 차이난다. a와 p도, p와 p도, p와 y도 m만큼의 차이이다.)

 

인덱스가 일정하게 증가하는 규칙을 이용해서 풀어보았다.

 

 

✅ 내 코드

function solution(my_string, m, c) {
    let result =''
  
    for(i=c-1; i<my_string.length; i += m){
    result += my_string[i]
    }
    
    return result
}

문자열을 더한 결과값을 얻을 변수를 result라고 지어주고 ''빈문자열로 string타입으로 초기값을 설정한다.

(문자열을 더한 값을 최종적으로 얻을 것이기때문에)

 

그런다음, for문을 이용해서 i의 범위를 지정한다.

c는 1,2,3..이런식으로 열을 지정하지만 인덱스는 0부터 시작한다.

c=1 이면 실제인덱스=0

c=2 이면 실제인덱스=1

c=3 이면 실제인덱스=2...

➡️ c는 (실제인덱스-1)인것을 알 수 있다.

 

그래서 초기값 i를 i = c-1로 설정한다.

(위의 예제1를 기준으로 예를 들면 c=2이므로 2열에 있는 값만을 추출할 의도이기때문에 i=1로, 1번째 인덱스에 있는 값들만을 추출할 수 있다.)

 

그 다음으로 추출해야 할 값은 위에 적은 규칙과 같이 인덱스의 차이가 m만큼씩이다.

따라서 for문을 한번 돌때마다 m씩을 더한다. i +=m 

 

for문 안에서는 +=복합할당연산자를 이용하여 result에 my_string의 i번째 인덱스에 있는 값들만을 추출해서 축적시킨다.

 

이렇게하면 초기값인 c-1인덱스에서 시작하여 인덱스값이 m만큼차이나는 값들만을 for문을 돌면서 result에 축적시킬 수 있다.

 

 

 

 

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

function solution(my_string, m, c) {
    var answer = '';

    for(let i = 0; i < my_string.length; i += m) {
        answer += my_string[i + c - 1]
    }
    return answer;
}

전반적인 방법은 같지만 i의 범위를 지정하는 방식이 달라서 공부해보았다.

 

나는 i의 초기값을 c-1로 설정한것과 달리,

이 코드는 초기값을 0으로 지정하였다.

대신, expression에서 my_string[i]가 아니라 my_string[i + c -1]의 값을 더한다.

i +=m으로 m만큼씩 커지면서 for문을 도는것은 동일하다.

 

 

위의 예제1를 예로 이해하면,

i=0일때 (0 + 2 - 1)=1  

i=4일때 (4 + 2 -1 ) =5

i=8일때 (8 + 2 -1 )=9

(m은 4씩 커지므로)

 

인덱스로 적어보면

0 1 2 3 

4 5 6 7 

8 9 10 11

이다. 여기서 1, 5, 9의 열은 2로 고정되어있다.

m을 일정하게 커지게 하면서 (4씩 커지게 -> 0,4,8...) 

 

 

 

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

function solution(my_string, m, c) {
    return [...my_string].filter((_, i) => i % m === c - 1).join('');
}

나머지를 이용해서 푼 코드도 있었다. 

우선, [...my_string]을 이용해서 문자열을 배열로 만든다. (filter를 이용하기 위해서)

그런 다음 filter의 인덱스를 통해서 원하는 인덱스를 가지고 있는 값들만 남긴다.

 

m으로 나눈 나머지가 c-1인 것들만 남기고, 마지막으로 배열을 문자열로 다시 바꾸기 위해서 join('')을 해준다.

 

나머지를 이용해서 풀 생각은 못했는데 이 방법도 간단하고 좋은것같다.

가로의 길이는 어차피 m으로 정해져있으므로, 그 길이를 벗어나는만큼이 열의 값이 될 것이다. 

 

 

 

 

반응형