카카오 코딩테스트

심심해서 해본 2017 카카오 신입공채 1차 코딩 스트

제한시간 5시간으로 잡고 카페에서 생각날때마다 풀이를 해봤다.

결과는 처참….. 4번 문제에서 접근을 잘못해서 시간낭비를 어마어마하게 함 ㅜㅜㅜㅜㅜ

1번 비밀 지도(난이도: 하) 정답률 : 81.78%

function exam1(len, arr1, arr2){
	var i=0;
	var arr = [];

  function validCheck(num){
    var maxValue = Math.pow(2, len)-1;
    var minValue = 0;
    if(num > maxValue || num < minValue)
      throw "범위 초과";
  }

  function getBinary(num){
    var binary = num.toString(2);
    return binary.padStart(len, 0);
  }

  function lPad(str){
    return str.replace(/0/g, ' ').replace(/1/g, '#');
  }

  for(i;i<len;i++){
    var val1 = arr1[i], val2 = arr2[i];
    validCheck(val1);
    validCheck(val2);
  	var result = getBinary(val1 | val2);
		arr.push(lPad(result));
  }
	return arr;
}

exam1(5, [9, 20, 28, 18, 11], [30, 1, 21, 17, 28]);
exam1(6, [46, 33, 33 ,22, 31, 50], [27 ,56, 19, 14, 14, 10]);


2번 다트 게임(난이도: 하) 정답률 : 73.47%

// 정규식 테스트사이트 참고
function exam2(str){
  var state = 0;
  var regx = /\d+[SDT]([*#]?)+/g;
  var scoreRegx = /\d+/;
  var zoneRegx = /[SDT]/;
  var scores = [];

  function scoreCalc(score, zone, option){
    var currentScore = Math.pow(parseInt(score), {'S':1, 'D':2, 'T':3}[zone]);
    if(option === '*'){
      if(scores[state-1]){
        scores[state-1] *= 2;
      }
      scores[state] = currentScore*2;

    } else if(option === '#'){
      scores[state] = -currentScore;
    } else {
      scores[state] = currentScore;
    }
  }

  function sum(){
    var value = 0;
    scores.forEach(function(obj){
      value += obj;
    });
    return value;
  }

  var val;
  while((val = regx.exec(str)) !== null){
    val = val[0];
    var score = scoreRegx.exec(val)[0];
    var zone = zoneRegx.exec(val)[0];
    var option = val.replace(score+zone, '');
    scoreCalc(score, zone, option);
    state++;
  }
  console.log(str, sum());
}

exam2('1S2D*3T');
exam2('1D2S#10S');
exam2('1D2S0T');
exam2('1S*2T*3S');
exam2('1D#2S*3S');
exam2('1T2D3D#');
exam2('1D2S3T*');


3번 캐시(난이도: 하) 정답률 : 45.26%
다 풀어 놓고 저장 안한걸 1주일 후에 알았던 문제

function exam3(cacheSize, cities){
  var HIT = 1, MISS = 5;
  var cost = 0;
  var cacheList = [];

  function putCache(name){
    if(cacheList.length >= cacheSize)
      cacheList.splice(0,1);
    cacheList.push(name);
  }

  function getCache(name){
    var point = -1;
    var cache;
    cacheList.forEach(function(data, idx){
      if(name === data){
        point = idx;
      }
    });
    if(point !== -1){
      cost += HIT;
      cacheList.push(cache = cacheList.splice(point,1)[0]);
    }else{
			putCache(name);
      cost += MISS;
    }
    return cache;
  }

  cities.forEach(function(city){
		var _city = city.toLowerCase();
    var data = getCache(_city);
  });
  console.log('소요시간',  cost);
  return cost;

}

exam3(3, ["Jeju", "Pangyo", "Seoul", "NewYork", "LA", "Jeju", "Pangyo", "Seoul", "NewYork", "LA"]);
exam3(3, ["Jeju", "Pangyo", "Seoul", "Jeju", "Pangyo", "Seoul", "Jeju", "Pangyo", "Seoul"]);
exam3(2, ["Jeju", "Pangyo", "Seoul", "NewYork", "LA", "SanFrancisco", "Seoul", "Rome", "Paris", "Jeju", "NewYork", "Rome"]);
exam3(5, 	["Jeju", "Pangyo", "Seoul", "NewYork", "LA", "SanFrancisco", "Seoul", "Rome", "Paris", "Jeju", "NewYork", "Rome"]);
exam3(2, ["Jeju", "Pangyo", "NewYork", "newyork"]);
exam3(0, 	["Jeju", "Pangyo", "Seoul", "NewYork", "LA"]);


4번 셔틀버스(난이도: 중) 정답률 : 26.79%

/**
입력 형식
셔틀 운행 횟수 n, 셔틀 운행 간격 t, 한 셔틀에 탈 수 있는 최대 크루 수 m, 크루가 대기열에 도착하는 시각을 모은 배열 timetable이 입력으로 주어진다.

0 < n ≦ 10
0 < t ≦ 60
0 < m ≦ 45
timetable은 최소 길이 1이고 최대 길이 2000인 배열로, 하루 동안 크루가 대기열에 도착하는 시각이 HH:MM 형식으로 이루어져 있다.
크루의 도착 시각 HH:MM은 00:01에서 23:59 사이이다.
**/

function exam4(n, t, m, timetable){
	var CON;
	var busStartTime; // 버스운행시간

	timetable.sort(); // 타임테이블 정렬

	function initBustTime(){
		if(busStartTime === undefined){
			busStartTime = new Date(0);
			busStartTime.setHours(9);
			busStartTime.setMinutes(0);
		} else{
			busStartTime.setMinutes(busStartTime.getMinutes()+t);
		}
	}

	function initTime(str){
		var time = new Date(0);
		var split = str.split(':');
		time.setHours(split[0]);
		time.setMinutes(split[1]);
		return time;
	}

	var lastTime; // 마지막 탑승시각
	var isFull; // 만석여부
	var driveCnt = 0; // 운행횟수
	while(driveCnt++ < n){
		var cnt = 0; // 탑승인원
		isFull = false;
		initBustTime(); // 버스운행시간 초기화
		var i=0; len = timetable.length, clone = Array.from(timetable);
		for(;i<len;i++){
			var waitter = initTime(clone[i]);
			if(waitter <= busStartTime && cnt < m){
				if(++cnt === m){
					isFull = true;
					lastTime = waitter;
					break;
				}
			}
		}
		timetable.splice(0, cnt);
	}
	if(isFull){
		lastTime.setMinutes(lastTime.getMinutes()-1);
		CON = lastTime
	}else{
		CON = busStartTime;
	}

	CON = CON.getHours().toString().padStart(2,0) + ':' + CON.getMinutes().toString().padStart(2,0);
	console.log(CON);
	return CON;
}

exam4(1, 1, 5, ["08:00", "08:01", "08:02", "08:03"]);
exam4(2, 10, 2, ["09:10", "09:09", "08:00"]);
exam4(2, 1, 2, ["09:00", "09:00", "09:00", "09:00"]);
exam4(1, 1, 5, ["00:01", "00:01", "00:01", "00:01", "00:01"]);
exam4(1, 1, 1, ["23:59"]);
exam4(10, 60, 45, ["23:59","23:59", "23:59", "23:59", "23:59", "23:59", "23:59", "23:59", "23:59", "23:59", "23:59", "23:59", "23:59", "23:59", "23:59", "23:59"]);


5번 뉴스 클러스터링(난이도: 중) 정답률 : 41.84%

/**
 * 자카드 유사도 = 교집합/합집합
 * 두집합 모드 공집합일경우 유사도를 따로 1로 정의
 * 입력값은 영문자로 된 글자 쌍만 유효
 * 기타 공백이나 숫자, 특수문자가 들어가 있는경우  그 글자 쌍을 버린다.
 */
function exam5(str1, str2){
	var setA;
	var setB;
	var union;
	var intersection = 0;
	var regx = /[a-zA-Z][a-zA-Z]/;


	function createSet(s){
		var arr = [];
		var len = s.length;
		for(var i = 0; i < len-1; i++){
			var str = s.substring(i, i+2);
			if(regx.test(str))
				arr.push(str.toLowerCase());
		}
		return arr;
	}

	setA = createSet(str1);
	setB = createSet(str2);

	var unionSet = [];
	var overGroup = {};
	setA.forEach(function(ele){
		unionSet.push(ele);
		if(overGroup[ele] === undefined)
			overGroup[ele] = 1;
		else
			overGroup[ele]++;
	});

	var interSectionSet = [];
	setB.forEach(function(ele){
		var cnt = 0;
		if(overGroup[ele] === undefined){
			unionSet.push(ele);
		}else{
			if(overGroup[ele] > 0){
				overGroup[ele]--;
				interSectionSet.push(ele);
			}else{
				unionSet.push(overGroup[ele]);
			}
		}
	});

	union = unionSet.length;
	intersection = interSectionSet.length

	var result
	if(union === 0)
		result = 1;
	else
 		result = Math.floor((intersection / union) * 65536);
	console.log('union is ', union, 'intersection is ', intersection, 'result is ', result);

	return result;
}

exam5('FRANCE', 'french');
exam5('handshake', 'shake hands');
exam5('aa1+aa2', 'AAAA12');
exam5('E=M*C^2', 'e=m*c^2');


포스팅 하고보니….. 들여쓰기 무엇..?

태그:

Back to Top ↑

댓글남기기