코딩테스트

코테 스터디 23번째 TIL : 숫자 문제 풀이

hex2.1 2024. 9. 30. 12:53

 

  • 문제
https://www.acmicpc.net/problem/1181

 

 

 

  • 코드
n = int(input())
a = []

for i in range(n):
    word = input()
    # 중복된 단어가 아닐 경우에만 리스트에 추가
    if word not in [w[0] for w in a]:  # 리스트의 첫 번째 요소를 기준으로 확인
        a.append((word, len(word)))

# 길이로 정렬하고, 길이가 같으면 단어의 사전 순서로 정렬
a.sort(key=lambda x: (x[1], x[0]))

# 결과 출력
for i in range(len(a)):
    print(a[i][0])

 

 

  • 설명 및 개념

 

💡 a.sort( key= lambda x : ( x[1], x[0] )) : 다음을 통해서 튜플 값을 가지는 a 리스트를 두번째 값을 기준으로 오름차순 정리한다 . 그런데 값이 같은 경우는 첫번째 값을 기준으로 정렬한다 

  •  

💡 if word not in [ w[0] for w in a ]: : 다음을 통해서 a리스트의 

 

  • 그 외의 알아두면 좋은 개념

 

💡 sorted(list) 

  • 리스트 뿐만 아니라 모든 반복 가능한 객체를 정렬할 수 있다.
  • 새로운 정렬된 리스트를 반환한다. 즉, 원래의 리스트는 변경되지 않고, 정렬된 복사본을 반환한다
  • 사용법 : sorted(iterable, key=None, reverse=False)
    • reverserk True인 경우 내림차순으로 정렬한다 

💡 list.sort()

  • 리스트에서만 사용할 수 있는 메소드 

💡 sys.stdin.read : 전체입력을 한꺼번에 읽는다

💡 sys.stdin.readline : 입력을 줄 단위로 처리한다 , 한 줄 씩 처리하거나 반복문을 통해 입력 받는다 

 

 

1초가 걸리는 입력의 크기 **참고

 

 


 

 

  • 문제 - 1
https://www.acmicpc.net/problem/4375

 

 

 

 

  • 코드
import sys

def fineone(n):
    ex=1%n
    lg=1

    while ex!=0:
        ex = (ex*10+1)%n
        lg+=1
        
    return lg
    

for line in sys.stdin:
    n= int(line.strip())
    print(fineone(n))

 

 

  • 설명 및 개념

 

💡 나머지 연산

  • (A+B)%C = (A%C + B%C)%C

💡 for line in sys.stdin: 입력을 줄 단위로 처리하는 방법 , 여러 개의 테스트 케이스를 한꺼번에 입력할 수 있고 입력이 끝날 때 까지 각 줄을 처리할 수 있다 

  • sys.stdin은 여러 줄의 입력을 받을 때 사용되며,  for line in sys.stdin은 입력이 끝날 때까지 각 줄을 line 변수로 받아 처리한다. 

💡 line.strip() : 입력받은 줄에는 보통 줄바꿈 문자가 포함되어있다. strip()은 줄의 양끝에서 불필요한 공백을 제거한다  


 

 

  • 문제 - 약수

https://www.acmicpc.net/problem/1037

 

 

 

  • 코드
n=int(input())
a=list(map(int,input().split()))
print(min(a)*max(a))

 

 

  • 설명 및 개념

 

💡 약수

  • n이라는 수의 약수는 루트 n을 기준으로 약수를 곱하면 n이 나온다. 따라서 진짜 약수의 가장작은 수와 가장 큰수를 곱하면 그 수 가 나온다 

 


 

  • 문제 - 약수의합2

https://www.acmicpc.net/problem/17427

 

 

  • 코드
n=int(input())
cnt=0
for i in range(1,n):
    cnt+=i*(n//i)
    
print(cnt)

 

  • 설명

💡 a라는 약수의 배수들은 모두 a를 약수로 가지는 수 라는 것을 이용한다

  • N이하의 자연수 중에서 1을 약수로 갖는 수의 개수는 N//1개 
  • N이하의 자연수 중에서 2을 약수로 갖는 수의 개수는 N//2개 

 

 

 

 


 

 

  • 문제 - 약수의 합

https://www.acmicpc.net/problem/17425

 

 

 

 

 

 

  • 코드
MAX=1000000
d=[1]*(MAX+1)
s=[0]*(MAX+1)
##d[i] = i의 약수들의 합 
##g(n),  즉 약수들의 합의 누적합을 저장하는 배열
for i in range(2,MAX+1):
    j=1
    while i*j<=MAX:
        d[i*j] += i
        j+=1
## i의 배수인 i*j는 모두 i를 약수로 가지고 있다는 점을 활용, 따라서 
##d[i*j]에 i를 추가한다         

for i in range(1, MAX+1):
    s[i] = s[i-1] + d[i]
## 약수의 합을 s에 누적한다 

t=int(input())
res=[]
for _ in range(t):
    n=int(input())
    res.append(s[n])
print('\n'.join(map(str,res))+'\n')

 

 

 

 

 

  • 설명
  • g[n]을 미리 다 구해놓는 방식으로 풀었다 
  • 약수의 합을 구해서 넣는 방식이 아닌 i의 배수인 i*j는 모두 i를 약수로 가지는 수 라는 것을 이용하여 풀었다