Ssa!

백준 알고리즘 단계별)조건문 본문

CS/알고리즘

백준 알고리즘 단계별)조건문

Ssa! 2022. 9. 2. 17:13

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

문제  첫째 줄에 다음 세 가지 중 하나를 출력한다.
  • A가 B보다 큰 경우에는 '>'를 출력한다.
  • A가 B보다 작은 경우에는 '<'를 출력한다.
  • A와 B가 같은 경우에는 '=='를 출력한다
a, b = map(int, input().split())
if a > b:
    print(">")
elif a < b: 
    print("<")
elif a == b:
    print("==")

조건식을 간단하게 쓰는 것이라 쉬웠다!  다른 사람 것도 혹시나 해서 찾아봤는데 삼항 연산자를 이용하여 저렇게 사용할 수 있다는 것이 놀라웠다. 역시 코딩의 세계는 괴물들만 있다. 그래도 덕분에 삼항 연산자 쓰는 방법도 익혀서 좋았다. 

(출력할 값 if 조건식 else 조건식) 그치만그 조건식 안에 또 조건을 쓸 수 있다는 것은 몰라서 새로웠다.

print('>' if a > b else ('<' if a < b else '=='))

 

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

문제
시험 점수를 입력받아 90 ~ 100점은 A, 80 ~ 89점은 B, 70 ~ 79점은 C, 60 ~ 69점은 D, 나머지 점수는 F를 출력하는 프로그램을 작성하시오.
 
입력
첫째 줄에 시험 점수가 주어진다. 시험 점수는 0보다 크거나 같고, 100보다 작거나 같은 정수이다.
 
출력
시험 성적을 출력한다.
a = int(input())
if 90 <= a <= 100:
    print("A")
elif 80 <= a <= 89:
    print("B")
elif 70 <= a <= 79:
    print("C")
elif 60 <= a <= 69:
    print("D")
else:
    print("F")

이것도 조건식 쓰는 연습이였다.   if문을 간단하게 쓰기 위해서 한줄 로 썼다는 것을 볼 수 있다. 

만약 코드가 길다면 이런식으로 되어있으면 가독성이 떨어질텐데. . .어느 기준을 잡아야할지 모르겠다. 

그래서 링크를 찾아봤다.  

좋은 코드란? 

https://jbee.io/etc/what-is-good-code/

a=int(input())
if a>=90: print('A')
elif a>=80: print('B')
elif a>=70: print('C')
elif a>=60: print('D')
else: print('F')

 

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

문제 연도가 주어졌을 때, 윤년이면 1, 아니면 0을 출력하는 프로그램을 작성하시오.
윤년은 연도가 4의 배수이면서, 100의 배수가 아닐 때 또는 400의 배수일 때이다.
예를 들어, 2012년은 4의 배수이면서 100의 배수가 아니라서 윤년이다. 1900년은 100의 배수이고 400의 배수는 아니기 때문에 윤년이 아니다. 하지만, 2000년은 400의 배수이기 때문에 윤년이다.
입력
첫째 줄에 연도가 주어진다. 연도는 1보다 크거나 같고, 4000보다 작거나 같은 자연수이다.
 
출력
첫째 줄에 윤년이면 1, 아니면 0을 출력한다.
a = int(input())
if a % 4 == 0:
    if a % 100 == 0:
        if a % 400 == 0:
            print("1")
        else:
            print("0")
    else:
        print("1")
else:
    print("0")

윤년을 어떻게 계산해야할지 몰라 간단한 순서도를 봤다. 

flow chart

앞으로 알고리즘 풀 때 순서도를  써서 엔지니어 사고방식 대로 풀어야겠다

https://www.diagrams.net/

이 사이트가 순서도를 짤 때 유용할 것 같다. 그치만 잘된 코드를 보니 문제를 읽기 전에 예제를 읽어봤어야 했다. 예제를 그대로 이용한 조건식이 너무 인상깊은 코드여서 좋았다. 

a=int(input())
if a%4==0 and a%100!=0 or a%400==0:
    print(1)
else:
    print(0)

 

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

문제 흔한 수학 문제 중 하나는 주어진 점이 어느 사분면에 속하는지 알아내는 것이다. 사분면은 아래 그림처럼 1부터 4까지 번호를 갖는다. "Quadrant n"은 "제n사분면"이라는 뜻이다.
입력
첫 줄에는 정수 x가 주어진다. (−1000 ≤ x ≤ 1000; x ≠ 0) 다음 줄에는 정수 y가 주어진다. (−1000 ≤ y ≤ 1000; y ≠ 0)
출력
점 (x, y)의 사분면 번호(1, 2, 3, 4 중 하나)를 출력한다.
x = int(input())
y = int(input())

if x > 0:
    if y > 0:
        print("1")
    else:
        print("4")
elif x < 0:
    if y > 0:
        print("2")
    else:
        print("3") 

a4용지에 4분면을 그려 x,y 좌표 대로 조건식을 작성했다!

 

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

문제 상근이는 매일 아침 알람을 듣고 일어난다. 알람을 듣고 바로 일어나면 다행이겠지만, 항상 조금만 더 자려는 마음 때문에 매일 학교를 지각하고 있다.
상근이는 모든 방법을 동원해보았지만, 조금만 더 자려는 마음은 그 어떤 것도 없앨 수가 없었다.
이런 상근이를 불쌍하게 보던, 창영이는 자신이 사용하는 방법을 추천해 주었다.
바로 "45분 일찍 알람 설정하기"이다.
이 방법은 단순하다. 원래 설정되어 있는 알람을 45분 앞서는 시간으로 바꾸는 것이다. 어차피 알람 소리를 들으면, 알람을 끄고 조금 더 잘 것이기 때문이다. 이 방법을 사용하면, 매일 아침 더 잤다는 기분을 느낄 수 있고, 학교도 지각하지 않게 된다.
현재 상근이가 설정한 알람 시각이 주어졌을 때, 창영이의 방법을 사용한다면, 이를 언제로 고쳐야 하는지 구하는 프로그램을 작성하시오.
입력 첫째 줄에 두 정수 H와 M이 주어진다. (0 ≤ H ≤ 23, 0 ≤ M ≤ 59) 그리고 이것은 현재 상근이가 설정한 놓은 알람 시간 H시 M분을 의미한다.
입력 시간은 24시간 표현을 사용한다. 24시간 표현에서 하루의 시작은 0:0(자정)이고, 끝은 23:59(다음날 자정 1분 전)이다. 시간을 나타낼 때, 불필요한 0은 사용하지 않는다.
출력
첫째 줄에 상근이가 창영이의 방법을 사용할 때, 설정해야 하는 알람 시간을 출력한다. (입력과 같은 형태로 출력하면 된다.)
h, m = map(int, input().split())

if (m > 44):
    print(h, m-45)
elif h >= 1 and m <=44 :
    print(h -1,m+15 )
else:
    print(23 ,m+15)

이 문제에서 조금 어려워 헤매게 되었다. 조건식을 작성할 때 우려되는 변수 생각하는게 생각이 잘 안낫다.

앞으로 많은 문제를 풀텐데 조건식의 변수가 생각이 나지 않을까 걱정이 된다. 

시계 알람 조건식 - 1, 분을 기준으로 조건을 짠다. 2. 시간과 분을 나누고 3.0시가 없어져야 하니 23시의 조건식 만든다! 

 

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

문제
첫째 줄에는 현재 시각이 나온다. 현재 시각은 시 A (0 ≤ A ≤ 23) 와 분 B (0 ≤ B ≤ 59)가 정수로 빈칸을 사이에 두고 순서대로 주어진다. 두 번째 줄에는 요리하는 데 필요한 시간 C (0 ≤ C ≤ 1,000)가 분 단위로 주어진다. 
 
입력
첫째 줄에는 현재 시각이 나온다. 현재 시각은 시 A (0 ≤ A ≤ 23) 와 분 B (0 ≤ B ≤ 59)가 정수로 빈칸을 사이에 두고 순서대로 주어진다. 두 번째 줄에는 요리하는 데 필요한 시간 C (0 ≤ C ≤ 1,000)가 분 단위로 주어진다. 
 
출력
첫째 줄에 종료되는 시각의 시와 분을 공백을 사이에 두고 출력한다. (단, 시는 0부터 23까지의 정수, 분은 0부터 59까지의 정수이다. 디지털 시계는 23시 59분에서 1분이 지나면 0시 0분이 된다.)
h, m = map(int, input().split())
t = int(input()) 

h += t // 60
m += t % 60

if m >= 60:
    h += 1
    m -= 60
if h >= 24:
    h -= 24

print(h, m)

시간을 지정하는 변수를 하나 두고 시간을 60분을 기준으로 h,m을 계산한다

파이썬 사칙연산자에서 '//' 는 잘 쓰지 않아서 기억이 안났는데 생각할 수 있는 계기가 되어 좋았다. 

이것도 전 문제와 비슷하게 분을 기준으로 나누고 0시에 대한 23시의 조건식을 만든다

 

알람문제에 대해서 간단하게 작성된 코드가 있을까 하는 것을 찾던 중 (아래 코드는 알람 문제이다)

a,b=map(int,input().split());x=a*60+b-45;print(x//60%24,x%60)

이런식으로 코드가 짜여진 것을 확인했다. 도대체 어떻게 작동하는지도 몰라서 튜터님에게 물으러 가봤더니 이런 식은 가독성이 엄청 떨어지는 코드라 회사 실무를 접하게 되면 욕을 얻어먹는다고 들었다. 백준알고리즘 점수 올리기에는 좋을지 몰라도 저런 코드가 만줄이 되는 코드가 있는데 그 것을 한줄로 작성하면 협업하는데에 다른 팀원들이 이해할 수 있을까라는 말씀을 하셨다. 그러므로 코드를 찾을 때도 무조건 짧은 코드를 찾지말고 가독성이 좋으면서 컴퓨터가 컴파일하는데 걸리는 시간을 최소한 줄일 수 있는 그런 코드를 찾으라고 하셨다. 하지만 지금은 간단한 계산문제의 코드이니 가독성이 좋은(내 마음에 드는)코드를 찾으라고 하셨다.

 

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

문제 1에서부터 6까지의 눈을 가진 3개의 주사위를 던져서 다음과 같은 규칙에 따라 상금을 받는 게임이 있다. 
  1. 같은 눈이 3개가 나오면 10,000원+(같은 눈)×1,000원의 상금을 받게 된다. 
  2. 같은 눈이 2개만 나오는 경우에는 1,000원+(같은 눈)×100원의 상금을 받게 된다. 
  3. 모두 다른 눈이 나오는 경우에는 (그 중 가장 큰 눈)×100원의 상금을 받게 된다.  
예를 들어, 3개의 눈 3, 3, 6이 주어지면 상금은 1,000+3×100으로 계산되어 1,300원을 받게 된다. 또 3개의 눈이 2, 2, 2로 주어지면 10,000+2×1,000 으로 계산되어 12,000원을 받게 된다. 3개의 눈이 6, 2, 5로 주어지면 그중 가장 큰 값이 6이므로 6×100으로 계산되어 600원을 상금으로 받게 된다.
3개 주사위의 나온 눈이 주어질 때, 상금을 계산하는 프로그램을 작성 하시오.
입력
첫째 줄에 3개의 눈이 빈칸을 사이에 두고 각각 주어진다. 
 
출력
첫째 줄에 게임의 상금을 출력 한다.
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)

앞의 시간 계산 문제보다 훨씬 간단했다. 그치만 b ==c의 변수를 넣는 조건문을 빠뜨려서 ㅋㅋ  틀렸다. 조건문에 조건식을 넣는것 엄청 중요한 것 같다.