ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [백준]1132 : 합(javascript)
    JavaScript 2022. 7. 25. 21:55
    728x90

    https://www.acmicpc.net/problem/1132

     

    1132번: 합

    N개의 수가 주어진다. 이 숫자는 모두 자연수이고, 알파벳 A부터 J가 자리수를 대신해서 쓰여 있다. 이 알파벳은 모두 한 자리를 의미한다. 그리고, 각 자리수는 정확하게 알파벳 하나이다. 0으로

    www.acmicpc.net

    문제

     

    N개의 수가 주어진다. 이 숫자는 모두 자연수이고, 알파벳 A부터 J가 자리수를 대신해서 쓰여 있다. 이 알파벳은 모두 한 자리를 의미한다. 그리고, 각 자리수는 정확하게 알파벳 하나이다. 0으로 시작하는 수는 없다. 이때, 가능한 수의 합 중 최댓값을 구해보자.

    입력

    첫째 줄에 N이 주어진다. N은 50보다 작거나 같은 자연수이다. 둘째 줄부터 N개의 줄에는 각 수가 주어진다. 수의 길이는 최대 12이다. 적어도 한 알파벳은 수의 가장 처음에 주어지지 않는다.

    출력

    첫째 줄에 합의 최댓값을 출력한다.

    예제 입력 1 

    2
    ABC
    BCA

    예제 출력 1 

    1875

    풀이

    1. 입력 받기

    객체로 이루어진 input 배열을 만들고자 했습니다.

    if (!N) {
          N = parseInt(line);
          return;
        }
        let len = line.length;
        line.split('').forEach((c, idx) => {
          const obj = input.find(({ key }) => key === c);
          const value = Math.pow(10, len - idx - 1);
          if (!obj) {
            input.push({ key: c, value });
          } else {
            obj.value += value;
          }
    
          if (idx == 0) {
            isFront[c] = true;
          }
        });

    ABC가 입력으로 들어오면 input에 A를 key값으로 하는게 있는지 찾습니다.

    없다면 key : A, value : Math.pow(10, len-idx-1) = 100  을 넣어줍니다. 즉,

    input = [{key : 'A', value: 100}, {key:'B', value: 10},{key:'C', value:1}]이 되는데 여기서 그다음

    BCA가 들어오면 이미 obj가 있기때문에(find에서 찾아줌) 더해주게 됩니다.

    최종 input = [{key : 'A', value: 101}, {key:'B', value: 110},{key:'C', value:11}]이 됩니다.

     

    그리고 추가로 isFront에 index가 0인 문자를 체크해뒀습니다.(추후에 0을 배치하기 위해서)

     

    2. 내림차순 정렬

    input.sort((a, b) => b.value - a.value);

    3. 문자가 열개인가 = 0을 배치해야하나

    for (let i = 9; i >= 0; i--) {
          const key = input[i].key;
          if (!isFront[key]) {
            map.set(key, 0);
            break;
          }
        }

    내림차순으로 정렬했기때문에 가장 끝 수가 가장 작은 수 입니다.

    isFront가 아니면서 가장 작은 수에 0을 setting해줍니다.

     

    4. 나머지 숫자 배치 및 합 구하기

    let num = 9;
      input.forEach(({ key }) => {
        if (!map.has(key)) {
          map.set(key, num--);
        }
      });
      let sum = 0;
      input.forEach(({ key, value }) => {
        sum += value * map.get(key);
      });

     

    전체 코드

    let N;
    const input = [];
    const isFront = [];
    
    const solution = () => {
      const map = new Map();
      input.sort((a, b) => b.value - a.value);
    
      if (input.length === 10) {
        // 0 배치하기
        for (let i = 9; i >= 0; i--) {
          const key = input[i].key;
          if (!isFront[key]) {
            map.set(key, 0);
            break;
          }
        }
      }
      let num = 9;
      input.forEach(({ key }) => {
        if (!map.has(key)) {
          map.set(key, num--);
        }
      });
      let sum = 0;
      input.forEach(({ key, value }) => {
        sum += value * map.get(key);
      });
      console.log(sum);
    };
    
    require('readline')
      .createInterface(process.stdin, process.stdout)
      .on('line', line => {
        if (!N) {
          N = parseInt(line);
          return;
        }
        let len = line.length;
        line.split('').forEach((c, idx) => {
          const obj = input.find(({ key }) => key === c);
          const value = Math.pow(10, len - idx - 1);
          if (!obj) {
            input.push({ key: c, value });
          } else {
            obj.value += value;
          }
    
          if (idx == 0) {
            isFront[c] = true;
          }
        });
      })
      .on('close', () => {
        solution();
        process.exit();
      });
    728x90

    댓글

Designed by Tistory.