3. 코딩테스트..? (Mission 2)

자료를 저장 할 수 있고, 조건문으로 제어 할 수 있고, 반복할 수 있다면..

코딩테스트 풀어보기

♚♚코딩 테스트♚♚풀어내면$$전원 취업할지도?☜☜100%할수있음※ ♜함수 안배워도 가능♜객체 같은거 몰루¥ 아무튼 가능한 부분 §§풀어내면§§★코딩천재★진짜? 내가?@@@ 즉시이동

가 아니라.. 우리가 배운 것들을 활용해보는 관점에서 진행하는 과제입니다.

사실 코딩테스트 문제를 풀기 위해서는 더 알아야 할 것들이 많습니다. 자료구조와 알고리즘도 알아야 하고, 구현 관련해서 문자열 관련 메서드들이나, 유용하게 사용 할 수 있는 기타 함수들을 잘 알고 있어야 구현을 할 수 있습니다. 하지만 이러한 모든 "지식"들은 앞으로 배워 나갈 시간이 매우 충분합니다. 오늘은 그러한 "지식"들에 의존하지 않고도 스스로 구현 가능하다는 것을 배워보는 시간이 됐으면 좋겠습니다.

사실 프로그래밍 문법에서 가장 중요한 것 두가지를 꼽으라고 하면, 조건문과 반복문 일 것이고, 한가지를 꼽으라고 하면 반복문일 것 입니다. 프로그래밍을 하는 본질적인 이유는 컴퓨터에게 "일"을 시키는 것 이고, 그 "일"은 사람이 할 수 없는 대단한 일이 아닌, 단순 반복 작업 입니다. 그래서 조금 과장을 섞으면, 조건문과 반복문만 알면 기본적으로 모든 프로그램을 만들 수 있다고들 이야기 합니다. 이러한 관점에서 오늘 문제를 접근하겠습니다.

1. 준비하기

01. 기본

위 링크를 들어가보시면 아시겠지만, 들어가보면 뭔가 읽기 싫은 글과, 우측에 위의 그림과 같이 solution이라고 이름지어진 함수가 보이실 겁니다. 물론 우리가 함수를 제대로 다시 공부하지는 않았지만, 일반적으로 여러분이 잠깐 잠깐 배운 바로도 solution이라는 함수이며, sizes라는 것을 파라미터로 받는다는 것 정도는 알고 계실겁니다. 가장 대표적으로 파이썬에서의 함수와 비슷하게 생겼죠.

코딩테스트를 진행하면 보통 다음과 같이 이름이 정해진 solution 함수와, sizes와 같이 해당 함수의 파라미터로 전달하는 input, answer와 같이 원하는 output을 명시해둡니다. 우리는 그 해당하는 함수의 중간을 구현하면 됩니다.

02. 문제 읽기!

우리가 풀어야 할 문제는 다음과 같이 생겼네요.

명함 지갑을 만드는 회사에서 지갑의 크기를 정하려고 합니다. 다양한 모양과 크기의 명함들을 모두 수납할 수 있으면서, 작아서 들고 다니기 편한 지갑을 만들어야 합니다. 이러한 요건을 만족하는 지갑을 만들기 위해 디자인팀은 모든 명함의 가로 길이와 세로 길이를 조사했습니다.

아래 표는 4가지 명함의 가로 길이와 세로 길이를 나타냅니다.

가장 긴 가로 길이와 세로 길이가 각각 80, 70이기 때문에 80(가로) x 70(세로) 크기의 지갑을 만들면 모든 명함들을 수납할 수 있습니다. 하지만 2번 명함을 가로로 눕혀 수납한다면 80(가로) x 50(세로) 크기의 지갑으로 모든 명함들을 수납할 수 있습니다. 이때의 지갑 크기는 4000(=80 x 50)입니다.

모든 명함의 가로 길이와 세로 길이를 나타내는 2차원 배열 sizes가 매개변수로 주어집니다. 모든 명함을 수납할 수 있는 가장 작은 지갑을 만들 때, 지갑의 크기를 return 하도록 solution 함수를 완성해주세요.

제한사항

  • sizes의 길이는 1 이상 10,000 이하입니다.

    • sizes의 원소는 [w, h] 형식입니다.

    • w는 명함의 가로 길이를 나타냅니다.

    • h는 명함의 세로 길이를 나타냅니다.

    • w와 h는 1 이상 1,000 이하인 자연수입니다.

입출력 예

🤔 : 천천히 문제를 읽어보세요, 그리고 이해가 가지 않는다면, 입출력 예를 보면 훨씬 수월할 때가 많습니다. 배열이 들어있는 배열을 받는데 그건 가로,세로 길이를 나타내고, 그 배열은 위에 solution함수의 parameter로 들어갑니다. 그리고 우리가 만들어낼 지갑의 가로 세로 길이를 곱해서 answer에 넣어주면 된다고 합니다. 그럼 우리는 저 배열을 받아서 리턴해줄 가로길이와 세로길이만 구하면 되겠네요! 이 이야기가 이해가 가지 않는다면 조금 더 천천히 읽어봐주세요! 어떻게 풀지는 제가 아래에서 설명해드릴 예정이니, 이 단락의 내용만 이해해주시면 될 것 같습니다.

03. 이 문제를 풀기 위해서 필요한 두가지 아이디어!

1) 우리는 가로 세로 회전에 연연할 필요가 전혀 없습니다.

요구사항에서는 모든 명함이 다 들어가야한다, 명함을 '회전'해야 한다 와 같은 내용으로 우리를 현혹시키고 있지만, 우리는 데이터를 조금 더 들여다보면 전혀 그렇게 귀찮은 짓을 하지 않아도 된다는 것을 알 수 있습니다.

두 변 길이가 하나의 배열로 들어오는데, 정사각형이 아니므로 그 두 변은 분명히 작은 변, 긴 변으로 나눌 수 있을겁니다. 그 두 변 길이중 작은 변 중에 가장 긴 변, 그리고 긴 변중에 가장 긴변을 구해주면 되겠죠?

2) 최대값, 또는 최소값을 구하는 방법

보통 코딩테스트에는 일정한 테크닉들이 있습니다. 이런 것들은 많이 풀어가면서 다른 사람의 풀이를 보거나 배워가면 자연스럽게 체득이 됩니다. 하지만 지금 당장 아주 잠시동안의 여러분들은 이러한 것들을 알지 못하실 거에요. 그래서 이 아이디어도 알려드리겠습니다.

// 보통은 다음과 같이 최대값과 최소값을 변수로 선언해두고 내가 아는 최대값을 최소값 변수에,
// 내가 아는 최소값을 최대값 변수에 할당해 둡니다. 아래는 양의 정수로 예시를 들게요!

var max = 0;
var min = 9999999999999;

// 그다음에 반복문을 이용합니다.

for (뭐가, 뭐인동안, 뭐하면서) {
    // 그 다음에 각각 최대값 또는 최소값이랑 비교를 합니다.
    if (만약 지금돌고있는애가 max 보다 크다면) {
        max = 지금 돌고있는애 
        // 내가 아는 최소값을 넣어놨으니 처음 도는애는 무조건 위 조건문을 통과해서 새로운 max가 되고,
        // 이후의 돌고있는애들과 비교당하면서 필요하면 갱신될겁니다!
    }
}

// 최소값을 구하려면 if문만 수정하면 되겠죠?

2. 실제로 풀어보기

기본적으로 아래와 같은 흐름으로 풀어가시면 됩니다. 물론 더 편하게 할 수 있는 방법이 있겠지만, 지금은 일단 for 문과 if문만 사용하도록 합니다!

아래와 같은 흐름으로 풀어보면 됩니다.
function solution(sizes) {
    var biggerSideMax = 0;
    var smallerSideMax = 0;
    
    for(sizes를 돌면서) {
        if (만약 sizes의 원소(배열)가 앞에 원소가 크다면) {
            앞에 원소가 긴 변이니 ___와 비교하고, 최대값이면 할당합니다.
            ...
        } else {
            위와 반대로 하면 되겠죠?
            ...
        }
    }
    
    위의 반복문을 다 돌면 우리가 변수로 선언했던 것들에 긴변중에 긴변이,
    짧은 변중에 가장 긴 변이 들어있겠네요 곱해서 리턴해줍시다!
    return biggerSideMax * smallerSideMax;
}

Last updated