Ssa!

백준 알고리즘 단계별)반복문 본문

CS/알고리즘

백준 알고리즘 단계별)반복문

Ssa! 2022. 9. 5. 16:30

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

문제
N을 입력받은 뒤, 구구단 N단을 출력하는 프로그램을 작성하시오. 출력 형식에 맞춰서 출력하면 된다.
 
입력
첫째 줄에 N이 주어진다. N은 1보다 크거나 같고, 9보다 작거나 같다.
 
출력
출력형식과 같게 N*1부터 N*9까지 출력한다.
numbers = int(input())
fix= [1, 2, 3, 4, 5, 6, 7, 8, 9]

for i in range(len(fix)):   
    new_fix = list(map(int, fix))
    print(f'{numbers} * {new_fix[i]} = {numbers * new_fix[i]}')

간단한 구구단 ! 고정값을 두고 입력 받은 값을 구구단 시키는 것이다. 저렇게 한번 써보고 복습하려고 다시 써봤는데 다른 형식으로 나와서 놀랬다. 

 

n = int(input())
for i in range(1, 10):
    print(f'{n} * {i} = {n * i}')

내가 작성한 코드라도 모든 문제를 다 기억할 수 없기에 간단하게 작성할 수 있다는 것을 알았다. 변수를 간단하게 썼고 i 값으로 구구단을 돌렸다. 조금씩 내가 성장하고 있다는 느낌을 받았다. 매우 뿌듯했다.

 

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

문제
두 정수 A와 B를 입력받은 다음, A+B를 출력하는 프로그램을 작성하시오.
 
입력 첫째 줄에 테스트 케이스의 개수 T가 주어진다.
각 테스트 케이스는 한 줄로 이루어져 있으며, 각 줄에 A와 B가 주어진다. (0 < A, B < 10)
출력
각 테스트 케이스마다 A+B를 출력한다.
loup = int(input())

for i in range(loup):
    a, b=map(int, input().split())
    print(a + b )

for 문에 대한 값을 돌려 더하기 출력하는 문제였다. 간단하다!

 

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

문제
n이 주어졌을 때, 1부터 n까지 합을 구하는 프로그램을 작성하시오.
 
입력
첫째 줄에 n (1 ≤ n ≤ 10,000)이 주어진다.
 
출력
1부터 n까지 합을 출력한다.
n = int(input())

sum = 0

for i in range(1, n+1):
    sum += i
print(sum)

새로운 사실을 알게되었다 range값을 (1, n+1)까지 범위를 정하여 쓸 수 있다! 매번 알고리즘 문제를 풀 때 마다 모르는 개념을 하나씩 알게될 수 있어서 좋다. 

 

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

문제 준원이는 저번 주에 살면서 처음으로 코스트코를 가 봤다. 정말 멋졌다. 그런데, 몇 개 담지도 않았는데 수상하게 높은 금액이 나오는 것이다! 준원이는 영수증을 보면서 정확하게 계산된 것이 맞는지 확인해보려 한다.
영수증에 적힌,
  • 구매한 각 물건의 가격과 개수
  • 구매한 물건들의 총 금액
을 보고, 구매한 물건의 가격과 개수로 계산한 총 금액이 영수증에 적힌 총 금액과 일치하는지 검사해보자.
입력 첫째 줄에는 영수증에 적힌 총 금액 X가 주어진다.
둘째 줄에는 영수증에 적힌 구매한 물건의 종류의 수 N이 주어진다.
이후 N개의 줄에는 각 물건의 가격 a와 개수 b가 공백을 사이에 두고 주어진다.
출력 구매한 물건의 가격과 개수로 계산한 총 금액이 영수증에 적힌 총 금액과 일치하면 Yes를 출력한다. 일치하지 않는다면 No를 출력한다.
X = int(input())
N = int(input())
c = 0
for i in range(N):
    a, b = map(int, input().split())
    c = c + (a * b)

if X == c:
    print("Yes")
else:
    print("No")

처음으로 for문을 돌려 입력 받은 다음 if문을 쓰는 문제였다! 조건식과 반복문을 혼합하여 쓸 수 있다는 것이 좋았다!

 

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

문제 본격적으로 for문 문제를 풀기 전에 주의해야 할 점이 있다. 입출력 방식이 느리면 여러 줄을 입력받거나 출력할 때 시간초과가 날 수 있다는 점이다.Python을 사용하고 있다면, input 대신 sys.stdin.readline을 사용할 수 있다. 단, 이때는 맨 끝의 개행문자까지 같이 입력받기 때문에 문자열을 저장하고 싶을 경우 .rstrip()을 추가로 해 주는 것이 좋다. 또한 입력과 출력 스트림은 별개이므로, 테스트케이스를 전부 입력받아서 저장한 뒤 전부 출력할 필요는 없다. 테스트케이스를 하나 받은 뒤 하나 출력해도 된다.
입력
첫 줄에 테스트케이스의 개수 T가 주어진다. T는 최대 1,000,000이다. 다음 T줄에는 각각 두 정수 A와 B가 주어진다. A와 B는 1 이상, 1,000 이하이다.
 
출력
각 테스트케이스마다 A+B를 한 줄에 하나씩 순서대로 출력한다.
import sys

number = int(sys.stdin.readline())
for n in range(number):
    a, b =map(int, sys.stdin.readline().split())
    print(a + b)

이 문제에서 처음으로 시간초과라는 것을 알았고 입력값에 따른 함수마다 메모리가 처리하는 시간이 다르다는 것을 알았다. 당분간은 sys를 쓰겠지만 sys는 뒤에 자동으로 개행문자가 붙어서 불편한 감이 없잖아 있다. . . 물론 그러기 위해서 restrip() 을 써주면 되겠지만 말이다

 

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

문제
두 정수 A와 B를 입력받은 다음, A+B를 출력하는 프로그램을 작성하시오.
 
입력 첫째 줄에 테스트 케이스의 개수 T가 주어진다.
각 테스트 케이스는 한 줄로 이루어져 있으며, 각 줄에 A와 B가 주어진다. 
출력
각 테스트 케이스마다 "Case #x: "를 출력한 다음, A+B를 출력한다. 테스트 케이스 번호는 1부터 시작한다.
import sys
n = int(sys.stdin.readline())
for i in range (1, n+1):
    a, b= map(int, sys.stdin.readline().split())
    print(f'Case #{i}: {a+b}')

f string을 써서 값을 넣어 최소한으로 줄였다! 

 

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

문제
두 정수 A와 B를 입력받은 다음, A+B를 출력하는 프로그램을 작성하시오.
 
입력 첫째 줄에 테스트 케이스의 개수 T가 주어진다.
각 테스트 케이스는 한 줄로 이루어져 있으며, 각 줄에 A와 B가 주어진다. 
출력
각 테스트 케이스마다 "Case #x: A + B = C" 형식으로 출력한다. x는 테스트 케이스 번호이고 1부터 시작하며, C는 A+B이다.
import sys
n = int(sys.stdin.readline())
for i in range(1, n+1):
    a, b= map(int, sys.stdin.readline().split())
    print(f'Case #{i}: {a} + {b} = {a+b}')

위 문제와 별 다른 것이 없었다!

 

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

문제
첫째 줄에는 별 1개, 둘째 줄에는 별 2개, N번째 줄에는 별 N개를 찍는 문제
 
입력 첫째 줄에 N(1 ≤ N ≤ 100)이 주어진다.
출력
첫째 줄부터 N번째 줄까지 차례대로 별을 출력한다.
n = int(input())
for i in range(1, n+1):
    print('*' * i)

내가 백준 알고리즘 푼 문제들 중에서 가장 내가 좋아하는 문제이다.

*를 찍는게 얼마나 아름다운 것인가??? 이런 문제가 더 있는지 찾아봤다. 

https://blog.naver.com/nkj2001/222698193629

 

파이썬#56 - 파이썬 별표찍기, for 문 활용법 여러가지 별찍기

프로그래밍을 어느정도 접하고 익숙해진 사람들에겐 if 문이나 for 문이나 사실 특별할게 없는 문법들입니...

blog.naver.com

for문을 완벽하게 마스터하려면 파이썬의 별표찍기 만한것 만큼은 없다고 적혀있어서 나중에 직접 해봐야겠다!!!!!!!!

 

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

문제 첫째 줄에는 별 1개, 둘째 줄에는 별 2개, N번째 줄에는 별 N개를 찍는 문제
하지만, 오른쪽을 기준으로 정렬한 별(예제 참고)을 출력하시오.
입력
첫째 줄에 N(1 ≤ N ≤ 100)이 주어진다.
 
출력
첫째 줄부터 N번째 줄까지 차례대로 별을 출력한다.
import sys
a = int(sys.stdin.readline())
for i in range(1, a+1):  
    print(" " * (a - i), end="") 
    print('*' * i) 

반대로 직각삼각형을 만들기 위해서는 일단 출력값에 보면 공백이 있고 별표가 있다 공백을 먼저작성을 해주고 해당 값에서 i 만큼 빼준 다음 end로 뒤에 출력값과 붙이면 완벽해진다!!!

 

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

문제
정수 N개로 이루어진 수열 A와 정수 X가 주어진다. 이때, A에서 X보다 작은 수를 모두 출력하는 프로그램을 작성하시오.
 
입력 첫째 줄에 N과 X가 주어진다. (1 ≤ N, X ≤ 10,000)
둘째 줄에 수열 A를 이루는 정수 N개가 주어진다. 주어지는 정수는 모두 1보다 크거나 같고, 10,000보다 작거나 같은 정수이다.
출력
X보다 작은 수를 입력받은 순서대로 공백으로 구분해 출력한다. X보다 작은 수는 적어도 하나 존재한다.
n, x=map(int, input().split())
a = list(map(int, input().split()))
for i in range(n):
    if a[i] < x:
        print(a[i])

두번 째의 for문과 if 문의 조합이였다! 

 

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

문제
두 정수 A와 B를 입력받은 다음, A+B를 출력하는 프로그램을 작성하시오.
 
입력 입력은 여러 개의 테스트 케이스로 이루어져 있다.
각 테스트 케이스는 한 줄로 이루어져 있으며, 각 줄에 A와 B가 주어진다. (0 < A, B < 10)
입력의 마지막에는 0 두 개가 들어온다.
출력
각 테스트 케이스마다 A+B를 출력한다.
while True:
    a, b = map(int, input().split())
    if a == b == 0:
     break
    else:
        print(a+b)

파이썬 기초문법에서 while에 관한 문법을 배우지 않았는데 이 알고리즘을 통해 새로운 문법을 알게되었다.

while문의 동작방식과 활용법을 알게되었다!

 

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

문제
두 정수 A와 B를 입력받은 다음, A+B를 출력하는 프로그램을 작성하시오.
 
입력 입력은 여러 개의 테스트 케이스로 이루어져 있다.
각 테스트 케이스는 한 줄로 이루어져 있으며, 각 줄에 A와 B가 주어진다. (0 < A, B < 10)
출력
각 테스트 케이스마다 A+B를 출력한다.
while True:
    try:
        a, b= map(int, input().split())
        print(a + b)       
    except:
        break

처음에 while문을 사용한다는 것은 알았지만 try와 except문을 쓴다는 것을 생각도 하지않은 것이 화근이였다. . .

while문을 break 시킬 수단을 할 수 없어 컴퓨터 cpu가 터질려는 그런 상황이 왔었다 ㅋㅋㅋㅋ

다양한 함수의 조합을 쓸 수 있다는 것이 아직은 익숙하지는 않다.

 

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

문제 0보다 크거나 같고, 99보다 작거나 같은 정수가 주어질 때 다음과 같은 연산을 할 수 있다. 먼저 주어진 수가 10보다 작다면 앞에 0을 붙여 두 자리 수로 만들고, 각 자리의 숫자를 더한다. 그 다음, 주어진 수의 가장 오른쪽 자리 수와 앞에서 구한 합의 가장 오른쪽 자리 수를 이어 붙이면 새로운 수를 만들 수 있다. 다음 예를 보자.
26부터 시작한다. 2+6 = 8이다. 새로운 수는 68이다. 6+8 = 14이다. 새로운 수는 84이다. 8+4 = 12이다. 새로운 수는 42이다. 4+2 = 6이다. 새로운 수는 26이다.
위의 예는 4번만에 원래 수로 돌아올 수 있다. 따라서 26의 사이클의 길이는 4이다.
N이 주어졌을 때, N의 사이클의 길이를 구하는 프로그램을 작성하시오.
입력
첫째 줄에 N이 주어진다. N은 0보다 크거나 같고, 99보다 작거나 같은 정수이다.
 
출력
첫째 줄에 N의 사이클 길이를 출력한다.
n = int(input()) # 68
number = n
cnt = 0
while True:
    a = number // 10 # 6
    b = number % 10 # 8
    c = (a+b) % 10
    number = (10*b) + c
    cnt +=1
    if number == n:
        print(cnt)
        break

어려운 문제다...!!!!몇번이나 고민해서 풀어봤다. 못풀어서 해설도 보았지만 이해가 한번에 가지 않았다.

여러번 복습을 하고 드디어 어느정도 그림을 그려 이해가 갔다.

 앞으로 어려운 문제는 그림으로 이렇게 작성하여 흐름을 기억할 것 같다. 다음에 보면 풀 수 있도록 흐름을 기억하는게 최선의 방법이다!