https://school.programmers.co.kr/learn/courses/30/lessons/250137

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

문제에서 시키는대로 구현하면 되는 시뮬레이션 문제입니다. 

 

몬스터의 마지막 공격이 있을때까지 데미지를 계산하며 체력을 회복합니다. 이때 붕대를 x초 감게 되면 추가적으로 체력을 회복하는것을 신경써야 합니다. 구현에는 다음 과정들이 필요합니다.

 

1. 시간을 늘려가며 체크해 공격이 들어왔다면 데미지 계산, 체력이 0 이하라면 -1을 return

2. 공격이 들어오지 않았다면 붕대를 1초 더 감고 체력을 회복

2-1. 붕대를 x초째 감았다면 체력을 추가 회복, 붕대를 감은 연속 횟수를 0으로 초기화

 

def solution(bandage, health, attacks):
    h, idx, b, e = health, 0, 0, attacks[-1][0]
    
    for i in range(e + 1):
        if i == attacks[idx][0]:
            h -= attacks[idx][1]
            b = 0
            idx += 1
        else:
            b += 1
            h = min(health, h + bandage[1])
        
            if b == bandage[0]:
                b = 0
                h = min(health, h + bandage[2])
        
        if h <= 0:
            return -1
    
    return h
728x90

https://school.programmers.co.kr/learn/courses/30/lessons/161990

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

간단한 구현문제입니다.

바탕화면의 모든 파일을 한 번에 선택하기 위해서는 좌상단, 우하단의 점들 안에 모든 파일의 좌표가 존재해야합니다. 최소값 좌표와 최댓값 좌표 두개를 미리 준비해놓고 #이 존재하는 좌표마다 각각의 x, y 혹은 r, c에 대해 최소 최대를 갱신해주면 됩니다.

 

변수를 선언할 때 초기값이 입력사이즈 안에 들어가지 않도록 주의해주세요.

 

def solution(wallpaper):
    lr, lc, rr, rc = 100, 100, -1, -1
    
    for i in range(len(wallpaper)):
        for j in range(len(wallpaper[0])):
            if wallpaper[i][j] == '#':
                lr = min(lr, i)
                lc = min(lc, j)
                rr = max(rr, i + 1)
                rc = max(rc, j + 1)
    
    return [lr, lc, rr, rc]
728x90

코딩테스트와 PS를 연습하며 자주 당했고, 본 실수들을 적어봅니다.

여기 적힌 내용들은 정말 '실수'라서 올바른 솔루션을 작성하고서도 틀리는 안타까운 경우들입니다. 제출 전에 잘 체크하여 쓸데없는 시간낭비나 불합격을 줄이도록 합시다.

 

 

1. 쓸데없는 출력문 지우기

디버깅을 하거나 작성한 코드가 제대로 돌아가는지 확인하기 위해서 코드 중간 중간에 print문을 넣어놓는 경우가 있습니다. 

 

출력으로 결과를 제출하는 백준의 경우엔 해당 print문을 주석처리하지 않으면 99% 확률로 오답처리되고, 프로그래머스나 Leetcode처럼 데이터를 return하는 경우에도 print로 인한 시간초과가 발생하기 쉽습니다. 실제 기업 채용 코딩테스트에서도 비슷하게 작동하겠죠?

 

문제를 잘 풀어놓고 틀리지 않으려면 제출 전에 주석처리나 지우는 작업을 했는지 반드시 체크해야합니다.

 

 

2. 정답 갱신 체크하기

호출한 재귀 함수나 반복문 내부에서 정답을 잘 구해놓고 return 하는 answer값을 변경하지 않아 틀리는 경우가 종종 있습니다. 또는 최솟값, 최댓값을 요구하는 문제에서 min이나 max함수를 제대로 사용하지 않아 틀리는 경우가 많습니다.

 

특히 예시에서 보여주는 입력이 해당 오류를 체크할 수 없는 경우에 잘 풀어놓고 정말 허망하게 문제를 틀리는 경우가 많습니다. 채점 결과를 공개하지 않는 테스트가 늘어나는 흐름에서 응시자가 놓치면 안되는 포인트입니다.

 

 

예를들어, 양의 정수가 담겨있는 배열에서 가장 큰 정수가 위치한 인덱스를 return하는 쉬운 문제에서 솔루션 코드를 이렇게 짰다고 해봅시다.

def solution(arr):
   answer = 0
   n = -1
    
   for i in range(len(arr)):
      if arr[i] > n:
      	 answer = i
   	
    return answer

 

예시 케이스로 [1, 2, 3, 4, 5]가 주어진다면 가장 큰 정수인 5가 위치한 인덱스 4를 return합니다.

하지만 이 솔루션은 틀린 솔루션입니다. 입력으로 [2, 3, 4, 5, 1]이 들어와도 정답인 3 대신 4를 return합니다.

i 번째 수가 더 큰지를 판단하고 나서 값을 갱신해주지 않았기 때문에 조건문이 항상 -1보다 더 큰지를 비교하고 맨 뒤 인덱스를 return하기 때문입니다. 

.

 

또는 가장 큰 수가 몇개 있는지를 출력하는 문제를 생각해 봅시다.

def solution(arr):
   answer = 0
   maxnum = -1
    
   for n in arr:
      if n >= maxnum:
         answer = 1
         maxnum = n
      elif n == maxnum:
         answer += 1
   	
   return answer

예시 케이스로 [1, 2, 3, 4, 5]가 주어진다면 정답인 1을 return하지만 이 솔루션도 틀린 솔루션입니다. [1, 2, 3, 4, 5, 5, 5]가 들어와도 정답인 3 대신 1을 return합니다.

가장 큰 수가 갱신되는 n > maxnum이 아닌 n >= maxnum을 넣었기 때문에 큰 수가 몇개인지 카운트를 키우지 않고 계속 1로 초기화 하기 때문입니다.

 

이런 간단한 실수를 발견하지 못한다면 기껏 문제를 잘 풀어놓고 억울하게 틀릴 수 있습니다.

 

 

위 실수들을 잘 체크해서 코딩테스트 통과하시고 취업의 꿈! 꼭 이루시길 바랍니다. 

 

728x90

+ Recent posts