사실 어제도 공부했어야했는데 못했다…

기분이 안좋다는 이유로ㅠㅠ

며칠 연속 기록 세워보고 싶었는데 아쉽게 되었다.

반성한다.

  1. 1037 약수

    쉬웠는데 20분이나 걸렸다. input하는 동시에 sorted를 먹였는데 제대로 정렬되지 않아서 list자체를 정렬해주는 sort를 따로 써줬다.

     import math
        
     cnt = int(input())
        
     lst = list(map(int, (input().split())))
        
     lst.sort()
        
     if cnt % 2 == 0:
         print(lst[0] * lst[-1])
     else:
         print(int(math.pow(lst[len(lst)//2],2)))
    

    math.pow 함수를 배웠다. pow(밑,지수) 헤헤

    math.sqrt 이건 루트 씌우는거(아마 sqare+root 합성어)

    다른 사람 코드를 보니

    print(li[(n-1)//2]**2)

    ** 두개하면 제곱인가보다. 이게 더 쉽네ㅎㅎ;;

  2. 1259번 펠린드롬수? 거꾸로 해도 이효리 ㅋㅋ

    1234321 이런 수를 말하는군.

    30분 걸린것 같음.

    어렵진 않았는데 막상 풀고 다른 사람 풀이보니 쉬운방식이 3가지나 있었다.

     while True:
         str = input()
         reverse = ''
        
         if str == '0':
             break
         else:
             for i in range(len(str)-1, -1, -1):
                 reverse += str[i]
            
         if reverse == str:
             print('yes')
         else:
             print('no')
    

    1) 난 굳이 range 함수 이용해서 인덱스를 반대로 했는데 그럴 필요 없이.

    reverse = str[I] + reverse 로 했으면 거꾸로 됐다;;

    2) 리스트로 바꾼뒤 리스트의 reverse()함수를 이용해서 거꾸로 해주고 다시 ‘’.join(list) 했으면 거꾸로 가능했다.

    3) 문자열 슬라이싱 할때 마지막에 :-1 , :-2 등의 옵션을 추가하여 역순으로 새로운 문자열을 만들 수 있다.

    ex) str[::-1] → 거꾸로 만든 문자열을 리턴함.

    str[:] 이건 0부터 마지막까지 슬라이싱하라는 의미로 str과 똑같은 문자열을 리턴한다.

    str[::-4]는 역순으로 문자열을 만들되 4개씩 띄엄띄엄 만들라는 뜻

  3. 2163번 초콜릿 쪼개기

    20분 걸림.

    처음에 막막했는데 예시 해보면서 수식 만들려고 노력함.

    sorted 빼도 됨.

     n, m = map(int, sorted(input().split()))
        
     print((n-1) + (m-1)*n)
     '''
     3, 2 -> 5번 가로든 세로든 같음
     4, 2 -> 세로 먼저 : (2-1) + (4-1)*(2) -> 7번
             가로 먼저 : (4-1) + 4번(가로수만큼) -> 7번
        
     100,3 -> 세로 : (3-1) + (100-1)*(3) =  2 + 99*3 = 2 +   297 = 299
             가로 : (100-1) + (3-1)*(100) = 99 + 200 = 297
     '''
    

    근데 다른 사람 푼거 보니까

    이거 규칙이 수식도 있긴한데

    3,2 → 5번

    4,2 → 7번

    100,3 → 299번

    즉 n*m -1 임 그냥 ㅋㅋ

  4. 10798번 세로 읽기

    25분 걸림.

     arr = ['' * 15 for _ in range(5)]
        
     for i in range(5):
         arr[i] = list(input())
        
     for i in range(15):
         for j in range(5):
             if len(arr[j]) <= i:
                 continue 
             else:
                 print(arr[j][i], end = '')
    

    arr[5][15] 를 선언했다고 해도 다음 포문에서 다시 초기화 해주므로 arr[i][15] 를 보장할 수 없음.

    따라서 인덱스 접근 에러가 나는 걸 방지하기 위해

    if len(arr[j]) <= i:
    continue

    를 오랜 고민 끝에 생각해냈는데 나 천재인가?ㅎㅎ

    근데 나보다 더 깔끔하게 짠 사람이 너무 많네^^;;

     a = []
     for _ in range(5):
         a.append(input())
        
     for j in range(15):
         for i in range(5):
             if len(a[i]) > j:
                 print(a[i][j],end="")
    

    문자열을 배열에 append 하면

    [’abcde’, ‘1234546’] 이런식으로 되고 문자열도 인덱스로 접근 가능하므로 굳이 안에 문자열을 나처럼 list로 바꿔서 넣을 필요도 없었군;;

    if else에 continue 조합보단 if 로 저렇게 한줄 처리하는게 간단해보임.

  5. 1032번 파일명이 주어지면 검색 패턴 찾기

    24분 걸림.

    막막했으나 18번 문제랑 좀 비슷해서 접근이 쉬웠음.

    1차원 배열에 문자열 요소를 가져서 2차원 처럼 인덱스 사용해서 접근하면 돼서

     n = int(input())
     arr = []
        
     for _ in range(n):
         arr.append(input())
        
     if n == 1:
         print(arr[0])
     else:
         for i in range(len(arr[0])):
             for j in range(len(arr)-1):
                 if arr[j][i] != arr[j+1][i]:
                     print('?', end='')
                     break
                 else:
                     if j == len(arr)-2:
                         print(arr[j][i], end='')
    

    다른 사람 풀이 보니 기준점을 첫번째 문자열로 잡고 그 문자열로 나머지를 비교하는 방식을 취함.

    비교하다가 틀리면 첫번째 문자열 자체를 인덱스로 접근해서 ‘?’로 바꿔주네. (문자열은 리스트처럼 이런식으로 못바꿔서 아래 코드처럼 문자열 슬라이싱 이용해서 바꿔줘야함)

    이렇게 하면 나처럼 n이 1일 경우를 분기 처리 할 필요도 없군ㅠㅠ

     ans = files[0]
     for i in range(1, n):
         for j in range(len(ans)):
             if ans[j] != files[i][j]:
                 ans = ans[:j] + '?' + ans[j+1:]
        
     print(ans)
    
     ans = list(sys.stdin.readline().strip())
        
     for _ in range(n-1):
         s = list(sys.stdin.readline().strip())
         for i in range(len(s)):
             if ans[i] != s[i]:
                 ans[i] = "?"
        
     print("".join(ans))
    

    두번째 다른 사람의 코드는 위 2개 처럼 문자열을 요소로 가지는게 아니라 elements들도 리스트화 해서 ans[i] = ‘?’을 문자 바꾸는걸 쉽게 함.

    이것도 첫번째 문장이 기준으로 해서 n == 1 인 분기 생략함

  6. 1292번 1223334444 수열 더하기

    20분 걸림

    처음엔 규칙 찾으려고 염병함

    숫자 n이 주어지면 그 n 인덱스에 무슨 값이 있을지를 -1 -2 -3 … 해보면서 규칙을 찾으려고 함 ㅋㅋ

     a, b = map(int, input().split())
        
     arr = []
        
     for i in range(100):
         for _ in range(i):
             arr.append(i)
        
     print(sum(arr[a-1:b]))
    

    그러다가 뭔가 삽질 하는것 같아서 문제를 다시 보니까 1000개 밖에 안되길래 그냥 수열을 만들어서 sum 치면 되겠다고 생각함.

    다른 사람 코드도 좋음

     li=[]
        
     for i in range(b+1):
         for j in range(i):
             if b == len(li):
                 break
             li.append(i)
        
     print(sum(li[a-1:b]))
    

    for I in range(1000)이 될수도 있지만 break 절 때문에 1000을 더할 일은 없는 코드임. 대신에 for문은 1000번 도는 건 맞아서 하드코딩이 없는 대신 비효율적이라고도 볼수 있겠다.

    실제로는 if b == Len(li) 이 즉 list가 7개까지 다 만들어지면 더 append 하지 않고 break 해서 빠져나오기때문에 나 처럼 100 다 만드는것보다 이게 실제로는 더 효율적인 코드임.

  7. 9093번 문자열 거꾸로 출력하기

    9분 걸림.

    16번 문제랑 비슷해서 빨리 풀 수 있었음.

    처음엔 리스트로 바꿔서 reverse 할까 했는데

    그냥 문자열로 입력받으니까 변형 없이 [::-1] 슬라이싱 방식으로 리버스 시킴.

     from sys import stdin
        
     t = int(input())
        
     for _ in range(t):
         li = stdin.readline().rstrip().split()
            
         for i in range(len(li)):
             print(li[i][::-1], end = ' ')
    

    문자열 마지막에 의미 없는 빈 공백이 추가 되도 답이라고 쳐주넹

     for _ in range(N):
         sentences = input().split()
         ans = ""
        
         for word in sentences:
             ans = ans + word[::-1] + " "
        
         print(ans)
    

    나처럼 인덱스로 접근하는것보다 이게 더 파이썬스러운 코드. range 남발하지 말자…