프로그래머스의 폰켓몬 문제가 추가돼서 풀어보았다.

 

링크

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

 

프로그래머스

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

programmers.co.kr

 

문제

 

풀이

문제를 이해하는 것이 중요합니다.
입력 받은 폰켓몬 절반 기준으로 중복 없이 고를 수 있는 수를 반환하면 됩니다.

답은 2가지 중 하나입니다.
1. 중복 없이 고를 경우: 입력 받은 폰켓몬 수 / 2
2. 중복이 있을 경우: 중복 제거한 입력 받은 폰켓몬 수

ex1. 
{1, 2, 3, 4, 5, 6}
위의 경우 입력 받은 폰켓몬의 수는 6개, 절반은 3개입니다.
절반(3개)만큼 고를 때 중복 없이 고를 수 있으므로 정답은 3입니다.

ex2.
{1, 1, 1, 2, 2, 2}
위의 경우 입력 받은 폰켓몬의 수는 6개, 절반은 3개입니다.
절반(3개)만큼 고를 때 중복 없이 고를 경우 최대 2개 입니다.
정답은 2입니다.

// 스트림을 사용.
// boxed(): int -> Integer, double -> Double
// collect: 데이터 타입 지정.
// Collectors.toSet().size(): set으로 중복 제거 후 Count
// (nums.length / 2): 입력 받은 폰켓몬 수 절반
public int solution(int[] nums) {
    return Integer.min(
            Arrays.stream(nums)
                    .boxed()
                    .collect(Collectors.toSet()).size(), (nums.length / 2)
    );
}

 

후기

* 난이도 (5점 만점)

5 : 풀 줄 알면 기업 코딩 테스트는 문제없음.

4 : 평균적인 기업 코딩 테스트의 중간 이상.

3 : 평균적인 기업 코딩테스트의 쉬운 문제.

2 : 알고리즘 문제를 연습하고 있다면 풀 수 있는 문제.

1 : 시간이 오래 걸리지 않고, 누구나 풀 수 있는 문제.

 

[프로그래머스] 폰켓몬은 자료구조를 공부한 후 접한다면 어렵지 않게 풀 수 있습니다.

 

자바란?

자바는 썬 마이크로시스템즈(Sun Microsystems)에서 개발하여 1996년 1월에 공식적으로 발표한 객체지향 프로그래밍 언어입니다.
자바의 가장 중요한 특징은 운영체제에 독립적이라는 것입니다.
자바로 작성된 프로그램은 운영체제의 종류에 관계없이 실행이 가능하기 때문에, 운영체제에 따라 프로그램을 변경하지 않고, 실행이 가능합니다.

 

자바의 역사

자바의 역사는 1991년에 썬의 엔지니어들에 의해 고안된 오크(Oak)라는 언어에서부터 시작되었습니다.
처음에는 C++을 확장해서 사용하려 했지만 C++로는 목적을 이루기에 부족하다는 것을 알게 되었습니다.
그래서 C++의 장점을 도입하고 단점을 보완한 새로운 언어를 개발하기 시작했습니다.
처음에는 가전제품이나 PDA와 같은 소형기기에 사용될 모적이었으나 여러 종류의 운영체제를 사용하는 컴퓨터와 인터넷이 등장하자 운영체제에 독립적인 Oak가 이에 적합하다고 판단하였습니다.
Oak를 인터넷에 적합하도록 그 개발 방향을 바꾸면서 이름을 자바로 변경하였고, 자바로 개발한 웹브라우저인 핫 자바를 발표하고 그다음 해인 1996년 1월에 자바의 정식 버전을 발표했습니다.

 

자바언어의 특징

운영체제에 독립적
자바로 만든 프로그래밍은 운영체제와 하드웨어에 관계없이 실행 가능하며 이것을 한 번 작성하면, 어디서나 실행된다.(Write once, run anywhere)라고 표현하기도 합니다.

객체지향 언어
자바는 객체지향 프로그래밍 언어 중 하나로 객체지향 개념의 특징인 상속, 캡슐화, 다형성이 잘 적용된 수수한 객체지향 언어입니다.

자동 메모리 관리(Garbage Collection)
자바로 작성된 프로그램이 실행되면, 가비지 컬렉터(Garbage Collector)가 자동적으로 메모리관리를 해줍니다.
가비지컬렉터(Garbage Collector)가 없다면 개발자가 사용하지 않는 메모리를 체크하고 반환하는 일을 수동적으로 처리해야 할 것입니다.
개발자가 개발에 집중할 수 있도록 도와줍니다.

네트워크와 분산처리를 지원
다양한 네트워크 프로그래밍 라이브러리(Java API)를 통해 네트워크 관련 프로그램을 개발할 수입니다.

멀티스레드(Multi-thread)
자바에서 개발되는 멀티스레드 프로그램은 시스템과는 관계없이 구현 가능하며, 관련된 라이브러리(Java API)가 제공되므로 구현이 어렵지 않습니다.
여러 스레드에 대한 스케줄링을 자바 인터프리터가 담당하고 있습니다.

동적 로딩(Dynamic Loading)
자바로 만들어진 애플리케이션은 여러 개의 클래스로 구성되어 있습니다.
자바는 동적으로 로딩을 지원하기 때문에 실행 시에 모든 클래스를 로딩하지 않고, 필요한 시점에 클래스를 로딩하여 사용할 수 있습니다.

 

JVM (Java Virtual Machine)

자바를 실행하기 위한 가상 기계인 JVM (Java Virtual Machine)은 자바의 특징이자 장점이다.
일반 어플리케이션 코드는 OS만 거치고 하드웨어로 전달되지만, 자바 어플리케이션은 JVM을 거쳐서 전달됩니다.
일반 어플리케이션은 OS와 바로 맞붙어 있기 때문에 OS 종속적입니다.
그래서 다른 OS에서 실행시키기 위해서는 애플리케이션을 그 OS에 맞게 변경해야 하는 번거로움이 있습니다.
반면에 자바 애플리케이션은 JVM 하고 상호작용하기 때문에 OS와 하드웨어에 독립적입니다.
다른 OS에서도 프로그램의 변경 없이 실행이 가능합니다.

 

후기

자바를 사용하는 개발자는 압도적으로 많습니다. 자바를 왜 사용하는지 생각해볼 필요가 있습니다.

 

참조 자료: Java의 정석

'JAVA' 카테고리의 다른 글

[JAVA] 객체지향언어란?  (0) 2022.01.19

 

링크

 

https://programmers.co.kr/learn/courses/30/lessons/17680

 

코딩테스트 연습 - [1차] 캐시

3 ["Jeju", "Pangyo", "Seoul", "NewYork", "LA", "Jeju", "Pangyo", "Seoul", "NewYork", "LA"] 50 3 ["Jeju", "Pangyo", "Seoul", "Jeju", "Pangyo", "Seoul", "Jeju", "Pangyo", "Seoul"] 21 2 ["Jeju", "Pangyo", "Seoul", "NewYork", "LA", "SanFrancisco", "Seoul", "Ro

programmers.co.kr

 

문제

 


 

풀이

 

  • 캐시 교체 알고리즘은 LRU(Least Recently Used)를 사용한다.
  • cache hit일 경우 실행시간은 1이다.
  • cache miss일 경우 실행시간은 5이다.

 

1. 캐시 교체 알고리즘은 LRU(Least Recently Used)를 사용한다.

LRU 알고리즘은 사용된 데이터의 경우 제거 후 순위로 변경해준다.

A, B, C, D 라는 문자가 차례대로 들어온 후

캐시에서 제거될 때 A, B, C, D 순서로 제거된다.

E 문자열 삽입

A는 제거되고 그 뒤에 있던 B가 다음 제거 타겟이다. 

 

여기에서 중간에 있는 C를 요청받으면

이미 C가 존재하기 때문에 제거되는 데이터는 없다.

하지만 순서가 바뀐다.

B 다음으로 C가 제거 타겟이였지만 

C가 새로 들어온 신입처럼 후순위로 배치된다.

이것이 LRU 알고리즘이다.

 

2. cache hit일 경우 실행시간은 1이다.

데이터가 들어왔을 때 캐시에 존재하는 데이터면 +1

 

3. cache miss일 경우 실행시간은 5이다.

데이터가 들어왔을 때 캐시에 없는 데이터면 +5


 

캐시 사이즈 : 3

*대소문자를 구분하지 않기 때문에 일괄적으로 대문자로 변환하여 비교하였습니다.

 

데이터 ["Jeju", "Pangyo", "Seoul", "NewYork", "LA"]

JEJU 는 캐시에 없는 데이터 

캐시 [JEJU]

수행 시간(0) : +5

 

데이터 ["Pangyo", "Seoul", "NewYork", "LA"]

PANGYO 는 캐시에 없는 데이터

캐시 [JEJU, PANGYO]

수행 시간(5) : +5

 

데이터 ["Seoul", "NewYork", "LA"]

SEOUL 은 캐시에 없는 데이터

캐시 [JEJU, PANGYO, SEOUL]

수행 시간(10) : +5

 

데이터 ["NewYork", "LA"]

NEWYORK 은 캐시에 없는 데이터

캐시 사이즈에 자리가 없기 때문에 제일 먼저 들어온 데이터 제거 후 삽입

[JEJU, PANGYO, SEOUL] 

[PANGYO, SEOUL] 

[PANGYO, SEOUL, NEWYORK

수행 시간(15) : +5

 

데이터 ["LA"]

LA 는 캐시에 없는 데이터

캐시 사이즈에 자리가 없기 때문에 제일 먼저 들어온 데이터 제거 후 삽입

[PANGYO, SEOUL, NEWYORK] 

[SEOUL, NEWYORK] 

[SEOUL, NEWYORK, LA

수행 시간(20) : +5

 

총 수행 시간 : 25초

 


 

위의 로직 구현

 

import java.util.LinkedList;
import java.util.Queue;

class Solution {
	
	/**
	 * 카카오 캐시
	 * @param cacheSize
	 * @param cities
	 * @return
	*/
	public int solution(int cacheSize, String[] cities) {
		int answer 		= 0;
		int count 		= cities.length;
		Queue<String> qu	= new LinkedList<>();
		
		for (int i = 0; i < count; ++i) {
			String str = cities[i].toLowerCase();
			
			// 캐시 사이즈가 0일 경우 밑의 로직 수행 X -> 수행 시간 +5
			if (0 == cacheSize) {
				answer += 5;
				continue;
			}
            
			// 캐시에 존재하는 데이터면 순서 변경 후 수행 시간 +1
			if (qu.contains(str)) {
				qu.remove(str);
				qu.add(str);
				++answer;
				continue;
			}
			
			// 캐시 사이즈에 자리가 없을 경우 먼저 들어온 데이터 제거 후 삽입 수행 시간 +5
			if (qu.size() >= cacheSize) {
				qu.poll();
				qu.add(str);
				answer += 5;
				continue;
			}
            
			// 그 외 캐시에 삽입 후 수행 시간 +5
			qu.add(str);
			answer += 5;
		}
		return answer;
	}
}

 


 

후기

* 난이도 (5점 만점)

5 : 풀 줄 알면 기업 코딩테스트는 문제 없음.

4 : 평균적인 기업 코딩테스트의 중간 이상.

3 : 평균적인 기업 코딩테스트의 쉬운 문제 .

2 : 알고리즘 문제를 연습하고 있다면 풀 수 있는 문제.

1 : 시간이 오래 걸리지 않고, 누구나 풀 수 있는 문제.

 

난이도는 생각보다 쉬운 편이었으며 LRU 알고리즘을 이해한다면 충분히 풀 수 있다.

LRU 알고리즘을 풀기 위해 자료구조 Queue 를 사용했고 어려운 기술은 없었다.

 

 

링크

https://programmers.co.kr/learn/courses/30/lessons/17682

 

코딩테스트 연습 - [1차] 다트 게임

 

programmers.co.kr


 

문제

 


풀이
  1. 다트 게임은 총 3번의 기회로 구성된다.
  2. 각 기회마다 얻을 수 있는 점수는 0점에서 10점까지이다.
  3. 점수와 함께 Single(S), Double(D), Triple(T) 영역이 존재하고 각 영역 당첨 시 점수에서 1제곱, 2제곱, 3제곱 (점수1 , 점수2 , 점수3 )으로 계산된다.
  4. 옵션으로 스타상(*) , 아차상(#)이 존재하며 스타상(*) 당첨 시 해당 점수와 바로 전에 얻은 점수를 각 2배로 만든다. 아차상(#) 당첨 시 해당 점수는 마이너스된다.
  5. 스타상(*)은 첫 번째 기회에서도 나올 수 있다. 이 경우 첫 번째 스타상(*)의 점수만 2배가 된다. (예제 4번 참고)
  6. 스타상(*)의 효과는 다른 스타상(*)의 효과와 중첩될 수 있다. 이 경우 중첩된 스타상(*) 점수는 4배가 된다. (예제 4번 참고)
  7. 스타상(*)의 효과는 아차상(#)의 효과와 중첩될 수 있다. 이 경우 중첩된 아차상(#)의 점수는 -2배가 된다. (예제 5번 참고)
  8. Single(S), Double(D), Triple(T)은 점수마다 하나씩 존재한다.
  9. 스타상(*), 아차상(#)은 점수마다 둘 중 하나만 존재할 수 있으며, 존재하지 않을 수도 있다.

 

조건을 하나씩 적용하겠습니다.

1. 다트 게임은 총 3번의 기회로 구성된다.

총 3개의 값을 구합니다.

 

2. 각 기회마다 얻을 수 있는 점수는 0점에서 10점까지이다.

입력 받는 점수 범위는 0~10 입니다.

 

3. 점수와 함께 Single(S), Double(D), Triple(T) 영역이 존재하고 각 영역 당첨 시 점수에서 1제곱, 2제곱, 3제곱 (점수1 , 점수2 , 점수3 )으로 계산된다.

S : 1제곱 

D : 2제곱

T : 3제곱

 

4. 옵션으로 스타상(*) , 아차상(#)이 존재하며 스타상(*) 당첨 시 해당 점수와 바로 전에 얻은 점수를 각 2배로 만든다. 아차상(#) 당첨 시 해당 점수는 마이너스된다.

* : 현재 점수, 이전 점수 X 2

# : 현재 점수 X (-1)

 

5. 스타상(*)은 첫 번째 기회에서도 나올 수 있다. 이 경우 첫 번째 스타상(*)의 점수만 2배가 된다.

* : 이전 점수가 없다면 현재 점수만 X 2

 

6. 스타상(*)의 효과는 다른 스타상(*)의 효과와 중첩될 수 있다. 이 경우 중첩된 스타상(*) 점수는 4배가 된다.

4, 5번 조건을 적용해주면 6번도 해결됩니다.

 

7. 스타상(*)의 효과는 아차상(#)의 효과와 중첩될 수 있다. 이 경우 중첩된 아차상(#)의 점수는 -2배가 된다.

4, 5번 조건을 적용해주면 7번도 해결됩니다.

 

8. Single(S), Double(D), Triple(T)은 점수마다 하나씩 존재한다.

3번의 다트 점수 중 S, D, T 은 하나씩 존재하므로 중복 체크 없이 구현하면 됩니다.

 

9. 스타상(*), 아차상(#)은 점수마다 둘 중 하나만 존재할 수 있으며, 존재하지 않을 수도 있다.

3번의 다트 점수 중 *, # 조건이 있을때 적용하면 됩니다.


위의 설명대로 하나씩 구현하면 됩니다.

dartResult : 1S2D*3T

받은 dart 값을 나눠보면

1S

2D* (현재 점수와 이전 점수 X 2) -> 위의 1S도 X 2 

3T

이렇게 볼 수 있고

1^1 * 2

2^2 * 2

3^3

이렇게 완성됩니다.

반환은 3개 점수 합 입니다.


 

위의 로직 구현

class Solution {
	
	/**
	 * 카카오 다트 게임
	 * @param dartResult
	 * @return
	*/
	public int solution(String dartResult) {

		int count	= dartResult.length();
		int bonus 	= 0;
 		int[] arr 	= new int[3];
		int arrCnt 	= 0;
		for (int i = 0; i < count; ++i) {
			char ch =  dartResult.charAt(i);
			if (ch == 49) {
 				if (dartResult.charAt(i+1) == 48) {
					ch = 58;
					++i;
				}
			}
    		
			//옵션 로직
			switch(ch) {
			case '*':
				arr[arrCnt-1] *= 2;
				if (arrCnt-1 > 0) arr[arrCnt-2] *= 2;
				continue;
			case '#':
				arr[arrCnt-1] *= (-1);
				continue;
			}
    		
			//제곱 로직
			switch(dartResult.charAt(i+1)) {
			case 'S':
				bonus = 1;
				break;
			case 'D':
				bonus = 2;
				break;
			case 'T':
				bonus = 3;
				break;
			}
    		
			arr[arrCnt] = (int) Math.round(Math.pow(ch-'0', bonus));
			++arrCnt;
			++i;
		}
		return arr[0]+arr[1]+arr[2];
	}  
}


후기

* 난이도 (5점 만점)

5 : 풀 줄 알면 기업 코딩테스트는 문제 없음.

4 : 평균적인 기업 코딩테스트의 중간 이상.

3 : 평균적인 기업 코딩테스트의 쉬운 문제 .

2 : 알고리즘 문제를 연습하고 있다면 풀 수 있는 문제.

1 : 시간이 오래 걸리지 않고, 누구나 풀 수 있는 문제.

 

난이도는 생각보다 쉬운 편이었으며 문제를 이해하고 천천히 풀면 충분히 풀 수 있다.

어려운 기술이 들어간 것은 없고, 말 그대로 문제 내용을 하나씩 구현한 것이다.

 

 

링크

 

https://programmers.co.kr/learn/courses/30/lessons/17681

 

코딩테스트 연습 - [1차] 비밀지도

비밀지도 네오는 평소 프로도가 비상금을 숨겨놓는 장소를 알려줄 비밀지도를 손에 넣었다. 그런데 이 비밀지도는 숫자로 암호화되어 있어 위치를 확인하기 위해서는 암호를 해독해야 한다. 다

programmers.co.kr


 

문제

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 


 

풀이

 

n = 5

arr1 = [9, 20, 28, 18, 11]

arr2 = [30, 1, 21, 17, 28]

배열의 값을 2진수로 변환 후 지도에 표시

2진수는 1과 0으로 구성.

1과 0은 각각 지도 표기 방법으로 바꿔준다.

1 = "#"

0 = " "  (공백)

 

9를 2진수로 변환하면 1001 라는 값이 나온다.

 

20을 2진수로 변환하면 10100

 

위의 9와 20을 2진수로 변환한 값을 보면 자릿수가 다르다.

자릿수를 맞춰주기 위해서는 처음에 받은 n 만큼 자릿수를 채워준다.

그럼 밑의 내용처럼 9를 2진수로 변환한 내용도 바뀐다. 

1001 -> 01001

위의 내용대로 arr1 의 값을 2진수로 모두 변환시키면

arr1 = [9, 20, 28, 18, 11]

이렇게 된다.

이 것을 지도로 변환시키면

이렇게 표기가 된다.

 

 

arr2도 2진수로 변환

arr2 = [30, 1, 21, 17, 28]

이렇게 된다.

이 것을 지도로 변환시키면

이렇게 표기된다.

 

그럼 arr1 지도와 arr2 지도의 # 부분을 합집합으로 보여주면 된다.

비밀지도가 완성되었다.

return 방식은 String 배열에 담아서 해준다.

["#####","# # #", "### #", "# ##", "#####"]

 

 


 

위의 로직 구현

 

class Solution {
    
	/**
	 * 각 배열의 지도 합치기
	 * @param str1
	 * @param str2
	 * @param n
	 * @return
	*/
	public String sumArr(String str1, String str2, int n) {
		StringBuilder sb = new StringBuilder(); 
		for (int i = 0; i < n; ++i) {
			sb.append(((str1.charAt(i) + str2.charAt(i)) == 96)? " ":"#");
		}
		return sb.toString();
	}
	
	/**
	 * 각 배열의 자릿수 채워주기
	 * @param str
	 * @param n
	 * @return
	*/
	public String lpad(String str, int n) {
		int size		= n - str.length();
		StringBuilder sb	= new StringBuilder();
		for (int i = 0; i < size; ++i) {
			sb.append("0");
		}
		return sb.toString()+str;
	}
    
	/**
	 * 카카오 비밀지도
	 * @param n
	 * @param arr1
	 * @param arr2
	 * @return
	*/
	public String[] solution(int n, int[] arr1, int[] arr2) {
		int arrCount	= arr1.length;
		String[] arrStr	= new String[arrCount];
		String[] answer	= new String[arrCount];
        
		for (int i = 0; i < arrCount; ++i) {
			String str		= lpad(Integer.toBinaryString(arr1[i]), n);
			StringBuilder sb	= new StringBuilder();
			for (int j = 0; j < str.length(); ++j) {
				sb.append(str.charAt(j));
			}
			arrStr[i] = sb.toString();
		}
		
		for (int i = 0; i < arrCount; ++i) {
			String str	= lpad(Integer.toBinaryString(arr2[i]), n);
			answer[i]	= sumArr(arrStr[i], str, n);
		}
		return answer;
	}
}


 

후기

* 난이도 (5점 만점)

5 : 풀 줄 알면 기업 코딩테스트는 문제 없음.

4 : 평균적인 기업 코딩테스트의 중간 이상.

3 : 평균적인 기업 코딩테스트의 쉬운 문제 .

2 : 알고리즘 문제를 연습하고 있다면 풀 수 있는 문제.

1 : 시간이 오래 걸리지 않고, 누구나 풀 수 있는 문제.

 

난이도는 생각보다 쉬운 편이었으며 문제를 이해하고 천천히 풀면 충분히 풀 수 있다.

어려운 기술이 들어간 것은 없고, 말 그대로 문제 내용을 하나씩 구현한 것이다.

링크

 

https://www.acmicpc.net/problem/18406

 

18406번: 럭키 스트레이트

첫째 줄에 점수 N이 정수로 주어진다. (10 ≤ N ≤ 99,999,999) 단, 점수 N의 자릿수는 항상 짝수 형태로만 주어진다.

www.acmicpc.net


문제

 


풀이

 

* 입력 받는 자릿수는 짝수 형태로만 주어진다.

짝수라는 말은 전체 수가 짝수가 아니라 자릿수가 짝수 입니다.

 

 

첫 번째 예제

123402를 입력 받았을 때

123402 의 자릿수는 6 이라서 짝수.

입력 받은 자릿수를 반반 나누어 합산.

 

*절반 왼쪽

1 + 2 + 3 = 6

 

*절반 오른쪽

4 + 0 + 2 = 6

 

왼쪽과 오른쪽 합이 둘 다 6이므로 결과는 같다.

결과가 같으면 "LUCKY" 라는 문자열 반환.

 

 

 

두 번째 예제

7755 의 자리수는 4 라서 짝수

입력 받은 자릿수를 반반 나누어 합산.

 

*절반 왼쪽

7 + 7 = 14

 

*절반 오른쪽

5 + 5 = 10

 

왼쪽 합 : 14

오른쪽 합 : 10

 

14 와 10은 같지 않음.

왼쪽 합과 오른쪽 합이 같지 않으면 "READY" 라는 문자열 반환.

 


받은 숫자 자릿수를 절반씩 나누어서 합산을 한 뒤 비교해보는 방식으로 풀었습니다.

 

위의 로직 구현

 

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
 
public class Main {
 
	/**
	 * 럭키 스트레이트
	 * @param args
	 * @throws IOException
	 */
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		String str 	= br.readLine();
		int count 	= str.length();
		int left	= 0;
		int right	= 0;
		for (int i = 0; i < count/2; ++i) {
			left += (str.charAt(i));
		}
		for (int i = count/2; i < count; ++i) {
			right += (str.charAt(i));
		}
		System.out.println((left == right ? "LUCKY":"READY"));
	}
}

 

후기

* 난이도 (5점 만점)

5 : 풀 줄 알면 기업 코딩테스트는 문제 없음.

4 : 평균적인 기업 코딩테스트의 중간 이상.

3 : 평균적인 기업 코딩테스트의 쉬운 문제 .

2 : 알고리즘 문제를 연습하고 있다면 풀 수 있는 문제.

1 : 시간이 오래 걸리지 않고, 누구나 풀 수 있는 문제.

 

난이도는 매우 쉬운 편이었으며 for문을 사용할 때 길이를 지정해서 사용할 줄 알면 어렵지 않다.

링크

 

https://www.acmicpc.net/problem/2675

 

2675번: 문자열 반복

문자열 S를 입력받은 후에, 각 문자를 R번 반복해 새 문자열 P를 만든 후 출력하는 프로그램을 작성하시오. 즉, 첫 번째 문자를 R번 반복하고, 두 번째 문자를 R번 반복하는 식으로 P를 만들면 된다

www.acmicpc.net


 

문제

 

 


풀이

 

2          -> 출력할 로우 개수

3 ABC   -> 첫 번째 로우

5 /HTP  -> 두 번째 로우

 

출력할 로우는 총 2번 이며

 

* 첫 번째 로우는 3번씩 ABC 를 각각 출력하면 된다.

결과 : AAABBBCCC

 

* 두 번째 로우는 5번씩 /HTP 를 각각 출력하면 된다.

결과 : /////HHHHHTTTTTPPPPP

 


어떤 알고리즘인지 파악하면 푸는데 어려움이 없다.

앞에 받은 숫자만큼 뒤에있는 문자열을 1개씩 읽어서 반복문들 실행시키면 된다.

 

위의 로직 구현

 

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main {

	/**
	 * 문자열 반복
	 * @param args
	 */
	public static void main(String[] args) throws IOException {		
		BufferedReader br	= new BufferedReader(new InputStreamReader(System.in));
		int cnt 			= Integer.parseInt(br.readLine());
		StringBuilder sb 	= new StringBuilder();
		
		for (int k = 0; k < cnt; ++k) {
			String[] reqStrArr 	= br.readLine().split(" ");
			int loopCnt 		= Integer.parseInt(reqStrArr[0]);
			String str 			= reqStrArr[1];
			int strCnt 			= str.length();
			
			for (int i = 0; i < strCnt; ++i) {
				for (int j = 0; j < loopCnt; ++j) {
					sb.append(str.charAt(i));
				} //for -3
			} //for -2
			sb.append("\n");
		} //for -1
		System.out.println(sb.toString());
	}
}


 

후기

* 난이도 (5점 만점)

5 : 풀 줄 알면 기업 코딩테스트는 문제 없음.

4 : 평균적인 기업 코딩테스트의 중간 이상.

3 : 평균적인 기업 코딩테스트의 쉬운 문제 .

2 : 알고리즘 문제를 연습하고 있다면 풀 수 있는 문제.

1 : 시간이 오래 걸리지 않고, 누구나 풀 수 있는 문제.

 

난이도는 매우 쉬운 편이었으며 반복문을 이용하면 쉽게 풀 수 있다.

 

 

 

 

 

링크

https://www.acmicpc.net/problem/11720

 

11720번: 숫자의 합

첫째 줄에 숫자의 개수 N (1 ≤ N ≤ 100)이 주어진다. 둘째 줄에 숫자 N개가 공백없이 주어진다.

www.acmicpc.net


문제

 


 

풀이

 

1. 받은 문자열을 1자리씩 배열로 나눔

2. 반복문으로 배열의 모든 값 더하기

 

"1234" 라는 값을 받음

{1,2,3,4} 1자리씩 배열로 나눔

반복문으로 배열의 모든 값 더하기

+1  -> 1

+2  -> 3

+3  -> 6

+4  -> 10

결과 : 10

 


위의 로직 구현

 

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main {

	/**
	 * 숫자의 합
	 * @param args
	 */
	public static void main(String[] args) throws IOException {		
		BufferedReader br 	= new BufferedReader(new InputStreamReader(System.in));
		int cnt 			= Integer.parseInt(br.readLine());
		String[] arr 		= br.readLine().split("");
		int sum 			= 0;
		for (int i = 0; i < cnt; ++i) {
			sum += Integer.parseInt(arr[i]);
		}
		System.out.print(sum);
	}
}

 

후기

* 난이도 (5점 만점)

5 : 풀 줄 알면 기업 코딩테스트는 문제 없음.

4 : 평균적인 기업 코딩테스트의 중간 이상.

3 : 평균적인 기업 코딩테스트의 쉬운 문제 .

2 : 알고리즘 문제를 연습하고 있다면 풀 수 있는 문제.

1 : 시간이 오래 걸리지 않고, 누구나 풀 수 있는 문제.

 

난이도는 매우 쉬운 편이었으며 문자열을 1개씩 읽을 수 있는 방법만 알면 풀 수 있는 문제이다.

 

 

 

 

 

 

 

 

 

 

 

 

+ Recent posts