level 1. 문자열 다루기 기본

|

level 1. 문자열 다루기 기본

출처

문제

alpha_string46함수는 문자열 s를 매개변수로 입력받습니다. s의 길이가 4혹은 6이고, 숫자로만 구성되있는지 확인해주는 함수를 완성하세요. 예를들어 s가 “a234”이면 False를 리턴하고 “1234”라면 True를 리턴하면 됩니다

풀이 (python)

def alpha_string46(s):
	if len(s) == 4 or len(s) == 6:
		try:
			int(s)
		except ValueError:
			result = False
		else:
			result = True
	else:
		result = False
	return result
# 아래는 테스트로 출력해 보기 위한 코드입니다.
print( alpha_string46("a234") )
print( alpha_string46("1234") )

다른사람 풀이

def alpha_string46(s):
    return s.isdigit() and (len(s) == 4 or len(s) == 6)

배운점

  • 예외처리 (try-except)를 활용했다.
  • String.isdigit() 을 통해서 해당 문자열이 숫자로만 이루어졌는지 확인할 수 있다.
  • 파이썬에서는 논리연산자 &&, || 를 사용할 수 없다. and, or 을 사용한다.

level 1. 문자열 내 마음대로 정렬하기 - Key Functions, __str__, __repr__

|

level 1. 문자열 내 마음대로 정렬하기

출처

문제

strange_sort함수는 strings와 n이라는 매개변수를 받아들입니다. strings는 문자열로 구성된 리스트인데, 각 문자열을 인덱스 n인 글자를 기준으로 정렬하면 됩니다.

예를들어 strings가 [“sun”, “bed”, “car”]이고 n이 1이면 각 단어의 인덱스 1인 문자 u, e ,a를 기준으로 정렬해야 하므로 결과는 [“car”, “bed”, “sun”]이 됩니다. strange_sort함수를 완성해 보세요.

풀이 (python)

def strange_sort(strings, n):
    return sorted(strings, key=lambda element:element[n])

# 아래는 테스트로 출력해 보기 위한 코드입니다.
print( strange_sort(["sun", "bed", "car"], 1) )

배운점

  • sorted() 함수는 정렬된 결과 값을 바로 리턴한다.
  • 대문자는 소문자 보다 우선한다. ([‘A’, ‘a’, ‘ab’])
  • Key Functions
  • sorting 할때 key 값을 기준으로 정렬할 수 있다. 가이드 문서
    • list.sort(), sorted() 둘다 정렬시 비교 기준이 되는 key 파라미터를 가질 수 있다.
# 공백을 기준으로 문자열을 나누어 리스트로 변환한다
# 리스트로 변환시
>>> sorted("This is a test string from Andrew".split(), key=str.lower)
['a', 'Andrew', 'from', 'is', 'string', 'test', 'This']
  • key 파라미터의 값은 하나의 인자를 받고, 정렬 목적을 위한 키를 리턴하는 함수가 되어야 한다.

  • 일반적으로 어떤 객체를 키로 사용하는 복잡한 객체를 정렬할 때 자주 사용된다.

>>> student_tuples = [
...     ('john', 'A', 15),
...     ('jane', 'B', 12),
...     ('dave', 'B', 10),
... ]
>>> sorted(student_tuples, key=lambda student: student[2])   
# sort by age
[('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]
  • 이와 같은 테크닉은 이름표가 있는 속성을 가진 객체에서도 자주 사용된다.
>>> class Student:
...     def __init__(self, name, grade, age):
...         self.name = name
...         self.grade = grade
...         self.age = age
...     def __repr__(self):
...         return repr((self.name, self.grade, self.age))
  • __repr__ 메서드를 정의하지 않으면 object 클래스가 가진 기본 __repr__ 메서드를 사용한다. 이 함수는 클래스 이름과 변수가 위치하고 있는 메모리 주소를 <>안에 써서 반환한다.
  • repr() 은 __repr__ 메소드를 호출하고, str() 이나 print 는 __str__ 메소드를 호출하도록 되어있는데, __str__ 은 객체의 비공식적인(informal) 문자열을 출력할 때 사용하고, __repr__ 은 공식적인(official) 문자열을 출력할 때 사용한다.
  • 쉽게 말하면 __str__ 은 사용자가 보기 쉬운 형태로 보여줄 때 사용하는 것이고, __repr__ 은 시스템(python interpreter)이 해당 객체를 인식할 수 있는 공식적인 문자열로 나타내 줄 때 사용하는 것이다.
>>> student_objects = [
...     Student('john', 'A', 15),
...     Student('jane', 'B', 12),
...     Student('dave', 'B', 10),
... ]
>>> sorted(student_objects, key=lambda student: student.age)   # sort by age
[('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]

level 1. 같은 숫자는 싫어

|

level 1.같은 숫자는 싫어

출처

문제

no_continuous함수는 스트링 s를 매개변수로 입력받습니다.

s의 글자들의 순서를 유지하면서, 글자들 중 연속적으로 나타나는 아이템은 제거된 배열(파이썬은 list)을 리턴하도록 함수를 완성하세요. 예를들어 다음과 같이 동작하면 됩니다.

s가 ‘133303’이라면 [‘1’, ‘3’, ‘0’, ‘3’]를 리턴 s가 ‘47330’이라면 [4, 7, 3, 0]을 리턴

풀이 (python)

1

def no_continuous(s):
    result = []
    for i, v in enumerate(s):
        if i == 0:
            result.append(v)
        elif s[i-1] == v:
            continue
        else:
            result.append(v)
    return result
# 아래는 테스트로 출력해 보기 위한 코드입니다.
print( no_continuous( "133303" ))

2

list comprehension을 활용하여 코드 길이를 줄였다.

def no_continuous(s):
    # 함수를 완성하세요
	return [v for i, v in enumerate(s) if i==0 or s[i-1] != s[i]]

# 아래는 테스트로 출력해 보기 위한 코드입니다.
print( no_continuous( "133303" ))

배운점

  • enumerate() : 순서가 있는 자료형 (리스트, 튜플, 문자열)을 입력으로 받아 인텍스 값을 포함하는 enumerate 객체를 리턴한다.

level 1. 수박수박수박수박수박수? (java, python)

|

level 1. 수박수박수박수박수박수?

출처

문제

water_melon함수는 정수 n을 매개변수로 입력받습니다. 길이가 n이고, 수박수박수…와 같은 패턴을 유지하는 문자열을 리턴하도록 함수를 완성하세요.

예를들어 n이 4이면 ‘수박수박’을 리턴하고 3이라면 ‘수박수’를 리턴하면 됩니다.

풀이 (python)

def water_melon(n):
    return ("수박"*n)[:n]

# 실행을 위한 테스트코드입니다.
print("n이 3인 경우: " + water_melon(3));
print("n이 4인 경우: " + water_melon(4));

풀이 (java)

public class WaterMelon {
	public String watermelon(int n){
    String result="";

		for(int i=1; i<n+1; i++){
      result += (i % 2 == 1)? "수" : "박";
			}
    return result;
	}

	// 실행을 위한 테스트코드입니다.
	public static void  main(String[] args){
		WaterMelon wm = new WaterMelon();
		System.out.println("n이 3인 경우: " + wm.watermelon(3));
		System.out.println("n이 4인 경우: " + wm.watermelon(4));
	}
}

다른사람 풀이(java)

public class WaterMelon {
    public String watermelon(int n){
        StringBuffer sf = new StringBuffer();
        for (int i=1; i<=n; ++i) {
            sf.append(i%2==1?"수":"박");
        }
        return sf.toString();
    }

    // 실행을 위한 테스트코드입니다.
    public static void  main(String[] args){
        WaterMelon wm = new WaterMelon();
        System.out.println("n이 3인 경우: " + wm.watermelon(3));
        System.out.println("n이 4인 경우: " + wm.watermelon(4));
    }
}
public class WaterMelon {
	public String watermelon(int n){
		String repeated = new String(new char[n]).replace("\0", "수박");
    return repeated.substring(0,n);
	}

	// 실행을 위한 테스트코드입니다.
	public static void  main(String[] args){
		WaterMelon wm = new WaterMelon();
		System.out.println("n이 3인 경우: " + wm.watermelon(3));
		System.out.println("n이 4인 경우: " + wm.watermelon(4));
	}
}

배운점

  • 슬라이싱 기능을 잘 활용하자
  • java 3항 연산자
  • replace 메소드
  • StringBuffer 클래스 (String클래스와 달리 동적 문자열을 처리하는 클래스)
  • toString 메소드

level 1. 자릿수더하기

|

level 1. 자릿수더하기

출처

문제

sum_digit함수는 자연수를 전달 받아서 숫자의 각 자릿수의 합을 구해서 return합니다. 예를들어 number = 123이면 1 + 2 + 3 = 6을 return하면 됩니다. sum_digit함수를 완성해보세요.

풀이 (python)

# 풀이1
def sum_digit(number):
	result = 0
	for i in str(number):
		result += int(i)
	return result

# 풀이2
def sum_digit(number):
  from functools import reduce
  return reduce(lambda x,y:int(x)+int(y), str(number))

# 아래는 테스트로 출력해 보기 위한 코드입니다.
print("결과 : {}".format(sum_digit(123)));


다른사람 풀이

def sum_digit(number):
    return sum([int(i) for i in str(number)])

# map 활용
def sum_digit(number):
    return sum(map(int, str(number)))

배운점

  • for in 반복문은 iterable한 오브젝트만 대상으로 할 수 있다.
  • int()를 통해서 string을 정수로 변환한다.