[코딩테스트 입문]Day21
숨어있는 숫자의 덧셈(2) 🚩
문제 설명
문자열 my_string
이 매개변수로 주어집니다. my_string
은 소문자, 대문자, 자연수로만 구성되어있습니다. my_string
안의 자연수들의 합을 return하도록 solution 함수를 완성해주세요.
제한사항
- 1 ≤
my_string
의 길이 ≤ 1,000 - 1 ≤
my_string
안의 자연수 ≤ 1000 - 연속된 수는 하나의 숫자로 간주합니다.
- 000123과 같이 0이 선행하는 경우는 없습니다.
- 문자열에 자연수가 없는 경우 0을 return 해주세요.
입출력 예
my_string | result |
---|---|
“aAb1B2cC34oOp” | 37 |
“1a2b3c4d123Z” | 133 |
문제 풀이
def solution(my_string):
num = ""
sol = []
for v, i in enumerate(my_string):
if i.isdigit():
if my_string[v-1].isdigit() and v != 0:
num = num + i
if v == len(my_string)-1:
sol.append(int(num))
else:
num += i
if v == len(my_string)-1:
sol.append(int(num))
else:
if num != "":
sol.append(int(num))
num = ""
if sol == []:
return 0
return sum(sol)
반례를 찾는 것이 문제를 푸는데 중요한 요소입니다.
그래서 그 반례가 생기지 않도록 조건을 잘 설정해 줘야합니다.
def solution(my_string):
s = ''.join(i if i.isdigit() else ' ' for i in my_string)
return sum(int(i) for i in s.split())
다른 풀이를 보고나니까 뭔가 너무 어렵게 접근한 느낌이 들었습니다.
초반에 split()으로 리스트를 생성하는 것 까지 하고 str를 int형으로 만드는 방법을 잠깐 잊어버린…
그리고 위 문제를 보고 map을 사용해 다시 작성해봤습니다.
def solution(my_string):
s = ''.join(i if i.isdigit() else ' ' for i in my_string)
return sum(list(map(int,s.split())))
안전지대 🚩
문제 설명
다음 그림과 같이 지뢰가 있는 지역과 지뢰에 인접한 위, 아래, 좌, 우 대각선 칸을 모두 위험지역으로 분류합니다.
X | X | X |
X | 폭탄 | X |
X | X | X |
지뢰는 2차원 배열 board
에 1로 표시되어 있고 board
에는 지뢰가 매설 된 지역 1과, 지뢰가 없는 지역 0만 존재합니다.
지뢰가 매설된 지역의 지도 board
가 매개변수로 주어질 때, 안전한 지역의 칸 수를 return하도록 solution 함수를 완성해주세요.
제한사항
board
는 n * n 배열입니다.- 1 ≤ n ≤ 100
- 지뢰는 1로 표시되어 있습니다.
board
에는 지뢰가 있는 지역 1과 지뢰가 없는 지역 0만 존재합니다.
입출력 예
board | result |
---|---|
[[0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 1, 0, 0], [0, 0, 0, 0, 0]] | 16 |
[[0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 1, 1, 0], [0, 0, 0, 0, 0]] | 13 |
[[1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1]] | 0 |
문제 풀이
def solution(board):
N = len(board)
bomb = [[i, j] for i in range(N) for j in range(N) if board[i][j] == 1]
if N < 3:
if len(bomb) > 0:
return 0
else:
return N*N
region = []
for x, y in bomb:
if x - 1 < 0:
xx = 0
else:
xx = x-1
if y - 1 < 0:
yy = 0
else:
yy = y - 1
for a in range(xx, x+2):
for b in range(yy, y+2):
if [a, b] not in region and a < N and b < N:
region.append([a, b])
print(region)
if N*N - len(region) > 0:
return N*N - len(region)
else:
return 0
def solution(board):
n = len(board)
danger = set()
for i, row in enumerate(board):
for j, x in enumerate(row):
if not x:
continue
danger.update((i+di, j+dj) for di in [-1,0,1] for dj in [-1, 0, 1])
return n*n - sum(0 <= i < n and 0 <= j < n for i, j in danger)
여기서 좋은 것을 알게 되었습니다. 우선 식도 단순하고 쉽지만 sum
을 알게 되었는데, for문과 변수를 정해서 더한걸 출력하는것 이외에도 sum을 활용해서 리스트의 값을 더하거나 어떤 조건을 충족하면 카운트하는 기능이 있다는 것을 알 수 있었습니다.
삼각형의 완성조건 (2)
문제 설명
선분 세 개로 삼각형을 만들기 위해서는 다음과 같은 조건을 만족해야 합니다.
- 가장 긴 변의 길이는 다른 두 변의 길이의 합보다 작아야 합니다.
삼각형의 두 변의 길이가 담긴 배열 sides
이 매개변수로 주어집니다. 나머지 한 변이 될 수 있는 정수의 개수를 return하도록 solution 함수를 완성해주세요.
제한사항
sides
의 원소는 자연수입니다.sides
의 길이는 2입니다.- 1 ≤
sides
의 원소 ≤ 1,000
입출력 예
sides | result |
---|---|
[1, 2] | 1 |
[3, 6] | 5 |
[11, 7] | 13 |
문제 풀이
def solution(sides):
a, b = sorted(sides)
count = 0
num = b - a+1
while b - a < num <= b:
count += 1
num += 1
num2 = b
while b < num2+1 < b + a:
count += 1
num2 += 1
return count
def solution(sides):
return sum(sides) - max(sides) + min(sides) - 1
(max(sides) - (max(sides) + 1 - min(sides)) + 1) + (sum(sides) - max(sides) - 1)
n이 가장 길지 않은 경우의 조건 max(sides) < min(sides) + n 과 n이 가장 긴 조건인 sum(sides) > n 을 둘다 만족하는 n의 개수를 찾으면 위와 같은 결과가 나옵니다.
def solution(sides):
return 2 * min(sides) - 1
-
c가 a보다 크면 대소관계는 c > a > b가 됩니다.
a + b > c 이므로 a + b > c > a가 됩니다.
즉 이때 가능한 c의 갯수는 b - 1개 입니다.
-
c가 a보다 작으면 대소관계는 a > b, a > c 가 됩니다.
b + c > a 이므로 b + c > a > c가 됩니다.
즉 이때 가능한 c의 갯수는 b - 1개 입니다.
-
c와 a가 같으면 c = a 한 가지 밖에 존재하지 않는다. 그러므로 다 합하면 (b - 1) + (b - 1) + 1 = 2 * b - 1 개가 된다.
이때 초기 조건에 따라 b는 a보다 작음
외계어 사전
문제 설명
PROGRAMMERS-962 행성에 불시착한 우주비행사 머쓱이는 외계행성의 언어를 공부하려고 합니다. 알파벳이 담긴 배열 spell
과 외계어 사전 dic
이 매개변수로 주어집니다. spell
에 담긴 알파벳을 한번씩만 모두 사용한 단어가 dic
에 존재한다면 1, 존재하지 않는다면 2를 return하도록 solution 함수를 완성해주세요.
제한사항
spell
과dic
의 원소는 알파벳 소문자로만 이루어져있습니다.- 2 ≤
spell
의 크기 ≤ 10 spell
의 원소의 길이는 1입니다.- 1 ≤
dic
의 크기 ≤ 10 - 1 ≤
dic
의 원소의 길이 ≤ 10 spell
의 원소를 모두 사용해 단어를 만들어야 합니다.spell
의 원소를 모두 사용해 만들 수 있는 단어는dic
에 두 개 이상 존재하지 않습니다.dic
과spell
모두 중복된 원소를 갖지 않습니다.
입출력 예
spell | dic | result |
---|---|---|
[“p”, “o”, “s”] | [“sod”, “eocd”, “qixm”, “adio”, “soo”] | 2 |
[“z”, “d”, “x”] | [“def”, “dww”, “dzx”, “loveaw”] | 1 |
[”s”, “o”, “m”, “d”] | [“moos”, “dzx”, “smm”, “sunmmo”, “som”] | 2 |
문제 풀이
def solution(spell, dic):
s = 0
for i in dic:
count = 0
for j in spell:
if j in i:
count += 1
else:
count = 0
if count == len(spell):
s += 1
return int(s == 0)+1
def solution(spell, dic):
spell = set(spell)
for s in dic:
if not spell-set(s):
return 1
return 2
댓글남기기