회고
자료구조중 Queue와 Stack에 대한 이해가 더 필요하다고 생각해서 프로그래머스에서 Queue와 Stack과 관련된 문제 풀이를 하고 있지만, 문제 풀이에 Queue와 Stack을 적극적으로 사용하지는 않았다.
이번 문제 풀이는 시간이 많이 들었다. 풀고 나니까 간단하다고 생각이 드는데 코드를 구현하는 당시 이런저런 방법으로 풀어보았지만 좀처럼 되지 않았다.
문제에 대해서 손으로 써가면서 "이런식으로 구현하자" 라는 계획도 세우고 문제를 풀어 보았지만 잘 풀리지 않았다.
다른 사람의 코드를 볼려고도 했지만, 지금까지 한게 너무 아쉬워서 어떻게든 풀려고 하니까 풀려지긴 했다.
코드의 좋고 나쁨을 떠나서 우선 문제를 해결했다는 것이 너무 뿌듯하다.
이제 코드의 좋고 나쁨에 대해서 생각해봐야 하는데.....
사실 아직 잘 모르겠다....
다른 사람들의 코드를 보면서 코드를 이해하는 능력을 향상실킬 필요가 있다는 생각이 든다.
프린터
https://school.programmers.co.kr/learn/courses/30/lessons/42587
def solution(priorities, location):
lst = [] # 우선순위와 실제 우선순위를 갖는 값을 맵핑을 위한 변수
final_lst = [] # 결과값을 담는 변수
# 우선순위와 값을 맵핑해준다.
# (1, "A"), (3,"B"), (2,"C")
for i in range(len(priorities)):
lst.append((priorities[i],chr(i+65)))
# 매개변수로 받은 인덱스에 해당하는 값을 저장해두는 변수이다.
# location = 0이면 target은 0번째 인덱스에 해당하는 "A"가 된다.
target = lst[location]
# lst가 0이 되면 반복문을 탈출하는 코드를 작성했다.
while len(lst) != 0:
# 반복문을 실행하면서 바로 lst의 우선순위 값 중 최대값을 찾는다.
max_num = max(lst)[0]
# 최대값과 lst의 0번째 인덱스의 우선순위값이 같다면, lst에서 0번째 인덱스에 해당하는 값을 pop 뒤 final_lst에 append 해준다.
if max_num == lst[0][0]:
final_lst.append(lst[0])
lst.pop(0)
# 그렇지 않다면 lst의 0번째 인덱스에 해당하는 값을 pop해서 다시 lst에 append 해준다.
else:
lst.append(lst.pop(0))
return final_lst.index(target) + 1
any & all
any와 all은 모두 iterable한 객체를 매개변수로 받는다.
any(iterable object) &all(iterable object)
iterable 객체를 돌면서 조건을 확인 후 True/False를 반환한다.
any의 경우 하나라도 참인 경우 True를 반환한다. any는 or와 같다.
all의 경우 모든 것이 참이어야 True를 반환한다. all은 and와 같다.
any([False, False, False])
False
# 하나라도 True인 경우 True를 반환한다.
any([False, True, False])
True
all([False, True, False])
False
# 모든요소가 True여야지 True를 반환한다.
all([True, True, True])
True
any()는 특히 대소비교를 할 때 사용하면 sort보다 실행시간을 많이 줄일 수 있다.
예를 들어 어떤 수와 어떤 리스트의 원소들을 비교하는데 해당 수가 리스트 안의 max값보다 큰지만 알고 싶다고 하자. 이 때, sort를 사용한 뒤 비교하면 리스트를 모두 정렬하기 때문에 시간이 걸린다.
하지만 any를 쓰면 리스트 내에 해당 수보다 큰 수가 있기만 하면 바로 True를 return하고 끝내기 때문에 시간이 덜 걸린다.
참고