230801 coding test 연습 기록

Viperse·2023년 8월 1일

프로그래머스 - 숫자 문자열과 영단어

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

카카오 문제라는 걸 보고 혹해서 들어감. 난이도는 그리 높지 않았고 오늘 기준으로 정답률 69%인데... 더 올라갈 것이라고 예상함.

우선 매개변수로 String 타입 변수 s 한 개를 줬고 답은 int 타입 answer로 반환하는 것이 조건이었다.

문제를 간단히 설명하자면 0부터 9까지의 숫자 영단어(ex. one, two)가 숫자와 무작위로 섞인 문자열이 주어지는데, 문자열을 전부 숫자로 바꿔 하나의 정수가 되게 하여 반환해 주면 된다.

그리고 제한사항 확인

  • 1 ≤ s의 길이 ≤ 50
  • s가 "zero" 또는 "0"으로 시작하는 경우는 주어지지 않습니다.
  • return 값이 1 이상 2,000,000,000 이하의 정수가 되는 올바른 입력만 s로 주어집니다.

딱히 까다로운 부분은 없었다. 우선 영단어들을 담아 줄 String 배열을 하나 만들어 줬고, 0부터 9까지의 숫자만 문자열 형식으로 담긴 String 배열도 하나 만들었다.

String[] sArr = {"zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine"};
String[] numArr = {"0", "1", "2", "3", "4", "5", "6", "7", "8", "9"};

for문으로 반복문 조건에 sArr 배열의 길이를 넣고 문자열 s에 contains 메소드를 찍어 s에 sArr의 요소가 포함되어 있다면 실행을 하는 if문을 걸어 줬다. 실행 부분에는 replace 메소드로 sArr 요소를 numArr 요소로 바꿔 문자열 s가 전부 숫자로만 이루어지게 만들었다.

문제에서는 int 타입으로 반환하기를 원했으니, 문자열 s를 정수로 바꿔서 return 해 주기만 하면 간단하게 해결할 수 있다.

    public int solution(String s) {
        int answer = 0; 
        String[] sArr = {"zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine"};
        String[] numArr = {"0", "1", "2", "3", "4", "5", "6", "7", "8", "9"};
        
        for(int i=0; i<sArr.length; i++) {
        	
        	if(s.contains(sArr[i])) {
        		s = s.replace(sArr[i], numArr[i]);
        	} 
        }

        answer = Integer.parseInt(s);
        
        return answer;
    }
}

또, 이 코테 문제는 테스트 제한 시간이 10초였기 때문에 코드가 길면 테스트의 시간이 오래 걸림. 최대한 간단하게 만들어야 한다.

결과는 쉽게 통과했으나, 역시 다른 사람들의 코드를 보고 나니 코테 문제는 스트림이 최고라고 다시 생각하게 된다...

요즘 javascript를 신경 쓰느라 머리에서 혼동이 되어 정리하려고 코테 공부를 하는데... 역시나 스트림을 제일 먼저 잊어버린 듯 싶다. 다시 공부해서 스트림 많이 써 봐야지... 시간 단축에 완전 효율적인 듯

프로그래머스 - 없는 숫자 더하기

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

이번에는 제목이 끌려서 풀어 보았다. 정답률은 84%로 딱 그 만큼 정도의 난이도라고 생각한다.

기본적으로 사용해야 할 매개변수는 int 타입의 배열 numbers와 리턴 변수 int 타입 변수 answer이다.

int타입의 배열이 중복 없이 0~9까지의 자연수로 주어진다. 이 배열에서 없는 숫자들의 합을 구해서 리턴한다. 는 짧은 요약의 문제이다.

기본 코테 문제인 것 같다. 여러 가지 방법이 있을 텐데... 가장 먼저 생각난 건 역시 배열인 것 같다... 튜닝의 끝은 역시 순정이라고 그냥 배열을 사용해서 0부터 9까지 담았다.

int[] n = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};

for문을 이중으로 걸어서 바깥 for문에는 numbers를 돌리고 안쪽에는 n을 돌렸다. numbers와 n 요소가 같다면 numbers에 n의 index에 해당하는 숫자가 존재하는 것이기 때문에 n의 index 요소에 0을 대입한다.

바깥 for문까지 전부 돌아가면 실행되지 않은 요소를 제외한 요소들은 0이 되기 때문에 숫자가 존재하는 요소들만 전부 더해서 answer에 넣어 주면 해결 완료다.

class Solution {
    public int solution(int[] numbers) {
        int answer = 0;
        int[] n = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
        
        for(int i=0; i<numbers.length; i++) {
        	for(int j=0; j<n.length; j++) {
        		if(numbers[i]==n[j]) {
        			n[j] = 0;
        		}
        	}
        }
        
        for(int i=0; i<n.length; i++) {
        	answer += n[i];
        }
        
        return answer;
    }    
}

뭐랄까 할 수 있는 방법이 많아서 더 생각하느라 첫 번째 문제보다 오래 걸렸던 것 같다. 이것도 스트림으로 해결 가능할 듯

내일부터 스트림 복습 다시 간다.

profile
내 인생 그려 보기

0개의 댓글