4659번: 비밀번호 발음하기

좋은 패스워드를 만드는것은 어려운 일이다. 대부분의 사용자들은 buddy처럼 발음하기 좋고 기억하기 쉬운 패스워드를 원하나, 이런 패스워드들은 보안의 문제가 발생한다. 어떤 사이트들은 xvtp

www.acmicpc.net

 

✏️ 내가 작성한 코드

vowels = ['a','e','i','o','u']

while(True):

    password = input()
    vowel_num = 0 # 입력받은 문자 모음 개수
    str_list = []  # 0: 모음 , 1: 자음
    break_point = True

    if password == 'end':
        break

    for idx, chr in enumerate(password):
        # 모음 포함 안하면 not
        if chr in vowels:  # 해당 문자가 모음이면
            vowel_num += 1  # 모음개수 추가
            str_list.append(0)  # 모음
        else:
            str_list.append(1)  # 자음

        if idx >= 2:
            if str_list[idx] + str_list[idx - 1] + str_list[idx-2] == 3 or str_list[idx] + str_list[idx - 1] + str_list[idx-2] == 0:
                break_point = False
                print('<{0}> is not acceptable.'.format(password))
                break

        if idx < len(password)-1 and len(password) != 1:
            if chr == password[idx + 1] and chr != 'e' and chr != 'o':  # 연속글자 2번
                break_point = False
                print('<{0}> is not acceptable.'.format(password))
                break

    if vowel_num == 0 and break_point == True:
        print('<{0}> is not acceptable.'.format(password))
    elif vowel_num != 0 and break_point == True :
        print('<{0}> is acceptable.'.format(password))

 

✏️ 참고

break_point 변수 :

자음3개, 모음3개, 같은 글자 연속2번 이 3가지 경우는 입력받은 password의 각 문자들을 다 돌아보기전에 테스트가 확인 가능하여 print할 수 있지만 모음 판단은 위 3개 테스트를 다 통과한 후 모음 개수도 확인하여야 하므로 for문밖에 써줬다.

 

하지만 예를 들어 password가 'tt'라고 입력받았을때,

자음 3개인가(통과) 모음 3개인가(통과), 같은 글자 연속 2번인가(통과 못함) 이렇게 테스트되므로 

for문 안에서 '<tt> is not acceptable' 이 출력되고 break통해 for문 밖으로 나온 다음

밑에 if문에서 vowel_num==0에도 해당하므로 또 한번 더 출력하게 되어 에러가 발생할 것이다.(break_point가 없는 경우)

이를 방지하기 위해 break_point 변수를 두어 for문에서 출력되면 break_point 을 False로 두어 밑에 if에 걸리지 않게 해두었다.

 

1924번: 2007년

첫째 줄에 빈 칸을 사이에 두고 x(1 ≤ x ≤ 12)와 y(1 ≤ y ≤ 31)이 주어진다. 참고로 2007년에는 1, 3, 5, 7, 8, 10, 12월은 31일까지, 4, 6, 9, 11월은 30일까지, 2월은 28일까지 있다.

www.acmicpc.net

 

✏️ 내가 작성한 코드

import sys
x,y = map(int,sys.stdin.readline().strip().split())
mon = [31,28,31,30,31,30,31,31,30,31,30,31] # 1월부터 각 월의 마지막 날짜를 리스트에 담는다.
week = ['SUN', 'MON', 'TUE', 'WED', 'THU', 'FRI', 'SAT']
totalDay = 0

for i in range(x-1):
    totalDay += mon[i]

totalDay = totalDay + y
print(week[totalDay%7])

 

✏️ 참고

1월1일은 월요일.

1월2일은 화요일

1월3일은 수요일

...

1월7일은 일요일

x월y일은 ○요일

 

y 나누기 7을 했을 때 나머지 값으로 요일을 알 수 있다.

나머지가 1일때 월요일, 2일때 화요일 , 3일때 수요일 , ..., 0일때 일요일 이다.

1월은 이렇게 나머지로 확인할 수 있다 그렇다면 2월부터는 나머지 값이 달라질텐데 그럼 어떻게 해야할까?

(ex. 2월1일에서 1일이니까 나머지가 1인데 요일은 목요일이다.)

 

요일,날짜는 계속 '이어지는' 존재이므로 '합쳐서' 생각해야한다.

2월1일의 요일을 구해보자.

2월1일은 1월32일과 같다.(32일은 없는 일자지만 이어지는 존재로 생각해본다면..)

32나누기7의 나머지는 4로 목요일인 것을 확인할 수 있다.

 

→ 따라서 x월y일의 요일을 구하려면

(1) x-1월까지의 날짜를 모두 합하고(mon리스트 활용)

(2) 거기에 y일을 더해서 totalDay 변수에 넣고

(3) 나누기 7을 해서 나머지를 구한 다음 week 배열에서 요일을 구하면 된다.

 

2869번: 달팽이는 올라가고 싶다

첫째 줄에 세 정수 A, B, V가 공백으로 구분되어서 주어진다. (1 ≤ B < A ≤ V ≤ 1,000,000,000)

www.acmicpc.net

 

✏️ 내가 작성한 코드 - 1 (시간초과)

# 시간초과 뜸
import sys
a,b,v = map(int,sys.stdin.readline().strip().split())
day = 1
m = 0

while(m != v):
    m += a
    if(m == v):
        break
    m -= b
    day += 1

print(day)

 

✏️ 내가 작성한 코드 - 2

import sys
import math
a,b,v = map(int,sys.stdin.readline().strip().split())

if (v-b)%(a-b) == 0:
    print((v-b)//(a-b))
else:
    print(math.ceil((v-b)/(a-b)))

 

✏️ 참고

* 반복문 사용 시 시간초과 발생.

* 달팽이는 정상에 올라간 후에는 미끄러지지 않는다는 것이 중요하다.

따라서 정상에 도달하는 시점은 이며, (x-1)일동안 (a-b)만큼 오르고 마지막날 낮에 a만큼 올라가서 정상에 도달한다.

이걸 식으로 작성하면 (x-1)(a-b) + a >= v 이며 x >= (v-b)(a-b) 이다.

날짜는 정수여야하므로 math.ceil을 활용하여 올림처리를 한다.

 

 

2164번: 카드2

N장의 카드가 있다. 각각의 카드는 차례로 1부터 N까지의 번호가 붙어 있으며, 1번 카드가 제일 위에, N번 카드가 제일 아래인 상태로 순서대로 카드가 놓여 있다. 이제 다음과 같은 동작을 카드가

www.acmicpc.net

 

✏️ 내가 작성한 코드 - 1

import sys
from collections import deque

N = int(sys.stdin.readline().strip())
lst = [i for i in range(1,N+1)] # 리스트컴프리헨션 사용 후 deque()
lst = deque(lst)
while(len(lst)>1): # 1개 남을때까지 반복
    lst.popleft() # 왼쪽에서 뺌
    lst.append(lst.popleft()) # 왼쪽에서 뺀거 오른쪽에 더함

print(lst.pop())

 

✏️ 내가 작성한 코드 - 2

import sys
from collections import deque

N = int(sys.stdin.readline().strip()) # 입력
lst = deque(range(1,N+1)) # deque안에서 range사용

while(len(lst)>1):# 1개 남을때까지 반복
    lst.popleft() # 맨 왼쪽값 꺼내기
    lst.rotate(-1) # 맨 앞에값 맨 뒤로

print(lst.pop())

 

✏️ 내가 작성한 코드 - 3 (rotate() 사용)

import sys
from collections import deque

N = int(sys.stdin.readline().strip()) # 입력
lst = deque()
for i in range(1, N+1):
    lst.append(i) # deque에 값 차례대로 append

while(len(lst)>1):# 1개 남을때까지 반복
    lst.popleft() # 맨 왼쪽값 꺼내기
    lst.rotate(-1) # 맨 앞에값 맨 뒤로, rotate() 사용

print(lst.pop())

 

✏️ 참고

* deque() 에서 괄호안에 range사용이 가능하다는 것을 처음 알았다.

* rotate() - deque의 목록회전이 가능한 rotate를 활용하면 훨씬 간편하게 앞의 값을 뒤로 보낼 수 있다.

맨앞의 값을 맨뒤로 보낼땐 rotate(-1) : 왼쪽이동 , 맨뒤 값을 맨앞으로 보낼땐 rotate(1) : 오른쪽이동 사용하기.

 

1181번: 단어 정렬

첫째 줄에 단어의 개수 N이 주어진다. (1 ≤ N ≤ 20,000) 둘째 줄부터 N개의 줄에 걸쳐 알파벳 소문자로 이루어진 단어가 한 줄에 하나씩 주어진다. 주어지는 문자열의 길이는 50을 넘지 않는다.

www.acmicpc.net

 

✏️ 내가 작성한 코드 - 1 (for문 2개 사용)

import sys
N = int(sys.stdin.readline().strip())
lst = []

for _ in range(N):
    n = sys.stdin.readline().strip()
    if n not in lst: # 중복 단어 안들어가게
        lst.append(n)

lst.sort() # 문자열 사전 순으로 정리 됨
lst.sort(key=len) # 원소들 길이별로 정리됨

for cha in lst:
    print(cha)

 

✏️ 내가 작성한 코드 - 2 (set() 사용)

import sys
N = int(sys.stdin.readline().strip())
lst = []

for _ in range(N):
    lst.append(sys.stdin.readline().strip())

lst = list(set(lst)) # 중복 제거 위해 set사용. sort위해 다시 list()로.
lst.sort()
lst.sort(key=len)

for cha in lst:
    print(cha)

 

✏️ 내가 작성한 코드 - 3 (set(),join() 사용)

import sys
N = int(sys.stdin.readline().strip())
lst = []

for _ in range(N):
    lst.append(sys.stdin.readline().strip())

lst = list(set(lst))
lst.sort()
lst.sort(key=len)

print('\n'.join(lst)) # join()함수 사용.

 

✏️ 참고

위에서부터 set(),join() 사용 / set() 사용 / for문 2개 사용 채점 결과다.

set(),join() 사용 시 시간이 더 줄어든 것을 확인할 수 있다.

 

sort()는 원소가 문자열일 때 사전 순으로 정렬해준다.

sort(key=len)은 원소들의 길이별로 정렬해준다

 

10817번: 세 수

첫째 줄에 세 정수 A, B, C가 공백으로 구분되어 주어진다. (1 ≤ A, B, C ≤ 100)

www.acmicpc.net

 

✏️ 내가 작성한 코드

import sys
num = list(map(int,sys.stdin.readline().strip().split()))
print(sorted(num)[1])

 

 

 

1026번: 보물

첫째 줄에 N이 주어진다. 둘째 줄에는 A에 있는 N개의 수가 순서대로 주어지고, 셋째 줄에는 B에 있는 수가 순서대로 주어진다. N은 50보다 작거나 같은 자연수이고, A와 B의 각 원소는 100보다 작거

www.acmicpc.net

 

✏️ 내가 작성한 코드

N = int(input())
A = list(map(int, input().split()))
B = list(map(int, input().split()))
sum = 0

A.sort()
B.sort(reverse= True) # 내림차순 정렬

for i in range(N):
    sum += A[i] * B[i]

print(sum)

 

✏️ 참고

A배열(재배열 가능)의 각 원소와 B배열(재배열 불가)의 각 원소들의 합(S)이 최솟값이기 위해서는

B배열의 원소가 클수록 A배열의 원소 중 가장 작은 값과 곱해야 한다.

따라서 B배열은 내림차순 정렬, A배열은 오름차순 정렬하여 서로 같은 인덱스끼리 곱한 다음 합치면된다.

 

10814번: 나이순 정렬

온라인 저지에 가입한 사람들의 나이와 이름이 가입한 순서대로 주어진다. 이때, 회원들을 나이가 증가하는 순으로, 나이가 같으면 먼저 가입한 사람이 앞에 오는 순서로 정렬하는 프로그램을

www.acmicpc.net

 

✏️ 내가 작성한 코드

N = int(input())
num = 0  # 들어온 순서 구분하기 위한 변수
memberList = []

for _ in range(N):
    member = list(input().split())
    num += 1 # 입력들어온 순서대로 num 증가하여 append
    member.append(num)
    memberList.append(member)

memberList.sort(key=lambda x: (int(x[0]), x[2]))  # 1. 나이를 기준으로 sort 2. 들어온 기준으로 sort

for mem in memberList:
    print(int(mem[0]), mem[1])

+ Recent posts