프로그래머스 스킬체크 - Level2

Red_Panda·2021년 4월 15일
0

코딩테스트

목록 보기
1/2
post-thumbnail

요즘 포폴보다 코딩테스트에 중점을 두고 공부하고 있다. 코딩테스트 문제를 풀때마다 매번 어렵다...

처음에는 아직 공부를 안해서 그렇지 공부하면 나중엔 어느정도 풀지 않을까? 하고 자신 있었는데 자신감을 점점 잃어갔다.

그래도 꾸준히 공부했으니까 뭔가 얻은건 있지 않을까해서 프로그래머스 스킬체크 Level-2를 도전해봤다.

(예전에 Level-1을 뚝딱 못풀었기도 했고, 2레벨 연습문제를 풀때도 은근 어려웠어서 Level-2 도전에 대해서 조금 겁이 났었다.)

사용 언어 Python3

첫번째 문제

def solution(s):
    answer = ''
    s=s.split(" ") # 문장을 공백 기준으로 단어로 쪼갠다.
    for i in range(len(s)):
        for j in range(len(s[i])):
            if(j==0): # 첫자리의 경우 알파벳이면 대문자로
                if(s[i][j].isdigit()==False): 
                    answer+=s[i][j].upper()
                else:
                    answer+=s[i][j]
            else: # 2~n자리일때 대문자는 소문자로
                if(s[i][j].isupper()):
                    answer+=s[i][j].lower()
                else:
                    answer+=s[i][j]
        answer+=" " 
    answer=answer[:-1]
    #print(answer)
    return answer

간단한 문자열 처리 문제였다. 처음에 보고 Level-2 문제가 맞나? 싶었다.
백준으로 치면 브론즈 난이도 느낌??
문장을 주고 각 단어들의 첫 자리는 대문자, 그 이외는 소문자로 변경하는 문제였다.

파이썬의 .lower(), .upper()를 이용해 간단하게 통과할 수 있었다.

첫번째 문제를 의외로 간단하게 통과했다. 너무 쫄았었나 ㅎㅎ..

두번째 문제

def solution(record):
    answer = []
    dict={} # 유저 아이디별 닉네임을 저장하기 위해 딕셔너리 사용
    for i in range(len(record)):
        record[i]=record[i].split(' ')

    for i in range(len(record)):
        if(record[i][0]=='Enter' or record[i][0]=='Change'):
            dict[record[i][-2]]=record[i][-1]
        #elif(record[i][0]=='Leave'):
         #   del dict[record[i][-1]]

    for i in range(len(record)):
        if(record[i][0]=='Enter'): # Enter 명령어는 Enter, uid, name
            answer.append(dict[record[i][-2]]+"님이 들어왔습니다.")

        elif(record[i][0]=='Leave'): # Leave명령어는 Leave, uid 뿐
            answer.append(dict[record[i][-1]]+"님이 나갔습니다.")

    return answer

딕셔너리를 이용해야 하는 문제였다. 남은시간은 50분.
딕셔너리 문제를 자주 접하지 않아 헉 했다. 일단 딕셔너리 기본 문법부터 찾아보고..

기본 문법을 보고나니 어떻게 풀어야할지 아이디어가 생각났다. 그리고 생각을 코드로 옮겼다.

  1. input값을 명령어, 유저아이디, 닉네임 으로 나누기 위해 ' '로 쪼개줬다.
  2. 명령어는 총 3개 Enter, Leave, Change고 명령어는 각 배열 0번 인덱스에 있다.
  3. 명령어가 Enter, Change 일때 현재 아이디의 닉네임을 입력한 값으로 바꿨다.
    (문제에서, 없는 유저가 닉네임을 Change하는 경우는 없다고 말했기 때문에 가능하다.)
  4. Leave인 경우엔 해당 유저정보를 딕셔너리에서 삭제했다.
  5. 명령어들의 순서에 맞춰 딕셔너리를 수정해가며 저장했다.
  6. 저장된 딕셔너리로 Enter, Leave 일때 해당 유저의 닉네임+문장을 출력 한다.

근데 런타임 에러로 3.1/50점 받았다.
분명 맞는데.. 하면서 코드를 다시 한줄씩 살펴봤다.

4번 부분에서 문제가 있었다.

#elif(record[i][0]=='Leave'):
         #   del dict[record[i][-1]]

생각해보니까 del 처리를 해주면 안된다. 왜냐, 여기서 지워버리면 출력할때 떠난사람의 닉네임을 출력을 할 수가 없었다.
그래서 이 부분을 주석처리해서 제출했더니 통과했다!!

그래도 공부했던게 아예 효과가 없는건 아니었나보다. 다행이다.

나의 코딩테스트 공부 방법

  1. 문제를 보고 어떻게 풀어야 할지 펜으로 종이에 적어본다.
  2. 푸는 방법을 알았으면 바로 코딩
  3. 전혀 모르겠으면 구글에서 다른 분들의 여러가지 코드를 본다.
  4. 다른 분들의 코드를 보고 이해 했으면 보지않고 코딩
  5. 코드를 암만봐도 이해가 안가면 코드를 보면서 따라 써본다.
  6. 코드를 따라쓰되 코드를 쪼개 돌려보면서 이 부분이 어떻게 돌아가는지 공부한다.
  7. 그래도 이해가 안간다. 그러면 해당 문제의 카테고리(bfs, dp, queue)등등에서 쉬운 문제부터 시도 해본다.
  8. 반복

처음에 공부할때 5번에 해당하는 경우가 은근 많았었다 ㅎㅎ.. 해도해도 안늘고.. 공부 방법이 잘못됐나? 생각도 들었다.

처음에는 브론즈 문제 정도만 할만 했었다.

근데 요즘은 실버 문제나 쩔쩔매던 탐색 문제들을 내 힘으로 조금씩 풀기도하고, 마침 오늘 Level-2도 통과한거 보면 아주 틀린 공부 방법은 아니었다보다.

다음 목표는 Level-3 통과다.

profile
신입 개발자

0개의 댓글