728x90
반응형

문제 출처 : https://programmers.co.kr/learn/courses/30/lessons/12899

 

코딩테스트 연습 - 124 나라의 숫자

 

programmers.co.kr

문제 설명

124 나라가 있습니다. 124 나라에서는 10진법이 아닌 다음과 같은 자신들만의 규칙으로 수를 표현합니다.

124 나라에는 자연수만 존재합니다.

124 나라에는 모든 수를 표현할 때 1, 2, 4만 사용합니다.

예를 들어서 124 나라에서 사용하는 숫자는 다음과 같이 변환됩니다.

10진법

124 나라

10진법

124 나라

1

1

6

14

2

2

7

21

3

4

8

22

4

11

9

24

5

12

10

41

자연수 n이 매개변수로 주어질 때, n을 124 나라에서 사용하는 숫자로 바꾼 값을 return 하도록 solution 함수를 완성해 주세요.

제한사항

n은 500,000,000이하의 자연수 입니다.

 

 

def solution(n):
    answer = ''
    answer_list = ["4", "1", "2"]
    while n>0:
        answer = answer_list[n%3] + answer
        if not n%3:
            n = n//3 - 1
        else:
            n //= 3
    
    return answer
728x90
반응형
728x90
반응형

문제 출처 https://programmers.co.kr/learn/courses/30/lessons/42578

 

문제 설명

스파이들은 매일 다른 옷을 조합하여 입어 자신을 위장합니다.

스파이가 가진 의상들이 담긴 2차원 배열 clothes가 주어질 때 서로 다른 옷의 조합의 수를 return 하도록 solution 함수를 작성해주세요.

제한사항

clothes의 각 행은 [의상의 이름, 의상의 종류]로 이루어져 있습니다.

스파이가 가진 의상의 수는 1개 이상 30개 이하입니다.

같은 이름을 가진 의상은 존재하지 않습니다.

clothes의 모든 원소는 문자열로 이루어져 있습니다.

모든 문자열의 길이는 1 이상 20 이하인 자연수이고 알파벳 소문자 또는 '_' 로만 이루어져 있습니다.

스파이는 하루에 최소 한 개의 의상은 입습니다.

 

휴 40분 걸렸다

수학문제에 더 가까운 것 같은 문제.

의상카테고리가 하나일 때는 그 카테고리에 있는 개수를 출력하기만 하면 되지만

카테고리의 개수가 3개 이상으로 점점 늘어날수록 한 카테고리의 의상은 아예 선택하지 않는 경우까지 고려해야하다보니 구현을 어떻게 해야할지 통 감이 안와서 시간이 많이 걸렸다.

딕셔너리랑 각 카테고리별 요소 개수를 저장하는 리스트구현까지는 성공했는데

그 이후에 답을 얻어내는 과정을 모르겠어서 결국 답을 치팅했다.

(요소개수 + 1) 의 모든 곱이라니..

치팅하고 나서 공식으로 풀어보니까 위와 같이 기가막히게 똑같이 나왔다.

그래도 딕셔너리 밸류에 리스트를 넣는 등 테크니컬적인 부분에서는 공부가 됐다.

 

def solution(clothes):
    from collections import defaultdict
    d = defaultdict(list)
    def multi(arr):
        ans = 1
        for i in arr:
            ans *= (i+1)
        return ans
    for i in range(len(clothes)):
        d[clothes[i][1]] += [clothes[i][0]]
    lengths = [len(v) for v in d.values()]
    if len(lengths)==1:
        return lengths[0]
    else: return (multi(lengths) -1)
728x90
반응형
728x90
반응형

영업시간 : 매일 오후4시~ 새벽1시

금요일과 토요일은 새벽 2시까지.

 

영등포 맛집 원조부안집 영등포역점


 

영등포에 오랜만에 일이 생겨서 들렀다.

뭘 먹을지 정하지 못한채로 돌아다니다가 고기는 언제먹어도 맛있지하고 들어간

목살 쫀득살 전문 고기집 원조부안집 영등포역점이다.

빈 자리가 없어서 카운터 앞에서 5분정도 잠깐 웨이팅하다가 들어갔다.

나는 들어본 적이 없어서 몰랐는데 이미 티비에도 방영되고

입소문도 꽤 타고 있는 체인점인 것 같았다.

 

QR체크인 하고 들어가기.

불판 주위로 테이블 세팅을 저렇게 해주는 게 신기했다.

고기를 굽기 위해 불을 올리면 저 주변 부분도 같이 달궈진다.

 

쌈장 무쌈 소스 깻잎 소금 등등등 종류가 다양했다.

상추나 깻잎처럼 쌈채소가 없는게 좀 많이 아쉬웠다.

 

 

반합뚜껑처럼 생긴 그릇에 기름만 담겨있길래 소금부어서 기름장 만든 다음에 찍어먹는 건 줄 알았더니

마늘과 콩나물, 파김치를 저기에 한 번에 다 붓고 그릇 통채로 불판 위에 올려서 구운 파김치 식으로 먹는 거였다.

맛은 나쁘지않았지만 손이 막 가는 맛은 아니었다. 파김치를 좋아하는 사람이라면 입맛에 잘 맞을 것 같다.

공기밥이 없고 10분밥이라는 특이한 메뉴가 있다. 준비하는 데에 10분은 족히 걸려서 10분밥이라고 한다.

밥을 같이 먹고 싶어서 주문해봤는데 간장계란밥에 버터를 같이 주는 메뉴였다.

일본에 자주 가서 그런지 간장계란밥은 날달걀을 풀어서 먹는다는 이미지로 굳어져있었는데

계란은 후라이로 나오고 그 위에 김가루를 뿌린 한국식 간장계란밥이 나왔다.

완숙인 계란후라이가 조금 아쉬웠다.... 계란후라이가 반숙이었으면 더 맛있었을 것 같은데..

목살과 쫀득살을 1인분씩 시켰다.

고기 두께가 두껍기는 하지만 배부르기 먹기에는 양이 좀 부족하다.

 

사이드메뉴를 주문하지 않고 고기로만 배부르게 먹으려고 한다면 3, 4인분은 시켜야 할 것 같다.

대신 목살 쫀득살 둘 다 고기는 참 맛있었다.

쫀득살은 이름대로 정말 쫀득해서 맛있었다.

특수부위같은 이름이길래 궁금해서 물어봤더니

뒷다리 옆에 있는 조금 더 쫄깃쫄깃한 부위라고 얘기해주셨다.

 

알바 직원분이 친절하게 응대도 잘해주시고 처음에 고기를 구워주시기 때문에 편하게 먹을 수 있는 것도 좋았다.

특히 여기 김치찌개가 김치도 묵은지고, 들어가는 고기 양도 적지 않은데 그게 정말 맛있다.

김치찌개랑 간장계란밥이랑 같이 먹으면 정말 조합이 좋았다.

술안주로 옆에 시켜두고 먹기도 정말 좋은 맛.

 

셀프바가 운영되고 있는데 테이블이랑 셀프바가 좀 더 깨끗하게 운영됐으면 더 좋았을 것 같은데 아쉬웠다.

삼겹살이나 갈비 말고 색다른 부위의 고기가 먹고 싶을 때 재방문 할 것 같다.

728x90
반응형
728x90
반응형
    • 올바른 괄호

darklight

sublimevimemacs

Python3 

문제 설명

괄호가 바르게 짝지어졌다는 것은 '(' 문자로 열렸으면 반드시 짝지어서 ')' 문자로 닫혀야 한다는 뜻입니다. 예를 들어

  • ()() 또는 (())() 는 올바른 괄호입니다.
  • )()( 또는 (()( 는 올바르지 않은 괄호입니다.

'(' 또는 ')' 로만 이루어진 문자열 s가 주어졌을 때, 문자열 s가 올바른 괄호이면 true를 return 하고, 올바르지 않은 괄호이면 false를 return 하는 solution 함수를 완성해 주세요.

제한사항

  • 문자열 s의 길이 : 100,000 이하의 자연수
  • 문자열 s는 '(' 또는 ')' 로만 이루어져 있습니다.

입출력 예

sanswer

()() true
(())() true
)()( false
(()( false

입출력 예 설명

입출력 예 #1,2,3,4
문제의 예시와 같습니다

 

 

1차 : 실패한 풀이

def solution(s):
    answer = True
    while True:
        temp = s.replace('()','')
        if s == temp:
            break
        s = temp
    if not s:
        return True
    else: return False

결과는 테스트케이스에서 기대한 값과 같게 나왔지만 시간초과의 이유로 효율성 점수가 낮게 나왔다.

백준에서도 괄호의 완전성을 따지는 비슷한 문제가 있었는데,

그 때도 완전한 괄호를 replace로 바꾸면서 반복했을 때 시간초과가 났던 기억이 있어 다른 방법을 생각했다.

 

2차: 성공

def solution(s):
    t = []
    for i in s:
        if i=="(":
            t.append(i)
        else:
            if t:
                t.pop()
            else: return False
    if t: return False
    else: return True

스택으로 풀면 해결할 수 있다.

728x90
반응형
728x90
반응형

문제 설명

오픈채팅방

카카오톡 오픈채팅방에서는 친구가 아닌 사람들과 대화를 할 수 있는데, 본래 닉네임이 아닌 가상의 닉네임을 사용하여 채팅방에 들어갈 수 있다.

신입사원인 김크루는 카카오톡 오픈 채팅방을 개설한 사람을 위해, 다양한 사람들이 들어오고, 나가는 것을 지켜볼 수 있는 관리자창을 만들기로 했다. 채팅방에 누군가 들어오면 다음 메시지가 출력된다.

[닉네임]님이 들어왔습니다.

채팅방에서 누군가 나가면 다음 메시지가 출력된다.

[닉네임]님이 나갔습니다.

채팅방에서 닉네임을 변경하는 방법은 다음과 같이 두 가지이다.

  • 채팅방을 나간 후, 새로운 닉네임으로 다시 들어간다.
  • 채팅방에서 닉네임을 변경한다.

닉네임을 변경할 때는 기존에 채팅방에 출력되어 있던 메시지의 닉네임도 전부 변경된다.

예를 들어, 채팅방에 Muzi와 Prodo라는 닉네임을 사용하는 사람이 순서대로 들어오면 채팅방에는 다음과 같이 메시지가 출력된다.

Muzi님이 들어왔습니다.
Prodo님이 들어왔습니다.

채팅방에 있던 사람이 나가면 채팅방에는 다음과 같이 메시지가 남는다.

Muzi님이 들어왔습니다.
Prodo님이 들어왔습니다.
Muzi님이 나갔습니다.

Muzi가 나간후 다시 들어올 때, Prodo 라는 닉네임으로 들어올 경우 기존에 채팅방에 남아있던 Muzi도 Prodo로 다음과 같이 변경된다.

Prodo님이 들어왔습니다.
Prodo님이 들어왔습니다.
Prodo님이 나갔습니다.
Prodo님이 들어왔습니다.

채팅방은 중복 닉네임을 허용하기 때문에, 현재 채팅방에는 Prodo라는 닉네임을 사용하는 사람이 두 명이 있다. 이제, 채팅방에 두 번째로 들어왔던 Prodo가 Ryan으로 닉네임을 변경하면 채팅방 메시지는 다음과 같이 변경된다.

Prodo님이 들어왔습니다.
Ryan님이 들어왔습니다.
Prodo님이 나갔습니다.
Prodo님이 들어왔습니다.

채팅방에 들어오고 나가거나, 닉네임을 변경한 기록이 담긴 문자열 배열 record가 매개변수로 주어질 때, 모든 기록이 처리된 후, 최종적으로 방을 개설한 사람이 보게 되는 메시지를 문자열 배열 형태로 return 하도록 solution 함수를 완성하라.

제한사항

  • record는 다음과 같은 문자열이 담긴 배열이며, 길이는 1 이상 100,000 이하이다.
  • 다음은 record에 담긴 문자열에 대한 설명이다.
    • 모든 유저는 [유저 아이디]로 구분한다.
    • [유저 아이디] 사용자가 [닉네임]으로 채팅방에 입장 - Enter [유저 아이디] [닉네임] (ex. Enter uid1234 Muzi)
    • [유저 아이디] 사용자가 채팅방에서 퇴장 - Leave [유저 아이디] (ex. Leave uid1234)
    • [유저 아이디] 사용자가 닉네임을 [닉네임]으로 변경 - Change [유저 아이디] [닉네임] (ex. Change uid1234 Muzi)
    • 첫 단어는 Enter, Leave, Change 중 하나이다.
    • 각 단어는 공백으로 구분되어 있으며, 알파벳 대문자, 소문자, 숫자로만 이루어져있다.
    • 유저 아이디와 닉네임은 알파벳 대문자, 소문자를 구별한다.
    • 유저 아이디와 닉네임의 길이는 1 이상 10 이하이다.
    • 채팅방에서 나간 유저가 닉네임을 변경하는 등 잘못 된 입력은 주어지지 않는다.

입출력 예

recordresult

["Enter uid1234 Muzi", "Enter uid4567 Prodo","Leave uid1234","Enter uid1234 Prodo","Change uid4567 Ryan"] ["Prodo님이 들어왔습니다.", "Ryan님이 들어왔습니다.", "Prodo님이 나갔습니다.", "Prodo님이 들어왔습니다."]

입출력 예 설명

입출력 예 #1
문제의 설명과 같다.

 

 

def solution(record):
    answer = []
    d = {}
    for i in range(len(record)):
        record[i] = record[i].split()
    for i in range(len(record)):
        if record[i][0] == 'Enter':
            answer.append([record[i][1], '님이 들어왔습니다.'])
            d[record[i][1]] = record[i][2]
        elif record[i][0] == 'Leave':
            answer.append([record[i][1], '님이 나갔습니다.'])
        elif record[i][0] == 'Change':
            d[record[i][1]] = record[i][2]
    for i in range(len(answer)):
        answer[i][0] = d[answer[i][0]]
        answer[i] = ''.join(answer[i])
    return answer

 

유저ID와 닉네임을 연동할 필요성이 있음을 느껴 딕셔너리를 이용했다.

answer 리스트 안에 1차적으로 user id를 저장해두고

Enter 나 Change를 통해 닉네임이 변경된 것이 있다면 변경사항이 적용되도록 했다.

split으로 분리해놓은 문자열 배열을 ''.join을 통해 다시 합쳤다.

728x90
반응형
728x90
반응형

https://www.acmicpc.net/problem/1699

 

1699번: 제곱수의 합

어떤 자연수 N은 그보다 작거나 같은 제곱수들의 합으로 나타낼 수 있다. 예를 들어 11=32+12+12(3개 항)이다. 이런 표현방법은 여러 가지가 될 수 있는데, 11의 경우 11=22+22+12+12+12(5개 항)도 가능하다

www.acmicpc.net

 

x = int(input()) 
dp = [0] * (x+1) 
for i in range(1, x+1): 
    dp[i] = i 
    for j in range(1, i): 
        if (j * j) > i: 
            break 
        dp[i] = min(dp[i], dp[i - j**2] + 1) 

print(dp[x])

 

python으로 제출하면 시간초과가 난다. pypy3으로 제출했다.

32, 64, 128 등의 반례를 찾았기 때문에

가까운 제곱수 항 개수를 생각하는 것이 아니라

여태까지 나온 모든 제곱수 항을 확인해봐야한다는 것에 착안해야한다.

 

728x90
반응형
728x90
반응형

월요일, 화요일 휴무

수목금요일 오후5시, 토일요일 오후4시 ~ 라스트 오더 오후10시 (일요일 오후9시)

 

탐스피자

지금은 비슷한데 예전에는 치킨보다 피자가 맛있다는 취향을 가졌을 정도로 피자를 좋아한다.

피자를 좋아하는 친구와 피맥을 하러 찾은 피자집 탐스피자.

최근에 대한미국놈 유튜브에 방영되어서 큰 입소문을 탔다고 한다.

 

6시가 되기 전에 도착했는데 앞으로 8팀~9팀이 웨이팅하고 있었다.​

가게 내부가 엄청 넓은 편은 아니라서 한 사이클에 7~8팀이 들어갈 수 있다.

 

날씨가 춥지 않았기 때문에 그냥 기다렸다가 들어가기로 하고 기다렸는데

50분~1시간 정도의 웨이팅 후에 식당으로 들어갈 수 있었다.

 

피자 나오는 속도가 매우 늦거나 그런 편은 아니라서 웨이팅이 7팀 미만이라면 30~40분이면 들어갈 수 있을 것 같다.

 

웨이팅을 하면서 왜 유명해졌는지 대한미국놈 유튜브를 좀 봤는데

 '원조 미국피자의 맛 !' 같은 느낌이었는데 나는 미국 본토에 가본 적이 없기 때문에...

진짜 그 맛인지는 잘 모르겠다.

메뉴는 기본 맛은 페퍼로니, 페퍼로니 머쉬룸, 마르게리따

스페셜 맛은 스파이시 초리조, 소시지&페퍼, 탐스콤보

총 6종류이다.

평일이나 기다리는 손님이 없어서 바쁘지 않을 때에는

테이크아웃이나 반반으로 두 가지 맛을 볼 수 있는 하프앤하프로도 주문을 할 수 있는 것 같은데

내가 방문했을 때엔 반반과 포장 둘 다 안 된다고 했다.

 

 

치킨텐더나 감자튀김 등 사이드메뉴도 종류가 꽤 다양했다.

버팔로윙 9피스(9천원)를 블루치즈 소스와 함께 시켰다.

개인적인 소감은 한국양념치킨의 위대함을 느꼈다.

맛이 없다는 것이 아니라

핫소스로만 매콤한 맛을 내려고 하니 매운 맛이 없지는 않지만 시큼한 향이 꽤 강하다.

아무생각 없이 입에 넣다간 기침이 나오는 맛이다.

 

버팔로윙 기본 양념맛이 이렇게 강하다보니 같이 나온 소스를 찍어도 그 맛이 잘 느껴지지 않았다.

피자 먹고 도우 꼬다리 찍어먹는 용도로 같이 먹었다.

에일과 라거 한 잔씩.

생맥주도 팔고있고 버드와이저나 PBR같은 캔맥주도 판다. 가격은 센 편..

에일 생맥주 9천원, 버드와이저 6천원

메뉴고민을 하다가 그래도 이름을 내세워 팔고있는 메뉴가 맛있지 않을까해서 치킨 탐스콤보 피자.

리코타 치즈랑 페퍼로니의 조합이 좋아서 맛있었다.

도우가 얇다. 손으로 한 조각을 들면 흐물흐물하면서 휘어지는 두께?

나는 도우가 두꺼운 피자를 좋아하는 타입인데 맛이나 식감은 나쁘지 않았다.

 

두께는 이 정도이다. 

피자의 맛은 좋았다.

피자를 한 번도 먹어본 적이 없는 사람이 '피자'라는 음식이 뭐냐고 하면 가져다줄 것 같은 피자이다.

엄청 맛있다기보다는 피자의 정의를 지켜서 만든 피자의 느낌이다.

한국에서 판매되고 있는 피자의 토핑이 굉장히 다양하고 든든한 느낌이라면 얘는 '그냥 피자'다.

원조 미국피자라더니 간간한 맛이다.

가게 안의 분위기도 좋은 편이다. 어두워서 음식 사진은 잘 안 나온다.

초기에는 영어로만 주문했어야 했다고 하는데 지금은 한국말을 하는 직원이 있다.

처음부터 영어로만 손님 받고 주문받길래 영어로 얘기하고 있었는데

메뉴설명해주다가 갑자기 한국말을 하길래 속은 느낌이었다..

한 번쯤 가보기엔 괜찮은 식당.

리뷰 중에 가성비 극악이라는 말이 있었는데 웨이팅과 가격 등 여러모로 생각해보면 틀린 말도 아닌.😂

미국에 오래 살다와서 '하 미국피자 다시 먹고싶다' 하는 사람이면 모를까 그런 것도 아니라서 굳이 피맥을 위해 여길 다시 찾아가진 않을 것 같다.

728x90
반응형
728x90
반응형


韓国の若者言葉のなかで「인생」という接頭語があります。
使う例としては인생컷, 인생맛집, ~~~ などがあります。
この言葉の前についてる인생はどんな意味でしょうか

인생~ : いままで〜なかで一番〜な表現で使えます。

인생컷 : 인생と写真のcutの合成語で、一番可愛い、一番かっこいいように撮られた写真という意味になります。

인생맛집 : (맛집 : 美味しいお店)いままで食べたもので一番美味しかったお店という意味になります。

接頭語なので使いやすい方の韓国の若者言葉だと思いますので、みなさんもぜひ気軽に使ってみましょう

728x90
반응형
728x90
반응형

https://www.acmicpc.net/problem/1753

 

1753번: 최단경로

첫째 줄에 정점의 개수 V와 간선의 개수 E가 주어진다. (1≤V≤20,000, 1≤E≤300,000) 모든 정점에는 1부터 V까지 번호가 매겨져 있다고 가정한다. 둘째 줄에는 시작 정점의 번호 K(1≤K≤V)가 주어진다.

www.acmicpc.net

import heapq
import sys

n, e = map(int, sys.stdin.readline().split())
s = int(input())
a = [[]for _ in range(n+1)]
for _ in range(e):
    u, v, w = map(int, sys.stdin.readline().split())
    a[u].append((w, v))
INF = 10 * n + 1
d = [INF] * (n+1)
d[s] = 0
queue = []
heapq.heappush(queue, (0,s))
while queue:
    cost, now = heapq.heappop(queue)

    for x, next_node in a[now]:
        xc = x + cost
        if xc < d[next_node]:
            d[next_node] = xc
            heapq.heappush(queue, (xc, next_node))

for i in range(1, n+1):
    if d[i]==INF:
        print('INF')
    else: print(d[i])

 

다익스트라 알고리즘을 처음 익히기에 좋은 문제였다. 

경로 가중치의 조건이 10 이하의 자연수라는 점에서 INF를 10*n + 1 로 설정해서 수월하게 풀 수 있었다. 

 

다익스트라 알고리즘을 구현할 때 힙 구조를 많이 사용한다고 하여 힙 구조에 대해 복습했다.

힙 구조 안에 리스트를 넣는 방법으로 삼중 리스트로 해결해도 되지만 개인적으로 편한 튜플로 해결했다.

참조 : https://sungmin-joo.tistory.com/33

https://hsp1116.tistory.com/42

728x90
반응형
728x90
반응형

www.acmicpc.net/problem/2193

 

2193번: 이친수

0과 1로만 이루어진 수를 이진수라 한다. 이러한 이진수 중 특별한 성질을 갖는 것들이 있는데, 이들을 이친수(pinary number)라 한다. 이친수는 다음의 성질을 만족한다. 이친수는 0으로 시작하지 않

www.acmicpc.net

 

n = int(input())
dp = [0,1,1]
for i in range(3,n+1):
    dp.append(dp[i-1]+dp[i-2])
print(dp[-1])

 

몇 개씩 나오는지 케이스를 나열해봤더니

1,1,2,3,5,8,13,21 ... 의 형태로 나와서 바로 풀 수 있었다.

728x90
반응형

+ Recent posts