TIL (2020. 05. 14)

Shin Yeongjae·2020년 5월 14일
1

TIL

목록 보기
1/21
post-thumbnail
post-custom-banner

1. 프로그래머스 같은 숫자는 싫어

문제 설명

배열 arr가 주어집니다. 배열 arr의 각 원소는 숫자 0부터 9까지로 이루어져 있습니다. 이때, 배열 arr에서 연속적으로 나타나는 숫자는 하나만 남기고 전부 제거하려고 합니다. 단, 제거된 후 남은 수들을 반환할 때는 배열 arr의 원소들의 순서를 유지해야 합니다. 예를 들면,

  • arr = [1, 1, 3, 3, 0, 1, 1] 이면 [1, 3, 0, 1] 을 return 합니다.
  • arr = [4, 4, 4, 3, 3] 이면 [4, 3] 을 return 합니다.

배열 arr에서 연속적으로 나타나는 숫자는 제거하고 남은 수들을 return 하는 solution 함수를 완성해 주세요.

제한사항

  • 배열 arr의 크기 : 1,000,000 이하의 자연수
  • 배열 arr의 원소의 크기 : 0보다 크거나 같고 9보다 작거나 같은 정수

입출력 예

arranswer
[1, 1, 3, 3, 0, 1, 1][1, 3, 0, 1]
[4, 4, 4, 3, 3][4, 3]

나의 풀이

function solution(arr) {
    var answer = [];
    for (let i = 0; i < arr.length; i++) {
        if (arr[i] !== arr[i + 1]) {
            answer.push(arr[i]);
        }
    }
    return answer;
}

for 문을 이용하여 배열의 i번째와 i + 1번째가 다르면 주어진 배열의 i번째 요소를 빈 배열에 추가하는 코드를 짰다.
처음에는 i번째와 i + 1번째가 같으면 추가하는 식으로 짰는데 겹치는 숫자가 3개 이상이거나 하나밖에 없을 경우 원하는 값을 얻지 못했다.
조금만 다르게 생각해보니 i번째와 i + 1번째가 다른 경우만 체크하면 결국 겹치는 숫자와 하나만 있는 숫자가 빈 배열에 추가되는것이다.


다른사람의 풀이

function solution(arr) {
    return arr.filter((val,index) => val !== arr[index+1]);
}

filter 메소드를 이용하여 주어진 배열을 순회하며 현재 요소와 그 다음 인덱스의 요소가 다른 것들만 뽑아냈다.
내가 짠 코드와 로직은 같은 것 처럼 보이는데 훨씬 간단하다.


2. 프로그래머스 문자열 내 p와 y의 개수

문제 설명

대문자와 소문자가 섞여있는 문자열 s가 주어집니다. s에 'p'의 개수와 'y'의 개수를 비교해 같으면 True, 다르면 False를 return 하는 solution를 완성하세요. 'p', 'y' 모두 하나도 없는 경우는 항상 True를 리턴합니다. 단, 개수를 비교할 때 대문자와 소문자는 구별하지 않습니다.

예를 들어 s가 'pPoooyY'면 true를 return하고 'Pyy'라면 false를 return합니다.

제한사항

  • 문자열 s의 길이 : 50 이하의 자연수
  • 문자열 s는 알파벳으로만 이루어져 있습니다.

입출력 예

sanswer
"pPoooyY"true
"Pyy"false

입출력 예 설명

  • 입출력 예 #1
    'p'의 개수 2개, 'y'의 개수 2개로 같으므로 true를 return 합니다.

  • 입출력 예 #2
    'p'의 개수 1개, 'y'의 개수 2개로 다르므로 false를 return 합니다.


나의 풀이

function solution(s){
    let str = s.toLowerCase();
    let count1 = 0;
    let count2 = 0;
    if (str.indexOf('p') === -1 && str.indexOf('y') === -1) {
        return true;
    }
    for (let i = 0; i < str.length; i++) {
        if (str[i].indexOf('p') === 0) {
            count1++;
        }
        if (str[i].indexOf('y') === 0) {
            count2++;
        }
    }
    if (count1 === count2) {
        return true;
    }
    return false;
}

주어진 문자열을 모두 소문자로 변환한 새 문자열을 만들고 count1과 count2라는 변수를 'p'와 'y'에 대응하기 위해 각각 만들었다.
indexOf 메소드는 찾는 문자가 없다면 -1을 리턴하는데 문자열에서 'p'와 'y'가 없는 경우 true를 리턴하라고 했기 때문에 먼저 조건을 설정해줬다. 그리고 문자열의 길이만큼 for 문을 돌려 문자열의 i번째가 'p'인 경우 count1을 1씩 증가 'y'인 경우 count2를 1씩 증가 시켜 count1과 count2를 비교하여 최종 결과를 얻어냈다. 테스트 케이스는 다 통과했지만 그렇게 효율적인 코드로 보이진 않는다.


다른사람의 풀이

function solution(s){
    return s.toUpperCase().split("P").length === s.toUpperCase().split("Y").length;
}

주어진 문자열을 모두 대문자로 변환 후 split 메소드를 이용하여 "P"만 있는 문자열과 "Y"만 있는 문자열을 만들어 둘의 length를 비교하는 코드이다. 결국 필요한건 boolean 값이었으니 매우 효율적이다. 어떻게 이런 생각을 했는지 정말 대단한 것 같다..

profile
문과생의 개발자 도전기
post-custom-banner

1개의 댓글