Winnie The Pooh Bear 코딩테스트 입문

코딩테스트

코딩테스트 입문

코딩은 처음이라 2023. 6. 12. 00:06

“ 지연되는 프로젝트에 인력을 더 투입하면 오히려 더 늦어진다. ”

- Frederick Philips Brooks
Mythical Man-Month 저자
728x90
반응형

프로그래머스 스쿨 (programmers.co.kr)

 

 

코딩테스트 입문

 

 

 

 

다항식 더하기

문제 설명

한 개 이상의 항의 합으로 이루어진 식을 다항식이라고 합니다. 다항식을 계산할 때는 동류항끼리 계산해 정리합니다. 덧셈으로 이루어진 다항식 polynomial이 매개변수로 주어질 때, 동류항끼리 더한 결괏값을 문자열로 return 하도록 solution 함수를 완성해보세요. 같은 식이라면 가장 짧은 수식을 return 합니다.

제한사항

제한사항

  • 0 < polynomial에 있는 수 < 100
  • polynomial에 변수는 'x'만 존재합니다.
  • polynomial은 양의 정수, 공백, ‘x’, ‘+'로 이루어져 있습니다.
  • 항과 연산기호 사이에는 항상 공백이 존재합니다.
  • 공백은 연속되지 않으며 시작이나 끝에는 공백이 없습니다.
  • 하나의 항에서 변수가 숫자 앞에 오는 경우는 없습니다.
  • " + 3xx + + x7 + "와 같은 잘못된 입력은 주어지지 않습니다.
  • 0으로 시작하는 수는 없습니다.
  • 문자와 숫자 사이의 곱하기는 생략합니다.
  • polynomial에는 일차 항과 상수항만 존재합니다.
  • 계수 1은 생략합니다.
  • 결괏값에 상수항은 마지막에 둡니다.
  • 0 < polynomial의 길이 < 50

입출력예

polynomial result
"3x + 7 + x" "4x + 7"
"x + x + x"  "3x"

입출력예설명

  • "3x + 7 + x"에서 동류항끼리 더하면 "4x + 7"입니다.
  • "x + x + x"에서 동류항끼리 더하면 "3x"입니다.

출력

function solution(polynomial) {
  // 다항식을 각 항으로 분리
  var terms = polynomial.split(' + ');

  // 동류항을 더하기 위한 객체
  var termMap = {};

  // 각 항을 처리하여 동류항끼리 더함
  for (var i = 0; i < terms.length; i++) {
    var term = terms[i];
    var coefficient = 1;
    var variableIndex = term.indexOf('x');

    // 변수 'x'가 있는 경우
    if (variableIndex !== -1) {
      // 계수 추출
      if (variableIndex !== 0) {
        coefficient = parseInt(term.substring(0, variableIndex));
      }
      // 동류항 더하기
      if (termMap[1]) {
        termMap[1] += coefficient;
      } else {
        termMap[1] = coefficient;
      }
    } else {
      // 상수항인 경우
      if (termMap[0]) {
        termMap[0] += parseInt(term);
      } else {
        termMap[0] = parseInt(term);
      }
    }
  }

  // 결과 다항식 생성
  var result = '';
  var keys = Object.keys(termMap);

  // 계수를 기준으로 내림차순 정렬
  keys.sort(function (a, b) {
    return b - a;
  });

  // 결과 다항식 생성
  for (var i = 0; i < keys.length; i++) {
    var coefficient = termMap[keys[i]];

    if (coefficient !== 0) {
      // 상수항인 경우
      if (keys[i] === '0') {
        result += coefficient;
      } else {
        // 상수항이 아닌 경우
        if (coefficient !== 1) {
          result += coefficient;
        }
        result += 'x';
      }

      // 다음 항이 있는 경우
      if (i < keys.length - 1) {
        result += ' + ';
      }
    }
  }

  return result;
}

주어진 다항식을 항으로 분리합니다. '+'를 기준으로 다항식을 나눠 각각의 항을 배열로 저장합니다.

항을 처리하면서 동류항끼리 더합니다. 변수 'x'가 있는 항인 경우 계수를 추출하여 동류항을 더하고, 상수항인 경우에는 따로 처리합니다. 동류항을 더하기 위해 객체를 사용합니다.

동류항을 더한 결과를 바탕으로 결과 다항식을 생성합니다. 계수를 기준으로 내림차순으로 정렬한 후, 계수와 변수 'x'를 조합하여 결과 다항식을 생성합니다.

결과 다항식을 반환합니다.

 

 

삼각형의 완성조건

문제 설명

선분 세 개로 삼각형을 만들기 위해서는 다음과 같은 조건을 만족해야 합니다.

  • 가장 긴 변의 길이는 다른 두 변의 길이의 합보다 작아야 합니다.

삼각형의 두 변의 길이가 담긴 배열 sides이 매개변수로 주어집니다. 나머지 한 변이 될 수 있는 정수의 개수를 return하도록 solution 함수를 완성해주세요.

제한사항

  • sides의 원소는 자연수입니다.
  • sides의 길이는 2입니다.
  • 1 ≤ sides의 원소 ≤ 1,000

입출력예

sides result
[1, 2] 1
[3, 6] 5
[11, 7] 13

입출력예설명

  • 두 변이 1, 2 인 경우 삼각형을 완성시키려면 나머지 한 변이 2여야 합니다. 따라서 1을 return합니다.
  • 가장 긴 변이 6인 경우
    • 될 수 있는 나머지 한 변은 4, 5, 6 로 3개입니다.
  • 나머지 한 변이 가장 긴 변인 경우
    • 될 수 있는 한 변은 7, 8 로 2개입니다.
  • 따라서 3 + 2 = 5를 return합니다.
  • 가장 긴 변이 11인 경우
    • 될 수 있는 나머지 한 변은 5, 6, 7, 8, 9, 10, 11 로 7개입니다.
  • 나머지 한 변이 가장 긴 변인 경우
    • 될 수 있는 한 변은 12, 13, 14, 15, 16, 17 로 6개입니다.
  • 따라서 7 + 6 = 13을 return합니다.

출력

function solution(sides) {
    return Math.min(...sides)*2-1
}

주어진 배열 sides에서 가장 작은 값(Math.min(...sides))을 찾아내고, 그 값을 2배한 뒤 1을 뺀 결과를 반환하고 있습니다. 이렇게 계산하면 가장 작은 변의 길이로 나머지 한 변을 구할 수 있습니다.

 

 

종이자르기

문제 설명

머쓱이는 큰 종이를 1 x 1 크기로 자르려고 합니다. 예를 들어 2 x 2 크기의 종이를 1 x 1 크기로 자르려면 최소 가위질 세 번이 필요합니다.정수 M, N이 매개변수로 주어질 때, M x N 크기의 종이를 최소로 가위질 해야하는 횟수를 return 하도록 solution 함수를 완성해보세요.

제한사항

  • 0 < M, N < 100
  • 종이를 겹쳐서 자를 수 없습니다.

입출력예

M N result
2 2 3
2 5 9
1 1 0

입출력예설명

  • 가로 2 세로 5인 종이는 가로로 1번 세로로 8번 총 가위질 9번이 필요합니다.
  • 이미 1 * 1 크기이므로 0을 return 합니다.

출력

function solution(M, N) {
    var answer = 0;

    if (M > 1 && N > 1) {
        answer = (M - 1) * N + (N - 1);
    } else if (M > 1) {
        answer = M - 1;
    } else if (N > 1) {
        answer = N - 1;
    }

    return answer;
}

위 코드에서는 먼저 M과 N의 값이 1보다 큰지 확인합니다. 만약 둘 다 1보다 크다면, 가로로 자르는 횟수는 (M - 1)번이며 세로로 자르는 횟수는 (N - 1)번입니다. 하지만 맨 마지막에 가로로 마지막 한 번 더 자르는 작업이 필요합니다. 따라서 가로로 자르는 횟수는 (M - 1) * N이 됩니다. 그리고 세로로 자르는 횟수는 (N - 1)번입니다. 이 두 값을 더하여 answer에 할당합니다.

만약 M이 1보다 크고 N이 1보다 작거나 같다면, 가로로 자르는 횟수는 M - 1이므로 answer에 M - 1을 할당합니다.

반대로, M이 1보다 작거나 같고 N이 1보다 크다면, 세로로 자르는 횟수는 N - 1이므로 answer에 N - 1을 할당합니다.

마지막으로 answer를 반환합니다.

 

 

로그인성공?

문제 설명

머쓱이는 프로그래머스에 로그인하려고 합니다. 머쓱이가 입력한 아이디와 패스워드가 담긴 배열 id_pw와 회원들의 정보가 담긴 2차원 배열 db가 주어질 때, 다음과 같이 로그인 성공, 실패에 따른 메시지를 return하도록 solution 함수를 완성해주세요.

  • 아이디와 비밀번호가 모두 일치하는 회원정보가 있으면 "login"을 return합니다.
  • 로그인이 실패했을 때 아이디가 일치하는 회원이 없다면 “fail”를, 아이디는 일치하지만 비밀번호가 일치하는 회원이 없다면 “wrong pw”를 return 합니다.

제한사항

  • 회원들의 아이디는 문자열입니다.
  • 회원들의 아이디는 알파벳 소문자와 숫자로만 이루어져 있습니다.
  • 회원들의 패스워드는 숫자로 구성된 문자열입니다.
  • 회원들의 비밀번호는 같을 수 있지만 아이디는 같을 수 없습니다.
  • id_pw의 길이는 2입니다.
  • id_pw와 db의 원소는 [아이디, 패스워드] 형태입니다.
  • 1 ≤ 아이디의 길이 ≤ 15
  • 1 ≤ 비밀번호의 길이 ≤ 6
  • 1 ≤ db의 길이 ≤ 10
  • db의 원소의 길이는 2입니다.

입출력예

id_pw db result
["meosseugi", "1234"] [["rardss", "123"], ["yyoom", "1234"], ["meosseugi", "1234"]] "login"
["programmer01", "15789"] [["programmer02", "111111"], ["programmer00", "134"], ["programmer01", "1145"]] "wrong pw"
["rabbit04", "98761"] [["jaja11", "98761"], ["krong0313", "29440"], ["rabbit00", "111333"]] "fail"

입출력예설명

  • db에 같은 정보의 계정이 있으므로 "login"을 return합니다.
  • db에 아이디는 같지만 패스워드가 다른 계정이 있으므로 "wrong pw"를 return합니다.
  • db에 아이디가 맞는 계정이 없으므로 "fail"을 return합니다.

출력

function solution(id_pw, db) {
    var id = id_pw[0];
    var pw = id_pw[1];

    var login = false;
    var wrongPw = false;

    for (var i = 0; i < db.length; i++) {
        if (db[i][0] === id) {
            if (db[i][1] === pw) {
                login = true;
            } else {
                wrongPw = true;
            }
        }
    }

    if (login) {
        return "login";
    } else if (wrongPw) {
        return "wrong pw";
    } else {
        return "fail";
    }
}

먼저, 주어진 아이디와 패스워드를 변수로 할당합니다. 그리고 로그인 성공 여부와 비밀번호 오류 여부를 판단하기 위해 login과 wrongPw라는 불리언 변수를 선언합니다.

이후, 회원 정보를 담고 있는 2차원 배열을 반복하면서 아이디를 비교합니다. 만약 아이디가 일치한다면 해당 회원의 패스워드와 입력한 패스워드를 비교합니다.

패스워드가 일치하면 login 변수를 true로 설정합니다.
패스워드가 일치하지 않으면 wrongPw 변수를 true로 설정합니다.
마지막으로, login 변수가 true라면 "login"을 반환합니다. wrongPw 변수가 true라면 "wrong pw"를 반환합니다. 둘 다 false라면 "fail"을 반환합니다.

반응형