다다의 개발일지 6v6

[백준] 2941번. 크로아티아 알파벳 ( 하.. 해결했다. ) + 정답 풀이 본문

Frontend/코딩테스트 (JS)

[백준] 2941번. 크로아티아 알파벳 ( 하.. 해결했다. ) + 정답 풀이

dev6v6 2025. 1. 23. 14:29

문제의 코드 (1차)

const fs = require("fs");
const word = fs.readFileSync(0, "utf-8").toString().trim();

const alpha = [];

for (const char of word) {
  if (alpha.length === 0) {
    alpha.push(char);
  } else {
    if (
      char === "=" && // "c=", "dz=", "s=", "z="을 하나의 문자로 취급
      (alpha.at(-1) === "c" ||
        alpha.at(-1) === "dz" ||
        alpha.at(-1) === "s" ||
        alpha.at(-1) === "z")
    ) {
      alpha.pop();
      alpha.push("=");
    } else if (char === "j" && (alpha.at(-1) === "l" || alpha.at(-1) === "n")) {
      alpha.pop();
      alpha.push("j"); // "lj", "nj"을 하나의 문자로 취급
    } else if (char === "-" && (alpha.at(-1) === "c" || alpha.at(-1) === "d")) {
      alpha.pop();
      alpha.push("-"); // "c-", "d-"을 하나의 문자로 취급
    } else if (char === "z" && alpha.at(-1) === "d") {
      alpha.pop();
      alpha.push("dz"); // "dz"를 하나의 문자로 취급 
    } else if ( char === "=" || char === "-") {
       continue; // 그 외의 "=", "-"는 알파벳이 아니므로 아무것도 안함. 
    } else alpha.push(char);
  }
}

console.log(alpha.length);

 

내 풀이는 왜 틀릴까... ㅜㅠㅠㅠ 가끔씩 보면서 반례 찾아봐야겠다. 

 

(2차) 으아ㅏㅏ

"dz=" 이거 때문에 "dz"를 한 문자로 처리 했는데 만약  "=" 가 나오지 않으면 'd', 'z'로 처리되지 않고 'dz'로 남아버린다.

if (char !== "=" && alpha.at(-1) === "dz") {
    alpha.push(char);
 }

 

-> ( 80퍼까지 성공했따...) 또 틀림 ...

-> dzdzdz같은 경우 마지막 dz는 그 뒤에 문자가 없기 때문에 분리를 못하고 남아버린다.. [dz, z, dz, z, dz]이렇게

-> 대공사 일거같아서 아예 dz를 한 문자로 처리하는 과정을 없앴다.

 

(3차) 드디어.. 성공 근데 꼭 맨 아래의 정답 풀이를 익히자.. 이렇게 풀지 말자 ㅠㅠㅠ

헷갈릴까봐 크로아티아 알파벳은 모두 "*" 라는 문자로 통일시켰다.

const fs = require("fs");
const word = fs.readFileSync("ex.txt", "utf-8").toString().trim();

const alpha = [];

for (const char of word) {
  if (char !== "=" && alpha.at(-1) === "dz") {
    alpha.push(char);
  }
  if (alpha.length === 0) {
    alpha.push(char);
  } else {
    if (char === "=") {
      if (alpha.at(-1) === "c" || alpha.at(-1) === "s") { // c, s만 그대로 남기고
        alpha.pop();
        alpha.push("*");
      } else if (alpha.at(-1) === "z") { // z,와 dz는 따로 처리해줌.
        if (alpha.at(-2) === "d") {
          alpha.pop();
          alpha.pop();
          alpha.push("*");
        } else {
          alpha.pop();
          alpha.push("*");
        }
      }
    } else if (char === "j" && (alpha.at(-1) === "l" || alpha.at(-1) === "n")) {
      alpha.pop();
      alpha.push("*"); // "lj", "nj"을 하나의 문자로 취급
    } else if (char === "-" && (alpha.at(-1) === "c" || alpha.at(-1) === "d")) {
      alpha.pop();
      alpha.push("*"); // "c-", "d-"을 하나의 문자로 취급
    } else if (char === "=" || char === "-") {
      continue; // 그 외의 "=", "-"는 알파벳이 아니므로 아무것도 안함.
    } else alpha.push(char);
  }
}

console.log(alpha.length);

 

 

다른 사람들 거 참고한 풀이!! 2가지 방법 (정답)

const fs = require("fs");
let word = fs.readFileSync(0, "utf-8").toString().trim();

const croatia = ["c=", "c-", "dz=", "d-", "lj", "nj", "s=", "z="];

for (const alpha of croatia){
  word = word.replaceAll(alpha,"*");
  // word = word.split(alpha).join("*"); 이렇게 푸는 것도 같은 방법
}

console.log(word.length);