Post

알고리즘 스터디1

알고리즘 스터디 정리

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])

마무리


사실 이번에 풀었던 문제들은 이미 한 번씩 풀어본 문제들이였다. 그래서 그런지 푸는 문제들이 어렵지는 않았지만 저번과 비교해서 나아진 코드가 있는 반면 오히려 별로였던 코드들도 있어서 그런 부분들은 다시 공부해야겠다는 생각이 들었다.

This post is licensed under CC BY 4.0 by the author.