알고리즘

백준 - 5622번 / find(), index(), list comprehension

joy_lee 2021. 8. 2. 17:56

https://www.acmicpc.net/problem/5622

 

5622번: 다이얼

첫째 줄에 알파벳 대문자로 이루어진 단어가 주어진다. 단어의 길이는 2보다 크거나 같고, 15보다 작거나 같다.

www.acmicpc.net

내가 작성한 코드

1
2
3
4
5
6
7
8
9
dial = [['A''B''C'], ['D''E''F'], ['G''H''I'], ['J''K''L'], ['M''N''O'], ['P''Q''R''S'], ['T''U''V'], ['W''X''Y''Z']]
string = input()
time = 0
for s in string:
    for i, d in enumerate(dial):
        if s in d:
            time += i + 3
            break
print(time)
cs

같은 다이얼을 가지는 문자들을 list로 묶어서 dial이라는 list에 다시 넣어주었다.

입력받은 문자에 대해 하나씩 하위 리스트에 속하는지 확인하고, enumerate로 받은 index값 + 3을 총 시간에 더해주었다.

 

코드가 잘 작동하긴 하지만 더 보기쉽게 작성할 수 있다.

1
2
3
4
5
6
7
8
9
dial=['ABC','DEF','GHI','JKL','MNO','PQRS','TUV','WXYZ']
ex=input()
n=0
for j in ex:
    for i in dial:
        if(i.find(j)>=0):
            n+=dial.index(i)+3
            break
print(n)
cs

갇은 다이얼을 가지는 문자를 list로 묶을 필요가 없다. 'ABC'와 같이 문자열로 만들어도 찾을 수 있다.

 

string.find(찾을문자, 찾기시작할위치)

문자열 중에서 특정 문자를 찾고, 위치를 반환해준다.

찾는 값이 없으면 -1을 반환한다.

(문자열만 가능)

list.index(찾을값)

list에서 찾고자 하는 값과 정확히 일치하는 첫번째 값의 index를 반환한다.

찾는 값이 없으면 ValueError 가 발생한다.

(문자열, 리스트, 튜플에 사용가능)

 

위 코드에서 i.find(j) >= 0 이라는 i에 j가 있는 경우를 말한다.

있으면 dial에서 i가 몇 번째 인덱스인지 찾아서 index+3을 전체 시간인 n에 더해준다.

 

이런 방법도 가능하다.

1
2
3
4
5
UPPER = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
NUMBER = '22233344455566677778889999'
numList = []
[numList.append(int(NUMBER[UPPER.index(i)])+1for i in input()]
print(sum(numList))
cs

코드의 진행순서

1. input()으로 문자열을 입력받는다.

2. for문으로 문자열의 문자를 하나씩 꺼내 사용한다.

   numList.append(int(NUMBER[UPPER.index(i)])+1)

      2-1 UPPER에서 몇 번째 문자인지 확인해 NUMBER에서 해당 인덱스의 숫자를 찾는다

      2-2 해당 숫자 + 1(다이얼값)을 numList에 추가한다.

3. numList의 모든 요소의 값을 더한 값을 화면에 출력한다.

 

4번째 줄에서 [] 안에 for문을 넣는 것이 어떤 의미인지 잘 몰랐는데 검색해보니 종종 사용했던 list를 생성하는 방법이랑 같은거였다.

1
list = [0 for _ in range(10)]
cs

0이 10개 있는 list를 만들기 위해 [] 안에 for문을 사용해서 list를 정의해줬다.

이번 문제에서는 list에 저장하지 않고 numList.append() 를 실행했으므로 다른 변수에 저장하지 않는다.

1
2
3
4
5
6
# [numList.append(int(NUMBER[UPPER.index(i)])+1) for i in input()]
 
for i in input():
    index = UPPER.index(i)
    dial = int(NUMBER[index]) + 1
    numList.append(dial)
cs

주석처리한 위의 코드를 풀어서 쓰면 아래의 for문과 같다.

이런식으로 list 안에 for문을 정의하는 방법을 리스트 컴프리헨션(List Comprehension)이라고 한다고 한다.

 

NUMBER에서 찾은 값에 +1을 더하는 이유는 WXYZ는 dial값이 10인데 3부터 10으로 문자열을 만들면 index를 통해 값을 찾을 수 없기 때문이다. (WXYZ -> 1010 에 대응된다) 그래서 1을 뺀 2부터 9로 문자열을 구성한 후, 마지막에 1을 더해준다.

 

 

 

참고한 페이지

https://ooyoung.tistory.com/78

 

파이썬 find( ), index( ) 비교 / 인덱스, 위치를 찾는 함수(Python)

파이썬 find( ), index( ) - 순서 - 1.find / index 공통적인 내용 2.find / index 차이점 1. find( ), index( ) 공통적인 내용 1-1) 두 함수의 동일한 사용방법 '변수. find(찾을 문자)' / '변수. index(찾을 문..

ooyoung.tistory.com

 

https://redmuffler.tistory.com/452

 

Python List 내에 for문 선언하기(보다 간단하게 for문 사용하기)

오늘은 간단한 문법 팁을 소개해 드릴까 합니다. 바로 리스트 내에서 for문을 선언하는 방법입니다. 리스트 컴프리헨션(Comprehension)이라고 불리웁니다. 먼저 리스트 컴프리헨션을 사용하지 않는 

redmuffler.tistory.com

 

'알고리즘' 카테고리의 다른 글

백준 - 1316번  (0) 2021.08.03
백준 - 2941번 / replace()  (0) 2021.08.02
백준 - 2908번 / python slicing  (0) 2021.08.02
백준 - 10809번 / 아스키코드, enumerate()  (0) 2021.07.28
백준 - 함수  (0) 2021.07.27