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

 

프로그래머스

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

programmers.co.kr

문제

문자열 s의 길이가 4 혹은 6이고, 숫자로만 구성돼있는지 확인해주는 함수, solution을 완성하세요. 예를 들어 s가 "a234"이면 False를 리턴하고 "1234"라면 True를 리턴하면 됩니다.

제한 사항

  • s는 길이 1 이상, 길이 8 이하인 문자열입니다.

발상

문자열의 상태를 검사하는 문제이다.

정규식을 사용하면 간단하게 처리할 수 있다.

의사코드

1. 일치하는 정규표현식 작성
2. 정규식 패턴매치 함수 호출 및 확인

 

개선

정규식은 리눅스 서버에서 파일을 검색하거나, 실무에서 입력값 검사, 데이터 처리 등에서도 자주 사용한다.

배워두고 사용하지 않으면 잊어버리기 마련인데, 쓸려고 하면 쓸 수 있는 곳이 많이 있으니 계속 공부하고 하나씩 적용하자

 

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

 

프로그래머스

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

programmers.co.kr

문제

길이가 n이고, "수박수박수박수...."와 같은 패턴을 유지하는 문자열을 리턴하는 함수, solution을 완성하세요. 예를들어 n이 4이면 "수박수박"을 리턴하고 3이라면 "수박수"를 리턴하면 됩니다.

제한 조건

  • n은 길이 10,000이하인 자연수입니다.

발상

짝수, 홀수에 따라 다른 값을 더하는 분기반복문 작성 문제이다.

많은 스트링 조작 연산이 일어나니 스트링빌더를 사용하는 것이 좋아보였다.

의사코드

1. 반복문(n까지)
  1. 짝수면 "수" 추가
  2. 홀수면 "박" 추가
3. 최종 문자열 반환

 

개선

다른 사람들 풀이를 보니 "수박수박수박"을 제한조건인 1만자까지 선언해놓고, 잘라서 반환하는 풀이가 있었다.

단순무식해보이지만 메모리만 허용한다면 정말 빠르고 효율적인 방법일 것이다.

나중에 활용할 수 있도록 기억해두어야 겠다.

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

 

프로그래머스

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

programmers.co.kr

문제

1부터 입력받은 숫자 n 사이에 있는 소수의 개수를 반환하는 함수, solution을 만들어 보세요.

소수는 1과 자기 자신으로만 나누어지는 수를 의미합니다.
(1은 소수가 아닙니다.)

제한 조건

  • n은 2이상 1000000이하의 자연수입니다.

발상

주어진 수까지 소수를 판별하여 총 개수를 세는 문제이다.

소수판별 알고리즘을 효율적으로 작성하는 것이 핵심이다.

의사코드

1. 고정 탈출조건(n=2, n=3) 정의
2. 반복문(n=2, 제곱근까지)
  1. 나누어 떨어지면 0
  2. 아니면 소수
3. 총 합 반환

 

개선

소수 판별 알고리즘은 소인수분해와 같이 수의 특징을 다루는 문제여서 자주 보았던 문제이다.

핵심은 자신과 1을 제외하고 나누어지지 않아야 되므로, 탐색범위를 제곱근 이하까지 줄일 수 있다.

또한 2 이상의 짝수들도 제외할 수 있기 때문에 몇가지 조건을 주면 더 빠른 알고리즘을 작성할 수 있을 것이다.

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

 

프로그래머스

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

programmers.co.kr

문제

함수 solution은 정수 n을 매개변수로 입력받습니다. n의 각 자릿수를 큰것부터 작은 순으로 정렬한 새로운 정수를 리턴해주세요. 예를들어 n이 118372면 873211을 리턴하면 됩니다.

제한 조건

  • n은 1이상 8000000000 이하인 자연수입니다.

발상

숫자를 문자열로 변환하고, 배열로 담은 뒤에 내림차순 정렬하고 다시 long으로 변환하여 반환하면 되는 문제이다.

프로세스는 long을 파싱 -> 정렬 -> 다시 long으로 변환 으로 진행된다.

스트림을 사용하는 방식과 컬렉션을 사용하는 방식 모두 시도해보았는데 long을 파싱하는 부분에서 문제가 있는지 테스트케이스에서 실패하는 경우가 발생하였다.

효율을 위하여 10으로 나누면서 나머지를 배열에 넣는 방식을 사용하였는데, 무언가 문제가 있는 것 같았다.

의사코드

1. String 기본함수를 사용하여 파싱
2. Arrays 기본함수를 사용하여 정렬
3. 반복문(문자열의 길이만큼)
  1. 역순으로 재조합
4. 결과를 long으로 변환하여 반환

 

개선

컬렉션을 사용할 때 오름차순정렬을 하려고 하니 기본형 int배열로는 역방향 정렬을 할 수 없었다.

Integer 래퍼클래스를 사용하거나 해야 했다.

또 스트림을 사용해서 진행한 알고리즘에서도 오름차순 정렬이 Comparator 부분이 숙달이 더 필요해보였다.

 

'IT > Algorithm' 카테고리의 다른 글

[programmers] 수박수박수박수박수박수  (0) 2022.07.08
[programmers] 소수 찾기  (0) 2022.07.08
[programmers] 자릿수 더하기  (0) 2022.07.08
[programmers] 약수의 합  (0) 2022.07.08
[programmers] 서울에서 김서방 찾기  (0) 2022.07.08

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

 

프로그래머스

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

programmers.co.kr

문제

자연수 N이 주어지면, N의 각 자릿수의 합을 구해서 return 하는 solution 함수를 만들어 주세요.
예를들어 N = 123이면 1 + 2 + 3 = 6을 return 하면 됩니다.

제한사항

  • N의 범위 : 100,000,000 이하의 자연수

발상

자리수를 구하는 문제이다.

나머지와 몫을 이용하여 구하면 되는데, int의 길이를 측정하는 방법을 어떻게 할지 고민하였다.

스트링으로 변환하여 length를 구해도 되지만 로직이 많이 들어갈 것 같아서 x.xx * 10^n을 생각하고 10의 로그를 취하는 방법을 사용하였다.

의사코드

1. 자리수 길이 측정
2. 반복문(자리수 만큼)
  1. 10으로 나눈 나머지 더하기
  2. 주어진 값을 10으로 나누기
3. 결과값 반환

 

개선

Math같은 기본 함수를 자주 활용하도록 연습해야 겠다.

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

 

프로그래머스

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

programmers.co.kr

문제

정수 n을 입력받아 n의 약수를 모두 더한 값을 리턴하는 함수, solution을 완성해주세요.

제한 사항

  • n은 0 이상 3000이하인 정수입니다.

발상

말 그대로 나누어 떨어지는 수를 찾으면 되는 문제이다.

제한조건이 0 부터 시작이기 때문에, 0을 예외처리하고, 반복문을 돌리되 마지막수와 마지막 전 수를 간단한 나누기로 구하여 탐색범위를 줄일 수 있을 것 같았다.

의사코드

1. n==0이면 0 반환
2.반복문(n/2까지)
  1. i로 나누어 떨어지면 결과값에 더하기
3. 결과값 반환

 

개선

다른 사람들의 풀이를 살펴보니 거의 다 비슷비슷한 코드였다.

문제가 심플하니 사람들이 생각하는 최적의 답안도 비슷비슷한 것 같다.

 

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

 

프로그래머스

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

programmers.co.kr

문제

String형 배열 seoul의 element중 "Kim"의 위치 x를 찾아, "김서방은 x에 있다"는 String을 반환하는 함수, solution을 완성하세요. seoul에 "Kim"은 오직 한 번만 나타나며 잘못된 값이 입력되는 경우는 없습니다.

제한 사항

  • seoul은 길이 1 이상, 1000 이하인 배열입니다.
  • seoul의 원소는 길이 1 이상, 20 이하인 문자열입니다.
  • "Kim"은 반드시 seoul 안에 포함되어 있습니다.

발상

주어진 문자열이 존재하는 배열의 인덱스 찾는 문제이다.

해시맵이나 스트림 필터등의 아이디어가 떠올랐지만, 인덱스를 찾아야 하기 때문에 배열을 그대로 유지하면서 반복문을 돌리는 것이 가장 간결해 보였다.

의사코드

1. index 선언
2. 반복문(배열의 길이만큼)
  1. i번째 값이 "Kim"이면 index=i, break;
3. 반환문자열 만들어 반환

 

개선

인덱스를 찾아야 하니 단순 for 반복문으로 구현하였는데

콜렉션 라이브러리를 사용하여 Arrays.asList(배열).indexOf()로 함수호출로 구현한 풀이를 확인하였다.

실무에서는 라이브러리를 사용하는 것이 가독성과 유지보수가 더 좋을 것이다.

또한 인덱스 값을 스트링으로 반환할 때 반환문자열을 스트링 + 인덱스 + 스트링이 아니라
String.concat 함수를 사용하거나 String.format함수를 사용하면 속도를 크게 줄일 수 있었다.
 
 
 

'IT > Algorithm' 카테고리의 다른 글

[programmers] 자릿수 더하기  (0) 2022.07.08
[programmers] 약수의 합  (0) 2022.07.08
[programmers] 부족한 금액 계산하기  (0) 2022.07.07
[programmers] 나머지가 1이 되는 수 찾기  (0) 2022.07.06
[programmers] 평균 구하기  (0) 2022.07.05

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

 

프로그래머스

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

programmers.co.kr

문제

새로 생긴 놀이기구는 인기가 매우 많아 줄이 끊이질 않습니다. 이 놀이기구의 원래 이용료는 price원 인데, 놀이기구를 N 번 째 이용한다면 원래 이용료의 N배를 받기로 하였습니다. 즉, 처음 이용료가 100이었다면 2번째에는 200, 3번째에는 300으로 요금이 인상됩니다.
놀이기구를 count번 타게 되면 현재 자신이 가지고 있는 금액에서 얼마가 모자라는지를 return 하도록 solution 함수를 완성하세요.
단, 금액이 부족하지 않으면 0을 return 하세요.

제한사항

  • 놀이기구의 이용료 price : 1 ≤ price ≤ 2,500, price는 자연수
  • 처음 가지고 있던 금액 money : 1 ≤ money ≤ 1,000,000,000, money는 자연수
  • 놀이기구의 이용 횟수 count : 1 ≤ count ≤ 2,500, count는 자연수

발상

모든 경우의 수를 계산하고 합으로 비교하는 문제이다.

반복문 1개와 조건문 1개면 나와서 간단하다고 생각했는데 더 나은 방법도 있었다.

의사코드

1.반복문(count만큼)
  1. 총 이용료 = 금액*count
2. 총 이용료 < 가지고 있는 돈, 0 반환
3. 아니면 총 이용료 - 가지고 있는 돈 반환

 

개선

실패한 테스트케이스가 나왔는데, 찾아보니 이용료가 많이 부족한 경우 반환값이 int 오버플로우가 발생한 경우였다.

로직은 이상이 없어서 경계값 테스트를 해보니 오버플로우 발생을 확인할 수 있었다.

 

또 다른 사람들 코드를 확인해보니 굳이 반복문 돌리지 않고 간단한 등차수열의 합 공식을 구현하여 1번의 연산으로 답을 구한 사람들도 있었다.

수학적 지식도 활용할 수 있도록 연습하자

'IT > Algorithm' 카테고리의 다른 글

[programmers] 약수의 합  (0) 2022.07.08
[programmers] 서울에서 김서방 찾기  (0) 2022.07.08
[programmers] 나머지가 1이 되는 수 찾기  (0) 2022.07.06
[programmers] 평균 구하기  (0) 2022.07.05
[programmers] 하샤드 수  (0) 2022.07.05
 

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

 

프로그래머스

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

programmers.co.kr

문제

자연수 n이 매개변수로 주어집니다. n을 x로 나눈 나머지가 1이 되도록 하는 가장 작은 자연수 x를 return 하도록 solution 함수를 완성해주세요. 답이 항상 존재함은 증명될 수 있습니다.


제한사항

  • 3 ≤ n ≤ 1,000,000

발상

나머지가 1이 되게하는 수를 구하는 문제이다.

나눈다는 로직에 소인수분해가 떠올라서 주어진 문제와 맞지 않는 방향으로 알고리즘을 짰다가 테스트케이스가 실패하는 부분이 나와서 디버깅에 시간이 걸렸다.

의사코드

실패케이스
1. 초기값 세팅, 목표값 선언 (주어진 값 -1)
2. 반복(목표값 >= 기준값^2)
{
	1. 나누어 떨어지면 기준값을 임시반환값으로
    	2. 목표값을 소인수분해하여 값을 줄임
    3. 나누어 떨어지지 않으면 기준값 ++
}

성공케이스
1. 2부터 시작하여 나머지가 1인 값이 나올 때가지 전체반복

 

개선

초기 케이스의 문제는 소인수분해와 관계없는 문제였는데 주어진 값을 소인수분해하면서 계속 값을 변형시켰더니 발생한 문제처럼 보인다.

정확히 실패한 케이스의 값을 확인할 수 없지만 최대한 단순한 방법으로 먼저 풀고 그 뒤 개선하는 절차를 익혀야 겠다.

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

 

프로그래머스

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

programmers.co.kr

문제

정수를 담고 있는 배열 arr의 평균값을 return하는 함수, solution을 완성해보세요.

제한사항

  • arr은 길이 1 이상, 100 이하인 배열입니다.
  • arr의 원소는 -10,000 이상 10,000 이하인 정수입니다.

발상

주어진 배열로 평균을 구하는 문제이다.

기본적인 문법 숙달 테스트 문제인 것 같다.

의사코드

1. 주어진 테스트케이스로 스트림생성후 평균 만들고 반환

 

개선

복잡하지 않은 로직이다 보니 스트림을 사용하는 것이 반복문으로 최적화 알고리즘 짜는 것보다 느린 것 같다.

간단한 것들은 최적화가 필요할 시 직접 구현하도록 하자.

+ Recent posts