[codekata]220221-220225(수정중)

김은지·2022년 2월 26일
0

코딩테스트

목록 보기
1/17

6일차

def roman_to_num(s):
    rome = {'I':1, 'V':5, 'X':10, 'L':50, 'C':100, 'D':500, 'M':1000}
    result = 0
    try:
    	for i in range(len(s)):
    		if s[i+1] < s[i]:
        		result -= s[i]
        	else:
        		result += s[i]
  	except IndexError:
    	return result +s[i]       

얘는 내가 못 풀었기 때문에 동규님의 답을 참고했다. 로마자로 숫자가 입력되면 그 숫자를 일반 숫자로 바꾸는 것이 문제고, 해설은 다른 로마자는 그 문자에 대응하는 숫자로 바꿔서 결과에 계속 더해주면 답이 나오는데, 4나 9가 들어가는 숫자들은 IV, IX처럼 앞의 숫자가 뒤의 숫자보다 작고, 앞의 숫자는 결과 값에서 빼줘야 한다는 것이다.
이 문제에서 배운점은
1. 애러가 나면 애러처리를 해주면 된다는 것
2. for문의 바깥인 except 문에서도 마지막에 담긴 i를 사용할 수 있다는 것이다.
...특히나 2번이 약간 충격적이었다. i도 일단 코드 안에서 선언 된 것이기 때문에 for문이 끝나면 그 마지막 값이 담겨서 변수로 남아있다는 것이...
그런데 for문의 i가 for문의 indent 밖에서도 사용될 수 있는게 원래 맞는건가...
심지어 2중 for문의 안쪽에서 선언된 i도 for문이 끝나고도 사용할 수 있었다.
java도 되는건지 궁금하다.

흠...위의 방법을 맨 처음에 생각했는데, 우선 이 문제에서 배운점 2가지가 장벽으로 느껴져서 시도조차 하지 않았다는게 참... 다른 방법으로도 풀 수 있을텐데 학습부족이다~!

7일차

#나의 답
def more_than_half(nums):
    half_len = len(nums)/2
    s_num = set(nums)
    ls_num = list(s_num)
    temp_dict = {}
    for i in ls_num:
        temp_dict.setdefault(i,0) 
        for j in nums:
            if i == j:
                temp_dict[i] += 1
        if temp_dict[i] > half_len:
            return i

이 문제는 nums라는 리스트가 주어지고, 그 리스트의 전체 길이에서 과반 이상을 차지하는 특정숫자가 있다면 그 숫자를 리턴하는 문제였다.

풀긴 풀었는데... 정찬님이 무척 깔금하게 푸셨는데 카운트 메소드를 사용하신 것 같다.

#정찬님의 답
def more_than_half(nums): 
    for i in set(nums):
    	nums.count(i) > len(nums)/2
        return i	

이렇게 될 것...훨씬 간단하다...
이 문제에서 배운 것은 중복을 없애기 위해서는 set로 만들면 된다는 것과, set도 for문이 돌아간다는 것이다...

그리고 사실 이 문제도 풀 수 있는 방법은 다양하겠다. 찾아보니 한 줄로 푸신 분도 있는 것 같다(아마도 람다식). 신기!

8일차

'''와!풀었다! 생각한 풀이 순서!!
'(()){}' -> 11/11/33
1. 앞에서부터 string을 돌며 open리스트에 해당 요소와 같은 것이 있는지 비교하고 있다면 open리스트에서 해당 요소의 index를 temp리스트에 저장하고 다음 반복문으로 넘어
2. 다음 반복문으로 넘어간 후, 그 string 요소 (open에 있지 않은 첫 번 째 요소) close[temp.pop]과 같은지 확인하고, 같지 않거나, 아예 close리스트에 없다면 return False - close에 있는지 확인 해야하나?
3. 반복문이 끝나고 temp리스트에 남은 요소가 있으면 return False, 아닌경우 True를 반환 
4. temp 리스트에서 마지막 값을 pop으로 뽑을 때, 값이 없으면, 닫아줄 괄호가 없다는 뜻이므로 return False로 애러처리
'''
def is_valid(string):
    open = ['(','[','{']
    close = [')',']','}']
    temp = []
    try: 
        for i in string:
            if i in open:
                temp.append(open.index(i)) #오픈에 있으면 오픈의 인덱스를 저장하고 다음 반복으로 넘어가
                print
                continue
            if i in close and i == close[temp.pop(len(temp)-1)]:
                continue
            else :
                return False
        if len(temp) > 0:
            return False
        return True
    except:
        return False             

이 날의 문제는 3종류의 괄호로 이뤄진 string이 인자값으로 주어지고 괄호의 짝이 맞는지 확인하는 문제였다. 단순히 숫자가 맞는지가 아니라 여는 괄호, 닫는 괄호의 순서가 맞아야하고, 열린 괄호가 닫히기 전에 다른 괄호 종류가 사이에 들어와 있으면 안됐다!
예를들어 '(()){}' -> True / '({)}' -> False 입력값에 따라 이렇게 결과가 나왔다.

당일에는 문제를 풀 수 가 없었다. 어떻게 하면 될 것 같다는 막연한 생각만 있고, 정확한 순서를 모르겠다고 생각했다. 짝꿍도 일부 테스트 케이스를 통과하지 못 하셨다고 하신 것 같다. 그래서 가람휘님 답을 받아 저장해두었는데, 순서를 조금만 정리하면 풀 수 있을 것 같은 느낌때문에! 보지 않고 계속 시도했다!! 다행히 풀었고, 문제 해결순서를 머리로 명확히 정리하는 것이 아직은 어려우니, 꼭 말로 정리하는 습관을 들이기로 다짐한다.

아래는 가람휘님의 답을 정리 해 두었다.

def is_valid(string):
    my_list  = ['(','{','[']
    my_list2 = [')','}',']']
    result = []
    for i in string:
        if i in my_list:
            result += i
        elif i in my_list2:
            if len(result) == 0:
                return False
            if my_list.index(result[-1]) != my_list2.index(i):
                return False
            del result[-1]
    if len(result) != 0:
        return False
    return True

생각의 과정은 비슷했던 것 같다! 다만 속도에 차이가 무척 있지만...
아무튼 9일차로~!

9일차 [푸는중^_^]

10일차 [푸는중..^_^]

이번주 5일 중 4일을...
시간 안에 못 풀어서 무척 우울했는데 생각해보니 그럴 일은 아닌 것 같다.
어차피 나의 목적지는 정해져있으니 너무 느슨해지지 않는 선에서 적당히 낙관하기로 한다. 그래도 하루하루 문제를 풀고자 노력하면서, 그리고 다른 분들의 코드를 보면서 배우는 것이 많다...! 전날 배운 점을 그 다음날 적용할 수 있다는 것도 문제를 푸는 것의 좋은 점 인 것 같다.

다음주도 즐겁게 해보자고!
푸는 중 문제는 아직 답을 보기에는 아쉬워서 정리하지 않고 있다!~!
살짝만 더 고민을 해 보다가 일요일에는... 정리를 해봐야 겠다
~!!

0개의 댓글