티스토리 뷰
1번문제 : 아이디 추천
문제 개요
- 새 아이디가 기존 리스트에 없으면 리턴
- 기존 리스트에 있으면 새 아이디를 만든다.
접근방법
- while문으로 기존 리스트에 없을 때까지 반복
- 모든 아이디는 S와 N으로 구성되어 있으므로, 숫자문자열 리스트 nums를 만들고 숫자가 나오면 그 인덱스까지는 문자-문자열이므로 S로, 그 이후는 숫자-문자열이므로 N으로 구분한다.(슬라이싱)
- 이후 N1은 문제에 나와있는 대로 10진 정수로 바꾸었다가 1 증가시키고 다시 문자열로 바꾼다.
결과
- 적혀있던 테스트케이스는 모두 통과했지만 정확도가 45% 였다.
- N이 최대 6자리이고 N이 0으로 시작하면 여러자리일 수 없다는 조건(cow010 은 불가) 등등을 따로 처리하지 않았기 때문으로 보인다.
- 해설이 공개되면 업데이트 해야겠다.
def solution(registered_list, new_id):
global nums
while new_id in registered_list:
cnt = 0
for char in new_id:
if char not in nums:
cnt += 1
S = new_id[:cnt]
N = new_id[cnt:]
if len(N) == 0:
n = 0
elif len(N) > 6:
return -1
else:
n = int(N)
N1 = str(n+1)
new_id = S + N1
return new_id
nums = list(map(str,[x for x in range(10)]))
solution(["cow", "cow1", "cow2", "cow3", "cow4", "cow9", "cow8", "cow7", "cow6", "cow5"], "cow")
문제2 : 가장 긴 휴가 일수는?
문제 개요
- 매달이 1일~30일이라 할 때,
- 사용가능한 연차수 / 연차를 쓸 수 있는 달의 첫날 요일 / 공휴일리스트
- 가 파라미터로 주어진다.
- 예를들어, 금요일이 1일, 휴일이 [6, 21, 27, 28]일이고 사용가능 연차가 4일이라면 연차를 22, 25, 26, 29일에 쓰면 연속으로 21~30일 총 10일을 쓸 수 있다.
문제 접근
- 요일에 따른 주말을 뽑아내려 했는데, 아이디어가 잘 생각나지 않아서 직접 다 적었다. 더 좋은 방법이 있을 것이다.
- 주말들을 queue에 담고, 주어진 휴일리스트를 더한다. 이때, 리스트와 리스트를 더하기 위해 extend해준다.
- 이후 중복을 없애고 리스트를 정렬한다.
- 그다음, 연속된 정수를 담는 코드를 작성했는데, packet에 temp 리스트들이 들어가게 된다. 예를들어 [1, 2, 4, 5, 6] 이라면 temp는 각각 [1, 2] 와 [4, 5, 6]이 되고 최종 packet은 [[1, 2], [4, 5, 6]] 이 된다.
- 원래는 leave에 1부터 30까지의 정수가 들어가야 하는데 에러가 나서 임의의 리스트로 넣었다.
(추가) ++ 우리반 멤버 코드풀이 접근법
- 한 달을 False 만 들어있는 리스트로 만들고, 휴일을 True로 만든다.
- 이 때, 주말은 7로 나눈 나머지 값을 활용한다.
- 휴일은 결국 True로 시작하게 되니까 리스트를 돌면서 True가 나오면 검색을 시작해서 그 이후 나오는 False를 연차 수만큼 True로 바꿔주고 연차를 다 쓰면 최댓값을 갱신한다.
- => 이 코드는 모든 경우의수를 다 확인하지 않아도 되므로 효율적이라고 생각한다.
def solution(leave, day, holidays):
if day == "SAT":
queue = [1, 2, 7, 8, 15, 16, 22, 23, 30]
if day == "SUN":
queue = [1, 7, 8, 14, 15, 21, 22, 28, 29]
if day == "MON":
queue = [6, 7, 13, 14, 20, 21, 27, 28]
if day == "TUE":
queue = [5, 6, 12, 13, 19, 20, 26, 27]
if day == "WED":
queue = [4, 5, 11, 12, 18, 19, 25, 26]
if day == "THU":
queue = [3, 4, 10, 11, 17, 18, 24, 25]
if day == "FRI":
queue = [2, 3, 9, 10, 16, 17, 23, 24, 30]
queue += holidays
queue.extend(leave)
queue = sorted(list(set(queue)))
# 연속된 날짜를 리스트에 담는 코드
packet = []
tmp = []
v = queue.pop(0)
tmp.append(v)
# 최대 연속일수 초기화
max_num = 0
while queue:
vv = queue.pop(0)
if v + 1 == vv:
tmp.append(vv)
v = vv
else:
packet.append(tmp)
tmp = []
tmp.append(vv)
v = vv
packet.append(tmp)
for i in range(len(packet)):
one_packet = len(packet[i])
max_num = max(one_packet, max_num)
return max_num
print(solution([22, 25, 26, 29], "FRI", [6, 21, 23, 27, 28]))
풀어야 하는 코드(에러)
- 사용가능 연차가 4일이라고 할 때 1~30일 중 임의의 4개 날짜를 뽑는 조합(combinations)를 사용하여
- 모든 경우를 돌리면서 최대 연속일수를 구하려고 했으나 4가 출력되었다. 반복문에 에러가 있는 것으로 보인다.
- 그리고 이 경우 30일 중 임의의 4개날짜 조합을 뽑는 경우의 수가 약 5000개이고 이것을 매번 새롭게 넣어서 연속숫자를 뽑아 비교하면 연산횟수가 클 것 같다... (미래의 나야 부탁해..)
from itertools import combinations
def solution(leave, day, holidays):
if day == "SAT":
queue = [1, 2, 7, 8, 15, 16, 22, 23, 30]
if day == "SUN":
queue = [1, 7, 8, 14, 15, 21, 22, 28, 29]
if day == "MON":
queue = [6, 7, 13, 14, 20, 21, 27, 28]
if day == "TUE":
queue = [5, 6, 12, 13, 19, 20, 26, 27]
if day == "WED":
queue = [4, 5, 11, 12, 18, 19, 25, 26]
if day == "THU":
queue = [3, 4, 10, 11, 17, 18, 24, 25]
if day == "FRI":
queue = [2, 3, 9, 10, 16, 17, 23, 24, 30]
queue += holidays
days = [x for x in range(1, 31)]
hols = list(combinations(days, leave))
max_num = 0
for i in range(len(hols)):
queue.extend(hols[i])
queue = sorted(list(set(queue)))
packet = []
tmp = []
v = queue.pop(0)
tmp.append(v)
while queue:
vv = queue.pop(0)
if v + 1 == vv:
tmp.append(vv)
v = vv
else:
packet.append(tmp)
tmp = []
tmp.append(vv)
v = vv
packet.append(tmp)
for i in range(len(packet)):
one_packet = len(packet[i])
max_num = max(one_packet, max_num)
return max_num
print(solution(4, "FRI", [6, 21, 23, 27, 28]))
'Coding Test' 카테고리의 다른 글
[Jungol] 1307. 문자사각형 (0) | 2021.12.03 |
---|---|
[Jungol] 1291. 구구단 (0) | 2021.12.02 |
[Programmers][완전탐색] 소수찾기 (211113) (0) | 2021.11.13 |
[Programmers][스택/큐] 기능개발 python (211104) (0) | 2021.11.05 |
2021 카페24 개발자 채용 챌린지(211023) (0) | 2021.10.23 |
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- 깃허브계정2개
- 코딩도서
- ssafy후기
- 디즈니얼굴
- 한글무료폰트추천
- 개발자커리
- ssafy합격후기
- 개발자
- 맥과윈도우로깃허브
- 개발언어순위
- 클린코드
- 개발도서추천
- 개발언어추천
- 싸피6기
- 개발자로드맵
- 상업용무료폰트
- intj여자
- ssafy6기
- 폰트
- ssafy결과
- 클린코더
- 폰트추천
- 임대차3법
- 개발자책추천
- SSAFY
- 개발자도서추천
- 무료폰트추천
- 브왈라
- 싸피
- 깃허브계정
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
글 보관함