2023.03.23(알고리즘문제풀기)

Vinyl Stage·2023년 3월 23일
1

개발일지

목록 보기
15/42

오늘 풀어본 문제중 기억에 남는 문제

2480번

이 문제는 주사위 세개를 굴리고
같은 값 세개가 나오면 10,000 + (같은눈)1,000
같은 눈이 2개면 1,000+(같은눈)
100
모두 다르면 (가장 큰 눈)*100
이 출력되는 문제다.

처음에는 단순하게 if문을 사용하여 모두 같을때 나오는 조건과 모두 다를때 나오는 조건을 잡고 마지막에 같은 눈2개를 else로 했더니 계속 틀렸었다.

두번째 조건을 하나라도 다르면으로 해석한 것에서 잘못된 판단이었다.

그렇게 다시 짰던 코드

a, b, c = map(int, input().split())

if a == b == c:
    print(10000 + a*1000)
elif a == b or a == c:
    print(1000+a*100)
elif b == c:
    print(1000+b*100)
else:
    print(max(a, b, c)*100)

세 숫자를 공백을 하나씩 두고 입력받아서
if문에서는 모두 같으니 아무 변수나 잡고 print

같은눈 2개는 두 elif로 나누었다
a == b or b == c or a == c라고 쓸 수도 있지만
어떤 눈이 같은 눈인지를 한번 더 고려해야 하기때문에 print에 넣을 조건도 더 길어질 수 있다.

gpt를 활용한 결과 sorted를 사용하면 코드길이를 줄일 수 있었다.

a, b, c = sorted(map(int, input().split()))

if a == c:
    print(10000 + a * 1000)
elif a == b or b == c:
    print(1000 + b * 100)
else:
    print(c * 100)

sorted는 가장 작은숫자부터 큰숫자 순으로 정렬하는 함수로

num = [1, 5, 3, 4, 6, 2, 9]
print(sorted(num))
# 출력 [1, 2, 3, 4, 5, 6, 9]

이런식으로 나오게 되는데

sorted로 입력값을 정렬해준 덕분에 첫줄은 a==c로 묶을 수 있었고 둘째줄은 가장 작은숫자와 중간숫자 혹은 중간숫자 큰숫자로 비교함으로써 elif한줄을 줄였다.
else는 가장 큰 숫자인c로 넣으면 된다.
완전 간단해졌다.

다음은

2439번

입력한 n만큼 *을 출력하는데 그 숫자만큼 줄도 늘어나는 문제이다
근데 이제 오른쪽 정렬로 나와야 한다.
예를들어 5를 입력하면

    *
   **
  ***
 ****
*****

이 덕분에 오른쪽으로 정렬하는 rjust()함수를 알게되었다.

n = int(input())
for i in range(n):
    print(('*'*-~i).rjust(n))

n에 입력받고 i로 리스트를 만들어서 그만큼 갯수를 출력하는데 어제 알게되었던 -~i가 들어있다(뿌듯)
그 돌린 행만큼 .rjust(n)로 해주면 정상적으로 오른쪽정렬이 출력된다.

마지막문제

10951번

두 수를 각 줄에 입력하는데 입력한 만큼 합을 출력해주는 문제이다.
재밌는건 전의 문제에서는 간단하게 for i in range(n)으로 돌려서 몇줄을 할건지, 혹은 while과 if문으로 마지막에 0 0을 입력하면 break하고 끝나는 식으로 해서 그나마 할만했지만 이건 좀 와닿는게 달랐다.

입력을 모두 마치고 빈값을 입력하면 끝나는 형식으로 try except를 사용했다.

while True:
    try:
        a, b = map(int, input().split())
        print(a+b)
    except:
        break

while True를 알게되었다보다는 잘 안써서 까먹고 있었다 ㅎㅎ(물론 바로 직전에 푼 10952번도 while True를 사용함)
그렇게 try로 입력을하고 합을 출력해 주는데 except를 비웠기 때문에 넘어가면 break가 발생되어 끝나게 된다.

그럼 끝

profile
Life is Art

0개의 댓글