[CodingTest] Algospot - Anagram 문제


내가 작성한 답안

function solution(v) {
  const inputs = v.split("\n"), 
        inputsLength = inputs.length;
  let answer = "";

  for(let i=1;i<inputsLength;i++) {
    let elements = inputs[i].split(" ");
    if(elements[0] == elements[1]) answer += "No.\n";
    else {
      answer += elements[0].split("").sort().reduce(reducer) == elements[1].split("").sort().reduce((accumulator, currentValue) => accumulator + currentValue) ? "YES\n" : "No.\n";
    }
  }
  return answer
}

더 좋은 방식 찾기 - O(NlogN) 보다 낮은방법

Baekjoon 문제 - Anagram Generater

내가 작성한 답안

function solution(v) {
  const inputs = v.split("\n"), 
        inputsLength = inputs.length;
  let answers = "";
  
  for(let i=1;i<inputsLength;i++) { // 여러줄의 단어들 반복
    const strings = inputs[i].split(""),
          stringsLength = strings.length;
    let stringsStats = {}

    for(let j=0;j<stringsLength;j++) { // {a: 2, b:1, c: 1}
      if(stringsStats[strings[j]]) stringsStats[strings[j]] += 1
      else stringsStats[strings[j]] = 1
    }

    let initArray = []
    for(s in stringsStats) {  // [a,b,c]
      if(stringsStats[s] > 0) initArray.push(s)
      else continue;
    }
    
    let answer = "";
    console.log("initArray : ", initArray)
    console.log("stringsStats : ", stringsStats)
    console.log("reduceStrings : ", reduceStrings(initArray, stringsStats, answer))
  }
  // return answer
}

function reduceStrings(strings, stringsStats, answer) {
  let stringArray = [...strings],
      stats = {...stringsStats};

  stringArray.forEach((sa)=> {
    newStringArray = []; 
    answer += sa;
    stats[sa] -= 1;
    
    for(s in stats) {
      if(stats[s] > 0) newStringArray.push(s);
    }
    console.log("sa : ", sa)
    console.log("stringArray : ", stringArray)
    console.log("stats : ", stats)
    console.log("newStringArray : ", newStringArray)
    console.log("answer : ", answer)
    console.log("=========")
    if(newStringArray.length > 0) reduceStrings(newStringArray, stats, answer);
    else (answer += "\n");
  })
}

느낀점

처음 anagram 문제를 접한것은 같이 js를 공부하던 친구가 회사면접에서 받은 질문에서 시작되었다.
막상 나도 “그때 나였더라면 제대로 풀 수 있었을까?” 라는 생각에 접하게되었다.
아마 Youtube에 올라온 구글 면접 예시 영상의 분위기 였을것 같다. 링크

그다음 비슷한 문제가 어디있지 하며 찾은게 Algospot의 문제와 Backjoon 사이트의 문제였다.

Algospot의 문제는 생각했을때 비교적 간단했다. 두 문자열이 주어지고 같은지 비교만 하면 되었다.
하지만 Backjoon 사이트의 아나그램 문제를 풀어보며 “내가 js를 잘 이해하고 있는건가?” 라는 생각이 들었다.

Backjoon 사이트의 아나그램 문제는 하나의 문자열을 주고 그것에 해당하는 아나그램을 산출하라는 문제였다.
제한 조건은

  • 알파벳 순서대로 나열할것
  • 대소문자 구분할것
  • 입력받은 철자들 중 중복되는 철자들이 있을경우, 중복해서 출력할 수 있으나 하나만 출력하라. ex) google -> ggoole이 하나만 출력

문자열 풀이방식

  1. 받은 문자열을 array로 쪼개어 sorting하여 abc순으로 구성한다.
  2. for문 재귀함수로 구성하여 n!로 문제를 해결

이라고 생각했다. 하지만 이럴경우 중복되는 문자들이 있을때 적절하게 문제를 해결하지 못했다.
가령 [a,a,b,c]가 있을떄 첫번째 문자가 b가 나올경우 [a,a,c]가 남는다는 것이다.
a는 1개로 취급되어야하는데 2개로 취급된다는 것이다.

내가 삽질을 하며 얻은 해결방법은

  1. [a,a,b,c] 의 문자열을 루프를 돌때마다 하나씩 꺼내들고
  2. {a:2, b:1, c:1}같은 형식의 객체로 루프를 돌때마다 문자열의 개수를 카운팅하고
  3. 카운팅한 객체들 중 0이 아닌 문자들을 배열에 담고[a,b,c]
  4. 1번을 다시 반복하며 배열에 문자가 하나도 없을때까지 반복한다. 는 것이었다.

하지만 이 루프를 돌며 반복하는 코드에서 스코프 문제가 발생했다.





2023

Flutter 맛보기 1

3 분 소요

직방 기술지원팀 기술공유 세미나 중 플러터를 소개한 내용입니다

Back to Top ↑

2022

Back to Top ↑

2019

[Tutorial] Storybook과 Bit을 활용한 UI 컴포넌트 관리(Workflow)

1 분 소요

회사에서 프론트엔드 개발원칙을 SFC(Single File Component)에서 UI 컴포넌트를 기준으로 CDD(Component Driven Development)를 진행하려고 한다. 그래서 체계적으로 관리하기위해 Storybook과 Bit을 도입해보고자 한다. 각각의 역할은 ...

[Workflow] 프론트엔드 개발조직을 위한 워크플로 설계

2 분 소요

작성 배경 회사의 작업구조를 페이지 중심 개발에서 UI 컴포넌트 중심 개발로 변경하면서 Workflow를 개선할만한 환경을 구성해야했다. 폐쇄망 기반에서 개발자간 UI 명세서 역할을 할 수 있는 Storybook과 그것을 공유할 Verdaccio라는 구축형 NPM Pri...

[ESlint & Prettier] 개발 관습 설정 in Visual Studio

1 분 소요

회사 프로젝트를 작업하기 전 프론트엔드 개발자들 간의 코드 규칙을 Eslint와 Prettier 설정을 맞춰 관리해가는 방향을 정했다. 아직 협업을 할 경우는 없지만 미래에 인수인계 받거나 협업을 진행할 경우 코드관습이 달라 고생할 경우를 대비하기로 했다. 설정은 작업을 진행하며 ...

[CodingTest] 2019-10-26 SQL문제

최대 1 분 소요

공부겸 코딩테스트 사이트에서 토요일 오전 10시에 백엔드 포지션 테스트를 해준다기에 참여해봤다. SQL문제가 나왔는데 더 좋은 답이 있는것 같아 나중에 기록해두고 수정해보기로 한다.

[CodingTest] 피보나치 수열

1 분 소요

문제 : 피보나치 수열 제 1항부터 입력한 자연수(N)까지의 피보나치 수열 항들의 합을 구하여라.

[Syntax] 새로 알게된 파이썬 문법 정리

최대 1 분 소요

chaning comparison 파이썬은 chaning comparison이라는 신기한 문법이 있다. 참고 if a < b and b < c : (...) 라는 구문이 if a < b < c : (...) 으로 연산된다. 직관적인 문법이 인상적. ...

[DataType] Map & Set

최대 1 분 소요

Set vs Array - 관련기사 Set 유일값들의 배열이 필요할때(distinct) 집합의 개념이 필요할때(차집합, 교집합 등등 자체 메서드들이 많음.) index가 필요 없을때 Array에서 중복값을 없앨때 => ...

Back to Top ↑

2018

SGIS-shpToGeojson

1 분 소요

SGIS에서 받은 지도데이터(.shp)를 geojson으로 변경하는 작업 내용

Back to Top ↑