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

서버에서 로그를 찾거나 이슈를 확인해야 하는 경우에 자주 사용하는 명령어가 grep이다.

grep 명령어가 무엇인지, 어떤 옵션을 사용하는지, 어떻게 주로 활용하는지 알아보자.

 

1.grep

Global Regular Expression Print
grep prints lines that contain a match for one or more patterns.

https://www.gnu.org/software/grep/manual/grep.html

 

GNU Grep 3.7

grep comes with a rich set of options: some from POSIX and some being GNU extensions. Long option names are always a GNU extension, even for options that are from POSIX specifications. Options that are specified by POSIX, under their short names, are expli

www.gnu.org

레퍼런스 문서에 의하면 grep 명령어는 `하나 이상의 일치하는 패턴을 포함하는 라인'을 출력하는 명령이다.

 

기본적인 표현식은 다음과 같다.

grep [option...] [patterns] [file...]

옵션과 파일 인수는 비어있어도 되지만, 패턴은 하나 이상이 존재해야 한다.

 

2. option

옵션은 정말 많은 기능을 가지고 있다.

하나하나 다 공부하기엔 시간이 부족하므로 다른분들이 자주 사용하시는 몇가지만 찾아보았다.

 

  • -e 패턴을 사용한다는 옵션이다. grep의 특성상 기본적으로 사용하는 옵션인데, 보통 -ef로 붙여서 사용한다.
  • -f 파일을 패턴으로 사용하는 옵션이다. 파일에 패턴을 저장해두고 불러와서 사용할 수 있다.

  • --color 패턴을 색상으로 강조하는 옵션이다

가끔씩 확인하는 네트워크 포트 확인할 때도 사용할 수 있다.

 

위 네트워크 명령어에 grep을 | 로 연결하여 사용하는 방식을 많이 보았는데, 파이프라는 기능이었다.

| 가 파이프 명령어이며 앞의 netstat -an 의 출력값을 뒤의 명령어의 입력값으로 사용하는 기능인데 나중에 더 자세히 찾아봐야 겠다.

 

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

[Linux] 리눅스 명령어 정리(1)  (0) 2022.07.02

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. 주어진 테스트케이스로 스트림생성후 평균 만들고 반환

 

개선

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

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

 

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

 

프로그래머스

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

programmers.co.kr

문제

양의 정수 x가 하샤드 수이려면 x의 자릿수의 합으로 x가 나누어져야 합니다. 예를 들어 18의 자릿수 합은 1+8=9이고, 18은 9로 나누어 떨어지므로 18은 하샤드 수입니다. 자연수 x를 입력받아 x가 하샤드 수인지 아닌지 검사하는 함수, solution을 완성해주세요.

제한 조건

  • x는 1 이상, 10000 이하인 정수입니다.

발상

int로 주어진 수를 각 자리수로 새로운 숫자를 만들고 나누어 떨어지는지 확인하는 문제이다.

각 자리수로 새로운 숫자를 만든다는 점에서 문자변환을 하고 추출할까 생각했다가, 제한조건이 복잡하지 않고 숫자를 문자로 변환하고 다시 숫자로 변환하는 로직이 비효율적일 것 같아서 10으로 나누면서 자리수를 버려서 추출하였다.

의사코드

1. 10으로 나누고 나머지를 구하며 각 자리수를 추출
2. 모두 더한 뒤 결과값 검증

 

개선

다른 사람들의 풀이를 보니 초기 아이디어 처럼 문자로 변환하고 추출하는 로직들이 많았다.

스트림을 사용한 예도 있고, 문자열로 변환 후 split으로 잘라내서 다시 parseInt 한 케이스도 있었는데

그냥 간단하게 나머지를 활용한 풀이가 제일 빠른 것 같다.

 
 

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

 

프로그래머스

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

programmers.co.kr

문제

프로그래머스 모바일은 개인정보 보호를 위해 고지서를 보낼 때 고객들의 전화번호의 일부를 가립니다.
전화번호가 문자열 phone_number로 주어졌을 때, 전화번호의 뒷 4자리를 제외한 나머지 숫자를 전부 *으로 가린 문자열을 리턴하는 함수, solution을 완성해주세요.

제한 조건

  • phone_number는 길이 4 이상, 20이하인 문자열입니다.

발상

주어진 휴대폰 번호를 마스킹하는 문제이다.

기본문법 숙달 확인 문제이다.

의사코드

1. 스트링버퍼 선언
2. 문자열 길이 확인
3. 문자열 길이-4만큼 버퍼에 * 추가
4. 버퍼 + 테스트케이스에서 마지막 4자리 추출후 더하여 리턴

 

개선

스트링버퍼를 이용하여 새로 문자열을 만들었지만, 다른 사람은 주어진 문자열을 바로 *로 덮어씌워서 문제를 풀었다.

또 정규식을 사용하여 문자열을 치환한 풀이법도 있었다.

새로 변수를 선언하지 말고 주어진 자료를 활용하도록 하자.

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

[programmers] 평균 구하기  (0) 2022.07.05
[programmers] 하샤드 수  (0) 2022.07.05
[programmers] 행렬의 덧셈  (0) 2022.07.05
[programmers] x만큼 간격이 있는 n개의 숫자  (0) 2022.07.05
[programmers] 직사각형 별찍기  (0) 2022.07.05

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

 

프로그래머스

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

programmers.co.kr

문제

matrix

행렬의 덧셈은 행과 열의 크기가 같은 두 행렬의 같은 행, 같은 열의 값을 서로 더한 결과가 됩니다. 2개의 행렬 arr1과 arr2를 입력받아, 행렬 덧셈의 결과를 반환하는 함수, solution을 완성해주세요.

제한 조건

  • 행렬 arr1, arr2의 행과 열의 길이는 500을 넘지 않습니다.

발상

두 행렬의 합을 구하는 문제이다.

조금 고민해보았는데, 그냥 정해진 숫자만큼 2중 반복문 돌려서 구하는 것이 가장 간단해보였다.

의사코드

1. 반환행렬 선언
2. 2중 반복문으로 행렬1, 행렬2 더하기
3. 만들어진 합행렬 반환

 

개선

다른 사람들의 풀이를 보니, 답을 따로 만들지 않고 주어진 행렬 하나를 기준으로 하여 다른 하나를 더하여 반환하였다.

그만큼 메모리도 적게 사용하고, 파라미터도 2개에서 1개로 줄어드니 개선이 될 것 같다.

 

 

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

 

프로그래머스

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

programmers.co.kr

 

문제

함수 solution은 정수 x와 자연수 n을 입력 받아, x부터 시작해 x씩 증가하는 숫자를 n개 지니는 리스트를 리턴해야 합니다. 다음 제한 조건을 보고, 조건을 만족하는 함수, solution을 완성해주세요.

제한 조건

  • x는 -10000000 이상, 10000000 이하인 정수입니다.
  • n은 1000 이하인 자연수입니다.

발상

간단한 수열을 구현하는 문제이다.

배열을 처음에 초기화시키고 하나씩 담을 지, 리스트로 구하고 나중에 스트림으로 변환 할지 문법 숙달에 중점을 둔 문제였다.

의사코드

1. 리스트 선언
2. 조건에 맞게 리스트에 수열 추가
3. 배열로 변환
4. 반환

 

개선

기초를 튼튼히 하자

 

+ Recent posts