[코테]백준 2주차

지윤곽·2021년 1월 20일
0

코테

목록 보기
1/3

2021.1.19 화

1차원 배열

2. 최댓값 - min,max 사용하지 않고 푸는 문제

  • 숫자 크기대로 sort해서 최댓값 찾음 (내장함수 사용 X)
li=[3,29,38,12,57,74,40,85,61]
sequence=[]
num=[]
for seq in range(9):
  input_num=li[seq]
  if seq==0:
    sequence.append(input_num) #숫자를 저장하는 리스트
    num.append(seq+1) # 숫자의 입력 순서를 저장하는 리스트
  else:
    i=0
    for h in range(len(sequence)):
      if sequence[h]<=input_num: #들어온 입력값이 원래있던 수보다 크거나 같은 경우
        i+=1 #왼쪽부터 크기가 큰 경우 +1씩 하다가 작은경우 out (크기순서대로 입력하기 때문에 그 외의 경우는 없다.)
    sequence.insert(i, input_num)
    num.insert(i,seq+1)
print(sequence[-1], num[-1], sep='\n') #가장 큰 입력값의 숫자와 입력 순서를 반환

4. 나머지 - count를 사용하지 않는 문제

  • 딕셔너리 사용해서 중복 개수 count하는 방법
count_dict={}
for i in range(10):
  left_num=a[i]%42
  #입력값의 중복 개수만큼 닥셔너리에 저장하는 코드 ***활용도 많음***
  if left_num not in count_dict.keys():
    count_dict[left_num]=1  
  else:
    count_dict[left_num]+=1 

7. 평균은 넘겠지

  • foramt
format(i/member*100,'2.3f') 
# ex) 40.000과 같이 2-정수개수, .3 - 소수점 아래 개수 제한하는 메쏘드

함수

2. 셀프넘버

ex) 33+3+3 = 39는 셀프넘버가 아님. 셀프넘버가 아닌 수의 리스트를 만들고 그 리스트에 해당하지 않는 모든 수를 반환하는 코드

def self_number(limit):
  all_number=[i+1 for i in range(limit)]
  self_number_li=[]
  for i in all_number:
    one=0
    #셀프넘버가 아닌 모든 수를 계산하는 부분
    for a in range(len(str(i))):
      one+=int(str(i)[a])
    new_number=i+one
    self_number_li.append(new_number) #변수 잘못 설정 : self_number_li는 셀프 넘버가 아닌 수의 리스트
  output=[print(i+1) for i in range(limit) if i+1 not in self_number_li] # 위의 리스트에 있지 않는 limit까지의 모든 수 반환

3. 한수

  • 세자리 이상 수의 한수 판별하는 코드
def output(limit):
  one_number=[]
  for a in range(1,limit+1):
    if len(str(a)) <3: #세자리 숫자 이하인 수는 비교대상이 없으니 등차수열이다.
      one_number.append(a) 
    else:
      one=str(a)
      abstract=[]
      for i in range(len(one)-1):
        first=int(one[i])-int(one[i+1])
        abstract.append(first)
      if abstract.count(first)==len(str(a))-1: # 마지막 출력된 등차의 개수가 주어진 문자열-1과 같다면 등차수열
        one_number.append(a)
  return len(one_number)

문자열

1. 아스키 코드

ord() : 문자열 > 아스키 코드 / chr() : 아스키 코드 > 문자열

3. 알파벳 찾기

str.find('문자열') : str 인덱스 호출

from string import ascii_lowercase  #알파벳 소문자 리스트 자동생성
alpha_list=list(ascii_lowercase)

5. 단어공부

str.lower() / str.upper() : 알파벳 소문자/대문자 반환
sorted_values=sorted(count.items(), key=lambda x:x[1], reverse=True) : value 큰 순서대로 딕셔너리 item sort하는 코드
dic[0][1] : 딕셔너리 첫번째 아이템의 value값 출력

a='z'.lower() #.lower() : 소문자로 만들기
count={}
#해당 문자열 알파벳 개수 딕셔너리 반환
for i in a:
  if i not in count.keys():
    count[i]=1
  else:
    count[i]+=1
values_li=list(count.values()) #dictionary value 값 list로 만들기
sorted_values=sorted(count.items(), key=lambda x:x[1], reverse=True) # value들로 큰값들부터 정렬 ***중요***
if values_li.count(sorted_values[0][1])==1: #value에서 제일 큰값 list에서 개수 찾기
  print(sorted_values[0][0].upper()) #.upper() : 대문자로 만들기
else:
  print('?')# 1이 아니면 유일한 큰값이 아니기 때문에 ? 출력

9. 크로아티아 알파벳

a.find / a.index : 둘다 해당 문자열의 인덱스를 반환하지만 find는 문자열이 없는경우 -1, index는 에러가 뜨게 된다
lstrip / rstrip / strip : 왼쪽부터 해당 문자열 삭제 / 오른쪽부터 해당 문자열 삭제 / 해당 문자열 모두 삭제

string=input()
li=['c=','c-','dz=','d-','lj','nj','s=','z=']
count=0
space=0
for a in li:
  if a in string:
    string=string.replace(a,' ') #string.replace 함수
    count+=1
    space+=1 #문자열을 빼내고 나면 연결되지 않았던 알파벳이 연결되면서 다른 문자열 생성
    #그래서 space를 넣어줘서 일치하는 문자열을 만들지 않게 하고 space 개수만큼 빼줌
print(len(string)+count-space)

10. 그룹단어 체크 시간 오래 걸림

number=int(input())
count=0
for _ in range(number):
  string=input()
  dic={}
  # 각 알파벳의 개수 딕셔너리 생성 #앞에서 했던 방법의 간소화 버전
  for i in string: 
    dic[i]=string.count(i)
  dic_li=list(dic.values())
  if dic_li.count(1)==len(dic_li): #1) 만약 각 알파벳의 개수가 1밖에 없다면 그룹단어
    count+=1
  else: 
    id_li=[]
    for key, values in dic.items():
      num=0
      if values>=2:
        li=[]
        id=0
        for _ in range(values):
          id=string.find(key,id) #개수가 2개 이상인 알파벳의 인덱스 반환 - li에 저장
          li.append(id)
          id+=1
        for h in range(len(li)-1): 
          if li[h]-li[h+1]==-1:
            id_li.append(1) #2)인덱스의 등차수열이 1인 경우는 연속된 알파벳이기 때문에 그룹단어
          else:
            id_li.append(0) #3)인덱스의 차이가 1이 아니면 그룹단어가 아님
    if 0 not in id_li:
      count+=1
print(count)
profile
아는게 힘이다

0개의 댓글