1. 영어 끝말잇기
문제 설명
1부터 n까지 번호가 붙어있는 n명의 사람이 영어 끝말잇기를 하고 있습니다. 영어 끝말잇기는 다음과 같은 규칙으로 진행됩니다.1번부터 번호 순서대로 한 사람씩 차례대로 단어를 말합니다.마지막 사람이 단어를 말한 다음에는 다시 1번부터 시작합니다.앞사람이 말한 단어의 마지막 문자로 시작하는 단어를 말해야 합니다.이전에 등장했던 단어는 사용할 수 없습니다.한 글자인 단어는 인정되지 않습니다.다음은 3명이 끝말잇기를 하는 상황을 나타냅니다.tank → kick → know → wheel → land → dream → mother → robot → tank위 끝말잇기는 다음과 같이 진행됩니다.1번 사람이 자신의 첫 번째 차례에 tank를 말합니다.2번 사람이 자신의 첫 번째 차례에 kick을 말합니다.3번 사람이 자신의 첫 번째 차례에 know를 말합니다.1번 사람이 자신의 두 번째 차례에 wheel을 말합니다.(계속 진행)끝말잇기를 계속 진행해 나가다 보면, 3번 사람이 자신의 세 번째 차례에 말한 tank 라는 단어는 이전에 등장했던 단어이므로 탈락하게 됩니다.사람의 수 n과 사람들이 순서대로 말한 단어 words 가 매개변수로 주어질 때, 가장 먼저 탈락하는 사람의 번호와 그 사람이 자신의 몇 번째 차례에 탈락하는지를 구해서 return 하도록 solution 함수를 완성해주세요.
나의 풀이
def solution(n, words):
list = []
lose = 0
turn = 0
for i,s in enumerate(words):
if s not in list:
list.append(s)
if len(list) >1 and s[0] != list[-2][-1]:
lose = i%n + 1
turn = int(i/n) + 1
break
else:
lose = i%n + 1
turn = int(i/n) + 1
break
return [lose,turn]
우선 for문을 통해 words의 단어와 인덱스 값을 불러오고 중복되는 단어가 있는지를 판별하기위해
if s not in list를 사용했다. ( s 에는 words[0]부터 차례대로 값이 들어감)
만약 중복 조건을 만족한다면 list라는 빈 리스트에 값을 넣고 이를 나중에 오는 words[1] ,words[2] ... 과 비교할 것이다.
만약 중복되는 값이 있다면 lose와 turn 값을 내보내고 for문이 break 되도록 하였다.
lose는 n명의 끝말잇기 참가자 중 틀린 사람 , turn은 그사람이 몇번째 차례때 틀렸는지를 말한다.
나는 틀렸을때의 인덱스값 즉 i를 전체 참가자수 n으로 나눈 몫과 나머지를 사용해서 값을 도출했다.
만약 i가 8 일때 즉 인덱스 words[8]이 중복되었을때 총 참가자 3명중 words[8]을 말한 사람은
8 % 3 + 1 인 3번째 사람이다.
비슷한 방식으로 몇번째 차례때인지를 i / n + 1 로 구했다.
중복 조건이 만족하였을때 앞에 말한 단어의 끝 알파벳과 현재 단어의 앞 알파벳이 일치하는지를 확인하기 위해 if문을 사용하였다. 첫번째 단어에는 비교대상이 없으므로 list의 길이가 1 초과 일때 즉 2번째 단어부터 비교하도록 and 로 조건을 주었다. 현재 단어 s 의 맨 앞 알파벳 s[0] 과 list의 마지막에서 두번째 단어(제일 마지막 단어는 현재 단어임) 의 마지막 알파벳 list[-2][-1] 과 비교하여 다르면 중복때와 동일하게 lose와 turn을 return하고 break하도록 하였다.
다른 사람의 풀이 + 개선점
다른 사람의 풀이 중 가장 짧은 코드이다.
for문을 통해 p가 1부터 시작하게 하여 비교하고 현재의 단어가 그 위치 이전에 있는지 구분을 통해 중복을 확인하고
나와 동일한 방식으로 틀린사람과 그 차례를 return하도록 하였다.
이렇게 간결하게 할 수 있다니 역시 배움의 세계는 끝이 없다 박수 짝짝
def solution(n, words):
for p in range(1, len(words)):
if words[p][0] != words[p-1][-1] or words[p] in words[:p]: return [(p%n)+1, (p//n)+1]
else:
return [0,0]
2. 핸드폰 번호 가리기
문제 설명
프로그래머스 모바일은 개인정보 보호를 위해 고지서를 보낼 때 고객들의 전화번호의 일부를 가립니다.전화번호가 문자열 phone_number로 주어졌을 때, 전화번호의 뒷 4자리를 제외한 나머지 숫자를 전부 *으로 가린 문자열을 리턴하는 함수, solution을 완성해주세요.
나의 풀이
def solution(phone_number):
return '*'*len(phone_number[:-4]) + phone_number[-4:]
phone_number 중 뒷 네자리를 제외한 숫자의 개수만큼 * 을 곱해준 값과 나머지 뒤 네자리 숫자를 붙여 return 하도록 했다.
'프로그래머스' 카테고리의 다른 글
프로그래머스 MYSQL Lv.1 상위 n개 레코드 / 동명 동물 수 찾기 (2) | 2023.11.23 |
---|---|
프로그래머스 Python Lv.1 소수만들기 (2) | 2023.11.23 |
프로그래머스 Python 모음제거 / x만큼 간격이 있는 n개의 숫자 (4) | 2023.11.22 |
프로그래머스 Python 최댓값 만들기 / Lv2 최댓값과 최솟값 (1) | 2023.11.20 |
프로그래머스 Python 대소문자 바꿔서 출력하기/ 배열에서 문자열 대소문자 변환하기 (6) | 2023.11.20 |