https://app.codility.com/programmers/lessons/2-arrays/
코딜리티에서 lesson2에 있는 두 문제를 어제 오늘 풀었다.
easy라고 되어 있는데 왜 난 쉽게 풀지 못했는가...
CyclicRotation
주어진 배열 A의 원소들이 K만큼 배열 A안에서 회전을 하는 문제이다.
영어로 되어 있기 때문에 제한 사항을 잘 봐야했는데 나는 제한사항을 제대로 보지 않아서 처음엔 100%가 나오지 않았다.
CyclicRotation 정답 코드
def solution(A, K):
if len(A) > 1 :
for i in range(K) :
a = A.pop()
A.insert(0, a)
return A
처음엔 사실 for문을 어떻게 사용해야할지 감이 안잡혔다. 이중 for문을 돌린다면 분명 시간초과가 뜰 것 같았고 인덱스를 활용하는 방법 또한 마땅한 해결책이 아닌 것 같았다.
그래서 다른 사람들의 코드를 찾아보니 pop이라는 아주 좋은 아이디어가 있었다.
pop은 가장 마지막 원소를 빼주기 때문에 이 원소를 0번째 인덱스에 insert해주면 배열 A의 원소들이 rotation이 된다.
프로그래머스에서도 pop을 이용하여 유용하게 풀었었는데... 다음엔 까먹지 않고 잘 기억해둬야겠다!
처음 시도했을 때 if문 없이 for문으로만 제출했었는데 테스트케이스에서 통과를 하지 못했었다.
위의 그림에서 single 테스트 케이스에서만 통과가 되지 않았었는데,
이는 배열 A의 원소가 없거나 1개만 있을 때를 내가 고려해 주지 않았기 때문에 통과하지 못했던 것이다.
그래서 roatation은 배열 A의 길이가 1보다 클 때 실행되도록 if문을 추가하였더니 문제없이 통과되었다.
Odd Occurrences In Array
이 문제는 배열의 원소 값들이 모두 짝수 개수만큼 이루어져 있는데, 만약 홀수 개수만큼 있는 원소가 있다면 그 원소 값을 출력하는 문제였다.
머리로는 이해했지만 원소들의 값을 어떻게 비교하교 개수를 어떻게 카운트할 것인지 아이디어가 도무지 떠오르지 않았다. for문으로 앞 뒤 원소를 비교하는 방법을 시도 해 봤으나 잘 되지 않았다.
이 역시 다른 사람들의 코드를 찾아보았고 내가 했던 방법처럼 for문으로 앞 뒤 원소 값을 비교한 사람들이 대부분이었는데 collections의 counter를 사용한 코드는 정말 신박했다!
Odd Occurrences In Array 정답 코드
from collections import Counter
def solution(A):
if len(A) == 1 :
return A[0]
else :
counted = Counter(A)
for key, val in counted.items() :
if val % 2 != 0 :
return key
collections의 Counter를 사용하면 배열 내의 해당 원소들의 개수들을 딕셔너리 형태로 반환해준다.
예를 들어 A = [1,1,3,4,5,5] 라면 Counter(A)를 했을 때 key값은 각 원소 값, value는 해당 원소의 개수 형태인 {1:2, 3:1, 4:1, 5:2} 이러한 딕셔너리로 반환해 준다.
정말 좋은 모듈인 것 같아 꼭 기억해두고 원소 개수를 카운트해야할 때 써먹으면 좋을 것 같다!!
딕셔너리.items()를 사용하면 딕셔너리의 키, 값을 모두 반환하므로 for문을 사용하여 val, 즉 해당 원소의 개수가 짝수가 아니면 key값을 반환하도록 했다.
이러면 배열을 정렬할 필요도 없고 불필요한 for문을 쓰지 않아도 돼서 정말 깔끔하고 좋은 코드인 것 같다!!!!
난이도가 쉬움임에도 불구하고 나는 많이 부족하다는 걸 느낀 lesson2였다...