알고리즘 스터디 정리
10952 A+B-5
10952번
| 1
2
3
4
5
6
 | while(1) :
    a,b=map(int,input().split())
    if a==0 and b==0:
        break
    else:
        print(a+b)
 | 
1110 더하기 사이클
1110번
| 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
 | num=int(input())
x=num//10 #십의 자리
y=num%10  #일의 자리
cnt=1
while(1):
    tmp=x+y
    
    if (num//10)==y and (num%10)==(tmp%10):
        print(cnt)
        break
    else:
        x=y
        y=tmp%10
        cnt+=1
 | 
이 문제를 본 순간 몫과 나머지를 이용해 푸는 것이라고 감이 왔는데 단순히 수학문제로 풀기 싫어서 새로 코드를 짜보았다. 막상 다시 짜보니 저번에 짠 코드보다 못한 것 같았긴하였다.. 이번에는 코드 길이가 231B였었는데 저번에는 160B였기 때문이다.
| 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
 | n=int(input())
num=n
count=0
while True:
  n_1=num//10
  n_2=num%10
  n_3=(n_1+n_2)%10
  num=(n_2*10)+n_3
  count=count+1
  if num==n:
    break
print(count)
 | 
2739 구구단
2739번
| 1
2
3
4
5
6
 | n=int(input())
i=1
while(i<10):
    print(n,'*',i,'=',n*i)
    i+=1
 | 
이번 코드는 저번에 짠 코드들보다 길이도 짧고 시간도 적게 걸렸다.
2438 별 찍기-1
2438번
| 1
2
3
4
5
6
 | n=int(input())
i=1
while(i<=n):
    print('*'*i)
    i+=1
 | 
2588 곱셈
2588번
| 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
 | a=int(input()) #472
b=int(input()) #385
num=a*b
while(1):
    q=b//10 #38
    d=b%10 #5
    
    if q<10:
        print(a*d)
        print(a*q)
        break
    else:
        print(a*d)
        b=q
        
print(num)
 | 
저번에 코드를 짰을 때보다 코드가 거의 2배 넘게 길어졌다. 단순히 계산 문제로 풀기 싫어서 while문으도 변형해서 풀어서 그런 것 같다. 그래도 저번보다 시간은 줄어들었다. 참고로 저번에 짠 코드
| 1
2
3
4
5
6
 | a=int(input())
b=int(input())
print(a*(b%10))
print(a*(b%100//10))
print(a*(b//100))
print(a*b)
 | 
1008 A/B
1008번
| 1
2
 | a,b=map(int,input().split())
print(a/b)
 | 
2753 윤년
2753번
| 1
2
3
4
5
6
7
8
9
 | y=int(input())
if y%4==0: 
    if (y%100)!=0 or (y%400)==0:
        print(1)  
    else: 
        print(0)
else: 
    print(0)
 | 
이 문제는 처음에는 틀렸는데 그 이유는 처음에 if문 조건을 줄 때 4의 배수이면서 100의 배수인 경우 아무것도 출력되지 않게 짰었기 때문이다. 
 백준 질문 게시판 ‘이거는 왜 틀렸을까요,,,
| 1
2
3
4
5
6
7
8
9
 | #틀렸던 코드
y=int(input())
if y%4==0:
    if (y%100)!=0 or (y%400)==0:
        print(1)  
    #4의 배수이면서 100의 배수인 경우 아무것도 출력되지 않음
else: 
    print(0)
 | 
14681 사분면 고르기
14681번
| 1
2
3
4
5
6
7
8
9
10
11
 | x=int(input()) 
y=int(input()) 
if x>0 and y>0:
    print(1)
if x<0 and y>0:
    print(2)
if x<0 and y<0:
    print(3)
if x>0 and y<0:
    print(4)
 | 
1065 한수
1065번
| 1
2
3
4
5
6
7
8
9
10
11
12
13
14
 | n=int(input())
cnt=0
if n<100:
    print(n)
else:
    for i in range(100,n+1):
        x=i//100
        y=(i//10)%10
        z=i%10
        if (y-x)==(z-y):
            cnt+=1
        i+=1
    print(99+cnt)
 | 
저번은 문자형 성질을 이용해서 푼 것과 달리 이번에는 몫과 나머지 성질을 이용해서 풀었다. 
 저번에 짠 코드
| 1
2
3
4
5
6
7
8
9
10
11
12
13
 | N=input()
count=99
if int(N)<=99:
  print(int(N))
else:
  for i in range(100,int(N)+1):
    d=str(i)
    d1=int(d[2])-int(d[1])
    d2=int(d[1])-int(d[0])
    if d1==d2:
      count=count+1
  print(count)
 | 
4673 셀프 넘버
4673번
| 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
 | num_list = [i for i in range(1,10001)]
n=1
n_ori=n
while(n<10001):
    num=n
    while(n!=0):
        num+=(n%10)
        n=n//10
    #num=n+(n//10)+(n%10)
    if num in num_list:
        num_list.remove(num)
    n_ori+=1
    n=n_ori
    
for i in num_list:
    print(i)
 | 
저번에 짠 코드
| 1
2
3
4
5
6
7
8
9
10
11
12
13
14
 | all_number=set(range(1,10001))
not_self_number=set()
def sum_number(number):
    fin= sum(map(int,str(number)))
    return fin+i
for i in range(1,10001):
    not_self_number.add(sum_number(i)) 
 
self_number=list(all_number-set(not_self_number))
self_number=sorted(self_number)
for i in range(0,len(self_number)):
    print(self_number[i])
 | 
마무리
사실 이번에 풀었던 문제들은 이미 한 번씩 풀어본 문제들이였다. 그래서 그런지 푸는 문제들이 어렵지는 않았지만 저번과 비교해서 나아진 코드가 있는 반면 오히려 별로였던 코드들도 있어서 그런 부분들은 다시 공부해야겠다는 생각이 들었다.