본문 바로가기

WIL

WIL 040223

금요일에 알고리즘 수업을 듣다가 혼자 풀어보는 시간에 막혔다.

바로 정답을 들어볼까 했다가 주말에 조금 더 고민해봤다.

 

결론은 문제를 잘못 이해하고 잘못 접근했다.

 

곱하기를 더하기보다 먼저 하는 원래의 연산 순서가 아니라 무조건 왼쪽에서부터 순서대로 계산하는 함수를 만들어야했다.

 

나는 연산 순서는 나중에 생각하고 일단 주어진 숫자들 사이에 더하기 또는 곱하기를 넣는 모든 경우의 수를 다 구해보고 싶었다.

 

여기서부터 잘못됐다.

 

주어진 예시의 숫자 리스트는 길이가 7이었다.

 

연산자가 2가지니까 총 2**(7-1) = 2**6개의 경우의 수가 나오고 이 연산 결과들을 리스트에 append해서 max를 구하면 되겠다고 생각했다.

 

여기까지 하고 막혔다.

 

         + 5 ...

   + 3

          * 5 ...

0

         + 5 ...

    * 3

          * 5 ...     

 

그림으로 그려보려 했지만 2**4부터 이건 아닌 것 같다는 생각이 들었다.

 

결국 혼자 풀지 못한 채 강의 뒷부분을 확인했다.

 

모든 경우의 수를 다 코딩으로 할 필요는 없었다.

 

0과 1은 더하는 연산이 곱하는 것보다 무조건 유리하므로 이 경우엔 곱하기를 아예 코딩하지 않는다.

 

그리고 무조건 왼쪽부터 연산하는게 내가 처음에 생각한 것보다 훨씬 우선되어야한다.

 

더하기 곱하기 넣는 것부터 정하는게 아니라 왼쪽의 숫자부터 0이나 1인지 확인한 후 아니면 무조건 곱하면 최대값이다.

 

항상 해설을 보면 너무 쉬운데 왜 혼자선 못 풀까? ㅜㅠ

 

처음에 내가 생각한 것처럼 푸는 방법은 없는지, 그리고 원래의 연산 규칙으로 푸는건 없는지 검색해봤다.

 

그랬더니 백준 14888 이런 문제가 나왔다.

 

그런데 이 풀이는 더하기, 빼기, 곱하기, 나누기 4가지 연산자가 다 있었고 max와 min을 둘 다 구하는 문제였다.

 

그리고 input 값이 계산할 숫자의 개수, 리스트, 연산자의 개수 이렇게 세가지였다.

 

리스트는 알고리즘 강의의 input으로 넣고 숫자의 개수는 백준 14888에선 직접 입력하게 했는데 len(input)으로 알아서 리스트에 있는 숫자들을 전부 넣게 바꿨다.

 

연산자의 개수는 곱하기와 더하기 연산만 남기고 6 0, 5 1, 4 2, 3 3, ... 등 넣어가며 계산해봤다.

 

강의 정답과 같이 728이 max로 나왔다.

 

global : 변수를 전역 변수로 선언해준다.

for문이나 if문 밖에 k = 0, list_=[]등 먼저 빈 값을 지정해주고 조건이 맞을 때마다 +1씩, 아니면 값을 append 해주는 것과 헷갈렸다.

반복문, 조건문과 상관 없이 함수를 만들 때 전역 변수를 불러올 때 쓰는 거구나.

 

백준 14888 풀이에 그리디 알고리즘을 썼다는 말이 있었다.

알고리즘 강의를 계속 듣다 보면 나올 것 같다.

값을 하나 더해줬다가 나중에 다시 빼서 원상태로 복구하는 부분이 있었는데 그것과 관련된 것 같다.

 

 

 

 

 

'WIL' 카테고리의 다른 글

WIL 042423  (0) 2023.04.24
WIL 041623  (0) 2023.04.16
WIL 040923  (0) 2023.04.10
WIL 032623  (0) 2023.03.26
WIL 031923  (0) 2023.03.19