코딩,해볼까

07.19. 프로그래머스 : 점의 위치 구하기, 최댓값 만들기(1), 문자열 정렬하기(1), 중복된 문자 제거 본문

Back/TIL

07.19. 프로그래머스 : 점의 위치 구하기, 최댓값 만들기(1), 문자열 정렬하기(1), 중복된 문자 제거

떠굥 2023. 7. 19. 21:35

페어프로그래밍 형식으로 진행해봤는데, 다양한 방법의 풀이를 해보니 너무 재밌었다...!

 

문제링크

점의 위치 구하기

최댓값 만들기(1)

문자열 정렬하기(1)

중복된 문자 제거

 

< 점의 위치 구하기 >

1. 나의 풀이

    if dot[0] < 0:
        if dot[1] > 0:
            answer += 2
        else:
            answer += 3
    else:
        if dot[1] > 0:
            answer += 1
        else:
            answer += 4

2. 팀원과 함께한 풀이

팀원분이 이미 프로그래머스의 신박한 풀이 방법을 보고 그 방법대로 나를 안내해주는 네비게이터가 되었다. 나는 드라이버가 되어 문제를 풀어봤다. 문제의 방향에 따라 메모를 해봤다.

    dot[0] < 0 and dot[1] > 0 = 2  
    dot[0] < 0 and dot[1] < 0 = 3
    dot[0] > 0 and dot[1] > 0 = 1
    dot[0] > 0 and dot[1] < 0 = 4

우선 이 문제도 경우에 따라 기준이 딱 정해져 있다. 힌트는 배열 하나를 만든다. / -, + / 0, 1 / True, False

qu = [(3,2),(4,1)]

qu[0][0] = false, false - -
qu[0][1] = false, true - +
qu[1][0] = true, false + -
qu[1][1] = true, true + +

힌트에 따라서 경우를 다시 적어봤다. 파이썬은 0과 1을 True, False라고 생각한다. -는 false와, +는 true와 연결해서 위와 같은 배열 속 배열을 만들었다. 저 배열은 0과 1 숫자를 가지고 꺼내올 수 있다.

qu = [(3,2),(4,1)]
answer = qu[dot[0]>0][dot[1]>0]

qu의 첫 대괄호 속의 dot[0]>0 은 무조건 '양수' 일 떄 True, 숫자는 1이 된다. 이것은 (4,1) 을 가리킨다.

qu의 두번째 대괄호 속의 dot[1]>0 또한 '양수' 일 때 True, 숫자는 1이 된다. 이것은 1을 가리킨다.

둘 다 반대 '음수' 라면 숫자는 반대를 가리키게 되며 이것은 4사분면의 경우에 모두 적용될 수 있다.

 

< 최댓값 만들기(1) >

1. 나의 풀이

def solution(numbers):
    numbers.sort()
    return numbers[len(numbers)-1]*numbers[len(numbers)-2]

2. 팀원과 나의 풀이 수정

def solution(numbers):
    numbers.sort()
    return numbers[-1]*numbers[-2]

sort함수를 사용해서 맨 뒤의 2개 숫자를 곱하는 식을 완성하였는데, 이것을 구지 length로 하지 않고 음수를 활용할 수 있었다.

3. 배운 점

1) sort() 는 list에 사용 가능한 method이다. 

num_sort = numbers.sort()
print(num_sort) #None

이렇게 새로운 변수로 선언하게 되면 내가 기대하는 결과는 numbers 리스트를 sort한 결과이지만 파이썬은 sort()를 하는 방식을 print해라 라고 알아듣는다. 따라서 sort 함수는 배열 자체를 바꾸어 그 배열을 출력하면 된다.

 

2) sorted(배열) 처럼 괄호 안에 무언가가 들어간다면? 이것은 내장함수이다. 

num_sorted = sorted(numbers)
print(num_sorted)

sorted는 sort처럼 배열을 그대로 바꾸는 것이 아니라, 새로운 배열을 바꿔주며 기존 배열은 유지된다.

내장함수 사용은 문제풀이에서는 지양하는 것이 좋다. (공간복잡도에서 취약하다)

< 문자열 정렬하기(1) >

1. 나의 풀이

for i in my_string:
	if i.isalpha() == False:
		answer.append(int(i))
		answer.sort()
    print(answer)

이 문제를 풀 때 어려웠던 점은, string에 무작위로 글자와 숫자가 섞여있다는 것이었다. 'hi12392' 안에서는 숫자도, 문자도 모두 문자열이니까 이것을 어떻게 가려야 할지 굉장히 어렵게 느껴졌다. 하지만 팀원분이 method를 사용해보라는 힌트를 주셔서 여러가지를 사용해보고 풀이를 하게 되었다. print(dir()) 을 생활화하자!

 

< 중복된 문자 제거 >

1. 나의 풀이

def solution(my_string):
    answer = ''
    for i in my_string:
        if i not in answer:
            answer += i
    return answer

my_string에서 글자를 하나씩 꺼내 answer에 더해준다. 이 때 answer에 들어있는 글자는 더하지 않기 위해서 not in을 사용한 간단한 풀이방법이다.

2. 다른사람의 풀이

def solution(my_string):
    return ''.join(dict.fromkeys(my_string))

dict.fromkeys는 딕셔너리를 생성해주는 함수라고 한다. key값은 고유한 값이기 때문에 이를 이용한 것 같다. 다른 풀이에서 사용해보고 나서 자세한 사용 방법을 적어봐야겠다.

Comments