728x90
반응형

프로그램에는 자료형이라는 것이 있습니다. 숫자, 문자열 등 자료의 형태로 사용하는 것을 이야기합니다. 이것은 프로그램의 기본이자 핵심입니다. 자료형을 알지 못하면 프로그램을 짤 수 없으며, 각 언어마다 비슷하지만 조금씩 다른 방식으로 연산을 합니다. 이러한 자료형에 대해 알아보겠습니다.

 

튜플자료형

튜플은 리스트와 유사합니다. 리스트와 다른점은 다음과 같습니다.

  • 튜플은 ()로 둘러싸여있다.
  • 튜플은 값을 바꿀 수 없다.
  • 튜플은 1개의 요소만을 가질때 반드시 요소뒤에 콤마(,)를 부여야 한다. <예> a=(1,) 
  • 괄호를 생략해도 무방하다. <예> a=1,2,3

튜플은 리스트와 유사하지만 구별해서 사용해야합니다. 값을 변화시킬 수 있는지 여부가 큰 차이입니다. 프로그램이 실행되면서 값이 변하지 않기를 바란다거나 바뀔까 걱정하고 싶지 않다면 튜플을 사용하면 됩니다. 근데 실제로 변하지 않는 값을 사용하는 경우는 많지 않습니다.

 

튜플을 이용한 여러가지 예제

튜플은 값을 변화시킬 수 없다는 점을 제외하면 리스트와 동일합니다.

 

[코드]

a = ('a','b',1,2,3)
print("a:",a)
print("a의 3번째 요소는:",a[3])
print("a의 1~2번째 요소는:",a[1:3])

b = ('A','B')
print("b:",b)
print("a+b=",a+b)

print("a*5=", a*5)

print("a의 길이:",len(a))

[출력]

a: ('a', 'b', 1, 2, 3)
a의 3번째 요소는: 2
a의 1~2번째 요소는: ('b', 1)
b: ('A', 'B')
a+b= ('a', 'b', 1, 2, 3, 'A', 'B')
a*5= ('a', 'b', 1, 2, 3, 'a', 'b', 1, 2, 3, 'a', 'b', 1, 2, 3, 'a', 'b', 1, 2, 3, 'a', 'b', 1, 2, 3)
a의 길이: 5

 

728x90
반응형
728x90
반응형

프로그램에는 자료형이라는 것이 있습니다. 숫자, 문자열 등 자료의 형태로 사용하는 것을 이야기합니다. 이것은 프로그램의 기본이자 핵심입니다. 자료형을 알지 못하면 프로그램을 짤 수 없으며, 각 언어마다 비슷하지만 조금씩 다른 방식으로 연산을 합니다. 이러한 자료형에 대해 알아보겠습니다.

 

리스트 자료형

리스트 만들기

리스트는 앞에서 배운 숫자형, 문자형 등의 자료형을 모아서 간단하게 표현할 수 있습니다. 만드는 방법은 아래와 같습니다.

리스트명 = [요소1, 요소2, 요소3,...]

리스트는 비어있는 리스트([])가 있을수 있고, 숫자를 요소값으로 혹은 문자열을 요소값으로 가질수 있습니다. 그리고 숫자와 문자열을 함께 가질 수도 있으며 요소값에 리스트가 들어갈 수도 있습니다.

 

리스트의 인덱싱과 슬라이싱

리스트도 문자열과 같이 인덱싱과 슬라이싱이 가능합니다. 첫번째 요소의 시작은 0부터 시작한다는 것을 알고있으면 이해하기 쉽습니다.

[코드]

a = [1, 2, 3, 4, 5]
print(a)
print("0번째:",a[0])
print("-1번째:",a[-1])

a = [1, 2, 3, 4, 5, ['a','b','c']]
print(a)
print("0번째:",a[0])
print("-1번째:",a[-1])
print("5번째 요소의 1번째:",a[5][1])

[출력]

또한, 슬라이싱도 문자열과 비슷하게 적용이 가능합니다.

[코드]

a = [1, 2, 3, 4, 5]
print(a)
print("0~1번째:",a[0:2])
print("2번까지:",a[:2])
print("2번째부터:",a[2:])

[출력]

리스트의 연산 그리고 수정과 삭제

리스트도 문자열과 같이 +, * 기호를 사용하여 더하거나 반복할 수 있습니다. 그리고 리스트의 값은 수정과 삭제가 가능합니다.

[코드]

# 리스트 연산
a = [1, 2, 3, 4, 5]
b = [6, 7, 8]
print(a+b)
print(a*3)

print("a+b 리스트의 길이:",len(a+b))

# 리스트 수정
a[2] = 10
print("수정후:",a)
# 리스트 삭제
del a[1]
print("a[1]삭제후:",a)
del b[1:]
print("b[1:]삭제후:",b)

[출력]

 

리스트 함수

문자열과 마찬가지로 리스트 자료형에도 리스트 관련 함수를 사용할 수 있습니다. 유용한 몇가지의 함수를 사용해 보도록 하겠습니다.

[코드]

a = [1, 2, 3]
print("a:",a)
print("2의 개수:",a.count(2))
print("추가전:",a)
a.append(10)
print("추가후:",a)
a.insert(1,55)
print("1위치에 55 삽입후:",a)
a.insert(3,-1)
print("3위치에 -1 삽입후:",a)
print()
print("a의 1위치는:",a.index(1)) # index() 함수에서 찾는 값이 없으면 오류발생
print()
b = [10, 8, 3, 6, 1]
print("b:",b)
b.sort()
print("정렬후:",b)
b.reverse()
print("역정렬후:",b)
print()
b.append(3)
print("b:",b)
b.remove(3)
print("3 삭제후:",b) # 첫번째로 나오는 3만 삭제됨

print()
print("a:",a)
print("a배열에서 마지막 요소를 꺼냄:",a.pop())
print("pop이후 a:",a)
print("a배열에서 1 요소를 꺼냄:",a.pop(1))
print("pop이후 a:",a)

print()
a.extend(b)
print("확장:",a)

[출력]

728x90
반응형
728x90
반응형

지난 문자열 자료형(1)에 이어서 문자열 자료형에 대하여 알아보겠습니다.

 

지난 포스트

https://tylee82.tistory.com/357
 

[파이썬][기초] 1.자료형 - 문자열 자료형(1)

프로그램에는 자료형이라는 것이 있습니다. 숫자, 문자열 등 자료의 형태로 사용하는 것을 이야기합니다. 이것은 프로그램의 기본이자 핵심입니다. 자료형을 알지 못하면 프로그

tylee82.tistory.com

 

format 함수를 이용한 포매팅

문자열의 format 함수를 사용하여 앞에서 이용한 포멧코드처럼 사용이 가능합니다.

[코드]

print("{0}년 이다.".format(2021))
print("오늘은 {0}/{1}/{2} 이다.".format(2021, 11, 8))
print("나는 {0} 이고, {1} 이다.".format("개발자", 40))

m = 11
d = "8일"
print("오늘은 {0}월 {1} 이다.".format(m,d))

print("크리스마스는 {a}월 {b} 이다.".format(a=12,b="25일"))
print("신정은 {0}월 {day} 이다.".format(1, day="1일"))

#정렬
print("[{0:<15}]".format("hello"))
print("[{0:>15}]".format("hello"))
print("[{0:^15}]".format("hello"))

#공백채우기
print("[{0:=^15}]".format("hello"))
print("[{0:!<15}]".format("hello"))
print("[{0:#>15}]".format("hello"))

#소수점
print("[{0:0.4f}]".format(3.42151548))
print("[{0:20.4f}]".format(3.42151548))

[출력]

 

f 문자열 포매팅

f 문자열 포매팅 기능은 파이썬 3.6 버전부터 사용이가능하다.

[코드]

number = 1
print(f"number + 2 = {number+2}")

#정렬
print(f'[{"hi":<10}]')
print(f'[{"hi":>10}]')
print(f'[{"hi":^10}]')

#채우기
print(f'[{"hi":#^10}]')

#소수점
x = 1.235488456
print(f"{x:0.4f}")

[출력]

 

문자열 관련 함수

문자열 자료형은 자체적인 함수를 가지고 있습니다. 이것을 내장함수라 하는데, 문자열을 다루는데 꼭 알고 있어야 하는 부분입니다.

[코드]


a = "ABCDEFBBCDSETGR"
print("B의 개수 : ",a.count('B'))

b = "Python good!!"
print("find o의 위치 : ",b.find('o'))
print("find z의 위치 : ",b.find('z'))

print("index o의 위치 : ",b.index('o'))
#print("index z의 위치 : ",b.index('z'))  <-- index는 찾는 문자가 없으면 에러가 난다

print(",".join(["ABC","DEF","GHI"]))
print("abc".upper())
print("ABC".lower())
print("   [공백 지우기]   ".lstrip())
print("   [공백 지우기]   ".rstrip())
print("   [공백 지우기]   ".strip())

print("ABC DEF GHI".replace("AB","yx"))

print("ABC DEF GHI".split())
print("ABC:DEF:GHI".split(':'))

[출력]

728x90
반응형
728x90
반응형

프로그램에는 자료형이라는 것이 있습니다. 숫자, 문자열 등 자료의 형태로 사용하는 것을 이야기합니다. 이것은 프로그램의 기본이자 핵심입니다. 자료형을 알지 못하면 프로그램을 짤 수 없으며, 각 언어마다 비슷하지만 조금씩 다른 방식으로 연산을 합니다. 이러한 자료형에 대해 알아보겠습니다.

 

문자열 자료형

문자열(String)이란 문자, 단어 등으로 구성된 집합을 의미합니다. 예를 들어, "파이썬은 쉽다", "123", "a" 와 같이 큰따옴료로 둘러싸여 있는 것입니다.

 

문자열 만들기

문자열을 만드는 방법은 아래와 같습니다.

[코드]

# 큰따옴표로 사용하기
a = "파이썬은 쉽다."
print("a:",a)

# 작은따옴표로 사용하기
b = '파이썬은 쉽다'
print("b:",b)
bb = '파이썬은 "쉽다"라고 생각합니다.'
print("bb:",bb)

# 큰따움표 3개를 연속으로 사용하기
c = """파이썬은 쉽다"""
print("c:",c)
cc = """파이썬은
엄청
쉽다.
"""
print("cc:", cc)

# 작은따움표 3개를 연속으로 사용하기
d = '''파이썬은 쉽다'''
print("d:", d)
dd = '''파이썬은 
쉽지만
강력하다.
'''
print("dd:",dd)

[출력]

문자열의 연산

파이썬에서는 문자열을 더하거나 곱할 수 있습니다. 이부분은 다른 언어와 조금 다릅니다. 문자열을 더하거나 곱하는 방식으로 두 문자열을 붙이거나 늘릴수 있습니다.

[코드]

# 문자열 더하기
a = "파이썬"
b = "재미있다."
print( a + " " + b)

# 문자열 곱하기
c = "파이썬"
print(c*2)

# 곱하기 응용
print("="*50)
print("파이썬은 재밌다.")
print("="*50)

[출력]

 

문자열 인덱싱과 슬라이싱

인덱싱이란 무엇인가를 "가르킨다" 이고, 슬라이싱은 무엇인가를 "잘라낸다"는 의미입니다. 대부분의 언어들이 그렇겠지만 문자열의 첫번째 글자를 사용하기 위해 인덱싱을 할때는 0부터 숫자를 세고 있습니다. 인덱싱과 슬라이싱을 이용하여 문자열을 아래와 같이 자르고 붙일 수 있습니다.

[코드]

#ABCDEFGHIJKLMNOPQRSTUVWXYZ
#0         1         2
#01234567890123456789012345
a = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"

# 인덱싱싱
print(a[0])
print(a[0]+a[5]+a[10]+a[15])
print(a[0:10])  # 0 <= a < 10
print(a[:10])
print(a[5:15])
print(a[10:])

print(a[-1])
print(a[-5])
print(a[10:-1])

[출력]

문자열 포메팅

문자열의 포메팅은 문자열 안에 어떤 값을 삽입하는 방법입니다. 아래의 내용으로 확인할 수 있습니다. 대입해서 사용하기 위해서는 포맷 코드를 알아야 하는데 포맷 코드는 아래와 같습니다.

  • %s : 문자열(String)
  • %c : 문자 1개(char)
  • %d : 정수(int)
  • %f : 부동소수(float)
  • %o : 8진수
  • %x : 16진수
  • %% : 문자 % 자체

[코드]

# 숫자 대입
print("나는 %d살 입니다." % 40)
age = 40
print("나는 %d살 입니다." % age)

# 문자열 대입
print("많이 %s를 먹었네요." % "나이")

# 2개를 대입하여 사용
print("%s는 많지만 그래도 하고싶은 것이 많은 %d대 입니다." % ("나이",40))

# %문자 출력과 부동소수 입력비교
print("나의 체지방율은 %d%% 입니다." % 33.4)
print("나의 체지방율은 %f%% 입니다." % 33.4)
print("나의 체지방율은 %s%% 입니다." % 33.4)

[출력]

포맷 코드와 숫자 함께 사용하기

포맷코드를 숫자와 함께사용 하면 어떻게 되는지 알아보겠습니다.

[코드]

print("[%10s]" % "파이썬")
print("[%-10s]" % "파이썬")

print("[%0.4f]" % 3.82364933234)
print("[%10.4f]" % 3.82364933234)
print("[%-10.4f]" % 3.82364933234)

[출력]

 

문자열 자료형에 대해서는 다음 포스팅에 이어서 작성하도록 하겠습니다.

728x90
반응형
728x90
반응형

프로그램에는 자료형이라는 것이 있습니다. 숫자, 문자열 등 자료의 형태로 사용하는 것을 이야기합니다. 이것은 프로그램의 기본이자 핵심입니다. 자료형을 알지 못하면 프로그램을 짤 수 없으며, 각 언어마다 비슷하지만 조금씩 다른 방식으로 연산을 합니다. 이러한 자료형에 대해 알아보겠습니다.

 

숫자형

첫번째로 보아야 할 자료형은 바로 숫자형입니다. 숫자 형태로 이루어진 자료형을 말합니다. 숫자형에는 정수형, 실수형, 8진수와 16진수 등이 있습니다. 그리고 이것을 연산하는 방법이 있는데 그것을 살펴 보도록 하겠습니다.

 

정수형

정수를 뜻하는 자료형을 말합니다. 양의 정수, 음의 정수, 0 등이 있을 것입니다. (정수 : 수학에서 정수는 양의 정수, 음의 정수 및 0으로 이루어진 수의 체계이다. 또는 자연수, 자연수의 음수 및 영을 통칭하는 말이다. )

파이썬에서는 아래와 같이 숫자를 변수에 대입할 수 있습니다.

아래 코드에서 print는 화면에 출력을 위한 함수입니다. 

[코드]

a = 123
print(a)

b = -345
print(b)

c = 0
print(c)

[출력]

실수형

파이썬에서 실수형은 소수점이 포함된 숫자를 이야기합니다. 정수형과 같이 아래와 같이 프로그램하여 화면에 출력해보도록 하겠습니다. 

입력은 우리가 실생활에서 사용하는 방식과 컴퓨터에서 사용하는 지수방식으로 넣어보겠습니다.

[코드]

a = 11.1234
print(a)

b = -3.45
print(b)

c = 3.2E3
print(c)

d = 3.2e-3
print(d)

[출력]

8진수와 16진수

8진수(Octal)를 만들기 위해서 파이썬에서는 8진수의 영어의 알파벳O를 이용하여 0o 또는 0O 로 시작하면 된다. 16진수(Hexadecimal)는 8진수와 비슷하게 0x로 시작하면 된다.

[코드]

a = 0o23
print(a)

b = 0O23
print(b)

c = 0x4e
print(c)

[출력]

 

숫자형을 활용한 연산

위에서 알아본 숫자형을 이용하여 다양한 연산을 하여 계산을 할 수 있다.

[코드]

a = 1
b = 2
print("=사칙연산===============")
c = a + b   #덧셈
print(c)
print(c-a)  #뺄셈

d = a * b  #곱셈
print(d)


print("=제곱을 나타내는 연산자 ** 연산자===============")
e = b ** c #제곱을 나타내는 연산자 ** 연산자
print(e)

#나눗셈 후 나머지를 반환하는 % 연산자
print("=나눗셈 후 나머지를 반환하는 % 연산자===============")
print(7 % 3)
print(3 % 7)

#나눗셈 후 몫을 반환하는 // 연산자
print("=나눗셈 후 몫을 반환하는 // 연산자===============")
print(7 // 3)

# TEST
print("=============TEST=============")
print(7 / 4)
print(7 // 4)
print(7 % 4)

[출력]

 

728x90
반응형
728x90
반응형

 

파이썬 마스터 1급 2급 2021년 마지막 시험이 다음주로 다가왔습니다. 지난번 2급에 이어서 1급을 취득하기 위하여 늦게 공부를 시작했습니다. 관련 서적을 처음부터 한번 보는 것은 기본이고, 1급과 2급의 차이를 확인해 봐야겠습니다. 아래는 KAIT 사이트에 나온 출제 기준입니다.

 

1급에 추가된 부분을 보면 문법으로 클래스, 모듈과 패키지, 예외처리, 파일 데이터 읽기, 쓰기, 알고리즘 정렬, 알고리즘 검색 등이 있습니다. 그외에 부분은 2급과 비슷하거나 난이도가 좀 높을것으로 조심히 예상됩니다.

 

조금더 정확한 시험에대한 내용은 아래와 같습니다. 1급에서 추가되는 내용에 대하여 빨간박스를 쳐두었습니다.

지난번 시험에서 100점으로 합격을 하였지만, 자만하지 말고 이번 시험을 준비해야할 것 같습니다. 파이썬에 대한 두려움은 없지만 시험 공포증이 해가 가면 갈수록 심해져서 그게 걱정입니다. 이러한 걱정때문에 스트레스가 쌓이지만 이로 인해 다시한번 기본기를 다지는 좋은 연습이 되기도 합니다. 

 

회사의 고과정책때문에 자격증 개수를 늘리려 일부러 2급을 취득해 두었지만, 그때 1급을 바로 취득했었더라면 하는 후회가 있긴합니다. 저에게 시험은 항상 공포니까요. (시험없는 세상에서 살고 싶습니다. ㅜㅜ)

 

블로그에 앞으로 공부하는 내용을 하나씩 올려볼까 합니다. 저도 다시한번 기본을 수 있을거라 생각이 되기때문입니다. 

모두 남은 시간동안 열심히 공부합시다.

728x90
반응형
728x90
반응형

베스트앨범 - 3Level

문제설명

스트리밍 사이트에서 장르 별로 가장 많이 재생된 노래를 두 개씩 모아 베스트 앨범을 출시하려 합니다. 노래는 고유 번호로 구분하며, 노래를 수록하는 기준은 다음과 같습니다.

  1. 속한 노래가 많이 재생된 장르를 먼저 수록합니다.
  2. 장르 내에서 많이 재생된 노래를 먼저 수록합니다.
  3. 장르 내에서 재생 횟수가 같은 노래 중에서는 고유 번호가 낮은 노래를 먼저 수록합니다.

노래의 장르를 나타내는 문자열 배열 genres와 노래별 재생 횟수를 나타내는 정수 배열 plays가 주어질 때, 베스트 앨범에 들어갈 노래의 고유 번호를 순서대로 return 하도록 solution 함수를 완성하세요.

 

제한사항

  • genres[i]는 고유번호가 i인 노래의 장르입니다.
  • plays[i]는 고유번호가 i인 노래가 재생된 횟수입니다.
  • genres와 plays의 길이는 같으며, 이는 1 이상 10,000 이하입니다.
  • 장르 종류는 100개 미만입니다.
  • 장르에 속한 곡이 하나라면, 하나의 곡만 선택합니다.
  • 모든 장르는 재생된 횟수가 다릅니다.

입출력 예

입출력 예 설명

classic 장르는 1,450회 재생되었으며, classic 노래는 다음과 같습니다.

  • 고유 번호 3: 800회 재생
  • 고유 번호 0: 500회 재생
  • 고유 번호 2: 150회 재생

pop 장르는 3,100회 재생되었으며, pop 노래는 다음과 같습니다.

  • 고유 번호 4: 2,500회 재생
  • 고유 번호 1: 600회 재생

따라서 pop 장르의 [4, 1]번 노래를 먼저, classic 장르의 [3, 0]번 노래를 그다음에 수록합니다.

 

풀이

해당 문제는 HashMap 정렬을 이용하여 풀었는데, 생각보다 처리 시간이 많이 나옵니다. 다른 방법이 있는지 조금 더 생각할 필요가 있을것 같습니다.

저는 일단 각 장르의 재생횟수가 많은 것을 기준으로 정렬을 하였고, 해당 장르의 고유번호, 재생횟수를 가지는 Music이라는 객체를 만들어 제가 정의한 정렬기준으로 정렬하여 PriorityQueue 를 이용하여 풀었습니다. 아무래도 이중 루프를 돌다보니 시간이 걸리는 것 같습니다.

import java.util.*;
import java.util.Map.*;

class Solution {
    
    public static class Music implements Comparable<Music>{
        int music_num;
        int plays_cnt;
        
        Music(int a, int b){
            this.music_num = a;
            this.plays_cnt = b;
        }
        
        @Override
        public int compareTo(Music tar){
            // 많이 재생된 것
            if(tar.plays_cnt > this.plays_cnt) return 1;
            if(tar.plays_cnt < this.plays_cnt) return -1;
            // 재생수가 같다면 고유번호가 낮은것
            if(tar.music_num < this.music_num) return 1;
            if(tar.music_num > this.music_num) return -1;
            return 0;
        }
        
    }
    
    public Integer[] solution(String[] genres, int[] plays) {
        
        int len = genres.length;
        HashMap<String,Integer> map = new HashMap<String,Integer>();
        for(int i=0; i<len; i++){
       
            if(map.containsKey(genres[i])){
                map.put(genres[i], map.get(genres[i]) + plays[i]);
            }else{
                map.put(genres[i], plays[i]);
            }
            
        }
        
        // map을 value 기준으로 정렬한다.
		List<Entry<String, Integer>> list_entries = new ArrayList<Entry<String, Integer>>(map.entrySet());

		// 비교함수 Comparator를 사용하여 내림차순으로 정렬
		Collections.sort(list_entries, new Comparator<Entry<String, Integer>>() {
			// compare로 값을 비교
			public int compare(Entry<String, Integer> obj1, Entry<String, Integer> obj2) {
				// 내림 차순 정렬
				return obj2.getValue().compareTo(obj1.getValue());
			}
		});
        
        
        ArrayList<Integer> alist = new ArrayList<Integer>();
        
        // 내림차순으로 정렬된 내용으로 출력한다.
        for(Entry<String, Integer> entry : list_entries) {
            String key = entry.getKey();
            //System.out.println(key + ":" + map.get(key));
            
            PriorityQueue<Music> pq = new PriorityQueue<Music>();
            for(int i=0; i<len; i++){
                if(key.equals(genres[i])) {
                    pq.add(new Music(i, plays[i]));
                }  
            }
            
            int loop=0;
            while(!pq.isEmpty()){
                if(loop==2) break; // 2개만 필요하기때문에 최대 두번만 돌린다.
                Music now = pq.poll();
                alist.add(now.music_num);
                loop++;
            }
        }
        
        //저장된 ArrayList 변수를 Integer[] 배열로 변환한다.
        Integer[] answer = alist.toArray(new Integer[alist.size()]);
        
        
        return answer;
    }
}

결과

728x90
반응형
728x90
반응형

위장 - 2Level

문제설명

스파이들은 매일 다른 옷을 조합하여 입어 자신을 위장합니다.

예를 들어 스파이가 가진 옷이 아래와 같고 오늘 스파이가 동그란 안경, 긴 코트, 파란색 티셔츠를 입었다면 다음날은 청바지를 추가로 입거나 동그란 안경 대신 검정 선글라스를 착용하거나 해야 합니다.

스파이가 가진 의상들이 담긴 2차원 배열 clothes가 주어질 때 서로 다른 옷의 조합의 수를 return 하도록 solution 함수를 작성해주세요.

 

제한사항

  • clothes의 각 행은 [의상의 이름, 의상의 종류]로 이루어져 있습니다.
  • 스파이가 가진 의상의 수는 1개 이상 30개 이하입니다.
  • 같은 이름을 가진 의상은 존재하지 않습니다.
  • clothes의 모든 원소는 문자열로 이루어져 있습니다.
  • 모든 문자열의 길이는 1 이상 20 이하인 자연수이고 알파벳 소문자 또는 '_' 로만 이루어져 있습니다.
  • 스파이는 하루에 최소 한 개의 의상은 입습니다.

입출력 예

입출력 예 설명

예제 #1
headgear에 해당하는 의상이 yellow_hat, green_turban이고 eyewear에 해당하는 의상이 blue_sunglasses이므로 아래와 같이 5개의 조합이 가능합니다.

1. yellow_hat 2. blue_sunglasses 3. green_turban 4. yellow_hat + blue_sunglasses 5. green_turban + blue_sunglasses

예제 #2
face에 해당하는 의상이 crow_mask, blue_sunglasses, smoky_makeup이므로 아래와 같이 3개의 조합이 가능합니다.

1. crow_mask 2. blue_sunglasses 3. smoky_makeup

 

풀이

이번 문제 해시를 이용해 푸는 문제로, clothes 배열에서 종류인 인덱스 1의 값이 중요합니다. 종류에 몇가지가 들어있는지를 HashMap 변수 map에 넣고 해당 종류가 있는지 없는지 체크합니다. 여기서 없을때 새로 map에 넣어줘야 하는데 이때 1이 아닌 2를 넣어줘야 합니다. 왜냐하면 옷을 입지 않을 경우도 생각을 해야하기 때문입니다. 그래야 경우의 수를 계산하기 편합니다.

import java.util.*;

class Solution {
    public int solution(String[][] clothes) {
        int answer = 1;
        
        HashMap<String, Integer> map = new HashMap<String, Integer>();
        
        for(int i=0; i<clothes.length; i++){
            if(map.containsKey(clothes[i][1])){
                map.put(clothes[i][1], map.get(clothes[i][1])+1);  
            }else{
                // 옷은 1개이지만 입지않는 경우도 있기때문에 입은경우 , 안입은 경우의 두가지 경우가 있어 2로 입력
                map.put(clothes[i][1], 2);   
            }                
        }
              
        for(String key : map.keySet()){
            answer *= map.get(key);
        }
        
        
        return answer-1;
    }
   
}

 

결과

728x90
반응형
728x90
반응형

전화번호 목록 - 2Level

문제설명

전화번호부에 적힌 전화번호 중, 한 번호가 다른 번호의 접두어인 경우가 있는지 확인하려 합니다.
전화번호가 다음과 같을 경우, 구조대 전화번호는 영석이의 전화번호의 접두사입니다.

  • 구조대 : 119
  • 박준영 : 97 674 223
  • 지영석 : 11 9552 4421

전화번호부에 적힌 전화번호를 담은 배열 phone_book 이 solution 함수의 매개변수로 주어질 때, 어떤 번호가 다른 번호의 접두어인 경우가 있으면 false를 그렇지 않으면 true를 return 하도록 solution 함수를 작성해주세요.

 

제한사항

  • phone_book의 길이는 1 이상 1,000,000 이하입니다.
    • 각 전화번호의 길이는 1 이상 20 이하입니다.
    • 같은 전화번호가 중복해서 들어있지 않습니다.

입출력 예

입출력 예 설명

입출력 예 #1
앞에서 설명한 예와 같습니다.

입출력 예 #2
한 번호가 다른 번호의 접두사인 경우가 없으므로, 답은 true입니다.

입출력 예 #3
첫 번째 전화번호, “12”가 두 번째 전화번호 “123”의 접두사입니다. 따라서 답은 false입니다.

 

풀이

처음 문제를 접하고 이 문제가 왜 해시 문제인지 파악하는데 조금 시간이 걸렸습니다. 이중루프로도 풀수 있을것 같아서였습니다. 하지만 그렇게 되면 아마 타임오버가 나오지 않을까 싶어서 좀 곰곰히 생각을 했습니다.

역시나 HashMap의 containsKey 함수를 아느냐 모르냐를 묻는 문제였습니다. 업무를 하다보면 containsKey 함수는 자주 사용되는 함수는 아니지만 이런 알고리즘 문제를 풀때는 종종 등장을 하는것 같습니다.

 

일단 phone_book의 배열을 모두 HashMap인 map에 넣고, phone_book 배열의 원소 String을 처음부터 j번까지 돌아가면서 map에 저장된 key 값이 있는지 확인하고 있다면 바로 false 해주도록 구현해 보았습니다.

import java.util.*;

class Solution {
    public boolean solution(String[] phone_book) {
        boolean answer = true;
        
        HashMap<String,Integer> map = new HashMap<String,Integer>();
        int i=0;
        for(String pb : phone_book){
            map.put(pb, i++);
        }
        
        for(i=0; i<phone_book.length; i++){
            for(int j=0; j<phone_book[i].length(); j++){
                if(map.containsKey(phone_book[i].substring(0,j))){
                    return false;
                }
            }
        }
        
        return answer;
    }
}

결과

728x90
반응형
728x90
반응형

완주하지 못한 선수(1Level)

문제설명

수많은 마라톤 선수들이 마라톤에 참여하였습니다. 단 한 명의 선수를 제외하고는 모든 선수가 마라톤을 완주하였습니다.

마라톤에 참여한 선수들의 이름이 담긴 배열 participant와 완주한 선수들의 이름이 담긴 배열 completion이 주어질 때, 완주하지 못한 선수의 이름을 return 하도록 solution 함수를 작성해주세요.

 

제한사항

  • 마라톤 경기에 참여한 선수의 수는 1명 이상 100,000명 이하입니다.
  • completion의 길이는 participant의 길이보다 1 작습니다.
  • 참가자의 이름은 1개 이상 20개 이하의 알파벳 소문자로 이루어져 있습니다.
  • 참가자 중에는 동명이인이 있을 수 있습니다.

입출력 예

입출력 예 설명

예제 #1
"leo"는 참여자 명단에는 있지만, 완주자 명단에는 없기 때문에 완주하지 못했습니다.

예제 #2
"vinko"는 참여자 명단에는 있지만, 완주자 명단에는 없기 때문에 완주하지 못했습니다.

예제 #3
"mislav"는 참여자 명단에는 두 명이 있지만, 완주자 명단에는 한 명밖에 없기 때문에 한명은 완주하지 못했습니다.

 

풀이

이 문제는 해시를 얼마나 알고있는지에 대한 문제입니다. 해시를 쓰면 간단하게 Key를 통해 Value를 알 수 있습니다.

이 문제에는 함정이 있는데, 그건 바로 "참가자 중에는 동명이인이 있을 수 있습니다." 라는 것입니다. key값은 중복을 허용하지 않기때문에 이부분에 대한 내용을 어떻게 풀까가 중요한 것 같습니다.

import java.util.*;

class Solution {
    public String solution(String[] participant, String[] completion) {
        String answer = "";
        
        HashMap<String, Integer> map = new HashMap<String, Integer>();
        for(int i=0; i<participant.length ; i++){    
            if(map.get(participant[i]) == null){
                map.put(participant[i], 1);
            }else{
                map.put(participant[i], map.get(participant[i])+1);
            }
        }

        for(int i=0; i<completion.length ; i++){   
            if(map.get(completion[i]) != null){
                map.put(completion[i], map.get(completion[i])-1);
            }
        }
        
        for(int i=0; i<participant.length ; i++){  
            if(map.get(participant[i]) != 0){
                answer = participant[i] ;
                break;
            }
        }
        
        
        return answer;
    }
}

결과

728x90
반응형

+ Recent posts