본문 바로가기
개발/SWEA (D1) 문제 풀이

SW Expert Academy - 2019. 더블더블(D1)

by v너굴이v 2022. 10. 21.

2019. 더블더블(D1)

출처 - https://swexpertacademy.com/main/code/problem/problemDetail.do?problemLevel=1&contestProbId=AV5QDEX6AqwDFAUq&categoryId=AV5QDEX6AqwDFAUq&categoryType=CODE&problemTitle=&orderBy=FIRST_REG_DATETIME&selectCodeLang=ALL&select-1=1&pageSize=10&pageIndex=2

https://swexpertacademy.com/main/code/problem/problemDetail.do?problemLevel=1&contestProbId=AV5QDEX6AqwDFAUq&categoryId=AV5QDEX6AqwDFAUq&categoryType=CODE&problemTitle=&orderBy=FIRST_REG_DATETIME&selectCodeLang=ALL&select-1=1&pageSize=10&pageIndex=2 

 

SW Expert Academy

SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!

swexpertacademy.com

<나의 풀이>

먼저 문제를 해석해보자.

주어지는 횟수를 변수 T라고 했을때, 1부터 주어진 횟수 T까지 2를 곱한 값(들)을 출력하는 문제이다.

처음에는 생각보다 간단한 문제라고 생각했다.

그 이유는 단순하게 1부터 T까지 각각 2배수한 값을 출력한다고 잘못 생각했기 때문이다.

 

정확하게 다시 이해하자면, 1부터 T횟수만큼 2를 곱하는 문제이다 (제곱)

또한 조건이 있는데, 주어질 숫자가 30을 넘지 않는다는 것이다.

괜히 써놓은 것이 아니기 때문에 문제를 풀 때 꼭 고려해야한다.

 

우선 지난 문제에서 활용했던 range()가 떠올랐다.

근거는 '~까지'이다.

또한 주어진 입출력 케이스를 보면 T가 8일때 2의 0제곱부터 2의 8제곱까지 출력한다는 것을 알 수 있다.

따라서 range()의 start는 0(생략가능), stop은 9(T+1), step은 1(생략가능) 이라고 할 수 있다.

그런데 주어진 예시는 다음과 같다.

T = int(input())
for test_case in range(1, T + 1):

start를 1로 주었다는 것은 for 문에서 제곱의 개념을 활용해서 푸는 것이 아니라는 말이라고 생각된다.

또한 1부터 출력한다면 조건문이나 continue를 사용해야 할까라는 생각도 들었다.

물론 for문 내에서 사칙연산으로 값을 바꿔주는 방법도 있다.

 

단순하게 사칙연산 활용 방법을 사용한다면, 1 -> 1 / 2 -> 2 / 3 -> 4 / 4 -> 8 / 5 -> 16 / ..... / T -> 2^(T-1)

 

아무리 생각해도 제곱이 쉬워보이는데..... 너무 수학(?)적인 접근인가

 

일단 제곱을 해봤다

T = int(input())
for test_case in range(1, T + 1):
   print(test_case**2)

그리고 그 결과 출력은 다음과 같다. (input T = 8)

1
4
9
16
25
36
49
64

이거는 원하는 전개가 아닌듯하다.

이번에는 순서를 바꿔보았다.

T = int(input())
for test_case in range(1, T + 1):
   print(2**test_case)

그리고 그 결과 출력은 다음과 같다. (input T = 8)

2
4
8
16
32
64
128
256

이 결과의 흐름과 비슷한 것 같다.

그런데 어떻게 1이 출력되게 했을까

단순하게 print(1)을 넣었을까?

고민끝에 그냥 range의 시작을 0부터 하기로 했다.(예제를 활용하고 싶었는데 아쉽다)

그러면 결과가 1부터 출력되는데 이제 조건을 추가하면 된다.

말 그대로 조건문을 활용해보자.

T = int(input())
for test_case in range(1, T + 1):
   if T < 30:
      print(2**test_case)

T가 30보다 작을때만 출력하게 조건을 넣었고 그 결과

1
2
4
8
16
32
64
128
256

T가 30보다 작으면 다음과 같이 출력되고, T가 30보다 크면 아무것도 출력되지 않는다(else문을 따로 쓰지 않았기 때문)

 

마지막으로 이 출력값들을 하나의 리스트에 담고 그 리스트 값을 []없이 출력해보자

T = int(input())
S = []
for test_case in range(1, T + 1):
   if T < 30:
      s.append(2**test_case)
print(*S)

>>> 1 2 4 8 16 32 64 128 256

일단 문제는 pass했는데 뭔가 찝찝한 느낌인 것은

1. 주어진 예제 그대로를 활용하지 못함

2. 조건문의 설정 위치 및 else문 누락 등 정확하게 문법을 사용하였는지 의문이 들기 때문

 

혹시라도 피드백해주시는 댓글있으면 정말 감사할듯하다ㅎㅎ

댓글