알고리즘 문제 풀기 - 2

앞으로 이미지 하나씩은 넣어 놓으려고 픽사베이에서 가져옴 ㅋㅋ

 

저번에 구해온 항해99 2주차 알고리즘 이미지를 토대로 링크를 작성했다.

문제 번호 문제 힌트 문제 제목 링크
10869 사칙연산 사칙연산 https://www.acmicpc.net/problem/10869
2588 사칙연산 곱셈 https://www.acmicpc.net/problem/2588
2884 if 문 알람 시계 https://www.acmicpc.net/problem/2884
1110 while 문 더하기 사이클 https://www.acmicpc.net/problem/1110
4344 1차원 배열 평균은 넘겠지 https://www.acmicpc.net/problem/4344
4673 함수 셀프 넘버 https://www.acmicpc.net/problem/4673
1157 문자열 단어 공부 https://www.acmicpc.net/problem/1157
2941 문자열 크로아티아 알파벳 https://www.acmicpc.net/problem/2941
2869 기본수학 1 달팽이는 올라가고 싶다 https://www.acmicpc.net/problem/2869
1929 기본수학 2 소수 구하기 https://www.acmicpc.net/problem/1929
11729 재귀 하노이 탑 이동 순서 https://www.acmicpc.net/problem/11729
11651 정렬 좌표 정렬하기 https://www.acmicpc.net/problem/11651
2805 이분탐색 나무 자르기 https://www.acmicpc.net/problem/2805
4949 스택 균형잡힌 세상 https://www.acmicpc.net/problem/4949
1874 스택 스택 수열 https://www.acmicpc.net/problem/1874
1021 회전하는 큐 https://www.acmicpc.net/problem/1021
2606 DFS와 BFS 바이러스 https://www.acmicpc.net/problem/2606
7576 DFS와 BFS 토마토 https://www.acmicpc.net/problem/7576
1003 동적계획법 피보나치 함수 https://www.acmicpc.net/problem/1003
11053 동적계획법 가장 긴 증가하는 부분 수열 https://www.acmicpc.net/problem/11053

 

 

오늘 풀어볼 문제는 바로

1. 셀프 넘버

함수 문제라고 하던데, 나는 함수를 어떻게 써야 할까 고민해보다가 일단은 내 꼴리는 대로 풀어보기로 했다.

아직 뒤로 14문제가 남았는데 6번째 문제부터 벌써 어떻게 접근해야 할까 고민되기 시작했다.

 

처음에는 숫자 1 부터 하나씩 앞의 수가 있는지 체크하는 방식으로 생각을 해봤는데, 도저히 떠오르는 방법이 없어서 아예 1부터 결과물을 리스트에 저장한 뒤, 숫자 1부터 비교해서 없는 값을 출력하면 되겠다고 생각했다.

 

have_number = [] # 셀프넘버가 아닌 값들
result = 0

for num in range(10000): # 셀프 넘버가 아닌 값들을 찾아보기
    result = num
    string_num = str(num)
    for x in string_num:
        result += int(x) 
        # 61 + 6 + 1 해서 68이 나왔다면 이 68이라는 수는 셀프 넘버가 아닐 것이다

    have_number.append(result) # 셀프 넘버가 아닌 값들 저장

for num in range(10000):
    # 1부터 10000까지 반복하며 have_number에 이 숫자가 있는지 체크
    if num not in have_number:
        print(num) # 없는 숫자만 출력

 

일단 이렇게 짜고 통과하긴 했는데 무식한 방법을 쓴 것 같아 약간 찜찜하다.

자료구조나 알고리즘에 대한 학습을 조금 해봐야 할 것 같다! (옛날에 공부 제대로 해보려다 재미없어서 때려쳤다)

나중에 공부하고 나서 좀 수정하는 과정을 거쳐야 겠다.

+ ) 함수를 어떻게 써야 할지 마지막까지도 떠오르지 않았다. 아 몰랑 통과만 하면 장땡이지

 

2. 단어 공부

위의 셀프 넘버보다는 어떻게 접근해야 할지 빠르게 답이 나왔다.

일단 가장 많은 문자를 찾는 것과, 가장 많은 문자가 여러개 일 경우 '?'표시를 하는 것이 관건이었다.

text = input().upper() # 대문자끼리 비교할 것이므로 모든 문자를 대문자로
count = {}

for x in text: # 모든 문자들의 개수를 계산해서 딕셔너리에 저장
    if (x in count):
        count[x] += 1
    else:
        count[x] = 1

best_key = ''
best_key_count = 0
for x in count: 
    # 저장된 문자들의 개수에서 가장 높은 값을 best_key, best_key_count에 저장함
    if (best_key_count < count[x]):
        best_key = x
        best_key_count = count[x]
    elif (best_key_count == count[x]): 
        # 현재 가장 많은 문자와 동일한 개수를 가진 문자가 있을 경우 문자를 '?'으로 변경
        best_key = '?'

print(best_key)

 

 

시간적으로는 오래 안걸리긴 했는데 벌써부터 어지러우므로 오늘은 여기까지 하고 알고리즘 책을 한번 읽어보기로 했다.

알고리즘 책 내용은 내일 언급하도록 하겠다!

'Algorithm' 카테고리의 다른 글

알고리즘 문제 풀기 - 3  (0) 2022.04.13
알고리즘 문제 풀기 - 1  (0) 2022.04.11

+ Recent posts