본문 바로가기

알고리즘/인프런

섹션 1. String(문자열)_10. 가장 짧은 문자거리

문제

  • 한 개의 문자열 s와 문자 t가 주어지면 문자열 s의 각 문자가 문자 t와 떨어진 최소거리를 출력하는 프로그램을 작성하세요.

입력

  • 첫 번째 줄에 문자열 s와 문자 t가 주어진다. 
  • 문자열과 문자는 소문자로만 주어집니다.
  • 문자열의 길이는 100을 넘지 않는다.

출력

  • 첫 번째 줄에 각 문자열 s의 각 문자가 문자 t와 떨어진 거리를 순서대로 출력한다.

입출력 예제


 

풀이 방식을 정리해보자.

 

이번에는 메소드에 static을 사용하지 않고 객체 생성을 했다.

static 사용이유는 다음과 같다.

  • 전역적으로 쉽게 재사용하는 변수나 메소드를 사용할 때 주로 사용한다.
  • 생성 후 클래스 호출이나 객체 생성 필요 없이 바로 사용할 수 있기 때문에 사용성이 좋다.

다만 메모리 자원을 할당해놓고 사용하는 것이기 때문에 너무 많이 사용한다면 메모리를 많이 차지하게 되어서 프로그램이 무거워 진다는 단점이 있다.

즉, static을 사용하면 수행 속도가 빨라진다.

(static에 대해서는 추후에 따로 자세히 다뤄보도록 하자.)


입력받을 문자열 s와 거리를 위한 문자 t를 선언한다.

이 때, 메소드에 static을 사용하지 않았으므로 객체를 선언해준다.

향상된 for문을 사용하여 메소드를 수행한 결과를 출력하는 코드를 작성한다.

이 때, 여러 값들을 한 줄로 출력해야하기 때문에 print()을 사용한다.

 

메소드 구현으로 넘어가보자.

거리값 즉, 결과값을 저장할 변수 result를 int 배열로 선언한다.

길이는 입력받은 문자열의 길이이다.

여기서 p 변수는 떨어진 거리를 저장할 변수로, 넉넉하게 1000으로 잡아 초기화해준다.

 

이제 2개의 for문을 통해 떨어진 거리를 구하자.

 

먼저 왼쪽에 있을 문자로부터 떨어진 거리를 구할 것이다.

0부터 문자열의 길이까지 돌아갈 for문을 작성한다.

만약 입력받은 문자 t와 해당 인덱스의 문자가 동일하다면 

ex) test 라는 문자열이 있고 입력받은 문자가 t라고 할때 인덱스가 1인 e 와 입력받은 문자 e 가 일치할 경우를 말한다.

거리값인 p 를 0으로 초기화하고 해당 값을 .result에 넣어준다.

그러나 동일하지 않다면 p에 1을 더해주고 그 값을 result에 넣어준다.

 

다음으로는 오른쪽에 있을 문자로부터 떨어진 거리를 구할 것이다.

문자열의 길이부터 0까지 돌아갈 for문을 작성한다.

입력받은 문자 t와 해당 인덱스의 문자가 동일하다면 거리값인 p를 0으로 초기화한다.

단, 이미 앞에서 결과값에 p 값이 들어가 있을 것이기에 따로 변수에 값을 넣진 않는다.

그러나 동일하지 않다면 p에 1을 더해주고, min() 함수를 이용해서 최소값을 result에 넣어준다.

  • Math.min() : 입력받은 두 개의 인자 중 작은 값을 리턴한다.

추가로 설명해보자면

teacher 라는 문자가 있고, e 라는 문자로부터 거리를 구한다고 가정해보자.

여기서 'h' 라는 문자는 왼쪽 e 와는 3 이라는 거리가 떨어져있지만 

오른쪽 e 와는 1 이라는 거리가 떨어져있다.

이 경우에 최소 거리인 1 로 결과를 출력하기 위해 2개의 for문을 통해 양쪽에서 거리를 구하여 최소 거리를 출력하는 것이다.

 

수행 결과를 확인한다.


해당 글은 인프런 > 자바(Java) 알고리즘 문제풀이 : 코딩테스트 대비(김태원)강의를 참고하여 작성하였습니다.