Illie

2023.10.22 알고리즘 본문

자료구조|알고리즘

2023.10.22 알고리즘

(*ᴗ͈ˬᴗ͈)ꕤ*.゚ 2023. 10. 22. 01:07

1. 둘만의 암호

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

 

프로그래머스

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

programmers.co.kr

접근방식

알파벳 나열에 대해 고민하였다

charCodeAt을 사용하면 아스키 코드로 접근가능한데, 스킵가능한 문자를 다루기가 까다로웠다

다른 방법을 생각하다가 도저히 생각이 안나서,

알파벳을 직접 나열한 후, 필터를 했다

 

풀이 방식

더보기
function solution(s, skip, index) {
  const sortedAlphabets = [...alphabets].filter(
    (alphabet) => !skip.includes(alphabet)
  );

  return [...s]
    .map((char) => {
      return sortedAlphabets[
        (sortedAlphabets.indexOf(char) + index) % sortedAlphabets.length
      ];
    })
    .join("");
}

 

2. 신고 결과 받기

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

 

프로그래머스

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

programmers.co.kr

풀이 방식

더보기
function solution(id_list, report, k) {
  const totalObj = getReportUsers(report, k);

  return id_list.map((el) => {
    if (!totalObj.reporterUser[el]) return 0;

    return totalObj.reporterUser[el].reduce((acc, cum) => {
      if (totalObj.blockedUsers.includes(cum)) {
        return ++acc;
      }
      return acc;
    }, 0);
  });
}

const getReportUsers = (report, k) => {
  return report.reduce(
    (acc, cum) => {
      const [reporter, reportedUser] = cum.split(" ");

      // 1. reporterUser 객체 정리
      // 1-1. 신고한 유저 기록이 없으면 추가
      if (!acc.reporterUser[reporter]) {
        acc.reporterUser[reporter] = [reportedUser];
      }
      // 1-2. 신고한 유저 기록 안에 신고한 사람의 내역이 없으면 추가
      else if (!acc.reporterUser[reporter].includes(reportedUser)) {
        acc.reporterUser[reporter].push(reportedUser);
      }
      // 1-3. 이미 신고한 경우 중복된 신고는 1회로 간주하므로 넘어감
      else {
        return acc;
      }

      // 2. reportedUser 객체 정리
      // 2-1. 유저가 이미 신고를 많이 받아서 블락처리 되어있다면 그냥 넘어 감
      if (acc.blockedUsers.includes(reportedUser)) return acc;

      // 2-2. 이미 신고당한 유저라면 신고 횟수를 늘려줌
      if (acc.reportedUser[reportedUser]) {
        acc.reportedUser[reportedUser] = acc.reportedUser[reportedUser] + 1;
      } else {
        acc.reportedUser[reportedUser] = +1;
      }

      if (acc.reportedUser[reportedUser] >= k) {
        acc.blockedUsers.push(reportedUser);
      }
      return acc;
    },
    { reporterUser: {}, reportedUser: {}, blockedUsers: [] }
  );
};

3. 대충 만든 자판

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

 

프로그래머스

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

programmers.co.kr

풀이 방식

더보기

 

function solution(keymap, targets) {
  const customKeyMap = setCustomKeyMap(keymap);

  return targets.map((target) => {
    return target.split("").reduce((acc, cur) => {
      console.log(acc, cur);
      if (acc === -1) {
        return -1;
      }
      if (customKeyMap[cur]) {
        return acc + customKeyMap[cur];
      } else {
        return -1;
      }
    }, 0);
  });
}

function setCustomKeyMap(keyType) {
  let customKeyMap = {};
  keyType.map((targetWord) => {
    targetWord.split("").map((targetLetter, targetLetterIndex) => {
      if (!customKeyMap[targetLetter]) {
        customKeyMap[targetLetter] = targetLetterIndex + 1;
        return;
      }
      if (customKeyMap[targetLetter] > targetLetterIndex) {
        customKeyMap[targetLetter] = targetLetterIndex + 1;
      }
    });
  });
  return customKeyMap;
}

 

Comments