알고리즘 스터디 정리
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])
|
마무리
사실 이번에 풀었던 문제들은 이미 한 번씩 풀어본 문제들이였다. 그래서 그런지 푸는 문제들이 어렵지는 않았지만 저번과 비교해서 나아진 코드가 있는 반면 오히려 별로였던 코드들도 있어서 그런 부분들은 다시 공부해야겠다는 생각이 들었다.