본문 바로가기

카테고리 없음

Study_240522 ( 알고리즘 )

// 문자열에서 가장 많이 등장한 문자 찾기
// 문제 정의:
// 주어진 문자열에서 가장 많이 등장하는 문자를 반환하라. 만약 여러 개라면 그 중 아무거나 반환하라.

// 조건:

// 대소문자를 구분한다.
// 공백도 하나의 문자로 간주한다.
// 예시:

// 입력: "banana"
// 출력: 'a' (혹은 'n')

function mostFrequentChar(s) {
  // 문자와 갯수를 키:값 으로 저장하기위해 빈 객체 선언
  const count = {};

  // 가장 큰 값을 저장 할 숫자형 변수 선언
  let maxCount = 0;

  // 가장 큰 값의 키를 저장 할 문자형 변수 선언
  let mostChar = "";

  // 입력 받은 문자열의 문자를 활용하기위해 순회
  for (let i = 0; i < s.length; i++) {
    // 전달 받은 문자열을 순회하면서 객체 프로퍼티 확인
    if (count[s[i]]) {
      // 같은 아스키코드일 경우 키 값 증가
      count[s[i]]++;
    } else {
      // 처음 등장한 아스키코드일 경우 객체에 저장 후 프로퍼티에 값 1 할당
      count[s[i]] = 1;
    }

    // 객체 속성 값 중 최대값 탐색 -> 최대값의 키 값 할당
    if (count[s[i]] >= maxCount) {
      maxCount = count[s[i]];
      mostChar = s[i];
    }
  }

  return mostChar;
}

// 테스트 코드
function testMostFrequentChar() {
  const testCases = [
    { input: "banana", expected: ["a", "n"] },
    { input: "apple", expected: ["p"] },
    { input: "mississippi", expected: ["i", "s"] },
    { input: "aabbcc", expected: ["a", "b", "c"] },
  ];

  testCases.forEach(({ input, expected }, index) => {
    try {
      const result = mostFrequentChar(input);
      if (!expected.includes(result))
        throw new Error(`Expected one of ${expected}, but got ${result}`);
      console.log(`Test ${index + 1}: Passed`);
    } catch (error) {
      console.log(`Test ${index + 1}: Failed - ${error.message}`);
    }
  });
}

// 테스트 함수 호출 : 터미널에 node practice2-1.js 실행
testMostFrequentChar();

 

// 두 문자열의 교집합 문자 집합 구하기
// 문제 정의:
// 두 문자열이 주어졌을 때, 두 문자열에 모두 등장하는 문자를 집합으로 반환하라.

// 조건:

// 대소문자를 구분하지 않는다.
// 결과는 집합(Set) 형태로 반환한다.
// 예시:

// 입력: "apple", "pineapple"
// 출력: new Set(['p', 'l', 'e'])

function commonCharacters(Character1, Character2) {
  // 결과를 집합 형태로 반환하기 위한 빈 배열 선언
  const arr = [];

  // 전달 받은 문자열의 대소문자를 구분하지 않기위해 소문자로 통일
  const lowerCharacter1 = Character1.toLowerCase();
  const lowerCharacter2 = Character2.toLowerCase();

  // 매개변수끼리 비교하기 위해 매개변수 중 아무거나 하나를 순회
  for (let i = 0; i < Character1.length; i++) {
    // 순회하면서 다른 매개변수에 같은 값이 있다면 빈 배열에 추가
    if (lowerCharacter2.includes(lowerCharacter1[i])) {
      arr.push(lowerCharacter1[i]);
    }
  }

  // 결과 배열 내 중복된 값을 지우기 위해 JS 내장 객체 Set 사용
  // 객체를 생성하기 위해 생성자 함수 new Set() 생성
  return new Set(arr);
}

// 테스트 코드
function testCommonCharacters() {
  const testCases = [
    { input: ["apple", "pineapple"], expected: new Set(["a", "p", "l", "e"]) },
    { input: ["hello", "world"], expected: new Set(["o", "l"]) },
    { input: ["abc", "def"], expected: new Set() },
    {
      input: ["abcdef", "fedcba"],
      expected: new Set(["a", "b", "c", "d", "e", "f"]),
    },
  ];

  testCases.forEach(({ input, expected }, index) => {
    try {
      const result = new Set(commonCharacters(input[0], input[1]));
      const isEqual =
        expected.size === result.size &&
        [...expected].every((value) => result.has(value));
      if (!isEqual)
        throw new Error(`Expected ${[...expected]}, but got ${[...result]}`);
      console.log(`Test ${index + 1}: Passed`);
    } catch (error) {
      console.log(`Test ${index + 1}: Failed - ${error.message}`);
    }
  });
}

// 테스트 함수 호출 터미널에 node practice2-2.js 실행
testCommonCharacters();