프라이D
프라이Develog(❁´◡`❁)
프라이D
전체 방문자
오늘
어제
  • ALL (378)
    • TDD, Cleancode with JavaScr.. (5)
    • 프로젝트 (32)
      • work (3)
      • 직접 만드는 기술 블로그 (2)
      • 데일리 옥션 (19)
      • 모락모락 (8)
    • Computer Science (1)
    • Algorithm & 자료구조 (94)
      • 알고리즘 w.JavaScript (53)
      • 자료구조 (5)
      • (인프런) 자바스크립트 알고리즘 문제풀이 (34)
    • JavaScript (45)
      • JavaScript (41)
      • 모던 자바스크립트 Deep Dive (4)
    • WEB (13)
    • 회고 (12)
    • TIL (109)
    • WIL (7)
    • Stacks (20)
      • React.js (6)
      • Next.js (1)
      • Redux (3)
      • Node.js (2)
      • GIT (2)
      • SAP (1)
    • 15일 메이킹 프로젝트 (15)
    • 이전 기록 (14)
    • ETC. (5)
    • ---------------2021 (6)
      • 내일배움단-웹개발 5주 (2)
      • 정보처리기사 (4)

블로그 메뉴

  • 홈
  • 태그
  • 미디어로그
  • 위치로그
  • 방명록

공지사항

인기 글

태그

  • nomadcoder
  • 자바스크립트비트마스크
  • 국비지원
  • 알고리즘
  • JavaScript
  • nomadcoders
  • 스파르타코딩클럽
  • MySQL
  • 2023 인프콘 후기
  • 코드스테이츠
  • Til
  • 내일배움단
  • 투포인터알고리즘
  • 비트마스크
  • vanilaJS
  • 자바스크립트알고리즘
  • 내일배움카드
  • 자바스크립트
  • 코딩프로젝트
  • 모던자바스크립트딥다이브

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
프라이D

프라이Develog(❁´◡`❁)

Algorithm & 자료구조/알고리즘 w.JavaScript

[알고리즘 JS] 숫자 짝꿍 (프로그래머스 Lv.1)

2023. 1. 2. 15:12

문제

https://school.programmers.co.kr/learn/courses/30/lessons/131128

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

  • 3자리 이상의 두 정수 X,Y 에서 공통적으로 등장하면서 짝지어지는 수들을 가지고 만들 수 있는 가장 큰 정수를 리턴

풀이(정답)

function solution(X, Y) {
  // 정답 문자열
  let answer = '';

  // 길이 10, 0으로 초기화된 두 배열
  const hashX = new Array(10).fill(0);
  const hashY = new Array(10).fill(0);

  // 원본 문자열로 인덱스에 접근하여 갯수 카운팅
  X.split('').forEach(item => hashX[item]++);
  Y.split('').forEach(item => hashY[item]++);

  // 배열 반복하며 겹치는 갯수만큼 answer 에 추가
  hashX.forEach((x, i) => {
    if (x && hashY[i]) {
      answer += String(i).repeat(Math.min(hashX[i], hashY[i]));
    }
  });

  // 공백이 아니면서 0으로만 이루어진 경우 0 리턴
  if (answer !== '' && +answer === 0) return '0';

  // 그 외에 정답 혹은 -1 리턴
  return answer.length ? [...answer].reverse().join('') : '-1';
}
  • 처음에는 조건을 숫자로 변환한 answer 문자열이 0인 경우에 (+answer === 0) '0'을 리턴하도록 했는데, 짝지어지는 숫자를 찾지 못해 answer가 공백인 경우 '-1' 을 리턴해야 하므로, 공백이 아니면서 0 인 경우 리턴하도록 조건을 수정해주었다.

풀이(오답)

function fail(X, Y) {
  // 정답이 들어갈 배열
  let answer = [];

  // X 와 Y 를 배열화한 뒤 내림차순 정렬
  const Xc = X.split('').sort((a, b) => b - a);
  const Yc = Y.split('').sort((a, b) => b - a);

  // 반복문을 돌면서 비교해주기 위해 길이가 더 긴 배열, 작은 배열로 나눔
  const larger = Xc.length > Yc.length ? Xc : Yc;
  const smaller = Xc.length <= Yc.length ? Xc : Yc;

  // 포인터 변수 선언
  let p1 = 0;
  let p2 = 0;

  // p1, p2 모두 배열을 끝까지 탐색하도록 반복문의 조건 설정
  while (p1 < smaller.length && p2 < larger.length) {
    // 같은 숫자가 나온 경우 포인터를 모두 이동한다.
    if (smaller[p1] === larger[p2]) {
      answer.push(smaller[p1]);
      p1++;
      p2++;
      continue;
    }
    // 서로 다른 숫자인 경우
    else {
      // p2를 우선해서 돌리고, 마지막에 다다른 경우 p1을 움직인다.
      if (p2 === larger.length - 1) p1++;
      else p2++;
    }
  }

  return answer;
}
  • 투포인터를 사용하여 배열을 탐색하고 같은 값을 찾으려고 했다.
  • 포인터로 두 배열을 비교하며 끝까지 이동시키는 것은 성공했는데, 마지막까지 값을 찾지 못했을 경우 이전으로 돌아가서 값을 찾지 않기 때문에 비교에 실패함.
  • 두 배열 혹은 문자열에서 순서 상관 없이 겹치는 값이 있는지 판단하려면 해시맵을 사용하는 것이 훨씬 더 간편하다. 연속된 경우를 찾는게 아니라면 반복을 위해 정렬도 해야되고, 값을 찾지 못하면 다시 돌아가야 하기 때문에...

참고 풀이

https://chamdom.blog/pg1-131128/

  • 해시맵 풀이에 대한 힌트를 얻었음.

 

저작자표시 (새창열림)

'Algorithm & 자료구조 > 알고리즘 w.JavaScript' 카테고리의 다른 글

[알고리즘 JS] 햄버거 만들기 (프로그래머스 Lv.1)  (3) 2023.01.16
[알고리즘 JS] 성격 유형 검사하기 (프로그래머스 Lv.1)  (0) 2023.01.15
[알고리즘 JS] 로또의 최고 순위와 최저 순위 (프로그래머스 Lv.1)  (0) 2022.11.16
[알고리즘 JS] 다트 게임 (프로그래머스 Lv.1)  (0) 2022.11.15
[알고리즘 JS] 쇠막대기 (Stack)  (0) 2022.09.24
    'Algorithm & 자료구조/알고리즘 w.JavaScript' 카테고리의 다른 글
    • [알고리즘 JS] 햄버거 만들기 (프로그래머스 Lv.1)
    • [알고리즘 JS] 성격 유형 검사하기 (프로그래머스 Lv.1)
    • [알고리즘 JS] 로또의 최고 순위와 최저 순위 (프로그래머스 Lv.1)
    • [알고리즘 JS] 다트 게임 (프로그래머스 Lv.1)
    프라이D
    프라이D
    틀린내용 정정 및 개선사항은 언제든지 댓글 달아주세요 :D

    티스토리툴바