모든 프로그래밍 언어를 배우며 아마 입출력을 맨 처음으로 배우지 않을까 생각한다.
System.out.println();
은 대표적인 자바의 출력 명령이고
print()
는 파이썬의 출력 명령이다 (확실히 더 알아듣기가 쉽다.)
내가 어떤 print() 중독인지는 아래 코드를 보면 알 수 있었다.
이 문제를 풀기 위해 내가 쓴 코드는 아래와 같다.
month = int(input())
day = int(input())
if (month==4 or month==6 or month==9 or month==11):
if day==30:
print(month+1)
print(1)
if day!=30:
print(month)
print(day+1)
elif (month==1 or month==3 or month==5 or month==7 or month==8 or month==10 or month==12):
if day==31:
print(month+1)
print(1)
if day!=31:
print(month)
print(day+1)
else:
if day==28:
print(month+1)
print(1)
else:
print(month)
print(day+1)
이번엔 짜놓고도 알았다 이게 최선이 아닐거라는...
(마치 and/or을 자유자재로 쓰지 않고 if만 주구장창 써서 코드가 길어진 모양을 보며
자바에서도 삼항연산자를 제대로 쓰지 않고 if만 길게 나열하여 코드가 길어졌던 것이 기억났다..)
나름 문제점을 분석해봤다
- if문을 나눈 층위의 문제: 나는 달에 일수가 31, 30, 28인 달로 즉 세 가지의 유형을 같은 층위로 분류했다. 하지만 일수가 31인 달과 그렇지 않은 달로 두 개의 큰 층위를 나눈 후, 그렇지 않은 달 속에서 30인달과 그렇지 않은 달로 나누었다면 보기에도 가독성이 좋았을 것이며 2월의 윤달 성질(4년에 한 번씩 29일임)도 고려할 수 있었을 것이다.
- 겹치는 요소가 그 이외에도 너무 많다 : print(month+1)이라든가, print(day+1)은 같은 말이 여러 번 반복되고 있다. 꽤나 의미 없는 반복으로 보여, 이것을 없애고 싶었다.
- += 연산자의 아른거림: 뭔가 day+=1 식으로 작성할 수 있을 것 같은데 print가 있는데 +=를 사용할 수 있던가? 싶었다.
우선 정상 작동되는 것을 확인한 후
문제점을 고려하며 여러가지 다른 시도를 해본 후(잘 안됐다)
숙련 답안을 보았다.
숙련 답안은 아래와 같다.
month = int(input())
day = int(input())
if ((day == 30) and (month == 4 or month == 6 or month == 9 or month == 11)
or (day == 28) and (month == 2)
or (day == 31)):
month += 1
day = 1
else:
day += 1
if month == 13:
month = 1
print(month)
print(day)
- if문을 나눈 층위의 문제: 나는 '~라면' 이라는 가정을 기준으로 나누어 생각했고 숙련답안은 결과적으로 month가 1이 추가될 것인지, day가 1이 추가될 것인지에 더 기준점을 맞추어 식을 작성했다.
- print()문은 맨 마지막에 딱 한 번(각각) 썼다 : 사실 이런 문제에서는 print() 전에 모든 식을 완료하고 최종적으로 떨어지는 값은 맨 마지막에 한번만 출력하면 된다.
- += 연산자: print()를 한 번 적었으니 당연히 위에서 변수가 변하는 과정에서 자연히 쓰였다.
and 연산자와 or 연산자를 사용하며 코드를 줄이는 법과
print()를 줄여 쓰는 법을 조금 더 고민해볼 필요가 있겠다.