지난 '오픈채팅방/후보키' 문제에 이어

2019 카카오 코딩테스트 '실패율' 문제를

파이썬으로 풀어봤다.

 

 

2019/09/01 - [알고리즘/심심풀이 문제풀기] - [2019 카카오 코딩테스트] 후보키 (파이썬3) / 자체 해설 및 풀이

 

[2019 카카오 코딩테스트] 후보키 (파이썬3) / 자체 해설 및 풀이

지난 '오픈채팅방' 문제에 이어 2019 카카오 코딩테스트 '후보키' 문제를 파이썬으로 풀어봤다. ⬇ [알고리즘/심심풀이 문제풀기] - [2019 카카오 코딩테스트] 오픈채팅방 (파이썬3) [2019 카카오 코딩테스트] 오..

kyome.tistory.com

 

 

 

파이썬은 미리 갖추어져 있는 모듈이 많아서

생각하는 로직대로 알고리즘을 만들기 편하다ㅎㅎㅎ

 

 

 

 

 

 

 

 

 

 

 

 

코딩테스트 연습 - 실패율 | 프로그래머스

실패율 슈퍼 게임 개발자 오렐리는 큰 고민에 빠졌다. 그녀가 만든 프랜즈 오천성이 대성공을 거뒀지만, 요즘 신규 사용자의 수가 급감한 것이다. 원인은 신규 사용자와 기존 사용자 사이에 스테이지 차이가 너무 큰 것이 문제였다. 이 문제를 어떻게 할까 고민 한 그녀는 동적으로 게임 시간을 늘려서 난이도를 조절하기로 했다. 역시 슈퍼 개발자라 대부분의 로직은 쉽게 구현했지만, 실패율을 구하는 부분에서 위기에 빠지고 말았다. 오렐리를 위해 실패율을 구하는 코드를

www.welcomekakao.com

 

 

 


 

자체 해설

 

시간초과로 테스트 케이스하나가 말썽을 부려서 고생한 문제이다.

 

처음 시도한 방법은 초반에 stages와 N으로 이중For문을 만드는

방식으로 구현했지만 시간제한으로 실패했다.

아래의 제한사항의 내용을 보니 이중 반복문에서 걸리는 듯하다.

 

  • 스테이지의 개수 N은 1 이상 500 이하의 자연수이다.
  • stages의 길이는 1 이상 200,000 이하이다.

 

 

 

 

 

 

실패율 구하기

  1. 성공, 시도, 실패 배열을 만든다.
  2. 게임에 참여한 총 인원 수를 저장해둔다.
  3. stages 배열의 값을 보면 배열에 저장되어 있는 숫자들은 사실 실패한 스테이지이다.
  4. 성공한 스테이지는 배열에 저장되어있는 값 -1 이다.
    ex) stages = [2,1,2,6,2,4,3,3] 일 때, stages[0]는 2이다.
    즉, 2 스테이지를 시도했지만 실패했다, 실제 성공은 1 스테이지까지만 한게 된다.
  5. 스테이지별로 반복을 돌려 필요한 값을 얻어낸다.
  6. 반복부 끝에 스테이지에 머물러있는 사람들을 변수하나에 누적시켜서 실패자의 총합을 갖고 있는다.
  7. n스테이지 성공자 수  구하는 공식
    len(stages배열) /* 총 게임 참여자 수 */
       - stages배열.count(n)   /* n스테이지 실패자 */
       - { (n-1 스테이지 실패자 ) + (n-2 스테이지 실패자) + ... + (0 스테이지 실패자) }  /* 0~n-1 스테이지 실패자 합 */
  8.  시도 배열[n] = 성공자배열[n] + 실패자배열[n

 

 

 

 

작성 코드

def solution(N, stages):
    answer = []
    successCount = [0 for i in range(0,N)]
    tryCount = [0 for i in range(0,N)]
    failCount = [0 for i in range(0,N)]
    sumFailPeople = 0
    totalPeople = len(stages)
    for stage in range(1, N+1):
        failCount[stage-1] = stages.count(stage)
        successCount[stage-1] = totalPeople - failCount[stage-1] - sumFailPeople
        tryCount[stage-1] = successCount[stage-1] + failCount[stage-1]
        sumFailPeople += failCount[stage-1]
    result = [{'idx' : idx, 'fail' : f, 'try' : tryCount[idx]} for idx, f in enumerate(failCount)]
    failRatio = []
    for i in result:
        value = 0
        if i['fail'] != 0:
            value = i['fail']/i['try']
        failRatio.append({'idx' : i['idx'], 'value' : value})
    answer =[v['idx']+1 for v in sorted(failRatio, key=lambda x: x['value'], reverse=True)]
    return answer

 

 

 

 

 

 

 

 

참고 (시간 제한 오류난 케이스)

def solution(N, stages):
    answer = []
    successCount = [0 for i in range(0,N+1)]
    tryCount = [0 for i in range(0,N+1)]
    for man in stages:
        for i in range(0,man):
            tryCount[i] += 1
            if i != man-1:
                successCount[i] += 1
    failCount = [tryCount[idx]-i for idx,i in enumerate(successCount)]
    result =  [{'idx':idx,'fail':f,'try':tryCount[idx]} for idx,f in enumerate(failCount) if idx != len(failCount)-1]
    failRatio = []
    for i in result:
        value = 0
        if i['fail'] != 0:
            value = i['fail']/i['try']
        failRatio.append({'idx' : i['idx'], 'value' : value})
    answer =[v['idx']+1 for v in sorted(failRatio, key=lambda x: x['value'], reverse=True)]
    return answer

 

 

 

카카오 공식 해설 : https://tech.kakao.com/2018/09/21/kakao-blind-recruitment-for2019-round-1/

 

 

 


 

 

도움이 되셨다면

로그인이 필요 없는 공감 버튼 꾹 눌러주세요! 

 

 

 

지난 '오픈채팅방' 문제에 이어

2019 카카오 코딩테스트 '후보키' 문제를

파이썬으로 풀어봤다.

 

 

 

⬇ [알고리즘/심심풀이 문제풀기] - [2019 카카오 코딩테스트] 오픈채팅방 (파이썬3)

 

[2019 카카오 코딩테스트] 오픈채팅방 (파이썬3)

2019 카카오 코딩테스트에서는 자바로 '오픈채팅방'문제를 풀었는데 엄청 복잡하게 풀었던 기억이 난다. 라인수도 엄청나게 나오고 List 종류에 따라 성공과 실패가 나뉘었던 기억이 있다. 이번엔 파이썬으로 문..

kyome.tistory.com

 

 

또다시 느끼는 건 파이썬은 정말 

알고리즘 풀기 좋은 언어이다.

 

주석을 뺀 순수 라인수가 26줄!!

정말 말이 안 된다.

 

 

 

 

 

 

 

 

코딩테스트 연습 - 후보키 | 프로그래머스

[["100","ryan","music","2"],["200","apeach","math","2"],["300","tube","computer","3"],["400","con","computer","4"],["500","muzi","music","3"],["600","apeach","music","2"]] 2

www.welcomekakao.com

 

 

 


 

자체 해설

 

 

막연하지만 차근차근 정리해 보기로 했다.

내 방법은 반복문이 너무 많아서 사실 좋은 방법 같아 보이진 않지만

아래와 같은 제한사항이 있기에 마음 놓고 코드를 써 내려갔다.

 

  • relation의 컬럼(column)의 길이는 1 이상 8 이하이며, 각각의 컬럼은 릴레이션의 속성을 나타낸다.
  • relation의 로우(row)의 길이는 1 이상 20 이하이며, 각각의 로우는 릴레이션의 튜플을 나타낸다.
  • relation의 모든 문자열의 길이는 1 이상 8 이하이며, 알파벳 소문자와 숫자로만 이루어져 있다.

 

 

유일성 :

  1. 2차원 배열로 들어온 relation[row][col]의 값 중 col이 같은 값을 하나의 set에 넣어서 검증하면 된다고 생각했다.
  2. 여러 col의 조합이 유일한지 확인하기 위해서는 인위적인 조작이 필요하다고 생각했다.
  3. 컴럼들의 경우의 수를 모두 얻은 후에 각 값들의 유일성을 검증하기로 했다.
  4. itertools의 combinations를 사용해서 col의 모든 조합을 만든다.
  5. 반복문으로 col의 조합을 가져와서 합친 쳐서 하나의 tempCol을 만들고 set에 넣어서 개수를 확인한다.
      ex) 1,2 조합이라면 set(["100ryan","200apeach","300tube","400con","500muzi","600apeach"])
  6. 개수가 원래 row의 수와 동일하면 유일성이 보장된 것이기 때문에 따로 저장해둔다.

 

최소성 : 

  1. 유일함이 보장된 조합에서 최소성을 검증한다.
  2. 리스트 내에서 부분집합을 갖고 있다면 최소성 조건에 맞지 않기 때문에 삭제 대상 set에 넣는다.
  3. 유일성이 보장된 그룹의 수에서 삭제 대상의 수를 뺀다.

 

 

 

 

 

 

 

작성 코드

from itertools import combinations
def solution(relation):
    answer = 0
    # 모든 컬럼의 조합 리스트
    all = list()

    #유일성 만족하는 조합 리스트
    uniqeIndex = []

    if len(relation) > 0:
        # 컬럼의 개수
        colSize = len(relation[0])
        # 로우의 개수
        rowSize = len(relation)

        # 모든 컬럼의 조합 구하기 (Set형태)
        for i in range(1, colSize + 1):
            # append는 런타임에러가 뜸 append와 extend 비교하여 알아둘 것
            all.extend([set(k) for k in combinations([j for j in range(colSize)], i)])

        # 조합들의 유일성 검증
        for comb in all:
            #set에 추가하여 사이즈 비교로 검증
            vaildSet = set()
            # 조합에 해당되는 로우를 하나의 str로 합쳐서 set에 넣음
            for row in range(rowSize):
                temp = ''
                for col in comb:
                    temp += relation[row][col]
                vaildSet.add(temp)
            # 유일성 확인하여 리스트에 추가
            if len(vaildSet) == rowSize:
                uniqeIndex.append(comb)

        # 최소성 검증
        # 삭제대상 Set (최소성 위배)
        delSet = set()
        #부분집합 여부 확인
        for stdMinElem in uniqeIndex:
            for idx, compMinElem in enumerate(uniqeIndex):
                # 부분집합이면서 자기 자신이 아니라면 상위집합을 삭제 대상에 추가
                if stdMinElem.issubset(compMinElem) and stdMinElem != compMinElem:
                    delSet.add(uniqeIndex.index(compMinElem))
        # 유일성 - 최소성 위배
        answer = len(uniqeIndex)-len(delSet)
    return answer

 

 

카카오 공식 해설 : https://tech.kakao.com/2018/09/21/kakao-blind-recruitment-for2019-round-1/

 

 

 


 

 

도움이 되셨다면

로그인이 필요 없는 공감 버튼 꾹 눌러주세요! 

 

2019 카카오 코딩테스트에서는

자바로 '오픈채팅방'문제를 풀었는데 

엄청 복잡하게 풀었던 기억이 난다.

 

라인수도 엄청나게 나오고 

List 종류에 따라 성공과 실패가 나뉘었던 기억이 있다.

 

 

 

 

 

 

이번엔 파이썬으로 문제를 풀어보았다.

무엇보다 라인 수가 말도 안되게 줄었고

확실히 코드가 깔끔하다.

파이썬 알고리즘에 입문해보는걸

고려해보아야겠다.

 

 

 

코딩테스트 연습 - 오픈채팅방 | 프로그래머스

오픈채팅방 카카오톡 오픈채팅방에서는 친구가 아닌 사람들과 대화를 할 수 있는데, 본래 닉네임이 아닌 가상의 닉네임을 사용하여 채팅방에 들어갈 수 있다. 신입사원인 김크루는 카카오톡 오픈 채팅방을 개설한 사람을 위해, 다양한 사람들이 들어오고, 나가는 것을 지켜볼 수 있는 관리자창을 만들기로 했다. 채팅방에 누군가 들어오면 다음 메시지가 출력된다. [닉네임]님이 들어왔습니다. 채팅방에서 누군가 나가면 다음 메시지가 출력된다. [닉네임]님이 나갔습니다. 채팅

www.welcomekakao.com

 

 

 


 

작성 코드

idDict = dict()

def solution(record):
    answer = []
    logList = []
    for e in record:
        dataList = e.split(" ")
        if dataList[0] == "Leave":
            logList.append([dataList[1], "님이 나갔습니다."])
        elif dataList[0] == "Enter":
            idDict[dataList[1]] = dataList[2]
            logList.append([dataList[1],  "님이 들어왔습니다."])
        elif dataList[0] == "Change":
            idDict[dataList[1]] = dataList[2]
    print(logList)
    for log in logList:
        answer.append(idDict[log[0]] + log[1])
    return answer

 

 

 

카카오 공식 해설 : https://tech.kakao.com/2018/09/21/kakao-blind-recruitment-for2019-round-1/

 

 


 

 

 

도움이 되셨다면

로그인이 필요없는 공감 버튼 꾹 눌러주세요! 

안녕하세요😌

성신여대 불맛 제육 

맛집을 소개할까 해요!
돈암동 주민의 맛집 추천이니 

믿고 가셔도 됩니다🤓

 

 

 

 


 

"제순식당"

 

 

제순식당은 성신여대 

직화 볶음의 일인자라고 

소개하면 딱 일 것 같아요😌

 

 

지금의 자리 바로 앞에서

작은 식당으로 시작했는데

이젠 옆에 큰 가게로 

이전했어요!

 

매번 갈 때마다 

웨이팅을 생각했어야 했는데

확장 이전이라서

회전이 빨라졌어요 

 

이제 가면 바로 

식사할 수 있어서 좋아요!

 

 

 

 

 

 

 


이제 조촐한 

식당이 아니라
깔끔하게 갖추어진 

맛집이 된 것 같은 

느낌이죠?

 

 

1. 직화 가득 메뉴

 

 

메뉴판 먼저 보고 

가실까요??


직화 제육 맛집답게 

메뉴들이 확실해요!

 

저는 여기 메뉴를 

다 먹어봤는데 

메뉴들마다 특색이 있고 

정말 다 맛있어요!

 

 

 

 

주목해야 할 부분은

1인 1 메뉴를 주문하면

찌개가 2000원!!

 

백반에 찌개가 

빠질 수 없죠?

 

 

 

 

 

2. 담백한 반찬 : 김 & 간장

 

반찬이 매번 

조금씩 바뀌지만

바뀌지 않는 

고정 메뉴가 있어요

바로! 김 & 간장

 

 

 

 

 

제육과 김과 간장은 

정말 강추하는 

꿀조합이에요!

 

 

3. 직화 제육 & 차돌 된장찌개

 

살짝 매콤한 

제육에 김을 싸 먹고

차돌 된장 한 숟갈로 마무리!

 

 

 

 

 

 

 

불맛 가득한 직화 제육의

맛도 인상 깊고

된장찌개가 직화 제육의

  강한 맛을

잡아주기 때문에 

부담 없이 든든하게

식사할 수 있을 거예요

 

 

 

4. 혼밥도 좋아요

 

 

 확장 이전하면서 

공간이 아주 넓어졌고

1인 테이블도 많기 때문에

혼밥하기에도 딱! 이에요🙊

 

 

 

 

5. 가는 길

 


 

 

 

믿고 먹는

성신여대 직화볶음

일인자

 

 

 

제순식당

 

 

 

 

 

자바 개발을 하다보면 날짜 형태에 

맞추어 String으로 저장된 값에 

날짜를 더하거나 빼야할 때가 많다.

 

처음부터 String 형태로 DB에 

저장하는 경우도 많고

 

Controller에서 DB값을 받았을 때, 

이미 SQL로 TO_CHAR( )을 적용한 값을 

받게되는 경우도 있기 때문에 

 

String 으로 Date를 만드는 

방법을 익혀두는게 

마음 편하다.

 

 

 

 


 

" String to Date "

 

 

 

1. DateFormat 선언하기

 

날짜 문자열이 "2020.10.01" 형태로 

들어온다고 가정할 때,

날짜데이터를 잘 구분할 수있도록

형태에 맞추어 DateFormat을

미리 지정해 주어야 한다.

 


DateFormat dateFormat = new SimpleDateFormat ("yyyy.MM.dd"); 

 

 

 

 

 

 

2. Date 형태로 변환하기

 

이제 DateFormat이 제공하는

parse 메소드를 사용해서

Date 인스턴스를 생성한다.

 

파라미터로 String 데이터를 넣으면

그 형태에 맞는 Date 인스턴스를 반환한다.

 


Date endDate = dateFormat.parse("2020.10.01"); 

 

Date를 다룬다고 생각하고

마음편하게 사용하면 된다.

 

 

 

 

 

안녕하세요☺️

3년 정도를 쓰던 마우스를

보내줄 때가 되어서

새로운 마우스를 찾게 됐어요

 

아무래도 하루의 대부분을 

마우스와 키보드를 사용하다 보니 

신중하게 구매하게 되더라고요!

 

그래서 저의 선택과 사용후기를

공유할까 해요!

 

 

 

 


"Microsoft 인체공학 마우스"

 

제가 선택한 마우스는

Microsoft의 

Sculpt Ergonomic Mouse라는 

어려운 이름을 가진

마우스예요

 

Microsoft는 사실 마우스와 키보드를

잘 만들기로 유명하지요

(소프트웨어 회사의 반전 매력..🤭)

 

 

 

 

 

 

1. 귀여운 첫인상

 

동글동글하고

맨질맨질해서

너무 귀여운 마우스!

 

크기는

일반적인 마우스보다는 

살짝 크고 무게감도 있어서 

좋은 그립감을 가지고 있어요

 

 

 

 

2. 업무용으로 적합

 

 

요즘은 블루투스 연동식으로 

마우스가 많이 나오는데 

저희 회사는 보안 때문에 블루투스가

막혀있어요😭

 

 

 

 

 

 

 

USB를 꽂아야 사용할 수 있는 

마우스만 허용이 되는데 

Sculpt Ergonomic 마우스는

USB를 꽂아서

연결하기 때문에 문제없이 

사용 가능해요!

 

 

 

 

 

3. 손목이 편한 마우스

 

 

처음에 사용할 땐 

후회가 살짝 올

듯한 느낌이었어요

생각보다 편하지 않고 

어색하다는 생각이

들었거든요🤔

 

그렇지만 

한 달 넘게 써보니 

이 마우스가

정말 편하다는 걸 

느꼈어요

 

 

1) 일반 마우스와 비교 

 

측면비교 - 일반마우스
측면비교 - MS마우스

 

오래 마우스를 쓰면

손목이 저릴 때가 있었는데 

요즘은 확실히 그런 느낌이

없어졌어요

 

개인적인 느낌으론

어깨도 편해진 느낌이었어요

마우스를 오래 쓰면

오른쪽 어깨가 

긴장되는 느낌이었는데

 

손목을 편안하게 두어도 

마우스를 움직일 수

있어서 그런지

어깨도 긴장이

덜 하더라고요!

(근데, 이건 그냥 제 자세가

안 좋은 거일 수도... 😅)

 

 

 

 

 

 

4. 편리한 기능

 

 

1) 시작 버튼

MS 마크가 있는

부분은 버튼이에요

누르면 시작 버튼과 같은

역할을 하는데 

저는 잘 안 써요..ㅎㅎ

 

 

2) 뒤로 가기 버튼

그 밑에 사진으론

잘 안 보이지만

엄지손가락이 있는 곳에

버튼이 하나가 더 있는데

뒤로 가기 버튼이에요

 

이 버튼은 웹서핑 중에

아주 유용하게

사용한답니다😌

 

 

3) 4방향 휠

휠이 위아래뿐 아니라 

좌우로 밀고 당길 수 있어서 

페이지가 클 때 상하 좌우로

움직이기에 편리해요!

 

 

 

4) 블루트랙

이 마우스는 밑에 센서가

파란색인데 찾아보니

블루트랙이라는 센서라서 

바닥의 재질을 크게

가리지 않는다고 하니 

구매하실 때 참고하시면

좋을 것 같아요

 

 

[네이버 지식백과] 블루트랙 (쇼핑용어사전)
카페트 등 평평하지 않은 바닥에서도 작동하는 고성능 레이저 센서입니다. 마이크로소프트 레이저 마우스에서 사용합니다. 고광택 표면 외에는 바닥 재질을 가리지 않기 때문에, 
마우스패드가 없어도 문제없이 사용할 수 있는 마우스입니다.

 

 


 

 

 

 

손목 건강 챙기자

 

Microsoft Sculpt Ergonomic Mouse

 

 

 

 

 

안녕하세요☺️

더운 날엔 빙수만 한 게 없죠

그래서 연남동에 특별한 빙수 맛집을

찾아보았어요😋

 

일본의 브랜드는 아니고, 🇰🇷

일본식 빙수를 판매하는

가게라고 하네요!

 

 

 

 


 

"도쿄빙수 연남점"

 

간판부터 아기자기한 일러스트로

눈길을 잡는 가게예요😮

 

 

 

 

 

바깥에서 볼 때부터 이미

분위기가 좋은 빙수 가게라는

확신이 들었어요

담백하게 꾸민

외부 모습이 마음에

꼭 들었어요🤭

 

 

 

 

1. 아기자기한 실내 분위기

 

 

실내 분위기가 아기자기해요!

벽에 붙어있는 빙수 일러스트도 

너무 귀엽더라고요☺️

 

 

 

작은 소품들을이 많고

벽에 일러스트들이

많이 붙어있는데도

잘 배치해서 그런지

조잡하다는 느낌보다는 

나름의 감성이 느껴지는 

빙수가게예요🧐

 

 

 

 

 

2. 호기심 자극 메뉴들

 

 

모든 메뉴 소개가

일러스트와 함께!

 

메뉴들의 이미지도 상상되고 

실제의 맛과 비주얼이 어떨지 

궁금해지더라고요😲

 

(말차 빙수는 일러스트와

실물이 비슷하더라고요!)

 

 

 

 

 

3. 짙은 말차 생크림 빙수

저희는 딱 보고 말차가

확 눈길을 끌어서

말차 생크림 빙수와

사이드 메뉴로 당고

주문했어요!

 

보이나요?? 🙊

그릇이 버거워보이는 

저 비주얼!

 

 

 

 

한 입 딱 먹었을 때 맛은

‘오! 진하다!’ 

였어요👍

 

생각보다 말차의 맛이 진하고 

생크림 때문인지

부드러운 식감도 있어서 

마음에 들었어요!

 

진한 빙수를 선호한다면 

말차 빙수 추천! 추천!😌

 

아슬아슬, 위에 부터 조금씩

퍼먹는 것도 또 하나의

먹는 재미라면 재미랄까!

 

 

 

 

 

4. 속까지 알찬 빙수

 

겉에서부터 야금야금

먹기 시작했는데 

속에 또 하나의

말차층 발견!🤩

 

그래서

나중까지도 

밍밍해지지 않고

말차의 진한 맛이

계속 이어지나 봐요!👍

 

 

 

 

 

 

 5. 달달한 당고

 

 

사이드로 함께 시킨 당고!

쫄깃하고 달달해서

빙수와 곁들이기에도 좋아요😌

 

간장 맛과 매운맛이 있는데 

사장님이 간장 맛을 추천해주셨어요!

 

마침 배고팠는데 

당고 덕에 좀 달랬어요🤓

 

 

6. 맛있게 먹는 방법

 

 

맛있게 먹는 방법!

 

사실 가장 와 닿는

맛있게 먹는 방법은 

5번째 방법이지요! 😆

 

 

 

 

 

7. 가는 길

 

 


 

연남동 먹을 만한 빙수집

도쿄 빙수

 

 

 

 

 

 

+ Recent posts

"여기"를 클릭하면 광고 제거.