Algorithm ⎮ 알린이의 모험 1.

Chris-Yang·2021년 9월 19일
1

Algorithm

목록 보기
1/12
post-thumbnail

> 문제1

▶︎ list 더해서 특정수 나오는 index 반환

two_sum함수에 숫자 리스트와 '특정 수'를 인자로 넘기면, 더해서 '특정 수'가
나오는 index를 배열에 담아 return해 주세요.

nums: 숫자 배열
target: 두 수를 더해서 나올 수 있는 합계
return: 두 수의 index를 가진 숫자 배열

예를 들어,
nums은 [4, 9, 11, 14]
target은 13

nums[0] + nums[1] = 4 + 9 = 13 이죠?

그러면 [0, 1]이 return 되어야 합니다.

target으로 보내는 합계의 조합은 배열 전체 중에 2개 밖에 없다고 가정하겠습니다.


▶︎ 풀이

li = [11, 4, 14, 9]

def two_sum(nums, target):
    for i in range(len(nums)):
      for j in range(i+1,len(nums)):
        if nums[i] + nums[j] == target:
          return [i, j]

two_sum(li, 13)

▶︎ 포인트

2중 반복문을 통해 순차적으로 더해주면서 if문으로 target과 비교.





> 문제2

▶︎ Integer 뒤집기

reverse 함수에 정수인 숫자를 인자로 받습니다.
그 숫자를 뒤집어서 return해주세요.

x: 숫자

return: 뒤집어진 숫자를 반환!

예들 들어,

x: 1234
return: 4321

x: -1234
return: -4321

x: 1230
return: 321


▶︎ 풀이

def reverse(number):
  ## "-"부호를 붙여주면 음수는 양수로, 양수는 음수로 변경된다.
  if number < 0:
    r = int(str(-number)[::-1])
    return -r
  else:
    r = int(str(number)[::-1])
    return r

reverse(-123)

▶︎ 포인트

Integer는 index가 없기 때문에 문자형으로 변경 후 [::-1]로 뒤집어 reverse해 줘야함.

String상태로 음수를 reverse하면 321-와 같은 꼴이 되기 때문에
if문으로 음수를 걸러 -를 붙여 양수로 만들고 reverse한 후
return시 -를 붙여 음수를 반환함.





> 문제3

▶︎ 중복되지 않는 가장 긴 단어의 길이 return

String 형인 str 인자에서 중복되지 않은 알파벳으로 이루어진 제일 긴
단어의 길이를 반환해주세요.

str: 텍스트
return: 중복되지 않은 알파벳 길이 (숫자 반환)

예를 들어,

str = "abcabcabc"
return 은 3
=> 'abc' 가 제일 길기 때문

str = "aaaaa"
return 은 1
=> 'a' 가 제일 길기 때문

str = "sttrg"
return 은 3
=> 'trg' 가 제일 길기 때문


▶︎ 풀이

alphabets = 'abcabcabc'

def get_len_of_str(s):
  length = 0
  str = ""

  for i in s:
    
    # str 변수에 해당 문자가 없으면 넣는다.
    if i not in str:
      str += i

    else:
      # 문자열에 해당 문자가 있으면 str의 길이와 length의 길이를
      # 비교하고 더 긴쪽을 length에 넣는다.
      # 그리고 그 i부터 새로 str에 넣는다.
      if len(str) > length:
        length = len(str)
        str = i
      else:
        str = i

  return max(length, len(str))


get_len_of_str(alphabets)

▶︎ 포인트

비교를 시작한 후 나온적 없는 문자를 저장하는 빈 변수 하나가 필요함. -> str
가장 긴 문자열의 길이를 기록하는 변수가 필요함. -> length

str 변수에 중복되는 문자가 생길 경우 끊고 새로 시작하는 경우를 생각해야함.
가장 긴 문자열이 아닌 문자열의 길이만 리턴하면 되기 때문에
중복문자를 만났을 경우
1. 현재 문자열의 길이와 기존 문자열의 길이를 비교하고 더 긴 쪽이 length 변수에
그 길이가 저장된다.
2. str 변수에 기존 저장된 문자를 삭제하고 중복된 문자를 넣고 다시 반복을 시작한다.

str에 저장된 문자의 길이가 length보다 긴 경우이면서 중복이 없는 상태로
연산이 끝나게 되면 더 짧은 길이의 length가 return되기 때문에
마지막 return부분은 str과 lenght 변수를 비교하여 큰쪽을 반환토록 해야한다.





> 문제4

▶︎

숫자인 num을 인자로 넘겨주면, 뒤집은 모양이 num과 똑같은지 여부를 반환해주세요.

num: 숫자
return: true or false (뒤집은 모양이 num와 똑같은지 여부)

예를 들어,

num = 123
return false
=> 뒤집은 모양이 321 이기 때문

num = 1221
return true
=> 뒤집은 모양이 1221 이기 때문

num = -121
return false
=> 뒤집은 모양이 121- 이기 때문


▶︎ 풀이

def same_reverse(num):
    if num < 0:
      return False
    else:
      a = int(''.join(reversed(str(num))))
      if a == num:
        return True
      else:
        return False

▶︎ 포인트

뒤집은 '모양'이 중점이다.

음수는 뒤집은 경우 무조건 모양이 달라지기 때문에 False.

python은 Integer 자료형을 index로 접근할 수 없기 때문에
String형으로 변경 후 뒤집고 다시 Integer로 변경해야 한다.





> 문제5

▶︎ list에서 공통된 단어 뽑아내기

strs은 단어가 담긴 배열입니다.

공통된 시작 단어(prefix)를 반환해주세요.

예를 들어,

strs = ['start', 'stair', 'step']
return은 'st'

strs = ['start', 'wework', 'today']
return은 ''


▶︎ 풀이

strs1 = ['start', 'stair', 'step', 'sta']

def get_prefix(strs):
  commons = ''

  # sorted로 앞에서 뒤로 갈수록 다른 문자가 정렬되게 된다.
  # 따라서 처음과 끝의 문자간의 차이는 그 이외의 문자들에도 공통으로
  # 적용되기 때문에 처음과 끝 둘끼리만 비교하면 된다.
  sort_strs = sorted(strs) 

  if len(strs) == 0:
    return ''
  else:
    # for문 + range()로 iteration 횟수지정/index값 생성
    for i in range(len(sort_strs[0])):
      
      if sort_strs[0][i] == sort_strs[-1][i]:
        commons += sort_strs[0][i]
      else: 
        # 이곳에 바로 return commons를 하면 문제가 발생한다.
        # 비교 대상이 ['aa', 'aa']인 경우 return 없이 반복문이 끝나기 때문.
        break
      
    return commons

▶︎ 포인트

알파벳 문자열을 담은 list에 sorted함수를 적용하면 a~z순서를 기준으로
list에 정렬이 된다.

['aza', 'abd', 'abc']는 ['abc', 'abd', 'aza']의 순서가 된다.

이 경우 3개의 요소 모두 공통된 글자는 앞머리부터 비교를 시작함을 기준으로
a뿐이고 처음과 끝의 문자만 비교하면 된다.





🌈 작은 회고 🤔

python 문법에 익숙해지는 과정중이라 더 괴로운 시간이었다.

3번과 5번 문제같은 경우는 동료의 풀이를 보고나서야 이해하는 수준이었다.

그래 이해는 했으니 일단 다행이다.

설명을 듣고 알수없는 오기와 자존심이 피어나서 당장 다시 풀어보지 않고

며칠 뒤에 복기하며 풀이를 해 나갔다.

더 잘하고싶다.

조울증이 찾아오려는 것인지 열받는데 동시에 재미도 있다.

코딩 이거 나한테 늘 이런식이다.

묘한 매력이 있다.

지금 감정들을 생각나는대로 쓰고나니 뭔가 싸이코같은 문맥인 것같아
일단 조금 휴식을 취해야겠다는 생각이 든다.

추석 연휴에 예비처가댁에 와서 눈치껏 블로그를 쓰는 중인데
생각보다 기가 많이 빨린다.

profile
sharing all the world

0개의 댓글