15일차 문제

양진혁·2021년 11월 15일
0

문제풀이

첫번째 문제는 6kyu 난이도 문제로

"din" => "((("
"recede" => "()()()"
"Success" => ")())())"
"(( @" => "))(("

문자열이 똑같은게 두개이상 반복되면 ")"을 출력하고 아니라면 "(" 을 출력하면 된다.

def duplicate_encode(word):
  emptylist=[]
  word = word.lower()
  for i in word:
    if word.count(i) >=2:
      emptylist.append(")")
    else:
      emptylist.append("(")
  return "".join(emptylist)

먼저 lower를 통해 모두 소문자화 시킨 다음 count()를 사용해서 두개 이상인 경우와 아닌경우를 나눠 문제를 해결했다.

두번째 문제는 6kyu 난이도로

create_phone_number([1, 2, 3, 4, 5, 6, 7, 8, 9, 0]) # => returns "(123) 456-7890"

전화번호를 만드는 문제로 비교적 간단하다.

def create_phone_number(n):
  num = "".join(map(str,n))
  return "("+num[0:3]+") "+num[3:6]+"-"+num[6:]

map과 "".join을 사용해서 n을 문자열로 나열한 후 답을 구했다.

세번째 문제는 4kyu 문제로

array = [[1,2,3],
[4,5,6],
[7,8,9]]
snail(array) #=> [1,2,3,6,9,8,7,4,5]

즉 왼쪽을 시작점으로 시계방향으로 선을 긋는 것이다.

def snail(snail_map):
 emptylist=[]
 while len(snail_map)>0:
   emptylist+= snail_map[0]
   del snail_map[0]
   if len(snail_map)>0:
     for i in snail_map:
       emptylist+=[i[-1]]
       del i[-1]
     if snail_map[-1]:
         emptylist+= snail_map[-1][::-1]  
         del snail_map[-1]
     for i in reversed(snail_map):
         emptylist += [i[0]]
         del i[0]    
 return emptylist

결과 빈 리스트를 만든 후 while문을 통해서 먼저 첫번째 리스트를 추가 한 후 삭제
그 다음 아래로 내려오는 방향을 출력 후 삭제, 그 이후 맨 아래에 위치한 리스트를 역순으로 추가한 후 삭제 그 다음 왼쪽으로 올라간다.
그래서 결국 snail_map 리스트의 길이가 0이 될때까지 반복하는 코드이다.

다음 문제는 5kyu 문제로

last_digit(4, 2)                # returns 6
last_digit(9, 7)                # returns 9
last_digit(10, 10 ** 10)        # returns 0
last_digit(2 ** 200, 2 ** 300)  # returns 6 

처음에는

a = n1 ** n2
return str(a)[-1]

을 사용했지만 숫자의 크기가 커진다면 에러가 뜬다.

그 이후 각 수의 제곱에는 규칙성이 있다는 사실을 확인한 후 문제를 다시 풀었다.

c = {
    0: [0,0,0,0],   
    1: [1,1,1,1],
    2: [2,4,8,6],
    3: [3,9,7,1],
    4: [4,6,4,6], 
    5: [5,5,5,5], 
    6: [6,6,6,6], 
    7: [7,9,3,1], 
    8: [8,4,2,6], 
    9: [9,1,9,1], 
}
def last_digit(n1, n2):
    if n2 == 0:
        return 1
    else:
        num1 = int(str(n1)[-1])
        ci = c[num1]
        return ci[(n2 % 4) - 1]

각 수가 곱해질수록 맨 마지막자리수는 반복이 되므로 n2 0일때는 1을 리턴해주고
그 외에는 n1의 마지막 자리수를 찾은 후 변수 안에 넣어주고 딕셔너리 안에서 값을 찾아서 4의 몫을 찾은 후 시작이 0번째 인덱스에서부터 시작하므로 1을 빼 주었다.

다섯번째 문제는 6kyu 문제로
Write a function that takes an integer as input, and returns the number of bits that are equal to one in the binary representation of that number. You can guarantee that input is non-negative.

Example: The binary representation of 1234 is 10011010010, so the function should return 5 in this case

10진수 숫자를 2진수로 바꾼 후 1의 개수를 리턴하는 함수로 간단한 문제였다.

def count_bits(n):
  return bin(n).count("1")

숫자인 n을 2진수로 바꾸면 문자열로 바뀌기 때문에 count() 안에 문자열 1을 넣어 그 갯수를 리턴하는 함수를 작성했다.

여섯번째 문제는 6kyu

[2, 4, 0, 100, 4, 11, 2602, 36]
Should return: 11 (the only odd number)

[160, 3, 1719, 19, 11, 13, -21]
Should return: 160 (the only even number)

즉 짝수 숫자 중에서 홀수를 찾고 홀수 숫자 중에서는 짝수를 찾아야 한다.

def find_outliser(integers):
  even=[]
  odd = []
  for i in integers:
    ii = abs(i) %2
    if ii == 0:
      even.append(i)
    else:
      odd.append(i)
  if len(str(odd)) > len(str(even)):
    return even[0]
  else:
    return odd[0]

odd와 even의 빈 리스트를 만든 후 i를 절대값으로 바꾼 후 2로 나눈 나머지가 1이면 odd에 0이면 even에 넣어서 odd의 길이가 길면 even을 아니면 odd를 출력하게 했다.

0개의 댓글