중복된 값 개수 출력하기
밑에는 잡설이고 가로선 이후 본론입니다.
오랜만에 글쓰게 됐습니다.
요새 학원에서 안드로이드를 배우고 있는데
엄청난 속도로 진도를 나가고 팀플까지 해서 따라가느라 여유가 없다..는....
유튜브의 알고리즘이 알고리즘에 대한 영상으로 안내해줘서 살짝 맛봤습니다.
그동안은 적은 용량을 차지하고, 빠르게 실행되는 코드가 좋은 줄 알았지만,
짧은 코드보단 가독성이 좋은 코드가 좋은 방향이였습니다.
책으로 변수 이름 짓는 방법까지 나온 거 보면요.
막상 해보니 어려워 저도 읽어봐야겠습니다.
팀 프로젝트를 하면서 많은 걸 배웠습니다.
정해져있는 시간, 변수 이름, 깃허브도 써봤습니다.
변수 이름에 1, 2, 3 붙으니 많이 답답하더군요.
코드를 날리면서까지 깃허브를 써본 건 좋았습니다.
역시 직접 써봐야 잘 익혀집니다.
알고리즘을 살짝 맛보면서 실행 속도를 단계로 측정하는 걸 알았습니다.
그래서 이번엔 최대한 단계를 줄인다는 생각으로 코드를 짰습니다.
# 백준 알고리즘 문제 3052
# 두 자연수 A와 B가 있을 때, A%B는 A를 B로 나눈 나머지 이다. 예를 들어, 7, 14, 27, 38을 3으로 나눈 나머지는 1, 2, 0, 2이다.
# 수 10개를 입력받은 뒤, 이를 42로 나눈 나머지를 구한다. 그 다음 서로 다른 값이 몇 개 있는지 출력하는 프로그램을 작성하시오.
# 입력 : 첫째 줄부터 열번째 줄 까지 숫자가 한 줄에 하나씩 주어진다. 이 숫자는 1,000보다 작거나 같고, 음이 아닌 정수이다.
# 출력 : 첫째 줄에, 42로 나누었을 때, 서로 다른 나머지가 몇 개 있는지 출력한다.
ckeck_list = [int(input()) % 42]
answer = 10 # 출력되는 최댓값은 10
for i in range(9):
input_int = int(input()) % 42
if ckeck_list.count(input_int) == 0: # 중복되는 값이 없으면
ckeck_list.append(input_int)
else:
answer -= 1
print(answer)
시간을 줄이기 위해 2가지에 초점을 맞췄습니다.
- 출력되는 값은 1~10 사이이다.
- 최소한의 비교를 한다.
입력은 10번이 있으니 for문을 사용했습니다.
중복되는 값이 없으면 비교를 위해 list에 추가하고,
중복되는 값이 있으면 최댓값에서 -1을 합니다.
결과는 만족스럽게 나왔습니다. 속도는 64ms로 빠르게 나왔고, 다른 코드보다 길지만 가독성을 생각하면 나쁘진 않습니다.
같은 속도에 더 짧은 코드가 있어 살펴보니 대부분 set 함수를 이용했습니다. 이 코드도 마찬가지로 64ms의 속도가 나왔습니다.
answer = set(answer) 이 부분에서 다른 단어로 변수를 정하면 살짝 시간이 길어지던데 왜 그런진 모르겠습니다..
answer = [int(input()) % 42 for i in range(10)]
answer = set(answer)
print(len(answer))
set 함수는 집합을 쉽게 처리하기 위해 만들어진 함수입니다.
특징은
- 중복을 허용하지 않음
- 순서가 없음 (dictionary처럼)
이 중 1번제 특징을 활용해서 중복된 값을 없애준 거 같습니다.
만약 더 많은 입력값이 있었다면 set 함수를 쓰는 게 낫지 않을까 합니다.
이번에 공부한 내용으로 단계가 얼마나 되는지 생각해보면서 코드를 짰습니다. 앞으로도 계속 고민해보면서 틈틈히 연구해볼 예정입니다. 알고리즘 공부도 더 해야겠습니다.
# 참고
# https://www.acmicpc.net/problem/3052
# https://wikidocs.net/1015 (set 함수, 위키독스)
# 다른 분들이 제출한 코드
3052번: 나머지
각 수를 42로 나눈 나머지는 39, 40, 41, 0, 1, 2, 40, 41, 0, 1이다. 서로 다른 값은 6개가 있다.
www.acmicpc.net