문자열 재정렬 1) 문제 해결 아이디어 입력된 문자열의 문자를 하나씩 확인한다. 숫자인 경우 합계를 계산하고 알파벳인 경우 리스트에 저장한다. 리스트에 저장된 알파벳을 출력하고 합계를 뒤에 붙여 출력한다. 2) 소스코드 알파벳 여 리스트를 문자열로 변환하는 방법을 몰라 검색을 통해 알게되었다. 단순 반복으로 리스트 문자를 하나씩 붙이는 방법도 있으나 내장함수를 쓰는게 훨씬 빠르고 좋은 방법같다. 처음 코드를 짰을 때 입력된 문자열에 숫자가 하나도 없을 경우를 생각하지 않고 짰더니 "abc"같이 숫자가 없는 문자열의 경우에는 "abc"로 출력되는 것이 아니라 "abc0" 으로 출력되었다. 입력된 문자열에 숫자가 하나도 없을 경우를 고려하여 합계가 0인 경우에는 알파벳 문자열만 출력되도록 해야한다. s = ..
왕실의 나이트 1) 문제 해결 아이디어 현재 위치의 행에 대한 알파벳(a~h)를 1~8 로 바꾼다. 나이트의 8가지 경로에 해당하는 위치로 이동가능한지 확인한다. 리스트를 이용해 8가지 방향에 대한 방향 벡터를 정의한다. 2) 소스코드 알파벳으로 입력된 y좌표(a~h)를 1~8 로 변환하는데 오류를 겪었지만 ord()함수를 사용하여 잘 해결하였따. 기준 좌표를 (1, 1)로 하기 위해 1을 추가로 더해주었다. (풀이1) 방향벡터를 2개 리스트로 구현 now = input() cnt = 0 # 경우의 수 x = int(now[1]) # x 좌표 y = ord(now[0]) - ord('a') + 1 # y 좌표 # 이동 방향 dx = [1, -1, -1, 1, 2, -2, -2, 2] dy = [2, 2,..
시각 1) 문제 해결 아이디어 가능한 모든 시각의 경우를 하나씩 모두 세서 풀 수 있는 문제 완전 탐색: 가능한 경우의 수를 모두 검사해보는 탐색 방법 00시 00분 00초 ~ 23시 59분 59초 모든 경우의 수 = 24 * 60 * 60 2) 소스코드 (풀이1) 3중 for문을 이용한 일반적인 방식 n = int(input()) cnt = 0 # 경우의 수 for i in range(n + 1): for j in range(60): for k in range(60): # 3이 하나라도 들어있는 경우 if('3' in (str(i) + str(j) + str(k))): cnt += 1 print(cnt) str() 문자열로 형변환 문자열A in/not in 문자열B 문자열A가 문자열B에 있는지를 Tru..
상하좌우 1) 문제 해결 아이디어 이동 계획을 리스트로 저장해두고 해당 계획에 따라 범위 내 좌표이면 이동시킨다 2) 소스코드 (풀이1) if 문으로 구분 n = int(input()) # n * n move = input().split() # 이동 계획 x, y = 1, 1 # 계획대로 움직이기 for i in range(len(move)): if(move[i] == "L" and y > 0): y -= 1 elif(move[i] == "R" and y 0): x -= 1 elif(move[i] == "D" and x < n): x += 1 print(x, y) (풀이2) 이동 방향, 좌표를 리스트로 구현 n = int(input..
숫자 카드 게임 1) 문제 해결 아이디어 각 행의 최솟값 중에서 최댓값을 구하는 것이므로 굳이 입력받은 전부를 2차원 리스트로 저장할 필요는 없다 min(), max() 함수를 사용하여 간단히 해결한다 2) 소스코드 n, m = map(int, input().split()) res = 0 # 행들의 최솟값 중에서 최댓값 구하기 for i in range(n): card = list(map(int, input().split())) res = max(res, min(card)) print(res)
큰 수의 법칙 1) 문제 해결 아이디어 입력받은 리스트를 내림차순 정렬한다. 사실상 해당 리스트에서 필요한 값은 가장 큰 값, 2번째로 큰 값 2개이다. 가장 큰 값을 연속 K번 더하고 2번째로 큰 값을 한번 더하는 연산을 반복하면 된다. 2) 소스코드 (풀이1) 정석적인 방식 # 더할 횟수, 연속 덧셈 횟수 n, m, k = map(int, input().split()) data = list(map(int, input().split())) res = 0 data.sort(reverse=True) # 내림차순 정렬 first = data[0] # 가장 큰 수 second = data[1] # 두번째 큰 수 while True: # first 연속 k번 더하기 for i in range(k): # 탈출 조..
모험가 길드 1) 문제 해결 아이디어 오름차순 정렬 후 공포도가 낮은 모험가부터 확인한다. (현재 그룹에 포함된 모험가의 수 >= 현재 확인하고 있는 공포도) 일 때, 현재 그룹핑 완료하기! 2) 소스 코드 n = int(input()) # 모험가 수 level = list(map(int, input().split()) ) # 공포도 리스트 level.sort() # 공포도 오름차순 정렬 group = 0 # 그룹 수 humon = 0 # 현재 그룹에 포함된 모험가의 수 # 공포도 낮은 순부터 확인 for i in level: humon += 1 # 현재 그룹에 모험가 포함 # 그룹 결성 조건(현재 공포도보다 그룹의 모험가 수가 크거나 같으면 그룹핑) if humon >= i: group += 1 # 그..
곱하기 혹은 더하기 1) 문제 해결 아이디어 두 수 중 하나라도 1 이하인 경우 더하기, 두 수 모두 2 이상인 경우 곱하기 일반적으로 + 보다 x 가 더 값을 크게 만듦 but, 두 수 중 하나라도 0 / 1이면 더하기를 수행하는 것이 효율적 2) 정당성 분석 3) 소스코드 s = input() # 0~9로 구성된 문자열 res = int(s[0]) # 첫번째 문자를 정수형 변환하여 저장 for i in range(1, len(s)): num = int(s[i]) # 두 수가 모두 2이상이면 곱하기 if(res > 2 and num > 2): res *= num # 하나라도 1이하이면 더하기 else: res += num print(res)