📍1157 ( 단어공부)
1157번: 단어 공부
알파벳 대소문자로 된 단어가 주어지면, 이 단어에서 가장 많이 사용된 알파벳이 무엇인지 알아내는 프로그램을 작성하시오. 단, 대문자와 소문자를 구분하지 않는다.
www.acmicpc.net
import sys
input = sys.stdin.readline
s = str(input()).strip()
s = s.upper()
cnt = []
lst = list(set(s))
for i in lst :
cnt.append((i,s.count(i)))
cnt = sorted(cnt,key=lambda x : x[1],reverse=True)
if len(cnt) > 1:
if cnt[0][1] == cnt[1][1]:
print('?')
else:
print(cnt[0][0])
else:
print(cnt[0][0])
💬 풀이 설명
- 문자열 입력값 받기 : strip()을 안해주면 '\n'이 같이 들어오더라...
- 전부 대문자로 바꿔주기
- 집합 형태의 lst 로 바꿔준 후 문자열에서 각 요소의 갯수를 (문자,갯수) 형태로 저장
- 갯수를 기준으로 내림차순
- 튜플 첫번째 갯수와 두번째 갯수가 같으면 (최댓값이 복수이면) ? 반환 , 아니면 문자 반환
- !!!! 그 전에 튜플 길이를 먼저 체크하여 길이가 1 이상인 경우에만 5번 과정 실행하고 길이가 1인 경우에는 바로 첫번째 문자 반환!! 이거 조건 생각못해서 계속 오류 났음
count말고 직접 문자의 갯수를 세어주는 방식으로도 풀어보았다.
count 단계 대신 딕셔너리 형태로 각 문자의 갯수를 더해주는 방식을 사용했다.
import sys
input = sys.stdin.readline
s = str(input()).strip()
s = s.upper()
cnt = {}
for i in s:
if i not in cnt :
cnt[i] = 1
else:
cnt[i] += 1
res = sorted(list(cnt.items()),key=lambda x:x[1],reverse=True)
if len(res) > 1 :
if res[0][1] == res[1][1]:
print('?')
else:
print(res[0][0])
else:
print(res[0][0])
📍4673 (셀프 넘버)
4673번: 셀프 넘버
셀프 넘버는 1949년 인도 수학자 D.R. Kaprekar가 이름 붙였다. 양의 정수 n에 대해서 d(n)을 n과 n의 각 자리수를 더하는 함수라고 정의하자. 예를 들어, d(75) = 75+7+5 = 87이다. 양의 정수 n이 주어졌을 때,
www.acmicpc.net
이 문제의 핵심은 set 자료형을 응용하는 것이다 . 즉, 집합 연산 중 차집합 연산을 떠올리면 금방 풀리지만 나는 집합 연산을 떠올리지 못해 꽤 시간을 잡아먹었다..
natural_num = set(range(1,10000+1))
generate_num = set()
for i in range(1,10000+1):
for j in str(i):
i += int(j)
generate_num.add(i)
self_num = sorted(natural_num-generate_num)
for i in self_num:
print(i)
💬풀이 설명
- 초기 설정
- 1부터 10000까지 담을 집합을 만들어준다 => n
- 생성자를 담아줄 공집합도 하나 만들어준다 => d(n)
- 1부터 10000까지 반복하며 d(n)을 계산하여 생성자 집합에 넣어준다 (set 자료형이므로 중복 자동 삭제)
- 셀프넘버를 구하기 위해 natural 집합에서 생성자 집합의 차집합을 계산한다.
📍1316 (그룹 단어 체커)
1316번: 그룹 단어 체커
그룹 단어란 단어에 존재하는 모든 문자에 대해서, 각 문자가 연속해서 나타나는 경우만을 말한다. 예를 들면, ccazzzzbb는 c, a, z, b가 모두 연속해서 나타나고, kin도 k, i, n이 연속해서 나타나기 때
www.acmicpc.net
# 그룹단어체커
import sys
input = sys.stdin.readline
N = int(input())
group = 0 # 그룹단어 갯수 카운트
for _ in range(N):
word = str(input()).strip()
check = [word[0]] # 첫번째 글자 미리 넣어 두기
n = 0
# print(f'check : {check}')
# 두번째 글자부터 비교하기
for w in range(1,len(word)) :
# check에 해당 알파벳이 없다면 , check 에 추가하기
if word[w] not in check :
check.append(word[w])
# print(f'if문 check : {check}')
# check에 있다면 바로 앞 글자랑 비교해서 연속인지 확인하기
else:
if word[w-1] != word[w]:
# print(f'{word[w]}가 연속하지 않는 곳에 존재 = group 조건 충족 실패')
n += 1
break
if n == 0 :
group += 1
print(group)
💬 풀이 설명
- check 리스트를 만들어 단어의 첫번째 문자를 넣어둠
- n : 중복이면서 비연속으로 배치된 문자가 있을 경우 카운트 됨 => n == 0 일경우 group 단어 조건 충족
- 문자의 연속성을 체크하기 위해 해당 문자의 바로 앞에 있는 문자와의 일치여부 확인
'🏷️CS > Algorithm' 카테고리의 다른 글
[백준] 1966 (프린터 큐) (2) | 2023.07.26 |
---|---|
[백준] 구현 2941 / 1193 / 2775 (1) | 2023.05.13 |
코테에 사용하기 좋은 라이브러리 기능 (0) | 2023.04.30 |
시간 복잡도 (0) | 2023.04.27 |
[백준] 1253 (좋다) (1) | 2023.03.01 |