위 문제에서 2가지 어려움이 있었다.
- 인덱스에 있는 원소 값을 변경하기
- 원소만 출력하기
ArrayList 에서 원소를 가져오는 방법이 get과 indexOf 가 있다.
아래 예제코드를 보자
ArrayList<Integer> numLst = new ArrayList<>(count); // count 는 int 정수로 배열의 크기를 나타낸다.
for(int i=0; i<23; i++) {
numLst.add(0);
}
numLst.get(5); //index 5 위치의 값을 얻고싶을 때
numLst.indexOf(5); //index 5 위치의 값을 얻고싶을 때
값을 변경할때는 set함수를 이용하는 방법도 있다
아래 예제를 보자
ArrayList<Integer> numLst = new ArrayList<>(count); // count 는 int 정수로 배열의 크기를 나타낸다.
for(int i=0; i<23; i++) {
numLst.add(0);
}
numLst.set(5, 1); // index 5 위치의 값을 1로 변경, set(index, value) 형식
하지만 원하는 기능은 특정 인덱스가 선택될때 그 인덱스의 배열 값을 +1 씩 증가시키고 싶었다.
set으로는 value에 +1 연산식도 넣어보았지만 구현되지 못했다.
하지만 잘 생각해보니 tmp 변수를 선언해주고 거기에다가 원하는 연산을 해주고 다시 넣어주면 되는 일이었다..
tmp = 현재 배열의 값 → tmp +1 → 연산된 tmp 값 원하는 index 위치로 수정
아래 예제코드를 보자
ArrayList<Integer> numLst = new ArrayList<>(count); // count 는 int 정수로 배열의 크기를 나타낸다.
for(int i=0; i<23; i++) {
numLst.add(0);
}
int tmp = numLst.get(5); // index 5위치의 값 tmp에 저장
tmp += 1; // 원하는 연산 수행
numLst.set(studentLst.get(i)-1, tmp); // 연산된 tmp 값 원하는 index 위치로 수정
여러가지 방법이 있겠지만 아래의 방법을 사용해보았다.
for(int i: numLst){ // for each로 리스트 원소들을 하나씩 내보낸다
System.out.print(i+" "); // 원소들을 하나씩 내보내며 줄바꿈 없이 진행한다
}
아래는 정답코드와 출력값을 나타내보았다.
import java.util.ArrayList;
import java.util.Scanner;
public class k1093 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int count = sc.nextInt();
ArrayList<Integer> studentLst = new ArrayList<>(23);
ArrayList<Integer> numLst = new ArrayList<>(count);
for(int i=0; i<count; i++) {
studentLst.add(sc.nextInt());
}
for(int i=0; i<23; i++) {
numLst.add(0);
}
for(int i=0; i<count; i++) {
int tmp = numLst.get(studentLst.get(i)-1);
tmp += 1;
numLst.set(studentLst.get(i)-1, tmp);
}
for(int i: numLst){
System.out.print(i+" ");
}
}
}