[여친돈여친산] 다가올 여름을 위한 휴대용 손풍기 "프롬비 리틀스톰"

headerimg

더워질 여름에 들고 다닐 손풍기!

이제 곧 더워질 여름을 위해 여친님이 선물 해준 작은 손풍기다. 다른 무거운 녀석들이나 소리가 너무 큰 녀석들과 다르게 아주 작고 꽤 쌘 바람을 가지고 있다. 넓게 퍼지지는 않으나 지하철이나 걸어 다닐때 만큼은 적절할 것 같다.

IMG

여친이 민트, 내가 핑크



IMG

따꿍 열리는게 청소할 수 있어서 정말 맘에 든다.



IMG IMG

스위치랑 여러 물건이랑 크기 비교



IMG

바닥에 고무가 은근 튼튼하고 진동을 막아준다.



장점

  1. 99g. 매우 가벼움! 매일 매일 가방에 들어있어도 부담 스럽지 않아요.
  2. 분리형 안정망! 청소가 쉽다!
  3. 작다. 아주!
  4. 작은 편에 비해서 괜찮은 바람.
  5. 민트와 핑크는 파스텔톤으로 아주 깔끔하고 이쁘다.

단점

  1. 스트랩 색상이랑 본체 색이 달라서 깔맞춤이 안된다. 으.. 킹받아
  2. 자연풍, 1단, 2단, 3단 순으로 강도를 조절하는데
    자연풍은 1단과 멈춤이 번갈아 반복된다.
    아마 오랫동안 쓸 수 있다고 할라고 만든 모드 같음.
  3. 충전은 5핀이다.

[코딩테스트/JS] 내적

headerimg

내적

문제 설명

길이가 같은 두 1차원 정수 배열 a, b가 매개변수로 주어집니다. a와 b의 내적을 return 하도록 solution 함수를 완성해주세요.

이때, a와 b의 내적은 a[0]*b[0] + a[1]*b[1] + ... + a[n-1]*b[n-1] 입니다. (n은 a, b의 길이)

제한사항

  • a, b의 길이는 1 이상 1,000 이하입니다.
  • a, b의 모든 수는 -1,000 이상 1,000 이하입니다.

입출력 예

abresult
[1,2,3,4][-3,-1,0,2]3
[-1,0,1][1,0,-1]-2

입출력 예 설명

예제 #1

  • a와 b의 내적은 1*(-3) + 2*(-1) + 3*0 + 4*2 = 3 입니다.

예제 #2

  • a와 b의 내적은 (-1)*1 + 0*0 + 1*(-1) = -2 입니다.

내 솔루션

  • reduce로 합쳐버린다.
  • acccurb[idx]를 곱한 값을 넣어준다.
function solution(a, b) {
	return a.reduce((acc, cur, idx) => acc += cur * b[idx], 0)
}

감상평

  • 내적이 뭔지 알 필요 없다. 멘탈 잡고 쭉 읽어보자.
  • reduce는 첨에 디게 이상했는데, 한번 익히면 진짜 자주 쓰인다. 너무 편해

[코딩테스트/JS] 음양 더하기

headerimg

음양 더하기

문제 설명

어떤 정수들이 있습니다. 이 정수들의 절댓값을 차례대로 담은 정수 배열 absolutes와 이 정수들의 부호를 차례대로 담은 불리언 배열 signs가 매개변수로 주어집니다.

실제 정수들의 합을 구하여 return 하도록 solution 함수를 완성해주세요.

제한사항

  • absolutes의 길이는 1 이상 1,000 이하입니다.
  • absolutes의 모든 수는 각각 1 이상 1,000 이하입니다.
  • signs의 길이는 absolutes의 길이와 같습니다.
  • signs[i] 가 참이면 absolutes[i] 의 실제 정수가 양수임을, 그렇지 않으면 음수임을 의미합니다.

입출력 예

absolutessignsresult
[4,7,12][true,false,true]9
[1,2,3][false,false,true]0

입출력 예 설명

예제 #1

  • signs[true,false,true] 이므로, 실제 수들의 값은 각각 4, -7, 12입니다.
  • 따라서 세 수의 합인 9를 return 해야 합니다.

    예제 #2

  • signs[false,false,true] 이므로, 실제 수들의 값은 각각 -1, -2, 3입니다.
  • 따라서 세 수의 합인 0을 return 해야 합니다.

내 솔루션

  • reduce로 합쳐버린다.
  • signs[idx]값에 따라 cur, -cur를 결정한다.
function solution(absolutes, signs) {
	return absolutes.reduce((acc, cur, idx) => acc + (signs[idx] ? cur : -cur), 0);
}

감상평

  • reduce()를 모르면 조금 지저분 해질 수 있을 뜻.

[코딩테스트/JS] 완주하지 못한 선수

headerimg

완주하지 못한 선수

문제 설명

수많은 마라톤 선수들이 마라톤에 참여하였습니다. 단 한 명의 선수를 제외하고는 모든 선수가 마라톤을 완주하였습니다.

마라톤에 참여한 선수들의 이름이 담긴 배열 participant와 완주한 선수들의 이름이 담긴 배열 completion이 주어질 때, 완주하지 못한 선수의 이름을 return 하도록 solution 함수를 작성해주세요.

제한사항

  • 마라톤 경기에 참여한 선수의 수는 1명 이상 100,000명 이하입니다.
  • completion의 길이는 participant의 길이보다 1 작습니다.
  • 참가자의 이름은 1개 이상 20개 이하의 알파벳 소문자로 이루어져 있습니다.
  • 참가자 중에는 동명이인이 있을 수 있습니다.

입출력 예

nparticipantcompletionreturn
1[“leo”, “kiki”, “eden”][“eden”, “kiki”]“leo”
2[“marina”, “josipa”, “nikola”, “vinko”, “filipa”][“josipa”, “filipa”, “marina”, “nikola”]“vinko”
3[“mislav”, “stanko”, “mislav”, “ana”][“stanko”, “ana”, “mislav”]“mislav”

입출력 예 설명

예제 #1

“leo”는 참여자 명단에는 있지만, 완주자 명단에는 없기 때문에 완주하지 못했습니다.

예제 #2

“vinko”는 참여자 명단에는 있지만, 완주자 명단에는 없기 때문에 완주하지 못했습니다.

예제 #3

“mislav”는 참여자 명단에는 두 명이 있지만, 완주자 명단에는 한 명밖에 없기 때문에 한명은 완주하지 못했습니다.


내 솔루션

  • 그냥 틀린거부터 찾기 위해 sort() 돌려서 비교한다.
function solution(participant, completion) {
    participant.sort((a,b)=>a-b);
    completion.sort((a,b)=>a-b);
    for (let i = 0; i < participant.length; i++) {
      if (participant[i] !== completion[i]) {
        return participant[i];
      }
    }
}

//효율성 fail
function solution2(participant, completion) {
  for(let i = 0 ; i < completion.length ; i++){
    const t  = participant.indexOf(completion[i]);
    if(t >= 0){
      participant.splice(t, 1)
    }
  }
  return participant.join();
}

감상평

  • 원래는 solution2에서 indexOf로 찾아서 잘라 내는 방식 (끝까지 돈다)로 풀었는데 느리다고 빠꾸먹었다.
  • solution는 틀린거 부터 찾으려면 어떻게 해야할까 하다가 생각난 방식.
  • 쉬운 만큼 빨리 풀어야하는데, 효율성 테스트가 있는줄은 몰랐네…

[코딩테스트/JS] 추석 트래픽

headerimg

추석 트래픽

문제 설명

이번 추석에도 시스템 장애가 없는 명절을 보내고 싶은 어피치는 서버를 증설해야 할지 고민이다. 장애 대비용 서버 증설 여부를 결정하기 위해 작년 추석 기간인 9월 15일 로그 데이터를 분석한 후 초당 최대 처리량을 계산해보기로 했다. 초당 최대 처리량은 요청의 응답 완료 여부에 관계없이 임의 시간부터 1초(=1,000밀리초)간 처리하는 요청의 최대 개수를 의미한다.

입력 형식

  • solution 함수에 전달되는 lines 배열은 N(1 ≦ N ≦ 2,000)개의 로그 문자열로 되어 있으며, 각 로그 문자열마다 요청에 대한 응답완료시간 S와 처리시간 T가 공백으로 구분되어 있다.
  • 응답완료시간 S는 작년 추석인 2016년 9월 15일만 포함하여 고정 길이 2016-09-15 hh:mm:ss.sss 형식으로 되어 있다.
  • 처리시간 T는 0.1s, 0.312s, 2s 와 같이 최대 소수점 셋째 자리까지 기록하며 뒤에는 초 단위를 의미하는 s로 끝난다. 예를 들어, 로그 문자열 2016-09-15 03:10:33.020 0.011s은 “2016년 9월 15일 오전 3시 10분 33.010초”부터 “2016년 9월 15일 오전 3시 10분 33.020초”까지 “0.011초” 동안 처리된 요청을 의미한다.** (처리시간은 시작시간과 끝시간을 포함)**
  • 서버에는 타임아웃이 3초로 적용되어 있기 때문에 처리시간은 0.001 ≦ T ≦ 3.000이다.
  • lines 배열은 응답완료시간 S를 기준으로 오름차순 정렬되어 있다.

출력 형식

solution 함수에서는 로그 데이터 lines 배열에 대해 초당 최대 처리량을 리턴한다.

입출력 예제

예제1

  • 입력: [ “2016-09-15 01:00:04.001 2.0s”, “2016-09-15 01:00:07.000 2s” ]

  • 출력: 1

예제2

  • 입력: [ “2016-09-15 01:00:04.002 2.0s”, “2016-09-15 01:00:07.000 2s” ]

  • 출력: 2

  • 설명: 처리시간은 시작시간과 끝시간을 포함하므로 첫 번째 로그는 01:00:02.003 ~ 01:00:04.002에서 2초 동안 처리되었으며, 두 번째 로그는 01:00:05.001 ~ 01:00:07.000에서 2초 동안 처리된다. 따라서, 첫 번째 로그가 끝나는 시점과 두 번째 로그가 시작하는 시점의 구간인 01:00:04.002 ~ 01:00:05.001 1초 동안 최대 2개가 된다.

예제3

  • 입력: [ “2016-09-15 20:59:57.421 0.351s”, “2016-09-15 20:59:58.233 1.181s”, “2016-09-15 20:59:58.299 0.8s”, “2016-09-15 20:59:58.688 1.041s”, “2016-09-15 20:59:59.591 1.412s”, “2016-09-15 21:00:00.464 1.466s”, “2016-09-15 21:00:00.741 1.581s”, “2016-09-15 21:00:00.748 2.31s”, “2016-09-15 21:00:00.966 0.381s”, “2016-09-15 21:00:02.066 2.62s” ]

  • 출력: 7

  • 설명: 아래 타임라인 그림에서 빨간색으로 표시된 1초 각 구간의 처리량을 구해보면 (1)은 4개, (2)는 7개, (3)는 2개임을 알 수 있다. 따라서 초당 최대 처리량은 7이 되며, 동일한 최대 처리량을 갖는 1초 구간은 여러 개 존재할 수 있으므로 이 문제에서는 구간이 아닌 개수만 출력한다.


내 솔루션

중요 포인트는

  • 끝난 시간과 경과된 시간으로 시작 시간을 구해야한다.
  • 처리 시간은 시작 시간과 끝시간을 포함한다.
  • 저 그림이 매우 중요한 힌트다.
// 시간을 나누고 시작과 끝. 그걸 sort한 flag 배열을 돌려받는다.
function getTimes(lines){ 
  const flags = [];
  const lineObj = lines.map(line => {
    const splitLine = line.split(' ');
    const times = splitLine[1].split(':');
    // times[2]*1을 안하면 times[2]는 string 값을 가지고 있다.
    // js개발자라면 type관련 개똥같은 상황을 자주 만나는데, 나는 방금 만났다.
    // 끝 시간은 +1을 해서 끝 시간을 포함하도록 한다.
    const end = (times[0] * 3600 + times[1] * 60 + times[2]*1) * 1000 + 1;
    const elapsed = splitLine[2].replace('s','')*1000; 
    flags.push(...[end - elapsed, end]);
    // 시작 시간은 +1을 해서 시작 시간을 포함하도록 한다.
    return { start: end - elapsed + 1, end }
  });
  return { lineObj, flags: flags.sort((a,b) => a - b) };
}

function solution(lines) {
  const { lineObj, flags } = getTimes(lines);
  const answer = [];
  let count = 0;
  flags.map(flag => {
    count = 0;
    for(let idx = 0 ; idx < lineObj.length ; idx++){
      //제일 난관인 999를 더하는 부분. 시작과 끝에 +1씩 했으니 1001만큼 검사함. 시작인 0과 끝인 1001포함.
      if( flag + 999 >= lineObj[idx].start && flag <= lineObj[idx].end ){
        count++;
      }
    }
    answer.push(count);
  })
  return Math.max(...answer);
}

감상평

월요일에 갑자기 삘받아서 간단하게 하나 풀자라고 생각 후 가벼운 마음으로 룰루랄라 들어간 프로그래머스에서 아주 폭력적인 계산 문제를 만났다.

시간 부분을 나누고 ms단위로 자르는 아이디어 까지는 술술 나왔는데, 시간의 시작, 끝 부분을 모두 서치해야 한다는 생각은 뒤늦게 나와 코드가 getTimes()에서 조금 생각이 꼬였다.

제출하고 중간에 5번 테스트에서 오류가 나왔는데 그 이유는 split() 후에는 string이 리턴되는 것을 잊어먹고 +times[2]를 했기 때문..ㅠㅠ

times[2] -> string ‘920’ times[2]*1 -> number 920

악독한 카카오녀석들.. 아주 잔인한 놈들임에 틀림없다. 이런게 입사 테스트용이라니 아마도 회사에 들어가면 영어 이름을 부르며, 친근하게 내 뚝배기를 깨버릴 것이다.

[game] Epic 게임즈 2021 메가 세일과 추천 게임

headerimg

에픽게임즈 2021메가세일

에픽게임즈에서 ~75%할인과 11,000원의 중복 쿠폰을 적용할 수 있는 메가 세일 2021이 시작했다. 매년 비슷한 할인을 하는데, AAA급 타이틀을 아주 싼 가격에 구매할 수 있는 좋은 기회다!

이건 사야해. 2가지 게임

headerimg

메타크리틱메타 유저평점스팀평가할인된 가격
82점7.3점매우 긍정적25,920 - 11,000 = 14,920원

발매했을땐 비싸고 지루해보였쥬?
이젠 아님 단돈 14,000원에 택배 배달게임 쌉추천




headerimg

메타크리틱메타 유저평점스팀평가할인된 가격
97점8.5점매우 긍정적44,220 - 11,000 = 33,220원

말할 필요 없는 띵작, 3.3만원이면 거의 최대 할인급이다.




일단..은? 추천 할 만한 게임들

headerimg headerimg headerimg headerimg

위 가격에서 11,000원씩 중복할인이 가능하다.




내가 산 똥겜

headerimg

메타크리틱메타 유저평점스팀평가할인된 가격
74점5.5점복합적25,500 - 11,000 = 14,500원

XCOM 오리지널 메인 개발자가 만든 턴제전략게임 신작.
해보니까 나쁘지 않음. 한글화 안되어있음.
신선한 시스템이 많이 추가되어있음.
아직까진 벨런싱 나쁘지 않음.
1년동안 에픽 독점이여서 평점과 여론이 디게 안좋음!!




메가 세일 링크

[강남 점심 맛집] 5월 소고기 갈비 회식! 모범갈빗살! 🍖

headerimg

5월의 회식은

회사 근처에 점심특선을 먹어본 회사 사람들의 추천으로 회식으로
한우 갈빗살만 판다는 모범 갈빗살에 갔다!

image

이름 빼곤 약간 모던해보인다.



image

전체 메뉴와 하이볼🥃이 눈에 띈다



image

점심 메뉴판. 회사 사람들이 먹어본 바에 의하면 전부다 상당히 맛있는 편이라고 한다!



image image

반찬이 나왔다. 새송이 버섯이 문신을 하고나와서 약간 쫄음!



image

기대는 안했지만 된장찌개가 상상이상으로 존맛탱!
건새우가 많이들어가서 정말 맛있었다.



image

불이 올라오고!



image image

생갈빗살을 쏵 널어주면!



image

소금 살짝 찍어서 싹 ! 아 이맛..



image

정신 없이 먹다보니 다먹어서 양념갈비로 추가 주문



image

또 정신없이 처묵처묵



image

후식으로는 스벅 포레스트 콜드브루.
벤티로 마셨는데 톨 사이즈에 카페인 225mg 이란다.
하루 아메 4샷정도 마시는 카페인 홀릭인데 잠이 안왔다.
킹반인은 조심해야겠다.



image

먼지 모를 맛있는 스벅 빵



image

모범갈빗살 굿즈 스티커 까지 특템


총평

100g에 2.2만원이다. 상당히 비싼가격이다.
비싼 가격만큼 좀 더 고기 본연의 맛이 아주 출중하다.
또 양념 갈비는 연두+참기름 맛으로 아주아주 맛있었다.

결론 2인기준 점심 정식2 + 양념갈비1~2 해서 깔끔띠 하게 먹는게 가성비가 좋아보인다.

[코딩테스트/JS] 다리를 지나는 트럭

headerimg

다리를 지나는 트럭

문제 설명

트럭 여러 대가 강을 가로지르는 일 차선 다리를 정해진 순으로 건너려 합니다. 모든 트럭이 다리를 건너려면 최소 몇 초가 걸리는지 알아내야 합니다. 트럭은 1초에 1만큼 움직이며, 다리 길이는 bridge_length이고 다리는 무게 weight까지 견딥니다. ※ 트럭이 다리에 완전히 오르지 않은 경우, 이 트럭의 무게는 고려하지 않습니다.

예를 들어, 길이가 2이고 10kg 무게를 견디는 다리가 있습니다. 무게가 [7, 4, 5, 6]kg인 트럭이 순서대로 최단 시간 안에 다리를 건너려면 다음과 같이 건너야 합니다.

경과 시간다리를 지난 트럭다리를 건너는 트럭대기 트럭
0[][][7,4,5,6]
1~2[][7][4,5,6]
3[7][4][5,6]
4[7][4,5][6]
5[7,4][5][6]
6~7[7,4,5][6][]
8[7,4,5,6][][]

따라서, 모든 트럭이 다리를 지나려면 최소 8초가 걸립니다.

solution 함수의 매개변수로 다리 길이 bridge_length, 다리가 견딜 수 있는 무게 weight, 트럭별 무게 truck_weights가 주어집니다. 이때 모든 트럭이 다리를 건너려면 최소 몇 초가 걸리는지 return 하도록 solution 함수를 완성하세요.

제한 조건

  • bridge_length는 1 이상 10,000 이하입니다.
  • weight는 1 이상 10,000 이하입니다.
  • truck_weights의 길이는 1 이상 10,000 이하입니다.
  • 모든 트럭의 무게는 1 이상 weight 이하입니다.

입출력 예

bridge_lengthweighttruck_weightsreturn
210[7,4,5,6]8
100100[10]101
100100[10,10,10,10,10,10,10,10,10,10]110

내 솔루션

  • 문제 설명에서 나오는 표를 보고 그대로 이용했다.
  • 시간이 1초 지나갈 때마다 실제 트럭이나 0을 넣어 가짜 트럭을 다리에 넣어준다.
  • 트럭이 다리의 마지막인 bridge[bridge_length-1]에 도착하면 빼낸다.
    • 만약 0이 아닌(실제트럭) 숫자가 들어오면 지나간 트럭 배열에 넣는다.
  • 나머지 로직은 코드와 주석을 함께 보면된다.
function solution(bridge_length, weight, truck_weights) {
  const trucks = JSON.parse(JSON.stringify(truck_weights));
  const passed = []; // 지나간 트럭 배열.
  const bridge = []; // 다리
  let bridgeWeight = 0; // 지금 다리의 무게
  let count = 0; // 지나간 초, return 할 값.
  
  // 파라미터로 들어온 truck_weights의 길이와 지나간 트럭 배열의 길이가 다를 동안.
  while(passed.length !== truck_weights.length){
    count++;
       
    // 만약 다리 배열 bridge의 마지막이 숫자라면
    if(typeof bridge[bridge_length-1] === 'number'){
      const truck = bridge.pop(); // 마지막 트럭을 다리에서 빼낸다.
      bridgeWeight -= truck; // 트럭의 무게만큼 지금 무게에 뺀다.
      // 트럭이 0보다 크면 (실제 트럭) 지나간 트럭 배열에 넣는다.
      if(truck > 0) passed.push(truck); 
    }
    
    //지금 무게와 1번 트럭이 통과 가능하면
    if(trucks[0] + bridgeWeight <= weight){
      bridgeWeight += trucks[0]; // 트럭을 다리에 넣음.
      bridge.unshift(trucks.shift()); // 다리에서 앞으로 넣어준다.
    }else{
      // 트럭이 못지나가므로 빈트럭 0 을 넣어 준다.
      bridge.unshift(0);
    }
  }
  return count;
}

감상평

게임을 만들 듯이 만들게 되었다.
트럭을 다리 배열 bridge에 넣어주어서 실제로 다리를 건너 듯이 로직을 짰다.
만약 다리에 진입할 수 없는 상황(무게)라면 무게가 0인 빈 트럭을 보내서 시간을 흐르게 한다.
이런 방식의 단점은 무게가 못버티는 중에는 반복문을 스킵할 수 없고 0이라는 가짜 트럭을 넣는 다는 점이다.

[코딩테스트/JS] 크레인 인형뽑기 게임

headerimg

크레인 인형뽑기 게임

문제 설명

게임개발자인 “죠르디”는 크레인 인형뽑기 기계를 모바일 게임으로 만들려고 합니다. “죠르디”는 게임의 재미를 높이기 위해 화면 구성과 규칙을 다음과 같이 게임 로직에 반영하려고 합니다.

게임 화면은 “1 x 1” 크기의 칸들로 이루어진 “N x N” 크기의 정사각 격자이며 위쪽에는 크레인이 있고 오른쪽에는 바구니가 있습니다. (위 그림은 “5 x 5” 크기의 예시입니다). 각 격자 칸에는 다양한 인형이 들어 있으며 인형이 없는 칸은 빈칸입니다. 모든 인형은 “1 x 1” 크기의 격자 한 칸을 차지하며 격자의 가장 아래 칸부터 차곡차곡 쌓여 있습니다. 게임 사용자는 크레인을 좌우로 움직여서 멈춘 위치에서 가장 위에 있는 인형을 집어 올릴 수 있습니다. 집어 올린 인형은 바구니에 쌓이게 되는 데, 이때 바구니의 가장 아래 칸부터 인형이 순서대로 쌓이게 됩니다. 다음 그림은 [1번, 5번, 3번] 위치에서 순서대로 인형을 집어 올려 바구니에 담은 모습입니다.

만약 같은 모양의 인형 두 개가 바구니에 연속해서 쌓이게 되면 두 인형은 터뜨려지면서 바구니에서 사라지게 됩니다. 위 상태에서 이어서 [5번] 위치에서 인형을 집어 바구니에 쌓으면 같은 모양 인형 두 개가 없어집니다.

크레인 작동 시 인형이 집어지지 않는 경우는 없으나 만약 인형이 없는 곳에서 크레인을 작동시키는 경우에는 아무런 일도 일어나지 않습니다. 또한 바구니는 모든 인형이 들어갈 수 있을 만큼 충분히 크다고 가정합니다. (그림에서는 화면표시 제약으로 5칸만으로 표현하였음)

게임 화면의 격자의 상태가 담긴 2차원 배열 board와 인형을 집기 위해 크레인을 작동시킨 위치가 담긴 배열 moves가 매개변수로 주어질 때, 크레인을 모두 작동시킨 후 터트려져 사라진 인형의 개수를 return 하도록 solution 함수를 완성해주세요.



제한 사항

  • board 배열은 2차원 배열로 크기는 “5 x 5” 이상 “30 x 30” 이하입니다.
  • board의 각 칸에는 0 이상 100 이하인 정수가 담겨있습니다.
    • 0은 빈 칸을 나타냅니다.
    • 1 ~ 100의 각 숫자는 각기 다른 인형의 모양을 의미하며 같은 숫자는 같은 모양의 인형을 나타냅니다.
  • moves 배열의 크기는 1 이상 1,000 이하입니다.
  • moves 배열 각 원소들의 값은 1 이상이며 board 배열의 가로 크기 이하인 자연수입니다.

입출력 예

boardmovesresult
[[0,0,0,0,0], [0,0,1,0,3], [0,2,5,0,1], [4,2,4,4,2], [3,5,1,3,1]][1,5,3,5,1,2,1,4]4


입출력 예에 대한 설명

입출력 예 #1

인형의 처음 상태는 문제에 주어진 예시와 같습니다. 크레인이 [1, 5, 3, 5, 1, 2, 1, 4] 번 위치에서 차례대로 인형을 집어서 바구니에 옮겨 담은 후, 상태는 아래 그림과 같으며 바구니에 담는 과정에서 터트려져 사라진 인형은 4개 입니다.


내 솔루션

  • movescol으로 row를 순환하며, 0보다 큰 숫자를 찾는다.
  • 만약 찾았다면 answer[]로 푸쉬한다.
    • answer의 마지막 원소와 boards에서 찾은 숫자가 같다면 answer.pop() 하고 count를 2늘린다.
  • boards에서 찾은 원소가 있던 위치에는 0으로 바꿔 준다.
function solution(board, moves) {
  const boards = board;
  const answer = [];
  let count = 0;
  for(let i=0 ; i < moves.length ; i++){
    for(let row=0 ; row < boards.length ; row++){
      const col = moves[i]-1;
      if(boards[row][col] > 0){
        if(answer[answer.length - 1] === boards[row][col]){
          answer.pop();
          count += 2;
        }else{
          answer.push(boards[row][col]);
        }
        boards[row][col] = 0;
        break;
      }
    }
  }
  return count;
}

감상평

문제가 이미지로 이루어져 있어서 조금 길었다.

원래는 2가지로 나눠서 함수를 나누려고 했는데, 그렇게 되면 여러 반복을 더 해야하기 때문에 성능 문제(사실 큰차이는 없을지도)로 붙여놨다.

카카오는 신박한 문제를 잘만드는 것 같다. 재미있었음.

[Food] 4월에 시킨 햇초당옥수수 1달만에 도착!😁

headerimg

작년에 먹었던 초당 옥수수에 반해버렸다.

원래 옥수수 귀신으로 1년에 10~20개는 먹어치우며 여름만 되면 살을 찌웠으나
어느날 먹었던 전자렌지에 4분만 돌려도 되는 간편하고 맛있는 초당옥수수에 빠져버렸다.


그래서 4월 29일 예약 구매를 했는데..
대략 15일 정도 걸릴 줄 았지만 비가 자주오고 여름이 너무 추운 바람에 늦어지게 되었다.

5월 22일 배송 완료! 🤩

초당옥수수의 영롱한 자태

image

박스에 꽉차게 들어있었다. 저걸다 벗겨야 한다는 거지..음..



image

벗겼더니 노랗고 색이 좀 다른 녀석이 들어있었다.


image

껍질을 다 벗기고 소분 때렸다.
원래는 마지막 껍질만 냅두고 보관을 한다는데.. 늦게봄😂



image

엄청난 양의 껍데기들ㅋㅋ



image

전자렌지 고고



image

익혔더니 색이 정말 이뻐졌다.
먹었더니 아 존맛탱! 1달을 기다렸지만 보람차구나

가격

총 11개가 들어있었고. 가격은 1.8만원에 구매했다.
일반 마트발 옥수수는 개당 1000원대 였던거 같은데.. 그치만 너무 맛있어서 살 수 밖에 없다

Pagination


© 2018. All rights reserved.